sms_client.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import json
  2. import logging
  3. from datetime import datetime
  4. from typing import Dict, Optional
  5. from alibabacloud_tea_openapi import models as open_api_models
  6. from alibabacloud_dysmsapi20170525 import models as dysmsapi_20170525_models
  7. from alibabacloud_tea_util import models as util_models
  8. from alien_gateway.config import settings
  9. logger = logging.getLogger(__name__)
  10. def _create_client():
  11. access_key_id = getattr(settings, "ALIYUN_ACCESS_KEY_ID", None)
  12. access_key_secret = getattr(settings, "ALIYUN_ACCESS_KEY_SECRET", None)
  13. if not access_key_id or not access_key_secret:
  14. raise ValueError("请设置 ALIYUN_ACCESS_KEY_ID 和 ALIYUN_ACCESS_KEY_SECRET")
  15. config = open_api_models.Config(
  16. access_key_id=access_key_id,
  17. access_key_secret=access_key_secret,
  18. )
  19. config.endpoint = "dysmsapi.aliyuncs.com"
  20. from alibabacloud_dysmsapi20170525.client import Client as Dysmsapi20170525Client
  21. return Dysmsapi20170525Client(config)
  22. def query_send_status(phone: str, biz_id: str, send_date: Optional[str] = None) -> None:
  23. if not phone or not biz_id:
  24. logger.warning("短信查询失败:phone 或 biz_id 为空")
  25. return
  26. if not send_date:
  27. send_date = datetime.now().strftime("%Y%m%d")
  28. try:
  29. client = _create_client()
  30. query_request = dysmsapi_20170525_models.QuerySendDetailsRequest(
  31. phone_number=phone,
  32. biz_id=biz_id,
  33. send_date=send_date,
  34. page_size=10,
  35. current_page=1,
  36. )
  37. resp = client.query_send_details_with_options(query_request, util_models.RuntimeOptions())
  38. # logger.info(
  39. # "短信查询响应 phone=%s code=%s message=%s total_count=%s",
  40. # phone,
  41. # getattr(resp.body, "code", None),
  42. # getattr(resp.body, "message", None),
  43. # getattr(resp.body, "total_count", None),
  44. # )
  45. # logger.info("短信查询详情 %s", getattr(resp.body, "sms_send_detail_dto_list", None))
  46. except Exception as e:
  47. logger.error(f"短信查询失败 phone={phone}: {e}", exc_info=True)
  48. def send_sms(phone: str, template_param: Dict[str, object], sign_name: str, template_code: str) -> None:
  49. if not phone:
  50. logger.warning("短信发送失败:联系电话为空")
  51. return
  52. sign_name = sign_name
  53. template_code = template_code
  54. if not sign_name or not template_code:
  55. logger.error("短信配置缺失:请设置 ALIYUN_SMS_SIGN_NAME_CONTRACT/ALIYUN_SMS_TEMPLATE_CODE_CONTRACT")
  56. return
  57. try:
  58. client = _create_client()
  59. send_sms_request = dysmsapi_20170525_models.SendSmsRequest(
  60. phone_numbers=phone,
  61. sign_name=sign_name,
  62. template_code=template_code,
  63. template_param=json.dumps(template_param, ensure_ascii=False),
  64. )
  65. resp = client.send_sms_with_options(send_sms_request, util_models.RuntimeOptions())
  66. logger.info(
  67. "商家入驻协议快到期提醒: 短信发送响应 phone=%s code=%s message=%s biz_id=%s request_id=%s",
  68. phone,
  69. getattr(resp.body, "code", None),
  70. getattr(resp.body, "message", None),
  71. getattr(resp.body, "biz_id", None),
  72. getattr(resp.body, "request_id", None),
  73. )
  74. if getattr(resp.body, "code", None) != "OK":
  75. logger.error(
  76. "短信发送失败 phone=%s code=%s message=%s",
  77. phone,
  78. getattr(resp.body, "code", None),
  79. getattr(resp.body, "message", None),
  80. )
  81. else:
  82. biz_id = getattr(resp.body, "biz_id", None)
  83. if biz_id:
  84. query_send_status(phone, biz_id)
  85. except Exception as e:
  86. logger.error(f"短信发送失败 phone={phone}: {e}", exc_info=True)