一、前期准备工作;
1、需要申请私人/公司的测试号-- 参考这篇文章 ,微信公众平台测试帐号申请 - 简书 (jianshu.com)
1.1、需要响应微信发送的Token请求;
注意:这里的端口必须是80或443,http请求或https请求。
1.2、响应代码:
@RestController
public class AgentWeixinReplyController {
@RequestMapping(value = "/wx/reply.do")
public void get(HttpServletRequest request, HttpServletResponse response) throws Exception {
Enumeration pNames = request.getParameterNames();
while (pNames.hasMoreElements()) {
String name = (String) pNames.nextElement();
String value = request.getParameter(name);
String log = "name =" + name + " value =" + value;
}
String signature = request.getParameter("signature");/// 微信加密签名
String timestamp = request.getParameter("timestamp");/// 时间戳
String nonce = request.getParameter("nonce"); /// 随机数
String echostr = request.getParameter("echostr"); // 随机字符串
PrintWriter out = response.getWriter();
if (SignUtil.checkSignature(signature, timestamp, nonce)) {
System.out.println("校验成功!");
out.print(echostr);
}
out.close();
out = null;
}
}
配置端口(我这里选择的是 443端口):
1.3、由于响应微信发送的Token请求是在公网上面的,所以需要把你的响应程序配置在公网上面,有两种方法,一是将程序打包配置在服务器上(有云服务的可以选择,并开放一下80或443端口具体根据application的配置决定),二是去网上找内网穿透工具可以将本地电脑配置为公网(参考这篇文章:(10条消息) 内网穿透-把自己的电脑部署为公网可访问的服务器_飞鸿先森的博客-CSDN博客)。
配置完成就可以使用了。
2、查阅开发文档
1.1、进入微信公众平台
1.2、 选择上面的公司选择"服务号",个人选择"订阅号",我这里选择”订阅号“--》开发文档,点击进入;
在 基础消息能力--》模板消息接口,去查看公众号模板消息推送的接口 ,模板消息 | 微信开放文档
1.3、调用流程;
1.4、获取access_token代码:
public String getAccessToken() {
/* 这里是固定每次调用都get凭证,实际可以使用redis进行缓存 */
/*2、获取调用微信接公众号接口凭证*/
String offAppID = "xxxxxxxxxxx";
String offAppSecret = "xxxxxxxxx";
RestTemplate restTemplate = new RestTemplate();
Map<String, String> params = new HashMap<>();
params.put("APPID", offAppID); //
params.put("APPSECRET", offAppSecret); //
/*3、获取access_token和expires_in*/
ResponseEntity<String> responseEntity = restTemplate.getForEntity(
"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={APPID}&secret={APPSECRET}", String.class, params);
String body = responseEntity.getBody();
JSONObject object = JSON.parseObject(body);
String accessToken = object.getString("access_token");
String expiresIn = object.getString("expires_in");// 过期时长(两小时)
return accessToken;
}
1.5、配置参数,并调用消息推送;
**
* 微信消息参数
*/
public class WxTemplate {
//进行推送所需参数
private String touser;//用户openid(接收人)
private String template_id;//消息模版id
private String url;//跳转到某链接或某页面
private Map<String, TemplateData> data;//要推送的模板内容
public String getTouser() {
return touser;
}
public void setTouser(String touser) {
this.touser = touser;
}
public String getTemplate_id() {
return template_id;
}
public void setTemplate_id(String template_id) {
this.template_id = template_id;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public Map<String, TemplateData> getData() {
return data;
}
public void setData(Map<String, TemplateData> data) {
this.data = data;
}
}
/**
* 微信模版消息内容
*/
public class TemplateData {
private String value;//消息内容
private String color;//消息颜色
//构造方法(空参)
public TemplateData() {
}
//构造方法(有参)
public TemplateData(String value, String color) {
this.value = value;
this.color = color;
}
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;
}
}
public JSONObject messagePush(String openid) {
/*1、调用微信api将消息推送至公众号*/
RestTemplate restTemplate = new RestTemplate();
String url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + getAccessToken();
/*2、固定设置推送内容,可配置成动态*/
WxTemplate wxTe = new WxTemplate();
wxTe.setTouser(openid);//用户的openid(接收人,这里应该传进来的)
wxTe.setTemplate_id("xxxxxx");//订阅消息模板id
wxTe.setUrl("xxxxxx");//跳转链接
Map<String, TemplateData> map = new HashMap<>();
/*2.1、设置模板参数,里面的key要和模板中的{{xxx.DATA}}中xxx对应*/
map.put("name", new TemplateData("大锤", "#173177"));
map.put("age", new TemplateData("999", "#7f7f7f"));
map.put("sex", new TemplateData("男", "#333333"));
wxTe.setData(map);
/*2.2、推送请求*/
ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, wxTe, String.class);
return JSON.parseObject(responseEntity.getBody());
}
完成。
注意:添加模板
公众号消息推送就完成啦~~~~~~~