微信公众号开发:第四章 模板消息发送

1 说明

1.1 官方资源

模板消息官方技术文档提供了两部分说明,链接如下:

1.2 概述

  • 模板消息必须是认证过的服务号才能发送,其他账号类型均不可以发送
  • 模板消息需要事先在微信公众平台进行设置,每个公众号需要选择所处行业
  • 最多使用25个模板
  • 日调用限制10万次

模板消息的规范:

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

2 基本实现

2.1 创建模板

登陆公众号后台在模板消息界面进行添加,可按照页面指示进行操作。
开发时可在测试公众号内添加相关模板信息。

2.2 消息格式说明

模板接收地址:

https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN

以post的方式,将模板数据以json串的形式发送到该接口。
相关接口参数:

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

实际上,必传的只有 touser接收者,template_id模板id,data模板数据这3个参数,其他的可以不传,如果传了就会有相应的跳转,比如跳转至指定url,或者跳转至小程序。

2.3 发送消息

发送消息需要使用AccessToken,Raycom使用的WX-java包中已经内置了AccessToken的管理,可以直接使用。这里直接使用相关发送API即可:

 /**
       * <pre>
       * 发送模板消息
       * 详情请见:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277
       * API使用示例
       * 详情请见:https://github.com/Wechat-Group/WxJava/wiki/MP_%E5%8F%91%E9%80%81%E6%A8%A1%E6%9D%BF%E6%B6%88%E6%81%AF
       * 模板消息运营规范
       * 参见详情:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751288
       * </pre>
       *
       * @param templateData 模板主题消息,也可以放到msgData中,需要有toUser,templateId,url,weChatId 四个字段
       * @param msgData  模板字段,需要有msgFiled,msgValue,msgColor。
       * @return mp发送结果
       */
      public String sendTemplateMsg(RData templateData,ArrayList<RData> msgData) throws WxErrorException {
          if(msgData==null||msgData.size()==0) return "";
          if(templateData==null) templateData = msgData.get(0);
          
          //基于Lombok实现对象构造
          WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
                  .toUser(templateData.containsKey("toUser")?
                    templateData.getString("toUser"):null)
                  .templateId(templateData.containsKey("templateId")?
                    templateData.getString("templateId"):null)
                  .url(templateData.containsKey("url")?
                    templateData.getString("url"):null)
                  .build();
          
          for (RData msg : msgData) {
              templateMessage.addData(new WxMpTemplateData(
                                         msg.getString("msgFiled"),
                                         msg.getString("msgValue"),
                                         msg.getString("msgColor")));
        }
          
         return this.wxService
            .switchoverTo(templateData.getString("weChatId"))
            .getTemplateMsgService()
            .sendTemplateMsg(templateMessage);
      }
      
      /**
       *    将模板主题信息放到模板字段中。
       * @param msgData
       * @return
       * @throws WxErrorException
       */
      public String sendTemplateMsg(ArrayList<RData> msgData) throws WxErrorException {
         return sendTemplateMsg(null,msgData);
      }

即按照接口要求将数据分为两部分:

  • 基础配置部分:包括消息跳转URL,模板ID,用户的openId
  • 数据部分:消息字段名,字段内容,字段颜色

最后系统会自动将数据转为JSON格式,并调用相关方法进行推送,json参考格式如下:

{
       "touser":"OPENID",
       "template_id":"QI4JojaGvL9-5ynjwFwOSPqH2eWXHpr7ZeseysefKqc",
       "data":{
               "first": {
                   "value":"恭喜你购买成功!",
                   "color":"#173177"
               },
               "product":{
                   "value":"巧克力",
                   "color":"#173177"
               },
               "amount": {
                   "value":"39.8元",
                   "color":"#173177"
               },
               "time": {
                   "value":"2014年9月22日",
                   "color":"#173177"
               },
               "remark":{
                   "value":"欢迎再次购买!",
                   "color":"#173177"
               }
       }
}

发送成功后,会返回:

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

实际上开发的时候,只需两步:

  1. 设置模板
  2. 组装参数并调用发送API

3 相关知识

3.1 模板接口列表

3.1.1 设置所属行业

设置行业可在微信公众平台后台完成,每月可修改行业1次,帐号仅可使用所属行业中相关的模板,为方便第三方开发者,提供通过接口调用的方式来修改账号所属行业

3.1.2 获取获取设置的行业信息

获取帐号设置的行业信息。可登录微信公众平台,在公众号后台中查看行业信息。为方便第三方开发者,提供通过接口调用的方式来获取帐号所设置的行业信息

3.1.3 获取模板ID

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

3.1.4 获取模板列表

获取已添加至帐号下所有模板列表,可在微信公众平台后台中查看模板列表信息。为方便第三方开发者,提供通过接口调用的方式来获取帐号下所有模板信息

3.1.5 删除模板

删除模板可在微信公众平台后台完成,为方便第三方开发者,提供通过接口调用的方式来删除某帐号下的模板

3.1.6 发送模板消息

基于模板发送消息

3.1.7 事件推送

在模版消息发送任务完成后,微信服务器会将是否送达成功作为通知,发送到开发者中心中填写的服务器配置地址中。
返回的消息能够区分出发送成功还是被用户拒收以及其他原因发送失败

3.2 运营相关要求

3.2.1 模板消息内容限制

允许发的模板消息必须是用户接受过帐号主体提供过服务的,严禁用户未接受服务而向其推送模板消息。发送模板消息的前提是内容不涉及广告营销骚扰用户,主要是服务类消息以及通知提醒类。

3.2.2 模板审核标准

  • 符合上述允许发的模板消息里的各项要求。
  • 格式正确,模板标准格式(三段式模板)
  { {first.DATA} }
  关键词1:{ {keyword1.DATA} }           
  关键词2:{ {keyword2.DATA} }
  关键词3:{ {keyword3.DATA} }                       
  { {remark.DATA} }

3.2.3 模板内容要求

  1. 标题、关键词带有品牌或公司名等没有行业通用性的内容,不能通过
  2. 包括但不限于:某某公司服务通知、某某商品购买通知
  3. 标题不能带标点或其它特殊符号,且必须以“通知”或“提醒”结尾,否则不能通过包括不限于:领取红包!、天气提醒!
  4. 易被用作群发,标题或关键词不能简要说明具体服务行为或使用场景的模板不能通过包括但不限于:管理员类通知、公告类通知、系统通知
  5. 易对用户骚扰的,发送频率较高的模板不能通过包括但不限于:更新类通知、回复类通知、互动类通知
  6. 推广宣传、营销类的模板不能通过包括但不限于:红包类通知、优惠券类通知、活动类通知、积分类通知、奖励类通知
  7. 模板库里已存在类似的模板不通过

3.2.4 模板填写规则

  1. 模板内容长度不能超过200个字符,且必须有至少10个固定文字或标点
  2. 模版内容中,参数是可以在发送时赋值的,参数必须以“{ {”开头,以“.DATA} }”结尾)
  3. 内容示例是将模板内容中的参数分别举例后的模板内容的副本,必须严格填写,用以帮助审核人员详细理解模板的用途
  4. 参数中可以通过增加“n”,来实现换行,所以,一般建议将参数紧贴上一行,在需要时用“n”自行换行。通过该技巧,可以让模板消息的拓展能力变得非常强。
  5. 模版内容中,第一句话需要为礼貌性、称谓性的用语,这句话统一用{ {first.DATA} }参数来概括,以免此后称谓习惯等修改后,需修改模版。
  6. 容的中部必须为2到5个“关键词名称:关键词内容参数”(中文冒号)的组合排列,这样显示在微信客户端中体验最佳。
  7. 模版内容中,末尾必须有{ {remark.DATA} }参数,该参数的作用是,用户可以自行添加多行需要的内容。例如,模版中有姓名、时间这2个关键词,但你需要姓名、时间、地点3个,则可以将地点这个关键词的内容放入remark参数中(需要时可通过n来换行)。这样就达到了用remark参数来扩充关键词的作用,极大增强了模版的通用性。
  8. 直接相连在一起的参数,应简化为一个,避免模板内容过于复杂,因为赋值到两个参数中的内容可以简化地赋值到一个参数中。
  9. 为了保持行业通用性,模板标题和模板内容中,不允许带有品牌等关键词,以免影响通用性。
Last modification:June 28th, 2019 at 03:30 pm
If you think my article is useful to you, please feel free to appreciate