""" 腾讯云短信服务 """ import random import string from typing import Optional from tencentcloud.common import credential from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException from tencentcloud.sms.v20210111 import sms_client, models from app.config import get_settings from app.utils.logger import logger class SMSService: """腾讯云短信服务类""" def __init__(self): """初始化短信服务""" settings = get_settings() self.app_id = settings.tencent_sms_app_id self.secret_id = settings.tencent_sms_secret_id self.secret_key = settings.tencent_sms_secret_key self.sign_id = settings.tencent_sms_sign_id self.template_id = settings.tencent_sms_template_id # 初始化客户端 try: # 使用密钥认证 cred = credential.Credential(self.secret_id, self.secret_key) self.client = sms_client.SmsClient(cred, "ap-guangzhou") logger.info("腾讯云短信服务初始化成功") except Exception as e: logger.error(f"腾讯云短信服务初始化失败: {e}") self.client = None def generate_code(self, length: int = 6) -> str: """ 生成验证码 Args: length: 验证码长度,默认6位 Returns: 验证码字符串 """ return ''.join(random.choices(string.digits, k=length)) async def send_code(self, phone: str, code: str) -> bool: """ 发送验证码短信 Args: phone: 手机号 code: 验证码 Returns: 是否发送成功 """ if not self.client: logger.error("短信客户端未初始化") return False if not self.template_id: logger.warning("短信模板ID未配置,跳过发送(开发模式)") logger.info(f"【开发模式】验证码: {code} (手机号: {phone})") return True try: req = models.SendSmsRequest() req.SmsSdkAppId = self.app_id req.SignName = "成都爱嘉辰科技" req.TemplateId = self.template_id req.TemplateParamSet = [code] # 只传递验证码参数 req.PhoneNumberSet = [f"+86{phone}"] resp = self.client.SendSms(req) # 检查发送结果 if resp.SendStatusSet and len(resp.SendStatusSet) > 0: status = resp.SendStatusSet[0] if status.Code == "Ok": logger.info(f"短信发送成功: {phone}") return True else: logger.error(f"短信发送失败: {status.Code} - {status.Message}") return False else: logger.error("短信发送失败: 无响应状态") return False except TencentCloudSDKException as e: logger.error(f"腾讯云SDK异常: {e}") return False except Exception as e: logger.error(f"发送短信异常: {e}") return False # 创建全局实例 sms_service = SMSService()