django项目之集成短信验证注册
一、本人使用得是容联云通信:
https://doc.yuntongxun.com/p/5a533e0c3b8496dd00dce08c
二、查看官方使用文档:
1、下载短信得SDK压缩包,然后将压缩包中得SDK目录放入项目中得第三方组件得目录中,此时我的目录为:
/xiangmu/xiangmuapi/libs/sms/yuntongxun/sdk/
2、官方文档是python2.7得demo,对照着demo改写为python3
编码说明: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版本号保持不变。
以上得配置项,可以放在常量文件,或者是配置文件dev.py中,我的放在dev.py, 如下:
SMS = { "accountSid": "8aaf07086e0115bb016ea14165ca5eff", "accountToken": "af3d92b841c7498c9f6fb66b2b594fea", "appId": "8aaf07086e0115bb016ea141661d5f05", "serverIP": "sandboxapp.cloopen.com", "serverPort": "8883", "softVersion": '2013-12-26' }
3、然后再sdk文件中将发送短信得方法改写为python3,:
如下文件名为sms.py ,所在路径为
/xiangmu/xiangmuapi/libs/sms/yuntongxun/sdk/sms.py
# -*- coding:utf-8 -*- from .CCPRestSDK import REST from django.conf import settings accountSid = settings.SMS["accountSid"] # 说明:主账号,登陆云通讯网站后,可在控制台首页中看到开发者主账号ACCOUNT SID。 accountToken = settings.SMS["accountToken"] # 说明:主账号Token,登陆云通讯网站后,可在控制台首页中看到开发者主账号AUTH TOKEN。 appId = settings.SMS["appId"] # 请使用管理控制台中已创建应用的APPID。 serverIP = settings.SMS["serverIP"] # 说明:请求地址,生产环境配置成app.cloopen.com。 serverPort = settings.SMS["serverPort"] # 说明:请求端口 ,生产环境为8883. softVersion = settings.SMS["softVersion"] def sendTemplateSMS(to, datas, tempId): # 初始化REST SDK rest = REST(serverIP, serverPort, softVersion) rest.setAccount(accountSid, accountToken) rest.setAppId(appId) result = rest.sendTemplateSMS(to, datas, tempId) # {'statusCode': '000000', #result 的结果 # 'templateSMS': {'smsMessageSid': '23e68c7b54484b938c1fd7d77f6077ae', 'dateCreated': '20200107090615'}} if result.get("statusCode") == "000000": return 0 return -1
4、 然后再views视图文件中调用发送短信得接口:
此处,我为了方便后面进行短信验证,使用了redis存储,将短信验证码存为:
setex(sms_手机号码, 过期时间,验证码内容)
setex(mobile_手机号码, 短信冷却时间,-)
class SMSCodeAPIView(APIView): def get(self, request, mobile): """ 短信验证 :param request: :return: """ redis_conn = get_redis_connection("sms_code") ret = redis_conn.get("mobile_%s" % (mobile)) if ret: return Response({"message": "短信已发送,请留意您的手机短信,不要频繁点击!"}, status=status.HTTP_400_BAD_REQUEST) #生成短信验证码 sms_code = random.randint(0000, 999999) # 短信验证码内容 sms_time = constancs.SMS_EXPIRATION_TIME # 短信过期时间 # 使用redis提供的管道操作可以一次性执行多条redis命令 # 3. 使用事物保存短信验证码到redis pipe = redis_conn.pipeline() pipe.multi() pipe.setex("sms_%s" % (mobile), constancs.SMS_EXPIRATION_TIME, sms_code) pipe.setex("mobile_%s" % (mobile), constancs.SMS_INTERVAL_TIME, "-") pipe.execute() # 发送短信 ret = sendTemplateSMS(mobile, [sms_code, sms_time//60], constancs.SMS_TEMPLATE_ID) if ret == 0: return Response({"message": "短信发送成功"}, status=status.HTTP_200_OK) return Response({"message": "短信发送失败"}, status=status.HTTP_502_BAD_GATEWAY)
5、为发送短信验证码,注册一个路由:
urlpatterns = [ ... re_path('sms/(?P<mobile>1[3-9]\d{9})/', views.SMSCodeAPIView.as_view()), ]
6、前端调用/sms/手机号码/接口即可
世间安得双全法,不负如来不负卿