Просмотр исходного кода

Merge tag 'refs/tags/jenkins-back_end_wechat-140' into release

test

# Conflicts:
#	mlWechatOpen/src/main/java/com/iformall/mp/handler/UnsubscribeHandler.java
release
Stormeye Wu 7 лет назад
Родитель
Сommit
d1e95ae19d
8 измененных файлов: 355 добавлений и 151 удалений
  1. +2
    -2
      mallinkService/src/main/java/com/iformall/service/impl/WxCUserServiceImpl.java
  2. +59
    -0
      mlWechatOpen/src/main/java/com/iformall/config/AsyncConfig.java
  3. +251
    -124
      mlWechatOpen/src/main/java/com/iformall/controller/WechatCalllbackController.java
  4. +3
    -1
      mlWechatOpen/src/main/java/com/iformall/mp/controller/WxMpCallBackController.java
  5. +2
    -2
      mlWechatOpen/src/main/java/com/iformall/mp/handler/SubscribeHandler.java
  6. +2
    -2
      mlWechatOpen/src/main/java/com/iformall/mp/handler/UnsubscribeHandler.java
  7. +30
    -14
      mlWechatOpen/src/main/java/com/iformall/mp/manager/WxMpManager.java
  8. +6
    -6
      mlWechatOpen/src/main/resources/logback-spring.xml

+ 2
- 2
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())) { if(authorizerInfo.getType().equals(EnumAppType.MP_S.getCode())) {
userQ.setMpSubscribe(mpUser.getSubscribe()?1:0); userQ.setMpSubscribe(mpUser.getSubscribe()?1:0);
userQ.setMpSubscribeScene(mpUser.getSubscribeScene()); 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())) { } else if(authorizerInfo.getType().equals(EnumAppType.MP_P.getCode())) {
userQ.setSubsSubscribe(mpUser.getSubscribe()?1:0); userQ.setSubsSubscribe(mpUser.getSubscribe()?1:0);
userQ.setSubsSubscribeScene(mpUser.getSubscribeScene()); userQ.setSubsSubscribeScene(mpUser.getSubscribeScene());
userQ.setMpSubscribeTime(new Date(mpUser.getSubscribeTime()));
userQ.setMpSubscribeTime(new Date(mpUser.getSubscribeTime()*1000L));
} }
return saveOrUpdate(userQ); return saveOrUpdate(userQ);
} }


+ 59
- 0
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);
}
};
}
}

+ 251
- 124
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.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import me.chanjar.weixin.common.error.WxErrorException; 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.kefu.WxMpKefuMessage;
import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; 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.message.WxOpenXmlMessage;
import me.chanjar.weixin.open.bean.result.WxOpenAuthorizerInfoResult; import me.chanjar.weixin.open.bean.result.WxOpenAuthorizerInfoResult;
import me.chanjar.weixin.open.bean.result.WxOpenPlatformResult; import me.chanjar.weixin.open.bean.result.WxOpenPlatformResult;
@@ -62,6 +62,9 @@ public class WechatCalllbackController extends BaseController {
@Autowired @Autowired
private WxAppinfoService appinfoService; private WxAppinfoService appinfoService;


@Autowired
private WxCUserService userService;

@Autowired @Autowired
private MailService mailService; private MailService mailService;


@@ -85,27 +88,27 @@ public class WechatCalllbackController extends BaseController {
throw new IllegalArgumentException("非法请求,可能属于伪造的请求!"); 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=[{}]," logger.info("\n接收微信回调:[signature=[{}], encType=[{}], msgSignature=[{}],"
+ " timestamp=[{}], nonce=[{}], requestBody=[\n{}\n] ", + " timestamp=[{}], nonce=[{}], requestBody=[\n{}\n] ",
signature, encType, msgSignature, timestamp, nonce, resultxml); signature, encType, msgSignature, timestamp, nonce, resultxml);


// aes加密的消息
// aes加密的消息, 解密
WxOpenXmlMessage inMessage = WxOpenXmlMessage.fromEncryptedXml(resultxml, WxOpenXmlMessage inMessage = WxOpenXmlMessage.fromEncryptedXml(resultxml,
openService.getWxOpenConfigStorage(), timestamp, nonce, msgSignature); openService.getWxOpenConfigStorage(), timestamp, nonce, msgSignature);
this.logger.info("接收微信回调,消息解密后内容为:{} ", inMessage.toString()); 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())) { if (inMessage.getInfoType().equals(EnumWxAuthorizationInfoType.COMPONENT_VERIFY_TICKET.getMessage())) {
// 保存component_verify_ticket // 保存component_verify_ticket
componentVerifyTicketService.saveOrUpdate(new WxComponentVerifyTicket() { componentVerifyTicketService.saveOrUpdate(new WxComponentVerifyTicket() {
@@ -116,33 +119,11 @@ public class WechatCalllbackController extends BaseController {
setDeadline(new Date(Long.valueOf(System.currentTimeMillis() + (60 * 60 * 1000)))); setDeadline(new Date(Long.valueOf(System.currentTimeMillis() + (60 * 60 * 1000))));
} }
}); });
return "success";
} else if (inMessage.getInfoType().equals(EnumWxAuthorizationInfoType.AUTHORIZED.getMessage()) || } 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);

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())) { } else if (inMessage.getInfoType().equals(EnumWxAuthorizationInfoType.UNAUTHORIZED.getMessage())) {
// 授权取消 // 授权取消
authorizerInfoService.saveOrUpdate(new WxAuthorizerInfo() { authorizerInfoService.saveOrUpdate(new WxAuthorizerInfo() {
@@ -152,6 +133,7 @@ public class WechatCalllbackController extends BaseController {
setAuthTime(new Date()); setAuthTime(new Date());
} }
}); });
return "success";
} }


try { try {
@@ -160,10 +142,44 @@ public class WechatCalllbackController extends BaseController {
} catch (WxErrorException e) { } catch (WxErrorException e) {
this.logger.error("notify", e); this.logger.error("notify", e);
} }

return "success"; 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") @RequestMapping(value = "/{appId}/callback")
@ApiOperation("消息回调") @ApiOperation("消息回调")
public void callback(@PathVariable("appId") String appId, HttpServletRequest request, HttpServletResponse response) throws IOException { 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("非法请求,可能属于伪造的请求!"); 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=[{}]," logger.info("接收微信APP回调:[appId=[{}], openid=[{}], signature=[{}], encType=[{}], msgSignature=[{}],"
+ " timestamp=[{}], nonce=[{}], requestBody=[\n{}\n] ", + " timestamp=[{}], nonce=[{}], requestBody=[\n{}\n] ",
@@ -200,98 +205,55 @@ public class WechatCalllbackController extends BaseController {




String out = ""; String out = "";
// aes加密的消息
// aes加密的消息, 解密
WxMpXmlMessage inMessage = WxOpenXmlMessage.fromEncryptedMpXml(resultxml, WxMpXmlMessage inMessage = WxOpenXmlMessage.fromEncryptedMpXml(resultxml,
openService.getWxOpenConfigStorage(), timestamp, nonce, msgSignature); openService.getWxOpenConfigStorage(), timestamp, nonce, msgSignature);
logger.info("接收微信APP回调,消息解密后内容为:\n{}", inMessage.toString()); logger.info("接收微信APP回调,消息解密后内容为:\n{}", inMessage.toString());


// 全网发布测试用例 // 全网发布测试用例
if (StringUtils.equalsAnyIgnoreCase(appId, "wx570bc396a51b8ff8", "wxd101a85aa106f53e")) { 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 printWriter = response.getWriter();
printWriter.print("success");
printWriter.flush();
printWriter.close();
wechatWriteSuccess(printWriter);
return; 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); WxAuthorizerInfo authorizerInfo = authorizerInfoService.getByAppId(appId);


PrintWriter printWriter = response.getWriter(); 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 { } else {
handleMPCallbackMessage(appId, inMessage, authorizerInfo);
wechatWriteSuccess(printWriter);
return;
/*
// 公众号 // 公众号
WxMpService mpService = openService.getWxOpenComponentService().getWxMpServiceByAppid(appId);
try { try {
WxMpXmlOutMessage outMessage = mpManager.getRouter(mpService).route(inMessage);
WxMpXmlOutMessage outMessage = mpManager.getRouter(appId).route(inMessage);
getThreadCount( 1 );
if (outMessage == null) { if (outMessage == null) {
this.logger.info("2 return: success"); this.logger.info("2 return: success");
printWriter.print("success");
printWriter.flush();
printWriter.close();
wechatWriteSuccess(printWriter);
return; return;
} }
// logger.info("组装回复" + outMessage.toXml()); // logger.info("组装回复" + outMessage.toXml());
@@ -300,16 +262,181 @@ public class WechatCalllbackController extends BaseController {
} catch (Exception e) { } catch (Exception e) {
logger.error("路由消息时出现异常!", 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.print("success");
printWriter.flush(); printWriter.flush();
printWriter.close(); 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); WxWeappAuditStatus auditStatus = weappAuditStatusService.getByAppId(appId);
if (auditStatus != null) { if (auditStatus != null) {
if (success) { if (success) {


+ 3
- 1
mlWechatOpen/src/main/java/com/iformall/mp/controller/WxMpCallBackController.java Просмотреть файл

@@ -138,8 +138,10 @@ public class WxMpCallBackController {
} }


private WxMpXmlOutMessage route(WxMpXmlMessage message, WxMpService wxService) { private WxMpXmlOutMessage route(WxMpXmlMessage message, WxMpService wxService) {
String appId = wxService.getWxMpConfigStorage().getAppId();
logger.info("route appId: " + appId);
try { try {
return wxMpManager.getRouter(wxService).route(message);
return wxMpManager.getRouter(appId).route(message);
} catch (Exception e) { } catch (Exception e) {
this.logger.error("路由消息时出现异常!", e); this.logger.error("路由消息时出现异常!", e);
} }


+ 2
- 2
mlWechatOpen/src/main/java/com/iformall/mp/handler/SubscribeHandler.java Просмотреть файл

@@ -32,10 +32,10 @@ public class SubscribeHandler extends AbstractHandler {
public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage,
Map<String, Object> context, WxMpService weixinService, Map<String, Object> context, WxMpService weixinService,
WxSessionManager sessionManager) throws WxErrorException { 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(); WxAuthorizerInfo authQ = new WxAuthorizerInfo();
authQ.setAuthorizerAppid(appId); authQ.setAuthorizerAppid(appId);
WxAuthorizerInfo authorizerInfo = wxAuthorizerInfoMapper.findWeChatMp(authQ); WxAuthorizerInfo authorizerInfo = wxAuthorizerInfoMapper.findWeChatMp(authQ);


+ 2
- 2
mlWechatOpen/src/main/java/com/iformall/mp/handler/UnsubscribeHandler.java Просмотреть файл

@@ -30,10 +30,10 @@ public class UnsubscribeHandler extends AbstractHandler {
public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage,
Map<String, Object> context, WxMpService wxMpService, Map<String, Object> context, WxMpService wxMpService,
WxSessionManager sessionManager) { WxSessionManager sessionManager) {
String appId = wxMpService.getWxMpConfigStorage().getAppId();
String openId = wxMessage.getFromUser(); 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(); WxAuthorizerInfo authQ = new WxAuthorizerInfo();
authQ.setAuthorizerAppid(appId); authQ.setAuthorizerAppid(appId);
WxAuthorizerInfo authorizerInfo = wxAuthorizerInfoMapper.findWeChatMp(authQ); WxAuthorizerInfo authorizerInfo = wxAuthorizerInfoMapper.findWeChatMp(authQ);


+ 30
- 14
mlWechatOpen/src/main/java/com/iformall/mp/manager/WxMpManager.java Просмотреть файл

@@ -1,14 +1,18 @@
package com.iformall.mp.manager; package com.iformall.mp.manager;


import com.iformall.mp.handler.*; import com.iformall.mp.handler.*;
import com.iformall.service.WxAppinfoService;
import com.iformall.service.wechat.FmOpenService; import com.iformall.service.wechat.FmOpenService;
import me.chanjar.weixin.mp.api.WxMpMessageRouter; import me.chanjar.weixin.mp.api.WxMpMessageRouter;
import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.constant.WxMpEventConstants; 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.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;


import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import static me.chanjar.weixin.common.api.WxConsts.*; import static me.chanjar.weixin.common.api.WxConsts.*;


/** /**
@@ -19,37 +23,48 @@ import static me.chanjar.weixin.common.api.WxConsts.*;
@Service @Service
public class WxMpManager { public class WxMpManager {


private final Logger logger = LoggerFactory.getLogger(this.getClass());

private static Map<String, WxMpMessageRouter> myRouterMap = new ConcurrentHashMap<String, WxMpMessageRouter>();



@Autowired @Autowired
protected FmOpenService openService; protected FmOpenService openService;


@Autowired @Autowired
private WxAppinfoService appinfoService;
protected LogHandler logHandler;
@Autowired @Autowired
private LogHandler logHandler;
protected NullHandler nullHandler;
@Autowired @Autowired
private NullHandler nullHandler;
protected KfSessionHandler kfSessionHandler;
@Autowired @Autowired
private KfSessionHandler kfSessionHandler;
protected StoreCheckNotifyHandler storeCheckNotifyHandler;
@Autowired @Autowired
private StoreCheckNotifyHandler storeCheckNotifyHandler;
protected LocationHandler locationHandler;
@Autowired @Autowired
private LocationHandler locationHandler;
protected MenuHandler menuHandler;
@Autowired @Autowired
private MenuHandler menuHandler;
protected MsgHandler msgHandler;
@Autowired @Autowired
private MsgHandler msgHandler;
protected UnsubscribeHandler unsubscribeHandler;
@Autowired @Autowired
private UnsubscribeHandler unsubscribeHandler;
@Autowired
private SubscribeHandler subscribeHandler;
protected SubscribeHandler subscribeHandler;


public WxMpService getMpService(String appId) { public WxMpService getMpService(String appId) {
return openService.getWxOpenComponentService().getWxMpServiceByAppid(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) { private WxMpMessageRouter newRouter(WxMpService wxMpService) {
@@ -58,6 +73,7 @@ public class WxMpManager {
// 记录所有事件的日志 (异步执行) // 记录所有事件的日志 (异步执行)
newRouter.rule().handler(this.logHandler).next(); newRouter.rule().handler(this.logHandler).next();



// 接收客服会话管理事件 // 接收客服会话管理事件
newRouter.rule().async(false) newRouter.rule().async(false)
.msgType(XmlMsgType.EVENT) .msgType(XmlMsgType.EVENT)


+ 6
- 6
mlWechatOpen/src/main/resources/logback-spring.xml Просмотреть файл

@@ -5,7 +5,7 @@


<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder> <encoder>
<Pattern>[%date{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] --%mdc{client}%msg%n</Pattern>
<Pattern>[%date{yyyy-MM-dd HH:mm:ss.SSS}][%thread][%-5level] --%mdc{client}%msg%n</Pattern>
</encoder> </encoder>
</appender> </appender>


@@ -16,7 +16,7 @@
<maxHistory>180</maxHistory> <!-- 保留180天 --> <maxHistory>180</maxHistory> <!-- 保留180天 -->
</rollingPolicy> </rollingPolicy>
<layout> <layout>
<pattern>[%date{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%logger:%line]--%mdc{client} %msg%n</pattern>
<pattern>[%date{yyyy-MM-dd HH:mm:ss.SSS}][%thread][%-5level][%logger:%line]--%mdc{client} %msg%n</pattern>
</layout> </layout>
</appender> </appender>


@@ -27,7 +27,7 @@
<maxHistory>180</maxHistory> <!-- 保留180天 --> <maxHistory>180</maxHistory> <!-- 保留180天 -->
</rollingPolicy> </rollingPolicy>
<layout> <layout>
<pattern>[%date{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%logger:%line]--%mdc{client} %msg%n</pattern>
<pattern>[%date{yyyy-MM-dd HH:mm:ss.SSS}][%thread][%-5level][%logger:%line]--%mdc{client} %msg%n</pattern>
</layout> </layout>
<filter class="ch.qos.logback.classic.filter.LevelFilter"> <filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level> <level>INFO</level>
@@ -43,7 +43,7 @@
<maxHistory>180</maxHistory> <!-- 保留180天 --> <maxHistory>180</maxHistory> <!-- 保留180天 -->
</rollingPolicy> </rollingPolicy>
<layout> <layout>
<pattern>[%date{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%logger:%line]--%mdc{client} %msg%n</pattern>
<pattern>[%date{yyyy-MM-dd HH:mm:ss.SSS}][%thread][%-5level][%logger:%line]--%mdc{client} %msg%n</pattern>
</layout> </layout>
<filter class="ch.qos.logback.classic.filter.LevelFilter"> <filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level> <level>DEBUG</level>
@@ -60,7 +60,7 @@
<maxHistory>180</maxHistory> <!-- 保留180天 --> <maxHistory>180</maxHistory> <!-- 保留180天 -->
</rollingPolicy> </rollingPolicy>
<layout> <layout>
<pattern>[%date{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%logger:%line]--%mdc{client} %msg%n</pattern>
<pattern>[%date{yyyy-MM-dd HH:mm:ss.SSS}][%thread][%-5level][%logger:%line]--%mdc{client} %msg%n</pattern>
</layout> </layout>
<filter class="ch.qos.logback.classic.filter.LevelFilter"> <filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level> <level>WARN</level>
@@ -78,7 +78,7 @@
<maxHistory>180</maxHistory> <!-- 保留180天 --> <maxHistory>180</maxHistory> <!-- 保留180天 -->
</rollingPolicy> </rollingPolicy>
<layout> <layout>
<pattern>[%date{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%logger:%line]--%mdc{client} %msg%n</pattern>
<pattern>[%date{yyyy-MM-dd HH:mm:ss.SSS}][%thread][%-5level][%logger:%line]--%mdc{client} %msg%n</pattern>
</layout> </layout>
<filter class="ch.qos.logback.classic.filter.LevelFilter"> <filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level> <level>ERROR</level>


Загрузка…
Отмена
Сохранить