diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxCUserServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxCUserServiceImpl.java index 2a63e9f..8b9a5e9 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxCUserServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxCUserServiceImpl.java @@ -131,11 +131,11 @@ public class WxCUserServiceImpl implements WxCUserService { if(authorizerInfo.getType().equals(EnumAppType.MP_S.getCode())) { userQ.setMpSubscribe(mpUser.getSubscribe()?1:0); userQ.setMpSubscribeScene(mpUser.getSubscribeScene()); - userQ.setMpSubscribeTime(new Date(mpUser.getSubscribeTime())); + userQ.setMpSubscribeTime(new Date(mpUser.getSubscribeTime()*1000)); } else if(authorizerInfo.getType().equals(EnumAppType.MP_P.getCode())) { userQ.setSubsSubscribe(mpUser.getSubscribe()?1:0); userQ.setSubsSubscribeScene(mpUser.getSubscribeScene()); - userQ.setMpSubscribeTime(new Date(mpUser.getSubscribeTime())); + userQ.setMpSubscribeTime(new Date(mpUser.getSubscribeTime()*1000L)); } return saveOrUpdate(userQ); } diff --git a/mlWechatOpen/src/main/java/com/iformall/config/AsyncConfig.java b/mlWechatOpen/src/main/java/com/iformall/config/AsyncConfig.java new file mode 100644 index 0000000..f41fec6 --- /dev/null +++ b/mlWechatOpen/src/main/java/com/iformall/config/AsyncConfig.java @@ -0,0 +1,59 @@ +package com.iformall.config; + + +import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.AsyncConfigurer; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.lang.reflect.Method; +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + +@Configuration +@EnableAsync +public class AsyncConfig implements AsyncConfigurer { + private Logger logger = LoggerFactory.getLogger(getClass()); + + @Value("${thread.pool.corePoolSize:10}") + private int corePoolSize; + + @Value("${thread.pool.maxPoolSize:20}") + private int maxPoolSize; + + @Value("${thread.pool.keepAliveSeconds:4}") + private int keepAliveSeconds; + + @Value("${thread.pool.queueCapacity:512}") + private int queueCapacity; + + @Override + public Executor getAsyncExecutor() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(corePoolSize); + executor.setMaxPoolSize(maxPoolSize); + executor.setKeepAliveSeconds(keepAliveSeconds); + executor.setQueueCapacity(queueCapacity); + executor.setRejectedExecutionHandler((Runnable r, ThreadPoolExecutor exe) -> { + logger.warn("当前任务线程池队列已满."); + }); + executor.initialize(); + logger.info("限定线程池大小"); + return executor; + } + + @Override + public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { + return new AsyncUncaughtExceptionHandler() { + @Override + public void handleUncaughtException(Throwable ex, Method method, Object... params) { + logger.error("线程池执行任务发生未知异常.", ex); + } + }; + } +} diff --git a/mlWechatOpen/src/main/java/com/iformall/controller/WechatCalllbackController.java b/mlWechatOpen/src/main/java/com/iformall/controller/WechatCalllbackController.java index b6c886f..7a6fdcf 100644 --- a/mlWechatOpen/src/main/java/com/iformall/controller/WechatCalllbackController.java +++ b/mlWechatOpen/src/main/java/com/iformall/controller/WechatCalllbackController.java @@ -12,10 +12,10 @@ import com.iformall.service.wechat.FmOpenService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import me.chanjar.weixin.common.error.WxErrorException; -import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage; import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; +import me.chanjar.weixin.mp.bean.result.WxMpUser; import me.chanjar.weixin.open.bean.message.WxOpenXmlMessage; import me.chanjar.weixin.open.bean.result.WxOpenAuthorizerInfoResult; import me.chanjar.weixin.open.bean.result.WxOpenPlatformResult; @@ -62,6 +62,9 @@ public class WechatCalllbackController extends BaseController { @Autowired private WxAppinfoService appinfoService; + @Autowired + private WxCUserService userService; + @Autowired private MailService mailService; @@ -85,27 +88,27 @@ public class WechatCalllbackController extends BaseController { throw new IllegalArgumentException("非法请求,可能属于伪造的请求!"); } - InputStream inStream = request.getInputStream(); - ByteArrayOutputStream outSteam = new ByteArrayOutputStream(); - byte[] buffer = new byte[1024]; - int len = 0; - while ((len = inStream.read(buffer)) != -1) { - outSteam.write(buffer, 0, len); - } - String resultxml = new String(outSteam.toByteArray(), Charset.forName("UTF-8")); - logger.info(resultxml); - - outSteam.close(); - inStream.close(); + String resultxml = getRequestXML(request); logger.info("\n接收微信回调:[signature=[{}], encType=[{}], msgSignature=[{}]," + " timestamp=[{}], nonce=[{}], requestBody=[\n{}\n] ", signature, encType, msgSignature, timestamp, nonce, resultxml); - // aes加密的消息 + // aes加密的消息, 解密 WxOpenXmlMessage inMessage = WxOpenXmlMessage.fromEncryptedXml(resultxml, openService.getWxOpenConfigStorage(), timestamp, nonce, msgSignature); this.logger.info("接收微信回调,消息解密后内容为:{} ", inMessage.toString()); + + // 处理 + return handleTicket(inMessage); + } + + /** + * 处理ticket消息 + * @param inMessage + * @return + */ + private String handleTicket(WxOpenXmlMessage inMessage) { if (inMessage.getInfoType().equals(EnumWxAuthorizationInfoType.COMPONENT_VERIFY_TICKET.getMessage())) { // 保存component_verify_ticket componentVerifyTicketService.saveOrUpdate(new WxComponentVerifyTicket() { @@ -116,33 +119,11 @@ public class WechatCalllbackController extends BaseController { setDeadline(new Date(Long.valueOf(System.currentTimeMillis() + (60 * 60 * 1000)))); } }); + return "success"; } else if (inMessage.getInfoType().equals(EnumWxAuthorizationInfoType.AUTHORIZED.getMessage()) || inMessage.getInfoType().equals(EnumWxAuthorizationInfoType.UPDATEAUTHORIZED.getMessage())) { // 审核通过 - try { - WxOpenQueryAuthResult queryAuthResult = openService.getWxOpenComponentService().getQueryAuth(inMessage.getAuthorizationCode()); - logger.info("getQueryAuth", queryAuthResult); - - WxOpenAuthorizerInfoResult openAuthorizerInfoResult = openService.getWxOpenComponentService().getAuthorizerInfo( - queryAuthResult.getAuthorizationInfo().getAuthorizerAppid()); - logger.info(openAuthorizerInfoResult.toString()); - // save auth info - authorizerInfoService.saveOrUpdate(new WxAuthorizerInfo() { - { - setAuthorizerAppid(openAuthorizerInfoResult.getAuthorizationInfo().getAuthorizerAppid()); - setAlias(openAuthorizerInfoResult.getAuthorizerInfo().getAlias()); - setHeadImg(openAuthorizerInfoResult.getAuthorizerInfo().getHeadImg()); - setQrcodeUrl(openAuthorizerInfoResult.getAuthorizerInfo().getQrcodeUrl()); - setRefreshToken(openAuthorizerInfoResult.getAuthorizationInfo().getAuthorizerRefreshToken()); - setAccessToken(openAuthorizerInfoResult.getAuthorizationInfo().getAuthorizerAccessToken()); - setAccessTokenExpire(new Date(Long.valueOf(System.currentTimeMillis() + openAuthorizerInfoResult.getAuthorizationInfo().getExpiresIn()*1000))); - setAuthorizationStatus(EnumWxAuthorizationStatus.AUTHORIZED.getCode()); - setAuthTime(new Date()); - } - }); - } catch (WxErrorException e) { - logger.error(e.getMessage()); - } + if (handleWeappAuditedMessage(inMessage)) return "success"; } else if (inMessage.getInfoType().equals(EnumWxAuthorizationInfoType.UNAUTHORIZED.getMessage())) { // 授权取消 authorizerInfoService.saveOrUpdate(new WxAuthorizerInfo() { @@ -152,6 +133,7 @@ public class WechatCalllbackController extends BaseController { setAuthTime(new Date()); } }); + return "success"; } try { @@ -160,10 +142,44 @@ public class WechatCalllbackController extends BaseController { } catch (WxErrorException e) { this.logger.error("notify", e); } - return "success"; } + /** + * 处理小程序审核消息 + * @param inMessage + * @return + */ + private boolean handleWeappAuditedMessage(WxOpenXmlMessage inMessage) { + // 审核通过 + try { + WxOpenQueryAuthResult queryAuthResult = openService.getWxOpenComponentService().getQueryAuth(inMessage.getAuthorizationCode()); + logger.info("getQueryAuth", queryAuthResult); + + WxOpenAuthorizerInfoResult openAuthorizerInfoResult = openService.getWxOpenComponentService().getAuthorizerInfo( + queryAuthResult.getAuthorizationInfo().getAuthorizerAppid()); + logger.info(openAuthorizerInfoResult.toString()); + // save auth info + authorizerInfoService.saveOrUpdate(new WxAuthorizerInfo() { + { + setAuthorizerAppid(openAuthorizerInfoResult.getAuthorizationInfo().getAuthorizerAppid()); + setAlias(openAuthorizerInfoResult.getAuthorizerInfo().getAlias()); + setHeadImg(openAuthorizerInfoResult.getAuthorizerInfo().getHeadImg()); + setQrcodeUrl(openAuthorizerInfoResult.getAuthorizerInfo().getQrcodeUrl()); + setRefreshToken(openAuthorizerInfoResult.getAuthorizationInfo().getAuthorizerRefreshToken()); + setAccessToken(openAuthorizerInfoResult.getAuthorizationInfo().getAuthorizerAccessToken()); + setAccessTokenExpire(new Date(Long.valueOf(System.currentTimeMillis() + openAuthorizerInfoResult.getAuthorizationInfo().getExpiresIn()*1000))); + setAuthorizationStatus(EnumWxAuthorizationStatus.AUTHORIZED.getCode()); + setAuthTime(new Date()); + } + }); + return true; + } catch (WxErrorException e) { + logger.error(e.getMessage()); + } + return false; + } + @RequestMapping(value = "/{appId}/callback") @ApiOperation("消息回调") public void callback(@PathVariable("appId") String appId, HttpServletRequest request, HttpServletResponse response) throws IOException { @@ -181,18 +197,7 @@ public class WechatCalllbackController extends BaseController { throw new IllegalArgumentException("非法请求,可能属于伪造的请求!"); } - InputStream inStream = request.getInputStream(); - ByteArrayOutputStream outSteam = new ByteArrayOutputStream(); - byte[] buffer = new byte[1024]; - int len = 0; - while ((len = inStream.read(buffer)) != -1) { - outSteam.write(buffer, 0, len); - } - String resultxml = new String(outSteam.toByteArray(), Charset.forName("UTF-8")); - logger.info(resultxml); - - outSteam.close(); - inStream.close(); + String resultxml = getRequestXML(request); logger.info("接收微信APP回调:[appId=[{}], openid=[{}], signature=[{}], encType=[{}], msgSignature=[{}]," + " timestamp=[{}], nonce=[{}], requestBody=[\n{}\n] ", @@ -200,98 +205,55 @@ public class WechatCalllbackController extends BaseController { String out = ""; - // aes加密的消息 + // aes加密的消息, 解密 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); - } - + handleWechatTest(appId, response, inMessage); PrintWriter printWriter = response.getWriter(); - printWriter.print("success"); - printWriter.flush(); - printWriter.close(); + wechatWriteSuccess(printWriter); return; } + // 实际 消息 处理 + handleCallbackMessage(appId, response, inMessage); + } + + /** + * 实际回调消息处理 + * @param appId + * @param response + * @param inMessage + * @throws IOException + */ + private void handleCallbackMessage(String appId, + HttpServletResponse response, + WxMpXmlMessage inMessage) throws IOException { WxAuthorizerInfo authorizerInfo = authorizerInfoService.getByAppId(appId); PrintWriter printWriter = response.getWriter(); - if(authorizerInfo != null && - (authorizerInfo.getType().equals(EnumAppType.B.getCode()) || - authorizerInfo.getType().equals(EnumAppType.C.getCode()))) { - // 小程序 审核 消息 + // 小程序 消息 处理 + if(authorizerInfo != null && (authorizerInfo.getType() <= EnumAppType.C.getCode())) { /**判断消息类型,调用对应的方法*/ - switch (inMessage.getMsgType()) { - case "event": { - switch (inMessage.getEvent()) { - case "weapp_audit_success": { // 审核成功 - updateAuditStatus(appId, true, ""); - break; - } - case "weapp_audit_fail": { // 审核失败 - updateAuditStatus(appId, false, inMessage.getReason()); - break; - } - default: - break; - } - printWriter.print("success"); - printWriter.flush(); - printWriter.close(); - return; - } - case "text": - WxMpXmlOutMessage outMessage = openService.getWxOpenMessageRouter().route(inMessage, appId); - if (outMessage == null) { - printWriter.print("success"); - printWriter.flush(); - printWriter.close(); - return; - } - // out = WxOpenXmlMessage.wxMpOutXmlMessageToEncryptedXml(outMessage, openService.getWxOpenConfigStorage()); - // logger.info(out); - break; - default: - printWriter.print("success"); - printWriter.flush(); - printWriter.close(); - return; - } + handleWeappCallbackMessage(appId, inMessage); + wechatWriteSuccess(printWriter); + return; } else { + handleMPCallbackMessage(appId, inMessage, authorizerInfo); + wechatWriteSuccess(printWriter); + return; + /* // 公众号 - WxMpService mpService = openService.getWxOpenComponentService().getWxMpServiceByAppid(appId); try { - WxMpXmlOutMessage outMessage = mpManager.getRouter(mpService).route(inMessage); + WxMpXmlOutMessage outMessage = mpManager.getRouter(appId).route(inMessage); + getThreadCount( 1 ); if (outMessage == null) { this.logger.info("2 return: success"); - printWriter.print("success"); - printWriter.flush(); - printWriter.close(); + wechatWriteSuccess(printWriter); return; } // logger.info("组装回复" + outMessage.toXml()); @@ -300,16 +262,181 @@ public class WechatCalllbackController extends BaseController { } catch (Exception e) { logger.error("路由消息时出现异常!", e); } + */ } + } + /** + * 处理小程序回调消息 + * @param appId + * @param inMessage + */ + private void handleWeappCallbackMessage(String appId, WxMpXmlMessage inMessage) { + switch (inMessage.getMsgType()) { + case "event": { + switch (inMessage.getEvent()) { + case "weapp_audit_success": { // 审核成功 + updateAuditStatus(appId, true, ""); + break; + } + case "weapp_audit_fail": { // 审核失败 + updateAuditStatus(appId, false, inMessage.getReason()); + break; + } + default: + break; + } + return; + } + default: + return; + } + } + + /** + * 处理公众号回调消息 + * @param appId + * @param inMessage + * @param authorizerInfo + */ + private void handleMPCallbackMessage(String appId, WxMpXmlMessage inMessage, WxAuthorizerInfo authorizerInfo) { + switch (inMessage.getMsgType()) { + case "event": { + switch (inMessage.getEvent()) { + case "subscribe": { // 关注 + handleEventSubscribe(appId, inMessage, authorizerInfo); + break; + } + case "unsubscribe": { // 取消关注 + handleEventUnsubscribe(appId, inMessage, authorizerInfo); + break; + } + default: { + break; + } + } + return; + } + default: { + return; + } + } + } + + private void wechatWriteSuccess(PrintWriter printWriter) { printWriter.print("success"); printWriter.flush(); printWriter.close(); } - private void updateAuditStatus(String appId, boolean success, String reason) { + /** + * 新关注消息处理 + * @param appId + * @param inMessage + * @param authorizerInfo + */ + private void handleEventSubscribe(String appId, WxMpXmlMessage inMessage, WxAuthorizerInfo authorizerInfo) { + this.logger.info("新关注用户 OPENID: " + inMessage.getFromUser() + ", AppId: " + appId); + + // 获取微信用户基本信息 + try { + WxMpUser userWxInfo = openService.getWxOpenComponentService().getWxMpServiceByAppid(appId).getUserService() + .userInfo(inMessage.getFromUser()); + if (userWxInfo != null) { + this.logger.info(userWxInfo.toString()); + userService.saveOrUpdateMpUser(userWxInfo, authorizerInfo); + } + } catch (WxErrorException e) { + if (e.getError().getErrorCode() == 48001) { + this.logger.info("该公众号没有获取用户信息权限!"); + } + } + } + + + /** + * 取消关注消息处理 + * @param appId + * @param inMessage + * @param authorizerInfo + */ + private void handleEventUnsubscribe(String appId, WxMpXmlMessage inMessage, WxAuthorizerInfo authorizerInfo) { + String openId = inMessage.getFromUser(); + this.logger.info("取消关注用户 OPENID: " + openId + ", AppId: " + appId); + WxMpUser mpUser = new WxMpUser(); + mpUser.setOpenId(inMessage.getFromUser()); + mpUser.setSubscribe(false); + mpUser.setSubscribeTime(inMessage.getCreateTime()); + userService.saveOrUpdateMpUser(mpUser, authorizerInfo); + } + + /** + * 测试账号特殊处理 + * @param appId + * @param response + * @param inMessage + * @throws IOException + */ + private void handleWechatTest(@PathVariable("appId") String appId, HttpServletResponse response, WxMpXmlMessage inMessage) throws IOException { + String out; + 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); + } + } + + private String getRequestXML(HttpServletRequest request) throws IOException { + InputStream inStream = request.getInputStream(); + ByteArrayOutputStream outSteam = new ByteArrayOutputStream(); + byte[] buffer = new byte[1024]; + int len = 0; + while ((len = inStream.read(buffer)) != -1) { + outSteam.write(buffer, 0, len); + } + String resultxml = new String(outSteam.toByteArray(), Charset.forName("UTF-8")); + logger.info(resultxml); + + outSteam.close(); + inStream.close(); + return resultxml; + } + + private void getThreadCount( int i) { + ThreadGroup group = Thread.currentThread().getThreadGroup(); + ThreadGroup topGroup = group; + // 遍历线程组树,获取根线程组 + while (group != null) { + topGroup = group; + group = group.getParent(); + } + // 激活的线程数加倍 + int activeCount = topGroup.activeCount(); + // copy into a list that is the exact size + logger.info("Thread list size == " + i + " : " + activeCount); + + } + + private void updateAuditStatus(String appId, boolean success, String reason) { WxWeappAuditStatus auditStatus = weappAuditStatusService.getByAppId(appId); if (auditStatus != null) { if (success) { 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 0ef75a6..698cc09 100644 --- a/mlWechatOpen/src/main/java/com/iformall/mp/controller/WxMpCallBackController.java +++ b/mlWechatOpen/src/main/java/com/iformall/mp/controller/WxMpCallBackController.java @@ -138,8 +138,10 @@ public class WxMpCallBackController { } private WxMpXmlOutMessage route(WxMpXmlMessage message, WxMpService wxService) { + String appId = wxService.getWxMpConfigStorage().getAppId(); + logger.info("route appId: " + appId); try { - return wxMpManager.getRouter(wxService).route(message); + return wxMpManager.getRouter(appId).route(message); } catch (Exception e) { this.logger.error("路由消息时出现异常!", e); } diff --git a/mlWechatOpen/src/main/java/com/iformall/mp/handler/SubscribeHandler.java b/mlWechatOpen/src/main/java/com/iformall/mp/handler/SubscribeHandler.java index 3c589af..74875ff 100644 --- a/mlWechatOpen/src/main/java/com/iformall/mp/handler/SubscribeHandler.java +++ b/mlWechatOpen/src/main/java/com/iformall/mp/handler/SubscribeHandler.java @@ -32,10 +32,10 @@ public class SubscribeHandler extends AbstractHandler { public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, WxMpService weixinService, WxSessionManager sessionManager) throws WxErrorException { + String appId = weixinService.getWxMpConfigStorage().getAppId(); - this.logger.info("新关注用户 OPENID: " + wxMessage.getFromUser()); + this.logger.info("新关注用户 OPENID: " + wxMessage.getFromUser() + ", AppId: " + appId); - String appId = weixinService.getWxMpConfigStorage().getAppId(); WxAuthorizerInfo authQ = new WxAuthorizerInfo(); authQ.setAuthorizerAppid(appId); WxAuthorizerInfo authorizerInfo = wxAuthorizerInfoMapper.findWeChatMp(authQ); diff --git a/mlWechatOpen/src/main/java/com/iformall/mp/handler/UnsubscribeHandler.java b/mlWechatOpen/src/main/java/com/iformall/mp/handler/UnsubscribeHandler.java index cffa85a..03750c3 100644 --- a/mlWechatOpen/src/main/java/com/iformall/mp/handler/UnsubscribeHandler.java +++ b/mlWechatOpen/src/main/java/com/iformall/mp/handler/UnsubscribeHandler.java @@ -30,10 +30,10 @@ public class UnsubscribeHandler extends AbstractHandler { public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, WxMpService wxMpService, WxSessionManager sessionManager) { + String appId = wxMpService.getWxMpConfigStorage().getAppId(); String openId = wxMessage.getFromUser(); - this.logger.info("取消关注用户 OPENID: " + openId); + this.logger.info("取消关注用户 OPENID: " + openId+ ", AppId: " + appId); - String appId = wxMpService.getWxMpConfigStorage().getAppId(); WxAuthorizerInfo authQ = new WxAuthorizerInfo(); authQ.setAuthorizerAppid(appId); WxAuthorizerInfo authorizerInfo = wxAuthorizerInfoMapper.findWeChatMp(authQ); diff --git a/mlWechatOpen/src/main/java/com/iformall/mp/manager/WxMpManager.java b/mlWechatOpen/src/main/java/com/iformall/mp/manager/WxMpManager.java index e8d8f9d..bbcdf70 100644 --- a/mlWechatOpen/src/main/java/com/iformall/mp/manager/WxMpManager.java +++ b/mlWechatOpen/src/main/java/com/iformall/mp/manager/WxMpManager.java @@ -1,14 +1,18 @@ package com.iformall.mp.manager; import com.iformall.mp.handler.*; -import com.iformall.service.WxAppinfoService; import com.iformall.service.wechat.FmOpenService; import me.chanjar.weixin.mp.api.WxMpMessageRouter; import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.constant.WxMpEventConstants; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + import static me.chanjar.weixin.common.api.WxConsts.*; /** @@ -19,37 +23,48 @@ import static me.chanjar.weixin.common.api.WxConsts.*; @Service public class WxMpManager { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + private static Map myRouterMap = new ConcurrentHashMap(); + @Autowired protected FmOpenService openService; @Autowired - private WxAppinfoService appinfoService; + protected LogHandler logHandler; @Autowired - private LogHandler logHandler; + protected NullHandler nullHandler; @Autowired - private NullHandler nullHandler; + protected KfSessionHandler kfSessionHandler; @Autowired - private KfSessionHandler kfSessionHandler; + protected StoreCheckNotifyHandler storeCheckNotifyHandler; @Autowired - private StoreCheckNotifyHandler storeCheckNotifyHandler; + protected LocationHandler locationHandler; @Autowired - private LocationHandler locationHandler; + protected MenuHandler menuHandler; @Autowired - private MenuHandler menuHandler; + protected MsgHandler msgHandler; @Autowired - private MsgHandler msgHandler; + protected UnsubscribeHandler unsubscribeHandler; @Autowired - private UnsubscribeHandler unsubscribeHandler; - @Autowired - private SubscribeHandler subscribeHandler; + protected SubscribeHandler subscribeHandler; public WxMpService getMpService(String appId) { return openService.getWxOpenComponentService().getWxMpServiceByAppid(appId); } - public WxMpMessageRouter getRouter(WxMpService mpService) { - return newRouter(mpService); + public WxMpMessageRouter getRouter(String appId) { + if (myRouterMap.containsKey(appId)) { + logger.info("found appId : " + appId); + return myRouterMap.get(appId); + } else { + WxMpService wxMpService = openService.getWxOpenComponentService().getWxMpServiceByAppid(appId); + WxMpMessageRouter newRouter = newRouter(wxMpService); + myRouterMap.put(appId, newRouter); + logger.info("found new appId : " + appId); + return newRouter; + } } private WxMpMessageRouter newRouter(WxMpService wxMpService) { @@ -58,6 +73,7 @@ public class WxMpManager { // 记录所有事件的日志 (异步执行) newRouter.rule().handler(this.logHandler).next(); + // 接收客服会话管理事件 newRouter.rule().async(false) .msgType(XmlMsgType.EVENT) diff --git a/mlWechatOpen/src/main/resources/logback-spring.xml b/mlWechatOpen/src/main/resources/logback-spring.xml index 2525413..80e8379 100644 --- a/mlWechatOpen/src/main/resources/logback-spring.xml +++ b/mlWechatOpen/src/main/resources/logback-spring.xml @@ -5,7 +5,7 @@ - [%date{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] --%mdc{client}%msg%n + [%date{yyyy-MM-dd HH:mm:ss.SSS}][%thread][%-5level] --%mdc{client}%msg%n @@ -16,7 +16,7 @@ 180 - [%date{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%logger:%line]--%mdc{client} %msg%n + [%date{yyyy-MM-dd HH:mm:ss.SSS}][%thread][%-5level][%logger:%line]--%mdc{client} %msg%n @@ -27,7 +27,7 @@ 180 - [%date{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%logger:%line]--%mdc{client} %msg%n + [%date{yyyy-MM-dd HH:mm:ss.SSS}][%thread][%-5level][%logger:%line]--%mdc{client} %msg%n INFO @@ -43,7 +43,7 @@ 180 - [%date{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%logger:%line]--%mdc{client} %msg%n + [%date{yyyy-MM-dd HH:mm:ss.SSS}][%thread][%-5level][%logger:%line]--%mdc{client} %msg%n DEBUG @@ -60,7 +60,7 @@ 180 - [%date{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%logger:%line]--%mdc{client} %msg%n + [%date{yyyy-MM-dd HH:mm:ss.SSS}][%thread][%-5level][%logger:%line]--%mdc{client} %msg%n WARN @@ -78,7 +78,7 @@ 180 - [%date{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%logger:%line]--%mdc{client} %msg%n + [%date{yyyy-MM-dd HH:mm:ss.SSS}][%thread][%-5level][%logger:%line]--%mdc{client} %msg%n ERROR