From 65284320d8ddfe7018825b04bbb631f4ceadb67e Mon Sep 17 00:00:00 2001 From: Stormeye Wu Date: Sat, 23 Mar 2019 22:42:00 +0800 Subject: [PATCH] =?UTF-8?q?[=E5=85=AC=E4=BC=97=E5=8F=B7=E6=B6=88=E6=81=AF]?= =?UTF-8?q?[=E4=BF=AE=E6=94=B9]:=E7=AC=AC=E4=B8=89=E6=96=B9=E5=B9=B3?= =?UTF-8?q?=E5=8F=B0api=E5=A4=84=E7=90=86=E5=85=AC=E4=BC=97=E5=8F=B7?= =?UTF-8?q?=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/WechatCalllbackController.java | 86 +++++++------------ .../mp/controller/WxMpCallBackController.java | 8 +- 2 files changed, 37 insertions(+), 57 deletions(-) diff --git a/mlWechatOpen/src/main/java/com/iformall/controller/WechatCalllbackController.java b/mlWechatOpen/src/main/java/com/iformall/controller/WechatCalllbackController.java index 29c2dda..83e41bd 100644 --- a/mlWechatOpen/src/main/java/com/iformall/controller/WechatCalllbackController.java +++ b/mlWechatOpen/src/main/java/com/iformall/controller/WechatCalllbackController.java @@ -62,10 +62,23 @@ public class WechatCalllbackController extends BaseController { @Autowired private WxMpManager mpManager; - @RequestMapping(value = "/notify", method = RequestMethod.POST) + @PostMapping(value = "/notify") @ApiOperation("接收ticket回调") - public Object receiveTicket(HttpServletRequest request) throws IOException { + @ResponseBody + public String receiveTicket(HttpServletRequest request) throws IOException { logger.info("[" + getIpAddr() + "]接收微信回调 /wxOpen/notify"); + + String timestamp = request.getParameter("timestamp"); + String nonce = request.getParameter("nonce"); + String signature = request.getParameter("signature"); + String encType = request.getParameter("encrypt_type"); + String msgSignature = request.getParameter("msg_signature"); + + if (!StringUtils.equalsIgnoreCase("aes", encType) + || !openService.getWxOpenComponentService().checkSignature(timestamp, nonce, signature)) { + throw new IllegalArgumentException("非法请求,可能属于伪造的请求!"); + } + InputStream inStream = request.getInputStream(); ByteArrayOutputStream outSteam = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; @@ -79,21 +92,10 @@ public class WechatCalllbackController extends BaseController { outSteam.close(); inStream.close(); - String timestamp = request.getParameter("timestamp"); - String nonce = request.getParameter("nonce"); - String signature = request.getParameter("signature"); - String encType = request.getParameter("encrypt_type"); - String msgSignature = request.getParameter("msg_signature"); - logger.info("\n接收微信回调:[signature=[{}], encType=[{}], msgSignature=[{}]," + " timestamp=[{}], nonce=[{}], requestBody=[\n{}\n] ", signature, encType, msgSignature, timestamp, nonce, resultxml); - if (!StringUtils.equalsIgnoreCase("aes", encType) - || !openService.getWxOpenComponentService().checkSignature(timestamp, nonce, signature)) { - throw new IllegalArgumentException("非法请求,可能属于伪造的请求!"); - } - // aes加密的消息 WxOpenXmlMessage inMessage = WxOpenXmlMessage.fromEncryptedXml(resultxml, openService.getWxOpenConfigStorage(), timestamp, nonce, msgSignature); @@ -109,8 +111,8 @@ public class WechatCalllbackController extends BaseController { } }); } else if (inMessage.getInfoType().equals(EnumWxAuthorizationInfoType.AUTHORIZED.getMessage()) || - inMessage.getInfoType().equals(EnumWxAuthorizationInfoType.UPDATEAUTHORIZED.getMessage()) - ) { + inMessage.getInfoType().equals(EnumWxAuthorizationInfoType.UPDATEAUTHORIZED.getMessage())) { + // 审核通过 try { WxOpenQueryAuthResult queryAuthResult = openService.getWxOpenComponentService().getQueryAuth(inMessage.getAuthorizationCode()); logger.info("getQueryAuth", queryAuthResult); @@ -133,6 +135,7 @@ public class WechatCalllbackController extends BaseController { logger.error(e.getMessage()); } } else if (inMessage.getInfoType().equals(EnumWxAuthorizationInfoType.UNAUTHORIZED.getMessage())) { + // 审核未通过 authorizerInfoService.saveOrUpdate(new WxAuthorizerInfo() { { setAuthorizerAppid(inMessage.getAuthorizerAppid()); @@ -141,6 +144,7 @@ public class WechatCalllbackController extends BaseController { } }); } + try { String out = openService.getWxOpenComponentService().route(inMessage); this.logger.info("组装回复信息:{}", out); @@ -163,6 +167,12 @@ public class WechatCalllbackController extends BaseController { String openid = request.getParameter("openid"); String msgSignature = request.getParameter("msg_signature"); + // 第三方平台一定接收的是加密的消息 + if (!StringUtils.equalsIgnoreCase("aes", encType) + || !openService.getWxOpenComponentService().checkSignature(timestamp, nonce, signature)) { + throw new IllegalArgumentException("非法请求,可能属于伪造的请求!"); + } + InputStream inStream = request.getInputStream(); ByteArrayOutputStream outSteam = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; @@ -179,11 +189,7 @@ public class WechatCalllbackController extends BaseController { logger.info("接收微信APP回调:[appId=[{}], openid=[{}], signature=[{}], encType=[{}], msgSignature=[{}]," + " timestamp=[{}], nonce=[{}], requestBody=[\n{}\n] ", appId, openid, signature, encType, msgSignature, timestamp, nonce, resultxml); - // 第三方平台一定接收的是加密的消息 - if (!StringUtils.equalsIgnoreCase("aes", encType) - || !openService.getWxOpenComponentService().checkSignature(timestamp, nonce, signature)) { - throw new IllegalArgumentException("非法请求,可能属于伪造的请求!"); - } + WxAppinfo appinfo = appinfoService.getByAppId(appId); @@ -192,33 +198,7 @@ public class WechatCalllbackController extends BaseController { WxMpXmlMessage inMessage = WxOpenXmlMessage.fromEncryptedMpXml(resultxml, openService.getWxOpenConfigStorage(), timestamp, nonce, msgSignature); logger.info("接收微信APP回调,消息解密后内容为:\n{}", inMessage.toString()); - // 全网发布测试用例 - /* - if (StringUtils.equalsAnyIgnoreCase(appId, "wx570bc396a51b8ff8", "wxd101a85aa106f53e")) { - try { - if (StringUtils.equals(inMessage.getMsgType(), "text")) { - if (StringUtils.equals(inMessage.getContent(), "TESTCOMPONENT_MSG_TYPE_TEXT")) { - out = WxOpenXmlMessage.wxMpOutXmlMessageToEncryptedXml( - WxMpXmlOutMessage.TEXT().content("TESTCOMPONENT_MSG_TYPE_TEXT_callback") - .fromUser(inMessage.getToUser()) - .toUser(inMessage.getFromUser()) - .build(), - openService.getWxOpenConfigStorage() - ); - } else if (StringUtils.startsWith(inMessage.getContent(), "QUERY_AUTH_CODE:")) { - String msg = inMessage.getContent().replace("QUERY_AUTH_CODE:", "") + "_from_api"; - WxMpKefuMessage kefuMessage = WxMpKefuMessage.TEXT().content(msg).toUser(inMessage.getFromUser()).build(); - openService.getWxOpenComponentService().getWxMpServiceByAppid(appId).getKefuService().sendKefuMessage(kefuMessage); - } - } else if (StringUtils.equals(inMessage.getMsgType(), "event")) { - WxMpKefuMessage kefuMessage = WxMpKefuMessage.TEXT().content(inMessage.getEvent() + "from_callback").toUser(inMessage.getFromUser()).build(); - openService.getWxOpenComponentService().getWxMpServiceByAppid(appId).getKefuService().sendKefuMessage(kefuMessage); - } - } catch (WxErrorException e) { - logger.error("callback", e); - } - } - */ + if(appinfo.getType().equals(EnumAppType.B.getCode()) || appinfo.getType().equals(EnumAppType.C.getCode())) { // 小程序 /**判断消息类型,调用对应的方法*/ @@ -240,13 +220,11 @@ public class WechatCalllbackController extends BaseController { } case "text": WxMpXmlOutMessage outMessage = openService.getWxOpenMessageRouter().route(inMessage, appId); - if (outMessage != null) { - out = WxOpenXmlMessage.wxMpOutXmlMessageToEncryptedXml(outMessage, openService.getWxOpenConfigStorage()); - logger.info(out); - } - else { - out = "success"; + if (outMessage == null) { + return "success"; } + out = WxOpenXmlMessage.wxMpOutXmlMessageToEncryptedXml(outMessage, openService.getWxOpenConfigStorage()); + logger.info(out); break; default: return "success"; @@ -260,7 +238,9 @@ public class WechatCalllbackController extends BaseController { this.logger.info("2 return: success"); return "success"; } + logger.info(outMessage.toString()); out = outMessage.toEncryptedXml(mpService.getWxMpConfigStorage()); + logger.info("组装回复消息-->"+out); } catch (Exception e) { logger.error("路由消息时出现异常!", e); } diff --git a/mlWechatOpen/src/main/java/com/iformall/mp/controller/WxMpCallBackController.java b/mlWechatOpen/src/main/java/com/iformall/mp/controller/WxMpCallBackController.java index c9a0c99..0ef75a6 100644 --- a/mlWechatOpen/src/main/java/com/iformall/mp/controller/WxMpCallBackController.java +++ b/mlWechatOpen/src/main/java/com/iformall/mp/controller/WxMpCallBackController.java @@ -48,7 +48,7 @@ public class WxMpCallBackController { throw new IllegalArgumentException("请求参数非法,请核实!"); } - this.logger.info("接收到来自微信服务器的认证消息:[{}, {}, {}, {}]", + logger.info("接收到来自微信服务器的认证消息:[{}, {}, {}, {}]", signature, timestamp, nonce, echostr); // 数据库 -> @@ -102,7 +102,7 @@ public class WxMpCallBackController { outSteam.close(); inStream.close(); - this.logger.info("\n接收微信请求:[openid=[{}], [signature=[{}], encType=[{}], msgSignature=[{}]," + logger.info("\n接收微信请求:[openid=[{}], [signature=[{}], encType=[{}], msgSignature=[{}]," + " timestamp=[{}], nonce=[{}], requestBody=[\n{}\n] ", openid, signature, encType, msgSignature, timestamp, nonce, requestBody); @@ -126,10 +126,10 @@ public class WxMpCallBackController { this.logger.debug("\n消息解密后内容为:\n{} ", inMessage.toString()); WxMpXmlOutMessage outMessage = this.route(inMessage, wxService); if (outMessage == null) { - this.logger.info("2 return: success"); + logger.info("2 return: success"); return "success"; } - logger.info(outMessage.toXml()); + logger.info("out: " + outMessage.toXml()); out = outMessage.toEncryptedXml(wxService.getWxMpConfigStorage()); }