短信发送接口
短信验证码 | 实战教程Django一、第三方接口容联云沙箱环境在调用接口前需要先完成容联云账号的注册、应用创建和核心配置获取步骤简单且全程免费新账号有免费短信额度。沙箱环境只能用来测试需注册应用绑定手机号。1. 注册并登录容联云官网访问 容联云通讯官网完成注册个人/企业均可登录后进入控制台。2. 核心参数获取注册应用拿到应用中的APP-ID、APP-TOKEN查看主账号拿到Account SID、Auth Token3. 申请短信模板由于沙箱环境我们只能应用模板1等会传参数要用到。二、环境准备安装容联云官方SDK容联云提供了Python官方SDK无需我们手写复杂的HTTP请求、签名验证逻辑直接安装即可使用。打开终端执行以下命令安装SDKpipinstallronglian_sms_sdk安装完成后即可在Python代码中导入并使用。三、Django配置文件配置我们不再使用环境变量管理配置而是将容联云核心配置写入Django项目的settings.py文件统一管理、便于维护配置步骤如下# 在Django项目的 settings.py 末尾添加以下配置# 容联云官方SDK配置RL_SMS_CONFIG{accId:你的Account SID,# 替换为你的容联云Account SIDaccToken:你的Auth Token,# 替换为你的容联云Auth TokenappId:你的App ID,# 替换为你的容联云App IDtid:1# 短信模板ID沙箱环境默认1正式环境需审核}四、接口封装将封装完的云通讯接口放在utils文件下。#相关模块导包 import json from ronglian_sms_sdk import SmsSDK from django.conf import settings # 初始化日志 logger logging.getLogger(django) class RLSMS(object): 基于容联云官方SDK的短信发送工具类单例模式 _instance None def __new__(cls, *args, **kwargs): if not cls._instance: # 从配置文件读取参数初始化SDK cls._instance super().__new__(cls) cls._instance.sdk SmsSDK( accIdsettings.RL_SMS_CONFIG[accId], accTokensettings.RL_SMS_CONFIG[accToken], appIdsettings.RL_SMS_CONFIG[appId] ) return cls._instance def send_template_sms(self, mobile, datas, tidNone): 发送模板短信 :param mobile: 手机号单个号码字符串 :param datas: 模板变量元组格式如 (123456, 5) :param tid: 模板ID默认使用配置文件中的值 :return: dict - 发送结果 try: # 使用传入的模板ID或默认模板ID template_id tid or settings.RL_SMS_CONFIG[tid] # 调用官方SDK发送短信 resp_str self.sdk.sendMessage( tidtemplate_id, mobilemobile, datasdatas ) # 将JSON字符串转为字典 resp json.loads(resp_str) # 日志记录 if resp.get(statusCode) 000000: logger.info(f手机号 {mobile} 短信发送成功SID{resp[templateSMS][smsMessageSid]}) else: logger.error(f手机号 {mobile} 短信发送失败错误码{resp.get(statusCode)}) return resp except Exception as e: logger.error(f手机号 {mobile} 短信发送异常{str(e)}) # 返回统一的异常格式 return {statusCode: 172001, statusMsg: f发送异常{str(e)}} # 测试代码 if __name__ __main__: # 测试发送替换为你的测试手机号 sms RLSMS() result sms.send_template_sms(13231876312, (1234, 5)) print(result)五、接口调用1.url层from django.urls import re_path from .import views urlpatterns [ #正则来校验手机号格式 re_path(r^sms_codes/(?Pmobile1[3-9]\d{9})/$, views.SMSCodeView.as_view()), ]2.视图层对于验证码这种带有过期时间高频访问的临时数据我们存放到redis中。from django.shortcuts import render from rest_framework import status from rest_framework.views import APIView from random import randint from django_redis import get_redis_connection from rest_framework.response import Response from .import constants import logging # 导入最新的容联云官方SDK工具类 from celery_tasks.sms.tasks import send_sms_code from meiduo_mall.libs.yuntongxun.rl_sms_sdk import RLSMS SMS_CODE_REDIS_EXPIRES 300 #存到redis的验证码300s内有效 SEND_SMS_CODE_INTERVAL 60 #手机号标记 60s有效 # 初始化日志 logger logging.getLogger(django) class SMSCodeView(APIView): 短信验证码接口适配容联云沙箱4位验证码 def get(self, request, mobile): # 1. 生成4位数字验证码沙箱模板要求1-4位默认用4位 sms_code %04d % randint(0, 9999) # 关键修改4位 logger.info(f手机号{mobile}的验证码{sms_code}) # 2. 创建redis连接对象 redis_conn get_redis_connection(verify_codes) # 3. 先从redis获取发送标记 send_flag redis_conn.get(send_flag_%s % mobile) # 4. 取到标记该手机号频繁发送短信 if send_flag: return Response({message:请勿频繁发送短信},statusstatus.HTTP_400_BAD_REQUEST) # 4. 创建redis管道把多次redis操作装入管道之后一次性执行所有减少redis连接操作 pl redis_conn.pipeline() # 5. 把验证码存储到redis数据库5分钟有效期 # redis_conn.setex(sms_%s % mobile, 300, sms_code) pl.setex(sms_%s % mobile, constants.SMS_CODE_REDIS_EXPIRES, sms_code) # 6.存储一个标记表示此手机号已经发送过短信标记有效期60s pl.setex(send_flag_%s % mobile, constants.SEND_SMS_CODE_INTERVAL, 1) # 执行管道 pl.execute() # 7. 利用容联云官方SDK发送短信验证码datas保持元组格式 RLSMS().send_template_sms(mobile, (sms_code, constants.SMS_CODE_REDIS_EXPIRES//60), 1) # 5. 响应 return Response({message: ok})注意沙盒环境下我们只能发送5位数正规6位数会报错的。