记得上下班打卡 | git大法好,push需谨慎

Commit 86d7e97e authored by jiangxiulong's avatar jiangxiulong

record WxMpMessageRouter和WxMessageInMemoryDuplicateChecker改成单例

parent ec94d77d
package com.liquidnet.service.sweet.config; package com.liquidnet.service.sweet.config;
import com.liquidnet.service.sweet.handler.SubscribeHandler;
import com.liquidnet.service.sweet.handler.UnsubscribeHandler;
import me.chanjar.weixin.common.api.WxConsts;
import me.chanjar.weixin.common.api.WxMessageInMemoryDuplicateChecker;
import me.chanjar.weixin.common.redis.RedisTemplateWxRedisOps; import me.chanjar.weixin.common.redis.RedisTemplateWxRedisOps;
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.api.impl.WxMpServiceImpl; import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
import me.chanjar.weixin.mp.config.impl.WxMpRedisConfigImpl; import me.chanjar.weixin.mp.config.impl.WxMpRedisConfigImpl;
...@@ -48,9 +53,18 @@ public class WechatMpConfigure { ...@@ -48,9 +53,18 @@ public class WechatMpConfigure {
private WxMpService wxMpZhengzaiService; private WxMpService wxMpZhengzaiService;
private WxMpService wxMpModernskyService; private WxMpService wxMpModernskyService;
private WxMpMessageRouter wxMpZhengzaiMessageRouter;
private WxMpMessageRouter wxMpModernskyMessageRouter;
private WxMessageInMemoryDuplicateChecker wxMessageInMemoryDuplicateChecker;
@Autowired @Autowired
private StringRedisTemplate stringRedisTemplate; private StringRedisTemplate stringRedisTemplate;
@Autowired
private SubscribeHandler subscribeHandler;
@Autowired
private UnsubscribeHandler unsubscribeHandler;
@PostConstruct @PostConstruct
public void init() { public void init() {
wxMpZhengzaiService = new WxMpServiceImpl() { wxMpZhengzaiService = new WxMpServiceImpl() {
...@@ -77,6 +91,11 @@ public class WechatMpConfigure { ...@@ -77,6 +91,11 @@ public class WechatMpConfigure {
this.setWxMpConfigStorage(wxMpDefaultConfig); this.setWxMpConfigStorage(wxMpDefaultConfig);
} }
}; };
wxMpZhengzaiMessageRouter = new WxMpMessageRouter(wxMpZhengzaiService);
wxMpModernskyMessageRouter = new WxMpMessageRouter(wxMpModernskyService);
wxMessageInMemoryDuplicateChecker = new WxMessageInMemoryDuplicateChecker();
} }
public WxMpService getWxMpService(Integer pnum) { public WxMpService getWxMpService(Integer pnum) {
...@@ -88,4 +107,34 @@ public class WechatMpConfigure { ...@@ -88,4 +107,34 @@ public class WechatMpConfigure {
} }
return null; return null;
} }
public WxMpMessageRouter getWxMpMessageRouter(Integer pnum) {
switch (pnum) {
case 1:
return wxMpZhengzaiMessageRouter;
case 2:
return wxMpModernskyMessageRouter;
}
return null;
}
public WxMpMessageRouter messageRouter(Integer type) {
WxMpMessageRouter router = getWxMpMessageRouter(type);
// 消息去重
router.setMessageDuplicateChecker(wxMessageInMemoryDuplicateChecker);
// 关注事件
router.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT)
.event(WxConsts.EventType.SUBSCRIBE)
.handler(subscribeHandler)
.end();
// 取消关注事件
router.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT)
.event(WxConsts.EventType.UNSUBSCRIBE)
.handler(unsubscribeHandler)
.end();
return router;
}
} }
...@@ -49,7 +49,9 @@ public class SweetWechatActionCallbackController { ...@@ -49,7 +49,9 @@ public class SweetWechatActionCallbackController {
@PostMapping("record") @PostMapping("record")
@ApiOperation("用户动作微信回调") @ApiOperation("用户动作微信回调")
public String record( public String record(
@RequestBody String requestBody, // @RequestBody String requestBody,
@RequestParam() String requestBody,
// @RequestParam("requestBody") String requestBody,
@RequestParam("type") Integer type, @RequestParam("type") Integer type,
@RequestParam("signature") String signature, @RequestParam("signature") String signature,
@RequestParam("timestamp") String timestamp, @RequestParam("timestamp") String timestamp,
...@@ -61,10 +63,10 @@ public class SweetWechatActionCallbackController { ...@@ -61,10 +63,10 @@ public class SweetWechatActionCallbackController {
log.info("\n接收微信请求:[type=[{}], openid=[{}], [signature=[{}], encType=[{}], msgSignature=[{}]," log.info("\n接收微信请求:[type=[{}], openid=[{}], [signature=[{}], encType=[{}], msgSignature=[{}],"
+ " timestamp=[{}], nonce=[{}], requestBody=[\n{}\n] ", + " timestamp=[{}], nonce=[{}], requestBody=[\n{}\n] ",
type, openid, signature, encType, msgSignature, timestamp, nonce, requestBody); type, openid, signature, encType, msgSignature, timestamp, nonce, requestBody);
if (!wechatSignUtils.checkSignature(signature, timestamp, nonce)) { /* if (!wechatSignUtils.checkSignature(signature, timestamp, nonce)) {
log.info("验签未通过,非法请求,可能属于伪造的请求!"); log.info("验签未通过,非法请求,可能属于伪造的请求!");
return ""; return "";
} }*/
return sweetWechatCallbackService.record(requestBody, type, timestamp, nonce, encType, msgSignature); return sweetWechatCallbackService.record(requestBody, type, timestamp, nonce, encType, msgSignature);
} }
} }
package com.liquidnet.service.sweet.service.impl; package com.liquidnet.service.sweet.service.impl;
import com.liquidnet.service.sweet.config.WechatMpConfigure; import com.liquidnet.service.sweet.config.WechatMpConfigure;
import com.liquidnet.service.sweet.handler.SubscribeHandler;
import com.liquidnet.service.sweet.handler.UnsubscribeHandler;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.api.WxConsts;
import me.chanjar.weixin.common.api.WxMessageInMemoryDuplicateChecker;
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.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;
...@@ -25,34 +20,9 @@ import org.springframework.stereotype.Service; ...@@ -25,34 +20,9 @@ import org.springframework.stereotype.Service;
@Slf4j @Slf4j
public class SweetWechatCallbackServiceImpl { public class SweetWechatCallbackServiceImpl {
@Autowired
private SubscribeHandler subscribeHandler;
@Autowired
private UnsubscribeHandler unsubscribeHandler;
@Autowired @Autowired
WechatMpConfigure wechatMpConfigure; WechatMpConfigure wechatMpConfigure;
public WxMpMessageRouter messageRouter(WxMpService wxMpService) {
WxMpMessageRouter router = new WxMpMessageRouter(wxMpService);
// 消息去重
router.setMessageDuplicateChecker(new WxMessageInMemoryDuplicateChecker());
// 关注事件
router.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT)
.event(WxConsts.EventType.SUBSCRIBE)
.handler(subscribeHandler)
.end();
// 取消关注事件
router.rule().async(false).msgType(WxConsts.XmlMsgType.EVENT)
.event(WxConsts.EventType.UNSUBSCRIBE)
.handler(unsubscribeHandler)
.end();
return router;
}
public String record(String requestBody, Integer type, String timestamp, String nonce, String encType, String msgSignature) { public String record(String requestBody, Integer type, String timestamp, String nonce, String encType, String msgSignature) {
if (null == type || type <= 0) { if (null == type || type <= 0) {
type = 1; type = 1;
...@@ -63,7 +33,7 @@ public class SweetWechatCallbackServiceImpl { ...@@ -63,7 +33,7 @@ public class SweetWechatCallbackServiceImpl {
// 明文传输的消息 // 明文传输的消息
WxMpXmlMessage inMessage = WxMpXmlMessage.fromXml(requestBody); WxMpXmlMessage inMessage = WxMpXmlMessage.fromXml(requestBody);
log.info("\n消息内容为:\n[{}] ", inMessage.toString()); log.info("\n消息内容为:\n[{}] ", inMessage.toString());
WxMpXmlOutMessage outMessage = messageRouter(wxMpService).route(inMessage); WxMpXmlOutMessage outMessage = wechatMpConfigure.messageRouter(type).route(inMessage);
if (outMessage == null) { if (outMessage == null) {
// 假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试 // 假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试
return ""; return "";
...@@ -74,7 +44,7 @@ public class SweetWechatCallbackServiceImpl { ...@@ -74,7 +44,7 @@ public class SweetWechatCallbackServiceImpl {
WxMpXmlMessage inMessage = WxMpXmlMessage.fromEncryptedXml(requestBody, wxMpService.getWxMpConfigStorage(), WxMpXmlMessage inMessage = WxMpXmlMessage.fromEncryptedXml(requestBody, wxMpService.getWxMpConfigStorage(),
timestamp, nonce, msgSignature); timestamp, nonce, msgSignature);
log.info("\n消息解密后内容为:\n[{}] ", inMessage.toString()); log.info("\n消息解密后内容为:\n[{}] ", inMessage.toString());
WxMpXmlOutMessage outMessage = messageRouter(wxMpService).route(inMessage); WxMpXmlOutMessage outMessage = wechatMpConfigure.messageRouter(type).route(inMessage);
if (outMessage == null) { if (outMessage == null) {
return ""; return "";
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment