一、流程图
说明:
- 调用 wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。
- 调用 auth.code2Session 接口,换取 用户唯一标识 OpenID 和 会话密钥 session_key。
- 获取手机号,调用wx.getPhoneNumber() ,获取加密串 encryptedData 和加密算法的初始向量 ivStr 传到后台,用会话秘钥session_key ,调用 wxMaService.getUserService().getPhoneNoInfo(session_key,encryptedData ,ivStr )获得解密后的数据;
- 获取其他用户信息,调用wx.getUserInfor() ,获取加密串 encryptedData 和加密算法的初始向量 ivStr 传到后台,用会话秘钥session_key ,调用 wxMaService.getUserService().getUserInfor(session_key,encryptedData ,ivStr )获得解密后的数据;
之后开发者服务器可以根据用户标识来生成自定义登录态,用于后续业务逻辑中前后端交互时识别用户身份。
注意:
- 会话密钥
session_key
是对用户数据进行 加密签名 的密钥。为了应用自身的数据安全,开发者服务器不应该把会话密钥下发到小程序,也不应该对外提供这个密钥。 - 临时登录凭证 code 只能使用一次.
- 密文串要用 json 格式传输,不能用参数拼接的方式,会把密文串的加号转换为空格,导致解密失败。
二、后端相关代码
1、添加依赖
<!--微信-->
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-miniapp</artifactId>
<version>3.4.7.B</version>
</dependency>
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-mp</artifactId>
<version>3.4.7.B</version>
</dependency>
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-pay</artifactId>
<version>3.4.7.B</version>
</dependency>
2、微信jar包实体类 WxMaService wxMaService;
3、根据code获取session_key
WxMaJscode2SessionResult sessionResult = wxMaService.jsCode2SessionInfo(code);
4、获取手机号
WxMaPhoneNumberInfo wxMaPhoneNumberInfo = wxMaService.getUserService().getPhoneNoInfo(SessionKey,EncryptedData,IvStr);
5、获取用户信息
WxMaUserInfo wxMaUserInfo = wxMaService.getUserService().getUserInfo(SessionKey,EncryptedData,IvStr);
说明:几个获取之间可以利用缓存加些token验证。