driver_aliyun.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. package sms
  2. import (
  3. "encoding/json"
  4. "strings"
  5. openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
  6. dysmsapi20170525 "github.com/alibabacloud-go/dysmsapi-20170525/v5/client"
  7. util "github.com/alibabacloud-go/tea-utils/v2/service"
  8. "github.com/alibabacloud-go/tea/tea"
  9. credential "github.com/aliyun/credentials-go/credentials"
  10. "github.com/runningwater/gohub/pkg/config"
  11. "github.com/runningwater/gohub/pkg/logger"
  12. )
  13. type AliyunDriver struct {
  14. }
  15. // Send 实现短信驱动接口,通过阿里云服务发送短信
  16. // 参数:
  17. //
  18. // phone : 接收方手机号码(格式:国际区号+手机号,示例:+8613711112222)
  19. // message : 短信消息体,包含模板ID和模板参数
  20. // config : 阿里云访问配置(需包含 access_key_id 和 access_key_secret)
  21. //
  22. // 返回值:
  23. //
  24. // bool : 发送成功返回 true,失败返回 false
  25. func (a *AliyunDriver) Send(phone string, message Message, config map[string]string) bool {
  26. const moduleName = "短信[阿里云]"
  27. client, err := createClient()
  28. if err != nil {
  29. logger.ErrorString(moduleName, "创建阿里云客户端失败", err.Error())
  30. return false
  31. }
  32. templateParam, err := json.Marshal(message.Data)
  33. if err != nil {
  34. logger.ErrorString(moduleName, "解析模板参数失败", err.Error())
  35. return false
  36. }
  37. request := &dysmsapi20170525.SendSmsRequest{
  38. PhoneNumbers: tea.String(phone), // 接收手机号
  39. SignName: tea.String(config["sign_name"]), // 短信签名
  40. TemplateCode: tea.String(config["template_code"]), // 模板ID
  41. TemplateParam: tea.String(string(templateParam)), // JSON格式的模板参数
  42. }
  43. logger.DebugJSON(moduleName, "请求内容", request)
  44. response, _e := sendSms(client, request, &util.RuntimeOptions{})
  45. if _e != nil {
  46. logger.ErrorString(moduleName, "发送失败", _e.Error())
  47. var error = &tea.SDKError{}
  48. if _t, ok := _e.(*tea.SDKError); ok {
  49. error = _t
  50. } else {
  51. error.Message = tea.String(_e.Error())
  52. }
  53. // 错误消息
  54. if error.Message != nil {
  55. logger.DebugJSON(moduleName, "错误消息", tea.StringValue(error.Message))
  56. }
  57. // 诊断地址
  58. var data any
  59. d := json.NewDecoder(strings.NewReader(tea.StringValue(error.Data)))
  60. d.Decode(&data)
  61. if m, ok := data.(map[string]any); ok {
  62. recommend, _ := m["Recommend"]
  63. logger.DebugJSON(moduleName, "诊断地址", recommend)
  64. }
  65. return false
  66. }
  67. // 发送成功
  68. logger.DebugJSON(moduleName, "接口响应", response.Body)
  69. logger.DebugJSON(moduleName, "发送成功", "短信发送成功")
  70. return true
  71. }
  72. func createClient() (*dysmsapi20170525.Client, error) {
  73. credentials, err := credential.NewCredential(nil)
  74. if err != nil {
  75. return nil, err
  76. }
  77. config := &openapi.Config{
  78. Credential: credentials,
  79. Endpoint: tea.String("dysmsapi.aliyuncs.com"),
  80. AccessKeyId: tea.String(config.GetString("sms.aliyun.access_key_id")),
  81. AccessKeySecret: tea.String(config.GetString("sms.aliyun.access_key_secret")),
  82. }
  83. return dysmsapi20170525.NewClient(config)
  84. }
  85. func sendSms(client *dysmsapi20170525.Client,
  86. request *dysmsapi20170525.SendSmsRequest,
  87. runtime *util.RuntimeOptions) (_result *dysmsapi20170525.SendSmsResponse, _err error) {
  88. defer func() {
  89. if r := tea.Recover(recover()); r != nil {
  90. _err = r
  91. }
  92. }()
  93. return client.SendSmsWithOptions(request, runtime)
  94. }