package com.zzwtec.wechat.controller; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.jfinal.kit.StrKit; import com.xiaoleilu.hutool.dfa.WordTree; import com.zzwtec.jdbc.entity.ThirdUserWechat; import com.zzwtec.jdbc.service.ThirdUserWechatService; import com.zzwtec.third.utils.StringUtil; import com.zzwtec.wechat.biz.EventBiz; import com.zzwtec.wechat.common.constant.UrlConstants; import com.zzwtec.wechat.config.WeChatConfig; import com.zzwtec.wechat.dfa.DFAWordTree; import com.zzwtec.wechat.rpc.APIResponse; import com.zzwtec.wechat.rpc.api.APIService; import com.zzwtec.wechat.rpc.inject.ProxyBuilder; import com.zzwtec.wechat.sdk.aop.annotation.ZZWMsgController; import com.zzwtec.wechat.sdk.api.SnsAccessTokenApi; import com.zzwtec.wechat.sdk.inlet.MsgController; import com.zzwtec.wechat.sdk.msg.in.*; import com.zzwtec.wechat.sdk.msg.in.card.*; import com.zzwtec.wechat.sdk.msg.in.event.*; import com.zzwtec.wechat.sdk.msg.in.speech_recognition.InSpeechRecognitionResults; import com.zzwtec.wechat.service.LoginService; import com.zzwtec.wechat.util.CharUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import java.util.List; import static com.zzwtec.wechat.sdk.api.ApiConfigKit.getAppId; import static com.zzwtec.wechat.sdk.utils.RenderUtil.renderNull; /** * 来做微信的事件 * * @author 邓燎燕 * 2016年4月28日 */ @Controller @RequestMapping("/wx") @ZZWMsgController public class WeChatEventController extends MsgController { @Autowired private LoginService loginService; private static final Logger logger = LoggerFactory.getLogger(WeChatEventController.class); private static final APIService apiService = ProxyBuilder.build(APIService.class,WeChatConfig.weChatConfig); @Autowired private ThirdUserWechatService thirdUserWechatService; @Autowired private StringRedisTemplate redisTemplate; /** * 处理接收到的文本消息 */ @Override protected void processInTextMsg(InTextMsg inTextMsg) { String content = inTextMsg.getContent(); if ("产品".equals(inTextMsg.getContent())) { String productVideo = WeChatConfig.weChatConfig.getProductVideo(); if (productVideo != null && productVideo.length() > 0) { renderOutTextMsg("欢迎使用智之屋\n\n请点击“观看产品视频”"); } } List wordTreeList = WeChatConfig.weChatConfig.getWordTreeList(); for (DFAWordTree dfaWordTree : wordTreeList) { WordTree wordTree = dfaWordTree.getWordTree(); boolean match = wordTree.isMatch(content); if(match){ renderOutTextMsg(dfaWordTree.getReplayContent()); return; } } //指定关键词回复 } /** * 处理接收到的图片消息 */ @Override protected void processInImageMsg(InImageMsg inImageMsg) { renderOutTextMsg("消息已成功接收,url为: " + inImageMsg.getPicUrl()); } /** * 处理接收到的语音消息 */ @Override protected void processInVoiceMsg(InVoiceMsg inVoiceMsg) { renderOutTextMsg("消息已成功接收,mediaId为: " + inVoiceMsg.getMediaId()); } /** * 处理接收到的视频消息 */ @Override protected void processInVideoMsg(InVideoMsg inVideoMsg) { renderOutTextMsg("消息已成功接收,mediaId为: " + inVideoMsg.getMediaId()); } /** * 处理接收到的视频消息 */ @Override protected void processInShortVideoMsg(InShortVideoMsg inShortVideoMsg) { renderOutTextMsg("\t视频消息已成功接收,该视频的 mediaId 为: " + inShortVideoMsg.getMediaId()); } /** * 处理接收到的地址位置消息 */ @Override protected void processInLocationMsg(InLocationMsg inLocationMsg) { renderOutTextMsg("消息已成功接收,位置信息为: " + inLocationMsg.getLabel()); } /** * 处理接收到的链接消息 */ @Override protected void processInLinkMsg(InLinkMsg inLinkMsg) { renderOutTextMsg("消息已成功接收,url为: " + inLinkMsg.getUrl()); } /** * 处理接收到的多客服管理事件 */ @Override protected void processInCustomEvent(InCustomEvent inCustomEvent) { renderOutTextMsg("processInCustomEvent() 方法测试成功"); } /** * 处理接收到的关注/取消关注事件 */ @Override protected void processInFollowEvent(InFollowEvent inFollowEvent) { String openId = inFollowEvent.getFromUserName(); boolean isSubscribe = inFollowEvent.getEvent().equals("subscribe"); iceProcessInFollowEvent(openId, isSubscribe); } /** * 处理接收到的扫描带参数二维码事件 */ @Override protected void processInQrCodeEvent(InQrCodeEvent inQrCodeEvent) { if (InQrCodeEvent.EVENT_INQRCODE_SUBSCRIBE.equals(inQrCodeEvent.getEvent())) { //用户未关注时,进行关注后的事件推送 final String openid = inQrCodeEvent.getFromUserName(); logger.debug("扫码未关注:" + openid); renderOutTextMsg("感谢您的关注,二维码内容:" + inQrCodeEvent.getEventKey()); iceProcessInFollowEvent(openid, true); } else if (InQrCodeEvent.EVENT_INQRCODE_SCAN.equals(inQrCodeEvent.getEvent())) { //用户已关注时的事件推送 logger.debug("扫码已关注:" + inQrCodeEvent.getFromUserName()); String key = inQrCodeEvent.getEventKey(); renderOutTextMsg(key); } } /** * 处理接收到的上报地理位置事件 */ @Override protected void processInLocationEvent(InLocationEvent inLocationEvent) { logger.debug("测试方法:processInLocationEvent()"); renderNull(); } /** * 处理接收到的群发任务结束时通知事件 */ @Override protected void processInMassEvent(InMassEvent inMassEvent) { logger.debug("测试方法:processInMassEvent()"); renderNull(); } /** * 处理接收到的自定义菜单事件 */ @Override protected void processInMenuEvent(InMenuEvent inMenuEvent) { String key = inMenuEvent.getEventKey(); String openid = inMenuEvent.getFromUserName(); String tokenId=loginService.getLoginToken(); String adminCommunityIds=redisTemplate.opsForValue().get("adminCommunityIds"); String[] communityIds=StringUtil.notEmpty(adminCommunityIds)?adminCommunityIds.split(","):new String[0]; logger.debug("processInMenuEvent key:" + key); switch (key) { case EventBiz.KEY_MSG: //公告 EventBiz.msgEven(getAppId(), openid, this,communityIds); break; case EventBiz.KEY_DOOR: //开门 EventBiz.doorEven(getAppId(), openid, this,tokenId,communityIds); break; case EventBiz.KEY_INFO: //个人中心 renderNull(); break; default: renderNull(); break; } } /** * 处理接收到的语音识别结果 */ @Override protected void processInSpeechRecognitionResults(InSpeechRecognitionResults inSpeechRecognitionResults) { logger.debug("语音识别事件:" + inSpeechRecognitionResults.getFromUserName()); renderOutTextMsg("语音识别结果: " + inSpeechRecognitionResults.getRecognition()); } /** * 处理接收到的模板消息是否送达成功通知事件 */ @Override protected void processInTemplateMsgEvent(InTemplateMsgEvent inTemplateMsgEvent) { String status = inTemplateMsgEvent.getStatus(); renderOutTextMsg("模板消息是否接收成功:" + status); } /** * 处理微信摇一摇事件 */ @Override protected void processInShakearoundUserShakeEvent(InShakearoundUserShakeEvent inShakearoundUserShakeEvent) { logger.debug("摇一摇周边设备信息通知事件:" + inShakearoundUserShakeEvent.getFromUserName()); renderOutTextMsg("摇一摇周边设备信息通知事件UUID:" + inShakearoundUserShakeEvent.getUuid()); } /** * 资质认证成功 || 名称认证成功 || 年审通知 || 认证过期失效通知 */ @Override protected void processInVerifySuccessEvent(InVerifySuccessEvent inVerifySuccessEvent) { logger.debug("资质认证成功通知事件:" + inVerifySuccessEvent.getFromUserName()); renderOutTextMsg("资质认证成功通知事件:" + inVerifySuccessEvent.getExpiredTime()); } /** * 资质认证失败 || 名称认证失败 */ @Override protected void processInVerifyFailEvent(InVerifyFailEvent inVerifyFailEvent) { logger.debug("资质认证失败通知事件:" + inVerifyFailEvent.getFromUserName()); renderOutTextMsg("资质认证失败通知事件:" + inVerifyFailEvent.getFailReason()); } /** * 门店在审核事件消息 */ @Override protected void processInPoiCheckNotifyEvent(InPoiCheckNotifyEvent inPoiCheckNotifyEvent) { logger.debug("processInPoiCheckNotifyEvent()"); renderOutTextMsg("processInPoiCheckNotifyEvent()"); } @Override protected void processInWifiEvent(InWifiEvent var1) { logger.debug("processInWifiEvent()"); renderOutTextMsg("processInWifiEvent()"); } @Override protected void processInUserCardEvent(InUserCardEvent var1) { logger.debug("processInUserCardEvent()"); renderOutTextMsg("processInUserCardEvent()"); } @Override protected void processInUpdateMemberCardEvent(InUpdateMemberCardEvent var1) { logger.debug("processInUpdateMemberCardEvent()"); renderOutTextMsg("processInUpdateMemberCardEvent()"); } @Override protected void processInUserPayFromCardEvent(InUserPayFromCardEvent var1) { logger.debug("processInUserPayFromCardEvent()"); renderOutTextMsg("processInUserPayFromCardEvent()"); } @Override protected void processInMerChantOrderEvent(InMerChantOrderEvent var1) { logger.debug("processInMerChantOrderEvent()"); renderOutTextMsg("processInMerChantOrderEvent()"); } @Override protected void processIsNotDefinedEvent(InNotDefinedEvent var1) { logger.debug("processIsNotDefinedEvent()"); renderOutTextMsg("processIsNotDefinedEvent()"); } @Override protected void processIsNotDefinedMsg(InNotDefinedMsg var1) { logger.debug("processIsNotDefinedMsg()"); renderOutTextMsg("processIsNotDefinedMsg()"); } @Override protected void processInUserGiftingCardEvent(InUserGiftingCardEvent var1) { logger.debug("processInUserGiftingCardEvent()"); renderOutTextMsg("processInUserGiftingCardEvent()"); } @Override protected void processInUserGetCardEvent(InUserGetCardEvent var1) { logger.debug("processInUserGetCardEvent()"); renderOutTextMsg("processInUserGetCardEvent()"); } @Override protected void processInUserConsumeCardEvent(InUserConsumeCardEvent var1) { logger.debug("processInUserConsumeCardEvent()"); renderOutTextMsg("processInUserConsumeCardEvent()"); } @Override protected void processInCardSkuRemindEvent(InCardSkuRemindEvent var1) { logger.debug("processInCardSkuRemindEvent()"); renderOutTextMsg("processInCardSkuRemindEvent()"); } @Override protected void processInCardPayOrderEvent(InCardPayOrderEvent var1) { logger.debug("processInCardPayOrderEvent()"); renderOutTextMsg("processInCardPayOrderEvent()"); } @Override protected void processInCardPassCheckEvent(InCardPassCheckEvent var1) { logger.debug("processInCardPassCheckEvent()"); renderOutTextMsg("processInCardPassCheckEvent()"); } private void iceProcessInFollowEvent(String openid, boolean isSubscribe) { // 取消关注 if (!isSubscribe){ thirdUserWechatService.modifyUserWechatDeletec(openid, true); renderOutTextMsg("欢迎下次再使用 :)"); return; } // 关注 thirdUserWechatService.modifyUserWechatDeletec(openid, false); // 获取用户是否已经绑定(存在于third_user_wechat表中) ThirdUserWechat thirdUserWechat = thirdUserWechatService.queryUserWechatByOpenid(openid); if (thirdUserWechat == null) { // 未绑定 String url = createBindURL(); renderOutTextMsg("欢迎使用\n你未绑定账号,请点击“绑定账号”"); } else { // 已绑定 renderOutTextMsg("欢迎使用 :)"); } } private String createBindURL() { String url = CharUtil.encode(WeChatConfig.weChatConfig.getHost() + UrlConstants.INFO_BING); System.out.println(CharUtil.decode(url)); return SnsAccessTokenApi.getAuthorizeURL(getAppId(), url, getAppId(), false); } private boolean checkUserCell(String appId, String openid){ boolean result=false; String communityId=""; // 查询用户 APIResponse userResponse = apiService.findUserByAppidAndOpenid(appId, openid,apiService); if (userResponse.isFail()) { return result; } JSONObject userData = JSONObject.parseObject(userResponse.getData()); String selCell =userData!=null? userData.getString("selCell"):""; //当前没有选择房产 if(StrKit.isBlank(selCell)){ return result; }else{ APIResponse configResponse = apiService.queryCommunityConfigByCellId(selCell); if (configResponse.isFail()) { return result; }else{ JSONObject communityData = JSONObject.parseObject(configResponse.getData()); communityId=communityData!=null?communityData.getString("id"):""; } } if(communityId!=""){ String adminCommunityIds=redisTemplate.opsForValue().get("adminCommunityIds"); if(StringUtil.notEmpty(adminCommunityIds)){ String[] communityIds=adminCommunityIds.split(","); for(String cid:communityIds){ if(communityId.equals(cid)){ result=true; break; } } } } return result; } }