"""短信 provider 共享基座:业务异常 + provider 无关的 mock 校验。 各 provider(jiguang / aliyun)都 `from .base import SmsError`,api 层也从包入口拿到同一个 `SmsError` —— 保证无论用哪个 provider,异常类型与 HTTP 码映射语义一致。 """ from __future__ import annotations from app.core.config import settings class SmsError(Exception): """业务异常。`status_code` 决定 api 层翻成哪个 HTTP 码: 过频/每日超限 = 429(客户端等会再来),供应商不可用 = 503,手机号无效 = 400。 """ def __init__(self, message: str, status_code: int = 429) -> None: super().__init__(message) self.status_code = status_code def mock_verify(code: str) -> bool: """mock 模式校验:放行任意 SMS_CODE_LENGTH 位数字(provider 无关,测试/开发便利,不真校验)。""" return len(code) == settings.SMS_CODE_LENGTH and code.isdigit()