1.发送短信验证码逻辑分析
2. 发送短信验证码接口设计
- 获取短信验证码属于获取资源,所以请求方法设计为 GET
- 为了省掉单独验证手机号格式,所以把手机号作为路径参数提交
P<mobile>
是取了一名字,后面可以使用这个mobile获取传过来的参数
2.2 请求参数:路径参数和查询字符串
查询字符串格式:是跟在url路径后面的
?image_code=1234&uuid=kalaslkcnalfna
2.3 响应结果:JSON
调用容联云通信:短信平台使用
https://www.yuntongxun.com/
注册用户,登录用户
创建应用
python测试帮助:
http://doc.yuntongxun.com/p/5f029ae7a80948a1006e776e
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里取出的数据是字节码的文件,我们需要转化成字符串才能进行比较,还有为了不区分大小写,我们统一规定为比较小写的字符串。
如果比较成功,那么我们就发送短信验证码,这里的字符串是6位,随机生成的,我们这里使用的是randint后面跟的是一个范围,范围里的数字可能产生5,这个时候我们希望是000005,所以需要将产生的随机数进行格式化
然后我们将产生的验证码存入到新的redis 3 号库中,我们又需要在settings中添加一个redis数据库
还要注意一个事情:前端的代码,在运行之后修改,重新启动服务器是没有更改前端的代码的,需要清除,不清除的话,还是之前的未修改的
短信验证码前端实现
register.js