# -*- 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': '验证码无效或已过期'}