# 获取短信息验证码视图
# 前端采取get请求访问,携带参数,手机号码,验证码编号,用户输入的验证码
# 访问127.0.0.1:5000/api/v1.0/sms_codes?image_code_id=&image_code=
@api.route('/sms_codes/')
def get_sms_code(mobile):
"""获取短信验证码"""
# 获取数据
image_code = request.args.get('image_code')
image_code_id = request.args.get('image_code_id')
# 校验数据
if not all([image_code, image_code_id]):
# 参数不完整
return jsonify(errno=RET.PARAMERR, errmsg='参数不完整')
# 业务处理:从redis中获取验证码信息
# 判断图片验证码是否过期
try:
real_image_code = redis_store.get('image_code_%s' % image_code_id)
except Exception as e:
current_app.logger.error(e)
return jsonify(errno=RET.DBERR, errmsg='redis数据库异常')
# 判断验证码是否过期
if real_image_code is None:
# 不存在或者已经过期
return jsonify(errno=RET.NODATA, errmsg='图片验证码已过期')
# 与用户填写的进行对比(忽略大小写)
if real_image_code.lower() != image_code.lower():
# 有验证码错误
return jsonify(errno=RET.DATAERR, errmsg='验证码错误')
# 判断手机号是否存在
try:
# 如果不存在返回none
user = User.query.filter_by(mobile=mobile).first()
except Exception as e:
current_app.logger.error(e) # 这里代表数据库连接失败,但是不应该返回错误,在最终注册的时候再进行最后的校验
else:
# 如果发生异常,user就没有值了,没有异常的时候进行判断,否则程序崩溃
if user is not None:
# 该手机号已经注册过
return jsonify(errno=RET.DATAEXIST, errmsg='手机号已经存在')
# 若果手机号不存在,生成随机短信验证码
sms_code = '%06d' % random.randint(0, 999999)
# 验证码存入redis中,使用字符串存储,设置过期时间为300秒
try:
redis_store.setex('sms_code_%s' % mobile, SMS_CODE_REDIS_EXPIRES, sms_code)
except Exception as e:
current_app.logger.error(e)
# 保存失败
return jsonify(errno=RET.DBERR, errmsg='保存验证码失败')
# 发送短信验证码
ccp = CCP() # 几分钟过期
result = ccp.sendTemplateSMS(mobile, [sms_code, SMS_CODE_REDIS_EXPIRES / 60], 1)
# 返回响应
if result == 0:
# 发送成功
return jsonify(errno=RET.OK, errmsg='发送成功')
else:
return jsonify(errno=RET.THIRDERR, errmsg='发送失败')