当前位置:   article > 正文

微信小程序登录流程详情及Java代码

微信小程序登录流程详情及Java代码

一、流程图

在这里插入图片描述

说明:

调用 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>4.5.0</version>
    </dependency>
  • 1
  • 2
  • 3
  • 4
  • 5

2、微信jar包实体类 WxMaService wxMaService;

3、根据code获取session_key和openId

WxMaJscode2SessionResult sessionResult = wxMaService.jsCode2SessionInfo(code);
  • 1

4、获取手机号

弃用方法:

WxMaPhoneNumberInfo wxMaPhoneNumberInfo = wxMaService.getUserService().getPhoneNoInfo(SessionKey,EncryptedData,IvStr);
  • 1

建议使用方法:

 WxMaPhoneNumberInfo  wxMaPhoneNumberInfo = wxMaService.getUserService().getPhoneNoInfo(code);
  • 1

5、获取用户信息

 WxMaUserInfo  wxMaUserInfo = wxMaService.getUserService().getUserInfo(SessionKey,EncryptedData,IvStr);
  • 1

手机号快速验证组件官网地址
在这里插入图片描述
6、 完整代码如下

   /**
     * 小程序一键登录
     *
     * @return openId
     */
    @GetMapping("/mini/login")
    public AjaxResult miniProgramLogin(@RequestParam("code") String code) {
        return AjaxResult.success(minUserService.miniProgramLogin(code));
    }

    /**
     * 获取手机号
     *
     * @return com.sense.common.utils.ResultMap
     * @date 2024/6/21 11:24
     */
    @GetMapping("/mini/getPhoneNoInfo")
    public AjaxResult getPhoneNoInfo(@RequestParam("code") String code) {
        return AjaxResult.success(minUserService.getPhoneNoInfo(code));
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
    @Override
    public JSONObject miniProgramLogin(String code) {
        try {
            WxMaJscode2SessionResult session = wxMaService.getUserService().getSessionInfo(code);
            //查询是否存在,不存在则新增用户
            MinUser minUser = loginOrRegister(session.getOpenid());
            JSONObject object = new JSONObject();
            object.put("openId", session.getOpenid());
            object.put("privacyStatus", minUser.getPrivacyStatus());
            object.put("sessionKey", session.getSessionKey());
            log.info("{}-登录成功:{}", minUser.getUserNickName(), session.getOpenid());

            //记录登录日志
            iMinOperationLogService.insertMinOperationLog(session.getOpenid(), minUser.getUserNickName(), "小程序登陆");
            return object;
        } catch (WxErrorException e) {
            log.error("获取微信授权信息失败:{}", e.getMessage(), e);
            throw new ServiceException("登陆失败", HttpStatus.ERROR);
        }
    }

    @Override
    public WxMaPhoneNumberInfo getPhoneNoInfo(String code) {
        try {
            return wxMaService.getUserService().getPhoneNoInfo(code);
        } catch (WxErrorException e) {
            log.error("获取用户手机号失败: {}", e.getMessage());
            throw new ServiceException("获取用户手机号失败");
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/746006
推荐阅读
相关标签
  

闽ICP备14008679号