|  | # -*- coding: utf-8 -*-
from curtail_uuid import CurtailUUID
from django.conf import settings
from django.db import transaction
from ipaddr import client_ip
from logit import logit
from pywe_miniapp import get_userinfo
from TimeConvert import TimeConvert as tc
from account.models import UserInfo
from utils.error.response_utils import response
from utils.redis.rprofile import set_profile_info
WECHAT = settings.WECHAT
@logit
@transaction.atomic
def get_userinfo_api(request):
    wechat = WECHAT.get('MINIAPP', {})
    appid = wechat.get('appID')
    secret = wechat.get('appsecret')
    code = request.POST.get('code', '')
    encryptedData = request.POST.get('encryptedData', '')
    iv = request.POST.get('iv', '')
    userinfo = get_userinfo(appid=appid, secret=secret, code=code, encryptedData=encryptedData, iv=iv)
    try:
        user = UserInfo.objects.select_for_update().get(unionid=userinfo.get('unionId', ''))
    except UserInfo.DoesNotExist:
        user = None
    if not user:
        # {u'avatarUrl': u'http://wx.qlogo.cn/mmopen/vi_32/aSKcBBPpibyKNicHNTMM0qJVh8Kjgiak2AHWr8MHM4WgMEm7GFhsf8OYrySdbvAMvTsw3mo8ibKicsnfN5pRjl1p8HQ/0',
        #  u'city': u'Guangzhou',
        #  u'country': u'CN',
        #  u'gender': 1,
        #  u'language': u'zh_CN',
        #  u'nickName': u'Band',
        #  u'openId': u'oGZUI0egBJY1zhBYw2KhdUfwVJJE',
        #  u'province': u'Guangdong',
        #  u'unionId': u'ocMvos6NjeKLIBqg5Mr9QjxrP1FA',
        #  u'watermark': {u'appid': u'wx4f4bc4dec97d474b', u'timestamp': 1477314187}}
        user = UserInfo.objects.create(
            user_id=CurtailUUID.uuid(UserInfo, 'user_id'),
            user_from=UserInfo.WX_USER,
            openid=userinfo.get('openId', ''),
            unionid=userinfo.get('unionId', ''),
            sex=userinfo.get('gender', 0),
            nickname=userinfo.get('nickName', ''),
            avatar=userinfo.get('avatarUrl', ''),
            country=userinfo.get('country', ''),
            province=userinfo.get('province', ''),
            city=userinfo.get('city', ''),
            user_status=UserInfo.ACTIVATED,
            signup_ip=client_ip(request),
            signup_at=tc.utc_datetime(),
        )
        set_profile_info(user)
    return response(200, 'Mini App Login Success', u'微信小程序登录成功', user.data)
 |