微信公众账号开发-发送模板消息:

内容概要

本篇文章主要叙述如何在微信公众帐号上实现“发送模板消息开发”功能。包含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/advanced/tmplmsg?action=faq&token=663979174&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 classTradingNotice {

privateMap<String,Object>map;

privateMap<String,Object>data;

public TradingNotice(Stringtouser, String template_id, Stringurl, String topcolor,Stringuser) {

map=newLinkedHashMap<String, Object>();

data=newLinkedHashMap<String, Object>();

LinkedHashMap<String,String>first=newLinkedHashMap<String,String>();

first.put("value","尊敬的" +user + ":\n\n您尾号为0426的招商银行卡最近有一笔交易(测试)");

first.put("color","#743A3A");

data.put("first",first);

LinkedHashMap<String,String>keyword1=newLinkedHashMap<String,String>();

keyword1.put("value","YXJ134953845");

keyword1.put("color","#FF0000");

data.put("keyword1",keyword1);

LinkedHashMap<String,String>keyword2=newLinkedHashMap<String,String>();

keyword2.put("value","2014/08/18 13:18");

keyword2.put("color","#C4C400");

data.put("keyword2",keyword2);

LinkedHashMap<String,String>keyword3=newLinkedHashMap<String,String>();

keyword3.put("value","1888888888");

keyword3.put("color","#0000FF");

data.put("keyword3",keyword3);

LinkedHashMap<String,String>keyword4=newLinkedHashMap<String,String>();

keyword4.put("value","消费");

keyword4.put("color","#008000");

data.put("keyword4",keyword4);

LinkedHashMap<String,String>keyword5=newLinkedHashMap<String,String>();

keyword5.put("value","26万元");

keyword5.put("color","#008000");

data.put("keyword5",keyword5);

LinkedHashMap<String,String>remark=newLinkedHashMap<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 classCreate_Json {

//获取交易提醒json;

public static JSONObjectcreate_TN_Json(String touser,String user){

JSONObjectjsonObject=null;

//模板id

Stringtemplate_id="15Eox4OfGsjFYaVRwk9Dbos_aaIkzveCkpG3AsnKqLA";

//点击模板后的链接地址

Stringurl="www.baidu.com";

//模板的主题颜色

Stringtopcolor="#008000";

//构造json

TradingNoticewn = 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();

JSONObjectjsonObject1=null;

Stringopen_id= null;

StringuserName= 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 StringgetUserData(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");

}

returnresult;

}

//获取关注列表;

@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){

JSONObjectobject=jsonObject;

Stringnext_openid=null;

JSONObjectob_data=null;

ArrayList<String>ob_user=null;

//大于1000需要多次获取,或许次数为count/1000

for(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);

}

}

}

}

returnusers;

}

//连续获取关注列表;

public static JSONObjectgetUserJson(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);

returnjsonObject;

}

//发送模板;

publicstaticvoidsend_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. 微信公众平台开发(102) 模板消息

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

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

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

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

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

  5. 微信公众平台开发(97) 图文消息

    在这篇微信公众平台开发教程中,我们将介绍如何灵活的使用图文消息功能.我们将只介绍被动回复消息中的图文消息,发送客服消息及高级群发消息接口的发送的图文消息与本文介绍的图文消息的各情况基本一致. 本文分为 ...

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

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

  7. 微信公众平台开发(5)--验证消息的确来自微信服务器

    点此查看 微信公众号/微信网页/微信支付/企业微信/小程序开发合集及源代码下载 本文目录 1. 前言 2. 构建项目 2.1 构建SpringBoot项目 2.2 编写配置文件 2.3 编写启动类 3 ...

  8. 微信公众平台接收发送文本消息

    配置步骤 1.我用的是测试号,如果没有测试号的小伙伴可以去注册  http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login 2.注册完 ...

  9. 微信公众平台开发(15)--群发消息

    点此查看 微信公众号/微信网页/微信支付/企业微信/小程序开发合集及源代码下载 本文目录 1. 概述 2. 代码部分 3. 测试 4. 小结 1. 概述 群发消息的意思是将消息发给一群人,这个好理解. ...

最新文章

  1. hashMap传入参数,table长度为多少
  2. ASP.NET 网站预编译概述
  3. ORACLE如何使用DBMS_METADATA.GET_DDL获取DDL语句
  4. 关于zendframework中的Zend_Db_Expr(不自动加引号)
  5. [Zer0pts2020]ROR
  6. Qt多线程示例--并发数据处理
  7. Java程序员需要掌握的计算机底层知识(三):进程、线程、纤程、中断
  8. Introduction to Latent Dirichlet Allocation
  9. 照片被误删?别着急,EasyRecovery帮你找回来
  10. 3. beanstalkd
  11. html5怎么调用cur指针,win7鼠标指针主题包怎么用
  12. 探索SpringCloud+ES实现高性能全文检索
  13. AntD Pro v5记录-布局
  14. 微信悄悄新出了个野心很大的App
  15. 【Git】回退 commit 版本详解
  16. 用Python做单变量数据集的异常点分析
  17. 软件体系结构-03-层次体系结构概述
  18. Linux的DNS正向解析和转发配置
  19. 关于现时构型的ds和初始构型的dS
  20. 对于25岁的我们,尴尬吗?

热门文章

  1. 自定义 ellipsize 后缀的 TextView
  2. FinTech研发报告-之大数据技术
  3. (二十四)List系列集合
  4. css 块级元素与内联元素
  5. 小程序view在ios中下拉或上拉到顶时疯狂抖动
  6. 蓝桥杯单片机第十三届第二场考后归纳总结
  7. 关于python的列表以下选项中描述错误的是_以下关于Python列表的描述中,错误的是______...
  8. 如何区分usb摄像头和uvc摄像头
  9. PaddleOCR---基于Python引擎的PP-OCR模型库推理
  10. 首席新媒体运营商学院创始人黎想:如何做“新客户新粉丝”的快速拉新