package exchange import ( "app/commons/core" "bytes" "crypto/md5" "encoding/hex" "encoding/json" "fmt" "github.com/demdxx/gocast" "io" "io/ioutil" "net/http" "sort" "strings" ) var isDebug = false func Get[T any](url string) (*T, error) { return get[T](url) } func get[T any](url string) (*T, error) { obj := new(T) resp, err := http.Get(url) if err != nil { return obj, err } defer resp.Body.Close() // 确保在函数结束时关闭响应体 // 检查响应状态码 if resp.StatusCode != http.StatusOK { return obj, fmt.Errorf("error:%d", resp.StatusCode) } // 读取响应体 body, err := ioutil.ReadAll(resp.Body) if err != nil { return obj, err } err = json.Unmarshal(body, &obj) if isDebug { core.Log.Infof("get请求:%s 返回:%s", url, body) } return obj, err } func post[T any](uri string, data []byte) (*T, error) { obj := new(T) // 创建一个新的 POST 请求 req, err := http.NewRequest("POST", uri, bytes.NewBuffer(data)) if err != nil { return obj, err } // 设置请求头 req.Header.Set("Content-Type", "application/json") // 发送请求 client := &http.Client{} resp, err := client.Do(req) if err != nil { return obj, err } defer resp.Body.Close() // 读取响应 body, err := io.ReadAll(resp.Body) if err != nil { return obj, err } if isDebug { core.Log.Infof("post请求:请求:%s data:%s 返回:%s", uri, data, body) } err = json.Unmarshal(body, &obj) return obj, err } // signMd5 md5签名 func signMd5(req map[string]interface{}) string { keys := make([]string, 0, len(req)) for k := range req { if k == "sign" { continue } keys = append(keys, k) } sort.Strings(keys) // 拼接键值对 var sb strings.Builder for _, k := range keys { if gocast.ToString(req[k]) == "" { continue } sb.WriteString(fmt.Sprintf("%s%s", k, gocast.ToString(req[k]))) } // 计算 MD5 哈希 str := fmt.Sprintf("%s%s", sb.String(), conf().Secret) hash := md5.Sum([]byte(str)) core.Log.Infof("sb:%s secret:%s str:%s sign str:%s", sb.String(), conf().Secret, str, hex.EncodeToString(hash[:])) // 将哈希值转换为十六进制字符串 return hex.EncodeToString(hash[:]) } // 将结构体转换为 JSON map func structToJSONMap(obj interface{}) (map[string]interface{}, error) { // 将结构体编码为 JSON data, err := json.Marshal(obj) if err != nil { return nil, err } // 定义一个 map 用于存储 JSON 数据 var result map[string]interface{} // 将 JSON 解码到 map 中 err = json.Unmarshal(data, &result) if err != nil { return nil, err } return result, nil }