64 lines
2.6 KiB
Python
Executable File
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': '验证码无效或已过期'}
|