django 发送手机验证码

一、流程分析:

1.用户在项目前端,输入手机号,然后点击【获取验证码】,将手机号发到post到后台。

2.后台验证手机号是否合法,是否已被占用,如果通过验证,则生成验证码,并通过运行脚本,让短信运营商向该手机号,发送该验证码,如果没通过验证,则返回错误信息

3.用户收到短信验证码以后,再次将所有信息post到后台。

4.后台验证各个数据,通过验证则完成实名制认证,如果没通过则返回错误信息。

总结,一次实名验证,需要两次ajax+post

二、对接短信商:

1.在云片网端:

1.注册云片网

地址:https://www.yunpian.com/

后台管理控制台页面:其中最重要的信息是APIKEY

 2.开发者备案、新增签名、新增模板(模板管理)

1.云片网后台的【测试】是没有意义的,所谓的测试,就是直接给你手机发送一条短信,这算哪门子测试?

2.【签名/模板设备】页,【签名管理】点击【新增签名】,到这里会被提醒完善【开发者信息】,认证分为开发者的【公司】和【个人】,现在是开发测试阶段,可以先选择【个人】,【个人】要身份证的照片,提交照片。

3.等待认证完成的短信通知,然后按照后台的操作指引,在【签名管理】页【新增签名】,在【模板管理】页【新增模板】,这些都要等待云片网的审核,审核通过会有短信通知。

 4.在云片网后台设置ip白名单,将外网ip加入白名单

 获取本机外网ip最简单的方法,就是百度ip

2.在django项目中写发送短信的脚本

在 项目目录下 新建utils目录 新建yunpian.py 

import requests
class YunPian(object):
    def __init__(self,api_key):
        self.api_key=api_key
        self.single_send_url='https://sms.yunpian.com/v2/sms/single_send.json'

    def send_sms(self,code,mobile):
        parmas={
            'apikey':self.api_key,
            'mobile':mobile,
            'text':'【**网】您的验证码是{code}。如非本人操作,请忽略本短信'.format(code=code)
        }
        #text必须要跟云片后台的模板内容 保持一致,不然发送不出去!
        r=requests.post(self.single_send_url,data=parmas)
        print(r)

if __name__=='__main__':
    yun_pian=YunPian('***************(你的apikey)')
    yun_pian.send_sms('***(验证码)','*******(手机号)')

三、在项目中写发送手机验证码相关代码:

1.前端相关代码:

<!--发送按钮倒计时代码-->
<script type="text/javascript">
var countdown=60;
function settime(obj) {
    if (countdown == 0) {
        obj.removeAttribute("disabled");
        obj.value="免费获取验证码";
        countdown = 60;
        return;
    } else {
        obj.setAttribute("disabled", true);
        obj.value="重新发送(" + countdown + ")";
        countdown--;
    }
setTimeout(function() {
    settime(obj) }
    ,1000)
}

</script>


<!--手机号码输入框代码-->

<div class="form-group">
                    <label for="mobile" class="col-lg-2 col-sm-2 control-label">手机号码:</label>
                    <div class="col-lg-10">
                        <div class="input-group m-bot15">
                    <input type="text" class="form-control" id="mobile" name="mobile" placeholder="手机号码">
                    <span class="input-group-btn">
                         <input type="button" id="forcode" onclick="settime(this)" value="免费获取验证码" class="btn btn-success">
                    </span>
                        </div>
                    <p class="help-block">请填写绑定手机号</p>
                    </div>
                </div>


<!--向后台通过ajax发送手机号码数据-->
<script>
    $('#forcode').click(function () {
        $.ajax({
            cache:false,
            type:"POST",
            url:"{% url 'users:forcode' %}",
            data:{
               csrfmiddlewaretoken:$('[name="csrfmiddlewaretoken"]').val(),
               mobile:$("#mobile").val()
            },
            async:true,
            success:function (data) {
                alert(data)
            }
        })
    })
</script>

效果图:

2.在users/views.py中写发送验证码相关代码:

import re
import random
from xyw.settings import APIKEY
from .models import VerifyCode


class ForCodeView(View):
    """获取手机验证码"""
    def post(self,request):
        mobile=request.POST.get('mobile','')
        if mobile:
            #验证是否为有效手机号
            mobile_pat=re.compile('^(13\d|14[5|7]|15\d|166|17\d|18\d)\d{8}$')
            res=re.search(mobile_pat,mobile)
            if res:
                #生成手机验证码
                code=VerifyCode()
                code.mobile=mobile
                c=random.randint(1000,9999)
                code.code=str(c)
                code.save()
                code=VerifyCode.objects.filter(mobile=mobile).first().code
                yunpian=YunPian(APIKEY)
                sms_status=yunpian.send_sms(code=code,mobile=mobile)
                msg=sms_status.msg
                return HttpResponse(msg)
            else:
                msg='请输入有效手机号码!'
                return HttpResponse(msg)
        else:
            msg='手机号不能为空!'
            return HttpResponse(msg)

3.在users/urls.py中:

from .views import ForCodeView
......

urlpatterns = [

    ......
    path('forcode/',ForCodeView.as_view(),name='forcode'),
]

4.在settings.py中增加代码:

#云片网apikey
APIKEY=‘你云片网的apikey’

至此,完成了发送手机验证码功能。

其实也有可以优化的地方:

1.虽然前端设置了60秒才可以重新发送,但是这个验证在后端也应该有,以防被有心人利用。

2.没有验证手机号码是否已经被发送过验证码

3.验证码没有生命周期,应该各一段时间让验证码失效

 我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=h8mmoufw70zz

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏前端笔记

【HTTP2.0 协议】就“腾讯云 CDN 针对 HTTP 2.0全面公测”浅谈如何启用 HTTP 2.0协议?

HTTPS 是指超文本传输安全协议(Hypertext Transfer Protocol Secure),是一种在 HTTP 协议基础上进行传输加密的安全协...

5999
来自专栏张戈的专栏

CCKiller:Linux 轻量级 CC 攻击防御工具

很久以前分享过一个CC攻击的防御脚本,写得不怎么样,不过被51CTO意外转载了。博客从此走上了经常被人拿来练手的不归之路。当然,还是有不少朋友在生产环境使用,并...

1.6K0
来自专栏WindCoder

JSON Web Token(JWT)教程:一个基于Laravel和AngularJS的例子

这是一篇介绍JSON Web Token(JWT)的文章,虽然可能用到的例子和Laravel和AngularJS有关,但知道了原理便能写出适用于自己的。同时,由...

3951
来自专栏码神联盟

http和https是什么?有什么区别?

HTTPS是什么意思? HTTPS全称为Hypertext Transfer Protocol over Secure Socket Layer,中文含义为“超...

3485
来自专栏FreeBuf

如何在macOS上监听单个应用HTTPS流量

写在前面的话 如果你准备对网络协议进行逆向分析或进行任何与网络安全有关的活动时,可能是为了了解协议运行机制,也有可能是为了查找敏感信息,你或多或少都需要收集一定...

2615
来自专栏魏艾斯博客www.vpsss.net

腾讯云服务器创建 SSH 密钥及如何使用 提高 SSH 连接安全性

腾讯云服务器内置创建 SSH 密钥功能,创建并使用之后就是有密钥才能使用 SSH 连接服务器,相对于几位数的登陆密码来说,2048 位密钥显然更安全。本文是阿里...

3667
来自专栏琦小虾的Binary

Ubuntu 14.04 LTS 下安装Adobe Flash Player

Ubuntu 14.04 LTS 下安装Adobe Flash Player 一、安装FireFox浏览器的Adobe Flash Player插件 直接在Ub...

2246
来自专栏云端架构

【云端架构】常见电脑开放端口及含义

说明:通常用于分析操作系统。这一方法能够工作是因为在一些系统中“0”是无效端口,当你试图使用通常的闭合端口连接它时将产生不同的结果。一种典型的扫描,使用IP地址...

6107
来自专栏ThoughtWorks

如果有10000台机器,你想怎么玩?(二)高可用 | TW洞见

今日洞见 文章作者/配图来自ThoughtWorks:高清华。 本文所有内容,包括文字、图片和音视频资料,版权均属ThoughtWorks公司所有,任何媒体、网...

36514
来自专栏刺客博客

利用SSL For Free 申请泛解析免费证书

5112

扫码关注云+社区

领取腾讯云代金券