pixelarraythirdparty 1.0.5__tar.gz → 1.0.7__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pixelarraythirdparty-1.0.5 → pixelarraythirdparty-1.0.7}/PKG-INFO +1 -1
- {pixelarraythirdparty-1.0.5 → pixelarraythirdparty-1.0.7}/pixelarraythirdparty/__init__.py +3 -3
- pixelarraythirdparty-1.0.5/pixelarraythirdparty/celery/celery.py → pixelarraythirdparty-1.0.7/pixelarraythirdparty/cron/cron.py +16 -16
- {pixelarraythirdparty-1.0.5 → pixelarraythirdparty-1.0.7}/pixelarraythirdparty/order/order.py +79 -38
- {pixelarraythirdparty-1.0.5 → pixelarraythirdparty-1.0.7}/pixelarraythirdparty.egg-info/PKG-INFO +1 -1
- {pixelarraythirdparty-1.0.5 → pixelarraythirdparty-1.0.7}/pixelarraythirdparty.egg-info/SOURCES.txt +2 -2
- {pixelarraythirdparty-1.0.5 → pixelarraythirdparty-1.0.7}/pyproject.toml +1 -1
- {pixelarraythirdparty-1.0.5 → pixelarraythirdparty-1.0.7}/LICENSE +0 -0
- {pixelarraythirdparty-1.0.5 → pixelarraythirdparty-1.0.7}/MANIFEST.in +0 -0
- {pixelarraythirdparty-1.0.5 → pixelarraythirdparty-1.0.7}/pixelarraythirdparty/client.py +0 -0
- {pixelarraythirdparty-1.0.5/pixelarraythirdparty/celery → pixelarraythirdparty-1.0.7/pixelarraythirdparty/cron}/__init__.py +0 -0
- {pixelarraythirdparty-1.0.5 → pixelarraythirdparty-1.0.7}/pixelarraythirdparty/order/__init__.py +0 -0
- {pixelarraythirdparty-1.0.5 → pixelarraythirdparty-1.0.7}/pixelarraythirdparty/product/__init__.py +0 -0
- {pixelarraythirdparty-1.0.5 → pixelarraythirdparty-1.0.7}/pixelarraythirdparty/product/product.py +0 -0
- {pixelarraythirdparty-1.0.5 → pixelarraythirdparty-1.0.7}/pixelarraythirdparty/user/__init__.py +0 -0
- {pixelarraythirdparty-1.0.5 → pixelarraythirdparty-1.0.7}/pixelarraythirdparty/user/user.py +0 -0
- {pixelarraythirdparty-1.0.5 → pixelarraythirdparty-1.0.7}/pixelarraythirdparty.egg-info/dependency_links.txt +0 -0
- {pixelarraythirdparty-1.0.5 → pixelarraythirdparty-1.0.7}/pixelarraythirdparty.egg-info/requires.txt +0 -0
- {pixelarraythirdparty-1.0.5 → pixelarraythirdparty-1.0.7}/pixelarraythirdparty.egg-info/top_level.txt +0 -0
- {pixelarraythirdparty-1.0.5 → pixelarraythirdparty-1.0.7}/setup.cfg +0 -0
|
@@ -6,18 +6,18 @@ PixelArray 第三方微服务客户端
|
|
|
6
6
|
这个库包含了常用的开发工具和服务集成:
|
|
7
7
|
- order: 订单管理模块和支付模块
|
|
8
8
|
- product: 产品管理模块
|
|
9
|
-
-
|
|
9
|
+
- cron: 定时任务管理模块
|
|
10
10
|
- user: 用户管理模块
|
|
11
11
|
"""
|
|
12
12
|
|
|
13
|
-
__version__ = "1.0.
|
|
13
|
+
__version__ = "1.0.7"
|
|
14
14
|
__author__ = "Lu qi"
|
|
15
15
|
__email__ = "qi.lu@pixelarrayai.com"
|
|
16
16
|
|
|
17
17
|
# 导出主要模块
|
|
18
18
|
__all__ = [
|
|
19
19
|
"product",
|
|
20
|
-
"
|
|
20
|
+
"cron",
|
|
21
21
|
"user",
|
|
22
22
|
"order",
|
|
23
23
|
]
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
from pixelarraythirdparty.client import Client
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
class
|
|
5
|
-
def
|
|
4
|
+
class CronManager(Client):
|
|
5
|
+
def get_cron_status(self):
|
|
6
6
|
"""
|
|
7
|
-
获取
|
|
7
|
+
获取Cron服务状态
|
|
8
8
|
|
|
9
9
|
功能说明:
|
|
10
|
-
获取
|
|
10
|
+
获取Cron服务的运行状态,包括已注册的任务、工作节点状态等。
|
|
11
11
|
|
|
12
12
|
输入参数:
|
|
13
13
|
无
|
|
14
14
|
|
|
15
15
|
返回字段:
|
|
16
|
-
data (dict):
|
|
16
|
+
data (dict): Cron服务状态信息
|
|
17
17
|
- registered_tasks (dict): 已注册的任务列表,按工作节点分组
|
|
18
18
|
- worker_stats (dict): 工作节点统计信息
|
|
19
19
|
- scheduled_task_count (int): 定时任务数量
|
|
@@ -21,19 +21,19 @@ class CeleryManager(Client):
|
|
|
21
21
|
success (bool): 操作是否成功
|
|
22
22
|
|
|
23
23
|
异常情况:
|
|
24
|
-
- 获取
|
|
24
|
+
- 获取Cron状态失败:返回错误信息"获取Cron状态失败"
|
|
25
25
|
"""
|
|
26
|
-
data, success = self._request("GET", "/api/
|
|
26
|
+
data, success = self._request("GET", "/api/cron/status")
|
|
27
27
|
if not success:
|
|
28
28
|
return {}, False
|
|
29
29
|
return data, True
|
|
30
30
|
|
|
31
|
-
def
|
|
31
|
+
def get_cron_tasks(self):
|
|
32
32
|
"""
|
|
33
33
|
获取已注册任务列表
|
|
34
34
|
|
|
35
35
|
功能说明:
|
|
36
|
-
获取所有已注册的
|
|
36
|
+
获取所有已注册的Cron任务列表。
|
|
37
37
|
|
|
38
38
|
输入参数:
|
|
39
39
|
无
|
|
@@ -48,12 +48,12 @@ class CeleryManager(Client):
|
|
|
48
48
|
异常情况:
|
|
49
49
|
- 获取任务列表失败:返回错误信息"获取任务列表失败"
|
|
50
50
|
"""
|
|
51
|
-
data, success = self._request("GET", "/api/
|
|
51
|
+
data, success = self._request("GET", "/api/cron/tasks")
|
|
52
52
|
if not success:
|
|
53
53
|
return {}, False
|
|
54
54
|
return data, True
|
|
55
55
|
|
|
56
|
-
def
|
|
56
|
+
def get_cron_tasks_scheduled(self):
|
|
57
57
|
"""
|
|
58
58
|
获取定时任务列表
|
|
59
59
|
|
|
@@ -85,12 +85,12 @@ class CeleryManager(Client):
|
|
|
85
85
|
异常情况:
|
|
86
86
|
- 获取定时任务列表失败:返回错误信息"获取定时任务列表失败"
|
|
87
87
|
"""
|
|
88
|
-
data, success = self._request("GET", "/api/
|
|
88
|
+
data, success = self._request("GET", "/api/cron/tasks/scheduled")
|
|
89
89
|
if not success:
|
|
90
90
|
return {}, False
|
|
91
91
|
return data, True
|
|
92
92
|
|
|
93
|
-
def
|
|
93
|
+
def get_cron_tasks_detail(self, task_name: str):
|
|
94
94
|
"""
|
|
95
95
|
获取任务详情
|
|
96
96
|
|
|
@@ -117,12 +117,12 @@ class CeleryManager(Client):
|
|
|
117
117
|
- 任务不存在:返回错误信息"任务不存在"
|
|
118
118
|
- 获取任务详情失败:返回错误信息"获取任务详情失败"
|
|
119
119
|
"""
|
|
120
|
-
data, success = self._request("GET", f"/api/
|
|
120
|
+
data, success = self._request("GET", f"/api/cron/tasks/{task_name}")
|
|
121
121
|
if not success:
|
|
122
122
|
return {}, False
|
|
123
123
|
return data, True
|
|
124
124
|
|
|
125
|
-
def
|
|
125
|
+
def trigger_cron_task(self, task_name: str, args: list, kwargs: dict):
|
|
126
126
|
"""
|
|
127
127
|
触发任务执行
|
|
128
128
|
|
|
@@ -148,7 +148,7 @@ class CeleryManager(Client):
|
|
|
148
148
|
"""
|
|
149
149
|
data, success = self._request(
|
|
150
150
|
"POST",
|
|
151
|
-
f"/api/
|
|
151
|
+
f"/api/cron/tasks/{task_name}/trigger",
|
|
152
152
|
json={"args": args, "kwargs": kwargs},
|
|
153
153
|
)
|
|
154
154
|
if not success:
|
{pixelarraythirdparty-1.0.5 → pixelarraythirdparty-1.0.7}/pixelarraythirdparty/order/order.py
RENAMED
|
@@ -98,9 +98,12 @@ class OrderManager(Client):
|
|
|
98
98
|
params = {
|
|
99
99
|
"page": page,
|
|
100
100
|
"page_size": page_size,
|
|
101
|
-
"payment_status": payment_status,
|
|
102
|
-
"out_trade_no": out_trade_no,
|
|
103
101
|
}
|
|
102
|
+
# 只添加非None的参数
|
|
103
|
+
if payment_status is not None:
|
|
104
|
+
params["payment_status"] = payment_status
|
|
105
|
+
if out_trade_no is not None:
|
|
106
|
+
params["out_trade_no"] = out_trade_no
|
|
104
107
|
data, success = self._request("GET", "/api/orders/list", params=params)
|
|
105
108
|
if not success:
|
|
106
109
|
return {}, False
|
|
@@ -251,8 +254,7 @@ class OrderManager(Client):
|
|
|
251
254
|
|
|
252
255
|
def generate_qr_code(
|
|
253
256
|
self,
|
|
254
|
-
out_trade_no: str
|
|
255
|
-
payment_channel: str = "WECHAT",
|
|
257
|
+
out_trade_no: str
|
|
256
258
|
):
|
|
257
259
|
"""
|
|
258
260
|
生成支付二维码
|
|
@@ -262,9 +264,6 @@ class OrderManager(Client):
|
|
|
262
264
|
|
|
263
265
|
输入参数:
|
|
264
266
|
out_trade_no (str): 商户订单号,必填
|
|
265
|
-
payment_channel (str, 可选): 支付渠道,默认为"WECHAT",可选值:
|
|
266
|
-
- "WECHAT": 微信支付
|
|
267
|
-
- "ALIPAY": 支付宝(暂未实现)
|
|
268
267
|
|
|
269
268
|
返回字段:
|
|
270
269
|
data (dict): 二维码信息
|
|
@@ -278,24 +277,35 @@ class OrderManager(Client):
|
|
|
278
277
|
- 不支持的支付渠道:抛出ValueError异常
|
|
279
278
|
- 生成支付二维码失败:返回错误信息"生成支付二维码失败"
|
|
280
279
|
"""
|
|
281
|
-
|
|
280
|
+
order_detail, detail_success = self.get_order_detail(out_trade_no)
|
|
281
|
+
if not detail_success:
|
|
282
|
+
return {}, False
|
|
283
|
+
|
|
284
|
+
if order_detail.get("payment_channel") == "WECHAT":
|
|
282
285
|
url = "/api/orders/wx_pay/generate_qr_code"
|
|
283
|
-
|
|
286
|
+
request_data = {
|
|
287
|
+
"out_trade_no": out_trade_no,
|
|
288
|
+
}
|
|
289
|
+
elif order_detail.get("payment_channel") == "ALIPAY":
|
|
284
290
|
url = "/api/orders/ali_pay/generate_qr_code"
|
|
291
|
+
# 支付宝需要total_fee和subject,从已获取的订单详情中提取
|
|
292
|
+
request_data = {
|
|
293
|
+
"out_trade_no": out_trade_no,
|
|
294
|
+
"total_fee": order_detail.get("total_fee"),
|
|
295
|
+
"subject": order_detail.get("body", ""),
|
|
296
|
+
}
|
|
285
297
|
else:
|
|
286
298
|
raise ValueError("Invalid payment channel")
|
|
287
299
|
data, success = self._request(
|
|
288
300
|
"POST",
|
|
289
301
|
url,
|
|
290
|
-
json=
|
|
291
|
-
"out_trade_no": out_trade_no,
|
|
292
|
-
},
|
|
302
|
+
json=request_data,
|
|
293
303
|
)
|
|
294
304
|
if not success:
|
|
295
305
|
return {}, False
|
|
296
306
|
return data, True
|
|
297
307
|
|
|
298
|
-
def refund_order(self, out_trade_no: str
|
|
308
|
+
def refund_order(self, out_trade_no: str):
|
|
299
309
|
"""
|
|
300
310
|
申请订单退款
|
|
301
311
|
|
|
@@ -304,15 +314,13 @@ class OrderManager(Client):
|
|
|
304
314
|
|
|
305
315
|
输入参数:
|
|
306
316
|
out_trade_no (str): 商户订单号,必填
|
|
307
|
-
payment_channel (str, 可选): 支付渠道,默认为"WECHAT",可选值:
|
|
308
|
-
- "WECHAT": 微信支付
|
|
309
|
-
- "ALIPAY": 支付宝(暂未实现)
|
|
310
317
|
|
|
311
318
|
返回字段:
|
|
312
319
|
data (dict): 退款信息
|
|
313
320
|
- out_refund_no (str): 退款单号,格式为"REFUND_订单号_时间戳"
|
|
314
321
|
- out_trade_no (str): 商户订单号
|
|
315
|
-
- total_fee (int):
|
|
322
|
+
- total_fee (int): 退款金额(分,微信支付)
|
|
323
|
+
- refund_amount (float): 退款金额(元,支付宝)
|
|
316
324
|
success (bool): 操作是否成功
|
|
317
325
|
|
|
318
326
|
异常情况:
|
|
@@ -322,16 +330,26 @@ class OrderManager(Client):
|
|
|
322
330
|
- 不支持的支付渠道:抛出ValueError异常
|
|
323
331
|
- 退款申请失败:返回错误信息"退款申请失败"
|
|
324
332
|
"""
|
|
325
|
-
|
|
333
|
+
order_detail, detail_success = self.get_order_detail(out_trade_no)
|
|
334
|
+
if not detail_success:
|
|
335
|
+
return {}, False
|
|
336
|
+
|
|
337
|
+
if order_detail.get("payment_channel") == "WECHAT":
|
|
326
338
|
url = "/api/orders/wx_pay/refund"
|
|
327
|
-
|
|
339
|
+
request_data = {"out_trade_no": out_trade_no}
|
|
340
|
+
elif order_detail.get("payment_channel") == "ALIPAY":
|
|
328
341
|
url = "/api/orders/ali_pay/refund"
|
|
342
|
+
request_data = {
|
|
343
|
+
"out_trade_no": out_trade_no,
|
|
344
|
+
"refund_amount": order_detail.get("total_fee"),
|
|
345
|
+
"refund_reason": "用户退款",
|
|
346
|
+
}
|
|
329
347
|
else:
|
|
330
348
|
raise ValueError("Invalid payment channel")
|
|
331
349
|
data, success = self._request(
|
|
332
350
|
"POST",
|
|
333
351
|
url,
|
|
334
|
-
json=
|
|
352
|
+
json=request_data,
|
|
335
353
|
)
|
|
336
354
|
if not success:
|
|
337
355
|
return {}, False
|
|
@@ -435,9 +453,12 @@ class OrderManagerAsync(AsyncClient):
|
|
|
435
453
|
params = {
|
|
436
454
|
"page": page,
|
|
437
455
|
"page_size": page_size,
|
|
438
|
-
"payment_status": payment_status,
|
|
439
|
-
"out_trade_no": out_trade_no,
|
|
440
456
|
}
|
|
457
|
+
# 只添加非None的参数
|
|
458
|
+
if payment_status is not None:
|
|
459
|
+
params["payment_status"] = payment_status
|
|
460
|
+
if out_trade_no is not None:
|
|
461
|
+
params["out_trade_no"] = out_trade_no
|
|
441
462
|
data, success = await self._request("GET", "/api/orders/list", params=params)
|
|
442
463
|
if not success:
|
|
443
464
|
return {}, False
|
|
@@ -581,19 +602,17 @@ class OrderManagerAsync(AsyncClient):
|
|
|
581
602
|
return data, True
|
|
582
603
|
|
|
583
604
|
async def generate_qr_code(
|
|
584
|
-
self, out_trade_no: str
|
|
605
|
+
self, out_trade_no: str
|
|
585
606
|
):
|
|
586
607
|
"""
|
|
587
608
|
生成支付二维码(异步版本)
|
|
588
609
|
|
|
589
610
|
功能说明:
|
|
590
611
|
为指定订单生成支付二维码,支持微信支付和支付宝。二维码会自动上传到OSS并返回访问URL。
|
|
612
|
+
如果不指定payment_channel,会自动从订单详情中获取支付渠道。
|
|
591
613
|
|
|
592
614
|
输入参数:
|
|
593
615
|
out_trade_no (str): 商户订单号,必填
|
|
594
|
-
payment_channel (str, 可选): 支付渠道,默认为"WECHAT",可选值:
|
|
595
|
-
- "WECHAT": 微信支付
|
|
596
|
-
- "ALIPAY": 支付宝(暂未实现)
|
|
597
616
|
|
|
598
617
|
返回字段:
|
|
599
618
|
data (dict): 二维码信息
|
|
@@ -607,20 +626,34 @@ class OrderManagerAsync(AsyncClient):
|
|
|
607
626
|
- 不支持的支付渠道:抛出ValueError异常
|
|
608
627
|
- 生成支付二维码失败:返回错误信息"生成支付二维码失败"
|
|
609
628
|
"""
|
|
610
|
-
|
|
629
|
+
order_detail, success = await self.get_order_detail(out_trade_no)
|
|
630
|
+
print(order_detail)
|
|
631
|
+
if not success:
|
|
632
|
+
return {}, False
|
|
633
|
+
|
|
634
|
+
if order_detail.get("payment_channel") == "WECHAT":
|
|
611
635
|
url = "/api/orders/wx_pay/generate_qr_code"
|
|
612
|
-
|
|
636
|
+
request_data = {
|
|
637
|
+
"out_trade_no": out_trade_no,
|
|
638
|
+
}
|
|
639
|
+
elif order_detail.get("payment_channel") == "ALIPAY":
|
|
613
640
|
url = "/api/orders/ali_pay/generate_qr_code"
|
|
641
|
+
# 支付宝需要total_fee和subject,从已获取的订单详情中提取
|
|
642
|
+
request_data = {
|
|
643
|
+
"out_trade_no": out_trade_no,
|
|
644
|
+
"total_fee": order_detail.get("total_fee"),
|
|
645
|
+
"subject": order_detail.get("body", ""),
|
|
646
|
+
}
|
|
614
647
|
else:
|
|
615
648
|
raise ValueError("Invalid payment channel")
|
|
616
649
|
data, success = await self._request(
|
|
617
|
-
"POST", url, json=
|
|
650
|
+
"POST", url, json=request_data
|
|
618
651
|
)
|
|
619
652
|
if not success:
|
|
620
653
|
return {}, False
|
|
621
654
|
return data, True
|
|
622
655
|
|
|
623
|
-
async def refund_order(self, out_trade_no: str
|
|
656
|
+
async def refund_order(self, out_trade_no: str):
|
|
624
657
|
"""
|
|
625
658
|
申请订单退款(异步版本)
|
|
626
659
|
|
|
@@ -629,15 +662,13 @@ class OrderManagerAsync(AsyncClient):
|
|
|
629
662
|
|
|
630
663
|
输入参数:
|
|
631
664
|
out_trade_no (str): 商户订单号,必填
|
|
632
|
-
payment_channel (str, 可选): 支付渠道,默认为"WECHAT",可选值:
|
|
633
|
-
- "WECHAT": 微信支付
|
|
634
|
-
- "ALIPAY": 支付宝(暂未实现)
|
|
635
665
|
|
|
636
666
|
返回字段:
|
|
637
667
|
data (dict): 退款信息
|
|
638
668
|
- out_refund_no (str): 退款单号,格式为"REFUND_订单号_时间戳"
|
|
639
669
|
- out_trade_no (str): 商户订单号
|
|
640
|
-
- total_fee (int):
|
|
670
|
+
- total_fee (int): 退款金额(分,微信支付)
|
|
671
|
+
- refund_amount (float): 退款金额(元,支付宝)
|
|
641
672
|
success (bool): 操作是否成功
|
|
642
673
|
|
|
643
674
|
异常情况:
|
|
@@ -647,14 +678,24 @@ class OrderManagerAsync(AsyncClient):
|
|
|
647
678
|
- 不支持的支付渠道:抛出ValueError异常
|
|
648
679
|
- 退款申请失败:返回错误信息"退款申请失败"
|
|
649
680
|
"""
|
|
650
|
-
|
|
681
|
+
order_detail, success = await self.get_order_detail(out_trade_no)
|
|
682
|
+
if not success:
|
|
683
|
+
return {}, False
|
|
684
|
+
|
|
685
|
+
if order_detail.get("payment_channel") == "WECHAT":
|
|
651
686
|
url = "/api/orders/wx_pay/refund"
|
|
652
|
-
|
|
687
|
+
request_data = {"out_trade_no": out_trade_no}
|
|
688
|
+
elif order_detail.get("payment_channel") == "ALIPAY":
|
|
653
689
|
url = "/api/orders/ali_pay/refund"
|
|
690
|
+
request_data = {
|
|
691
|
+
"out_trade_no": out_trade_no,
|
|
692
|
+
"refund_amount": order_detail.get("total_fee") / 100.0,
|
|
693
|
+
"refund_reason": "用户退款",
|
|
694
|
+
}
|
|
654
695
|
else:
|
|
655
|
-
raise ValueError("Invalid payment channel")
|
|
696
|
+
raise ValueError("Invalid payment channel")
|
|
656
697
|
data, success = await self._request(
|
|
657
|
-
"POST", url, json=
|
|
698
|
+
"POST", url, json=request_data
|
|
658
699
|
)
|
|
659
700
|
if not success:
|
|
660
701
|
return {}, False
|
{pixelarraythirdparty-1.0.5 → pixelarraythirdparty-1.0.7}/pixelarraythirdparty.egg-info/SOURCES.txt
RENAMED
|
@@ -8,8 +8,8 @@ pixelarraythirdparty.egg-info/SOURCES.txt
|
|
|
8
8
|
pixelarraythirdparty.egg-info/dependency_links.txt
|
|
9
9
|
pixelarraythirdparty.egg-info/requires.txt
|
|
10
10
|
pixelarraythirdparty.egg-info/top_level.txt
|
|
11
|
-
pixelarraythirdparty/
|
|
12
|
-
pixelarraythirdparty/
|
|
11
|
+
pixelarraythirdparty/cron/__init__.py
|
|
12
|
+
pixelarraythirdparty/cron/cron.py
|
|
13
13
|
pixelarraythirdparty/order/__init__.py
|
|
14
14
|
pixelarraythirdparty/order/order.py
|
|
15
15
|
pixelarraythirdparty/product/__init__.py
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pixelarraythirdparty-1.0.5 → pixelarraythirdparty-1.0.7}/pixelarraythirdparty/order/__init__.py
RENAMED
|
File without changes
|
{pixelarraythirdparty-1.0.5 → pixelarraythirdparty-1.0.7}/pixelarraythirdparty/product/__init__.py
RENAMED
|
File without changes
|
{pixelarraythirdparty-1.0.5 → pixelarraythirdparty-1.0.7}/pixelarraythirdparty/product/product.py
RENAMED
|
File without changes
|
{pixelarraythirdparty-1.0.5 → pixelarraythirdparty-1.0.7}/pixelarraythirdparty/user/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pixelarraythirdparty-1.0.5 → pixelarraythirdparty-1.0.7}/pixelarraythirdparty.egg-info/requires.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|