提交 aa50a3d0 authored 作者: zhanglibo's avatar zhanglibo

Merge branch 'tm'

package tm
import (
"context"
"crypto/hmac"
"crypto/sha1"
"encoding/base64"
"github.com/gogf/gf/encoding/gjson"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/os/gtime"
"github.com/gogf/gf/util/gconv"
"github.com/gogf/gf/util/grand"
"net/url"
"sort"
"strings"
"time"
)
const Source = 7
type Config struct {
ApiUrl string
AppKey string
AppSecret string
BizId string
Version string
SignatureMethod string
RegionId string
SignatureVersion string
Format string
BizUid string
}
var server *Config
const Name = "tm"
const (
apiUrl string = "http://linkedmall.aliyuncs.com/"
regionId string = "cn-hangzhou"
bizId string = "LMALL201912050002"
signatureVersion string = "1.0"
signatureMethod string = "HMAC-SHA1"
version string = "2018-01-16"
format string = "JSON"
typeAnony string = "ANONY"
typeEp string = "EP"
)
func New(req *Config) {
server = req
return
}
func specialUrlEncode(req string) (res string) {
req = url.QueryEscape(req)
req = strings.Replace(req, "+", "%20", -1)
req = strings.Replace(req, "*", "%2A", -1)
req = strings.Replace(req, "*7E", "~", -1)
res = req
return
}
func sign(param map[string]string) {
var keys []string
mewparam := param
for k := range mewparam {
keys = append(keys, k)
}
sort.Strings(keys)
var signStr string
u := url.Values{}
for _, v := range keys {
u.Set(v, mewparam[v])
}
signStr += specialUrlEncode(u.Encode())
signStr = "POST&" + specialUrlEncode("/") + "&" + signStr
param["Signature"] = hmacsha1Base64(signStr)
return
}
func hmacsha1Base64(str string) string {
appSecret := []byte(server.AppSecret + "&")
mac := hmac.New(sha1.New, appSecret)
mac.Write([]byte(str))
return base64.StdEncoding.EncodeToString(mac.Sum(nil))
}
func post(ctx context.Context, method string, params map[string]string) (str string) {
Start := gtime.TimestampMilli()
curtime := time.Now().UTC()
params["Action"] = method
params["AccessKeyId"] = server.AppKey
params["BizId"] = bizId
params["RegionId"] = regionId
params["SignatureMethod"] = signatureMethod
params["SignatureVersion"] = signatureVersion
params["Version"] = version
params["Format"] = format
params["SignatureNonce"] = grand.S(32)
params["Timestamp"] = curtime.Format("2006-01-02T15:04:05Z")
sign(params)
Request := g.Client()
Request.SetHeader("Content-Type", "application/x-www-form-urlencoded")
Request.Timeout(3 * time.Second)
resp, err := Request.Post(apiUrl, params)
defer func() {
_ = resp.Close()
paramStr := gjson.New(params).MustToJsonString()
ctx = context.WithValue(ctx, "Method", "POST")
ctx = context.WithValue(ctx, "URI", apiUrl+params["Action"])
if err != nil {
g.Log().Ctx(ctx).Infof("参数【%v】错误【%v】响应时间【%v】", paramStr, err.Error(), gtime.TimestampMilli()-Start)
} else {
g.Log().Ctx(ctx).Cat(Name).Infof("参数【%v】响应【%v】响应时间【%v】", paramStr, str, gtime.TimestampMilli()-Start)
}
}()
str = resp.ReadAllString()
return
}
func convert(pre string, req []g.Map) (res map[string]string) {
res = make(map[string]string)
for k, v := range req {
for key, val := range v {
res[pre+"."+gconv.String(k+1)+"."+key] = gconv.String(val)
}
}
return
}
package tm
import (
"context"
"encoding/json"
"github.com/gogf/gf/util/gconv"
)
//Regist 注册单个淘宝账号接口(同步)
func (s *Config) Regist(ctx context.Context, thirdPartyUserId interface{}) (res *TmCommon, err error) {
method := "RegistAnonymousTbAccount"
result := post(ctx, method, map[string]string{
"BizUid": s.BizUid,
"ThirdPartyUserId": gconv.String(thirdPartyUserId),
})
_ = json.Unmarshal([]byte(result), &res)
return
}
package tm
import (
"context"
"encoding/json"
"github.com/gogf/gf/util/gconv"
)
type deliverTm struct {
}
var Deliver = deliverTm{}
type DeliverInfoRes struct {
Code string `json:"Code"`
Message string `json:"Message"`
RequestId string `json:"RequestId"`
Data struct {
Data []struct {
DataProvider string `json:"DataProvider"`
LogisticsDetailList struct {
LogisticsDetailList []struct {
StanderdDesc string `json:"StanderdDesc"` //物流信息
OcurrTimeStr string `json:"OcurrTimeStr"` //发生时间
} `json:"LogisticsDetailList"`
} `json:"LogisticsDetailList"`
LogisticsCompanyName string `json:"LogisticsCompanyName"` //本单物流公司名称
logisticsCompanyCode string `json:"logisticsCompanyCode"` //本单物流公司Code
MailNo string `json:"MailNo"` //运单号
DataProviderTitle string `json:"DataProviderTitle"` //数据来源说明,如:本数据由菜鸟裹裹提供
} `json:"Data"`
} `json:"Data"`
}
//Info 物流查询接口
func (s *deliverTm) Info(ctx context.Context, AppID interface{}, LmOrderId string) (res *DeliverInfoRes) {
method := "queryLogistics"
request := map[string]string{
"BizUid": server.BizUid,
"LmOrderId": LmOrderId,
"AccountType": "ANONY",
"ThirdPartyUserId": gconv.String(AppID),
}
result := post(ctx, method, request)
_ = json.Unmarshal([]byte(result), &res)
return
}
package tm
import (
"context"
"encoding/json"
"github.com/gogf/gf/util/gconv"
)
type goodsTm struct {
}
var Goods = goodsTm{}
type GoodsInventoryReq struct {
ItemId string `json:"itemId"`
SkuIdList []string `json:"skuIdList"`
}
type GoodsInventoryRes struct {
Code string `json:"Code"`
Success bool `json:"Success"`
Message string `json:"Message"`
RequestId string `json:"RequestId"`
ItemList struct {
Item []struct {
ItemId int `json:"ItemId"`
SkuList struct {
Sku []struct {
SkuId int `json:"SkuId"`
Inventory struct {
Quantity int `json:"Quantity"`
} `json:"Inventory"`
} `json:"Sku"`
} `json:"SkuList"`
} `json:"Item"`
} `json:"ItemList"`
}
//Inventory 查询库存
func (s *goodsTm) Inventory(ctx context.Context, DivisionCode string, req []GoodsInventoryReq) (res *GoodsInventoryRes, err error) {
method := "queryItemInventory"
request := convert("ItemList", gconv.Maps(req))
request["DivisionCode"] = DivisionCode
result := post(ctx, method, request)
_ = json.Unmarshal([]byte(result), &res)
return
}
package tm
type RenderOrderRes struct {
Code string `json:"Code"`
Message string `json:"Message"`
RequestId string `json:"RequestId"`
Success bool `json:"Success"`
Model struct {
RenderOrderInfos struct {
RenderOrderInfos []struct {
LmItemInfos struct {
LmItemInfos []struct {
ItemId int64 `json:"ItemId"`
Quantity int `json:Quantity`
CanSell bool `json:CanSell`
SkuId int64 `json:SkuId`
Message string `json:Message`
ItemName string `json:ItemName`
} `json:"LmItemInfos"`
} `json:"LmItemInfos"`
DeliveryInfos struct {
DeliveryInfos []struct {
ServiceType int `json:"ServiceType"`
Id string `json:"Id"`
PostFee int64 `json:"PostFee"`
DisplayName string `json:"string"`
} `json:"DeliveryInfos"`
} `json:"DeliveryInfos"`
} `json:"RenderOrderInfos"`
} `json:"RenderOrderInfos"`
} `json:"Model"`
}
type TmCommon struct {
Code string `json:"Code"`
Message string `json:"Message"`
RequestId string `json:"RequestId"`
}
type BatchRegistAnonymousTbAccountRes struct {
Code string `json:"Code"`
Message string `json:"Message"`
RequestId string `json:"RequestId"`
BatchId string `json:"BatchId"`
}
type LeavePictureList struct {
Picture string `json:"Picture"` //图片地址
Desc string `json:"Desc"` //图片描述
}
type GetCustomServiceUrlRes struct {
Code string `json:"Code"`
Message string `json:"Message"`
RequestId string `json:"RequestId"`
UrlData struct {
ReturnUrl string `json:"ReturnUrl"`
} `json:"UrlData"`
}
type SubmitReturnGoodLogisticsRes struct {
Code string `json:"Code"`
Message string `json:"Message"`
RequestId string `json:"RequestId"`
}
type SubmitReturnCancelRes struct {
Code string `json:"Code"`
Message string `json:"Message"`
RequestId string `json:"RequestId"`
}
type BeforeData struct {
Reasons []Reasons `json:"reasons"`
ServiceType []ServiceType `json:"serviceType"`
MaxRefundFeeData struct {
MaxRefundFee int64 `json:"MaxRefundFee"` //本单最大可退款金额
MinRefundFee int64 `json:"MinRefundFee"` //本单最小可退款金额
} `json:"MaxRefundFeeData"`
}
type Reasons struct {
Id int64 `json:"id"` //原因id
Name string `json:"name"` //原因
NeedVoucher bool `json:"needVoucher"` //凭证是否必须上传
NoRefundCarriage bool `json:"noRefundCarriage"` //是否支持退运费
Tip string `json:"tip"` //提示
ServiceType string `json:"serviceType"` //提示
RefundDescRequired bool `json:"refundDescRequired"` //是否要求留言
}
type ServiceType struct {
Code string `json:"code"`
Name string `json:"name"`
}
type Detail struct {
RefundCarriage int64 `json:"refundCarriage"` //运费的实际退款金额,单位:分
RejectReason string `json:"rejectReason"` // 拒绝原因
SellerReceiveAddress string `json:"sellerReceiveAddress"` //卖家地址
RefundPayment int64 `json:"refundPayment"` //实际退款金额,单位:分
SellerMobile string `json:"sellerMobile "` //收货人手机
SellerRealName string `json:"sellerRealName"` //收货人姓名
SellerTel string `json:"sellerTel"` //收货人电话
GoodsStatus int `json:"goodsStatus"` //状态1:买家未收到货 2:买家已收到货 3:买家已退货
RefundGoods bool `json:"refundGoods"` //是否要求退货
OnlyRefund bool `json:"onlyRefund"` //是否仅退款
RejectTimes int `json:"rejectTimes"` //退款单被拒绝的次数
Status string `json:"status"` //
}
package tm
import (
"context"
"encoding/json"
"github.com/gogf/gf/container/garray"
"github.com/gogf/gf/encoding/gjson"
"github.com/gogf/gf/util/gconv"
)
type orderTm struct {
}
var Order = orderTm{}
type OrderGoodsItem struct {
ItemId string `json:"ItemId"`
SkuId string `json:"SkuId"`
Quantity string `json:"Quantity"`
}
type OrderAddress struct {
DivisionCode string `json:"DivisionCode"`
FullName string `json:"FullName"`
Mobile string `json:"Mobile"`
AddressDetail string `json:"AddressDetail"`
}
//Before 验证订单商品
func (s *orderTm) Before(ctx context.Context, addr OrderAddress, itemLists []OrderGoodsItem) (res *RenderOrderRes) {
method := "renderOrder"
request := convert("ItemList", gconv.Maps(itemLists))
request["DeliveryAddress"] = gjson.New(addr).MustToJsonString()
request["BizUid"] = server.BizUid
request["AccountType"] = typeEp
result := post(ctx, method, request)
_ = json.Unmarshal([]byte(result), &res)
return
}
type OrderCreateReq struct {
AppID interface{}
ChannelOrder string
Address *OrderAddress
ItemLists []OrderGoodsItem
}
type OrderCreateRes struct {
Code string `json:"Code"`
Message string `json:"Message"`
RequestId string `json:"RequestId"`
Success bool `json:"Success"`
Model struct {
OrderIds struct {
OrderIds []string `json:"OrderIds"`
} `json:"OrderIds"`
PayTradeIds struct {
PayTradeIds []string `json:"PayTradeIds"`
} `json:"PayTradeIds"`
LmOrderList struct {
LmOrderList []struct {
LmOrderId string `json:"LmOrderId"`
} `json:"LmOrderList"`
} `json:"LmOrderList"`
} `json:"Model"`
}
//Create 下单接口
func (s *Config) Create(ctx context.Context, req OrderCreateReq) (res *OrderCreateRes) {
method := "createOrderV2"
request := convert("ItemList", gconv.Maps(req.ItemLists))
request["DeliveryAddress"] = gjson.New(req.Address).MustToJsonString()
request["BizUid"] = s.BizUid
request["OutTradeId"] = req.ChannelOrder
request["AccountType"] = typeAnony
request["ThirdPartyUserId"] = gconv.String(req.AppID)
result := post(ctx, method, request)
_ = json.Unmarshal([]byte(result), &res)
return
}
type OrderPayReq struct {
AppID interface{}
ChannelOrder string
LmOrderId string
}
//Pay 订单支付
func (s *Config) Pay(ctx context.Context, req OrderPayReq) (res *OrderCreateRes) {
method := "enableOrder"
result := post(ctx, method, map[string]string{
"BizUid": server.BizUid,
"LmOrderId": req.LmOrderId,
"OutTradeId": req.ChannelOrder,
"AccountType": typeAnony,
"ThirdPartyUserId": gconv.String(req.AppID),
})
_ = json.Unmarshal([]byte(result), &res)
return
}
type OrderListReq struct {
AppID interface{}
ChannelOrder string
LmOrderId string
LogisticsStatus string
OrderStatus string
}
type OrderFilter struct {
LmOrderList []string `json:"lmOrderList,omitempty"`
ChannelOrder []string `json:"channelOrderIdList,omitempty"`
LogisticsStatus string `json:"LogisticsStatus,omitempty"`
OrderStatus string `json:"OrderStatus,omitempty"`
}
type OrderListRes struct {
Code string `json:"Code"`
Message string `json:"Message"`
RequestId string `json:"RequestId"`
Success bool `json:"Success"`
PostFee struct {
FundType string `json:"FundType"`
FundAmount int64 `json:"FundAmount"`
FundAmountMoney uint `json:"FundAmountMoney"`
} `json:"PostFee"`
LmOrderList struct {
OrderIds struct {
OrderIds []string `json:"OrderIds"`
} `json:"OrderIds"`
PayTradeIds struct {
PayTradeIds []string `json:"PayTradeIds"`
} `json:"PayTradeIds"`
LmOrderList []struct {
LmOrderId string `json:"LmOrderId"` //订单号,对外统一使用此ID做主键操作
OrderStatus int `json:"OrderStatus"` //订单状态,6=交易成功
OrderAmount uint `json:"OrderAmount"` //订单总金额
TbOrderId string `json:"TbOrderId"` //淘宝订单号
EnableStatus int `json:"EnableStatus"`
CreateDate string `json:"CreateDate"`
SubOrderList struct {
SubOrderList []struct {
ItemId int64 `json:"ItemId"`
OrderStatus int `json:"OrderStatus"` //订单状态,6=交易成功
LmOrderId string `json:"LmOrderId"` //子订单号
TbOrderId string `json:"TbOrderId"` //淘宝子订单号
SkuId string `json:"SkuId"` //下单的商品SkuId
Number int64 `json:"Number"` //下单数量
EnableStatus int `json:"EnableStatus"`
ItemPic string `json:"ItemPic"` //商品图片
ItemPriceList struct {
ItemPriceList []struct {
FundType string `json:"FundType"`
FundAmount int64 `json:"FundAmount"`
FundAmountMoney uint `json:"FundAmountMoney"` //子订单金额,以分为单位
} `json:"ItemPriceList"`
} `json:"ItemPriceList"`
ItemTitle string `json:"ItemTitle"` //商品名称
SkuName string `json:"SkuName"` //下单的商品SKU显示名称
} `json:"SubOrderList"`
} `json:"SubOrderList"`
PostFee struct {
FundType string `json:"FundType"`
FundAmount int64 `json:"FundAmount"`
FundAmountMoney int64 `json:"FundAmountMoney"`
} `json:"PostFee"`
LogisticsStatus int64 `json:"LogisticsStatus"` //物流状态
} `json:"LmOrderList"`
} `json:"LmOrderList"`
}
//List 列表
func (s *orderTm) List(ctx context.Context, req OrderListReq) (res *OrderListRes) {
method := "queryOrderList"
var filterOption = OrderFilter{
LogisticsStatus: req.LogisticsStatus,
OrderStatus: req.OrderStatus,
}
if req.LmOrderId != "" {
filterOption.LmOrderList = garray.NewStrArray().Append(req.LmOrderId).Slice()
}
if req.ChannelOrder != "" {
filterOption.ChannelOrder = garray.NewStrArray().Append(req.ChannelOrder).Slice()
}
request := map[string]string{
"BizUid": server.BizUid,
"FilterOption": gjson.New(filterOption).MustToJsonString(),
"PageNumber": "1",
"PageSize": "20",
"AccountType": typeAnony,
"ThirdPartyUserId": gconv.String(req.AppID),
}
result := post(ctx, method, request)
_ = gjson.New(result).Scan(&res)
return
}
type OrderCancelReq struct {
AppID interface{}
LmOrderId string
}
//Cancel 仅适⽤下单[Create]未⽀付[Pay]的订单
func (s *orderTm) Cancel(ctx context.Context, req OrderCancelReq) (res *OrderListRes) {
method := "cancelOrder"
result := post(ctx, method, map[string]string{
"BizUid": server.BizUid,
"LmOrderId": req.LmOrderId,
"AccountType": typeAnony,
"ThirdPartyUserId": gconv.String(req.AppID),
})
_ = json.Unmarshal([]byte(result), &res)
return
}
package tm
import (
"context"
"encoding/json"
"github.com/gogf/gf/util/gconv"
)
type refundTm struct {
}
var Refund = refundTm{}
type RefundSubmitReq struct {
AppID interface{}
SubLmOrderId string //子订单号
DisputeId string //售后ID
CpCode string //物流编码
LogisticsNo string //物流单号
}
//Submit 提交退货物流信息接口
func (s *refundTm) Submit(ctx context.Context, req RefundSubmitReq) (res *SubmitReturnGoodLogisticsRes) {
method := "submitReturnGoodLogistics"
request := map[string]string{
"BizUid": server.BizUid,
"SubLmOrderId": req.SubLmOrderId,
"DisputeId": req.DisputeId,
"CpCode": req.CpCode,
"LogisticsNo": req.LogisticsNo,
"ThirdPartyUserId": gconv.String(req.AppID),
"AccountType": typeAnony,
}
result := post(ctx, method, request)
_ = json.Unmarshal([]byte(result), &res)
return
}
//Cancel 取消退款申请接口
func (s *refundTm) Cancel(ctx context.Context, AppID uint, subLmOrderId, disputeId string) (res *SubmitReturnCancelRes) {
method := "cancelRefund"
request := map[string]string{
"BizUid": server.BizUid,
"SubLmOrderId": subLmOrderId,
"DisputeId": disputeId,
"ThirdPartyUserId": gconv.String(AppID),
"AccountType": typeAnony,
}
result := post(ctx, method, request)
_ = json.Unmarshal([]byte(result), &res)
return
}
type RefundBeforeReq struct {
AppID interface{}
ChannelOrder string
SubLmOrderId string
BizClaimType string
GoodsStatus string
}
type RefundBeforeRes struct {
Code string `json:"Code"`
Message string `json:"Message"`
RequestId string `json:"RequestId"`
InitApplyRefundData struct {
RefundReasonList struct {
RefundReasonList []struct {
ReasonTextId int64 `json:"ReasonTextId"`
ReasonTips string `json:"ReasonTips"`
RefundDescRequired bool `json:"RefundDescRequired"` //是否要求留言
ProofRequired bool `json:"ProofRequired"` //是否要求上传凭证
} `json:"RefundReasonList"`
} `json:"RefundReasonList"`
MaxRefundFeeData struct {
MaxRefundFee int64 `json:"MaxRefundFee"` //本单最大可退款金额
MinRefundFee int64 `json:"MinRefundFee"` //本单最小可退款金额
} `json:"MaxRefundFeeData"`
BizClaimType int `json:"BizClaimType"` // 支持的订单退货方式,1, 标识仅退款,3,标识退货退款
} `json:"InitApplyRefundData"`
}
// Before 前置
func (s *refundTm) Before(ctx context.Context, req RefundBeforeReq) (res *RefundBeforeRes) {
method := "initApplyRefund"
request := map[string]string{
"BizUid": server.BizUid,
"SubLmOrderId": req.SubLmOrderId,
"GoodsStatus": req.GoodsStatus,
"BizClaimType": req.BizClaimType,
"ThirdPartyUserId": gconv.String(req.AppID),
"AccountType": typeAnony,
}
result := post(ctx, method, request)
_ = json.Unmarshal([]byte(result), &res)
return
}
type RefundApplyReq struct {
AppID interface{}
SubLmOrderId string //子订单号
BizClaimType string //退款类型
ApplyRefundFee string //申请退款金额
ApplyRefundCount string //退货数量
ApplyReasonTextId string //退款原因ID
LeaveMessage string //留言
LeavePictureList []*LeavePictureList //凭证,某些原因要求必须有凭证。
GoodsStatus string //当退款类型:仅退款时,货物状态:为4未 发货。所有状态:4: 未发货, 6: 已发货, 1: 未收到货, 2: 已收到货, 3:已寄回, 5: 卖家确 认收货
}
type RefundApplyRes struct {
Code string `json:"Code"`
Message string `json:"Message"`
RequestId string `json:"RequestId"`
RefundApplicationData struct {
SubLmOrderId string `json:"SubLmOrderId"` //当前发起逆向的子订单号
DisputeStatus int `json:"DisputeStatus"` //逆向的状态
DisputeType int `json:"DisputeType"` //任意退款类型
} `json:"RefundApplicationData"`
}
//Apply 申请
func (s *refundTm) Apply(ctx context.Context, req *RefundApplyReq) (res *RefundApplyRes) {
method := "applyRefund"
request := convert("LeavePictureList", gconv.Maps(req.LeavePictureList))
request["SubLmOrderId"] = req.SubLmOrderId
request["BizClaimType"] = req.BizClaimType
request["ApplyRefundFee"] = req.ApplyRefundFee
request["ApplyRefundCount"] = req.ApplyRefundCount
request["ApplyReasonTextId"] = req.ApplyReasonTextId
request["LeaveMessage"] = req.LeaveMessage
request["GoodsStatus"] = req.GoodsStatus
request["BizUid"] = server.BizUid
request["AccountType"] = typeAnony
request["ThirdPartyUserId"] = gconv.String(req.AppID)
result := post(ctx, method, request)
_ = json.Unmarshal([]byte(result), &res)
return
}
type RefundInfoRes struct {
Code string `json:"Code"`
Message string `json:"Message"`
RequestId string `json:"RequestId"`
RefundApplicationDetail struct {
SubLmOrderId string `json:"SubLmOrderId"` //当前发起逆向的子订单号
RealRefundFee int64 `json:"RealRefundFee"` // 实际买家收到的金额
DisputeCreateTime string `json:"DisputeCreateTime"` //"逆向发起时间"
DisputeDesc string `json:"DisputeDesc"` //申请逆向描述
BizClaimType int `json:"BizClaimType"` // 支持的订单退货方式,1, 标识仅退款,3,标识退货退款
ApplyDisputeDesc string `json:"ApplyDisputeDesc"` //当前买家申请退款说明
DisputeType int `json:"DisputeType"` //逆向发生的类型
SellerAgreeMsg string `json:"SellerAgreeMsg"` //卖家同意退货说明,真实的退货地址会在这个字段进行返 回。
ApplyReasonText struct { //买家申请的逆向原因
ReasonTextId int64 `json:"ReasonTextId"`
ReasonTips string `json:"ReasonTips"`
} `json:"ApplyReasonText"`
RefundFee int64 `json:"RefundFee"` // 退款金额(含退平台补贴的金额)
SellerRefuseReason string `json:"SellerRefuseReason"` // 卖家拒绝的留言说明
RefunderTel string `json:"RefunderTel"` //退货联系方式,卖家同意退货后才显示
LmOrderId string `json:"LmOrderId"` //对应的主订单号
DisputeEndTime string `json:"DisputeEndTime"` //逆向发起时间
RefunderName string `json:"RefunderName"` //退货收货人,卖家同意退货后才显示
RefunderZipCode string `json:"RefunderZipCode"` //退货地址邮编,卖家同意退货后才显示
RefunderAddress string `json:"RefunderAddress"` //商家退货地址,卖家同意退货后才显示
DisputeStatus int `json:"DisputeStatus"` //// 逆向的状态
ReturnGoodLogisticsStatus int `json:"ReturnGoodLogisticsStatus"` //// 退货物流状态
SelleAgreementMessage string `json:"SelleAgreementMessage"`
SellerRefuseAgreementMessage string `json:"SellerRefuseAgreementMessage"` //// 卖家拒绝的留言说明
ReturnGoodCount int `json:"ReturnGoodCount"` //退货数量
DisputeId int64 `json:"DisputeId"` //纠纷ID
} `json:"RefundApplicationDetail"`
}
//Info 详情
func (s *refundTm) Info(ctx context.Context, AppID uint, subLmOrderId string) (res *RefundInfoRes) {
method := "queryRefundApplicationDetail"
request := map[string]string{
"BizUid": server.BizUid,
"SubLmOrderId": subLmOrderId,
"ThirdPartyUserId": gconv.String(AppID),
"AccountType": typeAnony,
}
result := post(ctx, method, request)
_ = json.Unmarshal([]byte(result), &res)
return
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论