
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 := &SubmitRequest{
27 SubMchid: wxpay_utility.String("1900000109"),
28 OutRequestNo: wxpay_utility.String("P202410241010125346"),
29 Withdraw: APPLYWITHDRAW_APPLY_WITHDRAW.Ptr(),
30 PayeeInfo: &PayeeInfo{
31 AccountType: ACCOUNTTYPE_ACCOUNT_TYPE_CORPORATE.Ptr(),
32 BankAccountInfo: &BankAccountInfo{
33 AccountName: wxpay_utility.String("AOZdYGISxo4y44/UgZ69bdu9X+tfMUJ9dl+LetjM45/zMbrYu+wWZ8gn4CTdo+D/m9MrPg+V4sm73oxqdQu/hj7aWyDl4GQtPXVdaztB9jVbVZh3QFzV+BEmytMNQp9dt1uWJktlfdDdLR3AMWyMB377xd+m9bSr/ioDTzagEcGe+vLYiKrzcroQv3OR0p3ppFYoQ3IfYeU/04S4t9rNFL+kyblK2FCCqQ11NdbbHoCrJc7NV4oASq6ZFonjTtgjjgKsadIKHXtb3JZKGZjduGdtkRJJp0/0eow96uY1Pk7Rq79Jtt7+I8juwEc4P4TG5xzchG/5IL9DBd+Z0zZXkw=="),
34 AccountBank: wxpay_utility.String("工商银行"),
35 BankBranchId: wxpay_utility.String("402713354941"),
36 BankBranchName: wxpay_utility.String("施秉县农村信用合作联社城关信用社"),
37 AccountNumber: wxpay_utility.String("d+xT+MQCvrLHUVDWv/8MR/dB7TkXM2YYZlokmXzFsWs35NXUot7C0NcxIrUF5FnxqCJHkNgKtxa6RxEYyba1+VBRLnqKG2fSy/Y5qDN08Ej9zHCwJjq52Wg1VG8MRugli9YMI1fI83KGBxhuXyemgS/hqFKsfYGiOkJqjTUpgY5VqjtL2N4l4z11T0ECB/aSyVXUysOFGLVfSrUxMPZy6jWWYGvT1+4P633f+R+ki1gT4WF/2KxZOYmli385ZgVhcR30mr4/G3HBcxi13zp7FnEeOsLlvBmI1PHN4C7Rsu3WL8sPndjXTd75kPkyjqnoMRrEEaYQE8ZRGYoeorwC+w=="),
38 },
39 IdentityInfo: &IdentityInfo{
40 IdDocType: IDENTIFICATIONTYPE_IDENTIFICATION_TYPE_ID_CARD.Ptr(),
41 IdentificationName: wxpay_utility.String("pVd1HJ6zyvPedzGaV+X3qtmrq9bb9tPROvwia4ibL+F6mfjbzQIzfb3HHLEjZ4YiR/cJiCrZxnAqi+pjeKIEdkwzXRAI7FUhrfPK3SNjaBTEu9GmsugMIA9r3x887Q+ODuC8HH2nzAn7NGpE/e3yiHgWhk0ps5k5DP/2qIdGdONoDzZelrxCl/NWWNUyB93K9F+jC1JX2IMttdY+aQ6zBlw0xnOiNW6Hzy7UtC+xriudjD5APomty7/mYNxLMpRSvWKIjOv/69bDnuC4EL5Kz4jBHLiCyOb+tI0m2qhZ9evAM+Jv1z0NVa8MRtelw/wDa4SzfeespQO/0kjiwfqdfg=="),
42 IdentificationNo: wxpay_utility.String("AOZdYGISxo4y44/UgZ69bdu9X+tfMUJ9dl+LetjM45/zMbrYu+wWZ8gn4CTdo+D/m9MrPg+V4sm73oxqdQu/hj7aWyDl4GQtPXVdaztB9jVbVZh3QFzV+BEmytMNQp9dt1uWJktlfdDdLR3AMWyMB377xd+m9bSr/ioDTzagEcGe+vLYiKrzcroQv3OR0p3ppFYoQ3IfYeU/04S4t9rNFL+kyblK2FCCqQ11NdbbHoCrJc7NV4oASq6ZFonjTtgjjgKsadIKHXtb3JZKGZjduGdtkRJJp0/0eow96uY1Pk7Rq79Jtt7+I8juwEc4P4TG5xzchG/5IL9DBd+Z0zZXkw=="),
43 },
44 },
45 ProofMedias: []ProofMedia{ProofMedia{
46 ProofMediaType: PROOFMEDIATYPE_WITHDRAWAL_APPLICATION.Ptr(),
47 ProofMedia: wxpay_utility.String("jTpGmxUX3FBWVQ5NJTZvlKX_gdU4cRz7z5NxpnFuAxhBTEO_PvWkfSCJ3zVIn001D8daLC-ehEuo0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ"),
48 }},
49 AdditionalMaterials: []string{"jTpGmxUX3FBWVQ5NJTZvlKX_gdU4cRz7z5NxpnFuAxhBTEO_PvWkfSCJ3zVIn001D8daLC-ehEuo0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ"},
50 Remark: wxpay_utility.String("特殊理由"),
51 }
52
53 response, err := SubmitApply(config, request)
54 if err != nil {
55 fmt.Printf("请求失败: %+v\n", err)
56
57 return
58 }
59
60
61 fmt.Printf("请求成功: %+v\n", response)
62}
63
64func SubmitApply(config *wxpay_utility.MchConfig, request *SubmitRequest) (response *SubmitResponse, err error) {
65 const (
66 host = "https://api.mch.weixin.qq.com"
67 method = "POST"
68 path = "/v3/ecommerce/account/apply-cancel-withdraw"
69 )
70
71 reqUrl, err := url.Parse(fmt.Sprintf("%s%s", host, path))
72 if err != nil {
73 return nil, err
74 }
75 reqBody, err := json.Marshal(request)
76 if err != nil {
77 return nil, err
78 }
79 httpRequest, err := http.NewRequest(method, reqUrl.String(), bytes.NewReader(reqBody))
80 if err != nil {
81 return nil, err
82 }
83 httpRequest.Header.Set("Accept", "application/json")
84 httpRequest.Header.Set("Wechatpay-Serial", config.WechatPayPublicKeyId())
85 httpRequest.Header.Set("Content-Type", "application/json")
86 authorization, err := wxpay_utility.BuildAuthorization(config.MchId(), config.CertificateSerialNo(), config.PrivateKey(), method, reqUrl.RequestURI(), reqBody)
87 if err != nil {
88 return nil, err
89 }
90 httpRequest.Header.Set("Authorization", authorization)
91
92 client := &http.Client{}
93 httpResponse, err := client.Do(httpRequest)
94 if err != nil {
95 return nil, err
96 }
97 respBody, err := wxpay_utility.ExtractResponseBody(httpResponse)
98 if err != nil {
99 return nil, err
100 }
101 if httpResponse.StatusCode >= 200 && httpResponse.StatusCode < 300 {
102
103 err = wxpay_utility.ValidateResponse(
104 config.WechatPayPublicKeyId(),
105 config.WechatPayPublicKey(),
106 &httpResponse.Header,
107 respBody,
108 )
109 if err != nil {
110 return nil, err
111 }
112 response := &SubmitResponse{}
113 if err := json.Unmarshal(respBody, response); err != nil {
114 return nil, err
115 }
116
117 return response, nil
118 } else {
119 return nil, wxpay_utility.NewApiException(
120 httpResponse.StatusCode,
121 httpResponse.Header,
122 respBody,
123 )
124 }
125}
126
127type SubmitRequest struct {
128 SubMchid *string `json:"sub_mchid,omitempty"`
129 OutRequestNo *string `json:"out_request_no,omitempty"`
130 Withdraw *ApplyWithdraw `json:"withdraw,omitempty"`
131 PayeeInfo *PayeeInfo `json:"payee_info,omitempty"`
132 ProofMedias []ProofMedia `json:"proof_medias,omitempty"`
133 AdditionalMaterials []string `json:"additional_materials,omitempty"`
134 Remark *string `json:"remark,omitempty"`
135}
136
137type SubmitResponse struct {
138 ApplymentId *string `json:"applyment_id,omitempty"`
139 OutRequestNo *string `json:"out_request_no,omitempty"`
140}
141
142type ApplyWithdraw string
143
144func (e ApplyWithdraw) Ptr() *ApplyWithdraw {
145 return &e
146}
147
148const (
149 APPLYWITHDRAW_NOT_APPLY_WITHDRAW ApplyWithdraw = "NOT_APPLY_WITHDRAW"
150 APPLYWITHDRAW_APPLY_WITHDRAW ApplyWithdraw = "APPLY_WITHDRAW"
151)
152
153type PayeeInfo struct {
154 AccountType *AccountType `json:"account_type,omitempty"`
155 BankAccountInfo *BankAccountInfo `json:"bank_account_info,omitempty"`
156 IdentityInfo *IdentityInfo `json:"identity_info,omitempty"`
157}
158
159type ProofMedia struct {
160 ProofMediaType *ProofMediaType `json:"proof_media_type,omitempty"`
161 ProofMedia *string `json:"proof_media,omitempty"`
162}
163
164type AccountType string
165
166func (e AccountType) Ptr() *AccountType {
167 return &e
168}
169
170const (
171 ACCOUNTTYPE_ACCOUNT_TYPE_CORPORATE AccountType = "ACCOUNT_TYPE_CORPORATE"
172 ACCOUNTTYPE_ACCOUNT_TYPE_PERSONAL AccountType = "ACCOUNT_TYPE_PERSONAL"
173)
174
175type BankAccountInfo struct {
176 AccountName *string `json:"account_name,omitempty"`
177 AccountBank *string `json:"account_bank,omitempty"`
178 BankBranchId *string `json:"bank_branch_id,omitempty"`
179 BankBranchName *string `json:"bank_branch_name,omitempty"`
180 AccountNumber *string `json:"account_number,omitempty"`
181}
182
183type IdentityInfo struct {
184 IdDocType *IdentificationType `json:"id_doc_type,omitempty"`
185 IdentificationName *string `json:"identification_name,omitempty"`
186 IdentificationNo *string `json:"identification_no,omitempty"`
187}
188
189type ProofMediaType string
190
191func (e ProofMediaType) Ptr() *ProofMediaType {
192 return &e
193}
194
195const (
196 PROOFMEDIATYPE_WITHDRAWAL_APPLICATION ProofMediaType = "WITHDRAWAL_APPLICATION"
197)
198
199type IdentificationType string
200
201func (e IdentificationType) Ptr() *IdentificationType {
202 return &e
203}
204
205const (
206 IDENTIFICATIONTYPE_IDENTIFICATION_TYPE_ID_CARD IdentificationType = "IDENTIFICATION_TYPE_ID_CARD"
207 IDENTIFICATIONTYPE_IDENTIFICATION_TYPE_OVERSEA_PASSPORT IdentificationType = "IDENTIFICATION_TYPE_OVERSEA_PASSPORT"
208 IDENTIFICATIONTYPE_IDENTIFICATION_TYPE_HONGKONG_PASSPORT IdentificationType = "IDENTIFICATION_TYPE_HONGKONG_PASSPORT"
209 IDENTIFICATIONTYPE_IDENTIFICATION_TYPE_MACAO_PASSPORT IdentificationType = "IDENTIFICATION_TYPE_MACAO_PASSPORT"
210 IDENTIFICATIONTYPE_IDENTIFICATION_TYPE_TAIWAN_PASSPORT IdentificationType = "IDENTIFICATION_TYPE_TAIWAN_PASSPORT"
211 IDENTIFICATIONTYPE_IDENTIFICATION_TYPE_FOREIGN_RESIDENT IdentificationType = "IDENTIFICATION_TYPE_FOREIGN_RESIDENT"
212 IDENTIFICATIONTYPE_IDENTIFICATION_TYPE_HONGKONG_MACAO_RESIDENT IdentificationType = "IDENTIFICATION_TYPE_HONGKONG_MACAO_RESIDENT"
213 IDENTIFICATIONTYPE_IDENTIFICATION_TYPE_TAIWAN_RESIDENT IdentificationType = "IDENTIFICATION_TYPE_TAIWAN_RESIDENT"
214)
215