Jerry 7 năm trước cách đây
mục cha
commit
0204f02075
5 tập tin đã thay đổi với 351 bổ sung28 xóa
  1. 27 0
      alipay_client_test.go
  2. 19 7
      constant.go
  3. 118 16
      wechat_client.go
  4. 124 5
      wechat_client_test.go
  5. 63 0
      wechat_rsp.go

+ 27 - 0
alipay_client_test.go

@@ -1 +1,28 @@
 package gopay
+
+import (
+	"fmt"
+	"github.com/smartwalle/alipay"
+	"testing"
+)
+
+func TestPay(t *testing.T) {
+	//网页&移动应用
+	var AlipayAppId = "2016091200494382"
+	var AlipayPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1wn1sU/8Q0rYLlZ6sq3enrPZw2ptp6FecHR2bBFLjJ+sKzepROd0bKddgj+Mr1ffr3Ej78mLdWV8IzLfpXUi945DkrQcOUWLY0MHhYVG2jSs/qzFfpzmtut2Cl2TozYpE84zom9ei06u2AXLMBkU6VpznZl+R4qIgnUfByt3Ix5b3h4Cl6gzXMAB1hJrrrCkq+WvWb3Fy0vmk/DUbJEz8i8mQPff2gsHBE1nMPvHVAMw1GMk9ImB4PxucVek4ZbUzVqxZXphaAgUXFK2FSFU+Q+q1SPvHbUsjtIyL+cLA6H/6ybFF9Ffp27Y14AHPw29+243/SpMisbGcj2KD+evBwIDAQAB"
+	//私钥通用
+	var AlipayPrivateKey = "MIIEowIBAAKCAQEAxorj0SisU93LxawVWybZzDYfq8bxzw9VIOKDSW1M5ombl/MvZTT9IuBSGvqUxXFSWqY05e+CBlquFrOHTzKttmzeZJEKHpGAkW+4TsX6N4ZCHfz3Sz5MBAzBqQvscUD0FTZ+VlQbQ1HjQiKLbHaNY+fFVn3q2XL6dNtWwFhad592M1lCbzEjZ7yqFcxJ0jIDBh1lWwemHu52iW3YkvLD5lE8IXRiJedh++gPFXCFAkX5HLcc0/jicRTarQ9gRNpHC6B87T2SDjKmgxqcws4CVdYJbztU1KLrsbMALFMOp24x8xsLgR88XeraQyUWe6V3lt1OYEOd9XLHWRx33bRHSwIDAQABAoIBAHjrGfjG1r11Nae8OH19WeRfikZqMdcztVsD2YWcxdsaL+MJPvJapVjaWecIehcN/2QqGcl4Zy5Lh/9Xc68uZFHYWFHTa+BWKYFqE0wWk1/Bqv7slAgFdvJ4enHkSypmrsFEoQkezEPh2ZDrzRJP2ajg/XTB14h72EHXXCxlIyP6q9ldlHyYSc+KOdC3WYOg1FoFXsliZHVKGZUxo4jck+xwdTGRAIKYpdLjpw7DqAWS6N25cx4XK9GuBYoV7AkIM0kpdjDDXAciG2aws6ef4kumWuW/JSbdrFWGLdiAN8GVpBx6+9WTeDKerS9KyDLNf6rsz9Hm3LNWOYCMLlrEFiECgYEA/XB6pZGrbmSebn2lZO+WFs3LYCXoCUy4ePouLYZO7lKsHNeTYRxCc6cbEmap0hpuMCYVPJkqK+nL/CDwBad1QChN5rPVFl2rLtLu0owvoAuTVjWjYNPgDfWb3spXh0p+lZ9oi53kZd4iDGe/jQJzAcpUa3Yj2me6XFFTD+8FNCkCgYEAyIxrkCo2oqGg1aJ7xc9+aBcpsrVg/uppt++dTgiMGSVZ3XuixufZV36lzJOdmCBoFGKwmLgKkStJSOm3SHUqdEKQBbHI95aG3HgnAMRXOtkn1exExfpAmCnAAnAx8RONorOTjrMrW0BO0/NII7O7NkLg/ocahr/lXEylsC8dLlMCgYBDiwiEu6/Oee5nUAEWR2veo/YBp9iRMeswAqzv4Q2EInBQN3vFs7xaCj0CyG2V2wlmt5+NSNyeW27LwRN2zkxHTvaD94VgspH+pqSTZF0E8FDR9vWVxqG91qk11QNCwS2/Pn6kRu4p3+t/Ft9L+00fOwcIpLGlcWOPWvUiF/dxEQKBgQCNEEhwpWC80FejLaFGKIdPjEtmSrKpXBV0rfTF+LkizuUBJ3/9zQNRyeGxnnuRj+nlvO1e3sWACySHRu4G53MvR8qqVr13ecfuuA0nOvPojuq4THKrlzVsUqGelXBrlEdiFFJMY7axfvBzoYIyqq+aoTxFjJ6Z/czFOZyp6tnpxQKBgClvDZ9pUc+WH28fDnDPd36bC6HmBq/fkxo92RJey1aRFSoCtKNW5Eaqem8iDD+WAVYak2Vg7xUHkhwIEyVVfHIxZBXc0X1w3jNFjG1/Fyul4hLjqCH2QI8gOjHXAcDZe+MJa8b33ZTiiilUu5A0N8+Xz8qpMQ84cXODHJcPMPYb"
+	client := alipay.New(AlipayAppId, AlipayPublicKey, AlipayPrivateKey, false)
+
+	p := alipay.AliPayTradeWapPay{}
+	p.NotifyURL = "https://wx1.iguiyu.com/v1/parking/alipay/recharge/notify"
+	p.Subject = "充值"
+	p.OutTradeNo = GetRandomString(32)
+	p.TotalAmount = "0.01"
+	p.ProductCode = "充值"
+	var payURL, err = client.TradeWapPay(p)
+	if err != nil {
+		fmt.Println(err)
+	}
+	fmt.Println("支付URL:", payURL)
+}

+ 19 - 7
constant.go

@@ -5,14 +5,26 @@ const (
 	wx_base_url        = "https://api.mch.weixin.qq.com/"
 	wx_sanbox_base_url = "https://api.mch.weixin.qq.com/sandboxnew/"
 
-	wxURL_UnifiedOrder = wx_base_url + "pay/unifiedorder"
-	wxURL_OrderQuery   = wx_base_url + "pay/orderquery"
-	wxURL_CloseOrder   = wx_base_url + "pay/closeorder"
+	//正式
+	wxURL_UnifiedOrder      = wx_base_url + "pay/unifiedorder"                //统一下单
+	wxURL_OrderQuery        = wx_base_url + "pay/orderquery"                  //查询订单
+	wxURL_CloseOrder        = wx_base_url + "pay/closeorder"                  //关闭订单
+	wxURL_Refund            = wx_base_url + "secapi/pay/refund"               //申请退款
+	wxURL_RefundQuery       = wx_base_url + "pay/refundquery"                 //查询退款
+	wxURL_DownloadBill      = wx_base_url + "pay/downloadbill"                //下载对账单
+	wxURL_DownloadFundFlow  = wx_base_url + "pay/downloadfundflow"            //下载资金账单
+	wxURL_BatchQueryComment = wx_base_url + "billcommentsp/batchquerycomment" //拉取订单评价数据
 
-	wxURL_SanBox_GetSignKey   = wx_sanbox_base_url + "pay/getsignkey"
-	wxURL_SanBox_UnifiedOrder = wx_sanbox_base_url + "pay/unifiedorder"
-	wxURL_SanBox_OrderQuery   = wx_sanbox_base_url + "pay/orderquery"
-	wxURL_SanBox_CloseOrder   = wx_sanbox_base_url + "pay/closeorder"
+	//SanBox
+	wxURL_SanBox_GetSignKey        = wx_sanbox_base_url + "pay/getsignkey"
+	wxURL_SanBox_UnifiedOrder      = wx_sanbox_base_url + "pay/unifiedorder"
+	wxURL_SanBox_OrderQuery        = wx_sanbox_base_url + "pay/orderquery"
+	wxURL_SanBox_CloseOrder        = wx_sanbox_base_url + "pay/closeorder"
+	wxURL_SanBox_Refund            = wx_sanbox_base_url + "pay/refund"
+	wxURL_SanBox_RefundQuery       = wx_sanbox_base_url + "pay/refundquery"
+	wxURL_SanBox_DownloadBill      = wx_sanbox_base_url + "pay/downloadbill"
+	wxURL_SanBox_DownloadFundFlow  = wx_sanbox_base_url + "pay/downloadfundflow"
+	wxURL_SanBox_BatchQueryComment = wx_sanbox_base_url + "billcommentsp/batchquerycomment"
 
 	//支付类型
 	TradeType_Mini   = "JSAPI"

+ 118 - 16
wechat_client.go

@@ -12,7 +12,7 @@ type weChatClient struct {
 	isProd    bool
 }
 
-//初始化微信客户端
+//初始化微信客户端 ok
 //    appId:应用ID
 //    mchID:商户ID
 //    secretKey:Key值
@@ -26,14 +26,22 @@ func NewWeChatClient(appId, mchId, secretKey string, isProd bool) *weChatClient
 	return client
 }
 
-//统一下单
+//统一下单 ok
+//    文档地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1
 func (this *weChatClient) UnifiedOrder(body BodyMap) (wxRsp *weChatUnifiedOrderResponse, err error) {
 	var bytes []byte
 	if this.isProd {
 		//正式环境
 		bytes, err = this.doWeChat(body, wxURL_UnifiedOrder)
+		if err != nil {
+			return nil, err
+		}
 	} else {
+		body.Set("total_fee", 101)
 		bytes, err = this.doWeChat(body, wxURL_SanBox_UnifiedOrder)
+		if err != nil {
+			return nil, err
+		}
 	}
 
 	wxRsp = new(weChatUnifiedOrderResponse)
@@ -44,14 +52,21 @@ func (this *weChatClient) UnifiedOrder(body BodyMap) (wxRsp *weChatUnifiedOrderR
 	return wxRsp, nil
 }
 
-//查询订单
+//查询订单 ok
+//    文档地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_2
 func (this *weChatClient) QueryOrder(body BodyMap) (wxRsp *weChatQueryOrderResponse, err error) {
 	var bytes []byte
 	if this.isProd {
 		//正式环境
 		bytes, err = this.doWeChat(body, wxURL_OrderQuery)
+		if err != nil {
+			return nil, err
+		}
 	} else {
 		bytes, err = this.doWeChat(body, wxURL_SanBox_OrderQuery)
+		if err != nil {
+			return nil, err
+		}
 	}
 
 	wxRsp = new(weChatQueryOrderResponse)
@@ -62,14 +77,21 @@ func (this *weChatClient) QueryOrder(body BodyMap) (wxRsp *weChatQueryOrderRespo
 	return wxRsp, nil
 }
 
-//关闭订单
+//关闭订单 ok
+//    文档地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_3
 func (this *weChatClient) CloseOrder(body BodyMap) (wxRsp *weChatCloseOrderResponse, err error) {
 	var bytes []byte
 	if this.isProd {
 		//正式环境
 		bytes, err = this.doWeChat(body, wxURL_CloseOrder)
+		if err != nil {
+			return nil, err
+		}
 	} else {
 		bytes, err = this.doWeChat(body, wxURL_SanBox_CloseOrder)
+		if err != nil {
+			return nil, err
+		}
 	}
 
 	wxRsp = new(weChatCloseOrderResponse)
@@ -80,32 +102,112 @@ func (this *weChatClient) CloseOrder(body BodyMap) (wxRsp *weChatCloseOrderRespo
 	return wxRsp, nil
 }
 
-//申请退款
-func (this *weChatClient) Refund() {
+//申请退款 ok
+//    文档地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4
+func (this *weChatClient) Refund(body BodyMap) (wxRsp *weChatRefundResponse, err error) {
+	var bytes []byte
+	if this.isProd {
+		//正式环境
+		bytes, err = this.doWeChat(body, wxURL_Refund)
+		if err != nil {
+			return nil, err
+		}
+	} else {
+		bytes, err = this.doWeChat(body, wxURL_SanBox_Refund)
+		if err != nil {
+			return nil, err
+		}
+	}
 
+	wxRsp = new(weChatRefundResponse)
+	err = xml.Unmarshal(bytes, wxRsp)
+	if err != nil {
+		return nil, err
+	}
+	return wxRsp, nil
 }
 
-//查询退款
-func (this *weChatClient) QueryRefund() {
+//查询退款 ok
+//    文档地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_5
+func (this *weChatClient) QueryRefund(body BodyMap) (wxRsp *weChatQueryRefundResponse, err error) {
+	var bytes []byte
+	if this.isProd {
+		//正式环境
+		bytes, err = this.doWeChat(body, wxURL_RefundQuery)
+		if err != nil {
+			return nil, err
+		}
+	} else {
+		bytes, err = this.doWeChat(body, wxURL_SanBox_RefundQuery)
+		if err != nil {
+			return nil, err
+		}
+	}
 
+	wxRsp = new(weChatQueryRefundResponse)
+	err = xml.Unmarshal(bytes, wxRsp)
+	if err != nil {
+		return nil, err
+	}
+	return wxRsp, nil
 }
 
-//下载对账单
-func (this *weChatClient) DownloadBill() {
-
+//下载对账单 ok
+//    文档地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_6
+func (this *weChatClient) DownloadBill(body BodyMap) (wxRsp string, err error) {
+	var bytes []byte
+	if this.isProd {
+		//正式环境
+		bytes, err = this.doWeChat(body, wxURL_DownloadBill)
+	} else {
+		bytes, err = this.doWeChat(body, wxURL_SanBox_DownloadBill)
+	}
+	wxRsp = string(bytes)
+	if err != nil {
+		return wxRsp, err
+	}
+	return wxRsp, nil
 }
 
-//下载资金账单
-func (this *weChatClient) DownloadFundFlow() {
-
+//下载资金账单 ok
+//    文档地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_18&index=7
+//    好像不支持沙箱环境,因为沙箱环境默认需要用MD5签名,但是此接口仅支持HMAC-SHA256签名
+func (this *weChatClient) DownloadFundFlow(body BodyMap) (wxRsp string, err error) {
+	var bytes []byte
+	if this.isProd {
+		//正式环境
+		bytes, err = this.doWeChat(body, wxURL_DownloadFundFlow)
+	} else {
+		bytes, err = this.doWeChat(body, wxURL_SanBox_DownloadFundFlow)
+	}
+	wxRsp = string(bytes)
+	if err != nil {
+		return wxRsp, err
+	}
+	return wxRsp, nil
 }
 
 //拉取订单评价数据
-func (this *weChatClient) BatchQueryComment() {
+//    文档地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_17&index=11
+//    好像不支持沙箱环境,因为沙箱环境默认需要用MD5签名,但是此接口仅支持HMAC-SHA256签名
+func (this *weChatClient) BatchQueryComment(body BodyMap) (wxRsp string, err error) {
+	var bytes []byte
+	if this.isProd {
+		//正式环境
+		body.Set("sign_type", SignType_HMAC_SHA256)
+		bytes, err = this.doWeChat(body, wxURL_BatchQueryComment)
+	} else {
+		bytes, err = this.doWeChat(body, wxURL_SanBox_BatchQueryComment)
+	}
 
+	wxRsp = string(bytes)
+	if err != nil {
+		return wxRsp, err
+	}
+	return wxRsp, nil
 }
 
-//向微信发送请求
+//向微信发送请求 ok
 func (this *weChatClient) doWeChat(body BodyMap, url string) (bytes []byte, err error) {
 	var sign string
 	body.Set("appid", this.AppId)

+ 124 - 5
wechat_client_test.go

@@ -13,7 +13,7 @@ func TestWeChatClient_UnifiedOrder(t *testing.T) {
 	//    mchID:商户ID
 	//    secretKey:Key值
 	//    isProd:是否是正式环境
-	client := NewWeChatClient(appID, mchID, secretKey, true)
+	client := NewWeChatClient(appID, mchID, secretKey, false)
 
 	//初始化参数Map
 	body := make(BodyMap)
@@ -45,11 +45,11 @@ func TestWeChatClient_QueryOrder(t *testing.T) {
 	//    mchID:商户ID
 	//    secretKey:Key值
 	//    isProd:是否是正式环境
-	client := NewWeChatClient(appID, mchID, secretKey, true)
+	client := NewWeChatClient(appID, mchID, secretKey, false)
 
 	//初始化参数结构体
 	body := make(BodyMap)
-	body.Set("out_trade_no", "Osgn3y181hYfFoGvn31MM61hk0mCCpYS")
+	body.Set("out_trade_no", "MfZC2segKxh0bnJSELbvKNeH3d9oWvvQ")
 	body.Set("nonce_str", GetRandomString(32))
 	body.Set("sign_type", SignType_MD5)
 
@@ -67,11 +67,11 @@ func TestWeChatClient_CloseOrder(t *testing.T) {
 	//    mchID:商户ID
 	//    secretKey:Key值
 	//    isProd:是否是正式环境
-	client := NewWeChatClient(appID, mchID, secretKey, true)
+	client := NewWeChatClient(appID, mchID, secretKey, false)
 
 	//初始化参数结构体
 	body := make(BodyMap)
-	body.Set("out_trade_no", "Osgn3y181hYfFoGvn31MM61hk0mCCpYS")
+	body.Set("out_trade_no", "MfZC2segKxh0bnJSELbvKNeH3d9oWvvQ")
 	body.Set("nonce_str", GetRandomString(32))
 	body.Set("sign_type", SignType_MD5)
 
@@ -82,3 +82,122 @@ func TestWeChatClient_CloseOrder(t *testing.T) {
 	}
 	fmt.Println("Response:", wxRsp)
 }
+
+func TestWeChatClient_Refund(t *testing.T) {
+	//初始化微信客户端
+	//    appId:应用ID
+	//    mchID:商户ID
+	//    secretKey:Key值
+	//    isProd:是否是正式环境
+	client := NewWeChatClient(appID, mchID, secretKey, false)
+
+	//初始化参数结构体
+	body := make(BodyMap)
+	body.Set("out_trade_no", "MfZC2segKxh0bnJSELbvKNeH3d9oWvvQ")
+	body.Set("nonce_str", GetRandomString(32))
+	body.Set("sign_type", SignType_MD5)
+	s := GetRandomString(64)
+	fmt.Println("s:", s)
+	body.Set("out_refund_no", s)
+	body.Set("total_fee", 101)
+	body.Set("refund_fee", 101)
+
+	//请求申请退款
+	wxRsp, err := client.Refund(body)
+	if err != nil {
+		fmt.Println("Error:", err)
+	}
+	fmt.Println("Response:", wxRsp)
+}
+
+func TestWeChatClient_QueryRefund(t *testing.T) {
+	//初始化微信客户端
+	//    appId:应用ID
+	//    mchID:商户ID
+	//    secretKey:Key值
+	//    isProd:是否是正式环境
+	client := NewWeChatClient(appID, mchID, secretKey, false)
+
+	//初始化参数结构体
+	body := make(BodyMap)
+	body.Set("out_refund_no", "vk4264I1UQ3Hm3E4AKsavK8npylGSgQA092f9ckUxp8A2gXmnsLEdsupURVTcaC7")
+	body.Set("nonce_str", GetRandomString(32))
+	body.Set("sign_type", SignType_MD5)
+
+	//请求申请退款
+	wxRsp, err := client.QueryRefund(body)
+	if err != nil {
+		fmt.Println("Error:", err)
+	}
+	fmt.Println("Response:", wxRsp)
+}
+
+func TestWeChatClient_DownloadBill(t *testing.T) {
+	//初始化微信客户端
+	//    appId:应用ID
+	//    mchID:商户ID
+	//    secretKey:Key值
+	//    isProd:是否是正式环境
+	client := NewWeChatClient(appID, mchID, secretKey, false)
+
+	//初始化参数结构体
+	body := make(BodyMap)
+	body.Set("nonce_str", GetRandomString(32))
+	body.Set("sign_type", SignType_MD5)
+	body.Set("bill_date", "20190122")
+	body.Set("bill_type", "ALL")
+
+	//请求订单查询,成功后得到结果
+	wxRsp, err := client.DownloadBill(body)
+	if err != nil {
+		fmt.Println("Error:", err)
+	}
+	fmt.Println("Response:", wxRsp)
+}
+
+func TestWeChatClient_DownloadFundFlow(t *testing.T) {
+	//初始化微信客户端
+	//    appId:应用ID
+	//    mchID:商户ID
+	//    secretKey:Key值
+	//    isProd:是否是正式环境
+	client := NewWeChatClient(appID, mchID, secretKey, false)
+
+	//初始化参数结构体
+	body := make(BodyMap)
+	body.Set("nonce_str", GetRandomString(32))
+	body.Set("sign_type", SignType_HMAC_SHA256)
+	body.Set("bill_date", "20190122")
+	body.Set("account_type", "Basic")
+
+	//请求订单查询,成功后得到结果
+	wxRsp, err := client.DownloadFundFlow(body)
+	if err != nil {
+		fmt.Println("Error:", err)
+	}
+	fmt.Println("Response:", wxRsp)
+}
+
+func TestWeChatClient_BatchQueryComment(t *testing.T) {
+	//初始化微信客户端
+	//    appId:应用ID
+	//    mchID:商户ID
+	//    secretKey:Key值
+	//    isProd:是否是正式环境
+	client := NewWeChatClient(appID, mchID, secretKey, false)
+
+	//初始化参数结构体
+	body := make(BodyMap)
+	body.Set("nonce_str", GetRandomString(32))
+	body.Set("sign_type", SignType_HMAC_SHA256)
+	body.Set("begin_time", "20190120000000")
+	body.Set("end_time", "20190122174000")
+	body.Set("offset", "0")
+
+	//请求订单查询,成功后得到结果
+	wxRsp, err := client.BatchQueryComment(body)
+	if err != nil {
+		fmt.Println("Error:", err)
+	}
+	fmt.Println("Response:", wxRsp)
+}

+ 63 - 0
wechat_rsp.go

@@ -68,6 +68,69 @@ type weChatCloseOrderResponse struct {
 	ErrCodeDes string `xml:"err_code_des"`
 }
 
+type weChatRefundResponse 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"`
+	CouponType0         string `xml:"coupon_type_$0"`
+	CouponRefundFee     int    `xml:"coupon_refund_fee"`
+	CouponRefundFee0    int    `xml:"coupon_refund_fee_$0"`
+	CouponRefundCount   int    `xml:"coupon_refund_count"`
+	CouponRefundId0     string `xml:"coupon_refund_id_$0"`
+}
+
+type weChatQueryRefundResponse 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"`
+	TotalRefundCount     int    `xml:"total_refund_count"`
+	TransactionId        string `xml:"transaction_id"`
+	OutTradeNo           string `xml:"out_trade_no"`
+	TotalFee             int    `xml:"total_fee"`
+	SettlementTotalFee   int    `xml:"settlement_total_fee"`
+	FeeType              string `xml:"fee_type"`
+	CashFee              int    `xml:"cash_fee"`
+	RefundCount          int    `xml:"refund_count"`
+	OutRefundNo0         string `xml:"out_refund_no_$0"`
+	RefundId0            string `xml:"refund_id_$0"`
+	RefundChannel0       string `xml:"refund_channel_$0"`
+	RefundFee0           int    `xml:"refund_fee_$0"`
+	SettlementRefundFee0 int    `xml:"settlement_refund_fee_$0"`
+	CouponType00         string `xml:"coupon_type_$0_$0"`
+	CouponRefundFee0     int    `xml:"coupon_refund_fee_$0"`
+	CouponRefundCount0   int    `xml:"coupon_refund_count_$0"`
+	CouponRefundId00     string `xml:"coupon_refund_id_$0_$0"`
+	CouponRefundFee00    int    `xml:"coupon_refund_fee_$0_$0"`
+	RefundStatus0        string `xml:"refund_status_$0"`
+	RefundAccount0       string `xml:"refund_account_$0"`
+	RefundRecvAccout0    string `xml:"refund_recv_accout_$0"`
+	RefundSuccessTime0   string `xml:"refund_success_time_$0"`
+}
+
 type getSignKeyResponse struct {
 	ReturnCode     string `xml:"return_code"`
 	ReturnMsg      string `xml:"return_msg"`