sips2: use transaction_date (#41320)

This commit is contained in:
Benjamin Dauvergne 2020-04-04 13:04:58 +02:00
parent a3307e0a47
commit baa769d498
2 changed files with 28 additions and 2 deletions

View File

@ -1,5 +1,6 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import datetime
from decimal import Decimal from decimal import Decimal
from gettext import gettext as _ from gettext import gettext as _
import collections import collections
@ -14,6 +15,8 @@ from six.moves.urllib import parse as urlparse
import requests import requests
import pytz
from .common import (PaymentCommon, FORM, Form, PaymentResponse, PAID, ERROR, from .common import (PaymentCommon, FORM, Form, PaymentResponse, PAID, ERROR,
CANCELED, ResponseError, force_text) CANCELED, ResponseError, force_text)
@ -137,6 +140,12 @@ class Payment(PaymentCommon):
'name': 'payment_means', 'name': 'payment_means',
'caption': _('Payment Means'), 'caption': _('Payment Means'),
'required': False 'required': False
},
{
'name': 'timezone',
'caption': _('SIPS server Timezone'),
'default': 'Europe/Paris',
'required': False,
} }
], ],
} }
@ -243,6 +252,15 @@ class Payment(PaymentCommon):
result = self.response_code_to_result.get(response_code, ERROR) result = self.response_code_to_result.get(response_code, ERROR)
merchant_id = data.get('merchantId') merchant_id = data.get('merchantId')
test = merchant_id == self.TEST_MERCHANT_ID test = merchant_id == self.TEST_MERCHANT_ID
transaction_date = None
if 'transactionDateTime' in data:
try:
transaction_date = datetime.datetime.strptime(data['transactionDateTime'], '%Y-%m-%d %H:%M:%S')
except (ValueError, TypeError):
pass
else:
sips_tz = pytz.timezone(self.timezone)
transaction_date = sips_tz.localize(transaction_date)
return PaymentResponse( return PaymentResponse(
result=result, result=result,
signed=signed, signed=signed,
@ -250,7 +268,8 @@ class Payment(PaymentCommon):
order_id=transaction_id, order_id=transaction_id,
transaction_id=data.get('authorisationId'), transaction_id=data.get('authorisationId'),
bank_status=self.RESPONSE_CODES.get(response_code, u'unknown code - ' + response_code), bank_status=self.RESPONSE_CODES.get(response_code, u'unknown code - ' + response_code),
test=test) test=test,
transaction_date=transaction_date)
def get_seal_for_json_ws_data(self, data): def get_seal_for_json_ws_data(self, data):
data_to_send = [] data_to_send = []

View File

@ -37,7 +37,14 @@ def test_options():
def test_parse_response(): def test_parse_response():
qs = '''Data=captureDay%3D0%7CcaptureMode%3DAUTHOR_CAPTURE%7CcurrencyCode%3D978%7CmerchantId%3D002001000000001%7CorderChannel%3DINTERNET%7CresponseCode%3D00%7CtransactionDateTime%3D2016-02-01T17%3A44%3A20%2B01%3A00%7CtransactionReference%3D668930%7CkeyVersion%3D1%7CacquirerResponseCode%3D00%7Camount%3D1200%7CauthorisationId%3D12345%7CcardCSCResultCode%3D4E%7CpanExpiryDate%3D201605%7CpaymentMeanBrand%3DMASTERCARD%7CpaymentMeanType%3DCARD%7CcustomerIpAddress%3D82.244.203.243%7CmaskedPan%3D5100%23%23%23%23%23%23%23%23%23%23%23%2300%7CorderId%3Dd4903de7027f4d56ac01634fd7ab9526%7CholderAuthentRelegation%3DN%7CholderAuthentStatus%3D3D_ERROR%7CtransactionOrigin%3DINTERNET%7CpaymentPattern%3DONE_SHOT&Seal=6ca3247765a19b45d25ad54ef4076483e7d55583166bd5ac9c64357aac097602&InterfaceVersion=HP_2.0&Encode=''' qs = '''Data=captureDay%3D0%7CcaptureMode%3DAUTHOR_CAPTURE%7CcurrencyCode%3D978%7CmerchantId%3D002001000000001%7CorderChannel%3DINTERNET%7CresponseCode%3D00%7CtransactionDateTime%3D2016-02-01T17%3A44%3A20%2B01%3A00%7CtransactionReference%3D668930%7CkeyVersion%3D1%7CacquirerResponseCode%3D00%7Camount%3D1200%7CauthorisationId%3D12345%7CcardCSCResultCode%3D4E%7CpanExpiryDate%3D201605%7CpaymentMeanBrand%3DMASTERCARD%7CpaymentMeanType%3DCARD%7CcustomerIpAddress%3D82.244.203.243%7CmaskedPan%3D5100%23%23%23%23%23%23%23%23%23%23%23%2300%7CorderId%3Dd4903de7027f4d56ac01634fd7ab9526%7CholderAuthentRelegation%3DN%7CholderAuthentStatus%3D3D_ERROR%7CtransactionOrigin%3DINTERNET%7CpaymentPattern%3DONE_SHOT&Seal=6ca3247765a19b45d25ad54ef4076483e7d55583166bd5ac9c64357aac097602&InterfaceVersion=HP_2.0&Encode='''
backend = eopayment.Payment('sips2', {}) backend = eopayment.Payment('sips2', {})
assert backend.response(qs) response = backend.response(qs)
assert response.signed
assert response.transaction_date is None
qs = '''Data=captureDay%3D0%7CcaptureMode%3DAUTHOR_CAPTURE%7CcurrencyCode%3D978%7CmerchantId%3D002001000000001%7CorderChannel%3DINTERNET%7CresponseCode%3D00%7CtransactionDateTime%3D2016-02-01T17%3A44%3A20%2B01%3A00%7CtransactionReference%3D668930%7CkeyVersion%3D1%7CacquirerResponseCode%3D00%7Camount%3D1200%7CauthorisationId%3D12345%7CcardCSCResultCode%3D4E%7CpanExpiryDate%3D201605%7CpaymentMeanBrand%3DMASTERCARD%7CpaymentMeanType%3DCARD%7CcustomerIpAddress%3D82.244.203.243%7CmaskedPan%3D5100%23%23%23%23%23%23%23%23%23%23%23%2300%7CorderId%3Dd4903de7027f4d56ac01634fd7ab9526%7CholderAuthentRelegation%3DN%7CholderAuthentStatus%3D3D_ERROR%7CtransactionOrigin%3DINTERNET%7CpaymentPattern%3DONE_SHOT%7CtransactionDateTime%3D2020-01-01%2001:01:01&Seal=6ca3247765a19b45d25ad54ef4076483e7d55583166bd5ac9c64357aac097602&InterfaceVersion=HP_2.0&Encode='''
response = backend.response(qs)
assert not response.signed
assert response.transaction_date.isoformat() == '2020-01-01T01:01:01+01:00'
with pytest.raises(eopayment.ResponseError, match='missing Data, Seal or InterfaceVersion'): with pytest.raises(eopayment.ResponseError, match='missing Data, Seal or InterfaceVersion'):
backend.response('foo=bar') backend.response('foo=bar')