封装通用第三方平台用户表(微信开放平台)
文章目录
- 一. 注册微信开放平台
- 1.1 开发者资质认证
- 1.2 应用申请
- 1.3 配置应用
- 二.通用数据库表设计
- 三.入库实体类
- 四. 对接第三方平台
- 4.1 微信开放平台VO对象
- 4.2 通用方法
我们的系统可能要对接很多第三方系统,为了便利用户授权使用和对多平台账户的管理。有必要设计通用第三方平台表。用来统一用户管理,将以微信开放平台为例
一. 注册微信开放平台
首先强调的是 微信公众号平台和微信开放平台不是一个东西。 微信开放平台主要用于自己的系统对接微信。 而微信公众号平台主要使用微信公众号,小程序等微信内部程序对接微信开放接口。 而微信公众测试号不可用于微信开放平台。 微信开放平台必须通过企业认证注册应用实体,才能任意配置回调域使用测试域。
微信开放平台
微信开放平台文档
微信公众号平台
微信公众号平台测试号申请
微信公众号平台文档
1.1 开发者资质认证

主体必须以公司为认证实体

1.2 应用申请
扫描件内容必须与网站应用名称、网站应用简介、应用官网完全对应。 审查非常严格,不要得过且过。

1.3 配置应用
sercet只会出现一次,谨慎保管。如果我们需要登录或支付,其对应的接口状态必须为已获得

回调域配置,当认证通过后,我们可以使用内网穿透域名进行测试。或者使用公司公网,用nginx代理到个人电脑上进行测试开发

注意,授权回调域不要加http://或https:// 前缀,直接写域名即可,其中阅读开放平台开发文档时,让填写回调地址,那必须在接口请求时追加http:// 或https:// 前缀
二.通用数据库表设计

-- 第三方平台万能表 可以不绑定用户
-- access_token移除,作为token不入库
-- 移除 refresh_token ,让前端携带access_token同时携带refresh_token,保证可以刷新token
drop table if exists thirdauth_user;
create table thirdauth_user
(id bigint unsigned not null comment '主键'primary key,user_id bigint unsigned default 0 comment '用户id',tenant_id varchar(32) default '' comment '租户id 子平台再多,也不可能超过100个',nickname varchar(32) default '' null comment '昵称',avator varchar(255) default '' null comment '头像地址',scope varchar(255) default '' null comment '授权范围',platform varchar(32) not null comment '第三方平台名称',openid varchar(64) not null comment '第三方平台用户id',unionid varchar(64) default '' null comment '第三方内部跨平台id',create_time datetime default CURRENT_TIMESTAMP null comment '创建时间',update_time datetime default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP comment '更新时间',is_delete tinyint default 0 null comment '是否删除 0否 1是',unique `idx_platform_openid` (`platform`, `openid`)
) comment '用户第三方登录表';
三.入库实体类
/*** 用户第三方登录表* @TableName thirdauth_user*/
@TableName(value ="thirdauth_user")
@Data
public class ThirdauthUser implements Serializable {/*** 主键*/@TableIdprivate Long id;/*** 用户id*/@TableField(value = "user_id")private Long userId;/*** 租户id 内部系统哪个平台的用户id*/@TableField(value = "tenant_id")private Long tenantId;/*** 昵称*/@TableField(value = "nickname")private String nickname;/*** 头像地址*/@TableField(value = "avator")private String avator;/*** 第三方平台名称*/@TableField(value = "platform")private String platform;/*** 第三方平台用户id*/@TableField(value = "openid")private String openid;/*** 第三方内部跨平台id*/@TableField(value = "unionid")private String unionid;/*** scope*/@TableField(value = "scope")private String scope;/*** 创建时间*/@TableField(value = "create_time")private LocalDateTime createTime;/*** 更新时间*/@TableField(value = "update_time")private LocalDateTime updateTime;/*** 是否删除 0否 1是*/@TableField(value = "is_delete")@TableLogic(value = "0",delval = "1")private Integer isDelete;@TableField(exist = false)private static final long serialVersionUID = 1L;
}
四. 对接第三方平台
每个平台返回的数据总有差异,我们需要各种vo来协调,最后都归于上述实体类入库。这里仅列出微信开放平台的封装。
4.1 微信开放平台VO对象
/*** @author YuanJie* @date 2024/8/20 下午2:32*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class WeChatVO {/*** 用户授权唯一标识*/private String openid;/*** 用户授权的access_token*/private String access_token;/*** access_token接口调用凭证超时时间,单位(秒)*/private Long expires_in;/*** 用户昵称*/private String nickname;/*** 用户头像*/private String headimgurl;/*** 用户刷新access_token 30天有效*/private String refresh_token;/*** 用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID*/private String unionid;/*** 授权资料*/private String scope;
}
4.2 通用方法
/*** @author YuanJie* @date 2024/6/20 下午2:02*/
@RestController
@RequestMapping("/oauth2/wx")
@Slf4j
@ApiOperation(value = "oauth2", tags = "oauth2")
public class WXController extends BaseController {@Value("${oauth2.wx.appid}")private String appid;@Value("${oauth2.wx.appSecret}")private String appSecret;@Resourceprivate ThirdauthUserService thirdauthUserService;@Resourceprivate RestTemplate restTemplate;private final List<String> states = Collections.synchronizedList(new ArrayList<>());private final ObjectMapper objectMapper = new ObjectMapper();private final String WX_PREFIX = "wx";/*** 127.0.0.1:8080/oauth2/wx/code?backendUrl=http://xxxxo.com/oauth2/wx/callback** @param request* @param response* @param backendUrl* @throws IOException*/@ApiOperation("获取微信code")@GetMapping("/code")public void getWxCode(HttpServletRequest request,HttpServletResponse response,@RequestParam("backendUrl") String backendUrl) throws IOException {String state = UUID.randomUUID().toString().replace("-", "");this.states.add(state);// 回调地址直接填 下面的getCallback()方法。让微信直接回调下面的方法,这里回调地址必须加http https 前缀String url = "https://open.weixin.qq.com/connect/qrconnect?" +"appid=" + appid +"&redirect_uri=" + UriEncoder.encode(backendUrl) +"&response_type=code" +"&scope=snsapi_login" +"&state=" + state + "#wechat_redirect";response.sendRedirect(url);}/*** 供微信调用* 获取access_token** @param code*/@ApiOperation("获取access_token")@GetMapping("/callback")public AjaxResult getCallback(@RequestParam("code") String code, @RequestParam("state") String state) throws JsonProcessingException {// 校验stateif (!this.states.contains(state)) {return error();}this.states.remove(state);// 获取access_tokenString url = "https://api.weixin.qq.com/sns/oauth2/access_token?" +"appid=" + appid +"&secret=" + appSecret +"&code=" + code +"&grant_type=authorization_code";ResponseEntity<String> forEntity = restTemplate.getForEntity(url, String.class);WeChatVO weChatVO = objectMapper.readValue(forEntity.getBody(), WeChatVO.class);if (weChatVO == null) {return error("获取微信信息异常");}// 获取用户信息准备入库WeChatVO userInfo = setUserInfo(weChatVO.getAccess_token(), weChatVO.getRefresh_token(), weChatVO.getOpenid());log.info("当前微信用户信息:{}", objectMapper.writeValueAsString(weChatVO));// 返回tokenreturn success(userInfo);}/*** 请求用户信息** @param accessToken* @param refreshToken* @param openid*/private WeChatVO setUserInfo(String accessToken, String refreshToken, String openid) throws JsonProcessingException {// 校验token是否有效 并刷新tokenaccessToken = checkToken(accessToken, refreshToken, openid);// 请求用户信息String userInfo = "https://api.weixin.qq.com/sns/userinfo?" +"access_token=" + accessToken +"&openid=" + openid;ResponseEntity<String> forEntity = restTemplate.getForEntity(userInfo, String.class);WeChatVO weChatVO = objectMapper.readValue(forEntity.getBody(), WeChatVO.class);if (weChatVO == null) {throw new RuntimeException("获取微信信息异常");}weChatVO.setAccess_token(accessToken);weChatVO.setRefresh_token(refreshToken);// 保存到数据库ThirdauthUser thirdauthUser = new ThirdauthUser();thirdauthUser.setPlatform(WX_PREFIX);thirdauthUser.setAvator(weChatVO.getHeadimgurl());BeanUtils.copyProperties(weChatVO, thirdauthUser);thirdauthUserService.saveOrUpdate(thirdauthUser,Wrappers.lambdaQuery(ThirdauthUser.class).eq(ThirdauthUser::getOpenid, weChatVO.getOpenid()).eq(ThirdauthUser::getPlatform, WX_PREFIX));return weChatVO;}/*** 校验token是否有效 并返回刷新的token** @param accessToken* @param refreshToken* @param openid*/private String checkToken(String accessToken, String refreshToken, String openid) throws JsonProcessingException {String checkToken = "https://api.weixin.qq.com/sns/auth?" +"access_token=" + accessToken +"&openid=" + openid;ResponseEntity<String> forEntity = restTemplate.getForEntity(checkToken, String.class);String body = forEntity.getBody();Map map = objectMapper.readValue(body, Map.class);if (map.get("errcode").equals(0)) {return refreshToken(refreshToken);}throw new RuntimeException("token失效,请重新登录");}/*** 刷新token 若refreshToken失效,则重新登录** @param refreshToken* @return*/private String refreshToken(String refreshToken) throws JsonProcessingException {String url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?" +"appid=" + appid +"&grant_type=refresh_token" +"&refresh_token=" + refreshToken;ResponseEntity<String> forEntity = restTemplate.getForEntity(url, String.class);WeChatVO weChatVO = objectMapper.readValue(forEntity.getBody(), WeChatVO.class);if (weChatVO == null) {throw new RuntimeException("刷新token失败,refreshToken已过期,请重新登录");}return weChatVO.getAccess_token();}

相关文章:
封装通用第三方平台用户表(微信开放平台)
文章目录 一. 注册微信开放平台1.1 开发者资质认证1.2 应用申请1.3 配置应用 二.通用数据库表设计三.入库实体类四. 对接第三方平台4.1 微信开放平台VO对象4.2 通用方法 我们的系统可能要对接很多第三方系统,为了便利用户授权使用和对多平台账户的管理。有必要设计通…...
【C++】_string类字符串详细解析(1)
假如没有给你生命,你连失败的机会都没有。你已经得到了最珍贵的,还需要抱怨什么!💓💓💓 目录 ✨说在前面 🍋知识点一:什么是string? •🌰1.string类的概念 •…...
【Linux】——进程概念(万字解读)
一 冯诺依曼体系结构 在此之前,我们先要理解我们计算机的冯诺依曼体系结构,因为是进程的基础 我们所有的操作其实都是基于这样一个模型,比如你在qq上,和别人发送消息,这个消息肯定是先通过输入设备进行输入…...
03 serv00搭建WordPress
第一步 下载 serv00 官方教程 按官方教程下载 WordPress 压缩包,解压,将 WordPress 项目文件夹重命名为 public_html(先删除原来的 public_html) 第二步 安装 完成以上步骤后访问你的网站,开始安装 WordPress …...
伪共享问题如何解决?
伪共享问题是多核处理器环境下常见的性能瓶颈之一,特别是在多线程编程中。想要解决它,就必须先了解缓存行的概念。 缓存行 缓存行是指在 CPU 缓存中最小的数据单位,通常包含一定数量的字节(例如,常见的缓存行大小为 …...
基于web框架的协同过滤的美食推荐系统【数据爬虫、管理系统、数据可更新、样式可调整】
文章目录 有需要本项目的代码或文档以及全部资源,或者部署调试可以私信博主项目介绍研究背景研究的目的与意义协同过滤算法基于用户的协同过滤算法定义基于物品的协同过滤算法的定义 数据库设计db_food(美食信息表)db_collect(美食…...
Eureka中的多实例配置:如何处理微服务实例动态扩展与缩减
Eureka中的多实例配置:如何处理微服务实例动态扩展与缩减 1. 引言 在微服务架构中,服务的动态扩展与缩减是确保系统弹性和高可用性的关键因素。Eureka,作为一个服务注册和发现的组件,扮演着至关重要的角色。它由Netflix开源&…...
Ubuntu 22.04使用 IPTables 配置防火墙
网络安全管理是服务器安全的重要组成部分。在这将介绍在 Ubuntu 22.04 中使用名为 iptables 的软件包管理工具设置防火墙的过程。 IPTables简介 IPTables是一个功能强大的软件包管理工具,可用于大多数Linux发行版,包括Ubuntu 22.04。该工具允许管理员定…...
Java语言程序设计——篇十三(1)
🌿🌿🌿跟随博主脚步,从这里开始→博主主页🌿🌿🌿 欢迎大家:这里是我的学习笔记、总结知识的地方,喜欢的话请三连,有问题可以私信🌳🌳&…...
GB/T 5023.3-2008额定电压450/750V及以下聚氯乙烯绝缘电缆
聚氯乙烯绝缘电缆产品分为固定布线用无护套电缆、固定布线用护套电缆、轻型无护套软电缆、一般用途护套软电缆、安装用电线和屏蔽电线、特殊用途护套软电缆、聚氯乙烯绝缘阻燃/耐火电缆等产品。 GB/T 5023.3-2008额定电压450/750V及以下聚氯乙烯绝缘电缆 第3部分:固…...
深入单例模式
1. 饿汉模式 饿坏了,上来就先实例化一个对象,好处是代码简单,坏处是这个对象后面如果一直用不到,就是个浪费。 public class A{ private static A a new A(); private A(){} public static A getInstance(){ return a; } } 2. 懒…...
MongoDB 单机和集群环境部署教程
目录 一、MongoDB 单机环境部署1. 环境准备2. 安装 MongoDB2.1 在 Ubuntu 上安装 MongoDB2.2 在 CentOS 上安装 MongoDB2.3 启动 MongoDB 服务2.4 验证 MongoDB 安装2.5 MongoDB 基本安全设置 3. 单机部署注意事项 二、MongoDB 集群环境部署1. 环境准备2. MongoDB Replica Set …...
【学习笔记】Day 20
一、进度概述 1、机器学习常识12-18,以及相关代码复现 二、详情 12、SVM(support vector machines,支持向量机) 实际上,支持向量机是一种二分类模型,它将实例的特征向量映射为空间中的一些点,…...
StringBuffer与StringBuilder 2024-8-21 22-13
目录 一、StringBuffer二、StringBuilder三、总结 一、StringBuffer StringBuffer是一个可变的字符序列,它的存在是为了解决频繁操作字符串时产生大量临时对象的问题。 构造方法: StringBuffer():创建一个空的字符串缓冲区,初始容…...
会声会影剪辑视频收费吗,会声会影最新破解版
会声会影2024:引领视频创作新时代的创新之旅** 在数字时代的浪潮中,视频创作已成为连接世界、表达创意的重要方式。随着技术的不断进步,一款名为“会声会影2024”的视频编辑软件横空出世,它不仅继承了前代产品的优秀传统…...
在Windows11强制开启copilot
在 Windows 11 上启用自带的基于 GPT-4 的 Copilot 功能。以下是具体步骤: 更新系统: 确保你的 Windows 11 系统已经更新到最新版本(23H2 或更高版本)。你可以在“设置” > “Windows 更新”中检查并安装最新更新。 更改区域和…...
基于Java的开源CMS有哪些推荐,各自特点是什么
最强大、最易用的CMS,向大家做一个简要介绍。 01 Alfresco Alfresco是一个开源的企业网站内容管理系统,它提供了文档管理、多人协作、记录管理、知识管理网页内容和图像管理等功能。它使用Spring、 Hibernate、 Lucene 和JSF等最新java技术构建了模…...
IPC进程通信以及网络通信
一、IPC 进程间通信方式 共享内存 //最高效的进程间通信方式 不需要把用户的东西再复制到内核 他们与内核进行绑定 共享内存: 1、是一块,内核预留的空间 2、最高效的通信方式 //避免了用户空间到内核空间的数据拷贝 IPC通信方式 ---操作流程类似的…...
【脏数据 bug 解决】ValueError: mean must have 1 elements if it is an iterable, got 3
问题描述: 在训练模型的过程中,出现 clip_image_processor 无法处理数据的问题,说明数据集中很可能出现了脏数据。本文使用的数据为 LAION-Aesthetics-V2-6.5plus,从 https://dagshub.com/DagsHub-Datasets/LAION-Aesthetics-V2-…...
【Vue3】集成 Ant Design Vue
【Vue3】集成 Ant Design Vue 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长,很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来,技术出身的人总是很难放下一些执念,遂将这些知识整理成文,以纪念曾经努力学习奋斗…...
UnblockNeteaseMusic完整指南:如何一键解锁网易云音乐灰色歌曲
UnblockNeteaseMusic完整指南:如何一键解锁网易云音乐灰色歌曲 【免费下载链接】UnblockNeteaseMusic Revive unavailable songs for Netease Cloud Music 项目地址: https://gitcode.com/gh_mirrors/un/UnblockNeteaseMusic 还在为网易云音乐里那些灰色的、…...
避坑指南:STM32CubeMX配置TouchGFX时,LTDC时钟与SDRAM地址那些容易出错的地方
STM32CubeMX与TouchGFX深度调优:LTDC时钟与SDRAM地址的工程实践 当你在深夜调试STM32F429的TouchGFX界面时,突然发现屏幕出现雪花般的噪点,或是触摸操作引发界面频繁闪烁——这种场景对嵌入式GUI开发者来说再熟悉不过。本文将带你深入LTDC时…...
3分钟快速上手:163MusicLyrics终极歌词提取工具完整指南
3分钟快速上手:163MusicLyrics终极歌词提取工具完整指南 【免费下载链接】163MusicLyrics Windows 云音乐歌词获取【网易云、QQ音乐】 项目地址: https://gitcode.com/GitHub_Trending/16/163MusicLyrics 你是否曾为心爱的歌曲找不到歌词而烦恼?是…...
【Web前端】深入解析JavaScript异步编程
JavaScript的异步编程是其核心特性之一,也是理解JavaScript运行机制的关键。下面我从几个方面详细介绍。一、为什么需要异步编程?JavaScript 是单线程语言,意味着同一时间只能做一件事。如果没有异步编程,当遇到耗时操作ÿ…...
终极指南:如何用Python脚本5分钟获取百度网盘真实下载链接
终极指南:如何用Python脚本5分钟获取百度网盘真实下载链接 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 你是否曾经为百度网盘的下载速度而烦恼?每次…...
摆脱论文困扰!高效论文写作全流程AI论文平台推荐(2026 最新)
论文写作全流程可拆解为文献调研→选题/开题→大纲/初稿→文献综述→降重/去AI味→润色/格式→查重/投稿七大环节,2026年AI论文平台按环节精准匹配,兼顾中文适配、降重能力、去AI痕迹、学术合规四大核心需求,覆盖免费/付费、通用/垂直场景。一…...
为什么你的视觉检测准确率卡在92.7%?(揭秘工业现场3类未标注异常数据导致的模型过拟合代码根源)
第一章:视觉检测准确率瓶颈的工业现场真相在实际产线部署中,视觉检测模型在实验室达到99.2%的mAP,落地后却频繁出现漏检与误报——这不是算法缺陷,而是工业现场多维干扰叠加的真实映射。光照波动、工件表面反光、传送带抖动、镜头…...
新手福音:基于快马平台和vmware官网快速上手虚拟化编程实践
作为一个刚接触虚拟化技术的新手,最近在浏览vmware官方中文网站时,发现了很多有用的学习资料。但光看理论总觉得不够直观,于是想通过动手实践来加深理解。在朋友的推荐下,我尝试用InsCode(快马)平台来创建一个简单的虚拟机监控面板…...
MongoDB从零基础搭建到实战
MongoDB从零基础搭建到实战 MongoDB作为当下最流行的开源文档型NoSQL数据库,凭借灵活的文档结构、高扩展性和易用性,成为前后端开发、大数据存储、云原生项目的首选数据库之一。相比传统关系型数据库,它无需严格预定义表结构,适配…...
大模型学习进阶:收藏必备,小白程序员快速掌握RAG架构核心技术!
大模型学习进阶:收藏必备,小白程序员快速掌握RAG架构核心技术! 本文深入解析了RAG(检索增强生成)大模型的核心技术及其重要性,详细介绍了标准RAG、对话式RAG、纠正式RAG、自适应RAG、自我反思RAG、融合RAG、…...
