views.py 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import logging
  4. import simplejson as json
  5. from django.conf import settings
  6. from apilib.utils_json import JsonResponse
  7. from apps.web.agent.models import Agent
  8. from apps.web.constant import APP_TYPE, AppPlatformType
  9. from apps.web.core.models import BoundOpenInfo
  10. from apps.web.helpers import get_wechat_auth_bridge
  11. from apps.web.user.models import MyUser
  12. from apps.web.utils import get_client_ip
  13. from library.wechatpy.utils import WXBizDataCrypt
  14. from middlewares.django_jwt_session_auth import jwt_login
  15. logger = logging.getLogger(__name__)
  16. def login(request):
  17. try:
  18. ip = get_client_ip(request)
  19. logger.debug("user<ip={}> login. ".format(ip))
  20. payload = json.loads(request.body)
  21. code = payload.get('code')
  22. app_id = payload.get('appId', None)
  23. agent = Agent.objects().filter(wechatMiniApp__appid = app_id, customizedWechatMiniAllowable = True).first()
  24. auth_bridge = get_wechat_auth_bridge(agent, APP_TYPE.WECHAT_MINI_AUTH)
  25. session_info = auth_bridge.jscode2session(js_code = code)
  26. encrypted_data = payload.get('encryptedData', None)
  27. iv = payload.get('iv', None)
  28. if not encrypted_data:
  29. openId = session_info['openid']
  30. payload = {
  31. 'authAppId': app_id,
  32. 'managerialAppId': auth_bridge.appid,
  33. 'managerialOpenId': openId,
  34. 'payOpenId': openId,
  35. 'agentId': str(agent.id),
  36. 'productAgentId': str(agent.id)
  37. }
  38. user = MyUser.get_or_create(app_platform_type = AppPlatformType.WECHAT_MINI,
  39. open_id = openId, **payload)
  40. else:
  41. session_key = session_info.get('session_key')
  42. crypt = WXBizDataCrypt(app_id, session_key)
  43. user_info = crypt.decrypt(encrypted_data, iv)
  44. openId = session_info['openid']
  45. payload = {
  46. 'sex': int(user_info['gender']),
  47. 'city': user_info['city'],
  48. 'province': user_info['province'],
  49. 'country': user_info['country'],
  50. 'avatar': user_info['avatarUrl'],
  51. 'nickname': user_info['nickName'],
  52. 'authAppId': app_id,
  53. 'managerialAppId': auth_bridge.appid,
  54. 'managerialOpenId': openId,
  55. 'payOpenId': openId,
  56. 'agentId': str(agent.id),
  57. 'productAgentId': str(agent.id)
  58. }
  59. user = MyUser.get_or_create(app_platform_type = AppPlatformType.WECHAT_MINI,
  60. open_id = openId, **payload)
  61. token = jwt_login(settings.SERVICE_DOMAIN.MINI_WECHAT, user, request, 3600 * 7)
  62. logger.debug('{} to login in wechat mini with token<{}>.'.format(repr(user), token))
  63. return JsonResponse({'result': 1, 'description': '', 'payload': {'token': token}})
  64. except Exception, e:
  65. logger.error(e)
  66. return JsonResponse({'result': 0, 'description': u'登录失败', 'payload': {}})