1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
package ali
import (
"context"
"encoding/base64"
"github.com/gogf/gf/container/garray"
"github.com/gogf/gf/encoding/gjson"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/util/gconv"
)
type refundAli struct {
}
var Refund = refundAli{}
type RefundApplyReq struct {
OrderId string `json:"orderId"` //主订单
OrderEntryIds string `json:"orderEntryIds"` //子订单
DisputeRequest string `json:"disputeRequest"` //退款/退款退货。只有已收到货,才可以选择退款退货[退款:"refund"; 退款退货:"returnRefund"]
ApplyPayment string `json:"applyPayment"` //退款金额(单位:分)
ApplyCarriage string `json:"applyCarriage"` //退运费金额(单位:分)
ApplyReasonId string `json:"applyReasonId"` //退款原因id
Description string `json:"description"` //退款申请理由,2-150字
GoodsStatus string `json:"goodsStatus"` //货物状态[售中等待卖家发货:"refundWaitSellerSend"; 售中等待买家收货:"refundWaitBuyerReceive"; 售中已收货(未确认完成交易):"refundBuyerReceived" 售后未收货:"aftersaleBuyerNotReceived"; 售后已收到货:"aftersaleBuyerReceived"]
Vouchers []string `json:"vouchers"` //凭证图片URLs。1-5张,必须使用API uploadRefundVoucher返回的“图片域名/相对路径”
OrderEntryCountList string `json:"orderEntryCountList"` //子订单退款数量。仅在售中买家已收货(退款退货)时,可指定退货数量;默认,全部退货。
AccessToken string `json:"access_token"`
}
type RefundApplyItem struct {
Id int64 `json:"id"` //子订单id
Count int64 `json:"count"` //子订单购买商品数量
}
type RefundApplyRes struct {
Result struct {
Success bool `json:"success"`
Code string `json:"code"`
Message string `json:"message"`
Result struct {
RefundId string `json:"refundId"` // 创建成功,退款id
} `json:"result"`
} `json:"result"`
}
type RefundReasonReq struct {
OrderId string `json:"orderId"` //主订单id
OrderEntryIds []string `json:"orderEntryIds"` //子订单id
GoodsStatus string `json:"goodsStatus"` //货物状态 售中等待买家发货:”refundWaitSellerSend"; 售中等待买家收货:"refundWaitBuyerReceive"; 售中已收货(未确认完成交易):"refundBuyerReceived" 售后未收货:"aftersaleBuyerNotReceived"; 售后已收到货:"aftersaleBuyerReceived"
AccessToken string `json:"access_token"`
}
type RefundReasonRes struct {
Result struct {
CommonRes
Result struct {
Reasons []struct {
ID int `json:"id"` //原因id
Name string `json:"name"` //原因
NeedVoucher bool `json:"needVoucher"` //凭证是否必须上传
NoRefundCarriage bool `json:"noRefundCarriage"` //是否支持退运费
Tip string `json:"tip,omitempty"` //提示
} `json:"reasons"`
} `json:"result"`
} `json:"result"`
}
type RefundUploadRes struct {
Result struct {
CommonRes
Result struct {
ImageDomain string `json:"imageDomain"`
ImageRelativeURL string `json:"imageRelativeUrl"`
} `json:"result"`
} `json:"result"`
}
type RefundInfoReq struct {
RefundId string `json:"refundId"`
NeedTimeOutInfo bool `json:"needTimeOutInfo"`
NeedOrderRefundOperation bool `json:"needOrderRefundOperation"`
AccessToken string `json:"access_token"`
}
type RefundInfoRes struct {
CommonRes
Result struct {
OpOrderRefundModelDetail struct {
AlipayPaymentId string `json:"alipayPaymentId"`
ApplyCarriage int `json:"applyCarriage"`
ApplyPayment int `json:"applyPayment"`
ApplyReason string `json:"applyReason"`
ApplyReasonId int `json:"applyReasonId"`
ApplySubReasonId int `json:"applySubReasonId"`
BuyerMemberId string `json:"buyerMemberId"`
BuyerSendGoods bool `json:"buyerSendGoods"`
BuyerUserId int `json:"buyerUserId"`
CanRefundPayment int `json:"canRefundPayment"`
CrmModifyRefund bool `json:"crmModifyRefund"`
DisputeRequest int `json:"disputeRequest"`
DisputeType int `json:"disputeType"`
ExtInfo struct {
Enfunddetail string `json:"enfunddetail"`
BizCode string `json:"bizCode"`
LastOrder string `json:"lastOrder"`
Tod string `json:"tod"`
NewRefund string `json:"newRefund"`
BFsc string `json:"b_fsc"`
AgreeReturnMsg string `json:"agree_return_msg"`
OpRole string `json:"opRole"`
B2BBuyerMId string `json:"b2b_buyer_mId"`
ApplyReasonText string `json:"apply_reason_text"`
ApplyInitRefundFee string `json:"apply_init_refund_fee"`
ItemBuyAmount string `json:"itemBuyAmount"`
UserCredit string `json:"userCredit"`
SdkCode string `json:"sdkCode"`
InterceptItemListResult string `json:"interceptItemListResult"`
InterceptStatus string `json:"interceptStatus"`
SellerBatch string `json:"seller_batch"`
RestartForXiaoer string `json:"restartForXiaoer"`
CljZeroSecondRefund string `json:"clj_zero_second_refund"`
Tos string `json:"tos"`
BsSync string `json:"bs_sync"`
OlTf string `json:"ol_tf"`
BPf string `json:"b_pf"`
Sgr string `json:"sgr"`
PartRefund string `json:"part_refund"`
Bgmtc string `json:"bgmtc"`
PayMode string `json:"payMode"`
AppName string `json:"appName"`
SellerDoRefundNick string `json:"sellerDoRefundNick"`
WorkflowName string `json:"workflowName"`
Ttid string `json:"ttid"`
SellerAudit string `json:"seller_audit"`
Rp3 string `json:"rp3"`
SellerAgreedRefundFee string `json:"seller_agreed_refund_fee"`
B2BBt string `json:"b2b_bt"`
B2BExchange string `json:"b2b_exchange"`
ItemPrice string `json:"itemPrice"`
IsVirtual string `json:"isVirtual"`
EXmrf string `json:"EXmrf"`
B2BSellerMId string `json:"b2b_seller_mId"`
BCfRsc string `json:"b_cf_rsc"`
} `json:"extInfo"`
FrozenFund int `json:"frozenFund"`
GmtApply string `json:"gmtApply"`
GmtCompleted string `json:"gmtCompleted"`
GmtCreate string `json:"gmtCreate"`
GmtModified string `json:"gmtModified"`
GmtTimeOut string `json:"gmtTimeOut"`
GoodsReceived bool `json:"goodsReceived"`
GoodsStatus int `json:"goodsStatus"`
Id int64 `json:"id"`
NewRefundReturn bool `json:"newRefundReturn"`
OnlyRefund bool `json:"onlyRefund"`
OrderEntryIdList []int64 `json:"orderEntryIdList"`
OrderId int64 `json:"orderId"`
ProductName string `json:"productName"`
RefundCarriage int `json:"refundCarriage"`
RefundGoods bool `json:"refundGoods"`
RefundId string `json:"refundId"`
RefundPayment int `json:"refundPayment"`
RejectReasonId int `json:"rejectReasonId"`
RejectReason string `json:"rejectReason"` // 拒绝原因
RejectTimes int `json:"rejectTimes"`
SellerDelayDisburse bool `json:"sellerDelayDisburse"`
SellerMemberId string `json:"sellerMemberId"`
SellerMobile string `json:"sellerMobile"`
SellerRealName string `json:"sellerRealName"`
SellerReceiveAddress string `json:"sellerReceiveAddress"`
SellerUserId int64 `json:"sellerUserId"`
Status string `json:"status"`
SupportNewSteppay bool `json:"supportNewSteppay"`
TimeOutFreeze bool `json:"timeOutFreeze"`
TradeTypeStr string `json:"tradeTypeStr"`
RefundOperationList []struct {
AfterOperateStatus string `json:"afterOperateStatus,omitempty"`
BeforeOperateStatus string `json:"beforeOperateStatus,omitempty"`
CloseRefundStepId int `json:"closeRefundStepId"`
CrmModifyRefund bool `json:"crmModifyRefund"`
Discription string `json:"discription"`
GmtCreate string `json:"gmtCreate"`
GmtModified string `json:"gmtModified"`
Id int64 `json:"id"`
MessageStatus int `json:"messageStatus"`
MsgType int `json:"msgType"`
OperateRemark string `json:"operateRemark"`
OperateTypeInt int `json:"operateTypeInt"`
OperatorLoginId string `json:"operatorLoginId"`
OperatorRoleId int `json:"operatorRoleId"`
OperatorUserId int64 `json:"operatorUserId"`
RefundId string `json:"refundId"`
} `json:"refundOperationList"`
BuyerLoginId string `json:"buyerLoginId"`
SellerLoginId string `json:"sellerLoginId"`
} `json:"opOrderRefundModelDetail"`
} `json:"result"`
}
type RefundSubmitReq struct {
RefundId string `json:"refundId"` //退款单号,TQ开头
CompanyNo string `json:"logisticsCompanyNo"` //物流公司编码,调用alibaba.logistics.OpQueryLogisticCompanyList.offline接口查询
ExpressSn string `json:"freightBill"` //物流公司运单号,请准确填写,否则卖家有权拒绝退款
Description string `json:"description"` //发货说明,内容在2-200个字之间
Vouchers []string `json:"vouchers,omitempty"` //凭证图片URLs,必须使用API alibaba.trade.uploadRefundVoucher返回的“图片域名/相对路径”,最多可上传 10 张图片 ;单张大小不超过1M;支持jpg、gif、jpeg、png、和bmp格式。 请上传凭证,以便以后续赔所需(不上传将无法理赔)
AccessToken string `json:"access_token"`
}
type RefundSubmitRes struct {
Result struct {
CommonRes
} `json:"result"`
}
//Apply 创建退款退货申请
func (refundAli) Apply(ctx context.Context, req *RefundApplyReq) (res *RefundApplyRes, err error) {
method := "com.alibaba.trade/alibaba.trade.createRefund"
req.AccessToken = server.AccessToken
result, err := server.Post(ctx, method, gconv.Map(req))
_ = gjson.New(result).Scan(&res)
return
}
//Reason 获取退换货原因
func (*refundAli) Reason(ctx context.Context, req *RefundReasonReq) (res *RefundReasonRes, err error) {
method := "com.alibaba.trade/alibaba.trade.getRefundReasonList"
req.AccessToken = server.AccessToken
result, err := server.Post(ctx, method, gconv.Map(req))
_ = gjson.New(result).Scan(&res)
return
}
// Upload 上传退款退货凭证
func (*refundAli) Upload(ctx context.Context, ImgBase64 string) (res *RefundUploadRes, err error) {
method := "com.alibaba.trade/alibaba.trade.uploadRefundVoucher"
dist, _ := base64.StdEncoding.DecodeString(ImgBase64)
var imgArr = garray.New()
for i := range dist {
imgArr.Append(dist[i])
}
result, err := server.Post(ctx, method, g.Map{
"access_token": server.AccessToken,
"imageData": "[" + imgArr.Join(",") + "]",
})
_ = gjson.New(result).Scan(&res)
return
}
//Info 查询退款单详情-根据退款单ID
func (*refundAli) Info(ctx context.Context, refundId string) (res *RefundInfoRes, err error) {
method := "com.alibaba.trade/alibaba.trade.refund.OpQueryOrderRefund"
var req = &RefundInfoReq{
RefundId: refundId,
NeedOrderRefundOperation: true,
AccessToken: server.AccessToken,
}
result, err := server.Post(ctx, method, gconv.Map(req))
_ = gjson.New(result).Scan(&res)
return
}
//Submit 提交退款货信息
func (*refundAli) Submit(ctx context.Context, req *RefundSubmitReq) (res *RefundSubmitRes, err error) {
method := "com.alibaba.trade/alibaba.trade.refund.returnGoods"
req.AccessToken = server.AccessToken
result, err := server.Post(ctx, method, gconv.Map(req))
_ = gjson.New(result).Scan(&res)
return
}