一、申请模版消息权限
模版消息的申请需账号已经开通微信支付权限。
在微信公众平台的后台,依次进入“功能->添加功能插件->模版消息”,即可申请模版消息。
点击申请
申请时,选择2个和自己相关的行业即可。
提交并且申请通过后,可以在模版库中看到模版消息列表
进入想要使用的模版,点击添加
添加后就存放到“我的模版库”中了
查看模版的详情,可以看到模版的id及各项内容参数名
不同的模版消息的内容结构不一样。这些id及字段名将在程序中使用到。
二、开发模版消息SDK
模版消息的定义如下:
模版消息也是使用access token作为授权来发送。
我们在微信公众平台高级SDK的基本上,稍加修改即可。模版消息的SDK实现如下
具体调用方法
第一步:获取模板ID
通过在模板消息功能的模板库中使用需要的模板,可以获得模板ID。
第二步:请求接口
请注意,URL置空,则在发送后,点击模板消息会进入一个空白页面(ios),或无法点击(android)。
POST请求
https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN请求包为一个json:
{ "touser":"OPENID", "template_id":"ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY", "url":"http://weixin.qq.com/download", "topcolor":"#FF0000", "data":{ "User": { "value":"黄先生", "color":"#173177" }, "Date":{ "value":"06月07日 19时24分", "color":"#173177" }, "CardNumber":{ "value":"0426", "color":"#173177" }, "Type":{ "value":"消费", "color":"#173177" }, "Money":{ "value":"人民币260.00元", "color":"#173177" }, "DeadTime":{ "value":"06月07日19时24分", "color":"#173177" }, "Left":{ "value":"6504.09", "color":"#173177" } } }
发送效果图:
事件推送
在模版消息发送任务完成后,微信服务器会将是否送达成功作为通知,发送到开发者中心中填写的服务器配置地址中。
1、送达成功时,推送的XML如下:
<xml> <ToUserName><![CDATA[gh_7f083739789a]]></ToUserName> <FromUserName><![CDATA[oia2TjuEGTNoeX76QEjQNrcURxG8]]&g;</FromUserName> <CreateTime>1395658920</CreateTime> <MsgType><![CDATA[event]]></MsgType> <Event><![CDATA[TEMPLATESENDJOBFINISH]]></Event> <MsgID>200163836</MsgID> <Status><![CDATA[success]]></Status> </xml>
2、送达由于用户拒收(用户设置拒绝接收公众号消息)而失败时,推送的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>
3、送达由于其他原因失败时,推送的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>
返回码说明
在调用模板消息接口后,会返回JSON数据包。正常时的返回JSON数据包示例:
{ "errcode":0, "errmsg":"ok", "msgid":200228332 }
错误时的返回JSON数据,形式类似,错误码请见本页下方返回码说明。
返回码 | 说明 |
---|---|
-1 | 系统繁忙 |
0 | 请求成功 |
40001 | 验证失败 |
40002 | 不合法的凭证类型 |
40003 | 不合法的OpenID |
40004 | 不合法的媒体文件类型 |
40005 | 不合法的文件类型 |
40006 | 不合法的文件大小 |
40007 | 不合法的媒体文件id |
40008 | 不合法的消息类型 |
40009 | 不合法的图片文件大小 |
40010 | 不合法的语音文件大小 |
40011 | 不合法的视频文件大小 |
40012 | 不合法的缩略图文件大小 |
40013 | 不合法的APPID |
41001 | 缺少access_token参数 |
41002 | 缺少appid参数 |
41003 | 缺少refresh_token参数 |
41004 | 缺少secret参数 |
41005 | 缺少多媒体文件数据 |
41006 | access_token超时 |
42001 | 需要GET请求 |
43002 | 需要POST请求 |
43003 | 需要HTTPS请求 |
44001 | 多媒体文件为空 |
44002 | POST的数据包为空 |
44003 | 图文消息内容为空 |
45001 | 多媒体文件大小超过限制 |
45002 | 消息内容超过限制 |
45003 | 标题字段超过限制 |
45004 | 描述字段超过限制 |
45005 | 链接字段超过限制 |
45006 | 图片链接字段超过限制 |
45007 | 语音播放时间超过限制 |
45008 | 图文消息超过限制 |
45009 | 接口调用超过限制 |
46001 | 不存在媒体数据 |
47001 | 解析JSON/XML内容错误 |
static HostnameVerifier hv = new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
};
private static void trustAllHttpsCertificates() {
try {
javax.net.ssl.TrustManager[] trustAllCerts = new javax.net.ssl.TrustManager[1];
javax.net.ssl.TrustManager tm = new MiTM();
trustAllCerts[0] = tm;
javax.net.ssl.SSLContext sc;
sc = javax.net.ssl.SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, null);
javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(sc
.getSocketFactory());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
}
static class MiTM implements javax.net.ssl.TrustManager,
javax.net.ssl.X509TrustManager {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public boolean isServerTrusted(
java.security.cert.X509Certificate[] certs) {
return true;
}
public boolean isClientTrusted(
java.security.cert.X509Certificate[] certs) {
return true;
}
public void checkServerTrusted(
java.security.cert.X509Certificate[] certs, String authType)
throws java.security.cert.CertificateException {
return;
}
public void checkClientTrusted(
java.security.cert.X509Certificate[] certs, String authType)
throws java.security.cert.CertificateException {
return;
}
}
public static String httpClientPost(String urls,String data){
try{
StringBuffer sb = new StringBuffer();
URL url = new URL(urls);
trustAllHttpsCertificates();
HttpsURLConnection.setDefaultHostnameVerifier(hv);
HttpsURLConnection httpsConn = (HttpsURLConnection) url.openConnection();
httpsConn.setUseCaches(false);
httpsConn.setDoOutput(true);
httpsConn.setDoInput(true);
httpsConn.setFollowRedirects(true);
httpsConn.setInstanceFollowRedirects(true);
httpsConn.setRequestMethod("POST");
OutputStreamWriter post = new OutputStreamWriter(httpsConn.getOutputStream(),"UTF-8");
post.write(data);
post.flush();
BufferedReader in = new BufferedReader(new InputStreamReader(httpsConn.getInputStream(),"UTF-8"));
String inputLine;
while ((inputLine = in.readLine()) != null) {
sb.append(inputLine);
}
post.close();
in.close();
return sb.toString();
}catch(Exception e){
e.printStackTrace();
}
return "";
}
开始在main方法中调用
public static void main(String args[]) throws Exception {
// System.out.println(getToken);
// String mesg ="{\"touser\":\"ongZptx8YxuIDdk1jc9XtNKMSV1g\",\"template_id\":\"xpexCx1WRfGDx1gg8ueFm-oqbO0NRR180hloEO-P1Qo\",\"url\":\"http://weixin.qq.com/download\",\"topcolor\":\"#FF0000\",\"data\":{\"name\":{\"value\":\"微信影城影票\",\"color\":\"#173177\"},\"remark\":{\"value\":\"永久有效\",\"color\":\"#173177\"}}}";
// String msg = httpClientPost(http,mesg);
// System.out.println(msg);
// String getToken=getToken("wx11297f3de573c71f","28ac38663cdd0462d7610848c38c3635");
// String getToken="DsbAvyUMXv06LQO7XOH7grrcPpayQVXWLr0N1EEck-J5MI6LnwjHvKxLI5kvPHxrcmytyN5CaWDs7UqA77qw65X7MTwU65Vw7qrTiwcNUss";
// System.out.println(httpClientGet("https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token="+getToken));
//testPostTemplateID(getToken,"TM00230");
// MANEY_CUSTOMER
JSONObject jo = new JSONObject();
jo.put("kf_account", "wei@zhejiangtiansou");
jo.put("nickname", "薪火123");
jo.put("password", "XXXXX");
String getToken=getToken("appId","微信秘钥");
System.out.println(getToken);
String msg = httpClientPost(MANEY_CUSTOMER+getToken, jo.toString());
System.out.print(msg);
}