package app import ( "encoding/json" "hepa-calc-api/config" "hepa-calc-api/utils" "sort" "strings" ) //const ( // apiUrl = "https://dev-wx.igandan.com" // 接口地址 // secretKey = "RY8pcn04#TSdzHVX6YgWnyCue9!T&QP^" // 产品私有密钥,服务端生成签名信息使用,请严格保管,避免泄露 // platform = "suanyisuan" // 所属平台 // imagePrefix = "https://dev-doc.igandan.com/app" // 图片地址前缀 //) // GenSignature 生成签名信息 func GenSignature(params map[string]interface{}) (string, error) { // 对map的key进行排序,包括多层嵌套的情况 data := sortMapRecursively(params) // 转换为JSON jsonData, err := json.Marshal(data) if err != nil { return "", err } sing := utils.HmacSHA256(string(jsonData), config.C.App.SecretKey) return sing, nil } // sortMapRecursively 对map的key进行排序,包括多层嵌套的情况 func sortMapRecursively(data map[string]interface{}) map[string]interface{} { sortedMap := make(map[string]interface{}) keys := make([]string, 0, len(data)) // 收集所有的key for key := range data { keys = append(keys, key) } // 对key进行排序 sort.Strings(keys) // 通过排序后的key插入新map中 for _, key := range keys { value := data[key] switch valueTyped := value.(type) { case map[string]interface{}: // 如果是嵌套的map,递归调用 sortedMap[key] = sortMapRecursively(valueTyped) case []interface{}: // 如果是嵌套的slice,对其中的map进行递归调用 for i, v := range valueTyped { if vMap, ok := v.(map[string]interface{}); ok { valueTyped[i] = sortMapRecursively(vMap) } } sortedMap[key] = valueTyped default: // 否则直接插入 sortedMap[key] = value } } return sortedMap } // HandleImagePrefix 处理app图片前缀 func HandleImagePrefix(u string) (string, error) { if u == "" { return "", nil } // 去除oss前缀 u = utils.RemoveOssDomain(u) imgPath := strings.Replace(u, config.C.App.ImagePrefix, "", 1) if imgPath == "/null" { return "", nil } return imgPath, nil }