test # Conflicts: # mallinkService/src/main/java/com/iformall/mapper/WxAuthorizerInfoMapper.javarelease
| @@ -13,7 +13,7 @@ public interface WxAuthorizerInfoMapper extends CommonMapper<WxAuthorizerInfo, L | |||||
| WxAuthorizerInfo findWeChatMp(WxAuthorizerInfo wxAuthorizerInfo); | WxAuthorizerInfo findWeChatMp(WxAuthorizerInfo wxAuthorizerInfo); | ||||
| WxWeappInfo findVo(WxWeappInfo wxWeappInfo); | |||||
| WxAuthorizerInfo findByAppid(String appId); | |||||
| int updateReleaseInfo(WxAuthorizerInfo wxAuthorizerInfo); | int updateReleaseInfo(WxAuthorizerInfo wxAuthorizerInfo); | ||||
| @@ -50,14 +50,6 @@ public interface WxAuthorizerInfoService { | |||||
| * @return | * @return | ||||
| */ | */ | ||||
| WxAuthorizerInfo getByAppId(String appId); | WxAuthorizerInfo getByAppId(String appId); | ||||
| /** | |||||
| * 根据appId获得实体 | |||||
| * | |||||
| * @param appId | |||||
| * @return | |||||
| */ | |||||
| WxWeappInfo getWeappByAppId(String appId); | |||||
| /** | /** | ||||
| * 保存或更新实体 | * 保存或更新实体 | ||||
| @@ -68,19 +68,6 @@ public class WxAuthorizerInfoServiceImpl implements WxAuthorizerInfoService { | |||||
| return null; | return null; | ||||
| } | } | ||||
| @Override | |||||
| public WxWeappInfo getWeappByAppId(String appId) { | |||||
| WxWeappInfo authQ = new WxWeappInfo(); | |||||
| authQ.setAuthorizerAppid(appId); | |||||
| try { | |||||
| WxWeappInfo authorizerInfo = authorizerInfoMapper.findVo(authQ); | |||||
| return authorizerInfo; | |||||
| } catch (Exception e) { | |||||
| logger.error(e.getMessage()); | |||||
| } | |||||
| return null; | |||||
| } | |||||
| @Override | @Override | ||||
| public void saveOrUpdate(WxAuthorizerInfo record) { | public void saveOrUpdate(WxAuthorizerInfo record) { | ||||
| // 1. 添加到wx_authorizer_info表中 | // 1. 添加到wx_authorizer_info表中 | ||||
| @@ -2,8 +2,13 @@ package com.iformall.service.wechat; | |||||
| import com.iformall.config.WechatRedisProperies; | import com.iformall.config.WechatRedisProperies; | ||||
| import com.iformall.config.WechatOpenProperties; | import com.iformall.config.WechatOpenProperties; | ||||
| import com.iformall.domain.po.WxAuthorizerInfo; | |||||
| import com.iformall.enums.EnumAppType; | |||||
| import com.iformall.mapper.WxAuthorizerInfoMapper; | import com.iformall.mapper.WxAuthorizerInfoMapper; | ||||
| import com.iformall.mapper.WxComponentVerifyTicketMapper; | import com.iformall.mapper.WxComponentVerifyTicketMapper; | ||||
| import com.iformall.service.wechat.handler.*; | |||||
| import me.chanjar.weixin.common.api.WxConsts; | |||||
| import me.chanjar.weixin.mp.constant.WxMpEventConstants; | |||||
| import me.chanjar.weixin.open.api.impl.WxOpenMessageRouter; | import me.chanjar.weixin.open.api.impl.WxOpenMessageRouter; | ||||
| import me.chanjar.weixin.open.api.impl.WxOpenServiceImpl; | import me.chanjar.weixin.open.api.impl.WxOpenServiceImpl; | ||||
| import org.slf4j.Logger; | import org.slf4j.Logger; | ||||
| @@ -33,6 +38,26 @@ public class FmOpenService extends WxOpenServiceImpl { | |||||
| @Autowired | @Autowired | ||||
| private WxAuthorizerInfoMapper authorizerInfoMapper; | private WxAuthorizerInfoMapper authorizerInfoMapper; | ||||
| @Autowired | |||||
| protected NullHandler nullHandler; | |||||
| @Autowired | |||||
| protected KfSessionHandler kfSessionHandler; | |||||
| @Autowired | |||||
| protected StoreCheckNotifyHandler storeCheckNotifyHandler; | |||||
| @Autowired | |||||
| protected LocationHandler locationHandler; | |||||
| @Autowired | |||||
| protected MenuHandler menuHandler; | |||||
| @Autowired | |||||
| protected MsgHandler msgHandler; | |||||
| @Autowired | |||||
| protected UnsubscribeHandler unsubscribeHandler; | |||||
| @Autowired | |||||
| protected SubscribeHandler subscribeHandler; | |||||
| @Autowired | |||||
| protected WeappAuditHandler weappAuditHandler; | |||||
| private static JedisPool pool; | private static JedisPool pool; | ||||
| private WxOpenMessageRouter wxOpenMessageRouter; | private WxOpenMessageRouter wxOpenMessageRouter; | ||||
| @@ -46,9 +71,92 @@ public class FmOpenService extends WxOpenServiceImpl { | |||||
| setWxOpenConfigStorage(configStorage); | setWxOpenConfigStorage(configStorage); | ||||
| wxOpenMessageRouter = new WxOpenMessageRouter(this); | wxOpenMessageRouter = new WxOpenMessageRouter(this); | ||||
| wxOpenMessageRouter.rule().handler((wxMpXmlMessage, map, wxMpService, wxSessionManager) -> { | wxOpenMessageRouter.rule().handler((wxMpXmlMessage, map, wxMpService, wxSessionManager) -> { | ||||
| logger.info("\n接收到 {} 公众号请求消息,内容:{}", wxMpService.getWxMpConfigStorage().getAppId(), wxMpXmlMessage); | |||||
| String appId = wxMpService.getWxMpConfigStorage().getAppId(); | |||||
| WxAuthorizerInfo authorizerInfo = authorizerInfoMapper.findByAppid(appId); | |||||
| String appType; | |||||
| if(authorizerInfo.getType() <= EnumAppType.C.getCode()) { | |||||
| appType = "小程序"; | |||||
| } else { | |||||
| appType = "公众号"; | |||||
| } | |||||
| logger.info("\n接收到{}{}请求消息,内容:{}", appId, appType, wxMpXmlMessage); | |||||
| return null; | return null; | ||||
| }).next(); | }).next(); | ||||
| // 接收客服会话管理事件 | |||||
| wxOpenMessageRouter.rule().async(false) | |||||
| .msgType(WxConsts.XmlMsgType.EVENT) | |||||
| .event(WxMpEventConstants.CustomerService.KF_CREATE_SESSION) | |||||
| .handler(this.kfSessionHandler).end(); | |||||
| wxOpenMessageRouter.rule().async(false) | |||||
| .msgType(WxConsts.XmlMsgType.EVENT) | |||||
| .event(WxMpEventConstants.CustomerService.KF_CLOSE_SESSION) | |||||
| .handler(this.kfSessionHandler).end(); | |||||
| wxOpenMessageRouter.rule().async(false) | |||||
| .msgType(WxConsts.XmlMsgType.EVENT) | |||||
| .event(WxMpEventConstants.CustomerService.KF_SWITCH_SESSION) | |||||
| .handler(this.kfSessionHandler).end(); | |||||
| // 门店审核事件 | |||||
| wxOpenMessageRouter.rule().async(false) | |||||
| .msgType(WxConsts.XmlMsgType.EVENT) | |||||
| .event(WxMpEventConstants.POI_CHECK_NOTIFY) | |||||
| .handler(this.storeCheckNotifyHandler).end(); | |||||
| // 自定义菜单事件 | |||||
| wxOpenMessageRouter.rule().async(false) | |||||
| .msgType(WxConsts.XmlMsgType.EVENT) | |||||
| .event(WxConsts.MenuButtonType.CLICK) | |||||
| .handler(this.menuHandler).end(); | |||||
| // 点击菜单连接事件 | |||||
| wxOpenMessageRouter.rule().async(false) | |||||
| .msgType(WxConsts.XmlMsgType.EVENT) | |||||
| .event(WxConsts.MenuButtonType.VIEW) | |||||
| .handler(this.nullHandler).end(); | |||||
| // 关注事件 | |||||
| wxOpenMessageRouter.rule().async(false) | |||||
| .msgType(WxConsts.XmlMsgType.EVENT) | |||||
| .event(WxConsts.EventType.SUBSCRIBE) | |||||
| .handler(this.subscribeHandler).end(); | |||||
| // 取消关注事件 | |||||
| wxOpenMessageRouter.rule().async(false) | |||||
| .msgType(WxConsts.XmlMsgType.EVENT) | |||||
| .event(WxConsts.EventType.UNSUBSCRIBE) | |||||
| .handler(this.unsubscribeHandler).end(); | |||||
| // 上报地理位置事件 | |||||
| wxOpenMessageRouter.rule().async(false) | |||||
| .msgType(WxConsts.XmlMsgType.EVENT) | |||||
| .event(WxConsts.EventType.LOCATION) | |||||
| .handler(this.locationHandler).end(); | |||||
| // 接收地理位置消息 | |||||
| wxOpenMessageRouter.rule().async(false) | |||||
| .msgType(WxConsts.XmlMsgType.LOCATION) | |||||
| .handler(this.locationHandler).end(); | |||||
| // 扫码事件 | |||||
| wxOpenMessageRouter.rule().async(false) | |||||
| .msgType(WxConsts.XmlMsgType.EVENT) | |||||
| .event(WxConsts.EventType.SCAN) | |||||
| .handler(this.nullHandler).end(); | |||||
| // 小程序 审核通过 | |||||
| wxOpenMessageRouter.rule().async(false) | |||||
| .msgType(WxConsts.XmlMsgType.EVENT) | |||||
| .event(WxConsts.EventType.WEAPP_AUDIT_SUCCESS) | |||||
| .handler(this.weappAuditHandler).end(); | |||||
| // 小程序 审核失败 | |||||
| wxOpenMessageRouter.rule().async(false) | |||||
| .msgType(WxConsts.XmlMsgType.EVENT) | |||||
| .event(WxConsts.EventType.WEAPP_AUDIT_FAIL) | |||||
| .handler(this.weappAuditHandler).end(); | |||||
| // 默认 | |||||
| wxOpenMessageRouter.rule().async(false).handler(this.msgHandler).end(); | |||||
| } | } | ||||
| public WxOpenMessageRouter getWxOpenMessageRouter() { | public WxOpenMessageRouter getWxOpenMessageRouter() { | ||||
| @@ -0,0 +1,17 @@ | |||||
| package com.iformall.service.wechat.builder; | |||||
| import me.chanjar.weixin.mp.api.WxMpService; | |||||
| import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; | |||||
| import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; | |||||
| import org.slf4j.Logger; | |||||
| import org.slf4j.LoggerFactory; | |||||
| /** | |||||
| * @author Stormeye | |||||
| */ | |||||
| public abstract class AbstractBuilder { | |||||
| protected final Logger logger = LoggerFactory.getLogger(getClass()); | |||||
| public abstract WxMpXmlOutMessage build(String content, | |||||
| WxMpXmlMessage wxMessage, WxMpService service); | |||||
| } | |||||
| @@ -0,0 +1,24 @@ | |||||
| package com.iformall.service.wechat.builder; | |||||
| import me.chanjar.weixin.mp.api.WxMpService; | |||||
| import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; | |||||
| import me.chanjar.weixin.mp.bean.message.WxMpXmlOutImageMessage; | |||||
| import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; | |||||
| /** | |||||
| * @author Binary Wang(https://github.com/binarywang) | |||||
| */ | |||||
| public class ImageBuilder extends AbstractBuilder { | |||||
| @Override | |||||
| public WxMpXmlOutMessage build(String content, WxMpXmlMessage wxMessage, | |||||
| WxMpService service) { | |||||
| WxMpXmlOutImageMessage m = WxMpXmlOutMessage.IMAGE().mediaId(content) | |||||
| .fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser()) | |||||
| .build(); | |||||
| return m; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,25 @@ | |||||
| package com.iformall.service.wechat.builder; | |||||
| import me.chanjar.weixin.mp.api.WxMpService; | |||||
| import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; | |||||
| import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; | |||||
| import me.chanjar.weixin.mp.bean.message.WxMpXmlOutTextMessage; | |||||
| import org.slf4j.Logger; | |||||
| import org.slf4j.LoggerFactory; | |||||
| /** | |||||
| * @author Binary Wang(https://github.com/binarywang) | |||||
| */ | |||||
| public class TextBuilder extends AbstractBuilder { | |||||
| private final Logger logger = LoggerFactory.getLogger(this.getClass()); | |||||
| @Override | |||||
| public WxMpXmlOutMessage build(String content, WxMpXmlMessage wxMessage, | |||||
| WxMpService service) { | |||||
| WxMpXmlOutTextMessage m = WxMpXmlOutMessage.TEXT().content(content) | |||||
| .fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser()) | |||||
| .build(); | |||||
| return m; | |||||
| } | |||||
| } | |||||
| @@ -1,4 +1,4 @@ | |||||
| package com.iformall.mp.handler; | |||||
| package com.iformall.service.wechat.handler; | |||||
| import me.chanjar.weixin.mp.api.WxMpMessageHandler; | import me.chanjar.weixin.mp.api.WxMpMessageHandler; | ||||
| import org.slf4j.Logger; | import org.slf4j.Logger; | ||||
| @@ -1,5 +1,6 @@ | |||||
| package com.iformall.mp.handler; | |||||
| package com.iformall.service.wechat.handler; | |||||
| import com.iformall.service.wechat.handler.AbstractHandler; | |||||
| import me.chanjar.weixin.common.session.WxSessionManager; | import me.chanjar.weixin.common.session.WxSessionManager; | ||||
| 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; | ||||
| @@ -1,6 +1,6 @@ | |||||
| package com.iformall.mp.handler; | |||||
| package com.iformall.service.wechat.handler; | |||||
| import com.iformall.mp.builder.TextBuilder; | |||||
| import com.iformall.service.wechat.builder.TextBuilder; | |||||
| import me.chanjar.weixin.common.session.WxSessionManager; | import me.chanjar.weixin.common.session.WxSessionManager; | ||||
| 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; | ||||
| @@ -1,6 +1,6 @@ | |||||
| package com.iformall.mp.handler; | |||||
| package com.iformall.service.wechat.handler; | |||||
| import com.iformall.mp.utils.JsonUtils; | |||||
| import com.iformall.service.wechat.utils.JsonUtils; | |||||
| import me.chanjar.weixin.common.session.WxSessionManager; | import me.chanjar.weixin.common.session.WxSessionManager; | ||||
| 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; | ||||
| @@ -1,5 +1,6 @@ | |||||
| package com.iformall.mp.handler; | |||||
| package com.iformall.service.wechat.handler; | |||||
| import com.iformall.service.wechat.handler.AbstractHandler; | |||||
| import me.chanjar.weixin.common.session.WxSessionManager; | import me.chanjar.weixin.common.session.WxSessionManager; | ||||
| 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; | ||||
| @@ -1,6 +1,6 @@ | |||||
| package com.iformall.mp.handler; | |||||
| package com.iformall.service.wechat.handler; | |||||
| import com.iformall.mp.builder.TextBuilder; | |||||
| import com.iformall.service.wechat.builder.TextBuilder; | |||||
| import me.chanjar.weixin.common.error.WxErrorException; | import me.chanjar.weixin.common.error.WxErrorException; | ||||
| import me.chanjar.weixin.common.session.WxSessionManager; | import me.chanjar.weixin.common.session.WxSessionManager; | ||||
| import me.chanjar.weixin.mp.api.WxMpService; | import me.chanjar.weixin.mp.api.WxMpService; | ||||
| @@ -1,4 +1,4 @@ | |||||
| package com.iformall.mp.handler; | |||||
| package com.iformall.service.wechat.handler; | |||||
| import me.chanjar.weixin.common.session.WxSessionManager; | import me.chanjar.weixin.common.session.WxSessionManager; | ||||
| import me.chanjar.weixin.mp.api.WxMpService; | import me.chanjar.weixin.mp.api.WxMpService; | ||||
| @@ -1,4 +1,6 @@ | |||||
| package com.iformall.mp.handler; | |||||
| package com.iformall.service.wechat.handler; | |||||
| import com.iformall.service.wechat.handler.AbstractHandler; | |||||
| /** | /** | ||||
| * @author Binary Wang(https://github.com/binarywang) | * @author Binary Wang(https://github.com/binarywang) | ||||
| @@ -1,5 +1,6 @@ | |||||
| package com.iformall.mp.handler; | |||||
| package com.iformall.service.wechat.handler; | |||||
| import com.iformall.service.wechat.handler.AbstractHandler; | |||||
| import me.chanjar.weixin.common.session.WxSessionManager; | import me.chanjar.weixin.common.session.WxSessionManager; | ||||
| 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; | ||||
| @@ -1,9 +1,9 @@ | |||||
| package com.iformall.mp.handler; | |||||
| package com.iformall.service.wechat.handler; | |||||
| import com.iformall.domain.po.WxAuthorizerInfo; | import com.iformall.domain.po.WxAuthorizerInfo; | ||||
| import com.iformall.mapper.WxAuthorizerInfoMapper; | import com.iformall.mapper.WxAuthorizerInfoMapper; | ||||
| import com.iformall.mp.builder.TextBuilder; | |||||
| import com.iformall.service.WxCUserService; | import com.iformall.service.WxCUserService; | ||||
| import com.iformall.service.wechat.handler.AbstractHandler; | |||||
| import me.chanjar.weixin.common.error.WxErrorException; | import me.chanjar.weixin.common.error.WxErrorException; | ||||
| import me.chanjar.weixin.common.session.WxSessionManager; | import me.chanjar.weixin.common.session.WxSessionManager; | ||||
| import me.chanjar.weixin.mp.api.WxMpService; | import me.chanjar.weixin.mp.api.WxMpService; | ||||
| @@ -40,10 +40,13 @@ public class SubscribeHandler extends AbstractHandler { | |||||
| authQ.setAuthorizerAppid(appId); | authQ.setAuthorizerAppid(appId); | ||||
| WxAuthorizerInfo authorizerInfo = wxAuthorizerInfoMapper.findWeChatMp(authQ); | WxAuthorizerInfo authorizerInfo = wxAuthorizerInfoMapper.findWeChatMp(authQ); | ||||
| if(authorizerInfo == null) { | |||||
| return null; | |||||
| } | |||||
| // 获取微信用户基本信息 | // 获取微信用户基本信息 | ||||
| try { | try { | ||||
| WxMpUser userWxInfo = weixinService.getUserService() | WxMpUser userWxInfo = weixinService.getUserService() | ||||
| .userInfo(wxMessage.getFromUser()); | |||||
| .userInfo(wxMessage.getFromUser()); | |||||
| if (userWxInfo != null) { | if (userWxInfo != null) { | ||||
| this.logger.info(userWxInfo.toString()); | this.logger.info(userWxInfo.toString()); | ||||
| userService.saveOrUpdateMpUser(userWxInfo, authorizerInfo); | userService.saveOrUpdateMpUser(userWxInfo, authorizerInfo); | ||||
| @@ -53,8 +56,7 @@ public class SubscribeHandler extends AbstractHandler { | |||||
| this.logger.info("该公众号没有获取用户信息权限!"); | this.logger.info("该公众号没有获取用户信息权限!"); | ||||
| } | } | ||||
| } | } | ||||
| /* | |||||
| WxMpXmlOutMessage responseResult = null; | WxMpXmlOutMessage responseResult = null; | ||||
| try { | try { | ||||
| responseResult = this.handleSpecial(wxMessage); | responseResult = this.handleSpecial(wxMessage); | ||||
| @@ -71,6 +73,7 @@ public class SubscribeHandler extends AbstractHandler { | |||||
| } catch (Exception e) { | } catch (Exception e) { | ||||
| this.logger.error(e.getMessage(), e); | this.logger.error(e.getMessage(), e); | ||||
| } | } | ||||
| */ | |||||
| return null; | return null; | ||||
| } | } | ||||
| @@ -1,8 +1,9 @@ | |||||
| package com.iformall.mp.handler; | |||||
| package com.iformall.service.wechat.handler; | |||||
| import com.iformall.domain.po.WxAuthorizerInfo; | import com.iformall.domain.po.WxAuthorizerInfo; | ||||
| import com.iformall.mapper.WxAuthorizerInfoMapper; | import com.iformall.mapper.WxAuthorizerInfoMapper; | ||||
| import com.iformall.service.WxCUserService; | import com.iformall.service.WxCUserService; | ||||
| import com.iformall.service.wechat.handler.AbstractHandler; | |||||
| import me.chanjar.weixin.common.session.WxSessionManager; | import me.chanjar.weixin.common.session.WxSessionManager; | ||||
| 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; | ||||
| @@ -37,14 +38,15 @@ public class UnsubscribeHandler extends AbstractHandler { | |||||
| WxAuthorizerInfo authQ = new WxAuthorizerInfo(); | WxAuthorizerInfo authQ = new WxAuthorizerInfo(); | ||||
| authQ.setAuthorizerAppid(appId); | authQ.setAuthorizerAppid(appId); | ||||
| WxAuthorizerInfo authorizerInfo = wxAuthorizerInfoMapper.findWeChatMp(authQ); | WxAuthorizerInfo authorizerInfo = wxAuthorizerInfoMapper.findWeChatMp(authQ); | ||||
| if(authorizerInfo == null) { | |||||
| return null; | |||||
| } | |||||
| WxMpUser mpUser = new WxMpUser(); | WxMpUser mpUser = new WxMpUser(); | ||||
| mpUser.setOpenId(wxMessage.getFromUser()); | mpUser.setOpenId(wxMessage.getFromUser()); | ||||
| mpUser.setSubscribe(false); | mpUser.setSubscribe(false); | ||||
| mpUser.setSubscribeTime(wxMessage.getCreateTime()); | mpUser.setSubscribeTime(wxMessage.getCreateTime()); | ||||
| userService.saveOrUpdateMpUser(mpUser, authorizerInfo); | userService.saveOrUpdateMpUser(mpUser, authorizerInfo); | ||||
| return null; | return null; | ||||
| } | } | ||||
| @@ -0,0 +1,104 @@ | |||||
| package com.iformall.service.wechat.handler; | |||||
| import com.iformall.domain.po.WxAppinfo; | |||||
| import com.iformall.domain.po.WxWeappAuditStatus; | |||||
| import com.iformall.enums.EnumAppType; | |||||
| import com.iformall.enums.EnumWeappAuditStatus; | |||||
| import com.iformall.service.MailService; | |||||
| import com.iformall.service.WxAppinfoService; | |||||
| import com.iformall.service.WxWeappAuditStatusService; | |||||
| import me.chanjar.weixin.common.api.WxConsts; | |||||
| import me.chanjar.weixin.common.session.WxSessionManager; | |||||
| import me.chanjar.weixin.mp.api.WxMpService; | |||||
| import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; | |||||
| import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; | |||||
| import org.springframework.beans.factory.annotation.Autowired; | |||||
| import org.springframework.stereotype.Component; | |||||
| import java.text.SimpleDateFormat; | |||||
| import java.util.Date; | |||||
| import java.util.Map; | |||||
| /** | |||||
| * @author Binary Wang(https://github.com/binarywang) | |||||
| */ | |||||
| @Component | |||||
| public class WeappAuditHandler extends AbstractHandler { | |||||
| @Autowired | |||||
| private WxWeappAuditStatusService weappAuditStatusService; | |||||
| @Autowired | |||||
| private WxAppinfoService appinfoService; | |||||
| @Autowired | |||||
| private String fmAuditEmails; | |||||
| @Autowired | |||||
| private MailService mailService; | |||||
| @Override | |||||
| public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, | |||||
| Map<String, Object> context, WxMpService wxMpService, | |||||
| WxSessionManager sessionManager) { | |||||
| String appId = wxMpService.getWxMpConfigStorage().getAppId(); | |||||
| if(wxMessage.getEvent().equalsIgnoreCase(WxConsts.EventType.WEAPP_AUDIT_SUCCESS)) { | |||||
| updateAuditStatus(appId, true, null); | |||||
| } else if(wxMessage.getEvent().equalsIgnoreCase(WxConsts.EventType.WEAPP_AUDIT_SUCCESS)) { | |||||
| updateAuditStatus(appId, false, wxMessage.getReason()); | |||||
| } | |||||
| return null; | |||||
| } | |||||
| private void updateAuditStatus(String appId, boolean success, String reason) { | |||||
| WxWeappAuditStatus auditStatus = weappAuditStatusService.getByAppId(appId); | |||||
| if (auditStatus != null) { | |||||
| if (success) { | |||||
| auditStatus.setAuditStatus(EnumWeappAuditStatus.SUCCESS.getCode()); | |||||
| auditStatus.setAuditErrCode(""); | |||||
| } else { | |||||
| auditStatus.setAuditStatus(EnumWeappAuditStatus.FAIL.getCode()); | |||||
| auditStatus.setAuditErrCode(reason); | |||||
| } | |||||
| auditStatus.setAuditTime(new Date()); | |||||
| weappAuditStatusService.updateStatus(auditStatus); | |||||
| } | |||||
| // 发邮件 | |||||
| WxAppinfo appinfo = appinfoService.getByAppId(appId); | |||||
| if (appinfo != null) { | |||||
| SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式 | |||||
| StringBuilder titleSB = new StringBuilder(); | |||||
| if (appinfo.getType().equals(EnumAppType.C.getCode())) { | |||||
| titleSB.append("C端小程序"); | |||||
| } else if (appinfo.getType().equals(EnumAppType.B.getCode())) { | |||||
| titleSB.append("B端小程序"); | |||||
| } else if (appinfo.getType().equals(EnumAppType.MP_S.getCode())) { | |||||
| titleSB.append("公众号-服务号"); | |||||
| } else if (appinfo.getType().equals(EnumAppType.MP_P.getCode())) { | |||||
| titleSB.append("公众号-订阅号"); | |||||
| } | |||||
| titleSB.append(appinfo.getName()); | |||||
| if (success) { | |||||
| titleSB.append("审核通过"); | |||||
| } else { | |||||
| titleSB.append("审核未通过"); | |||||
| } | |||||
| StringBuilder sb = new StringBuilder(); | |||||
| sb.append(df.format(new Date())).append("\n"); | |||||
| if (success) { | |||||
| sb.append("审核通过\n"); | |||||
| } else { | |||||
| sb.append("审核未通过\n").append("原因").append(reason); | |||||
| } | |||||
| String[] receivers = fmAuditEmails.split(","); | |||||
| //发送邮件 | |||||
| mailService.sendSimpleMail(receivers, titleSB.toString(), sb.toString()); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -1,4 +1,4 @@ | |||||
| package com.iformall.mp.utils; | |||||
| package com.iformall.service.wechat.utils; | |||||
| import com.google.gson.Gson; | import com.google.gson.Gson; | ||||
| import com.google.gson.GsonBuilder; | import com.google.gson.GsonBuilder; | ||||
| @@ -162,6 +162,13 @@ | |||||
| where `authorizer_appid` = #{authorizerAppid} | where `authorizer_appid` = #{authorizerAppid} | ||||
| </select> | </select> | ||||
| <select id="findByAppid" parameterType="string" resultMap="BaseResultMap"> | |||||
| select | |||||
| <include refid="allColumns"/> | |||||
| from wx_authorizer_info | |||||
| where `authorizer_appid` = #{value} | |||||
| </select> | |||||
| <resultMap id="VBaseResultMap" type="com.iformall.domain.vo.WxWeappInfo"> | <resultMap id="VBaseResultMap" type="com.iformall.domain.vo.WxWeappInfo"> | ||||
| <id column="id" jdbcType="BIGINT" property="id"/> | <id column="id" jdbcType="BIGINT" property="id"/> | ||||
| <result column="tenant_id" jdbcType="VARCHAR" property="tenantId"/> | <result column="tenant_id" jdbcType="VARCHAR" property="tenantId"/> | ||||
| @@ -6,7 +6,6 @@ import com.iformall.common.Result; | |||||
| import com.iformall.common.ResultData; | import com.iformall.common.ResultData; | ||||
| import com.iformall.domain.po.*; | import com.iformall.domain.po.*; | ||||
| import com.iformall.enums.*; | import com.iformall.enums.*; | ||||
| import com.iformall.mp.manager.WxMpManager; | |||||
| import com.iformall.service.*; | import com.iformall.service.*; | ||||
| import com.iformall.service.wechat.FmOpenService; | import com.iformall.service.wechat.FmOpenService; | ||||
| import io.swagger.annotations.Api; | import io.swagger.annotations.Api; | ||||
| @@ -15,7 +14,6 @@ import me.chanjar.weixin.common.error.WxErrorException; | |||||
| 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; | ||||
| @@ -35,7 +33,6 @@ import java.io.IOException; | |||||
| import java.io.InputStream; | import java.io.InputStream; | ||||
| import java.io.PrintWriter; | import java.io.PrintWriter; | ||||
| import java.nio.charset.Charset; | import java.nio.charset.Charset; | ||||
| import java.text.SimpleDateFormat; | |||||
| import java.util.Date; | import java.util.Date; | ||||
| @Controller | @Controller | ||||
| @@ -44,9 +41,6 @@ import java.util.Date; | |||||
| public class WechatCalllbackController extends BaseController { | public class WechatCalllbackController extends BaseController { | ||||
| private final Logger logger = LoggerFactory.getLogger(this.getClass()); | private final Logger logger = LoggerFactory.getLogger(this.getClass()); | ||||
| @Autowired | |||||
| private String fmAuditEmails; | |||||
| @Autowired | @Autowired | ||||
| protected FmOpenService openService; | protected FmOpenService openService; | ||||
| @@ -56,21 +50,6 @@ public class WechatCalllbackController extends BaseController { | |||||
| @Autowired | @Autowired | ||||
| private WxAuthorizerInfoService authorizerInfoService; | private WxAuthorizerInfoService authorizerInfoService; | ||||
| @Autowired | |||||
| private WxWeappAuditStatusService weappAuditStatusService; | |||||
| @Autowired | |||||
| private WxAppinfoService appinfoService; | |||||
| @Autowired | |||||
| private WxCUserService userService; | |||||
| @Autowired | |||||
| private MailService mailService; | |||||
| @Autowired | |||||
| private WxMpManager mpManager; | |||||
| @PostMapping(value = "/notify") | @PostMapping(value = "/notify") | ||||
| @ApiOperation("接收ticket回调") | @ApiOperation("接收ticket回调") | ||||
| @ResponseBody | @ResponseBody | ||||
| @@ -219,108 +198,14 @@ public class WechatCalllbackController extends BaseController { | |||||
| } | } | ||||
| // 实际 消息 处理 | // 实际 消息 处理 | ||||
| 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() <= EnumAppType.C.getCode())) { | |||||
| /**判断消息类型,调用对应的方法*/ | |||||
| handleWeappCallbackMessage(appId, inMessage); | |||||
| wechatWriteSuccess(printWriter); | |||||
| return; | |||||
| } else { | |||||
| handleMPCallbackMessage(appId, inMessage, authorizerInfo); | |||||
| //handleCallbackMessage(appId, response, inMessage); | |||||
| WxMpXmlOutMessage outMessage = openService.getWxOpenMessageRouter().route(inMessage, appId); | |||||
| if(outMessage == null) { | |||||
| PrintWriter printWriter = response.getWriter(); | |||||
| wechatWriteSuccess(printWriter); | wechatWriteSuccess(printWriter); | ||||
| return; | |||||
| /* | |||||
| // 公众号 | |||||
| try { | |||||
| WxMpXmlOutMessage outMessage = mpManager.getRouter(appId).route(inMessage); | |||||
| getThreadCount( 1 ); | |||||
| if (outMessage == null) { | |||||
| this.logger.info("2 return: success"); | |||||
| wechatWriteSuccess(printWriter); | |||||
| return; | |||||
| } | |||||
| // logger.info("组装回复" + outMessage.toXml()); | |||||
| // out = outMessage.toEncryptedXml(mpService.getWxMpConfigStorage()); | |||||
| // logger.info("组装回复消息-->"+out); | |||||
| } 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; | |||||
| } | |||||
| } | } | ||||
| PrintWriter printWriter = response.getWriter(); | |||||
| wechatWriteSuccess(printWriter); | |||||
| } | } | ||||
| private void wechatWriteSuccess(PrintWriter printWriter) { | private void wechatWriteSuccess(PrintWriter printWriter) { | ||||
| @@ -329,49 +214,6 @@ public class WechatCalllbackController extends BaseController { | |||||
| printWriter.close(); | printWriter.close(); | ||||
| } | } | ||||
| /** | |||||
| * 新关注消息处理 | |||||
| * @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 appId | ||||
| @@ -436,56 +278,6 @@ public class WechatCalllbackController extends BaseController { | |||||
| } | } | ||||
| private void updateAuditStatus(String appId, boolean success, String reason) { | |||||
| WxWeappAuditStatus auditStatus = weappAuditStatusService.getByAppId(appId); | |||||
| if (auditStatus != null) { | |||||
| if (success) { | |||||
| auditStatus.setAuditStatus(EnumWeappAuditStatus.SUCCESS.getCode()); | |||||
| auditStatus.setAuditErrCode(""); | |||||
| } else { | |||||
| auditStatus.setAuditStatus(EnumWeappAuditStatus.FAIL.getCode()); | |||||
| auditStatus.setAuditErrCode(reason); | |||||
| } | |||||
| auditStatus.setAuditTime(new Date()); | |||||
| weappAuditStatusService.updateStatus(auditStatus); | |||||
| } | |||||
| // 发邮件 | |||||
| WxAppinfo appinfo = appinfoService.getByAppId(appId); | |||||
| if (appinfo != null) { | |||||
| SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式 | |||||
| StringBuilder titleSB = new StringBuilder(); | |||||
| if (appinfo.getType().equals(EnumAppType.C.getCode())) { | |||||
| titleSB.append("C端小程序"); | |||||
| } else if (appinfo.getType().equals(EnumAppType.B.getCode())) { | |||||
| titleSB.append("B端小程序"); | |||||
| } else if (appinfo.getType().equals(EnumAppType.MP_S.getCode())) { | |||||
| titleSB.append("公众号-服务号"); | |||||
| } else if (appinfo.getType().equals(EnumAppType.MP_P.getCode())) { | |||||
| titleSB.append("公众号-订阅号"); | |||||
| } | |||||
| titleSB.append(appinfo.getName()); | |||||
| if (success) { | |||||
| titleSB.append("审核通过"); | |||||
| } else { | |||||
| titleSB.append("审核未通过"); | |||||
| } | |||||
| StringBuilder sb = new StringBuilder(); | |||||
| sb.append(df.format(new Date())).append("\n"); | |||||
| if (success) { | |||||
| sb.append("审核通过\n"); | |||||
| } else { | |||||
| sb.append("审核未通过\n").append("原因").append(reason); | |||||
| } | |||||
| String[] receivers = fmAuditEmails.split(","); | |||||
| //发送邮件 | |||||
| mailService.sendSimpleMail(receivers, titleSB.toString(), sb.toString()); | |||||
| } | |||||
| } | |||||
| @GetMapping(value = "/createOpenPlatform") | @GetMapping(value = "/createOpenPlatform") | ||||
| @ApiOperation("创建微信开放平台") | @ApiOperation("创建微信开放平台") | ||||
| @@ -1,7 +1,7 @@ | |||||
| package com.iformall.mp.manager; | package com.iformall.mp.manager; | ||||
| import com.iformall.mp.handler.*; | |||||
| import com.iformall.service.wechat.FmOpenService; | import com.iformall.service.wechat.FmOpenService; | ||||
| import com.iformall.service.wechat.handler.*; | |||||
| 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; | ||||