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

[公众号消息][修改]:第三方平台api处理公众号消息

release
Stormeye Wu 7 лет назад
Родитель
Сommit
65284320d8
2 измененных файлов: 37 добавлений и 57 удалений
  1. +33
    -53
      mlWechatOpen/src/main/java/com/iformall/controller/WechatCalllbackController.java
  2. +4
    -4
      mlWechatOpen/src/main/java/com/iformall/mp/controller/WxMpCallBackController.java

+ 33
- 53
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);
}


+ 4
- 4
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());
}


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