【微信小程序】3、SpringBoot整合WxJava发送订阅消息

发布于:2025-06-20 ⋅ 阅读:(10) ⋅ 点赞:(0)

1、创建消息模板

在这里插入图片描述
在公共模板库里面选择符合自己业务场景的消息模板,例如:
在这里插入图片描述
每个消息模板最多选择5项,可根据自己业务需求自行选择,顺序也可以自己决定。提交后,我们就得到了属于自己的消息模板ID
在这里插入图片描述

2、文档阅读

官方文档 发送订阅消息

https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/mp-message-management/subscribe-message/sendMessage.html

可以关注到消息模板中每种参数的类型有明确的规定

参数类别 参数说明 参数值限制 说明
thing.DATA 事物 20个以内字符 可汉字、数字、字母或符号组合
number.DATA 数字 32位以内数字 只能数字,可带小数
letter.DATA 字母 32位以内字母 只能字母
symbol.DATA 符号 5位以内符号 只能符号
character_string.DATA 字符串 32位以内数字、字母或符号 可数字、字母或符号组合
time.DATA 时间 24小时制时间格式(支持+年月日),支持填时间段,两个时间点之间用“~”符号连接 例如:15:01,或:2019年10月1日 15:01
date.DATA 日期 年月日格式(支持+24小时制时间),支持填时间段,两个时间点之间用“~”符号连接 例如:2019年10月1日,或:2019年10月1日 15:01
amount.DATA 金额 1个币种符号+10位以内纯数字,可带小数,结尾可带“元” 可带小数
phone_number.DATA 电话 17位以内,数字、符号 电话号码,例:+86-0766-66888866
car_number.DATA 车牌 8位以内,第一位与最后一位可为汉字,其余为字母或数字 车牌号码:粤A8Z888挂
name.DATA 姓名 10个以内纯汉字或20个以内纯字母或符号 中文名10个汉字内;纯英文名20个字母内;中文和字母混合按中文名算,10个字内
phrase.DATA 汉字 5个以内汉字 5个以内纯汉字,例如:配送中
enum.DATA 枚举值 只能上传枚举值范围内的字段值 调用接口获取参考枚举值

符号表示除中文、英文、数字外的常见符号,不能带有换行等控制字符。 时间格式支持HH:MM:SS或者HH:MM。 日期包含年月日,为y年m月d日,y年m月、m月d日格式,或者用‘-’、‘/’、‘.’符号连接,如2018-01-01,2018/01/01,2018.01.01,2018-01,01-01。 每个模板参数都会以类型为前缀,例如第一个数字模板参数为number01.DATA,第二个为number02.DATA

例如,模板的内容为:

姓名: {{name01.DATA}}
金额: {{amount01.DATA}}
行程: {{thing01.DATA}}
日期: {{date01.DATA}}

则对应的json为

{
  "touser": "OPENID",
  "template_id": "TEMPLATE_ID",
  "page": "index",
  "data": {
      "name01": {
          "value": "某某"
      },
      "amount01": {
          "value": "¥100"
      },
      "thing01": {
          "value": "广州至北京"
      } ,
      "date01": {
          "value": "2018-01-01"
      }
  }
}

3、发送消息

import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage;
import cn.binarywang.wx.miniapp.constant.WxMaConstants;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.error.WxErrorException;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Slf4j
@Service
@RequiredArgsConstructor
public class WxMaMsgServiceImpl {

    private final WxMaService wxMaService;

    public void sendSubscribeMsg(WxMaSubscribeMessage reqVO) throws WxErrorException {
        WxMaSubscribeMessage message = new WxMaSubscribeMessage();
        message.setToUser("用户openId");
        message.setTemplateId("消息模板id");
        // 非必填
        message.setPage("点击模板卡片后的跳转页面,仅限本小程序内的页面");
        // 模板内容
        List<WxMaSubscribeMessage.MsgData> data = new ArrayList<>();
        data.add(new WxMaSubscribeMessage.MsgData("thing13", "美甲"));
        data.add(new WxMaSubscribeMessage.MsgData("phrase9", "预约成功"));
        data.add(new WxMaSubscribeMessage.MsgData("time22", "2025年06月18日 14:00"));
        data.add(new WxMaSubscribeMessage.MsgData("time23", "2025年06月18日 16:00"));
        data.add(new WxMaSubscribeMessage.MsgData("thing8", "已预约成功请注意查看"));
        message.setData(data);
        // 体验版
        reqVO.setMiniprogramState(WxMaConstants.MiniProgramState.TRIAL);
        // 正式版
        // reqVO.setMiniprogramState(WxMaConstants.MiniProgramState.FORMAL);
        wxMaService.getSubscribeService().sendSubscribeMsg(reqVO);
    }
}

4、前端订阅

const noticeRes = await wx.requestSubscribeMessage({
  tmplIds: ['消息模板id1', '消息模板id2']
})
let acceptArray = []
// 消息1同意
if (noticeRes['消息模板id1'] === 'accept') {
  acceptArray.push('消息模板id1')
}
// 消息2同意
if (noticeRes['消息模板id2'] === 'accept') {
  acceptArray.push('消息模板id2')
}

然后把用户同意订阅的消息模板id传到后端,后端根据业务场景给用户发送对应的订阅消息即可。

如您在阅读中发现不足,欢迎留言!!!


网站公告

今日签到

点亮在社区的每一天
去签到