一、引言
作者开发《目的地到了》的时候需要给用户发消息,一开始用了消息模板,后面上真机才发现微信把这个给取消掉了。后面通知用户都是通过订阅消息
二、前端
调用wx的api,要把模板id传进去,如果用户没有点击过同意会弹出弹窗提示用户,正常如果不是选择一直同意就只能发一次。
wx.requestSubscribeMessage({
tmplIds: ['**'],
success(res) {
}
})
三、后端
1、pom
首先要引入微信小程序的包,基于weixin-java-miniapp调用微信的api
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-miniapp</artifactId>
<version>4.1.0</version>
</dependency>
2、配置
要在微信小程序申请模板,然后配置模板编号
# 微信模版通知配置
# 微信模版用于通知客户或者运营者,注意配置格式;template-name,template-templateId 请参考 NotifyType 枚举值
notify:
wx:
enable: true
template:
- name: **
templateId: **
3、订阅消息通知类
public class WxMessageSender {
@Autowired
private WxMaService wxMaService;
/**
* 发送微信消息(模板消息),不带跳转
*
* @param touser 用户 OpenID
* @param templatId 模板消息ID
* @param parms 详细内容
*/
public void sendWechatMsg(String touser, String templatId, String[] parms) {
sendMsg(touser, templatId, parms, "", "", "");
}
/**
* 发送微信消息(模板消息),带跳转
*
* @param touser 用户 OpenID
* @param templatId 模板消息ID
* @param parms 详细内容
* @param page 跳转页面
*/
public void sendWechatMsg(String touser, String templatId, String[] parms, String page) {
sendMsg(touser, templatId, parms, page, "", "");
}
private void sendMsg(String touser, String templatId, String[] parms, String page, String color,
String emphasisKeyword) {
WxMaSubscribeMessage msg = new WxMaSubscribeMessage();
// 要推送的用户openid
msg.setToUser(touser);
msg.setTemplateId(templatId);
msg.setPage(page);
msg.setData(createMsgData(parms));
try {
wxMaService.getMsgService().sendSubscribeMsg(msg);
} catch (Exception e) {
e.printStackTrace();
}
}
private List<WxMaSubscribeMessage.MsgData> createMsgData(String[] parms) {
List<WxMaSubscribeMessage.MsgData> dataList = new ArrayList<>();
WxMaSubscribeMessage.MsgData data1 = new WxMaSubscribeMessage.MsgData();
data1.setName("thing3");
data1.setValue(parms[0]);
dataList.add(data1);
WxMaSubscribeMessage.MsgData data2 = new WxMaSubscribeMessage.MsgData();
data2.setName("thing4");
data2.setValue(parms[1]);
dataList.add(data2);
return dataList;
}
}
4、通知处理类
public class NotifyService {
private WxMessageSender wxMessageSender;
private List<Map<String, String>> wxTemplate = new ArrayList<>();
public boolean isWxEnable() {
return wxMessageSender != null;
}
/**
* 微信模版消息通知,不跳转
* <p>
* 该方法会尝试从数据库获取缓存的FormId去发送消息
*
* @param touser
* 接收者openId
* @param notifyType
* 通知类别,通过该枚举值在配置文件中获取相应的模版ID
* @param params
* 通知模版内容里的参数,类似"您的验证码为{1}"中{1}的值
*/
@Async
public void notifyWxTemplate(String touser, NotifyType notifyType, String[] params) {
if (wxMessageSender == null)
return;
String templateId = getTemplateId(notifyType, wxTemplate);
wxMessageSender.sendWechatMsg(touser, templateId, params);
}
private String getTemplateId(NotifyType notifyType, List<Map<String, String>> values) {
for (Map<String, String> item : values) {
String notifyTypeStr = notifyType.getType();
if (item.get("name").equals(notifyTypeStr))
return item.get("templateId");
}
return null;
}
public void setWxMessageSender(WxMessageSender wxMessageSender) {
this.wxMessageSender = wxMessageSender;
}
public void setWxTemplate(List<Map<String, String>> wxTemplate) {
this.wxTemplate = wxTemplate;
}
}
四、模板申请
要到小程序的订阅消息申请模板
基本都是一次性消息,长期消息有特殊的要求,审核很难过得去
点击选用然后选择要使用的关键词,发消息的时候填充这些关键词
五、效果
六、总结
微信小程序都是微信的规则,社区能看到模板消息被下掉换成订阅消息的时候,大家都是一片骂声,但是还得咬牙切换。
只能说规则日新月异,持续研究吧。有兴趣的同学可以关注微信公众号:胖当当技术,跟作者交流分享。