diff --git a/bid-pre-sale.go b/bid-pre-sale.go new file mode 100644 index 0000000..71fe726 --- /dev/null +++ b/bid-pre-sale.go @@ -0,0 +1,75 @@ +package dw_sdk + +import ( + "fmt" + "time" + + "github.com/bytedance/sonic" + "github.com/gofiber/fiber/v3/client" + "github.com/google/go-querystring/query" + "github.com/pkg/errors" + "github.com/valyala/fasthttp/fasthttpproxy" +) + +// https://open.dewu.com/#/api/body?apiId=97&id=3&title=%E5%87%BA%E4%BB%B7%E6%9C%8D%E5%8A%A1API + +// 预售出价服务客户端 +type PreSaleBidClientImpl struct { + cli *client.Client + cfg PublicConfig + baseUrl string +} + +func NewPreSaleBidClient(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 &PreSaleBidClientImpl{ + cli: cli, + cfg: cfg.Public, + baseUrl: baseUrl, + } +} + +// 获取平台sku最低价【全款预售】 +const PreSaleLowestPriceUrl = "/dop/api/v1/bidding/normal_pre_sale/lowest_price" + +func (a *PreSaleBidClientImpl) LowestPrice(skuId int) (*PublicResponse[LowestPriceResponse], error) { + if skuId == 0 { + return nil, Err_Params_None + } + data := LowestPriceReq{ + PublicParams: PublicParams{ + AppKey: a.cfg.Key, + Timestamp: time.Now().UnixMilli(), + }, + SkuId: skuId, + } + + Sign(&data, a.cfg.Secret) + v, _ := query.Values(data) + s := v.Encode() + r := a.cli.R() + defer client.ReleaseRequest(r) + + response, err := r.Get(PreSaleLowestPriceUrl + "?" + s) + if err != nil { + return nil, errors.Wrapf(Err_Request_Err, "%s err:%v", PreSaleLowestPriceUrl, err) + } + defer client.ReleaseResponse(response) + var resp PublicResponse[LowestPriceResponse] + if err = response.JSON(&resp); err != nil { + return nil, errors.Wrapf(Err_JSON_UNMarshal, "%s err:%v", PreSaleLowestPriceUrl, err) + } + return &resp, nil +}