微信公众号开发中遇到的问题——模板信息,自定义回复,一次请求多次相应(四)
2016-10-14 11:26
555 查看
一、模板消息
使用场景:当用户注册成功,支付成功的时候,为了方便提醒用户,或者为了提醒卖家发货时,可以用到模板消息。
模板消息的使用方法如下:
1、打开微信公众平台,功能————模板消息
或者也可以在添加功能插件中
2、添加模板前,需要确定一下微信公众号注册时营业执照的行业;行业选定后,提交审核,审核时间1天到1周不等;
3、审核成功后,微信就会按照所选的行业,提供模板库,然后当我们需要模板信息时,就从模板库中添加;注:最多只能选择25个模板,当然这肯定足够用了;
4、模板添加完成之后,就涉及如何使用了:
拿注册来举例,注册成功后,在注册成功方法中调用模板消息接口发送消息:
①注册成功之后的调用的方法:
②调用接口方法
③httpRequest方法
④ Model类
⑤RegisData类
⑥TemplateReverse类
⑦Data类
⑧BaseTemplate类
二、消息自定义回复
有时候我们想根据用户发送特定的内容给用户回复特定的消息;之前有个客户就是想把输入框做成类似于搜索框;譬如我输入“梅西”,梅西的个人简介就回复过来,我输入“库里”,库里的个人信息就回复过来等等;其实很简单,只需要在数据库中维护一个规则表即可,规则表中,把梅西与梅西简介,库里与库里简介对应起来即可;另外可能用户还会发送一些图片,语音,地理位置等特殊信息,这时候我们根据信息的类型回复对应的信息即可;
三、一次请求多次响应
使用微信开发的朋友都知道,有时候发送一个请求,微信会做出两条,三条或者更多次响应,如果程序中没有做处理,可能就会导致数据出错;除了微信提供的“根据msgId进行信息排重”之外,我认为自己程序中也需要一些特殊的处理:
①尽量把一次请求请求完之后,重定向到另外一个方法,这样做是很有必要的;
②尽量使用post提交
③如果碰到特殊的情况,如微信支付完回调方法,是由微信发起的请求,它同样也会请求多次,如果你程序中是这样处理逻辑的:当微信回调后,如果支付成功,就给用户发送支付成功提醒,这时候如果微信对同一订单回调了多次,那你就给用户发送了多次支付提醒,这会吓到用户的。这个时候,可以使用一些状态信息来避免重复提醒;
使用场景:当用户注册成功,支付成功的时候,为了方便提醒用户,或者为了提醒卖家发货时,可以用到模板消息。
模板消息的使用方法如下:
1、打开微信公众平台,功能————模板消息
或者也可以在添加功能插件中
2、添加模板前,需要确定一下微信公众号注册时营业执照的行业;行业选定后,提交审核,审核时间1天到1周不等;
3、审核成功后,微信就会按照所选的行业,提供模板库,然后当我们需要模板信息时,就从模板库中添加;注:最多只能选择25个模板,当然这肯定足够用了;
4、模板添加完成之后,就涉及如何使用了:
拿注册来举例,注册成功后,在注册成功方法中调用模板消息接口发送消息:
①注册成功之后的调用的方法:
/** * 注册成功之后发送模板信息 * @param openid */ private void sendRegisterTemplate(){ try { Model first = new Model("恭喜您,注册成功!", "#000000"); Model keyword1 = new Model("张三", "#000000"); Model keyword2 = new Model("131XXXXXXX", "#000000"); Model remark = new Model("开始尽情的购物吧!", "#000000"); RegisterData data = new RegisterData(first, keyword1, keyword2, remark); TemplateReserve template = new TemplateReserve(data); template.setTouser("接收信息人的openid");//openId template.setTemplate_id("在模板库中添加的模板信息的id");//模版消息Id template.setUrl("用户点击模板信息后跳转的地址");//模版点击后链接的地方 template.setTopcolor("模板头部的颜色");//模版头颜色 AdvancedUtil.sendTemplate("调用接口所需的token", template); } catch (Exception e) { e.printStackTrace(); } }
②调用接口方法
/** * 发送模版消息 * @param accessToken 接口访问凭证 * @param template 消息模版 * * */ public static void sendTemplate(String accessToken,BaseTemplate template){ String requestUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN"; requestUrl = requestUrl.replace("ACCESS_TOKEN",accessToken); String postData = JSONObject.fromObject(template).toString(); JSONObject jsonObject = WSPostUtil.httpsRequest(requestUrl, "POST", postData); System.out.println(jsonObject.toString()); try { int errorCode = jsonObject.getInt("errcode"); String errorMsg = jsonObject.getString("errmsg"); if(errorCode==0){ log.info("模版发送成功 errcode:{} errmsg:{}", errorCode, errorMsg); }else{ log.error("模版发送失败 errcode:{} errmsg:{}", errorCode, errorMsg); } } catch (Exception e) { log.error("模版消息发送异常,"+e.getMessage()); } }
③httpRequest方法
/** * 发送https请求 * * @param requestUrl 请求地址 * @param requestMethod 请求方式(GET、POST) * @param outputStr 提交的数据 * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值) */ public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) { JSONObject jsonObject = null; 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 conn = (HttpsURLConnection) url.openConnection(); conn.setSSLSocketFactory(ssf); conn.setDoOutput(true); conn.setDoInput(true); conn.setUseCaches(false); // 设置请求方式(GET/POST) conn.setRequestMethod(requestMethod); // 当outputStr不为null时向输出流写数据 if (null != outputStr) { OutputStream outputStream = conn.getOutputStream(); // 注意编码格式 outputStream.write(outputStr.getBytes("UTF-8")); outputStream.close(); } // 从输入流读取返回内容 InputStream inputStream = conn.getInputStream(); InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8"); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); String str = null; StringBuffer buffer = new StringBuffer(); while ((str = bufferedReader.readLine()) != null) { buffer.append(str); } // 释放资源 bufferedReader.close(); inputStreamReader.close(); inputStream.close(); inputStream = null; conn.disconnect(); jsonObject = JSONObject.fromObject(buffer.toString()); } catch (ConnectException ce) { log.error("连接超时:{}", ce); } catch (Exception e) { log.error("https请求异常:{}", e); } return jsonObject; }
④ Model类
public class Model{ private String value; //内容 private String color; //字体颜色 public Model(String color) { this.color = color; } public Model() { super(); } public Model(String value, String color) { super(); this.value = value; this.color = color; } public String getValue() { return value; } public Model setValue(String value) { this.value = value; return this; } public String getColor() { return color; } public Model setColor(String color) { this.color = color; return this; } }
⑤RegisData类
public class RegisterData extends Data{ private Model first;//模板开始前描述 private Model keyword1;//关键词1 private Model keyword2;//关键词2 private Model remark;//模板结束描述 public RegisterData(Model first, Model keyword1, Model keyword2, Model remark) { this.first = first; this.keyword1 = keyword1; this.keyword2 = keyword2; this.remark = remark; } public Model getFirst() { return first; } public void setFirst(Model first) { this.first = first; } public Model getKeyword1() { return keyword1; } public void setKeyword1(Model keyword1) { this.keyword1 = keyword1; } public Model getKeyword2() { return keyword2; } public void setKeyword2(Model keyword2) { this.keyword2 = keyword2; } public Model getRemark() { return remark; } public void setRemark(Model remark) { this.remark = remark; } }
⑥TemplateReverse类
public class TemplateReserve extends BaseTemplate { private Data data; public TemplateReserve(Data data){ this.data = data; } public Data getData() { return data; } public void setData(Data data) { this.data = data; } }
⑦Data类
public abstract class Data { }
⑧BaseTemplate类
/** * 模版消息基类 * @author wangrr * */ public class BaseTemplate { private String touser; //openId private String template_id; //模版消息Id private String url; //模版点击后链接的地方 private String topcolor; //模版头颜色 public BaseTemplate() { } public String getTouser() { return touser; } public void setTouser(String touser) { this.touser = touser; } public String getTemplate_id() { return template_id; } public void setTemplate_id(String template_id) { this.template_id = template_id; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getTopcolor() { return topcolor; } public void setTopcolor(String topcolor) { this.topcolor = topcolor; }
二、消息自定义回复
有时候我们想根据用户发送特定的内容给用户回复特定的消息;之前有个客户就是想把输入框做成类似于搜索框;譬如我输入“梅西”,梅西的个人简介就回复过来,我输入“库里”,库里的个人信息就回复过来等等;其实很简单,只需要在数据库中维护一个规则表即可,规则表中,把梅西与梅西简介,库里与库里简介对应起来即可;另外可能用户还会发送一些图片,语音,地理位置等特殊信息,这时候我们根据信息的类型回复对应的信息即可;
三、一次请求多次响应
使用微信开发的朋友都知道,有时候发送一个请求,微信会做出两条,三条或者更多次响应,如果程序中没有做处理,可能就会导致数据出错;除了微信提供的“根据msgId进行信息排重”之外,我认为自己程序中也需要一些特殊的处理:
①尽量把一次请求请求完之后,重定向到另外一个方法,这样做是很有必要的;
②尽量使用post提交
③如果碰到特殊的情况,如微信支付完回调方法,是由微信发起的请求,它同样也会请求多次,如果你程序中是这样处理逻辑的:当微信回调后,如果支付成功,就给用户发送支付成功提醒,这时候如果微信对同一订单回调了多次,那你就给用户发送了多次支付提醒,这会吓到用户的。这个时候,可以使用一些状态信息来避免重复提醒;
相关文章推荐
- 微信公众号开发中遇到的问题——模板信息,自定义回复,一次请求多次相应
- iOS开发工具-如何使用网络封包分析工具Charles,通过配置proxy对http、https、tcp、udp 等协议的请求响应过程交互信息进行分析、判断、解决我们移动开发中的遇到的各种实际问题。
- WIN7下.Net开发遇到的又一问题:HTTP 错误 500.19 - Internal Server Error,无法访问请求的页面,因为该页的相关配置数据无效。
- 对于在多次请求之间共享信息的问题大家都是怎么处理的?
- 自定义ListView item包含checkbox实现单选记录自己开发是遇到的问题
- 安卓开发时酷派手机不打印请求网络信息问题的解决
- iOS开发 - 登陆post请求遇到的问题
- 【Richie Zhu】android开发时使用Android模拟器经常遇到连不上、连一次掉一次等诸多问题的解决方案
- iOS开发-------网络请求(自定义请求管理类,解决在Block中传值问题)
- Android应用插件化开发中自定义View基础插件遇到的问题
- 摘要 MAC,PIN,磁道密钥 在平时的工作中,很少接触安全这块内容,最近需要自己独立完成安全这块内容,在开发中遇到的问题会在下面的理解中得到相应的解决。 在交易平台中,基于安全考
- moss2007自定义工作流开发中运行install.bat文件遇到的问题及解决方法
- 微信公众号开发第四课 实现自定义关键字回复
- 开发AP通过snmp获取CPE配置信息并保存到xml显示到web,遇到的问题总结
- 一次项目开发过程中遇到的问题--错误的表单校验导致我的整个系统宕机
- ASP.NET开发web应用遇到的javascript跨域请求问题 推荐
- Android开发中遇到的问题(一)——自定义videoview设置视频大小,实现上下黑边
- ios开发 CLLocationManager获取位置信息时遇到的一个小问题
- 微信公众号自定义发送模板信息
- WIN7下.Net开发遇到的又一问题:HTTP 错误 500.19 - Internal Server Error,无法访问请求的页面,因为该页的相关配置数据无效。