refund_type.go 5.5 KB
Newer Older
haoyanbin's avatar
1  
haoyanbin committed
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
}