首页 > 技术文章 > 短信验证接口

kai0118 2020-10-08 11:11 原文

 

  1. 注册容联云账号

  1. 使用容联云发送短信

# 安装容联云
pip install ronglian_sms_sdk

''' 短信发送代码 '''
#libs/rl_sms.py
from ronglian_sms_sdk import SmsSDK

accId = '上图ACCOUNT SID'
accToken = '上图AUTH TOKEN'
appId = '上图APPID'


def send_message(phone,datas):
   sdk = SmsSDK(accId,accToken, appId)
   tid = '1'   # 测试模板id为: 1. 内容为: 【云通讯】您的验证码是{1},请于{2}分钟内正确输 入。
   # mobile = '13303479527'
   # datas = ('666777', '5')
   # 模板中的参数按照位置传递
   resp = sdk.sendMessage(tid, phone, datas)
   return resp    
  1. 在视图函数中使用

# verifications/urls.py 中添加路由
urlpatterns = [
   path('sms_codes/', views.SmsCodeView.as_view()),
]

# 写视图函数
# verifications/views.py
from rest_framework.permissions import AllowAny
from rest_framework.views import APIView
from rest_framework.response import Response
import re
import random
from utils.rl_sms import send_message

class SmsCodeView(APIView):
   # 1.所有人可以访问
   permission_class = (AllowAny, )
   def post(self, request):
       # 1.获取参数
       phone = request.data.get('phone')
       image_code = request.data.get('image_code')
       image_code_uuid = request.data.get('image_code_uuid')

       # 2.检查参数
       if not all([phone, image_code, image_code_uuid]):
           return Response({"code":999, "msg":"参数不全"})
       if not re.match(r'^1[3456789]\d{9}$', phone):
           return Response({"code":999, "msg":"手机号码不正确"})
       
       # 3.检查是否发送
       redis_client = get_redis_connection('img_code')
       phone_exists = redis_client.get(phone)
       if phone_exists:
           return Response({"code":999, "msg":"发送频繁,请稍后再试"})
       
       redis_image_code = redis_client.get(image_code_uuid) #bytes
       if rediss_image_code:
           # bytes 转成 string
           redis_image_code = redis_image_code.decode()
           
       # 比较用户提供的图片内容是否和redis中保存的一致
       if image_code.upper() != redis_image_code:
           return Response({'code':999, 'msg':'图片验证码不正确'})
       
       # 4. 发送
       code = '%06d' % random.randint(0,999999)  # 随机6位验证码
       send_resp = send_message(phone, (code, "5"))
       
       # 5.1 保存code到redis中
       # redis_client.delete(image_code_uuid)
       
       # 5.2 从redis中删除这个图片验证码,以防再次使用
       # redis_client.delete(image_code_uuid)
       
       # 5.3使用pipeline 批量操作
       pl = redis_client.pipeling()
       pl.setex(phone, 60*5, code)
       pl.delete(image_code_uuid)
       pl.execute()
       
       # 6. 返回结果
       return Response({"code":0, "msg":"短信发送成功"})
       
       
       
       
       
       

 

 

推荐阅读