微信公众平台 发送模板消息(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 相关文章推荐
数组方法解决JS字符串连接性能问题有争议
Jan 12 Javascript
js为数字添加逗号并格式化数字的代码
Aug 23 Javascript
jquery全选checkBox功能实现代码(取消全选功能)
Dec 10 Javascript
js实现碰撞检测特效代码分享
Oct 16 Javascript
vue+webpack 打包文件 404 页面空白的解决方法
Feb 28 Javascript
Vue 页面跳转不用router-link的实现代码
Apr 12 Javascript
js数组去重的N种方法(小结)
Jun 07 Javascript
vue基于element的区间选择组件
Sep 07 Javascript
vue项目中实现的微信分享功能示例
Jan 21 Javascript
如何实现小程序tab栏下划线动画效果
May 18 Javascript
浅谈JavaScript窗体Window.ShowModalDialog使用
Jul 22 Javascript
vue-cli4.5.x快速搭建项目
May 30 Vue.js
微信公众平台 客服接口发消息的实现代码(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
关于js与php互相传值的介绍
2013/06/25 PHP
php模拟用户自动在qq空间发表文章的方法
2015/01/07 PHP
thinkphp 抓取网站的内容并且保存到本地的实例详解
2017/08/25 PHP
window.requestAnimationFrame是什么意思,怎么用
2013/01/13 Javascript
javascript图像处理—仿射变换深度理解
2013/01/16 Javascript
JS等比例缩小图片尺寸的实例
2013/02/27 Javascript
JavaScript sup方法入门实例(把字符串显示为上标)
2014/10/20 Javascript
JS实现可缩放、拖动、关闭和最小化的浮动窗口完整实例
2015/03/04 Javascript
jQuery添加删除DOM元素方法详解
2016/01/18 Javascript
JavaScript中获取纯正的undefined的方法
2016/03/06 Javascript
jQuery实现注册会员时密码强度提示信息功能示例
2017/09/05 jQuery
angular内置provider之$compileProvider详解
2017/09/27 Javascript
详解基于vue-router的动态权限控制实现方案
2017/09/28 Javascript
vue-cli点击实现全屏功能
2020/03/07 Javascript
微信小程序实现翻牌抽奖动画
2020/09/21 Javascript
python批量提交沙箱问题实例
2014/10/08 Python
Python装饰器使用示例及实际应用例子
2015/03/06 Python
python获取一组汉字拼音首字母的方法
2015/07/01 Python
对Python的Django框架中的项目进行单元测试的方法
2016/04/11 Python
git查看、创建、删除、本地、远程分支方法详解
2020/02/18 Python
解决img标签上下出现间隙的方法
2016/12/14 HTML / CSS
关于HTML5 Placeholder新标签低版本浏览器下不兼容的问题分析及解决办法
2016/01/27 HTML / CSS
Europcar葡萄牙:葡萄牙汽车和货车租赁
2017/10/13 全球购物
荷兰超市:DEEN
2018/03/14 全球购物
计算机工程学院个人求职信
2013/10/05 职场文书
员工拾金不昧表扬信
2014/01/09 职场文书
小区门卫管理制度
2014/01/29 职场文书
高中军训感言1000字
2014/03/01 职场文书
政府绩效管理实施方案
2014/05/04 职场文书
学校先进集体事迹材料
2014/05/31 职场文书
整改报告怎么写
2014/11/06 职场文书
护士医德考评自我评价
2015/03/03 职场文书
绿色环保倡议书
2015/04/28 职场文书
生日寿星公答谢词
2015/09/29 职场文书
vue首次渲染全过程
2021/04/21 Vue.js
如何Python使用re模块实现okenizer
2022/04/30 Python