微信小程序登录流程详情及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>

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

3、根据code获取session_key和openId

WxMaJscode2SessionResult sessionResult = wxMaService.jsCode2SessionInfo(code);

4、获取手机号

弃用方法:

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

建议使用方法:

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

5、获取用户信息

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

手机号快速验证组件官网地址
在这里插入图片描述
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));
    }
    @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("获取用户手机号失败");
        }
    }
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是 Java 微信小程序支付流程代码示例,仅供参考: 1. 用户在小程序内提交订单,小程序后台将订单信息发送给服务端: ```java // 小程序后台调用服务端接口,提交订单信息 String url = "http://yourserver.com/order"; Map<String, Object> data = new HashMap<>(); data.put("orderId", "123456"); data.put("totalFee", "100"); data.put("body", "测试订单"); String result = HttpUtils.sendPostRequest(url, data); ``` 2. 服务端接收到订单信息后,生成预支付订单并返回给小程序: ```java // 服务端生成预支付订单并返回给小程序 String prepayId = WeixinPayUtils.getPrepayId("测试订单", "123456", "100"); Map<String, String> resultMap = new HashMap<>(); resultMap.put("appId", WeixinPayConfig.APP_ID); resultMap.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000)); resultMap.put("nonceStr", WeixinPayUtils.generateNonceStr()); resultMap.put("package", "prepay_id=" + prepayId); resultMap.put("signType", "MD5"); resultMap.put("paySign", WeixinPayUtils.generateSign(resultMap)); String result = JsonUtils.toJson(resultMap); ``` 3. 小程序调用微信支付接口,发起支付请求: ```java // 小程序调用微信支付接口,发起支付请求 wx.requestPayment({ 'timeStamp': 'result.timeStamp', 'nonceStr': 'result.nonceStr', 'package': 'result.package', 'signType': 'MD5', 'paySign': 'result.paySign', 'success': function(res) { console.log(res); }, 'fail': function(res) { console.log(res); } }); ``` 4. 微信支付平台返回支付结果给小程序,小程序将支付结果发送给服务端: ```java // 微信支付平台返回支付结果给小程序,小程序将支付结果发送给服务端 wx.request({ url: 'http://yourserver.com/pay/result', method: 'POST', data: { orderId: '123456', transactionId: res.transaction_id, result_code: res.result_code }, success: function(res) { console.log(res); }, fail: function(res) { console.log(res); } }); ``` 5. 服务端接收到支付结果后,更新订单状态,完成支付流程: ```java // 服务端接收到支付结果后,更新订单状态,完成支付流程 String orderId = request.getParameter("orderId"); String transactionId = request.getParameter("transactionId"); String resultCode = request.getParameter("result_code"); if ("SUCCESS".equals(resultCode)) { // 支付成功,更新订单状态 Order order = orderService.getOrderById(orderId); order.setStatus(OrderStatus.PAID); order.setTransactionId(transactionId); orderService.updateOrder(order); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柳落青

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值