12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- # -*- coding: utf-8 -*-
- # !/usr/bin/env python
- import logging
- import simplejson as json
- from django.conf import settings
- from apilib.utils_json import JsonResponse
- from apps.web.agent.models import Agent
- from apps.web.constant import APP_TYPE, AppPlatformType
- from apps.web.core.models import BoundOpenInfo
- from apps.web.helpers import get_wechat_auth_bridge
- from apps.web.user.models import MyUser
- from apps.web.utils import get_client_ip
- from library.wechatpy.utils import WXBizDataCrypt
- from middlewares.django_jwt_session_auth import jwt_login
- logger = logging.getLogger(__name__)
- def login(request):
- try:
- ip = get_client_ip(request)
- logger.debug("user<ip={}> login. ".format(ip))
- payload = json.loads(request.body)
- code = payload.get('code')
- app_id = payload.get('appId', None)
- agent = Agent.objects().filter(wechatMiniApp__appid = app_id, customizedWechatMiniAllowable = True).first()
- auth_bridge = get_wechat_auth_bridge(agent, APP_TYPE.WECHAT_MINI_AUTH)
- session_info = auth_bridge.jscode2session(js_code = code)
- encrypted_data = payload.get('encryptedData', None)
- iv = payload.get('iv', None)
- if not encrypted_data:
- openId = session_info['openid']
- payload = {
- 'authAppId': app_id,
- 'managerialAppId': auth_bridge.appid,
- 'managerialOpenId': openId,
- 'payOpenId': openId,
- 'agentId': str(agent.id),
- 'productAgentId': str(agent.id)
- }
- user = MyUser.get_or_create(app_platform_type = AppPlatformType.WECHAT_MINI,
- open_id = openId, **payload)
- else:
- session_key = session_info.get('session_key')
- crypt = WXBizDataCrypt(app_id, session_key)
- user_info = crypt.decrypt(encrypted_data, iv)
- openId = session_info['openid']
- payload = {
- 'sex': int(user_info['gender']),
- 'city': user_info['city'],
- 'province': user_info['province'],
- 'country': user_info['country'],
- 'avatar': user_info['avatarUrl'],
- 'nickname': user_info['nickName'],
- 'authAppId': app_id,
- 'managerialAppId': auth_bridge.appid,
- 'managerialOpenId': openId,
- 'payOpenId': openId,
- 'agentId': str(agent.id),
- 'productAgentId': str(agent.id)
- }
- user = MyUser.get_or_create(app_platform_type = AppPlatformType.WECHAT_MINI,
- open_id = openId, **payload)
- token = jwt_login(settings.SERVICE_DOMAIN.MINI_WECHAT, user, request, 3600 * 7)
- logger.debug('{} to login in wechat mini with token<{}>.'.format(repr(user), token))
- return JsonResponse({'result': 1, 'description': '', 'payload': {'token': token}})
- except Exception, e:
- logger.error(e)
- return JsonResponse({'result': 0, 'description': u'登录失败', 'payload': {}})
|