golang调用阿里云发短信

2024-04-28 10:52
文章标签 阿里 golang 调用 发短信

本文主要是介绍golang调用阿里云发短信,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

之前用golang封装的一个发送阿里云短信的工具包,代码如下

client.go

package smsimport ("context""github.com/go-playground/validator/v10""github.com/pkg/errors"
)type Client interface {// Send 发送短信Send(ctx context.Context, opt *SendOpt) error
}type SendOpt struct {// 必填:待发送手机号// 批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式PhoneNumbers []string `validate:"required,max=1000"`SignName     string// 必填:短信模板-可在短信控制台中找到TemplateCode string `validate:"required"`// 可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为// 友情提示:如果JSON中需要带换行符,请参照标准的JSON协议对换行符的要求,比如短信内容中包含\r\n的情况在JSON中需要表示成\\r\\n,// 否则会导致JSON在服务端解析失败TemplateParam string `validate:"required"`// 可选-上行短信扩展码(扩展码字段控制在7位或以下,无特殊需求用户请忽略此字段)SmsUpExtendCode string// 可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者OutId string
}func (p *SendOpt) Valid() error {if err := validator.New().Struct(p); err != nil {return errors.WithStack(err)}return nil
}

impl.go

package smsimport ("context""strings""time""github.com/denverdino/aliyungo/sms""github.com/pkg/errors"
)const (defaultSignName = ""
)var (ErrBusinessLimitControl = errors.New("BUSINESS_LIMIT_CONTROL")
)type ClientImpl struct {aliyunSms *sms.DYSmsClient
}type CodeStore interface {Save(ctx context.Context, key, smsCode string, expire time.Duration) errorGet(ctx context.Context, key string) (string, error)
}type ClientOpt struct {Key    stringSecret string
}func NewClient(opt *ClientOpt) Client {return &ClientImpl{aliyunSms: sms.NewDYSmsClient(opt.Key, opt.Secret),}
}func (p *ClientImpl) Send(_ context.Context, opt *SendOpt) error {if err := opt.Valid(); err != nil {return err}s := defaultSignNameif opt.SignName != "" {s = opt.SignName}res, err := p.aliyunSms.SendSms(&sms.SendSmsArgs{PhoneNumbers:    strings.Join(opt.PhoneNumbers, ","),SignName:        s,TemplateCode:    opt.TemplateCode,TemplateParam:   opt.TemplateParam,SmsUpExtendCode: opt.SmsUpExtendCode,OutId:           opt.OutId,})if err != nil {return errors.WithStack(err)}switch res.Code {case "OK":return nilcase "isv.BUSINESS_LIMIT_CONTROL":return ErrBusinessLimitControldefault:return errors.Errorf("send sms fail: %s, RequestId<%s>, Code<%s>, BizId<%s>",res.Message, res.RequestId, res.Code, res.BizId)}
}

这篇关于golang调用阿里云发短信的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/943042

相关文章

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

Golang的CSP模型简介(最新推荐)

《Golang的CSP模型简介(最新推荐)》Golang采用了CSP(CommunicatingSequentialProcesses,通信顺序进程)并发模型,通过goroutine和channe... 目录前言一、介绍1. 什么是 CSP 模型2. Goroutine3. Channel4. Channe

Idea调用WebService的关键步骤和注意事项

《Idea调用WebService的关键步骤和注意事项》:本文主要介绍如何在Idea中调用WebService,包括理解WebService的基本概念、获取WSDL文件、阅读和理解WSDL文件、选... 目录前言一、理解WebService的基本概念二、获取WSDL文件三、阅读和理解WSDL文件四、选择对接

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python

Golang使用minio替代文件系统的实战教程

《Golang使用minio替代文件系统的实战教程》本文讨论项目开发中直接文件系统的限制或不足,接着介绍Minio对象存储的优势,同时给出Golang的实际示例代码,包括初始化客户端、读取minio对... 目录文件系统 vs Minio文件系统不足:对象存储:miniogolang连接Minio配置Min

Golang使用etcd构建分布式锁的示例分享

《Golang使用etcd构建分布式锁的示例分享》在本教程中,我们将学习如何使用Go和etcd构建分布式锁系统,分布式锁系统对于管理对分布式系统中共享资源的并发访问至关重要,它有助于维护一致性,防止竞... 目录引言环境准备新建Go项目实现加锁和解锁功能测试分布式锁重构实现失败重试总结引言我们将使用Go作

java如何调用kettle设置变量和参数

《java如何调用kettle设置变量和参数》文章简要介绍了如何在Java中调用Kettle,并重点讨论了变量和参数的区别,以及在Java代码中如何正确设置和使用这些变量,避免覆盖Kettle中已设置... 目录Java调用kettle设置变量和参数java代码中变量会覆盖kettle里面设置的变量总结ja

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

【LabVIEW学习篇 - 21】:DLL与API的调用

文章目录 DLL与API调用DLLAPIDLL的调用 DLL与API调用 LabVIEW虽然已经足够强大,但不同的语言在不同领域都有着自己的优势,为了强强联合,LabVIEW提供了强大的外部程序接口能力,包括DLL、CIN(C语言接口)、ActiveX、.NET、MATLAB等等。通过DLL可以使用户很方便地调用C、C++、C#、VB等编程语言写的程序以及windows自带的大