在 Golang 中实现阿里云短信发送,通常需要使用阿里云提供的官方 SDK。阿里云提供了 Aliyun SDK for Go,你可以通过这个 SDK 来方便地调用其短信服务 API。
下面是一个详细的步骤和示例代码:
1. 注册阿里云账号并开通短信服务:
* 访问 阿里云官网,注册一个账号。
* 在阿里云控制台搜索 “短信服务”,并开通该服务。
* 创建短信签名: 用于标识你的短信发送者身份(例如:”【XXX科技】”)。
* 创建短信模板: 定义你的短信内容,需要审核通过。模板中可以使用变量,例如:您的验证码是${code},请在${time}分钟内输入。
2. 获取 AccessKey:
* 在阿里云控制台找到 “AccessKey 管理”,生成或查看你的 AccessKey ID 和 AccessKey Secret。请务必妥善保管你的 AccessKey Secret,不要泄露。
3. 引入 Aliyun SDK for Go:
* 使用 Go Modules 来管理依赖。
4. 编写发送短信的代码:
* 配置 AccessKey、Endpoint、RegionID。
* 构建请求参数,包括手机号码、签名名称、模板名称、模板参数等。
* 调用 SDK 的发送短信接口。
* 处理返回结果。
首先,在你的 Go 项目中,使用 Go Modules 来引入 Aliyun SDK。bash
go get github.com/aliyun/alibaba-cloud-sdk-go/sdk
go get github.com/aliyun/alibaba-cloud-sdk-go/services/dysmsapi
创建一个 Go 文件(例如 sms_sender.go),并添加以下代码:go
package main
import (
"encoding/json"
"fmt"
"log"
dysmsapi "github.com/aliyun/alibaba-cloud-sdk-go/services/dysmsapi"
)
// SMSConfig 存储短信发送所需的配置信息
type SMSConfig struct {
AccessKeyID string
AccessKeySecret string
RegionID string // 例如 "cn-hangzhou"
Endpoint string // 例如 "dysmsapi.aliyuncs.com"
SignName string // 短信签名名称,已在阿里云控制台创建并审核通过
TemplateCode string // 短信模板 code,已在阿里云控制台创建并审核通过
}
// SendSMS 函数用于发送短信
func SendSMS(config SMSConfig, phoneNumbers string, templateParam map[string]string) error {
// 1. 创建一个新的 Client
client, err := dysmsapi.NewClientWithAccessKey(config.RegionID, config.AccessKeyID, config.AccessKeySecret)
if err != nil {
return fmt.Errorf("创建 Aliyun SMS Client 失败: %w", err)
}
// 2. 创建 SendSmsRequest
request := dysmsapi.CreateSendSmsRequest()
request.Scheme = "https" // 使用 HTTPS 协议
// 3. 设置请求参数
request.PhoneNumbers = phoneNumbers // 接收短信的手机号码,多个号码用逗号分隔
request.SignName = config.SignName // 短信签名名称
request.TemplateCode = config.TemplateCode // 短信模板 code
request.TemplateParam = map[string]interface{}{} // 短信模板中的变量,JSON 格式
// 将 Go map 转换为 JSON string
// Aliyun SDK 内部会处理 map[string]interface{} 到 JSON 的转换,
// 但为了更清晰,这里直接使用 map[string]interface{}
// 如果你的模板参数是复杂结构,可能需要更精细的处理
for key, value := range templateParam {
request.TemplateParam[key] = value
}
// 4. 发送请求
response, err := client.SendSms(request)
if err != nil {
return fmt.Errorf("发送短信请求失败: %w", err)
}
// 5. 处理响应
if response.IsSuccess() {
fmt.Printf("短信发送成功!requestId: %s, bizId: %s\n", response.RequestId, response.BizId)
return nil
} else {
return fmt.Errorf("短信发送失败:Code=%s, Message=%s", response.Code, response.Message)
}
}
func main() {
// --- 配置信息 ---
// !!! 请替换成你的实际阿里云 AccessKey ID 和 AccessKey Secret !!!
// !!! 强烈建议将敏感信息存储在环境变量或配置文件中,而不是硬编码 !!!
smsConfig := SMSConfig{
AccessKeyID: "YOUR_ACCESS_KEY_ID",
AccessKeySecret: "YOUR_ACCESS_KEY_SECRET",
RegionID: "cn-hangzhou", // 阿里云短信服务的区域 ID
Endpoint: "dysmsapi.aliyuncs.com", // 短信服务的 Endpoint
SignName: "你的短信签名", // 已经在阿里云控制台创建并审核通过
TemplateCode: "SMS_xxxxxxx", // 你的短信模板 code,已经在阿里云控制台创建并审核通过
}
// --- 发送参数 ---
phoneNumber := "13800008888" // 替换成你要发送的手机号码
templateParams := map[string]string{
"code": "123456", // 对应短信模板中的 ${code} 变量
"time": "5", // 对应短信模板中的 ${time} 变量
}
// --- 发送短信 ---
err := SendSMS(smsConfig, phoneNumber, templateParams)
if err != nil {
log.Fatalf("发生错误: %v", err)
}
}
* SMSConfig struct: 用于统一管理短信发送所需的配置信息,包括 AccessKey、签名、模板等。
* SendSMS function:
* dysmsapi.NewClientWithAccessKey: 使用你的 AccessKey ID 和 SecretKey 创建一个 SMS 客户端。
* dysmsapi.CreateSendSmsRequest(): 创建一个发送短信的请求对象。
* request.PhoneNumbers: 设置接收短信的手机号码。
* request.SignName: 设置短信签名。
* request.TemplateCode: 设置短信模板的 code。
* request.TemplateParam: 设置短信模板中需要的变量。注意: TemplateParam 需要一个 map[string]interface{} 类型,即使你的变量值都是字符串,也建议按照模板的预期类型传递。SDK 会将 map[string]interface{} 转换为 JSON 字符串。
* client.SendSms(request): 发送短信请求。
* response.IsSuccess(): 检查响应是否成功。
* response.Code 和 response.Message: 获取失败时的错误码和错误信息。
* main function:
* 在这里配置你的 SMSConfig。请务必将 YOUR_ACCESS_KEY_ID 和 YOUR_ACCESS_KEY_SECRET 替换为你自己的阿里云 AccessKey。
* 设置目标手机号码 (phoneNumber)。
* 准备模板参数 (templateParams)。这里的键(”code”, “time”)必须与你在阿里云短信模板中定义的变量名完全一致。
* 调用 SendSMS 函数。
1. 替换占位符:
* 将 YOUR_ACCESS_KEY_ID 和 YOUR_ACCESS_KEY_SECRET 替换为你自己的阿里云 AccessKey。
* 将 "你的短信签名" 替换为你已经在阿里云控制台创建并审核通过的短信签名。
* 将 "SMS_xxxxxxx" 替换为你已经在阿里云控制台创建并审核通过的短信模板 code。
* 将 "13800008888" 替换为你想要测试的实际手机号码。
* 根据你的短信模板,调整 templateParams 中的键和值。
2. 执行代码:
bash
go run sms_sender.go
* 不要将 AccessKey 硬编码到代码中: 尤其是在生产环境中。更好的做法是:
* 使用环境变量: 将 AccessKey ID 和 Secret 存储在环境变量中,然后在代码中读取。
* 使用配置文件: 将 AccessKey 存储在安全的配置文件中,并在运行时加载。
* 使用 RAM 子账号: 为你的应用程序创建一个 RAM 子账号,并为其授予发送短信的最小权限。
* 访问密钥的权限管理: 确保你的 AccessKey 只能访问它所需要的最小权限,避免授予过高的权限。
* 日志记录: 在生产环境中,详细记录短信发送的请求和响应,以便于调试和审计。
* 错误处理: 仔细处理短信发送过程中可能出现的各种错误,并根据错误信息采取相应的措施(例如:重试、通知管理员等)。
* 速率限制: 阿里云短信服务有发送频率限制,注意不要在短时间内发送大量短信,以免被限流。
通过以上步骤,你就可以在 Golang 项目中成功实现阿里云短信的发送了。