# -*- 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 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': {}})