微信公众号开发中遇到的问题——模板信息,自定义回复,一次请求多次相应
来源:互联网 发布:原始原素 知乎 编辑:程序博客网 时间:2024/05/10 15:49
http://blog.csdn.net/u013076997/article/details/52814139
一、模板消息
使用场景:当用户注册成功,支付成功的时候,为了方便提醒用户,或者为了提醒卖家发货时,可以用到模板消息。模板消息的使用方法如下:1、打开微信公众平台,功能————模板消息或者也可以在添加功能插件中2、添加模板前,需要确定一下微信公众号注册时营业执照的行业;行业选定后,提交审核,审核时间1天到1周不等;3、审核成功后,微信就会按照所选的行业,提供模板库,然后当我们需要模板信息时,就从模板库中添加;注:最多只能选择25个模板,当然这肯定足够用了;4、模板添加完成之后,就涉及如何使用了: 拿注册来举例,注册成功后,在注册成功方法中调用模板消息接口发送消息:
①注册成功之后的调用的方法:
-
-
-
-
- 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");
- template.setTemplate_id("在模板库中添加的模板信息的id");
- template.setUrl("用户点击模板信息后跳转的地址");
- template.setTopcolor("模板头部的颜色");
- AdvancedUtil.sendTemplate("调用接口所需的token", template);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
②调用接口方法
-
-
-
-
-
-
- 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方法
-
-
-
-
-
-
-
-
- public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {
- JSONObject jsonObject = null;
- try {
-
- TrustManager[] tm = { new MyX509TrustManager() };
- SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
- sslContext.init(null, tm, new java.security.SecureRandom());
-
- 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);
-
- conn.setRequestMethod(requestMethod);
-
-
- 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;
- private Model keyword2;
- 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类
-
-
-
-
- public class BaseTemplate {
-
- private String touser;
- private String template_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提交③如果碰到特殊的情况,如微信支付完回调方法,是由微信发起的请求,它同样也会请求多次,如果你程序中是这样处理逻辑的:当微信回调后,如果支付成功,就给用户发送支付成功提醒,这时候如果微信对同一订单回调了多次,那你就给用户发送了多次支付提醒,这会吓到用户的。这个时候,可以使用一些状态信息来避免重复提醒; 0 0