Exemple #1
0
def migu_register():
    """用户注册(GET|POST)

    :uri: /migu/register_phone
    :param phone: 手机号
    :param password: 密码
    :param code: 验证码
    :param sessionid: 短信sessionid
    :returns: {'user': object, 'ut': string}
    """
    params = request.values.to_dict()
    phone = params.get('phone', None)
    code = params.get('code', None)
    sessionid = params.get('sessionid', None)
    password = params.get('password', None)
    if not phone or not code or not password or not sessionid:
        return error.InvalidArguments

    invalid_error = User.invalid_password(password)
    if invalid_error:
        return invalid_error

    # 用户中心注册
    ret = Migu.center_register(phone, password, const.CENTER_ACCOUNT_PHONE,
                               code, sessionid)
    if isinstance(ret, error.ApiError):
        return ret

    # 进行用户绑定
    migu_uid = Migu.get_identityid(phone, password, const.CENTER_ACCOUNT_PHONE)
    if isinstance(migu_uid, error.ApiError):
        return migu_uid

    user = User.get_platform_user('migu', migu_uid)
    if not user:
        user = User.get_by_phone(phone)
        if user:
            info = dict(partner_migu={'id': migu_uid},
                        nickname=u'咪咕用户%s%s' %
                        (migu_uid[-4:], random.randint(1000, 9999)),
                        gender=random.randint(1, 2),
                        name='$mg$%s%s' %
                        (migu_uid[-4:], random.randint(1000, 9999)))
            user = user.update_model({'$set': info})
        else:
            info = dict(phone=phone,
                        nickname=u'咪咕用户%s%s' %
                        (migu_uid[-4:], random.randint(1000, 9999)),
                        gender=random.randint(1, 2),
                        name='$mg$%s%s' %
                        (migu_uid[-4:], random.randint(1000, 9999)))
            user = User.create_platform_user('migu', migu_uid, data=info)
    else:
        # 如果用户没有绑定手机并且手机号没有被绑定, 则自动进行手机号绑定
        if not user.phone and not User.get_by_phone(phone):
            info = dict(phone=phone)
            user.update_model({'$set': info})

    ut = User.gen_token(str(user._id))
    return {'user': user.format(), 'ut': ut}
Exemple #2
0
def reset_password():
    """重置密码 (GET|POST)

    :uri: /users/reset_password
    :param phone: 手机号
    :param password: 密码
    :param code: 短信验证码
    :returns: {}
    """
    params = request.values
    phone = params.get('phone', None)
    code = params.get('code', None)
    password = params.get("password", None)
    if not phone or not code or not password:
        return error.InvalidArguments

    invalid_error = User.invalid_password(password)
    if invalid_error:
        return invalid_error

    user = User.get_by_phone(phone)
    if not user:
        return error.UserNotExist

    if not SMS.verify_code(phone, code):
        return error.VerifyCodeFailed

    User.change_pwd(user, password)
    return {}
Exemple #3
0
    def validate(self):
        if not form.Form.validate(self):
            return False

        if not self.user.data and not self.phone.data:
            self.phone.errors.append(u'用户和手机号必须要填一个')

        user1 = User.get_one(self.user.data) if self.user.data else None
        user2 = User.get_by_phone(self.phone.data) if self.phone.data else None
        if self.user.data and not user1:
            self.user.errors.append(u'用户不存在')
            return False

        if self.phone.data and not user2:
            self.phone.errors.append(u'用户不存在')
            return False

        if self.phone.data and self.user.data:
            if user1 != user2:
                self.user.errors.append(u'用户字段和手机号字段对应的用户不匹配')
                self.phone.errors.append(u'用户字段和手机号字段对应的用户不匹配')
                return False

        user = user1 or user2
        if UserGroup.user_in_group(str(self.group.data), str(user._id)):
            if user1:
                self.user.errors.append(u'该组已包含此用户')
            if user2:
                self.phone.errors.append(u'该组已包含此用户')
            return False

        return True
Exemple #4
0
    def process_form_data(self, data):
        if data['phone'] and not data['user']:
            user = User.get_by_phone(data['phone'])
            data['user'] = user._id
        if data['user'] and not data['phone']:
            user = User.get_one(data['user'])
            data['phone'] = user.phone

        return data
Exemple #5
0
def verify_phone():
    """验证手机号 (GET|POST)

    :uri: /users/verify_phone
    :param phone: 手机号
    :returns: {}
    """
    params = request.values
    phone = params.get('phone', None)

    if User.get_by_phone(phone):
        return error.UserExists('手机号已被注册')

    return {}
Exemple #6
0
def register_phone():
    """用户手机注册 (GET|POST)

    :uri: /users/register_phone
    :param phone: 手机号
    :param password: 密码
    :param nickname: 昵称
    :param code: 短信验证码
    :param gender: 性别(可选)(1:男, 2:女)
    :returns: {'user': object, 'ut': string}
    """
    params = request.values
    phone = params.get('phone', None)
    code = params.get('code', None)
    password = params.get("password", None)
    nickname = params.get("nickname", None)
    gender = params.get("gender", 0)
    if not phone or not code or not password or not nickname:
        return error.InvalidArguments

    invalid_error = User.invalid_password(password)
    if invalid_error:
        return invalid_error

    invalid_error = User.invalid_nickname(nickname)
    if invalid_error:
        return invalid_error

    if User.get_by_phone(phone):
        return error.UserExists

    if not SMS.verify_code(phone, code):
        return error.VerifyCodeFailed

    user = User.init()
    name = '$mb$%s%s' % (phone[-4:], random.randint(1000, 9999))
    user.name = name
    user.phone = phone
    user.nickname = nickname
    user.gender = gender

    salt = os.urandom(const.PWD_HASH_LEN)
    pwd = User.gen_pwd_hash(password, salt)
    user._salt = Binary(salt)
    user._password = Binary(pwd)
    uid = user.create_model()
    new_user = User.get_one(uid)
    token = User.gen_token(str(uid))
    return {'user': new_user.format(), 'ut': token}
Exemple #7
0
def phone_province():
    """
    查询手机号码归属地
    :uri: /migu/phone/province
    :param: phone
    :return:
    """
    phone = request.values.get('phone', None)
    if not phone:
        return error.InvalidArguments

    user = User.get_by_phone(phone)
    if user and user.province:
        return {'province': user.province}
    province = Migu.get_user_info_by_account_name(phone)
    if isinstance(province, error.ApiError):
        return province
    user.update_model({'$set': {'province': province}})
    return {'province': province}
Exemple #8
0
def binding():
    """用户绑定 (GET|POST&LOGIN)

    :uri: /users/binding
    :param platform: 平台标识 (phone, weixin, qq)
    :param openid: 平台id/手机号
    :param token: 用户平台token/短信验证码
    :returns: {}
    """
    user = request.authed_user
    params = request.values
    platform = params.get('platform', None)
    openid = params.get('openid', None)
    token = params.get('token', None)

    if platform == 'phone':
        if not SMS.verify_code(openid, token):
            return error.VerifyCodeFailed
        # 用户已经存在
        if User.get_by_phone(openid):
            return error.UserExists
        info = {'phone': openid}
        user.update_model({'$set': info})
    elif platform == 'weixin':
        # 用户已经存在
        if User.get_platform_user(platform, openid):
            return error.UserExists
        if not WeiXin(token, openid).get_open_info():
            return error.LoginFailed
        key = 'partner_%s' % (platform)
        info = {key: {'id': openid}}
        user.update_model({'$set': info})
    elif platform == 'qq':
        # 用户已经存在
        if User.get_platform_user(platform, openid):
            return error.UserExists
        if not QQ(token, openid).get_open_info():
            return error.LoginFailed
        key = 'partner_%s' % (platform)
        info = {key: {'id': openid}}
        user.update_model({'$set': info})

    return {}
Exemple #9
0
def send_phone_code():
    """发送短信验证码 (GET|POST)

    :uri: /users/sms_code
    :param phone: 手机号
    :param action: 触发动作(可选)(注册:reg)
    :returns: {}
    """
    params = request.values
    phone = params.get('phone', None)
    action = params.get('action', None)
    if not phone:
        return error.InvalidArguments
    # 如果是注册验证码,提前判断手机号是否已存在
    if action == 'reg' and User.get_by_phone(phone):
        return error.UserExists

    ret = SMS.send_code(phone)
    if not ret:
        return error.SendCodeFailed
    return {}
Exemple #10
0
                            headers=headers, timeout=30)
        print_log('jpush_create_response_log', r.text)

        message_tag = [translate_md5(str(id)+'message')]
        push_data['audience']['tag'] = message_tag
        del push_data['notification']
        push_data['message'] = {"content_type": "text", "title": "msg"}
        push_data['message']['msg_content'] = message_content
        push_data['message']['extras'] = {"an_url": an_post_str,
                                          "ios_url": ios_post_str,
                                          "title": push_title,
                                          "content": push_content,
                                          "event_id": event_id}
        r = session.request("POST", schedule_url, data=json.dumps(push_data), params=None,
                            headers=headers, timeout=30)
        print_log('jpush_create_response_log', r.text)
    postdata()

    # yxpush
    postdata(app_key=app.config.get("JPUSH_YX_APP_KEY"), master_secret=app.config.get("JPUSH_YX_MASTER_SECRET"))

if __name__ == '__main__':
    # 测试用
    import sys
    from os.path import dirname, abspath
    os.environ['WXENV'] = 'Test'
    sys.path.append(dirname(dirname(dirname(abspath(__file__)))))
    from wanx.models.user import User
    phone = sys.argv[1] if len(sys.argv) > 1 else ''
    user = User.get_by_phone(phone)
    jpush_schedule_create(user, '我来测试,这是push', '我来测试,这是message', 'http://www.baidu.com', 'http://www.bing.com')
Exemple #11
0
def _filter_phone(value):
    user = User.get_by_phone(value)
    return user._id if user else None
Exemple #12
0
def platform_login():
    """第三方平台token登录 (GET|POST)

    :uri: /platform/users/login
    :param platform: 平台标识{'csdk':付费SDK, 'weixin':微信, 'qq':QQ, 'migu':咪咕}
    :param token: 用户平台token
    :returns: {'user': object, 'ut': string}
    """
    params = request.values
    platform = params.get('platform', None)
    token = params.get("token", None)
    if not token or platform not in const.PARTNER:
        return error.InvalidArguments

    data = Migu.token_validate(token)
    if isinstance(data, error.ApiError):
        return data

    openid = data.get('msisdn', None)
    migu_uid = data.get('identityID', None)
    passid = data.get('passID', None)
    if isinstance(migu_uid, error.ApiError):
        return migu_uid

    if platform == 'migu':
        # 进行用户绑定
        user = User.get_platform_user('migu', migu_uid)
        if not user:
            user = User.get_by_phone(openid)
            if user:
                info = dict(partner_migu={
                    'id': migu_uid,
                    'passid': passid
                },
                            name='$mg$%s%s' %
                            (migu_uid[-4:], random.randint(1000, 9999)))
                user = user.update_model({'$set': info})
            else:
                info = dict(phone=openid,
                            nickname=u'咪咕用户%s%s' %
                            (migu_uid[-4:], random.randint(1000, 9999)),
                            name='$mg$%s%s' %
                            (migu_uid[-4:], random.randint(1000, 9999)),
                            partner_migu={
                                'id': migu_uid,
                                'passid': passid
                            })
                user = User.create_platform_user('migu', migu_uid, data=info)
        else:
            info = {}
            # 如果用户没有绑定手机并且手机号没有被绑定, 则自动进行手机号绑定
            if not user.phone and not User.get_by_phone(openid):
                info = dict(phone=openid)
            # 如果用户未绑定passid,则自动进行passid绑定
            if passid not in user.partner_migu:
                info.update(
                    dict(partner_migu={
                        'id': migu_uid,
                        'passid': passid
                    }))
            if info:
                user = user.update_model({'$set': info})

        # 同步咪咕用户名密码
        if user:
            User.change_pwd(user, token)
    else:
        # 判断平台用户是否已经用户系统中存在
        user = User.get_platform_user(platform, openid)
        first_login = not user

        info = {}
        if platform == 'csdk':
            info = ChargeSDK(token).get_open_info()
        elif platform == 'weixin':
            info = WeiXin(token, openid).get_open_info(first_login)
        elif platform == 'qq':
            info = QQ(token, openid).get_open_info(first_login)

        if not info:
            return error.LoginFailed

        # 如果平台用户在用户系统中不存在, 则创建, 通过平台ID(openid)进行关联
        if first_login:
            open_id = info.pop('openid')
            user = User.create_platform_user(platform, open_id, data=info)
            # 给咪咕平台发送请求进行咪咕账号注册并登录绑定
            try:
                if platform in ['qq', 'weixin'] and user:
                    password = '******' % (openid[-4:])
                    ret = Migu.center_register(open_id, password,
                                               const.CENTER_ACCOUNT_INDIV)
                    if not isinstance(ret, error.ApiError):
                        openid = Migu.get_identityid(
                            open_id, password, const.CENTER_ACCOUNT_INDIV)
                        if not isinstance(openid, error.ApiError):
                            if not User.get_platform_user('migu', openid):
                                info = {'partner_migu': {'id': openid}}
                                user.update_model({'$set': info})
            except:
                pass

    if not user:
        return error.LoginFailed

    ut = User.gen_token(str(user._id))
    return {'user': user.format(include_fields=['passid']), 'ut': ut}