文章目录
- 短信验证码
- 操作流程
- 先来说下整个业务流程
- 容联云通讯短信平台的使用及对接流程
- 到这里就结束了~ 不过还有一些优化要做。 比如单单这个例子,用一个简单的 函数实现发送验证码,并不能满足 正式的企业需要。 所以我们下一节补充:
- 通过调用 sendTemplateSMS(self, to, datas, tempId) 短信发送函数,自己写一个 发送短信的类,提升性能。 具体会 使用到:单例模式
短信验证码
操作流程
- 首先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 安装即可! 方便快捷啊~ 比传统的方面很多。