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
通过在模板消息功能的模板库中使用需要的模板,可以获得模板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信息:
如:
{ "touser": "OPENID", "template_id": "ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY", "url": "http://weixin.qq.com/download", "topcolor": "#FF0000", "data": { "firstData": { "value": "恭喜您购物成功!", "color": "#173177" }, "product": { "value": "韩版西服", "color": "#173177" }, "price": { "value": "149元", "color": "#173177" }, "time": { "value": "2014-12-04 13:09:17", "color": "#173177" }, "remark": { "value": "感谢您的光临,我们将尽快发货!", "color": "#173177" } } }
因模板消息属于固定格式,可在代码中写死拼装方式:
组装json信息:
/** 商品购买成功 * templateId 模板ID * orderId 订单id * */ String toTemplateMsgText(String orderId,String templateId){ OrderResponse response=getOrderByOrderId(orderId); //查询订单信息 Order order=response.getOrder(); String first="您好,欢迎在新礼特购物!"; String remark="您的收货信息:"+order.getReceiver_name()+" 电话:" +order.getReceiver_mobile()+" 地址:"+order.getReceiver_city()+order.getReceiver_zone()+order.getReceiver_address()+" 我们将尽快发货,祝您购物愉快!"; 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\"}}}"; 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); return jsonText; }
发送消息:
/** * 发送模板消息 * @param accessToken * @param jsonData */ public static void sendTemplateMsg(String accessToken,String jsonData){ String requestUrl=send_templatemsg_url.replace("ACCESS_TOKEN", accessToken); JSONObject jsonObject = httpRequest(requestUrl, "GET", jsonData); if(jsonObject!=null){ if("0".equals(jsonObject.getString("errcode"))){ System.out.println("发送模板消息成功!"); }else{ System.out.println(jsonObject.getString("errcode")); } } }
另附上httpRequest请求方法:
/** * 发起https请求并获取结果 * * @param requestUrl 请求地址 * @param requestMethod 请求方式(GET、POST) * @param outputStr 提交的数据 * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值) */ public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr) { JSONObject jsonObject = null; StringBuffer buffer = new StringBuffer(); try { // 创建SSLContext对象,并使用我们指定的信任管理器初始化 TrustManager[] tm = { new MyX509TrustManager() }; SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE"); sslContext.init(null, tm, new java.security.SecureRandom()); // 从上述SSLContext对象中得到SSLSocketFactory对象 SSLSocketFactory ssf = sslContext.getSocketFactory(); URL url = new URL(requestUrl); HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection(); httpUrlConn.setSSLSocketFactory(ssf); httpUrlConn.setDoOutput(true); httpUrlConn.setDoInput(true); httpUrlConn.setUseCaches(false); // 设置请求方式(GET/POST) httpUrlConn.setRequestMethod(requestMethod); if ("GET".equalsIgnoreCase(requestMethod)) httpUrlConn.connect(); // 当有数据需要提交时 if (null != outputStr) { OutputStream outputStream = httpUrlConn.getOutputStream(); // 注意编码格式,防止中文乱码 outputStream.write(outputStr.getBytes("UTF-8")); outputStream.close(); } // 将返回的输入流转换成字符串 InputStream inputStream = httpUrlConn.getInputStream(); InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8"); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); String str = null; while ((str = bufferedReader.readLine()) != null) { buffer.append(str); } bufferedReader.close(); inputStreamReader.close(); // 释放资源 inputStream.close(); inputStream = null; httpUrlConn.disconnect(); jsonObject = JSONObject.fromObject(buffer.toString()); } catch (ConnectException ce) { } catch (Exception e) { } return jsonObject; }
事件推送
在模版消息发送任务完成后,微信服务器会将是否送达成功作为通知,发送到开发者中心中填写的服务器配置地址中。
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>
在调用模板消息接口后,会返回JSON数据包。正常时的返回JSON数据包示例:
{ "errcode":0, "errmsg":"ok", "msgid":200228332 }
在根据相应的事件监听,就可以获取发送的状态,而及时对消息进行重复或其他的操作。
相关推荐
它提供了一个后台管理系统,用于管理微信公众号的推送功能,包括消息的生成、发送、用户管理、通道管理等。通过该系统,用户可以方便地进行微信公众号的消息推送和管理。 ## 项目的主要特性和功能 1. 消息推送管理...
springboot实现微信公众号模版消息推送,用的是构架:springboot+redis,详细教程:https://blog.csdn.net/chenhongming888/article/details/95173079
微信消息通知,给微信公众号用户发送消息通知 本程序用laravel框架,使用的时候请根据自己的目录结构自行修改命名空间和类名继承等信息
给女朋友做的微信公众号消息每日自动推送天气及纪念日通知教程,该教程为github每日自动线上运行版本。本人亲测妹子很喜欢~女孩子都喜欢这种用心做的东西! 1.最新版本 成品 +源码 +消息模板 (需要自己申请 天行 ...
微信公众号模板消息推送SpringBoot定时任务版本-VxMessage
phpWeChat PC+微信公众号开发核心框架v1.0.3针对v1.0.2版本出现的问题,主要修复了和增加了以下功能: 1、优化自定义模块操作; 2、优化安装过程; 3、修复一处在线支付的PHP版本兼容问题; 4、修复一处自定义模块的...
5.4 微信发送功能 (1) 群发微信。 (2) 向指定群组发送微信。 (3) 向指定人员发送微信。...(2) 第三方应用程序通过约定接口,获取微信公众号的通讯录信息。 (3) 第三方应用程序通过约定接口,获取微信模板信息。
以下是对微信公众号开发文档的主要内容和特点的概述: 一、开发文档概述 目的:为开发者提供全面的指导,使其能够充分利用微信公众平台的各项功能,创建出富有创新性和实用性的应用。 内容:包括开发规则与指南、...
6.发送模板消息 7.创建自定义菜单 8.获取自定义菜单 9.获取用户信息 10.获取微信服务器IP 11.获取access_token 12.获取用户授权Token 13.回复文本消息 14.回复图文消息 15.消息接收并解析接口 16.接口地址认证检查 ...
1.基于WxJava - 微信开发 Java SDK 2.实现关注、取关逻辑 3.实现消息被动回复 4.实现个人信息网页授权 5.提供基本业务功能
TNW 微信公众号开发脚手架,支持任何 Node.js 的服务端框架 Android 微信、支付App支付SDK IJPay 让支付触手可及,实现微信、支付宝系列支付 博客 简易的微信公众号管理平台 搭建属于自己的网穿透工具 ...
【delphi微信公众号】支持获取Access token、用户管理、模板消息、客服消息、接收消息、被动回复用户消息、素材管理等,D7~XE10通用。微信公众号api文档:...
功能(获取access_token,消息接收,文字消息回复,自定义菜单,模板消息发送,二维码生成,网页授权) 没连数据库的那种demo
资源内容可在java微信公众号项目的开发中使用,完成了应用服务端与微信端的消息接收反馈处理,封装各项功能:消息类型实体类、加密工具、xml解析工具、http工具、token获取存储、自定义菜单创建删除、模板消息发送、...
包括以下功能: 1、获取token 2、获取js_ticket 3、上传多媒体文件 4、下载多媒体文件 5、发送客服消息 ...7、发送模板消息 8、网页授权 9、js_sdk 签名 10、被动回复消息 有使用方面的问题加qq: 3046707616
微信公众号管理系统是一个基于Spring Boot框架开发的后台管理系统,支持多公众号接入。系统提供了丰富的功能,包括公众号菜单管理、自动回复、素材管理、模板消息发送、粉丝管理等。通过该系统,用户可以方便地管理...
java spring boot框架下的微信公众号开发,供参考。包含基础接入,机器人回复文字或图文消息,欢迎消息,设置自定义菜单,推送模板消息,换取网页授权access_token(snsapi_base方式)
6、模板发送消息 7、参数二维码生成 8、扫描参数二维码接收参数和用户openid PS:代码仅供参考,需要在服务号上配置和获取 token,AppID,AppSecret,access_token以及设置网页OAuth2.0鉴权的网页地址。 全程几乎无...
jwx是开源的java公众号开发MVC框架,基于spring配置文件和微信消息或事件注解,通过微信上下文处理一个或多个微信公众号服务请求。目的主要有两个,其一生封装微信请求xml消息为java实体对象,将返回对象转换为xml...