BindInterceptor.java 7.58 KB
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<String, String> getHeadersInfo(HttpServletRequest request) {
        Map<String, String> map = new HashMap<String, String>();
        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<String> getBizResult(String data) {
        //ajax业务返回数据
        BizResult<String> 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;
    }
}