首页 > 编程语言 >小程序入门

小程序入门

时间:2023-06-09 13:46:21浏览次数:56  
标签:入门 程序 param iv secretKey target byte String

入口 https://mp.weixin.qq.com/cgi-bin/wx

api   https://developers.weixin.qq.com/miniprogram/dev/index.html

ebook  https://developers.weixin.qq.com/ebook?action=get_post_info&docid=000cc48f96c5989b0086ddc7e56c0a&highline=jscode2session

 

一、登录

1. 流程

小程序 -> api -> wx.login 

2. 获取 session_key 等 

https://api.weixin.qq.com/sns/jscode2session?appid=<AppId>&secret=<AppSecret>&js_code=<code>&grant_type=authorization_code

参数: appid 注册获取,secret 注册获取 (小程序是采用对称加密), js_code 小程序获取上传给服务器

返回值:

openid 微信用户的唯一标识
session_key 会话密钥
unionid 用户在微信开放平台的唯一标识符。本字段在满足一定条件的情况下才返回。

3. 小程序获取用户信息,后端服务验证签名

wx.getUserInfo 获取数据提交给服务器 

https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/wx.getUserInfo.html

userInfo OBJECT 用户信息对象,不包含 openid 等敏感信息
rawData String 不包括敏感信息的原始数据字符串,用于计算签名。
signature String 使用 sha1( rawData + sessionkey ) 得到字符串,用于校验用户信息,参考文档 signature。
encryptedData String 包括敏感数据在内的完整用户信息的加密数据,详细见加密数据解密算法
iv String 加密算法的初始向量,详细见加密数据解密算法

服务器根据验签规则验证签名,通过后登录成功,生成自己sessionid  

注:验签获取明文数据,对称解密获取敏感数据 (对称解密时可以下载示例,java单元测测试是否正确)

package cn.zno.newstar.base.utils.secu;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

/**
 * 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。
 * 
 * @author zxg
 * @see https://en.wikipedia.org/wiki/Cipher_suite
 * @see https://tools.ietf.org/html/rfc2315
 * @see https://tools.ietf.org/html/rfc2898
 */
public class AEC128CBCUtils {

    /**
     * 操作对象是原始流
     * @param target
     * @param secretKey
     * @param iv
     * @param mode
     * @return
     */
    private static byte[] toggle(byte[] target, byte[] secretKey, byte[] iv, int mode) {
        try {
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            SecretKeySpec key = new SecretKeySpec(secretKey, "AES");
            IvParameterSpec algorithm = new IvParameterSpec(iv);
            cipher.init(mode, key, algorithm);
            return cipher.doFinal(target);
        } catch (Exception e) {
            throw new RuntimeException("对称算法异常", e);
        }
    }
    
    /**
     * 操作对象是 Base64 utf-8 编码的字符串 (返回的也是)
     * @param target
     * @param secretKey
     * @param iv
     * @return
     */
    public static String encrypt(String target, String secretKey, String iv) {
        
        try {
            // 获取流
            byte[] targetByteArray = Base64Utils.decodeFromString(target);
            byte[] secretKeyByteArray = Base64Utils.decodeFromString(secretKey);
            byte[] ivByteArray = Base64Utils.decodeFromString(iv);

            // 加密
            byte[] toggle = toggle(targetByteArray, secretKeyByteArray, ivByteArray, Cipher.ENCRYPT_MODE);

            // 转 utf-8 base64
            return Base64Utils.encodeToString(toggle);
        } catch (Exception e) {
            throw new RuntimeException("加密失败", e);
        }
    }

    /**
     * 操作对象是 Base64 utf-8 编码的字符串 (返回是原始数据)
     * @param target
     * @param secretKey
     * @param iv
     * @return
     */
    public static String decrypt(String target, String secretKey, String iv) {

        try {
            // 获取流
            byte[] targetByteArray = Base64Utils.decodeFromString(target);
            byte[] secretKeyByteArray = Base64Utils.decodeFromString(secretKey);
            byte[] ivByteArray = Base64Utils.decodeFromString(iv);

            // 解密
            byte[] toggle = toggle(targetByteArray, secretKeyByteArray, ivByteArray, Cipher.DECRYPT_MODE);

            // 转明文
            return new String(toggle, "utf-8");
        } catch (Exception e) {
            throw new RuntimeException("解密失败", e);
        }
    }

}
View Code

 session 失效策略:

1) 开发者服务器自有session 失效,则重新登录 (即便wx session_key 未失效,也不再调用wx服务器)

2)wx服务器session_key 失效,则重新登录(可通过wx.checkSession() 延期,尽量避免其失效,如果失效,开发者服务器应强行退出登录状态,令客户端重新登录)

标签:入门,程序,param,iv,secretKey,target,byte,String
From: https://www.cnblogs.com/zno2/p/9076685.html

相关文章

  • 小程序获取手机号
    https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html从基础库2.21.2开始,对获取手机号的接口进行了安全升级,以下是新版本接口使用指南。(旧版本接口目前可以继续使用,但建议开发者使用新版本接口,以增强小程序安全性)因为需要用户主动触......
  • 小程序后端服务上线如何配置
    https://developers.weixin.qq.com/miniprogram/dev/framework/ability/network.html  两种模式:一:无端口(即默认端口443,但是请求时不能带端口)二:有端口(即便是默认443,也要带着)......
  • Web API入门详解指南
    学习目标:掌握API和WebAPI的概念掌握常见浏览器提供的API的调用方式能通过WebAPI开发常见的页面交互功能能够利用搜索引擎解决问题typora-copy-images-to:mediaWebAPIWebAPI介绍API的概念API(ApplicationProgrammingInterface,应用程序编程接口)是一些预先定义的函数,目的是提......
  • 应用程序安装及管理
    应用程序安装及管理推荐步骤:➢装载➢源代码程序安装实验步骤:装载装在系统光盘将系统光盘挂载到/mnt目录查看挂载的光盘数据卸载挂载的光盘数据查询未安装查询未安装vsftpd软件需要创建的目录和文件统计计算机总共安装的rpm成需要个数查看已安装查看查看已安装程序查看指定的......
  • 【黑马C++笔记】(一)C++基础语法入门
    C++基础入门1C++初识1.1第一个C++程序编写一个C++程序总共分为4个步骤创建项目创建文件编写代码运行程序1.1.1创建项目​ VisualStudio是我们用来编写C++程序的主要工具,我们先将它打开1.1.2创建文件右键源文件,选择添加->新建项给C++文件起个名称,然后点击添......
  • 程序员修炼之道阅读笔记
    第44节全都是写1、代码要跟文档紧密结合,我们要认真对待注释及文档,他们不是可有可无的东西。2、我们喜欢看到简单的模块级头注释,关于重要数据和类型声明的注释,以及给每个类和每个方法所加的简要头注释,用于描述函数的用法和任何不明了的事情。3、应当使用特定的格式进行注释,通常......
  • 陪玩圈子系统APP小程序H5,在你身边的第一桶金
    游戏陪玩系统的市场前景随着互联网的不断发展,电竞游戏行业也一直处在高风口,根据中国音数协电竞工委发布《2022年1-6月中国电子竞技产业报告》显示,中国电竞用户数量拥有4.87亿,这也为游戏陪玩这个行业带来了机遇。游戏陪玩系统功能介绍一般的游戏陪玩系统功能都有:游戏约单,多人语音聊......
  • 菜鸟攻略–C语言多文件编程初探(二):使用 gcc 手动编译多文件 C 程序
    step1:下载安装Dev-C++已经安装了Dev-C++或系统中的可以跳过这步。去官网下载Dev-C++。我昨天下载,发现有点慢,所以我把安装文件放到百度网盘了,供大家下载,下载链接为:http://pan.baidu.com/s/1pLPenDx。开始安装,记住安装位置。在安装时只能选择英文,安装完成后,第一次启动时可以选择......
  • 使用Axis开发Web Service程序
    今天是感恩节,差点又要在公司加班了。好在WebService程序并不是特别难搞,下午终于在eclipse下调通过了,正确产生了服务器端和客户端的Java代码,apache的东西的确很不错。说道WebService的程序开发,八个月前我加班调试公司和中国电信的商务领航系统的接口的时候,用的就是WebService......
  • 程序员必备系列:并发工具篇
    不管是为了面试,还是应对工作,并发编程工具是必须掌握的。其实,很多人也看过不少文章,但始终没有掌握,又加上工作中基本上没有用过,所以这一块都还处于知识盲区。希望通过本文让你真正的掌握(会使用大量的生活案列来讲述)。在本场Chat中,会讲到到以下内容:1.信号量能被FixedThreadPool替......