# 课程链接
入门到实战,讲讲公司的微信小程序【django+drf+小程序实战】_哔哩哔哩_bilibili
# 微信开发者文档
微信开放文档
# 课程内容
(1)P28_发送短信验证码流程
(2)P29_腾讯云短信使用
# (1)验证码初步
1)首先是布置一下前端的界面,然后我们想要把 "点击获取验证码" 注册为一个事件,具体思路就是,点击后,就会往后台发送一个 get 请求来获取验证码。
2)然后是 js 代码,注意data 处。
但是我们要获取验证码,首先要求的是必须先填入合法的手机号,所以我们需要在前面加一个判断(这只是初步判断),比如是不是输入了 11 位。如果没有输入到 11 位数的话,就会报错并且直接 return,即后续代码不执行。
3)wx.showToast(Object object) 官方api,可以理解为这个是给一个弹窗的,比如成功的弹窗、失败的弹窗、等待的弹窗等待。那么以下是相应的文档信息,详细的讲解如下:
title:这个就是返回的弹窗中的内容,比如我们的是手机号长度错误。
icon:是图标,默认是成功。也可以是其他值,详情可以看文档。
image:是自定义的图标,优先级高于 icon。
duration:就是弹窗持续的时间。
mask:简单理解就是弹窗之后,直接让当前界面的交互失灵。
后面的三个,和之前的是一样的。
# (2)正则匹配手机格式
1)前面我们限制了手机号的位数必须是 11 位,但是没有限制必须是数字。因为用户也可能输入各种其他字符,这是不允许的。因而可以使用 js 中的正则表达式。(当然,限制数字的话,也要限制开头是130、156等待正常的开头),具体的书写方式如下所示,当然了,对于正则表达式而言,我们还是要学会现查现用。
2)那么我们在后台的代码可以尝试获取一下
# (3)基于 django 视图类的验证流程
1)首先是明确整个流程,后台接收到前台传来的手机号,然后进行校验等等一系列步骤如下。
这里需要提一下第 5 个步骤,就是发送验证码+手机号。有效期保留 30s(据说超出 30s 就要收费了),因为要存在服务器端,所以这里我们最好使用 redis 去做。redis 的一些用法如下,后续具体实践的时候我们再说。
2)那么获取手机号就不说了,直接开始写手机号的正则校验即可。思路很简单,就是利用 re.match() 模块来做。 然后如果匹配不成功,返回的是 None,那么直接就返回手机号格式错误,当然了,这只是一种方法。
3)校验手机号还有一种实现的方法,就是使用 drf 的序列化来做。如下所示,这是继承自 serializers.Serializer 类来做的(之前用过 serializers.ModelSerializer ,但是这是需要设计相应的数据库的,显然我们的获取的号码没有存储它的数据库,所以不用这个。)
4)我们应用的时候就是下面的红框的代码所示,先是实例化我们自定义序列化的类,然后传参 data=request.query_params,然后使用 ser.is_valid() 来进行校验。但是我们只是校验的规则只是检测是否为空,我们可以自定义加上校验的规则。
5)那么具体的序列化的办法就是,首先我们是定义一个校验规则,比如我们简单点,我们只是定义,写个 pass 即可。
然后验证的时候,我们在 serializers.CharField() 中添加一个 validators 属性,只要把我们自定义的校验办法添加进去即可,这是固定写法。亦即这样 serializers.CharField(label="手机号",validators=[phoneNum_validator,]) 。那么之后 ser.is_valid() 校验的时候,首先会验证字段是不是为空,然后再去使用这个序列化的校验规则,也就是执行 phoneNume_validator 这个函数。
6)结合上面的思路,我们就可以来做正则匹配了。如下所示。可以看到代码比之前的复杂了,但是我们相当于封装了一个序列化的校验规则,后续需要的时候可以复用。
7)一些细节,就是钩子函数的校验。这个钩子函数也是可以用来做校验规则的,但是整个执行流程是这样的,首先是执行默认的 label 规则(就是能不能为空),然后去执行我们自定义的序列化规则,也就是放在 serializers.CharField() 中的 validators 属性中,即下面的 phoneNum_validator(value) ,最后才是执行钩子函数 validate_phoneNum() 的内容(如果有定义的话)。【这里提一下,传参 value 就是传进来的 phoneNum 】
8)我们做一个错误数据来测试一下,可以看到返回的错误信息
9)生成随机验证码和发送验证码给用户的代码如下:
# (4)基于 django 视图类的验证流程之 redis 专栏
1)redis 的一个基本使用,或者说是构建一个 redis 的前提。其实就是一个小案例,但是这里也只是引出来。
2)但是在 django 中,给我们进一步封装了 redis 的一个模块,就是 django-redis 模块,安装直接可以用 pip 来安装。以下是使用的一个流程,暂且先了解。
3)安装完成 django-redis 后,要去 settings.py 去配置一下。
4)那么使用就是下面这样的,就记住先,后续再详解了。
5)该视图类的完整代码如下:
import re from rest_framework import serializers def phoneNum_validator(value): reg = r"^(1[3|4|5|6|7|8|9])\d{9}$" # 这里定义一下正则的规则 # 显然没通过就抛出一个异常 if not re.match(reg, value): from rest_framework.exceptions import ValidationError # 这是 drf 的错误,我故意放这的 raise ValidationError("手机格式错误") # 如果通过了,那么默认是返回的 None class GetCodeSerializer(serializers.Serializer): # 基于 serializers.Serializer 类的自定义的字段 # label 其实默认了不能为空 phoneNum = serializers.CharField(label="手机号", validators=[phoneNum_validator, ]) # # 钩子函数这是定义的 # def validate_phoneNum(self, value): # pass # 重构一个我们的代码 class GetCode(APIView): def get(self, request, *args, **kwargs): # 1. 首先要使用正则模块校验手机号,然后才能继续获取验证码 ser = GetCodeSerializer(data=request.query_params) # 2. 如果校验没通过那么直接返回错误的信息 if not ser.is_valid(): return HttpResponse({"status": False, "msg": "手机格式错误"}) # 3. 显然我们校验成功后,数据就放在了 ser.validated_data 中,所以我们可以通过 ser.validated_data.get() 来取得号码 phoneNum = ser.validated_data.get("phoneNum") # 4. 生成验证码 import random random_code = random.randint(1000, 9999) # 5. 然后将生成的验证码 random_code 发送到手机上面,这里需要购买相应的服务,只需要朝相应的 api 发请求就可以得到验证码了 # 一般买的是阿里云/腾讯云的服务,前者居多,但是微信小程序自然是选择腾讯云啦。 # 6. 保留验证码+手机号,并且保留30秒。 # 这里我们使用 django-redis 来做 from django_redis import get_redis_connection conn = get_redis_connection() # 创建链接 conn.set(phoneNum, random_code, ex=30) # 保留手机号和验证码,以及保留时间 30 秒 ret = { "status": True, "msg": "发送成功" } return JsonResponse(ret)
# (1)腾讯云短信的注册和试用
1)首先我们打开以下的链接:短信_文本短信_通知短信_营销短信_验证码短信 - 腾讯云 ,然后就可以看到如下的界面,我们点击免费试用。
点击了免费试用后,就会跳出如下的界面。我们首先先登录,如果是用微信登录的话,一般是要关联账户的,比如我们关联的是公众号管理平台的账户。
关联完成后,会要求我们勾选相应协议,和认证类型,接着就是点击接入了,我们只是用来学习,所以试用个人认证即可。
接入成功后,就是领取到了100 条免费国内短信了。
2)在完成了上述的步骤后,我们就可以来到如下的界面。
# (2)创建应用程序
1)紧接着,我们要新建一个应用程序。如下所示,在左边的选项栏中,选择应用管理下的应用列表,然后选择创建应用。
2)那么我们创建好之后,只需要记住 SDK AppID 的值就可以了。
# (3)签名管理【武sir 教我们避坑了】
1)完成了应用程序的创建之后,我们就要申请签名管理了,如下图所示,先是在左侧的选项框中找到国内短信,然后选择签名管理。
2)那么点击创建签名后,就是如下的界面了,具体的信息填写和解释如下。
3)那么这一块我们需要的数据就是 ID 和签名内容,如下所示:
# (4)创建正文模板
1)我们创建完签名后,就要开始创建正文模板了,还是在国内短信下面,点击正文模板管理。这个就是我们发短信的时候显示的东西。
2)具体的创建内容如下,然后点击确定后,就可以等待审核了,这个会比签名管理的审核容易点。
3)在正文模板这里,我们需要的数据的 ID 和模板类型。 如下所示
# (5)申请腾讯云 API
1)首先打开网址登录 - 腾讯云 ,然后会出现一个弹窗,我们选择继续使用即可。我们可以看到,左边的菜单栏变了,显然这是另一个控制台。紧接着我们点击新建密钥,就可以有以下的一串密钥,分别是 SecretId 和 SecretKey 两个,这个是我们后续调用 API 要用的。
# (6)调用相关接口去发送短信---使用腾讯的 python SDK 来做
1)一般而言,如果某种语言没有相应的 SDK 来处理请求的传参的时候,就需要我们自己手动的去写。但是如果平台提供了对应语言的 SDK 包,那么我们就只需要考虑输出即可,相当于传参的排序和加密等等的操作对我们来说都是透明的。腾讯云的短信验证是提供了 python 的 SDK 包的,我们打开文档的链接:短信 发送短信-API 文档-文档中心-腾讯云 , 就有如下所示。【但是不推荐使用这个方法了】
2)推荐的方法。自从 API 3.0 以上后,官方是推荐如下的方式,也就是直接打开链接:短信 Python SDK-SDK 文档-文档中心-腾讯云 ,根据这个文档信息开始操作学习即可。
#
# (1)python 的 re 模块
#