springboot完成拉取微信公众号关注列表并通过列表推送消息
微信小程序和公众号中,同一个用户在不同的应用中的openId是不同的,也就是说同一个用户在一个小程序和对应的公众号上是无法通过openId对应的,需要用微信唯一的unionId进行对应,还需要进行unionid和openId的转换。这样就拿到了关注公众号的用户数据列表,简单写一个通过unionId拿公众号openId的代码。前置就完成了,接下来是通过获取的列表发送消息。先写拉取关注公众号的用户数据
·
微信小程序和公众号中,同一个用户在不同的应用中的openId是不同的,也就是说同一个用户在一个小程序和对应的公众号上是无法通过openId对应的,需要用微信唯一的unionId进行对应,还需要进行unionid和openId的转换。
先写拉取关注公众号的用户数据列表。
数据库表结构:
/*
Navicat Premium Data Transfer
Source Server : yixue1
Source Server Type : MySQL
Source Server Version : 80024
Source Host : 110.42.3.22:3306
Source Schema : yixue
Target Server Type : MySQL
Target Server Version : 80024
File Encoding : 65001
Date: 15/08/2022 16:40:25
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for wx_official_account_user
-- ----------------------------
DROP TABLE IF EXISTS `wx_official_account_user`;
CREATE TABLE `wx_official_account_user` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键id',
`subscribe_scene` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '关注的渠道来源',
`openid` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '微信openid',
`union_id` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '微信unionId',
`subscribe_time` datetime NOT NULL COMMENT '用户关注时间',
`create_time` datetime NOT NULL COMMENT '创建时间',
`status` tinyint NULL DEFAULT 0 COMMENT '状态',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `openId`(`openid` ASC) USING BTREE,
UNIQUE INDEX `unionId`(`union_id` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 146 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '微信公众号用户信息' ROW_FORMAT = DYNAMIC;
SET FOREIGN_KEY_CHECKS = 1;
controller层代码:
@ApiOperation("公众号关注信息")
@PostMapping("/")
public void getOfficialUsers() throws WxErrorException {
wxOfficialAccountUserService.getOfficialUsers();
}
service层:
@Override
public void getOfficialUsers() throws WxErrorException {
WxOfficialAccountUser user = this.getOne(Wrappers.<WxOfficialAccountUser>query().orderByDesc("subscribe_time").last("limit 1"));
//获取关注公众号的所有openid
WxMpUserList wxMpUserList = wxMpService.getUserService().userList(null);
List<String> openIds = wxMpUserList.getOpenids();
List<WxOfficialAccountUser> list = new ArrayList<>();
//获取后将数据存入数据库
for (String s:openIds) {
WxMpUser wxMpUser = wxMpService.getUserService().userInfo(s);
if(wxMpUser.getSubscribeTime()>(Timestamp.valueOf(user.getSubscribeTime()).getTime())) {
WxOfficialAccountUser wxUser = new WxOfficialAccountUser();
wxUser.setOpenid(s);
wxUser.setUnionId(wxMpUser.getUnionId());
wxUser.setSubscribeScene(wxMpUser.getSubscribeScene());
wxUser.setCreateTime(LocalDateTime.now());
wxUser.setSubscribeTime(LocalDateTime.ofInstant(Instant.ofEpochSecond(wxMpUser.getSubscribeTime()), ZoneId.systemDefault()));
list.add(wxUser);
}
}
this.saveBatch(list);
}
AppID这些需要自行设置。
这样就拿到了关注公众号的用户数据列表,简单写一个通过unionId拿公众号openId的代码
@Override
public String getOfficialOpenId(String unionId) {
//通过unionId拿openId
WxOfficialAccountUser user = this.getOne(Wrappers.<WxOfficialAccountUser>lambdaQuery()
.eq(WxOfficialAccountUser::getUnionId, unionId)
);
return user.getOpenid();
}
前置就完成了,接下来是通过获取的列表发送消息。
WxMpTemplateMessage的生成:
WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
.toUser(表内的openId)
.templateId(自行申请的消息模板)
.miniProgram(new WxMpTemplateMessage.MiniProgram(appId,
pagepath,false))
.build();
根据模板把消息增加到templateMessage内:
map.put("first","first");
map.put("keyword1",keyword1);
map.put("keyword2",keyword1);
map.put("keyword3",keyword1);
map.put("remark",remark);
map.forEach( (k,v)-> templateMessage.addData(new WxMpTemplateData(k, v, "#000000")));
推送消息:
try {
wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
} catch (WxErrorException e) {
count++;
e.printStackTrace();
}
这样就完成了消息的推送

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)