123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277 |
- 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
- }
|