微信小程序发送模板消息请求
最近公司接触到微信小程序的项目。自己也有幸参与其中,并且完成了发送模板消息的功能。所以自己总结一下,以便日后遇到类似情况可以少走一些弯路。也欢迎广大码农小伙伴一起交流一起进步。
俗话说磨刀不误砍柴工,特别是像这种使用微信接口的功能,必然要先了解其接口的主要作用。这是微信接口文档地址:https://mp.weixin.qq.com/debug/wxadoc/dev/api/notice.html#%E6%A8%A1%E7%89%88%E6%B6%88%E6%81%AF%E7%AE%A1%E7%90%86。通过这份文档,我们便可以知道我们需要的参数是什么。接下来就看进行实际的代码编写了。值得一提的是,在这些参数中,有一个data参数,是指模板的内容。这是一个变动的内容。即我们可以在这部分增加多个参数。为此我选择将这个data里面的参数重新做处理,并且用Map集合进行保存。所需要的类如下:
- 参数类(WXTemplate)
- data的类(WXTemplateData)
- 工具类(TemplateMsgUtil)(里面存放一些方法。比如获取请求微信接口需要的URL方法(getRequestUrl))即拼接好:https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=ACCESS_TOKEN。ACCESS_TOKEN是自己获取得到的。由于一些工具类公司前辈已经写好,在这里我只需要调用即可。道友们可以百度一下相关数据的获取。
WXTemplate.java
public class WXTemplate {
private String toUser;// 接受者(用户)的openid
private String templateId;// 所需下发的模板消息的id
private String page;// 点击模板卡片后的跳转页面
private String formId;// 表单提交场景下,为 submit 事件带上的 formId;支付场景下,为本次支付的prepay_id
private Map<String, WXTemplateData> data; // 模板内容,不填则下发空模板
private String emphasisKeyword;// 模板需要放大的关键词,不填则默认无放大
public WXTemplate(String toUser, String templateId, String page, String formId, Map<String, WXTemplateData> data,
String emphasisKeyword) {
super();
this.toUser = toUser;
this.templateId = templateId;
this.page = page;
this.formId = formId;
this.data = data;
this.emphasisKeyword = emphasisKeyword;
}
public WXTemplate() {
super();
}
public String getToUser() {
return toUser;
}
public void setToUser(String toUser) {
this.toUser = toUser;
}
public String getTemplateId() {
return templateId;
}
public void setTemplateId(String templateId) {
this.templateId = templateId;
}
public String getPage() {
return page;
}
public void setPage(String page) {
this.page = page;
}
public String getFormId() {
return formId;
}
public void setFormId(String formId) {
this.formId = formId;
}
public Map<String, WXTemplateData> getData() {
return data;
}
public void setData(Map<String, WXTemplateData> data) {
this.data = data;
}
public String getEmphasisKeyword() {
return emphasisKeyword;
}
public void setEmphasisKeyword(String emphasisKeyword) {
this.emphasisKeyword = emphasisKeyword;
}
}
WXTemplateData.java
public class WXTemplateData {
private String value; // 小标题
private String color; // 模板内容字体的颜色,不填默认黑色
public WXTemplateData(String value, String color) {
super();
this.value = value;
this.color = color;
}
public WXTemplateData() {
super();
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}
TemplateMsgUtil.java
// 获取requestUrl
public String getRequestUrl() {
// 获取accessToken
String accessToken = accessTokenUtil.getAccessToken(appId, secret);
// requestUrl
String requestUrl = SEND_API + "?access_token=" + accessToken;
return requestUrl;
}
接下来就是发送模板消息的方法(sendTemplateMsg)。
public boolean sendTemplateMsg(String openId, String templateId, String page, String formId,
Map<String, WXTemplateData> data, String emphasisKeyword) {
boolean result = false;
WXTemplate template = new WXTemplate();
template.setToUser(openId);
template.setTemplateId(templateId);
template.setPage(page);
template.setFormId(formId);
template.setData(data);
template.setEmphasisKeyword(emphasisKeyword);
String jsonMsg = JSONObject.toJSON(template).toString();
TemplateMsgUtil templateMsgUtil = new TemplateMsgUtil();
// 获取请求的url
String requestUrl = templateMsgUtil.getRequestUrl();
// 发送模板消息
HttpResponse resp = HttpUtil.post(requestUrl, jsonMsg);
if (resp.statusCode() == HttpStatus.OK.value()) {
@SuppressWarnings("unchecked")
Map<String, String> itemMap = JSONObject.parseObject(resp.body(), Map.class);
// 判断是否发送成功
if (itemMap.get("errcode").equals("0")) {
result = true;
} else {
logger.info("发送模板消息失败:" + itemMap.get("errcode"));
System.out.println("发送模板消息失败:" + itemMap.get("errcode"));
}
}
return result;
}
过程有点简单,因为公司前辈写好了很多东西,我直接调用即可。不过道理都差不多。欢迎大家一起交流探讨。