driver_aliyun.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package sms
  2. import (
  3. "encoding/json"
  4. aliyunsmsclient "github.com/KenmyZhang/aliyun-communicate"
  5. "github.com/runningwater/gohub/pkg/logger"
  6. )
  7. // Aliyun 阿里云短信驱动,实现 Driver 接口
  8. type Aliyun struct{}
  9. // Send 实现短信驱动接口,通过阿里云服务发送短信
  10. // 参数:
  11. //
  12. // phone : 接收方手机号码(格式:国际区号+手机号,示例:+8613711112222)
  13. // message : 短信消息体,包含模板ID和模板参数
  14. // config : 阿里云访问配置(需包含 access_key_id 和 access_key_secret)
  15. //
  16. // 返回值:
  17. //
  18. // bool : 发送成功返回 true,失败返回 false
  19. func (a *Aliyun) Send(phone string, message Message, config map[string]string) bool {
  20. const moduleName = "短信[阿里云]"
  21. smsClient := aliyunsmsclient.New("https://dysmsapi.aliyuncs.com/")
  22. templateParam, err := json.Marshal(message.Data)
  23. if err != nil {
  24. logger.ErrorString(moduleName, "解析模板参数失败", err.Error())
  25. return false
  26. }
  27. logger.DebugJSON(moduleName, "配置信息", config)
  28. // 调用阿里云短信服务API(参数顺序需与官方SDK保持一致)
  29. result, err := smsClient.Execute(
  30. config["access_key_id"], // 访问密钥ID
  31. config["access_key_secret"], // 访问密钥
  32. phone, // 接收手机号
  33. config["sign_name"], // 短信签名
  34. message.Template, // 模板ID
  35. string(templateParam), // JSON格式的模板参数
  36. )
  37. // 记录原始请求和响应(用于调试和审计)
  38. logger.DebugJSON(moduleName, "请求内容", smsClient.Request)
  39. logger.DebugJSON(moduleName, "接口响应", result)
  40. if err != nil {
  41. logger.ErrorString(moduleName, "发送失败", err.Error())
  42. return false
  43. }
  44. // 序列化服务端响应结果
  45. resultJson, err := json.Marshal(result)
  46. if err != nil {
  47. logger.ErrorString(moduleName, "解析接口响应 JSON 失败", err.Error())
  48. return false
  49. }
  50. // 根据官方SDK提供的方法判断是否成功
  51. if result.IsSuccessful() {
  52. logger.DebugString(moduleName, "发送成功", string(resultJson))
  53. return true
  54. } else {
  55. logger.ErrorString(moduleName, "发送失败, 服务商返回错误", string(resultJson))
  56. return false
  57. }
  58. }