暂无描述

membercard.py 3.3KB

    # -*- coding: utf-8 -*- import json import logging import requests from django.conf import settings from django.db import transaction from django.db.models import Q from django_six import CompatibilityBaseCommand, close_old_connections from pywe_membercard import get_userinfo from pywe_storage import RedisStorage from account.models import UserInfo from mch.models import ConsumeInfoSubmitLogInfo from utils.redis.connect import r from utils.redis.rkeys import MEMBERCARD_USERINFO_LIST WECHAT = settings.WECHAT logger = logging.getLogger('console') def get_phone(fields): for field in fields: name = field.get('name', '') if name == 'USER_FORM_INFO_FLAG_MOBILE': return field.get('value', '') return '' class Command(CompatibilityBaseCommand): def handle(self, *args, **options): logger.info('MemberCard userinfo is dealing') while True: # r.rpushjson('MEMBERCARD_USERINFO_LIST', { # 'brand_id': 'brand_id', # 'card_id': 'card_id', # 'code': 'code', # }) k, v = r.blpopjson(MEMBERCARD_USERINFO_LIST, 60) if not v: continue logger.info(v) brand_id, card_id, code = v.get('brand_id', ''), v.get('card_id', ''), v.get('code', '') if not (card_id and code): continue # wxcfg = WECHAT.get('{}:JSAPI'.format(brand_id), {}) wxcfg = WECHAT.get('JSAPI', {}) appid = wxcfg.get('appID') secret = wxcfg.get('appsecret') userinfo = get_userinfo(card_id, code, appid=appid, secret=secret, storage=RedisStorage(r)) logger.info(userinfo) userinfo = userinfo.get('user_info', {}) if not userinfo: continue common_field_list = userinfo.get('common_field_list', []) phone = get_phone(common_field_list) if not phone: continue close_old_connections() with transaction.atomic(): try: userinfo = UserInfo.objects.get(membercardid=card_id, memberusercardcode=code) userinfo.phone = phone userinfo.save() except Exception as e: logger.info(e.message) continue logs = ConsumeInfoSubmitLogInfo.objects.filter(Q(status=True) & Q(user_id=userinfo.user_id) & (Q(phone=None) | Q(phone=''))) for log in logs: log.phone = userinfo.phone log.save() try: phoneinfo = requests.get(settings.PHONE_2_ADMINISTRATIVE_DIVISION.format(phone)) except Exception as e: logger.info(e.message) continue try: province_name = json.loads(phoneinfo.content.split('(')[-1][:-1])['data']['area'] except Exception as e: logger.info(e.message) continue logs = ConsumeInfoSubmitLogInfo.objects.filter(user_id=userinfo.user_id, status=True) for log in logs: log.province = province_name if log.lat == 0.0 and log.lon == 0.0 else log.province log.save() close_old_connections()