1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
|
%global _empty_manifest_terminate_build 0
Name: python-wechatpayv3
Version: 1.2.39
Release: 1
Summary: 微信支付 API v3 Python SDK(python sdk for wechatpay v3)
License: MIT
URL: https://github.com/minibear2021/wechatpayv3
Source0: https://mirrors.nju.edu.cn/pypi/web/packages/35/9f/16fd070bb24d82ff2a471243a425ff188e8909eba4863a4d4358d404278f/wechatpayv3-1.2.39.tar.gz
BuildArch: noarch
Requires: python3-requests
Requires: python3-cryptography
%description
# 微信支付 API v3 Python SDK
[](https://badge.fury.io/py/wechatpayv3)
[](https://img.shields.io/pypi/dm/wechatpayv3)
## 介绍
微信支付接口 V3 版 python 库。
欢迎微信支付开发者扫码进 QQ 群(群号:973102221)讨论,欢迎提交代码,欢迎star、follow、fork:

## 适用对象
**wechatpayv3**同时支持微信支付[直连模式](https://pay.weixin.qq.com/wiki/doc/apiv3/index.shtml)及[服务商模式](https://pay.weixin.qq.com/wiki/doc/apiv3_partner/index.shtml),接口说明详见官网。
## 特性
1. 平台证书自动更新,无需开发者关注平台证书有效性,无需手动下载更新;
2. 支持本地缓存平台证书,初始化时指定平台证书保存目录即可;
3. 敏感信息直接传入明文参数,SDK 内部自动加密,无需手动处理;
4. 回调通知自动验证回调消息,自动解密 resource 对象,并返回解密后的数据;
5. 已适配[直连模式](https://pay.weixin.qq.com/wiki/doc/apiv3/apis/index.shtml)和[服务商模式](https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/index.shtml)中除“电商收付通”以外所有 v3 版接口。
## 源码
[github](https://github.com/minibear2021/wechatpayv3)
[gitee](https://gitee.com/minibear2021/wechatpayv3)
## 安装
```
$ pip install wechatpayv3
```
## 使用方法
### 准备
参考微信官方文档准备好密钥, 证书文件和配置([证书/密钥/签名介绍](https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay3_0.shtml))
- **商户 API 证书私钥:PRIVATE_KEY**。商户申请商户 API 证书时,会生成商户私钥,并保存在本地证书文件夹的文件 apiclient_key.pem 中。
> :warning: 不要把私钥文件暴露在公共场合,如上传到 Github,写在客户端代码等。
- **商户 API 证书序列号:CERT_SERIAL_NO**。每个证书都有一个由 CA 颁发的唯一编号,即证书序列号。扩展阅读 [如何查看证书序列号](https://wechatpay-api.gitbook.io/wechatpay-api-v3/chang-jian-wen-ti/zheng-shu-xiang-guan#ru-he-cha-kan-zheng-shu-xu-lie-hao)。
- **微信支付 APIv3 密钥:APIV3_KEY**,是在回调通知和微信支付平台证书下载接口中,为加强数据安全,对关键信息 `AES-256-GCM` 加密时使用的对称加密密钥。
### 一个最小的后端
[examples.py](examples.py) 演示了一个带有[Native 支付下单](https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_4_1.shtml)接口和[支付通知](https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_4_5.shtml)接口的后端。
首先,修改 **examplys.py** 里以下几项配置参数:
```python
# 微信支付商户号,服务商模式下为服务商户号,即官方文档中的sp_mchid。
MCHID = '1230000109'
# 商户证书私钥,此文件不要放置在下面设置的CERT_DIR目录里。
with open('path_to_key/apiclient_key.pem') as f:
PRIVATE_KEY = f.read()
# 商户证书序列号
CERT_SERIAL_NO = '444F4864EA9B34415...'
# API v3密钥, https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay3_2.shtml
APIV3_KEY = 'MIIEvwIBADANBgkqhkiG9w0BAQE...'
# APPID,应用ID,服务商模式下为服务商应用ID,即官方文档中的sp_appid,也可以在调用接口的时候覆盖。
APPID = 'wxd678efh567hg6787'
# 回调地址,也可以在调用接口的时候覆盖。
NOTIFY_URL = 'https://www.xxxx.com/notify'
# 微信支付平台证书缓存目录,初始调试的时候可以设为None,首次使用确保此目录为空目录。
CERT_DIR = './cert'
# 日志记录器,记录web请求和回调细节,便于调试排错。
logging.basicConfig(filename=os.path.join(os.getcwd(), 'demo.log'), level=logging.DEBUG, filemode='a', format='%(asctime)s - %(process)s - %(levelname)s: %(message)s')
LOGGER = logging.getLogger("demo")
# 接入模式:False=直连商户模式,True=服务商模式。
PARTNER_MODE = False
# 代理设置,None或者{"https": "http://10.10.1.10:1080"},详细格式参见https://docs.python-requests.org/zh_CN/latest/user/advanced.html
PROXY = None
```
接下来初始化 WechatPay 实例并配置一个合适的接口:
```python
wxpay = WeChatPay(
wechatpay_type=WeChatPayType.NATIVE,
mchid=MCHID,
private_key=PRIVATE_KEY,
cert_serial_no=CERT_SERIAL_NO,
apiv3_key=APIV3_KEY,
appid=APPID,
notify_url=NOTIFY_URL,
cert_dir=CERT_DIR,
logger=LOGGER,
partner_mode=PARTNER_MODE,
proxy=PROXY)
app = Flask(__name__)
@app.route('/pay')
def pay():
# 以native下单为例,下单成功后即可获取到'code_url',将'code_url'转换为二维码,并用微信扫码即可进行支付测试。
out_trade_no = ''.join(sample(ascii_letters + digits, 8))
description = 'demo-description'
amount = 1
code, message = wxpay.pay(
description=description,
out_trade_no=out_trade_no,
amount={'total': amount},
pay_type=WeChatPayType.NATIVE
)
return jsonify({'code': code, 'message': message})
```
检查一下参数无误,现在就可以用 python 解释器来运行:
```shell
$ python examples.py
* Serving Flask app "examples" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
```
现在访问 http://127.0.0.1:5000/pay ,如果一切正常,你会看到下面一串 json 字符串:
```python
{
"code": 200,
"message": "{\"code_url\":\"weixin://wxpay/bizpayurl?pr=abcdefghi\"}"
}
```
到这一步统一下单的后端就完成了,现在将 code_url 的值即"weixin://wxpay/bizpayurl?pr=abcdefghi"用[草料](https://cli.im/)转换为二维码即可用微信扫码进行支付测试。
**以上步骤如果不能正确执行,务必仔细检查各项初始化参数,必要的情况下,登录微信支付后台,将所有参数重置。**
Native 支付调试最简单便捷,调试通过没有问题证明初始化参数正确之后,如果需要采用其他(小程序、H5、JSAPI、APP)支付下单,可继续参考 examples.py。
## 接口清单
已适配的微信支付 V3 版 API 接口列表如下,部分接口调用示例可以参考[这里](interface.md):
| 大类| 小类 | 接口 | 接口函数| 直连商户适用 | 服务商适用 |
| ---- | ---------------------------------------- | ------------------------ | --------------------------------------- | ------------ | ---------- |
| 公用| 公用 | 调起支付签名| sign | 是 | 是 |
| 公用| 公用 | 回调通知| callback | 是 | 是 |
| 公用| 公用 | 敏感信息参数解密 | decrypt | 是 | 是 |
| 公用| 公用 | 下载账单| download_bill| 是 | 是 |
| 商户进件 | 特约商户进件、小微商户进件| 提交申请单 | applyment_submit | 否| 是|
| 商户进件 | 特约商户进件、小微商户进件| 查询申请单状态| applyment_query| 否| 是|
| 商户进件 | 特约商户进件、小微商户进件| 修改结算账号| applyment_settlement_modify| 否| 是|
| 商户进件 | 特约商户进件、小微商户进件| 查询结算账号| applyment_settlement_query| 否| 是|
| 基础支付 | JSAPI、APP、H5、Native、小程序支付| 统一下单 | pay | 是| 是|
| 基础支付 | JSAPI、APP、H5、Native、小程序支付| 查询订单 | query | 是| 是|
| 基础支付 | JSAPI、APP、H5、Native、小程序支付| 关闭订单 | close | 是| 是|
| 基础支付 | 合单支付 | 统一下单 | combine_pay| 是| 是|
| 基础支付 | 合单支付 | 查询订单 | combine_query| 是| 是|
| 基础支付 | 合单支付 | 关闭订单 | combine_close| 是| 是|
| 基础支付 | JSAPI、APP、H5、Native、小程序、合单支付 | 申请退款 | refund| 是| 是|
| 基础支付 | JSAPI、APP、H5、Native、小程序、合单支付 | 查询单笔退款| query_refund | 是| 是|
| 基础支付 | JSAPI、APP、H5、Native、小程序、合单支付 | 申请交易账单| trade_bill | 是| 是|
| 基础支付 | JSAPI、APP、H5、Native、小程序、合单支付 | 申请资金账单| fundflow_bill| 是| 是|
| 基础支付 | JSAPI、APP、H5、Native、小程序、合单支付 | 申请单个子商户资金账单 | submch_fundflow_bill| 否| 是|
| 基础支付 | JSAPI、APP、H5、Native、小程序、合单支付 | 下载账单 | download_bill| 是| 是|
| 经营能力 | 微信支付分(免确认模式) | 创单结单合并| payscore_direct_complete| 是| 否|
| 经营能力 | 微信支付分(免确认预授权模式)| 商户预授权 | payscore_permission | 是| 否|
| 经营能力 | 微信支付分(免确认预授权模式)| 查询用户授权记录| payscore_permission_query | 是| 否|
| 经营能力 | 微信支付分(免确认预授权模式)| 解除用户授权关系| payscore_permission_terminate| 是| 否|
| 经营能力 | 微信支付分(公共 API) | 创建支付分订单| payscore_create| 是| 否|
| 经营能力 | 微信支付分(公共 API) | 查询支付分订单| payscore_query | 是| 否|
| 经营能力 | 微信支付分(公共 API) | 取消支付分订单| payscore_cancel| 是| 否|
| 经营能力 | 微信支付分(公共 API) | 修改订单金额| payscore_modify| 是| 否|
| 经营能力 | 微信支付分(公共 API) | 完结支付分订单| payscore_complete| 是| 否|
| 经营能力 | 微信支付分(公共 API) | 商户发起催收扣款| payscore_pay | 是| 否|
| 经营能力 | 微信支付分(公共 API) | 同步服务订单信息| payscore_sync| 是| 否|
| 经营能力 | 微信支付分(公共 API) | 申请退款 | payscore_refund| 是| 否|
| 经营能力 | 微信支付分(公共 API) | 查询单笔退款| payscore_refund_query | 是| 否|
| 经营能力 | 微信支付分(公共 API) | 商户申请获取对账单| payscore_merchant_bill| 是| 否|
| 经营能力 | 支付即服务| 服务人员注册| guides_register| 是| 是|
| 经营能力 | 支付即服务| 服务人员分配| guides_assign| 是| 是|
| 经营能力 | 支付即服务| 服务人员查询| guides_query | 是| 是|
| 经营能力 | 支付即服务| 服务人员信息更新| guides_update| 是| 是|
| 经营能力 | 点金计划 | 点金计划管理| goldplan_plan_change| 否| 是|
| 经营能力 | 点金计划 | 商家小票管理| goldplan_custompage_change| 否| 是|
| 经营能力 | 点金计划 | 同业过滤标签管理| goldplan_advertising_filter| 否| 是|
| 经营能力 | 点金计划 | 开通广告展示| goldplan_advertising_open | 否| 是|
| 经营能力 | 点金计划 | 关闭广告展示| goldplan_advertising_close| 否| 是|
| 行业方案 | 电商收付通| 尚未适配 | 尚未适配| 否| 是|
| 行业方案 | 智慧商圈 | 商圈积分同步| points_notify| 是| 是|
| 行业方案 | 智慧商圈 | 商圈积分授权查询| user_authorization| 是| 是|
| 行业方案 | 智慧商圈 | 商圈会员待积分状态查询| business_point_status| 是| 是|
| 行业方案 | 智慧商圈 | 商圈会员停车状态同步| business_parking_sync| 是| 是|
| 行业方案 | 微信支付分停车服务| 查询车牌服务开通信息| parking_service_find| 是| 是|
| 行业方案 | 微信支付分停车服务| 创建停车入场| parking_enter| 是| 是|
| 行业方案 | 微信支付分停车服务| 扣费受理 | parking_order| 是| 是|
| 行业方案 | 微信支付分停车服务| 查询订单 | parking_query| 是| 是|
| 营销工具 | 代金券 | 创建代金券批次| marketing_favor_stock_create | 是| 是|
| 营销工具 | 代金券 | 激活代金券批次| marketing_favor_stock_start| 是| 是|
| 营销工具 | 代金券 | 发放代金券批次| marketing_favor_stock_send| 是| 是|
| 营销工具 | 代金券 | 暂停代金券批次| marketing_favor_stock_pause| 是| 是|
| 营销工具 | 代金券 | 重启代金券批次| marketing_favor_stock_restart| 是| 是|
| 营销工具 | 代金券 | 条件查询批次列表| marketing_favor_stock_list| 是| 是|
| 营销工具 | 代金券 | 查询批次详情| marketing_favor_stock_detail | 是| 是|
| 营销工具 | 代金券 | 查询代金券详情| marketing_favor_coupon_detail| 是| 是|
| 营销工具 | 代金券 | 查询代金券可用商户| marketing_favor_stock_merchant | 是| 是|
| 营销工具 | 代金券 | 查询代金券可用单品| marketing_favor_stock_item| 是| 是|
| 营销工具 | 代金券 | 根据商户号查用户的券| marketing_favor_user_coupon| 是| 是|
| 营销工具 | 代金券 | 下载批次核销明细| marketing_favor_use_flow| 是| 是|
| 营销工具 | 代金券 | 下载批次退款明细| marketing_favor_refund_flow| 是| 是|
| 营销工具 | 代金券 | 设置消息通知地址| marketing_favor_callback_update| 是| 是|
| 营销工具 | 商家券 | 创建商家券 | marketing_busifavor_stock_create | 是| 是|
| 营销工具 | 商家券 | 查询商家券详情| marketing_busifavor_stock_query| 是| 是|
| 营销工具 | 商家券 | 核销用户券 | marketing_busifavor_coupon_use | 是| 是|
| 营销工具 | 商家券 | 根据过滤条件查询用户券 | marketing_busifavor_user_coupon| 是| 是|
| 营销工具 | 商家券 | 查询用户单张券详情| marketing_busifavor_coupon_detail| 是| 是|
| 营销工具 | 商家券 | 上传预存 code | marketing_busifavor_couponcode_upload | 是| 是|
| 营销工具 | 商家券 | 设置商家券事件通知地址 | marketing_busifavor_callback_update| 是| 是|
| 营销工具 | 商家券 | 查询商家券事件通知地址 | marketing_busifavor_callback_query | 是| 是|
| 营销工具 | 商家券 | 关联订单信息| marketing_busifavor_coupon_associate| 是| 是|
| 营销工具 | 商家券 | 取消关联订单信息| marketing_busifavor_coupon_disassociate | 是| 是|
| 营销工具 | 商家券 | 修改批次预算| marketing_busifavor_stock_budget | 是| 是|
| 营销工具 | 商家券 | 修改商家券基本信息| marketing_busifavor_stock_modify | 是| 是|
| 营销工具 | 商家券 | 申请退券 | marketing_busifavor_coupon_return| 是| 是|
| 营销工具 | 商家券 | 使券失效 | marketing_busifavor_coupon_deactivate | 是| 是|
| 营销工具 | 商家券 | 营销补差付款| marketing_busifavor_subsidy_pay| 是| 是|
| 营销工具 | 商家券 | 查询营销补差付款单详情 | marketing_busifavor_subsidy_query| 是| 是|
| 营销工具 | 委托营销 | 建立合作关系| marketing_partnership_build| 是| 是|
| 营销工具 | 委托营销 | 查询合作关系列表| marketing_partnership_query| 是| 是|
| 营销工具 | 消费卡 | 发放消费卡 | marketing_card_send | 是| 否|
| 营销工具 | 支付有礼 | 创建全场满额送活动| marketing_paygift_activity_create| 是| 是|
| 营销工具 | 支付有礼 | 查询活动详情接口| marketing_paygift_activity_detail| 是| 是|
| 营销工具 | 支付有礼 | 查询活动发券商户号| marketing_paygift_merchants_list | 是| 是|
| 营销工具 | 支付有礼 | 查询活动指定商品列表| marketing_paygift_goods_list | 是| 是|
| 营销工具 | 支付有礼 | 终止活动 | marketing_paygift_activity_terminate| 是| 是|
| 营销工具 | 支付有礼 | 新增活动发券商户号| marketing_paygift_merchant_add | 是| 是|
| 营销工具 | 支付有礼 | 获取支付有礼活动列表| marketing_paygift_activity_list| 是| 是|
| 营销工具 | 支付有礼 | 删除活动发券商户号| marketing_paygift_merchant_delete| 是| 是|
| 营销工具 | 银行定向活促 | 出行券切卡组件预下单| industry_coupon_token| 否| 是|
| 营销工具 | 银行定向活促 | 导入定向用户协议号| bank_package_file| 否| 是|
| 营销工具 | 图片上传 | 图片上传(营销专用)| marketing_image_upload| 是| 是|
| 资金应用 | 商家转账到零钱 | 发起商家转账 | transfer_batch | 是| 否|
| 资金应用 | 商家转账到零钱 | 微信批次单号查询批次单| transfer_query_batchid | 是| 否|
| 资金应用 | 商家转账到零钱 | 微信明细单号查询明细单| transfer_query_detail_id | 是| 否|
| 资金应用 | 商家转账到零钱 | 商家批次单号查询批次单| transfer_query_out_batch_no | 是| 否|
| 资金应用 | 商家转账到零钱 | 商家明细单号查询明细单| transfer_query_out_detail_no | 是| 否|
| 资金应用 | 商家转账到零钱 | 转账电子回单申请受理 | transfer_bill_receipt | 是| 否|
| 资金应用 | 商家转账到零钱 | 查询转账电子回单| transfer_query_bill_receipt | 是| 否|
| 资金应用 | 商家转账到零钱 | 转账明细电子回单受理| transfer_detail_receipt | 是| 否|
| 资金应用 | 商家转账到零钱 | 查询转账明细电子回单受理结果| transfer_query_receipt | 是| 否|
| 资金应用 | 分账 | 请求分账 | profitsharing_order | 是| 是|
| 资金应用 | 分账 | 查询分账结果| profitsharing_order_query | 是| 是|
| 资金应用 | 分账 | 请求分账回退| profitsharing_return| 是| 是|
| 资金应用 | 分账 | 查询分账回退结果| profitsharing_return_query| 是| 是|
| 资金应用 | 分账 | 解冻剩余资金| profitsharing_unfreeze| 是| 是|
| 资金应用 | 分账 | 查询剩余待分金额| profitsharing_amount_query| 是| 是|
| 资金应用 | 分账 | 查询最大分账比例| profitsharing_config_query| 否| 是|
| 资金应用 | 分账 | 添加分账接收方| profitsharing_add_receiver| 是| 是|
| 资金应用 | 分账 | 删除分账接收方| profitsharing_delete_receiver| 是| 是|
| 资金应用 | 分账 | 申请分账账单| profitsharing_bill| 是| 是|
| 资金应用 | 分账 | 下载账单 | download_bill| 是| 是|
| 资金应用 | 连锁品牌分账 | 请求分账 | brand_profitsharing_order | 否| 是|
| 资金应用 | 连锁品牌分账 | 查询分账结果| brand_profitsharing_order_query| 否| 是|
| 资金应用 | 连锁品牌分账 | 请求分账回退| brand_profitsharing_return| 否| 是|
| 资金应用 | 连锁品牌分账 | 查询分账回退结果| brand_profitsharing_return_query | 否| 是|
| 资金应用 | 连锁品牌分账 | 完结分账 | brand_profitsharing_unfreeze | 否| 是|
| 资金应用 | 连锁品牌分账 | 查询剩余待分金额| brand_profitsharing_amount_query | 否| 是|
| 资金应用 | 连锁品牌分账 | 查询最大分账比例| brand_profitsharing_config_query | 否| 是|
| 资金应用 | 连锁品牌分账 | 添加分账接收方| brand_profitsharing_add_receiver | 否| 是|
| 资金应用 | 连锁品牌分账 | 删除分账接收方| brand_profitsharing_delete_receiver| 否| 是|
| 资金应用 | 连锁品牌分账 | 申请分账账单| profitsharing_bill| 否| 是|
| 资金应用 | 连锁品牌分账 | 下载账单 | download_bill| 是| 是|
| 风险合规 | 商户开户意愿确认 | 提交申请单 | apply4subject_submit| 否| 是|
| 风险合规 | 商户开户意愿确认 | 撤销申请单 | apply4subject_cancel| 否| 是|
| 风险合规 | 商户开户意愿确认 | 查询申请单审核结果| apply4subject_query | 否| 是|
| 风险合规 | 商户开户意愿确认 | 获取商户开户意愿确认状态 | apply4subject_state | 否| 是|
| 风险合规 | 消费者投诉 2.0 | 查询投诉单列表| complaint_list_query| 是| 是|
| 风险合规 | 消费者投诉 2.0 | 查询投诉单详情| complaint_detail_query| 是| 是|
| 风险合规 | 消费者投诉 2.0 | 查询投诉协商历史| complaint_history_query | 是| 是|
| 风险合规 | 消费者投诉 2.0 | 创建投诉通知回调地址| complaint_notification_create| 是| 是|
| 风险合规 | 消费者投诉 2.0 | 查询投诉通知回调地址| complaint_notification_query | 是| 是|
| 风险合规 | 消费者投诉 2.0 | 更新投诉通知回调地址| complaint_notification_update| 是| 是|
| 风险合规 | 消费者投诉 2.0 | 删除投诉通知回调地址| complaint_notification_delete| 是| 是|
| 风险合规 | 消费者投诉 2.0 | 提交回复 | complaint_response| 是| 是|
| 风险合规 | 消费者投诉 2.0 | 反馈处理完成| complaint_complete| 是| 是|
| 风险合规 | 消费者投诉 2.0 | 更新退款审批结果| complaint_update_refund| 是| 是|
| 风险合规 | 消费者投诉 2.0 | 商户上传反馈图片| complaint_image_upload| 是| 是|
| 风险合规 | 消费者投诉 2.0 | 图片下载 | complaint_image_download| 是| 是|
| 风险合规 | 商户违规通知回调 | 创建商户违规通知回调地址 | merchantrisk_callback_create | 否| 是|
| 风险合规 | 商户违规通知回调 | 查询商户违规通知回调地址 | merchantrisk_callback_query| 否| 是|
| 风险合规 | 商户违规通知回调 | 修改商户违规通知回调地址 | merchantrisk_callback_update | 否| 是|
| 风险合规 | 商户违规通知回调 | 删除商户违规通知回调地址 | merchantrisk_callback_delete | 否| 是|
| 其他能力 | 图片上传 | 图片上传 | image_upload | 是| 是|
| 其他能力 | 视频上传 | 视频上传 | video_upload | 是| 是|
| 其他 | 电子发票(公共API) | 创建电子发票卡券模板 | fapiao_card_template | 是 | 是 |
| 其他 | 电子发票(公共API) | 配置开发选项 | fapiao_set_merchant_config | 是 | 是 |
| 其他 | 电子发票(公共API) | 查询商户配置的开发选项 | fapiao_merchant_config | 是 | 是 |
| 其他 | 电子发票(公共API) | 获取抬头填写链接 | fapiao_title_url | 是 | 是 |
| 其他 | 电子发票(公共API) | 获取用户填写的抬头 | fapiao_title | 是 | 是 |
| 其他 | 电子发票(区块链模式) | 获取商品和服务税收分类对照表 | fapiao_tax_codes | 是 | 是 |
| 其他 | 电子发票(区块链模式) | 获取商户开票基础信息 | fapiao_merchant_base_info | 是 | 是 |
| 其他 | 电子发票(区块链模式) | 开具电子发票 | fapiao_applications | 是 | 是 |
| 其他 | 电子发票(区块链模式) | 查询电子发票 | fapiao_query | 是 | 是 |
| 其他 | 电子发票(区块链模式) | 冲红电子发票 | fapiao_reverse | 是 | 是 |
| 其他 | 电子发票(自建平台模式) | 上传电子发票文件 | fapiao_upload_file | 是 | 是 |
| 其他 | 电子发票(自建平台模式) | 将电子发票插入微信用户卡包 | fapiao_insert_cards | 是 | 是 |
| 其他 | 银行组件 | 获取对私银行卡号开户银行 | capital_search_bank_number | 是 | 是 |
| 其他 | 银行组件 | 查询支持个人业务的银行列表 | capital_personal_banks | 是 | 是 |
| 其他 | 银行组件 | 查询支持对公业务的银行列表 | capital_corporate_banks | 是 | 是 |
| 其他 | 银行组件 | 查询省份列表 | capital_provinces | 是 | 是 |
| 其他 | 银行组件 | 查询城市列表 | capital_cities | 是 | 是 |
| 其他 | 银行组件 | 查询支行列表 | capital_branches | 是 | 是 |
### 接口函数参数
参数类型对照参考下表:
| 微信支付官方文档声明 | **wechatpayv3 python sdk** |
| -------------------- | -------------------------- |
| string | str |
| int| int |
| object | dict: {} |
| array| list: [] |
| boolean| bool: True, False |
| message| bytes|
### 接口函数返回值
每个接口均同步返回 code 和 message,code 为 web 请求得到的 HTTP 状态码,message 为服务器返回的 json 字符串。
例外:
1. 回调通知(callback)接口将收到的参数解密后返回,回调验证不合规或解密失败则返回 None;
2. 下载账单(download_bill)和消费者投诉 2.0 的图片下载(complaint_image_download)接口返回的 message 为 bytes 类型,直接将 message 写入磁盘即可获得对应的目标文件。
## 常见问题
### 回调验证失败处理
开发者遇到的难点之一就是回调验证失败的问题,由于众多的 python web 框架对回调消息的处理不完全一致,如果出现回调验证失败,请务必确认传入的 headers 和 body 的值和类型。
通常框架传过来的 headers 类型是 dict,而 body 类型是 bytes。flask 框架参考以下方法可直接获取到解密后的实际内容。
```python
@app.route('/notify', methods=['POST'])
def notify():
result = wxpay.callback(request.headers, request.data)
if result and result.get('event_type') == 'TRANSACTION.SUCCESS':
resource = result.get('resource')
appid = resource.get('appid')
mchid = resource.get('mchid')
out_trade_no = resource.get('out_trade_no')
transaction_id = resource.get('transaction_id')
trade_type = resource.get('trade_type')
trade_state = resource.get('trade_state')
trade_state_desc = resource.get('trade_state_desc')
bank_type = resource.get('bank_type')
attach = resource.get('attach')
success_time = resource.get('success_time')
payer = resource.get('payer')
amount = resource.get('amount').get('total')
# TODO: 根据返回参数进行必要的业务处理,处理完后返回200或204
return jsonify({'code': 'SUCCESS', 'message': '成功'})
else:
return jsonify({'code': 'FAILED', 'message': '失败'}), 500
```
#### flask 框架
如上面示例,直接传入 request.headers 和 request.data 即可。
```python
result = wxpay.callback(headers=request.headers, body=request.data)
```
#### django 框架
由于 django 框架特殊性,会将 headers 做一定的预处理,可以参考以下方式调用。
```python
headers = {}
headers.update({'Wechatpay-Signature': request.META.get('HTTP_WECHATPAY_SIGNATURE')})
headers.update({'Wechatpay-Timestamp': request.META.get('HTTP_WECHATPAY_TIMESTAMP')})
headers.update({'Wechatpay-Nonce': request.META.get('HTTP_WECHATPAY_NONCE')})
headers.update({'Wechatpay-Serial': request.META.get('HTTP_WECHATPAY_SERIAL')})
result = wxpay.callback(headers=headers, body=request.body)
```
#### tornado 框架
直接传入 request.headers 和 request.body 即可。
```python
result = wxpay.callback(headers=request.headers, body=request.body)
```
#### 其他框架
参考以上处理方法,大原则就是保证传给 callback 的参数值和收到的值一致,不要转换为 dict,也不要转换为 string。
### 反复收到同一个回调消息怎么处理
实际开发中处理微信支付通知消息时有两个问题需要注意。一是可能会重复收到同一个通知消息,需要在代码中进行判断处理。另一个是处理消息的时间如果过长,建议考虑异步处理,先缓存消息,避免微信支付服务器端认为超时,如果持续超时,微信支付服务器端可能会认为回调消息接口不可用。
### 接口清单里怎么没有回调接口
所有的回调接口都通过公用接口 callback 处理,因此清单里没有一一罗列。对于收到的回调消息,可以通过 event_type 参数判断消息类型进行下一步处理,具体参数清单参考微信支付官方文档。
### 服务商模式如何接入
SDK 默认为直连商户接入,如果初始化时候指定 partner_mode=True,即切换为服务商模式。需要注意的是,一部分接口为直连商户专有,一部分接口为服务商模式专有,另有部分接口同时兼容直连商户和服务商,这些同时兼容的接口在两种模式下个别参数要求会稍有不同。
### 如何下载平台证书?
SDK 内部已经实现了自动下载和加载平台证书,无需预先下载。如需了解具体实现逻辑,可以参阅[core.py](wechatpayv3/core.py)中的\_update_certificates 函数。
### 接口始终返回 500 错误
通常为初始化参数配置错误,如果反复检查无果,建议进入微信支付后台重置所有参数后再试。
### 回调接口始终校验失败
查阅 web 框架文档,确保传入 callback 的 body 参数没有经过任何转义,通常为 bytes 类型。
### 下载平台证书时解析失败
检查 APIV3_KEY 是否和微信支付后台设置的一致,如无法确认,建议重置后再试。
## 签名、验签、加密、解密的内部实现
一般应用开发者可以不用向下看了,有心了解这几项内部实现的可以参考[这里](security.md)了解。
%package -n python3-wechatpayv3
Summary: 微信支付 API v3 Python SDK(python sdk for wechatpay v3)
Provides: python-wechatpayv3
BuildRequires: python3-devel
BuildRequires: python3-setuptools
BuildRequires: python3-pip
%description -n python3-wechatpayv3
# 微信支付 API v3 Python SDK
[](https://badge.fury.io/py/wechatpayv3)
[](https://img.shields.io/pypi/dm/wechatpayv3)
## 介绍
微信支付接口 V3 版 python 库。
欢迎微信支付开发者扫码进 QQ 群(群号:973102221)讨论,欢迎提交代码,欢迎star、follow、fork:

## 适用对象
**wechatpayv3**同时支持微信支付[直连模式](https://pay.weixin.qq.com/wiki/doc/apiv3/index.shtml)及[服务商模式](https://pay.weixin.qq.com/wiki/doc/apiv3_partner/index.shtml),接口说明详见官网。
## 特性
1. 平台证书自动更新,无需开发者关注平台证书有效性,无需手动下载更新;
2. 支持本地缓存平台证书,初始化时指定平台证书保存目录即可;
3. 敏感信息直接传入明文参数,SDK 内部自动加密,无需手动处理;
4. 回调通知自动验证回调消息,自动解密 resource 对象,并返回解密后的数据;
5. 已适配[直连模式](https://pay.weixin.qq.com/wiki/doc/apiv3/apis/index.shtml)和[服务商模式](https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/index.shtml)中除“电商收付通”以外所有 v3 版接口。
## 源码
[github](https://github.com/minibear2021/wechatpayv3)
[gitee](https://gitee.com/minibear2021/wechatpayv3)
## 安装
```
$ pip install wechatpayv3
```
## 使用方法
### 准备
参考微信官方文档准备好密钥, 证书文件和配置([证书/密钥/签名介绍](https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay3_0.shtml))
- **商户 API 证书私钥:PRIVATE_KEY**。商户申请商户 API 证书时,会生成商户私钥,并保存在本地证书文件夹的文件 apiclient_key.pem 中。
> :warning: 不要把私钥文件暴露在公共场合,如上传到 Github,写在客户端代码等。
- **商户 API 证书序列号:CERT_SERIAL_NO**。每个证书都有一个由 CA 颁发的唯一编号,即证书序列号。扩展阅读 [如何查看证书序列号](https://wechatpay-api.gitbook.io/wechatpay-api-v3/chang-jian-wen-ti/zheng-shu-xiang-guan#ru-he-cha-kan-zheng-shu-xu-lie-hao)。
- **微信支付 APIv3 密钥:APIV3_KEY**,是在回调通知和微信支付平台证书下载接口中,为加强数据安全,对关键信息 `AES-256-GCM` 加密时使用的对称加密密钥。
### 一个最小的后端
[examples.py](examples.py) 演示了一个带有[Native 支付下单](https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_4_1.shtml)接口和[支付通知](https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_4_5.shtml)接口的后端。
首先,修改 **examplys.py** 里以下几项配置参数:
```python
# 微信支付商户号,服务商模式下为服务商户号,即官方文档中的sp_mchid。
MCHID = '1230000109'
# 商户证书私钥,此文件不要放置在下面设置的CERT_DIR目录里。
with open('path_to_key/apiclient_key.pem') as f:
PRIVATE_KEY = f.read()
# 商户证书序列号
CERT_SERIAL_NO = '444F4864EA9B34415...'
# API v3密钥, https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay3_2.shtml
APIV3_KEY = 'MIIEvwIBADANBgkqhkiG9w0BAQE...'
# APPID,应用ID,服务商模式下为服务商应用ID,即官方文档中的sp_appid,也可以在调用接口的时候覆盖。
APPID = 'wxd678efh567hg6787'
# 回调地址,也可以在调用接口的时候覆盖。
NOTIFY_URL = 'https://www.xxxx.com/notify'
# 微信支付平台证书缓存目录,初始调试的时候可以设为None,首次使用确保此目录为空目录。
CERT_DIR = './cert'
# 日志记录器,记录web请求和回调细节,便于调试排错。
logging.basicConfig(filename=os.path.join(os.getcwd(), 'demo.log'), level=logging.DEBUG, filemode='a', format='%(asctime)s - %(process)s - %(levelname)s: %(message)s')
LOGGER = logging.getLogger("demo")
# 接入模式:False=直连商户模式,True=服务商模式。
PARTNER_MODE = False
# 代理设置,None或者{"https": "http://10.10.1.10:1080"},详细格式参见https://docs.python-requests.org/zh_CN/latest/user/advanced.html
PROXY = None
```
接下来初始化 WechatPay 实例并配置一个合适的接口:
```python
wxpay = WeChatPay(
wechatpay_type=WeChatPayType.NATIVE,
mchid=MCHID,
private_key=PRIVATE_KEY,
cert_serial_no=CERT_SERIAL_NO,
apiv3_key=APIV3_KEY,
appid=APPID,
notify_url=NOTIFY_URL,
cert_dir=CERT_DIR,
logger=LOGGER,
partner_mode=PARTNER_MODE,
proxy=PROXY)
app = Flask(__name__)
@app.route('/pay')
def pay():
# 以native下单为例,下单成功后即可获取到'code_url',将'code_url'转换为二维码,并用微信扫码即可进行支付测试。
out_trade_no = ''.join(sample(ascii_letters + digits, 8))
description = 'demo-description'
amount = 1
code, message = wxpay.pay(
description=description,
out_trade_no=out_trade_no,
amount={'total': amount},
pay_type=WeChatPayType.NATIVE
)
return jsonify({'code': code, 'message': message})
```
检查一下参数无误,现在就可以用 python 解释器来运行:
```shell
$ python examples.py
* Serving Flask app "examples" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
```
现在访问 http://127.0.0.1:5000/pay ,如果一切正常,你会看到下面一串 json 字符串:
```python
{
"code": 200,
"message": "{\"code_url\":\"weixin://wxpay/bizpayurl?pr=abcdefghi\"}"
}
```
到这一步统一下单的后端就完成了,现在将 code_url 的值即"weixin://wxpay/bizpayurl?pr=abcdefghi"用[草料](https://cli.im/)转换为二维码即可用微信扫码进行支付测试。
**以上步骤如果不能正确执行,务必仔细检查各项初始化参数,必要的情况下,登录微信支付后台,将所有参数重置。**
Native 支付调试最简单便捷,调试通过没有问题证明初始化参数正确之后,如果需要采用其他(小程序、H5、JSAPI、APP)支付下单,可继续参考 examples.py。
## 接口清单
已适配的微信支付 V3 版 API 接口列表如下,部分接口调用示例可以参考[这里](interface.md):
| 大类| 小类 | 接口 | 接口函数| 直连商户适用 | 服务商适用 |
| ---- | ---------------------------------------- | ------------------------ | --------------------------------------- | ------------ | ---------- |
| 公用| 公用 | 调起支付签名| sign | 是 | 是 |
| 公用| 公用 | 回调通知| callback | 是 | 是 |
| 公用| 公用 | 敏感信息参数解密 | decrypt | 是 | 是 |
| 公用| 公用 | 下载账单| download_bill| 是 | 是 |
| 商户进件 | 特约商户进件、小微商户进件| 提交申请单 | applyment_submit | 否| 是|
| 商户进件 | 特约商户进件、小微商户进件| 查询申请单状态| applyment_query| 否| 是|
| 商户进件 | 特约商户进件、小微商户进件| 修改结算账号| applyment_settlement_modify| 否| 是|
| 商户进件 | 特约商户进件、小微商户进件| 查询结算账号| applyment_settlement_query| 否| 是|
| 基础支付 | JSAPI、APP、H5、Native、小程序支付| 统一下单 | pay | 是| 是|
| 基础支付 | JSAPI、APP、H5、Native、小程序支付| 查询订单 | query | 是| 是|
| 基础支付 | JSAPI、APP、H5、Native、小程序支付| 关闭订单 | close | 是| 是|
| 基础支付 | 合单支付 | 统一下单 | combine_pay| 是| 是|
| 基础支付 | 合单支付 | 查询订单 | combine_query| 是| 是|
| 基础支付 | 合单支付 | 关闭订单 | combine_close| 是| 是|
| 基础支付 | JSAPI、APP、H5、Native、小程序、合单支付 | 申请退款 | refund| 是| 是|
| 基础支付 | JSAPI、APP、H5、Native、小程序、合单支付 | 查询单笔退款| query_refund | 是| 是|
| 基础支付 | JSAPI、APP、H5、Native、小程序、合单支付 | 申请交易账单| trade_bill | 是| 是|
| 基础支付 | JSAPI、APP、H5、Native、小程序、合单支付 | 申请资金账单| fundflow_bill| 是| 是|
| 基础支付 | JSAPI、APP、H5、Native、小程序、合单支付 | 申请单个子商户资金账单 | submch_fundflow_bill| 否| 是|
| 基础支付 | JSAPI、APP、H5、Native、小程序、合单支付 | 下载账单 | download_bill| 是| 是|
| 经营能力 | 微信支付分(免确认模式) | 创单结单合并| payscore_direct_complete| 是| 否|
| 经营能力 | 微信支付分(免确认预授权模式)| 商户预授权 | payscore_permission | 是| 否|
| 经营能力 | 微信支付分(免确认预授权模式)| 查询用户授权记录| payscore_permission_query | 是| 否|
| 经营能力 | 微信支付分(免确认预授权模式)| 解除用户授权关系| payscore_permission_terminate| 是| 否|
| 经营能力 | 微信支付分(公共 API) | 创建支付分订单| payscore_create| 是| 否|
| 经营能力 | 微信支付分(公共 API) | 查询支付分订单| payscore_query | 是| 否|
| 经营能力 | 微信支付分(公共 API) | 取消支付分订单| payscore_cancel| 是| 否|
| 经营能力 | 微信支付分(公共 API) | 修改订单金额| payscore_modify| 是| 否|
| 经营能力 | 微信支付分(公共 API) | 完结支付分订单| payscore_complete| 是| 否|
| 经营能力 | 微信支付分(公共 API) | 商户发起催收扣款| payscore_pay | 是| 否|
| 经营能力 | 微信支付分(公共 API) | 同步服务订单信息| payscore_sync| 是| 否|
| 经营能力 | 微信支付分(公共 API) | 申请退款 | payscore_refund| 是| 否|
| 经营能力 | 微信支付分(公共 API) | 查询单笔退款| payscore_refund_query | 是| 否|
| 经营能力 | 微信支付分(公共 API) | 商户申请获取对账单| payscore_merchant_bill| 是| 否|
| 经营能力 | 支付即服务| 服务人员注册| guides_register| 是| 是|
| 经营能力 | 支付即服务| 服务人员分配| guides_assign| 是| 是|
| 经营能力 | 支付即服务| 服务人员查询| guides_query | 是| 是|
| 经营能力 | 支付即服务| 服务人员信息更新| guides_update| 是| 是|
| 经营能力 | 点金计划 | 点金计划管理| goldplan_plan_change| 否| 是|
| 经营能力 | 点金计划 | 商家小票管理| goldplan_custompage_change| 否| 是|
| 经营能力 | 点金计划 | 同业过滤标签管理| goldplan_advertising_filter| 否| 是|
| 经营能力 | 点金计划 | 开通广告展示| goldplan_advertising_open | 否| 是|
| 经营能力 | 点金计划 | 关闭广告展示| goldplan_advertising_close| 否| 是|
| 行业方案 | 电商收付通| 尚未适配 | 尚未适配| 否| 是|
| 行业方案 | 智慧商圈 | 商圈积分同步| points_notify| 是| 是|
| 行业方案 | 智慧商圈 | 商圈积分授权查询| user_authorization| 是| 是|
| 行业方案 | 智慧商圈 | 商圈会员待积分状态查询| business_point_status| 是| 是|
| 行业方案 | 智慧商圈 | 商圈会员停车状态同步| business_parking_sync| 是| 是|
| 行业方案 | 微信支付分停车服务| 查询车牌服务开通信息| parking_service_find| 是| 是|
| 行业方案 | 微信支付分停车服务| 创建停车入场| parking_enter| 是| 是|
| 行业方案 | 微信支付分停车服务| 扣费受理 | parking_order| 是| 是|
| 行业方案 | 微信支付分停车服务| 查询订单 | parking_query| 是| 是|
| 营销工具 | 代金券 | 创建代金券批次| marketing_favor_stock_create | 是| 是|
| 营销工具 | 代金券 | 激活代金券批次| marketing_favor_stock_start| 是| 是|
| 营销工具 | 代金券 | 发放代金券批次| marketing_favor_stock_send| 是| 是|
| 营销工具 | 代金券 | 暂停代金券批次| marketing_favor_stock_pause| 是| 是|
| 营销工具 | 代金券 | 重启代金券批次| marketing_favor_stock_restart| 是| 是|
| 营销工具 | 代金券 | 条件查询批次列表| marketing_favor_stock_list| 是| 是|
| 营销工具 | 代金券 | 查询批次详情| marketing_favor_stock_detail | 是| 是|
| 营销工具 | 代金券 | 查询代金券详情| marketing_favor_coupon_detail| 是| 是|
| 营销工具 | 代金券 | 查询代金券可用商户| marketing_favor_stock_merchant | 是| 是|
| 营销工具 | 代金券 | 查询代金券可用单品| marketing_favor_stock_item| 是| 是|
| 营销工具 | 代金券 | 根据商户号查用户的券| marketing_favor_user_coupon| 是| 是|
| 营销工具 | 代金券 | 下载批次核销明细| marketing_favor_use_flow| 是| 是|
| 营销工具 | 代金券 | 下载批次退款明细| marketing_favor_refund_flow| 是| 是|
| 营销工具 | 代金券 | 设置消息通知地址| marketing_favor_callback_update| 是| 是|
| 营销工具 | 商家券 | 创建商家券 | marketing_busifavor_stock_create | 是| 是|
| 营销工具 | 商家券 | 查询商家券详情| marketing_busifavor_stock_query| 是| 是|
| 营销工具 | 商家券 | 核销用户券 | marketing_busifavor_coupon_use | 是| 是|
| 营销工具 | 商家券 | 根据过滤条件查询用户券 | marketing_busifavor_user_coupon| 是| 是|
| 营销工具 | 商家券 | 查询用户单张券详情| marketing_busifavor_coupon_detail| 是| 是|
| 营销工具 | 商家券 | 上传预存 code | marketing_busifavor_couponcode_upload | 是| 是|
| 营销工具 | 商家券 | 设置商家券事件通知地址 | marketing_busifavor_callback_update| 是| 是|
| 营销工具 | 商家券 | 查询商家券事件通知地址 | marketing_busifavor_callback_query | 是| 是|
| 营销工具 | 商家券 | 关联订单信息| marketing_busifavor_coupon_associate| 是| 是|
| 营销工具 | 商家券 | 取消关联订单信息| marketing_busifavor_coupon_disassociate | 是| 是|
| 营销工具 | 商家券 | 修改批次预算| marketing_busifavor_stock_budget | 是| 是|
| 营销工具 | 商家券 | 修改商家券基本信息| marketing_busifavor_stock_modify | 是| 是|
| 营销工具 | 商家券 | 申请退券 | marketing_busifavor_coupon_return| 是| 是|
| 营销工具 | 商家券 | 使券失效 | marketing_busifavor_coupon_deactivate | 是| 是|
| 营销工具 | 商家券 | 营销补差付款| marketing_busifavor_subsidy_pay| 是| 是|
| 营销工具 | 商家券 | 查询营销补差付款单详情 | marketing_busifavor_subsidy_query| 是| 是|
| 营销工具 | 委托营销 | 建立合作关系| marketing_partnership_build| 是| 是|
| 营销工具 | 委托营销 | 查询合作关系列表| marketing_partnership_query| 是| 是|
| 营销工具 | 消费卡 | 发放消费卡 | marketing_card_send | 是| 否|
| 营销工具 | 支付有礼 | 创建全场满额送活动| marketing_paygift_activity_create| 是| 是|
| 营销工具 | 支付有礼 | 查询活动详情接口| marketing_paygift_activity_detail| 是| 是|
| 营销工具 | 支付有礼 | 查询活动发券商户号| marketing_paygift_merchants_list | 是| 是|
| 营销工具 | 支付有礼 | 查询活动指定商品列表| marketing_paygift_goods_list | 是| 是|
| 营销工具 | 支付有礼 | 终止活动 | marketing_paygift_activity_terminate| 是| 是|
| 营销工具 | 支付有礼 | 新增活动发券商户号| marketing_paygift_merchant_add | 是| 是|
| 营销工具 | 支付有礼 | 获取支付有礼活动列表| marketing_paygift_activity_list| 是| 是|
| 营销工具 | 支付有礼 | 删除活动发券商户号| marketing_paygift_merchant_delete| 是| 是|
| 营销工具 | 银行定向活促 | 出行券切卡组件预下单| industry_coupon_token| 否| 是|
| 营销工具 | 银行定向活促 | 导入定向用户协议号| bank_package_file| 否| 是|
| 营销工具 | 图片上传 | 图片上传(营销专用)| marketing_image_upload| 是| 是|
| 资金应用 | 商家转账到零钱 | 发起商家转账 | transfer_batch | 是| 否|
| 资金应用 | 商家转账到零钱 | 微信批次单号查询批次单| transfer_query_batchid | 是| 否|
| 资金应用 | 商家转账到零钱 | 微信明细单号查询明细单| transfer_query_detail_id | 是| 否|
| 资金应用 | 商家转账到零钱 | 商家批次单号查询批次单| transfer_query_out_batch_no | 是| 否|
| 资金应用 | 商家转账到零钱 | 商家明细单号查询明细单| transfer_query_out_detail_no | 是| 否|
| 资金应用 | 商家转账到零钱 | 转账电子回单申请受理 | transfer_bill_receipt | 是| 否|
| 资金应用 | 商家转账到零钱 | 查询转账电子回单| transfer_query_bill_receipt | 是| 否|
| 资金应用 | 商家转账到零钱 | 转账明细电子回单受理| transfer_detail_receipt | 是| 否|
| 资金应用 | 商家转账到零钱 | 查询转账明细电子回单受理结果| transfer_query_receipt | 是| 否|
| 资金应用 | 分账 | 请求分账 | profitsharing_order | 是| 是|
| 资金应用 | 分账 | 查询分账结果| profitsharing_order_query | 是| 是|
| 资金应用 | 分账 | 请求分账回退| profitsharing_return| 是| 是|
| 资金应用 | 分账 | 查询分账回退结果| profitsharing_return_query| 是| 是|
| 资金应用 | 分账 | 解冻剩余资金| profitsharing_unfreeze| 是| 是|
| 资金应用 | 分账 | 查询剩余待分金额| profitsharing_amount_query| 是| 是|
| 资金应用 | 分账 | 查询最大分账比例| profitsharing_config_query| 否| 是|
| 资金应用 | 分账 | 添加分账接收方| profitsharing_add_receiver| 是| 是|
| 资金应用 | 分账 | 删除分账接收方| profitsharing_delete_receiver| 是| 是|
| 资金应用 | 分账 | 申请分账账单| profitsharing_bill| 是| 是|
| 资金应用 | 分账 | 下载账单 | download_bill| 是| 是|
| 资金应用 | 连锁品牌分账 | 请求分账 | brand_profitsharing_order | 否| 是|
| 资金应用 | 连锁品牌分账 | 查询分账结果| brand_profitsharing_order_query| 否| 是|
| 资金应用 | 连锁品牌分账 | 请求分账回退| brand_profitsharing_return| 否| 是|
| 资金应用 | 连锁品牌分账 | 查询分账回退结果| brand_profitsharing_return_query | 否| 是|
| 资金应用 | 连锁品牌分账 | 完结分账 | brand_profitsharing_unfreeze | 否| 是|
| 资金应用 | 连锁品牌分账 | 查询剩余待分金额| brand_profitsharing_amount_query | 否| 是|
| 资金应用 | 连锁品牌分账 | 查询最大分账比例| brand_profitsharing_config_query | 否| 是|
| 资金应用 | 连锁品牌分账 | 添加分账接收方| brand_profitsharing_add_receiver | 否| 是|
| 资金应用 | 连锁品牌分账 | 删除分账接收方| brand_profitsharing_delete_receiver| 否| 是|
| 资金应用 | 连锁品牌分账 | 申请分账账单| profitsharing_bill| 否| 是|
| 资金应用 | 连锁品牌分账 | 下载账单 | download_bill| 是| 是|
| 风险合规 | 商户开户意愿确认 | 提交申请单 | apply4subject_submit| 否| 是|
| 风险合规 | 商户开户意愿确认 | 撤销申请单 | apply4subject_cancel| 否| 是|
| 风险合规 | 商户开户意愿确认 | 查询申请单审核结果| apply4subject_query | 否| 是|
| 风险合规 | 商户开户意愿确认 | 获取商户开户意愿确认状态 | apply4subject_state | 否| 是|
| 风险合规 | 消费者投诉 2.0 | 查询投诉单列表| complaint_list_query| 是| 是|
| 风险合规 | 消费者投诉 2.0 | 查询投诉单详情| complaint_detail_query| 是| 是|
| 风险合规 | 消费者投诉 2.0 | 查询投诉协商历史| complaint_history_query | 是| 是|
| 风险合规 | 消费者投诉 2.0 | 创建投诉通知回调地址| complaint_notification_create| 是| 是|
| 风险合规 | 消费者投诉 2.0 | 查询投诉通知回调地址| complaint_notification_query | 是| 是|
| 风险合规 | 消费者投诉 2.0 | 更新投诉通知回调地址| complaint_notification_update| 是| 是|
| 风险合规 | 消费者投诉 2.0 | 删除投诉通知回调地址| complaint_notification_delete| 是| 是|
| 风险合规 | 消费者投诉 2.0 | 提交回复 | complaint_response| 是| 是|
| 风险合规 | 消费者投诉 2.0 | 反馈处理完成| complaint_complete| 是| 是|
| 风险合规 | 消费者投诉 2.0 | 更新退款审批结果| complaint_update_refund| 是| 是|
| 风险合规 | 消费者投诉 2.0 | 商户上传反馈图片| complaint_image_upload| 是| 是|
| 风险合规 | 消费者投诉 2.0 | 图片下载 | complaint_image_download| 是| 是|
| 风险合规 | 商户违规通知回调 | 创建商户违规通知回调地址 | merchantrisk_callback_create | 否| 是|
| 风险合规 | 商户违规通知回调 | 查询商户违规通知回调地址 | merchantrisk_callback_query| 否| 是|
| 风险合规 | 商户违规通知回调 | 修改商户违规通知回调地址 | merchantrisk_callback_update | 否| 是|
| 风险合规 | 商户违规通知回调 | 删除商户违规通知回调地址 | merchantrisk_callback_delete | 否| 是|
| 其他能力 | 图片上传 | 图片上传 | image_upload | 是| 是|
| 其他能力 | 视频上传 | 视频上传 | video_upload | 是| 是|
| 其他 | 电子发票(公共API) | 创建电子发票卡券模板 | fapiao_card_template | 是 | 是 |
| 其他 | 电子发票(公共API) | 配置开发选项 | fapiao_set_merchant_config | 是 | 是 |
| 其他 | 电子发票(公共API) | 查询商户配置的开发选项 | fapiao_merchant_config | 是 | 是 |
| 其他 | 电子发票(公共API) | 获取抬头填写链接 | fapiao_title_url | 是 | 是 |
| 其他 | 电子发票(公共API) | 获取用户填写的抬头 | fapiao_title | 是 | 是 |
| 其他 | 电子发票(区块链模式) | 获取商品和服务税收分类对照表 | fapiao_tax_codes | 是 | 是 |
| 其他 | 电子发票(区块链模式) | 获取商户开票基础信息 | fapiao_merchant_base_info | 是 | 是 |
| 其他 | 电子发票(区块链模式) | 开具电子发票 | fapiao_applications | 是 | 是 |
| 其他 | 电子发票(区块链模式) | 查询电子发票 | fapiao_query | 是 | 是 |
| 其他 | 电子发票(区块链模式) | 冲红电子发票 | fapiao_reverse | 是 | 是 |
| 其他 | 电子发票(自建平台模式) | 上传电子发票文件 | fapiao_upload_file | 是 | 是 |
| 其他 | 电子发票(自建平台模式) | 将电子发票插入微信用户卡包 | fapiao_insert_cards | 是 | 是 |
| 其他 | 银行组件 | 获取对私银行卡号开户银行 | capital_search_bank_number | 是 | 是 |
| 其他 | 银行组件 | 查询支持个人业务的银行列表 | capital_personal_banks | 是 | 是 |
| 其他 | 银行组件 | 查询支持对公业务的银行列表 | capital_corporate_banks | 是 | 是 |
| 其他 | 银行组件 | 查询省份列表 | capital_provinces | 是 | 是 |
| 其他 | 银行组件 | 查询城市列表 | capital_cities | 是 | 是 |
| 其他 | 银行组件 | 查询支行列表 | capital_branches | 是 | 是 |
### 接口函数参数
参数类型对照参考下表:
| 微信支付官方文档声明 | **wechatpayv3 python sdk** |
| -------------------- | -------------------------- |
| string | str |
| int| int |
| object | dict: {} |
| array| list: [] |
| boolean| bool: True, False |
| message| bytes|
### 接口函数返回值
每个接口均同步返回 code 和 message,code 为 web 请求得到的 HTTP 状态码,message 为服务器返回的 json 字符串。
例外:
1. 回调通知(callback)接口将收到的参数解密后返回,回调验证不合规或解密失败则返回 None;
2. 下载账单(download_bill)和消费者投诉 2.0 的图片下载(complaint_image_download)接口返回的 message 为 bytes 类型,直接将 message 写入磁盘即可获得对应的目标文件。
## 常见问题
### 回调验证失败处理
开发者遇到的难点之一就是回调验证失败的问题,由于众多的 python web 框架对回调消息的处理不完全一致,如果出现回调验证失败,请务必确认传入的 headers 和 body 的值和类型。
通常框架传过来的 headers 类型是 dict,而 body 类型是 bytes。flask 框架参考以下方法可直接获取到解密后的实际内容。
```python
@app.route('/notify', methods=['POST'])
def notify():
result = wxpay.callback(request.headers, request.data)
if result and result.get('event_type') == 'TRANSACTION.SUCCESS':
resource = result.get('resource')
appid = resource.get('appid')
mchid = resource.get('mchid')
out_trade_no = resource.get('out_trade_no')
transaction_id = resource.get('transaction_id')
trade_type = resource.get('trade_type')
trade_state = resource.get('trade_state')
trade_state_desc = resource.get('trade_state_desc')
bank_type = resource.get('bank_type')
attach = resource.get('attach')
success_time = resource.get('success_time')
payer = resource.get('payer')
amount = resource.get('amount').get('total')
# TODO: 根据返回参数进行必要的业务处理,处理完后返回200或204
return jsonify({'code': 'SUCCESS', 'message': '成功'})
else:
return jsonify({'code': 'FAILED', 'message': '失败'}), 500
```
#### flask 框架
如上面示例,直接传入 request.headers 和 request.data 即可。
```python
result = wxpay.callback(headers=request.headers, body=request.data)
```
#### django 框架
由于 django 框架特殊性,会将 headers 做一定的预处理,可以参考以下方式调用。
```python
headers = {}
headers.update({'Wechatpay-Signature': request.META.get('HTTP_WECHATPAY_SIGNATURE')})
headers.update({'Wechatpay-Timestamp': request.META.get('HTTP_WECHATPAY_TIMESTAMP')})
headers.update({'Wechatpay-Nonce': request.META.get('HTTP_WECHATPAY_NONCE')})
headers.update({'Wechatpay-Serial': request.META.get('HTTP_WECHATPAY_SERIAL')})
result = wxpay.callback(headers=headers, body=request.body)
```
#### tornado 框架
直接传入 request.headers 和 request.body 即可。
```python
result = wxpay.callback(headers=request.headers, body=request.body)
```
#### 其他框架
参考以上处理方法,大原则就是保证传给 callback 的参数值和收到的值一致,不要转换为 dict,也不要转换为 string。
### 反复收到同一个回调消息怎么处理
实际开发中处理微信支付通知消息时有两个问题需要注意。一是可能会重复收到同一个通知消息,需要在代码中进行判断处理。另一个是处理消息的时间如果过长,建议考虑异步处理,先缓存消息,避免微信支付服务器端认为超时,如果持续超时,微信支付服务器端可能会认为回调消息接口不可用。
### 接口清单里怎么没有回调接口
所有的回调接口都通过公用接口 callback 处理,因此清单里没有一一罗列。对于收到的回调消息,可以通过 event_type 参数判断消息类型进行下一步处理,具体参数清单参考微信支付官方文档。
### 服务商模式如何接入
SDK 默认为直连商户接入,如果初始化时候指定 partner_mode=True,即切换为服务商模式。需要注意的是,一部分接口为直连商户专有,一部分接口为服务商模式专有,另有部分接口同时兼容直连商户和服务商,这些同时兼容的接口在两种模式下个别参数要求会稍有不同。
### 如何下载平台证书?
SDK 内部已经实现了自动下载和加载平台证书,无需预先下载。如需了解具体实现逻辑,可以参阅[core.py](wechatpayv3/core.py)中的\_update_certificates 函数。
### 接口始终返回 500 错误
通常为初始化参数配置错误,如果反复检查无果,建议进入微信支付后台重置所有参数后再试。
### 回调接口始终校验失败
查阅 web 框架文档,确保传入 callback 的 body 参数没有经过任何转义,通常为 bytes 类型。
### 下载平台证书时解析失败
检查 APIV3_KEY 是否和微信支付后台设置的一致,如无法确认,建议重置后再试。
## 签名、验签、加密、解密的内部实现
一般应用开发者可以不用向下看了,有心了解这几项内部实现的可以参考[这里](security.md)了解。
%package help
Summary: Development documents and examples for wechatpayv3
Provides: python3-wechatpayv3-doc
%description help
# 微信支付 API v3 Python SDK
[](https://badge.fury.io/py/wechatpayv3)
[](https://img.shields.io/pypi/dm/wechatpayv3)
## 介绍
微信支付接口 V3 版 python 库。
欢迎微信支付开发者扫码进 QQ 群(群号:973102221)讨论,欢迎提交代码,欢迎star、follow、fork:

## 适用对象
**wechatpayv3**同时支持微信支付[直连模式](https://pay.weixin.qq.com/wiki/doc/apiv3/index.shtml)及[服务商模式](https://pay.weixin.qq.com/wiki/doc/apiv3_partner/index.shtml),接口说明详见官网。
## 特性
1. 平台证书自动更新,无需开发者关注平台证书有效性,无需手动下载更新;
2. 支持本地缓存平台证书,初始化时指定平台证书保存目录即可;
3. 敏感信息直接传入明文参数,SDK 内部自动加密,无需手动处理;
4. 回调通知自动验证回调消息,自动解密 resource 对象,并返回解密后的数据;
5. 已适配[直连模式](https://pay.weixin.qq.com/wiki/doc/apiv3/apis/index.shtml)和[服务商模式](https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/index.shtml)中除“电商收付通”以外所有 v3 版接口。
## 源码
[github](https://github.com/minibear2021/wechatpayv3)
[gitee](https://gitee.com/minibear2021/wechatpayv3)
## 安装
```
$ pip install wechatpayv3
```
## 使用方法
### 准备
参考微信官方文档准备好密钥, 证书文件和配置([证书/密钥/签名介绍](https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay3_0.shtml))
- **商户 API 证书私钥:PRIVATE_KEY**。商户申请商户 API 证书时,会生成商户私钥,并保存在本地证书文件夹的文件 apiclient_key.pem 中。
> :warning: 不要把私钥文件暴露在公共场合,如上传到 Github,写在客户端代码等。
- **商户 API 证书序列号:CERT_SERIAL_NO**。每个证书都有一个由 CA 颁发的唯一编号,即证书序列号。扩展阅读 [如何查看证书序列号](https://wechatpay-api.gitbook.io/wechatpay-api-v3/chang-jian-wen-ti/zheng-shu-xiang-guan#ru-he-cha-kan-zheng-shu-xu-lie-hao)。
- **微信支付 APIv3 密钥:APIV3_KEY**,是在回调通知和微信支付平台证书下载接口中,为加强数据安全,对关键信息 `AES-256-GCM` 加密时使用的对称加密密钥。
### 一个最小的后端
[examples.py](examples.py) 演示了一个带有[Native 支付下单](https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_4_1.shtml)接口和[支付通知](https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_4_5.shtml)接口的后端。
首先,修改 **examplys.py** 里以下几项配置参数:
```python
# 微信支付商户号,服务商模式下为服务商户号,即官方文档中的sp_mchid。
MCHID = '1230000109'
# 商户证书私钥,此文件不要放置在下面设置的CERT_DIR目录里。
with open('path_to_key/apiclient_key.pem') as f:
PRIVATE_KEY = f.read()
# 商户证书序列号
CERT_SERIAL_NO = '444F4864EA9B34415...'
# API v3密钥, https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay3_2.shtml
APIV3_KEY = 'MIIEvwIBADANBgkqhkiG9w0BAQE...'
# APPID,应用ID,服务商模式下为服务商应用ID,即官方文档中的sp_appid,也可以在调用接口的时候覆盖。
APPID = 'wxd678efh567hg6787'
# 回调地址,也可以在调用接口的时候覆盖。
NOTIFY_URL = 'https://www.xxxx.com/notify'
# 微信支付平台证书缓存目录,初始调试的时候可以设为None,首次使用确保此目录为空目录。
CERT_DIR = './cert'
# 日志记录器,记录web请求和回调细节,便于调试排错。
logging.basicConfig(filename=os.path.join(os.getcwd(), 'demo.log'), level=logging.DEBUG, filemode='a', format='%(asctime)s - %(process)s - %(levelname)s: %(message)s')
LOGGER = logging.getLogger("demo")
# 接入模式:False=直连商户模式,True=服务商模式。
PARTNER_MODE = False
# 代理设置,None或者{"https": "http://10.10.1.10:1080"},详细格式参见https://docs.python-requests.org/zh_CN/latest/user/advanced.html
PROXY = None
```
接下来初始化 WechatPay 实例并配置一个合适的接口:
```python
wxpay = WeChatPay(
wechatpay_type=WeChatPayType.NATIVE,
mchid=MCHID,
private_key=PRIVATE_KEY,
cert_serial_no=CERT_SERIAL_NO,
apiv3_key=APIV3_KEY,
appid=APPID,
notify_url=NOTIFY_URL,
cert_dir=CERT_DIR,
logger=LOGGER,
partner_mode=PARTNER_MODE,
proxy=PROXY)
app = Flask(__name__)
@app.route('/pay')
def pay():
# 以native下单为例,下单成功后即可获取到'code_url',将'code_url'转换为二维码,并用微信扫码即可进行支付测试。
out_trade_no = ''.join(sample(ascii_letters + digits, 8))
description = 'demo-description'
amount = 1
code, message = wxpay.pay(
description=description,
out_trade_no=out_trade_no,
amount={'total': amount},
pay_type=WeChatPayType.NATIVE
)
return jsonify({'code': code, 'message': message})
```
检查一下参数无误,现在就可以用 python 解释器来运行:
```shell
$ python examples.py
* Serving Flask app "examples" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
```
现在访问 http://127.0.0.1:5000/pay ,如果一切正常,你会看到下面一串 json 字符串:
```python
{
"code": 200,
"message": "{\"code_url\":\"weixin://wxpay/bizpayurl?pr=abcdefghi\"}"
}
```
到这一步统一下单的后端就完成了,现在将 code_url 的值即"weixin://wxpay/bizpayurl?pr=abcdefghi"用[草料](https://cli.im/)转换为二维码即可用微信扫码进行支付测试。
**以上步骤如果不能正确执行,务必仔细检查各项初始化参数,必要的情况下,登录微信支付后台,将所有参数重置。**
Native 支付调试最简单便捷,调试通过没有问题证明初始化参数正确之后,如果需要采用其他(小程序、H5、JSAPI、APP)支付下单,可继续参考 examples.py。
## 接口清单
已适配的微信支付 V3 版 API 接口列表如下,部分接口调用示例可以参考[这里](interface.md):
| 大类| 小类 | 接口 | 接口函数| 直连商户适用 | 服务商适用 |
| ---- | ---------------------------------------- | ------------------------ | --------------------------------------- | ------------ | ---------- |
| 公用| 公用 | 调起支付签名| sign | 是 | 是 |
| 公用| 公用 | 回调通知| callback | 是 | 是 |
| 公用| 公用 | 敏感信息参数解密 | decrypt | 是 | 是 |
| 公用| 公用 | 下载账单| download_bill| 是 | 是 |
| 商户进件 | 特约商户进件、小微商户进件| 提交申请单 | applyment_submit | 否| 是|
| 商户进件 | 特约商户进件、小微商户进件| 查询申请单状态| applyment_query| 否| 是|
| 商户进件 | 特约商户进件、小微商户进件| 修改结算账号| applyment_settlement_modify| 否| 是|
| 商户进件 | 特约商户进件、小微商户进件| 查询结算账号| applyment_settlement_query| 否| 是|
| 基础支付 | JSAPI、APP、H5、Native、小程序支付| 统一下单 | pay | 是| 是|
| 基础支付 | JSAPI、APP、H5、Native、小程序支付| 查询订单 | query | 是| 是|
| 基础支付 | JSAPI、APP、H5、Native、小程序支付| 关闭订单 | close | 是| 是|
| 基础支付 | 合单支付 | 统一下单 | combine_pay| 是| 是|
| 基础支付 | 合单支付 | 查询订单 | combine_query| 是| 是|
| 基础支付 | 合单支付 | 关闭订单 | combine_close| 是| 是|
| 基础支付 | JSAPI、APP、H5、Native、小程序、合单支付 | 申请退款 | refund| 是| 是|
| 基础支付 | JSAPI、APP、H5、Native、小程序、合单支付 | 查询单笔退款| query_refund | 是| 是|
| 基础支付 | JSAPI、APP、H5、Native、小程序、合单支付 | 申请交易账单| trade_bill | 是| 是|
| 基础支付 | JSAPI、APP、H5、Native、小程序、合单支付 | 申请资金账单| fundflow_bill| 是| 是|
| 基础支付 | JSAPI、APP、H5、Native、小程序、合单支付 | 申请单个子商户资金账单 | submch_fundflow_bill| 否| 是|
| 基础支付 | JSAPI、APP、H5、Native、小程序、合单支付 | 下载账单 | download_bill| 是| 是|
| 经营能力 | 微信支付分(免确认模式) | 创单结单合并| payscore_direct_complete| 是| 否|
| 经营能力 | 微信支付分(免确认预授权模式)| 商户预授权 | payscore_permission | 是| 否|
| 经营能力 | 微信支付分(免确认预授权模式)| 查询用户授权记录| payscore_permission_query | 是| 否|
| 经营能力 | 微信支付分(免确认预授权模式)| 解除用户授权关系| payscore_permission_terminate| 是| 否|
| 经营能力 | 微信支付分(公共 API) | 创建支付分订单| payscore_create| 是| 否|
| 经营能力 | 微信支付分(公共 API) | 查询支付分订单| payscore_query | 是| 否|
| 经营能力 | 微信支付分(公共 API) | 取消支付分订单| payscore_cancel| 是| 否|
| 经营能力 | 微信支付分(公共 API) | 修改订单金额| payscore_modify| 是| 否|
| 经营能力 | 微信支付分(公共 API) | 完结支付分订单| payscore_complete| 是| 否|
| 经营能力 | 微信支付分(公共 API) | 商户发起催收扣款| payscore_pay | 是| 否|
| 经营能力 | 微信支付分(公共 API) | 同步服务订单信息| payscore_sync| 是| 否|
| 经营能力 | 微信支付分(公共 API) | 申请退款 | payscore_refund| 是| 否|
| 经营能力 | 微信支付分(公共 API) | 查询单笔退款| payscore_refund_query | 是| 否|
| 经营能力 | 微信支付分(公共 API) | 商户申请获取对账单| payscore_merchant_bill| 是| 否|
| 经营能力 | 支付即服务| 服务人员注册| guides_register| 是| 是|
| 经营能力 | 支付即服务| 服务人员分配| guides_assign| 是| 是|
| 经营能力 | 支付即服务| 服务人员查询| guides_query | 是| 是|
| 经营能力 | 支付即服务| 服务人员信息更新| guides_update| 是| 是|
| 经营能力 | 点金计划 | 点金计划管理| goldplan_plan_change| 否| 是|
| 经营能力 | 点金计划 | 商家小票管理| goldplan_custompage_change| 否| 是|
| 经营能力 | 点金计划 | 同业过滤标签管理| goldplan_advertising_filter| 否| 是|
| 经营能力 | 点金计划 | 开通广告展示| goldplan_advertising_open | 否| 是|
| 经营能力 | 点金计划 | 关闭广告展示| goldplan_advertising_close| 否| 是|
| 行业方案 | 电商收付通| 尚未适配 | 尚未适配| 否| 是|
| 行业方案 | 智慧商圈 | 商圈积分同步| points_notify| 是| 是|
| 行业方案 | 智慧商圈 | 商圈积分授权查询| user_authorization| 是| 是|
| 行业方案 | 智慧商圈 | 商圈会员待积分状态查询| business_point_status| 是| 是|
| 行业方案 | 智慧商圈 | 商圈会员停车状态同步| business_parking_sync| 是| 是|
| 行业方案 | 微信支付分停车服务| 查询车牌服务开通信息| parking_service_find| 是| 是|
| 行业方案 | 微信支付分停车服务| 创建停车入场| parking_enter| 是| 是|
| 行业方案 | 微信支付分停车服务| 扣费受理 | parking_order| 是| 是|
| 行业方案 | 微信支付分停车服务| 查询订单 | parking_query| 是| 是|
| 营销工具 | 代金券 | 创建代金券批次| marketing_favor_stock_create | 是| 是|
| 营销工具 | 代金券 | 激活代金券批次| marketing_favor_stock_start| 是| 是|
| 营销工具 | 代金券 | 发放代金券批次| marketing_favor_stock_send| 是| 是|
| 营销工具 | 代金券 | 暂停代金券批次| marketing_favor_stock_pause| 是| 是|
| 营销工具 | 代金券 | 重启代金券批次| marketing_favor_stock_restart| 是| 是|
| 营销工具 | 代金券 | 条件查询批次列表| marketing_favor_stock_list| 是| 是|
| 营销工具 | 代金券 | 查询批次详情| marketing_favor_stock_detail | 是| 是|
| 营销工具 | 代金券 | 查询代金券详情| marketing_favor_coupon_detail| 是| 是|
| 营销工具 | 代金券 | 查询代金券可用商户| marketing_favor_stock_merchant | 是| 是|
| 营销工具 | 代金券 | 查询代金券可用单品| marketing_favor_stock_item| 是| 是|
| 营销工具 | 代金券 | 根据商户号查用户的券| marketing_favor_user_coupon| 是| 是|
| 营销工具 | 代金券 | 下载批次核销明细| marketing_favor_use_flow| 是| 是|
| 营销工具 | 代金券 | 下载批次退款明细| marketing_favor_refund_flow| 是| 是|
| 营销工具 | 代金券 | 设置消息通知地址| marketing_favor_callback_update| 是| 是|
| 营销工具 | 商家券 | 创建商家券 | marketing_busifavor_stock_create | 是| 是|
| 营销工具 | 商家券 | 查询商家券详情| marketing_busifavor_stock_query| 是| 是|
| 营销工具 | 商家券 | 核销用户券 | marketing_busifavor_coupon_use | 是| 是|
| 营销工具 | 商家券 | 根据过滤条件查询用户券 | marketing_busifavor_user_coupon| 是| 是|
| 营销工具 | 商家券 | 查询用户单张券详情| marketing_busifavor_coupon_detail| 是| 是|
| 营销工具 | 商家券 | 上传预存 code | marketing_busifavor_couponcode_upload | 是| 是|
| 营销工具 | 商家券 | 设置商家券事件通知地址 | marketing_busifavor_callback_update| 是| 是|
| 营销工具 | 商家券 | 查询商家券事件通知地址 | marketing_busifavor_callback_query | 是| 是|
| 营销工具 | 商家券 | 关联订单信息| marketing_busifavor_coupon_associate| 是| 是|
| 营销工具 | 商家券 | 取消关联订单信息| marketing_busifavor_coupon_disassociate | 是| 是|
| 营销工具 | 商家券 | 修改批次预算| marketing_busifavor_stock_budget | 是| 是|
| 营销工具 | 商家券 | 修改商家券基本信息| marketing_busifavor_stock_modify | 是| 是|
| 营销工具 | 商家券 | 申请退券 | marketing_busifavor_coupon_return| 是| 是|
| 营销工具 | 商家券 | 使券失效 | marketing_busifavor_coupon_deactivate | 是| 是|
| 营销工具 | 商家券 | 营销补差付款| marketing_busifavor_subsidy_pay| 是| 是|
| 营销工具 | 商家券 | 查询营销补差付款单详情 | marketing_busifavor_subsidy_query| 是| 是|
| 营销工具 | 委托营销 | 建立合作关系| marketing_partnership_build| 是| 是|
| 营销工具 | 委托营销 | 查询合作关系列表| marketing_partnership_query| 是| 是|
| 营销工具 | 消费卡 | 发放消费卡 | marketing_card_send | 是| 否|
| 营销工具 | 支付有礼 | 创建全场满额送活动| marketing_paygift_activity_create| 是| 是|
| 营销工具 | 支付有礼 | 查询活动详情接口| marketing_paygift_activity_detail| 是| 是|
| 营销工具 | 支付有礼 | 查询活动发券商户号| marketing_paygift_merchants_list | 是| 是|
| 营销工具 | 支付有礼 | 查询活动指定商品列表| marketing_paygift_goods_list | 是| 是|
| 营销工具 | 支付有礼 | 终止活动 | marketing_paygift_activity_terminate| 是| 是|
| 营销工具 | 支付有礼 | 新增活动发券商户号| marketing_paygift_merchant_add | 是| 是|
| 营销工具 | 支付有礼 | 获取支付有礼活动列表| marketing_paygift_activity_list| 是| 是|
| 营销工具 | 支付有礼 | 删除活动发券商户号| marketing_paygift_merchant_delete| 是| 是|
| 营销工具 | 银行定向活促 | 出行券切卡组件预下单| industry_coupon_token| 否| 是|
| 营销工具 | 银行定向活促 | 导入定向用户协议号| bank_package_file| 否| 是|
| 营销工具 | 图片上传 | 图片上传(营销专用)| marketing_image_upload| 是| 是|
| 资金应用 | 商家转账到零钱 | 发起商家转账 | transfer_batch | 是| 否|
| 资金应用 | 商家转账到零钱 | 微信批次单号查询批次单| transfer_query_batchid | 是| 否|
| 资金应用 | 商家转账到零钱 | 微信明细单号查询明细单| transfer_query_detail_id | 是| 否|
| 资金应用 | 商家转账到零钱 | 商家批次单号查询批次单| transfer_query_out_batch_no | 是| 否|
| 资金应用 | 商家转账到零钱 | 商家明细单号查询明细单| transfer_query_out_detail_no | 是| 否|
| 资金应用 | 商家转账到零钱 | 转账电子回单申请受理 | transfer_bill_receipt | 是| 否|
| 资金应用 | 商家转账到零钱 | 查询转账电子回单| transfer_query_bill_receipt | 是| 否|
| 资金应用 | 商家转账到零钱 | 转账明细电子回单受理| transfer_detail_receipt | 是| 否|
| 资金应用 | 商家转账到零钱 | 查询转账明细电子回单受理结果| transfer_query_receipt | 是| 否|
| 资金应用 | 分账 | 请求分账 | profitsharing_order | 是| 是|
| 资金应用 | 分账 | 查询分账结果| profitsharing_order_query | 是| 是|
| 资金应用 | 分账 | 请求分账回退| profitsharing_return| 是| 是|
| 资金应用 | 分账 | 查询分账回退结果| profitsharing_return_query| 是| 是|
| 资金应用 | 分账 | 解冻剩余资金| profitsharing_unfreeze| 是| 是|
| 资金应用 | 分账 | 查询剩余待分金额| profitsharing_amount_query| 是| 是|
| 资金应用 | 分账 | 查询最大分账比例| profitsharing_config_query| 否| 是|
| 资金应用 | 分账 | 添加分账接收方| profitsharing_add_receiver| 是| 是|
| 资金应用 | 分账 | 删除分账接收方| profitsharing_delete_receiver| 是| 是|
| 资金应用 | 分账 | 申请分账账单| profitsharing_bill| 是| 是|
| 资金应用 | 分账 | 下载账单 | download_bill| 是| 是|
| 资金应用 | 连锁品牌分账 | 请求分账 | brand_profitsharing_order | 否| 是|
| 资金应用 | 连锁品牌分账 | 查询分账结果| brand_profitsharing_order_query| 否| 是|
| 资金应用 | 连锁品牌分账 | 请求分账回退| brand_profitsharing_return| 否| 是|
| 资金应用 | 连锁品牌分账 | 查询分账回退结果| brand_profitsharing_return_query | 否| 是|
| 资金应用 | 连锁品牌分账 | 完结分账 | brand_profitsharing_unfreeze | 否| 是|
| 资金应用 | 连锁品牌分账 | 查询剩余待分金额| brand_profitsharing_amount_query | 否| 是|
| 资金应用 | 连锁品牌分账 | 查询最大分账比例| brand_profitsharing_config_query | 否| 是|
| 资金应用 | 连锁品牌分账 | 添加分账接收方| brand_profitsharing_add_receiver | 否| 是|
| 资金应用 | 连锁品牌分账 | 删除分账接收方| brand_profitsharing_delete_receiver| 否| 是|
| 资金应用 | 连锁品牌分账 | 申请分账账单| profitsharing_bill| 否| 是|
| 资金应用 | 连锁品牌分账 | 下载账单 | download_bill| 是| 是|
| 风险合规 | 商户开户意愿确认 | 提交申请单 | apply4subject_submit| 否| 是|
| 风险合规 | 商户开户意愿确认 | 撤销申请单 | apply4subject_cancel| 否| 是|
| 风险合规 | 商户开户意愿确认 | 查询申请单审核结果| apply4subject_query | 否| 是|
| 风险合规 | 商户开户意愿确认 | 获取商户开户意愿确认状态 | apply4subject_state | 否| 是|
| 风险合规 | 消费者投诉 2.0 | 查询投诉单列表| complaint_list_query| 是| 是|
| 风险合规 | 消费者投诉 2.0 | 查询投诉单详情| complaint_detail_query| 是| 是|
| 风险合规 | 消费者投诉 2.0 | 查询投诉协商历史| complaint_history_query | 是| 是|
| 风险合规 | 消费者投诉 2.0 | 创建投诉通知回调地址| complaint_notification_create| 是| 是|
| 风险合规 | 消费者投诉 2.0 | 查询投诉通知回调地址| complaint_notification_query | 是| 是|
| 风险合规 | 消费者投诉 2.0 | 更新投诉通知回调地址| complaint_notification_update| 是| 是|
| 风险合规 | 消费者投诉 2.0 | 删除投诉通知回调地址| complaint_notification_delete| 是| 是|
| 风险合规 | 消费者投诉 2.0 | 提交回复 | complaint_response| 是| 是|
| 风险合规 | 消费者投诉 2.0 | 反馈处理完成| complaint_complete| 是| 是|
| 风险合规 | 消费者投诉 2.0 | 更新退款审批结果| complaint_update_refund| 是| 是|
| 风险合规 | 消费者投诉 2.0 | 商户上传反馈图片| complaint_image_upload| 是| 是|
| 风险合规 | 消费者投诉 2.0 | 图片下载 | complaint_image_download| 是| 是|
| 风险合规 | 商户违规通知回调 | 创建商户违规通知回调地址 | merchantrisk_callback_create | 否| 是|
| 风险合规 | 商户违规通知回调 | 查询商户违规通知回调地址 | merchantrisk_callback_query| 否| 是|
| 风险合规 | 商户违规通知回调 | 修改商户违规通知回调地址 | merchantrisk_callback_update | 否| 是|
| 风险合规 | 商户违规通知回调 | 删除商户违规通知回调地址 | merchantrisk_callback_delete | 否| 是|
| 其他能力 | 图片上传 | 图片上传 | image_upload | 是| 是|
| 其他能力 | 视频上传 | 视频上传 | video_upload | 是| 是|
| 其他 | 电子发票(公共API) | 创建电子发票卡券模板 | fapiao_card_template | 是 | 是 |
| 其他 | 电子发票(公共API) | 配置开发选项 | fapiao_set_merchant_config | 是 | 是 |
| 其他 | 电子发票(公共API) | 查询商户配置的开发选项 | fapiao_merchant_config | 是 | 是 |
| 其他 | 电子发票(公共API) | 获取抬头填写链接 | fapiao_title_url | 是 | 是 |
| 其他 | 电子发票(公共API) | 获取用户填写的抬头 | fapiao_title | 是 | 是 |
| 其他 | 电子发票(区块链模式) | 获取商品和服务税收分类对照表 | fapiao_tax_codes | 是 | 是 |
| 其他 | 电子发票(区块链模式) | 获取商户开票基础信息 | fapiao_merchant_base_info | 是 | 是 |
| 其他 | 电子发票(区块链模式) | 开具电子发票 | fapiao_applications | 是 | 是 |
| 其他 | 电子发票(区块链模式) | 查询电子发票 | fapiao_query | 是 | 是 |
| 其他 | 电子发票(区块链模式) | 冲红电子发票 | fapiao_reverse | 是 | 是 |
| 其他 | 电子发票(自建平台模式) | 上传电子发票文件 | fapiao_upload_file | 是 | 是 |
| 其他 | 电子发票(自建平台模式) | 将电子发票插入微信用户卡包 | fapiao_insert_cards | 是 | 是 |
| 其他 | 银行组件 | 获取对私银行卡号开户银行 | capital_search_bank_number | 是 | 是 |
| 其他 | 银行组件 | 查询支持个人业务的银行列表 | capital_personal_banks | 是 | 是 |
| 其他 | 银行组件 | 查询支持对公业务的银行列表 | capital_corporate_banks | 是 | 是 |
| 其他 | 银行组件 | 查询省份列表 | capital_provinces | 是 | 是 |
| 其他 | 银行组件 | 查询城市列表 | capital_cities | 是 | 是 |
| 其他 | 银行组件 | 查询支行列表 | capital_branches | 是 | 是 |
### 接口函数参数
参数类型对照参考下表:
| 微信支付官方文档声明 | **wechatpayv3 python sdk** |
| -------------------- | -------------------------- |
| string | str |
| int| int |
| object | dict: {} |
| array| list: [] |
| boolean| bool: True, False |
| message| bytes|
### 接口函数返回值
每个接口均同步返回 code 和 message,code 为 web 请求得到的 HTTP 状态码,message 为服务器返回的 json 字符串。
例外:
1. 回调通知(callback)接口将收到的参数解密后返回,回调验证不合规或解密失败则返回 None;
2. 下载账单(download_bill)和消费者投诉 2.0 的图片下载(complaint_image_download)接口返回的 message 为 bytes 类型,直接将 message 写入磁盘即可获得对应的目标文件。
## 常见问题
### 回调验证失败处理
开发者遇到的难点之一就是回调验证失败的问题,由于众多的 python web 框架对回调消息的处理不完全一致,如果出现回调验证失败,请务必确认传入的 headers 和 body 的值和类型。
通常框架传过来的 headers 类型是 dict,而 body 类型是 bytes。flask 框架参考以下方法可直接获取到解密后的实际内容。
```python
@app.route('/notify', methods=['POST'])
def notify():
result = wxpay.callback(request.headers, request.data)
if result and result.get('event_type') == 'TRANSACTION.SUCCESS':
resource = result.get('resource')
appid = resource.get('appid')
mchid = resource.get('mchid')
out_trade_no = resource.get('out_trade_no')
transaction_id = resource.get('transaction_id')
trade_type = resource.get('trade_type')
trade_state = resource.get('trade_state')
trade_state_desc = resource.get('trade_state_desc')
bank_type = resource.get('bank_type')
attach = resource.get('attach')
success_time = resource.get('success_time')
payer = resource.get('payer')
amount = resource.get('amount').get('total')
# TODO: 根据返回参数进行必要的业务处理,处理完后返回200或204
return jsonify({'code': 'SUCCESS', 'message': '成功'})
else:
return jsonify({'code': 'FAILED', 'message': '失败'}), 500
```
#### flask 框架
如上面示例,直接传入 request.headers 和 request.data 即可。
```python
result = wxpay.callback(headers=request.headers, body=request.data)
```
#### django 框架
由于 django 框架特殊性,会将 headers 做一定的预处理,可以参考以下方式调用。
```python
headers = {}
headers.update({'Wechatpay-Signature': request.META.get('HTTP_WECHATPAY_SIGNATURE')})
headers.update({'Wechatpay-Timestamp': request.META.get('HTTP_WECHATPAY_TIMESTAMP')})
headers.update({'Wechatpay-Nonce': request.META.get('HTTP_WECHATPAY_NONCE')})
headers.update({'Wechatpay-Serial': request.META.get('HTTP_WECHATPAY_SERIAL')})
result = wxpay.callback(headers=headers, body=request.body)
```
#### tornado 框架
直接传入 request.headers 和 request.body 即可。
```python
result = wxpay.callback(headers=request.headers, body=request.body)
```
#### 其他框架
参考以上处理方法,大原则就是保证传给 callback 的参数值和收到的值一致,不要转换为 dict,也不要转换为 string。
### 反复收到同一个回调消息怎么处理
实际开发中处理微信支付通知消息时有两个问题需要注意。一是可能会重复收到同一个通知消息,需要在代码中进行判断处理。另一个是处理消息的时间如果过长,建议考虑异步处理,先缓存消息,避免微信支付服务器端认为超时,如果持续超时,微信支付服务器端可能会认为回调消息接口不可用。
### 接口清单里怎么没有回调接口
所有的回调接口都通过公用接口 callback 处理,因此清单里没有一一罗列。对于收到的回调消息,可以通过 event_type 参数判断消息类型进行下一步处理,具体参数清单参考微信支付官方文档。
### 服务商模式如何接入
SDK 默认为直连商户接入,如果初始化时候指定 partner_mode=True,即切换为服务商模式。需要注意的是,一部分接口为直连商户专有,一部分接口为服务商模式专有,另有部分接口同时兼容直连商户和服务商,这些同时兼容的接口在两种模式下个别参数要求会稍有不同。
### 如何下载平台证书?
SDK 内部已经实现了自动下载和加载平台证书,无需预先下载。如需了解具体实现逻辑,可以参阅[core.py](wechatpayv3/core.py)中的\_update_certificates 函数。
### 接口始终返回 500 错误
通常为初始化参数配置错误,如果反复检查无果,建议进入微信支付后台重置所有参数后再试。
### 回调接口始终校验失败
查阅 web 框架文档,确保传入 callback 的 body 参数没有经过任何转义,通常为 bytes 类型。
### 下载平台证书时解析失败
检查 APIV3_KEY 是否和微信支付后台设置的一致,如无法确认,建议重置后再试。
## 签名、验签、加密、解密的内部实现
一般应用开发者可以不用向下看了,有心了解这几项内部实现的可以参考[这里](security.md)了解。
%prep
%autosetup -n wechatpayv3-1.2.39
%build
%py3_build
%install
%py3_install
install -d -m755 %{buildroot}/%{_pkgdocdir}
if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi
if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi
if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi
if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi
pushd %{buildroot}
if [ -d usr/lib ]; then
find usr/lib -type f -printf "\"/%h/%f\"\n" >> filelist.lst
fi
if [ -d usr/lib64 ]; then
find usr/lib64 -type f -printf "\"/%h/%f\"\n" >> filelist.lst
fi
if [ -d usr/bin ]; then
find usr/bin -type f -printf "\"/%h/%f\"\n" >> filelist.lst
fi
if [ -d usr/sbin ]; then
find usr/sbin -type f -printf "\"/%h/%f\"\n" >> filelist.lst
fi
touch doclist.lst
if [ -d usr/share/man ]; then
find usr/share/man -type f -printf "\"/%h/%f.gz\"\n" >> doclist.lst
fi
popd
mv %{buildroot}/filelist.lst .
mv %{buildroot}/doclist.lst .
%files -n python3-wechatpayv3 -f filelist.lst
%dir %{python3_sitelib}/*
%files help -f doclist.lst
%{_docdir}/*
%changelog
* Thu Jun 08 2023 Python_Bot <Python_Bot@openeuler.org> - 1.2.39-1
- Package Spec generated
|