wechatpy.client.api.card.WeChatCard.create()   A
last analyzed

Complexity

Conditions 2

Size

Total Lines 13
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 1
CRAP Score 3.1852

Importance

Changes 0
Metric Value
cc 2
eloc 6
nop 2
dl 0
loc 13
rs 10
c 0
b 0
f 0
ccs 1
cts 3
cp 0.3333
crap 3.1852
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