使用阿里云短信服务发送短信

package main

import (
   "encoding/json"
   "errors"
   "fmt"
   alibabacloudopenapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
   alibabaclouddysmsapi "github.com/alibabacloud-go/dysmsapi-20170525/v3/client"
   alibabacloudteautils "github.com/alibabacloud-go/tea-utils/v2/service"
   alibabacloudtea "github.com/alibabacloud-go/tea/tea"
)

// SendSms 发送短信
// @param phoneNumber string 接收短信手机号码
// @param templateCode string 短信内容模板CODE
// @param templateParam map[string]any 短信内容模板参数
// @return error 错误信息,若发送成功则为nil
func SendSms(phoneNumber string, templateCode string, templateParam map[string]any) error {
   // 重要提醒:以下变量应该写入配置文件或数据库以方便随时修改,这里主要目的是演示发送短信故直接写死。
   accessKeyID := "****************"                   // AccessKey ID
   accessKeySecret := "******************************" // AccessKey Secret
   endpoint := "dysmsapi.aliyuncs.com"                 // 服务接入点(公网接入地址)
   signName := "码农人生"                                  // 签名名称

   // 初始化config
   config := &alibabacloudopenapi.Config{
      AccessKeyId:     alibabacloudtea.String(accessKeyID),
      AccessKeySecret: alibabacloudtea.String(accessKeySecret),
      Endpoint:        alibabacloudtea.String(endpoint),
   }

   // 创建客户端
   client, err := alibabaclouddysmsapi.NewClient(config)
   if err != nil {
      fmt.Println("发送短信失败", err)
      return err
   }

   sendSmsRequest := &alibabaclouddysmsapi.SendSmsRequest{}
   runtimeOptions := &alibabacloudteautils.RuntimeOptions{}

   sendSmsRequest.SetSignName(signName)
   sendSmsRequest.SetPhoneNumbers(phoneNumber)
   sendSmsRequest.SetTemplateCode(templateCode)

   // 处理短信内容模板参数
   jsonByte, _ := json.Marshal(templateParam)
   sendSmsRequest.SetTemplateParam(string(jsonByte))

   // 调用接口
   // 说明:调用接口成功不代表发送短信成功,调用接口失败通常是AccessKeyId、AccessKeySecret、Endpoint错误导致。
   sendSmsResponse, err := client.SendSmsWithOptions(sendSmsRequest, runtimeOptions)
   if err != nil {
      fmt.Println("发送短信失败", err)
      return err
   }

   // 调用接口成功,解析接口返回参数检查短信是否发送成功
   response := make(map[string]any)
   err = json.Unmarshal([]byte(sendSmsResponse.String()), &response)
   if err != nil {
      fmt.Println("发送短信失败", errors.New("接口无响应"))
      return errors.New("接口无响应")
   }

   // 获取接口返回参数的body部分
   responseBody, exist := response["body"]
   if !exist {
      fmt.Println("发送短信失败", errors.New("接口返回参数异常"))
      return errors.New("接口返回参数异常")
   }

   // 检查API错误码,错误码为OK表示发送成功
   body, _ := responseBody.(map[string]any)
   if body["Code"] != "OK" {
      fmt.Println("发送短信失败", errors.New(body["Message"].(string)))
      return errors.New(body["Message"].(string))
   }

   return nil
}

func main() {
   phoneNumber := "18888888888"    // 接收短信手机号码
   templateCode := "SMS_000000000" // 短信内容模板CODE

   // 短信内容模板参数
   templateParam := make(map[string]any)
   templateParam["code"] = "123456" // 验证码

   err := SendSms(phoneNumber, templateCode, templateParam)
   if err != nil {
      fmt.Println("发送短信失败")
   } else {
      fmt.Println("发送短信成功")
   }
}

Copyright © 2024 码农人生. All Rights Reserved