微信公众平台 发送模板消息(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 相关文章推荐
精选的10款用于构建良好易用性网站的jQuery插件
Jan 23 Javascript
jquery 实现checkbox全选,反选,全不选等功能代码(奇数)
Oct 24 Javascript
js带按钮的提示框可供选择示例代码
Sep 17 Javascript
JS+CSS 制作的超级简单的下拉菜单附图
Nov 22 Javascript
javascript基于HTML5 canvas制作画箭头组件
Jun 25 Javascript
JavaScript前补零操作实例
Mar 11 Javascript
JS+DIV实现鼠标划过切换层效果的方法
May 25 Javascript
JavaScript实现定时隐藏与显示图片的方法
Aug 06 Javascript
JavaScript中的操作符类型转换示例总结
May 30 Javascript
详解Bootstrap的iCheck插件checkbox和radio
Aug 24 Javascript
vue数据双向绑定原理解析(get &amp; set)
Mar 08 Javascript
JavaScript实现精美个性导航栏筋斗云效果
Oct 29 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 的多进程操作实践案例分析
2020/02/28 PHP
List Installed Software Features
2007/06/11 Javascript
Jquery作者John Resig自己封装的javascript 常用函数
2009/11/09 Javascript
jQuery提交表单ajax查询实例代码
2012/10/07 Javascript
jQuery的one()方法用法实例
2015/01/19 Javascript
使用mouse事件实现简单的鼠标经过特效
2015/01/30 Javascript
jQuery实现为图片添加镜头放大效果的方法
2015/06/25 Javascript
gulp-uglify 与gulp.watch()配合使用时报错(重复压缩问题)
2016/08/24 Javascript
es6学习笔记之Async函数基本教程
2017/05/11 Javascript
移动端手指放大缩小插件与js源码
2017/05/22 Javascript
javascript简写常用的12个技巧(可以大大减少你的js代码量)
2020/03/28 Javascript
JavaScript面向对象的程序设计(犯迷糊的小羊)
2018/05/27 Javascript
vue 项目 iOS WKWebView 加载
2019/04/17 Javascript
模块化react-router配置方法详解
2019/06/03 Javascript
详解vue为什么要求组件模板只能有一个根元素
2019/07/22 Javascript
Vue路由守卫之路由独享守卫
2019/09/25 Javascript
js实现简单抽奖功能
2020/11/24 Javascript
[03:16]DOTA2完美大师赛主赛事首日集锦
2017/11/23 DOTA
解决PyCharm中光标变粗的问题
2017/08/05 Python
Python基于分析Ajax请求实现抓取今日头条街拍图集功能示例
2018/07/19 Python
详解python 利用echarts画地图(热力图)(世界地图,省市地图,区县地图)
2019/08/06 Python
python操作excel让工作自动化
2019/08/09 Python
python用quad、dblquad实现一维二维积分的实例详解
2019/11/20 Python
python进行参数传递的方法
2020/05/12 Python
python类共享变量操作
2020/09/03 Python
一文带你了解Python 四种常见基础爬虫方法介绍
2020/12/04 Python
python实现ping命令小程序
2020/12/28 Python
Python 中Operator模块的使用
2021/01/30 Python
CSS3动画特效在活动页中的应用
2020/01/21 HTML / CSS
英国高档百货连锁店:John Lewis
2017/11/20 全球购物
后勤部长岗位职责
2013/12/14 职场文书
师德师风个人反思
2014/04/28 职场文书
团日活动总结报告
2014/06/25 职场文书
运动员入场前导词
2015/07/20 职场文书
《比尾巴》教学反思
2016/02/24 职场文书
深度学习tensorflow基础mnist
2021/04/14 Python