44 KiB
44 KiB
好的,根据文档,ROA签名由阿里云OpenAPI客户端自动处理,无需额外加密算法。我将直接生成所有6个文件。
// File: sdk_tb_linkedmall/go.mod
module sdk_tb_linkedmall
go 1.21
require (
github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.10
github.com/alibabacloud-go/tea/v2 v2.2.8
)
// File: sdk_tb_linkedmall/types.go
package sdk_tb_linkedmall
// ============================================================
// 公共响应结构体
// ============================================================
// CommonResponse 是所有API的统一外层响应结构
type CommonResponse struct {
RequestId string `json:"RequestId"`
Success bool `json:"Success"`
Code string `json:"Code"`
Message string `json:"Message"`
SubCode string `json:"SubCode"`
SubMessage string `json:"SubMessage"`
Data interface{} `json:"Data"`
}
// ============================================================
// 接口1:ListPurchaserShops - 获取采购方店铺列表
// ============================================================
// ListPurchaserShopsReq 查询采购方店铺列表请求参数
type ListPurchaserShopsReq struct {
PageNum int `json:"PageNum,omitempty"`
PageSize int `json:"PageSize,omitempty"`
}
// ListPurchaserShopsRespData 查询采购方店铺列表响应数据
type ListPurchaserShopsRespData struct {
Total int64 `json:"Total"`
PageNum int `json:"PageNum"`
PageSize int `json:"PageSize"`
ShopList []PurchaserShopItem `json:"ShopList"`
}
// PurchaserShopItem 采购方店铺条目
type PurchaserShopItem struct {
ShopId string `json:"ShopId"`
PurchaserId string `json:"PurchaserId"`
ShopName string `json:"ShopName"`
ShopStatus string `json:"ShopStatus"`
}
// ============================================================
// 接口2:GetPurchaserShop - 获取单个采购店铺详情
// ============================================================
// GetPurchaserShopReq 获取采购店铺详情请求参数
type GetPurchaserShopReq struct {
ShopId string `json:"-"` // Path参数
PurchaserId string `json:"PurchaserId,omitempty"` // Query参数
}
// GetPurchaserShopRespData 获取采购店铺详情响应数据
type GetPurchaserShopRespData struct {
ShopId string `json:"ShopId"`
PurchaserId string `json:"PurchaserId"`
ShopName string `json:"ShopName"`
ShopStatus string `json:"ShopStatus"`
ContactInfo string `json:"ContactInfo"`
}
// ============================================================
// 接口3:ListSelectionProducts - 查询选品池商品列表
// ============================================================
// ListSelectionProductsReq 查询选品池商品列表请求参数
type ListSelectionProductsReq struct {
PurchaserId string `json:"PurchaserId"`
PageNum int `json:"PageNum,omitempty"`
PageSize int `json:"PageSize,omitempty"`
}
// ListSelectionProductsRespData 查询选品池商品列表响应数据
type ListSelectionProductsRespData struct {
Total int64 `json:"Total"`
PageNum int `json:"PageNum"`
PageSize int `json:"PageSize"`
ProductList []SelectionProductItem `json:"ProductList"`
}
// SelectionProductItem 选品池商品条目
type SelectionProductItem struct {
ProductId string `json:"ProductId"`
Title string `json:"Title"`
MainImage string `json:"MainImage"`
BrandName string `json:"BrandName"`
CategoryId string `json:"CategoryId"`
}
// ============================================================
// 接口4:GetSelectionProduct - 查询选品池商品详情
// ============================================================
// GetSelectionProductReq 查询选品池商品详情请求参数
type GetSelectionProductReq struct {
ProductId string `json:"-"` // Path参数
PurchaserId string `json:"PurchaserId"`
DivisionCode string `json:"DivisionCode,omitempty"`
}
// GetSelectionProductRespData 查询选品池商品详情响应数据
type GetSelectionProductRespData struct {
ProductId string `json:"ProductId"`
Title string `json:"Title"`
MainImage string `json:"MainImage"`
Images []string `json:"Images"`
BrandName string `json:"BrandName"`
CategoryId string `json:"CategoryId"`
Desc string `json:"Desc"`
SkuList []SelectionSkuItem `json:"SkuList"`
CanSale bool `json:"CanSale"`
StockQuantity int64 `json:"StockQuantity"`
}
// SelectionSkuItem SKU条目
type SelectionSkuItem struct {
SkuId string `json:"SkuId"`
SkuSpec string `json:"SkuSpec"`
SalePrice int64 `json:"SalePrice"` // 单位分
MarketPrice int64 `json:"MarketPrice"` // 单位分
StockQuantity int64 `json:"StockQuantity"`
}
// ============================================================
// 接口5:GetSelectionProductSaleInfo - 查询选品池商品销售信息
// ============================================================
// GetSelectionProductSaleInfoReq 查询选品池商品销售信息请求参数
type GetSelectionProductSaleInfoReq struct {
ProductId string `json:"-"` // Path参数
PurchaserId string `json:"PurchaserId"`
DivisionCode string `json:"DivisionCode,omitempty"`
}
// GetSelectionProductSaleInfoRespData 选品池商品销售信息
type GetSelectionProductSaleInfoRespData struct {
ProductId string `json:"ProductId"`
CanSale bool `json:"CanSale"`
SalePrice int64 `json:"SalePrice"`
MarketPrice int64 `json:"MarketPrice"`
StockQuantity int64 `json:"StockQuantity"`
}
// ============================================================
// 接口6:ListSelectionProductSaleInfos - 批量查询商品销售信息
// ============================================================
// ListSelectionProductSaleInfosReq 批量查询商品销售信息请求参数
type ListSelectionProductSaleInfosReq struct {
PurchaserId string `json:"PurchaserId"`
ProductIdList []string `json:"ProductIdList"`
DivisionCode string `json:"DivisionCode,omitempty"`
}
// ListSelectionProductSaleInfosRespData 批量查询商品销售信息响应数据
type ListSelectionProductSaleInfosRespData struct {
ProductSaleInfoList []GetSelectionProductSaleInfoRespData `json:"ProductSaleInfoList"`
}
// ============================================================
// 接口7:ListSelectionSkuSaleInfos - 批量SKU销售信息
// ============================================================
// ListSelectionSkuSaleInfosReq 批量SKU销售信息请求参数
type ListSelectionSkuSaleInfosReq struct {
PurchaserId string `json:"PurchaserId"`
SkuIdList []string `json:"SkuIdList"`
DivisionCode string `json:"DivisionCode,omitempty"`
}
// ListSelectionSkuSaleInfosRespData 批量SKU销售信息响应数据
type ListSelectionSkuSaleInfosRespData struct {
SkuSaleInfoList []SelectionSkuItem `json:"SkuSaleInfoList"`
}
// ============================================================
// 接口8:ListCategories - 查询类目列表
// ============================================================
// ListCategoriesReq 查询类目列表请求参数
type ListCategoriesReq struct {
PurchaserId string `json:"PurchaserId"`
ParentCategoryId string `json:"ParentCategoryId,omitempty"`
}
// ListCategoriesRespData 类目列表响应数据
type ListCategoriesRespData struct {
CategoryList []CategoryItem `json:"CategoryList"`
}
// CategoryItem 类目条目
type CategoryItem struct {
CategoryId string `json:"CategoryId"`
CategoryName string `json:"CategoryName"`
ParentId string `json:"ParentId"`
Level int `json:"Level"`
}
// ============================================================
// 接口9:SearchProducts - 搜索选品池商品
// ============================================================
// SearchProductsReq 搜索选品池商品请求参数
type SearchProductsReq struct {
Keyword string `json:"Keyword,omitempty"`
CategoryId string `json:"CategoryId,omitempty"`
PageNum int `json:"PageNum,omitempty"`
PageSize int `json:"PageSize,omitempty"`
PurchaserId string `json:"PurchaserId"`
}
// SearchProductsRespData 搜索选品池商品响应数据
type SearchProductsRespData struct {
Total int64 `json:"Total"`
PageNum int `json:"PageNum"`
PageSize int `json:"PageSize"`
ProductList []SelectionProductItem `json:"ProductList"`
}
// ============================================================
// 接口10:SelectionGroupAddProduct - 选品池商品入库
// ============================================================
// SelectionGroupAddProductReq 选品池商品入库请求参数
type SelectionGroupAddProductReq struct {
PurchaserId string `json:"PurchaserId"`
ShopId string `json:"ShopId"`
ProductIdList []string `json:"ProductIdList"`
}
// ============================================================
// 接口11:SelectionGroupRemoveProduct - 选品池商品出库
// ============================================================
// SelectionGroupRemoveProductReq 选品池商品出库请求参数
type SelectionGroupRemoveProductReq struct {
PurchaserId string `json:"PurchaserId"`
ShopId string `json:"ShopId"`
ProductIdList []string `json:"ProductIdList"`
}
// ============================================================
// 接口12:RenderPurchaseOrder - 采购单渲染(下单预校验)
// ============================================================
// RenderPurchaseOrderReq 采购单渲染请求参数
type RenderPurchaseOrderReq struct {
PurchaserId string `json:"PurchaserId"`
ShopId string `json:"ShopId"`
DivisionCode string `json:"DivisionCode"`
ItemList []RenderOrderItem `json:"ItemList"`
ReceiverInfo ReceiverInfo `json:"ReceiverInfo"`
}
// RenderOrderItem 渲染商品条目
type RenderOrderItem struct {
SkuId string `json:"SkuId"`
Quantity int64 `json:"Quantity"`
}
// ReceiverInfo 收货人信息
type ReceiverInfo struct {
ReceiverName string `json:"ReceiverName"`
ReceiverPhone string `json:"ReceiverPhone"`
ProvinceCode string `json:"ProvinceCode"`
CityCode string `json:"CityCode"`
DistrictCode string `json:"DistrictCode"`
TownCode string `json:"TownCode"`
DetailAddress string `json:"DetailAddress"`
}
// RenderPurchaseOrderRespData 采购单渲染响应数据
type RenderPurchaseOrderRespData struct {
TotalFee int64 `json:"TotalFee"` // 总金额,单位分
TotalFreightFee int64 `json:"TotalFreightFee"` // 总运费,单位分
ItemList []RenderResultItem `json:"ItemList"`
UnavailableList []UnavailableItem `json:"UnavailableList"` // 不可售商品列表
}
// RenderResultItem 渲染结果商品条目
type RenderResultItem struct {
SkuId string `json:"SkuId"`
ProductId string `json:"ProductId"`
Title string `json:"Title"`
Quantity int64 `json:"Quantity"`
SalePrice int64 `json:"SalePrice"` // 实时单价,单位分
TotalFee int64 `json:"TotalFee"` // 小计金额,单位分
FreightFee int64 `json:"FreightFee"` // 运费,单位分
CanSale bool `json:"CanSale"`
UnavailableReason string `json:"UnavailableReason,omitempty"`
}
// UnavailableItem 不可售商品
type UnavailableItem struct {
SkuId string `json:"SkuId"`
ProductId string `json:"ProductId"`
Reason string `json:"Reason"`
}
// ============================================================
// 接口13:SplitPurchaseOrder - 采购单渲染并拆单
// ============================================================
// SplitPurchaseOrderReq 采购单渲染并拆单请求参数(与RenderPurchaseOrderReq相同)
type SplitPurchaseOrderReq = RenderPurchaseOrderReq
// SplitPurchaseOrderRespData 采购单渲染并拆单响应数据
type SplitPurchaseOrderRespData struct {
SubOrderList []SubOrderRenderResult `json:"SubOrderList"`
}
// SubOrderRenderResult 子单渲染结果
type SubOrderRenderResult struct {
ShopId string `json:"ShopId"`
ShopName string `json:"ShopName"`
TotalFee int64 `json:"TotalFee"`
FreightFee int64 `json:"FreightFee"`
ItemList []RenderResultItem `json:"ItemList"`
}
// ============================================================
// 接口14:CreatePurchaseOrder - 创建采购单【异步】
// ============================================================
// CreatePurchaseOrderReq 创建采购单请求参数
type CreatePurchaseOrderReq struct {
PurchaserId string `json:"PurchaserId"`
ShopId string `json:"ShopId"`
OuterPurchaseOrderId string `json:"OuterPurchaseOrderId"` // 外部业务唯一单号,幂等
DivisionCode string `json:"DivisionCode"`
ReceiverInfo ReceiverInfo `json:"ReceiverInfo"`
SubOrderList []CreateSubOrderItem `json:"SubOrderList"`
}
// CreateSubOrderItem 创建采购单子单条目
type CreateSubOrderItem struct {
SkuId string `json:"SkuId"`
Quantity int64 `json:"Quantity"`
}
// CreatePurchaseOrderRespData 创建采购单响应数据
type CreatePurchaseOrderRespData struct {
PurchaseOrderId string `json:"PurchaseOrderId"` // 阿里云采购单号
}
// ============================================================
// 接口15:GetPurchaseOrderStatus - 获取采购单状态
// ============================================================
// GetPurchaseOrderStatusReq 获取采购单状态请求参数
type GetPurchaseOrderStatusReq struct {
PurchaseOrderId string `json:"-"` // Path参数
PurchaserId string `json:"PurchaserId"`
}
// GetPurchaseOrderStatusRespData 获取采购单状态响应数据
type GetPurchaseOrderStatusRespData struct {
PurchaseOrderId string `json:"PurchaseOrderId"`
Status string `json:"Status"` // INIT、PROCESS、SUCCESS、FAIL、CLOSED
}
// 采购单状态常量
const (
PurchaseOrderStatusInit = "INIT"
PurchaseOrderStatusProcess = "PROCESS"
PurchaseOrderStatusSuccess = "SUCCESS"
PurchaseOrderStatusFail = "FAIL"
PurchaseOrderStatusClosed = "CLOSED"
)
// ============================================================
// 接口16:GetOrder - 获取订单详情
// ============================================================
// GetOrderReq 获取订单详情请求参数
type GetOrderReq struct {
OrderId string `json:"-"` // Path参数
PurchaserId string `json:"PurchaserId"`
}
// GetOrderRespData 获取订单详情响应数据
type GetOrderRespData struct {
OrderId string `json:"OrderId"`
PurchaseOrderId string `json:"PurchaseOrderId"`
PurchaserId string `json:"PurchaserId"`
ShopId string `json:"ShopId"`
OrderStatus string `json:"OrderStatus"`
TotalFee int64 `json:"TotalFee"` // 实付金额,单位分
FreightFee int64 `json:"FreightFee"` // 运费,单位分
ReceiverInfo ReceiverInfo `json:"ReceiverInfo"`
OrderItemList []OrderItem `json:"OrderItemList"`
CreateTime string `json:"CreateTime"`
PayTime string `json:"PayTime,omitempty"`
DeliveryTime string `json:"DeliveryTime,omitempty"`
ConfirmReceiveTime string `json:"ConfirmReceiveTime,omitempty"`
}
// OrderItem 订单商品明细
type OrderItem struct {
OrderItemId string `json:"OrderItemId"`
SkuId string `json:"SkuId"`
ProductId string `json:"ProductId"`
Title string `json:"Title"`
Quantity int64 `json:"Quantity"`
SalePrice int64 `json:"SalePrice"`
TotalFee int64 `json:"TotalFee"`
ItemStatus string `json:"ItemStatus"`
}
// ============================================================
// 接口17:QueryOrders - 查询订单列表
// ============================================================
// QueryOrdersReq 查询订单列表请求参数
type QueryOrdersReq struct {
PurchaserId string `json:"PurchaserId"`
PurchaseOrderId string `json:"PurchaseOrderId,omitempty"`
PageNum int `json:"PageNum,omitempty"`
PageSize int `json:"PageSize,omitempty"`
StartTime string `json:"StartTime,omitempty"`
EndTime string `json:"EndTime,omitempty"`
}
// QueryOrdersRespData 查询订单列表响应数据
type QueryOrdersRespData struct {
Total int64 `json:"Total"`
PageNum int `json:"PageNum"`
PageSize int `json:"PageSize"`
OrderList []GetOrderRespData `json:"OrderList"`
}
// ============================================================
// 接口18:ListLogisticsOrders - 查询订单物流信息
// ============================================================
// ListLogisticsOrdersReq 查询订单物流信息请求参数
type ListLogisticsOrdersReq struct {
OrderId string `json:"-"` // Path参数
PurchaserId string `json:"PurchaserId"`
}
// ListLogisticsOrdersRespData 查询订单物流信息响应数据
type ListLogisticsOrdersRespData struct {
LogisticsList []LogisticsInfo `json:"LogisticsList"`
}
// LogisticsInfo 物流信息
type LogisticsInfo struct {
LogisticsCompany string `json:"LogisticsCompany"`
TrackingNumber string `json:"TrackingNumber"`
TrajectoryList []LogisticsTrace `json:"TrajectoryList"`
}
// LogisticsTrace 物流轨迹
type LogisticsTrace struct {
Time string `json:"Time"`
Content string `json:"Content"`
Location string `json:"Location,omitempty"`
}
// ============================================================
// 接口19:ConfirmDisburse - 确认收货
// ============================================================
// ConfirmDisburseReq 确认收货请求参数
type ConfirmDisburseReq struct {
OrderId string `json:"-"` // Path参数
PurchaserId string `json:"PurchaserId"`
}
// ============================================================
// 接口20:RenderRefundOrder - 售后渲染预校验
// ============================================================
// RenderRefundOrderReq 售后渲染预校验请求参数
type RenderRefundOrderReq struct {
PurchaserId string `json:"PurchaserId"`
OrderId string `json:"OrderId"`
OrderItemId string `json:"OrderItemId"`
RefundQuantity int64 `json:"RefundQuantity"`
RefundType string `json:"RefundType"` // 仅退款/退货退款
}
// RenderRefundOrderRespData 售后渲染预校验响应数据
type RenderRefundOrderRespData struct {
CanRefund bool `json:"CanRefund"`
RefundAmount int64 `json:"RefundAmount"` // 可退金额,单位分
RefundQuantity int64 `json:"RefundQuantity"` // 可退数量
RefundType string `json:"RefundType"`
Reason string `json:"Reason,omitempty"`
}
// ============================================================
// 接口21:CreateRefundOrder - 创建售后单
// ============================================================
// CreateRefundOrderReq 创建售后单请求参数
type CreateRefundOrderReq struct {
PurchaserId string `json:"PurchaserId"`
OrderId string `json:"OrderId"`
OrderItemId string `json:"OrderItemId"`
RefundQuantity int64 `json:"RefundQuantity"`
RefundAmount int64 `json:"RefundAmount"` // 单位分
RefundType string `json:"RefundType"`
RefundReason string `json:"RefundReason"`
OuterRefundNo string `json:"OuterRefundNo"` // 外部售后单号,幂等
}
// CreateRefundOrderRespData 创建售后单响应数据
type CreateRefundOrderRespData struct {
RefundOrderId string `json:"RefundOrderId"`
}
// ============================================================
// 接口22:CancelRefundOrder - 取消售后单
// ============================================================
// CancelRefundOrderReq 取消售后单请求参数
type CancelRefundOrderReq struct {
RefundOrderId string `json:"-"` // Path参数
PurchaserId string `json:"PurchaserId"`
}
// ============================================================
// 接口23:GetRefundOrder - 获取售后单详情
// ============================================================
// GetRefundOrderReq 获取售后单详情请求参数
type GetRefundOrderReq struct {
RefundOrderId string `json:"-"` // Path参数
PurchaserId string `json:"PurchaserId"`
}
// GetRefundOrderRespData 获取售后单详情响应数据
type GetRefundOrderRespData struct {
RefundOrderId string `json:"RefundOrderId"`
OrderId string `json:"OrderId"`
OrderItemId string `json:"OrderItemId"`
PurchaserId string `json:"PurchaserId"`
RefundAmount int64 `json:"RefundAmount"`
RefundQuantity int64 `json:"RefundQuantity"`
RefundType string `json:"RefundType"`
RefundReason string `json:"RefundReason"`
RefundStatus string `json:"RefundStatus"`
OuterRefundNo string `json:"OuterRefundNo"`
CreateTime string `json:"CreateTime"`
}
// ============================================================
// 接口24:CreateGoodsShippingNotice - 回填退货物流运单
// ============================================================
// CreateGoodsShippingNoticeReq 回填退货物流运单请求参数
type CreateGoodsShippingNoticeReq struct {
RefundOrderId string `json:"-"` // Path参数
PurchaserId string `json:"PurchaserId"`
LogisticsCompany string `json:"LogisticsCompany"`
TrackingNumber string `json:"TrackingNumber"`
}
// ============================================================
// 接口25:QueryChildDivisionCode - 查询子区域编码
// ============================================================
// QueryChildDivisionCodeReq 查询子区域编码请求参数
type QueryChildDivisionCodeReq struct {
ParentDivisionCode string `json:"ParentDivisionCode,omitempty"`
}
// QueryChildDivisionCodeRespData 查询子区域编码响应数据
type QueryChildDivisionCodeRespData struct {
DivisionList []DivisionInfo `json:"DivisionList"`
}
// DivisionInfo 区域信息
type DivisionInfo struct {
DivisionCode string `json:"DivisionCode"`
DivisionName string `json:"DivisionName"`
Level int `json:"Level"`
ParentCode string `json:"ParentCode,omitempty"`
}
// ============================================================
// 回调通知结构体
// ============================================================
// CallbackMessage 回调通知消息体
type CallbackMessage struct {
EventCode string `json:"EventCode"`
PurchaseOrderId string `json:"PurchaseOrderId"`
OrderIdList []string `json:"OrderIdList"`
Status string `json:"Status"`
RequestId string `json:"RequestId"`
}
// 事件码常量
const (
EventCodePurchaseOrderChange = "PURCHASE_ORDER_CHANGE"
EventCodeOrderStatusChange = "ORDER_STATUS_CHANGE"
EventCodeRefundOrderChange = "REFUND_ORDER_CHANGE"
)
// CallbackResponse 回调响应,告知阿里云消费成功
type CallbackResponse struct {
Success bool `json:"success"`
}
// File: sdk_tb_linkedmall/errors.go
package sdk_tb_linkedmall
import "fmt"
// APIError 表示API调用返回的业务错误
type APIError struct {
Code string // 错误码
Message string // 错误信息
SubCode string // 子错误码
SubMessage string // 子错误信息
RequestId string // 请求ID
}
func (e *APIError) Error() string {
return fmt.Sprintf("linkedmall api error: code=%s, message=%s, subCode=%s, subMessage=%s, requestId=%s",
e.Code, e.Message, e.SubCode, e.SubMessage, e.RequestId)
}
// NewAPIError 创建API错误
func NewAPIError(code, message, subCode, subMessage, requestId string) *APIError {
return &APIError{
Code: code,
Message: message,
SubCode: subCode,
SubMessage: subMessage,
RequestId: requestId,
}
}
// IsBusinessSuccess 判断业务是否成功(需要HTTP 200 + Success=true)
func IsBusinessSuccess(resp *CommonResponse) bool {
return resp != nil && resp.Success
}
// CheckResponse 检查响应是否成功,失败返回error
func CheckResponse(resp *CommonResponse) error {
if resp == nil {
return fmt.Errorf("linkedmall: response is nil")
}
if !resp.Success {
return NewAPIError(resp.Code, resp.Message, resp.SubCode, resp.SubMessage, resp.RequestId)
}
return nil
}
// 预定义错误码常量
const (
ErrCodeShopTypeInvalid = "ShopTypeInvalid"
ErrCodeSkuPriceNotUnique = "SkuPriceUnique"
ErrCodePurchaseOrderNotFound = "PurchaseOrderNotFound"
ErrCodeRefundNumberMustLessThanOrder = "RefundNumberMustLessThanOrder"
ErrCodeRefundAmountMustLessThanOrder = "RefundAmountMustLessThanOrder"
ErrCodeHasNoPrivilege = "HasNoPrivilege"
ErrCodeOrderNotFound = "OrderNotFound"
ErrCodeShopNotFind = "ShopNotFind"
ErrCodeSavePurchaseOrderError = "SavePurchaseOrderError"
ErrCodeOuterPurchaseOrderIdExist = "OuterPurchaseOrderIdExist"
)
// File: sdk_tb_linkedmall/crypto.go
package sdk_tb_linkedmall
// 本SDK使用阿里云OpenAPI客户端(darabonba-openapi/v2)进行ROA签名认证,
// 签名过程由SDK内部自动处理,业务无需自行实现签名算法。
// 因此本文件为占位文件,不包含自定义加密实现。
// File: sdk_tb_linkedmall/client.go
package sdk_tb_linkedmall
import (
"encoding/json"
"fmt"
"strconv"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
"github.com/alibabacloud-go/tea/v2"
)
// Client 是LinkedMall SDK客户端,封装了所有API方法
type Client struct {
openapiClient *openapi.Client
basePath string
}
// NewClient 创建LinkedMall SDK客户端
// - accessKeyId: RAM子账号的AccessKeyId
// - accessKeySecret: RAM子账号的AccessKeySecret
func NewClient(accessKeyId, accessKeySecret string) (*Client, error) {
config := &openapi.Config{
AccessKeyId: tea.String(accessKeyId),
AccessKeySecret: tea.String(accessKeySecret),
RegionId: tea.String("cn-zhangjiakou"),
Endpoint: tea.String("linkedmall.cn-zhangjiakou.aliyuncs.com"),
ReadTimeout: tea.Int(30000),
ConnectTimeout: tea.Int(10000),
}
apiClient, err := openapi.NewClient(config)
if err != nil {
return nil, fmt.Errorf("failed to create openapi client: %w", err)
}
return &Client{
openapiClient: apiClient,
basePath: "/opensaas-s2b/opensaas-s2b-biz-trade/v2",
}, nil
}
// doRequest 执行ROA请求,并解析公共响应体
func (c *Client) doRequest(method, path string, query map[string]string, body interface{}) (*CommonResponse, error) {
// 转换query为map[string]*string
teaQuery := make(map[string]*string, len(query))
for k, v := range query {
if v != "" {
teaQuery[k] = tea.String(v)
}
}
fullPath := c.basePath + path
respBytes, err := c.openapiClient.RoaRequest(
tea.String(method),
tea.String(fullPath),
teaQuery,
body,
nil,
)
if err != nil {
return nil, fmt.Errorf("roa request failed: %w", err)
}
var commonResp CommonResponse
if err := json.Unmarshal(respBytes, &commonResp); err != nil {
return nil, fmt.Errorf("failed to parse response: %w", err)
}
return &commonResp, nil
}
// parseData 将CommonResponse的Data字段解析到目标结构体
func parseData(commonResp *CommonResponse, target interface{}) error {
dataBytes, err := json.Marshal(commonResp.Data)
if err != nil {
return fmt.Errorf("failed to marshal data: %w", err)
}
if err := json.Unmarshal(dataBytes, target); err != nil {
return fmt.Errorf("failed to unmarshal data: %w", err)
}
return nil
}
// ============================================================
// 接口1:ListPurchaserShops - 分页获取采购方店铺列表
// ============================================================
// ListPurchaserShops 分页获取采购方店铺列表
func (c *Client) ListPurchaserShops(req *ListPurchaserShopsReq) (*CommonResponse, *ListPurchaserShopsRespData, error) {
query := make(map[string]string)
if req.PageNum > 0 {
query["PageNum"] = strconv.Itoa(req.PageNum)
}
if req.PageSize > 0 {
query["PageSize"] = strconv.Itoa(req.PageSize)
}
commonResp, err := c.doRequest("GET", "/purchaser-shops", query, nil)
if err != nil {
return nil, nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, nil, err
}
var data ListPurchaserShopsRespData
if err := parseData(commonResp, &data); err != nil {
return commonResp, nil, err
}
return commonResp, &data, nil
}
// ============================================================
// 接口2:GetPurchaserShop - 获取单个采购店铺详情
// ============================================================
// GetPurchaserShop 获取单个采购店铺详情
func (c *Client) GetPurchaserShop(shopId string) (*CommonResponse, *GetPurchaserShopRespData, error) {
query := make(map[string]string)
commonResp, err := c.doRequest("GET", "/purchaser-shops/"+shopId, query, nil)
if err != nil {
return nil, nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, nil, err
}
var data GetPurchaserShopRespData
if err := parseData(commonResp, &data); err != nil {
return commonResp, nil, err
}
return commonResp, &data, nil
}
// ============================================================
// 接口3:ListSelectionProducts - 分页查询选品池商品列表
// ============================================================
// ListSelectionProducts 分页查询选品池商品列表
func (c *Client) ListSelectionProducts(req *ListSelectionProductsReq) (*CommonResponse, *ListSelectionProductsRespData, error) {
query := make(map[string]string)
query["PurchaserId"] = req.PurchaserId
if req.PageNum > 0 {
query["PageNum"] = strconv.Itoa(req.PageNum)
}
if req.PageSize > 0 {
query["PageSize"] = strconv.Itoa(req.PageSize)
}
commonResp, err := c.doRequest("GET", "/selection-products", query, nil)
if err != nil {
return nil, nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, nil, err
}
var data ListSelectionProductsRespData
if err := parseData(commonResp, &data); err != nil {
return commonResp, nil, err
}
return commonResp, &data, nil
}
// ============================================================
// 接口4:GetSelectionProduct - 查询选品池商品详情
// ============================================================
// GetSelectionProduct 查询选品池商品详情
// - divisionCode: 可选,五级乡镇区域编码,传入后返回该区域可售状态
func (c *Client) GetSelectionProduct(req *GetSelectionProductReq) (*CommonResponse, *GetSelectionProductRespData, error) {
query := make(map[string]string)
query["PurchaserId"] = req.PurchaserId
if req.DivisionCode != "" {
query["DivisionCode"] = req.DivisionCode
}
commonResp, err := c.doRequest("GET", "/selection-products/"+req.ProductId, query, nil)
if err != nil {
return nil, nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, nil, err
}
var data GetSelectionProductRespData
if err := parseData(commonResp, &data); err != nil {
return commonResp, nil, err
}
return commonResp, &data, nil
}
// ============================================================
// 接口5:GetSelectionProductSaleInfo - 查询选品池商品销售信息
// ============================================================
// GetSelectionProductSaleInfo 查询选品池商品销售信息
func (c *Client) GetSelectionProductSaleInfo(req *GetSelectionProductSaleInfoReq) (*CommonResponse, *GetSelectionProductSaleInfoRespData, error) {
query := make(map[string]string)
query["PurchaserId"] = req.PurchaserId
if req.DivisionCode != "" {
query["DivisionCode"] = req.DivisionCode
}
commonResp, err := c.doRequest("GET", "/selection-products/"+req.ProductId+"/sale-info", query, nil)
if err != nil {
return nil, nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, nil, err
}
var data GetSelectionProductSaleInfoRespData
if err := parseData(commonResp, &data); err != nil {
return commonResp, nil, err
}
return commonResp, &data, nil
}
// ============================================================
// 接口6:ListSelectionProductSaleInfos - 批量查询商品销售信息
// ============================================================
// ListSelectionProductSaleInfos 批量查询商品销售信息
func (c *Client) ListSelectionProductSaleInfos(req *ListSelectionProductSaleInfosReq) (*CommonResponse, *ListSelectionProductSaleInfosRespData, error) {
commonResp, err := c.doRequest("POST", "/selection-products:batch-sale-info", nil, req)
if err != nil {
return nil, nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, nil, err
}
var data ListSelectionProductSaleInfosRespData
if err := parseData(commonResp, &data); err != nil {
return commonResp, nil, err
}
return commonResp, &data, nil
}
// ============================================================
// 接口7:ListSelectionSkuSaleInfos - 批量SKU销售信息
// ============================================================
// ListSelectionSkuSaleInfos 批量查询SKU销售信息
func (c *Client) ListSelectionSkuSaleInfos(req *ListSelectionSkuSaleInfosReq) (*CommonResponse, *ListSelectionSkuSaleInfosRespData, error) {
commonResp, err := c.doRequest("POST", "/selection-skus:batch-sale-info", nil, req)
if err != nil {
return nil, nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, nil, err
}
var data ListSelectionSkuSaleInfosRespData
if err := parseData(commonResp, &data); err != nil {
return commonResp, nil, err
}
return commonResp, &data, nil
}
// ============================================================
// 接口8:ListCategories - 查询类目列表
// ============================================================
// ListCategories 查询类目列表
// - parentCategoryId: 父类目ID,不传时查询一级类目
func (c *Client) ListCategories(req *ListCategoriesReq) (*CommonResponse, *ListCategoriesRespData, error) {
query := make(map[string]string)
query["PurchaserId"] = req.PurchaserId
if req.ParentCategoryId != "" {
query["ParentCategoryId"] = req.ParentCategoryId
}
commonResp, err := c.doRequest("GET", "/categories", query, nil)
if err != nil {
return nil, nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, nil, err
}
var data ListCategoriesRespData
if err := parseData(commonResp, &data); err != nil {
return commonResp, nil, err
}
return commonResp, &data, nil
}
// ============================================================
// 接口9:SearchProducts - 搜索选品池商品
// ============================================================
// SearchProducts 搜索选品池商品
func (c *Client) SearchProducts(req *SearchProductsReq) (*CommonResponse, *SearchProductsRespData, error) {
commonResp, err := c.doRequest("POST", "/selection-products:search", nil, req)
if err != nil {
return nil, nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, nil, err
}
var data SearchProductsRespData
if err := parseData(commonResp, &data); err != nil {
return commonResp, nil, err
}
return commonResp, &data, nil
}
// ============================================================
// 接口10:SelectionGroupAddProduct - 选品池商品入库
// ============================================================
// SelectionGroupAddProduct 选品池商品入库
func (c *Client) SelectionGroupAddProduct(req *SelectionGroupAddProductReq) (*CommonResponse, error) {
commonResp, err := c.doRequest("POST", "/selection-group/products:add", nil, req)
if err != nil {
return nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, err
}
return commonResp, nil
}
// ============================================================
// 接口11:SelectionGroupRemoveProduct - 选品池商品出库
// ============================================================
// SelectionGroupRemoveProduct 选品池商品出库
func (c *Client) SelectionGroupRemoveProduct(req *SelectionGroupRemoveProductReq) (*CommonResponse, error) {
commonResp, err := c.doRequest("POST", "/selection-group/products:remove", nil, req)
if err != nil {
return nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, err
}
return commonResp, nil
}
// ============================================================
// 接口12:RenderPurchaseOrder - 采购单渲染(下单预校验)
// ============================================================
// RenderPurchaseOrder 采购单渲染(下单预校验)
// 下单前必须调用,获取实时价格、校验商品是否可售
func (c *Client) RenderPurchaseOrder(req *RenderPurchaseOrderReq) (*CommonResponse, *RenderPurchaseOrderRespData, error) {
commonResp, err := c.doRequest("POST", "/purchase-orders:render", nil, req)
if err != nil {
return nil, nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, nil, err
}
var data RenderPurchaseOrderRespData
if err := parseData(commonResp, &data); err != nil {
return commonResp, nil, err
}
return commonResp, &data, nil
}
// ============================================================
// 接口13:SplitPurchaseOrder - 采购单渲染并拆单
// ============================================================
// SplitPurchaseOrder 采购单渲染并拆单
// 返回拆成多份子单结构,用于前端展示,拆单结果用于创建采购单入参
func (c *Client) SplitPurchaseOrder(req *SplitPurchaseOrderReq) (*CommonResponse, *SplitPurchaseOrderRespData, error) {
commonResp, err := c.doRequest("POST", "/purchase-orders:split-render", nil, req)
if err != nil {
return nil, nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, nil, err
}
var data SplitPurchaseOrderRespData
if err := parseData(commonResp, &data); err != nil {
return commonResp, nil, err
}
return commonResp, &data, nil
}
// ============================================================
// 接口14:CreatePurchaseOrder - 创建采购单【异步】
// ============================================================
// CreatePurchaseOrder 创建采购单【异步】
// 重要:接口只返回采购单号,不代表下单成功,必须等待回调通知,再查询订单接口
func (c *Client) CreatePurchaseOrder(req *CreatePurchaseOrderReq) (*CommonResponse, *CreatePurchaseOrderRespData, error) {
commonResp, err := c.doRequest("POST", "/purchase-orders", nil, req)
if err != nil {
return nil, nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, nil, err
}
var data CreatePurchaseOrderRespData
if err := parseData(commonResp, &data); err != nil {
return commonResp, nil, err
}
return commonResp, &data, nil
}
// ============================================================
// 接口15:GetPurchaseOrderStatus - 获取采购单状态
// ============================================================
// GetPurchaseOrderStatus 获取采购单状态
// 状态枚举:INIT、PROCESS、SUCCESS、FAIL、CLOSED
func (c *Client) GetPurchaseOrderStatus(purchaseOrderId, purchaserId string) (*CommonResponse, *GetPurchaseOrderStatusRespData, error) {
query := make(map[string]string)
query["PurchaserId"] = purchaserId
commonResp, err := c.doRequest("GET", "/purchase-orders/"+purchaseOrderId+"/status", query, nil)
if err != nil {
return nil, nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, nil, err
}
var data GetPurchaseOrderStatusRespData
if err := parseData(commonResp, &data); err != nil {
return commonResp, nil, err
}
return commonResp, &data, nil
}
// ============================================================
// 接口16:GetOrder - 获取订单详情
// ============================================================
// GetOrder 获取订单详情
func (c *Client) GetOrder(orderId, purchaserId string) (*CommonResponse, *GetOrderRespData, error) {
query := make(map[string]string)
query["PurchaserId"] = purchaserId
commonResp, err := c.doRequest("GET", "/orders/"+orderId, query, nil)
if err != nil {
return nil, nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, nil, err
}
var data GetOrderRespData
if err := parseData(commonResp, &data); err != nil {
return commonResp, nil, err
}
return commonResp, &data, nil
}
// ============================================================
// 接口17:QueryOrders - 查询订单列表
// ============================================================
// QueryOrders 查询订单列表
func (c *Client) QueryOrders(req *QueryOrdersReq) (*CommonResponse, *QueryOrdersRespData, error) {
query := make(map[string]string)
query["PurchaserId"] = req.PurchaserId
if req.PurchaseOrderId != "" {
query["PurchaseOrderId"] = req.PurchaseOrderId
}
if req.PageNum > 0 {
query["PageNum"] = strconv.Itoa(req.PageNum)
}
if req.PageSize > 0 {
query["PageSize"] = strconv.Itoa(req.PageSize)
}
if req.StartTime != "" {
query["StartTime"] = req.StartTime
}
if req.EndTime != "" {
query["EndTime"] = req.EndTime
}
commonResp, err := c.doRequest("GET", "/orders", query, nil)
if err != nil {
return nil, nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, nil, err
}
var data QueryOrdersRespData
if err := parseData(commonResp, &data); err != nil {
return commonResp, nil, err
}
return commonResp, &data, nil
}
// ============================================================
// 接口18:ListLogisticsOrders - 查询订单物流信息
// ============================================================
// ListLogisticsOrders 查询订单物流信息
func (c *Client) ListLogisticsOrders(orderId, purchaserId string) (*CommonResponse, *ListLogisticsOrdersRespData, error) {
query := make(map[string]string)
query["PurchaserId"] = purchaserId
commonResp, err := c.doRequest("GET", "/orders/"+orderId+"/logistics", query, nil)
if err != nil {
return nil, nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, nil, err
}
var data ListLogisticsOrdersRespData
if err := parseData(commonResp, &data); err != nil {
return commonResp, nil, err
}
return commonResp, &data, nil
}
// ============================================================
// 接口19:ConfirmDisburse - 确认收货
// ============================================================
// ConfirmDisburse 确认收货
func (c *Client) ConfirmDisburse(orderId, purchaserId string) (*CommonResponse, error) {
body := map[string]string{
"PurchaserId": purchaserId,
}
commonResp, err := c.doRequest("POST", "/orders/"+orderId+":confirm-disburse", nil, body)
if err != nil {
return nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, err
}
return commonResp, nil
}
// ============================================================
// 接口20:RenderRefundOrder - 售后渲染预校验
// ============================================================
// RenderRefundOrder 售后渲染预校验
func (c *Client) RenderRefundOrder(req *RenderRefundOrderReq) (*CommonResponse, *RenderRefundOrderRespData, error) {
commonResp, err := c.doRequest("POST", "/refund-orders:render", nil, req)
if err != nil {
return nil, nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, nil, err
}
var data RenderRefundOrderRespData
if err := parseData(commonResp, &data); err != nil {
return commonResp, nil, err
}
return commonResp, &data, nil
}
// ============================================================
// 接口21:CreateRefundOrder - 创建售后单
// ============================================================
// CreateRefundOrder 创建售后单
func (c *Client) CreateRefundOrder(req *CreateRefundOrderReq) (*CommonResponse, *CreateRefundOrderRespData, error) {
commonResp, err := c.doRequest("POST", "/refund-orders", nil, req)
if err != nil {
return nil, nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, nil, err
}
var data CreateRefundOrderRespData
if err := parseData(commonResp, &data); err != nil {
return commonResp, nil, err
}
return commonResp, &data, nil
}
// ============================================================
// 接口22:CancelRefundOrder - 取消售后单
// ============================================================
// CancelRefundOrder 取消售后单
func (c *Client) CancelRefundOrder(refundOrderId, purchaserId string) (*CommonResponse, error) {
body := map[string]string{
"PurchaserId": purchaserId,
}
commonResp, err := c.doRequest("POST", "/refund-orders/"+refundOrderId+":cancel", nil, body)
if err != nil {
return nil, err
}
if err := CheckResponse(commonResp); err != nil {
return commonResp, err
}
return commonResp, nil
}
// ============================================================
// 接口23:GetRefundOrder -