1. 首页
  2. 文本短信
  3. SDK参考
  4. GO SDK
菜单
本页目录
package main

import (
	"crypto/hmac"
	"crypto/sha1"
	"encoding/base64"
	"encoding/hex"
	"net/url"
	"sort"
	"strings"
)

// generateSignature 生成签名
func generateSignature(data map[string]string, method, password string) string {
	// 对 data 进行 key 排序
	keys := make([]string, 0, len(data))
	for k := range data {
		keys = append(keys, k)
	}
	sort.Strings(keys)

	// 构造查询字符串
	queryParts := make([]string, 0, len(data))
	for _, k := range keys {
		queryParts = append(queryParts, url.QueryEscape(k)+"="+url.QueryEscape(data[k]))
	}
	queryString := strings.Join(queryParts, "&")

	// 替换特殊字符
	queryString = strings.ReplaceAll(queryString, "+", "%20")
	queryString = strings.ReplaceAll(queryString, "*", "%2A")
	queryString = strings.ReplaceAll(queryString, "%7E", "~")

	uri := method + "&" + url.QueryEscape("/") + "&" + queryString

    h := hmac.New(sha1.New, []byte(password))
    h.Write([]byte(uri))
	signatureBytes := h.Sum(nil)

	signature := base64.StdEncoding.EncodeToString([]byte(hex.EncodeToString(signatureBytes)))

	return signature
}

func main() {
	data := map[string]string{
		"sp_id": "123456",
		"mobile": "12345678901",
		"content": "内容",
	}
	method := "POST"
	password := "password"

	signature := generateSignature(data, method, password)
	println(signature)

	// 忽略发起请求的过程
}