• 在我们做微信公众号开发时,发送模板消息往往是必不可少的功能。今天我们就来说说吧! 1、申请模板消息 首先我们应该知道,模板消息是需要申请的。这个申请就其本身来说是很easy的(我前一天晚上申请的,显示需要2...

    在我们做微信公众号开发时,发送模板消息往往是必不可少的功能。今天我们就来说说吧!

    1、申请模板消息

    首先我们应该知道,模板消息是需要申请的。这个申请就其本身来说是很easy的(我前一天晚上申请的,显示需要2--3个工作日,结果第二天早上就发现已经开通了,所以说腾讯官方还是比较给力的哈)。

    但是我们在申请时还是有一些东西要注意,这个在官方的文档有非常详细的说明。

    这个我建议你好好看看。选择行业的时候可要谨慎些,因为这个一个月只可以修改一次。

    那么,我们来看看在哪里申请?

    这里我已经申请过了。

    申请之后就耐心等待,审核通过之后再功能这一栏里就会出现模板消息的菜单。你可以看看我上面的截图,就在第三项。

    2、添加模板消息

    审核通过之后,我们就可以添加模板消息,进行开发了。

    这个很简单:

    我们点击模板消息进入后,直接在模板库中选择你需要的消息模板添加就可以了,添加之后就会在我的模板中。会有一个模板id,这个模板id在我们发送消息的时候会用到。

    3、消息发送功能开发

    接下来我们就看看如何发送模板消息:

    这个是官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277

    我呢,也来说说我的实现吧。为了更方便,我会直接将相关代码贴出来。

    文档中我们可以看到接口地址如下:

    http请求方式: POST
    https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN

    这里我们首先需要的就是access_token了,这个在这里就不多说了。通过你的appid和secret就可以获取。

    【获取access_token : https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183

    关于相关参数,我直接就将官方文档贴来了(文档写的很清楚):

    POST数据示例如下:

          {
               "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"
                       }
               }
           }
    

    参数说明

    参数 是否必填 说明
    touser 接收者openid
    template_id 模板ID
    url 模板跳转链接(海外帐号没有跳转能力)
    miniprogram 跳小程序所需数据,不需跳小程序可不用传该数据
    appid 所需跳转到的小程序appid(该小程序appid必须与发模板消息的公众号是绑定关联关系,暂不支持小游戏)
    pagepath 所需跳转到小程序的具体页面路径,支持带参数,(示例index?foo=bar),暂不支持小游戏
    data 模板数据
    color 模板内容字体颜色,不填默认为黑色

    注:url和miniprogram都是非必填字段,若都不传则模板无跳转;若都传,会优先跳转至小程序。开发者可根据实际需要选择其中一种跳转方式即可。当用户的微信客户端版本不支持跳小程序时,将会跳转至url。

    返回码说明

    在调用模板消息接口后,会返回JSON数据包。正常时的返回JSON数据包示例:

        {
               "errcode":0,
               "errmsg":"ok",
               "msgid":200228332
           }

    相信看完以上文档,基本上没有什么问题了。

    以下是我的部分代码:

    // 获取token
            String token = saveAndFlushAccessTokenUtil.getToken();
    
            String postUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + token;
    
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("touser", "发送到用户的openid");   // openid
            jsonObject.put("template_id", "你的模板id");
            jsonObject.put("url", "http://www.baidu.com");
    
            JSONObject data = new JSONObject();
            JSONObject first = new JSONObject();
            first.put("value", "hello");
            first.put("color", "#173177");
            JSONObject keyword1 = new JSONObject();
            keyword1.put("value", "hello");
            keyword1.put("color", "#173177");
            JSONObject keyword2 = new JSONObject();
            keyword2.put("value", "hello");
            keyword2.put("color", "#173177");
            JSONObject keyword3 = new JSONObject();
            keyword3.put("value", "hello");
            keyword3.put("color", "#173177");
            JSONObject remark = new JSONObject();
            remark.put("value", "hello");
            remark.put("color", "#173177");
            
            data.put("first",first);
            data.put("keyword1",keyword1);
            data.put("keyword2",keyword2);
            data.put("keyword3",keyword3);
            data.put("remark",remark);
    
            jsonObject.put("data", data);
    
            String string = HttpClientUtils.sendPostJsonStr(postUrl, jsonObject.toJSONString());
            JSONObject result = JSON.parseObject(string);
            int errcode = result.getIntValue("errcode");
            if(errcode == 0){
                // 发送成功
                System.out.println("发送成功");
            } else {
                // 发送失败
                System.out.println("发送失败");
            }

    下面是http请求工具类:

    package car.repair.common.util;
    
    import lombok.extern.slf4j.Slf4j;
    import org.apache.http.HttpEntity;
    import org.apache.http.ParseException;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.entity.ContentType;
    import org.apache.http.entity.StringEntity;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.util.EntityUtils;
    
    import java.io.IOException;
    
    /**
     * @author zhuzhe
     * @date 2017/12/11
     * HttpClient工具类
     */
    @Slf4j
    public class HttpClientUtils {
    
        /**
         * 以jsonString形式发送HttpPost的Json请求,String形式返回响应结果
         *
         * @param url
         * @param jsonString
         * @return
         */
        public static String sendPostJsonStr(String url, String jsonString) throws IOException {
            if (jsonString == null || jsonString.isEmpty()) {
                return sendPost(url);
            }
            String resp = "";
            StringEntity entityStr = new StringEntity(jsonString,
                    ContentType.create("text/plain", "UTF-8"));
            CloseableHttpClient httpClient = HttpClients.createDefault();
            HttpPost httpPost = new HttpPost(url);
            httpPost.setEntity(entityStr);
            CloseableHttpResponse response = null;
            try {
                response = httpClient.execute(httpPost);
                HttpEntity entity = response.getEntity();
                resp = EntityUtils.toString(entity, "UTF-8");
                EntityUtils.consume(entity);
            } catch (ClientProtocolException e) {
                log.error(e.getMessage());
            } catch (IOException e) {
                log.error(e.getMessage());
            } finally {
                if (response != null) {
                    try {
                        response.close();
                    } catch (IOException e) {
                        log.error(e.getMessage());
                    }
                }
            }
            if (resp == null || resp.equals("")) {
                return "";
            }
            return resp;
        }
    
        /**
         * 发送不带参数的HttpPost请求
         *
         * @param url
         * @return
         */
        public static String sendPost(String url) throws IOException {
            // 1.获得一个httpclient对象
            CloseableHttpClient httpclient = HttpClients.createDefault();
            // 2.生成一个post请求
            HttpPost httppost = new HttpPost(url);
            CloseableHttpResponse response = null;
            try {
                // 3.执行get请求并返回结果
                response = httpclient.execute(httppost);
            } catch (IOException e) {
                log.error(e.getMessage());
            }
            // 4.处理结果,这里将结果返回为字符串
            HttpEntity entity = response.getEntity();
            String result = null;
            try {
                result = EntityUtils.toString(entity);
            } catch (ParseException | IOException e) {
                log.error(e.getMessage());
            }
            return result;
        }
    }
    
    

     

    收到消息,我就不自己弄图了。这里附上官方图片一张:

     

    转载请务必保留此出处(原作者):https://blog.csdn.net/zhuzhezhuzhe1/article/details/83927016

     

    版权声明:本文为原创文章,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。

    https://blog.csdn.net/zhuzhezhuzhe1

     

    展开全文
  • 微信发送模板消息接口文档...温馨提示:请各位开发者使用微信模板消息功能前,仔细阅读上述发送模板消息接口文档,少走弯路; 一、微信公众号开发框架 <!-- 微信框架 参考: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.官方的demo

              {
               "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"
                       }
               }
           }

    四、通过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,自己多细心点就好了。

    展开全文
  • Java 微信发送模板消息
    /**
     * 模版消息结构
     * @author why
     *
     */
    public class Template {
    	private String touser;//接收人的openId
    	private String template_id;//模版id
    	private String url;//点击模版访问url
    	private String topcolor;//消息头部颜色
    	private Map<String,TemplateData> data;//消息内容
    	public Template() {
    		super();
    	}
    	public Template(String touser, String template_id, String url,
    			String topcolor, Map<String, TemplateData> data) {
    		super();
    		this.touser = touser;
    		this.template_id = template_id;
    		this.url = url;
    		this.topcolor = topcolor;
    		this.data = 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 String getTopcolor() {
    		return topcolor;
    	}
    	public void setTopcolor(String topcolor) {
    		this.topcolor = topcolor;
    	}
    	public Map<String, TemplateData> getData() {
    		return data;
    	}
    	public void setData(Map<String, TemplateData> data) {
    		this.data = data;
    	}
    	
    }
    /**
    	 * 创建模板消息
    	 * @param openId
    	 * @param template_id
    	 * @param url
    	 * @param topcolor
    	 * @param carrierName
    	 * @param waybillCode
    	 * @param waybillDesc
    	 * @return
    	 */
    	public static String makeRouteMessage(String openId,String template_id,String url,String topcolor,String carrierName, String waybillCode, String waybillDesc){
    		Template template = new Template();
    		template.setTouser(openId);
    		template.setTemplate_id(template_id);
    		template.setUrl(url);
    		template.setTopcolor(topcolor);
    		Map<String, TemplateData> data = new HashMap<String, TemplateData>();
    		data.put("first", new TemplateData(carrierName+"\n","#ff6600"));
    		data.put("waybillNo", new TemplateData(waybillCode+"\n","#ff6600"));
    		data.put("remark", new TemplateData(waybillDesc,"#ff6600"));
    		template.setData(data);
    		JSONObject jsonObject = JSONObject.fromObject(template);
    		System.out.println(template);
    		return jsonObject+"";
    	}
    	/**
    	 * 发送消息
    	 * @param accessToken
    	 * @param jsonMsg
    	 * @return
    	 */
    	public static boolean sendTemplateMessage(String accessToken, String jsonMsg){
    		logger.info("消息内容:{"+jsonMsg+"}");
    		boolean result = false;
    		//请求地址
    		String requestUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN";
    		requestUrl = requestUrl.replace("ACCESS_TOKEN", accessToken);
    		//发送模板消息
    		JSONObject jsonObject = WeixinUtil.httpRequest(requestUrl, "POST", jsonMsg);
    		if(null != jsonObject){
    			int errorCode = jsonObject.getInt("errcode");
    			String errorMsg = jsonObject.getString("errmsg");
    			if(0 == errorCode){
    				result = true;
    				logger.info("模板消息发送成功errorCode:{"+errorCode+"},errmsg:{"+errorMsg+"}");
    				System.out.println("模板消息发送成功errorCode:{"+errorCode+"},errmsg:{"+errorMsg+"}");
    			}else{
    				logger.info("模板消息发送失败errorCode:{"+errorCode+"},errmsg:{"+errorMsg+"}");
    				System.out.println("模板消息发送失败errorCode:{"+errorCode+"},errmsg:{"+errorMsg+"}");
    			}
    		}
    		return result;
    	}

    
    
    展开全文
  • 使用微信公众号模板消息发送,能够在用户操作网站时对指定用户发送消息提示,不仅能够及时反馈,还能用户一个好的体验,还可以节约短息推送的成本; 下面是比较重要的部分我做了一个截取展示,详细接口介绍请移步...

    使用微信公众号模板消息发送,能够在用户操作网站时对指定用户发送消息提示,不仅能够及时反馈,还能用户一个好的体验,还可以节约短息推送的成本;
    下面是比较重要的部分我做了一个截取展示,详细接口介绍请移步到, 微信官网地址:https://mp.weixin.qq.com/wiki

    获得模板ID,从行业模板库选择模板到帐号后台,获得模板ID的过程可在微信公众平台后台完成。为方便第三方开发者,提供通过接口调用的方式来

    获取模板ID,具体如下:

    接口调用请求说明 http请求方式: POST
    https://api.weixin.qq.com/cgi-bin/template/api_add_template?access_token=ACCESS_TOKEN
    POST数据说明

    POST数据示例如下:
          {
               "template_id_short":"TM00015"
           }

    参数说明
    参数是否必须说明access_token是接口调用凭证template_id_short是模板库中模板的编号,有“TM**”和“OPENTMTM**”等形式
    返回码说明 在调用模板消息接口后,会返回JSON数据包。正常时的返回JSON数据包示例:

           {
               "errcode":0,
               "errmsg":"ok",
               "template_id":"Doclyl5uP7Aciu-qZ7mJNPtWkbkYnWBWVja26EGbNyk"
           }

    发送模板消息 接口调用请求说明 http请求方式: POST
    https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN
    POST数据说明

    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":"39.8元",
                           "color":"#173177"
                       },
                       "keynote3": {
                           "value":"2014年9月22日",
                           "color":"#173177"
                       },
                       "remark":{
                           "value":"欢迎再次购买!",
                           "color":"#173177"
                       }
               }
           }

    参数说明

    参数是否必填说明touser是接收者openidtemplate_id是模板IDurl否模板跳转链接miniprogram否跳小程序所需数据,不需跳小程序可不用传该数据appid是所需跳转到的小程序appid(该小程序appid必须与发模板消息的公众号是绑定关联关系)pagepath是所需跳转到小程序的具体页面路径,支持带参数,(示例index?foo=bar)data是模板数据
    注:url和miniprogram都是非必填字段,若都不传则模板无跳转;若都传,会优先跳转至小程序。开发者可根据实际需要选择其中一种跳转方式即可。当用户的微信客户端版本不支持跳小程序时,将会跳转至url。

    返回码说明 在调用模板消息接口后,会返回JSON数据包。正常时的返回JSON数据包示例:

          {
               "errcode":0,
               "errmsg":"ok",
               "msgid":200228332
           }

    下面是我利用.NET实现的关键代码(注:这只是实现会员注册成功后的信息推送模板,其他模板相同处理)
    调用方式,如下:

     string strJSON = WeixinTemplateHelper.GetJoinMember(weiXinAccount.User.Userid, weiXinAccount.UserName, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), SiteConfigManager.GetConfigStringByKey("weixinH5Domain"));//这里是获取数据库中保存的模板信息组装成接口需要发送的格式
                        if (strJSON != "")
                        {                       
                            WeixinTemplateHelper.SendMessage(strJSON);//调用微信接口发送
                        }

    组装为微信标准格式的信息

    ///组装为微信标准格式的信息
     public static string GetJoinMember(long UserID, string MemberNO, string JoinTime, string Url = "")
            {
                string UserAccount = "";
                if (IsWeiXinUser(UserID, ref UserAccount))//获取用户在微信中OpeId信息
                {
                    WeiXinMsgConfig model = new WeiXinMsgConfigBLL().GetModelByTemplateNO(WeixinTemplateType.ChengWeiHuiYuan);//这里我是将自定义模板信息保存到数据的,后台做了一个管理,这个方法是获取我配置的推送消息模板
                    if (model.IsSend == 0)
                    {
                        return "";
                    }
                    var obj = new
                    {
                        touser = UserAccount,
                        template_id = model.TemplateID,
                        url = Url,
                        topcolor = "#FF0000",
                        data = new
                        {
                            first = new { value = model.TemplateFirst, color = "#173177" },
                            keyword1 = new { value = MemberNO, color = "#173177" },
                            keyword2 = new { value = JoinTime, color = "#173177" },
                            remark = new { value = model.TemplateRemark, color = "#173177" }
                        }
                    };               
                    return obj.GetJsonByObj();
                }
                else
                {
                    return "";
                }
            }

    发送组装的信息给指定的用户

      //发送组装的信息给指定的用户
       public static string SendMessage(string JsonData)
            {
                try
                {
                    HttpClientHelper httpclient = new HttpClientHelper();
                    string strUrl = string.Format(CommonUtilities.H5Constants.WeixinApi.WeiXinSendMessage, GetAccess_Token(appid, appsecret));//根据微信的接口请求组装相应的路径
                    string strResult = httpclient.SendPostRequest(strUrl, JsonData);//通过Post请求访问接口
                    return WebHelper.ParseFormJson<SendMessageResult>(strResult).errmsg;//获取返回信息
                }
                catch (Exception ex)
                {
                    return ex.Message;
                }
            }

    获取微信的Access_Token

    //获取微信的Access_Token
     public static string GetAccess_Token(string appID, string appSecret)
            {
                //if (appID == appid && appSecret == appsecret && access_token != "" && (DateTime.Now - access_token_time).Seconds < 7000)
                //{
                //}
                //else
                //{
    
                DataRow dr = new DeveloperInfoDAL().GetDeveloperInfo(CommonUtilities.DataBase.DataFactory.CreateDataBase());//这是获取保存在数据中微信公众号的appID和appSecret 
                appid = dr != null ? dr["AppId"].ToString() : "";
                appsecret = dr != null ? dr["AppSecret"].ToString() : "";
    
                HttpClientHelper httpclient = new HttpClientHelper();
                httpclient.Url = string.Format(CommonUtilities.H5Constants.WeixinApi.WeixinMenuGetAccessToken, appID, appSecret);//组装获取Access_Token的接口访问路径
                string strResult = httpclient.GetString();//采用GET请求访问接口
                access_token = WebHelper.JSONToObject<TokenResult>(strResult).access_token;
                access_token_time = DateTime.Now;
                //}
                return access_token;
            }

    需要的基础方法的封装实现

          /// <summary>
            /// 发起一个POST类型的Web请求,并返回响应
            /// </summary>
            /// <param name="requestUri">请求地址</param>
            /// <param name="jsonData">json数据包</param>
            /// <returns>响应</returns>
            public string SendPostRequest(string requestUri, string jsonData)
            {
                if (requestUri.IfNull().ToLower().Trim().StartsWith("https"))
                {
                    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
                }
                HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(requestUri);
                byte[] data = Encoding.UTF8.GetBytes(jsonData);
                httpWebRequest.Method = "POST";
                httpWebRequest.ContentType = "application/x-www-form-urlencoded";
                httpWebRequest.ContentLength = data.Length;
                httpWebRequest.KeepAlive = true;
    
                using (var requestStream = httpWebRequest.GetRequestStream())
                {
                    requestStream.Write(data, 0, data.Length);
                }
    
                HttpWebResponse response = (HttpWebResponse)httpWebRequest.GetResponse();
                Stream responseStream = response.GetResponseStream();
                StreamReader reader = new StreamReader(responseStream, Encoding.UTF8);
                string content = reader.ReadToEnd();
                reader.Close();
                responseStream.Close();
                response.Close();
                return content;
            }
     /// <summary>
            /// 发出一次新的请求,并以字节数组形式返回回应的内容
            /// 调用此方法会触发StatusUpdate事件
            /// </summary>
            /// <returns>包含回应主体内容的字节数组</returns>
            public byte[] GetBytes()
            {
                HttpWebResponse res = GetResponse();
                int length = (int)res.ContentLength;
    
                MemoryStream memoryStream = new MemoryStream();
                byte[] buffer = new byte[0x100];
                Stream rs = res.GetResponseStream();
                for (int i = rs.Read(buffer, 0, buffer.Length); i > 0; i = rs.Read(buffer, 0, buffer.Length))
                {
                    memoryStream.Write(buffer, 0, i);
                    OnStatusUpdate(new StatusUpdateEventArgs((int)memoryStream.Length, length));
                }
                rs.Close();
    
                return memoryStream.ToArray();
            }
    
            /// <summary>
            /// 发出一次新的请求,以Http头,或Html Meta标签,或DefaultEncoding指示的编码信息对回应主体解码
            /// 调用此方法会触发StatusUpdate事件
            /// </summary>
            /// <returns>解码后的字符串</returns>
            public string GetString()
            {
                byte[] data = GetBytes();
                string encodingName = GetEncodingFromHeaders();
    
                if (encodingName == null)
                    encodingName = GetEncodingFromBody(data);
    
                Encoding encoding;
                if (encodingName == null)
                    encoding = defaultEncoding;
                else
                {
                    try
                    {
                        encoding = Encoding.GetEncoding(encodingName);
                    }
                    catch (ArgumentException)
                    {
                        encoding = defaultEncoding;
                    }
                }
                return encoding.GetString(data);
            }
    展开全文
  • template_id也要一致请严格参考微信文档里的JSON格式POST数据说明POST数据示例如下: { "touser":"OPENID", "template_id":"ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izE...

    报错后检查了一下字段,发现必须严格按照官方提供的格式

    其中openId是对应的touser;template_id也要一致

    请严格参考微信文档里的JSON格式

    POST数据说明

    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":"39.8元",
                           "color":"#173177"
                       },
                       "keynote3": {
                           "value":"2014年9月22日",
                           "color":"#173177"
                       },
                       "remark":{
                           "value":"欢迎再次购买!",
                           "color":"#173177"
                       }
               }
           }
    

    参数说明

    参数是否必填说明
    touser接收者openid
    template_id模板ID
    url模板跳转链接
    miniprogram跳小程序所需数据,不需跳小程序可不用传该数据
    appid所需跳转到的小程序appid(该小程序appid必须与发模板消息的公众号是绑定关联关系)
    pagepath所需跳转到小程序的具体页面路径,支持带参数,(示例index?foo=bar)
    data模板数据
    color模板内容字体颜色,不填默认为黑色


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

    展开全文
  • 今天又遇到个奇葩问题 发送模板消息的时候 返回40001 但所有的配置信息没有错!本地调试也通过,放到服务器就40001 原来是微信公众号白名单没配置服务器ip 加上就好了 返回40001误导我好久...
  • 批量给用户发送模板消息,部分用户失败,贴一下返回结果的log: 最后找到官方的解释: 我是在多个服务器多个域名下使用同一个微信公众号做的测试,所以会有这个问题。 转载于:htt...
  • 为支撑公司业务,需要使用微信模板消息,于是乎进行了下相关的调研,现将调研内容进行如下记录。 首先微信模板消息没有创建模板消息的接口。更新模板消息有两种方式(个人理解): 1、修改行业,然后选择微信...
  • 收到很多童鞋的咨询,利用微信公众号的接口能不能给某个用户发送消息呢,如果说直接发送呢那还真有些限制,一个是客服消息接口,但是这个需要用户在48小时内和公众号有互动才可以发送。另外一个就是微信模板消息,...
  • 最近在做企业微信公众开发,其实是简单的做一个服务号群发和针对性发送消息给关注用户的功能,相对于客服消息和群发消息,模板消息无疑是最符合需求的。 这里直接上代码把: &lt;?php header('content-type:...
  • 第一步,在微信公众平台添加模板第二步,根据所需JSON创建封装实体类微信模板消息发送APIhttps://mp.weixin.qq.com/wiki?t=resource/res_main&amp;id=mp1433751277所需要的JSON格式,这个要根据自己选中的模板来定...
  • 微信开发消息模板

    2017-10-20 12:05:38
    正如许多推送一样,微信也友好的给广大开发者提供了“模板消息”,比推送更好的是,它能借助海量用户的微信平台直接通过服务号以短消息形式传达给用户,大大提高了运营的可能性。比如我们现在可以完全抛开银行卡的...
  • 发送微信模板消息,大体分为两步,如下:1.获取基础支持的access_token;2.发送模板消息;代码如下:/** * 用户注册成功的模板消息 */ public void registTemplate(UserExtend user, String openid, String appId, ...
  •  本篇文章博主主要是想和大家分享PHP实现微信模板消息推送的问题,下面我们就一块来看一下PHP如何实现微信模板消息推送,文章有具体的代码展现,具有一定的参考价值,对微信开发感兴趣的小伙伴们可以参考一下。...
  • 讲一下开发项目中微信公众号发送模板消息的实现过程(我用的还是Thinkphp5.0)。先看一下效果,如图:就是类似于这样的,下面讲一下实现过程:第一步:微信公众号申请模板消息权限:立即申请:申请过程就不说了,提交...
  • 微信公众平台模板消息开发是子恒老师《子恒说微信开发》视频教程的第14部。详细讲解了用php开发微信公众平台模板消息。内容包含设置模板所属行业,获取微信模板ID,用公众号发送微信模板消息等等。欢迎反馈,微信号...
  • 模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等。不支持广告等营销类消息以及其它所有可能对用户造成骚扰的消息。对于一般的服务号而言,...
  • 发送模板消息也叫业务通知,听起来虽然有点陌生,但是在生活当中是经常见到的。这一次,我们直接来看个效果。如上图所示,在我们的生活中,无论是微商城消费,还是日常生活消费,都可能收到这种提示,比如订单通知,...
  • 在公司微信项目开发中,我主要负责消息中心的模板消息接口设计实现。主要是将微信公众号的推送模板消息功能放到公司的消息中心系统中,微信后台项目通过RMI调用接口,实现推送功能。在这里记录总结下当时的设计实现...
  • 代码发送模板消息 { touser: 'openidxxxxxx', template_id: '模板idxxxxx', url: 'https://www.baidu.com', data: { first: { value: '恭喜您获得XXX全额奖学金!\n' }, keyword1:...
1 2 3 4 5 ... 20
收藏数 10,649
精华内容 4,259