113 lines
3.6 KiB
Go
113 lines
3.6 KiB
Go
|
package dw_sdk
|
|||
|
|
|||
|
import (
|
|||
|
"fmt"
|
|||
|
"github.com/bytedance/sonic"
|
|||
|
"github.com/gofiber/fiber/v3/client"
|
|||
|
"github.com/pkg/errors"
|
|||
|
"time"
|
|||
|
)
|
|||
|
|
|||
|
//商品服务API
|
|||
|
//https://open.dewu.com/#/api/body?apiId=156&id=2&title=%E5%95%86%E5%93%81%E6%9C%8D%E5%8A%A1API
|
|||
|
|
|||
|
type ArticleServiceClient interface {
|
|||
|
BatchArticleNumber(ArticleNumbers []string) (*PublicResponse[[]Spu], error)
|
|||
|
}
|
|||
|
|
|||
|
type ArticleServiceClientImpl struct {
|
|||
|
cli *client.Client
|
|||
|
cfg PublicConfig
|
|||
|
}
|
|||
|
|
|||
|
func NewArticleServiceClient(cfg Config) ArticleServiceClient {
|
|||
|
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)
|
|||
|
}).SetBaseURL(GetUrl(cfg.Public.Env)).Debug()
|
|||
|
if cfg.Proxy != nil {
|
|||
|
err := cli.SetProxyURL(fmt.Sprintf("http://%s:%s@%s:%s", cfg.Proxy.User, cfg.Proxy.Pass, cfg.Proxy.Host, cfg.Proxy.Port))
|
|||
|
if err != nil {
|
|||
|
fmt.Println(err)
|
|||
|
}
|
|||
|
}
|
|||
|
return &ArticleServiceClientImpl{
|
|||
|
cli: cli,
|
|||
|
cfg: cfg.Public,
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//商品spu信息
|
|||
|
//https://open.dewu.com/#/api/body?apiId=156&id=2&title=%E5%95%86%E5%93%81%E6%9C%8D%E5%8A%A1API
|
|||
|
|
|||
|
type BatchArticleNumber struct {
|
|||
|
PublicParams
|
|||
|
ArticleNumbers []string `json:"article_numbers" url:"article_numbers"`
|
|||
|
}
|
|||
|
|
|||
|
type ArticleStatus int
|
|||
|
|
|||
|
// 商品状态
|
|||
|
const (
|
|||
|
ArticleStatus_Offline ArticleStatus = iota
|
|||
|
ArticleStatus_Online
|
|||
|
)
|
|||
|
|
|||
|
type Spu struct {
|
|||
|
SpuId int `json:"spu_id"`
|
|||
|
CategoryId int `json:"category_id"`
|
|||
|
CategoryName string `json:"category_name"`
|
|||
|
BrandId int `json:"brand_id"`
|
|||
|
BrandName string `json:"brand_name"`
|
|||
|
ArticleNumber string `json:"article_number"` //商品货号
|
|||
|
OtherNumbers string `json:"other_numbers"` // 辅助货号,逗号分隔,可传多个
|
|||
|
Title string `json:"title"`
|
|||
|
SpuProperties string `json:"spu_properties,omitempty"`
|
|||
|
AuthPrice int `json:"auth_price"` //官方售价(单位:分)
|
|||
|
Status ArticleStatus `json:"status"` //商品上下架状态(1:上架,0:下架)
|
|||
|
SpuLogo string `json:"spu_logo"`
|
|||
|
Skus []Sku `json:"skus"`
|
|||
|
}
|
|||
|
|
|||
|
type Sku struct {
|
|||
|
SkuId int `json:"sku_id"`
|
|||
|
Status ArticleStatus `json:"status"`
|
|||
|
Properties string `json:"properties"` //{"尺码":"M"} 商品规格属性
|
|||
|
Barcode string `json:"barcode"` //商品条码
|
|||
|
MerchantSkuCode string `json:"merchant_sku_code,omitempty"` // 商家商品编码
|
|||
|
OtherMerchantSkuCodes []string `json:"other_merchant_sku_codes,omitempty"` //辅助商家商品编码
|
|||
|
ExtraCode string `json:"extra_code,omitempty"` //sku得物码(附加码)
|
|||
|
}
|
|||
|
|
|||
|
const BatchArticleNumberURL = "/dop/api/v1/spu/batch_article_number"
|
|||
|
|
|||
|
func (a *ArticleServiceClientImpl) BatchArticleNumber(ArticleNumbers []string) (*PublicResponse[[]Spu], error) {
|
|||
|
if len(ArticleNumbers) == 0 {
|
|||
|
return nil, Err_Params_None
|
|||
|
}
|
|||
|
data := BatchArticleNumber{
|
|||
|
PublicParams: PublicParams{
|
|||
|
AppKey: a.cfg.Key,
|
|||
|
Timestamp: time.Now().UnixMilli(),
|
|||
|
},
|
|||
|
ArticleNumbers: ArticleNumbers,
|
|||
|
}
|
|||
|
Sign(&data, a.cfg.Secret)
|
|||
|
|
|||
|
r := a.cli.R()
|
|||
|
defer client.ReleaseRequest(r)
|
|||
|
|
|||
|
response, err := r.SetJSON(data).Post(BatchArticleNumberURL)
|
|||
|
if err != nil {
|
|||
|
return nil, errors.Wrapf(Err_Request_Err, "BatchArticleNumber err:%v", err)
|
|||
|
}
|
|||
|
defer client.ReleaseResponse(response)
|
|||
|
|
|||
|
var resp PublicResponse[[]Spu]
|
|||
|
if err = response.JSON(&resp); err != nil {
|
|||
|
return nil, errors.Wrapf(Err_JSON_UNMarshal, "BatchArticleNumber err:%v", err)
|
|||
|
}
|
|||
|
return &resp, nil
|
|||
|
}
|