36 lines
1.1 KiB
Python
36 lines
1.1 KiB
Python
import random
|
|
import string
|
|
import logging
|
|
from abc import ABC, abstractmethod
|
|
|
|
from django.conf import settings
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def generate_sms_code(length=6) -> str:
|
|
if getattr(settings, 'SMS_PROVIDER', 'mock') == 'mock':
|
|
return getattr(settings, 'SMS_MOCK_CODE', '123456')
|
|
return ''.join(random.choices(string.digits, k=length))
|
|
|
|
|
|
# ── 策略接口 ──────────────────────────────────────────────────────────────────
|
|
|
|
class SmsService(ABC):
|
|
@abstractmethod
|
|
def send_code(self, phone: str, scene: str, code: str) -> None:
|
|
"""发送验证码短信。失败时抛出 SmsError。"""
|
|
|
|
|
|
class SmsError(Exception):
|
|
pass
|
|
|
|
|
|
def get_sms_service() -> SmsService:
|
|
provider = getattr(settings, 'SMS_PROVIDER', 'mock')
|
|
if provider == 'aliyun':
|
|
from apps.user.utils.sms_aliyun import AliyunSmsService
|
|
return AliyunSmsService()
|
|
from apps.user.utils.sms_mock import MockSmsService
|
|
return MockSmsService()
|