lingo: use new eopayment common options for return/callback URLs (#9910)

This commit is contained in:
Frédéric Péters 2016-02-16 19:43:14 +01:00
parent 967a9c0681
commit 465729829e
2 changed files with 36 additions and 11 deletions

View File

@ -38,6 +38,17 @@ except ImportError:
from .models import Regie, BasketItem, Transaction
def get_eopayment_object(request, regie):
options = regie.service_options
options.update({
'automatic_return_url': request.build_absolute_uri(
reverse('lingo-callback', kwargs={'regie_pk': regie.id})),
'normal_return_url': request.build_absolute_uri(
reverse('lingo-return', kwargs={'regie_pk': regie.id})),
})
return eopayment.Payment(regie.service, options)
class RegiesApiView(ListView):
model = Regie
@ -157,12 +168,9 @@ class PayView(View):
if total_amount < regie.payment_min_amount:
return HttpResponseForbidden()
payment = eopayment.Payment(regie.service, regie.service_options)
return_url = request.build_absolute_uri(
reverse('lingo-callback', kwargs={'regie_pk': regie.id}))
payment = get_eopayment_object(request, regie)
(order_id, kind, data) = payment.request(total_amount,
email=request.user.email,
next_url=return_url)
email=request.user.email)
transaction.order_id = order_id
transaction.save()
if next_url:
@ -184,7 +192,7 @@ class PayView(View):
class CallbackView(View):
def handle_callback(self, request, backend_response, **kwargs):
regie = Regie.objects.get(id=kwargs.get('regie_pk'))
payment = eopayment.Payment(regie.service, regie.service_options)
payment = get_eopayment_object(request, regie)
payment_response = payment.response(backend_response)
if not payment_response.result == eopayment.CANCELLED:
# cancellation are not signed...
@ -229,12 +237,21 @@ class CallbackView(View):
class ReturnView(View):
@csrf_exempt
def dispatch(self, *args, **kwargs):
return super(ReturnView, self).dispatch(*args, **kwargs)
def get(self, request, *args, **kwargs):
return self.handle_return(request, request.environ['QUERY_STRING'], **kwargs)
def post(self, request, *args, **kwargs):
return self.handle_return(request, request.body, **kwargs)
def handle_return(self, request, backend_response, **kwargs):
regie = Regie.objects.get(id=kwargs.get('regie_pk'))
payment = eopayment.Payment(regie.service, regie.service_options)
payment = get_eopayment_object(request, regie)
try:
payment_response = payment.response(request.environ['QUERY_STRING'])
payment_response = payment.response(backend_response)
except:
# if eopayment can't get response from query string redirect to
# homepage

View File

@ -81,8 +81,15 @@ def test_successfull_items_payment(regie, user):
qs = urlparse.parse_qs(parsed.query)
args = {'transaction_id': qs['transaction_id'][0], 'signed': True,
'ok': True, 'reason': 'Paid'}
# simulate backend callback call
# make sure return url is the user return URL
assert urlparse.urlparse(qs['return_url'][0]).path.startswith(
reverse('lingo-return', kwargs={'regie_pk': regie.id}))
# simulate successful return URL
resp = client.get(qs['return_url'][0], args)
assert resp.status_code == 302
assert urlparse.urlparse(resp.url).path == '/'
# simulate successful call to callback URL
resp = client.get(reverse('lingo-callback', kwargs={'regie_pk': regie.id}), args)
assert resp.status_code == 200
def test_add_amount_to_basket(regie, user):
@ -130,7 +137,8 @@ def test_payment_callback(regie, user):
'amount': qs['amount'][0], 'ok': True}
# call callback with GET
get_resp = client.get(qs['return_url'][0], data)
callback_url = reverse('lingo-callback', kwargs={'regie_pk': regie.id})
get_resp = client.get(callback_url, data)
assert get_resp.status_code == 200
assert Transaction.objects.get(order_id=transaction_id).status == 3
@ -145,7 +153,7 @@ def test_payment_callback(regie, user):
'amount': qs['amount'][0], 'ok': True}
# call callback with POST
post_resp = client.post(qs['return_url'][0], urllib.urlencode(data),
post_resp = client.post(callback_url, urllib.urlencode(data),
content_type='text/html')
assert post_resp.status_code == 200
assert Transaction.objects.get(order_id=transaction_id).status == 3