本篇主要描述微信小程序的后台登录,获取用户信息,解密微信运动数据
首先 登录由前端发起 小程序授权用户才能进行登录 前端具体接口信息可登录微信开放平台进行查看
前端调用 wx.login() 获取临时登录凭证code ,并回将code传到后台服务器,后台服务器通过微信开放的code2Session接口
GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
进行调用,微信接口将返回session_key,openid等信息
请求参数
属性 | 类型 | 默认值 | 必填 | 说明 |
---|---|---|---|---|
appid | string | 是 | 小程序 appId | |
secret | string | 是 | 小程序 appSecret | |
js_code | string | 是 | 登录时获取的 code | |
grant_type | string | 是 | 授权类型,此处只需填写 authorization_code |
返回的 JSON 数据包
属性 | 类型 | 说明 |
---|---|---|
openid | string | 用户唯一标识 |
session_key | string | 会话密钥 |
unionid | string | 用户在开放平台的唯一标识符,在满足 UnionID 下发条件的情况下会返回 |
errcode | number | 错误码 |
errmsg | string | 错误信息 |
此时 我们可以获取openid,以及秘钥session_key,通过前端调用 wx.getUserInfo(Object object)可以获取到除openid外的其他用户信息(需判断是否授权,授权后才能调用),
前端具体接口信息可在微信开放平台查看
https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/wx.getUserInfo.html
wx.getUserInfo会返回UserInfo信息以及encryptedData(包括敏感数据在内的完整用户信息的加密数据),iv(加密算法的初始向量)
我们也可以利用session_key对encryptedData进行解密获取到用户的具体信息(包含unionId)
具体解密方法这里简单写一下,解密微信用户数据,运动数据,解密手机号都是这种解密方式,
给出一个链接可以参考这个大哥的 https://www.jianshu.com/p/3170749b6660
import com.sun.jersey.core.util.Base64; import org.bouncycastle.jce.provider.BouncyCastleProvider; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.security.*; public class DES2Util { private static final String AES = "AES"; private static final String AES_CBC_PKCS7 = "AES/CBC/PKCS7Padding"; public static String decryptWxInfo(String encryptedData, String iv, String sessionKey){ try { byte[] data = Base64.decode(encryptedData); byte[] aseKey = Base64.decode(iv); byte[] ivData = Base64.decode(sessionKey); Security.addProvider(new BouncyCastleProvider()); Cipher cipher = Cipher.getInstance(AES_CBC_PKCS7); Key sKeySpec = new SecretKeySpec(aseKey, AES); //初始化 cipher.init(Cipher.DECRYPT_MODE, sKeySpec, generateIv(ivData)); byte[] result = cipher.doFinal(data); return new String(result); }catch (Exception e){ e.printStackTrace(); return null; } } public static AlgorithmParameters generateIv(byte[] ivData) throws Exception { AlgorithmParameters params = AlgorithmParameters.getInstance("AES"); params.init(new IvParameterSpec(ivData)); return params; } }
微信运动数据需前端调用wx.getWeRunData(Object object) 微信官方接口描述:
https://developers.weixin.qq.com/miniprogram/dev/api/open-api/werun/wx.getWeRunData.html
该接口会返回encryptedData(微信运动数据的加密信息) iv(加密算法的初始向量)
通过之前获取的session_key 可对加密信息进行解密 解密方法参照微信用户数据解密的链接
微信小程序登录流程就是前端返回 code、encryptedData(微信用户加密信息)、iv,后端根据code通过code2Session接口获取session_key,
然后用session_key去解密encryptedData来获取微信用户数据
注意:前端调用wx.getUserInfo(Object object) wx.getWeRunData(Object object) 需判断是否授权
session_key有过期时间 有效期是30天 为用户新生成code后原session_key失效
微信小程序前端没有cookie 前端可以将后台返回的登录标识存在storage 请求后台时加到header(建议使用token)
微信小程序绑定 微信开放平台后,解密信息才会出现unionId
同一个用户在微信公众开放下的不同应用(小程序,公众号)上有不同的openid 有相同的unionId