书接上回,我把微信公众号模板消息的实现过程也整理出来了。
由于个人公众号无法申请模板消息接口所以我这里直接拿“微信公众号测试号”来进行演示,这是微信公众平台提供的开发者沙箱环境。所有的东西几乎和正式的微信服务号一致,后期如果有需求只需要替换对应的应用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

最后修改:2022 年 05 月 22 日
给我一点小钱钱也很高兴啦!o(* ̄▽ ̄*)ブ