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