完整电商项目--(三)验证码操作(2):短信验证码

短信验证码

操作流程

  • 首先django是不能实现 发送短信验证码的,所以我们要 借助第三方 操作短信验证码。
  • 这里选择 容联云通讯短信平台 实现第三方的 发送短信验证码码

容联云通讯短信平台网址

先来说下整个业务流程

  • (1) 浏览器请求后端 获取短信验证码
  • (2) 后端验证通过(我们这里的验证就是,必须它输入上节中讲的,正确的图像验证码),后端开始生成随机的 六位验证码, 并将短信验证码,保存进redis。 还是存储为 string类型, key 就是用户的手机号(前端传递),值就是这个验证码
  • (3)通过调用 第三方平台发送短息验证码给用户
  • 这就是业务逻辑,同样验证就不说了,读取redis然后和 前端传递的数据进行对比验证,响应。

容联云通讯短信平台的使用及对接流程

  • 其实这一部分是最重要的,因为一个好的平台为了让我们去使用他的功能,一定会想尽办法写出 详细的对接 文档。 这正是锻炼了我们 对接心新事物的 处理能力,以及阅读文档的能力。

  • (1)首先点击上面的链接,注册用户,进入首页:可以看到开发者的主账号
    在这里插入图片描述

  • 点击下方的短信:
    在这里插入图片描述
    便会出现我们想要的接入的文档教程

  • (3)点击免费测试指南:因为我们是学习使用,所以使用测试即可()测试账号不花钱~ 真的业务账号,每条短信要收费在这里插入图片描述

  • (4)接着点击短信业务接口:(这个就是 我们接入 这个平台的接口介绍说明,细心是可以看懂的)
    在这里插入图片描述
    我们看到他会对接口进行说明。以及必要的参数。

  • 我们可以阅读了解。但是这不是我们重点关心的。因为我们不回去直接使用这些接口内部的 地址链接啥的。 第三方为了方便用户使用,当然是封装好了 响应的python代码 包。我们直接调用它,并不用细节的去关心内部的实现了~ (不过我我当时是看完了这个文档,可以理解下别人的业务编写逻辑,以及业务规范)

  • (5)找到DEMO实例,我们需要关心这个
    在这里插入图片描述
    文章首页便有这个下载:
    在这里插入图片描述
    对应各个版本:
    在这里插入图片描述

  • (6)我们就下载下来这个DEMO实例,然后关心这几个才是发送短信验证码的关键参数:
    在这里插入图片描述
    整个例子的代码:

 编码说明:coding=utf-8或gbk
 from CCPRestSDK import REST
 import ConfigParser
 
 accountSid= '您的主账号'; 
 #说明:主账号,登陆云通讯网站后,可在控制台首页中看到开发者主账号ACCOUNT SID。
 
 accountToken= '您的主账号Token'; 
 #说明:主账号Token,登陆云通讯网站后,可在控制台首页中看到开发者主账号AUTH TOKEN。
 
 appId='您的应用ID'; 
 #请使用管理控制台中已创建应用的APPID。
 
 serverIP='app.cloopen.com';
 #说明:请求地址,生产环境配置成app.cloopen.com。
 
 serverPort='8883'; 
 #说明:请求端口 ,生产环境为8883.
 
 softVersion='2013-12-26'; #说明:REST API版本号保持不变。 
 
 # 这个就是自己定义的,用来发送短信验证码的 函数了
 def sendTemplateSMS(to,datas,tempId): 
    #初始化REST SDK
    rest = REST(serverIP,serverPort,softVersion) 
    rest.setAccount(accountSid,accountToken) 
    rest.setAppId(appId)
 	
 	# 调用REST父类中定义好的,发送函数
    result = rest.sendTemplateSMS(to,datas,tempId) 
    for k,v in result.iteritems():
        if k=='templateSMS' : 
                for k,s in v.iteritems():
                    print '%s:%s' % (k, s) 
        else: 
            print '%s:%s' % (k, v) 
 
 可参考demo中的接口调用文件:SendTemplateSMS.py。
  • 他提示我们参考SendTemplateSMS.py,那么我们就去看看,源代码是如何实现的。
    在这里插入图片描述
    开头引入的这个 库,当然就是用来请求我们 上面 看到的短信业务接口啦。
    在这里插入图片描述
    接着就是初始化的相关信息。

往下找就是关键的发送函数了!:

    # 发送模板短信
    # @param to  必选参数     短信接收彿手机号码集合,用英文逗号分开
    # @param datas 可选参数    内容数据
    # @param tempId 必选参数    模板Id
    def sendTemplateSMS(self, to, datas, tempId):

        self.accAuth()
        nowdate = datetime.datetime.now()
        self.Batch = nowdate.strftime("%Y%m%d%H%M%S")
        # 生成sig
        signature = self.AccountSid + self.AccountToken + self.Batch
        sig = md5(signature.encode()).hexdigest().upper()
        # 拼接URL
        url = "https://" + self.ServerIP + ":" + self.ServerPort + "/" + self.SoftVersion + "/Accounts/" + self.AccountSid + "/SMS/TemplateSMS?sig=" + sig
        # 生成auth
        src = self.AccountSid + ":" + self.Batch
        # auth = base64.encodestring(src).strip()
        auth = base64.encodebytes(src.encode()).decode().strip()
        req = urllib2.Request(url)
        self.setHttpHeader(req)
        req.add_header("Authorization", auth)
        # 创建包体
        b = ''
        for a in datas:
            b += '<data>%s</data>' % (a)

        body = '<?xml version="1.0" encoding="utf-8"?><SubAccount><datas>' + b + '</datas><to>%s</to><templateId>%s</templateId><appId>%s</appId>\
            </SubAccount>\
            ' % (to, tempId, self.AppId)
        if self.BodyType == 'json':
            # if this model is Json ..then do next code
            b = '['
            for a in datas:
                b += '"%s",' % (a)
            b += ']'
            body = '''{"to": "%s", "datas": %s, "templateId": "%s", "appId": "%s"}''' % (to, b, tempId, self.AppId)
        req.data = body.encode()
        data = ''
        try:
            res = urllib2.urlopen(req)
            data = res.read()
            res.close()

            if self.BodyType == 'json':
                # json格式
                locations = json.loads(data)
            else:
                # xml格式
                xtj = xmltojson()
                locations = xtj.main(data)
            if self.Iflog:
                self.log(url, body, data)
            return locations
        except Exception as error:
            if self.Iflog:
                self.log(url, body, data)
            return {'172001': '网络错误'}

    # 外呼通知
    # @param to 必选参数    被叫号码
    # @param mediaName 可选参数    语音文件名称,格式 wav。与mediaTxt不能同时为空。当不为空时mediaTxt属性失效。
    # @param mediaTxt 可选参数    文本内容
    # @param displayNum 可选参数    显示的主叫号码
    # @param playTimes 可选参数    循环播放次数,1-3次,默认播放1次。
    # @param respUrl 可选参数    外呼通知状态通知回调地址,云通讯平台将向该Url地址发送呼叫结果通知。
    # @param userData 可选参数    用户私有数据
    # @param maxCallTime 可选参数    最大通话时长
    # @param speed 可选参数    发音速度
    # @param volume 可选参数    音量
    # @param pitch 可选参数    音调
    # @param bgsound 可选参数    背景音编号

代码整体上不算难,写法上比我好~哈哈。 仔细看,每一步都是可以看懂的!

  • 里面的拼接 url ,正是我们看到在 短信接口文档里 看到的 url!
  • 我们再次看到那个文档
    在这里插入图片描述
    json格式下的表示,这个给我们返回了很多的信息! 只需要重点关心第一个状态码:000000 表示响应成功~

到这里就差不多结束啦~ 我们已经可以发送短信验证码了,但是观察,里面有几个初始化参数我们不知道?? 只需要查看一下, 创建一个应用就可以了!
在这里插入图片描述

到这里就结束了~ 不过还有一些优化要做。 比如单单这个例子,用一个简单的 函数实现发送验证码,并不能满足 正式的企业需要。 所以我们下一节补充:

通过调用 sendTemplateSMS(self, to, datas, tempId) 短信发送函数,自己写一个 发送短信的类,提升性能。 具体会 使用到:单例模式

我们在充分理解的情况下,就应该有能力做到灵活运用这个 接口函数, 去实现自己的小需求,毕竟 DEMO中的 代码只有短短的 40行。

over!

补充:
在这里插入图片描述
东西总是进步的,这个模块处理直接 pip 安装即可! 方便快捷啊~ 比传统的方面很多。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值