package com.rnt.commo.interceptor; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import com.alibaba.fastjson.JSONObject; import com.jfinal.aop.Interceptor; import com.jfinal.aop.Invocation; import com.jfinal.core.Controller; import com.jfinal.kit.PropKit; import com.jfinal.log.Log; import com.jfinal.weixin.sdk.api.ApiConfigKit; import com.jfinal.weixin.sdk.api.SnsAccessToken; import com.jfinal.weixin.sdk.api.SnsAccessTokenApi; import com.rnt.commo.enums.ErrorType; import com.rnt.model.common.WXUser; import com.rnt.model.zf.CustBinding; import com.rnt.service.UserService; import com.rnt.utils.TLWXUser; import com.rnt.vo.BizResult; import org.beetl.sql.core.kit.StringKit; /** * Copyright: Copyright (c) 2017 zteits * * @ClassName: com.rnt.commo.interceptor * @Description: 判断用户是否已经绑定微信 * @version: v1.0.0 * @author: atao * @date: 2017/6/8 下午4:45 * Modification History: * Date Author Version Description * ---------------------------------------------------------* * 2017/6/8 atao v1.0.0 创建 */ public class BindInterceptor implements Interceptor { private static final Log logger = Log.getLog(BindInterceptor.class); @Override public void intercept(Invocation inv) { logger.info("=====用户绑定业务拦截== start ==="); Controller controller = inv.getController(); HttpServletRequest request = controller.getRequest(); String queryString = request.getQueryString(); String reqUrl = request.getRequestURL().toString(); if(StringKit.isNotBlank(queryString)){ reqUrl = reqUrl+"?"+queryString; }else{ reqUrl = reqUrl+"?1=1"; } logger.info("BindInterceptor 拦截的请求参数为: queryString=" + queryString); logger.info("BindInterceptor 拦截的请求URL为: reqUrl=" + reqUrl); //logger.info("BindInterceptor 根据HttpServletRequest 获取到的header 为:" + getHeadersInfo(request).toString()); Boolean isAjax = false; String header = request.getHeader("X-Requested-With"); //判断是否是ajax请求 isAjax = "XMLHttpRequest".equalsIgnoreCase(header); logger.info("BindInterceptor 是否为ajax请求 isAjax=" + isAjax); String openId = controller.getPara("openId"); logger.info("BindInterceptor 获取到的openId为: openId=" + openId); String code = controller.getPara("code"); logger.info("BindInterceptor 获取到的code为: code=" + code); /** 用户跳转到绑定界面的URL*/ String userBindUrl = PropKit.get("app.host") + "/binding/bindingView?target="; if (StringKit.isNotBlank(openId)) { /**1、openId 不为空*/ logger.info("BindInterceptor 1、openId不为空"); //查询绑定信息 CustBinding custBinding = new UserService().queryBindInfoByOpenId(openId); //如果没有绑定 或者 custId 为空 if (null == custBinding || StringKit.isBlank(custBinding.getCustId())) { logger.info("BindInterceptor 未查询到绑定信息"); if (isAjax) { controller.renderJson(getBizResult( userBindUrl+getTargetUrl(reqUrl,openId))); return; } else { //跳转到绑定界面 //redirectUrl = SnsAccessTokenApi.getAuthorizeURL(ApiConfigKit.getAppId(), redirectUrl, true); controller.redirect(userBindUrl+getTargetUrl(reqUrl,openId)); return; } } else { setWXser(custBinding); } } else if (StringKit.isBlank(openId) && StringKit.isNotBlank(code)) { /**2、openId 为空,code 不为空*/ logger.info("BindInterceptor 2、openId 为空,code 不为空"); SnsAccessToken snsAccessToken = SnsAccessTokenApi.getSnsAccessToken(ApiConfigKit.getAppId(), ApiConfigKit.getApiConfig().getAppSecret(), code); if (!snsAccessToken.isAvailable()) { throw new RuntimeException( "通过code获取网页SnsAccessToken失败,errcode=" + snsAccessToken.getErrorCode() + "errMsg=" + snsAccessToken .getErrorMsg()); } openId = snsAccessToken.getOpenid(); //查询绑定信息 CustBinding custBinding = new UserService().queryBindInfoByOpenId(openId); //如果没有绑定 或者 custId 为空 if (null == custBinding || StringKit.isBlank(custBinding.getCustId())) { logger.info("BindInterceptor 未查询到绑定信息"); if (isAjax) { controller.renderJson(getBizResult(userBindUrl+getTargetUrl(reqUrl,openId))); return; } else { //跳转到绑定界面 controller.redirect(userBindUrl+getTargetUrl(reqUrl,openId)); return; } } else { setWXser(custBinding); } } else { /** 3、openId code 均为空*/ logger.info("BindInterceptor 3、openId code 均为空"); String redirectUrl = SnsAccessTokenApi.getAuthorizeURL(ApiConfigKit.getAppId(), reqUrl, true); if (isAjax) { controller.renderJson(getBizResult(redirectUrl)); return; } else { controller.redirect(redirectUrl); return; } } logger.info("=====用户绑定业务拦截== end ==="); inv.invoke(); } private String getTargetUrl(String reqUrl ,String openId){ reqUrl = reqUrl+"&openId="+openId; try { reqUrl = URLEncoder.encode(reqUrl,"utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); throw new RuntimeException("用户绑定界面对请求的URL进行URL编码捕获异常",e); } //一定要在放一次本次跳转请求的openId ,此代码是必须的,不能删除 reqUrl = reqUrl+"&openId="+openId; return reqUrl; } private Map getHeadersInfo(HttpServletRequest request) { Map map = new HashMap(); Enumeration headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) { String key = (String)headerNames.nextElement(); String value = request.getHeader(key); map.put(key, value); } return map; } private void setWXser(CustBinding custBinding) { logger.info("BindInterceptor 设置微信用户信息"); WXUser wxUser = new WXUser(); wxUser.setCustId(custBinding.getCustId()); wxUser.setOpenId(custBinding.getBindingId()); logger.info("BindInterceptor 设置微信用户信息 wxUser=" + JSONObject.toJSONString(wxUser)); TLWXUser.setWXUser(wxUser); } private BizResult getBizResult(String data) { //ajax业务返回数据 BizResult ajaxResult = new BizResult<>(); ajaxResult.setData(data); ajaxResult.setCode(ErrorType.WX_NO_BIND.getCode()); ajaxResult.setCode(ErrorType.WX_NO_BIND.getMsg()); logger.info("BindInterceptor ajax返回的数据为: ajaxResult="+ JSONObject.toJSONString(ajaxResult)); return ajaxResult; } }