使用阿里云短信服务官方库

我这里使用了官方的库

driver_aliyun.go 文件,其中结果日志我是写到mysql表里了

package sms

import (
    "fmt"
    openapi "github.com/alibabacloud-go/darabonba-openapi/client"
    dysmsapi20170525 "github.com/alibabacloud-go/dysmsapi-20170525/v2/client"
    util "github.com/alibabacloud-go/tea-utils/service"
    "github.com/alibabacloud-go/tea/tea"
    jsoniter "github.com/json-iterator/go"
    "github.com/sreio/gohub/app/modles/sms"
    "github.com/sreio/gohub/pkg/logger"
)

var json = jsoniter.ConfigCompatibleWithStandardLibrary

type Aliyun struct {
}

// Send 实现Driver中的Send方法
func (a *Aliyun) Send(phone string, message Message, config map[string]string) bool {
    client, err := CreateClient(tea.String(config["access_key_id"]), tea.String(config["access_key_secret"]))
    if err != nil {
        logger.ErrorString("短信[阿里云]", "解析绑定错误", err.Error())
        return false
    }
    logger.DebugJSON("短信[阿里云]", "配置信息", config)

    param, err := json.Marshal(message.Data)
    if err != nil {
        logger.ErrorString("短信[阿里云]", "短信模板参数解析错误", err.Error())
        return false
    }

    // 发送参数
    sendSmsRequest := &dysmsapi20170525.SendSmsRequest{
        SignName:      tea.String(config["sign_name"]),
        TemplateCode:  tea.String(message.Template),
        PhoneNumbers:  tea.String(phone),
        TemplateParam: tea.String(string(param)),
    }

    // 其他运行参数
    runtime := &util.RuntimeOptions{}

    _result, err := client.SendSmsWithOptions(sendSmsRequest, runtime)
    if err != nil {
        var errs = &tea.SDKError{}
        if _t, ok := err.(*tea.SDKError); ok {
            errs = _t
        } else {
            errs.Message = tea.String(err.Error())
        }

        var r dysmsapi20170525.SendSmsResponseBody
        err = json.Unmarshal([]byte(*errs.Data), &r)
        logger.LogIf(err)

        smsModel := sms.Sms{
            Phone:         phone,
            SignName:      config["sign_name"],
            TemplateCode:  message.Template,
            TemplateParam: string(param),
            RequestId:     tea.StringValue(r.RequestId),
            BizId:         "",
            Code:          tea.StringValue(r.Code),
            Message:       tea.StringValue(r.Message),
        }
        smsModel.SaveSmsLog()
        return false
    }

    smsModel := sms.Sms{
        Phone:         phone,
        SignName:      config["sign_name"],
        TemplateCode:  message.Template,
        TemplateParam: string(param),
        RequestId:     tea.StringValue(_result.Body.RequestId),
        BizId:         tea.StringValue(_result.Body.BizId),
        Code:          tea.StringValue(_result.Body.Code),
        Message:       tea.StringValue(_result.Body.Message),
    }
    smsModel.SaveSmsLog()
    return true
}

// CreateClient
/**
 * 使用AK&SK初始化账号Client
 * @param accessKeyId
 * @param accessKeySecret
 * @return Client
 * @throws Exception
 */
func CreateClient(accessKeyId *string, accessKeySecret *string) (_result *dysmsapi20170525.Client, _err error) {
    config := &openapi.Config{
        // 您的 AccessKey ID
        AccessKeyId: accessKeyId,
        // 您的 AccessKey Secret
        AccessKeySecret: accessKeySecret,
    }
    // 访问的域名
    config.Endpoint = tea.String("dysmsapi.aliyuncs.com")
    _result = &dysmsapi20170525.Client{}
    _result, _err = dysmsapi20170525.NewClient(config)
    return _result, _err
}

sms Model

package sms

import "github.com/sreio/gohub/app/modles"

type Sms struct {
    modles.BaseModel
    Phone         string `json:"phone"  gorm:"type:char(11);comment:发送手机号;default:'';index:'idx_phone_code';"`
    SignName      string `json:"sign_name" gorm:"type:varchar(255);comment:短信签名名称;default:'';"`
    TemplateCode  string `json:"template_code" gorm:"type:varchar(100);comment:短信模板Code;default:'';index:'idx_phone_code';"`
    TemplateParam string `json:"template_param" gorm:"type:text;comment:短信模板变量对应的参数(json);default:'';"`
    RequestId     string `json:"request_id"  gorm:"type:varchar(100);comment:请求ID;default:'';uniqueIndex;"`
    BizId         string `json:"biz_id"  gorm:"type:varchar(100);comment:发送回执ID;default:'';"`
    Code          string `json:"code" gorm:"type:varchar(100);comment:请求状态码;default:'';"`
    Message       string `json:"message" gorm:"type:varchar(100);comment:状态码的描述;default:'';"`
    modles.CommonTimestampsField
}

sms_util.go

package sms

import (
    "github.com/sreio/gohub/pkg/database"
)

func (sms *Sms) SaveSmsLog() {
    database.DB.Create(&sms)
}
本帖已被设为精华帖!
本帖由系统于 3个月前 自动加精
sreio
讨论数量: 2
wuvikr

俺也一样, config 和 client 初始化就直接放 send 函数里面了。

package sms

import (
    "encoding/json"
    "gohub/pkg/config"
    "gohub/pkg/logger"

    util "github.com/alibabacloud-go/tea-utils/v2/service"

    openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
    dysmsapi "github.com/alibabacloud-go/dysmsapi-20170525/v4/client"
    "github.com/alibabacloud-go/tea/tea"
)

type Aliyun struct{}

func (a *Aliyun) Send(phone string, message Message) bool {
    // 从配置中获取阿里云短信配置
    aliyunConfig := config.GetStringMapString("sms.aliyun")

    // 打印配置信息用于调试
    logger.DebugJSON("短信[阿里云]", "配置信息", aliyunConfig)

    if len(aliyunConfig) == 0 {
        logger.ErrorString("短信[阿里云]", "配置错误", "找不到阿里云短信配置信息")
        return false
    }

    // 检查必要的配置项
    requiredConfigs := []string{"access_key_id", "access_key_secret", "sign_name"}
    for _, c := range requiredConfigs {
        if aliyunConfig[c] == "" {
            logger.ErrorString("短信[阿里云]", "配置错误", c+" 未配置")
            return false
        }
    }

    clientConfig := &openapi.Config{
        AccessKeyId:     tea.String(aliyunConfig["access_key_id"]),
        AccessKeySecret: tea.String(aliyunConfig["access_key_secret"]),
        Endpoint:        tea.String("dysmsapi.aliyuncs.com"),
        RegionId:        tea.String("cn-hangzhou"), // 添加区域配置
    }

    // 打印客户端配置用于调试
    logger.DebugJSON("短信[阿里云]", "客户端配置", map[string]string{
        "AccessKeyId": *clientConfig.AccessKeyId,
        "Endpoint":    *clientConfig.Endpoint,
        "RegionId":    *clientConfig.RegionId,
    })

    smsClient, err := dysmsapi.NewClient(clientConfig)
    if err != nil {
        logger.ErrorString("短信[阿里云]", "创建短信客户端失败", err.Error())
        return false
    }

    templateParam, err := json.Marshal(message.Data)
    if err != nil {
        logger.ErrorString("短信[阿里云]", "模板参数序列化失败", err.Error())
        return false
    }

    // 打印请求参数用于调试
    logger.DebugJSON("短信[阿里云]", "请求参数", map[string]string{
        "PhoneNumbers":  phone,
        "SignName":      aliyunConfig["sign_name"],
        "TemplateCode":  message.Template,
        "TemplateParam": string(templateParam),
    })

    sendSmsRequest := &dysmsapi.SendSmsRequest{
        PhoneNumbers:  tea.String(phone),
        SignName:      tea.String(aliyunConfig["sign_name"]),
        TemplateCode:  tea.String(message.Template),
        TemplateParam: tea.String(string(templateParam)),
    }

    // 添加更多的运行时选项
    runtime := &util.RuntimeOptions{
        ReadTimeout:    tea.Int(5000),
        ConnectTimeout: tea.Int(5000),
    }

    response, err := smsClient.SendSmsWithOptions(sendSmsRequest, runtime)
    if err != nil {
        logger.ErrorString("短信[阿里云]", "发送短信失败", err.Error())
        return false
    }

    if response.Body == nil || *response.Body.Code != "OK" {
        if response.Body != nil {
            logger.ErrorString("短信[阿里云]", "服务商返回错误", *response.Body.Message)
        } else {
            logger.ErrorString("短信[阿里云]", "服务商返回错误", "response body is nil")
        }
        return false
    }

    logger.DebugString("短信[阿里云]", "发送成功", "")
    return true
}
3个月前 评论
number001 2个月前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!