教你用java完美封装微信模板消息的发送动态

目录
  • 导入maven依赖
  • 模板实例
  • 实体类代码
    • Remark
    • Miniprogram //小程序相关数据,无小程序可以不填,或者填充空串
    • Keyword,中间keyword部分
    • First 首个数据
    • JsonRootBean ,整合实体类所有数据
  • 发送模板消息用到的工具类
    • 发送消息工具类
  • 发送模板案例
  • 效果

导入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;
    }

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

到此这篇关于教你用java完美封装微信模板消息的发送动态的文章就介绍到这了,更多相关java封装微信消息的发送内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java封装数组之改进为泛型数组操作详解

    本文实例讲述了Java封装数组之改进为泛型数组操作.分享给大家供大家参考,具体如下: 前言:通过上一节我们对我们需要封装的数组,进行了基本的增删改查的封装,但只局限于int类型的操作,为了能提供多种类型数组的操作,我们可以将其进一步封装为泛型数组. 1.定义泛型数组相关概念 (1)泛型数组让我们可以存放任何数据类型 (2)存放的类型不可以是基本数据类型,只能是类对象 基本类型: boolean.byte.char.short.int.long.float.double (3)每个基本数据类型都有

  • 使用java反射将结果集封装成为对象和对象集合操作

    java反射机制是什么 反射机制是在运行状态中,可以知道任何一个类的属性和方法,并且调用类的属性和方法: 反射机制能够做什么 1.判断运行对象的所属类 2.构造任意一个类的对象 3.获取任意一个类的属性和方法 4.调用任意属性和方法 5.生成动态代理 利用反射将结果集封装成为对象或者集合(实测可用) package coral.base.util; import java.beans.IntrospectionException; import java.beans.PropertyDescri

  • Java面向对象程序设计:类的定义,静态变量,成员变量,构造函数,封装与私有,this概念与用法详解

    本文实例讲述了Java面向对象程序设计:类的定义,静态变量,成员变量,构造函数,封装与私有,this概念与用法.分享给大家供大家参考,具体如下: 本文内容: 什么是面对对象 类的定义与对象实例化 成员变量 成员变量的有效范围 成员变量的赋值 静态变量.方法与实例变量.方法 构造函数 封装与私有 this关键字 注:函数和方法是一样东西.[由于我之前学习的时候有些书籍不是同样的说法,书看多了,我就习惯了不同情况下用不同的说法] 首发时间:2018-03-22 什么是面对对象: 面向对象强调行为处于

  • Java 封装基础知识

    在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部分包装.隐藏起来的方法. 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问. 要访问该类的代码和数据,必须通过严格的接口控制. 封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段. 适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性. 封装的优点 1. 良好的封装能够减少耦合. 2. 类内部的结构可以自由修改. 3. 可以对

  • 基于selenium-java封装chrome、firefox、phantomjs实现爬虫

    2017年一直以来在公司负责爬虫项目相关工程,主要业务有预定.库存.在开发中也遇到很多问题,随手记录一下,后续会持续更新. chrome.firefox.phantomjs插件安装和版本说明 基于selenium-java封装chrome.firefox.phantomjs实现爬虫 项目下载地址 maven版本说明 <!-- +++|selenium|+++ --> <dependency> <groupId>org.seleniumhq.selenium</gr

  • Java Mail邮件发送如何实现简单封装

    首先每次发送需要配置的东西很多,包括发件人的邮箱和密码.smtp服务器和SMTP端口号等信息.其次,没有将发送和邮件内容相分离.按照单一职责原则,应该有且仅有一个原因引起类的变更[1].最后一个问题是,我们的代码不仅自己用,也很可能让别人调用.别人调用的时候不想去了解邮件发送的细节,调用的人只想传尽量少的参数获得预期的效果.因此让Demo变成可以使用的代码需要我们重新设计代码的结构. 从Demo中我们可以抽象出两种类型的POJO,也就是发件人和邮件.你可能会问收件人怎么办?收件人可以跟邮件POJ

  • java中封装JDBC工具类的实例分析

    对于能够重复使用的代码,我们最好的方法是对它们进行封装,然后在下次使用的使用就可以直接调用了.本篇所要提到的是JDBC工具类,相信大家在学习java时都接触过.那么对于封装它的方法,本篇先对工具类进行简单的说明,列出有关的封装步骤,然后带来相关的实例. 1.说明 在java开发过程中,代码中时常用到一些Scanner.Random一样的类,他们是键盘录入,生成随机数的类,像一个工具一样,在java中被称为工具类. 2.步骤 封装JDBC工具类 加入获取数据库连接对象的方法 加入释放连接的方法 3

  • Java JDBC自定义封装工具类的步骤和完整代码

    封装JDBC工具类的作用可以优化代码,提高开发效率 步骤 ① 创建配置文件(config.properties),用于存放注册驱动和连接数据库时所需要的参数值 ② 自定义一个类(JDBCUtils.java) ③ 实现构造私有方法 private JDBCUtils(){} ④ 声明所需要的配置变量 private static String driverClass; private static String url; private static String username; priva

  • 教你用java完美封装微信模板消息的发送动态

    目录 导入maven依赖 模板实例 实体类代码 Remark Miniprogram //小程序相关数据,无小程序可以不填,或者填充空串 Keyword,中间keyword部分 First 首个数据 JsonRootBean ,整合实体类所有数据 发送模板消息用到的工具类 发送消息工具类 发送模板案例 效果 导入maven依赖 <dependency> <groupId>org.dom4j</groupId> <artifactId>dom4j</ar

  • PHP微信模板消息操作示例

    本文实例讲述了PHP微信模板消息操作方法.分享给大家供大家参考,具体如下: 微信SDK: <?php class Oauth { //获得全局access_token public function get_token(){ //如果已经存在直接返回access_token //if($_SESSION['access_token'] && $_SESSION['expire_time']>time()){ //return $_SESSION['access_token'];

  • PHP快速推送微信模板消息

    需要给关注用户发送模板消息,由于公众号关注用户比较多,所以采用普通的curl等方式太慢.由于模板消息发送不需要等待微信的结果,所以利用php的fsockopen()函数可以达到快速发送的效果.代码如下: $data = [ 'touser' => '11111111111111111', 'template_id' => '111111111111111111', 'url' => '11111111111111111111', 'data' => [ 'first' =>

  • php实现发送微信模板消息的方法

    本文实例讲述了php实现发送微信模板消息的方法.分享给大家供大家参考.具体如下: 该方法基于thinkphp实现实现,具体OrderPush.class.php文件如下: 复制代码 代码如下: <?php namespace Org\Weixin; /**  * Created by PhpStorm.  * User: StandOpen  * Date: 15-1-7  * Time: 9:41  */ class OrderPush {     protected $appid;    

  • php实现微信模板消息推送

    本文实例为大家分享了php微信模板消息推送的具体代码,供大家参考,具体内容如下 1.微信公众号模板消息配置 2.PHP代码 /** * 发送模板消息 */ public function send_notice(){ //获取access_token if ($_COOKIE['access_token']){ $access_token2=$_COOKIE['access_token']; }else{ $json_token=$this>curl_post("https://api.w

  • Django后端发送小程序微信模板消息示例(服务通知)

    模板消息 官方文档:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/template-message/templateMessage.send.html 模板消息如下图所示 Django中获取access_token 根据文档描述,获取access_token文档,后端必须获取一个access_token才能够发送模板消息,文档中说明该token有效期为两小时,需要后端定时去获取.我们这里使用Django

  • 基于python实现微信模板消息

    我的风格,废话不多说了,直接给大家贴代码了,并在一些难点上给大家附了注释,具体代码如下所示: #!/usr/bin/env python #-*- coding:utf-8 -*- import urllib2,json import datetime,time from config import * import sys reload(sys) sys.setdefaultencoding("utf-8") class WechatPush(): def __init__(self

  • 微信公众平台 发送模板消息(Java接口开发)

    前言:最近一直再弄微信扫码推送图文消息和模板消息发送,感觉学习到了不少东西.今天先总结一下微信公众平台模板消息的发送.因为这个自己弄了很久,开始很多地方不明白,所以今天好好总结一下. 微信公众平台技术文档:模板消息接口 一.概述 模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等.不支持广告等营销类消息以及其它所有可能对用户造成骚扰的消息. 关于使用规则,请注意: 1.所有服务号都可以在功能->添加功能插件处看到申请模板消息功能的入

  • 微信公众号模板消息群发php代码示例

    微信模板消息只能发给一个人,如果要群发,需要通过php循环,依次发送. 注意,如果模板消息发信息时有时无,不稳定,可能你的access_token令牌更新缓存不及时,过期了.可以根据日志文件查看.建议300秒更新一下.否则会很烦. 模板id需要自己去公众号中设置行业后得到. <?php //使用方法.直接在页面的逻辑中增加fahuo_wechat();即可.函数要事先引用. function fahuo_wechat($shopid){ if(_cfg("sendmobile")

  • C#微信开发之发送模板消息

    我们需要将一些行为的进展消息推送给用户.除了短信,发送微信模板消息也是不错的选择.模板消息免费.精准到达.而且可以引导用户回到网站上来.但它有两个前提条件.1个是必须开通了微信支付功能,你才能选择模板.2个是被推送的用户必须关注了你的公众号,而且你也拿到了他的openid. 先在模板库中找到自己的想要的模板,添加到"我的模板"中. 展开详情,我们可以看到示例.接下来用C#代码发送一次: 从官方文档的示例中我们可以看到除了推送人的openid,还可以设置每个字段的颜色及跳转地址.先可以定

随机推荐