django项目之集成短信验证注册

只谈情不闲聊 提交于 2020-01-07 12:48:48

一、本人使用得是容联云通信:

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/手机号码/接口即可

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!