summaryrefslogtreecommitdiff
path: root/payments/stripe/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'payments/stripe/__init__.py')
-rw-r--r--payments/stripe/__init__.py50
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