62 lines
1.3 KiB
Go
62 lines
1.3 KiB
Go
package utils
|
||
|
||
import "C"
|
||
import (
|
||
"case-open-api/config"
|
||
"encoding/json"
|
||
"errors"
|
||
"fmt"
|
||
"strconv"
|
||
"time"
|
||
)
|
||
|
||
// GenSignature 生成签名
|
||
func GenSignature(paramsMap map[string]interface{}, timestamp string, secret string) (string, error) {
|
||
// 对map的key进行排序,包括多层嵌套的情况
|
||
paramsData := SortMapParams(paramsMap)
|
||
paramsData["timestamp"] = timestamp
|
||
|
||
// 转换为JSON
|
||
jsonData, err := json.Marshal(paramsData)
|
||
if err != nil {
|
||
return "", err
|
||
}
|
||
|
||
sign := HmacSHA256(string(jsonData), secret)
|
||
|
||
return sign, err
|
||
}
|
||
|
||
// VerifySignature 验证签名
|
||
func VerifySignature(paramsMap map[string]interface{}, receivedTimestamp, receivedSignature, secret string) error {
|
||
// 验证时间戳是否超出 5 分钟-测试环境不验证
|
||
if config.C.Env != "dev" {
|
||
currentTime := time.Now().Unix() * 1000
|
||
|
||
timestamp, err := strconv.ParseInt(receivedTimestamp, 10, 64)
|
||
fmt.Println(currentTime)
|
||
fmt.Println(timestamp)
|
||
|
||
if err != nil {
|
||
return errors.New("签名错误")
|
||
}
|
||
|
||
if currentTime-timestamp > 5000 {
|
||
return errors.New("签名超时")
|
||
}
|
||
}
|
||
|
||
// 生成签名
|
||
sign, err := GenSignature(paramsMap, receivedTimestamp, secret)
|
||
fmt.Println(sign)
|
||
if err != nil {
|
||
return errors.New("内部错误")
|
||
}
|
||
|
||
if receivedSignature != sign {
|
||
return errors.New("签名错误")
|
||
}
|
||
|
||
return nil
|
||
}
|