java实现微信公众号的模板消息推送


前言

最近做项目时需要用到公众号的模板消息,所以在这里记录分享一下实现过程


一、什么是模板消息

↓↓↓↓
官方文档

微信公众号提供了多种消息能力,这里我们主要讲得是模板消息,有需要其他消息实现方式的朋友可以留言,出其他实现文章。

功能介绍
模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等。不支持广告等营销类消息以及其它所有可能对用户造成骚扰的消息。

关于使用规则,请注意:

所有服务号都可以在功能->添加功能插件处看到申请模板消息功能的入口,但只有认证后的服务号才可以申请模板消息的使用权限并获得该权限;
需要选择公众账号服务所处的2个行业,每月可更改1次所选行业;
在所选择行业的模板库中选用已有的模板进行调用;
每个账号可以同时使用25个模板。
当前每个账号的模板消息的日调用上限为10万次,单个模板没有特殊限制。【2014年11月18日将接口调用频率从默认的日1万次提升为日10万次,可在MP登录后的开发者中心查看】。当账号粉丝数超过10W/100W/1000W时,模板消息的日调用上限会相应提升,以公众号MP后台开发者中心页面中标明的数字为准。

关于接口文档,请注意:

  1. 模板消息调用时主要需要模板ID和模板中各参数的赋值内容;
  2. 模板中参数内容必须以".DATA"结尾,否则视为保留字;
  3. 模板保留符号""。

在这里插入图片描述

二、获取模板ID

百度搜索微信公众平台
在这里插入图片描述
微信扫码登录
在这里插入图片描述
找到新的功能

在这里插入图片描述

点击未开通,找到模板消息,点击开通
在这里插入图片描述

点击已开通,找到模板消息,点击模板消息
在这里插入图片描述
点击查看功能
在这里插入图片描述

点击模板库,选择想要的模板
在这里插入图片描述

在我的模板中就可以看到选择的模板,看到模板ID,这就是我们开发要用的
在这里插入图片描述

注意!注意!注意!重要的事说三遍,如果你是用的是微信公众号测试平台发送消息模板可不配置公众号对接相关功能,直接使用openId 发送模板信息功能即可,openId 可让用户关注公众号录入系统,
或者在公众号添加h5 表单,绑定系统账号, 微信打开的h5 页面可获取当前用户的openId。

如果是真正的公众号就必须配置公众号对接相关功能!必须!必须!必须!

三、获取access_token

首先来看下access_token是什么,下图是官方给出的:
在这里插入图片描述
其实通俗的讲,access_token就是小程序官方给我们提供的一个凭证,你要调用小程序官方的接口,就必须先拿到access_token。这个和我们做的项目调用后台接口必须登录后台给你一个token你带token访问相似。

看一下官方文档:
在这里插入图片描述

grant_type是一个固定的值,只有appid和secret是需要我们填入的,这两个值在我们的公众号后台就可以拿到。

下面就是Java后台代码的编写了

我这里用的是springboot,这里要请求公众号官方接口,正常项目开发我都是用的自己写的接口请求工具类的,这里为了大家方便就用了springboot自带的RestTemplate来做网络请求。文章最后我会把我自己写的这个请求工具类贴出来有需要的朋友可以copy,具体代码如下。

代码如下(示例):
在这里插入图片描述

这里代码很简单,就一个简单的get请求。不过要注意一点,这里获取的access_token是有两个小时的过期时间的
在这里插入图片描述
所以在获取到access_token的时候,把access_token存到数据库,或者存到本地缓存,并且还要记录当前时间,后面再用的时候先判断这个access_token有没有超过2个小时,如果超过2个小时的话,就要重新获取了。
在这里插入图片描述

四、发送消息

官方文档

老规矩还是先看官方文档
在这里插入图片描述
在这里插入图片描述

上面的参数都是我们发送消息时需要的。

然后微信就收到了
在这里插入图片描述

五、完整的代码

  1. 获取access_token
@Data
public class AccessToken {

    private String accessToken;
    //过期时间 当前系统时间+微信传来的过期时间
    private Long expiresTime;

    public AccessToken(String accessToken, String expiresIn) {
        this.accessToken = accessToken;
        this.expiresTime = System.currentTimeMillis()+Integer.parseInt(expiresIn)*1000;
    }

    /**
     * 判断token是否过期
     * @return
     */
    public boolean isExpired(){
        return System.currentTimeMillis()>expiresTime;
    }
}

下面的WX_OPEN_APP_ID,WX_OPEN_APP_SECRET替换成你们自己的,具体的可以去公众号后台查看

public static final BASE_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential" +
            "&appid=%s" +
            "&secret=%s";

 private static AccessToken at;

    public static String getToken(){
        if (at == null || at.isExpired()){
            getAccessToken();
        }
        return at.getAccessToken();
    }

    /**
     * 获取token
     */
    private static void getAccessToken() {
        String accessTokenUrl = String.format(
                BASE_ACCESS_TOKEN_URL,
                WX_OPEN_APP_ID,
                WX_OPEN_APP_SECRET
        );

        //发送请求获取token
        String token = null;
        try {
            token = HttpClientUtils.get(accessTokenUrl);
        } catch (Exception e) {
            e.printStackTrace();
        }
        JSONObject jsonObject = JSONObject.parseObject(token);
        String accessToken = (String) jsonObject.get("access_token");
        Integer expiresIn = (Integer) jsonObject.get("expires_in");
        //创建token对象,并存储
        at = new AccessToken(accessToken,String.valueOf(expiresIn));
        System.out.println(token);

    }

  1. 发送消息
public static final SEND_URL  = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN";

 /**
     * 1、发送模版消息-拼接数据(测试信息)
     * @param openId 微信用户的openId
     */
    public static String sendMessage(String openId, String templateId,String machineAlias,String shopName,String openStatus, String dropStatus,int number) {
            // 模板参数
            Map<String, WeChatTemplateMsg> sendMag = new HashMap<String, WeChatTemplateMsg>();
            String content = "店铺:"+shopName+",机器别名:"+machineAlias+",当前库存:"+number;
            sendMag.put("first", new WeChatTemplateMsg("请注意!"));
            sendMag.put("system", new WeChatTemplateMsg(content));
            sendMag.put("time", new WeChatTemplateMsg(DateUtils.getCurrDateTime()));
            sendMag.put("account", new WeChatTemplateMsg("1"));
            sendMag.put("remark", new WeChatTemplateMsg("请尽快补货,谢谢!"));
            // 发送
            String send = send(openId, templateId, sendMag);
            return send;
       
    }


    /**
     * 2、发送模版消息
     * openId     用户Id
     * templateId 模板Id   
     * data       模板参数
     * @param data
     */
    private static String send(String openId, String templateId, Map<String, WeChatTemplateMsg> data) {
        RestTemplate restTemplate = new RestTemplate();
        String accessToken = getToken();
        String url = SEND_URL.replace("ACCESS_TOKEN", accessToken);
        //拼接base参数
        Map<String, Object> sendBody = new HashMap<>();
        sendBody.put("touser", openId);               // openId
//        sendBody.put("url", "www.baidu.com");         // 点击模板信息跳转地址
        sendBody.put("topcolor", "#FF0000");          // 顶色
        sendBody.put("data", data);                   // 模板参数
        sendBody.put("template_id", templateId);      // 模板Id
        ResponseEntity<String> forEntity = restTemplate.postForEntity(url, sendBody, String.class);
        return forEntity.getBody();
    }
  1. 消息封装实体类 (模板参数)
@Data
@ToString
public class WeChatTemplateMsg {
    /**
     * 消息
     */
    private String value;
    /**
     * 消息颜色
     */
    private String color;


    public WeChatTemplateMsg(String value) {
        this.value = value;
        this.color = "#173177";
    }

    public WeChatTemplateMsg(String value, String color) {
        this.value = value;
        this.color = color;
    }
}

微信就能收到了
在这里插入图片描述

到这里我们就可以完整的实现Java发送公众号模板消息的功能了。完整代码也已经贴给大家了。

总结

以上就是今天要分享给大家的内容,本文简单的讲了怎么发送模板消息,其实大部分大家参考官方文档都是可以写出来的
  • 16
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值