|
@@ -0,0 +1,100 @@
|
|
|
|
|
+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)
|