开通阿里云短信服务
-
申请签名和模板
-
下载pythonSDK
pip install aliyun-python-sdk-core
-
设置AK和SK
封装发短信代码utils/BaseView.py
-
import json
-
from aliyunsdkcore.client import AcsClient
-
from aliyunsdkcore.request import CommonRequest
-
from syl.settings import ALY_ACCESSKEY_SECRET, ALY_ACCESSKEY_ID
-
# phone = ""
-
# phone_code = ""
-
# data = {"code": phone_code}
-
def send_sms(phone, data):
-
# accessKeyId
-
# accessSecret
-
# cn-hangzhou
-
client = AcsClient('<ALY_ACCESSKEY_SECRET>', '<ALY_ACCESSKEY_ID>', 'cn-hangzhou')
-
request = CommonRequest()
-
request.set_accept_format('json')
-
request.set_domain('dysmsapi.aliyuncs.com')
-
request.set_method('POST')
-
request.set_protocol_type('https') # https | http
-
request.set_version('2017-05-25')
-
request.set_action_name('SendSms')
-
request.add_query_param('RegionId', "cn-hangzhou")
-
request.add_query_param('PhoneNumbers', phone)
-
request.add_query_param('SignName', "美多商城")
-
request.add_query_param('TemplateCode', "SMS_185212884")
-
request.add_query_param('TemplateParam', data)
-
response1 = client.do_action(request)
-
# python2: print(response)
-
res=json.loads(str(response1, encoding='utf-8'))
-
短信发送和验证的逻辑
-
# verificationsapp/view.py 发送接口 #
-
#verificationsapp/VIEW.PY
-
class SendSMSCode(APIView):
-
def post(self, request):
-
# 获取数据
-
phone = request.data.get("phone")
-
image_code = request.data.get("image_code")
-
image_code_uuid = request.data.get("image_code_uuid")
-
print('=====================', phone, image_code_uuid, image_code)
-
# 验证数据
-
if not all([phone, image_code, image_code_uuid]):
-
return Response({"code": 4005, "msg": "参数不全"})
-
# 逻辑与入库
-
# 3、验证图片验证码是否正确
-
# 3.1连接redis
-
redis_cli = get_redis_connection("img_code")
-
# 3.2拿着uuid获取图片验证码
-
redis_img_code = redis_cli.get(image_code_uuid).decode('utf-8')
-
# 3.3比对redis里的code和发来的code是否一致
-
if image_code.lower() != redis_img_code.lower():
-
return Response({"code": 4009, "msg": "图片验证码错误"})
-
# 4、使用阿里云发送短信
-
# 4.1准备手机验证码
-
number = random.randint(100000, 999999)
-
data = {"code": number}
-
print(data)
-
# 4.2使用封装好的接口发送短信
-
send_sms(phone, data)
-
# 5.将短信验证码绑定并存入redis
-
redis_cli.setex(phone, 60 * 60, number)
-
# 6.删除image_code
-
redis_cli.delete(image_code_uuid)
-
return Response({"code": 0, "msg": "发送成功"})
后记
近期有很多朋友通过私信咨询有关Python学习问题。为便于交流,点击蓝色自己加入讨论解答资源基地