短信验证码
群发短信,短信验证码都是采用的别的平台的API,只不过每家的价格会稍稍不一样,2分到6分不等。
这类型的平台有:253创蓝4分一条,容联3分5到4分8一条,极光3分6到5分5一条(根据购买数量不同而不同)
各平台都有自己的管理平台,选择发送手机池,发送内容,发送时间等,如图:253创蓝管理平台
短信验证码和订单通知是通过短信模板实现的,
- 短信验证码是通过短信网关将含有验证码字符串的短信发送到用户手机上,常用于注册、重要资料修改、密码变更等环节。
- 订单通知是通过短信网关将用户的订单情况发送到用户手机上,常用于电子商务或物流等有订单交易、货物状态之类的公司。
模板短信前置条件
- 客户注册后,需要资质认证并通过后才允许使用模板短信(受运营商限制要求,请提交企业资质认证)。
- 客户需累计充值一定金额才可以使用短信模板功能
网易和阿里的短信不用认证也能模板测试。不过得先创建一个应用,然后申请试用,一共可以测试20条
下图是网易的
一共有通知类模板、验证码模板、运营类模板三类
通知类模板:是负责向用户发送一些活动类信息
运营类模板:暂时没有了解过
验证码模板:这里主要说下验证码模板的使用
验证码模板:
- 创建验证码模板
- 创建模板后,可对模板进行编辑,一个手机最多可接受几条、验证码有效时间是多久,都可以进行设置。
- 前端输入手机号,点击发送验证码,通过Ajax将手机号发送给后端,后端返回状态码200,则代表发送成功,然后拿起手机将收到的验证码输入代码框,点击确定,通过Ajax向后端发起请求,看验证码是否正确,如果正确返回200
- 后端代码
# 发送验证码
def send_checkcode(request):
phone = request.GET.get('phone')
print("====>", phone)
# 找到网易服务器
server_url = 'https://api.netease.im/sms/sendcode.action'
# 安装 pip install requests
app_secret = 'e38e4ca704cd'
random = hashlib.md5(str(time.time()).encode('utf-8')).hexdigest() #
current_time = str(int(time.time()))
check_sum = hashlib.sha1((app_secret + random + current_time).encode('utf-8')).hexdigest()
headers = {
'AppKey': '87e0fccd440bdb00285c11571d419766',
'Nonce': random,
'CurTime': current_time,
'CheckSum': check_sum
}
# 请求方式是:post ,请求头的添加: headers,使用requests发送请求
res = requests.post(server_url, data={'mobile': phone}, headers=headers)
# 获取响应结果
result = res.json()
print(result)
#
if result.get('code') == 200:
code = result.get('obj')
# 保存到缓存中
cache.set(phone, code)
# 返回结果
return JsonResponse(data={'status': 200, 'msg': 'success'})
else:
return JsonResponse(data={'status': 400, 'msg': 'fail'})
更新密码
def update_password(request):
phone = request.POST.get('phone')
code = request.POST.get('code')
print(phone, code)
# 就可以跟redis中的进行比较
cache_code = cache.get(phone)
print('cache_code', cache_code)
if code == cache_code:
user = AxfUser.objects.filter(phone=phone).first()
print(user)
return render(request, 'user/updatepwd.html', context={'userid': user.id})
else:
return render(request, 'user/forget.html', context={'error_msg': '手机或者验证码有误'})