dw-sdk/bid-consign.go

97 lines
2.5 KiB
Go

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
}