内容概要

本篇文章主要叙述如何在微信公众帐号上实现“发送模板消息开发”功能。包含json的封装与解析。

何谓模板消息

为了保证用户不受到骚扰,在开发者出现需要主动提醒、通知用户时,才允许开发者在公众平台网站中模板消息库中选择模板,选择后获得模板ID,再根据模板ID向用户主动推送提醒、通知消息。

注意:模板消息只能开发者主动向微信用户发送,不能有用户被动发起。

寻找接口(数据源)

开发者需向微信服务器发送post请求,并携带根据模板配装好的一个json包。

请求地址:

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

json格式:

参考微信接口文档https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277&token=&lang=zh_CN

开发步骤

1) 获取模板ID

2) 构造模版消息体并请求接口

代码及实现

获取模板id:

1、具有支付能力的公众号才可以使用模板消息进行服务。在微信公众平台的后台,依次进入“功能->添加功能插件->模版消息”,即可申请模版消息。

点击申请

申请时,选择2个和自己相关的两个行业即可。

提交并且申请通过后,可以在模版库中看到模版消息列表

进入想使用的模板,点击添加

添加后就存到“我的模板库”中了(每个账号可以最多可以添加10个模板到“我的模板库”中)

查看模版的详情,可以看到模版id及各项内容参数名。

不同的模版消息的内容结构不一样。这些id及字段名将在程序中使用到。

注意:如果模板库中没有你想使用的模板时,可以在模板库页面点击“帮助我们完善模板库”创建自己的消息模板,创建消息模板需要申请,审核通过后该模板将被添加到该行业的模板库中。每个账号每月只能申请3个模板。

点击帮助我们完善模板库

代码实现(java,建议将代码复制到Eclipse编辑器,看起来效果就不凌乱了):

1、构造模板体(json包),以交易提醒模板为例,这里封装成一个TradingNotice类。构造该类时需传入接收者微信的openid、模 板id、模板主体颜色、用户名。代码中采用LinkedHashMap是为了保证数据是以存入的顺序排序,从而保证json格式的结构不被打乱。

import java.util.LinkedHashMap;import java.util.Map;public class TradingNotice {private Map<String,Object> map;private Map<String,Object> data;public TradingNotice(String touser, String template_id, String url, String topcolor,String user) {map=new LinkedHashMap<String, Object>();data=new LinkedHashMap<String, Object>();LinkedHashMap<String,String> first = new LinkedHashMap<String,String>();first.put("value","尊敬的" +user + ":\n\n您尾号为0426的招商银行卡最近有一笔交易(测试)");first.put("color","#743A3A");data.put("first",first);LinkedHashMap<String,String> keyword1 = new LinkedHashMap<String,String>();keyword1.put("value","YXJ134953845");keyword1.put("color","#FF0000");data.put("keyword1",keyword1);LinkedHashMap<String,String> keyword2 = new LinkedHashMap<String,String>();keyword2.put("value","2014/08/18 13:18");keyword2.put("color","#C4C400");data.put("keyword2",keyword2);LinkedHashMap<String,String> keyword3 = new LinkedHashMap<String,String>();keyword3.put("value","1888888888");keyword3.put("color","#0000FF");data.put("keyword3",keyword3);LinkedHashMap<String,String> keyword4 = new LinkedHashMap<String,String>();keyword4.put("value","消费");keyword4.put("color","#008000");data.put("keyword4",keyword4);LinkedHashMap<String,String> keyword5 = new LinkedHashMap<String,String>();keyword5.put("value","26万元");keyword5.put("color","#008000");data.put("keyword5",keyword5);LinkedHashMap<String,String> remark = new LinkedHashMap<String,String>();remark.put("value","\n\n截止2014/08/18 13:18您招商信用账户可用余额未20000元");remark.put("color","#000000");data.put("remark",remark);map.put("touser",touser);map.put("template_id",template_id);map.put("url",url);map.put("topcolor",topcolor);map.put("data",data);}public Map<String,Object> getMap() {return map;}public void setMap(Map<String,Object> map){this.map = map;}public Map<String,Object> getDate() {return data;}public void setDate(Map<String,Object> date){this.data =date;}}2、方法create_TN_Json用来构造json包,方法getUserData用来获取关注者昵称,需传入客户的openid。方法getUserList用来获取微信关注者列表,将所有关注者的openid保存在一个ArrayList中。由于获取关注者列表一次只能获取1000个微信号,所以当关注者多余1000的时候循环调用方法getUserJson来获取所有关注者账号。获取关注这列表可参考微信公众平台接口文档,地址http://mp.weixin.qq.com/wiki/index.php?title=获取关注者列表

方法send_Json用来发送模板消息请求,必须采用post请求import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.net.HttpURLConnection;import java.net.URL;import java.util.ArrayList;import java.util.Iterator;import wx.sunl.menus.Get_Token;import wx.sunl.template.TradingNotice;import net.sf.json.JSONObject;public class Create_Json {//获取交易提醒json;public static JSONObjectcreate_TN_Json(String touser,String user){JSONObjectjsonObject=null;//模板id
Stringtemplate_id="15Eox4OfGsjFYaVRwk9Dbos_aaIkzveCkpG3AsnKqLA";//点击模板后的链接地址
String url="www.baidu.com";//模板的主题颜色
String topcolor="#008000";//构造json包
TradingNotice wn = new TradingNotice(touser,template_id,url,topcolor,user);jsonObject=JSONObject.fromObject(wn.getMap());return jsonObject;}//入口;public static void main(String[] args){//检查access_token是否过期,如果过期重新产生//Get_Token.TwoDate();//调用getUserList获取关注者列表
ArrayList<String>users= getUserList();if(users!=null){Iterator<String> user = users.iterator();JSONObject jsonObject1 = null;String open_id = null;String userName = null;while(user.hasNext()){open_id = user.next();//调用getUserData获取关注者昵称
userName = getUserData(open_id);if(userName!=null){//创建交易提醒json包;
jsonObject1 = Create_Json.create_TN_Json(open_id,userName);//发送交易提醒模板消息;
send_Json(jsonObject1.toString(),Get_Token.access_token);}}}}//获取用户基本信息(UnionID机制);public static String getUserData(String openid){StringBuffer bufferRes = new StringBuffer();String result = null;try {URL realUrl = new URL("https://api.weixin.qq.com/cgi-bin/user/info?access_token=" + Get_Token.access_token +"&openid=" + openid+"&lang=zh_CN");HttpURLConnection conn = (HttpURLConnection)realUrl.openConnection();// 请求方式
conn.setDoOutput(true);conn.setDoInput(true);conn.setRequestMethod("GET");conn.setUseCaches(false);conn.setInstanceFollowRedirects(true);conn.setRequestProperty("Content-Type","application/json");conn.connect();// 获取URLConnection对象对应的输入流
InputStream in =conn.getInputStream();BufferedReader read =new BufferedReader(new InputStreamReader(in,"UTF-8"));String valueString =null;while ((valueString=read.readLine())!=null){bufferRes.append(valueString);}System.out.println(bufferRes);in.close();if (conn != null){// 关闭连接
conn.disconnect();}} catch (Exceptione) {e.printStackTrace();}//将返回的字符串转换成json
JSONObject jsonObject = JSONObject.fromObject(bufferRes.toString());//解析json中的数据
String subscribe = jsonObject.get("subscribe").toString();//等于1表示有关注者,0表示没有关注者if("1".equals(subscribe.toString())){//解析出关注者的昵称
result = (String)jsonObject.get("nickname");}return result;}//获取关注列表;
@SuppressWarnings("unchecked")public static ArrayList<String> getUserList() {StringBuffer bufferRes = new StringBuffer();ArrayList<String> users = null;try {URL realUrl = new URL("https://api.weixin.qq.com/cgi-bin/user/get?access_token=" + Get_Token.access_token);HttpURLConnection conn = (HttpURLConnection)realUrl.openConnection();// 请求方式
conn.setDoOutput(true);conn.setDoInput(true);conn.setRequestMethod("GET");conn.setUseCaches(false);conn.setInstanceFollowRedirects(true);conn.setRequestProperty("Content-Type","application/json");conn.connect();// 获取URLConnection对象对应的输入流
InputStream in =conn.getInputStream();BufferedReader read =new BufferedReader(new InputStreamReader(in,"UTF-8"));String valueString =null;while ((valueString=read.readLine())!=null){bufferRes.append(valueString);}System.out.println(bufferRes);in.close();if (conn !=null){// 关闭连接
conn.disconnect();}} catch (Exceptione) {e.printStackTrace();}//将返回的字符串转换成json
JSONObject jsonObject = JSONObject.fromObject(bufferRes.toString());//解析json中表示openid的列表
JSONObject data = (JSONObject)jsonObject.get("data");if(data!=null){//将openid列表转化成数组保存
users = newArrayList<String>(data.getJSONArray("openid"));//获取关注者总数
intcount = Integer.parseInt(jsonObject.get("total").toString());if(count>1000){JSONObject object = jsonObject;String next_openid = null;JSONObject ob_data = null;ArrayList<String> ob_user = null;//大于1000需要多次获取,或许次数为count/1000for(inti=0;i<count/1000;i++){//解析出下次获取的启示openid
next_openid = object.get("next_openid").toString();object = getUserJson(next_openid);ob_data = (JSONObject)object.get("data");ob_user = newArrayList<String>(ob_data.getJSONArray("openid"));for(Stringopen_id : ob_user){//将多次获取的openid添加到同一个数组
users.add(open_id);}}}}return users;}//连续获取关注列表;public static JSONObject getUserJson(String next_openid) {StringBuffer bufferRes =new StringBuffer();try {URL realUrl = new URL("https://api.weixin.qq.com/cgi-bin/user/get?access_token=" + Get_Token.access_token +"&next_openid=" + next_openid);HttpURLConnection conn = (HttpURLConnection)realUrl.openConnection();// 请求方式
conn.setDoOutput(true);conn.setDoInput(true);conn.setRequestMethod("GET");conn.setUseCaches(false);conn.setInstanceFollowRedirects(true);conn.setRequestProperty("Content-Type","application/json");conn.connect();// 获取URLConnection对象对应的输入流
InputStream in =conn.getInputStream();BufferedReader read =new BufferedReader(new InputStreamReader(in,"UTF-8"));String valueString =null;while ((valueString=read.readLine())!=null){bufferRes.append(valueString);}System.out.println(bufferRes);in.close();if (conn !=null){// 关闭连接
conn.disconnect();}} catch (Exceptione) {e.printStackTrace();}JSONObject jsonObject = JSONObject.fromObject(bufferRes);return jsonObject;}//发送模板;
public static void send_Json(Stringparams,StringaccessToken){StringBuffer bufferRes =new StringBuffer();try {URL realUrl = new URL("https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" +accessToken);HttpURLConnection conn = (HttpURLConnection)realUrl.openConnection();// 请求方式
conn.setDoOutput(true);conn.setDoInput(true);conn.setRequestMethod("POST");conn.setUseCaches(false);conn.setInstanceFollowRedirects(true);conn.setRequestProperty("Content-Type","application/json");conn.connect();// 获取URLConnection对象对应的输出流
OutputStreamWriter out =new OutputStreamWriter(conn.getOutputStream(),"UTF-8");// 发送请求参数//out.write(URLEncoder.encode(params,"UTF-8"));//发送json包
out.write(params);out.flush();out.close();InputStream in =conn.getInputStream();BufferedReader read =new BufferedReader(new InputStreamReader(in,"UTF-8"));String valueString =null;while ((valueString=read.readLine())!=null){bufferRes.append(valueString);}//输出返回的json
System.out.println(bufferRes);in.close();if (conn !=null){// 关闭连接
conn.disconnect();}} catch (Exceptione) {e.printStackTrace();}}}注意:创建json包时要根据模板内容构造。列如:交易提醒创建的json为:{"touser":"","template_id":"","url":"","topcolor":"","data":{"first":{"value":"","color":""},"keyword1":{"value":"","color":""},"keyword2":{"value":"","color":""},"keyword3":{"value":"","color":""},"keyword4":{"value":"","color":""},"keyword5":{"value":"","color":""},"remark":{"value":"","color":""}}}笔试通知提醒创建的json为:{"touser":"","template_id":"","url":"","topcolor":"","data":{"first":{"value":"","color":""},"company":{"value":"","color":""},"datetime":{"value":"","color":""},"address":{"value":"","color":""},"contact":{"value":"","color":""},"remark":{"value":"","color":""}}}

 例子下载

微信公众账号开发-发送模板消息相关推荐

  1. 微信公众平台开发-发送模板消息

    微信公众账号开发-发送模板消息: 内容概要 本篇文章主要叙述如何在微信公众帐号上实现"发送模板消息开发"功能.包含json的封装与解析. 何谓模板消息 为了保证用户不受到骚扰,在开 ...

  2. 微信公众平台开发之模板消息(Java)

    目录(?)[-] 模版消息 具体调用方法 事件推送 返回码说明 一开发模板消息SDK 二构造模板消息并发送 模版消息 由于柳峰老师的新书还没有出来,网上也没有过多介绍基于Java语言的开发微信公众平台 ...

  3. 微信公众平台开发(102) 模板消息

    关键字:微信公众平台 模板消息 作者:方倍工作室 原文:http://www.cnblogs.com/txw1958/p/wechat-template-message.html 在这篇微信公众平台开 ...

  4. 公众号 接收规则 消息_微信公众号开发之模板消息

    欢迎留言.转发 微信极速开发系列文章:点击这里 最近有点小感冒,文章的更新进度延误了一些,希望此系列文章对你研究微信公众开发有帮助.前几篇文章介绍了微信支付. 公众号支付.微信扫码支付.刷卡支付.微信 ...

  5. java发送微信模板消息_java微信公众平台之发送模板消息

    准备条件: 1.一个测试号,有必要说下的是订阅号没有发送模板消息这一功能,那么开发的小伙伴们就可以直接先注册一个测试号 2.目前我并没有就是做的很完善,网页授权获取openId这个我没做,那么我是直接 ...

  6. 微信公众号开发 [04] 模板消息功能的开发

    1.模板消息的概况 模板消息的定位是用户触发后的通知消息,不允许在用户没做任何操作或未经用户同意接收的前提下,主动下发消息给用户.目前在特殊情况下允许主动下发的消息只有故障类和灾害警示警告类通知,除此 ...

  7. 微信公众号开发接收图片消息,获取用户发送图片的media_id

    现在的手机都有拍照功能, 而且人们拍完照后, 喜欢跟朋友分享. 微信公众号也提供了一个功能, 允许你的粉丝在后台回复图片, 你可以通过公众平台提供的api接口, 获取到图片media_id, 然后把图 ...

  8. 微信公众号推送模板消息工具类

    微信公众平台: 开通 模板消息功能 : 添加消息模板: 将模板id复制作为后台参数: 后台(java): 使用时直接调用WechatModelMessage.sendWechatmsgToUser() ...

  9. ICCMO微信公众账号开发系列(2)打造微信聊天机器人

    昨天我们已经成功的接入了微信公众账号.今天咱们来做一个微信聊天机器人.这个就需要一点点PHP的知识了.如果你不懂PHP呢,没关系,跟着一步一步做也 可以做出来. 这是在昨天的基础上做的,如果你还不会接 ...

最新文章

  1. 如何捕获window.print点击打印或取消_原来1:1的CAD图纸要这样打印!学了这么久才知道...
  2. mysql5.5 datetime默认值不能为NOW或者CURRENT_TIMESTAMP
  3. JavaScript --- 表单focus,blur,change事件的实现
  4. VueConf China 2021 《Vue3生态进展-尤雨溪》 Reaction
  5. 【数位DP】B-number(HDU 3652)
  6. 美国夫妇用数学算法买彩票赢1.74亿元——网友:现在学数学还来得及吗?
  7. 信奥中的“骗”分神技 ---“打表”
  8. Eclipse R语言插件 statET 安装
  9. [BZOJ1036][ZJOI2008]树的统计Count(树链剖分)
  10. 在osx 10.10.3 下安装git总结
  11. Java事务管理之Spring+Hibernate
  12. 获取vue一个对象的所有属性_VUE中computed计算属性和data数据获取的问题
  13. Linux中fasttext安装
  14. Unity接入腾讯云
  15. 通过IP地址进行精准定位
  16. 从北京到新加坡再到阿姆斯特丹,他去公布了一个惊天的“秘密”
  17. 精美黑色UI版创客新零售系统源码
  18. 最近整理的乱七八糟的东东
  19. 数字后端 - STA
  20. 基于android的汽车租赁出租车打车洗车app

热门文章

  1. 安装模拟器遇到的问题
  2. 第二十章:异步和文件I/O.(十一)
  3. Systemd 入门教程:实战篇
  4. 5G前夜 运营商如何实现网络创新?
  5. nginx 将请求全部指向到一个页面
  6. 第37件事 极简设计的3个方面
  7. 原生、无依赖的web弹层组件——HLayer.js
  8. Android Fragment 嵌套使用报错
  9. python之路---装饰器函数
  10. IntelliJ IDEA 安装go插件