
1package main
2
3import (
4 "bytes"
5 "demo/wxpay_utility"
6 "encoding/json"
7 "fmt"
8 "net/http"
9 "net/url"
10)
11
12func main() {
13
14 config, err := wxpay_utility.CreateMchConfig(
15 "19xxxxxxxx",
16 "1DDE55AD98Exxxxxxxxxx",
17 "/path/to/apiclient_key.pem",
18 "PUB_KEY_ID_xxxxxxxxxxxxx",
19 "/path/to/wxp_pub.pem",
20 )
21 if err != nil {
22 fmt.Println(err)
23 return
24 }
25
26 request := &SubsidiesReturnRequest{
27 SubMchid: wxpay_utility.String("1900000109"),
28 OutOrderNo: wxpay_utility.String("P20150806125346"),
29 TransactionId: wxpay_utility.String("4208450740201411110007820472"),
30 RefundId: wxpay_utility.String("3008450740201411110007820472"),
31 Amount: wxpay_utility.Int64(10),
32 Description: wxpay_utility.String("测试备注"),
33 SubsidyId: wxpay_utility.String("3008450740201411110007820472"),
34 From: []ReturnFrom{ReturnFrom{
35 Account: RETURNACCOUNT_AVAILABLE.Ptr(),
36 Amount: wxpay_utility.Int64(10),
37 }},
38 }
39
40 response, err := ReturnSubsidy(config, request)
41 if err != nil {
42 fmt.Printf("请求失败: %+v\n", err)
43
44 return
45 }
46
47
48 fmt.Printf("请求成功: %+v\n", response)
49}
50
51func ReturnSubsidy(config *wxpay_utility.MchConfig, request *SubsidiesReturnRequest) (response *SubsidiesReturnEntity, err error) {
52 const (
53 host = "https://api.mch.weixin.qq.com"
54 method = "POST"
55 path = "/v3/ecommerce/subsidies/return"
56 )
57
58 reqUrl, err := url.Parse(fmt.Sprintf("%s%s", host, path))
59 if err != nil {
60 return nil, err
61 }
62 reqBody, err := json.Marshal(request)
63 if err != nil {
64 return nil, err
65 }
66 httpRequest, err := http.NewRequest(method, reqUrl.String(), bytes.NewReader(reqBody))
67 if err != nil {
68 return nil, err
69 }
70 httpRequest.Header.Set("Accept", "application/json")
71 httpRequest.Header.Set("Wechatpay-Serial", config.WechatPayPublicKeyId())
72 httpRequest.Header.Set("Content-Type", "application/json")
73 authorization, err := wxpay_utility.BuildAuthorization(config.MchId(), config.CertificateSerialNo(), config.PrivateKey(), method, reqUrl.RequestURI(), reqBody)
74 if err != nil {
75 return nil, err
76 }
77 httpRequest.Header.Set("Authorization", authorization)
78
79 client := &http.Client{}
80 httpResponse, err := client.Do(httpRequest)
81 if err != nil {
82 return nil, err
83 }
84 respBody, err := wxpay_utility.ExtractResponseBody(httpResponse)
85 if err != nil {
86 return nil, err
87 }
88 if httpResponse.StatusCode >= 200 && httpResponse.StatusCode < 300 {
89
90 err = wxpay_utility.ValidateResponse(
91 config.WechatPayPublicKeyId(),
92 config.WechatPayPublicKey(),
93 &httpResponse.Header,
94 respBody,
95 )
96 if err != nil {
97 return nil, err
98 }
99 response := &SubsidiesReturnEntity{}
100 if err := json.Unmarshal(respBody, response); err != nil {
101 return nil, err
102 }
103
104 return response, nil
105 } else {
106 return nil, wxpay_utility.NewApiException(
107 httpResponse.StatusCode,
108 httpResponse.Header,
109 respBody,
110 )
111 }
112}
113
114type SubsidiesReturnRequest struct {
115 SubMchid *string `json:"sub_mchid,omitempty"`
116 OutOrderNo *string `json:"out_order_no,omitempty"`
117 TransactionId *string `json:"transaction_id,omitempty"`
118 RefundId *string `json:"refund_id,omitempty"`
119 Amount *int64 `json:"amount,omitempty"`
120 Description *string `json:"description,omitempty"`
121 SubsidyId *string `json:"subsidy_id,omitempty"`
122 From []ReturnFrom `json:"from,omitempty"`
123}
124
125type SubsidiesReturnEntity struct {
126 SubMchid *string `json:"sub_mchid,omitempty"`
127 TransactionId *string `json:"transaction_id,omitempty"`
128 SubsidyRefundId *string `json:"subsidy_refund_id,omitempty"`
129 RefundId *string `json:"refund_id,omitempty"`
130 OutOrderNo *string `json:"out_order_no,omitempty"`
131 Amount *int64 `json:"amount,omitempty"`
132 Description *string `json:"description,omitempty"`
133 Result *ReturnStatus `json:"result,omitempty"`
134 SuccessTime *string `json:"success_time,omitempty"`
135 SubsidyId *string `json:"subsidy_id,omitempty"`
136 From []ReturnFrom `json:"from,omitempty"`
137}
138
139type ReturnFrom struct {
140 Account *ReturnAccount `json:"account,omitempty"`
141 Amount *int64 `json:"amount,omitempty"`
142}
143
144type ReturnStatus string
145
146func (e ReturnStatus) Ptr() *ReturnStatus {
147 return &e
148}
149
150const (
151 RETURNSTATUS_SUCCESS ReturnStatus = "SUCCESS"
152 RETURNSTATUS_FAIL ReturnStatus = "FAIL"
153)
154
155type ReturnAccount string
156
157func (e ReturnAccount) Ptr() *ReturnAccount {
158 return &e
159}
160
161const (
162 RETURNACCOUNT_AVAILABLE ReturnAccount = "AVAILABLE"
163 RETURNACCOUNT_UNAVAILABLE ReturnAccount = "UNAVAILABLE"
164)
165