微信模板消息的发送动态封装(Java完美封装)

12 篇文章 9 订阅
9 篇文章 0 订阅

前提:

我们需要有公众号开发账号。没有可以前往官网注册,或领取测试账号调试使用

官方地址

官方地址

模板消息文档地址

模板消息文档

测试号

微信公众平台测试号申请地址

正式开发

微信公众平台正式号注册地址

1、导入maven依赖

		<dependency>
            <groupId>org.dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>2.1.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/jaxen/jaxen -->
        <dependency>
            <groupId>jaxen</groupId>
            <artifactId>jaxen</artifactId>
            <version>1.2.0</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.thoughtworks.xstream/xstream -->
        <dependency>
            <groupId>com.thoughtworks.xstream</groupId>
            <artifactId>xstream</artifactId>
            <version>1.4.15</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.75</version>
        </dependency>

通过查看微信模板消息文档发现

发送模板消息需要的json数据

{
           "touser":"OPENID",
           "template_id":"ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY",
           "url":"http://weixin.qq.com/download",  
           "miniprogram":{
             "appid":"xiaochengxuappid12345",
             "pagepath":"index?foo=bar"
           },          
           "data":{
                   "first": {
                       "value":"恭喜你购买成功!",
                       "color":"#173177"
                   },
                   "keyword1":{
                       "value":"巧克力",
                       "color":"#173177"
                   },
                   "keyword2": {
                       "value":"39.8元",
                       "color":"#173177"
                   },
                   "keyword3": {
                       "value":"2014年9月22日",
                       "color":"#173177"
                   },
                   "remark":{
                       "value":"欢迎再次购买!",
                       "color":"#173177"
                   }
           }
       }

在这里插入图片描述

模板实例
在这里插入图片描述

包含多种数据类型,并且以json数据格式请求接口便可以发送模板消息,发送成功效果。

在这里插入图片描述
我们看到。

  • first中的value对应的第一部分需要填充{{first.DATA}}占位符的数据,color对应字体的颜色
  • keyword可能包含一个或者多个,所以我们需要动态创建,根据模板中的消息提供。
  • remark填充最后一条数据

我们先创建六个实体类,对应模板消息用到的数据类型。

实体类代码:👇👇

Remark

存储remark中的数据与颜色

package cn.xjt.wx.MessageEntity;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;


@Data
@AllArgsConstructor
@NoArgsConstructor
public class Remark {

    private String value;
    private String color;
}

Miniprogram //小程序相关数据,无小程序可以不填,或者填充空串

package cn.xjt.wx.MessageEntity;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Miniprogram {

    private String appid;
    private String pagepath;

}

Keyword,中间keyword部分

package cn.xjt.wx.MessageEntity;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;


@Data
@AllArgsConstructor
@NoArgsConstructor
public class Keyword {

    private String value;
    private String color;
}

First 首个数据

package cn.xjt.wx.MessageEntity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

/**
 * @author xu
 * @Description
 * @createTime 2021年04月02日 17:02:00
 */

@Data
@AllArgsConstructor
@NoArgsConstructor
public class First {

    private String value;
    private String color;

}

data 包含first、keyword、remark

由于keyword不固定,所以我在实体类创建多个提供使用,根据需要,构造需要个数

package cn.xjt.wx.MessageEntity;

import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

import java.util.List;

@lombok.Data
@AllArgsConstructor
@NoArgsConstructor
public class data {

    private First first;

    private Keyword keyword1;
    private Keyword keyword2;
    private Keyword keyword3;
    private Keyword keyword4;
    private Keyword keyword5;
    private Remark remark;


    public data(First first,Remark remark,Keyword ... keyword){
        this.first=first;
        int count=1;
        for (Keyword keyword1 : keyword) {
            if (count==1){
                this.keyword1=keyword1;
            }else if (count==2){
                this.keyword2=keyword1;
            }else if (count==3){
                this.keyword3=keyword1;
            }else if (count==4){
                this.keyword4=keyword1;
            }else if (count==5){
                this.keyword5=keyword1;
            }
            count++;
        }
        this.remark=remark;
    }

}

JsonRootBean ,整合实体类所有数据

package cn.xjt.wx.MessageEntity;

import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class JsonRootBean {

    private String touser;
    private String template_id;
    private String url;
    private Miniprogram miniprogram;
    private data data;

}

实体类创建完成,所以当我们需要发送模板消息的时候,我们只需要一个JsonRootBean对象,就可以完成发送。

由于我在data实体类中的keyword只有五个,所以适用的模板消息中keyword最多只能有5个,跟一根据需要,酌情添加

发送模板消息用到的工具类

发送消息工具类

private static String grantType="client_credential";  

private static String appid="你的微信公众号appid";

private static String secret="你的开发者密码appsercet";

 public static Map<String,String> sendMessage2(String AccessToken, JsonRootBean jsonRootBean){
        JSONObject json = (JSONObject) JSON.parseObject(JSON.toJSONString(jsonRootBean));       //把JsonRootBean转成JSONObject对象
        String info = HttpUtil.sendPostJson(json, "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + AccessToken);
        Map<String,String> map = (Map) JSON.parse(info);
        System.out.println(map);
        return map;
    }

(携带json格式数据发送post请求工具类),请前往我的另一篇HttpUtil工具类获取

HttpUtil发送post携带Json数据工具类传送门

获取access_token (注意access_token有效期为两小时,过期后需重新获取)

public static Map<String,String> getAccessToken(){
        String s = HttpUtil.sendGet("https://api.weixin.qq.com/cgi-bin/token?grant_type=" + grantType + "&appid=" + appid + "&secret=" + secret);
        Map<String,String> map = (Map) JSON.parse(s);
        System.out.println(map);
        return map;
    }

发送模板案例

Miniprogram miniprogram = new Miniprogram("", "");
		First first = new First("你在虚拟仿真系统有一笔消息待处理", "");
		Keyword[] keywords = new Keyword[5];
		Keyword keyword1 = new Keyword("测试名称", "#173177");
		Keyword keyword2 = new Keyword("考试评价", "#173177");
		Keyword keyword3 = new Keyword(LocalDateTime.now().toString(), "#173177");
		Keyword keyword4 = new Keyword("考试成绩评分", "#173177");

		keywords[0] = keyword1;
		keywords[1] = keyword2;
		keywords[2] = keyword3;
		keywords[3] = keyword4;
		
		Remark remark = new Remark("请及时前往处理", "");
//		data data = new data(first, remark, keyword1, keyword2, keyword3, keyword4);
		data data = new data(first, remark, keywords);
		JsonRootBean jsonRootBean = new JsonRootBean("发个用户的openid", "你在微信公众号绑定的模板消息id", "单击模板会跳转的链接(https://www.baidu.com/实例)", miniprogram, data);
		WeiXinUtil.sendMessage2(WeiXinUtil.getAccessToken().get("access_token"), jsonRootBean);

效果

在这里插入图片描述
发送成功了!!

通过前端发送接受一个map数据类型的参数,发送模板消息,方法体👇👇

/**
     * 动态接受参数发送消息
     * @param param
     */
    public static Map<String,String> sendMessagetop(Map<String,Object> param){
        Map<String,String> res = new HashMap<>();
        String accessToken = WeiXinUtil.getAccessToken();		//通过工具类方法获取accesstoken
        Miniprogram miniprogram=null;
        String firstColor=null;
        String remarkColor=null;
        if (param.get("appid")!=null && param.get("pagepath")!=null){
            miniprogram = new Miniprogram(param.get("appid").toString(), param.get("pagepath").toString());		//如果appid和pagepath都不为空,才进行初始化
        }
        String firstValue = param.get("firstValue").toString();		//获取firstvalue
        if (param.get("firstColor")!=null){
            firstColor = param.get("firstColor").toString();		//如果颜色不为空,则获取
        }
        First first = new First(firstValue, firstColor);
        Integer keywordCount = Integer.valueOf(param.get("keywordCount").toString());		//得到有几个keyword
        Keyword[] keywords = new Keyword[5];
        for (int i=0;i<keywordCount;i++){		//动态创建kewword
            Map kw = (Map) param.get(i+"");
            String color = null;
            if (kw.get("color")!=null){				//得到key对象里面的value与color
                color=kw.get("color").toString();		//如果color不为空,则获取
            }
            keywords[i]=new Keyword(kw.get("value").toString(), color);
        }
        String remarkValue = param.get("remarkValue").toString();
        if (param.get("remarkColor")!=null){
            remarkColor = param.get("remarkColor").toString();
        }
        Remark remark = new Remark(remarkValue, remarkColor);
        data data = new data(first, remark, keywords);		
        Map<String, Object> allOpenId = WeiXinUtil.getAllOpenId();		//获取关注公众号的所有openid
        Map datas = (Map) allOpenId.get("data");
        List<String> openid = (List) datas.get("openid");//得到openid数组
        for (String o : openid) {		//遍历依次发送模板消息
            System.out.println(o);
            JsonRootBean jsonRootBean = new JsonRootBean(o, TEMPLATE_ID, URL, miniprogram, data);
            Map<String, String> result = WeiXinUtil.sendMessage2(accessToken, jsonRootBean);
            res.put("errmsg", result.get("errmsg"));
        }
        return res;
    }

我们只需要提供一个接受map类型参数的接口提供前端使用就可以发送微信模板消息了!!

    @PostMapping("/sendMessage")
    public void sendMessage(@RequestBody Map param){
        WeiXinUtil.sendMessage(param);
    }

以上是给所有关注了该公众号的用户都发送消息

获取指定用户的openid需要网页授权。再通过openid发送消息。(待更新…)


绑定微信用户并给指定用户发送模板消息。请移步我的另一篇原创文章

网页应用绑定微信用户,并给指定用户发送模板消息

如有疑问,欢迎大家评论交流!!!❤️❤️❤️❤️❤️

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
微信模板消息推送是一项非常实用的功能,可以在微信公众号中向用户推送各种信息。如果你想使用Java代码来实现微信模板消息推送,下面是一个例子: 首先,你需要获取微信公众号的access_token,这可以通过向微信服务器发送HTTP请求来实现。需要注意的是,access_token的有效时间为两个小时,过期后需要重新获取。 一旦你获得了access_token,你就可以使用下面的Java代码向用户推送模板消息: ``` public static void sendTemplateMessage(String accessToken, String openId, String templateId, String url, String jsonString) { String jsonMsg = "{" + "\"touser\":\"" + openId + "\"," + "\"template_id\":\"" + templateId + "\"," + "\"url\":\"" + url + "\"," + "\"data\":" + jsonString + "}"; String url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken; String result = doPost(url, jsonMsg); System.out.println(result); } private static String doPost(String url, String data) { CloseableHttpClient httpClient = HttpClients.createDefault(); HttpPost httpPost = new HttpPost(url); StringEntity entity = new StringEntity(data, ContentType.APPLICATION_JSON); httpPost.setEntity(entity); try { CloseableHttpResponse response = httpClient.execute(httpPost); String result = EntityUtils.toString(response.getEntity(), "UTF-8"); return result; } catch (Exception e) { e.printStackTrace(); return ""; } } ``` 这段代码首先构造了一个JSON格式的字符串,通过HTTP POST请求将其发送微信服务器。其中,accessToken是你获得的access_token,openId是需要接收消息的用户的OpenId,templateId是使用的模板的ID,url是用户点击消息时跳转的链接,jsonString是一个包含模板消息内容的JSON字符串。 总之,以上就是一个简单的微信模板消息推送Java源码,你可以参考它来实现类似的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

languageStudents

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值