上一篇讲了对用户与微信交互产生的各种事件的处理,这一篇讲模板消息管理。模板消息一般用于公众号向用户发送重要的服务通知,如在以下场景中(信用卡刷卡通知、商品购买成功通知等)。但是不支持广告营销等对用户造成骚扰的消息,具体注意事项可以参考接口文档。
下面就文档给出的接口进行代码实现并,测试。
1 设置所属行业
查看上送参数: access_token 接口调用凭证 industry_id1 公众号模板消息所属行业编号 (行业编号 1) industry_id2 公众号模板消息所属行业编号 (行业编号 2)
行业代码可以参考文档的行业代码表,这边以前两个IT科技互联网/电子商务、IT科技IT软件与服务 为例子 。
1.微信常量类新增设置所属行业URL WeCharConstant
/** * 模版服务相关-设置所属行业 */ public static final String SET_INDUSTRY = "https://api.weixin.qq.com/cgi-bin/template/api_set_industry?access_token=ACCESS_TOKEN"; 复制代码
- 模版消息处理服务类TemplateService
import cn.org.spring.common.util.HttpClientUtils; import com.ctsi.sddx.constants.WeCharConstant; import org.springframework.stereotype.Service; import java.io.IOException; /** * @Author : lizzu * @create 2022/10/4 22:03 * 模版消息处理服务类 */ @Service public class TemplateService { private final AccessTokenService accessTokenService; public TemplateService(AccessTokenService accessTokenService) { this.accessTokenService = accessTokenService; } /** * 设置行业信息 * * @param body 请求对象 * @return * @throws IOException */ public String setIndustry(String body) throws IOException { return HttpClientUtils.post(WeCharConstant.SET_INDUSTRY.replace("ACCESS_TOKEN", accessTokenService.getAccessToken()), body); } } 复制代码
3.模版消息处理控制类TemplateController
import com.ctsi.sddx.service.TemplateService; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.io.IOException; /** * @Author : lizzu * @create 2022/10/4 22:05 */ @RestController @RequestMapping("/v1/weChar") public class TemplateController { private final TemplateService templateService; public TemplateController(TemplateService templateService) { this.templateService = templateService; } @RequestMapping("/setIndustry") public String setIndustry(@RequestBody String body) throws IOException { return templateService.setIndustry(body); } } 复制代码
4.发送测试:
5.注意:这个接口每个月只能修改一次,一个月内再次调用接口就会提示:更换模板太频繁
{ "errcode": 43100, "errmsg": "change template too frequently rid: 633c4390-47cb6c24-79d91e15" } 复制代码
2 获取设置的行业信息
查看上面接口设置的信息。 1.微信常量类获取所属行业信息URL WeCharConstant
/** * 获取所属行业信息 */ public static final String GET_INDUSTRY = "https://api.weixin.qq.com/cgi-bin/template/get_industry?access_token=ACCESS_TOKEN"; 复制代码
- 模版消息处理服务类TemplateService 新增获取行业信息getIndustry()方法
/** * 获取行业信息 * * @return * @throws IOException */ public String getIndustry() throws IOException { return HttpClientUtils.get(WeCharConstant.GET_INDUSTRY.replace("ACCESS_TOKEN", accessTokenService.getAccessToken())); } 复制代码
3.模版消息处理控制类TemplateController 新增/getIndustry接口
@RequestMapping("/getIndustry") public String getIndustry() throws IOException { return templateService.getIndustry(); } 复制代码
4.发送测试:
3 获得模板ID
根据模板库中的模板编号进行模板id查询,我们新增模板直接可以在管理后台查看到,所以就暂时不测试此接口。
4 获取模板列表
推送模板消息之前需要设置模板,设置的模板是有限制的,允许发送的模板消息必须是用户接受过账号主体提供过服务的(已关注的用户),严禁用户未接受服务而向其推送模板消息。发送的内容不涉及广告营销骚扰用户。 我们可以下载允许发的模板实例,然后使用模板示例的内容来设置我们的模板。
设置模板编号后就可以通过接口获取模板列表了。
1.微信常量类新增 获取所有模板信息URL WeCharConstant
/** * 获取所有模版信息 */ public static final String GET_ALL_PRIVATE_TEMPLATE = "https://api.weixin.qq.com/cgi-bin/template/get_all_private_template?access_token=ACCESS_TOKEN"; 复制代码
- 模版消息处理服务类TemplateService 新增获取微信公众平台全部模版消息getTemplateList()方法
/** * 获取微信公众平台全部模版消息 * * @return * @throws IOException */ public String getTemplateList() throws IOException { return HttpClientUtils.get(WeCharConstant.GET_ALL_PRIVATE_TEMPLATE.replace("ACCESS_TOKEN", accessTokenService.getAccessToken())); } 复制代码
3.模版消息处理控制类TemplateController 新增/getTemplateList接口
@RequestMapping("/getTemplateList") public String getTemplateList() throws IOException { return templateService.getTemplateList(); } 复制代码
4.发送测试:
5 删除模板
1.微信常量类新增 获取所有模板信息URL WeCharConstant
/** * 删除模版信息 */ public static final String DELETE_PRIVATE_TEMPLATE = "https://api.weixin.qq.com/cgi-bin/template/del_private_template?access_token=ACCESS_TOKEN"; 复制代码
- 模版消息处理服务类TemplateService 新增删除微信公众平台模版消息deleteTemplateList()方法
/** * 删除微信公众平台模版消息 * * @return * @throws IOException */ public String deleteTemplateList(String body) throws IOException { return HttpClientUtils.post(WeCharConstant.DELETE_PRIVATE_TEMPLATE.replace("ACCESS_TOKEN", accessTokenService.getAccessToken()),body); } 复制代码
3.模版消息处理控制类TemplateController 新增/deleteTemplateList接口
@RequestMapping("/deleteTemplateList") public String deleteTemplateList(@RequestBody String body) throws IOException { return templateService.deleteTemplateList(body); } 复制代码
4.发送测试:
可以发现原来的 签到确认通知 已经删除了
6 发送模板消息
1.微信常量类新增 获取所有模板信息URL TEMPLATE_SEND
/** * 发送模版消息 */ public static final String TEMPLATE_SEND = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN"; 复制代码
- 模版消息处理服务类TemplateService 新增发送模版消息send()方法
/** * 发送模版消息 * * @param body 请求数据 * @return * @throws IOException */ public String send(String body) throws IOException { return HttpClientUtils.post(WeCharConstant.TEMPLATE_SEND.replace("ACCESS_TOKEN", accessTokenService.getAccessToken()), body); } 复制代码
3.模版消息处理控制类TemplateController 新增/send接口
@RequestMapping("/send") public String send(@RequestBody String body) throws IOException { return templateService.send(body); } 复制代码
4.发送测试:
( 说明:
touser: 接收者openid 在用户列表中找要推送的用户微信号id即可。 复制代码
{ "touser":"oITpR58LM-HJG0Fa4BY6MkOCG5lM", "template_id":"wteq1Q-OdlTEpXZiqpJ00jEHTWBKTsdsfJ9cl1eZodo", "url":"http://weixin.qq.com/download", // "miniprogram":{ // "appid":"xiaochengxuappid12345", // "pagepath":"index?foo=bar" // }, "client_msg_id":"MSG_000001", "data":{ "first": { "value":"尊敬的客户,您的订单已支付成功!", "color":"#173177" }, "keyword1":{ "value":"奇怪牌巧克力", "color":"#173177" }, "keyword2": { "value":"20221005A001", "color":"#173177" }, "keyword3": { "value":"66.89元", "color":"#173177" }, "keyword4": { "value":"2022年10月5日 14:46", "color":"#173177" }, "remark":{ "value":"感谢您的光临,欢迎再次购买!", "color":"#173177" } } } 复制代码
效果:
7 事件推送
我们可以发现,当模板消息发送成功时,我们的后台会收到 Status: success 的成功事件推送
接收到微信返回的消息:<xml><ToUserName><![CDATA[gh_1e06f4c4ca61]]></ToUserName> <FromUserName><![CDATA[oITpR58LM-HJG0Fa4BY6MkOCG5lM]]></FromUserName> <CreateTime>1664951827</CreateTime> <MsgType><![CDATA[event]]></MsgType> <Event><![CDATA[TEMPLATESENDJOBFINISH]]></Event> <MsgID>2606500835203973120</MsgID> <Status><![CDATA[success]]></Status> </xml> 复制代码
送达由于用户拒收(用户设置拒绝接收公众号消息)而失败时,推送的 XML 如下:
<xml> <ToUserName><![CDATA[gh_7f083739789a]]></ToUserName> <FromUserName><![CDATA[oia2TjuEGTNoeX76QEjQNrcURxG8]]></FromUserName> <CreateTime>1395658984</CreateTime> <MsgType><![CDATA[event]]></MsgType> <Event><![CDATA[TEMPLATESENDJOBFINISH]]></Event> <MsgID>200163840</MsgID> <Status><![CDATA[failed:user block]]></Status> </xml> 复制代码
送达由于其他原因失败时,推送的 XML 如下:
<xml> <ToUserName><![CDATA[gh_7f083739789a]]></ToUserName> <FromUserName><![CDATA[oia2TjuEGTNoeX76QEjQNrcURxG8]]></FromUserName> <CreateTime>1395658984</CreateTime> <MsgType><![CDATA[event]]></MsgType> <Event><![CDATA[TEMPLATESENDJOBFINISH]]></Event> <MsgID>200163840</MsgID> <Status><![CDATA[failed: system failed]]></Status> </xml> 复制代码
至此模板消息管理完成。 下一篇: 网页授权获取用户基本信息