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
package wx
import (
"fmt"
"net/url"
)
// RefundParam https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_4&index=6
type RefundParam struct {
NotifyURL string // 否 异步接收微信支付退款结果通知的回调地址,通知URL必须为外网可访问的url,不允许带参数, 如果参数中传了notify_url,则商户平台上配置的回调地址将不会生效。
SignType string // 否 签名类型,默认为MD5,支持HMAC-SHA256和MD5。
TransactionId string // 微信生成的订单号,在支付通知中有返回
OutTradeNo string // 商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-|*@ ,且在同一个商户号下唯一。
OutRefundNo string // 是 商户系统内部的退款单号,商户系统内部唯一,只能是数字、大小写字母_-|*@ ,同一退款单号多次请求只退一笔。
TotalFee int64 // 是 订单总金额,单位为分,只能为整数,详见支付金额
RefundFee int64 // 是 退款总金额,订单总金额,单位为分,只能为整数,详见支付金额
RefundFeeType string // 否 退款货币类型,需与支付一致,或者不填。符合ISO 4217标准的三位字母代码,默认人民币:CNY,其他值列表详见货币类型
RefundDesc string // 否 若商户传入,会在下发给用户的退款消息中体现退款原因, 注意:若订单退款金额≤1元,且属于部分退款,则不会在退款消息中体现退款原因
RefundAccount string // 否 仅针对老资金流商户使用: REFUND_SOURCE_UNSETTLED_FUNDS---未结算资金退款(默认使用未结算资金退款), REFUND_SOURCE_RECHARGE_FUNDS---可用余额退款
}
func (this RefundParam) Params() url.Values {
var m = make(url.Values)
m.Set("notify_url", this.NotifyURL)
if len(this.SignType) == 0 {
this.SignType = SignTypeMD5
}
m.Set("sign_type", this.SignType)
if len(this.TransactionId) > 0 {
m.Set("transaction_id", this.TransactionId)
}
if len(this.OutTradeNo) > 0 {
m.Set("out_trade_no", this.OutTradeNo)
}
m.Set("out_refund_no", this.OutRefundNo)
m.Set("total_fee", fmt.Sprintf("%d", this.TotalFee))
m.Set("refund_fee", fmt.Sprintf("%d", this.RefundFee))
if len(this.RefundFeeType) > 0 {
m.Set("refund_fee_type", this.RefundFeeType)
}
if len(this.RefundDesc) > 0 {
m.Set("refund_desc", this.RefundDesc)
}
if len(this.RefundAccount) > 0 {
m.Set("refund_account", this.RefundAccount)
}
return m
}
type RefundRsp struct {
ReturnCode string `xml:"return_code"`
ReturnMsg string `xml:"return_msg"`
ResultCode string `xml:"result_code"`
ErrCode string `xml:"err_code"`
ErrCodeDes string `xml:"err_code_des"`
AppId string `xml:"appid"`
MCHId string `xml:"mch_id"`
NonceStr string `xml:"nonce_str"`
Sign string `xml:"sign"`
TransactionId string `xml:"transaction_id"`
OutTradeNo string `xml:"out_trade_no"`
OutRefundNo string `xml:"out_refund_no"`
RefundId string `xml:"refund_id"`
RefundFee int `xml:"refund_fee"`
SettlementRefundFee int `xml:"settlement_refund_fee"`
TotalFee int `xml:"total_fee"`
SettlementTotalFee int `xml:"settlement_total_fee"`
FeeType string `xml:"fee_type"`
CashFee int `xml:"cash_fee"`
CashFeeType string `xml:"cash_fee_type"`
CashRefundFee int `xml:"cash_refund_fee"`
CouponRefundFee int `xml:"coupon_refund_fee"`
CouponRefundCount int `xml:"coupon_refund_count"`
}
// RefundQueryParam https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_5&index=7
type RefundQueryParam struct {
TransactionId string
OutTradeNo string
OutRefundNo string
RefundId string
Offset int
}
func (this RefundQueryParam) Params() url.Values {
var m = make(url.Values)
if this.TransactionId != "" {
m.Set("transaction_id", this.TransactionId)
}
if this.OutTradeNo != "" {
m.Set("out_trade_no", this.OutTradeNo)
}
if this.OutRefundNo != "" {
m.Set("out_refund_no", this.OutRefundNo)
}
if this.RefundId != "" {
m.Set("refund_id", this.RefundId)
}
m.Set("offset", fmt.Sprintf("%d", this.Offset))
return m
}
type RefundQueryRsp struct {
ReturnCode string `xml:"return_code"`
ReturnMsg string `xml:"return_msg"`
ResultCode string `xml:"result_code"`
ErrCode string `xml:"err_code"`
ErrCodeDes string `xml:"err_code_des"`
AppId string `xml:"appid"`
MCHId string `xml:"mch_id"`
NonceStr string `xml:"nonce_str"`
Sign string `xml:"sign"`
TransactionId string `xml:"transaction_id"`
OutTradeNo string `xml:"out_trade_no"`
TotalRefundCount int `xml:"total_refund_count"`
TotalFee int `xml:"total_fee"`
FeeType string `xml:"fee_type"`
CashFee int `xml:"cash_fee"`
CashFeeType string `xml:"cash_fee_type"`
SettlementTotalFee int `xml:"settlement_total_fee"`
RefundCount int `xml:"refund_count"`
RefundFee int `xml:"refund_fee"`
RefundInfos []*RefundInfo `xml:"-"`
}
type RefundInfo struct {
OutRefundNo string
RefundAccount string
RefundChannel string
RefundFee int
RefundId string
RefundRecvAccount string
RefundStatus string
RefundSuccessTime string
}