package api import ( "encoding/json" "fmt" "gitea.party/public-messag-service/common/params" "gitea.party/public-messag-service/common/public" "gitea.party/public-messag-service/internal/models/mysql" "gitea.party/public-messag-service/router/web" "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "github.com/aliyun/alibaba-cloud-sdk-go/services/dysmsapi" "github.com/gin-gonic/gin" "log" "time" ) func SmsXSend(c *gin.Context) { result := web.NewResponse() defer web.SendResponse(c, result)() pm := params.SmsSend{} err := c.ShouldBindJSON(&pm) if err != nil { result.SetErrCode(public.RespCodeErrorParam).AddError(err) return } client, err := dysmsapi.NewClientWithAccessKey(pm.RegionId, pm.AccessKeyId, pm.AccessKeySecret) if err != nil { log.Fatalf("Failed to initialize client: %v", err) } // 创建请求 request := requests.NewCommonRequest() request.Method = "POST" request.Scheme = "https" request.Domain = "dysmsapi.ap-southeast-1.aliyuncs.com" // 固定域名 request.Version = "2018-05-01" // API 版本 request.ApiName = "BatchSendMessageToGlobe" // 接口名称 // 设置请求参数 request.QueryParams["RegionId"] = "ap-southeast-1" // 国际短信固定参数 // 构造批量发送参数 type MessageParam struct { To string `json:"to"` From string `json:"from"` Message string `json:"message"` Type string `json:"type"` } // 定义多条短信参数 messages := make([]MessageParam, 0, len(pm.Phone)) messagesLogData := make([]map[string]interface{}, 0, len(pm.Phone)) for _, v := range pm.Phone { var item = MessageParam{ To: v, From: "Alicloud", // Sender ID(视国家要求,可能需注册) Message: pm.Content, Type: "OTP", // 短信类型 } messages = append(messages, item) messagesLogData = append(messagesLogData, map[string]interface{}{ "msg_type": 1, "to_phone_email": v, "msg_content": pm.Content, }) } // 将消息参数转换为 JSON messagesJSON, err := json.Marshal(messages) if err != nil { log.Fatalf("Failed to marshal messages: %v", err) } request.QueryParams["MessageParamList"] = string(messagesJSON) // 发送请求 res, err := client.ProcessCommonRequest(request) if err != nil { log.Fatalf("Failed to send request: %v", err) } for _, v := range messagesLogData { v["result_msg"], _ = json.Marshal(err) v["created_at"] = time.Now().Unix() } var msgModel mysql.MessageSendLog _, errMsg := msgModel.BatchCreate(messagesLogData) if errMsg == nil && res.IsSuccess() { result.SetData(res.GetHttpContentString()) return } else { result.SetErrMsg(public.RespCodeErrorUnknown, fmt.Sprintf("短信发送失败: %s", res.GetHttpContentString())).AddError(err) return } }