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) 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 }