拍爱

views.py 2.2KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. # -*- coding: utf-8 -*-
  2. import time
  3. import shortuuid
  4. from django.conf import settings
  5. from django.shortcuts import redirect
  6. from furl import furl
  7. from json_response import auto_response
  8. from pywe_oauth import get_access_info, get_oauth_code_url, get_userinfo
  9. from wechatpy import WeChatClient
  10. JSAPI = settings.WECHAT.get('JSAPI', {})
  11. def wx_oauth2(request):
  12. scope = request.GET.get('scope', 'snsapi_userinfo')
  13. redirect_url = request.GET.get('redirect_url', '')
  14. default_url = request.GET.get('default_url', '')
  15. if request.weixin:
  16. redirect_uri = settings.WECHAT_USERINFO_REDIRECT_URI if scope == 'snsapi_userinfo' else settings.WECHAT_BASE_REDIRECT_URI
  17. return redirect(get_oauth_code_url(JSAPI['appID'], redirect_uri, scope, redirect_url))
  18. return redirect(default_url or redirect_url)
  19. def base_redirect(request):
  20. code = request.GET.get('code', '')
  21. state = request.GET.get('state', '')
  22. access_info = get_access_info(JSAPI['appID'], JSAPI['appsecret'], code)
  23. if 'errcode' in access_info:
  24. return redirect(settings.WECHAT_OAUTH2_RETRY_REDIRECT_URI.format(state))
  25. return redirect(furl(state).add(access_info).url)
  26. def userinfo_redirect(request):
  27. code = request.GET.get('code', '')
  28. state = request.GET.get('state', '')
  29. access_info = get_access_info(JSAPI['appID'], JSAPI['appsecret'], code)
  30. if 'errcode' in access_info:
  31. return redirect(settings.WECHAT_OAUTH2_RETRY_REDIRECT_URI.format(state))
  32. userinfo = get_userinfo(access_info.get('access_token', ''), access_info.get('openid', ''))
  33. if 'openid' not in userinfo:
  34. return redirect(settings.WECHAT_OAUTH2_RETRY_REDIRECT_URI.format(state))
  35. return redirect(furl(state).add(userinfo).url)
  36. @auto_response
  37. def wx_jsapi_signature_api(request):
  38. url = request.GET.get('url', '')
  39. nonceStr, timestamp = shortuuid.uuid(), int(time.time())
  40. client = WeChatClient(JSAPI['appID'], JSAPI['appsecret'])
  41. ticket = client.jsapi.get_jsapi_ticket()
  42. signature = client.jsapi.get_jsapi_signature(nonceStr, ticket, timestamp, url)
  43. return {
  44. 'appId': JSAPI['appID'],
  45. 'nonceStr': nonceStr,
  46. 'timestamp': timestamp,
  47. 'signature': signature,
  48. }