模板消息
定义模板
生产环境需要申请,一般审核比较严格。
如果申请通过,测试环境可以直接进行配置。
比如模板内容:
消息类別:
通知内容:
每一个模板都有微信的模板标识,比如:Gf_1234567890-sdfasdfasdjfkasdf
代码实现
maven 引入
公众号的接口,有很多比较成熟的 jdk 包:
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-mp</artifactId>
<version>3.5.0</version>
</dependency>
配置
@Configuration
public class WxMpConfig {
@Bean("wxJedisPool")
public JedisPool jedisPool(){
JedisPoolConfig poolConfig = new JedisPoolConfig();
JedisPool jedisPool = new JedisPool(poolConfig, redisAddress, redisPort,
timeout, password);
return jedisPool;
}
@Bean("wxMpService")
public WxMpService wxMpService(@Qualifier("wxJedisPool") JedisPool jedisPool) {
WxMpService service = new WxMpServiceOkHttpImpl();
WxMpRedisConfigImpl config = new WxMpRedisConfigImpl(jedisPool);
final String appId = "$appId";
final String secret = "$appSecret";
config.setAppId(appId);
config.setSecret(secret);
service.setWxMpConfigStorage(config);
return service;
}
}
这里一般建议使用 redis 作为缓存的集中式缓存持久化。
发送消息
基于 WxMpService 的消息发送,也比较简单:
/**
* 发送模板消息
* @param toUser 用户
* @param templateId 模板标识
* @param url 连接
* @param data 数据
*/
public void sendTemplateMessage(String toUser, String templateId, String url, List<WxMpTemplateData> data){
try {
log.info("开始执行消息推送 toUser:{}, templateId: {}, url: {}, data: {}",
toUser, templateId, url, JSON.toJSON(data));
wxMpService
.getTemplateMsgService()
.sendTemplateMsg(WxMpTemplateMessage.builder()
.toUser(toUser)
.templateId(templateId)
.url(url)
.data(data)
.build());
log.info("完成消息推送 toUser:{}, templateId: {}", toUser, templateId);
} catch (WxErrorException e) {
log.error("微信发送失败",e);
throw new BizException(RespCode.WX_REPORT_PUSH_FAILED);
}
}
推送消息的时候,建议以 wxOpenId 作为推送的主体,避免对用户造成打扰。
实际使用
// 接收用户
String toUserId = "$userId";
// 模板消息标识
String templateId = "$templateId";
// 跳转的地址
String url = "https://www.baidu.com";
List<WxMpTemplateData> data = new ArrayList<>();
data.add(new WxMpTemplateData("first","亲爱的老马,你好"));
// 报表类型
data.add(new WxMpTemplateData("keyword1", "节日问候"));
// 内容
data.add(new WxMpTemplateData("keyword2", "幸福安康"));
// 备注
String remark = "平平无奇的备注";
data.add(new WxMpTemplateData("remark", remark,"#FF0000"));
wxMpClient.sendTemplateMessage(toUserId, templateId, url, data);
消息是可以指定颜色的,但是不那么建议。不要花里胡哨的。
注意
(1)消息有一定的次数限制,测试环境要注意。
(2)模板审核比较严格,尽量使用已有的模板。
参考资料
https://blog.csdn.net/aloneiii/article/details/122122235