📲 一款满足你的多种发送需求的短信发送组件,此项目参考 easy-sms 实现的 Go 版本
- 支持目前市面多家服务商
- 一套写法兼容所有平台
- 简单配置即可灵活增减服务商
- 内置多种服务商轮询策略、支持自定义轮询策略
- 统一的返回值格式,便于日志与监控
- 自动轮询选择可用的服务商
- 更多等你去发现与改进...
go get -u github.com/maiqingqiang/gsms
package main
import (
"github.com/maiqingqiang/gsms"
"github.com/maiqingqiang/gsms/gateways/aliyun"
"github.com/maiqingqiang/gsms/gateways/yunpian"
"github.com/maiqingqiang/gsms/message"
"log"
)
func main() {
client := gsms.New(
[]gsms.Gateway{
&yunpian.Gateway{
ApiKey: "ApiKey",
Signature: "Signature",
},
&aliyun.Gateway{
AccessKeyId: "AccessKeyId",
AccessKeySecret: "AccessKeySecret",
SignName: "SignName",
},
},
gsms.WithGateways([]string{
yunpian.NAME, aliyun.NAME,
}),
)
results, err := client.Send(18888888888, &message.Message{
Template: "5532044",
Data: map[string]string{
"code": "521410",
},
})
if err != nil {
log.Fatalf("发送失败 %+v", err)
}
log.Printf("发送成功 %+v", results)
}
由于使用多网关发送,所以一条短信要支持多平台发送,每家的发送方式不一样,但是我们抽象定义了以下公用属性:
Content
文字内容,使用在像云片类似的以文字内容发送的平台Template
模板 ID,使用在以模板ID来发送短信的平台Data
模板变量,使用在以模板ID来发送短信的平台
所以,在使用过程中你可以根据所要使用的平台定义发送的内容。
client.Send(18888888888, &core.Message{
Template: "SMS_00000001",
Data: map[string]string{
"code": "521410",
},
})
client.Send(18888888888, &core.Message{
Content: "您的验证码为: 6379",
})
client.Send(18888888888, &core.Message{
Template: func(gateway core.GatewayInterface) string {
if gateway.Name() == aliyun.NAME {
return "SMS_271385117"
}
return "5532044"
},
Data: func(gateway core.GatewayInterface) map[string]string {
if gateway.Name() == aliyun.NAME {
return map[string]string{
"code": "1111",
}
}
return map[string]string{
"code": "6379",
}
},
})
client.Send(18888888888, &core.Message{
Template: "5532044",
Data: map[string]string{
"code": "6379",
},
}, yunpian.NAME, aliyun.NAME)
只需要实现 gsms.Gateway
接口即可,例如:
var _ gsms.Message = (*OrderPaidMessage)(nil)
type OrderPaidMessage struct {
OrderNo string
}
func (o *OrderPaidMessage) Gateways() ([]string, error) {
return []string{yunpian.NAME}, nil
}
func (o *OrderPaidMessage) Strategy() (gsms.Strategy, error) {
return nil, nil
}
func (o *OrderPaidMessage) GetContent(gateway gsms.Gateway) (string, error) {
return fmt.Sprintf("您的订单:%s, 已经完成付款", o.OrderNo), nil
}
func (o *OrderPaidMessage) GetTemplate(gateway gsms.Gateway) (string, error) {
return "5532044", nil
}
func (o *OrderPaidMessage) GetData(gateway gsms.Gateway) (map[string]string, error) {
return map[string]string{
"code": "6379",
}, nil
}
func (o *OrderPaidMessage) GetType(gateway gsms.Gateway) (string, error) {
return message.TextMessage, nil
}
client.Send(18888888888, &OrderPaidMessage{OrderNo: "1234"})
短信内容使用 Template
+ Data
&aliyun.Gateway{
AccessKeyId: "AccessKeyId",
AccessKeySecret: "AccessKeySecret",
SignName: "【默认签名】",
}
短信内容使用 Content
&yunpian.Gateway{
ApiKey: "ApiKey",
Signature: "【默认签名】", // 内容中无签名时使用
}
短信内容使用 Template
+ Data
&qcloud.Gateway{
SdkAppId: "",
SecretId: "",
SecretKey: "",
SignName: "",
}
该项目签署了 MIT 授权许可,详情请参阅 LICENSE