
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 := &IssueGeneralFapiaoRequest{
27 SubMchid: wxpay_utility.String("example_sub_mchid"),
28 FapiaoApplyId: wxpay_utility.String("example_fapiao_apply_id"),
29 BuyerInformation: &UserTitleEntity{
30 Type: BUYERTYPE_INDIVIDUAL.Ptr(),
31 Name: wxpay_utility.String("深圳市南山区测试企业"),
32 TaxpayerId: wxpay_utility.String("202003261233701778"),
33 Address: wxpay_utility.String("深圳市南山区深南大道10000号"),
34 Telephone: wxpay_utility.String("075512345678"),
35 BankName: wxpay_utility.String("测试银行"),
36 BankAccount: wxpay_utility.String("62001234567890"),
37 Phone: wxpay_utility.String("mI7HGEJ4Q2B91IGjHrl7FNN9QuFPDfzeXoaJM4B8ZghZPzXK+vNotEZu/Gthm87Szv0MK2AoC0/3ZMDgltMtdoY6O0qZ4F1iXiwCuqkkBe+9M4ggvdzpPGM+fyed2QU1seUGbii5RVVVB9s+zLEQ8nv74vsgl77MZx14nd5obtCcfAvPfDJob3oG7FqlThmYKJqjiOwBvvQse7p9R8onj/POzSrbM8re8ZYGp4LcehXopTLdk2ZVWRv8bnJgKZWArAcqMdahq4jY2UVYeY4vpMmq4xuRTYk6xNXvowBBKK2SX8SqM+jm1USyoBIazLu4oaNFNdBO3fip1a1rFW0vRw=="),
38 Email: wxpay_utility.String("NzJy3r0Z2u2Vs5l+WSH0A3CZ1oGlCZ66aa2wUlMXNmACbd4wU8LqqYCuTG4cYWxrVUSmviV59/Uy9vLdIwuHZVrMalYAZGtb8inWGhDj3wUqQnPkmBKBVGIWG5Y6XJmMvpXW6rIKsdzxs8NwWj30cRNfjanLxiWc0aIgl8Knwo0JcxlcYLo38T9ntsrRkQZMQEWHaMYnzjp7ysLbp6yW83OZb/NwEufERBdPnIbDbVE7DUd5MGhvO+tlr2YC1b4VCsrDmjryuTD5nvYYCGHyfXW2CM23hZdBm9tPc+mU18Z9d4XkasnfsecGWd2ISkpPmnk3DtapnD64Nw8JyLtkgw=="),
39 Amount: wxpay_utility.Int64(1000),
40 OutTradeNo: wxpay_utility.String("order_20200701_123456"),
41 FapiaoBillType: FAPIAOBILLTYPE_COMM_FAPIAO.Ptr(),
42 UserApplyMessage: wxpay_utility.String("用户留言"),
43 },
44 FapiaoInformation: &IssueGeneralFapiaoInfo{
45 FapiaoId: wxpay_utility.String("20200701123456"),
46 TotalAmount: wxpay_utility.Int64(382895),
47 Items: []IssueGeneralFapiaoItem{IssueGeneralFapiaoItem{
48 TaxCode: wxpay_utility.String("3010101020203000000"),
49 GoodsName: wxpay_utility.String("*xxx*服务"),
50 Specification: wxpay_utility.String("米"),
51 Unit: wxpay_utility.String("米"),
52 Quantity: wxpay_utility.Int64(100000000),
53 TotalAmount: wxpay_utility.Int64(429900),
54 TaxRate: wxpay_utility.Int64(1300),
55 Discount: wxpay_utility.Bool(false),
56 PreferentialPolicyCode: wxpay_utility.Int64(1),
57 }},
58 ExportBusinessPolicyCode: wxpay_utility.Int64(1),
59 VatRefundLevyCode: wxpay_utility.Int64(1),
60 BillingPersonId: wxpay_utility.String("128279891283"),
61 BillingPerson: wxpay_utility.String("**伟 0020"),
62 FapiaoBillType: FAPIAOBILLTYPE_COMM_FAPIAO.Ptr(),
63 TransactionInformation: []TransactionInfo{TransactionInfo{
64 PayChannel: PAYCHANNEL_WECHAT_PAY.Ptr(),
65 TransactionId: wxpay_utility.String("4200000008202508080512076713"),
66 OutTradeNo: wxpay_utility.String("order_20200701_123456"),
67 Amount: wxpay_utility.Int64(382895),
68 }},
69 Remark: wxpay_utility.String("备注"),
70 },
71 }
72
73 err = IssueGeneralIndustryFapiaoApplications(config, request)
74 if err != nil {
75 fmt.Printf("请求失败: %+v\n", err)
76
77 return
78 }
79
80
81 fmt.Println("请求成功")
82}
83
84func IssueGeneralIndustryFapiaoApplications(config *wxpay_utility.MchConfig, request *IssueGeneralFapiaoRequest) (err error) {
85 const (
86 host = "https://api.mch.weixin.qq.com"
87 method = "POST"
88 path = "/v3/new-tax-control-fapiao/fapiao-applications/issue-general"
89 )
90
91 reqUrl, err := url.Parse(fmt.Sprintf("%s%s", host, path))
92 if err != nil {
93 return err
94 }
95 reqBody, err := json.Marshal(request)
96 if err != nil {
97 return err
98 }
99 httpRequest, err := http.NewRequest(method, reqUrl.String(), bytes.NewReader(reqBody))
100 if err != nil {
101 return err
102 }
103 httpRequest.Header.Set("Accept", "application/json")
104 httpRequest.Header.Set("Wechatpay-Serial", config.WechatPayPublicKeyId())
105 httpRequest.Header.Set("Content-Type", "application/json")
106 authorization, err := wxpay_utility.BuildAuthorization(config.MchId(), config.CertificateSerialNo(), config.PrivateKey(), method, reqUrl.RequestURI(), reqBody)
107 if err != nil {
108 return err
109 }
110 httpRequest.Header.Set("Authorization", authorization)
111
112 client := &http.Client{}
113 httpResponse, err := client.Do(httpRequest)
114 if err != nil {
115 return err
116 }
117 respBody, err := wxpay_utility.ExtractResponseBody(httpResponse)
118 if err != nil {
119 return err
120 }
121 if httpResponse.StatusCode >= 200 && httpResponse.StatusCode < 300 {
122
123 err = wxpay_utility.ValidateResponse(
124 config.WechatPayPublicKeyId(),
125 config.WechatPayPublicKey(),
126 &httpResponse.Header,
127 respBody,
128 )
129 if err != nil {
130 return err
131 }
132 return nil
133 } else {
134 return wxpay_utility.NewApiException(
135 httpResponse.StatusCode,
136 httpResponse.Header,
137 respBody,
138 )
139 }
140}
141
142type IssueGeneralFapiaoRequest struct {
143 SubMchid *string `json:"sub_mchid,omitempty"`
144 FapiaoApplyId *string `json:"fapiao_apply_id,omitempty"`
145 BuyerInformation *UserTitleEntity `json:"buyer_information,omitempty"`
146 FapiaoInformation *IssueGeneralFapiaoInfo `json:"fapiao_information,omitempty"`
147}
148
149type UserTitleEntity struct {
150 Type *BuyerType `json:"type,omitempty"`
151 Name *string `json:"name,omitempty"`
152 TaxpayerId *string `json:"taxpayer_id,omitempty"`
153 Address *string `json:"address,omitempty"`
154 Telephone *string `json:"telephone,omitempty"`
155 BankName *string `json:"bank_name,omitempty"`
156 BankAccount *string `json:"bank_account,omitempty"`
157 Phone *string `json:"phone,omitempty"`
158 Email *string `json:"email,omitempty"`
159 Amount *int64 `json:"amount,omitempty"`
160 OutTradeNo *string `json:"out_trade_no,omitempty"`
161 FapiaoBillType *FapiaoBillType `json:"fapiao_bill_type,omitempty"`
162 UserApplyMessage *string `json:"user_apply_message,omitempty"`
163}
164
165type IssueGeneralFapiaoInfo struct {
166 FapiaoId *string `json:"fapiao_id,omitempty"`
167 TotalAmount *int64 `json:"total_amount,omitempty"`
168 Items []IssueGeneralFapiaoItem `json:"items,omitempty"`
169 ExportBusinessPolicyCode *int64 `json:"export_business_policy_code,omitempty"`
170 VatRefundLevyCode *int64 `json:"vat_refund_levy_code,omitempty"`
171 BillingPersonId *string `json:"billing_person_id,omitempty"`
172 BillingPerson *string `json:"billing_person,omitempty"`
173 FapiaoBillType *FapiaoBillType `json:"fapiao_bill_type,omitempty"`
174 TransactionInformation []TransactionInfo `json:"transaction_information,omitempty"`
175 Remark *string `json:"remark,omitempty"`
176}
177
178type BuyerType string
179
180func (e BuyerType) Ptr() *BuyerType {
181 return &e
182}
183
184const (
185 BUYERTYPE_INDIVIDUAL BuyerType = "INDIVIDUAL"
186 BUYERTYPE_ORGANIZATION BuyerType = "ORGANIZATION"
187)
188
189type FapiaoBillType string
190
191func (e FapiaoBillType) Ptr() *FapiaoBillType {
192 return &e
193}
194
195const (
196 FAPIAOBILLTYPE_COMM_FAPIAO FapiaoBillType = "COMM_FAPIAO"
197 FAPIAOBILLTYPE_VAT_FAPIAO FapiaoBillType = "VAT_FAPIAO"
198)
199
200type IssueGeneralFapiaoItem struct {
201 TaxCode *string `json:"tax_code,omitempty"`
202 GoodsName *string `json:"goods_name,omitempty"`
203 Specification *string `json:"specification,omitempty"`
204 Unit *string `json:"unit,omitempty"`
205 Quantity *int64 `json:"quantity,omitempty"`
206 TotalAmount *int64 `json:"total_amount,omitempty"`
207 TaxRate *int64 `json:"tax_rate,omitempty"`
208 Discount *bool `json:"discount,omitempty"`
209 PreferentialPolicyCode *int64 `json:"preferential_policy_code,omitempty"`
210}
211
212type TransactionInfo struct {
213 PayChannel *PayChannel `json:"pay_channel,omitempty"`
214 TransactionId *string `json:"transaction_id,omitempty"`
215 OutTradeNo *string `json:"out_trade_no,omitempty"`
216 Amount *int64 `json:"amount,omitempty"`
217}
218
219type PayChannel string
220
221func (e PayChannel) Ptr() *PayChannel {
222 return &e
223}
224
225const (
226 PAYCHANNEL_WECHAT_PAY PayChannel = "WECHAT_PAY"
227)
228