微信开放文档

微信小程序和公众号中,同一个用户在不同的应用中的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();
            }

这样就完成了消息的推送

Logo

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

更多推荐