拍爱

views.py 2.4KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. # -*- coding: utf-8 -*-
  2. import time
  3. import urllib
  4. import requests
  5. import shortuuid
  6. from django.conf import settings
  7. from django.shortcuts import redirect
  8. from furl import furl
  9. from json_response import auto_response
  10. from wechatpy import WeChatClient
  11. r = settings.REDIS_CACHE
  12. WECHAT = settings.WECHAT
  13. JSAPI = WECHAT.get('JSAPI', {})
  14. def wx_oauth2(request):
  15. scope = request.GET.get('scope', 'snsapi_userinfo')
  16. redirect_url = request.GET.get('redirect_url', '')
  17. default_url = request.GET.get('default_url', '')
  18. redirect_uri = settings.WECHAT_USERINFO_REDIRECT_URI if scope == 'snsapi_userinfo' else settings.WECHAT_BASE_REDIRECT_URI
  19. if request.weixin:
  20. return redirect(settings.WECHAT_OAUTH2_AUTHORIZE.format(
  21. appid=JSAPI['appID'],
  22. redirect_uri=urllib.quote_plus(redirect_uri),
  23. scope=scope,
  24. state=urllib.quote_plus(redirect_url)
  25. ))
  26. return redirect(default_url or redirect_url)
  27. def base_redirect(request):
  28. code = request.GET.get('code', '')
  29. state = request.GET.get('state', '')
  30. access_info = requests.get(settings.WECHAT_OAUTH2_ACCESS_TOKEN.format(
  31. appid=JSAPI['appID'],
  32. secret=JSAPI['appsecret'],
  33. code=code
  34. ), verify=False).json()
  35. return redirect(furl(state).add(access_info).url)
  36. def userinfo_redirect(request):
  37. code = request.GET.get('code', '')
  38. state = request.GET.get('state', '')
  39. access_info = requests.get(settings.WECHAT_OAUTH2_ACCESS_TOKEN.format(
  40. appid=JSAPI['appID'],
  41. secret=JSAPI['appsecret'],
  42. code=code
  43. ), verify=False).json()
  44. openid, access_token = access_info.get('openid', ''), access_info.get('access_token', '')
  45. res = requests.get(settings.WECHAT_OAUTH2_USERINFO.format(
  46. access_token=access_token,
  47. openid=openid
  48. ), verify=False)
  49. res.encoding = 'utf-8'
  50. userinfo = res.json()
  51. return redirect(furl(state).add(userinfo).url)
  52. @auto_response
  53. def wx_jsapi_signature_api(request):
  54. url = request.GET.get('url', '')
  55. nonceStr, timestamp = shortuuid.uuid(), int(time.time())
  56. client = WeChatClient(JSAPI['appID'], JSAPI['appsecret'])
  57. ticket = client.jsapi.get_jsapi_ticket()
  58. signature = client.jsapi.get_jsapi_signature(nonceStr, ticket, timestamp, url)
  59. return {
  60. 'appId': JSAPI['appID'],
  61. 'nonceStr': nonceStr,
  62. 'timestamp': timestamp,
  63. 'signature': signature,
  64. }