
1package main
2
3import (
4 "bytes"
5 "demo/wxpay_utility"
6 "encoding/json"
7 "fmt"
8 "net/http"
9 "net/url"
10 "strings"
11 "time"
12)
13
14func main() {
15
16 config, err := wxpay_utility.CreateMchConfig(
17 "19xxxxxxxx",
18 "1DDE55AD98Exxxxxxxxxx",
19 "/path/to/apiclient_key.pem",
20 "PUB_KEY_ID_xxxxxxxxxxxxx",
21 "/path/to/wxp_pub.pem",
22 )
23 if err != nil {
24 fmt.Println(err)
25 return
26 }
27
28 request := &InvalidateCardRequest{
29 CardId: wxpay_utility.String("pbLatjvWOibDc5-TBnbUk1pD12o0"),
30 BrandId: wxpay_utility.String("1004"),
31 }
32
33 response, err := InvalidateCard(config, request)
34 if err != nil {
35 fmt.Printf("请求失败: %+v\n", err)
36
37 return
38 }
39
40
41 fmt.Printf("请求成功: %+v\n", response)
42}
43
44func InvalidateCard(config *wxpay_utility.MchConfig, request *InvalidateCardRequest) (response *Card, err error) {
45 const (
46 host = "https://api.mch.weixin.qq.com"
47 method = "POST"
48 path = "/v3/brand/partner/card-member/cards/{card_id}/invalidate"
49 )
50
51 reqUrl, err := url.Parse(fmt.Sprintf("%s%s", host, path))
52 if err != nil {
53 return nil, err
54 }
55 reqUrl.Path = strings.Replace(reqUrl.Path, "{card_id}", url.PathEscape(*request.CardId), -1)
56 reqBody, err := json.Marshal(request)
57 if err != nil {
58 return nil, err
59 }
60 httpRequest, err := http.NewRequest(method, reqUrl.String(), bytes.NewReader(reqBody))
61 if err != nil {
62 return nil, err
63 }
64 httpRequest.Header.Set("Accept", "application/json")
65 httpRequest.Header.Set("Wechatpay-Serial", config.WechatPayPublicKeyId())
66 httpRequest.Header.Set("Content-Type", "application/json")
67 authorization, err := wxpay_utility.BuildAuthorization(config.MchId(), config.CertificateSerialNo(), config.PrivateKey(), method, reqUrl.RequestURI(), reqBody)
68 if err != nil {
69 return nil, err
70 }
71 httpRequest.Header.Set("Authorization", authorization)
72
73 client := &http.Client{}
74 httpResponse, err := client.Do(httpRequest)
75 if err != nil {
76 return nil, err
77 }
78 respBody, err := wxpay_utility.ExtractResponseBody(httpResponse)
79 if err != nil {
80 return nil, err
81 }
82 if httpResponse.StatusCode >= 200 && httpResponse.StatusCode < 300 {
83
84 err = wxpay_utility.ValidateResponse(
85 config.WechatPayPublicKeyId(),
86 config.WechatPayPublicKey(),
87 &httpResponse.Header,
88 respBody,
89 )
90 if err != nil {
91 return nil, err
92 }
93 response := &Card{}
94 if err := json.Unmarshal(respBody, response); err != nil {
95 return nil, err
96 }
97
98 return response, nil
99 } else {
100 return nil, wxpay_utility.NewApiException(
101 httpResponse.StatusCode,
102 httpResponse.Header,
103 respBody,
104 )
105 }
106}
107
108type InvalidateCardRequest struct {
109 BrandId *string `json:"brand_id,omitempty"`
110 CardId *string `json:"card_id,omitempty"`
111}
112
113func (o *InvalidateCardRequest) MarshalJSON() ([]byte, error) {
114 type Alias InvalidateCardRequest
115 a := &struct {
116 CardId *string `json:"card_id,omitempty"`
117 *Alias
118 }{
119
120 CardId: nil,
121 Alias: (*Alias)(o),
122 }
123 return json.Marshal(a)
124}
125
126type Card struct {
127 OutRequestNo *string `json:"out_request_no,omitempty"`
128 CardId *string `json:"card_id,omitempty"`
129 BrandId *string `json:"brand_id,omitempty"`
130 Appid *string `json:"appid,omitempty"`
131 CardType *CardType `json:"card_type,omitempty"`
132 CardTitle *string `json:"card_title,omitempty"`
133 CardColor *string `json:"card_color,omitempty"`
134 CardPictureUrl *string `json:"card_picture_url,omitempty"`
135 CodeMode *CodeMode `json:"code_mode,omitempty"`
136 CodeType *CodeType `json:"code_type,omitempty"`
137 CodeJumpInformation *CodeJumpInfo `json:"code_jump_information,omitempty"`
138 Benefits *string `json:"benefits,omitempty"`
139 NotifyUrl *string `json:"notify_url,omitempty"`
140 NeedPinned *bool `json:"need_pinned,omitempty"`
141 NeedDisplayLevel *bool `json:"need_display_level,omitempty"`
142 InitLevel *string `json:"init_level,omitempty"`
143 ServicePhone *string `json:"service_phone,omitempty"`
144 LegalAgreement *string `json:"legal_agreement,omitempty"`
145 ValidDateInformation *DateInfo `json:"valid_date_information,omitempty"`
146 MemberInformation *MemberInfo `json:"member_information,omitempty"`
147 PointsInformation *PointsInfo `json:"points_information,omitempty"`
148 BalanceInformation *BalanceInfo `json:"balance_information,omitempty"`
149 PurchaseInformation *PurchaseInfo `json:"purchase_information,omitempty"`
150 UserInformation *UserInfoForm `json:"user_information,omitempty"`
151 State *CardState `json:"state,omitempty"`
152 CreateTime *time.Time `json:"create_time,omitempty"`
153 ModifyTime *time.Time `json:"modify_time,omitempty"`
154 SupportUserActiveJoin *bool `json:"support_user_active_join,omitempty"`
155 PurchaseMembership *bool `json:"purchase_membership,omitempty"`
156}
157
158type CardType string
159
160func (e CardType) Ptr() *CardType {
161 return &e
162}
163
164const (
165 CARDTYPE_PURCHASE CardType = "PURCHASE"
166 CARDTYPE_NORMAL CardType = "NORMAL"
167 CARDTYPE_BALANCE CardType = "BALANCE"
168)
169
170type CodeMode string
171
172func (e CodeMode) Ptr() *CodeMode {
173 return &e
174}
175
176const (
177 CODEMODE_SYSTEM_ALLOCATE CodeMode = "SYSTEM_ALLOCATE"
178 CODEMODE_MERCHANT_ALLOCATE CodeMode = "MERCHANT_ALLOCATE"
179)
180
181type CodeType string
182
183func (e CodeType) Ptr() *CodeType {
184 return &e
185}
186
187const (
188 CODETYPE_NONE_CODE CodeType = "NONE_CODE"
189 CODETYPE_BAR_CODE CodeType = "BAR_CODE"
190 CODETYPE_QR_CODE CodeType = "QR_CODE"
191 CODETYPE_BAR_CODE_AND_QR_CODE CodeType = "BAR_CODE_AND_QR_CODE"
192 CODETYPE_JUMP_MINI_PROGRAM CodeType = "JUMP_MINI_PROGRAM"
193)
194
195type CodeJumpInfo struct {
196 JumpAppid *string `json:"jump_appid,omitempty"`
197 JumpPath *string `json:"jump_path,omitempty"`
198}
199
200type DateInfo struct {
201 Type *DateType `json:"type,omitempty"`
202 AvailableBeginTime *time.Time `json:"available_begin_time,omitempty"`
203 AvailableEndTime *time.Time `json:"available_end_time,omitempty"`
204 AvailableDayAfterReceive *int64 `json:"available_day_after_receive,omitempty"`
205}
206
207type MemberInfo struct {
208 JumpAppid *string `json:"jump_appid,omitempty"`
209 JumpPath *string `json:"jump_path,omitempty"`
210}
211
212type PointsInfo struct {
213 JumpAppid *string `json:"jump_appid,omitempty"`
214 JumpPath *string `json:"jump_path,omitempty"`
215}
216
217type BalanceInfo struct {
218 JumpAppid *string `json:"jump_appid,omitempty"`
219 JumpPath *string `json:"jump_path,omitempty"`
220}
221
222type PurchaseInfo struct {
223 Price *int64 `json:"price,omitempty"`
224 JumpAppid *string `json:"jump_appid,omitempty"`
225 JumpPath *string `json:"jump_path,omitempty"`
226}
227
228type UserInfoForm struct {
229 CommonFieldList []CommonFieldFlag `json:"common_field_list,omitempty"`
230 CustomFieldList []UserCustomFieldForm `json:"custom_field_list,omitempty"`
231}
232
233type CardState string
234
235func (e CardState) Ptr() *CardState {
236 return &e
237}
238
239const (
240 CARDSTATE_CARD_EFFECTIVE CardState = "CARD_EFFECTIVE"
241 CARDSTATE_CARD_INVALID CardState = "CARD_INVALID"
242)
243
244type DateType string
245
246func (e DateType) Ptr() *DateType {
247 return &e
248}
249
250const (
251 DATETYPE_FIX_TIME_RANGE DateType = "FIX_TIME_RANGE"
252 DATETYPE_FIX_TERM DateType = "FIX_TERM"
253 DATETYPE_PERMANENT DateType = "PERMANENT"
254)
255
256type CommonFieldFlag string
257
258func (e CommonFieldFlag) Ptr() *CommonFieldFlag {
259 return &e
260}
261
262const (
263 COMMONFIELDFLAG_USER_FORM_FLAG_SEX CommonFieldFlag = "USER_FORM_FLAG_SEX"
264 COMMONFIELDFLAG_USER_FORM_FLAG_NAME CommonFieldFlag = "USER_FORM_FLAG_NAME"
265 COMMONFIELDFLAG_USER_FORM_FLAG_BIRTHDAY CommonFieldFlag = "USER_FORM_FLAG_BIRTHDAY"
266 COMMONFIELDFLAG_USER_FORM_FLAG_ADDRESS CommonFieldFlag = "USER_FORM_FLAG_ADDRESS"
267 COMMONFIELDFLAG_USER_FORM_FLAG_EMAIL CommonFieldFlag = "USER_FORM_FLAG_EMAIL"
268 COMMONFIELDFLAG_USER_FORM_FLAG_CITY CommonFieldFlag = "USER_FORM_FLAG_CITY"
269)
270
271type UserCustomFieldForm struct {
272 Type *CustomFieldType `json:"type,omitempty"`
273 Name *string `json:"name,omitempty"`
274 Values []string `json:"values,omitempty"`
275}
276
277type CustomFieldType string
278
279func (e CustomFieldType) Ptr() *CustomFieldType {
280 return &e
281}
282
283const (
284 CUSTOMFIELDTYPE_CHECK_BOX CustomFieldType = "CHECK_BOX"
285 CUSTOMFIELDTYPE_RADIO CustomFieldType = "RADIO"
286)
287