summaryrefslogtreecommitdiff
path: root/payments/dotpay
diff options
context:
space:
mode:
authorMichal Ociepka <michal@ociepka.info>2013-04-25 17:37:32 +0200
committerMichal Ociepka <michal@ociepka.info>2013-04-25 17:37:32 +0200
commitd9a24c37bdf9b34dd0c23b0506aa4dbab08cc34e (patch)
tree9b60521774a05bb45926fff4298d1ca380f2ecf9 /payments/dotpay
parent3d9be786756c981d07d1d9d32358f3986143a9cc (diff)
downloaddjango-payments-taler-d9a24c37bdf9b34dd0c23b0506aa4dbab08cc34e.tar.gz
django-payments-taler-d9a24c37bdf9b34dd0c23b0506aa4dbab08cc34e.tar.bz2
django-payments-taler-d9a24c37bdf9b34dd0c23b0506aa4dbab08cc34e.zip
Improve dotpay
Diffstat (limited to 'payments/dotpay')
-rw-r--r--payments/dotpay/__init__.py81
-rw-r--r--payments/dotpay/forms.py90
2 files changed, 68 insertions, 103 deletions
diff --git a/payments/dotpay/__init__.py b/payments/dotpay/__init__.py
index e01d8b6..6279f2b 100644
--- a/payments/dotpay/__init__.py
+++ b/payments/dotpay/__init__.py
@@ -1,14 +1,8 @@
-# -*- coding: utf-8 -*-
-import urlparse
-
-from django.contrib.sites.models import Site
-from django.core.urlresolvers import reverse
+from .. import BasicProvider, get_payment_model
+from .forms import ProcessPaymentForm
from django.http import HttpResponse, HttpResponseForbidden
-from .. import BasicProvider
-from ..models import Payment
-
-from .forms import ProcessPaymentForm
+Payment = get_payment_model()
class DotpayProvider(BasicProvider):
@@ -32,59 +26,38 @@ class DotpayProvider(BasicProvider):
_method = 'post'
_action = 'https://ssl.dotpay.pl/'
- def __init__(self, seller_id, url, domain=None, pin=None, channel=0,
- lang='pl', lock=False, **kwargs):
- self._seller_id = seller_id
- self._url = url
- self._domain = (domain or
- urlparse.urlunparse(('https',
- Site.objects.get_current().domain,
- '/', None, None, None)))
- self._pin = pin
- self._channel = channel
- self._lang = lang
- self._lock = lock
- return super(DotpayProvider, self).__init__(**kwargs)
-
- def get_hidden_fields(self, payment):
- get_label = (lambda x: x.name if x.quantity == 1
- else u'%s × %d' % (x.name, x.quantity))
- items = map(get_label, payment.items.all())
- domain = urlparse.urlparse(self._domain)
- path = reverse('process_payment', args=[self._variant])
- urlc = urlparse.urlunparse((domain.scheme, domain.netloc, path,
- None, None, None))
- url_parts = urlparse.urlparse(self._url)
- if url_parts.scheme:
- url = self._url
- else:
- url = urlparse.urlunparse((domain.scheme, domain.netloc,
- url_parts.path, None, None, None))
+ def __init__(self, *args, **kwargs):
+ self._seller_id = kwargs.pop('seller_id')
+ self._pin = kwargs.pop('pin')
+ self._channel = kwargs.pop('channel', 0)
+ self._lang = kwargs.pop('lang', 'pl')
+ self._lock = kwargs.pop('lock', False)
+ super(DotpayProvider, self).__init__(*args, **kwargs)
+
+ def get_hidden_fields(self,):
+ self.payment.save()
+ description = '; '.join(['%(quantity)dx %(name)s (%(sku)s), '
+ '%(price)f %(currency)s' % order._asdict()
+ for order in self.order_items])
data = {
'id': self._seller_id,
- 'amount': str(payment.total),
- 'control': str(payment.id),
- 'currency': payment.currency,
- 'description': ', '.join(items),
+ 'amount': str(self.payment.total),
+ 'control': str(self.payment.id),
+ 'currency': self.payment.currency,
+ 'description': description,
'lang': self._lang,
'channel': str(self._channel),
'ch_lock': '1' if self._lock else '0',
- 'URL': url,
- 'URLC': urlc,
- 'type': '2',
- 'control': payment.id,
+ 'URL': self.payment.get_success_url(),
+ 'URLC': self.get_return_url(),
+ 'type': '2'
}
return data
def process_data(self, request):
- from django.core.mail import mail_admins
- variables = unicode(request.POST) + '\n' + unicode(request.GET)
- mail_admins('Payment', variables)
- failed = HttpResponseForbidden("FAILED")
- if request.method != "POST":
- return failed
- form = ProcessPaymentForm(pin=self._pin, data=request.POST)
+ form = ProcessPaymentForm(payment=self.payment, pin=self._pin,
+ data=request.POST or None)
if not form.is_valid():
- return failed
+ return HttpResponseForbidden('FAILED')
form.save()
- return HttpResponse("OK")
+ return HttpResponse('OK')
diff --git a/payments/dotpay/forms.py b/payments/dotpay/forms.py
index 54040f4..938d6d5 100644
--- a/payments/dotpay/forms.py
+++ b/payments/dotpay/forms.py
@@ -1,19 +1,17 @@
-# -*- coding:utf-8 -*-
from django import forms
-from django.utils.translation import ugettext as _
-from django.db.models import Q
+from .. import get_payment_model
import md5
-from ..models import Payment
+Payment = get_payment_model()
-NO_MORE_CONFIRMATION=0
-NEW=1
-ACCEPTED=2
-REJECTED=3
-CANCELED=4
+NO_MORE_CONFIRMATION = 0
+NEW = 1
+ACCEPTED = 2
+REJECTED = 3
+CANCELED = 4
-STATUS_CHOICES = map(lambda c: (c,c), (
+STATUS_CHOICES = map(lambda c: (c, c), (
NO_MORE_CONFIRMATION,
NEW,
ACCEPTED,
@@ -21,18 +19,12 @@ STATUS_CHOICES = map(lambda c: (c,c), (
CANCELED
))
+
class ProcessPaymentForm(forms.Form):
- status = forms.ChoiceField(choices=(("OK","OK"),("FAIL","FAIL")))
+
+ status = forms.ChoiceField(choices=(('OK', 'OK'), ('FAIL', 'FAIL')))
id = forms.IntegerField()
- #this should be Payments modelchoicefield
control = forms.IntegerField()
- #control = forms.TypedChoiceField(
- # choices = [ (id,id) for id in Payment.objects.exclude(
- # Q(status='rejected')
- # ).values_list("id", flat=True)
- # ],
- # coerce=int,
- #)
t_id = forms.CharField()
amount = forms.DecimalField()
email = forms.EmailField(required=False)
@@ -40,41 +32,41 @@ class ProcessPaymentForm(forms.Form):
description = forms.CharField(required=False)
md5 = forms.CharField()
- def __init__(self, pin, **kwargs):
+ def __init__(self, payment, pin, **kwargs):
super(ProcessPaymentForm, self).__init__(**kwargs)
self.pin = pin
+ self.payment = payment
def clean(self):
- vars = {
- "pin": self.pin,
- "id": self.cleaned_data['id'],
- "control": self.cleaned_data["control"],
- "t_id": self.cleaned_data["t_id"],
- "amount": self.cleaned_data["amount"],
- "email": self.cleaned_data.get("email", ""),
- "service": "",
- "code": "",
- "username": "",
- "password": "",
- "t_status": self.cleaned_data["t_status"]
- }
-
- key = "%(pin)s:%(id)s:%(control)s:%(t_id)s:%(amount)s:%(email)s:%(service)s:%(code)s:%(username)s:%(password)s:%(t_status)s" % vars
- hash = md5.new(key).hexdigest()
- if hash != self.cleaned_data["md5"]:
- raise forms.ValidationError()
- return self.cleaned_data
+ cleaned_data = super(ProcessPaymentForm, self).clean()
+ if not self.errors:
+ key_vars = (
+ self.pin,
+ cleaned_data['id'],
+ cleaned_data['control'],
+ cleaned_data['t_id'],
+ cleaned_data['amount'],
+ cleaned_data.get('email', ''),
+ '', # service
+ '', # code
+ '', # username
+ '', # password
+ cleaned_data['t_status'])
+ key = ':'.join(key_vars)
+ key_hash = md5.new(key).hexdigest()
+ if key_hash != self.cleaned_data['md5']:
+ self._errors['md5'] = self.error_class(['Bad hash'])
+ if cleaned_data['control'] != self.payment.id:
+ self._errors['control'] = self.error_class(['Bad payment id'])
+ return cleaned_data
def save(self, *args, **kwargs):
- payment_id = self.cleaned_data['control']
status = self.cleaned_data['t_status']
-
- payment = Payment.objects.get(id=payment_id)
- payment.transaction_id = self.cleaned_data['t_id']
- payment.save()
-
+ self.payment.transaction_id = self.cleaned_data['t_id']
+ self.payment.save()
+ payment_status = self.payment.status
if status == ACCEPTED:
- payment.change_status('confirmed')
- elif (status == NO_MORE_CONFIRMATION and payment.status == 'waiting') \
- or status == REJECTED or status == CANCELED:
- payment.change_status('rejected')
+ self.payment.change_status('confirmed')
+ elif ((status == NO_MORE_CONFIRMATION and payment_status == 'waiting')
+ or status == REJECTED or status == CANCELED):
+ self.payment.change_status('rejected')