Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
data['source_id'] = request.match_info['source_id']
if 'subscription_id' in request.match_info:
data['subscription_id'] = request.match_info['subscription_id']
expand = data.pop('expand', None)
return json_response(func(**data)._export(expand=expand))
return f
# Extra routes must be added *before* regular routes, because otherwise
# `/invoices/upcoming` would fall into `/invoices/{id}`.
for method, url, func in extra_apis:
app.router.add_route(method, url, api_extra(func, url))
for cls in (Charge, Coupon, Customer, Event, Invoice, InvoiceItem,
PaymentIntent, PaymentMethod, Plan, Product, Refund, SetupIntent,
Source, Subscription, SubscriptionItem, TaxRate, Token):
for method, url, func in (
('POST', '/v1/' + cls.object + 's', api_create),
('GET', '/v1/' + cls.object + 's/{id}', api_retrieve),
('POST', '/v1/' + cls.object + 's/{id}', api_update),
('DELETE', '/v1/' + cls.object + 's/{id}', api_delete),
('GET', '/v1/' + cls.object + 's', api_list_all)):
app.router.add_route(method, url, func(cls, url))
def localstripe_js(request):
path = os.path.dirname(os.path.realpath(__file__)) + '/localstripe-v3.js'
with open(path) as f:
return web.Response(text=f.read(),
content_type='application/javascript')
obj._trigger_payment()
else:
obj._authentication_failed = True
obj.payment_method = None
if obj.invoice:
invoice = Invoice._api_retrieve(obj.invoice)
invoice._on_payment_failure_later()
return obj
extra_apis.extend((
('POST', '/v1/payment_intents/{id}/confirm', PaymentIntent._api_confirm),
('POST', '/v1/payment_intents/{id}/cancel', PaymentIntent._api_cancel),
('POST', '/v1/payment_intents/{id}/_authenticate',
PaymentIntent._api_authenticate)))
class PaymentMethod(StripeObject):
object = 'payment_method'
_id_prefix = 'pm_'
def __init__(self, type=None, billing_details=None, card=None,
sepa_debit=None, metadata=None, **kwargs):
if kwargs:
raise UserError(400, 'Unexpected ' + ', '.join(kwargs.keys()))
try:
assert type in ('card', 'sepa_debit')
assert billing_details is None or _type(billing_details) is dict
if type == 'card':
assert _type(card) is dict and card.keys() == {
if obj.status == 'paid':
raise UserError(400, 'Invoice is already paid')
elif obj.status not in ('draft', 'open'):
raise UserError(400, 'Bad request')
obj._draft = False
if obj.total <= 0:
obj._on_payment_success()
else:
cus = Customer._api_retrieve(obj.customer)
if cus._get_default_payment_method_or_source() is None:
raise UserError(404, 'This customer has no payment method')
pm = cus._get_default_payment_method_or_source()
pi = PaymentIntent(amount=obj.total,
currency=obj.currency,
customer=obj.customer,
payment_method=pm.id)
obj.payment_intent = pi.id
pi.invoice = obj.id
PaymentIntent._api_confirm(obj.payment_intent)
return obj
obj.next_action = None
if success:
obj._trigger_payment()
else:
obj._authentication_failed = True
obj.payment_method = None
if obj.invoice:
invoice = Invoice._api_retrieve(obj.invoice)
invoice._on_payment_failure_later()
return obj
extra_apis.extend((
('POST', '/v1/payment_intents/{id}/confirm', PaymentIntent._api_confirm),
('POST', '/v1/payment_intents/{id}/cancel', PaymentIntent._api_cancel),
('POST', '/v1/payment_intents/{id}/_authenticate',
PaymentIntent._api_authenticate)))
class PaymentMethod(StripeObject):
object = 'payment_method'
_id_prefix = 'pm_'
def __init__(self, type=None, billing_details=None, card=None,
sepa_debit=None, metadata=None, **kwargs):
if kwargs:
raise UserError(400, 'Unexpected ' + ', '.join(kwargs.keys()))
try:
assert type in ('card', 'sepa_debit')
def _api_void_invoice(cls, id):
obj = Invoice._api_retrieve(id)
if obj.status not in ('draft', 'open'):
raise UserError(400, 'Bad request')
PaymentIntent._api_cancel(obj.payment_intent)
obj._draft = False
obj._voided = True
obj.status_transitions['voided_at'] = int(time.time())
if obj.subscription:
sub = Subscription._api_retrieve(obj.subscription)
sub._on_initial_payment_voided(obj)
return obj
def status(self):
if self._draft:
return 'draft'
elif self._voided:
return 'void'
elif self.total <= 0:
return 'paid'
elif self.payment_intent:
pi = PaymentIntent._api_retrieve(self.payment_intent)
if pi.status == 'succeeded':
return 'paid'
elif pi.status == 'canceled':
return 'void'
return 'open'