• haoyanbin's avatar
    1 · 1bd9d1c6
    haoyanbin authored
    1bd9d1c6
refund_type.go 5.5 KB
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
}