From 386529960306c2c03477e66f68f4753ca497db49 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Sat, 4 Apr 2020 12:32:57 +0200 Subject: [PATCH 5/7] paybox: use transaction_date (#41320) --- eopayment/paybox.py | 27 ++++++++++++++++++++++++--- tests/test_paybox.py | 17 ++++++++++++----- 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/eopayment/paybox.py b/eopayment/paybox.py index d6d9332..f549c15 100644 --- a/eopayment/paybox.py +++ b/eopayment/paybox.py @@ -7,6 +7,9 @@ import logging import hashlib import hmac import requests + +import pytz + from decimal import Decimal, ROUND_DOWN from Crypto.Signature import PKCS1_v1_5 from Crypto.PublicKey import RSA @@ -273,7 +276,12 @@ class Payment(PaymentCommon): if orderid: d['PBX_CMD'] = orderid + ORDERID_TRANSACTION_SEPARATOR + d['PBX_CMD'] d['PBX_PORTEUR'] = force_text(email) - d['PBX_RETOUR'] = 'montant:M;reference:R;code_autorisation:A;erreur:E;numero_appel:T;numero_transaction:S;signature:K' + d['PBX_RETOUR'] = ( + 'montant:M;reference:R;code_autorisation:A;erreur:E;numero_appel:T;' + 'numero_transaction:S;' + 'date_transaction:W;heure_transaction:Q;' + 'signature:K' + ) d['PBX_HASH'] = 'SHA512' d['PBX_TIME'] = kwargs.get('time') or (force_text(datetime.datetime.utcnow().isoformat('T')).split('.')[0]+'+00:00') d['PBX_ARCHIVAGE'] = transaction_id @@ -325,7 +333,8 @@ class Payment(PaymentCommon): data = [] if callback: for key in ('montant', 'reference', 'code_autorisation', - 'erreur', 'numero_appel', 'numero_transaction'): + 'erreur', 'numero_appel', 'numero_transaction', + 'date_transaction', 'heure_transaction'): data.append('%s=%s' % (key, urllib.quote(d[key][0]))) else: for key, value in urlparse.parse_qsl(query_string, True, True): @@ -348,12 +357,24 @@ class Payment(PaymentCommon): # decode order id from returned reference if ORDERID_TRANSACTION_SEPARATOR in orderid: orderid, transaction_id = orderid.split(ORDERID_TRANSACTION_SEPARATOR, 1) + transaction_date = None + if 'date_transaction' in d and 'heure_transaction' in d: + try: + full_date_string = '%sT%s' % (d['date_transaction'][0], d['heure_transaction'][0]) + transaction_date = datetime.datetime.strptime(full_date_string, '%Y%m%dT%H:%M:%S') + except ValueError: + pass + else: + # We suppose it's the default timezone for Paybox + paris_tz = pytz.timezone('Europe/Paris') + transaction_date = paris_tz.localize(transaction_date) return PaymentResponse( order_id=orderid, signed=signed, bank_data=d, result=result, - bank_status=bank_status) + bank_status=bank_status, + transaction_date=transaction_date) def perform(self, amount, bank_data, operation): logger = logging.getLogger(__name__) diff --git a/tests/test_paybox.py b/tests/test_paybox.py index a503063..e87b0b2 100644 --- a/tests/test_paybox.py +++ b/tests/test_paybox.py @@ -61,14 +61,14 @@ class PayboxTests(TestCase): 'PBX_RANG': '01', 'PBX_SITE': '12345678', 'PBX_IDENTIFIANT': '12345678', - 'PBX_RETOUR': 'montant:M;reference:R;code_autorisation:A;erreur:E;numero_appel:T;numero_transaction:S;signature:K', + 'PBX_RETOUR': 'montant:M;reference:R;code_autorisation:A;erreur:E;numero_appel:T;numero_transaction:S;date_transaction:W;heure_transaction:Q;signature:K', 'PBX_TIME': time, 'PBX_PORTEUR': email, 'PBX_CMD': order_id + eopayment.common.ORDERID_TRANSACTION_SEPARATOR + transaction, 'PBX_TOTAL': amount.replace('.', ''), 'PBX_DEVISE': '978', 'PBX_HASH': 'SHA512', - 'PBX_HMAC': '6C70F35F9C6F6C9AB16D1E766EF981D241CB527C2E547205622DFFAF5B1B6C0F47E1DE2D3A1CE579F97AD19F87C3AE63E89B22F4B6D1E118685F5DD977891668', + 'PBX_HMAC': 'CE29AB421D9FF5E22B52A0F0D31BB881E6D3040B7A0B390AC3F335292A75D2389253A3ED6B3E430A90D30088F6AC29F792B484A2ECFC36A1B73771796A5FD15C', 'PBX_ARCHIVAGE': '1234', 'PBX_REPONDRE_A': 'http://example.com/callback', 'PBX_AUTOSEULE': 'N' @@ -83,7 +83,7 @@ class PayboxTests(TestCase): self.assertEqual(set(node.attrib.keys()), set(['type', 'name', 'value'])) name = node.attrib['name'] form_params[name] = node.attrib['value'] - self.assertEqual(form_params, expected_form_values) + assert form_params == expected_form_values def test_request_with_capture_day(self): params = BACKEND_PARAMS.copy() @@ -159,10 +159,17 @@ class PayboxTests(TestCase): order_id = '20160216' transaction = '1234' reference = order_id + eopayment.common.ORDERID_TRANSACTION_SEPARATOR + transaction - data = {'montant': '4242', 'reference': reference, - 'code_autorisation': 'A', 'erreur': '00000'} + data = { + 'montant': '4242', + 'reference': reference, + 'code_autorisation': 'A', + 'erreur': '00000', + 'date_transaction': '20200101', + 'heure_transaction': '01:01:01'} response = backend.response(urllib.urlencode(data)) self.assertEqual(response.order_id, order_id) + assert not response.signed + assert response.transaction_date.isoformat() == '2020-01-01T01:01:01+01:00' with self.assertRaisesRegexp(eopayment.ResponseError, 'missing erreur or reference'): backend.response('foo=bar') -- 2.24.0