微信模板消息
原创
©著作权归作者所有:来自51CTO博客作者wx5add7776993de的原创作品,请联系作者获取转载授权,否则将追究法律责任
文章目录
近期项目用到了微信的模板消息,今天想写一个demo总结下微信模板消息开发的流程和相关注意事项
一,相关配置和申请流程
1.获得微信模板消息ID
通过微信公众平台的开发文档阅读可知,申请微信模板消息ID比较方便的方式还是直接
手动配置获取模板消息ID
主要步骤:
2.调用接口完成模板消息发送
请求地址:
POST https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=ACCESS_TOKEN
请求参数:
返回参数:
errcode合法值:
请求参数示例:
{
"touser": "OPENID",
"template_id": "TEMPLATE_ID",
"page": "index",
"form_id": "FORMID",
"data": {
"keyword1": {
"value": "339208499"
},
"keyword2": {
"value": "2015年01月05日 12:30"
},
"keyword3": {
"value": "腾讯微信总部"
} ,
"keyword4": {
"value": "广州市海珠区新港中路397号"
}
},
"emphasis_keyword": "keyword1.DATA"
}
注意:
- data即模板消息内容实体,注意申请模板消息时keyword对应的选项
3.代码实现
封装消息实体
根据上边的请求示例来编写消息实体
消息抽象
@Data
@NoArgsConstructor
@AllArgsConstructor
public class BaseMessage {
/**
* accessToken: 接口调用凭证
* openId:接受者 openId
* templateId: 模板消息id
* page: 要跳转的页面
* formId: submit提交的formId
* data: 模板内容
*/
//请求示例:-----------------------------------------------
// {
// "touser": "OPENID",
// "template_id": "TEMPLATE_ID",
// "page": "index",
// "form_id": "FORMID",
// "data": {
// "keyword1": {
// "value": "339208499"
// },
// "keyword2": {
// "value": "2015年01月05日 12:30"
// },
// "keyword3": {
// "value": "腾讯微信总部"
// } ,
// "keyword4": {
// "value": "广州市海珠区新港中路397号"
// }
// },
// "emphasis_keyword": "keyword1.DATA"
// }
//---------------------------------------------------------
@JSONField(name = "touser")
private String openId;
@JSONField(name = "template_id")
private String template_id;
@JSONField(name = "page")
private String page;
@JSONField(name = "form_id")
private String form_id;
private BaseContent data;
@JSONField(name = "emphasis_keyword")
private String emphasis_keyword;
}
消息内容实体就是
public class BaseContent {
}
根据要发送的具体消息继承该类,自定义编写
eg:
public class TestMessage extends BaseContent {
/**
* TestMessage:
*
* <li>主要用来封装消息实体</li>
* <li>相当于请求参数中的data</li>
*/
@JSONField(name = "keyword1")
private Keyword tips;
@JSONField(name = "keyword2")
private Keyword pointInfo;
@JSONField(name = "keyword3")
private Keyword name;
@JSONField(name = "keyword4")
private Keyword phone;
}
根据示例中还封装了keyword
@Slf4j
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Keyword {
private String value;
}
利用枚举存放刚刚获取到的消息id
public enum TemplateIdEnum {
/**
* TemplateIdEnum
* <li>存放模板消息ID</li>
*/
TEXTMSG_ID("");
private String TEMPLATE_ID;
TemplateIdEnum(String TEMPLATE_ID){
this.TEMPLATE_ID = TEMPLATE_ID;
}
public static String getTemplateId(TemplateIdEnum type){
return type.TEMPLATE_ID;
}
}
请求接口
/**
* @Description: 微信模板消息工具类
* @Author: Kevin
* @CreateDate: 2019/7/8 0:52
* @UpdateUser: Kevin
* @UpdateDate: 2019/7/8 0:52
* @UpdateRemark: 修改内容
* @Version: 1.0
*/
@Component
@Slf4j
public class WxMessageUtils {
public void sendTemplateMessage(BaseMessage baseMessage){
//封装参数
Map<String,String> params = new HashMap<>();
params.put("access_token",WxAccountServiceImpl.getAccessToken());
JSONObject jsonObject = JSONObject.parseObject(params.toString());
//请求模板消息接口
String resultJson = HttpClientUtils.doPostJson(WxConfig.TEMPLATEMESSAGE_URL,jsonObject.toJSONString());
log.info("----------->"+resultJson);
//判断是否请求成功
checkSuccess(JSONObject.parseObject(resultJson),
"Wechat return error:" + resultJson);
}
/**
* 检查请求是否成功
* @param bodyJSON
* @param message
*/
private static void checkSuccess(JSONObject bodyJSON, String message) {
if (!isSuccess(bodyJSON)) {
log.warn(message);
throw new MessageException(bodyJSON.get("errmsg").toString());
}
}
/**
* 检查请求接口是否成功
* @param bodyJSON
* @return
*/
private static boolean isSuccess(JSONObject bodyJSON) {
if (bodyJSON.containsKey("errcode") && bodyJSON.containsKey("errmsg")) {
if ((int) bodyJSON.get("errcode") != 0 && "ok".equals(bodyJSON.get("errmsg"))) {
return false;
}
}
return true;
}
}
具体项目地址:
github