| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- import json
- import logging
- from datetime import datetime
- from typing import Dict, Optional
- 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 alien_gateway.config import settings
- logger = logging.getLogger(__name__)
- def _create_client():
- access_key_id = getattr(settings, "ALIYUN_ACCESS_KEY_ID", None)
- access_key_secret = getattr(settings, "ALIYUN_ACCESS_KEY_SECRET", None)
- if not access_key_id or not access_key_secret:
- raise ValueError("请设置 ALIYUN_ACCESS_KEY_ID 和 ALIYUN_ACCESS_KEY_SECRET")
- config = open_api_models.Config(
- access_key_id=access_key_id,
- access_key_secret=access_key_secret,
- )
- config.endpoint = "dysmsapi.aliyuncs.com"
- from alibabacloud_dysmsapi20170525.client import Client as Dysmsapi20170525Client
- return Dysmsapi20170525Client(config)
- def query_send_status(phone: str, biz_id: str, send_date: Optional[str] = None) -> None:
- if not phone or not biz_id:
- logger.warning("短信查询失败:phone 或 biz_id 为空")
- return
- if not send_date:
- send_date = datetime.now().strftime("%Y%m%d")
- try:
- client = _create_client()
- query_request = dysmsapi_20170525_models.QuerySendDetailsRequest(
- phone_number=phone,
- biz_id=biz_id,
- send_date=send_date,
- page_size=10,
- current_page=1,
- )
- resp = client.query_send_details_with_options(query_request, util_models.RuntimeOptions())
- # logger.info(
- # "短信查询响应 phone=%s code=%s message=%s total_count=%s",
- # phone,
- # getattr(resp.body, "code", None),
- # getattr(resp.body, "message", None),
- # getattr(resp.body, "total_count", None),
- # )
- # logger.info("短信查询详情 %s", getattr(resp.body, "sms_send_detail_dto_list", None))
- except Exception as e:
- logger.error(f"短信查询失败 phone={phone}: {e}", exc_info=True)
- def send_sms(phone: str, template_param: Dict[str, object], sign_name: str, template_code: str) -> None:
- if not phone:
- logger.warning("短信发送失败:联系电话为空")
- return
- sign_name = sign_name
- template_code = template_code
- if not sign_name or not template_code:
- logger.error("短信配置缺失:请设置 ALIYUN_SMS_SIGN_NAME_CONTRACT/ALIYUN_SMS_TEMPLATE_CODE_CONTRACT")
- return
- try:
- client = _create_client()
- send_sms_request = dysmsapi_20170525_models.SendSmsRequest(
- phone_numbers=phone,
- sign_name=sign_name,
- template_code=template_code,
- template_param=json.dumps(template_param, ensure_ascii=False),
- )
- resp = client.send_sms_with_options(send_sms_request, util_models.RuntimeOptions())
- logger.info(
- "商家入驻协议快到期提醒: 短信发送响应 phone=%s code=%s message=%s biz_id=%s request_id=%s",
- phone,
- getattr(resp.body, "code", None),
- getattr(resp.body, "message", None),
- getattr(resp.body, "biz_id", None),
- getattr(resp.body, "request_id", None),
- )
- if getattr(resp.body, "code", None) != "OK":
- logger.error(
- "短信发送失败 phone=%s code=%s message=%s",
- phone,
- getattr(resp.body, "code", None),
- getattr(resp.body, "message", None),
- )
- else:
- biz_id = getattr(resp.body, "biz_id", None)
- if biz_id:
- query_send_status(phone, biz_id)
- except Exception as e:
- logger.error(f"短信发送失败 phone={phone}: {e}", exc_info=True)
|