package dw_sdk import ( "fmt" "net/http" "github.com/bytedance/sonic" "github.com/gofiber/fiber/v3/client" "github.com/pkg/errors" "github.com/valyala/fasthttp/fasthttpproxy" "time" ) //https://open.dewu.com/#/api/body?apiId=42&id=3&title=%E5%87%BA%E4%BB%B7%E6%9C%8D%E5%8A%A1API type BidClient interface { LowestPrice(skuId int) (LowestPriceResponse, error) } type ConsignBidClientImpl struct { cli *client.Client cfg PublicConfig baseUrl string } func NewConsignBidClient(cfg Config) BidClient { baseUrl := GetUrl(cfg.Public.Env) cli := client.New().SetJSONMarshal(func(v any) ([]byte, error) { return sonic.Marshal(v) }).SetJSONUnmarshal(func(data []byte, v any) error { return sonic.Unmarshal(data, v) }).AddRequestHook(func(c *client.Client, request *client.Request) error { request.SetURL(baseUrl + request.URL()) return nil }) if cfg.Proxy != nil { cli.SetDial(fasthttpproxy.FasthttpHTTPDialer(fmt.Sprintf("%s:%s@%s:%s", cfg.Proxy.User, cfg.Proxy.Pass, cfg.Proxy.Host, cfg.Proxy.Port))) } return &ConsignBidClientImpl{ cli: cli, cfg: cfg.Public, baseUrl: baseUrl, } } // 获取平台sku最低价【闪电直发】 const FastLowestPriceUrl = "/dop/api/v1/consign/bidding/lowest_price" type LowestPriceReq struct { PublicParams `param:",inline"` SkuId int `json:"sku_id" url:"sku_id" param:"sku_id"` } type LowestPriceResponse struct { SkuId int `json:"sku_id"` Items []LowestPriceItem `json:"items"` } type LowestPriceItem struct { LowestPrice int `json:"lowest_price"` BiddingType BiddingType `json:"bidding_type"` } func (a *ConsignBidClientImpl) LowestPrice(skuId int) (LowestPriceResponse, error) { if skuId == 0 { return LowestPriceResponse{}, Err_Params_None } data := LowestPriceReq{ PublicParams: PublicParams{ AppKey: a.cfg.Key, Timestamp: time.Now().UnixMilli(), }, SkuId: skuId, } Sign(&data, a.cfg.Secret) r := a.cli.R() defer client.ReleaseRequest(r) response, err := r.SetJSON(data).Post(FastLowestPriceUrl) if err != nil { return LowestPriceResponse{}, errors.Wrapf(Err_Request_Err, "consign/bidding/lowest_price err:%v", err) } defer client.ReleaseResponse(response) var resp PublicResponse[LowestPriceResponse] if err = response.JSON(&resp); err != nil { return LowestPriceResponse{}, errors.Wrapf(Err_JSON_UNMarshal, "consign/bidding/lowest_price err:%v", err) } if resp.Code != http.StatusOK { return LowestPriceResponse{}, errors.Wrapf(Err_Request_Err, "consign/bidding/lowest_price resp.msg:%v", resp.Msg) } return resp.Data, nil }