精华内容
下载资源
问答
  • 以订单推送为例,主要为大家详细介绍了java实现微信公众号发送模版消息,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 主要为大家详细介绍了java微信公众号发送消息模板,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • Java)微信公众号发送模板消息

    千次阅读 2019-07-18 16:14:14
    模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等。不支持广告等营销类消息以及其它所有可能对用户造成骚扰的消息。 1、模板消息调用时主要...

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

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

     Java项目里的实现方法:

    1、模板消息的模板内容组成有两种方式

    前台页面组装好传递到后台(eg:body):

    $.ajax({
    			type: "POST",//提交类型
    			url: "${pageContext.request.contextPath}/SendMs/sendTemplateMessages",
    			data: {
    		        body:JSON.stringify({
    		          touser: '接收消息用户的openId',
    		          template_id: '模板消息的模板Id',
    		          data: {
    		              'first': {
    		                  'value': '您的订单通知>_<',
    		                  'color': '#173177'
    		                },
    		                'keyword1': {
    		                  'value': '1001001010',
    		                  'color': '#173177'
    		                },
    		                'keyword2': {
    		                  'value': '蛋炒饭不加蛋',
    		                  'color': '#173177'
    		                },
    		                'keyword3': {
    			                  'value': '10¥',
    			                  'color': '#173177'
    			                },
    		                'remark': {
    		                  'value': '感谢您的光顾,祝您生活愉快!*_*',
    		                  'color': '#173177'
    		                }
    		              }
    		        })
    		      },
    	      dataType:"json",
    		  success: function(m){	
    		  }
    	   });

     前台没有传模板消息,则后台自己组装 (eg:wechatTemplateStr):

     注:JSONArray将类转换成模板消息字符串,转换之后会有一个中括号,需要用replace方法将中括号去掉才是模板消息的正确格式,不然调微信的发送模板消息接口会报格式不正确错误。(切记)

                //前台没有传模板消息内容,则后台自己组装 eg:wechatTemplateStr
                WechatTemplate wechatTemplate = new WechatTemplate();
                wechatTemplate.setTemplate_id(AlipayController.template_id);
                wechatTemplate.setTouser("oifR00Qa_h9TawBbnXa3S54mEpew");
                Map<String,TemplateData> mapdata = new HashMap<>();
                // 封装模板数据
                TemplateData first = new TemplateData();
                first.setValue(AlipayController.templateHead);
                first.setColor("#173177");
                mapdata.put("first", first);
             
                TemplateData keyword1 = new TemplateData();
                keyword1.setValue(orderNumber);
                keyword1.setColor("#173177");
                mapdata.put("keyword1", keyword1);
             
                TemplateData keyword2 = new TemplateData();
                keyword2.setValue(commodityDetails);
                keyword2.setColor("#173177");
                mapdata.put("keyword2", keyword2);
             
                TemplateData keyword3 = new TemplateData();
                keyword3.setValue(orderAmount);
                keyword3.setColor("#173177");
                mapdata.put("keyword3", keyword3);
                
                TemplateData remark = new TemplateData();
                remark.setValue(AlipayController.remark);
                remark.setColor("#173177");
                mapdata.put("remark", remark);
                wechatTemplate.setData(mapdata);
                
                //通过JSONArray将模板类转换为字符串
                JSONArray wechatTemplatearray =  JSONArray.fromObject(wechatTemplate);
                String wechatTemplateStr = wechatTemplatearray.toString().replace("[", " ");
                wechatTemplateStr = wechatTemplateStr.toString().replace("]", " ");

     2、后台调用微信公众号接口发送模板消息

            import net.sf.json.JSONArray;
            import com.alibaba.fastjson.JSONObject;
    
            public static String template_id = "模板消息的模板Id";
    
    	public static String templateHead = "您的订单通知>_<";
    	
    	public static String remark = "感谢您的光顾,祝您生活愉快!*_*";
    
            @ResponseBody
    	@RequestMapping(value = "sendTemplateMessages")
    	public String sendTemplateMessages(String body,String openId,String orderNumber,String commodityDetails,String orderAmount) { 
    		try {
    			//获取公众号access_token(GET请求)
    	        URL url = new URL("https://api.weixin.qq.com/cgi-bin/token?appid=&secret=&grant_type=client_credential");
    	        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    	        // 在连接之前设置属性
    	        // Content-Type实体头用于向接收方指示实体的介质类型,指定HEAD方法送到接收方的实体介质类型,或GET方法发送的请求介质类型
    	        conn.setRequestProperty("Content-Type", "application/json; charset=utf-8");
    	        // 设置打开与此URLConnection引用的资源的通信链接时使用的指定超时值(以毫秒为单位)
    	        conn.setConnectTimeout(10000);
    	        // 将读取超时设置为指定的超时时间,以毫秒为单位。
    	        // conn.setReadTimeout(60000);
    	        conn.setRequestMethod("GET");
    	        // Post 请求不能使用缓存
    	        conn.setUseCaches(false);
    	        // 建立连接
    	        conn.connect();
    	        // 获取响应
    	        BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    	        String line;
    	        String result = "";
    	        while ((line = reader.readLine()) != null) {
    	            result += line;
    	        }
    	        reader.close();
    	        conn.disconnect();
    	        JSONObject jsStr = JSONObject.parseObject(result);
    	        //Json对象转换成java对象,获取到公众号access_token
    	        WeChatToken weChatToken = (WeChatToken) JSONObject.toJavaObject(jsStr,WeChatToken.class);
    
    	        //发送模板消息(POST请求)
    	        URL msurl = new URL("https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + weChatToken.access_token);
                HttpURLConnection msconn = (HttpURLConnection) msurl.openConnection();
                // 在连接之前设置属性
                // Content-Type实体头用于向接收方指示实体的介质类型,指定HEAD方法送到接收方的实体介质类型,或GET方法发送的请求介质类型
                msconn.setRequestProperty("Content-Type", "application/json; charset=utf-8");
                // 设置打开与此URLConnection引用的资源的通信链接时使用的指定超时值(以毫秒为单位)
                msconn.setConnectTimeout(30000);
                // 将读取超时设置为指定的超时时间,以毫秒为单位。
                // conn.setReadTimeout(60000);
                // 发送POST请求必须设置如下两行
                msconn.setDoOutput(true);
                msconn.setDoInput(true);
                msconn.setRequestMethod("POST");
                // Post 请求不能使用缓存
                msconn.setUseCaches(false);
                // 建立连接
                msconn.connect();
                OutputStream outputStream = msconn.getOutputStream();
                //前台如果传来消息模板则直接使用,如果未传则自己创建消息模板
                //注意编码格式,防止中文乱码
                //前台组装好模板消息,则直接使用  eg:body
                //outputStream.write(body.getBytes("UTF-8"));
                
                //前台没有传模板消息,则后台自己组装 eg:wechatTemplateStr
                WechatTemplate wechatTemplate = new WechatTemplate();
                wechatTemplate.setTemplate_id(AlipayController.template_id);
                wechatTemplate.setTouser(openId);
                Map<String,TemplateData> mapdata = new HashMap<>();
                // 封装模板数据
                TemplateData first = new TemplateData();
                first.setValue(AlipayController.templateHead);
                first.setColor("#173177");
                mapdata.put("first", first);
             
                TemplateData keyword1 = new TemplateData();
                keyword1.setValue(orderNumber);
                keyword1.setColor("#173177");
                mapdata.put("keyword1", keyword1);
             
                TemplateData keyword2 = new TemplateData();
                keyword2.setValue(commodityDetails);
                keyword2.setColor("#173177");
                mapdata.put("keyword2", keyword2);
             
                TemplateData keyword3 = new TemplateData();
                keyword3.setValue(orderAmount);
                keyword3.setColor("#173177");
                mapdata.put("keyword3", keyword3);
                
                TemplateData remark = new TemplateData();
                remark.setValue(AlipayController.remark);
                remark.setColor("#173177");
                mapdata.put("remark", remark);
                wechatTemplate.setData(mapdata);
                
                //通过JSONArray将模板类转换为字符串
                JSONArray wechatTemplatearray =  JSONArray.fromObject(wechatTemplate);
                String wechatTemplateStr = wechatTemplatearray.toString().replace("[", " ");
                wechatTemplateStr = wechatTemplateStr.toString().replace("]", " ");
                
                outputStream.write(wechatTemplateStr.getBytes("UTF-8"));
                outputStream.close();
                
                // 获取响应
                BufferedReader msreader = new BufferedReader(new InputStreamReader(msconn.getInputStream()));
                String msline;
                String msresult = "";
                while ((msline = msreader.readLine()) != null) {
                    msresult += msline;
                }
                msreader.close();
    
                msconn.disconnect();
                return msresult;
    	        
    	    } catch (MalformedURLException e) {
    	
    	        e.printStackTrace();
    	    } catch (SocketTimeoutException e) {
    	        e.printStackTrace();
    	    } catch (IOException e) {
    	
    	        e.printStackTrace();
    	    }
    		return "send false";
        }

    3、组装模板消息需要用到的几个类

    import java.util.Map;
    
    
    public class WechatTemplate {
        private String touser;
     
        private String template_id;
     
        private String url;
     
        private Map<String, TemplateData> data;
     
        public String getTouser() {
            return touser;
        }
     
        public void setTouser(String touser) {
            this.touser = touser;
        }
     
        public String getTemplate_id() {
            return template_id;
        }
     
        public void setTemplate_id(String template_id) {
            this.template_id = template_id;
        }
     
        public String getUrl() {
            return url;
        }
     
        public void setUrl(String url) {
            this.url = url;
        }
     
        public Map<String, TemplateData> getData() {
            return data;
        }
     
        public void setData(Map<String, TemplateData> data) {
            this.data = data;
        }
    }
    public class TemplateData {
        private String value;
        private String color;
        public String getValue() {
            return value;
        }
     
        public void setValue(String value) {
            this.value = value;
        }
     
        public String getColor() {
            return color;
        }
     
        public void setColor(String color) {
            this.color = color;
        }
    }
    public class WeChatToken {
    	 public String access_token ;
         public int expires_in;
    }

     以上所说就可以完成公众号给微信用户发送模板消息,希望能帮助到您。(*^▽^*)

     

    展开全文
  • 主要介绍了微信公众平台 发送模板消息(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发送公众号模板消息的功能了。完整代码也已经贴给大家了。

    总结

    以上就是今天要分享给大家的内容,本文简单的讲了怎么发送模板消息,其实大部分大家参考官方文档都是可以写出来的
    展开全文
  • java二次开发接微信公众号接口,实现根据用户授权,获取用户code,再获取openid,然后向其推送模版消息
  • * 发送注册成功模板消息 * @return */ public static String toSendModelMessage(String openId,String phone,String id,String dayStr){ String accessToken=getAccessToken(); if(accessToken.length()...
  • jdk1.8 windows环境,tomcat下,发送模板信息乱码 项目采用httpclient发送请求 解决方案  StringEntity s = new StringEntity(jsonStr,"UTF-8");这里需要设置utf-8 public static String postStr...

    jdk1.8 windows环境,tomcat下,发送模板信息乱码

    项目采用httpclient发送请求

    解决方案

     StringEntity s = new StringEntity(jsonStr,"UTF-8");这里需要设置utf-8

        public static String postStr(String url,String jsonStr){
            
        	CloseableHttpClient httpclient = HttpClients.createDefault();
        	HttpPost post = new HttpPost(url);
            String response = null;
            try {
                StringEntity s = new StringEntity(jsonStr,"UTF-8");
                s.setContentEncoding("UTF-8");
                s.setContentType("application/json");//发送json数据需要设置contentType
                post.setEntity(s);
                LOGGER.info("executing request " + post.getURI());
                LOGGER.info("" + jsonStr);
                HttpResponse res = httpclient.execute(post);
    
                if(res.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
                    String result = EntityUtils.toString(res.getEntity());// 
                    response = result;
                    LOGGER.info("Response content: " + result);
                }
            } catch (Exception e) {
            	LOGGER.info("出现错误");
                throw new RuntimeException(e);
            }
            return response;
        }
    }

     

     

     

    展开全文
  • 微信发送模板消息接口文档...温馨提示:请各位开发者使用微信模板消息功能前,仔细阅读上述发送模板消息接口文档,少走弯路; 一、微信公众号开发框架 <!-- 微信框架 参考:https://github.com/Wechat-Gr...

    微信发送模板消息接口文档地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277

    温馨提示:请各位开发者使用微信模板消息功能前,仔细阅读上述发送模板消息接口文档 ,少走弯路;

     

    一、微信公众号开发框架

         <!-- 微信框架 参考:https://github.com/Wechat-Group/weixin-java-tools -->
          <dependency>
             <groupId>com.github.binarywang</groupId>
             <artifactId>weixin-java-mp</artifactId>
             <version>3.0.0</version>
          </dependency>

    二、发送模板消息效果

              

    三、模板消息申请

     为了保证用户不受到骚扰,在开发者出现需要主动提醒、通知用户时,才允许开发者在公众平台网站中模板消息库中选择模板,选择后获得模板ID,再根据模板ID向用户主动推送提醒、通知消息。

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

     1. 以下是我使用的模板消息

    1. {{first.DATA}}  
    2. 用户名:{{keyword1.DATA}}  
    3. 订单号:{{keyword2.DATA}}  
    4. 订单金额:{{keyword3.DATA}}  
    5. 商品信息:{{keyword4.DATA}}  
    6. {{remark.DATA}}  

      2. 发送模板消息POST数据示例

              {
               "touser":"OPENID",
               "template_id":"ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY",
               "url":"http://weixin.qq.com/download",  
               "miniprogram":{
                 "appid":"xiaochengxuappid12345",
                 "pagepath":"index?foo=bar"
               },          
               "data":{
                       "first": {
                           "value":"恭喜你支付成功!",
                           "color":"#173177"
                       },
                       "keynote1":{
                           "value":"曹",
                           "color":"#173177"
                       },
                       "keynote2": {
                           "value":"2019698571200",
                           "color":"#173177"
                       },
                       "keynote3": {
                           "value":"¥98.80",
                           "color":"#173177"
                       },
                       "keynote4":{
                           "value":"星冰乐(焦糖味) 家乐氏香甜玉米片*2 乐天七彩爱情糖*3",
                           "color":"#173177"
                       },
                       "remark":{
                           "value":"如有问题请致电xxx客服热线400-8070028或直接在微信留言,客服在线时间为工作日10:00-18:00,客服人员将第一时间为您服务。",
                           "color":"#173177"
                       }
               }
           }

    详细参考: https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Template_Message_Interface.html

     

    四、通过Postman测试发送模板消息

     1. 登录微信公众平台,申请一个发送模板消息的模板

         

     

    2. 通过微信公众平台接口调试工具获取AccessToken

    3. Postman发送模板消息

    上面需要填入的有openid、template_id

     {
               "touser":"oJIGa0Xlgv1nAtrWLWMlB75ekNDs",
               "template_id":"KIe4rXP3pRvX8BUnomZtCOFjZkSRzFdOzcJOob_9MR4",
               "url":"https://blog.csdn.net/thinkingcao",  
               "data":{
                       "first": {
                           "value":"矿泉水",
                           "color":"#173177"
                       },
                       "keyword1":{
                           "value":"11111111",
                           "color":"#173177"
                       },
                       "keyword2": {
                           "value":"123456789",
                           "color":"#173177"
                       },
                        "keyword3": {
                           "value":"39.8元",
                           "color":"#173177"
                       },
                       "keyword4": {
                           "value":"2014年9月22日",
                           "color":"#173177"
                       },
                       "remark":{
                           "value":"欢迎再次购买!",
                           "color":"#173177"
                       }
               }
           }

     通过Postman发送玩了之后就是步骤三中的效果图

     

    五、发送模板消息工具类封装

      配置微信公众号参数:appid、appsecret、token、asekey、template_id(模板id)

      1.wx.properties

    #=========微信公众号开发基本配置============
    #微信公众号的appid
    wx_appid=
    #微信公众号的appsecret
    wx_appsecret=
    #微信公众号的token
    wx_token=
    #微信公众号的消息加解密密钥aeskey
    wx_aeskey=
    #微信模板消息template_id
    wx_template_id=

     2.WeChatTemplateMsgUtils:

     这里将WeChatTemplateMsgUtils.java以注册为Spring容器,交给Spring容器管理,方便Controller、Service中注入使用

    package com.thinkgem.jeesite.modules.wechat.commonUtil;
    
    import com.thinkgem.jeesite.modules.wechat.inter.PushMessageService;
    import lombok.extern.slf4j.Slf4j;
    import me.chanjar.weixin.common.exception.WxErrorException;
    import me.chanjar.weixin.mp.api.WxMpService;
    import me.chanjar.weixin.mp.bean.template.WxMpTemplate;
    import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
    import me.chanjar.weixin.mp.bean.template.WxMpTemplateIndustry;
    import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    
    import java.util.Arrays;
    import java.util.List;
    
    /**
     * <pre>
     * @Description: 微信模板消息推送实现
     * @Aouth: cao_wencao
     * @Date: 2019-01-24 14:07
     * </pre>
     */
    @Slf4j
    @Component
    public class WeChatTemplateMsgUtils implements PushMessageService {
        @Autowired
        private WxMpService wxMpService;
    
        @Value("#{wxProperties.wx_template_id}")
        private String wx_template_id;
    
        //案例: 星巴克支付通知
        @Override
        public String manuscriptExamine(String openId) {
            //实例化模板对象
            WxMpTemplateMessage wxMpTemplateMessage = new WxMpTemplateMessage();
            //设置模板ID
            wxMpTemplateMessage.setTemplateId(wx_template_id);
            //设置发送给哪个用户
            wxMpTemplateMessage.setToUser(openId);
            //构建消息格式
            List<WxMpTemplateData> listData = Arrays.asList(
                    new WxMpTemplateData("first", "恭喜你支付成功!", "#173177"),
                    new WxMpTemplateData("keyword1", "曹.", "#173177"),
                    new WxMpTemplateData("keyword2", "2019698571200", "#173177"),
                    new WxMpTemplateData("keyword3", "¥98.80", "#173177"),
                    new WxMpTemplateData("keyword4", "星冰乐(焦糖味) 家乐氏香甜玉米片*2 乐天七彩爱情糖*3", "#173177"),
                    new WxMpTemplateData("remark", "如有疑问,请联系客服电话:021-54145323", "#173177")
            );
            //接收发送模板消息结果,就是msgid,if(msgid! = null)即成功
            String wxTemplateResult = null;
            //放进模板对象。准备发送
            wxMpTemplateMessage.setData(listData);
            try {
                //发送模板
                wxTemplateResult = wxMpService.getTemplateMsgService().sendTemplateMsg(wxMpTemplateMessage);
            } catch (WxErrorException e) {
                log.error("发送模板消息异常:{}", e.getMessage());
                e.printStackTrace();
            }
            return wxTemplateResult;
        }
    
        /**
         * <pre>
         * 设置所属行业
         * @auther: cao_wencao
         * @date: 2019/2/18 15:17
         * </pre>
         */
        public boolean setIndustry(WxMpTemplateIndustry wxMpIndustry) throws WxErrorException {
            Boolean flag = wxMpService.getTemplateMsgService().setIndustry(wxMpIndustry);
            return flag;
        }
    
        /**
         * <pre>
         * 获取设置的行业信息
         * @auther: cao_wencao
         * @date: 2019/2/18 15:21
         * </pre>
         */
        public WxMpTemplateIndustry getIndustry() throws WxErrorException {
            WxMpTemplateIndustry wxMpTemplateIndustry = wxMpService.getTemplateMsgService().getIndustry();
            return wxMpTemplateIndustry;
        }
    
        /**
         * <pre>
         * 发送模板消息
         * @auther: cao_wencao
         * @date: 2019/2/18 15:25
         * </pre>
         */
        public String sendTemplateMsg(WxMpTemplateMessage templateMessage) throws WxErrorException {
            String result = wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
            return result;
        }
    
    
        /**
         * <pre>
         * 获得模板ID
         * shortTemplateId: 模板库中模板的编号,有“TM**”和“OPENTMTM**”等形式
         * @auther: cao_wencao
         * @date: 2019/2/18 15:29
         * </pre>
         */
        public String addTemplate(String shortTemplateId) throws WxErrorException {
            String result = wxMpService.getTemplateMsgService().addTemplate(shortTemplateId);
            return result;
        }
    
        /**
         * <pre>
         * 获得模板列表
         * @auther: cao_wencao
         * @date: 2019/2/18 15:30
         * </pre>
         */
        List<WxMpTemplate> getAllPrivateTemplate() throws WxErrorException {
            List<WxMpTemplate> templateList = wxMpService.getTemplateMsgService().getAllPrivateTemplate();
            return templateList;
        }
    
        /**
         * <pre>
         * 删除模板
         * templateId: 公众帐号下模板消息ID
         * @auther: cao_wencao
         * @date: 2019/2/18 15:32
         * </pre>
         */
        boolean delPrivateTemplate(String templateId) throws WxErrorException {
            Boolean flag = wxMpService.getTemplateMsgService().delPrivateTemplate(templateId);
            return flag;
        }
    
    }
    

    六、如何使用模板消息工具类

     新建一个controller,在controller中注入WeChatTemplateMsgUtils即可

    @Autowired

    private WeChatTemplateMsgUtils weChatTemplateMsgUtils;

     

    七、WxMpService注入为空问题 

    首先,我在专栏首页里也说明过,本微信开发专栏是全部基于开源微信框架WxJava(原名:weixin-java-tools)来实现的一些功能,所以大家应该先去熟悉下WxJava如何使用以及其demo项目如何运行,在这篇文章推出后,发现很多评论说WxMpService注入为空,其实这是缺少配置文件的问题,demo里面就有,下面说下具体缺少项,以及针对SpringMVC项目和SpringBoot项目应该配置哪些东西;

    1. SpringMVC项目

     如果是SpringMVC项目,WxMpService注入为空可能是缺少图中的配置文件,加入这两项配置即可,具体参考demo项目:https://github.com/binarywang/weixin-java-mp-demo-springmvc

    2.SpringBoot项目

    如果是SpringBoot项目,WxMpService注入为空可能是缺少图中的配置文件,加入这两项配置即可,具体参考demo项目:https://github.com/binarywang/weixin-java-mp-demo-springboot

     

    上面就是针对针对SpringMVC架构和SpringBoot架构的项目,在使用微信模板消息时,注入WxMpService为空的各自问题及解决方案,在这里记录下,方便大家出现这种问题时看到就知道是什么原因,其实不是bug,自己多细心点就好了。

    展开全文
  • 前言:微信公众平台为了识别用户,每...微信发送模板消息接口调用请求说明 http请求方式: POST https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN POST数据示例如下: { "touser
  • java实现微信公众号模板消息推送

    千次阅读 热门讨论 2019-02-28 13:21:59
    要推送微信的模板消息,我们需要准备的条件有: 1、有效的access_token 2、微信公众号提供的消息模板的Template_id access_token: 公众平台以access_token为接口调用凭据,来调用接口,所有接口的调用需要先获取...
  • 微信公众号消息模板推送demo,亲测能用,替换下参数就能用
  • 主要为大家详细介绍了微信公众号开发之回复图文消息java代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 文章目录获取code获取openid获取用户信息获取基础access_token发送模版消息写在最后 获取code         就一个get请求连接,只要在微信内请求,弄个href访问就行,我在...
  • 一、首先想要对接,先要一个公众号,再就是开发文档了: ...不过请注意这一点 ok,我们继续:再来完成公众号的基本配置: ...这个URL是很重要的,需要响应微信发送的token验证 令牌(Token):必须为英文或数字,...消息加解
  • 登录微信测试公众号:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login...新增测试模板模板 在pom.xml文件中引入依赖 <dependency> <groupId>com.github.binarywang</groupId>
  • Java开发公众号发送模板消息1:获取模版ID2:请求接口返回码说明 1:获取模版ID 通过在模版消息功能的模版库中使用需要的模版,可以获得模版ID。 2:请求接口 请注意,URL置空,则在发送后,点击模版消息会进入一个...
  • *微信模板推送 * @param req 微信用户唯一标识 * @param response 处理给浏览器返回的数据 * @return 返回状态 */ @GetMapping("/tuisong") public String SendWxNotice(HttpServletRequest req, ...
  • 微信公众号开发-接收消息+模板消息。包含所有源代码、工具类、JAR包,MyEclipse开发的,其他软件开发的可以参考着修改。
  • java向微信公众号---发送模板和图文消息

    千次阅读 热门讨论 2021-01-05 14:04:00
    微信公众号对接开发项目搭建mavenapplication.ymlyml参数配置微信客户端配置搭建完成 实现业务模板消息推送准备工作模板消息填写要求图文消息填写要求推送模板消息推送模板消息结果——效果推送图文消息问题和结果...
  • Java微信公众平台开发之发送模板消息

    万次阅读 多人点赞 2017-01-02 16:59:53
    模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等。不支持广告等营销类消息以及其它所有可能对用户造成骚扰的消息。对于一般的服务号而言,...
  • 实现微信公众号模板消息推送控制层实体类官方文档地址: 控制层 package com.zjht.resourceserver.controller; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONException; import ...
  • 本篇文章讲解了如何向用户发送模板消息,前提是已经搭建了微信开发环境。读完本文后,实现的主要效果如下 向已绑定用户发送模板...登录测试公众号/正式公众号(认证后的服务号),测试公众号模板消息接口-&g...
  • 这里我们只需要发送模板信息所以只需要看一个接口就可以了 接口很明显,只需要一个access_token,然后就传参数就可以,access_token这个是需要调用接口去获取的,不知道的可以去看官方文档,这里就不解释了 这个接口...
  • Java 实现微信公众号模板消息推送

    千次阅读 2019-08-30 15:03:49
    实现功能:通过微信公众号指定某个用户主动进行推送消息 准备工作:要有认证过的服务号,要有自己的服务器,还需要在公众号后台配置好token验证(需要https)...3、发送模板消息 准备工作不多说了,可参考:ht...
  • 已经通过微信认证的公众号并且已经申请开通过模板消息接口,而且还需要从模板库中选择过模板并已添加到自己的公众平台 首先点击这里的按钮: 之后找到合适模板点“添加按钮” 三 程序调用模板消息发送接口 1 模板...
  • 微信公众号获得模板消息能力,设置行业类别并选择相应的模板 实现思路: 1.封装请求参数 2.获取access_token 3.发送 代码实现: package com.qupaiji.api.weixin.message; import ...
  • 暂时想到的是通过微信公众号给关注的特定客户发送运维消息,看了公众号提供的模板功能,就记录下来便于以后对接! 获取ACCESS_TOKEN 公众号提供的功能api的基础前提是需要拿到token,拿到token后才能去调用相关的...
  • 微信公众号 模板消息 定时推送 java

    千次阅读 2018-05-18 18:29:00
    即每个月定时自动发送一条消息 给关注 公众号的人 用的是 公众号的测试账号(实际开发需要认证的公众号) 微信官网的 模板消息接口规则: 1、所有服务号都可以在功能->添加功能插件处看到申请模板消息功能的...
  • 为什么要使用微信的模板消息推送,最近有个需求是将消息推送到微信公众号,之前的系统已经支持邮箱和短信推送消息。 微信的模板消息推送就是我们在订阅某个公众号以后,进行支付等操作时,支付成功以后,公众号会...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,882
精华内容 2,352
关键字:

java发送公众号模板消息

java 订阅