
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 := &WithdrawalApplyCreateRequest{
27 SubMchid: wxpay_utility.String("1900000109"),
28 OutAccountType: OUTACCOUNTTYPE_BASIC_ACCOUNT.Ptr(),
29 Amount: wxpay_utility.Int64(101),
30 OutRequestNo: wxpay_utility.String("2019061122222222122"),
31 PayeeType: PAYEETYPE_CONTRIBUTION_MERCHANT.Ptr(),
32 PayeeMchid: wxpay_utility.String("1900000109"),
33 PayeeInfo: &PayeeInfo{
34 AccountType: ACCOUNTTYPE_ACCOUNT_TYPE_CORPORATE.Ptr(),
35 BankAccountInfo: &BankAccountInfo{
36 AccountName: wxpay_utility.String("AOZdYGISxo4y44/UgZ69bdu9X+tfMUJ9dl+LetjM45/zMbrYu+wWZ8gn4CTdo+D/m9MrPg+V4sm73oxqdQu/hj7aWyDl4GQtPXVdaztB9jVbVZh3QFzV+BEmytMNQp9dt1uWJktlfdDdLR3AMWyMB377xd+m9bSr/ioDTzagEcGe+vLYiKrzcroQv3OR0p3ppFYoQ3IfYeU/04S4t9rNFL+kyblK2FCCqQ11NdbbHoCrJc7NV4oASq6ZFonjTtgjjgKsadIKHXtb3JZKGZjduGdtkRJJp0/0eow96uY1Pk7Rq79Jtt7+I8juwEc4P4TG5xzchG/5IL9DBd+Z0zZXkw=="),
37 AccountBank: wxpay_utility.String("工商银行"),
38 BankBranchId: wxpay_utility.String("402713354941"),
39 BankName: wxpay_utility.String("施秉县农村信用合作联社城关信用社"),
40 AccountNumber: wxpay_utility.String("d+xT+MQCvrLHUVDWv/8MR/dB7TkXM2YYZlokmXzFsWs35NXUot7C0NcxIrUF5FnxqCJHkNgKtxa6RxEYyba1+VBRLnqKG2fSy/Y5qDN08Ej9zHCwJjq52Wg1VG8MRugli9YMI1fI83KGBxhuXyemgS/hqFKsfYGiOkJqjTUpgY5VqjtL2N4l4z11T0ECB/aSyVXUysOFGLVfSrUxMPZy6jWWYGvT1+4P633f+R+ki1gT4WF/2KxZOYmli385ZgVhcR30mr4/G3HBcxi13zp7FnEeOsLlvBmI1PHN4C7Rsu3WL8sPndjXTd75kPkyjqnoMRrEEaYQE8ZRGYoeorwC+w=="),
41 },
42 IdentityInfo: &IdentityInfo{
43 IdDocType: IDENTIFICATIONTYPE_IDENTIFICATION_TYPE_IDCARD.Ptr(),
44 IdentificationName: wxpay_utility.String("pVd1HJ6zyvPedzGaV+X3qtmrq9bb9tPROvwia4ibL+F6mfjbzQIzfb3HHLEjZ4YiR/cJiCrZxnAqi+pjeKIEdkwzXRAI7FUhrfPK3SNjaBTEu9GmsugMIA9r3x887Q+ODuC8HH2nzAn7NGpE/e3yiHgWhk0ps5k5DP/2qIdGdONoDzZelrxCl/NWWNUyB93K9F+jC1JX2IMttdY+aQ6zBlw0xnOiNW6Hzy7UtC+xriudjD5APomty7/mYNxLMpRSvWKIjOv/69bDnuC4EL5Kz4jBHLiCyOb+tI0m2qhZ9evAM+Jv1z0NVa8MRtelw/wDa4SzfeespQO/0kjiwfqdfg=="),
45 IdentificationNo: wxpay_utility.String("AOZdYGISxo4y44/UgZ69bdu9X+tfMUJ9dl+LetjM45/zMbrYu+wWZ8gn4CTdo+D/m9MrPg+V4sm73oxqdQu/hj7aWyDl4GQtPXVdaztB9jVbVZh3QFzV+BEmytMNQp9dt1uWJktlfdDdLR3AMWyMB377xd+m9bSr/ioDTzagEcGe+vLYiKrzcroQv3OR0p3ppFYoQ3IfYeU/04S4t9rNFL+kyblK2FCCqQ11NdbbHoCrJc7NV4oASq6ZFonjTtgjjgKsadIKHXtb3JZKGZjduGdtkRJJp0/0eow96uY1Pk7Rq79Jtt7+I8juwEc4P4TG5xzchG/5IL9DBd+Z0zZXkw=="),
46 },
47 },
48 ProofMediaList: &ProofPayeeMediaInfo{
49 ProofPayeeMedia: []ProofPayeeMedia{ProofPayeeMedia{
50 ProofMediaType: PROOFOFPAYEEMEDIATYPE_WECHAT_PAY_WITHDRAWAL_APPLICATION_TYPE_1.Ptr(),
51 ProofMedia: wxpay_utility.String("jTpGmxUX3FBWVQ5NJTZvlKX_gdU4cRz7z5NxpnFuAxhBTEO_PvWkfSCJ3zVIn001D8daLC-ehEuo0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ"),
52 }},
53 },
54 AdditionalMaterials: &AdditionalMediaInfo{
55 AdditionalMedia: []string{"jTpGmxUX3FBWVQ5NJTZvlKX_gdU4cRz7z5NxpnFuAxhBTEO_PvWkfSCJ3zVIn001D8daLC-ehEuo0BJqRTvDujqhThn4ReFxikqJ5YW6zFQ"},
56 },
57 Remark: wxpay_utility.String("特殊理由"),
58 }
59
60 response, err := SubmitApply(config, request)
61 if err != nil {
62 fmt.Printf("请求失败: %+v\n", err)
63
64 return
65 }
66
67
68 fmt.Printf("请求成功: %+v\n", response)
69}
70
71func SubmitApply(config *wxpay_utility.MchConfig, request *WithdrawalApplyCreateRequest) (response *WithdrawalApplyCreateResponse, err error) {
72 const (
73 host = "https://api.mch.weixin.qq.com"
74 method = "POST"
75 path = "/v3/mch_operate/risk/withdrawl-apply"
76 )
77
78 reqUrl, err := url.Parse(fmt.Sprintf("%s%s", host, path))
79 if err != nil {
80 return nil, err
81 }
82 reqBody, err := json.Marshal(request)
83 if err != nil {
84 return nil, err
85 }
86 httpRequest, err := http.NewRequest(method, reqUrl.String(), bytes.NewReader(reqBody))
87 if err != nil {
88 return nil, err
89 }
90 httpRequest.Header.Set("Accept", "application/json")
91 httpRequest.Header.Set("Wechatpay-Serial", config.WechatPayPublicKeyId())
92 httpRequest.Header.Set("Content-Type", "application/json")
93 authorization, err := wxpay_utility.BuildAuthorization(config.MchId(), config.CertificateSerialNo(), config.PrivateKey(), method, reqUrl.RequestURI(), reqBody)
94 if err != nil {
95 return nil, err
96 }
97 httpRequest.Header.Set("Authorization", authorization)
98
99 client := &http.Client{}
100 httpResponse, err := client.Do(httpRequest)
101 if err != nil {
102 return nil, err
103 }
104 respBody, err := wxpay_utility.ExtractResponseBody(httpResponse)
105 if err != nil {
106 return nil, err
107 }
108 if httpResponse.StatusCode >= 200 && httpResponse.StatusCode < 300 {
109
110 err = wxpay_utility.ValidateResponse(
111 config.WechatPayPublicKeyId(),
112 config.WechatPayPublicKey(),
113 &httpResponse.Header,
114 respBody,
115 )
116 if err != nil {
117 return nil, err
118 }
119 response := &WithdrawalApplyCreateResponse{}
120 if err := json.Unmarshal(respBody, response); err != nil {
121 return nil, err
122 }
123
124 return response, nil
125 } else {
126 return nil, wxpay_utility.NewApiException(
127 httpResponse.StatusCode,
128 httpResponse.Header,
129 respBody,
130 )
131 }
132}
133
134type WithdrawalApplyCreateRequest struct {
135 SubMchid *string `json:"sub_mchid,omitempty"`
136 OutAccountType *OutAccountType `json:"out_account_type,omitempty"`
137 Amount *int64 `json:"amount,omitempty"`
138 OutRequestNo *string `json:"out_request_no,omitempty"`
139 PayeeType *PayeeType `json:"payee_type,omitempty"`
140 PayeeMchid *string `json:"payee_mchid,omitempty"`
141 PayeeInfo *PayeeInfo `json:"payee_info,omitempty"`
142 ProofMediaList *ProofPayeeMediaInfo `json:"proof_media_list,omitempty"`
143 AdditionalMaterials *AdditionalMediaInfo `json:"additional_materials,omitempty"`
144 Remark *string `json:"remark,omitempty"`
145}
146
147type WithdrawalApplyCreateResponse struct {
148 ApplymentId *string `json:"applyment_id,omitempty"`
149 OutRequestNo *string `json:"out_request_no,omitempty"`
150}
151
152type OutAccountType string
153
154func (e OutAccountType) Ptr() *OutAccountType {
155 return &e
156}
157
158const (
159 OUTACCOUNTTYPE_BASIC_ACCOUNT OutAccountType = "BASIC_ACCOUNT"
160 OUTACCOUNTTYPE_OPERATE_ACCOUNT OutAccountType = "OPERATE_ACCOUNT"
161 OUTACCOUNTTYPE_MARGIN_ACCOUNT OutAccountType = "MARGIN_ACCOUNT"
162)
163
164type PayeeType string
165
166func (e PayeeType) Ptr() *PayeeType {
167 return &e
168}
169
170const (
171 PAYEETYPE_CONTRIBUTION_MERCHANT PayeeType = "CONTRIBUTION_MERCHANT"
172 PAYEETYPE_SERVICE_PROVIDER_MERCHANT PayeeType = "SERVICE_PROVIDER_MERCHANT"
173 PAYEETYPE_OTHER_MERCHANT PayeeType = "OTHER_MERCHANT"
174 PAYEETYPE_INDIVIDUAL PayeeType = "INDIVIDUAL"
175)
176
177type PayeeInfo struct {
178 AccountType *AccountType `json:"account_type,omitempty"`
179 BankAccountInfo *BankAccountInfo `json:"bank_account_info,omitempty"`
180 IdentityInfo *IdentityInfo `json:"identity_info,omitempty"`
181}
182
183type ProofPayeeMediaInfo struct {
184 ProofPayeeMedia []ProofPayeeMedia `json:"proof_payee_media,omitempty"`
185}
186
187type AdditionalMediaInfo struct {
188 AdditionalMedia []string `json:"additional_media,omitempty"`
189}
190
191type AccountType string
192
193func (e AccountType) Ptr() *AccountType {
194 return &e
195}
196
197const (
198 ACCOUNTTYPE_ACCOUNT_TYPE_CORPORATE AccountType = "ACCOUNT_TYPE_CORPORATE"
199 ACCOUNTTYPE_ACCOUNT_TYPE_PERSONAL AccountType = "ACCOUNT_TYPE_PERSONAL"
200)
201
202type BankAccountInfo struct {
203 AccountName *string `json:"account_name,omitempty"`
204 AccountBank *string `json:"account_bank,omitempty"`
205 BankBranchId *string `json:"bank_branch_id,omitempty"`
206 BankName *string `json:"bank_name,omitempty"`
207 AccountNumber *string `json:"account_number,omitempty"`
208}
209
210type IdentityInfo struct {
211 IdDocType *IdentificationType `json:"id_doc_type,omitempty"`
212 IdentificationName *string `json:"identification_name,omitempty"`
213 IdentificationNo *string `json:"identification_no,omitempty"`
214}
215
216type ProofPayeeMedia struct {
217 ProofMediaType *ProofOfPayeeMediaType `json:"proof_media_type,omitempty"`
218 ProofMedia *string `json:"proof_media,omitempty"`
219}
220
221type IdentificationType string
222
223func (e IdentificationType) Ptr() *IdentificationType {
224 return &e
225}
226
227const (
228 IDENTIFICATIONTYPE_IDENTIFICATION_TYPE_IDCARD IdentificationType = "IDENTIFICATION_TYPE_IDCARD"
229 IDENTIFICATIONTYPE_IDENTIFICATION_TYPE_OVERSEA_PASSPORT IdentificationType = "IDENTIFICATION_TYPE_OVERSEA_PASSPORT"
230 IDENTIFICATIONTYPE_IDENTIFICATION_TYPE_HONGKONG_PASSPORT IdentificationType = "IDENTIFICATION_TYPE_HONGKONG_PASSPORT"
231 IDENTIFICATIONTYPE_IDENTIFICATION_TYPE_MACAO_PASSPORT IdentificationType = "IDENTIFICATION_TYPE_MACAO_PASSPORT"
232 IDENTIFICATIONTYPE_IDENTIFICATION_TYPE_TAIWAN_PASSPORT IdentificationType = "IDENTIFICATION_TYPE_TAIWAN_PASSPORT"
233 IDENTIFICATIONTYPE_IDENTIFICATION_TYPE_FOREIGN_RESIDENT IdentificationType = "IDENTIFICATION_TYPE_FOREIGN_RESIDENT"
234 IDENTIFICATIONTYPE_IDENTIFICATION_TYPE_HONGKONG_MACAO_RESIDENT IdentificationType = "IDENTIFICATION_TYPE_HONGKONG_MACAO_RESIDENT"
235 IDENTIFICATIONTYPE_IDENTIFICATION_TYPE_TAIWAN_RESIDENT IdentificationType = "IDENTIFICATION_TYPE_TAIWAN_RESIDENT"
236)
237
238type ProofOfPayeeMediaType string
239
240func (e ProofOfPayeeMediaType) Ptr() *ProofOfPayeeMediaType {
241 return &e
242}
243
244const (
245 PROOFOFPAYEEMEDIATYPE_WECHAT_PAY_WITHDRAWAL_APPLICATION_TYPE_1 ProofOfPayeeMediaType = "WECHAT_PAY_WITHDRAWAL_APPLICATION_TYPE_1"
246 PROOFOFPAYEEMEDIATYPE_WECHAT_PAY_WITHDRAWAL_APPLICATION_TYPE_2 ProofOfPayeeMediaType = "WECHAT_PAY_WITHDRAWAL_APPLICATION_TYPE_2"
247 PROOFOFPAYEEMEDIATYPE_WECHAT_PAY_WITHDRAWAL_APPLICATION_TYPE_3 ProofOfPayeeMediaType = "WECHAT_PAY_WITHDRAWAL_APPLICATION_TYPE_3"
248 PROOFOFPAYEEMEDIATYPE_WECHAT_PAY_WITHDRAWAL_APPLICATION_TYPE_4 ProofOfPayeeMediaType = "WECHAT_PAY_WITHDRAWAL_APPLICATION_TYPE_4"
249 PROOFOFPAYEEMEDIATYPE_WECHAT_PAY_WITHDRAWAL_APPLICATION_TYPE_5 ProofOfPayeeMediaType = "WECHAT_PAY_WITHDRAWAL_APPLICATION_TYPE_5"
250 PROOFOFPAYEEMEDIATYPE_MISSING_OFFICIAL_SEAL_LETTER ProofOfPayeeMediaType = "MISSING_OFFICIAL_SEAL_LETTER"
251 PROOFOFPAYEEMEDIATYPE_CERTIFICATE_OF_ACCOUNT_CANCELLATION ProofOfPayeeMediaType = "CERTIFICATE_OF_ACCOUNT_CANCELLATION"
252 PROOFOFPAYEEMEDIATYPE_INDUSTRIAL_AND_COMMERCIAL_CANCELLATION_CERTIFICATE ProofOfPayeeMediaType = "INDUSTRIAL_AND_COMMERCIAL_CANCELLATION_CERTIFICATE"
253 PROOFOFPAYEEMEDIATYPE_BASIC_TRANSACTION_INFORMATION ProofOfPayeeMediaType = "BASIC_TRANSACTION_INFORMATION"
254 PROOFOFPAYEEMEDIATYPE_LEGAL_ID_CARD ProofOfPayeeMediaType = "LEGAL_ID_CARD"
255 PROOFOFPAYEEMEDIATYPE_ID_CARD ProofOfPayeeMediaType = "ID_CARD"
256 PROOFOFPAYEEMEDIATYPE_BUSINESS_LICENSE_PHOTO ProofOfPayeeMediaType = "BUSINESS_LICENSE_PHOTO"
257 PROOFOFPAYEEMEDIATYPE_PAYEE_ID_CARD ProofOfPayeeMediaType = "PAYEE_ID_CARD"
258 PROOFOFPAYEEMEDIATYPE_WECHAT_PAY_WITHDRAWAL_APPLICATION_TYPE_6 ProofOfPayeeMediaType = "WECHAT_PAY_WITHDRAWAL_APPLICATION_TYPE_6"
259 PROOFOFPAYEEMEDIATYPE_WECHAT_PAY_WITHDRAWAL_APPLICATION_TYPE_7 ProofOfPayeeMediaType = "WECHAT_PAY_WITHDRAWAL_APPLICATION_TYPE_7"
260 PROOFOFPAYEEMEDIATYPE_WECHAT_PAY_WITHDRAWAL_APPLICATION_TYPE_8 ProofOfPayeeMediaType = "WECHAT_PAY_WITHDRAWAL_APPLICATION_TYPE_8"
261)
262