之前没事写了一个微信小程序玩,刚起步就碰壁,因为要获取用户授权,然后请求用户的个人信息,由于微信官方api的更改,wx.getUserInfo()
方法无法在无授权的情况下直接使用,而且只能获取到基本的一些微信用户的信息,不包含我们需要的openId
以及unionId
。几经折腾,才把这个第一步给迈过去,来记录一下。
小程序-登录操作
1. 登录流程
想要获取用户的登录信息,首先要先知道小程序的登录流程是什么,下面是官方给出的流程图。
1.1 第一步:获取code
1、小程序调用wx.login() 获取临时登录凭证code,并回传到开发者服务器。
2、开发者服务器以code换取用户唯一标识openid和会话密钥session_key。
3、之后开发者服务器可以根据用户标识来生成自定义登录态,用于后续业务逻辑中前后端交互时识别用户身份。
关于unionId,这里需要说明一下,如果应用只限于小程序内则不需要unionId,直接通过openId可以确定用户身份,但是如果需要跨应用,如:网页应用,app应用时则需要使用到unionId作为身份标识。
UnionID获取途径:绑定了开发者帐号的小程序,可以通过下面3种途径获取UnionID。
1、调用接口wx.getUserInfo,从解密数据中获取UnionID。注意本接口需要用户授权,请开发者妥善处理用户拒绝授权后的情况。
2、如果开发者帐号下存在同主体的公众号,并且该用户已经关注了该公众号。开发者可以直接通过wx.login获取到该用户UnionID,无须用户再次授权。
3、如果开发者帐号下存在同主体的公众号或移动应用,并且该用户已经授权登录过该公众号或移动应用。开发者也可以直接通过wx.login获取到该用户UnionID,无须用户再次授权。
1.2 第二步:通过code换取个人信息
当前台获得了用户的授权后,我们就可以获得用户的个人信息以及unionId。
前台接口:wx.getUserInfo(Object)。
注意:此接口现在经果调整之后,使用该接口将不再出现授权弹窗,需要使用<button open-type="getUserInfo"></button>
引导用户主动进行授权操作。详情见、查看官方文档。
Object参数说明:
参数名 | 类型 | 必填 | 说明 | 最低版本 |
---|---|---|---|---|
withCredentials | Boolean | 否 | 是否带上登录信息 | 1.1.0 |
lang | String | 否 | 指定返回用户信息的语言,zh_CN:简体中文,zh_TW:繁体中文,en:英文。默认en | 1.3.0 |
timeout | Number | 否 | 超时时间,单位ms | 1.9.90 |
success | Function | 否 | 接口调用成功的回调函数 | |
fail | Function | 否 | 接口调用失败的回调函数 | |
complete | Function | 否 | 接口调用结束的回调函数(调用成功、失败都会执行) |
注:当 withCredentials 为 true 时,要求此前有调用过 wx.login 且登录态尚未过期,此时返回的数据会包含 encryptedData, iv 等敏感信息;当 withCredentials 为 false 时,不要求有登录态,返回的数据不包含 encryptedData, iv 等敏感信息。
success返回参数说明:
参数 | 类型 | 说明 |
---|---|---|
userInfo | Object | 用户信息对象,不包括openid等敏感信息 |
rawData | String | 不包括敏感信息的原始数据字符串,用于计算签名 |
signature | String | 使用sha1( rawData + sessionkey ) 得到字符串,用于校验用户信息。 |
encryptedData | String | 包括敏感数据在内的完整用户信息的加密数据,详细见[用户数据的签名验证和加解密 |
iv | String | 加密算法的初始向量,详见 用户数据的签名验证和加解密 |
2. 代码解析
2.1 微信端代码
1 |
|
2.2 服务器端Java代码
控制层:WXLoginController .java
1 |
|
网络请求工具类:HttpRequest.java
1 |
|
AES解密工具类:AesCbcUtil.java
注意:重点标识的这个jar包commons.codec.jar,需要根据自己的jdk版本做对应的引入,我的是1.8的jdk,引入的是1.6的版本。
1 |
|
3. 总结
以上就是关于小程序登录过程的解析,最主要的就是通过用户授权之后获取用户的加密信息,通过加密数据、加密算法初始向量和登录凭证在后台进行解密,从而获得用户的完成信息,之后在进行开发者的逻辑操作对用户的个人信息进行操作和处理。上面提到的还有一点就是wx.getUserInfo(Object)
方法不会在自动弹出授权窗口了,需要开发者自定义登录按钮来引导用户进行登录授权。