书接上回,我把微信公众号模板消息的实现过程也整理出来了。
由于个人公众号无法申请模板消息接口所以我这里直接拿“微信公众号测试号”来进行演示,这是微信公众平台提供的开发者沙箱环境。所有的东西几乎和正式的微信服务号一致,后期如果有需求只需要替换对应的应用ID和应用私钥之类的就可以了,无需更改代码即可切换到正式场景进行使用。
1.申请微信公众号测试号
直接点击(传送门)申请开通测试号。
2.开始使用
现在你得到的东西有:测试号信息(appID、appsecret)
、测试号二维码
、模板消息接口
。
有上面这几个东西就够了,接下来用你的微信APP去扫描测试号二维码
。
这时候旁边的用户列表
里面会出现你的微信昵称,与之对应的是一个微信号
。
这个微信号
并不是真实的微信号
,只是沙箱环境下的openId
,记住它的位置,我们很快要用到。
3.新增测试模板
点击模板消息接口
里面的新增测试模板
按钮。
模板标题,这个你随便取不是太离谱都行。例如:主机资源服务提醒
模板内容,格式是固定的,乱填会不识别。参考:(微信官方文档-模板消息)
我的模板消息:
模板内容
{{first.DATA}}
告警主机:{{keyword0.DATA}}
告警时间:{{keyword1.DATA}}
告警信息:{{keyword2.DATA}}
当前状态:{{keyword3.DATA}}
{{remark.DATA}}
3、引入pom.xml配置:
Maven依赖
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.20</version>
</dependency>
<!-- WeiXin-Push -->
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-mp</artifactId>
<version>4.3.3.B</version>
</dependency>
4.创建常量类:
WeiXinConstant
package com.demo.constant;
/**
* @Author zf
* @ClassName WeiXinConstant.java
* @ProjectName WeiXinDemo
*/
public class WeiXinConstant {
//微信应用ID
public static final String WX_APP_ID = "";
//微信应用秘钥
public static final String WX_APP_SECRET = "";
//微信公众号消息模板ID
public static final String WX_APP_TEMPLATE_ID = "";
//收信账号(openId)
public static final String TO_USER = "";
}
PS:以上信息根据自己真实需要填写。
5.编写微信工具类:
WeiXinPushUtil
package com.demo.utils;
import cn.hutool.http.HttpRequest;
import cn.hutool.json.JSONObject;
import com.demo.constant.WeiXinConstant;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* @Author zf
* @ClassName WeiXinPushUtil.java
* @ProjectName WeiXinDemo
*/
public class WeiXinPushUtil {
/**
* @Description 发送模板消息
* @param accessToken 接口调用凭证 本地环境需要把本地ip加入IP白名单 设置与开发-基本配置-IP白名单 处设置
* @param toUser 接收者(用户)的 openid
* @param toUrl 点击跳转链接
* @param templateId 所需下发的订阅模板id
* @param dataMap 模板内容,格式形如 { "key1": { "value": any }, "key2": { "value": any } }
* @return
*/
public static String sendTemplateMsg(String accessToken, String toUser, String toUrl, String templateId, Map<String, Object> dataMap) {
// 微信模板消息接口地址
String sendMsgApi = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken;
//JSONObject的底层是HashMap,改成LinkedHashMap使其有序排列。
JSONObject paramObject = new JSONObject(new LinkedHashMap());
//消息主题显示相关json
paramObject.set("touser", toUser);
paramObject.set("template_id", templateId);
paramObject.set("url",toUrl);
paramObject.set("topcolor","#FF0000");
paramObject.set("data", dataMap);
//需要实现跳转网页的,可以添加下面一行代码实现跳转
// paramMap.put("url","http://xxxxxx.html");
System.out.println(paramObject);
String rest = HttpRequest.post(sendMsgApi).body(String.valueOf(paramObject)).execute().body();
System.out.println(rest);
return rest;
}
/**
* @Description 获取访问令牌(有效期2小时)
* @return AccessToken
*/
public static String getAccessToken() {
BufferedReader in = null;
// WX_APP_ID WX_APP_SECRET 微信公众号可以查看
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + WeiXinConstant.WX_APP_ID + "&secret=" + WeiXinConstant.WX_APP_SECRET;
try{
URL weChatUrl = new URL(url);
// 打开和URL之间的连接
URLConnection connection = weChatUrl.openConnection();
// 设置通用的请求属性
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
// 建立实际的连接
connection.connect();
// 定义 BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
StringBuffer sb = new StringBuffer();
String line;
while ((line = in.readLine()) != null) {
sb.append(line);
}
return sb.toString();
}catch (Exception e) {
throw new RuntimeException(e);
}
// 使用finally块来关闭输入流
finally {
try {
if (in != null) {
in.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
}
PS:上面这个
getAccessToken()
方法,获取的AccessToken
有效期是两小时。测试号每天可以获取2000次,生成新的令牌旧的也就随之失效。如果你是在正式环境下使用,建议写个判断方法,如果该AccessToken
没有超过两小时就没有重复获取的必要节省次数。
3、测试方法:
测试类:
public static void main(String[] args) {
JSONObject rest = JSONUtil.parseObj(WeiXinPushUtil.getAccessToken());
String access_token = rest.getStr("access_token");
//组装请求参数
JSONObject dataObject = new JSONObject(new LinkedHashMap());
//消息标题
dataObject.set("first", ImmutableMap.of("value","主机资源服务提醒","color","#173177"));
//告警主机
dataObject.set("keyword0", ImmutableMap.of("value","192.168.0.1","color","#173177"));
//告警时间
dataObject.set("keyword1", ImmutableMap.of("value", DateUtil.now(),"color","#173177"));
//告警信息
dataObject.set("keyword2", ImmutableMap.of("value","只是测试,没有异常!","color","#173177"));
//当前状态
dataObject.set("keyword3", ImmutableMap.of("value","true","color","#173177"));
//备注
dataObject.set("remark", ImmutableMap.of("value","暂无","color","#173177"));
//接收响应结果
String result = WeiXinPushUtil.sendTemplateMsg(access_token, WeiXinConstant.TO_USER, "", WeiXinConstant.WX_APP_TEMPLATE_ID, dataObject);
//解析结果内容
JSONObject jsonObject = JSONUtil.parseObj(result);
}
PS:上面的工具类我已经封装好了,按照步骤来肯定没有问题。如果报错的话,你可以通过微信官方提供的
在线接口调试工具
进行debug:https://mp.weixin.qq.com/debug