1
|
|
|
# -*- coding: utf-8 -*- |
2
|
10 |
|
from __future__ import absolute_import, unicode_literals |
3
|
|
|
|
4
|
10 |
|
from wechatpy.client.api.base import BaseWeChatAPI |
5
|
|
|
|
6
|
|
|
|
7
|
10 |
|
class WeChatCard(BaseWeChatAPI): |
8
|
|
|
|
9
|
10 |
|
API_BASE_URL = 'https://api.weixin.qq.com/' |
10
|
|
|
|
11
|
10 |
|
def create(self, card_data): |
12
|
|
|
""" |
13
|
|
|
创建卡券 |
14
|
|
|
|
15
|
|
|
:param card_data: 卡券信息 |
16
|
|
|
:return: 创建的卡券 ID |
17
|
|
|
""" |
18
|
|
|
result = self._post( |
19
|
|
|
'card/create', |
20
|
|
|
data=card_data, |
21
|
|
|
result_processor=lambda x: x['card_id'] |
22
|
|
|
) |
23
|
|
|
return result |
24
|
|
|
|
25
|
10 |
|
def batch_add_locations(self, location_data): |
26
|
|
|
""" |
27
|
|
|
批量导入门店信息 |
28
|
|
|
|
29
|
|
|
:param location_data: 门店信息 |
30
|
|
|
:return: 门店 ID 列表,插入失败的门店元素值为 -1 |
31
|
|
|
""" |
32
|
|
|
result = self._post( |
33
|
|
|
'card/location/batchadd', |
34
|
|
|
data=location_data, |
35
|
|
|
result_processor=lambda x: x['location_id_list'] |
36
|
|
|
) |
37
|
|
|
return result |
38
|
|
|
|
39
|
10 |
|
def batch_get_locations(self, offset=0, count=0): |
40
|
|
|
""" |
41
|
|
|
批量获取门店信息 |
42
|
|
|
""" |
43
|
|
|
return self._post( |
44
|
|
|
'card/location/batchget', |
45
|
|
|
data={ |
46
|
|
|
'offset': offset, |
47
|
|
|
'count': count |
48
|
|
|
} |
49
|
|
|
) |
50
|
|
|
|
51
|
10 |
|
def get_colors(self): |
52
|
|
|
""" |
53
|
|
|
获得卡券的最新颜色列表,用于创建卡券 |
54
|
|
|
:return: 颜色列表 |
55
|
|
|
""" |
56
|
|
|
result = self._get( |
57
|
|
|
'card/getcolors', |
58
|
|
|
result_processor=lambda x: x['colors'] |
59
|
|
|
) |
60
|
|
|
return result |
61
|
|
|
|
62
|
10 |
|
def create_qrcode(self, qrcode_data): |
63
|
|
|
""" |
64
|
|
|
创建卡券二维码 |
65
|
|
|
|
66
|
|
|
:param qrcode_data: 二维码信息 |
67
|
|
|
:return: 二维码 ticket,可使用 :func:show_qrcode 换取二维码文件 |
68
|
|
|
""" |
69
|
|
|
result = self._post( |
70
|
|
|
'card/qrcode/create', |
71
|
|
|
data=qrcode_data, |
72
|
|
|
result_processor=lambda x: x['ticket'] |
73
|
|
|
) |
74
|
|
|
return result |
75
|
|
|
|
76
|
10 |
|
def create_landingpage(self, buffer_data): |
77
|
|
|
""" |
78
|
|
|
创建货架 |
79
|
|
|
""" |
80
|
|
|
result = self._post( |
81
|
|
|
'card/landingpage/create', |
82
|
|
|
data=buffer_data |
83
|
|
|
) |
84
|
|
|
return result |
85
|
|
|
|
86
|
10 |
|
def get_html(self, card_id): |
87
|
|
|
""" |
88
|
|
|
图文消息群发卡券 |
89
|
|
|
""" |
90
|
|
|
result = self._post( |
91
|
|
|
'card/mpnews/gethtml', |
92
|
|
|
data={ |
93
|
|
|
'card_id': card_id |
94
|
|
|
}, |
95
|
|
|
result_processor=lambda x: x['content'] |
96
|
|
|
) |
97
|
|
|
return result |
98
|
|
|
|
99
|
10 |
|
def consume_code(self, code, card_id=None): |
100
|
|
|
""" |
101
|
|
|
消耗 code |
102
|
|
|
""" |
103
|
|
|
card_data = { |
104
|
|
|
'code': code |
105
|
|
|
} |
106
|
|
|
if card_id: |
107
|
|
|
card_data['card_id'] = card_id |
108
|
|
|
return self._post( |
109
|
|
|
'card/code/consume', |
110
|
|
|
data=card_data |
111
|
|
|
) |
112
|
|
|
|
113
|
10 |
|
def decrypt_code(self, encrypt_code): |
114
|
|
|
""" |
115
|
|
|
解码加密的 code |
116
|
|
|
""" |
117
|
|
|
result = self._post( |
118
|
|
|
'card/code/decrypt', |
119
|
|
|
data={ |
120
|
|
|
'encrypt_code': encrypt_code |
121
|
|
|
}, |
122
|
|
|
result_processor=lambda x: x['code'] |
123
|
|
|
) |
124
|
|
|
return result |
125
|
|
|
|
126
|
10 |
|
def delete(self, card_id): |
127
|
|
|
""" |
128
|
|
|
删除卡券 |
129
|
|
|
""" |
130
|
|
|
return self._post( |
131
|
|
|
'card/delete', |
132
|
|
|
data={ |
133
|
|
|
'card_id': card_id |
134
|
|
|
} |
135
|
|
|
) |
136
|
|
|
|
137
|
10 |
|
def get_code(self, code, card_id=None, check_consume=True): |
138
|
|
|
""" |
139
|
|
|
查询 code 信息 |
140
|
|
|
""" |
141
|
|
|
card_data = { |
142
|
|
|
'code': code |
143
|
|
|
} |
144
|
|
|
if card_id: |
145
|
|
|
card_data['card_id'] = card_id |
146
|
|
|
if not check_consume: |
147
|
|
|
card_data['check_consume'] = check_consume |
148
|
|
|
return self._post( |
149
|
|
|
'card/code/get', |
150
|
|
|
data=card_data |
151
|
|
|
) |
152
|
|
|
|
153
|
10 |
|
def get_card_list(self, openid, card_id=None): |
154
|
|
|
""" |
155
|
|
|
用于获取用户卡包里的,属于该appid下的卡券。 |
156
|
|
|
""" |
157
|
|
|
card_data = { |
158
|
|
|
'openid': openid |
159
|
|
|
} |
160
|
|
|
if card_id: |
161
|
|
|
card_data['card_id'] = card_id |
162
|
|
|
return self._post( |
163
|
|
|
'card/user/getcardlist', |
164
|
|
|
data=card_data |
165
|
|
|
) |
166
|
|
|
|
167
|
10 |
|
def batch_get(self, offset=0, count=50, status_list=None): |
168
|
|
|
""" |
169
|
|
|
批量查询卡券信息 |
170
|
|
|
""" |
171
|
|
|
card_data = { |
172
|
|
|
'offset': offset, |
173
|
|
|
'count': count |
174
|
|
|
} |
175
|
|
|
if status_list: |
176
|
|
|
card_data['status_list'] = status_list |
177
|
|
|
return self._post( |
178
|
|
|
'card/batchget', |
179
|
|
|
data=card_data |
180
|
|
|
) |
181
|
|
|
|
182
|
10 |
|
def get(self, card_id): |
183
|
|
|
""" |
184
|
|
|
查询卡券详情 |
185
|
|
|
""" |
186
|
|
|
result = self._post( |
187
|
|
|
'card/get', |
188
|
|
|
data={ |
189
|
|
|
'card_id': card_id |
190
|
|
|
}, |
191
|
|
|
result_processor=lambda x: x['card'] |
192
|
|
|
) |
193
|
|
|
return result |
194
|
|
|
|
195
|
10 |
|
def update_code(self, card_id, old_code, new_code): |
196
|
|
|
""" |
197
|
|
|
更新卡券 code |
198
|
|
|
""" |
199
|
|
|
return self._post( |
200
|
|
|
'card/code/update', |
201
|
|
|
data={ |
202
|
|
|
'card_id': card_id, |
203
|
|
|
'code': old_code, |
204
|
|
|
'new_code': new_code |
205
|
|
|
} |
206
|
|
|
) |
207
|
|
|
|
208
|
10 |
|
def invalid_code(self, code, card_id=None): |
209
|
|
|
""" |
210
|
|
|
设置卡券失效 |
211
|
|
|
""" |
212
|
|
|
card_data = { |
213
|
|
|
'code': code |
214
|
|
|
} |
215
|
|
|
if card_id: |
216
|
|
|
card_data['card_id'] = card_id |
217
|
|
|
return self._post( |
218
|
|
|
'card/code/unavailable', |
219
|
|
|
data=card_data |
220
|
|
|
) |
221
|
|
|
|
222
|
10 |
|
def update(self, card_data): |
223
|
|
|
""" |
224
|
|
|
更新卡券信息 |
225
|
|
|
""" |
226
|
|
|
return self._post( |
227
|
|
|
'card/update', |
228
|
|
|
data=card_data |
229
|
|
|
) |
230
|
|
|
|
231
|
10 |
|
def set_paycell(self, card_id, is_open): |
232
|
|
|
""" |
233
|
|
|
更新卡券信息 |
234
|
|
|
""" |
235
|
|
|
return self._post( |
236
|
|
|
'card/paycell/set', |
237
|
|
|
data={ |
238
|
|
|
'card_id': card_id, |
239
|
|
|
'is_open': is_open |
240
|
|
|
} |
241
|
|
|
) |
242
|
|
|
|
243
|
10 |
|
def set_test_whitelist(self, openids=None, usernames=None): |
244
|
|
|
""" |
245
|
|
|
设置卡券测试用户白名单 |
246
|
|
|
""" |
247
|
|
|
openids = openids or [] |
248
|
|
|
usernames = usernames or [] |
249
|
|
|
return self._post( |
250
|
|
|
'card/testwhitelist/set', |
251
|
|
|
data={ |
252
|
|
|
'openid': openids, |
253
|
|
|
'username': usernames |
254
|
|
|
} |
255
|
|
|
) |
256
|
|
|
|
257
|
10 |
|
def activate_membercard(self, membership_number, code, **kwargs): |
258
|
|
|
""" |
259
|
|
|
激活会员卡 - 接口激活方式 |
260
|
|
|
详情请参见 |
261
|
|
|
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1451025283 |
262
|
|
|
|
263
|
|
|
参数示例: |
264
|
|
|
{ |
265
|
|
|
"init_bonus": 100, |
266
|
|
|
"init_bonus_record":"旧积分同步", |
267
|
|
|
"init_balance": 200, |
268
|
|
|
"membership_number": "AAA00000001", |
269
|
|
|
"code": "12312313", |
270
|
|
|
"card_id": "xxxx_card_id", |
271
|
|
|
"background_pic_url": "https://mmbiz.qlogo.cn/mmbiz/0?wx_fmt=jpeg", |
272
|
|
|
"init_custom_field_value1": "xxxxx", |
273
|
|
|
"init_custom_field_value2": "xxxxx", |
274
|
|
|
"init_custom_field_value3": "xxxxx" |
275
|
|
|
} |
276
|
|
|
|
277
|
|
|
返回示例: |
278
|
|
|
{"errcode":0, "errmsg":"ok"} |
279
|
|
|
|
280
|
|
|
:param membership_number: 必填,会员卡编号,由开发者填入,作为序列号显示在用户的卡包里。可与Code码保持等值 |
281
|
|
|
:param code: 必填,领取会员卡用户获得的code |
282
|
|
|
:param kwargs: 其他非必填字段,包含则更新对应字段。详情参见微信文档 “6 激活会员卡” 部分 |
283
|
|
|
:return: 参见返回示例 |
284
|
|
|
""" |
285
|
|
|
kwargs['membership_number'] = membership_number |
286
|
|
|
kwargs['code'] = code |
287
|
|
|
return self._post( |
288
|
|
|
'card/membercard/activate', |
289
|
|
|
data=kwargs |
290
|
|
|
) |
291
|
|
|
|
292
|
10 |
|
def update_membercard(self, code, card_id, **kwargs): |
293
|
|
|
""" |
294
|
|
|
更新会员信息 |
295
|
|
|
详情请参见 |
296
|
|
|
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1451025283 |
297
|
|
|
|
298
|
|
|
注意事项: |
299
|
|
|
1.开发者可以同时传入add_bonus和bonus解决由于同步失败带来的幂等性问题。同时传入add_bonus和bonus时 |
300
|
|
|
add_bonus作为积分变动消息中的变量值,而bonus作为卡面上的总积分额度显示。余额变动同理。 |
301
|
|
|
2.开发者可以传入is_notify_bonus控制特殊的积分对账变动不发送消息,余额变动同理。 |
302
|
|
|
|
303
|
|
|
参数示例: |
304
|
|
|
{ |
305
|
|
|
"code": "179011264953", |
306
|
|
|
"card_id": "p1Pj9jr90_SQRaVqYI239Ka1erkI", |
307
|
|
|
"background_pic_url": "https://mmbiz.qlogo.cn/mmbiz/0?wx_fmt=jpeg", |
308
|
|
|
"record_bonus": "消费30元,获得3积分", |
309
|
|
|
"bonus": 3000, |
310
|
|
|
"add_bonus": 30, |
311
|
|
|
"balance": 3000, |
312
|
|
|
"add_balance": -30, |
313
|
|
|
"record_balance": "购买焦糖玛琪朵一杯,扣除金额30元。", |
314
|
|
|
"custom_field_value1": "xxxxx", |
315
|
|
|
"custom_field_value2": "xxxxx", |
316
|
|
|
"notify_optional": { |
317
|
|
|
"is_notify_bonus": true, |
318
|
|
|
"is_notify_balance": true, |
319
|
|
|
"is_notify_custom_field1":true |
320
|
|
|
} |
321
|
|
|
} |
322
|
|
|
|
323
|
|
|
返回示例: |
324
|
|
|
{ |
325
|
|
|
"errcode": 0, |
326
|
|
|
"errmsg": "ok", |
327
|
|
|
"result_bonus": 100, |
328
|
|
|
"result_balance": 200, |
329
|
|
|
"openid": "oFS7Fjl0WsZ9AMZqrI80nbIq8xrA" |
330
|
|
|
} |
331
|
|
|
|
332
|
|
|
:param code: 必填,卡券Code码 |
333
|
|
|
:param card_id: 必填,卡券ID |
334
|
|
|
:param kwargs: 其他非必填字段,包含则更新对应字段。详情参见微信文档 “7 更新会员信息” 部分 |
335
|
|
|
:return: 参见返回示例 |
336
|
|
|
""" |
337
|
|
|
kwargs.update({ |
338
|
|
|
'code': code, |
339
|
|
|
'card_id': card_id, |
340
|
|
|
}) |
341
|
|
|
return self._post( |
342
|
|
|
'card/membercard/updateuser', |
343
|
|
|
data=kwargs |
344
|
|
|
) |
345
|
|
|
|
346
|
10 |
|
def get_membercard_user_info(self, card_id, code): |
347
|
|
|
""" |
348
|
|
|
查询会员卡的会员信息 |
349
|
|
|
详情请参见 |
350
|
|
|
https://mp.weixin.qq.com/wiki?id=mp1466494654_K9rNz |
351
|
|
|
|
352
|
|
|
:param card_id: 查询会员卡的 Card ID |
353
|
|
|
:param code: 所查询用户领取到的 code 值 |
354
|
|
|
:return: 会员信息,包括激活资料、积分信息以及余额等信息 |
355
|
|
|
""" |
356
|
|
|
return self._post( |
357
|
|
|
'card/membercard/userinfo/get', |
358
|
|
|
data={ |
359
|
|
|
'card_id': card_id, |
360
|
|
|
'code': code, |
361
|
|
|
}, |
362
|
|
|
) |
363
|
|
|
|
364
|
10 |
|
def add_pay_giftcard(self, base_info, extra_info, is_membercard): |
365
|
|
|
""" |
366
|
|
|
新增支付后投放卡券的规则,支持支付后领卡,支付后赠券 |
367
|
|
|
详情请参见 |
368
|
|
|
https://mp.weixin.qq.com/wiki?id=mp1466494654_K9rNz |
369
|
|
|
|
370
|
|
|
:param base_info: 营销规则结构体 |
371
|
|
|
:type base_info: dict |
372
|
|
|
:param extra_info: 支付规则结构体 |
373
|
|
|
:type extra_info: dict |
374
|
|
|
:param is_membercard: 本次规则是否是领卡。(领卡传入 True, 赠券传入 False) |
375
|
|
|
:type is_membercard: bool |
376
|
|
|
:return: 规则 ID, 设置成功的列表,以及设置失败的列表 |
377
|
|
|
""" |
378
|
|
|
if is_membercard: |
379
|
|
|
rule_key = 'member_rule' |
380
|
|
|
rule_type = 'RULE_TYPE_PAY_MEMBER_CARD' |
381
|
|
|
else: |
382
|
|
|
rule_key = 'single_pay' |
383
|
|
|
rule_type = 'RULE_TYPE_SINGLE_PAY' |
384
|
|
|
return self._post( |
385
|
|
|
'card/paygiftcard/add', |
386
|
|
|
data={ |
387
|
|
|
'rule_info': { |
388
|
|
|
'type': rule_type, |
389
|
|
|
'base_info': base_info, |
390
|
|
|
rule_key: extra_info, |
391
|
|
|
} |
392
|
|
|
} |
393
|
|
|
) |
394
|
|
|
|
395
|
10 |
|
def del_pay_giftcard(self, rule_id): |
396
|
|
|
""" |
397
|
|
|
删除支付后投放卡券的规则 |
398
|
|
|
详情请参见 |
399
|
|
|
https://mp.weixin.qq.com/wiki?id=mp1466494654_K9rNz |
400
|
|
|
|
401
|
|
|
:param rule_id: 支付即会员的规则 ID |
402
|
|
|
""" |
403
|
|
|
return self._post( |
404
|
|
|
'card/paygiftcard/delete', |
405
|
|
|
data={ |
406
|
|
|
'rule_id': rule_id, |
407
|
|
|
}, |
408
|
|
|
) |
409
|
|
|
|
410
|
10 |
|
def get_pay_giftcard(self, rule_id): |
411
|
|
|
""" |
412
|
|
|
查询支付后投放卡券的规则 |
413
|
|
|
详情请参见 |
414
|
|
|
https://mp.weixin.qq.com/wiki?id=mp1466494654_K9rNz |
415
|
|
|
|
416
|
|
|
:param rule_id: 支付即会员的规则 ID |
417
|
|
|
:return: 支付后投放卡券的规则 |
418
|
|
|
:rtype: dict |
419
|
|
|
""" |
420
|
|
|
return self._post( |
421
|
|
|
'card/paygiftcard/getbyid', |
422
|
|
|
data={ |
423
|
|
|
'rule_id': rule_id, |
424
|
|
|
}, |
425
|
|
|
result_processor=lambda x: x['rule_info'], |
426
|
|
|
) |
427
|
|
|
|
428
|
10 |
|
def batch_get_pay_giftcard(self, effective=True, offset=0, count=10): |
429
|
|
|
""" |
430
|
|
|
批量查询支付后投放卡券的规则 |
431
|
|
|
详情请参见 |
432
|
|
|
https://mp.weixin.qq.com/wiki?id=mp1466494654_K9rNz |
433
|
|
|
|
434
|
|
|
|
435
|
|
|
:param effective: 是否仅查询生效的规则 |
436
|
|
|
:type effective: bool |
437
|
|
|
:param offset: 起始偏移量 |
438
|
|
|
:type offset: int |
439
|
|
|
:param count: 查询的数量 |
440
|
|
|
:type count: int |
441
|
|
|
:return: 支付后投放卡券规则的总数,以及查询到的列表 |
442
|
|
|
""" |
443
|
|
|
return self._post( |
444
|
|
|
'card/paygiftcard/batchget', |
445
|
|
|
data={ |
446
|
|
|
'type': 'RULE_TYPE_PAY_MEMBER_CARD', |
447
|
|
|
'effective': effective, |
448
|
|
|
'offset': offset, |
449
|
|
|
'count': count, |
450
|
|
|
}, |
451
|
|
|
) |
452
|
|
|
|
453
|
10 |
|
def update_movie_ticket(self, code, ticket_class, show_time, duration, |
454
|
|
|
screening_room, seat_number, card_id=None): |
455
|
|
|
""" |
456
|
|
|
更新电影票 |
457
|
|
|
""" |
458
|
|
|
ticket = { |
459
|
|
|
'code': code, |
460
|
|
|
'ticket_class': ticket_class, |
461
|
|
|
'show_time': show_time, |
462
|
|
|
'duration': duration, |
463
|
|
|
'screening_room': screening_room, |
464
|
|
|
'seat_number': seat_number |
465
|
|
|
} |
466
|
|
|
if card_id: |
467
|
|
|
ticket['card_id'] = card_id |
468
|
|
|
return self._post( |
469
|
|
|
'card/movieticket/updateuser', |
470
|
|
|
data=ticket |
471
|
|
|
) |
472
|
|
|
|
473
|
10 |
|
def checkin_boardingpass(self, code, passenger_name, seat_class, |
474
|
|
|
etkt_bnr, seat='', gate='', boarding_time=None, |
475
|
|
|
is_cancel=False, qrcode_data=None, card_id=None): |
476
|
|
|
""" |
477
|
|
|
飞机票接口 |
478
|
|
|
""" |
479
|
|
|
data = { |
480
|
|
|
'code': code, |
481
|
|
|
'passenger_name': passenger_name, |
482
|
|
|
'class': seat_class, |
483
|
|
|
'etkt_bnr': etkt_bnr, |
484
|
|
|
'seat': seat, |
485
|
|
|
'gate': gate, |
486
|
|
|
'is_cancel': is_cancel |
487
|
|
|
} |
488
|
|
|
if boarding_time: |
489
|
|
|
data['boarding_time'] = boarding_time |
490
|
|
|
if qrcode_data: |
491
|
|
|
data['qrcode_data'] = qrcode_data |
492
|
|
|
if card_id: |
493
|
|
|
data['card_id'] = card_id |
494
|
|
|
return self._post( |
495
|
|
|
'card/boardingpass/checkin', |
496
|
|
|
data=data |
497
|
|
|
) |
498
|
|
|
|
499
|
10 |
|
def update_luckymoney_balance(self, code, balance, card_id=None): |
500
|
|
|
""" |
501
|
|
|
更新红包余额 |
502
|
|
|
""" |
503
|
|
|
card_data = { |
504
|
|
|
'code': code, |
505
|
|
|
'balance': balance |
506
|
|
|
} |
507
|
|
|
if card_id: |
508
|
|
|
card_data['card_id'] = card_id |
509
|
|
|
return self._post( |
510
|
|
|
'card/luckymoney/updateuserbalance', |
511
|
|
|
data=card_data |
512
|
|
|
) |
513
|
|
|
|
514
|
10 |
|
def get_redirect_url(self, url, encrypt_code, card_id): |
515
|
|
|
""" |
516
|
|
|
获取卡券跳转外链 |
517
|
|
|
""" |
518
|
|
|
from wechatpy.utils import WeChatSigner |
519
|
|
|
|
520
|
|
|
code = self.decrypt_code(encrypt_code) |
521
|
|
|
|
522
|
|
|
signer = WeChatSigner() |
523
|
|
|
signer.add_data(self.secret) |
524
|
|
|
signer.add_data(code) |
525
|
|
|
signer.add_data(card_id) |
526
|
|
|
signature = signer.signature |
527
|
|
|
|
528
|
|
|
r = '{url}?encrypt_code={code}&card_id={card_id}&signature={signature}' |
529
|
|
|
return r.format( |
530
|
|
|
url=url, |
531
|
|
|
code=encrypt_code, |
532
|
|
|
card_id=card_id, |
533
|
|
|
signature=signature |
534
|
|
|
) |
535
|
|
|
|
536
|
10 |
|
def deposit_code(self, card_id, codes): |
537
|
|
|
""" |
538
|
|
|
导入code |
539
|
|
|
""" |
540
|
|
|
card_data = { |
541
|
|
|
'card_id': card_id, |
542
|
|
|
'code': codes |
543
|
|
|
} |
544
|
|
|
return self._post( |
545
|
|
|
'card/code/deposit', |
546
|
|
|
data=card_data |
547
|
|
|
) |
548
|
|
|
|
549
|
10 |
|
def get_deposit_count(self, card_id): |
550
|
|
|
""" |
551
|
|
|
查询导入code数目 |
552
|
|
|
""" |
553
|
|
|
card_data = { |
554
|
|
|
'card_id': card_id, |
555
|
|
|
} |
556
|
|
|
return self._post( |
557
|
|
|
'card/code/getdepositcount', |
558
|
|
|
data=card_data |
559
|
|
|
) |
560
|
|
|
|
561
|
10 |
|
def check_code(self, card_id, codes): |
562
|
|
|
""" |
563
|
|
|
核查code |
564
|
|
|
""" |
565
|
|
|
card_data = { |
566
|
|
|
'card_id': card_id, |
567
|
|
|
'code': codes |
568
|
|
|
} |
569
|
|
|
return self._post( |
570
|
|
|
'card/code/checkcode', |
571
|
|
|
data=card_data |
572
|
|
|
) |
573
|
|
|
|
574
|
10 |
|
def modify_stock(self, card_id, n): |
575
|
|
|
""" |
576
|
|
|
修改库存 |
577
|
|
|
""" |
578
|
|
|
if n == 0: |
579
|
|
|
return |
580
|
|
|
card_data = { |
581
|
|
|
'card_id': card_id, |
582
|
|
|
} |
583
|
|
|
if n > 0: |
584
|
|
|
card_data['increase_stock_value'] = n |
585
|
|
|
elif n < 0: |
586
|
|
|
card_data['reduce_stock_value'] = -n |
587
|
|
|
return self._post( |
588
|
|
|
'card/modifystock', |
589
|
|
|
data=card_data |
590
|
|
|
) |
591
|
|
|
|
592
|
10 |
|
def get_activate_url(self, card_id, outer_str=None): |
593
|
|
|
""" |
594
|
|
|
获取开卡插件 Url, 内含调用开卡插件所需的参数 |
595
|
|
|
详情请参考 |
596
|
|
|
https://mp.weixin.qq.com/wiki?id=mp1499332673_Unm7V |
597
|
|
|
|
598
|
|
|
:param card_id: 会员卡的card_id |
599
|
|
|
:param outer_str: 渠道值,用于统计本次领取的渠道参数 |
600
|
|
|
:return: 内含调用开卡插件所需的参数的 Url |
601
|
|
|
""" |
602
|
|
|
return self._post( |
603
|
|
|
'card/membercard/activate/geturl', |
604
|
|
|
data={ |
605
|
|
|
'card_id': card_id, |
606
|
|
|
'outer_str': outer_str, |
607
|
|
|
}, |
608
|
|
|
result_processor=lambda x: x['url'], |
609
|
|
|
) |
610
|
|
|
|
611
|
10 |
|
def get_activate_info(self, activate_ticket): |
612
|
|
|
""" |
613
|
|
|
获取用户开卡时提交的信息 |
614
|
|
|
详情请参考 |
615
|
|
|
https://mp.weixin.qq.com/wiki?id=mp1499332673_Unm7V |
616
|
|
|
|
617
|
|
|
:param activate_ticket: 跳转型开卡组件开卡后回调中的激活票据,可以用来获取用户开卡资料 |
618
|
|
|
:return: 用户开卡时填写的字段值 |
619
|
|
|
""" |
620
|
|
|
return self._post( |
621
|
|
|
'card/membercard/activatetempinfo/get', |
622
|
|
|
data={ |
623
|
|
|
'activate_ticket': activate_ticket, |
624
|
|
|
}, |
625
|
|
|
result_processor=lambda x: x['info'], |
626
|
|
|
) |
627
|
|
|
|
628
|
10 |
|
def set_activate_user_form(self, card_id, **kwargs): |
629
|
|
|
""" |
630
|
|
|
设置开卡字段接口 |
631
|
|
|
详情请参考 |
632
|
|
|
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1451025283 |
633
|
|
|
"6 激活会员卡" -> "6.2 一键激活" -> "步骤二:设置开卡字段接口" |
634
|
|
|
|
635
|
|
|
参数示例: |
636
|
|
|
{ |
637
|
|
|
"card_id": "pbLatjnrwUUdZI641gKdTMJzHGfc", |
638
|
|
|
"service_statement": { |
639
|
|
|
"name": "会员守则", |
640
|
|
|
"url": "https://www.qq.com" |
641
|
|
|
}, |
642
|
|
|
"bind_old_card": { |
643
|
|
|
"name": "老会员绑定", |
644
|
|
|
"url": "https://www.qq.com" |
645
|
|
|
}, |
646
|
|
|
"required_form": { |
647
|
|
|
"can_modify":false, |
648
|
|
|
"rich_field_list": [ |
649
|
|
|
{ |
650
|
|
|
"type": "FORM_FIELD_RADIO", |
651
|
|
|
"name": "兴趣", |
652
|
|
|
"values": [ |
653
|
|
|
"钢琴", |
654
|
|
|
"舞蹈", |
655
|
|
|
"足球" |
656
|
|
|
] |
657
|
|
|
}, |
658
|
|
|
{ |
659
|
|
|
"type": "FORM_FIELD_SELECT", |
660
|
|
|
"name": "喜好", |
661
|
|
|
"values": [ |
662
|
|
|
"郭敬明", |
663
|
|
|
"韩寒", |
664
|
|
|
"南派三叔" |
665
|
|
|
] |
666
|
|
|
}, |
667
|
|
|
{ |
668
|
|
|
"type": "FORM_FIELD_CHECK_BOX", |
669
|
|
|
"name": "职业", |
670
|
|
|
"values": [ |
671
|
|
|
"赛车手", |
672
|
|
|
"旅行家" |
673
|
|
|
] |
674
|
|
|
} |
675
|
|
|
], |
676
|
|
|
"common_field_id_list": [ |
677
|
|
|
"USER_FORM_INFO_FLAG_MOBILE" |
678
|
|
|
] |
679
|
|
|
}, |
680
|
|
|
"optional_form": { |
681
|
|
|
"can_modify":false, |
682
|
|
|
"common_field_id_list": [ |
683
|
|
|
"USER_FORM_INFO_FLAG_LOCATION", |
684
|
|
|
"USER_FORM_INFO_FLAG_BIRTHDAY" |
685
|
|
|
], |
686
|
|
|
"custom_field_list": [ |
687
|
|
|
"喜欢的电影" |
688
|
|
|
] |
689
|
|
|
} |
690
|
|
|
} |
691
|
|
|
common_field_id_list 值见常量 `wechatpy.constants.UserFormInfoFlag` |
692
|
|
|
|
693
|
|
|
:param card_id: 卡券ID |
694
|
|
|
:param kwargs: 其他非必填参数,见微信文档 |
695
|
|
|
""" |
696
|
|
|
kwargs['card_id'] = card_id |
697
|
|
|
return self._post( |
698
|
|
|
'card/membercard/activateuserform/set', |
699
|
|
|
data=kwargs |
700
|
|
|
) |
701
|
|
|
|