更换成 腾讯短信服务

This commit is contained in:
aaron 2025-01-19 14:16:11 +08:00
parent c53e3903c4
commit d8e0666d8a
4 changed files with 37 additions and 35 deletions

View File

@ -8,9 +8,9 @@ import random
import string import string
import redis import redis
from app.core.config import settings from app.core.config import settings
from unisdk.sms import UniSMS from tencentcloud.common import credential
from unisdk.exception import UniException from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from datetime import timedelta from tencentcloud.sms.v20210111 import sms_client, models
from app.core.security import create_access_token, set_jwt_cookie, clear_jwt_cookie, get_password_hash, verify_password from app.core.security import create_access_token, set_jwt_cookie, clear_jwt_cookie, get_password_hash, verify_password
from app.core.response import success_response, error_response, ResponseModel from app.core.response import success_response, error_response, ResponseModel
from pydantic import BaseModel, Field from pydantic import BaseModel, Field
@ -31,8 +31,6 @@ redis_client = redis.Redis(
decode_responses=True decode_responses=True
) )
# 初始化短信客户端
client = UniSMS(settings.UNI_APP_ID)
@router.post("/send-code") @router.post("/send-code")
async def send_verify_code(request: VerifyCodeRequest): async def send_verify_code(request: VerifyCodeRequest):
@ -41,18 +39,28 @@ async def send_verify_code(request: VerifyCodeRequest):
code = ''.join(random.choices(string.digits, k=6)) code = ''.join(random.choices(string.digits, k=6))
try: try:
# 发送短信 # 实例化认证对象
res = client.send({ cred = credential.Credential(
"to": phone, settings.TENCENT_SECRET_ID,
"signature": settings.UNI_SMS_SIGN, settings.TENCENT_SECRET_KEY
"templateId": settings.UNI_SMS_TEMPLATE_ID, )
"templateData": {
"code": code
}
})
if res.code != "0": # 实例化短信客户端
return error_response(message=f"短信发送失败: {res.message}") client = sms_client.SmsClient(cred, "ap-guangzhou")
# 组装请求参数
req = models.SendSmsRequest()
req.SmsSdkAppId = settings.SMS_SDK_APP_ID
req.SignName = settings.SMS_SIGN_NAME
req.TemplateId = settings.SMS_TEMPLATE_ID
req.TemplateParamSet = [code]
req.PhoneNumberSet = [f"+86{phone}"]
# 发送短信
resp = client.SendSms(req)
if resp.SendStatusSet[0].Code != "Ok":
return error_response(message=f"短信发送失败: {resp.SendStatusSet[0].Message}")
# 存储验证码到 Redis # 存储验证码到 Redis
redis_client.setex( redis_client.setex(
@ -63,7 +71,7 @@ async def send_verify_code(request: VerifyCodeRequest):
return success_response(message="验证码已发送") return success_response(message="验证码已发送")
except UniException as e: except TencentCloudSDKException as e:
return error_response(message=f"发送验证码失败: {str(e)}") return error_response(message=f"发送验证码失败: {str(e)}")
@router.post("/login") @router.post("/login")

View File

@ -23,18 +23,6 @@ class Settings(BaseSettings):
REDIS_PASSWORD: str = "redis_rJRMHr" REDIS_PASSWORD: str = "redis_rJRMHr"
VERIFICATION_CODE_EXPIRE_SECONDS: int = 300 # 验证码5分钟后过期 VERIFICATION_CODE_EXPIRE_SECONDS: int = 300 # 验证码5分钟后过期
# 短信配置
UNI_APP_ID: str = "kFb5kA5EDXpnzUReadaRNpDTFf6rNmXEc45jwS2C1Mvh9Erj2"
UNI_SMS_TEMPLATE_ID: str = "pub_verif_basic" # 验证码短信模板ID
UNI_SMS_SIGN: str = "BAISIJI" # 短信签名
# MySQL配置
# MYSQL_HOST: str = "101.36.120.145"
# MYSQL_PORT: int = 3306
# MYSQL_USER: str = "root"
# MYSQL_PASSWORD: str = "mariadb_4rMwpT"
# MYSQL_DB: str = "deliveryman"
MYSQL_HOST: str = "gz-cynosdbmysql-grp-2j1cnopr.sql.tencentcdb.com" MYSQL_HOST: str = "gz-cynosdbmysql-grp-2j1cnopr.sql.tencentcdb.com"
MYSQL_PORT: int = 27469 MYSQL_PORT: int = 27469
MYSQL_USER: str = "root" MYSQL_USER: str = "root"
@ -46,9 +34,14 @@ class Settings(BaseSettings):
def SQLALCHEMY_DATABASE_URL(self) -> str: def SQLALCHEMY_DATABASE_URL(self) -> str:
return f"mysql+pymysql://{self.MYSQL_USER}:{self.MYSQL_PASSWORD}@{self.MYSQL_HOST}:{self.MYSQL_PORT}/{self.MYSQL_DB}?charset=utf8mb4" return f"mysql+pymysql://{self.MYSQL_USER}:{self.MYSQL_PASSWORD}@{self.MYSQL_HOST}:{self.MYSQL_PORT}/{self.MYSQL_DB}?charset=utf8mb4"
# 腾讯云短信配置
TENCENT_SECRET_ID: str = "AKIDxnbGj281iHtKallqqzvlV5YxBCrPltnS"
TENCENT_SECRET_KEY: str = "ta6PXTMBsX7dzA7IN6uYUFn8F9uTovoU"
SMS_SDK_APP_ID: str = "1400961527"
SMS_SIGN_NAME: str = "蜂快到家公众号"
SMS_TEMPLATE_ID: str = "2353143" # 验证码短信模板ID
# 腾讯云 COS 配置 # 腾讯云 COS 配置
COS_SECRET_ID: str = "AKIDxnbGj281iHtKallqqzvlV5YxBCrPltnS"
COS_SECRET_KEY: str = "ta6PXTMBsX7dzA7IN6uYUFn8F9uTovoU"
COS_REGION: str = "ap-chengdu" COS_REGION: str = "ap-chengdu"
COS_BUCKET: str = "dman-1311994147" COS_BUCKET: str = "dman-1311994147"
COS_BASE_URL: str = "dman-1311994147.cos.ap-chengdu.myqcloud.com" COS_BASE_URL: str = "dman-1311994147.cos.ap-chengdu.myqcloud.com"
@ -66,6 +59,8 @@ class Settings(BaseSettings):
WECHAT_API_V3_KEY: str = "your-api-v3-key" # API v3密钥 WECHAT_API_V3_KEY: str = "your-api-v3-key" # API v3密钥
WECHAT_PLATFORM_CERT_PATH: str = "app/core/wechat_platform_cert.pem" # 平台证书路径 WECHAT_PLATFORM_CERT_PATH: str = "app/core/wechat_platform_cert.pem" # 平台证书路径
class Config: class Config:
case_sensitive = True case_sensitive = True
env_file = ".env" env_file = ".env"

View File

@ -8,8 +8,8 @@ logging.basicConfig(level=logging.INFO, stream=sys.stdout)
cos_config = CosConfig( cos_config = CosConfig(
Region=settings.COS_REGION, Region=settings.COS_REGION,
SecretId=settings.COS_SECRET_ID, SecretId=settings.TENCENT_SECRET_ID,
SecretKey=settings.COS_SECRET_KEY SecretKey=settings.TENCENT_SECRET_KEY
) )
cos_client = CosS3Client(cos_config) cos_client = CosS3Client(cos_config)

View File

@ -9,8 +9,7 @@ sqlalchemy>=1.4.23
redis==5.0.1 redis==5.0.1
pymysql==1.1.0 pymysql==1.1.0
SQLAlchemy==2.0.27 SQLAlchemy==2.0.27
unisms tencentcloud-sdk-python==3.0.1035
cos-python-sdk-v5==1.9.25
bcrypt bcrypt
aiohttp==3.9.1 aiohttp==3.9.1
cryptography==42.0.2 cryptography==42.0.2