微信公众号开发之[发送模板消息]

1、什么是模板消息?

微信为防止服务号对用户进行恶意骚扰和营销,而服务号在某些场景又必须给用户发送消息时(如购物成功、支付成功),这时候就可以应用微信提供的模板消息来给用户进行提醒。

比如:


2、怎么添加模板消息?

在微信公众号后台菜单里面有模板消息一栏,点击进去后可以看到模板库,可以根据自己的实际需要添加自己需要的模板消息,模板涵盖各行各业,暂不可自己编辑模板。



 

微信限制最多只能选择8个模板,应该也够用了。选中模板后就可以看到模板ID、标题等,这里已购买成功为列,查看详情时:



 可以看到该模板需要提供的相关参数,这样就可以拼装请求的参数了。

这一步主要是要拿到模板的ID和该模板需要的参数名。

3、怎么请求发送模板?

 
第一步:获取模板ID
通过在模板消息功能的模板库中使用需要的模板,可以获得模板ID。
第二步:请求接口
请注意,URL置空,则在发送后,点击模板消息会进入一个空白页面(ios),或无法点击(android)。
POST请求
https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN

 其中的POST请求中需要两个基本的技术要点:

    1、获取ACCESS_TOKEN。

    2、如何提交POST请求。

具体请参考开发教程系列获取ACCESS_TOKEN篇,http://kangliang.iteye.com/admin/blogs/21617

然后组装需要的JSON信息:

如:

 

Json代码   收藏代码
  1. {  
  2.     "touser""OPENID",  
  3.     "template_id""ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY",  
  4.     "url""http://weixin.qq.com/download",  
  5.     "topcolor""#FF0000",  
  6.     "data": {  
  7.         "firstData": {  
  8.             "value""恭喜您购物成功!",  
  9.             "color""#173177"  
  10.         },  
  11.         "product": {  
  12.             "value""韩版西服",  
  13.             "color""#173177"  
  14.         },  
  15.         "price": {  
  16.             "value""149元",  
  17.             "color""#173177"  
  18.         },  
  19.         "time": {  
  20.             "value""2014-12-04 13:09:17",  
  21.             "color""#173177"  
  22.         },  
  23.         "remark": {  
  24.             "value""感谢您的光临,我们将尽快发货!",  
  25.             "color""#173177"  
  26.         }  
  27.     }  
  28. }  

 因模板消息属于固定格式,可在代码中写死拼装方式:

 

 

   组装json信息:

 

Java代码   收藏代码
  1. /** 商品购买成功 
  2.  * templateId 模板ID 
  3.  * orderId  订单id 
  4.  *  
  5.  */  
  6. String toTemplateMsgText(String orderId,String templateId){  
  7.     OrderResponse response=getOrderByOrderId(orderId);  
  8.     //查询订单信息  
  9.     Order order=response.getOrder();  
  10.     String first="您好,欢迎在新礼特购物!";  
  11.     String remark="您的收货信息:"+order.getReceiver_name()+" 电话:" +order.getReceiver_mobile()+" 地址:"+order.getReceiver_city()+order.getReceiver_zone()+order.getReceiver_address()+" 我们将尽快发货,祝您购物愉快!";  
  12.     String jsonText="{\"touser\":\"OPENID\",\"template_id\":\"templateId\",\"url\":\"\",\"topcolor\":\"#FF0000\",\"data\":{\"first\": {\"value\":\"firstData\",\"color\":\"#173177\"},\"product\": {\"value\":\"productData\",\"color\":\"#173177\"},\"price\": {\"value\":\"priceData\",\"color\":\"#173177\"},\"time\": {\"value\":\"timeData\",\"color\":\"#173177\"},\"remark\": {\"value\":\"remarkData\",\"color\":\"#173177\"}}}";  
  13.     jsonText= jsonText.replace("firstData", first).replace("templateId", templateId).replace("OPENID", order.getBuyer_openid()).replace("productData", order.getProduct_name()).replace("priceData",order.getOrder_total_price()/100f+"元").replace("timeData", order.getOrder_create_time()).replace("remarkData", remark);  
  14.      return jsonText;  
  15.     }  

 

 

发送消息:

 

Java代码   收藏代码
  1. /** 
  2.  * 发送模板消息 
  3.  * @param accessToken 
  4.  * @param jsonData 
  5.  */  
  6. public static void sendTemplateMsg(String accessToken,String jsonData){  
  7.     String requestUrl=send_templatemsg_url.replace("ACCESS_TOKEN", accessToken);  
  8.     JSONObject jsonObject = httpRequest(requestUrl, "GET", jsonData);  
  9.     if(jsonObject!=null){  
  10.         if("0".equals(jsonObject.getString("errcode"))){  
  11.             System.out.println("发送模板消息成功!");  
  12.         }else{  
  13.             System.out.println(jsonObject.getString("errcode"));  
  14.         }  
  15.     }  
  16. }  

 

 

另附上httpRequest请求方法:

 

Java代码   收藏代码
  1. /** 
  2.  * 发起https请求并获取结果 
  3.  *  
  4.  * @param requestUrl 请求地址 
  5.  * @param requestMethod 请求方式(GET、POST) 
  6.  * @param outputStr 提交的数据 
  7.  * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值) 
  8.  */  
  9. public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr) {  
  10.     JSONObject jsonObject = null;  
  11.     StringBuffer buffer = new StringBuffer();  
  12.     try {  
  13.         // 创建SSLContext对象,并使用我们指定的信任管理器初始化  
  14.         TrustManager[] tm = { new MyX509TrustManager() };  
  15.         SSLContext sslContext = SSLContext.getInstance("SSL""SunJSSE");  
  16.         sslContext.init(null, tm, new java.security.SecureRandom());  
  17.         // 从上述SSLContext对象中得到SSLSocketFactory对象  
  18.         SSLSocketFactory ssf = sslContext.getSocketFactory();  
  19.   
  20.         URL url = new URL(requestUrl);  
  21.         HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();  
  22.         httpUrlConn.setSSLSocketFactory(ssf);  
  23.   
  24.         httpUrlConn.setDoOutput(true);  
  25.         httpUrlConn.setDoInput(true);  
  26.         httpUrlConn.setUseCaches(false);  
  27.         // 设置请求方式(GET/POST)  
  28.         httpUrlConn.setRequestMethod(requestMethod);  
  29.   
  30.         if ("GET".equalsIgnoreCase(requestMethod))  
  31.             httpUrlConn.connect();  
  32.   
  33.         // 当有数据需要提交时  
  34.         if (null != outputStr) {  
  35.             OutputStream outputStream = httpUrlConn.getOutputStream();  
  36.             // 注意编码格式,防止中文乱码  
  37.             outputStream.write(outputStr.getBytes("UTF-8"));  
  38.             outputStream.close();  
  39.         }  
  40.   
  41.         // 将返回的输入流转换成字符串  
  42.         InputStream inputStream = httpUrlConn.getInputStream();  
  43.         InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");  
  44.         BufferedReader bufferedReader = new BufferedReader(inputStreamReader);  
  45.   
  46.         String str = null;  
  47.         while ((str = bufferedReader.readLine()) != null) {  
  48.             buffer.append(str);  
  49.         }  
  50.         bufferedReader.close();  
  51.         inputStreamReader.close();  
  52.         // 释放资源  
  53.         inputStream.close();  
  54.         inputStream = null;  
  55.         httpUrlConn.disconnect();  
  56.         jsonObject = JSONObject.fromObject(buffer.toString());  
  57.     } catch (ConnectException ce) {  
  58.     } catch (Exception e) {  
  59.     }  
  60.     return jsonObject;  
  61. }  

 

 

事件推送

在模版消息发送任务完成后,微信服务器会将是否送达成功作为通知,发送到开发者中心中填写的服务器配置地址中。

1、送达成功时,推送的XML如下:

Xml代码   收藏代码
  1. <xml>  
  2. <ToUserName><![CDATA[gh_7f083739789a]]></ToUserName>  
  3. <FromUserName><![CDATA[oia2TjuEGTNoeX76QEjQNrcURxG8]]&g;</FromUserName> 
  4. <CreateTime>1395658920</CreateTime> 
  5. <MsgType><![CDATA[event]]></MsgType>  
  6. <Event><![CDATA[TEMPLATESENDJOBFINISH]]></Event>  
  7. <MsgID>200163836</MsgID>  
  8. <Status><![CDATA[success]]></Status>  
  9. </xml>  

 2、送达由于用户拒收(用户设置拒绝接收公众号消息)而失败时,推送的XML如下:

Xml代码   收藏代码
  1. <xml>  
  2. <ToUserName><![CDATA[gh_7f083739789a]]></ToUserName>  
  3. <FromUserName><![CDATA[oia2TjuEGTNoeX76QEjQNrcURxG8]]></FromUserName>  
  4. <CreateTime>1395658984</CreateTime>  
  5. <MsgType><![CDATA[event]]></MsgType>  
  6. <Event><![CDATA[TEMPLATESENDJOBFINISH]]></Event>  
  7. <MsgID>200163840</MsgID>  
  8. <Status><![CDATA[failed:user block]]></Status>  
  9. </xml>  

 

 

在调用模板消息接口后,会返回JSON数据包。正常时的返回JSON数据包示例:

{
"errcode":0,
"errmsg":"ok",
"msgid":200228332
}

 

在根据相应的事件监听,就可以获取发送的状态,而及时对消息进行重复或其他的操作。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值