1.发送短信验证码逻辑分析

airdroid怎么用python提取短息验证码 python读取短信验证码_验证码

2. 发送短信验证码接口设计

  • 获取短信验证码属于获取资源,所以请求方法设计为 GET
  • 为了省掉单独验证手机号格式,所以把手机号作为路径参数提交
  • P<mobile> 是取了一名字,后面可以使用这个mobile获取传过来的参数

2.2 请求参数:路径参数和查询字符串

airdroid怎么用python提取短息验证码 python读取短信验证码_验证码_02


查询字符串格式:是跟在url路径后面的

?image_code=1234&uuid=kalaslkcnalfna

2.3 响应结果:JSON

airdroid怎么用python提取短息验证码 python读取短信验证码_字符串_03

调用容联云通信:短信平台使用

https://www.yuntongxun.com/ 注册用户,登录用户

创建应用

airdroid怎么用python提取短息验证码 python读取短信验证码_redis_04


airdroid怎么用python提取短息验证码 python读取短信验证码_字符串_05


python测试帮助:http://doc.yuntongxun.com/p/5f029ae7a80948a1006e776e

airdroid怎么用python提取短息验证码 python读取短信验证码_字符串_06


airdroid怎么用python提取短息验证码 python读取短信验证码_字符串_07


airdroid怎么用python提取短息验证码 python读取短信验证码_验证码_08


airdroid怎么用python提取短息验证码 python读取短信验证码_验证码_09


airdroid怎么用python提取短息验证码 python读取短信验证码_字符串_10


airdroid怎么用python提取短息验证码 python读取短信验证码_redis_11

views.py里的文件

注意 random引入的是模块 random, 而不是import 。。。from 。。。
从redis里取出的值是 byte类型的字节码,需要转换成字符串,使用decode()转化

import random
import uuid


from django.http import HttpRequest, HttpResponse, HttpResponseForbidden, JsonResponse
from django.shortcuts import render

# Create your views here.
from django.views import View
from django_redis import get_redis_connection
from redis import StrictRedis

from woniumall.libs.captcha.captcha import captcha
from woniumall.libs.ronglian_sms_sdk.Sms import send_sms_code
from woniumall.utils import constants
from woniumall.utils.response_code import RETCODE

class SmsCodeView(View):
    def get(self, request: HttpRequest, mobile):
        # 1.接收数据
        image_code = request.GET.get("image_code")
        uuid = request.GET.get("uuid")
        # 校验数据
        if not all([image_code, uuid]):
            return HttpResponseForbidden("缺少必要数据")
        # 为了避免用户使用图形验证码恶意测试,每个图形验证码只能使用一次,后端提取了图形验证码后,立即删除图形验证码
        redis: StrictRedis = get_redis_connection("image_code")
        image_code_redis = redis.get(uuid)
        # 删除图形验证码
        redis.delete(uuid)

        # 比较图形验证码
        # redis里的code是字节码 要转化成字符串
        if image_code.lower() != image_code_redis.lower().decode():
            return JsonResponse({"code":RETCODE.IMAGECODEERR,"errmsg":"图形验证码错误"})

        # 产生短信验证码
        # 产生6位
        sms_code = random.randint(0, 1000000)
        # 产生一个数字 9 ,可以格式化为000009
        sms_code = "{:0>6d}".format(sms_code)

        # 保存到redis
        redis: StrictRedis = get_redis_connection("sms_code")
        redis.set(mobile, sms_code, ex=constants.sms_code_expire)

        # 发送短信验证码
        if send_sms_code([mobile], sms_code):
            # 返回响应
            return JsonResponse({"code": 0, "errmsg": "ok"})
        else:
            return JsonResponse({"code": RETCODE.SMSCODERR, "errmsg": "短信验证码发送失败"})

urls.py里的代码:
注意r " 后面不要跟上 /

from django.urls import re_path

from verifications import views

urlpatterns = [

    re_path(r"image_codes/(?P<uuid>[\w-]+)/", views.ImageCodeView.as_view()),
    re_path(r"sms_codes/(?P<mobile>1[3-9]\d{9})/", views.SmsCodeView.as_view()),
]

短信验证码的业务逻辑总结

views.py的代码实现流程,自己的体会:

用户从注册页面填写 手机号,图形验证码,后端接收到手机号,图形验证码 和 UUID

然后我们在后端首先是用GET 请求的方法的get得到数据

我们再判断数据是否齐全,不齐全的话返回一个错误

手机号和UUID齐全的话,我们就应该开始对UUID进行验证,即是验证图形验证码输入是否正确

在设置图形验证码的时候,我们已经将图形验证码的UUID和image_code存在redis 的 2号仓库了

这时,我就需要连接redis 缓存,然后取出UUID下对应的验证码,这里是用image_code_redis存起来。为了保证数据的安全性,我们会将取出的UUID删除,即是删除图形验证码

然后我们就可以将GET请求里的验证码和我们从缓存里取出的验证码进行比较了,如果比较成功,那么我们就可以给用户的手机号发送短信验证码。

值得说明的是:这里比较短信验证码,从redis里取出的数据是字节码的文件,我们需要转化成字符串才能进行比较,还有为了不区分大小写,我们统一规定为比较小写的字符串。

airdroid怎么用python提取短息验证码 python读取短信验证码_字符串_12


如果比较成功,那么我们就发送短信验证码,这里的字符串是6位,随机生成的,我们这里使用的是randint后面跟的是一个范围,范围里的数字可能产生5,这个时候我们希望是000005,所以需要将产生的随机数进行格式化

airdroid怎么用python提取短息验证码 python读取短信验证码_redis_13


然后我们将产生的验证码存入到新的redis 3 号库中,我们又需要在settings中添加一个redis数据库

airdroid怎么用python提取短息验证码 python读取短信验证码_字符串_14

还要注意一个事情:前端的代码,在运行之后修改,重新启动服务器是没有更改前端的代码的,需要清除,不清除的话,还是之前的未修改的

airdroid怎么用python提取短息验证码 python读取短信验证码_验证码_15

airdroid怎么用python提取短息验证码 python读取短信验证码_字符串_16

短信验证码前端实现

register.js