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); | |||
| WxWeappInfo findVo(WxWeappInfo wxWeappInfo); | |||
| WxAuthorizerInfo findByAppid(String appId); | |||
| int updateReleaseInfo(WxAuthorizerInfo wxAuthorizerInfo); | |||
| @@ -50,14 +50,6 @@ public interface WxAuthorizerInfoService { | |||
| * @return | |||
| */ | |||
| WxAuthorizerInfo getByAppId(String appId); | |||
| /** | |||
| * 根据appId获得实体 | |||
| * | |||
| * @param appId | |||
| * @return | |||
| */ | |||
| WxWeappInfo getWeappByAppId(String appId); | |||
| /** | |||
| * 保存或更新实体 | |||
| @@ -68,19 +68,6 @@ public class WxAuthorizerInfoServiceImpl implements WxAuthorizerInfoService { | |||
| 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 | |||
| public void saveOrUpdate(WxAuthorizerInfo record) { | |||
| // 1. 添加到wx_authorizer_info表中 | |||
| @@ -2,8 +2,13 @@ package com.iformall.service.wechat; | |||
| import com.iformall.config.WechatRedisProperies; | |||
| 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.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.WxOpenServiceImpl; | |||
| import org.slf4j.Logger; | |||
| @@ -33,6 +38,26 @@ public class FmOpenService extends WxOpenServiceImpl { | |||
| @Autowired | |||
| 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 WxOpenMessageRouter wxOpenMessageRouter; | |||
| @@ -46,9 +71,92 @@ public class FmOpenService extends WxOpenServiceImpl { | |||
| setWxOpenConfigStorage(configStorage); | |||
| wxOpenMessageRouter = new WxOpenMessageRouter(this); | |||
| 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; | |||
| }).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() { | |||
| @@ -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 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.mp.api.WxMpService; | |||
| 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.mp.api.WxMpService; | |||
| 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.mp.api.WxMpService; | |||
| 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.mp.api.WxMpService; | |||
| 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.session.WxSessionManager; | |||
| 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.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) | |||
| @@ -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.mp.api.WxMpService; | |||
| 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.mapper.WxAuthorizerInfoMapper; | |||
| import com.iformall.mp.builder.TextBuilder; | |||
| import com.iformall.service.WxCUserService; | |||
| import com.iformall.service.wechat.handler.AbstractHandler; | |||
| import me.chanjar.weixin.common.error.WxErrorException; | |||
| import me.chanjar.weixin.common.session.WxSessionManager; | |||
| import me.chanjar.weixin.mp.api.WxMpService; | |||
| @@ -40,10 +40,13 @@ public class SubscribeHandler extends AbstractHandler { | |||
| authQ.setAuthorizerAppid(appId); | |||
| WxAuthorizerInfo authorizerInfo = wxAuthorizerInfoMapper.findWeChatMp(authQ); | |||
| if(authorizerInfo == null) { | |||
| return null; | |||
| } | |||
| // 获取微信用户基本信息 | |||
| try { | |||
| WxMpUser userWxInfo = weixinService.getUserService() | |||
| .userInfo(wxMessage.getFromUser()); | |||
| .userInfo(wxMessage.getFromUser()); | |||
| if (userWxInfo != null) { | |||
| this.logger.info(userWxInfo.toString()); | |||
| userService.saveOrUpdateMpUser(userWxInfo, authorizerInfo); | |||
| @@ -53,8 +56,7 @@ public class SubscribeHandler extends AbstractHandler { | |||
| this.logger.info("该公众号没有获取用户信息权限!"); | |||
| } | |||
| } | |||
| /* | |||
| WxMpXmlOutMessage responseResult = null; | |||
| try { | |||
| responseResult = this.handleSpecial(wxMessage); | |||
| @@ -71,6 +73,7 @@ public class SubscribeHandler extends AbstractHandler { | |||
| } catch (Exception e) { | |||
| this.logger.error(e.getMessage(), e); | |||
| } | |||
| */ | |||
| 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.mapper.WxAuthorizerInfoMapper; | |||
| import com.iformall.service.WxCUserService; | |||
| import com.iformall.service.wechat.handler.AbstractHandler; | |||
| import me.chanjar.weixin.common.session.WxSessionManager; | |||
| import me.chanjar.weixin.mp.api.WxMpService; | |||
| import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; | |||
| @@ -37,14 +38,15 @@ public class UnsubscribeHandler extends AbstractHandler { | |||
| WxAuthorizerInfo authQ = new WxAuthorizerInfo(); | |||
| authQ.setAuthorizerAppid(appId); | |||
| WxAuthorizerInfo authorizerInfo = wxAuthorizerInfoMapper.findWeChatMp(authQ); | |||
| if(authorizerInfo == null) { | |||
| return null; | |||
| } | |||
| WxMpUser mpUser = new WxMpUser(); | |||
| mpUser.setOpenId(wxMessage.getFromUser()); | |||
| mpUser.setSubscribe(false); | |||
| mpUser.setSubscribeTime(wxMessage.getCreateTime()); | |||
| userService.saveOrUpdateMpUser(mpUser, authorizerInfo); | |||
| 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.GsonBuilder; | |||
| @@ -162,6 +162,13 @@ | |||
| where `authorizer_appid` = #{authorizerAppid} | |||
| </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"> | |||
| <id column="id" jdbcType="BIGINT" property="id"/> | |||
| <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.domain.po.*; | |||
| import com.iformall.enums.*; | |||
| import com.iformall.mp.manager.WxMpManager; | |||
| import com.iformall.service.*; | |||
| import com.iformall.service.wechat.FmOpenService; | |||
| 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.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; | |||
| @@ -35,7 +33,6 @@ import java.io.IOException; | |||
| import java.io.InputStream; | |||
| import java.io.PrintWriter; | |||
| import java.nio.charset.Charset; | |||
| import java.text.SimpleDateFormat; | |||
| import java.util.Date; | |||
| @Controller | |||
| @@ -44,9 +41,6 @@ import java.util.Date; | |||
| public class WechatCalllbackController extends BaseController { | |||
| private final Logger logger = LoggerFactory.getLogger(this.getClass()); | |||
| @Autowired | |||
| private String fmAuditEmails; | |||
| @Autowired | |||
| protected FmOpenService openService; | |||
| @@ -56,21 +50,6 @@ public class WechatCalllbackController extends BaseController { | |||
| @Autowired | |||
| 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") | |||
| @ApiOperation("接收ticket回调") | |||
| @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); | |||
| 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) { | |||
| @@ -329,49 +214,6 @@ public class WechatCalllbackController extends BaseController { | |||
| 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 | |||
| @@ -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") | |||
| @ApiOperation("创建微信开放平台") | |||
| @@ -1,7 +1,7 @@ | |||
| package com.iformall.mp.manager; | |||
| import com.iformall.mp.handler.*; | |||
| 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.WxMpService; | |||
| import me.chanjar.weixin.mp.constant.WxMpEventConstants; | |||