一、发送前分析
1.1 微信官方文档
二、发送步骤
2.1 获取AccessToken
/**
* 获取微信公众号的AccessToken
*
* @return
*/
public String getAccessToken(String url) {
String accessToken = (String) redisUtils.getValueByKey(ToolUtils.accessTokenKey);
if (!StringUtils.isEmpty(accessToken)) {
return accessToken;
}
ResponseEntity<AccessToken> responseEntity = restTemplate.getForEntity(url, AccessToken.class);
accessToken = responseEntity.getBody().getAccess_token();
redisUtils.setKeyValueWithExpire(ToolUtils.accessTokenKey, accessToken, 7000L);
return accessToken;
}
@Data
public class AccessToken implements Serializable {
private static final long serialVersionUID = -4591243067274380744L;
private String access_token;
private Long expires_in;
}
2.2 封装post请求数据
TemplateBase.java
@Data
public class TemplateBase {
private String touser;
private String template_id;
private String url;
private TemplateData data;
}
TemplateData.java(此处参数为空时在发送的时候不显示,即不同模板都可用统一类)
@Data
public class TemplateData {
private TemplateDataDetail first;
private TemplateDataDetail keyword1;
private TemplateDataDetail keyword2;
private TemplateDataDetail keyword3;
private TemplateDataDetail keyword4;
private TemplateDataDetail remark;
}
TemplateDataDetail.java
@Data
public class TemplateDataDetail {
private String value;
private String color;
}
根据以上类构建方法:(方法可自行根据情况拆分)
/**
* 发送模板消息
*
* @param toUser
* @param templateId
* @param url
* @return
*/
public Result sendTemplateMessage(String toUser, String templateId, String url, String accessToken) {
// 1、模板Base
TemplateBase templateBase = new TemplateBase();
templateBase.setTouser(toUser);
templateBase.setTemplate_id(templateId);
templateBase.setUrl(url);
// 2、模板Base中的data封装
TemplateData templateData = new TemplateData();
TemplateDataDetail templateDataDetailFirst = new TemplateDataDetail();
templateDataDetailFirst.setValue("您好,请您领取XXX商品。");
templateDataDetailFirst.setColor("#173177");
TemplateDataDetail templateDataDetail1 = new TemplateDataDetail();
templateDataDetail1.setValue("小王");
templateDataDetail1.setColor("#173177");
TemplateDataDetail templateDataDetail2 = new TemplateDataDetail();
templateDataDetail2.setValue("XXX——最后一个商品");
templateDataDetail2.setColor("#173177");
TemplateDataDetail templateDataDetailRemake = new TemplateDataDetail();
templateDataDetailRemake.setValue("《备注信息可有可无》");
templateDataDetailRemake.setColor("#173177");
templateData.setFirst(templateDataDetailFirst);
templateData.setKeyword1(templateDataDetail1);
templateData.setKeyword2(templateDataDetail2);
templateData.setRemark(templateDataDetailRemake);
// 3、设置Base的数据
templateBase.setData(templateData);
Gson gson = new Gson();
String bodyJsonData = gson.toJson(templateBase);
log.info("postData:{}", bodyJsonData);
try {
// 1、构建请求头
HttpHeaders headers = new HttpHeaders();
log.info("当前accessToken:{}", accessToken);
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> request = new HttpEntity<>(bodyJsonData, headers);
// 2.获取请求的url
String sendMessageUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken;
log.info("将要发送请求的url地址:{}", sendMessageUrl);
// 3、发送请求 返回json实体
ResponseEntity<JSONObject> responseEntity = restTemplate.postForEntity(sendMessageUrl, request, JSONObject.class);
String resultJsonData = JSON.toJSONString(responseEntity);
log.info("请求后返回的json数据:{}", resultJsonData);
JSONObject jsonObject = JSONObject.parseObject(resultJsonData);
Integer errorCode = JSONObject.parseObject(jsonObject.getString("body")).getInteger("errcode");
if (!(0 == errorCode)) {
return ResultUtil.ERROR(ResultCode.WX_SEND_TEMPLATE_FAILED);
}
return ResultUtil.SUCCESS(errorCode);
} catch (Exception e) {
e.printStackTrace();
throw new UserException(ResultCode.WX_SEND_TEMPLATE_ERROR);
}
}
三、总结
综上可以看出其实整个对接和企业微信类似,接口直接根据文档对接即可。