@@ -110,8 +110,9 @@ urlpatterns += [ |
||
110 | 110 |
|
111 | 111 |
# 微信授权相关 |
112 | 112 |
urlpatterns += [ |
113 |
- url(r'^get_openid$', wechat_views.get_openid, name='get_openid'), |
|
114 |
- url(r'^to_redirect$', wechat_views.to_redirect, name='to_redirect'), |
|
113 |
+ url(r'^wx_oauth2$', wechat_views.wx_oauth2, name='wx_oauth2'), |
|
114 |
+ url(r'^base_redirect$', wechat_views.base_redirect, name='base_redirect'), |
|
115 |
+ url(r'^userinfo_redirect$', wechat_views.userinfo_redirect, name='userinfo_redirect'), |
|
115 | 116 |
] |
116 | 117 |
|
117 | 118 |
# 微信分享相关 |
@@ -273,7 +273,8 @@ WECHAT = { |
||
273 | 273 |
}, |
274 | 274 |
} |
275 | 275 |
|
276 |
-WECHAT_REDIRECT_URI = 'http://api.pai.ai/to_redirect' |
|
276 |
+WECHAT_BASE_REDIRECT_URI = 'http://api.pai.ai/base_redirect' |
|
277 |
+WECHAT_USERINFO_REDIRECT_URI = 'http://api.pai.ai/userinfo_redirect' |
|
277 | 278 |
|
278 | 279 |
WECHAT_OAUTH2_AUTHORIZE = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid={appid}&redirect_uri={redirect_uri}&response_type=code&scope={scope}&state={state}#wechat_redirect' |
279 | 280 |
WECHAT_OAUTH2_ACCESS_TOKEN = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid={appid}&secret={secret}&code={code}&grant_type=authorization_code' |
@@ -17,23 +17,38 @@ WECHAT = settings.WECHAT |
||
17 | 17 |
JSAPI = WECHAT.get('JSAPI', {}) |
18 | 18 |
|
19 | 19 |
|
20 |
-def get_openid(request): |
|
20 |
+def wx_oauth2(request): |
|
21 | 21 |
scope = request.GET.get('scope', 'snsapi_userinfo') |
22 | 22 |
redirect_url = request.GET.get('redirect_url', '') |
23 | 23 |
default_url = request.GET.get('default_url', '') |
24 | 24 |
|
25 |
+ redirect_uri = settings.WECHAT_USERINFO_REDIRECT_URI if scope == 'snsapi_userinfo' else settings.WECHAT_BASE_REDIRECT_URI |
|
26 |
+ |
|
25 | 27 |
if request.weixin: |
26 | 28 |
return redirect(settings.WECHAT_OAUTH2_AUTHORIZE.format( |
27 | 29 |
appid=JSAPI['appID'], |
28 |
- redirect_uri=urllib.quote_plus(settings.WECHAT_REDIRECT_URI), |
|
30 |
+ redirect_uri=urllib.quote_plus(redirect_uri), |
|
29 | 31 |
scope=scope, |
30 | 32 |
state=urllib.quote_plus(redirect_url) |
31 | 33 |
)) |
32 | 34 |
|
33 |
- return redirect(default_url if default_url else redirect_url) |
|
35 |
+ return redirect(default_url or redirect_url) |
|
36 |
+ |
|
37 |
+ |
|
38 |
+def base_redirect(request): |
|
39 |
+ code = request.GET.get('code', '') |
|
40 |
+ state = request.GET.get('state', '') |
|
41 |
+ |
|
42 |
+ access_info = requests.get(settings.WECHAT_OAUTH2_ACCESS_TOKEN.format( |
|
43 |
+ appid=JSAPI['appID'], |
|
44 |
+ secret=JSAPI['appsecret'], |
|
45 |
+ code=code |
|
46 |
+ ), verify=False).json() |
|
47 |
+ |
|
48 |
+ return redirect(furl(state).add(access_info).url) |
|
34 | 49 |
|
35 | 50 |
|
36 |
-def to_redirect(request): |
|
51 |
+def userinfo_redirect(request): |
|
37 | 52 |
code = request.GET.get('code', '') |
38 | 53 |
state = request.GET.get('state', '') |
39 | 54 |
|
@@ -42,9 +57,12 @@ def to_redirect(request): |
||
42 | 57 |
secret=JSAPI['appsecret'], |
43 | 58 |
code=code |
44 | 59 |
), verify=False).json() |
45 |
- unionid, openid, access_token = access_info.get('unionid', ''), access_info.get('openid', ''), access_info.get('access_token', '') |
|
60 |
+ openid, access_token = access_info.get('openid', ''), access_info.get('access_token', '') |
|
46 | 61 |
|
47 |
- res = requests.get(settings.WECHAT_OAUTH2_USERINFO.format(access_token=access_token, openid=openid), verify=False) |
|
62 |
+ res = requests.get(settings.WECHAT_OAUTH2_USERINFO.format( |
|
63 |
+ access_token=access_token, |
|
64 |
+ openid=openid |
|
65 |
+ ), verify=False) |
|
48 | 66 |
res.encoding = 'utf-8' |
49 | 67 |
userinfo = res.json() |
50 | 68 |
|