微信全网发布检测出现的问题
来源:互联网 发布:mac怎么打开c盘 编辑:程序博客网 时间:2024/06/05 09:59
微信全网发布监测,需要检测的有以下几项:
1、组件ticket正确接收;
2、生成预授权码;
3、获取授权code;
4、授权;
5、返回Api文本消息;
6、返回普通文本消息;
7、发送事件消息;
8、取消授权。
其中,1,2,3,4,8这几项是授权的基本功能,基本上不会有人在这几个地方出现问题。
而我们真正需要处理的,只有5,6,7这三项,这里需要程序里面添加额外的程序来处理。另外建议在程序里面加上详细的日志,将微信发送过来的数据,和我们向他发送消息的返回值详细的记录下来,以便调试程序。
AesException
补上,有的人可能会报AesException,这是因为用到了jdk sercurity, 而jdk sercurity 使用的jar包 $JAVA_HOME/lib/security/local_policy.jar 和 $JAVA_HOME/jre6_64/lib/security/US_export_policy.jar中有对技术出口的限制,加密只有128bit,而没有限制的则有256bit.
解决办法:
1. 按照版本选择下载 Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 8
2. 下载jce_policy-1_8_2.zip后解压,放入$JAVA_HOME/lib/security/目录下替换原来的jar包。
返回Api文本消息
微信会向我们推送一个文本消息过来(消息需要解密),这里需要我们将它推送过来的消息里面的query_auth_code提取出来,作为authorization_code调用“使用授权码换取公众号的授权信息”接口去获取操作测试微信账号所需要的authorizer_access_token。获取到token之后,就可以调用发送客服消息api向腾讯发送文本消息。
消息的格式:
{ "touser":"OPENID", "msgtype":"text", "text": { "content":"Hello World" }}
content就是刚刚从消息里面提取出来的query_auth_code+"from_api",touser的值openid是从刚刚接收到的消息里面获取到的发送人的id。这里,官方文档上面有说明收到消息的时候先回复一个空字符串,但是实际上这里是可以不回复的,只要在5秒只内完成api消息回复。另外,还要注意非常重要的一点,发送过去的api文本消息是不需要加密的,微信的文档上这个地方没有说清楚(如果发送客服消息微信返回40003,检查一下这里是否加密了,把加密去掉)。
返回普通文本消息
这个地方很简单,微信会向我们推送一个文本消息过来(消息需要解密),内容是TESTCOMPONENT_MSG_TYPE_TEXT,这是固定值,不是变量,我们收到消息消息之后,(Java)直接调用response回复一条消息给他,注意消息的格式是被动回复用户消息,跟上面那个不一样。
消息的格式:
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>12345678</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[TESTCOMPONENT_MSG_TYPE_TEXT_callback]]></Content> </xml>
返回事件消息
微信会向我们推送一个消息过来(消息需要解密),这里的处理和返回普通文本消息类似,收到微信推送过来的事件消息之后,用response回复一条消息,消息的格式同上,内容为even+"from_callback",实际测试even的值固定是location(估计是他们那边的人偷懒),所以这里回复它的消息内容可以固定为LOCATIONfrom_callback。这里回复的消息也是需要加密的。
如果有朋友对这里或者授权开发的有疑问,或者对源码有需要,请留言!
成功截图
其中content值为TESTCOMPONENT_MSG_TYPE_TEXT_callback固定值。这里返回的普通文本消息是需要解密的。
返回事件消息
微信会向我们推送一个消息过来(消息需要解密),这里的处理和返回普通文本消息类似,收到微信推送过来的事件消息之后,用response回复一条消息,消息的格式同上,内容为even+"from_callback",实际测试even的值固定是location(估计是他们那边的人偷懒),所以这里回复它的消息内容可以固定为LOCATIONfrom_callback。这里回复的消息也是需要加密的。
如果有朋友对这里或者授权开发的有疑问,或者对源码有需要,请留言!
成功截图
以下是部分源码(步骤1的源码没在其中,这个地方因为不会有人出问题,所以就懒得贴了):
public class WechatPublishCheck { public static void check(HttpServletRequest request, HttpServletResponse response) { String msgSignature = request.getParameter("msg_signature"); String timeStamp = request.getParameter("timestamp"); String nonce = request.getParameter("nonce"); String sendToWechatStr = ""; LIVE800LOGGER.logDebug("进入微信全网发布测试"); Map < String, String > requestMap = null; String postDataXml = null; try { postDataXml = StringUtil.dealWithInputStream(request.getInputStream()); LIVE800LOGGER.logDebug("解密之前的postDataXml=" + postDataXml); postDataXml = WechatComponentInfo.getWXBizMsgCrypt().decryptMsg2(msgSignature, timeStamp, nonce, postDataXml); LIVE800LOGGER.logDebug("解密之后的postDataXml=" + postDataXml); } catch(AesException e) { LIVE800LOGGER.logError("解密微信推送的消息出错", e); return; } catch(Exception e) { LIVE800LOGGER.logError("处理inputstream出错", e); return; } try { requestMap = MsgConverterUtil.parseXml(postDataXml); LIVE800LOGGER.logDebug("requestMap=" + requestMap.toString()); } catch(MsgConvertException e) { LIVE800LOGGER.logError("----------------", e); return; } catch(DocumentException e) { LIVE800LOGGER.logError("----------------", e); return; } catch(IOException e) { LIVE800LOGGER.logError("----------------", e); return; } //响应事件推送消息 String msgType = requestMap.get("MsgType").toString(); LIVE800LOGGER.logDebug("msgType=" + msgType); if (msgType.contains("event") || requestMap.containsKey("Event")) { LIVE800LOGGER.logDebug("进入响应事件推送消息!"); String event = requestMap.get("Event").toString(); StringBuilder sendToWechatXml = new StringBuilder(); //构造回复的字符串 sendToWechatXml.append("<xml>"); sendToWechatXml.append("<ToUserName><![CDATA[" + requestMap.get("FromUserName").toString() + "]]></ToUserName>"); sendToWechatXml.append("<FromUserName><![CDATA[" + requestMap.get("ToUserName").toString() + "]]></FromUserName>"); sendToWechatXml.append("<CreateTime>" + System.currentTimeMillis() + "</CreateTime>"); sendToWechatXml.append("<MsgType><![CDATA[text]]></MsgType>"); sendToWechatXml.append("<Content><![CDATA[" + event + "from_callback]]></Content>"); sendToWechatXml.append("</xml>"); LIVE800LOGGER.logDebug("准备响应微信事件的加密之前的文本消息=" + sendToWechatXml.toString()); try { sendToWechatStr = WechatComponentInfo.getWXBizMsgCrypt().encryptMsg(sendToWechatXml.toString(), timeStamp, nonce); LIVE800LOGGER.logDebug("准备响应微信事件的加密之后的文本消息=" + sendToWechatStr); try { response.getWriter().write(sendToWechatStr); return; } catch(IOException e) { LIVE800LOGGER.logError("----------------", e); return; } } catch(AesException e) { LIVE800LOGGER.logError("加密微信发送的消息出错", e); return; } } //回复文本消息 try { if (requestMap != null && requestMap.get("Content") != null && requestMap.get("Content").toString().equals("TESTCOMPONENT_MSG_TYPE_TEXT")) { LIVE800LOGGER.logDebug("开始回复文本消息!"); StringBuilder sendToWechatXml = new StringBuilder(); //构造回复的字符串 sendToWechatXml.append("<xml>"); sendToWechatXml.append("<ToUserName><![CDATA[" + requestMap.get("FromUserName").toString() + "]]></ToUserName>"); sendToWechatXml.append("<FromUserName><![CDATA[" + requestMap.get("ToUserName").toString() + "]]></FromUserName>"); sendToWechatXml.append("<CreateTime>" + System.currentTimeMillis() + "</CreateTime>"); sendToWechatXml.append("<MsgType><![CDATA[text]]></MsgType>"); sendToWechatXml.append("<Content><![CDATA[TESTCOMPONENT_MSG_TYPE_TEXT_callback]]></Content>"); sendToWechatXml.append("</xml>"); LIVE800LOGGER.logDebug("准备响应微信的加密之前的文本消息=" + sendToWechatXml.toString()); try { sendToWechatStr = WechatComponentInfo.getWXBizMsgCrypt().encryptMsg(sendToWechatXml.toString(), timeStamp, nonce); LIVE800LOGGER.logDebug("准备响应微信的加密之后的文本消息=" + sendToWechatStr); response.getWriter().write(sendToWechatStr); return; } catch(AesException e) { LIVE800LOGGER.logError("加密微信发送的消息出错", e); return; } } } catch(IOException e) { LIVE800LOGGER.logError("response error,TESTCOMPONENT_MSG_TYPE_TEXT_callback,uri:"); return; } //调用微信api回复文本消息 LIVE800LOGGER.logDebug("开始调用微信api回复文本消息!"); String queryAuthCode = requestMap.get("Content").toString(); if (queryAuthCode.startsWith("QUERY_AUTH_CODE")) { try { PrintWriter printWriter = response.getWriter(); printWriter.write(""); printWriter.flush(); } catch(IOException e) { LIVE800LOGGER.logDebug("发送空字符串失败!"); return; } LIVE800LOGGER.logDebug("获取到推送的queryAuthCode=" + queryAuthCode); String authion_code = queryAuthCode.split(":")[1]; StringBuilder sendToWechatJson = new StringBuilder("{"); sendToWechatJson.append("\"touser\":\"" + requestMap.get("FromUserName").toString() + "\","); sendToWechatJson.append("\"msgtype\":\"text\","); sendToWechatJson.append("\"text\":{\"content\":\"" + authion_code + "_from_api\"}"); sendToWechatJson.append("}"); WechatAuthorizerAccessToken authorizerAccessToken = new WechatAuthorizerAccessToken(); authorizerAccessToken.setAuthorizationCode(authion_code); LIVE800LOGGER.logDebug("获取到的授权的测试公众号的token=" + authorizerAccessToken.getToken()); LIVE800LOGGER.logDebug("调用微信客服消息发送接口,发送过去的消息为:sendToWechatJson=" + sendToWechatJson.toString()); MsgSendResult msgSendResult = WechatServerAccessor.sendMsg(authorizerAccessToken, sendToWechatJson.toString()); LIVE800LOGGER.logDebug("发送微信的api消息,发送结果:result=" + msgSendResult.getResult() + ",reponseContent" + msgSendResult.getReponseContent()); return; } }
转自: http://blog.csdn.net/dk947960731/article/details/52204408
- 微信全网发布检测出现的问题
- 微信全网发布检测出现的问题
- v540 检测出现的问题
- MFC发布软件出现的问题
- 发布APP时出现的问题
- ios发布可能出现的问题
- QT发布时经常出现的问题
- 关于pojo发布webservice出现的问题
- iOS 检测内存泄漏Analyze出现的一些问题
- Ubuntu提示检测到系统程序出现问题的解决方案
- IIS应用程序发布的时候出现的问题
- Alfresco在iis发布的时候出现的问题
- VB中IIS Application发布可能出现的问题
- 关于禁用发布可能出现的问题处理
- VC发布release版本出现问题的解决方案!
- Qt5.01 + MinGW4.7 部署发布程序出现的问题
- Unity3d 编译发布到安卓平台时出现的问题集
- IIS7发布MVC出现的坑爹问题
- win10(64bit)上安装MySQL-python
- Java
- 安卓控件ViewFlipper垂直滚动广告条
- opencv-图像入门
- 记录一个bug
- 微信全网发布检测出现的问题
- 物体分割--Deep Watershed Transform for Instance Segmentation
- 网址正则校验
- Java网络编程InetAddress
- HTTP协议—— 简单认识TCP/IP协议
- Java面试题全集(下)
- JDK与Java SE/EE/ME的区别
- 安装logstash,elasticsearch,kibana三件套
- 首家共享充电宝宣布关停后 创始人这样解释