BindInterceptor.java
7.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
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;
}
}