ai_admin/WebAdmin/aliyun_sms.py
2024-09-20 04:29:09 +00:00

64 lines
2.6 KiB
Python
Executable File

# -*- coding: utf-8 -*-
import os
import json
import hashlib
import hmac
import time
from datetime import datetime, timedelta
from alibabacloud_dysmsapi20170525.client import Client as Dysmsapi20170525Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_dysmsapi20170525 import models as dysmsapi_20170525_models
from alibabacloud_tea_util import models as util_models
from alibabacloud_tea_util.client import Client as UtilClient
from django.utils.crypto import get_random_string
from WebSite import settings
from .models import SMSVerificationCode
def create_client() -> Dysmsapi20170525Client:
config = open_api_models.Config(
access_key_id=settings.ALIBABA_CLOUD_ACCESS_KEY_ID,
access_key_secret=settings.ALIBABA_CLOUD_ACCESS_KEY_SECRET
)
config.endpoint = 'dysmsapi.aliyuncs.com'
return Dysmsapi20170525Client(config)
def send_verification_sms(phone_number: str, sign_name: str, template_code: str) -> dict:
client = create_client()
code = get_random_string(length=6, allowed_chars='0123456789')
template_param = json.dumps({"code": code})
send_sms_request = dysmsapi_20170525_models.SendSmsRequest(
phone_numbers=phone_number,
sign_name=sign_name,
template_code=template_code,
template_param=template_param
)
runtime = util_models.RuntimeOptions()
try:
response = client.send_sms_with_options(send_sms_request, runtime)
response_data = response.body.to_map()
if response_data.get("Code") == "OK":
SMSVerificationCode.objects.create(phone_number=phone_number, code=code, created_at=datetime.now())
return {'code': 200, 'message': '验证码发送成功'}
else:
return {'code': 400, 'message': f'发送短信失败: {response_data.get("Message")}'}
except Exception as error:
return {'code': 500, 'message': f'发送短信异常: {str(error)}'}
def verify_sms_code(phone_number: str, code: str) -> dict:
try:
sms_code = SMSVerificationCode.objects.filter(phone_number=phone_number, code=code, is_used=False).latest('created_at')
if sms_code is None:
return {'code': 400, 'message': '请先获取验证码'}
if sms_code.created_at < datetime.now() - timedelta(minutes=5):
return {'code': 400, 'message': '验证码已过期'}
sms_code.is_used = True
sms_code.save()
return {'code': 200, 'message': '验证码验证成功'}
except SMSVerificationCode.DoesNotExist:
return {'code': 400, 'message': '验证码无效或已过期'}