微信公众号开发中遇到的问题——模板信息,自定义回复,一次请求多次相应(四)

来源:互联网 发布:android 2高级编程 编辑:程序博客网 时间:2024/05/21 05:21
一、模板消息
使用场景:当用户注册成功,支付成功的时候,为了方便提醒用户,或者为了提醒卖家发货时,可以用到模板消息。

模板消息的使用方法如下:
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");//openIdtemplate.setTemplate_id("在模板库中添加的模板信息的id");//模版消息Idtemplate.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;//关键词1private Model keyword2;//关键词2private 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;//openIdprivate String template_id;//模版消息Idprivate 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提交
③如果碰到特殊的情况,如微信支付完回调方法,是由微信发起的请求,它同样也会请求多次,如果你程序中是这样处理逻辑的:当微信回调后,如果支付成功,就给用户发送支付成功提醒,这时候如果微信对同一订单回调了多次,那你就给用户发送了多次支付提醒,这会吓到用户的。这个时候,可以使用一些状态信息来避免重复提醒;
2 0
原创粉丝点击