持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情
上一篇讲了对用户与微信交互产生的各种事件的处理,这一篇讲模板消息管理。模板消息一般用于公众号向用户发送重要的服务通知,如在以下场景中(信用卡刷卡通知、商品购买成功通知等)。但是不支持广告营销等对用户造成骚扰的消息,具体注意事项可以参考接口文档。
下面就文档给出的接口进行代码实现并,测试。
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即可。
template_id: 模板ID
miniprogram: 跳小程序所需数据,不需跳小程序可不用传该数据 这块没有小程序就不传了
)
测试报文:
{
"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>
至此模板消息管理完成。 下一篇: 网页授权获取用户基本信息