模板消息_模板消息发送 - CSDN
精华内容
参与话题
  • 微信公众号开发之发送模板消息

    万次阅读 多人点赞 2018-11-10 13:06:36
    在我们做微信公众号开发时,发送模板消息往往是必不可少的功能。今天我们就来说说吧! 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

     

    展开全文
  • 微信公众号模板消息管理

    万次阅读 2017-09-22 08:48:56
    模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等。不支持广告等营销类消息以及其它所有可能对用户造成骚扰的消息。本文主要介绍基于C#开发...

    通过模板消息接口,公众号能向关注其账号的用户发送预设模板的消息。模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等。不支持广告等营销类消息以及其它所有可能对用户造成骚扰的消息。本文主要介绍基于C#开发实现公众号模板消息的管理功能。

    “模板消息功能的推出,将极大地增强服务号的服务通知能力”,在一些一直期待微信模板消息功能开放的公众号运营者看来,微信一对一沟通的社交属性,让信息推送的触达率更加精准,这也让企业在成本、服务效率、性能上有了不少优势,不仅丰富了企业的服务形式,增强用户的互动和粘性,还能为用户带来更多元、丰富、及时的服务体验。

    1、模板的行业分类管理及说明

    模版信息依行业进行划分,并根据使用场景不同设计了不同的模版,如软件行业下就有报名成功通知、看房提醒、订单提醒、会员充值、会员消费通知等各种场景下可能使用到的模版。

    如果我们公众号需要使用模板,那么我们需要从模板库里面添加所需的模板(目前数量上限为15个)。模板添加到我的模板后,每个模板就生成了一个随机值,也就是【模板ID】,我们发送信息,就是依照这个模板ID进行发送的。

    每个模板里面有详细的参数说明,以及示例效果。

    微信团队相关负责人表示:模板消息的开放主要是为了帮助公众号完成闭环服务,现有的公众号,主动发消息能力有限(每月可群发四条消息),这让许多企业无法向用户推送服务结果等消息的主动通知。模板消息开放后,企业可以借助微信平台,运用模板消息,在外部服务和内部管理过程中,让信息的触达更为迅捷,为用户提供更加周到的服务。

    微信一直在不断优化用户体验,模板消息的开放,为企业提供了更多的基础能力,比如更丰富的双向互动,更精准的信息提醒等,这些都提升了企业精品化、个性化服务的深度和广度,这也是为什么金融、民航、政务等多领域的机构、企业都期待微信开放模板消息功能的原因。未来,随着模板消息功能的进一步完善,或许企业员工工资明细、住户每月用电量、电费等用电详单,甚至是驾驶证到期需更换等,都能通过企业、部门机构微信公众帐号的模板消息即时传递给相应用户。

    2、使用模板消息进行开发

    前面介绍了模板的相关信息以及单个模板的介绍,我们如果需要在后台程序中集成模板消息发送的话,那么我们需要了解模板消息的API有那些?如何利用模板消息的API进行消息发送?

    我们先来看看模板消息使用的说明:

    1、所有服务号都可以在功能->添加功能插件处看到申请模板消息功能的入口,但只有认证后的服务号才可以申请模板消息的使用权限并获得该权限;
    2、需要选择公众账号服务所处的2个行业,每月可更改1次所选行业;
    3、在所选择行业的模板库中选用已有的模板进行调用;
    4、每个账号可以同时使用15个模板。
    5、当前每个模板的日调用上限为10万次【2014年11月18日将接口调用频率从默认的日1万次提升为日10万次,可在MP登录后的开发者中心查看】。

    模板消息的管理功能有:

      1 设置所属行业
      2 获得模板ID
      3 发送模板消息
      4 事件推送

    2.1设置所属行业

    设置行业可在MP中完成,每月可修改行业1次,账号仅可使用所属行业中相关的模板,为方便第三方开发者,提供通过接口调用的方式来修改账号所属行业,具体如下:

    接口调用请求说明

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

    POST数据说明

    POST数据示例如下:

          {
              "industry_id1":"1",
              "industry_id2":"4"
           }

    根据说明,我们可以定义一个接口类ITemplateMessageApi,然后定义设置所属行业的接口函数如下所示:

    复制代码
            /// <summary>
            /// 设置所属行业
            /// </summary>
            /// <param name="accessToken"></param>
            /// <param name="industry_id1">公众号模板消息所属行业编号(主营行业)</param>
            /// <param name="industry_id2">公众号模板消息所属行业编号(副营行业)</param>
            /// <returns></returns>
            CommonResult SetIndustry(string accessToken, IndustryCode industry_id1, IndustryCode industry_id2);
    复制代码

    而为了方便,我们定义IndustryCode为一个枚举对象,里面列出了系统支持的所有行业代码,如下所示。

    而实现代码和之前的函数处理类似,都是POST数据到一个连接即可,并解析返回的结果就可以了,具体实现代码如下所示。

    复制代码
            /// <summary>
            /// 设置所属行业
            /// </summary>
            /// <param name="accessToken">访问凭证</param>
            /// <param name="industry_id1">公众号模板消息所属行业编号(主营行业)</param>
            /// <param name="industry_id2">公众号模板消息所属行业编号(副营行业)</param>
            /// <returns></returns>
            public CommonResult SetIndustry(string accessToken, IndustryCode industry_id1, IndustryCode industry_id2)
            {
                var url = string.Format("https://api.weixin.qq.com/cgi-bin/template/api_set_industry?access_token={0}", accessToken);
                var data = new
                {
                    industry_id1 = (int)industry_id1,
                    industry_id2 = (int)industry_id2
                };
                string postData = data.ToJson();
    
                return Helper.GetExecuteResult(url, postData);
            }
    复制代码

    2.2 获得模板ID

    获得模板ID,也就是从模板库里面添加对应的模板消息到我的模板里面。

    从行业模板库选择模板到账号后台,获得模板ID的过程可在MP中完成。为方便第三方开发者,提供通过接口调用的方式来修改账号所属行业,具体如下:

    接口调用请求说明

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

    POST数据说明

    POST数据示例如下:

          {
               "template_id_short":"TM00015"
           }

    C#函数实现代码如下所示:

    复制代码
            /// <summary>
            /// 获得模板ID.
            /// 从行业模板库选择模板到账号后台,获得模板ID的过程可在MP中完成。
            /// </summary>
            /// <param name="accessToken">访问凭证</param>
            /// <param name="template_id_short">模板库中模板的编号,有“TM**”和“OPENTMTM**”等形式</param>
            /// <returns></returns>
            public AddTemplateResult AddTemplate(string accessToken, string template_id_short)
            {
                var url = string.Format("https://api.weixin.qq.com/cgi-bin/template/api_add_template?access_token={0}", accessToken);
                var data = new
                {
                    template_id_short = template_id_short
                };
                string postData = data.ToJson();
    
                return JsonHelper<AddTemplateResult>.ConvertJson(url, postData);
            }
    复制代码

    2.3 发送模板消息

    根据上面小节处理,添加到我的模板里面的操作得到的模板ID,我们就可以调用发送模板消息的API进行模板消息发送了。

    接口调用请求说明

    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",
               "topcolor":"#FF0000",
               "data":{
                       "first": {
                           "value":"恭喜你购买成功!",
                           "color":"#173177"
                       },
                       "keynote1":{
                           "value":"巧克力",
                           "color":"#173177"
                       },
                       "keynote2": {
                           "value":"39.8元",
                           "color":"#173177"
                       },
                       "keynote3": {
                           "value":"2014年9月16日",
                           "color":"#173177"
                       },
                       "remark":{
                           "value":"欢迎再次购买!",
                           "color":"#173177"
                       }
               }
           }

    根据上面的JSON参数,我们可以看到,有部分是模板消息公共的部分,有部分则是模板消息的具体参数,这些参数需要根据不同的模板进行不同的赋值。

    如这部分是共同的:

       touser":"OPENID",
       "template_id":"ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY",
       "url":"http://weixin.qq.com/download",
       "topcolor":"#FF0000",

    根据这个特点,我们定义发送模板消息的接口如下所示:

    复制代码
            /// <summary>
            /// 模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等。
            /// 不支持广告等营销类消息以及其它所有可能对用户造成骚扰的消息。
            /// </summary>
            /// <param name="accessToken">访问凭证</param>
            /// <param name="openId">账号的openID</param>
            /// <param name="templateId">在公众平台线上模板库中选用模板获得ID</param>
            /// <param name="data">模板的变化参数数据</param>
            /// <param name="url">,URL置空,则在发送后,点击模板消息会进入一个空白页面(ios),或无法点击(android)。</param>
            /// <param name="topcolor">顶部颜色,默认为#173177</param>
            /// <returns></returns>
            SendMassMessageResult SendTemplateMessage(string accessToken, string openId, string templateId, object data, string url, string topcolor = "#173177");
    复制代码

    我们用object data来定义模板的变化参数数据。

    具体的实现还是和前面的方法提交数据处理差不多,代码如下所示。

    复制代码
            /// <summary>
            /// 模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等。
            /// 不支持广告等营销类消息以及其它所有可能对用户造成骚扰的消息。
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="accessToken">访问凭证</param>
            /// <param name="openId"></param>
            /// <param name="templateId">在公众平台线上模板库中选用模板获得ID</param>
            /// <param name="data"></param>
            /// <param name="url">,URL置空,则在发送后,点击模板消息会进入一个空白页面(ios),或无法点击(android)。</param>
            /// <param name="topcolor"></param>
            /// <returns></returns>
            public SendMassMessageResult SendTemplateMessage(string accessToken, string openId, string templateId, object data, string url, string topcolor = "#173177")
            {
                var postUrl = string.Format("https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={0}", accessToken);
                var msgData = new TemplateData()
                {
                    touser = openId,
                    template_id = templateId,
                    topcolor = topcolor,
                    url = url,
                    data = data
                };
                string postData = msgData.ToJson();
    
                SendMassMessageResult result = JsonHelper<SendMassMessageResult>.ConvertJson(postUrl, postData);
                return result;
            }
    复制代码

    发送模板的消息相对其他两个接口的使用复杂一些,例如我以一个会员通知的模板消息为例,模板的详细情况如下:

    具体的测试代码如下所示。

    复制代码
                #region 发送模板消息
    
                var data = new
                {
                    //使用TemplateDataItem简单创建数据。
                    first = new TemplateDataItem("您好,您已成为微信【广州爱奇迪】会员。"),
                    type = new TemplateDataItem("18620292076"),
                    address = new TemplateDataItem("广州市白云区广州大道北"),
                    VIPName = new
                    {
                        //使用new 方式,构建数据,包括value, color两个固定属性。
                        value = "伍华聪",
                        color = "#173177"
                    },
                    VIPPhone = new TemplateDataItem("18620292076"),
                    expDate = new TemplateDataItem("2016年4月18日"),
                    remark = new TemplateDataItem("如有疑问,请咨询18620292076。", "#173177"),
                };
    
                #endregion
                string url = "http://www.iqidi.com";
                string topColor = "#173177";
    
                string templateId = "-5LbClAa9KUlEmr5bCSS0rxU_I2iT16iYBDxCVU1iJg";
                SendMassMessageResult sendResult = api.SendTemplateMessage(token, openId, templateId, data, url, topColor);
                if(sendResult != null)
                {
                    Console.WriteLine(sendResult.msg_id);
                }
    复制代码

    那么我们得到的提示效果如下所示。

    微信模板消息,能够让我们与客户之间沟通不受每月几条数量的限制,同时也能够利用微信模板库丰富的内容,实现强大的应用场景。

    展开全文
  • 微信消息模板详解

    千次阅读 2018-05-07 15:47:56
    用户的微信就会收到相关的消息通知前提条件:您的微信公众号(服务号)必须已经成功完成与《163K地方门户系统》的微信登录设置配置流程1、进入微信公众号平台-添加功能插件-添加“模板消息” 2、在模板消息 中 选择...
    效果:当用户从微信公众号登陆了网站,用户的微信就会收到相关的消息通知


    前提条件:
    您的微信公众号(服务号)必须已经成功完成与《163K地方门户系统》的微信登录设置

    配置流程

    1、进入微信公众号平台-添加功能插件-添加“
    模板消息”
     
    2、在模板消息 中 选择行业(务必和下图选择一致!)
     

    3、从模板库中添加模板 
     
    可以直接按名称进行搜索,填写好模板名称,点击后面的放大镜 即可搜索,下面会列出搜索结果
     
    在搜索结果中 点 详情 ,进入模板详情页面,进行添加
     

    4、依次在模板库的搜索下面标题的模板进行添加(务必与下述完全一致)

    审核结果提醒 
    订单外送通知
    订单提交成功通知
    会员评价通
    兑换券消费成功提醒
    外卖单下单成功提醒
    收到新订单通知
    活动报名成功通知
    成为会员通知
    订单状态通知
    购买成功通知
    订单取消通知
    订单配送提醒

    完全添加完成后,我的模板页面 如下图
     

       
    然后在信息通知系统中对应填写上您的微信模板ID
     

    微信模板与信息通知系统项目对应关系:
    添加模板时请搜索 模板标题  下面说明中对应的模板编号仅搜索结果中区分选择哪一个,而不能用于搜索
    审核结果提醒             (微信模板库中按名称搜索结果中的模板编号:OPENTM400144478)           (对应信息通知系统通知项目编号:20  30 33  40  41  42  50  60  83  130 150  160  170  180
    订单外送通知             (微信模板编号:OPENTM401692486)         (对应信息通知系统通知项目编号:71
    订单提交成功通知       (微信模板编号:OPENTM201430842 )         对应信息通知系统通知项目编号:102 70 
    会员评价通                (微信模板编号:OPENTM204739462 )          (对应信息通知系统通知项目编号:61  81  106 
    兑换券消费成功提醒   (微信模板编号:OPENTM201131436 )           对应信息通知系统通知项目编号:107 
    外卖单下单成功提醒   (微信模板编号:OPENTM200781461 )          (对应信息通知系统通知项目编号: 暂无
    收到新订单通知         (微信模板编号:TM00533 )                 (对应信息通知系统通知项目编号:100 
    活动报名成功通知      (微信模板编号:OPENTM201163998 )  (对应信息通知系统通知项目编号: 140
    成为会员通知            (微信模板编号: TM00053)                 (对应信息通知系统通知项目编号:
    订单状态通知            (微信模板编号:TM00857 )                 (对应信息通知系统通知项目编号:73 74  104 
    购买成功通知            (微信模板编号:TM00050 )                 (对应信息通知系统通知项目编号:103 
    订单取消通知            (微信模板编号:OPENTM200833809 )  (对应信息通知系统通知项目编号:78  79 
    订单配送提醒            (微信模板编号:OPENTM201677281 )  (对应信息通知系统通知项目编号: 105  76



    请注意:微信公众平台新规则: 新申请用户 请在公众平台 配置 安全中心 添加IP白名单 ,否则将可能无法收到微信消息通知


    展开全文
  • 模板消息( 自己项目 )

    千次阅读 2018-05-08 15:28:26
    1. 在控制器或者model里面调用model里下面这个方法//到账提醒 public function filmquantity($cardid,$mvnum){ try { $mMsg=new MmsgModel(); $ret=$mMsg-&gt;accountnotice($cardid,$mvnum);...

    1. 在控制器或者model里面调用model里下面这个方法

    //到账提醒
       public function filmquantity($cardid,$mvnum){
            try {
                $mMsg=new MmsgModel();
                $ret=$mMsg->accountnotice($cardid,$mvnum);

                if ($ret){//生成成功
                    //调用后台发送通知
                    GetData2(Constants::serverHTTP."admin/SendWxTplMsg?id=".$ret);
                }

                response($ret, Constants::RESPONESE_SUCCESS, '');
            } catch (Exception $e) {
                response_catch($e);
            }

        }


    2. 这个方法调用了MmsgModel里的accountnotice方法(这一步在准备数据,然后调用了wxMsg公共方法,在functions.php)

    //到账提醒
        public function accountnotice($cardid,$mvnum){
            $res=M('acard')->field('fdcNick')->where(['ID'=>$cardid])->select();
            if($res) {
                $data = [
                    'key1' => '您好!您领取的的电影票已到账!',//标题
                    'key2' => $res[0]['fdcNick'],//订单号
                    'key3' => $mvnum . '张',//订单类型
                    'key4' => date('Y-m-d H:i:s'),//订单说明
                    'key5' => '请点击进入预约界面!当前电影票需预约后才可观看!',//备注
                ];
            }
            //模版消息确认url 需要全写 http://yc.wzjo2o.com

             $url="http://yc.wzjo2o.com/index/goto?url=".urlencode('mine/gift?shopID=all');
             $ret =wxMsg(1102,$cardid,$data,$url);
             return $ret;

        }


    3. wxMsg公共方法先从数据库取出模板(这个是对应微信上的格式[写法在5]手动添加到数据库的), 然后把模板里面固定的字替换成刚刚上方准备的数据. 然后回到最外面的(model里的 filmquantity方法 )方法调用GetData2公共方法(写法在下方)去调用后台发送消息模板.

    /*
     *  消息模板
     */
    function wxMsg($type,$cardid,$keys,$url){
        $data=M('aformat')->where('id='.$type)->find();        //取出模板
        if($data){
            $format=$data['fdcFormat'];
            //标题&订单号&订单类型&订单说明&备注
            //电影票发放确认消息
            if($type==1101) {
                $format = str_replace('[标题]', $keys['key1'], $format);
                $format = str_replace('[订单号]', $keys['key2'], $format);
                $format = str_replace('[订单类型]', $keys['key3'], $format);
                $format = str_replace('[订单说明]', $keys['key4'], $format);
                $format = str_replace('[备注]', $keys['key5'], $format);
            }
            //标题&账户名&数量&时间&备注
            //电影票到账确认消息
            else if($type==1102) {
                $format = str_replace('[标题]', $keys['key1'], $format);
                $format = str_replace('[账户名]', $keys['key2'], $format);
                $format = str_replace('[数量]', $keys['key3'], $format);
                $format = str_replace('[时间]', $keys['key4'], $format);
                $format = str_replace('[备注]', $keys['key5'], $format);
            }
            else if($type==1103) {
                $format = str_replace('[标题]', $keys['key1'], $format);
                $format = str_replace('[消费项目]', $keys['key2'], $format);
                $format = str_replace('[消费时间]', $keys['key3'], $format);
                $format = str_replace('[备注]', $keys['key4'], $format);
            }
            else if($type==1104) {
                $format = str_replace('[标题]', $keys['key1'], $format);
                $format = str_replace('[活动]', $keys['key2'], $format);
                $format = str_replace('[奖品]', $keys['key3'], $format);
                $format = str_replace('[时间]', $keys['key4'], $format);
                $format = str_replace('[备注]', $keys['key5'], $format);
            }
            else if($type==1105) {
                $format = str_replace('[标题]', $keys['key1'], $format);
                $format = str_replace('[到账时间]', $keys['key2'], $format);
                $format = str_replace('[到账金额]', $keys['key3'], $format);
                $format = str_replace('[收益产品]', $keys['key4'], $format);
                $format = str_replace('[备注]', $keys['key5'], $format);
            }
            else if ($type==101) {
                $format = str_replace('[金额]', $keys['key1'], $format);
                $format = str_replace('[时间]', date('y-m-d H:i:s', time()), $format);
                // $format = str_replace('[佣金类型]', $keys['key2'], $format);
                $format = str_replace('[备注]', $keys['key2'], $format);
            }else if ($type==102){    // 邀请注册成功
                $format = str_replace('[会员昵称]', $keys['key1'], $format);
                $format = str_replace('[会员幸运号]', $keys['key2'], $format);
                $format = str_replace('[时间]', date('y-m-d H:i:s', time()), $format);
            }else if ($type==103){    //收益提醒
                $format = str_replace('[标题]', $keys['first'], $format);
                $format = str_replace('[收益类型]', $keys['key1'], $format);
                $format = str_replace('[收益时间]', date('y-m-d H:i:s', time()), $format);
            }else if ($type==104){    //拼团成功
                $format = str_replace('[标题]', $keys['key1'], $format);
                $format = str_replace('[名称]', $keys['key2'], $format);
                $format = str_replace('[价格]', $keys['key3'], $format);
                $format = str_replace('[人数]', $keys['key4'], $format);
                $format = str_replace('[备注]', $keys['key5'], $format);
            }else if ($type==105){    //订单状态变更
                $format = str_replace('[标题]', $keys['key1'], $format);
                $format = str_replace('[订单编号]', $keys['key2'], $format);
                $format = str_replace('[订单状态]', $keys['key3'], $format);
                $format = str_replace('[备注]', $keys['key4'], $format);
            }else if ($type==106){    //兑换券使用通知
                $format = str_replace('[优惠标题]', '优惠标题', $format);
                $format = str_replace('[名称]', $keys['key1'], $format);
                $format = str_replace('[编号]', $keys['key2'], $format);
                $format = str_replace('[数量]', '1张', $format);
                $format = str_replace('[备注]', $keys['key3'], $format);
            }else{
                throw new Exception('模版消息设置出错!', 0 );
            }

            $ins=[
                'fdbWx'=>1,
                'fdlFormatID'=>$type,
                'fdcTplID'=>$data['fdcTplID'],
                'fdiType'=>$data['fdiType'],
                'fdcTitle'=>$data['fdcName'],
                'fdlCardID'=>$cardid,
                'fdtMsg'=>$format,
                'fdcUrl'=>$url,
                'created_at'=>date('Y-m-d H:i:s')
            ];
            $ret=M('mmsgdetail')->add($ins);
            return $ret;
        }else{
            throw new Exception('模版消息设置出错!', 0 );
        }

    }


    4. GetData2公共方法的写法

    function GetData2($url){
        $ch = curl_init($url);// 初始化一个 cURL 对象


        curl_setopt($ch, CURLOPT_RETURNTRANSFER,1) ;
        curl_setopt($ch, CURLOPT_TIMEOUT,1) ; //设置为1 异步执行
        curl_setopt ( $ch, CURLOPT_HEADER, 0);    //设置请求选项


        curl_setopt($ch, CURLOPT_BINARYTRANSFER, true) ;//在启用 CURLOPT_RETURNTRANSFER 时候将获取数据返回
        $output = curl_exec($ch);//执行Curl会话获取相关回复
        curl_close($ch);//释放Curl 句柄, 关闭Cur会话
        if (empty($output)) { return ;}
        $result = json_decode($output,true);
        return $result;

    }

    5.GetData2(Constants::serverHTTP."admin/SendWxTplMsg?id=".$ret);         //通过GetData2这个方法可调用后台的admin控制器里SendWxTplMsg这个方法, 

    //调用api发送消息
        public function SendWxTplMsgAction()
        {
            $get=I('get.');
            $id=$get['id'];
            $msg=new AdminModel();

            $interval=3;//秒钟 
            $ret=true;
            while($ret){
                $ret=$msg->SendWxTplMsg($id); 
                $id=null;                                                     //为了把以前没发的也发出去
                if ($ret==false) break;
                sleep($interval);
            };
            response($ret, Constants::ERROR_CODE, '列表数据');

        }


    6. 在这个model里面调用微信插件发送模板消息

    public function SendWxTplMsg($id = "")
        {
            try {
                
                $where = [
                    'fdbWx' => 1,
                    'fdiSend' => 0,
                ];
                if ($id) {
                    $where['ID'] = $id;
                }
                sleep(8);       //等待8秒,不然数据没建好
                $data = M('mmsgdetail')->where($where)->field(['ID', 'fdlCardID', 'fdtMsg', 'fdcTplID', 'fdcUrl'])->find();

                if ($data) {
                    M('mmsgdetail')->where(['ID' => $data['ID']])->save(['fdiSend' => 1]);
               $res = wechat()->tplMsg($data['fdlCardID'], json_decode($data['fdtMsg'], true), $data['fdcTplID'], $data['fdcUrl']);            //在这里调用微信插件发送模板消息
                    if ($res['errmsg'] != 'ok') {
                        M('mmsgdetail')->where(['ID' => $data['ID']])->save(['fdiSend' => 2, 'updated_at' => date('Y-m-d H:i:s')]);
                    }
                    $this->MmsgtoBase($data['ID']);
                    return true;
                }else{
                    return false;
                }


            } catch (Exception $e) {
                return true;
                //发送有问题
                M('mmsgdetail')->where(['ID' => $data['ID']])->save(['fdiSend' => 3, 'updated_at' => date('Y-m-d H:i:s')]);
            }


        }



    7. 必须在微信上找微信一个模板消息, 然后在后台对应他才有效 , 先登录公众号 -> 功能 ->模板消息 ->从模板库里面用搜索找 -> 找到合适后点添加 ->然后手动添加到下面这张表



    建表:

        Schema::create('aformat', function (Blueprint $table) {
            $table->BigInteger('ID',true,false)->unique('aformat_PK');
            $table->bigInteger('fdiType')->comment('类型')->default(0);
            $table->bigInteger('fdbWx')->comment('0:平台自身消息  1:微信消息模板')->default(0);
            $table->string('fdcName',100)->comment('微信模板消息名称(对应微信标题)')->nullable();
            $table->string('fdcVar',255)->comment('微信需要替换的内容')->nullable();
            $table->string('fdcFormat',255)->comment('替换模板')->nullable();
            $table->string('fdcTplID',255)->comment('微信消息模板ID')->nullable();
            $table->string('fdcWxNo',20)->comment('微信消息模板编号')->nullable();
            $table->string('fdcWxMsg',200)->comment('微信消息模板详细内容')->nullable();
            $table->timestamps();

        });


        Schema::create('mMsgDetail', function (Blueprint $table) {
                $table->BigInteger('ID',true,false)->unique('mMsgDetail_PK');
                $table->boolean('fdbWx')->comment('是否为微信消息')->default(false); 
                $table->string('fdcTplID',255)->comment('模版ID')->nullable(); 
                $table->integer('fdiType')->comment('消息类型')->default(0);
                $table->string('fdlCardID',255)->comment('用户,0、系统消息')->index('mMsgDetail_idx')->nullable(); 
                $table->string('fdcTitle',255)->comment('消息标题')->nullable(); 
                $table->mediumText('fdtMsg')->comment('系统消息')->nullable(); 
                $table->integer('fdiSend')->comment('消息类型0:未处理 1:发送成功 2:发送失败')->default(0);
                $table->boolean('fdbRead')->comment('是否已读')->default(false); 
                $table->bigInteger('fdlFormatID')->comment('推广设置ID')->default(0);  
                $table->bigInteger('fdlSrcID')->comment('srcid')->default(0); 
                $table->string('fdcUrl',255)->comment('连接url')->nullable(); 
                $table->timestamps();
            });

    展开全文
  • 03_模板消息

    2019-07-31 01:24:08
    【发送模板消息简易流程】1.获取access_token 1.1 获取 AppID 和 AppSecret 1.2 按照微信小程序access_token特性来存储在服务端Redis(有效期7200秒,考虑网络延迟等影响,我们可以设置有效期7100秒)2.发送模板...
  • 发送模板消息也叫业务通知,听起来虽然有点陌生,但是在生活当中是经常见到的。这一次,我们直接来看个效果。如上图所示,在我们的生活中,无论是微商城消费,还是日常生活消费,都可能收到这种提示,比如订单通知,...
  • 最近小程序在码界里嫌弃腥风血雨,每一个码奴都感觉世界给自己又多开一个扇窗,...3.发送模板消息 1.写小程序消息模版第一步:配置消息推送 1.1 登录微信公众平台,选择左侧侧边栏==&amp;gt;设置=...
  • 小程序 发送模板消息的功能实现

    万次阅读 热门讨论 2019-07-17 08:40:57
    小程序开发的过程中,绝大多数会满足微信支付 那么,作为友好交互的体现,自然就会考虑到支付后的消息通知咯 所以,我的小程序项目也要求完成这个效果,so.分享一下自己的实现步骤,以方便道友们少踩点坑...
  • 微信公众号推送模板消息

    万次阅读 2018-01-03 12:12:10
    微信支付成功之后需要将一些订单相关的信息发送到用户的微信上,这时候就需要使用微信【模板消息】创建模板消息进入【微信·公众平台】在【功能】->【添加功能插件】中找到【模板消息】,之后填入相关的信息并通过...
  • 微信小程序实例:创建下发模板消息实例

    万次阅读 多人点赞 2017-01-13 16:14:47
    鉴于目前网络上都还找不到小程序下发模板消息的相关资源,在多次阅读了官方文档今天终于把小程序的模版消息给测通了,接下来介绍在不使用服务器的情况下,前端开发人员在本地怎么测试模板消息的发送。 1、在微信...
  • Java微信公众平台开发之发送模板消息

    万次阅读 多人点赞 2019-12-20 22:28:31
    模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等。不支持广告等营销类消息以及其它所有可能对用户造成骚扰的消息。对于一般的服务号而言,...
  • 微信公众号模板消息推送

    万次阅读 2018-06-19 14:03:13
    第一步,在微信公众平台添加模板第二步,根据所需JSON创建封装实体类微信模板消息发送APIhttps://mp.weixin.qq.com/wiki?t=resource/res_main&amp;id=mp1433751277所需要的JSON格式,这个要根据自己选中的模板来定...
  • 最近在做微信小程序,为了让用户能更加方便的获取到小程序内部的通知,便想着用模板消息来解决此类问题。首先介绍一下两种方法 第一种是传统的按照微信开发文档来实现模板消息的获取,首先要明确的是你要有一个第三...
  • 微信公众号模板消息的申请

    万次阅读 2018-08-08 18:48:06
    需要发送两种模板消息,两个模板消息关键字相同,开始和结束的描述略有差别,产品让确认申请模板消息时需要申请几个模板消息; 二、解决 只需要申请一个模板消息即可; 图一为申请的模板消息的模板内容,发送...
  • 微信模板消息跳转小程序

    万次阅读 2018-04-12 13:34:21
    id=mp1433751277模板消息接口模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等。不支持广告等营销类消息以及其它所有可能对用户造成骚扰的...
  • (Java)微信公众号发送模板消息

    千次阅读 2019-07-18 16:16:24
    模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等。不支持广告等营销类消息以及其它所有可能对用户造成骚扰的消息。 1、模板消息调用时主要...
  • 需求背景基于微信的通知渠道,微信小程序为开发者提供了可以高效触达用户的模板消息能力,在用户本人与小程序页面有交互行为后触发,通过微信聊天列表中的服务通知可快捷进入查看消息,点击查看详情还能跳转到下发...
  • 如何快速实现公众号群发模板消息

    千次阅读 2019-07-09 11:34:55
    自己开发群发模板消息的功能太复杂了,首先要开发用户系统获取用户openId,然后要开发多线程群发消息系统,业务逻辑复杂、开发难度大、运行不稳定、维护成本高,这些都是让大家对模板消息望而却步的主要原因。...
  • 尽管部分运营者还在传授如何运用模板消息召回用户的运营技巧,但对部分开发者而言,模板消息已经成了食之无味弃之可惜的存在。与其再在模板消息上下功夫,不如好好研究一下如何从「用户分享」和「最近使用」这些更...
  • 微信公众号为技术人员提供了开发接口,会代码的可以自己买服务器买域名开发,不会写代码、嫌麻烦、高成本,可以直接用微号帮平台,微信第三方平台。...进入模板消息群发界面,默认罗列了之前创建的模板消息记录...
1 2 3 4 5 ... 20
收藏数 152,269
精华内容 60,907
关键字:

模板消息