Giter Club home page Giter Club logo

gsms's Introduction

go report card Go.Dev reference Go package MIT License Contributors Forks Stargazers Issues

Gsms 📲

📲 一款满足你的多种发送需求的短信发送组件,此项目参考 easy-sms 实现的 Go 版本

特点

  1. 支持目前市面多家服务商
  2. 一套写法兼容所有平台
  3. 简单配置即可灵活增减服务商
  4. 内置多种服务商轮询策略、支持自定义轮询策略
  5. 统一的返回值格式,便于日志与监控
  6. 自动轮询选择可用的服务商
  7. 更多等你去发现与改进...

平台支持

安装

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

鸣谢

gsms's People

Contributors

liuaix avatar maiqingqiang avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.