微信公众平台发送模板消息

一、申请模版消息权限

模版消息的申请需账号已经开通微信支付权限。

在微信公众平台的后台,依次进入“功能->添加功能插件->模版消息”,即可申请模版消息。

点击申请

申请时,选择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内容错误
1.用java代码来调用时

	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);
		 
		 
  } 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值