예제 #1
0
파일: views.py 프로젝트: gganduu/blog
 def get(self, request):
     uuid = request.GET.get('uuid')
     mobile = request.GET.get('mobile')
     image_code = request.GET.get('image_code')
     # verify parameters
     if not all([uuid, mobile, image_code]):
         return JsonResponse({
             'code': RETCODE.NECESSARYPARAMERR,
             'errmsg': 'Input parameters have problems'
         })
     redis_conn = get_redis_connection('default')
     saved_image_code = redis_conn.get('img:' + str(uuid))
     if saved_image_code is None:
         return JsonResponse({
             'code': RETCODE.IMAGECODEERR,
             'errmsg': 'Image code has run out of time'
         })
     try:
         redis_conn.delete('img' + str(uuid))
     except Exception as e:
         logger.error(e)
     if saved_image_code.decode().lower() != image_code.lower():
         return JsonResponse({
             'code': RETCODE.IMAGECODEERR,
             'errmsg': 'Image code is incompatible'
         })
     ccp = CCP()
     sms_code = random.randint(100000, 999999)
     ccp.send_template_sms(mobile, [sms_code, 5], 1)
     # save the sms code in redis for following register authentication
     redis_conn.setex('mob:' + str(mobile), 300, sms_code)
     return JsonResponse({'code': RETCODE.OK})
예제 #2
0
    def get(self, request, mobile):
        query_params = request.query_params
        print(query_params)

        serializer = self.get_serializer(data=query_params)
        serializer.is_valid(raise_exception=True)
        redis_conn = get_redis_connection('code')
        if redis_conn.get('sms_flag_%s' % mobile):
            return Response(status=status.HTTP_429_TOO_MANY_REQUESTS)
        sms_code = '%06d' % randint(0, 999999)
        print(sms_code)
        redis_conn.setex('sms_%s' % mobile, 5 * 60, sms_code)
        redis_conn.setex('sms_flag_%s' % mobile, 60, 1)

        ccp = CCP()
        ccp.send_template_sms(mobile, [sms_code, 5], 1)
        return Response({'message': 'ok'})
예제 #3
0
    def get(self,request,mobile):

        # 创建序列化器, 定义text和image_code_id
        serializer = self.get_serializer(data=request.query_params)
        serializer.is_valid(raise_exception=True)
        # redis
        redis_conn = get_redis_connection('code')
        # 判断该用户是否频繁获取
        if redis_conn.get('sms_flag_%s'%mobile):
            return Response(status=status.HTTP_429_TOO_MANY_REQUESTS)
        # 生成短信验证码
        sms_code = '%06d'%randint(0,999999)
        # redis增加记录
        redis_conn.setex('sms_%s'%mobile,5*60,sms_code)
        redis_conn.setex('sms_flag_%s'%mobile,60,1)
        # 发送短信
        ccp = CCP()
        ccp.send_template_sms(mobile,[sms_code,5],1)
        # 返回响应
        return Response({'message':'ok'})
예제 #4
0
def get_sms_code():
    """获取短信验证码"""
    request_data = request.get_json()
    image_code = request_data.get("imgCode")
    mobile = request_data.get("mobile")
    image_id = request.args.get("imgID")

    print(image_id)

    if not all([mobile, image_code]):
        return jsonify(error="-1", errmsg="参数填写不完整")

    if not re.match(r"1[35789]\d{9}", mobile):
        return jsonify(error="-1", errmsg="手机号格式错误")

    try:
        flag = redis_store.get("sended_sms_code_%s" % mobile)
    except Exception:
        pass
    else:
        if flag:
            return jsonify(error="-1", errmsg="请求过于频繁,请稍后再试!")

    # 判断手机号是否存在

    try:
        real_image_code = redis_store.get("img_code_%s" % image_id)
    except Exception:
        return jsonify(error="-1", errmsg="数据库异常")
    print(real_image_code.decode("utf-8"), image_code)
    if real_image_code.decode("utf-8").lower() != image_code.lower():
        return jsonify(error="-1", errmsg="图片验证码填写错误")

    # 发送短信
    sms_code = "%06d" % random.randint(0, 999999)
    try:
        redis_store.setex("sms_code_%s" % mobile, 3600, sms_code)
        redis_store.setex("sended_sms_code_%s" % mobile, 300, 1)
    except Exception:
        pass

    ccp = CCP()
    try:
        ret = ccp.send_template_sms(mobile, datas=[sms_code, 5], temp_id=1)
    except Exception:
        return jsonify(error="-1", errmsg="发送短信错误")

    if ret == 0:
        return jsonify(errno="0", errmsg="发送成功")
    else:
        return jsonify(errno="-1", errmsg="发送失败")
예제 #5
0
def send_sms_code(self, mobile, sms_code):
    try:
        ccp = CCP()
        send_ret = ccp.send_template_sms('13581824252', [sms_code, 5], 1)
    except Exception as e:
        raise self.retry(exc=e, max_retries=3)
    if send_ret != 0:
        # 有异常自动重试三次
        raise self.retry(exc=Exception('发送短信失败'), max_retries=3)
    else:
        redis_conn = get_redis_connection('message_code')
        redis_conn.setex('sms_%s' % mobile, 3000, sms_code)
        #  设置发送 flag 有效期60秒 用于判断和控制用户频繁调用接口
        redis_conn.setex('send_flag_%s' % mobile, 60, 1)

    return send_ret
예제 #6
0
def send_sms_code(mobile, sms_code):

    ccp = CCP()
    ccp.send_template_sms(mobile, [sms_code, 5], 1)
예제 #7
0
def get_sms_code():
    """
    1.获取参数,request.data,  json.loads(json)
    2.校验参数为空情况
    3.验证手机号格式
    4.通过image_code_id取出redis中的图片验证码
    5.判断取出的图片验证码是否过期
    6.判断两者图片验证码是否相等
    7.生成短信验证码
    8.调用云通讯发送(手机号,短信验证码,有效期,模板id)
    9.保存到redis
    10.返回前端
    :return:
    """
    # 1.获取参数,request.data,  json.loads(json)
    dict_data = request.json
    mobile = dict_data.get('mobile')
    image_code_id = dict_data.get('image_code_id')
    image_code = dict_data.get('image_code')
    # print(image_code)

    # 2.校验参数为空情况
    if not all([mobile, image_code, image_code_id]):
        return jsonify(errno=RET.PARAMERR, errmsg='参数不完整')

    # 3.验证手机号格式
    if not re.match('1[356789]\d{9}', mobile):
        return jsonify(errno=RET.DATAERR, errmsg='手机号格式错误')

    # 4.通过image_code_id取出redis中的图片验证码
    try:
        redis_image_code = redis_store.get('image_code:%s' % image_code_id)
        current_app.logger.error(redis_image_code)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='查找图片验证码失败')

    # 5.判断取出的图片验证码是否过期
    if not redis_image_code:
        return jsonify(errno=RET.NODATA, errmsg='图片验证码已经过期')

    # 6.判断两者图片验证码是否相等
    if not redis_image_code.lower() == image_code.lower():
        # print(redis_image_code)
        # current_app.logger.error(redis_image_code)
        # current_app.logger.error(image_code)
        return jsonify(errno=RET.DATAERR, errmsg='图片验证码输入错误')

    # 7.生成短信验证码
    sms_code = '%06d' % random.randint(0, 999999)
    # 8.调用云通讯发送(手机号,短信验证码,有效期,模板id)
    ccp = CCP()
    result = ccp.send_template_sms(mobile, [sms_code, 5], 1)
    if result == -1:
        return jsonify(errno=RET.THIRDERR, errmsg='短信验证码发送失败')
    current_app.logger.debug('短信验证码是:%s' % sms_code)
    # 9.保存到redis
    try:
        redis_store.set('msg_code:%s' % mobile, sms_code,
                        constants.SMS_CODE_REDIS_EXPIRES)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='短信保存到数据库失败')

    # 10.返回前端

    return jsonify(errno=RET.OK, errmsg='发送成功!')
예제 #8
0
def send_sms_code(mobile, sms_code):
    # 任务就是发送短信
    ccp = CCP()  # mobile:向谁发 []:发什么, 5/分钟:过期时间, 1:模板  ,
    ccp.send_template_sms(mobile, [sms_code, 5], 1)
    print()
예제 #9
0
def get_sms_code(mobile):

    # 1. 获取参数
    image_code = request.args.get('image_code')
    image_code_id = request.args.get('image_code_id')

    # 2. 效验参数
    if not all([image_code, image_code_id]):
        response_dict = {
            'errno': RET.PARAMERR,
            'errmsg': '参数不全, 请填写完整'
        }
        return jsonify(response_dict)

    # 3. 逻辑处理

    # 1. 和redis数据对比: 获取redis数据, 判断是否为None, 无论正确与否都要删除, 和用户传入的数据做对比
    # 2. 判断用户是否已经注册过, 判断是否为空
    # 3. 发送短信验证码: 自行生成验证码, 保存到redis, 调用云通信接口发送验证码

    # 3.1 获取redis数据 --> try
    try:
        real_image_code = redis_store.get('image_code_' + image_code_id)
    except Exception as e:
        logging.error(e)
        response_dict = {
            'errno': RET.DBERR,
            'errmsg': '访问数据库异常'
        }
        return jsonify(response_dict)

    # 3.2判断是否为None
    # 数据库, 获取空值就是None
    if real_image_code is None:
        response_dict = {
            'errno': RET.NODATA,
            'errmsg': '验证码已过期/或已删除'
        }
        return jsonify(response_dict)

    # 3.3 无论正确与否都要删除 try
    # 图片验证码通常只能用一次
    try:
        redis_store.delete('image_code_' + image_code_id)
    except Exception as e:
        logging.error(e)
        # 理论上应该返回错误信息. 但是从用户体验的角度来说. 用户没有做错事, 只是服务器删除失败.
        # 就算没有立即删掉, 2分钟后也会过期. 可以考虑不删除 --> 产品经理角度(将来和产品经理商量一下)

    # 3.4 和用户传入的数据做对比
    # 142B 142b 为了忽略大小写的问题, 建议全大写或小写
    if image_code.lower() != real_image_code.lower():
        response_dict = {
            'errno': RET.DATAERR,
            'errmsg': '验证码输入错误'
        }
        return jsonify(response_dict)

    # 3.5 判断用户是否已经注册过, 判断是否为空 try
    try:
        user = User.query.filter_by(mobile=mobile).first()
    except Exception as e:
        logging.error(e)
        # 理论上, 需要返回错. 从体验角度讲, 后面的立即注册也会去检测用户是否注册. 因此可以考虑本次错误不返回
    else:
        # 判断用户不为空, 说明已经注册过
        if user is not None:
            response_dict = {
                'errno': RET.DATAEXIST,
                'errmsg': '该手机号已存在'
            }
            return jsonify(response_dict)

    # 3.6 自行生成验证码
    # 06d: 要求6位数, 不足以0补齐
    sms_code = '%06d' % random.randint(0, 999999)

    # 3.7 保存到redis try
    try:
        # 第一个参数: key , 第二个参数: 过期时间 第三个参数: value
        redis_store.setex('sms_code_' + mobile, constants.SMS_CODE_REDIS_EXPIRE, sms_code)
    except Exception as e:
        logging.error(e)
        response_dict = {
            'errno': RET.DBERR,
            'errmsg': '访问redis出错'
        }
        return jsonify(response_dict)

    # 3.8 调用云通信接口发送验证码 try
    ccp = CCP()
    try:
        status_code = ccp.send_template_sms(mobile, [sms_code, str(constants.SMS_CODE_REDIS_EXPIRE / 60)], 1)
    except Exception as e:
        logging.error(e)
        response_dict = {
            'errno': RET.THIRDERR,
            'errmsg': '发送异常'
        }
        return jsonify(response_dict)

    # 4. 返回数据
    if status_code == '000000':
        # 发送成功
        response_dict = {
            'errno': RET.OK,
            'errmsg': '发送成功'
        }
        return jsonify(response_dict)
    else:
        # 发送失败
        response_dict = {
            'errno': RET.THIRDERR,
            'errmsg': '发送失败'
        }
        return jsonify(response_dict)
예제 #10
0
def send_sms_code(mobile, sms_code):
    """发送短信任务"""
    ccp = CCP()
    ccp.send_template_sms(mobile, [sms_code, 5], 1)
    return "短信发送成功!"
예제 #11
0
def ccp_send_sms_code(mobile, sms_code):

    from libs.yuntongxun.sms import CCP
    ccp = CCP()
    send_result = ccp.send_template_sms(mobile, [sms_code, 5], 1)
    return send_result
예제 #12
0
파일: tasks.py 프로젝트: codedaliu/02meiduo
def send_sms_code(mobile, sms_code):
    CCP.send_template_sms(mobile, [sms_code, 5], 1)
예제 #13
0
def send_template_sms(to, datas, temp_id):
    """发送短信"""
    ccp = CCP()
    ccp.send_template_sms(to, datas, temp_id)