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

news2024/11/26 10:15:54

一、流程图

在这里插入图片描述

说明:

调用 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("获取用户手机号失败");
        }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1845609.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI口语练习APP的开发流程

开发AI口语练习APP是一个持续的过程&#xff0c;需要多学科团队的紧密合作&#xff0c;包括产品经理、UI/UX设计师、前后端开发者、机器学习工程师、测试工程师和市场运营人员等。随着技术的发展和用户需求的变化&#xff0c;开发流程可能需要相应地进行调整和优化。AI口语练习…

【Python机器学习实战】 | 基于支持向量机(Support Vector Machine, SVM)进行分类和回归任务分析

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

zynq qspi启动、无SD卡、格式化分区emmc、调试全过程

1 背景 使用黑金开发板&#xff0c;全部开发流程避开使用SD卡调试&#xff0c;zynq开发过程中很多资料都是基于SD启动。这样就对新板卡调试带来了一定的困难&#xff0c;因为新板卡基本上没有设计SD卡。这里就一步一步实现qspi启动内核&#xff0c;格式化分区emmc&#xff0c;…

leetCode40组合总和(回溯)

题目 给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次示例 : 输入: candidates [2,5,2,1,2], target 5, 输出: [ [1,2,2], [5] ]回溯一般模…

[package-view] RegisterGUI.java-自用

java GUI : frame---> panel --> components[button/输入框/标签] JFrame-->JPanel---> [JButton/JTextField/JLabel] /** This code sets up a registration window using Swing. * The window includes input fields for the users name, ID,* and password, …

vue3 自定义指令-积分埋点

自用笔记&#xff0c;内容可能不全 // package.json "sunshine-track": "^1.0.0-beta.2",// track index.jsimport Track from sunshine-trackconst options {projectKey: test-project, // 项目的keyuserId: digger, // 用户idreport: {url: http://exam…

uniapp app打开微信客服

按钮触发 uni.share({provider: "weixin",openCustomerServiceChat: true,customerUrl: https://work.weixin.qq.com/kfid/*************, //企业微信地址corpid: ww13edaa**********, //企业idsuccess: (res) > {console.log("success:" JSON.string…

Redis精要

一、什么是缓存击穿、缓存穿透、缓存雪崩&#xff1f; 缓存穿透 【针对大量非法访问的请求&#xff0c;缓存中没有&#xff0c;直接访问DB】 缓存穿透指的查询缓存和数据库中都不存在的数据&#xff0c;这样每次请求直接打到数据库&#xff0c;就好像缓存不存在 一样。 对于系…

【经验分享】Ubuntu24.04安装微信

【经验分享】Ubuntu24.04安装微信(linux官方2024universal版) 文章如下&#xff0c;22.04和24.04微信兼容 【经验分享】Ubuntu22.04安装微信(linux官方2024universal版) 实测Ubuntu24.04LTS版本可以兼容。

cenots 出现 curl 外网地址很慢,或者微信授权很慢

用 curl 访问链接&#xff0c;很慢才显示接口、或者微信授权很慢&#xff0c; 微信授权&#xff0c;很慢才授权成功&#xff0c;平均延时 5s 可能是 dns配置问题&#xff0c;直接修改 sudo vim /etc/resolv.conf 的 nameserver 改为 114.114.114.114 即可 其他…

锂电池寿命预测 | Matlab基于ARIMA的锂电池寿命预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 锂电池寿命预测 | Matlab基于ARIMA的锂电池寿命预测 NASA数据集&#xff0c;B0005号电池&#xff0c;选择前110个数据训练&#xff0c;后58个数据测试预测。程序包含去趋势线、差分、平稳化及AIC准则判定p和q。命令窗…

DSP28335课设:音乐流水灯的设计

本题目为音乐流水灯的设计&#xff0c;目的是熟练掌握DSP定时器的控制、中断系统的应用以及程序的编写调试。 1、让DSP发出不同的音乐音调&#xff1b; 2、存储一个简单音乐&#xff08;自选&#xff09;&#xff1b; 3、音乐的音调对应不同的灯 4、启动开关按下时&…

C++Muduo网络库初探

Muduo初探 Muduo网络库简介 Muduo是由【陈硕】大佬个人开发的TCP网络编程库&#xff0c;基于Reactor模式&#xff0c;提供了高效的事件驱动网络编程框架&#xff0c;有助于快速搭建高性能的网络服务端。 什么是Reactor模式&#xff1f; I/O多路复用 在网络I/O中&#xff0…

eclipse中没有SERVER的解决办法(超详细)

将 Tomcat 和 Eclipse 相关联时&#xff0c;Eclipse有的版本发现 发现eclipse->【Window】->【Preferences】里没有【server】从而配置不了Runtime Environment。所以需要通过eclipse进行安装。 通过我个人的经验下面给出解决办法&#xff1a; 一、获取 Eclipse版本 点击…

性能测试并发量评估新思考:微服务压力测试并发估算

性能测试并发量评估新思考 相信很多人在第一次做压力测试的时候&#xff0c;对并发用户数的选择一直有很多的疑惑&#xff0c;那么行业内有一些比较通用的并发量的计算方法&#xff0c;但是这些方法在如今微服务的架构下多少会有一些不适合&#xff0c;下面的文章我们对这些问题…

JS【数组】交集、差集、补集、并集

var a [1,2,3,4,5] var b [2,4,6,8,10]var sa new Set(a); var sb new Set(b); // 交集 let intersect a.filter(x > sb.has(x)); // 差集 let minus a.filter(x > !sb.has(x)); // 补集 let complement [...a.filter(x > !sb.has(x)), ...b.filter(x > !sa…

MicroBlaze IP核中Local Memory Bus (LMB)接口描述

LMB&#xff08;Local Memory Bus&#xff09;是一种同步总线&#xff0c;主要用于访问FPGA上的块RAM&#xff08;Block RAM&#xff0c;BRAM&#xff09;。LMB使用最少的控制信号和一个简单的协议&#xff0c;以保证块RAM能在一个时钟周期内被存取。所有的LMB信号都是高电平有…

[深度学习]--分类问题的排查错误的流程

原因复现&#xff1a; 原生的.pt 好使&#xff0c; 转化后的 CoreML不好使&#xff0c; 分类有问题。 yolov8 格式的支持情况 Format Argument Suffix CPU GPU 0 PyTorch - .pt True True 1 Tor…

Unet已死,Transformer当立!详细解读基于DiT的开源视频生成大模型EasyAnimate

Diffusion Models视频生成-博客汇总 前言&#xff1a;最近阿里云PIA团队开源了基于Diffusion Transformer结构的视频生成模型EasyAnimate&#xff0c;并且提出了专门针对视频的slice VAE&#xff0c;对于目前基于Unet结构的视频生成最好如SVD形成了降维打击&#xff0c;不论是生…

快消品经销商的仓库管理,有哪些是必须注意的事项?

快消品经销商仓库管理是一个复杂而关键的过程&#xff0c;它涉及到产品的存储、保管、发货以及库存控制等多个环节。一个高效的仓库管理系统不仅有助于减少成本&#xff0c;提高运营效率&#xff0c;还能确保产品质量和满足客户需求。以下是一些快消品经销商在仓库管理过程中需…