package weipinshang_api import ( "bytes" "crypto/md5" "encoding/hex" "encoding/json" "fmt" "io" "net/http" "strings" ) type WeiPinShangClient struct { Host string ChannelType string Key string } func NewWeiPinShangClient(host, channelType, key string) *WeiPinShangClient { return &WeiPinShangClient{ Host: host, ChannelType: channelType, Key: key, } } func (w *WeiPinShangClient) GetOrderInfo(orderNo string) (res *GetOrderInfoRes, err error) { fmt.Println("orderNo", orderNo) paramMap := make(map[string]any) paramMap["orderNo"] = orderNo postRes, err := w.WPSPost("/mcang/Mcang/getOrderInfo", paramMap) if err != nil { return } err = json.Unmarshal(postRes, &res) if err != nil || res == nil { err = fmt.Errorf("转换GetOrderInfoRes结构体失败: %s", string(postRes)) return } return } func (w *WeiPinShangClient) IsRefund(mcOrderNo string) (res *IsRefundRes, err error) { fmt.Println("mcOrderNo", mcOrderNo) paramMap := make(map[string]any) paramMap["mcOrderNo"] = mcOrderNo postRes, err := w.WPSPost("/mcang/Refunds/IsRefund", paramMap) if err != nil { return } err = json.Unmarshal(postRes, &res) if err != nil || res == nil { err = fmt.Errorf("转换结构体失败: %s", string(postRes)) return } return } func (w *WeiPinShangClient) CreateAfsApply(createAfsApplyReq CreateAfsApplyReq) (res *CreateAfsApplyRes, err error) { fmt.Println("createAfsApplyReq", createAfsApplyReq) paramMap := make(map[string]any) paramMap["mcOrderNo"] = createAfsApplyReq.McOrderNo paramMap["customerExpect"] = createAfsApplyReq.CustomerExpect paramMap["questionDesc"] = createAfsApplyReq.QuestionDesc paramMap["questionPic"] = createAfsApplyReq.QuestionPic paramMap["customerContactName"] = createAfsApplyReq.CustomerContactName paramMap["customerMobilePhone"] = createAfsApplyReq.CustomerMobilePhone paramMap["customerTel"] = createAfsApplyReq.CustomerTel paramMap["pickwareProvince"] = createAfsApplyReq.PickwareProvince paramMap["pickwareCity"] = createAfsApplyReq.PickwareCity paramMap["pickwareCounty"] = createAfsApplyReq.PickwareCounty paramMap["pickwareAddress"] = createAfsApplyReq.PickwareAddress postRes, err := w.WPSPost("/mcang/Refunds/IsRefund", paramMap) if err != nil { return } err = json.Unmarshal(postRes, &res) if err != nil || res == nil { err = fmt.Errorf("转换结构体失败: %s", string(postRes)) return } return } func (w *WeiPinShangClient) OrderCancel(mcOrderNo string) (res *OrderCancelRes, err error) { fmt.Println("mcOrderNo", mcOrderNo) paramMap := make(map[string]any) paramMap["mcOrderNo"] = mcOrderNo postRes, err := w.WPSPost("/mcang/Refunds/IsRefund", paramMap) if err != nil { return } err = json.Unmarshal(postRes, &res) if err != nil || res == nil { err = fmt.Errorf("转换结构体失败: %s", string(postRes)) return } return } func (w *WeiPinShangClient) Sign(paramMap map[string]any) (res string, err error) { var sumParamString string if len(paramMap) != 0 { sumParamString = SortedString(paramMap) + w.ChannelType + w.Key } else { sumParamString = w.ChannelType + w.Key } md5Sum := md5.Sum([]byte(sumParamString)) md5Str := hex.EncodeToString(md5Sum[:]) md5Str = strings.ToUpper(md5Str) return md5Str, nil } func (w *WeiPinShangClient) WPSPost(url string, paramMap map[string]any) (res []byte, err error) { bodyByte, _ := json.Marshal(paramMap) req, err := http.NewRequest("POST", w.Host+url, bytes.NewBuffer(bodyByte)) if err != nil { return } req.Header.Set("Content-Type", "application/json") req.Header.Set("channelType", w.ChannelType) sign, err := w.Sign(paramMap) if err != nil { return } req.Header.Set("md5", sign) // 创建 HTTP 客户端 client := &http.Client{} // 发送请求 resp, err := client.Do(req) if err != nil { return } defer func(Body io.ReadCloser) { _ = Body.Close() }(resp.Body) // 读取响应体 res, err = io.ReadAll(resp.Body) if err != nil { return } //fmt.Printf("res: %s\n", string(res)) if !json.Valid(res) { return nil, fmt.Errorf("响应不是有效的JSON格式: %s", string(res)) } return }