微信模板消息_微信小程序模板消息和微信公众号模板消息 - CSDN
  • 模板消息推送接口: 微信公众平台API链接: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277 我这里写了模板调用工具类, java可视情况改为一个方法 附加HTTP的POST调用工具类 ...

     

    模板消息推送接口:

    微信公众平台API链接:

    https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277

    我这里写了模板调用工具类,

    java可视情况改为一个方法

    附加HTTP的POST调用工具类

    根据不同模板拼接不同数据

    例如:

     

    一、测试类

    import org.apache.http.HttpResponse;
    import org.apache.http.HttpStatus;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.util.EntityUtils;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    
    import com.google.gson.Gson;
    import com.phjr.service.huifu.util.HttpClientUtil;
    
    
    import weixn.Demo;
    
    
    public class TuiSongTest {
    
    
    	private static Logger logger = LoggerFactory.getLogger(TuiSongTest.class);
    
    
    	//微信模板接口
    	private final String SEND_TEMPLAYE_MESSAGE_URL ="https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN";
    	
    	private final String APPID = "";
    	private final String SECRET = "";
    	//获取微信ACCESS_TOKEN接口
    	private final String aturl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + APPID
    	+ "&secret=" + SECRET;
    	//openId
    	private static  String fromUserName="";
    	//模板ID
    	private static String template_id="";
    	//模板消息详情跳转URL
    	private static String url="";
    	
    	
    	public static void main(String[] args) {
    		TuiSongTest tuiSongTest = new TuiSongTest();
    		
    		Demo demo = tuiSongTest.getAccess_token();
    		String access_token=demo.getAccess_token();
    		
    		logger.info("为模板消息接口获取的accessToken是"+access_token);  
    		
    		WechatTemplate wechatTemplate = new WechatTemplate();  
    		wechatTemplate.setTemplate_id(template_id);  
    		wechatTemplate.setTouser(fromUserName);  //此处是用户的OpenId
    		wechatTemplate.setUrl(url); 
    		
    	private static Logger logger = LoggerFactory.getLogger(TuiSongTest.class);
    
    
    	//微信模板接口
    	private final String SEND_TEMPLAYE_MESSAGE_URL ="https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN";
    	
    	private final String APPID = "";
    	private final String SECRET = "";
    	//获取微信ACCESS_TOKEN接口
    	private final String aturl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + APPID
    	+ "&secret=" + SECRET;
    	//openId
    	private static  String fromUserName="";
    	//模板ID
    	private static String template_id="";
    	//模板消息详情跳转URL
    	private static String url="";
    	
    	
    	public static void main(String[] args) {
    		TuiSongTest tuiSongTest = new TuiSongTest();
    		
    		Demo demo = tuiSongTest.getAccess_token();
    		String access_token=demo.getAccess_token();
    		
    		logger.info("为模板消息接口获取的accessToken是"+access_token);  
    		
    		WechatTemplate wechatTemplate = new WechatTemplate();  
    		wechatTemplate.setTemplate_id(template_id);  
    		wechatTemplate.setTouser(fromUserName);  //此处是用户的OpenId
    		wechatTemplate.setUrl(url); 
    <strong><span style="color:#ff0000">             //根据不同模板 拼写不同数据</span></strong>
     Map<String,TemplateData> m = new HashMap<String,TemplateData>();  
            TemplateData first = new TemplateData();   
            first.setColor("#000000"); 
            first.setValue("您的一位好友完成了注册");  
            m.put("first", first);
            TemplateData keyword1 = new TemplateData();
            keyword1.setColor("#000000");
            keyword1.setValue("136****1234");
            m.put("keyword1", keyword1);  
            TemplateData keyword2 = new TemplateData();
            keyword2.setColor("#000000");
            keyword2.setValue("2018-06-10 10:23:00");
            m.put("keyword2", keyword2);
            TemplateData remark = new TemplateData();
            remark.setColor("#000000");
            remark.setValue("用户136****1234是您的直接推荐好友");
            m.put("remark", remark);
            wechatTemplate.setData(m);
            try {   
                tuiSongTest.sendTemplateMessage(access_token, wechatTemplate);  
                } catch (Exception e) {       
                    logger.info("异常"+e.getMessage());  
            }  
            }
    
        public void sendTemplateMessage(String accessToken, WechatTemplate wechatTemplate) {           String jsonString = new Gson().toJson(wechatTemplate).toString();          String requestUrl = SEND_TEMPLAYE_MESSAGE_URL.replace("ACCESS_TOKEN", accessToken);        logger.info("请求参数",jsonString);     //发送 post请求 发送json数据     String json = HttpClientUtil.sendHttpPostJson(requestUrl, jsonString);           WeiXinResponse weiXinResponse = new Gson().fromJson(json, WeiXinResponse.class);     logger.info("jsonObject="+weiXinResponse);     if (null != weiXinResponse) {           int errorCode = weiXinResponse.getErrcode();            if (0 == errorCode) {               logger.info("模板消息发送成功");           } else {               String errorMsg = weiXinResponse.getErrmsg();             logger.info("模板消息发送失败,错误是 "+errorCode+",错误信息是"+ errorMsg);           }       }   }   public Demo getAccess_token() { try { String access_token = ""; DefaultHttpClient client = new DefaultHttpClient(); HttpGet request = new HttpGet(aturl); HttpResponse response = client.execute(request); String httpGet = HttpClientUtil.sendHttpGet(aturl); Gson gson=new Gson(); Demo jsonResult=new Demo(); if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { String strResult = EntityUtils.toString(response.getEntity());      System.out.println("get请求结果:" + strResult);         System.out.println("结果回调" +response.getStatusLine().getStatusCode() );          jsonResult = gson.fromJson(strResult, Demo.class); access_token = jsonResult.getAccess_token(); String expires_in =jsonResult.getExpires_in(); logger.info("access_token{}:  expires_in{}:",access_token,expires_in); } return jsonResult; } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } }
            
            
        }

    以下是相关实体

    public class Demo {
    
    	private String access_token;
    	
    	private String expires_in;
    
    	public String getAccess_token() {
    		return access_token;
    	}
    
    	public void setAccess_token(String access_token) {
    		this.access_token = access_token;
    	}
    
    	public String getExpires_in() {
    		return expires_in;
    	}
    
    	public void setExpires_in(String expires_in) {
    		this.expires_in = expires_in;
    	}
    	
    	
    }
    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 WeiXinResponse {
    
    	private Integer  errcode;
    	
    	private String errmsg;
    	
    	private String msgid;
    
    	public Integer getErrcode() {
    		return errcode;
    	}
    
    	public void setErrcode(Integer errcode) {
    		this.errcode = errcode;
    	}
    
    	public String getErrmsg() {
    		return errmsg;
    	}
    
    	public void setErrmsg(String errmsg) {
    		this.errmsg = errmsg;
    	}
    
    	public String getMsgid() {
    		return msgid;
    	}
    
    	public void setMsgid(String msgid) {
    		this.msgid = msgid;
    	}
    	
    	
    	
    }

     

    附加HttpClient工具类

     /**
         * 发送 post请求 发送json数据
         * 
         * @param httpUrl
         *            地址
         * @param paramsJson
         *            参数(格式 json)
         * 
         */
        public static String sendHttpPostJson(String httpUrl, String paramsJson) {
            HttpPost httpPost = new HttpPost(httpUrl);// 创建httpPost
            try {
                // 设置参数
                if (paramsJson != null && paramsJson.trim().length() > 0) {
                    StringEntity stringEntity = new StringEntity(paramsJson, "UTF-8");
                    stringEntity.setContentType(CONTENT_TYPE_JSON_URL);
                    httpPost.setEntity(stringEntity);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return sendHttpPost(httpPost);
        }
        
     /**
         * 发送Post请求
         * 
         * @param httpPost
         * @return
         */
        private static String sendHttpPost(HttpPost httpPost) {
    
            CloseableHttpClient httpClient = null;
            CloseableHttpResponse response = null;
            // 响应内容
            String responseContent = null;
            try {
                // 创建默认的httpClient实例.
                httpClient = getHttpClient();
                // 配置请求信息
                httpPost.setConfig(requestConfig);
                // 执行请求
                response = httpClient.execute(httpPost);
                // 得到响应实例
                HttpEntity entity = response.getEntity();
    
     
                // 判断响应状态
                if (response.getStatusLine().getStatusCode() >= 300) {
                    throw new Exception(
                            "HTTP Request is not success, Response code is " + response.getStatusLine().getStatusCode());
                }
    
                if (HttpStatus.SC_OK == response.getStatusLine().getStatusCode()) {
                    responseContent = EntityUtils.toString(entity, CHARSET_UTF_8);
                    EntityUtils.consume(entity);
                }
    
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    // 释放资源
                    if (response != null) {
                        response.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return responseContent;
        }
    

     

     

     

     

     

     

    展开全文
  • 根据微信小程序最新机制:2019年10月份微信发布了最新模板消息整改公告,由模板消息更改为订阅消息,模板消息将于2020年1月10日下线,下线后这篇文章将失效。最新微信订阅消息文章已发布,请大家移步:...

    今天KingYiFan给大家分享一下小程序模板消息推送:


    根据微信小程序最新机制:2019年10月份微信发布了最新模板消息整改公告,由模板消息更改为订阅消息,模板消息将于2020年1月10日下线,下线后这篇文章将失效。最新微信订阅消息文章已发布,请大家移步:https://blog.csdn.net/weixin_39984161/article/details/103888343

    公告如下:

    file

     

    什么是微信模板推送呢?
    废话不多说先上一张熟悉图
    活动行

    你们有没有收到这些通知。顿时是不是觉得活动性感觉很牛掰。

    what?? 感觉好牛逼的样子。

    今天就来教大家怎么实现。

    老规矩先甩一下微信官方文档:https://developers.weixin.qq.com/miniprogram/dev/api/notice.html#%E5%8F%91%E9%80%81%E6%A8%A1%E6%9D%BF%E6%B6%88%E6%81%AF
    我是一个很懒的人从来不看微信官方文档,写的太笼统(完全看不懂~~~)。

    原来我用这个玩意用的老疯狂了。天天给我喜欢的女孩推送,我喜欢你。哈哈哈 比如xxx是女神了。哈哈哈
    确实做一个程序员确实能给女朋友很多浪漫的地方。为了保护我家女神隐私哈哈哈,我就不上图了。 等你们学会可以自己给女朋友退送表白信息哦。。


    原来可以随便推,只要知道用户openid 就能无限制推,推到把小程序封了。。。
    --------普及一下微信推送的好处。
    微信小程序消息推送需要用户触发动作才能发送消息,比如用户提交订单、支付成功。一次只能发一条,当然可以通过某种方法发送多条,KingYiFan就不在这里赘述了。下面就介绍一下如何推送消息。

    微信现在改成了只有用户点了小程序,然后生成一个fromId 该死的fromId 也就是用户不点你小程序按钮,就不会推送。好尴尬。并且这个fromId既然是一个按钮。。我靠微信真的是太坑了。。。

    来吧上教程吧。。。

    一、准备工作

    首先,在微信小程序后台开通消息推送功能,并添加消息模板。可以从模板库选择模板也可以创建一个模板,模板添加之后,模板ID我们接下来要用的。
    

    插一个小小的话题。。。。
    昨天我发了微信支付,有人问我微信小程序后台管理系统怎么进入。。。。。。
    晕。。。。。这都不知道,你让我还能说什么呢。。。。
    悄悄告诉你,当时KingYiFan也当时没找到,该死的微信隐藏的太深了。。。


    注册小程序,我这就不赘述了。然后直接在微信公众平台登录就可以了。公众号也能登录,小程序也能登录。
    哈哈哈哈哈~~ 是不是很扯,马爸爸说小程序是未来的趋势。。怎么不给他们开一个独立的平台。后来我给马爸爸发了一封邮件,马爸爸说 小龙给忘了。。哈哈哈哈哈 上面纯属瞎说啊。。

    废话不多说。开始之前打个广告吧。下面的是KingYiFan的小程序。纯属GitHub拉去的。反正这个小程序很牛逼
    微信小程序


    这是微信小程序登录后台管理系统。
    (别问我为什么叫彩狼阁~~)

    找到模板消息。

    新建一个模板。。。

    然后点击提交----

    就变成了这个样子。。一点要把模板id保存到钱包里,丢了就不能和KingYiFan一起装逼了

    好了,大家一定要看好 我要开始装逼(▼へ▼メ)了

    纳尼,刚刚有人问我,appid怎么获取?

    好咱们继续哈。。
    刚刚说了半天fromId 这么牛逼的字符串,要获取呢?
    --下面是微信说的
    在需要触发消息推送的页面添加提交表单的事件。目的是得到formID,formID是消息推送时必须的参数。

    <form name='pushMsgFm' report-submit='true' bindsubmit='getFormID'>
          <button form-type="submit" class="zan-btn zan-btn--large zan-btn--danger payButton">有本事点我啊~~~</button>
        </form>
    

    以上代码中“getFormID”是提交表单时触发的事件。

    getFormID: function (e) {
             this.setData({
        formId: e.detail.formId
            })
        }
    

    三下五除二就把fromId获取了 是不是感觉懵逼。为什么腾讯获取fromId放到from表单提交里。
    因为fromId 是from的儿子啊哈哈哈哈~~~
    好了,不闹了,这是微信防止恶意给用户推送信息骚扰客户。具体为什么表单 我也不知道····


    是不是上面的都没有看懂呢,就要开始下面了,如果你是小程序开发人员肯定能看懂,如果你和KingYiFan一样是后台程序猿,就把上面代码扔给前段工程师就好了。别问为什么,他一定会感谢你。

    先来看看微信官方的API
    接口地址-请求方式

    你们是不是想问我access_token是什么鬼。哈哈哈哈 这个给你们扔一个APi文档你们看看就明白了就是一个微信调取APi凭证,一会给你们分享一个工具类 直接用就行。。

    看看API参数

    还有废弃参数,这又是什么鬼。。。来吧让你们看一些熟悉的东西。

        /**
         * @throws @author: KingYiFan
         * @Title: main别问我为什么这么LOW 还用main方法,我只想告诉你main方法是最牛逼的方法没有之一
         * @Description: 测试推送
         * @param:  args
         * @return: void
         */
        public static void main(String[] args) {
            //封装了推送实体类,别问我为什么一直封装,java三特性 继承 封装 多态
            com.jiaewo.house.entity.wxsmallapppush.wxsmallTemplate tem = new com.jiaewo.house.entity.wxsmallapppush.wxsmallTemplate();
            //模板id 刚刚获取废了很成时间 如果还不会,我觉得你应该放弃java了
            tem.setTemplateId("_yPJaTTc7zmPliitwUm0VY4wjRRvuVOdk57tA1Nggw0");
            //推送给哪位神仙。 这个是openId 不是UnionID 如果是unionId肯定推送不过去。
            tem.setToUser("oHi8u5dZc6whcGp8DpUv7h-iM12g");
            //fromId 这个炒鸡重要,没有他百分百推送不成功,fromId+openId 才能推送
            tem.setForm_id("679293f4f93c31e15d1f14dcf3f77d5a");
            //用户点击之后调到小程序哪个页面 找你们前段工程师提供即可
            tem.setPage("pages/welcome/welcome");
            //有封装了一个实体类 哈哈哈 这个是模板消息参数
            List<com.jiaewo.house.entity.wxsmallapppush.wxsmallTemplateParam> paras = new ArrayList<com.jiaewo.house.entity.wxsmallapppush.wxsmallTemplateParam>();
            //这个是满参构造 keyword1代表的第一个提示  红包已到账这是提示 #DC143C这是色值不过废弃了
            com.jiaewo.house.entity.wxsmallapppush.wxsmallTemplateParam templateParam = new com.jiaewo.house.entity.wxsmallapppush.wxsmallTemplateParam(
                    "keyword1", "红包已到账", "#DC143C");
            //装进小参数结合中
            paras.add(templateParam);
            //我就不嘚瑟了 省点劲直接扔进去算了哈哈哈哈哈~~~~
            paras.add(new com.jiaewo.house.entity.wxsmallapppush.wxsmallTemplateParam("keyword2", "刘骞", ""));
            paras.add(new com.jiaewo.house.entity.wxsmallapppush.wxsmallTemplateParam("keyword3", "0.02元", "#DC143C"));
            paras.add(new com.jiaewo.house.entity.wxsmallapppush.wxsmallTemplateParam("keyword4", "成功成为您店铺的会员", ""));
            paras.add(new com.jiaewo.house.entity.wxsmallapppush.wxsmallTemplateParam("keyword5", "卓志海", ""));
            paras.add(new com.jiaewo.house.entity.wxsmallapppush.wxsmallTemplateParam("keyword6", "暂无推荐店铺", ""));
            paras.add(new com.jiaewo.house.entity.wxsmallapppush.wxsmallTemplateParam("keyword7", "红包已到您app账户,请尽快查询", "#0000FF"));
    
            //这里写的挺恶心的,不想抽取工具了。直接转换时间戳把
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date temp = new Date();
            String str = "";
            str = sdf.format(temp);
            paras.add(new com.jiaewo.house.entity.wxsmallapppush.wxsmallTemplateParam("keyword8", str, ""));
            //然后把所有参数扔到大的模板中
            tem.setTemplateParamList(paras);
            //模板需要放大的关键词,不填则默认无放大
            tem.setEmphasis_keyword("keyword1.DATA");
            //获取token凭证。
            Token token = com.jiaewo.house.wxxcx.util.CommonUtil.getToken();
            String accessToken = token.getAccessToken();
            //最后一步请求接口哈哈哈  推送成功
            boolean result1 = com.jiaewo.house.wxxcx.util.CommonUtil.sendTemplateMsg(accessToken, tem);
            if (result1) {
                System.err.println("推送成功");
            } else {
                System.err.println("推送失败");
            }
        }
    

    是不是感觉炒鸡简单。。。。。没错哈哈哈哈。。。

    来继续甩代码和工具类---

    /**
         * @ClassName: Template
         * @Description:小程序微信推送模版model
         * @author: KingYiFan
         * @date: 2018年3月5日 下午4:17:25
         */
        public class wxsmallTemplate {
    
        // 消息接收方
        private String toUser;
        // 模板id
        private String templateId;
        // 点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转
        private String page;
    
        // 表单提交场景下,为 submit 事件带上的 formId;支付场景下,为本次支付的 prepay_id
        private String form_id;
    
        // 模板内容字体的颜色,不填默认黑色 【废弃】
        private String color;
        // 模板需要放大的关键词,不填则默认无放大
        private String emphasis_keyword;
    
        // 参数列表
        private List<wxsmallTemplateParam> templateParamList;
    
        public String getToUser() {
            return toUser;
        }
    
        public void setToUser(String toUser) {
            this.toUser = toUser;
        }
    
        public String getTemplateId() {
            return templateId;
        }
    
        public void setTemplateId(String templateId) {
            this.templateId = templateId;
        }
    
        public String getPage() {
            return page;
        }
    
        public void setPage(String page) {
            this.page = page;
        }
    
        public String getForm_id() {
            return form_id;
        }
    
        public void setForm_id(String form_id) {
            this.form_id = form_id;
        }
    
        public String getColor() {
            return color;
        }
    
        public void setColor(String color) {
            this.color = color;
        }
    
        public String getEmphasis_keyword() {
            return emphasis_keyword;
        }
    
        public void setEmphasis_keyword(String emphasis_keyword) {
            this.emphasis_keyword = emphasis_keyword;
        }
    
        public List<wxsmallTemplateParam> getTemplateParamList() {
            return templateParamList;
        }
    
        public void setTemplateParamList(List<wxsmallTemplateParam> templateParamList) {
            this.templateParamList = templateParamList;
        }
    
        public String toJSON() {
            StringBuffer buffer = new StringBuffer();
            buffer.append("{");
            buffer.append(String.format("\"touser\":\"%s\"", this.toUser)).append(",");
            buffer.append(String.format("\"template_id\":\"%s\"", this.templateId)).append(",");
            buffer.append(String.format("\"page\":\"%s\"", this.page)).append(",");
            buffer.append(String.format("\"form_id\":\"%s\"", this.form_id)).append(",");
    
            buffer.append("\"data\":{");
            wxsmallTemplateParam param = null;
            for (int i = 0; i < this.templateParamList.size(); i++) {
                param = templateParamList.get(i);
                // 判断是否追加逗号
                if (i < this.templateParamList.size() - 1) {
    
                    buffer.append(String.format("\"%s\": {\"value\":\"%s\",\"color\":\"%s\"},", param.getName(),
                            param.getValue(), param.getColor()));
                } else {
                    buffer.append(String.format("\"%s\": {\"value\":\"%s\",\"color\":\"%s\"}", param.getName(),
                            param.getValue(), param.getColor()));
                }
    
            }
            buffer.append("},");
            buffer.append(String.format("\"emphasis_keyword\":\"%s\"", this.emphasis_keyword));
            buffer.append("}");
            return buffer.toString();
        }
        }
        /**  
         * @Title:  Token.java   
         * @Package com.jiaewo.house.entity    
         * @author: 家小二-风清扬   
         * @date:   2018年3月5日 下午4:39:38   
         * @version V1.0 
     */
    package com.jiaewo.house.entity;
    
    /**
     * @ClassName: Token
     * @Description:微信凭证实体类
     * @author: 家小二-风清扬
     * @date: 2018年3月5日 下午4:39:51
     * 
     * @Copyright: 2018 www.jiajiao2o.com Inc. All rights reserved.
     *             注意:本内容仅限于北京赢在路上科技有限公司内部传阅,禁止外泄以及用于其他的商业目
     */
    public class Token {
    
        // 接口访问凭证
        private String accessToken;
        // 凭证有效期,单位:秒
        private int expiresIn;
    
        public String getAccessToken() {
            return accessToken;
        }
    
        public void setAccessToken(String accessToken) {
            this.accessToken = accessToken;
        }
    
        public int getExpiresIn() {
            return expiresIn;
        }
    
        public void setExpiresIn(int expiresIn) {
            this.expiresIn = expiresIn;
        }
    
    }
    

    参数Bean

    /**
         * @ClassName: TemplateParam
         * @Description:微信推送模版model
         * @author: KingYiFan
         * @date: 2018年3月5日 下午4:16:33
         */
        public class wxsmallTemplateParam {
        // 参数名称
        private String name;
        // 参数值
        private String value;
        // 颜色  废弃了哎。。。。。。。。。。。。。。。。。。。
        private String color;
    
        public wxsmallTemplateParam(String name, String value, String color) {
            this.name = name;
            this.value = value;
            this.color = color;
        }
    
        public wxsmallTemplateParam(String name, String value) {
            this.name = name;
            this.value = value;
    
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        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;
        }
        }
    

    获取接口访问凭证获取token

    /**
         * 获取接口访问凭证
         *
         * @param appid
         *            凭证
         * @param appsecret
         *            密钥
         * @return
         */
        public static Token getToken() {
            Token token = null;
            String requestUrl = token_url.replace("APPID", appID).replace("APPSECRET", secret);
            // 发起GET请求获取凭证
            JSONObject jsonObject = httpsRequest(requestUrl, "GET", null);
    
            if (null != jsonObject) {
                try {
                    token = new Token();
                    token.setAccessToken(jsonObject.getString("access_token"));
                    token.setExpiresIn(jsonObject.getInt("expires_in"));
                } catch (JSONException e) {
                    token = null;
                    // 获取token失败
                    log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"),
                            jsonObject.getString("errmsg"));
                }
            }
            return token;
        }
    

    推送消息 请求腾讯API

    public static boolean sendTemplateMsg(String token,
                com.jiaewo.house.entity.wxsmallapppush.wxsmallTemplate template) {
    
            boolean flag = false;
    
            String requestUrl = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=ACCESS_TOKEN";
            requestUrl = requestUrl.replace("ACCESS_TOKEN", token);
    
            net.sf.json.JSONObject jsonResult = httpsRequest(requestUrl, "POST", template.toJSON());
            System.err.println(template.toJSON());
            if (jsonResult != null) {
                Integer errorCode = jsonResult.getInt("errcode");
                String errorMessage = jsonResult.getString("errmsg");
                if (errorCode == 0) {
                    flag = true;
                } else {
                    System.out.println("模板消息发送失败:" + errorCode + "," + errorMessage);
                    flag = false;
                }
            }
            return flag;
        }
    

    剧终。。。。

    花絮··

    疑问1:用户只有点了生成fromId是不是才能推送?

    答:对没错,还有一种方法就是用户支付成功 prepay_id 用户支付成功可以连续推送三次哦!

    疑问2:怎么才能给用户无限制推送?

    答:目前微信是不支持的,不过KingYiFan想了一个歪点子,那就是吧所有按钮都弄成表单钮,然后用户点了,存起来。记住哈。fromId只有7天有效期,如果不用就浪费了。用完就没用了


    彩蛋开始哈哈哈。。原创 转载请说明出处

    KingYiFan教你无限制给用户推送消息KingYiFan教你无限制给用户推送消息

    1.封装小程序页面,诱导用户点击按钮,然后生成fromId

    2.把fromId存入数据库 然后设置一个有效期 起始时间 和过期时间。

    3.比如想给用户推送广告,在把fromId拿出来 直接推送。推送完删除。

    PS:只要用户点击就保存数据库别嫌多。越多就代表能和用户推无数条


    来吧给大家画一个流程图吧。


    上面就是一套完整的微信小程序推送流程,有什么不懂就联系我。


    鼓励作者写出更好的技术文档,就请我喝一瓶哇哈哈哈哈哈哈哈。。
    微信:

    支付宝:


    感谢一路支持我的人。。。。。
    Love me and hold me
    QQ:69673804(16年老号)
    EMAIL:69673804@qq.com
    友链交换
    如果有兴趣和本博客交换友链的话,请按照下面的格式在评论区进行评论,我会尽快添加上你的链接。


    网站名称:KingYiFan’S Blog
    网站地址:http://blog.cnbuilder.cn
    网站描述:年少是你未醒的梦话,风华是燃烬的彼岸花。
    网站Logo/头像:http://blog.cnbuilder.cn/upload/2018/7/avatar20180720144536200.jpg

     

    展开全文
  • 首先在微信端配置好模板消息 内容如下,注意{{*.DATA}} 是固定写法,占位符,是需要被替换掉的内容。{{first.DATA}} 订单商品:{{keyword1.DATA}} 订单编号:{{keyword2.DATA}} 支付金额:{{keyword3.DATA}} ...

    首先在微信端配置好模板消息

    这里写图片描述
    内容如下,注意{{*.DATA}} 是固定写法,占位符,是需要被替换掉的内容。

    {{first.DATA}} 
    订单商品:{{keyword1.DATA}} 
    订单编号:{{keyword2.DATA}}
    支付金额:{{keyword3.DATA}} 
    支付时间:{{keyword4.DATA}} 
    {{remark.DATA}}

    配置成功后记录下模板ID

    这里写图片描述

    Java后台需要组装出如下的数据请求微信API

     { 
        "touser":"这里填微信open id", 
        "template_id":"配置的模板ID", 
        "url":"这里是点击模板消息进入的页面URL", 
        "topcolor":"模板消息顶部颜色#FF0000", 
        "data":{ 
                "first": { 
                    "value":"恭喜你购买成功!", 
                    "color":"颜色#173177" 
                }, 
                "keyword1":{ 
                    "value":"产品名称", 
                    "color":"颜色#173177" 
                }, 
                "keyword2":{ 
                    "value":"订单号", 
                    "color":"颜色#173177" 
                }, 
                "keyword3":{ 
                    "value":"订单价格", 
                    "color":"#173177" 
                }, 
                "keyword4":{ 
                    "value":"订购时间", 
                    "color":"颜色#173177" 
                }, 
                "remark":{ 
                    "value":"欢迎再次购买!", 
                    "color":"颜色#173177" 
                } 
        } 
     };

    流量帝采用的是jfinal-weixin sdk,调用微信API代码如下:

    ApiResult apiResult = TemplateMsgApi.send(str);
    String jsonResult = apiResult.getJson();
    展开全文
  • 微信模板消息推送

    2019-03-14 10:32:01
    一、微信公众号或测试号内配置,我这里使用的...二、SpringBoot后台实现微信消息模板推送代码 注意:对于消息测试这类不是特别重要的功能,最好不要抛出异常 @Service @Slf4j public class PushMessageServiceIm...

    一、微信公众号或测试号内配置,我这里使用的是微信测试号

    点击【新增测试模板进行如下配置】

    配置模板标题和模板内容,配置完成后如下所示,会生成一个模板id,这个很重要:

    二、SpringBoot后台实现微信消息模板推送代码

    注意:对于消息测试这类不是特别重要的功能,最好不要抛出异常

    @Service
    @Slf4j
    public class PushMessageServiceImpl implements PushMessageService {
    
        @Autowired
        private WxMpService wxMpService;
    
        @Override
        public void orderStatus(OrderDTO orderDTO) {
            //【注意】:是在订单完结的时候执行这个操作
            WxMpTemplateMessage templateMessage = new WxMpTemplateMessage();
            //设置模板id
            templateMessage.setTemplateId("Iyqg2KLTaMJKKveaciV6BvrXXXXXXXXXXXXXXXXX");
            //这个openid是指微信测试号相对于我的微信号的openid,指的是消息推送给那个用户
            templateMessage.setToUser("o7TyS59g2pb-XXXXXXXXXXXX");
            List<WxMpTemplateData> data = Arrays.asList(
                    new WxMpTemplateData("first", "亲,请记得收货。"),
                    new WxMpTemplateData("keyword1", "微信点餐"),
                    new WxMpTemplateData("keyword2", "18868812345"),
                    new WxMpTemplateData("keyword3", orderDTO.getOrderId()),
                    new WxMpTemplateData("keyword4", orderDTO.getOrderStatusEnum().getMessage()),
                    new WxMpTemplateData("keyword5", "¥" + orderDTO.getOrderAmount()),
                    new WxMpTemplateData("remark", "欢迎再次光临!")
            );
            templateMessage.setData(data);
            try {
                wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
            }catch (WxErrorException e) {
                log.error("【微信模版消息】发送失败, {}", e);
            }
        }
    }

    三、测试代码

    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class PushMessageServiceImplTest {
    
        @Autowired
        private PushMessageServiceImpl pushMessageService;
    
        @Autowired
        private OrderService orderService;
    
        @Test
        public void orderStatus() throws Exception{
            OrderDTO orderDTO = orderService.findOne("1551684966828109467");
            pushMessageService.orderStatus(orderDTO);
        }
    }

    四、测试结果

    在接口测试账号内会受到如下消息内容:

    展开全文
  •  模板消息是在特定服务场景中向粉丝发送的消息,例如:信用卡刷卡通知,商品购买成功通知.不同的模板有不同的风格,某些字段可以由你来填充自己的内容(同时设定颜色),从而形成自己的消息.微信公众号中,可以替换的字段的...
  • 在我们做微信公众号开发时,发送模板消息往往是必不可少的功能。今天我们就来说说吧! 1、申请模板消息 首先我们应该知道,模板消息是需要申请的。这个申请就其本身来说是很easy的(我前一天晚上申请的,显示需要2...
  • 微信消息模板详解

    2018-05-07 15:47:56
    用户的微信就会收到相关的消息通知前提条件:您的微信公众号(服务号)必须已经成功完成与《163K地方门户系统》的微信登录设置配置流程1、进入微信公众号平台-添加功能插件-添加“模板消息” 2、在模板消息 中 选择...
  • 步骤一:获取模板ID1、通过模版消息管理接口获取模版ID(详见模版消息管理)2、在微信公众平台手动配置获取模版ID 登录https://mp.weixin.qq.com 获取模板,如果没有合适的模板,可以申请添加新模板,审核通过后可...
  • <dependency> <groupId>com.github.binarywang</groupId> <artifactId>weixin-java-mp</artifactId> <version>2.7.0</version> </dependency>... tem...
  • 代码如下:其中access_token 、openid和模板ID自己重新填写 function curlGet($url,$method='get',$data=''){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_...
  • 资源包含:1、生成 微信Accesstoken 服务;2、WechatAuth类 封装了 微信消息及二维码类...3、微信模板消息类 几行代码轻松搞定微信模板消息 使用教程参考:https://blog.csdn.net/qq_16024861/article/details/81510679
  • PHP实现微信模板消息推送  本篇文章博主主要是想和大家分享PHP实现微信模板消息推送的问题,下面我们就一块来看一下PHP如何实现微信模板消息推送,文章有具体的代码展现,具有一定的参考价值,对微信开发感兴趣的...
  • 收到很多童鞋的咨询,利用微信公众号的接口能不能给某个用户发送消息呢,如果说直接发送呢那还真有些限制,一个是客服消息接口,但是这... 这种微信模板消息的效果如何实现呢? 首先需要在微信公众平台后台的"...
  • 微信模板消息跳转小程序点击微信模板消息跳转小程序后台实现需求实现效果后台实现: 点击微信模板消息跳转小程序后台实现 需求 1.用户状态改变时,后台通过公众号给用户推送相关消息 2.用户点击推送消息跳转到小程序...
  • 微信模板消息换行

    2018-05-16 21:04:16
    微信模板消息换行,用"\r\n"就可以了,微信公众号模板消息有时候字段不够时就需要添加字段,需要换下行效果如下:
  • springboot实现微信模板消息推送 在上一篇文章我们已经知道了怎么获取openid 还不知道的可以查看我的上一篇文章springboot+微信小程序用codeid换取openid 这次我们不光要准备AppID(小程序ID)和AppSecret(小程序密钥)...
  • id=mp1433751277 ...温馨提示:请各位开发者使用微信模板消息功能前,仔细阅读上述发送模板消息接口文档,少走弯路; 一、微信公众号开发框架 <!-- 微信框架 参考:https://github.com/Wechat-Gr...
  • 最近由于公司微信公众号的...基本思路:首先我们需要一个线程专门创建【微信模板消息发送任务】,接着我们还需要若干个线程执行这些发送任务。 当然为了可以执行的更快,我们的设想不能局限于一台服务器的场景设计,我
  • c#发送微信模板消息

    2019-01-02 13:59:05
    直接上代码,微信模板消息api在 微信公众号中,https://developers.weixin.qq.com/miniprogram/dev/api/,如下图 C#代码如下:  string revMsg = "\"data\":{\"keyword1\":{\"...
  • 尝试使用微信模板消息,复制了提供的模板格式样例,尝试了很久. 明明json发送成功,微信端也收到了,但是却显示不出来具体的变量指示的内容, 最后发现坑出在了模板配置的英文和中文的冒号那里,特此记下踩过的坑 ...
1 2 3 4 5 ... 20
收藏数 54,165
精华内容 21,666
关键字:

微信模板消息