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

相关文章

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

Golang如何用gorm实现分页的功能

《Golang如何用gorm实现分页的功能》:本文主要介绍Golang如何用gorm实现分页的功能方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景go库下载初始化数据【1】建表【2】插入数据【3】查看数据4、代码示例【1】gorm结构体定义【2】分页结构体

在Golang中实现定时任务的几种高效方法

《在Golang中实现定时任务的几种高效方法》本文将详细介绍在Golang中实现定时任务的几种高效方法,包括time包中的Ticker和Timer、第三方库cron的使用,以及基于channel和go... 目录背景介绍目的和范围预期读者文档结构概述术语表核心概念与联系故事引入核心概念解释核心概念之间的关系

Python中Tensorflow无法调用GPU问题的解决方法

《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到

python如何调用java的jar包

《python如何调用java的jar包》这篇文章主要为大家详细介绍了python如何调用java的jar包,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录一、安装包二、使用步骤三、代码演示四、自己写一个jar包五、打包步骤六、方法补充一、安装包pip3 install

Golang 日志处理和正则处理的操作方法

《Golang日志处理和正则处理的操作方法》:本文主要介绍Golang日志处理和正则处理的操作方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录1、logx日志处理1.1、logx简介1.2、日志初始化与配置1.3、常用方法1.4、配合defer

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET

C/C++和OpenCV实现调用摄像头

《C/C++和OpenCV实现调用摄像头》本文主要介绍了C/C++和OpenCV实现调用摄像头,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录准备工作1. 打开摄像头2. 读取视频帧3. 显示视频帧4. 释放资源5. 获取和设置摄像头属性

golang float和科学计数法转字符串的实现方式

《golangfloat和科学计数法转字符串的实现方式》:本文主要介绍golangfloat和科学计数法转字符串的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望... 目录golang float和科学计数法转字符串需要对float转字符串做处理总结golang float