11# -*- coding: utf-8 -*-
2-
32import re
43import hashlib
54import json
65import base64
76import hmac
8- import ast
97from Crypto .Cipher import DES3
108from abc import ABCMeta , abstractmethod
119from . import currencies , languages , transactions
@@ -39,23 +37,21 @@ def create_request(self):
3937
4038 @abstractmethod
4139 def create_response (self , signature , parameters , signature_version = DEFAULT_SIGNATURE_VERSION ):
42- pass
40+ raise NotImplemented
4341
4442 @abstractmethod
4543 def prepare_request (self , request ):
46- pass
44+ raise NotImplemented
4745
4846 def encode_parameters (self , parameters ):
49- encoded_parameters = (json .dumps (parameters )).encode ()
50- return '' .join (unicode (base64 .encodestring (encoded_parameters ), 'utf-8' ).splitlines ())
47+ return base64 .b64encode (json .dumps (parameters ).encode ('utf-8' ))
5148
5249 def decode_parameters (self , parameters ):
53- decoded_parameters = base64 .standard_b64decode (parameters )
54- return ast .literal_eval (decoded_parameters )
50+ return json .loads (base64 .b64decode (parameters ).decode ('utf-8' ))
5551
5652 def encrypt_3DES (self , order ):
57- pycrypto = DES3 .new (base64 .standard_b64decode (self .secret_key ), DES3 .MODE_CBC , IV = b'\0 \0 \0 \0 \0 \0 \0 \0 ' )
58- order_padded = order .ljust (16 , b' \0 ' )
53+ pycrypto = DES3 .new (base64 .b64decode (self .secret_key ), DES3 .MODE_CBC , IV = b'\0 \0 \0 \0 \0 \0 \0 \0 ' )
54+ order_padded = order .ljust (16 , u' \x00 ' )
5955 return pycrypto .encrypt (order_padded )
6056
6157 def sign_hmac256 (self , encrypted_order , merchant_parameters ):
@@ -72,10 +68,10 @@ class RedirectClient(Client):
7268
7369 def create_response (self , signature , merchant_parameters , signature_version = DEFAULT_SIGNATURE_VERSION ):
7470 response = Response (self .decode_parameters (merchant_parameters ))
75- calculated_signature = self .generate_signature (response .order , merchant_parameters )
76- alphanumeric_characters = re .compile ('[^a-zA-Z0-9]' )
77- safe_signature = re .sub (alphanumeric_characters , '' , signature )
78- safe_calculated_signature = re .sub (alphanumeric_characters , '' , calculated_signature )
71+ calculated_signature = self .generate_signature (response .order , merchant_parameters . encode ( 'utf-8' ) )
72+ alphanum = re .compile ('[^a-zA-Z0-9]' )
73+ safe_signature = re .sub (alphanum , '' , signature )
74+ safe_calculated_signature = re .sub (alphanum , '' , calculated_signature . decode ( 'utf-8' ) )
7975 if safe_signature != safe_calculated_signature :
8076 raise ValueError ("The provided signature is not valid." )
8177 return response
0 commit comments