背景
有一些同学在实际开发中,会有通过微信的openid获取公众号的openid,或者其他内容,这几天正好在研究这个功能的实现(已实现),现做思路上的简单分享,希望能对需要解决该问题的同学有所帮助,有误之处敬请指正。
开发工具
工具/语言/依赖 | 版本 | 备注 |
uniapp | 2023-12 | |
Springboot | 2.1.12.RELEASE | |
weixin-java-miniapp | 4.1.0 | Springboot依赖包,兼容性请自行解决 |
问题
1.通过微信openid获取公众号的openid
2.通过unionid获取公众号的openid
3.其他通过openid、unionid相互获取
微信官方说明
极其重要:同一主体下的小程序与公众号未关联,无法在使用uni.login时通过code获取到unionid.
前置工作
解决该问题的大前提:在微信·开放平台对应路径绑定小程序、绑定公众号
具体操作:(略)
开发逻辑
整体思路:通过unionid关联微信小程序openid与公众号openid
1.微信小程序发起微信登录请求,需发送有效的code至后端待后续换取session信息;
2.微信小程序业务实现接口:存储获取到的微信小程序openid、unionid,备用;
3.微信公众号业务实现接口:获取accessToken、获取用户列表(主要是获取openid)、批量获取用户列表(关注与未关注的用户完整信息);
4.使用批量获取的用户列表结果中通过第二步中拿到的uinonid获取公众号的openid即可。
开发准备
Springboot 项目添加依赖
xml
<!-- https://mvnrepository.com/artifact/com.github.binarywang/weixin-java-miniapp -->
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-miniapp</artifactId>
<version>4.1.0</version>
</dependency>
开发实操
1.java后端使用code置换seesion信息
ini
// 1.获取微信会话信息
WxMaJscode2SessionResult sessionResult = wxService.getUserService().getSessionInfo(code);
2.存储微信小程序openid、session_key、unionid
3.微信公众号获取信息
3.1 获取access_token
makefile
https请求方式: GET
url: https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
APPID: 公众号appid
APPSECRET: 公众号的appsecret
3.2 获取公众号用户列表
markdown
获取关注微信公众号用户列表
/**
* http请求方式:get
* url: https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN
* http请求返回的数据
* {
* "total": 7,
* "count": 7,
* "data": {
* "openid": [
* "onitD6eh2CmVAjJyvXvjgaTmWVQo",
* "onitD6Rtzk8LYeTHIk07OseyIWI8",
* "onitD6SUQfEerhm7qhQvB5zRK6t4",
* "onitD6eSfArnbPs3RxoQu64ALFgU",
* "onitD6XQDKdWaYw2GUwEo1GYamkg",
* "onitD6fg0vwdpAnJR2rb3dkxPkqw",
* "onitD6StpbW2Nn7Srzl9J4WjShJ8"
* ]
* },
* "next_openid": "onitD6StpbW2Nn7Srzl9J4WjShJ8"
* }
*/
3.3 批量请求用户信息
bash
批量获取用户信息的请求参数:
/**
* 批量请求用户信息的数据格式
* http方式: POST
* url: https://api.weixin.qq.com/cgi-bin/user/info/batchget?access_token=ACCESS_TOKEN
* {
* "user_list": [
* {
* "openid": "xxxx",
* "lang": "zh_CN"
* },
* {
* "openid": "xxxx",
* "lang": "zh_CN"
* }
* ]
* }
*/
bash
批量获取用户信息的返回结果:
/**
* 批量请求用户信息返回结果数据格式
* url: https://api.weixin.qq.com/cgi-bin/user/info/batchget?access_token=ACCESS_TOKEN
* http方式: POST
* 返回结果:
* {
* "user_info_list": [
* {
* "subscribe": 1,
* "openid": "xxxx",
* "language": "zh_CN",
*
* "subscribe_time": 1434093047,
* "unionid": "xxxx",
* "remark": "",
*
* "groupid": 0,
* "tagid_list":[128,2],
* "subscribe_scene": "ADD_SCENE_QR_CODE",
* "qr_scene": 98765,
* "qr_scene_str": ""
*
* },
* {
* "subscribe": 0,
* "openid": "xxxx"
* }
* ]
* }
*/
第一个为已关注的用户
第二个为未关注的用户
4.使用第四步中的返回结果unionid与第二步中微信小程序获取到的unionid关联
综上就完成了微信小程序与微信公众号信息的关联。
至于其他信息的关联和处理请大家自行想办法,至此结束。
Java与uniapp代码目前还未开放,待后续提供至个人github仓库。
有问题可以联系我:code_captain@163.com