短信验证码

 1. 业务处理流程
  • 检查图片验证码
  • 检查是否在60s内有发送记录
  • 生成短信验证码
  • 保存短信验证码与发送记录
  • 发送短信
  • 2. 后端接口设计:访问方式: GET /sms_codes/(?P<mobile>1[3-9]d{9})/?image_code_id=xxx&text=xxx请求参数: 路径参数与查询字符串参数 参数类型是否必须说明 mobile str 是 手机号 image_code_id uuid字符串 是 图片验证码编号 text str 是 用户输入的图片验证码 返回数据: JSON 返回值类型是否必传说明 message str 否 OK,发送成功 视图原型:# url('^sms_codes/(?P<mobile>1[3-9]d{9})/$', views.SMSCodeView.as_view()), class SMSCodeView(GenericAPIView): """ 短信验证码 传入参数: mobile, image_code_id, text """ pass 3. 后端实现在verifications/serializers.py中定义序列化器,用以校验class ImageCodeCheckSerializer(serializers.Serializer): """ 图片验证码校验序列化器 """ image_code_id = serializers.UUIDField() text = serializers.CharField(max_length=4, min_length=4) def validate(self, attrs): """ 校验 """ image_code_id = attrs['image_code_id'] text = attrs['text'] # 查询真实图片验证码 redis_conn = get_redis_connection('verify_codes') real_image_code_text = redis_conn.get('img_%s' % image_code_id) if not real_image_code_text: raise serializers.ValidationError('图片验证码无效') # 删除图片验证码 try: redis_conn.delete('img_%s' % image_code_id) except RedisError as e: logger.error(e) # 比较图片验证码 real_image_code_text = real_image_code_text.decode() if real_image_code_text.lower() != text.lower(): raise serializers.ValidationError('图片验证码错误') # 判断是否在60s内 mobile = self.context['view'].kwargs['mobile'] send_flag = redis_conn.get("send_flag_%s" % mobile) if send_flag: raise serializers.ValidationError('请求次数过于频繁') return attrs 在verifications/views.py中定义实现视图:class SMSCodeView(GenericAPIView): """ 短信验证码 """ serializer_class = serializers.ImageCodeCheckSerializer def get(self, request, mobile): """ 创建短信验证码 """ # 判断图片验证码, 判断是否在60s内 serializer = self.get_serializer(data=request.query_params) serializer.is_valid(raise_exception=True) # 生成短信验证码 sms_code = "%06d" % random.randint(0, 999999) # 保存短信验证码与发送记录 redis_conn = get_redis_connection('verify_codes') pl = redis_conn.pipeline() pl.setex("sms_%s" % mobile, constants.SMS_CODE_REDIS_EXPIRES, sms_code) pl.setex("send_flag_%s" % mobile, constants.SEND_SMS_CODE_INTERVAL, 1) pl.execute() # 发送短信验证码 sms_code_expires = str(constants.SMS_CODE_REDIS_EXPIRES // 60) ccp = CCP() ccp.send_template_sms(mobile, [code, expires], SMS_CODE_TEMP_ID) return Response({"message": "OK"})  

    相关内容推荐