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