微信小程序会议OA-登录获取手机号流程登录-小程序导入微信小程序SDK(从微信小程序和会议OA登录获取手机号到登录小程序导入微信小程序SDK)
目录
获取用户昵称头像和昵称
wx.getUserProfile
bindgetuserinfo
登录过程
登录-小程序
wx.checkSession
wx.login
wx.request
后台
准备数据表
反向生成工具生成
准备封装前端传过来的数据
小程序服器配置
导入微信小程序SDK
application.yml
WxProperties
WxConfig
WxAuthController
登录-小程序
login.js
user.js
util.js
emoji
获取用户昵称头像和昵称
wx.getUserProfile
bindgetuserinfo
登录过程
小程序登录
小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系。

说明
调用 wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。
调用 auth.code2Session 接口,换取 用户唯一标识 OpenID 、 用户在微信开放平台帐号下的唯一标识UnionID(若当前小程序已绑定到微信开放平台帐号) 和 会话密钥 session_key。
之后开发者服务器可以根据用户标识来生成自定义登录态,用于后续业务逻辑中前后端交互时识别用户身份。
注意事项
会话密钥
session_key是对用户数据进行 加密签名 的密钥。为了应用自身的数据安全,开发者服务器不应该把会话密钥下发到小程序,也不应该对外提供这个密钥。临时登录凭证 code 只能使用一次
appId 作用说明
appid 是微信账号的唯一标识,这个是固定不变的; 如果了解微信公众号开发的就需要注意一下,小程序的appid 和 公众号的appid 是不一致的
session_key 功能说明 微信客户端通过wx.getUserInfo()获取用户的信息 后台有时候也需要获取微信客户端的用户信息,因此,就需要利用session_key这个秘钥来从微信平台中获取 官方文档原文 签名校验以及数据加解密涉及用户的会话密钥 session_key。 开发者应该事先通过 wx.login 登录流程获取会话密钥 session_key 并保存在服务器。为了数据不被篡改,开发者不应该把 session_key 传到小程序客户端等服务器外的环境。
登录-小程序
-
执行wx.login 登录获取小程序端的code
-
服务端根据code去微信端获取session_key并且缓存;同时生成access_token 保存在小程序端,维持登录状态;
-
小程序端请求服务端用户数据时,先wx.checkSession,有效就通过access_token 确定用户,找到session_key;无效就执行wx.login重新登录重新生成access_token,服务端重新获取session_key;
-
小程序端长时间不使用,服务端的session_key会失效,无法再用session_key去微信端获取数据,需要小程序端重新执行登录操作; 服务端要获取session_key 只能通过小程序端的登录来操作;
wx.checkSession
检查登录态是否过期
wx.login
调用接口获取登录凭证(code)
wx.request
请求自己小程序服器,并且携带了code,userInfo信息
后台
准备数据表
DROP TABLE IF EXISTS `wx_user`; CREATE TABLE `wx_user` (`id` int(11) NOT NULL AUTO_INCREMENT,`username` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户名称',`password` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户密码',`gender` tinyint(3) NOT NULL DEFAULT 0 COMMENT '性别:0 未知, 1男, 1 女',`birthday` date NULL DEFAULT NULL COMMENT '生日',`last_login_time` datetime(0) NULL DEFAULT NULL COMMENT '最近一次登录时间',`last_login_ip` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '最近一次登录IP地址',`user_level` tinyint(3) NULL DEFAULT 0 COMMENT '用户层级 0 普通用户,1 VIP用户,2 区域代理用户',`nickname` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户昵称或网络名称',`mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户手机号码',`avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户头像图片',`weixin_openid` varchar(63) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '微信登录openid',`status` tinyint(3) NOT NULL DEFAULT 0 COMMENT '0 可用, 1 禁用, 2 注销',`add_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',`update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',`deleted` tinyint(1) NULL DEFAULT 0 COMMENT '逻辑删除',`share_user_id` int(11) NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE,UNIQUE INDEX `user_name`(`username`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户表' ROW_FORMAT = Compact;
反向生成工具生成
-
WxUser.java
-
WxUserMapper.java
-
WxUserMapper.xml
准备封装前端传过来的数据
-
UserInfo
-
WxLoginInfo
小程序服器配置
导入微信小程序SDK
<dependency><groupId>com.github.binarywang</groupId><artifactId>weixin-java-miniapp</artifactId><version>3.3.0</version> </dependency>
application.yml
oa:wx:app-id: wxf23b28b5e4ea4d6aapp-secret: 212621faa31cdf0691367ea45b2b6041msgDataFormat: JSON
WxProperties
封装oa.wx的数据
@Data
@Configuration
@ConfigurationProperties(prefix = "oa.wx")
public class WxProperties {/*** 设置微信小程序的appId*/private String appId;/*** 设置微信小程序的Secret*/private String appSecret;/*** 消息数据格式*/private String msgDataFormat;
}
WxConfig
注册WxMaService
@Configuration
public class WxConfig {@Autowiredprivate WxProperties properties;
@Beanpublic WxMaConfig wxMaConfig() {WxMaInMemoryConfig config = new WxMaInMemoryConfig();config.setAppid(properties.getAppId());config.setSecret(properties.getAppSecret());config.setMsgDataFormat(properties.getMsgDataFormat());return config;}
@Beanpublic WxMaService wxMaService(WxMaConfig maConfig) {WxMaService service = new WxMaServiceImpl();service.setWxMaConfig(maConfig);return service;}
}
WxAuthController
@RequestMapping("/wx/auth")
public class WxAuthController {@Autowiredprivate WxMaService wxService;@PostMapping("login_by_weixin")public Object loginByWeixin(@RequestBody WxLoginInfo wxLoginInfo, HttpServletRequest request) {
//客户端需携带code与userInfo信息String code = wxLoginInfo.getCode();UserInfo userInfo = wxLoginInfo.getUserInfo();if (code == null || userInfo == null) {return ResponseUtil.badArgument();}//调用微信sdk获取openId及sessionKeyString sessionKey = null;String openId = null;try {WxMaJscode2SessionResult result = this.wxService.getUserService().getSessionInfo(code);sessionKey = result.getSessionKey();//session idopenId = result.getOpenid();//用户唯一标识 OpenID} catch (Exception e) {e.printStackTrace();}
if (sessionKey == null || openId == null) {log.error("微信登录,调用官方接口失败:{}", code);return ResponseUtil.fail();}else{log.info("openId={},sessionKey={}",openId,sessionKey);}//根据openId查询wx_user表//如果不存在,初始化wx_user,并保存到数据库中//如果存在,更新最后登录时间//....// tokenUserToken userToken = null;try {userToken = UserTokenManager.generateToken(user.getId());} catch (Exception e) {log.error("微信登录失败,生成token失败:{}", user.getId());e.printStackTrace();return ResponseUtil.fail();}userToken.setSessionKey(sessionKey);log.info("SessionKey={}",UserTokenManager.getSessionKey(user.getId()));Map<Object, Object> result = new HashMap<Object, Object>();result.put("token", userToken.getToken());result.put("tokenExpire", userToken.getExpireTime().toString());result.put("userInfo", userInfo);//....
log.info("【请求结束】微信登录,响应结果:{}", JSONObject.toJSONString(result));
return ResponseUtil.ok(result);}
响应给客户端数据有:
token userInfo
登录-小程序
login.js
user.loginByWeixin(res.userInfo).then(res => {app.globalData.hasLogin = true;wx.navigateBack({delta: 1})
})
user.js
function loginByWeixin(userInfo) {return new Promise(function(resolve, reject) {return login().then((res) => {//登录远程服务器util.request(api.AuthLoginByWeixin, {code: res.code,userInfo: userInfo}, 'POST').then(res => {if (res.errno === 0) {//存储用户信息wx.setStorageSync('userInfo', res.data.userInfo);wx.setStorageSync('token', res.data.token);resolve(res);} else {reject(res);}})
将userInfo,token数据保存到本地
util.js
function request(url, data = {}, method = "GET") {return new Promise(function (resolve, reject) {wx.request({url: url,data: data,method: method,timeout:6000,header: {'Content-Type': 'application/json','X-OA-Token': wx.getStorageSync('token')},
如果使用util.request函数,每次请求都会携带'X-OA-Token': wx.getStorageSync('token');而服器已经保存了所有的token,所以服器通过token区分每个客户端
emoji
mysql的utf8编码的一个字符最多3个字节,但是一个emoji表情为4个字节,所以utf8不支持存储emoji表情。但是utf8的超集utf8mb4一个字符最多能有4字节,所以能支持emoji表情的存储。
Linux系统中MySQL的配置文件为my.cnf。
Winows中的配置文件为my.ini。
[mysql] # 设置mysql客户端默认字符集 default-character-set=utf8mb4[mysqld] #设置3306端口 port = 3306 # 设置mysql的安装目录 basedir=D:\\tools\\mysql-5.7.23-winx64 # 设置mysql数据库的数据的存放目录 datadir=D:\\tools\\mysql-5.7.23-winx64\\data # 允许最大连接数 max_connections=200 # 服务端使用的字符集默认为8比特编码的latin1字符集 character-set-server=utf8mb4 # 创建新表时将使用的默认存储引擎 default-storage-engine=INNODB
相关文章:
微信小程序会议OA-登录获取手机号流程登录-小程序导入微信小程序SDK(从微信小程序和会议OA登录获取手机号到登录小程序导入微信小程序SDK)
目录 获取用户昵称头像和昵称 wx.getUserProfile bindgetuserinfo 登录过程 登录-小程序 wx.checkSession wx.login wx.request 后台 准备数据表 反向生成工具生成 准备封装前端传过来的数据 小程序服器配置 导入微信小程序SDK application.yml WxProperties …...
原来 TinyVue 组件库跨框架(Vue2、Vue3、React、Solid)是这样实现的?
本文由 TinyVue 组件库核心成员郑志超分享,首先分享了实现跨框架组件库的必要性,同时通过演示Demo和实际操作向我们介绍了如何实现一个跨框架的组件库。 前言 前端组件库跨框架是什么? 前端组件库跨框架是指在不同的前端框架(如…...
自定义label组件
自定义label组件 支持边框绘制 支持shape背景(按指定圆角裁剪,矩形,圆角矩,圆形),支持指定角圆角 支持自定义阴影(颜色,偏移,深度) 边框颜色支持状态选择器 预览 核心绘制辅助类 public class LabelHelper {private final Paint paint;private Paint shadowPaint;private fina…...
【Linux】使用Makefile自动化编译项目:简化开发流程、提高效率
文章目录 示例一:编译一个进度条程序示例二:编译一个简单的程序gcc的几个选项结论 当你开始一个新的软件项目时,编写一个好的Makefile是非常重要的。Makefile是一个文本文件,用于指定如何构建和编译项目。它定义了目标文件、依赖关…...
浅谈开源和闭源的认知
目录 在大型模型的发展中,开源和闭源两种截然不同的开发模式扮演着关键的角色。开源模式通过促进技术共享,吸引了大量优秀人才的加入,从而推动了大模型领域的不断创新。与此相反,闭源模式则着重于保护商业利益和技术优势ÿ…...
你了解Postman 变量吗?
变量是在Postman工具中使用的一种特殊功能,用于存储和管理动态数据。它们可以用于在请求的不同部分、环境或集合之间共享和重复使用值。 Postman变量有以下几种类型: 1、环境变量(Environment Variables): 环境变量是在Postman…...
ArmSoM-RK3588编解码之mpp编码demo解析:mpi_enc_test
一. 简介 [RK3588从入门到精通] 专栏总目录mpi_enc_test 是rockchip官方编码 demo本篇文章进行mpi_enc_test 的代码解析,编码流程解析 二. 环境介绍 硬件环境: ArmSoM-W3 RK3588开发板 软件版本: OS:ArmSoM-W3 Debian11 三. …...
【ES6.0】-详细模块化、export与Import详解
【ES6.0】-详细模块化、export与Import详解 文章目录 【ES6.0】-详细模块化、export与Import详解一、模块化概述二、ES6模块化的语法规范三、export导出模块3.1 单变量导出3.2 导出多个变量3.3 导出函数3.4 导出对象第一种第二种: 3.5 类的导出第一种第二种 四、imp…...
网工内推 | Base北京,国企网工运维,最高30k*14薪,IE认证优先
01 万方数据股份有限公司 招聘岗位:网络工程师 职责描述: 1.负责完成基础网络组网工作; 2.负责网络对象的访问控制及安全策略,配置VLan,黑白名单、地址转换、故障排查及网络安全监控工作; 3.负责对操作系…...
SQL LIKE 运算符:用法、示例和通配符解释
SQL中的LIKE运算符用于在WHERE子句中搜索列中的指定模式。通常与LIKE运算符一起使用的有两个通配符: 百分号 % 代表零个、一个或多个字符。下划线 _ 代表一个单个字符。 以下是LIKE运算符的用法和示例: 示例 选择所有以字母 “a” 开头的客户&#x…...
编译原理Lab1-用FLEX构造C-Minus-f词法分析器
HNU编译原理lab1实验–根据cminux-f的词法补全lexical_analyer.l文件,完成词法分析器。 本文没有添加任何图片,但是以复制输出的形式展现出来了实验结果。 实验要求: 根据cminux-f的此法补全lexical_analyer.l文件,完成词法分析…...
网络安全之渗透测试入门准备
渗透测试入门所需知识 操作系统基础:Windows,Linux 网络基础:基础协议与简单原理 编程语言:PHP,python web安全基础 渗透测试入门 渗透测试学习: 1.工具环境准备:①VMware安装及使用;…...
【MySQL】宝塔面板结合内网穿透实现公网远程访问
文章目录 前言1.Mysql服务安装2.创建数据库3.安装cpolar3.2 创建HTTP隧道4.远程连接5.固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 宝塔面板的简易操作性,使得运维难度降低,简化了Linux命令行进行繁琐的配置,下面简单几步,通过宝塔面板cpo…...
通过AX6000路由器,实现外部访问内网的任意主机
概述 这里遇到一个场景,就是需要外部的人员,访问我内网的一台设备,进行内外部的设备联调。 这也是实际环境中,很常见的一种场景。 之前的做法是子设备上运行edge节点,可以直接访问。 但有的设备无法运行edge节点,那么可以参考一下这个方案来实现。 此方案可以摒弃了…...
如何应用ChatGPT撰写、修改论文及工作报告,提供写作能力及优化工作??
如果我想让gpt从pdf文档中提取相关关键词的内容,可以怎么做呢??我们评论区讨论 ChatGPT 在论文写作与编程方面也具备强大的能力。无论是进行代码生成、错误调试还是解决编程难题,ChatGPT都能为您提供实用且高质量的建议和指导&am…...
camera-caps:Jetson设备上的一种实用的V4L2可视化界面
camera-caps:Jetson设备上的一种实用的V4L2可视化界面 github地址是: https://github.com/jetsonhacks/camera-caps 注意:Jetpack5.x需要选择tag 5.x版本...
CAN基础知识
CAN 简介 CAN 是 Controller Area Network 的缩写(以下称为 CAN),是 ISO 国际标准化的串行通信 协议。在当前的汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种 各样的电子控制系统被开发了出来…...
vue3跨域怎么解决?
其实很简单 假设一个接口; http://101.42.170.68:10000/open/mockData/test1 首先,看自己项目中有没有vue.config.js文件,如果没有自己创建一个,如果有那吗在其中写。 vue.config.js: //固定格式,修改一部分就行了 const { def…...
强化学习小笔记 —— 如何选择合适的更新步长
在强化学习中,动作价值函数的更新可以使用增量法,如下所示: Q k 1 k ∑ i 1 k r i 1 k ( r k ∑ i 1 k − 1 r i ) 1 k ( r k ( k − 1 ) Q k − 1 ) 1 k ( r k k Q k − 1 − Q k − 1 ) Q k − 1 1 k [ r k − Q k − 1 ] \beg…...
容斥 C. Strange Function改编题
补题: 题目详情 - 9.段坤爱取模%%% - SUSTOJ 本题或许是参考 Problem - C - Codeforces 根据题意,f(i)就是不能被整除的最小的一个质因子。 打表发现,当15个质因子相乘后,长度就大于18。 因此可以知道小于等于1e16内的正整数x…...
量子计算流体动力学:原理、挑战与噪声缓解策略
1. 量子计算流体动力学概述量子计算流体动力学(QCFD)是近年来兴起的前沿交叉领域,它试图利用量子计算机的独特优势来解决传统CFD方法面临的"维数灾难"问题。在经典计算机上,直接数值模拟(DNS)需要网格分辨率达到Kolmogo…...
把ESP32变成SPI从机:用HSPI模拟传感器,与树莓派/STM32通信的配置指南
将ESP32配置为SPI从机:与树莓派/STM32通信的实战指南 在物联网和嵌入式系统开发中,多设备间的可靠通信一直是开发者面临的核心挑战。ESP32作为一款功能强大的Wi-Fi/蓝牙双模芯片,其SPI从机模式常被忽视,却能为系统架构带来意想不到…...
专业内存检测神器:Memtest86+ 终极实战指南,彻底告别蓝屏死机
专业内存检测神器:Memtest86 终极实战指南,彻底告别蓝屏死机 【免费下载链接】memtest86plus Official repo for Memtest86 项目地址: https://gitcode.com/gh_mirrors/me/memtest86plus 你是否曾经遭遇过电脑无缘无故蓝屏、系统频繁重启…...
从零到全自动:一个人用OpenClaw重新定义“一人公司”
在现在的创业圈里,越来越多的人选择自己当老板,一个人撑起一个公司。这种“一人公司”虽然小,但灵活、效率高,特别适合想自己做点事的人。今天,我想和你聊聊,我是怎么用一个叫OpenClaw的工具,把…...
Flux Sea Studio 海景摄影生成工具:MySQL数据库管理生成作品与用户数据
Flux Sea Studio 海景摄影生成工具:MySQL数据库管理生成作品与用户数据 最近在折腾一个AI图像生成平台的后台,核心功能是让用户能生成各种风格的海景摄影作品。功能跑起来后,问题来了:用户生成的作品越来越多,怎么存&…...
【央行《分布式事务技术规范》V2.3解读】:Java开发者速查手册(含3类强一致性场景代码模板)
更多请点击: https://intelliparadigm.com 第一章:Java金融分布式事务优化 在高并发、强一致性的金融系统中,传统单体事务模型难以应对跨服务、跨数据库的转账、清算与对账场景。Java 生态中主流的分布式事务方案(如 Seata、Atom…...
如何快速实现Cursor Pro功能解锁:简单有效的完整激活方案
如何快速实现Cursor Pro功能解锁:简单有效的完整激活方案 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your …...
3步掌握浏览器图片格式转换:Chrome扩展Save Image as Type完全指南
3步掌握浏览器图片格式转换:Chrome扩展Save Image as Type完全指南 【免费下载链接】Save-Image-as-Type Save Image as Type is an chrome extension which add Save as PNG / JPG / WebP to the context menu of image. 项目地址: https://gitcode.com/gh_mirro…...
OpCore-Simplify:5分钟完成黑苹果OpenCore自动化配置终极指南
OpCore-Simplify:5分钟完成黑苹果OpenCore自动化配置终极指南 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify OpCore-Simplify是一款专为简…...
你的Notion又白屏了?可能是这些隐藏设置和缓存机制在搞鬼
Notion白屏故障的底层逻辑与技术解决方案 1. 理解Electron应用的渲染机制 Notion作为基于Electron框架构建的跨平台应用,其白屏问题往往与底层渲染机制密切相关。Electron本质上是一个将Chromium浏览器引擎与Node.js运行时结合的框架,这意味着它同时具备…...
