阿里云 短信服务 HTTP协议 GO实现

阿里云的 HTTP协议加密文档感觉写的不太好,搞了很久才搞定。
顺便分享一下~
1. 为了防止重放攻击,阿里云加密加入了uuid这么个参数,因此 GO 实现的时候引入了一个uuid生成的三方库;

go get -u "github.com/satori/go.uuid"
  1. 其余的就不多说了,上代码,也比较简单。
package main 

import (
    "time"
    "strings"
    "fmt"
    "net/url"
    "github.com/satori/go.uuid"
    "crypto/hmac"
    "crypto/sha1"
    "encoding/base64"
)

const sortQueryString_fmt string = 
"AccessKeyId=%s"+
"&Action=SendSms"+
"&Format=JSON"+
"&OutId=123"+
"&PhoneNumbers=%s"+
"&RegionId=cn-hangzhou"+
"&SignName=%s"+
"&SignatureMethod=HMAC-SHA1"+
"&SignatureNonce=%s"+
"&SignatureVersion=1.0"+
"&TemplateCode=%s"+
"&TemplateParam=%s"+
"&Timestamp=%s"+
"&Version=2017-05-25"

func encode_local(encode_str string) string{
    urlencode := url.QueryEscape(encode_str)
    urlencode = strings.Replace(urlencode,"+","%%20",-1)
    urlencode = strings.Replace(urlencode,"*","%2A",-1)
    urlencode = strings.Replace(urlencode,"%%7E","~",-1)
    urlencode = strings.Replace(urlencode,"/","%%2F",-1)
    return urlencode
}

func main() {
    const token string = "xxxxx&" // 阿里云 accessSecret 注意这个地方要添加一个 &

    AccessKeyId := "xxxx" // 自己的阿里云 accessKeyID
    PhoneNumbers := "15088888888"  // 发送目标的手机号
    SignName := url.QueryEscape("阿里云短信测试专用")
    SignatureNonce,_ := uuid.NewV4()
    TemplateCode := "SMS_136035178"
    TemplateParam := url.QueryEscape("{\"code\":\"888888\"}")
    Timestamp := url.QueryEscape(time.Now().UTC().Format("2006-01-02T15:04:05Z"))

    sortQueryString := fmt.Sprintf(sortQueryString_fmt,
        AccessKeyId,
        PhoneNumbers,
        SignName,
        SignatureNonce,
        TemplateCode,
        TemplateParam,
        Timestamp,
    )

    urlencode := encode_local(sortQueryString)
    sign_str := fmt.Sprintf("GET&%%2F&%s",urlencode)

    key := []byte(token)
    mac := hmac.New(sha1.New, key)
    mac.Write([]byte(sign_str))
    signture := base64.StdEncoding.EncodeToString(mac.Sum(nil))
    signture = encode_local(signture)
    fmt.Println(signture)
    fmt.Printf("http://dysmsapi.aliyuncs.com/?Signature=%s&%s\n",signture,sortQueryString)
}

希望能够帮到后来人~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xyccstudio

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值