diff options
Diffstat (limited to 'payments/stripe/__init__.py')
-rw-r--r-- | payments/stripe/__init__.py | 50 |
1 files changed, 37 insertions, 13 deletions
diff --git a/payments/stripe/__init__.py b/payments/stripe/__init__.py index 6a60f06..55be5ee 100644 --- a/payments/stripe/__init__.py +++ b/payments/stripe/__init__.py @@ -1,36 +1,60 @@ from __future__ import unicode_literals +from decimal import Decimal -from django.core.exceptions import ImproperlyConfigured +import stripe - -from .forms import PaymentForm -from .. import RedirectNeeded +from .forms import ModalPaymentForm, PaymentForm +from .. import RedirectNeeded, PaymentError from ..core import BasicProvider class StripeProvider(BasicProvider): + form_class = ModalPaymentForm + def __init__(self, public_key, secret_key, image='', name='', **kwargs): + stripe.api_key = secret_key self.secret_key = secret_key self.public_key = public_key self.image = image self.name = name super(StripeProvider, self).__init__(**kwargs) - if not self._capture: - raise ImproperlyConfigured( - 'Stripe does not support pre-authorization.') def get_form(self, payment, data=None): if payment.status == 'waiting': payment.change_status('input') - kwargs = { - 'data': data, - 'payment': payment, - 'provider': self, - 'hidden_inputs': False} - form = PaymentForm(**kwargs) + form = self.form_class( + data=data, payment=payment, provider=self) if form.is_valid(): form.save() raise RedirectNeeded(payment.get_success_url()) return form + + def capture(self, payment, amount=None): + amount = int((amount or payment.total) * 100) + charge = stripe.Charge.retrieve(payment.transaction_id) + try: + charge.capture(amount=amount) + except stripe.InvalidRequestError as e: + payment.change_status('refunded') + raise PaymentError('Payment already refunded') + payment.attrs.capture = stripe.util.json.dumps(charge) + return Decimal(amount) / 100 + + def release(self, payment): + charge = stripe.Charge.retrieve(payment.transaction_id) + charge.refund() + payment.attrs.release = stripe.util.json.dumps(charge) + + def refund(self, payment, amount=None): + amount = int((amount or payment.total) * 100) + charge = stripe.Charge.retrieve(payment.transaction_id) + charge.refund(amount=amount) + payment.attrs.refund = stripe.util.json.dumps(charge) + return Decimal(amount) / 100 + + +class StripeCardProvider(StripeProvider): + + form_class = PaymentForm |