|
@@ -0,0 +1,277 @@
|
|
|
+package merchant
|
|
|
+
|
|
|
+import (
|
|
|
+ "crypto/md5"
|
|
|
+ "encoding/hex"
|
|
|
+ "encoding/json"
|
|
|
+ "fmt"
|
|
|
+ "github.com/lin-jim-leon/kuaishou/util"
|
|
|
+ "net/url"
|
|
|
+ "sort"
|
|
|
+ "strings"
|
|
|
+ "time"
|
|
|
+)
|
|
|
+
|
|
|
+const (
|
|
|
+ PickUrl = "https://openapi.kwaixiaodian.com/open/distribution/selection/pick?appkey=%s&access_token=%s&method=open.distribution.selection.pick¶m=%s&sign=%s&version=1&signMethod=MD5×tamp=%d"
|
|
|
+ Selectdetail = "https://openapi.kwaixiaodian.com/open/distribution/query/selection/item/detail?appkey=%s&access_token=%s&method=open.distribution.query.selection.item.detail¶m=%s&sign=%s&version=1&signMethod=MD5×tamp=%d"
|
|
|
+ Corderlisturl = "https://openapi.kwaixiaodian.com/open/distribution/cps/distributor/order/cursor/list?appkey=%s&access_token=%s&method=open.distribution.cps.distributor.order.cursor.list¶m=%s&sign=%s&version=1&signMethod=MD5×tamp=%d"
|
|
|
+)
|
|
|
+
|
|
|
+type Iteminfo struct {
|
|
|
+ Result int `json:"result"`
|
|
|
+ ItemId int64 `json:"itemId"`
|
|
|
+ ErrorMsg string `json:"errorMsg"`
|
|
|
+}
|
|
|
+
|
|
|
+type AddItemsres struct {
|
|
|
+ Result int `json:"result"`
|
|
|
+ Msg string `json:"msg"`
|
|
|
+ ErrorMsg string `json:"error_msg"`
|
|
|
+ Code string `json:"code"`
|
|
|
+ Data []Iteminfo `json:"data"`
|
|
|
+ SubMsg string `json:"sub_msg"`
|
|
|
+ SubCode string `json:"sub_code"`
|
|
|
+}
|
|
|
+
|
|
|
+// generateSign 生成签名
|
|
|
+func generateSign(appkey, signsecret, accesstoken, param string, timestamp int64, method string) string {
|
|
|
+ // 将请求参数按照字典顺序排序
|
|
|
+ params := map[string]string{
|
|
|
+ "access_token": accesstoken,
|
|
|
+ "appkey": appkey,
|
|
|
+ "method": method,
|
|
|
+ "param": param,
|
|
|
+ "signMethod": "MD5",
|
|
|
+ "timestamp": fmt.Sprintf("%d", timestamp),
|
|
|
+ "version": "1",
|
|
|
+ }
|
|
|
+ keys := make([]string, 0, len(params))
|
|
|
+ for k := range params {
|
|
|
+ keys = append(keys, k)
|
|
|
+ }
|
|
|
+ sort.Strings(keys)
|
|
|
+
|
|
|
+ // 构造待签名字符串
|
|
|
+ var signStr strings.Builder
|
|
|
+ for _, k := range keys {
|
|
|
+ signStr.WriteString(fmt.Sprintf("%s=%s&", k, params[k]))
|
|
|
+ }
|
|
|
+ signStr.WriteString("signSecret=" + signsecret)
|
|
|
+
|
|
|
+ // 计算签名值
|
|
|
+ hasher := md5.New()
|
|
|
+ hasher.Write([]byte(signStr.String()))
|
|
|
+ encrypted := hasher.Sum(nil)
|
|
|
+ return hex.EncodeToString(encrypted)
|
|
|
+}
|
|
|
+
|
|
|
+// 商品加橱窗
|
|
|
+func AddItemsToShelf(Appkey string, signsecret string, accesstoken string, itemidlist []string) (Adinfo AddItemsres, err error) {
|
|
|
+ // 构造请求参数 param
|
|
|
+ rawParam := fmt.Sprintf(`{"itemIds":[%s]}`, strings.Join(itemidlist, ","))
|
|
|
+ // 获取当前时间戳(毫秒级)
|
|
|
+ timestamp := time.Now().UnixNano() / int64(time.Millisecond)
|
|
|
+
|
|
|
+ method := "open.distribution.selection.pick"
|
|
|
+ // 对请求参数进行签名
|
|
|
+ sign := generateSign(Appkey, signsecret, accesstoken, rawParam, timestamp, method)
|
|
|
+ // 构造完整的请求 URL
|
|
|
+ encodedParam := url.QueryEscape(rawParam)
|
|
|
+ uri := fmt.Sprintf(PickUrl, Appkey, accesstoken, encodedParam, sign, timestamp)
|
|
|
+
|
|
|
+ // 发送 HTTP GET 请求
|
|
|
+ var response []byte
|
|
|
+ response, err = util.HTTPGet(uri)
|
|
|
+ if err != nil {
|
|
|
+ return AddItemsres{}, err
|
|
|
+ }
|
|
|
+ // 解析响应数据
|
|
|
+ var result AddItemsres
|
|
|
+ err = json.Unmarshal(response, &result)
|
|
|
+ if err != nil {
|
|
|
+ return AddItemsres{}, err
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查是否有错误信息
|
|
|
+ if result.ErrorMsg != "SUCCESS" {
|
|
|
+ return AddItemsres{}, fmt.Errorf("AddItemsToShelf error: %s", result.ErrorMsg)
|
|
|
+ }
|
|
|
+
|
|
|
+ return result, nil
|
|
|
+}
|
|
|
+
|
|
|
+type SelsetionRes struct {
|
|
|
+ Code string `json:"code"`
|
|
|
+ Msg string `json:"msg"`
|
|
|
+ SubCode string `json:"sub_code"`
|
|
|
+ SubMsg string `json:"sub_msg"`
|
|
|
+ Result int `json:"result"`
|
|
|
+ ErrorMsg string `json:"error_msg"`
|
|
|
+ ItemList []DistributeSelectionItem `json:"itemList"`
|
|
|
+ ShopTitle string `json:"shopTitle"`
|
|
|
+}
|
|
|
+
|
|
|
+type DistributeSelectionItem struct {
|
|
|
+ ItemID int64 `json:"itemId"`
|
|
|
+ ZKFinalPrice int64 `json:"zkFinalPrice"`
|
|
|
+ ItemImgURL string `json:"itemImgUrl"`
|
|
|
+ ItemPrice int64 `json:"itemPrice"`
|
|
|
+ SKUList []DistributeSKU `json:"skuList"`
|
|
|
+ SoldCountThirtyDays int64 `json:"soldCountThirtyDays"`
|
|
|
+ ShopTitle string `json:"shopTitle"`
|
|
|
+ CommissionRate int `json:"commissionRate"`
|
|
|
+ BrandName string `json:"brandName"`
|
|
|
+ ItemTitle string `json:"itemTitle"`
|
|
|
+ ProfitAmount int64 `json:"profitAmount"`
|
|
|
+ ShopScore string `json:"shopScore"`
|
|
|
+ ShopStar string `json:"shopStar"`
|
|
|
+ ItemDesc string `json:"itemDesc"`
|
|
|
+ ShopType int `json:"shopType"`
|
|
|
+ CategoryID int `json:"categoryId"`
|
|
|
+ ItemGalleryURLs []string `json:"itemGalleryUrls"`
|
|
|
+ ItemDescURLs []string `json:"itemDescUrls"`
|
|
|
+ MerchantSoldCountThirtyDays int64 `json:"merchantSoldCountThirtyDays"`
|
|
|
+ ShopID int64 `json:"shopId"`
|
|
|
+}
|
|
|
+
|
|
|
+type DistributeSKU struct {
|
|
|
+ SKUPrice int64 `json:"skuPrice"`
|
|
|
+ SKUStock int64 `json:"skuStock"`
|
|
|
+ Specification string `json:"specification"`
|
|
|
+ SKUID int64 `json:"skuId"`
|
|
|
+}
|
|
|
+
|
|
|
+func Queryselectiondetail(Appkey string, signsecret string, accesstoken string, itemidlist []string) (Selectitem SelsetionRes, err error) {
|
|
|
+ // 构造请求参数 param
|
|
|
+ rawParam := fmt.Sprintf(`{"itemId":[%s]}`, strings.Join(itemidlist, ","))
|
|
|
+ // 获取当前时间戳(毫秒级)
|
|
|
+ timestamp := time.Now().UnixNano() / int64(time.Millisecond)
|
|
|
+ method := "open.distribution.query.selection.item.detail"
|
|
|
+ // 对请求参数进行签名
|
|
|
+ sign := generateSign(Appkey, signsecret, accesstoken, rawParam, timestamp, method)
|
|
|
+ // 构造完整的请求 URL
|
|
|
+ encodedParam := url.QueryEscape(rawParam)
|
|
|
+ uri := fmt.Sprintf(Selectdetail, Appkey, accesstoken, encodedParam, sign, timestamp)
|
|
|
+ fmt.Println(uri)
|
|
|
+ // 发送 HTTP GET 请求
|
|
|
+ var response []byte
|
|
|
+ response, err = util.HTTPGet(uri)
|
|
|
+ if err != nil {
|
|
|
+ return SelsetionRes{}, err
|
|
|
+ }
|
|
|
+ fmt.Println(string(response))
|
|
|
+ // 解析响应数据
|
|
|
+ var result SelsetionRes
|
|
|
+ err = json.Unmarshal(response, &result)
|
|
|
+ if err != nil {
|
|
|
+ return SelsetionRes{}, err
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查是否有错误信息
|
|
|
+ if result.ErrorMsg != "" {
|
|
|
+ return SelsetionRes{}, fmt.Errorf("Queryselectiondetail error: %s", result.ErrorMsg)
|
|
|
+ }
|
|
|
+
|
|
|
+ return result, nil
|
|
|
+}
|
|
|
+
|
|
|
+type OrderlistRes struct {
|
|
|
+ Code string `json:"code"` // 主返回码
|
|
|
+ Msg string `json:"msg"` // 主返回信息
|
|
|
+ SubCode string `json:"sub_code"` // 子返回码
|
|
|
+ SubMsg string `json:"sub_msg"` // 子返回信息
|
|
|
+ Result int `json:"result"` // 返回码
|
|
|
+ ErrorMsg string `json:"error_msg"` // 返回错误信息
|
|
|
+ Data OrderCursor `json:"data"` // 返回数据
|
|
|
+}
|
|
|
+
|
|
|
+type OrderCursor struct {
|
|
|
+ Cursor string `json:"pcursor"` // 分销订单位点游标(请求透传, "nomore"标识后续无数据)
|
|
|
+ OrderViews []OrderView `json:"orderView"` // 订单信息
|
|
|
+}
|
|
|
+
|
|
|
+type OrderView struct {
|
|
|
+ DistributorID int64 `json:"distributorId"` // 分销推广者用户ID
|
|
|
+ OrderID int64 `json:"oid"` // 订单ID
|
|
|
+ CPSOrderStatus int `json:"cpsOrderStatus"` // 分销订单状态
|
|
|
+ OrderCreateTime int64 `json:"orderCreateTime"` // 订单创建时间
|
|
|
+ PayTime int64 `json:"payTime"` // 订单支付时间
|
|
|
+ OrderTradeAmount int64 `json:"orderTradeAmount"` // 订单交易总金额
|
|
|
+ CPSOrderProductViews []CPSOrderProductView `json:"cpsOrderProductView"` // 商品信息
|
|
|
+ CreateTime int64 `json:"createTime"` // 创建时间
|
|
|
+ UpdateTime int64 `json:"updateTime"` // 更新时间
|
|
|
+ SettlementSuccessTime int64 `json:"settlementSuccessTime"` // 结算时间
|
|
|
+ SettlementAmount int64 `json:"settlementAmount"` // 结算金额
|
|
|
+ SendTime int64 `json:"sendTime"` // 订单发货时间
|
|
|
+ SendStatus int `json:"sendStatus"` // 订单发货状态
|
|
|
+ RecvTime int64 `json:"recvTime"` // 订单收货时间
|
|
|
+ BuyerOpenID string `json:"buyerOpenId"` // 买家唯一识别ID
|
|
|
+ BaseAmount int64 `json:"baseAmount"` // 计佣基数
|
|
|
+ ShareRateStr string `json:"shareRateStr"` // 分成比例
|
|
|
+ SettlementBizType int `json:"settlementBizType"` // 订单业务结算类型
|
|
|
+ OrderRefundInfo []CPSDistributorOrderRefundInfo `json:"orderRefundInfo"` // 退款信息
|
|
|
+ OrderChannel string `json:"orderChannel"` // 订单渠道标识
|
|
|
+}
|
|
|
+
|
|
|
+type CPSOrderProductView struct {
|
|
|
+ OrderID int64 `json:"oid"` // 订单ID
|
|
|
+ ItemID int64 `json:"itemId"` // 商品ID
|
|
|
+ ItemTitle string `json:"itemTitle"` // 商品标题
|
|
|
+ ItemPrice int64 `json:"itemPrice"` // 商品单价快照
|
|
|
+ EstimatedIncome int64 `json:"estimatedIncome"` // 预估收入
|
|
|
+ CommissionRate int `json:"commissionRate"` // 佣金比率
|
|
|
+ ServiceRate int `json:"serviceRate"` // 平台服务费率
|
|
|
+ ServiceAmount int64 `json:"serviceAmount"` // 平台服务费
|
|
|
+ CPSPID string `json:"cpsPid"` // 推广位id
|
|
|
+ SellerID int64 `json:"sellerId"` // 商家Id
|
|
|
+ SellerNickName string `json:"sellerNickName"` // 商家昵称快照
|
|
|
+ Num int `json:"num"` // 商品数量
|
|
|
+ StepCondition int `json:"stepCondition"` // 阶梯佣金条件
|
|
|
+ StepCommissionRate int `json:"stepCommissionRate"` // 阶梯佣金比率
|
|
|
+ StepCommissionAmount int64 `json:"stepCommissionAmount"` // 阶梯佣金金额
|
|
|
+ ServiceIncome int64 `json:"serviceIncome"` // 接单服务收入
|
|
|
+ ExcitationIncome int64 `json:"excitationIncome"` // 奖励收入
|
|
|
+}
|
|
|
+
|
|
|
+type CPSDistributorOrderRefundInfo struct {
|
|
|
+ StartRefundTime int64 `json:"startRefundTime"` // 发起退款时间
|
|
|
+ EndRefundTime int64 `json:"endRefundTime"` // 完成退款时间
|
|
|
+ RefundFee int64 `json:"refundFee"` // 退款金额
|
|
|
+ RefundStatus string `json:"refundStatus"` // 退款状态
|
|
|
+}
|
|
|
+
|
|
|
+// 订单列表(游标)
|
|
|
+func Corderlist(Appkey string, signsecret string, accesstoken string, cpsOrderStatus int, pageSize int, beginTime int64, endTime int64, pcursor string) (corlist OrderlistRes, err error) {
|
|
|
+ // 构造请求参数 param
|
|
|
+ rawParam := fmt.Sprintf(`{"cpsOrderStatus":%d,"pageSize":%d,"sortType":1,"queryType":1,"beginTime":%d,"endTime":%d,"pcursor":"%s"}`, cpsOrderStatus, pageSize, beginTime, endTime, pcursor)
|
|
|
+ // 获取当前时间戳(毫秒级)
|
|
|
+ timestamp := time.Now().UnixNano() / int64(time.Millisecond)
|
|
|
+
|
|
|
+ method := "open.distribution.cps.distributor.order.cursor.list"
|
|
|
+ // 对请求参数进行签名
|
|
|
+ sign := generateSign(Appkey, signsecret, accesstoken, rawParam, timestamp, method)
|
|
|
+ // 构造完整的请求 URL
|
|
|
+ encodedParam := url.QueryEscape(rawParam)
|
|
|
+ uri := fmt.Sprintf(Corderlisturl, Appkey, accesstoken, encodedParam, sign, timestamp)
|
|
|
+
|
|
|
+ // 发送 HTTP GET 请求
|
|
|
+ var response []byte
|
|
|
+ response, err = util.HTTPGet(uri)
|
|
|
+ if err != nil {
|
|
|
+ return OrderlistRes{}, err
|
|
|
+ }
|
|
|
+ // 解析响应数据
|
|
|
+ var result OrderlistRes
|
|
|
+ err = json.Unmarshal(response, &result)
|
|
|
+ if err != nil {
|
|
|
+ return OrderlistRes{}, err
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查是否有错误信息
|
|
|
+ if result.ErrorMsg != "SUCCESS" {
|
|
|
+ return OrderlistRes{}, fmt.Errorf("Corderlist error: %s", result.ErrorMsg)
|
|
|
+ }
|
|
|
+
|
|
|
+ return result, nil
|
|
|
+}
|