容联云地址:容联云通讯_短信平台、手机验证码、语音验证码、IM即时通讯、云呼叫系统等互联网通信服务
注册荣联云账号并获取accId,accToken,appId
定义发送短信方法
思路:随机数模块生成六位数验证码,存在redis中,以便校验时使用
# 插入荣联云创建的插件
from ronglian_sms_sdk import SmsSDK
# 导入随机数模块用来生成验证码
import random
# 导入获取的荣联云的信息
import redis
import json
accId="8aaf07087de13e49017d***********"
accToken="419de3ed61444161ac**********"
appId ="8aaf07087de13e49017***********"
# 定义方法
def send_message(mobile):
# 按照插件需要参数定义自己的
sdk = SmsSDK(accId,accToken,appId)
# 短信类型,荣联云中获取
tid ="1"
# mobile = "134********"
# 生成验证码
data = random.randint(100000,999999)
# 创建redis客户端(存2号数据库,有密码需要添加密码)
redis_cli = redis.Redis(db=2)
# 短信验证码写入redis,有效时间三分钟
redis_cli.setex("sms_%s"%mobile,60*3,data)
# 根据需求传参,通常为验证码,过期时间,中间逗号隔开
datas=(data,2)
# 也可以自己定义验证码,字符串形式
# datas=("山人本无忧","因雪白了头")
# 传参:短信类型,手机号,短信验证码等参数
resp = sdk.sendMessage(tid,mobile,datas)
dataes =json.loads(resp)
print(dataes)
return dataes
# 调用方法
# send_message()
调用方法
# 发送短信验证码
class Get_msgcode(APIView):
def get(self,request):
phone = request.query_params.get("phone")
print(">>>>>",phone)
resp = send_message(phone)
# 因未开通发送功能,只能测试使用,绑定三个手机号可以正常发送,其他会返回报错码,所以默认返回以下报错码的都为发送成功
if resp["statusCode"] == "000000" or resp["statusCode"] == "112310" or resp["statusCode"] == "172001" :
return Response({'msg': "发送短信验证码成功", "code": 200})
else:
return Response({'msg': "发送短信验证码失败", "code": 400})
注册时检验短信验证码
Django项目中使用
#注册账号
class Register(APIView):
def post(self,request):
username = request.data.get("username")
phone = request.data.get("phone")
password = request.data.get("password")
code = request.data.get("code")
print(">>>>>>>>>>>>>",username,phone,password,code)
if not all([username,phone,password,code]):
return Response({"msg":"用户信息不全","code":400})
username_num = User.objects.filter(username=username).count()
phone_num = User.objects.filter(phone=phone).count()
if username_num != 0:
return Response({"msg": "该用户名已注册", "code": 400})
if phone_num != 0:
return Response({"msg": "该用手机号已注册", "code": 400})
# 短信验证码
print(">><><>>>",redis_code,type(redis_code))
if not redis_code:
return Response({"msg":"验证码过期","code":400})
sms_code = str(redis_code,encoding="utf-8")
print("》》》》",code,sms_code)
if sms_code != code:
return Response({"msg":"验证码错误","code":400})
user =User.objects.create_user(username=username,phone=phone,password=password)
user.save()
return Response({"msg":"注册成功","code":200})
前端vue实现倒计时
思路:发送按钮定义为一个变量,当方法被触发时,变量变为60,并依次递减
// 定义手机号text文本框和发送按钮
// 按钮里的内容用字段msgButton承接
data(){
return{
phone:"",
msgButton:"发送验证码"
}
},
# 发送的方法
methods:{
// 发送短信验证码
sendcode: function() {
// 1、验证手机号是否为空
if (!this.phone) {
this.message = "手机号不能为空";
this.$Message(this.message);
return false;
}
// 2、正则验证手机号格式
var reg = new RegExp(/^[1][34578][0-9]{9}$/);
if (!reg.test(this.phone)) //检测字符串是否符合正则表达式
{
this.message = "手机号格式不正确";
this.$Message(this.message)
}
// 3、将用户短信发送
var data = {phone:this.phone}
send_phone_code_post(data).then((res) => {
if (res.code == 200) {
# 定义一个变量计时,并把他传给msgBu
let t = 60;
let si = setInterval(() => {
this.msgButton = t;
t = t - 1;
if (t == 0) {
this.is_send = false;
this.msgButton = "获取手机验证码";
clearInterval(si);
}
}, 1000);
} else {
alert(res.msg)
}
}).catch((err) => {
console.log(err)
})
},
}



