微信公众平台 发送模板消息(Java接口开发)


Posted in Javascript onApril 17, 2019

前言:最近一直再弄微信扫码推送图文消息和模板消息发送,感觉学习到了不少东西。今天先总结一下微信公众平台模板消息的发送。因为这个自己弄了很久,开始很多地方不明白,所以今天好好总结一下。

微信公众平台技术文档:模板消息接口

一、概述

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

关于使用规则,请注意:

1、所有服务号都可以在功能->添加功能插件处看到申请模板消息功能的入口,但只有认证后的服务号才可以申请模板消息的使用权限并获得该权限;
2、需要选择公众账号服务所处的2个行业,每月可更改1次所选行业;
3、在所选择行业的模板库中选用已有的模板进行调用;
4、每个账号可以同时使用25个模板。
5、当前每个账号的模板消息的日调用上限为10万次,单个模板没有特殊限制。【2014年11月18日将接口调用频率从默认的日1万次提升为日10万次,可在MP登录后的开发者中心查看】。当账号粉丝数超过10W/100W/1000W时,模板消息的日调用上限会相应提升,以公众号MP后台开发者中心页面中标明的数字为准。

关于接口文档,请注意:

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

看微信公众平台接口文档最开始我的内心是崩溃的,因为目录列表一开始就是设置所属行业,获取所属行业信息等。后来整理思路,我们主要负责的功能的实现,就不去考虑那么多其他的内容,直接弄模板消息的发送。但是发送模板之前有一个很重要的步骤,就是模板ID(template_id)。微信公众平台发送模板消息有严格的要求,参考模板消息运营规范。

二、模板消息的设计

这里是依靠微信公众平台测试公众号的模板消息接口来设计消息模板,通过行业类型来获取模板的同学还是参考微信公众平台的官方文档来学习。

1 新增模板消息

微信公众平台 发送模板消息(Java接口开发)

微信的测试公众号为我们提供了测试的消息模板,最多可添加10个(感觉够用,毕竟只是测试),新增测试模板。

微信公众平台 发送模板消息(Java接口开发)

(1)添加模板标题和模板内容

微信公众平台 发送模板消息(Java接口开发) 

模板标题比较好理解,模板内容需要设计参数,参数需以{{开头,以.DATA}}结尾。

例如:{{first.DATA}}

first就是我们接口传的参数。

{{first.DATA}} 
商品:{{keynote1.DATA}} 
价格:{{keynote2.DATA}} 
日期:{{keynote3.DATA}} 
{{remark.DATA}}

新增之后就可以看到模板记录,就有我们需要的模板ID了。有了模板ID我们就可以按照接下来的微信公众平台发送模板消息接口来实现我们的功能。

微信公众平台 发送模板消息(Java接口开发)

三、发送模板消息

1 接口调用请求说明

http请求方式: POST

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

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

3 参数说明

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

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

4 java接口开发

(1)封装请求参数Demo

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 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; 
  } 
}

(2)发送模板消息方法

public class TemplateMessageServiceImpl implements TemplateMessageService{

  private RestTemplate restTemplate ; 

  private String serviceHost = "https://api.weixin.qq.com";

  public TemplateMessageServiceImpl() {
    restTemplate = RestTemplateFactory.makeRestTemplate();
  }

  @Override
  public WeixinResponse sendTemplateMessage(String accessToken, WeixinTemplate weixinTemplate) {
    WeixinResponse weixinResponse = null;
    String url = new StringBuffer(serviceHost).append("/cgi-bin/message/template/send?access_token=")
        .append(accessToken).toString();
    weixinResponse = restTemplate.postForObject(url, weixinTemplate, WeixinResponse.class,new HashMap<String,String>());
    return weixinResponse;
  }

}

说明:简单理解模板消息发送,首先是获取accessToken,(如何获取请参考:微信公众平台 获取access_token)。其次是模板消息的参数封装,最后就是http的post请求。我的http请求是使用Spring的restTemplate进行请求,就不用我单独写一个http请求方法,如果没有使用可以写一个http请求的工具类。

(3)封装响应参数Demo

package com.plateno.weixin.message.model;

public class WeixinResponse {
  private String msgid;
  private int errcode;
  private String errmsg;

  public String getMsgid() {
    return msgid;
  }
  public void setMsgid(String msgid) {
    this.msgid = msgid;
  }
  public int getErrcode() {
    return errcode;
  }
  public void setErrcode(int errcode) {
    this.errcode = errcode;
  }
  public String getErrmsg() {
    return errmsg;
  }
  public void setErrmsg(String errmsg) {
    this.errmsg = errmsg;
  }

  @Override
  public String toString() {
    StringBuffer buf = new StringBuffer("WeixinResponse[msgid=");
    buf.append(msgid)
    .append(",errcode=").append(errcode)
    .append(",errmsg=").append(errmsg)
    .append("]");
    return buf.toString();
  }

}

模板消息发送效果:

微信公众平台 发送模板消息(Java接口开发)

四、事件推送

在模版消息发送任务完成后,微信服务器会将是否送达成功作为通知,发送到开发者中心中填写的服务器配置地址中。

1 送达成功时

(1)推送的XML如下

<xml>
      <ToUserName><![CDATA[gh_7f083739789a]]></ToUserName>
      <FromUserName><![CDATA[oia2TjuEGTNoeX76QEjQNrcURxG8]]></FromUserName>
      <CreateTime>1395658920</CreateTime>
      <MsgType><![CDATA[event]]></MsgType>
      <Event><![CDATA[TEMPLATESENDJOBFINISH]]></Event>
      <MsgID>200163836</MsgID>
      <Status><![CDATA[success]]></Status>
      </xml>

(2)参数说明

参数 说明
ToUserName 公众号微信号
FromUserName 接收模板消息的用户的openid
CreateTime 创建时间
MsgType 消息类型是事件
Event 事件为模板消息发送结束
MsgID 消息id
Status 发送状态为成功

 2 送达由于用户拒收(用户设置拒绝接收公众号消息)而失败时

(1)推送的XML如下

<xml>
      <ToUserName><![CDATA[gh_7f083739789a]]></ToUserName>
      <FromUserName><![CDATA[oia2TjuEGTNoeX76QEjQNrcURxG8]]></FromUserName>
      <CreateTime>1395658984</CreateTime>
      <MsgType><![CDATA[event]]></MsgType>
      <Event><![CDATA[TEMPLATESENDJOBFINISH]]></Event>
      <MsgID>200163840</MsgID>
      <Status><![CDATA[failed:user block]]></Status>
      </xml>

(2)参数说明

参数 说明
ToUserName 公众号微信号
FromUserName 接收模板消息的用户的openid
CreateTime 创建时间
MsgType 消息类型是事件
Event 事件为模板消息发送结束
MsgID 消息id
Status 发送状态为用户拒绝接收

3 送达由于其他原因失败时

(1)推送的XML如下

<xml>
      <ToUserName><![CDATA[gh_7f083739789a]]></ToUserName>
      <FromUserName><![CDATA[oia2TjuEGTNoeX76QEjQNrcURxG8]]></FromUserName>
      <CreateTime>1395658984</CreateTime>
      <MsgType><![CDATA[event]]></MsgType>
      <Event><![CDATA[TEMPLATESENDJOBFINISH]]></Event>
      <MsgID>200163840</MsgID>
      <Status><![CDATA[failed: system failed]]></Status>
      </xml>

(2)参数说明

参数 说明
ToUserName 公众号微信号
FromUserName 接收模板消息的用户的openid
CreateTime 创建时间
MsgType 消息类型是事件
Event 事件为模板消息发送结束
MsgID 消息id
Status 发送状态为发送失败(非用户拒绝)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery实现手机号码输入提示功能实例
Apr 30 Javascript
AngularJs实现ng1.3+表单验证
Dec 10 Javascript
基于jquery实现最简单的选项卡切换效果
May 08 Javascript
JS中正则表达式只有3种匹配模式(没有单行模式)详解
Jul 28 Javascript
AngularJS利用Controller完成URL跳转
Aug 09 Javascript
JS中如何实现复选框全选功能
Dec 19 Javascript
bootstrap输入框组件使用方法详解
Jan 19 Javascript
JS 组件系列之 bootstrap treegrid 组件封装过程
Apr 28 Javascript
javaScript手机号码校验工具类PhoneUtils详解
Dec 08 Javascript
node.js之基础加密算法模块crypto详解
Sep 11 Javascript
微信小程序dom操作的替代思路实例分析
Dec 06 Javascript
详解Next.js页面渲染的优化方案
Jan 27 Javascript
微信公众平台 客服接口发消息的实现代码(Java接口开发)
Apr 17 #Javascript
vue获取时间戳转换为日期格式代码实例
Apr 17 #Javascript
微信小程序bindinput与bindsubmit的区别实例分析
Apr 17 #Javascript
vue 项目 iOS WKWebView 加载
Apr 17 #Javascript
Vue组件间通信方法总结(父子组件、兄弟组件及祖先后代组件间)
Apr 17 #Javascript
详解vue-cli+element-ui树形表格(多级表格折腾小计)
Apr 17 #Javascript
抖音上用记事本编写爱心小程序教程
Apr 17 #Javascript
You might like
PHP开发文件系统实例讲解
2006/10/09 PHP
本地机apache配置基于域名的虚拟主机详解
2013/08/10 PHP
让CodeIgniter数据库缓存自动过期的处理的方法
2014/06/12 PHP
Yii2框架中使用PHPExcel导出Excel文件的示例
2017/08/09 PHP
phpmyadmin在宝塔面板里进不去的解决方案
2020/07/06 PHP
jQuery拖动布局其结果保存到数据库
2015/10/09 Javascript
jquery弹出框插件jquery.ui.dialog用法分析
2016/08/20 Javascript
探究Vue.js 2.0新增的虚拟DOM
2016/10/20 Javascript
使用vue框架 Ajax获取数据列表并用BootStrap显示出来
2017/04/24 Javascript
Javascript 实现匿名递归的实例代码
2017/05/25 Javascript
JS获取鼠标坐标并且根据鼠标位置不同弹出不同内容
2017/06/12 Javascript
vue2.0 移动端实现下拉刷新和上拉加载更多的示例
2018/04/23 Javascript
深入解读Node.js中的koa源码
2019/06/17 Javascript
jQuery实现开关灯效果
2020/08/02 jQuery
mustache.js实现首页元件动态渲染的示例代码
2020/12/28 Javascript
[00:43]FTP典藏礼包 DOTA2三大英雄霸气新套装
2014/03/21 DOTA
[15:28]DOTA2 HEROS教学视频教你分分钟做大人-剧毒术士
2014/06/13 DOTA
python从网络读取图片并直接进行处理的方法
2015/05/22 Python
Python2.x与Python3.x的区别
2016/01/14 Python
Django REST framework 如何实现内置访问频率控制
2019/07/23 Python
利用 Flask 动态展示 Pyecharts 图表数据方法小结
2019/09/04 Python
Pandas时间序列:时期(period)及其算术运算详解
2020/02/25 Python
Python爬虫爬取电影票房数据及图表展示操作示例
2020/03/27 Python
pytorch 查看cuda 版本方式
2020/06/23 Python
在Keras中CNN联合LSTM进行分类实例
2020/06/29 Python
python+selenium 简易地疫情信息自动打卡签到功能的实现代码
2020/08/22 Python
利用Python pandas对Excel进行合并的方法示例
2020/11/04 Python
物理研修随笔感言
2014/02/14 职场文书
食堂标语大全
2014/06/11 职场文书
政风行风评议整改方案
2014/09/15 职场文书
2015年实习班主任工作总结
2015/04/23 职场文书
捐款通知怎么写
2015/04/24 职场文书
原来闭幕词是这样写的呀!
2019/07/01 职场文书
Python带你从浅入深探究Tuple(基础篇)
2021/05/15 Python
Springboot如何使用logback实现多环境配置?
2021/06/16 Java/Android
十大最强电系宝可梦,阿尔宙斯电系之一,第七被称为雷神
2022/03/18 日漫