payrex-python 1.0.1__tar.gz → 1.0.2__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.
- {payrex_python-1.0.1 → payrex_python-1.0.2}/PKG-INFO +1 -1
- payrex_python-1.0.2/payrex/entities/__init__.py +0 -0
- payrex_python-1.0.2/payrex/entities/billing_statement_entity.py +22 -0
- payrex_python-1.0.2/payrex/entities/billing_statement_line_item_entity.py +12 -0
- payrex_python-1.0.2/payrex/entities/checkout_session_entity.py +22 -0
- payrex_python-1.0.2/payrex/entities/customer_entity.py +14 -0
- payrex_python-1.0.2/payrex/entities/deleted_entity.py +6 -0
- payrex_python-1.0.2/payrex/entities/event_entity.py +11 -0
- payrex_python-1.0.2/payrex/entities/listing_entity.py +4 -0
- payrex_python-1.0.2/payrex/entities/payment_intent_entity.py +23 -0
- payrex_python-1.0.2/payrex/entities/refund_entity.py +16 -0
- payrex_python-1.0.2/payrex/entities/webhook_entity.py +13 -0
- payrex_python-1.0.2/payrex/exceptions/__init__.py +0 -0
- payrex_python-1.0.2/payrex/exceptions/authentication_invalid_exception.py +4 -0
- payrex_python-1.0.2/payrex/exceptions/base_exception.py +5 -0
- payrex_python-1.0.2/payrex/exceptions/request_invalid_exception.py +4 -0
- payrex_python-1.0.2/payrex/exceptions/resource_not_found_exception.py +4 -0
- payrex_python-1.0.2/payrex/exceptions/signature_invalid_exception.py +2 -0
- payrex_python-1.0.2/payrex/exceptions/value_unexpected_exception.py +2 -0
- payrex_python-1.0.2/payrex/services/__init__.py +0 -0
- payrex_python-1.0.2/payrex/services/base_service.py +28 -0
- payrex_python-1.0.2/payrex/services/billing_statement_line_item_service.py +41 -0
- payrex_python-1.0.2/payrex/services/billing_statement_service.py +82 -0
- payrex_python-1.0.2/payrex/services/checkout_session_service.py +41 -0
- payrex_python-1.0.2/payrex/services/customer_service.py +50 -0
- payrex_python-1.0.2/payrex/services/payment_intent_service.py +32 -0
- payrex_python-1.0.2/payrex/services/refund_service.py +16 -0
- payrex_python-1.0.2/payrex/services/service_factory.py +29 -0
- payrex_python-1.0.2/payrex/services/webhook_service.py +98 -0
- {payrex_python-1.0.1 → payrex_python-1.0.2}/payrex_python.egg-info/PKG-INFO +1 -1
- payrex_python-1.0.2/payrex_python.egg-info/SOURCES.txt +42 -0
- {payrex_python-1.0.1 → payrex_python-1.0.2}/setup.py +1 -1
- payrex_python-1.0.1/payrex_python.egg-info/SOURCES.txt +0 -14
- {payrex_python-1.0.1 → payrex_python-1.0.2}/LICENSE +0 -0
- {payrex_python-1.0.1 → payrex_python-1.0.2}/README.md +0 -0
- {payrex_python-1.0.1 → payrex_python-1.0.2}/payrex/__init__.py +0 -0
- {payrex_python-1.0.1 → payrex_python-1.0.2}/payrex/api_resource.py +0 -0
- {payrex_python-1.0.1 → payrex_python-1.0.2}/payrex/client.py +0 -0
- {payrex_python-1.0.1 → payrex_python-1.0.2}/payrex/config.py +0 -0
- {payrex_python-1.0.1 → payrex_python-1.0.2}/payrex/error.py +0 -0
- {payrex_python-1.0.1 → payrex_python-1.0.2}/payrex/http_client.py +0 -0
- {payrex_python-1.0.1 → payrex_python-1.0.2}/payrex_python.egg-info/dependency_links.txt +0 -0
- {payrex_python-1.0.1 → payrex_python-1.0.2}/payrex_python.egg-info/requires.txt +0 -0
- {payrex_python-1.0.1 → payrex_python-1.0.2}/payrex_python.egg-info/top_level.txt +0 -0
- {payrex_python-1.0.1 → payrex_python-1.0.2}/setup.cfg +0 -0
|
File without changes
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
class BillingStatementEntity:
|
|
2
|
+
def __init__(self, api_resource):
|
|
3
|
+
data = api_resource.data
|
|
4
|
+
|
|
5
|
+
self.id = data.get('id')
|
|
6
|
+
self.customer_reference_id = data.get('customer_reference_id')
|
|
7
|
+
self.client_secret = data.get('client_secret')
|
|
8
|
+
self.status = data.get('status')
|
|
9
|
+
self.currency = data.get('currency')
|
|
10
|
+
self.line_items = data.get('line_items')
|
|
11
|
+
self.livemode = data.get('livemode')
|
|
12
|
+
self.url = data.get('url')
|
|
13
|
+
self.payment_intent = data.get('payment_intent')
|
|
14
|
+
self.metadata = data.get('metadata')
|
|
15
|
+
self.success_url = data.get('success_url')
|
|
16
|
+
self.cancel_url = data.get('cancel_url')
|
|
17
|
+
self.payment_methods = data.get('payment_methods')
|
|
18
|
+
self.description = data.get('description')
|
|
19
|
+
self.submit_type = data.get('submit_type')
|
|
20
|
+
self.expires_at = data.get('expires_at')
|
|
21
|
+
self.created_at = data.get('created_at')
|
|
22
|
+
self.updated_at = data.get('updated_at')
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
class BillingStatementLineItemEntity:
|
|
2
|
+
def __init__(self, api_resource):
|
|
3
|
+
data = api_resource.data
|
|
4
|
+
|
|
5
|
+
self.id = data.get('id')
|
|
6
|
+
self.unit_price = data.get('unit_price')
|
|
7
|
+
self.quantity = data.get('quantity')
|
|
8
|
+
self.billing_statement_id = data.get('billing_statement_id')
|
|
9
|
+
self.description = data.get('description')
|
|
10
|
+
self.livemode = data.get('livemode')
|
|
11
|
+
self.created_at = data.get('created_at')
|
|
12
|
+
self.updated_at = data.get('updated_at')
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
class CheckoutSessionEntity:
|
|
2
|
+
def __init__(self, api_resource):
|
|
3
|
+
data = api_resource.data
|
|
4
|
+
|
|
5
|
+
self.id = data.get('id')
|
|
6
|
+
self.customer_reference_id = data.get('customer_reference_id')
|
|
7
|
+
self.client_secret = data.get('client_secret')
|
|
8
|
+
self.status = data.get('status')
|
|
9
|
+
self.currency = data.get('currency')
|
|
10
|
+
self.line_items = data.get('line_items')
|
|
11
|
+
self.livemode = data.get('livemode')
|
|
12
|
+
self.url = data.get('url')
|
|
13
|
+
self.payment_intent = data.get('payment_intent')
|
|
14
|
+
self.metadata = data.get('metadata')
|
|
15
|
+
self.success_url = data.get('success_url')
|
|
16
|
+
self.cancel_url = data.get('cancel_url')
|
|
17
|
+
self.payment_methods = data.get('payment_methods')
|
|
18
|
+
self.description = data.get('description')
|
|
19
|
+
self.submit_type = data.get('submit_type')
|
|
20
|
+
self.expires_at = data.get('expires_at')
|
|
21
|
+
self.created_at = data.get('created_at')
|
|
22
|
+
self.updated_at = data.get('updated_at')
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
class CustomerEntity:
|
|
2
|
+
def __init__(self, api_resource):
|
|
3
|
+
data = api_resource.data
|
|
4
|
+
|
|
5
|
+
self.id = data.get('id')
|
|
6
|
+
self.billing_statement_prefix = data.get('billing_statement_prefix')
|
|
7
|
+
self.currency = data.get('currency')
|
|
8
|
+
self.email = data.get('email')
|
|
9
|
+
self.livemode = data.get('livemode')
|
|
10
|
+
self.name = data.get('name')
|
|
11
|
+
self.metadata = data.get('metadata')
|
|
12
|
+
self.next_billing_statement_sequence_number = data.get('next_billing_statement_sequence_number')
|
|
13
|
+
self.created_at = data.get('created_at')
|
|
14
|
+
self.updated_at = data.get('updated_at')
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
class EventEntity:
|
|
2
|
+
def __init__(self, api_resource):
|
|
3
|
+
data = api_resource.data
|
|
4
|
+
|
|
5
|
+
self.id = data.get('id')
|
|
6
|
+
self.data = data.get('data')
|
|
7
|
+
self.type = data.get('type')
|
|
8
|
+
self.pending_webhooks = data.get('pending_webhooks')
|
|
9
|
+
self.previous_attributes = data.get('previous_attributes')
|
|
10
|
+
self.created_at = data.get('created_at')
|
|
11
|
+
self.updated_at = data.get('updated_at')
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
class PaymentIntentEntity:
|
|
2
|
+
def __init__(self, api_resource):
|
|
3
|
+
data = api_resource.data
|
|
4
|
+
|
|
5
|
+
self.id = data.get('id')
|
|
6
|
+
self.amount = data.get('amount')
|
|
7
|
+
self.amount_received = data.get('amount_received')
|
|
8
|
+
self.amount_capturable = data.get('amount_capturable')
|
|
9
|
+
self.client_secret = data.get('client_secret')
|
|
10
|
+
self.currency = data.get('currency')
|
|
11
|
+
self.description = data.get('description')
|
|
12
|
+
self.livemode = data.get('livemode')
|
|
13
|
+
self.metadata = data.get('metadata')
|
|
14
|
+
self.latest_payment = data.get('latest_payment')
|
|
15
|
+
self.payment_method_id = data.get('payment_method_id')
|
|
16
|
+
self.payment_methods = data.get('payment_methods')
|
|
17
|
+
self.payment_method_options = data.get('payment_method_options')
|
|
18
|
+
self.status = data.get('status')
|
|
19
|
+
self.next_action = data.get('next_action')
|
|
20
|
+
self.return_url = data.get('return_url')
|
|
21
|
+
self.capture_before_at = data.get('capture_before_at')
|
|
22
|
+
self.created_at = data.get('created_at')
|
|
23
|
+
self.updated_at = data.get('updated_at')
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
class RefundEntity:
|
|
2
|
+
def __init__(self, api_resource):
|
|
3
|
+
data = api_resource.data
|
|
4
|
+
|
|
5
|
+
self.id = data.get('id')
|
|
6
|
+
self.amount = data.get('amount')
|
|
7
|
+
self.currency = data.get('currency')
|
|
8
|
+
self.livemode = data.get('livemode')
|
|
9
|
+
self.status = data.get('status')
|
|
10
|
+
self.description = data.get('description')
|
|
11
|
+
self.reason = data.get('reason')
|
|
12
|
+
self.remarks = data.get('remarks')
|
|
13
|
+
self.payment_id = data.get('payment_id')
|
|
14
|
+
self.metadata = data.get('metadata')
|
|
15
|
+
self.created_at = data.get('created_at')
|
|
16
|
+
self.updated_at = data.get('updated_at')
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
class WebhookEntity:
|
|
2
|
+
def __init__(self, api_resource):
|
|
3
|
+
data = api_resource.data
|
|
4
|
+
|
|
5
|
+
self.id = data.get('id')
|
|
6
|
+
self.secret_key = data.get('secret_key')
|
|
7
|
+
self.status = data.get('status')
|
|
8
|
+
self.description = data.get('description')
|
|
9
|
+
self.livemode = data.get('livemode')
|
|
10
|
+
self.url = data.get('url')
|
|
11
|
+
self.events = data.get('events')
|
|
12
|
+
self.created_at = data.get('created_at')
|
|
13
|
+
self.updated_at = data.get('updated_at')
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
from payrex import HttpClient
|
|
2
|
+
from payrex import ListingEntity
|
|
3
|
+
from payrex import ApiResource
|
|
4
|
+
|
|
5
|
+
class BaseService:
|
|
6
|
+
def __init__(self, client):
|
|
7
|
+
self.client = client
|
|
8
|
+
|
|
9
|
+
def request(self, method, object, path, payload=None, is_list=False):
|
|
10
|
+
http_client = HttpClient(
|
|
11
|
+
api_key=self.client.config.api_key,
|
|
12
|
+
base_url=self.client.config.api_base_url
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
api_resource = http_client.request(
|
|
16
|
+
method=method,
|
|
17
|
+
params=payload,
|
|
18
|
+
path=path
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
if is_list:
|
|
22
|
+
data = [object(ApiResource(data)) for data in api_resource.data['data']]
|
|
23
|
+
|
|
24
|
+
return ListingEntity(data, api_resource.data['has_more'])
|
|
25
|
+
elif object is None:
|
|
26
|
+
return None
|
|
27
|
+
else:
|
|
28
|
+
return object(api_resource)
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
from payrex import BaseService
|
|
2
|
+
from payrex import BillingStatementLineItemEntity
|
|
3
|
+
from payrex import DeletedEntity
|
|
4
|
+
|
|
5
|
+
class BillingStatementLineItemService(BaseService):
|
|
6
|
+
PATH = 'billing_statement_line_items'
|
|
7
|
+
|
|
8
|
+
def __init__(self, client):
|
|
9
|
+
BaseService.__init__(self, client)
|
|
10
|
+
|
|
11
|
+
def create(self, payload):
|
|
12
|
+
return self.request(
|
|
13
|
+
method='post',
|
|
14
|
+
object=BillingStatementLineItemEntity,
|
|
15
|
+
path=self.PATH,
|
|
16
|
+
payload=payload
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
def retrieve(self, id):
|
|
20
|
+
return self.request(
|
|
21
|
+
method='get',
|
|
22
|
+
object=BillingStatementLineItemEntity,
|
|
23
|
+
path=f'{self.PATH}/{id}',
|
|
24
|
+
payload={}
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
def update(self, id, payload):
|
|
28
|
+
return self.request(
|
|
29
|
+
method='put',
|
|
30
|
+
object=BillingStatementLineItemEntity,
|
|
31
|
+
path=f'{self.PATH}/{id}',
|
|
32
|
+
payload=payload
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
def delete(self, id):
|
|
36
|
+
return self.request(
|
|
37
|
+
method='delete',
|
|
38
|
+
object=DeletedEntity,
|
|
39
|
+
path=f'{self.PATH}/{id}',
|
|
40
|
+
payload={}
|
|
41
|
+
)
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
from payrex import BaseService
|
|
2
|
+
from payrex import BillingStatementEntity
|
|
3
|
+
from payrex import DeletedEntity
|
|
4
|
+
|
|
5
|
+
class BillingStatementService(BaseService):
|
|
6
|
+
PATH = 'billing_statements'
|
|
7
|
+
|
|
8
|
+
def __init__(self, client):
|
|
9
|
+
BaseService.__init__(self, client)
|
|
10
|
+
|
|
11
|
+
def create(self, payload):
|
|
12
|
+
return self.request(
|
|
13
|
+
method='post',
|
|
14
|
+
object=BillingStatementEntity,
|
|
15
|
+
path=self.PATH,
|
|
16
|
+
payload=payload
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
def retrieve(self, id):
|
|
20
|
+
return self.request(
|
|
21
|
+
method='get',
|
|
22
|
+
object=BillingStatementEntity,
|
|
23
|
+
path=f'{self.PATH}/{id}',
|
|
24
|
+
payload={}
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
def list(self, payload = {}):
|
|
28
|
+
return self.request(
|
|
29
|
+
method='get',
|
|
30
|
+
object=BillingStatementEntity,
|
|
31
|
+
path=self.PATH,
|
|
32
|
+
payload=payload,
|
|
33
|
+
is_list=True
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
def update(self, id, payload):
|
|
37
|
+
return self.request(
|
|
38
|
+
method='put',
|
|
39
|
+
object=BillingStatementEntity,
|
|
40
|
+
path=f'{self.PATH}/{id}',
|
|
41
|
+
payload=payload
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
def delete(self, id):
|
|
45
|
+
return self.request(
|
|
46
|
+
method='delete',
|
|
47
|
+
object=DeletedEntity,
|
|
48
|
+
path=f'{self.PATH}/{id}',
|
|
49
|
+
payload={}
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
def finalize(self, id):
|
|
53
|
+
return self.request(
|
|
54
|
+
method='post',
|
|
55
|
+
object=BillingStatementEntity,
|
|
56
|
+
path=f'{self.PATH}/{id}/finalize',
|
|
57
|
+
payload={}
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
def send(self, id):
|
|
61
|
+
return self.request(
|
|
62
|
+
method='post',
|
|
63
|
+
object=None,
|
|
64
|
+
path=f'{self.PATH}/{id}/send',
|
|
65
|
+
payload={}
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
def void(self, id):
|
|
69
|
+
return self.request(
|
|
70
|
+
method='post',
|
|
71
|
+
object=BillingStatementEntity,
|
|
72
|
+
path=f'{self.PATH}/{id}/void',
|
|
73
|
+
payload={}
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
def mark_uncollectible(self, id):
|
|
77
|
+
return self.request(
|
|
78
|
+
method='post',
|
|
79
|
+
object=BillingStatementEntity,
|
|
80
|
+
path=f'{self.PATH}/{id}/mark_uncollectible',
|
|
81
|
+
payload={}
|
|
82
|
+
)
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
from payrex import BaseService
|
|
2
|
+
from payrex import CheckoutSessionEntity
|
|
3
|
+
|
|
4
|
+
class CheckoutSessionService(BaseService):
|
|
5
|
+
PATH = 'checkout_sessions'
|
|
6
|
+
|
|
7
|
+
def __init__(self, client):
|
|
8
|
+
BaseService.__init__(self, client)
|
|
9
|
+
|
|
10
|
+
def create(self, payload):
|
|
11
|
+
return self.request(
|
|
12
|
+
method='post',
|
|
13
|
+
object=CheckoutSessionEntity,
|
|
14
|
+
path=self.PATH,
|
|
15
|
+
payload=payload
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
def list(self, payload = {}):
|
|
19
|
+
return self.request(
|
|
20
|
+
method='get',
|
|
21
|
+
object=CheckoutSessionEntity,
|
|
22
|
+
path=self.PATH,
|
|
23
|
+
payload=payload,
|
|
24
|
+
is_list=True
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
def retrieve(self, id):
|
|
28
|
+
return self.request(
|
|
29
|
+
method='get',
|
|
30
|
+
object=CheckoutSessionEntity,
|
|
31
|
+
path=f'{self.PATH}/{id}',
|
|
32
|
+
payload={}
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
def expire(self, id):
|
|
36
|
+
return self.request(
|
|
37
|
+
method='post',
|
|
38
|
+
object=CheckoutSessionEntity,
|
|
39
|
+
path=f'{self.PATH}/{id}/expire',
|
|
40
|
+
payload={}
|
|
41
|
+
)
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
from payrex import BaseService
|
|
2
|
+
from payrex import CustomerEntity
|
|
3
|
+
from payrex import DeletedEntity
|
|
4
|
+
|
|
5
|
+
class CustomerService(BaseService):
|
|
6
|
+
PATH = 'customers'
|
|
7
|
+
|
|
8
|
+
def __init__(self, client):
|
|
9
|
+
BaseService.__init__(self, client)
|
|
10
|
+
|
|
11
|
+
def create(self, payload):
|
|
12
|
+
return self.request(
|
|
13
|
+
method='post',
|
|
14
|
+
object=CustomerEntity,
|
|
15
|
+
path=self.PATH,
|
|
16
|
+
payload=payload
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
def retrieve(self, id):
|
|
20
|
+
return self.request(
|
|
21
|
+
method='get',
|
|
22
|
+
object=CustomerEntity,
|
|
23
|
+
path=f'{self.PATH}/{id}',
|
|
24
|
+
payload={}
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
def list(self, payload = {}):
|
|
28
|
+
return self.request(
|
|
29
|
+
method='get',
|
|
30
|
+
object=CustomerEntity,
|
|
31
|
+
path=self.PATH,
|
|
32
|
+
payload=payload,
|
|
33
|
+
is_list=True
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
def update(self, id, payload):
|
|
37
|
+
return self.request(
|
|
38
|
+
method='put',
|
|
39
|
+
object=CustomerEntity,
|
|
40
|
+
path=f'{self.PATH}/{id}',
|
|
41
|
+
payload=payload
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
def delete(self, id):
|
|
45
|
+
return self.request(
|
|
46
|
+
method='delete',
|
|
47
|
+
object=DeletedEntity,
|
|
48
|
+
path=f'{self.PATH}/{id}',
|
|
49
|
+
payload={}
|
|
50
|
+
)
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
from payrex import BaseService
|
|
2
|
+
from payrex import PaymentIntentEntity
|
|
3
|
+
|
|
4
|
+
class PaymentIntentService(BaseService):
|
|
5
|
+
PATH = 'payment_intents'
|
|
6
|
+
|
|
7
|
+
def __init__(self, client):
|
|
8
|
+
BaseService.__init__(self, client)
|
|
9
|
+
|
|
10
|
+
def capture(self, id, payload):
|
|
11
|
+
return self.request(
|
|
12
|
+
method='post',
|
|
13
|
+
object=PaymentIntentEntity,
|
|
14
|
+
path=f'{self.PATH}/{id}/capture',
|
|
15
|
+
payload=payload
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
def create(self, payload):
|
|
19
|
+
return self.request(
|
|
20
|
+
method='post',
|
|
21
|
+
object=PaymentIntentEntity,
|
|
22
|
+
path=self.PATH,
|
|
23
|
+
payload=payload
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
def retrieve(self, id):
|
|
27
|
+
return self.request(
|
|
28
|
+
method='get',
|
|
29
|
+
object=PaymentIntentEntity,
|
|
30
|
+
path=f'{self.PATH}/{id}',
|
|
31
|
+
payload={}
|
|
32
|
+
)
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
from payrex import BaseService
|
|
2
|
+
from payrex import RefundEntity
|
|
3
|
+
|
|
4
|
+
class RefundService(BaseService):
|
|
5
|
+
PATH = 'refunds'
|
|
6
|
+
|
|
7
|
+
def __init__(self, client):
|
|
8
|
+
BaseService.__init__(self, client)
|
|
9
|
+
|
|
10
|
+
def create(self, payload):
|
|
11
|
+
return self.request(
|
|
12
|
+
method='post',
|
|
13
|
+
object=RefundEntity,
|
|
14
|
+
path=self.PATH,
|
|
15
|
+
payload=payload
|
|
16
|
+
)
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import re
|
|
2
|
+
|
|
3
|
+
from payrex import BaseService
|
|
4
|
+
from payrex import CheckoutSessionService
|
|
5
|
+
from payrex import CustomerService
|
|
6
|
+
from payrex import BillingStatementService
|
|
7
|
+
from payrex import BillingStatementLineItemService
|
|
8
|
+
from payrex import PaymentIntentService
|
|
9
|
+
from payrex import RefundService
|
|
10
|
+
from payrex import WebhookService
|
|
11
|
+
|
|
12
|
+
class ServiceFactory:
|
|
13
|
+
@staticmethod
|
|
14
|
+
def get(name):
|
|
15
|
+
service_name = ''.join(word.capitalize() for word in name.split('_'))
|
|
16
|
+
service_class = globals().get(service_name + 'Service')
|
|
17
|
+
|
|
18
|
+
if not isinstance(service_class, type):
|
|
19
|
+
raise ValueError(f'Unknown service: {name}')
|
|
20
|
+
|
|
21
|
+
return service_class
|
|
22
|
+
|
|
23
|
+
@staticmethod
|
|
24
|
+
def names():
|
|
25
|
+
return [
|
|
26
|
+
re.sub(r'(?<!^)(?=[A-Z])', '_', c.__name__.split('Service')[0]).lower()
|
|
27
|
+
|
|
28
|
+
for c in BaseService.__subclasses__()
|
|
29
|
+
]
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import hashlib
|
|
3
|
+
import hmac
|
|
4
|
+
|
|
5
|
+
from payrex import BaseService
|
|
6
|
+
from payrex import WebhookEntity
|
|
7
|
+
from payrex import DeletedEntity
|
|
8
|
+
from payrex import ValueUnexpectedException
|
|
9
|
+
from payrex import SignatureInvalidException
|
|
10
|
+
from payrex import ApiResource
|
|
11
|
+
from payrex import EventEntity
|
|
12
|
+
|
|
13
|
+
class WebhookService(BaseService):
|
|
14
|
+
PATH = 'webhooks'
|
|
15
|
+
|
|
16
|
+
def __init__(self, client):
|
|
17
|
+
BaseService.__init__(self, client)
|
|
18
|
+
|
|
19
|
+
def create(self, payload):
|
|
20
|
+
return self.request(
|
|
21
|
+
method='post',
|
|
22
|
+
object=WebhookEntity,
|
|
23
|
+
path=self.PATH,
|
|
24
|
+
payload=payload
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
def update(self, id, payload):
|
|
28
|
+
return self.request(
|
|
29
|
+
method='put',
|
|
30
|
+
object=WebhookEntity,
|
|
31
|
+
path=f'{self.PATH}/{id}',
|
|
32
|
+
payload=payload
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
def list(self, payload = {}):
|
|
36
|
+
return self.request(
|
|
37
|
+
method='get',
|
|
38
|
+
object=WebhookEntity,
|
|
39
|
+
path=self.PATH,
|
|
40
|
+
payload=payload,
|
|
41
|
+
is_list=True
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
def retrieve(self, id):
|
|
45
|
+
return self.request(
|
|
46
|
+
method='get',
|
|
47
|
+
object=WebhookEntity,
|
|
48
|
+
path=f'{self.PATH}/{id}',
|
|
49
|
+
payload={}
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
def enable(self, id):
|
|
53
|
+
return self.request(
|
|
54
|
+
method='post',
|
|
55
|
+
object=WebhookEntity,
|
|
56
|
+
path=f'{self.PATH}/{id}/enable',
|
|
57
|
+
payload={}
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
def disable(self, id):
|
|
61
|
+
return self.request(
|
|
62
|
+
method='post',
|
|
63
|
+
object=WebhookEntity,
|
|
64
|
+
path=f'{self.PATH}/{id}/disable',
|
|
65
|
+
payload={}
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
def delete(self, id):
|
|
69
|
+
return self.request(
|
|
70
|
+
method='delete',
|
|
71
|
+
object=DeletedEntity,
|
|
72
|
+
path=f'{self.PATH}/{id}',
|
|
73
|
+
payload={}
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
def parse_event(self, payload, signature_header, webhook_secret_key):
|
|
77
|
+
if not isinstance(signature_header, str):
|
|
78
|
+
raise ValueUnexpectedException('The signature must be a string.')
|
|
79
|
+
|
|
80
|
+
signature_array = signature_header.split(',')
|
|
81
|
+
|
|
82
|
+
if len(signature_array) < 3:
|
|
83
|
+
raise ValueUnexpectedException(f'The format of signature {signature_header} is invalid.')
|
|
84
|
+
|
|
85
|
+
timestamp = signature_array[0].split('=')[1]
|
|
86
|
+
test_mode_signature = signature_array[1].split('=')[1]
|
|
87
|
+
live_mode_signature = signature_array[2].split('=')[1]
|
|
88
|
+
|
|
89
|
+
comparison_signature = live_mode_signature or test_mode_signature
|
|
90
|
+
|
|
91
|
+
computed_hash = hmac.new(webhook_secret_key.encode(), f'{timestamp}.{payload}'.encode(), hashlib.sha256).hexdigest()
|
|
92
|
+
|
|
93
|
+
if computed_hash != comparison_signature:
|
|
94
|
+
raise SignatureInvalidException('The signature is invalid.')
|
|
95
|
+
|
|
96
|
+
api_resource = ApiResource(json.loads(payload))
|
|
97
|
+
|
|
98
|
+
return EventEntity(api_resource)
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
LICENSE
|
|
2
|
+
README.md
|
|
3
|
+
setup.py
|
|
4
|
+
payrex/__init__.py
|
|
5
|
+
payrex/api_resource.py
|
|
6
|
+
payrex/client.py
|
|
7
|
+
payrex/config.py
|
|
8
|
+
payrex/error.py
|
|
9
|
+
payrex/http_client.py
|
|
10
|
+
payrex/entities/__init__.py
|
|
11
|
+
payrex/entities/billing_statement_entity.py
|
|
12
|
+
payrex/entities/billing_statement_line_item_entity.py
|
|
13
|
+
payrex/entities/checkout_session_entity.py
|
|
14
|
+
payrex/entities/customer_entity.py
|
|
15
|
+
payrex/entities/deleted_entity.py
|
|
16
|
+
payrex/entities/event_entity.py
|
|
17
|
+
payrex/entities/listing_entity.py
|
|
18
|
+
payrex/entities/payment_intent_entity.py
|
|
19
|
+
payrex/entities/refund_entity.py
|
|
20
|
+
payrex/entities/webhook_entity.py
|
|
21
|
+
payrex/exceptions/__init__.py
|
|
22
|
+
payrex/exceptions/authentication_invalid_exception.py
|
|
23
|
+
payrex/exceptions/base_exception.py
|
|
24
|
+
payrex/exceptions/request_invalid_exception.py
|
|
25
|
+
payrex/exceptions/resource_not_found_exception.py
|
|
26
|
+
payrex/exceptions/signature_invalid_exception.py
|
|
27
|
+
payrex/exceptions/value_unexpected_exception.py
|
|
28
|
+
payrex/services/__init__.py
|
|
29
|
+
payrex/services/base_service.py
|
|
30
|
+
payrex/services/billing_statement_line_item_service.py
|
|
31
|
+
payrex/services/billing_statement_service.py
|
|
32
|
+
payrex/services/checkout_session_service.py
|
|
33
|
+
payrex/services/customer_service.py
|
|
34
|
+
payrex/services/payment_intent_service.py
|
|
35
|
+
payrex/services/refund_service.py
|
|
36
|
+
payrex/services/service_factory.py
|
|
37
|
+
payrex/services/webhook_service.py
|
|
38
|
+
payrex_python.egg-info/PKG-INFO
|
|
39
|
+
payrex_python.egg-info/SOURCES.txt
|
|
40
|
+
payrex_python.egg-info/dependency_links.txt
|
|
41
|
+
payrex_python.egg-info/requires.txt
|
|
42
|
+
payrex_python.egg-info/top_level.txt
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
LICENSE
|
|
2
|
-
README.md
|
|
3
|
-
setup.py
|
|
4
|
-
payrex/__init__.py
|
|
5
|
-
payrex/api_resource.py
|
|
6
|
-
payrex/client.py
|
|
7
|
-
payrex/config.py
|
|
8
|
-
payrex/error.py
|
|
9
|
-
payrex/http_client.py
|
|
10
|
-
payrex_python.egg-info/PKG-INFO
|
|
11
|
-
payrex_python.egg-info/SOURCES.txt
|
|
12
|
-
payrex_python.egg-info/dependency_links.txt
|
|
13
|
-
payrex_python.egg-info/requires.txt
|
|
14
|
-
payrex_python.egg-info/top_level.txt
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|