diff --git a/payment_page_sdk/gate.py b/payment_page_sdk/gate.py index 3cf1426..1df9284 100644 --- a/payment_page_sdk/gate.py +++ b/payment_page_sdk/gate.py @@ -1,8 +1,12 @@ +import urllib from payment_page_sdk.signature_handler import SignatureHandler from payment_page_sdk.payment_page import PaymentPage from payment_page_sdk.callback import Callback from payment_page_sdk.payment import Payment +from payment_page_sdk.validation_exception import ValidationException +from urllib.request import urlopen, Request +from urllib.error import HTTPError class Gate(object): @@ -15,6 +19,8 @@ class Gate(object): __paymentPageUrlBuilder - Builder for Payment page __signatureHandler - Signature Handler (check, sign) + __validationUrl - Payment params validation domain with path to API + __validatorEnabled - Enable (true) or disable (false) payment params validation """ CURRENCY_RUB = 'RUB' CURRENCY_USD = 'USD' @@ -22,6 +28,8 @@ class Gate(object): __paymentPageUrlBuilder = None __signatureHandler = None + __validationUrl = 'https://sdk.ecommpay.com/v1/params/check' + __validatorEnabled = True def __init__(self, secret: str, base_url: str = ''): """ @@ -39,6 +47,9 @@ def get_purchase_payment_page_url(self, payment: Payment) -> str: :param Payment payment: :return: """ + if self.__validatorEnabled: + self.validate(payment) + return self.__paymentPageUrlBuilder.get_url(payment) def handle_callback(self, data): @@ -49,3 +60,18 @@ def handle_callback(self, data): :return: """ return Callback(data, self.__signatureHandler) + + def validate(self, payment: Payment): + """ + Validate payment params before build payment link + + :param payment: + :return: + """ + paramsUrl = self.__validationUrl + '?' + urllib.parse.urlencode(payment.get_params()) + validationRequest = Request(paramsUrl) + + try: + urlopen(validationRequest) + except HTTPError as e: + raise ValidationException(e) diff --git a/payment_page_sdk/validation_exception.py b/payment_page_sdk/validation_exception.py new file mode 100644 index 0000000..62bee80 --- /dev/null +++ b/payment_page_sdk/validation_exception.py @@ -0,0 +1,17 @@ + +class ValidationException(Exception): + """Validation request exception""" + + def __init__(self, *args): + if args: + self.validationResponseBody = args[0].read().decode() + self.responseCode = self.args[0].status + else: + self.validationResponseBody = None + + def __str__(self): + if self.validationResponseBody: + return 'Response code - {0}, message - {1}'.format(self.responseCode, self.validationResponseBody) + else: + return 'Received a response without a message body' + diff --git a/tests/test_gate.py b/tests/test_gate.py index 02278c5..0a3535b 100644 --- a/tests/test_gate.py +++ b/tests/test_gate.py @@ -12,9 +12,8 @@ class GateTest(unittest.TestCase): secret = 'qwerty' compare_url = \ 'https://paymentpage.ecommpay.com/payment?payment_id=test-payment&interface_type=%7B%22id%22%3A%2024%7D' \ - + '&project_id=1&best_before=2055-05-05T00%3A00%3A00&signature=q6' \ - + '9mSGul5x6KACTn0Vl%2BX6N4hH1lL45yQiEbmLzJvNoJ1hwkBuiEv%2FLLpJuy' \ - + 'LWtIrgU7%2Bq0TAUO0f%2Bai0bqjKQ%3D%3D' + + '&project_id=60481&best_before=2055-05-05T00%3A00%3A00&signature=IC' \ + + 'BCw0eVO8mRjPs%2BRKBg97g1hvZojpTWPPd8v8SZTzT6Z7n7bbcW%2BH1eFXciRqSeo7xGP2Cy//3PdmuAvhBcvw==' callback_data =\ { "payment": @@ -30,7 +29,7 @@ def setUp(cls): cls.gate = Gate(cls.secret) def test_get_purchase_payment_page_url(self): - payment = Payment('1', 'test-payment') + payment = Payment('60481', 'test-payment') payment.best_before = datetime(2055, 5, 5) purchase_payment_page_url = self.gate.get_purchase_payment_page_url(payment) url_parsed_params = urlparse.parse_qs(urlparse.urlparse(self.compare_url).query)