fix bug: errcode=48001 when scope=snsapi_base

Brightcells 8 lat temu
rodzic
commit
05e046c8ca
3 zmienionych plików z 29 dodań i 9 usunięć
  1. 3 2
      api/urls.py
  2. 2 1
      pai2/settings.py
  3. 24 6
      wechat/views.py

+ 3 - 2
api/urls.py

@@ -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
 # 微信分享相关

+ 2 - 1
pai2/settings.py

@@ -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'

+ 24 - 6
wechat/views.py

@@ -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