文章目录

近期项目用到了微信的模板消息,今天想写一个demo总结下微信模板消息开发的流程和相关注意事项

一,相关配置和申请流程

1.获得微信模板消息ID

通过微信公众平台的开发文档阅读可知,申请微信模板消息ID比较方便的方式还是直接
手动配置获取模板消息ID

主要步骤:

  • 选取模板
  • 编辑模板
  • 添加模板
  • 复制id

微信模板消息_模板消息

2.调用接口完成模板消息发送

请求地址:

POST ​​https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=ACCESS_TOKEN​

请求参数:

微信模板消息_微信_02

返回参数:

微信模板消息_微信_03

errcode合法值:

微信模板消息_模板消息_04

请求参数示例:

{
"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​