
1package main
2
3import (
4 "demo/wxpay_utility"
5 "encoding/json"
6 "fmt"
7 "net/http"
8 "net/url"
9 "strings"
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 := &GetFapiaoApplicationsRequest{
27 SubMchid: wxpay_utility.String("1900000109"),
28 FapiaoApplyId: wxpay_utility.String("4200000444201910177461284488"),
29 FapiaoId: wxpay_utility.String("20200701123456"),
30 }
31
32 response, err := GetFapiaoApplications(config, request)
33 if err != nil {
34 fmt.Printf("请求失败: %+v\n", err)
35
36 return
37 }
38
39
40 fmt.Printf("请求成功: %+v\n", response)
41}
42
43func GetFapiaoApplications(config *wxpay_utility.MchConfig, request *GetFapiaoApplicationsRequest) (response *FapiaoApplicationsEntity, err error) {
44 const (
45 host = "https://api.mch.weixin.qq.com"
46 method = "GET"
47 path = "/v3/new-tax-control-fapiao/fapiao-applications/{fapiao_apply_id}"
48 )
49
50 reqUrl, err := url.Parse(fmt.Sprintf("%s%s", host, path))
51 if err != nil {
52 return nil, err
53 }
54 reqUrl.Path = strings.Replace(reqUrl.Path, "{fapiao_apply_id}", url.PathEscape(*request.FapiaoApplyId), -1)
55 query := reqUrl.Query()
56 if request.SubMchid != nil {
57 query.Add("sub_mchid", *request.SubMchid)
58 }
59 if request.FapiaoId != nil {
60 query.Add("fapiao_id", *request.FapiaoId)
61 }
62 reqUrl.RawQuery = query.Encode()
63 httpRequest, err := http.NewRequest(method, reqUrl.String(), nil)
64 if err != nil {
65 return nil, err
66 }
67 httpRequest.Header.Set("Accept", "application/json")
68 httpRequest.Header.Set("Wechatpay-Serial", config.WechatPayPublicKeyId())
69 authorization, err := wxpay_utility.BuildAuthorization(config.MchId(), config.CertificateSerialNo(), config.PrivateKey(), method, reqUrl.RequestURI(), nil)
70 if err != nil {
71 return nil, err
72 }
73 httpRequest.Header.Set("Authorization", authorization)
74
75 client := &http.Client{}
76 httpResponse, err := client.Do(httpRequest)
77 if err != nil {
78 return nil, err
79 }
80 respBody, err := wxpay_utility.ExtractResponseBody(httpResponse)
81 if err != nil {
82 return nil, err
83 }
84 if httpResponse.StatusCode >= 200 && httpResponse.StatusCode < 300 {
85
86 err = wxpay_utility.ValidateResponse(
87 config.WechatPayPublicKeyId(),
88 config.WechatPayPublicKey(),
89 &httpResponse.Header,
90 respBody,
91 )
92 if err != nil {
93 return nil, err
94 }
95 response := &FapiaoApplicationsEntity{}
96 if err := json.Unmarshal(respBody, response); err != nil {
97 return nil, err
98 }
99
100 return response, nil
101 } else {
102 return nil, wxpay_utility.NewApiException(
103 httpResponse.StatusCode,
104 httpResponse.Header,
105 respBody,
106 )
107 }
108}
109
110type GetFapiaoApplicationsRequest struct {
111 SubMchid *string `json:"sub_mchid,omitempty"`
112 FapiaoApplyId *string `json:"fapiao_apply_id,omitempty"`
113 FapiaoId *string `json:"fapiao_id,omitempty"`
114}
115
116func (o *GetFapiaoApplicationsRequest) MarshalJSON() ([]byte, error) {
117 type Alias GetFapiaoApplicationsRequest
118 a := &struct {
119 SubMchid *string `json:"sub_mchid,omitempty"`
120 FapiaoApplyId *string `json:"fapiao_apply_id,omitempty"`
121 FapiaoId *string `json:"fapiao_id,omitempty"`
122 *Alias
123 }{
124
125 SubMchid: nil,
126 FapiaoApplyId: nil,
127 FapiaoId: nil,
128 Alias: (*Alias)(o),
129 }
130 return json.Marshal(a)
131}
132
133type FapiaoApplicationsEntity struct {
134 TotalCount *int64 `json:"total_count,omitempty"`
135 FapiaoInformation []FapiaoEntity `json:"fapiao_information,omitempty"`
136}
137
138type FapiaoEntity struct {
139 FapiaoId *string `json:"fapiao_id,omitempty"`
140 Status *Status `json:"status,omitempty"`
141 BlueFapiao *FapiaoInfo `json:"blue_fapiao,omitempty"`
142 RedFapiao *FapiaoInfo `json:"red_fapiao,omitempty"`
143 CardInformation *CardInfo `json:"card_information,omitempty"`
144 TotalAmount *int64 `json:"total_amount,omitempty"`
145 TaxAmount *int64 `json:"tax_amount,omitempty"`
146 Amount *int64 `json:"amount,omitempty"`
147 SellerInformation *SellerInfo `json:"seller_information,omitempty"`
148 BuyerInformation *UserTitleEntity `json:"buyer_information,omitempty"`
149 ExtraInformation *ExtraInfo `json:"extra_information,omitempty"`
150 Items []FapiaoItem `json:"items,omitempty"`
151 Remark *string `json:"remark,omitempty"`
152 FapiaoErrorCode *string `json:"fapiao_error_code,omitempty"`
153 FapiaoErrorMessage *string `json:"fapiao_error_message,omitempty"`
154}
155
156type Status string
157
158func (e Status) Ptr() *Status {
159 return &e
160}
161
162const (
163 STATUS_ISSUE_ACCEPTED Status = "ISSUE_ACCEPTED"
164 STATUS_ISSUED Status = "ISSUED"
165 STATUS_REVERSE_ACCEPTED Status = "REVERSE_ACCEPTED"
166 STATUS_REVERSED Status = "REVERSED"
167 STATUS_ISSUE_FAILED Status = "ISSUE_FAILED"
168 STATUS_REVERSE_FAILED Status = "REVERSE_FAILED"
169)
170
171type FapiaoInfo struct {
172 FapiaoCode *string `json:"fapiao_code,omitempty"`
173 FapiaoNumber *string `json:"fapiao_number,omitempty"`
174 CheckCode *string `json:"check_code,omitempty"`
175 Password *string `json:"password,omitempty"`
176 FapiaoTime *string `json:"fapiao_time,omitempty"`
177}
178
179type CardInfo struct {
180 CardAppid *string `json:"card_appid,omitempty"`
181 CardOpenid *string `json:"card_openid,omitempty"`
182 CardId *string `json:"card_id,omitempty"`
183 CardCode *string `json:"card_code,omitempty"`
184 CardStatus *CardStatus `json:"card_status,omitempty"`
185}
186
187type SellerInfo struct {
188 Name *string `json:"name,omitempty"`
189 TaxpayerId *string `json:"taxpayer_id,omitempty"`
190 Address *string `json:"address,omitempty"`
191 Telephone *string `json:"telephone,omitempty"`
192 BankName *string `json:"bank_name,omitempty"`
193 BankAccount *string `json:"bank_account,omitempty"`
194}
195
196type UserTitleEntity struct {
197 Type *BuyerType `json:"type,omitempty"`
198 Name *string `json:"name,omitempty"`
199 TaxpayerId *string `json:"taxpayer_id,omitempty"`
200 Address *string `json:"address,omitempty"`
201 Telephone *string `json:"telephone,omitempty"`
202 BankName *string `json:"bank_name,omitempty"`
203 BankAccount *string `json:"bank_account,omitempty"`
204 Phone *string `json:"phone,omitempty"`
205 Email *string `json:"email,omitempty"`
206 Amount *int64 `json:"amount,omitempty"`
207 OutTradeNo *string `json:"out_trade_no,omitempty"`
208 FapiaoBillType *FapiaoBillType `json:"fapiao_bill_type,omitempty"`
209 UserApplyMessage *string `json:"user_apply_message,omitempty"`
210}
211
212type ExtraInfo struct {
213 Drawer *string `json:"drawer,omitempty"`
214}
215
216type FapiaoItem struct {
217 TaxCode *string `json:"tax_code,omitempty"`
218 GoodsName *string `json:"goods_name,omitempty"`
219 Specification *string `json:"specification,omitempty"`
220 Unit *string `json:"unit,omitempty"`
221 Quantity *int64 `json:"quantity,omitempty"`
222 UnitPrice *int64 `json:"unit_price,omitempty"`
223 Amount *int64 `json:"amount,omitempty"`
224 TaxAmount *int64 `json:"tax_amount,omitempty"`
225 TotalAmount *int64 `json:"total_amount,omitempty"`
226 TaxRate *int64 `json:"tax_rate,omitempty"`
227 TaxPreferMark *TaxPreferMark `json:"tax_prefer_mark,omitempty"`
228 Discount *bool `json:"discount,omitempty"`
229}
230
231type CardStatus string
232
233func (e CardStatus) Ptr() *CardStatus {
234 return &e
235}
236
237const (
238 CARDSTATUS_INSERT_ACCEPTED CardStatus = "INSERT_ACCEPTED"
239 CARDSTATUS_INSERTED CardStatus = "INSERTED"
240 CARDSTATUS_DISCARD_ACCEPTED CardStatus = "DISCARD_ACCEPTED"
241 CARDSTATUS_DISCARDED CardStatus = "DISCARDED"
242)
243
244type BuyerType string
245
246func (e BuyerType) Ptr() *BuyerType {
247 return &e
248}
249
250const (
251 BUYERTYPE_INDIVIDUAL BuyerType = "INDIVIDUAL"
252 BUYERTYPE_ORGANIZATION BuyerType = "ORGANIZATION"
253)
254
255type FapiaoBillType string
256
257func (e FapiaoBillType) Ptr() *FapiaoBillType {
258 return &e
259}
260
261const (
262 FAPIAOBILLTYPE_COMM_FAPIAO FapiaoBillType = "COMM_FAPIAO"
263 FAPIAOBILLTYPE_VAT_FAPIAO FapiaoBillType = "VAT_FAPIAO"
264)
265
266type TaxPreferMark string
267
268func (e TaxPreferMark) Ptr() *TaxPreferMark {
269 return &e
270}
271
272const (
273 TAXPREFERMARK_NO_FAVORABLE TaxPreferMark = "NO_FAVORABLE"
274 TAXPREFERMARK_OUTSIDE_VAT TaxPreferMark = "OUTSIDE_VAT"
275 TAXPREFERMARK_VAT_EXEMPT TaxPreferMark = "VAT_EXEMPT"
276 TAXPREFERMARK_NORMAL_ZERO_RATED TaxPreferMark = "NORMAL_ZERO_RATED"
277 TAXPREFERMARK_EXPORT_ZERO_RATED TaxPreferMark = "EXPORT_ZERO_RATED"
278)
279