页面步入原地址
小程序调用wx.login获得code.
调用USB以获取登入凭证(code)进而赚取用户登入态信息,包含用户的唯一标识(openid) 及本次登入的 可以话密钥(session_key)。用户数据的加解密通讯须要倚赖可以话密钥顺利完成。
小程序调用wx.getUserInfo获得rawData, signatrue, encryptData.
小程序调用server以获取tokenUSB, 传至code, rawData, signature, encryptData.
server调用微信提供更多的jsoncode2sessionUSB以获取openid, session_key, 调用失利应当给与客户端意见反馈, 微信两端回到错误则可以推论为蓄意命令, 可以不回到. 微信文档链接
这就是一个 HTTP USB,开发者服务器采用登入凭证 code 以获取 session_key 和 openid。其中 session_key 就是对用户数据展开加密亲笔签名的密钥。为了自身应用领域安全,session_key 不必须在网络上传输。
USB地址:"https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code"
server排序signature, 并与小程序传至的signature比较, 校验signature的合法性, 不相匹配则回到signature不相匹配的错误. 不相匹配的场景可以推论为蓄意命令, 可以不回到. 微信文档链接
通过调用USB(例如 wx.getUserInfo)以获取敏感数据时,USB可以同时回到 rawData、signature,其中 signature = sha1( rawData + session_key )
将 signature、rawData、以及用户登入态发送给开发者服务器,开发者在数据库中找出该用户对应的 session-key,采用相同的算法排序出来亲笔签名 signature2 ,比对 signature 与 signature2 即可校验数据的可信度。
采用第4步回到的session_key解密encryptData, 将Champsaur的信息与rawData中信息展开比较, 须要全然相匹配, Champsaur的信息中也包含openid, 也须要与第4步回到的openid相匹配. 解密失利或不相匹配必须回到客户适当错误. 微信文档链接
USB如果牵涉敏感数据(如wx.getUserInfo当中的 openid ),USB的明文内容将不涵盖敏感数据。开发者例如须要以获取敏感数据,须要对接口回到的加密数据( encryptData )展开等距解密。 解密算法如下:
等距解密采用的算法为 AES-128-CBC,数据使用PKCS#7充填。
等距解密的目标密文为 Base64_Decode(encryptData),
等距解密秘钥 aeskey = Base64_Decode(session_key), aeskey 就是16字节
等距解密算法起始向量 iv = aeskey, 同样就是16字节
rawData格式:
{ "nickName": "Band", "gender": 1, "language": "zh_CN", "city": "Guangzhou", "province": "Guangdong", "country": "CN", "avatarUrl": "http://wx.qlogo.cn/mmopen/vi_32/1vZvI39NWFQ9XM4LtQpFrQJ1xlgZxx3w7bQxKARol6503Iuswjjn6nIGBiaycAjAtpujxyzYsrztuuICqIM5ibXQ/0" }
encryptData解密之后格式:
{ "openId": "OPENID", "nickName": "NICKNAME", "gender": 1, "city": "CITY", "province": "PROVINCE", "country": "COUNTRY", "avatarUrl": "AVATARURL", "unionId": "UNIONID" }
采用session_key做为密钥, 加密至少包含openid, timestamp, random(随机值), version(版本)的内容, 获得token. 加密算法可以参照微信对encryptData的加密算法. server必须内存session_key, 内存的过期时间不必须大于token的过期时间. 将openid, token回到给客户端.
小程序每次业务命令都必须带openid和token, server检验token的合法性: token若想被正常解密; 解密后的openid和传至的openid与否一致; 解密后可以获得token的分解成时间, token与否过期. 全部校验通过即可正常处置业务命令.