Skip to content

Commit 5c5e854

Browse files
committed
cleanup
1 parent 1cf63e9 commit 5c5e854

File tree

6 files changed

+217
-216
lines changed

6 files changed

+217
-216
lines changed

redsys/client.py

Lines changed: 44 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,96 +1,98 @@
11
# -*- coding: utf-8 -*-
2-
import sys
3-
import re
4-
import hashlib
5-
import json
62
import base64
3+
import hashlib
74
import hmac
8-
from Crypto.Cipher import DES3
5+
import json
6+
import re
7+
import sys
98
from abc import ABCMeta, abstractmethod
10-
from . import currencies, languages, transactions
11-
from .response import Response
12-
from .request import Request
139

10+
from Crypto.Cipher import DES3
11+
12+
from .request import Request
13+
from .response import Response
1414

1515
# Calculated parameters
16-
SIGNATURE_VERSION = 'Ds_SignatureVersion'
17-
MERCHANT_PARAMETERS = 'Ds_MerchantParameters'
18-
SIGNATURE = 'Ds_Signature'
19-
DEFAULT_SIGNATURE_VERSION = 'HMAC_SHA256_V1'
16+
SIGNATURE_VERSION = "Ds_SignatureVersion"
17+
MERCHANT_PARAMETERS = "Ds_MerchantParameters"
18+
SIGNATURE = "Ds_Signature"
19+
DEFAULT_SIGNATURE_VERSION = "HMAC_SHA256_V1"
2020

2121

2222
class Client(object):
23-
24-
REAL_ENDPOINT = None
25-
TEST_ENDPOINT = None
26-
27-
secret_key = None
28-
endpoint = None
29-
3023
__metaclass__ = ABCMeta
3124

32-
def __init__(self, secret_key, sandbox=False):
25+
def __init__(self, secret_key=None, sandbox=False):
3326
self.secret_key = secret_key
3427
self.endpoint = self.TEST_ENDPOINT if sandbox else self.REAL_ENDPOINT
3528

3629
def create_request(self):
3730
return Request()
3831

3932
@abstractmethod
40-
def create_response(self, signature, parameters, signature_version=DEFAULT_SIGNATURE_VERSION):
33+
def create_response(
34+
self, signature, parameters, signature_version=DEFAULT_SIGNATURE_VERSION
35+
):
4136
raise NotImplemented
4237

4338
@abstractmethod
4439
def prepare_request(self, request):
4540
raise NotImplemented
4641

4742
def encode_parameters(self, parameters):
48-
return base64.b64encode(json.dumps(parameters).encode('utf-8'))
43+
return base64.b64encode(json.dumps(parameters).encode("utf-8"))
4944

5045
def decode_parameters(self, parameters):
51-
return json.loads(base64.b64decode(parameters).decode('utf-8'))
46+
return json.loads(base64.b64decode(parameters).decode("utf-8"))
5247

5348
def encrypt_3DES(self, order):
54-
pycrypto = DES3.new(base64.b64decode(self.secret_key), DES3.MODE_CBC, IV=b'\0\0\0\0\0\0\0\0')
55-
if (sys.version_info > (3,0)):
56-
order_padded = order.ljust(16, u'\x00')
49+
pycrypto = DES3.new(
50+
base64.b64decode(self.secret_key), DES3.MODE_CBC, IV=b"\0\0\0\0\0\0\0\0"
51+
)
52+
if sys.version_info > (3, 0):
53+
order_padded = order.ljust(16, u"\x00")
5754
else:
58-
order_padded = order.ljust(16, b'\0')
55+
order_padded = order.ljust(16, b"\0")
5956

6057
return pycrypto.encrypt(order_padded)
6158

6259
def sign_hmac256(self, encrypted_order, merchant_parameters):
63-
signature = hmac.new(encrypted_order, merchant_parameters, hashlib.sha256).digest()
60+
signature = hmac.new(
61+
encrypted_order, merchant_parameters, hashlib.sha256
62+
).digest()
6463
return base64.b64encode(signature)
6564

6665
def generate_signature(self, order, merchant_parameters):
6766
return self.sign_hmac256(self.encrypt_3DES(order), merchant_parameters)
6867

6968

7069
class RedirectClient(Client):
71-
REAL_ENDPOINT = u'https://sis.redsys.es/sis/realizarPago'
72-
TEST_ENDPOINT = u'https://sis-t.redsys.es:25443/sis/realizarPago'
73-
74-
def create_response(self, signature, merchant_parameters, signature_version=DEFAULT_SIGNATURE_VERSION):
70+
def create_response(
71+
self,
72+
signature,
73+
merchant_parameters,
74+
signature_version=DEFAULT_SIGNATURE_VERSION,
75+
):
7576
response = Response(self.decode_parameters(merchant_parameters))
76-
calculated_signature = self.generate_signature(response.order, merchant_parameters.encode('utf-8'))
77-
alphanum = re.compile('[^a-zA-Z0-9]')
78-
safe_signature = re.sub(alphanum, '', signature)
79-
safe_calculated_signature = re.sub(alphanum, '', calculated_signature.decode('utf-8'))
77+
calculated_signature = self.generate_signature(
78+
response.order, merchant_parameters.encode("utf-8")
79+
)
80+
alphanum = re.compile("[^a-zA-Z0-9]")
81+
safe_signature = re.sub(alphanum, "", signature)
82+
safe_calculated_signature = re.sub(
83+
alphanum, "", calculated_signature.decode("utf-8")
84+
)
8085
if safe_signature != safe_calculated_signature:
8186
raise ValueError("The provided signature is not valid.")
8287
return response
8388

8489
def prepare_request(self, request):
8590
merchant_parameters = self.encode_parameters(request.prepare_parameters())
86-
signature = self.sign_hmac256(self.encrypt_3DES(request.order), merchant_parameters)
91+
signature = self.sign_hmac256(
92+
self.encrypt_3DES(request.order), merchant_parameters
93+
)
8794
return {
8895
SIGNATURE_VERSION: DEFAULT_SIGNATURE_VERSION,
8996
MERCHANT_PARAMETERS: merchant_parameters,
9097
SIGNATURE: signature,
9198
}
92-
93-
94-
class DirectClient(Client):
95-
REAL_ENDPOINT = u'https://sis.redsys.es/sis/services/SerClsWSEntrada'
96-
TEST_ENDPOINT = u'https://sis-t.redsys.es:25443/sis/services/SerClsWSEntrada'

redsys/currencies.py

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -45,20 +45,4 @@
4545
""" Turkish lira """
4646
TRY = 949
4747

48-
CURRENCIES = [
49-
EUR,
50-
USD,
51-
GBP,
52-
JPY,
53-
ARS,
54-
CAD,
55-
CLP,
56-
COP,
57-
INR,
58-
MXN,
59-
PEN,
60-
CHF,
61-
BRL,
62-
VEF,
63-
TRY
64-
]
48+
CURRENCIES = [EUR, USD, GBP, JPY, ARS, CAD, CLP, COP, INR, MXN, PEN, CHF, BRL, VEF, TRY]

redsys/languages.py

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
# -*- coding: utf-8 -*-
22

3-
CUSTOMER = '000'
4-
SPANISH = '001'
5-
ENGLISH = '002'
6-
CATALAN = '003'
7-
FRENCH = '004'
8-
GERMAN = '005'
9-
DUTCH = '006'
10-
ITALIAN = '007'
11-
SWEDISH = '008'
12-
PORTUGUESE = '009'
13-
VALENCIAN = '010'
14-
POLISH = '011'
15-
GALICIAN = '012'
16-
EUSKERA = '013'
3+
CUSTOMER = "000"
4+
SPANISH = "001"
5+
ENGLISH = "002"
6+
CATALAN = "003"
7+
FRENCH = "004"
8+
GERMAN = "005"
9+
DUTCH = "006"
10+
ITALIAN = "007"
11+
SWEDISH = "008"
12+
PORTUGUESE = "009"
13+
VALENCIAN = "010"
14+
POLISH = "011"
15+
GALICIAN = "012"
16+
EUSKERA = "013"
1717

1818
LANGUAGES = [
1919
CUSTOMER,
@@ -29,5 +29,5 @@
2929
VALENCIAN,
3030
POLISH,
3131
GALICIAN,
32-
EUSKERA
32+
EUSKERA,
3333
]

redsys/request.py

Lines changed: 50 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,65 @@
11
import re
22
from decimal import Decimal
3-
from .transactions import TRANSACTION_TYPES
3+
44
from .currencies import CURRENCIES
55
from .languages import LANGUAGES
6+
from .transactions import TRANSACTION_TYPES
67

78
# General parameters
8-
MERCHANT_CODE = 'Ds_Merchant_MerchantCode'
9-
TERMINAL = 'Ds_Merchant_Terminal'
10-
TRANSACTION_TYPE = 'Ds_Merchant_TransactionType'
11-
ORDER = 'Ds_Merchant_Order'
12-
CURRENCY = 'Ds_Merchant_Currency'
13-
AMOUNT = 'Ds_Merchant_Amount'
9+
MERCHANT_CODE = "Ds_Merchant_MerchantCode"
10+
TERMINAL = "Ds_Merchant_Terminal"
11+
TRANSACTION_TYPE = "Ds_Merchant_TransactionType"
12+
ORDER = "Ds_Merchant_Order"
13+
CURRENCY = "Ds_Merchant_Currency"
14+
AMOUNT = "Ds_Merchant_Amount"
1415

1516
# Recurring transaction parameters
16-
SUM_TOTAL = 'Ds_Merchant_SumTotal'
17-
DATE_FREQUENCY = 'Ds_Merchant_DateFrecuency'
18-
CHARGE_EXPIRY_DATE = 'Ds_Merchant_ChargeExpiryDate'
19-
TRANSACTION_DATE = 'Ds_Merchant_TransactionDate'
20-
AUTHORIZATION_CODE = 'Ds_Merchant_AuthorisationCode'
17+
SUM_TOTAL = "Ds_Merchant_SumTotal"
18+
DATE_FREQUENCY = "Ds_Merchant_DateFrecuency"
19+
CHARGE_EXPIRY_DATE = "Ds_Merchant_ChargeExpiryDate"
20+
TRANSACTION_DATE = "Ds_Merchant_TransactionDate"
21+
AUTHORIZATION_CODE = "Ds_Merchant_AuthorisationCode"
2122

2223
# Not required parameters
23-
MERCHANT_DATA = 'Ds_Merchant_MerchantData'
24+
MERCHANT_DATA = "Ds_Merchant_MerchantData"
2425

2526
# Redirect client paramenters
26-
MERCHANT_NAME = 'Ds_Merchant_MerchantName'
27-
PRODUCT_DESCRIPTION = 'Ds_Merchant_ProductDescription'
28-
TITULAR = 'Ds_Merchant_Titular'
29-
MERCHANT_URL = 'Ds_Merchant_MerchantURL'
30-
URL_OK = 'Ds_Merchant_UrlOK'
31-
URL_KO = 'Ds_Merchant_UrlKO'
32-
CONSUMER_LANGUAGE = 'Ds_Merchant_ConsumerLanguage'
27+
MERCHANT_NAME = "Ds_Merchant_MerchantName"
28+
PRODUCT_DESCRIPTION = "Ds_Merchant_ProductDescription"
29+
TITULAR = "Ds_Merchant_Titular"
30+
MERCHANT_URL = "Ds_Merchant_MerchantURL"
31+
URL_OK = "Ds_Merchant_UrlOK"
32+
URL_KO = "Ds_Merchant_UrlKO"
33+
CONSUMER_LANGUAGE = "Ds_Merchant_ConsumerLanguage"
3334

3435
# Credit card data parameters
35-
PAN = 'Ds_Merchant_Pan'
36-
EXPIRY_DATE = 'Ds_Merchant_ExpiryDate'
37-
CVV2 = 'Ds_Merchant_Cvv2'
36+
PAN = "Ds_Merchant_Pan"
37+
EXPIRY_DATE = "Ds_Merchant_ExpiryDate"
38+
CVV2 = "Ds_Merchant_Cvv2"
3839

3940
MERCHANT_PARAMETERS_MAP = {
40-
'merchant_code': MERCHANT_CODE,
41-
'terminal': TERMINAL,
42-
'transaction_type': TRANSACTION_TYPE,
43-
'order': ORDER,
44-
'currency': CURRENCY,
45-
'amount': AMOUNT,
46-
'sum_total': SUM_TOTAL,
47-
'date_frequency': DATE_FREQUENCY,
48-
'charge_expiry_date': CHARGE_EXPIRY_DATE,
49-
'transaction_date': TRANSACTION_DATE,
50-
'authorization_code': AUTHORIZATION_CODE,
51-
'merchant_data': MERCHANT_DATA,
52-
'merchant_name': MERCHANT_NAME,
53-
'product_description': PRODUCT_DESCRIPTION,
54-
'titular': TITULAR,
55-
'merchant_url': MERCHANT_URL,
56-
'url_ok': URL_OK,
57-
'url_ko': URL_KO,
58-
'consumer_language': CONSUMER_LANGUAGE,
59-
'pan': PAN,
60-
'expiry_date': EXPIRY_DATE,
61-
'cvv2': CVV2
41+
"merchant_code": MERCHANT_CODE,
42+
"terminal": TERMINAL,
43+
"transaction_type": TRANSACTION_TYPE,
44+
"order": ORDER,
45+
"currency": CURRENCY,
46+
"amount": AMOUNT,
47+
"sum_total": SUM_TOTAL,
48+
"date_frequency": DATE_FREQUENCY,
49+
"charge_expiry_date": CHARGE_EXPIRY_DATE,
50+
"transaction_date": TRANSACTION_DATE,
51+
"authorization_code": AUTHORIZATION_CODE,
52+
"merchant_data": MERCHANT_DATA,
53+
"merchant_name": MERCHANT_NAME,
54+
"product_description": PRODUCT_DESCRIPTION,
55+
"titular": TITULAR,
56+
"merchant_url": MERCHANT_URL,
57+
"url_ok": URL_OK,
58+
"url_ko": URL_KO,
59+
"consumer_language": CONSUMER_LANGUAGE,
60+
"pan": PAN,
61+
"expiry_date": EXPIRY_DATE,
62+
"cvv2": CVV2,
6263
}
6364

6465

@@ -67,6 +68,7 @@ class Request(object):
6768
Defines an atomic request with all the required parameters and sanitize
6869
their values according to the platform specifications
6970
"""
71+
7072
_parameters = {}
7173

7274
def __getattr__(self, item):
@@ -84,7 +86,9 @@ def prepare_parameters(self):
8486
parameters = {}
8587
for key, value in self._parameters.items():
8688
prepare = getattr(self, "prepare_%s" % key, None)
87-
parameters[MERCHANT_PARAMETERS_MAP[key]] = prepare(value) if prepare else value
89+
parameters[MERCHANT_PARAMETERS_MAP[key]] = (
90+
prepare(value) if prepare else value
91+
)
8892
return parameters
8993

9094
def prepare_amount(self, value):

0 commit comments

Comments
 (0)