springboot微信公众号发送模板消息
注意:
1. 公众号模板消息新规的出台,原有的模板消息营销功能大大削弱,主要包含以下几个方面的限制:
(1)去除自定义颜色、表情符号;
(2)去除尾部/备注内容;
(3)去除首行内容;
(4)中间的主内容中,单个字段内容不超过20个字,且不支持换行
2. 公众号后去除了原来从模板库中添加模板消息功能,目前新规定只能配置了类目后才能从类目模板库中去添加模板消息。并且只能添加对应类目的模板消息!!!
3. 如果需要定制的模板消息需要审核,不过限制太多通过率不高。
1、准备工作
设置公众号类目信息
一个公众号可以设置5个类目,按照公众号服务类目中的要求提供对应的证件。设置类目后只能申请对应类目的模板消息模板,选择好需要用到的类目。
配置模板消息
”从类目模板库中添加“进行模板选择页面,可输入关键字进行选择模板。
选择好模板后进去模板详情,点击选择关键词库字段,如果是常量则需要你列举出所有的情况(工作人员审核通过后才能使用,建议选择不需要审核的字段)。之后填写这个模板的场景说明并点击添加即可完成模板的选择
配置ip白名单(你所需要部署的服务器ip)
通过开发者ID及密码调用获取access_token接口时,需要设置访问来源IP为白名单。不配置可能会获取access_token失败
2、编写模板消息的请求参数封装类
import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonProperty;
public class WeChatTemplate {
@JsonProperty("touser")
private String toUser;
@JsonProperty("template_id")
private String templateId;
private String url;
private Map<String,String> miniprogram;
private Map<String, Map<String, String>> data = new HashMap<>();
public static Map<String, String> initData(String value, String color) {
HashMap<String, String> data = new HashMap<String, String>();
data.put("value", value);
data.put("color", color);
return data;
}
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 getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public Map<String, String> getMiniprogram() {
return miniprogram;
}
public void setMiniprogram(Map<String, String> miniprogram) {
this.miniprogram = miniprogram;
}
public Map<String, Map<String, String>> getData() {
return data;
}
public void setData(Map<String, Map<String, String>> data) {
this.data = data;
}
}
3、编写模板消息的返回参数封装类
public class WeiXinResponse {
private Integer errcode;
private String errmsg;
private Long msgid;
public Integer getErrcode() {
return errcode;
}
public void setErrcode(Integer errcode) {
this.errcode = errcode;
}
public String getErrmsg() {
return errmsg;
}
public void setErrmsg(String errmsg) {
this.errmsg = errmsg;
}
public Long getMsgid() {
return msgid;
}
public void setMsgid(Long msgid) {
this.msgid = msgid;
}
}
4、编写发送微信模板消息接口
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.Objects;
/**
* 通过openid当发消息
*/
@RestController
@CrossOrigin
@RequestMapping("/wechat")
public class WeChatMessage {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/sendWxMessage")
public void sendMessage() throws IOException {
WeChatTemplate weChatTemplate = new WeChatTemplate();
// 设置模板id
weChatTemplate.setTemplateId("oWabUeRpqRGVWr2eJJaQn_t9GDqesvrtPQJSDPuDsrw");
// 设置接收用户openId,这里填接收者的openid
weChatTemplate.setToUser("");
//点击详情跳转的地址
weChatTemplate.setUrl("");
/**
* 设置模板dada参数
* {{keyword1.DATA}}
*/
weChatTemplate.getData().put("first", WeChatTemplate.initData("10月水费缴费成功","#459ae9"));
weChatTemplate.getData().put("keyword1", WeChatTemplate.initData("105.3元","#459ae9"));//缴费金额
weChatTemplate.getData().put("keyword2", WeChatTemplate.initData("10月用水付费(用水:96.5吨)","#459ae9"));//项目
weChatTemplate.getData().put("keyword3", WeChatTemplate.initData("张三","#459ae9"));//用户姓名
weChatTemplate.getData().put("keyword4", WeChatTemplate.initData("编A3345-01","#459ae9"));//用户编号
weChatTemplate.getData().put("keyword5", WeChatTemplate.initData("测试","#459ae9"));//收费机构
weChatTemplate.getData().put("remark", WeChatTemplate.initData("如遇错误,请往当地社区服务中心进行解决。感谢您的使用!","#383838"));
String accessToken = this.getAccessToken();
if(accessToken != null){
// 发送消息的接口
String pust_message_url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=%s";
//调用微信接口,发送模板消息
WeiXinResponse result = restTemplate.postForObject(String.format(pust_message_url, accessToken),
weChatTemplate, WeiXinResponse.class);
if (weiXinResponse.getErrcode() == 0){;
System.out.println("==========成功"+result);
}else{
System.out.println("==========发送失败");
}
}else{
System.out.println("==========失败");
}
}
/**
* 获取getAccessToken
* @return
*/
public String getAccessToken() throws IOException {
try {
String appid = "";//填写公众号的appid
String secret = "";//填写公众号的开发者密码(AppSecret)
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+appid+"&secret="+secret;
StringBuilder json = new StringBuilder();
URL oracle = new URL(url);
URLConnection yc = oracle.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream(), "UTF-8"));
String inputLine = null;
while ((inputLine = in.readLine()) != null) {
json.append(inputLine);
}
in.close();
JSONObject object = (JSONObject) JSONObject.parse(String.valueOf(json));
String access_token = object.getString("access_token");
if (access_token != null) {
System.out.println("=====access_token========"+access_token+"=============");
return access_token;
}
return null;
} catch (Exception e) {
//log.error("获取accessToken异常" + e.getMessage());
return null;
}
}
}
将项目部署到所填写的ip白名单的服务器运行项目
效果图
需要用到的pom.xml
<!--json-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.50</version>
<scope>compile</scope>
</dependency>