1.微信回调模式
微信开发首先要开启回调模式,并且验证通过,才能进行微信各种功能的开发。微信回调模式开启有如下几个条件:
1、必须是80端口
2、必须调用微信提供的解密API
JAVA版本的微信回调模式,我是基于Spring开发的,基于文档可以很快的构建起微信回调的代码,如下:
/**
* 微信验证接口
* @param request
* @param response
* @throws IOException
*/
@RequestMapping(value = "index",method=RequestMethod.GET)
public void index(HttpServletRequest request,HttpServletResponse response) throws IOException {
String result = weiXinService.WxURLValidate(request);
PrintWriter out = response.getWriter();
out.write(result);
out.close();
}
其中WxURLValidate主要是调用微信验证函数:WXBizMsgCrypt,之后返回验证的结果,验证通过即可开启成功回调模式。
2.微信触发消息
微信触发操作,举个例子,当微信开启自定义菜单后,点击菜单会触发操作,但是在服务器端如果微信5s没有回复就会再次尝试,一共尝试三次。这样就会有一个问题,如果微信触发的操作5s内没有回复信息,那就会触发三次这样的操作,为了避免这样的问题,微信异步回复就是必须的。
所谓异步回复,说白了就是新开启一个线程,将微信触发的操作在新的线程中操作,在主线程中,直接设定微信回复信息。
举个例子,最近在做亚马逊领带的数据的抓取练习,当我点击数据处理->获取数据,如下图:
这个会触发后台获取数据操作,由于是获取网络上的数据在插入数据库,这样会由于网络的原因让服务器在5s内无法完成回复,所以引入了异步信息回复,我的解决方案如下:
WeiXinThread weiXinThread = new WeiXinThread(amazonGetDataService,returnVO.getToUserName(),1,null,tokenApi.getToken().getAccess_token());
new Thread(weiXinThread).start();
returnVO.setContent("数据获取中……"); //服务器返回信息
这样只是开启一个线程,之后是就是返回信息,这样速度回很快5s内自然会回复,就避免了微信服务器再次发送请求。
3.线程中如何保持事务处理
虽然解决了微信5s内回复的问题,但是又有新问题,如何在线程中获取spring的bean。我做了如下尝试:
1、在线程中直接注入,结果报错:
2、用代码容器获取,代码如下:
IAmazonBaseService amazonBaseService = ServerContext.getContext().getBean(AmazonBaseServiceImpl.class);
System.out.println(amazonBaseService.findAmazonDataByKey(null, null, null, null));
执行结果正常,可以输出查询结果。
在这个基础上进行更改,调用更改操作,经过验证也是可以的。
3、将本身的service从主线程中传递进入子线程,在子线程中就可以直接调用,经过测试也是可以的,代码如下:
WeiXinThread weiXinThread = new WeiXinThread(amazonGetDataService,returnVO.getToUserName(),1,null,tokenApi.getToken().getAccess_token());
其中amazonGetDataService是在主线程中注入的service。
经过以上操作,在子线程中可以操作数据库并保持事务处理。