handle posting form and receiving callbacks

This commit is contained in:
Frédéric Péters 2015-03-06 10:47:34 +01:00
parent 9f7c119560
commit 0f8313f633
3 changed files with 46 additions and 2 deletions

View File

@ -0,0 +1,15 @@
<html>
<head>
</head>
<body onload="document.forms[0].submit()">
<p>
Redirection de paiement en cours...
</p>
<form action="{{ form.url }}" method="{{ form.method }}" style="display: none">
{% for field in form.fields %}
<input type="{{ field.type }}" name="{{ field.name }}" value="{{ field.value }}"/>
{% endfor %}
<input type="submit">
</form>
</body>
</html>

View File

@ -16,11 +16,12 @@
from django.conf.urls import patterns, include, url
from .views import RegiesApiView, AddBasketItemApiView, PayView
from .views import RegiesApiView, AddBasketItemApiView, PayView, CallbackView
urlpatterns = patterns('',
url('^api/lingo/regies$', RegiesApiView.as_view(), name='api-regies'),
url('^api/lingo/add-basket-item$', AddBasketItemApiView.as_view(),
name='api-add-basket-item'),
url('^lingo/pay$', PayView.as_view(), name='lingo-pay'),
url('^lingo/callback/(?P<regie_pk>\w+)/$', CallbackView.as_view(), name='lingo-callback'),
)

View File

@ -14,11 +14,14 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import datetime
from decimal import Decimal
import json
from django.contrib.auth.models import User
from django.core.urlresolvers import reverse
from django.http import HttpResponse, HttpResponseRedirect
from django.template.response import TemplateResponse
from django.views.decorators.csrf import csrf_exempt
from django.views.generic import View, ListView
@ -96,8 +99,14 @@ class PayView(View):
regie = items[0].regie
payment = eopayment.Payment(regie.service, regie.service_options)
return_url = request.build_absolute_uri(
reverse('lingo-callback', kwargs={'regie_pk': regie.id}))
(order_id, kind, data) = payment.request(total_amount,
next_url=request.build_absolute_uri('/'))
next_url=request.build_absolute_uri('/'),
accepturl=return_url,
declineurl=return_url,
exceptionurl=return_url,
cancelurl=return_url)
transaction.order_id = order_id
transaction.save()
@ -105,5 +114,24 @@ class PayView(View):
if kind == eopayment.URL:
return HttpResponseRedirect(data)
elif kind == eopayment.FORM:
return TemplateResponse(request, 'lingo/payment_form.html', {'form': data})
raise NotImplementedError()
class CallbackView(View):
def get(self, request, *args, **kwargs):
regie = Regie.objects.get(id=kwargs.get('regie_pk'))
payment = eopayment.Payment(regie.service, regie.service_options)
payment_response = payment.response(request.environ['QUERY_STRING'])
assert payment_response.signed is True
assert payment_response.result == eopayment.PAID
transaction = Transaction.objects.get(order_id=payment_response.order_id)
transaction.bank_data = payment_response.bank_data
transaction.end_date = datetime.datetime.now()
transaction.save()
for item in transaction.items.all():
item.payment_date = transaction.end_date
item.save()
return HttpResponseRedirect('/')