Ai
1 Star 0 Fork 0

Walle/sms

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
aliyun.go 2.37 KB
一键复制 编辑 原始数据 按行查看 历史
JackHunx 提交于 2023-04-25 00:03 +08:00 . #add aliyun and diyi gateway
package aliyun
import (
"context"
"crypto/hmac"
"crypto/sha1"
"encoding/base64"
"encoding/json"
"fmt"
"net/http"
"net/url"
"strings"
"time"
"gitee.com/wallesoft/sms/core"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/net/gclient"
"github.com/google/uuid"
)
var _ core.GatewayInterface = (*Gateway)(nil)
type Gateway struct {
AccessKeyId string
AccessKeySecret string
SignName string
}
func (g *Gateway) GetName() string {
return NAME
}
func (g *Gateway) Send(ctx context.Context, to core.PhoneNumberInterface, message core.MessageInterface, client *gclient.Client) (string, error) {
query := url.Values{}
query.Add("RegionId", EndpointRegionId)
query.Add("AccessKeyId", g.AccessKeyId)
query.Add("Format", EndpointFormat)
query.Add("SignatureMethod", EndpointSignatureMethod)
query.Add("SignatureVersion", EndpointSignatureVersion)
query.Add("SignatureNonce", uuid.New().String())
query.Add("Timestamp", time.Now().UTC().Format("2006-01-02T15:04:05Z"))
query.Add("Action", EndpointMethod)
query.Add("Version", EndpointVersion)
query.Add("PhoneNumbers", to.UniversalNumber())
query.Add("SignName", g.SignName)
template, err := message.GetTemplate(g)
if err != nil {
return "", err
}
query.Add("TemplateCode", template)
data, err := message.GetData(g)
if err != nil {
return "", err
}
marshal, err := json.Marshal(data)
if err != nil {
return "", err
}
query.Add("TemplateParam", string(marshal))
query.Add("Signature", generateSign(http.MethodGet, g.AccessKeySecret, query))
response := &Response{}
res := client.GetVar(ctx, EndpointUrl, query)
if err := res.Scan(response); err != nil {
return "", err
}
if response.Code != OK {
return "", gerror.Newf("send failed code:%s msg:%s", response.Code, response.Message)
}
return res.String(), nil
}
// generateSign Generate sign.
// https://help.aliyun.com/document_detail/101343.html
func generateSign(httpMethod, accessKeySecret string, query url.Values) string {
httpMethod = strings.ToUpper(httpMethod)
encode := url.QueryEscape(query.Encode())
encode = strings.Replace(encode, "+", "%20", -1)
encode = strings.Replace(encode, "*", "%2A", -1)
encode = strings.Replace(encode, "%7E", "~", -1)
h := hmac.New(sha1.New, []byte(accessKeySecret+"&"))
h.Write([]byte(fmt.Sprintf("%s&%%2F&%s", httpMethod, encode)))
return base64.StdEncoding.EncodeToString(h.Sum(nil))
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/wallesoft/sms.git
git@gitee.com:wallesoft/sms.git
wallesoft
sms
sms
v0.0.1

搜索帮助