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传到后端,后端根据业务场景给用户发送对应的订阅消息即可。
如您在阅读中发现不足,欢迎留言!!!