onlinepayments-sdk-python3 7.4.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- onlinepayments/__init__.py +0 -0
- onlinepayments/sdk/__init__.py +4 -0
- onlinepayments/sdk/api_exception.py +60 -0
- onlinepayments/sdk/api_resource.py +57 -0
- onlinepayments/sdk/authentication/__init__.py +0 -0
- onlinepayments/sdk/authentication/authenticator.py +24 -0
- onlinepayments/sdk/authentication/authorization_type.py +10 -0
- onlinepayments/sdk/authentication/v1hmac_authenticator.py +122 -0
- onlinepayments/sdk/authorization_exception.py +19 -0
- onlinepayments/sdk/call_context.py +72 -0
- onlinepayments/sdk/client.py +107 -0
- onlinepayments/sdk/communication/__init__.py +0 -0
- onlinepayments/sdk/communication/communication_exception.py +8 -0
- onlinepayments/sdk/communication/connection.py +84 -0
- onlinepayments/sdk/communication/default_connection.py +313 -0
- onlinepayments/sdk/communication/i_metadata_provider.py +19 -0
- onlinepayments/sdk/communication/metadata_provider.py +132 -0
- onlinepayments/sdk/communication/multipart_form_data_object.py +51 -0
- onlinepayments/sdk/communication/multipart_form_data_request.py +16 -0
- onlinepayments/sdk/communication/not_found_exception.py +10 -0
- onlinepayments/sdk/communication/param_request.py +17 -0
- onlinepayments/sdk/communication/pooled_connection.py +29 -0
- onlinepayments/sdk/communication/request_header.py +60 -0
- onlinepayments/sdk/communication/request_param.py +30 -0
- onlinepayments/sdk/communication/response_exception.py +58 -0
- onlinepayments/sdk/communication/response_header.py +50 -0
- onlinepayments/sdk/communicator.py +465 -0
- onlinepayments/sdk/communicator_configuration.py +264 -0
- onlinepayments/sdk/declined_payment_exception.py +46 -0
- onlinepayments/sdk/declined_payout_exception.py +46 -0
- onlinepayments/sdk/declined_refund_exception.py +46 -0
- onlinepayments/sdk/declined_transaction_exception.py +22 -0
- onlinepayments/sdk/domain/__init__.py +4 -0
- onlinepayments/sdk/domain/acceptance.py +56 -0
- onlinepayments/sdk/domain/account_on_file.py +102 -0
- onlinepayments/sdk/domain/account_on_file_attribute.py +97 -0
- onlinepayments/sdk/domain/account_on_file_display_hints.py +64 -0
- onlinepayments/sdk/domain/acquirer_information.py +59 -0
- onlinepayments/sdk/domain/acquirer_selection_information.py +73 -0
- onlinepayments/sdk/domain/additional_order_input.py +107 -0
- onlinepayments/sdk/domain/address.py +145 -0
- onlinepayments/sdk/domain/address_personal.py +185 -0
- onlinepayments/sdk/domain/airline_data.py +519 -0
- onlinepayments/sdk/domain/airline_flight_leg.py +386 -0
- onlinepayments/sdk/domain/airline_passenger.py +129 -0
- onlinepayments/sdk/domain/amount_breakdown.py +63 -0
- onlinepayments/sdk/domain/amount_of_money.py +59 -0
- onlinepayments/sdk/domain/api_error.py +177 -0
- onlinepayments/sdk/domain/apple_pay_line_item.py +145 -0
- onlinepayments/sdk/domain/apple_pay_recurring_payment_request.py +116 -0
- onlinepayments/sdk/domain/bank_account_iban.py +37 -0
- onlinepayments/sdk/domain/batch_metadata.py +73 -0
- onlinepayments/sdk/domain/browser_data.py +130 -0
- onlinepayments/sdk/domain/calculate_surcharge_request.py +63 -0
- onlinepayments/sdk/domain/calculate_surcharge_response.py +44 -0
- onlinepayments/sdk/domain/cancel_payment_batch_request.py +57 -0
- onlinepayments/sdk/domain/cancel_payment_request.py +130 -0
- onlinepayments/sdk/domain/cancel_payment_response.py +41 -0
- onlinepayments/sdk/domain/capture.py +97 -0
- onlinepayments/sdk/domain/capture_output.py +272 -0
- onlinepayments/sdk/domain/capture_payment_batch_request.py +57 -0
- onlinepayments/sdk/domain/capture_payment_request.py +148 -0
- onlinepayments/sdk/domain/capture_response.py +99 -0
- onlinepayments/sdk/domain/capture_status_output.py +37 -0
- onlinepayments/sdk/domain/captures_response.py +46 -0
- onlinepayments/sdk/domain/card.py +91 -0
- onlinepayments/sdk/domain/card_bin_details.py +384 -0
- onlinepayments/sdk/domain/card_data_without_cvv.py +73 -0
- onlinepayments/sdk/domain/card_essentials.py +438 -0
- onlinepayments/sdk/domain/card_fraud_results.py +112 -0
- onlinepayments/sdk/domain/card_info.py +55 -0
- onlinepayments/sdk/domain/card_payment_method_specific_input.py +608 -0
- onlinepayments/sdk/domain/card_payment_method_specific_input_base.py +441 -0
- onlinepayments/sdk/domain/card_payment_method_specific_input_for_hosted_checkout.py +105 -0
- onlinepayments/sdk/domain/card_payment_method_specific_output.py +467 -0
- onlinepayments/sdk/domain/card_payout_method_specific_input.py +99 -0
- onlinepayments/sdk/domain/card_recurrence_details.py +40 -0
- onlinepayments/sdk/domain/card_source.py +95 -0
- onlinepayments/sdk/domain/card_without_cvv.py +73 -0
- onlinepayments/sdk/domain/click_to_pay.py +37 -0
- onlinepayments/sdk/domain/company_information.py +37 -0
- onlinepayments/sdk/domain/complete_payment_card_payment_method_specific_input.py +39 -0
- onlinepayments/sdk/domain/complete_payment_request.py +61 -0
- onlinepayments/sdk/domain/complete_payment_response.py +85 -0
- onlinepayments/sdk/domain/contact_details.py +109 -0
- onlinepayments/sdk/domain/create_certificate_response.py +55 -0
- onlinepayments/sdk/domain/create_hosted_checkout_request.py +195 -0
- onlinepayments/sdk/domain/create_hosted_checkout_response.py +132 -0
- onlinepayments/sdk/domain/create_hosted_fields_session_request.py +37 -0
- onlinepayments/sdk/domain/create_hosted_fields_session_response.py +102 -0
- onlinepayments/sdk/domain/create_hosted_tokenization_request.py +133 -0
- onlinepayments/sdk/domain/create_hosted_tokenization_response.py +127 -0
- onlinepayments/sdk/domain/create_mandate_request.py +187 -0
- onlinepayments/sdk/domain/create_mandate_response.py +63 -0
- onlinepayments/sdk/domain/create_mandate_with_return_url.py +187 -0
- onlinepayments/sdk/domain/create_payment_link_request.py +344 -0
- onlinepayments/sdk/domain/create_payment_request.py +249 -0
- onlinepayments/sdk/domain/create_payment_response.py +85 -0
- onlinepayments/sdk/domain/create_payout_request.py +176 -0
- onlinepayments/sdk/domain/create_token_request.py +77 -0
- onlinepayments/sdk/domain/created_payment_output.py +57 -0
- onlinepayments/sdk/domain/created_token_response.py +142 -0
- onlinepayments/sdk/domain/credit_card_specific_input_hosted_tokenization.py +66 -0
- onlinepayments/sdk/domain/credit_card_validation_rules.py +55 -0
- onlinepayments/sdk/domain/credit_card_validation_rules_hosted_tokenization.py +55 -0
- onlinepayments/sdk/domain/crm_token.py +55 -0
- onlinepayments/sdk/domain/csr_request.py +37 -0
- onlinepayments/sdk/domain/currency_conversion.py +59 -0
- onlinepayments/sdk/domain/currency_conversion_input.py +55 -0
- onlinepayments/sdk/domain/currency_conversion_request.py +59 -0
- onlinepayments/sdk/domain/currency_conversion_response.py +81 -0
- onlinepayments/sdk/domain/currency_conversion_result.py +61 -0
- onlinepayments/sdk/domain/currency_conversion_specific_input.py +40 -0
- onlinepayments/sdk/domain/customer.py +234 -0
- onlinepayments/sdk/domain/customer_account.py +204 -0
- onlinepayments/sdk/domain/customer_account_authentication.py +81 -0
- onlinepayments/sdk/domain/customer_bank_account.py +73 -0
- onlinepayments/sdk/domain/customer_device.py +155 -0
- onlinepayments/sdk/domain/customer_device_output.py +37 -0
- onlinepayments/sdk/domain/customer_output.py +41 -0
- onlinepayments/sdk/domain/customer_payment_activity.py +73 -0
- onlinepayments/sdk/domain/customer_token.py +83 -0
- onlinepayments/sdk/domain/data_object.py +47 -0
- onlinepayments/sdk/domain/dcc_card_source.py +93 -0
- onlinepayments/sdk/domain/dcc_proposal.py +118 -0
- onlinepayments/sdk/domain/decrypted_payment_data.py +120 -0
- onlinepayments/sdk/domain/detokenization_response.py +46 -0
- onlinepayments/sdk/domain/detokenized_token_response.py +145 -0
- onlinepayments/sdk/domain/directory_entry.py +73 -0
- onlinepayments/sdk/domain/discount.py +41 -0
- onlinepayments/sdk/domain/empty_validator.py +16 -0
- onlinepayments/sdk/domain/error_response.py +64 -0
- onlinepayments/sdk/domain/external_cardholder_authentication_data.py +216 -0
- onlinepayments/sdk/domain/external_token_linked.py +75 -0
- onlinepayments/sdk/domain/feedbacks.py +64 -0
- onlinepayments/sdk/domain/fixed_list_validator.py +42 -0
- onlinepayments/sdk/domain/fraud_fields.py +84 -0
- onlinepayments/sdk/domain/fraud_results.py +43 -0
- onlinepayments/sdk/domain/g_pay_three_d_secure.py +159 -0
- onlinepayments/sdk/domain/get_batch_status_response.py +91 -0
- onlinepayments/sdk/domain/get_hosted_checkout_response.py +63 -0
- onlinepayments/sdk/domain/get_hosted_tokenization_response.py +61 -0
- onlinepayments/sdk/domain/get_iin_details_request.py +57 -0
- onlinepayments/sdk/domain/get_iin_details_response.py +450 -0
- onlinepayments/sdk/domain/get_mandate_response.py +41 -0
- onlinepayments/sdk/domain/get_payment_product_groups_response.py +44 -0
- onlinepayments/sdk/domain/get_payment_products_response.py +44 -0
- onlinepayments/sdk/domain/get_privacy_policy_response.py +37 -0
- onlinepayments/sdk/domain/gift_card_purchase.py +59 -0
- onlinepayments/sdk/domain/hosted_checkout_specific_input.py +250 -0
- onlinepayments/sdk/domain/hosted_checkout_specific_output.py +55 -0
- onlinepayments/sdk/domain/iin_detail.py +423 -0
- onlinepayments/sdk/domain/import_cof_series_request.py +113 -0
- onlinepayments/sdk/domain/import_cof_series_response.py +37 -0
- onlinepayments/sdk/domain/label_template_element.py +55 -0
- onlinepayments/sdk/domain/length_validator.py +51 -0
- onlinepayments/sdk/domain/line_item.py +107 -0
- onlinepayments/sdk/domain/line_item_detail.py +99 -0
- onlinepayments/sdk/domain/line_item_invoice_data.py +37 -0
- onlinepayments/sdk/domain/loan_recipient.py +109 -0
- onlinepayments/sdk/domain/lodging_data.py +37 -0
- onlinepayments/sdk/domain/mandate_address.py +109 -0
- onlinepayments/sdk/domain/mandate_address_response.py +109 -0
- onlinepayments/sdk/domain/mandate_contact_details.py +37 -0
- onlinepayments/sdk/domain/mandate_customer.py +125 -0
- onlinepayments/sdk/domain/mandate_customer_response.py +125 -0
- onlinepayments/sdk/domain/mandate_merchant_action.py +61 -0
- onlinepayments/sdk/domain/mandate_personal_information.py +59 -0
- onlinepayments/sdk/domain/mandate_personal_information_response.py +59 -0
- onlinepayments/sdk/domain/mandate_personal_name.py +55 -0
- onlinepayments/sdk/domain/mandate_personal_name_response.py +55 -0
- onlinepayments/sdk/domain/mandate_redirect_data.py +55 -0
- onlinepayments/sdk/domain/mandate_response.py +150 -0
- onlinepayments/sdk/domain/market_place.py +55 -0
- onlinepayments/sdk/domain/merchant_action.py +132 -0
- onlinepayments/sdk/domain/mobile_payment_data.py +55 -0
- onlinepayments/sdk/domain/mobile_payment_method_hosted_checkout_specific_input.py +105 -0
- onlinepayments/sdk/domain/mobile_payment_method_specific_input.py +202 -0
- onlinepayments/sdk/domain/mobile_payment_method_specific_output.py +139 -0
- onlinepayments/sdk/domain/mobile_payment_product302_specific_input.py +103 -0
- onlinepayments/sdk/domain/mobile_payment_product320_specific_input.py +103 -0
- onlinepayments/sdk/domain/mobile_three_d_secure_challenge_parameters.py +91 -0
- onlinepayments/sdk/domain/multiple_payment_information.py +57 -0
- onlinepayments/sdk/domain/network_token_data.py +127 -0
- onlinepayments/sdk/domain/network_token_essentials.py +134 -0
- onlinepayments/sdk/domain/network_token_linked.py +80 -0
- onlinepayments/sdk/domain/omnichannel_payment_specific_input.py +37 -0
- onlinepayments/sdk/domain/omnichannel_payout_specific_input.py +55 -0
- onlinepayments/sdk/domain/omnichannel_refund_specific_input.py +37 -0
- onlinepayments/sdk/domain/omnichannel_subsequent_specific_input.py +37 -0
- onlinepayments/sdk/domain/operation_output.py +161 -0
- onlinepayments/sdk/domain/operation_payment_references.py +55 -0
- onlinepayments/sdk/domain/order.py +213 -0
- onlinepayments/sdk/domain/order_line_details.py +189 -0
- onlinepayments/sdk/domain/order_references.py +120 -0
- onlinepayments/sdk/domain/order_status_output.py +119 -0
- onlinepayments/sdk/domain/order_type_information.py +64 -0
- onlinepayments/sdk/domain/other_details.py +55 -0
- onlinepayments/sdk/domain/payment_account_on_file.py +57 -0
- onlinepayments/sdk/domain/payment_context.py +77 -0
- onlinepayments/sdk/domain/payment_creation_output.py +94 -0
- onlinepayments/sdk/domain/payment_details_response.py +148 -0
- onlinepayments/sdk/domain/payment_error_response.py +84 -0
- onlinepayments/sdk/domain/payment_link_event.py +73 -0
- onlinepayments/sdk/domain/payment_link_order_input.py +84 -0
- onlinepayments/sdk/domain/payment_link_order_output.py +81 -0
- onlinepayments/sdk/domain/payment_link_response.py +216 -0
- onlinepayments/sdk/domain/payment_link_specific_input.py +74 -0
- onlinepayments/sdk/domain/payment_links_response.py +44 -0
- onlinepayments/sdk/domain/payment_output.py +335 -0
- onlinepayments/sdk/domain/payment_product.py +296 -0
- onlinepayments/sdk/domain/payment_product130_specific_input.py +41 -0
- onlinepayments/sdk/domain/payment_product130_specific_three_d_secure.py +91 -0
- onlinepayments/sdk/domain/payment_product3012.py +55 -0
- onlinepayments/sdk/domain/payment_product3012_specific_input.py +100 -0
- onlinepayments/sdk/domain/payment_product3013_specific_input.py +73 -0
- onlinepayments/sdk/domain/payment_product302_specific_data.py +44 -0
- onlinepayments/sdk/domain/payment_product3203_specific_output.py +62 -0
- onlinepayments/sdk/domain/payment_product3204_specific_output.py +37 -0
- onlinepayments/sdk/domain/payment_product3208_specific_input.py +37 -0
- onlinepayments/sdk/domain/payment_product3208_specific_output.py +37 -0
- onlinepayments/sdk/domain/payment_product3209_specific_input.py +37 -0
- onlinepayments/sdk/domain/payment_product3209_specific_output.py +37 -0
- onlinepayments/sdk/domain/payment_product320_specific_data.py +62 -0
- onlinepayments/sdk/domain/payment_product350.py +55 -0
- onlinepayments/sdk/domain/payment_product5001.py +58 -0
- onlinepayments/sdk/domain/payment_product5001_specific_output.py +112 -0
- onlinepayments/sdk/domain/payment_product5100_specific_input.py +37 -0
- onlinepayments/sdk/domain/payment_product5402_specific_output.py +37 -0
- onlinepayments/sdk/domain/payment_product5404.py +55 -0
- onlinepayments/sdk/domain/payment_product5407.py +55 -0
- onlinepayments/sdk/domain/payment_product5500_specific_output.py +91 -0
- onlinepayments/sdk/domain/payment_product771_specific_output.py +37 -0
- onlinepayments/sdk/domain/payment_product840.py +37 -0
- onlinepayments/sdk/domain/payment_product840_customer_account.py +170 -0
- onlinepayments/sdk/domain/payment_product840_specific_output.py +167 -0
- onlinepayments/sdk/domain/payment_product_display_hints.py +73 -0
- onlinepayments/sdk/domain/payment_product_field.py +95 -0
- onlinepayments/sdk/domain/payment_product_field_data_restrictions.py +60 -0
- onlinepayments/sdk/domain/payment_product_field_display_element.py +97 -0
- onlinepayments/sdk/domain/payment_product_field_display_hints.py +218 -0
- onlinepayments/sdk/domain/payment_product_field_form_element.py +72 -0
- onlinepayments/sdk/domain/payment_product_field_tooltip.py +57 -0
- onlinepayments/sdk/domain/payment_product_field_validators.py +195 -0
- onlinepayments/sdk/domain/payment_product_filter.py +67 -0
- onlinepayments/sdk/domain/payment_product_filter_hosted_tokenization.py +42 -0
- onlinepayments/sdk/domain/payment_product_filters_hosted_checkout.py +62 -0
- onlinepayments/sdk/domain/payment_product_filters_hosted_tokenization.py +62 -0
- onlinepayments/sdk/domain/payment_product_group.py +103 -0
- onlinepayments/sdk/domain/payment_product_networks_response.py +42 -0
- onlinepayments/sdk/domain/payment_references.py +73 -0
- onlinepayments/sdk/domain/payment_response.py +143 -0
- onlinepayments/sdk/domain/payment_status_output.py +152 -0
- onlinepayments/sdk/domain/payout_error_response.py +80 -0
- onlinepayments/sdk/domain/payout_output.py +63 -0
- onlinepayments/sdk/domain/payout_response.py +93 -0
- onlinepayments/sdk/domain/payout_result.py +93 -0
- onlinepayments/sdk/domain/payout_status_output.py +76 -0
- onlinepayments/sdk/domain/pending_authentication.py +37 -0
- onlinepayments/sdk/domain/personal_information.py +77 -0
- onlinepayments/sdk/domain/personal_information_token.py +39 -0
- onlinepayments/sdk/domain/personal_name.py +73 -0
- onlinepayments/sdk/domain/personal_name_token.py +51 -0
- onlinepayments/sdk/domain/product302_recurring.py +37 -0
- onlinepayments/sdk/domain/product320_recurring.py +37 -0
- onlinepayments/sdk/domain/product_directory.py +46 -0
- onlinepayments/sdk/domain/protection_eligibility.py +59 -0
- onlinepayments/sdk/domain/range_validator.py +51 -0
- onlinepayments/sdk/domain/rate_details.py +109 -0
- onlinepayments/sdk/domain/reattempt_instructions.py +82 -0
- onlinepayments/sdk/domain/reattempt_instructions_conditions.py +55 -0
- onlinepayments/sdk/domain/redirect_data.py +55 -0
- onlinepayments/sdk/domain/redirect_payment_method_specific_input.py +575 -0
- onlinepayments/sdk/domain/redirect_payment_method_specific_output.py +267 -0
- onlinepayments/sdk/domain/redirect_payment_product11_specific_input.py +38 -0
- onlinepayments/sdk/domain/redirect_payment_product3103_specific_input.py +40 -0
- onlinepayments/sdk/domain/redirect_payment_product3112_specific_input.py +40 -0
- onlinepayments/sdk/domain/redirect_payment_product3116_specific_input.py +40 -0
- onlinepayments/sdk/domain/redirect_payment_product3203_specific_input.py +40 -0
- onlinepayments/sdk/domain/redirect_payment_product3204_specific_input.py +55 -0
- onlinepayments/sdk/domain/redirect_payment_product3302_specific_input.py +73 -0
- onlinepayments/sdk/domain/redirect_payment_product3306_specific_input.py +37 -0
- onlinepayments/sdk/domain/redirect_payment_product3307_specific_input.py +16 -0
- onlinepayments/sdk/domain/redirect_payment_product5001_specific_input.py +62 -0
- onlinepayments/sdk/domain/redirect_payment_product5300_specific_input.py +163 -0
- onlinepayments/sdk/domain/redirect_payment_product5402_specific_input.py +40 -0
- onlinepayments/sdk/domain/redirect_payment_product5403_specific_input.py +40 -0
- onlinepayments/sdk/domain/redirect_payment_product5406_specific_input.py +41 -0
- onlinepayments/sdk/domain/redirect_payment_product5408_specific_input.py +60 -0
- onlinepayments/sdk/domain/redirect_payment_product5410_specific_input.py +38 -0
- onlinepayments/sdk/domain/redirect_payment_product5412_specific_input.py +55 -0
- onlinepayments/sdk/domain/redirect_payment_product5601_specific_input.py +40 -0
- onlinepayments/sdk/domain/redirect_payment_product809_specific_input.py +40 -0
- onlinepayments/sdk/domain/redirect_payment_product840_specific_input.py +100 -0
- onlinepayments/sdk/domain/redirection_data.py +37 -0
- onlinepayments/sdk/domain/refund_card_method_specific_output.py +71 -0
- onlinepayments/sdk/domain/refund_e_wallet_method_specific_output.py +71 -0
- onlinepayments/sdk/domain/refund_error_response.py +82 -0
- onlinepayments/sdk/domain/refund_mobile_method_specific_output.py +69 -0
- onlinepayments/sdk/domain/refund_output.py +217 -0
- onlinepayments/sdk/domain/refund_payment_batch_request.py +57 -0
- onlinepayments/sdk/domain/refund_payment_product840_customer_account.py +69 -0
- onlinepayments/sdk/domain/refund_payment_product840_specific_output.py +39 -0
- onlinepayments/sdk/domain/refund_redirect_method_specific_output.py +51 -0
- onlinepayments/sdk/domain/refund_redirect_payment_method_specific_input.py +41 -0
- onlinepayments/sdk/domain/refund_redirect_payment_product900_specific_input.py +37 -0
- onlinepayments/sdk/domain/refund_request.py +210 -0
- onlinepayments/sdk/domain/refund_response.py +97 -0
- onlinepayments/sdk/domain/refunds_response.py +46 -0
- onlinepayments/sdk/domain/regular_expression_validator.py +35 -0
- onlinepayments/sdk/domain/revoke_mandate_request.py +48 -0
- onlinepayments/sdk/domain/send_test_request.py +37 -0
- onlinepayments/sdk/domain/sepa_direct_debit_payment_method_specific_input.py +59 -0
- onlinepayments/sdk/domain/sepa_direct_debit_payment_method_specific_input_base.py +59 -0
- onlinepayments/sdk/domain/sepa_direct_debit_payment_method_specific_output.py +81 -0
- onlinepayments/sdk/domain/sepa_direct_debit_payment_product771_specific_input.py +59 -0
- onlinepayments/sdk/domain/sepa_direct_debit_payment_product771_specific_input_base.py +59 -0
- onlinepayments/sdk/domain/session_data.py +116 -0
- onlinepayments/sdk/domain/session_details.py +55 -0
- onlinepayments/sdk/domain/session_request.py +44 -0
- onlinepayments/sdk/domain/session_response.py +114 -0
- onlinepayments/sdk/domain/shipping.py +214 -0
- onlinepayments/sdk/domain/shipping_detail.py +63 -0
- onlinepayments/sdk/domain/shipping_method.py +91 -0
- onlinepayments/sdk/domain/shopping_cart.py +155 -0
- onlinepayments/sdk/domain/shopping_cart_extension.py +77 -0
- onlinepayments/sdk/domain/shopping_cart_output.py +46 -0
- onlinepayments/sdk/domain/show_form_data.py +173 -0
- onlinepayments/sdk/domain/show_instructions_data.py +37 -0
- onlinepayments/sdk/domain/split_payment_product_filter.py +42 -0
- onlinepayments/sdk/domain/split_payment_product_filters_hosted_checkout.py +62 -0
- onlinepayments/sdk/domain/submit_batch_request_body.py +230 -0
- onlinepayments/sdk/domain/submit_batch_response.py +55 -0
- onlinepayments/sdk/domain/subsequent_card_payment_method_specific_input.py +175 -0
- onlinepayments/sdk/domain/subsequent_payment_batch_request.py +57 -0
- onlinepayments/sdk/domain/subsequent_payment_product5001_specific_input.py +41 -0
- onlinepayments/sdk/domain/subsequent_payment_request.py +107 -0
- onlinepayments/sdk/domain/subsequent_payment_response.py +41 -0
- onlinepayments/sdk/domain/surcharge.py +141 -0
- onlinepayments/sdk/domain/surcharge_calculation_card.py +55 -0
- onlinepayments/sdk/domain/surcharge_for_payment_link.py +40 -0
- onlinepayments/sdk/domain/surcharge_rate.py +91 -0
- onlinepayments/sdk/domain/surcharge_specific_input.py +62 -0
- onlinepayments/sdk/domain/surcharge_specific_output.py +84 -0
- onlinepayments/sdk/domain/test_connection.py +35 -0
- onlinepayments/sdk/domain/three_d_secure.py +281 -0
- onlinepayments/sdk/domain/three_d_secure_base.py +219 -0
- onlinepayments/sdk/domain/three_d_secure_data.py +78 -0
- onlinepayments/sdk/domain/three_d_secure_results.py +266 -0
- onlinepayments/sdk/domain/token_card.py +57 -0
- onlinepayments/sdk/domain/token_card_data.py +83 -0
- onlinepayments/sdk/domain/token_card_specific_input.py +41 -0
- onlinepayments/sdk/domain/token_data.py +63 -0
- onlinepayments/sdk/domain/token_e_wallet.py +59 -0
- onlinepayments/sdk/domain/token_response.py +181 -0
- onlinepayments/sdk/domain/transaction.py +41 -0
- onlinepayments/sdk/domain/uploadable_file.py +51 -0
- onlinepayments/sdk/domain/validate_credentials_request.py +55 -0
- onlinepayments/sdk/domain/validate_credentials_response.py +37 -0
- onlinepayments/sdk/domain/value_mapping_element.py +62 -0
- onlinepayments/sdk/domain/web_hooks_event.py +214 -0
- onlinepayments/sdk/exception_factory.py +75 -0
- onlinepayments/sdk/factory.py +127 -0
- onlinepayments/sdk/i_client.py +78 -0
- onlinepayments/sdk/i_communicator.py +180 -0
- onlinepayments/sdk/idempotence_exception.py +36 -0
- onlinepayments/sdk/json/__init__.py +0 -0
- onlinepayments/sdk/json/default_marshaller.py +60 -0
- onlinepayments/sdk/json/marshaller.py +32 -0
- onlinepayments/sdk/json/marshaller_syntax_exception.py +13 -0
- onlinepayments/sdk/log/__init__.py +0 -0
- onlinepayments/sdk/log/body_obfuscator.py +113 -0
- onlinepayments/sdk/log/communicator_logger.py +35 -0
- onlinepayments/sdk/log/header_obfuscator.py +49 -0
- onlinepayments/sdk/log/log_message.py +94 -0
- onlinepayments/sdk/log/logging_capable.py +26 -0
- onlinepayments/sdk/log/obfuscation_capable.py +24 -0
- onlinepayments/sdk/log/obfuscation_rule.py +50 -0
- onlinepayments/sdk/log/python_communicator_logger.py +54 -0
- onlinepayments/sdk/log/request_log_message.py +28 -0
- onlinepayments/sdk/log/response_log_message.py +37 -0
- onlinepayments/sdk/log/sys_out_communicator_logger.py +36 -0
- onlinepayments/sdk/merchant/__init__.py +4 -0
- onlinepayments/sdk/merchant/captures/__init__.py +4 -0
- onlinepayments/sdk/merchant/captures/captures_client.py +63 -0
- onlinepayments/sdk/merchant/captures/i_captures_client.py +34 -0
- onlinepayments/sdk/merchant/cofseries/__init__.py +4 -0
- onlinepayments/sdk/merchant/cofseries/cof_series_client.py +62 -0
- onlinepayments/sdk/merchant/cofseries/i_cof_series_client.py +35 -0
- onlinepayments/sdk/merchant/complete/__init__.py +4 -0
- onlinepayments/sdk/merchant/complete/complete_client.py +67 -0
- onlinepayments/sdk/merchant/complete/i_complete_client.py +37 -0
- onlinepayments/sdk/merchant/hostedcheckout/__init__.py +4 -0
- onlinepayments/sdk/merchant/hostedcheckout/hosted_checkout_client.py +99 -0
- onlinepayments/sdk/merchant/hostedcheckout/i_hosted_checkout_client.py +55 -0
- onlinepayments/sdk/merchant/hostedfields/__init__.py +4 -0
- onlinepayments/sdk/merchant/hostedfields/hosted_fields_client.py +62 -0
- onlinepayments/sdk/merchant/hostedfields/i_hosted_fields_client.py +35 -0
- onlinepayments/sdk/merchant/hostedtokenization/__init__.py +4 -0
- onlinepayments/sdk/merchant/hostedtokenization/hosted_tokenization_client.py +99 -0
- onlinepayments/sdk/merchant/hostedtokenization/i_hosted_tokenization_client.py +55 -0
- onlinepayments/sdk/merchant/i_merchant_client.py +202 -0
- onlinepayments/sdk/merchant/mandates/__init__.py +4 -0
- onlinepayments/sdk/merchant/mandates/i_mandates_client.py +114 -0
- onlinepayments/sdk/merchant/mandates/mandates_client.py +212 -0
- onlinepayments/sdk/merchant/merchant_client.py +232 -0
- onlinepayments/sdk/merchant/merchantbatch/__init__.py +4 -0
- onlinepayments/sdk/merchant/merchantbatch/i_merchant_batch_client.py +74 -0
- onlinepayments/sdk/merchant/merchantbatch/merchant_batch_client.py +138 -0
- onlinepayments/sdk/merchant/paymentlinks/__init__.py +4 -0
- onlinepayments/sdk/merchant/paymentlinks/get_payment_links_in_bulk_params.py +36 -0
- onlinepayments/sdk/merchant/paymentlinks/i_payment_links_client.py +73 -0
- onlinepayments/sdk/merchant/paymentlinks/payment_links_client.py +135 -0
- onlinepayments/sdk/merchant/payments/__init__.py +4 -0
- onlinepayments/sdk/merchant/payments/i_payments_client.py +143 -0
- onlinepayments/sdk/merchant/payments/payments_client.py +260 -0
- onlinepayments/sdk/merchant/payouts/__init__.py +4 -0
- onlinepayments/sdk/merchant/payouts/i_payouts_client.py +55 -0
- onlinepayments/sdk/merchant/payouts/payouts_client.py +100 -0
- onlinepayments/sdk/merchant/privacypolicy/__init__.py +4 -0
- onlinepayments/sdk/merchant/privacypolicy/get_privacy_policy_params.py +54 -0
- onlinepayments/sdk/merchant/privacypolicy/i_privacy_policy_client.py +36 -0
- onlinepayments/sdk/merchant/privacypolicy/privacy_policy_client.py +61 -0
- onlinepayments/sdk/merchant/productgroups/__init__.py +4 -0
- onlinepayments/sdk/merchant/productgroups/get_product_group_params.py +140 -0
- onlinepayments/sdk/merchant/productgroups/get_product_groups_params.py +140 -0
- onlinepayments/sdk/merchant/productgroups/i_product_groups_client.py +58 -0
- onlinepayments/sdk/merchant/productgroups/product_groups_client.py +100 -0
- onlinepayments/sdk/merchant/products/__init__.py +4 -0
- onlinepayments/sdk/merchant/products/get_payment_product_networks_params.py +89 -0
- onlinepayments/sdk/merchant/products/get_payment_product_params.py +138 -0
- onlinepayments/sdk/merchant/products/get_payment_products_params.py +138 -0
- onlinepayments/sdk/merchant/products/get_product_directory_params.py +54 -0
- onlinepayments/sdk/merchant/products/i_products_client.py +102 -0
- onlinepayments/sdk/merchant/products/products_client.py +178 -0
- onlinepayments/sdk/merchant/refunds/__init__.py +4 -0
- onlinepayments/sdk/merchant/refunds/i_refunds_client.py +34 -0
- onlinepayments/sdk/merchant/refunds/refunds_client.py +63 -0
- onlinepayments/sdk/merchant/services/__init__.py +4 -0
- onlinepayments/sdk/merchant/services/i_services_client.py +96 -0
- onlinepayments/sdk/merchant/services/services_client.py +167 -0
- onlinepayments/sdk/merchant/sessions/__init__.py +4 -0
- onlinepayments/sdk/merchant/sessions/i_sessions_client.py +35 -0
- onlinepayments/sdk/merchant/sessions/sessions_client.py +62 -0
- onlinepayments/sdk/merchant/subsequent/__init__.py +4 -0
- onlinepayments/sdk/merchant/subsequent/i_subsequent_client.py +37 -0
- onlinepayments/sdk/merchant/subsequent/subsequent_client.py +67 -0
- onlinepayments/sdk/merchant/tokenization/__init__.py +4 -0
- onlinepayments/sdk/merchant/tokenization/get_card_data_by_payments_params.py +48 -0
- onlinepayments/sdk/merchant/tokenization/get_card_data_by_tokens_params.py +48 -0
- onlinepayments/sdk/merchant/tokenization/i_tokenization_client.py +77 -0
- onlinepayments/sdk/merchant/tokenization/tokenization_client.py +131 -0
- onlinepayments/sdk/merchant/tokens/__init__.py +4 -0
- onlinepayments/sdk/merchant/tokens/i_tokens_client.py +74 -0
- onlinepayments/sdk/merchant/tokens/tokens_client.py +135 -0
- onlinepayments/sdk/merchant/webhooks/__init__.py +4 -0
- onlinepayments/sdk/merchant/webhooks/i_webhooks_client.py +55 -0
- onlinepayments/sdk/merchant/webhooks/webhooks_client.py +97 -0
- onlinepayments/sdk/platform_exception.py +19 -0
- onlinepayments/sdk/proxy_configuration.py +102 -0
- onlinepayments/sdk/reference_exception.py +19 -0
- onlinepayments/sdk/validation_exception.py +19 -0
- onlinepayments/sdk/webhooks/__init__.py +0 -0
- onlinepayments/sdk/webhooks/api_version_mismatch_exception.py +24 -0
- onlinepayments/sdk/webhooks/in_memory_secret_key_store.py +48 -0
- onlinepayments/sdk/webhooks/secret_key_not_available_exception.py +18 -0
- onlinepayments/sdk/webhooks/secret_key_store.py +15 -0
- onlinepayments/sdk/webhooks/signature_validation_exception.py +17 -0
- onlinepayments/sdk/webhooks/signature_validator.py +56 -0
- onlinepayments/sdk/webhooks/webhooks_helper.py +52 -0
- onlinepayments_sdk_python3-7.4.1.dist-info/METADATA +154 -0
- onlinepayments_sdk_python3-7.4.1.dist-info/RECORD +475 -0
- onlinepayments_sdk_python3-7.4.1.dist-info/WHEEL +5 -0
- onlinepayments_sdk_python3-7.4.1.dist-info/licenses/LICENSE.txt +52 -0
- onlinepayments_sdk_python3-7.4.1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
#
|
|
3
|
+
# This file was automatically generated.
|
|
4
|
+
#
|
|
5
|
+
from abc import ABC, abstractmethod
|
|
6
|
+
from typing import Optional
|
|
7
|
+
|
|
8
|
+
from onlinepayments.sdk.call_context import CallContext
|
|
9
|
+
from onlinepayments.sdk.domain.send_test_request import SendTestRequest
|
|
10
|
+
from onlinepayments.sdk.domain.validate_credentials_request import ValidateCredentialsRequest
|
|
11
|
+
from onlinepayments.sdk.domain.validate_credentials_response import ValidateCredentialsResponse
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class IWebhooksClient(ABC):
|
|
15
|
+
"""
|
|
16
|
+
Webhooks client interface. Thread-safe.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
@abstractmethod
|
|
20
|
+
def validate_webhook_credentials(self, body: ValidateCredentialsRequest, context: Optional[CallContext] = None) -> ValidateCredentialsResponse:
|
|
21
|
+
"""
|
|
22
|
+
Resource /v2/{merchantId}/webhooks/validateCredentials - Validate credentials
|
|
23
|
+
|
|
24
|
+
:param body: :class:`onlinepayments.sdk.domain.validate_credentials_request.ValidateCredentialsRequest`
|
|
25
|
+
:param context: :class:`onlinepayments.sdk.call_context.CallContext`
|
|
26
|
+
:return: :class:`onlinepayments.sdk.domain.validate_credentials_response.ValidateCredentialsResponse`
|
|
27
|
+
:raise IdempotenceException: if an idempotent request caused a conflict (HTTP status code 409)
|
|
28
|
+
:raise ValidationException: if the request was not correct and couldn't be processed (HTTP status code 400)
|
|
29
|
+
:raise AuthorizationException: if the request was not allowed (HTTP status code 403)
|
|
30
|
+
:raise ReferenceException: if an object was attempted to be referenced that doesn't exist or has been removed,
|
|
31
|
+
or there was a conflict (HTTP status code 404, 409 or 410)
|
|
32
|
+
:raise PlatformException: if something went wrong at the payment platform,
|
|
33
|
+
the payment platform was unable to process a message from a downstream partner/acquirer,
|
|
34
|
+
or the service that you're trying to reach is temporary unavailable (HTTP status code 500, 502 or 503)
|
|
35
|
+
:raise ApiException: if the payment platform returned any other error
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
@abstractmethod
|
|
39
|
+
def send_test_webhook(self, body: SendTestRequest, context: Optional[CallContext] = None) -> None:
|
|
40
|
+
"""
|
|
41
|
+
Resource /v2/{merchantId}/webhooks/sendtest - Send test
|
|
42
|
+
|
|
43
|
+
:param body: :class:`onlinepayments.sdk.domain.send_test_request.SendTestRequest`
|
|
44
|
+
:param context: :class:`onlinepayments.sdk.call_context.CallContext`
|
|
45
|
+
:return: None
|
|
46
|
+
:raise IdempotenceException: if an idempotent request caused a conflict (HTTP status code 409)
|
|
47
|
+
:raise ValidationException: if the request was not correct and couldn't be processed (HTTP status code 400)
|
|
48
|
+
:raise AuthorizationException: if the request was not allowed (HTTP status code 403)
|
|
49
|
+
:raise ReferenceException: if an object was attempted to be referenced that doesn't exist or has been removed,
|
|
50
|
+
or there was a conflict (HTTP status code 404, 409 or 410)
|
|
51
|
+
:raise PlatformException: if something went wrong at the payment platform,
|
|
52
|
+
the payment platform was unable to process a message from a downstream partner/acquirer,
|
|
53
|
+
or the service that you're trying to reach is temporary unavailable (HTTP status code 500, 502 or 503)
|
|
54
|
+
:raise ApiException: if the payment platform returned any other error
|
|
55
|
+
"""
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
#
|
|
3
|
+
# This file was automatically generated.
|
|
4
|
+
#
|
|
5
|
+
from typing import Mapping, Optional
|
|
6
|
+
|
|
7
|
+
from .i_webhooks_client import IWebhooksClient
|
|
8
|
+
|
|
9
|
+
from onlinepayments.sdk.api_resource import ApiResource
|
|
10
|
+
from onlinepayments.sdk.call_context import CallContext
|
|
11
|
+
from onlinepayments.sdk.communication.response_exception import ResponseException
|
|
12
|
+
from onlinepayments.sdk.domain.error_response import ErrorResponse
|
|
13
|
+
from onlinepayments.sdk.domain.send_test_request import SendTestRequest
|
|
14
|
+
from onlinepayments.sdk.domain.validate_credentials_request import ValidateCredentialsRequest
|
|
15
|
+
from onlinepayments.sdk.domain.validate_credentials_response import ValidateCredentialsResponse
|
|
16
|
+
from onlinepayments.sdk.exception_factory import create_exception
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class WebhooksClient(ApiResource, IWebhooksClient):
|
|
20
|
+
"""
|
|
21
|
+
Webhooks client. Thread-safe.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
def __init__(self, parent: ApiResource, path_context: Optional[Mapping[str, str]]):
|
|
25
|
+
"""
|
|
26
|
+
:param parent: :class:`onlinepayments.sdk.api_resource.ApiResource`
|
|
27
|
+
:param path_context: Mapping[str, str]
|
|
28
|
+
"""
|
|
29
|
+
super(WebhooksClient, self).__init__(parent=parent, path_context=path_context)
|
|
30
|
+
|
|
31
|
+
def validate_webhook_credentials(self, body: ValidateCredentialsRequest, context: Optional[CallContext] = None) -> ValidateCredentialsResponse:
|
|
32
|
+
"""
|
|
33
|
+
Resource /v2/{merchantId}/webhooks/validateCredentials - Validate credentials
|
|
34
|
+
|
|
35
|
+
:param body: :class:`onlinepayments.sdk.domain.validate_credentials_request.ValidateCredentialsRequest`
|
|
36
|
+
:param context: :class:`onlinepayments.sdk.call_context.CallContext`
|
|
37
|
+
:return: :class:`onlinepayments.sdk.domain.validate_credentials_response.ValidateCredentialsResponse`
|
|
38
|
+
:raise IdempotenceException: if an idempotent request caused a conflict (HTTP status code 409)
|
|
39
|
+
:raise ValidationException: if the request was not correct and couldn't be processed (HTTP status code 400)
|
|
40
|
+
:raise AuthorizationException: if the request was not allowed (HTTP status code 403)
|
|
41
|
+
:raise ReferenceException: if an object was attempted to be referenced that doesn't exist or has been removed,
|
|
42
|
+
or there was a conflict (HTTP status code 404, 409 or 410)
|
|
43
|
+
:raise PlatformException: if something went wrong at the payment platform,
|
|
44
|
+
the payment platform was unable to process a message from a downstream partner/acquirer,
|
|
45
|
+
or the service that you're trying to reach is temporary unavailable (HTTP status code 500, 502 or 503)
|
|
46
|
+
:raise ApiException: if the payment platform returned any other error
|
|
47
|
+
"""
|
|
48
|
+
uri = self._instantiate_uri("/v2/{merchantId}/webhooks/validateCredentials", None)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
try:
|
|
52
|
+
return self._communicator.post(
|
|
53
|
+
uri,
|
|
54
|
+
self._client_headers,
|
|
55
|
+
None,
|
|
56
|
+
body,
|
|
57
|
+
ValidateCredentialsResponse,
|
|
58
|
+
context)
|
|
59
|
+
|
|
60
|
+
except ResponseException as e:
|
|
61
|
+
error_type = ErrorResponse
|
|
62
|
+
error_object = self._communicator.marshaller.unmarshal(e.body, error_type)
|
|
63
|
+
raise create_exception(e.status_code, e.body, error_object, context)
|
|
64
|
+
|
|
65
|
+
def send_test_webhook(self, body: SendTestRequest, context: Optional[CallContext] = None) -> None:
|
|
66
|
+
"""
|
|
67
|
+
Resource /v2/{merchantId}/webhooks/sendtest - Send test
|
|
68
|
+
|
|
69
|
+
:param body: :class:`onlinepayments.sdk.domain.send_test_request.SendTestRequest`
|
|
70
|
+
:param context: :class:`onlinepayments.sdk.call_context.CallContext`
|
|
71
|
+
:return: None
|
|
72
|
+
:raise IdempotenceException: if an idempotent request caused a conflict (HTTP status code 409)
|
|
73
|
+
:raise ValidationException: if the request was not correct and couldn't be processed (HTTP status code 400)
|
|
74
|
+
:raise AuthorizationException: if the request was not allowed (HTTP status code 403)
|
|
75
|
+
:raise ReferenceException: if an object was attempted to be referenced that doesn't exist or has been removed,
|
|
76
|
+
or there was a conflict (HTTP status code 404, 409 or 410)
|
|
77
|
+
:raise PlatformException: if something went wrong at the payment platform,
|
|
78
|
+
the payment platform was unable to process a message from a downstream partner/acquirer,
|
|
79
|
+
or the service that you're trying to reach is temporary unavailable (HTTP status code 500, 502 or 503)
|
|
80
|
+
:raise ApiException: if the payment platform returned any other error
|
|
81
|
+
"""
|
|
82
|
+
uri = self._instantiate_uri("/v2/{merchantId}/webhooks/sendtest", None)
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
try:
|
|
86
|
+
return self._communicator.post(
|
|
87
|
+
uri,
|
|
88
|
+
self._client_headers,
|
|
89
|
+
None,
|
|
90
|
+
body,
|
|
91
|
+
None,
|
|
92
|
+
context)
|
|
93
|
+
|
|
94
|
+
except ResponseException as e:
|
|
95
|
+
error_type = ErrorResponse
|
|
96
|
+
error_object = self._communicator.marshaller.unmarshal(e.body, error_type)
|
|
97
|
+
raise create_exception(e.status_code, e.body, error_object, context)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
#
|
|
3
|
+
# This file was automatically generated.
|
|
4
|
+
#
|
|
5
|
+
from typing import List, Optional
|
|
6
|
+
|
|
7
|
+
from .api_exception import ApiException
|
|
8
|
+
|
|
9
|
+
from onlinepayments.sdk.domain.api_error import APIError
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class PlatformException(ApiException):
|
|
13
|
+
"""
|
|
14
|
+
Represents an error response from the payment platform when something went wrong at the payment platform or further downstream.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
def __init__(self, status_code: int, response_body: str, error_id: Optional[str], errors: Optional[List[APIError]],
|
|
18
|
+
message: str = "the payment platform returned an error response"):
|
|
19
|
+
super(PlatformException, self).__init__(status_code, response_body, error_id, errors, message)
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
from typing import Optional
|
|
2
|
+
from urllib.parse import urlparse
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class ProxyConfiguration(object):
|
|
6
|
+
"""
|
|
7
|
+
HTTP proxy configuration.
|
|
8
|
+
|
|
9
|
+
Can be initialised directly from a host and port or can be constructed from a uri using fromuri
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
def __init__(self, host: str, port: int, scheme: str = "http", username: Optional[str] = None, password: Optional[str] = None):
|
|
13
|
+
if not host:
|
|
14
|
+
raise ValueError("host is required")
|
|
15
|
+
if not port:
|
|
16
|
+
raise ValueError("port is required")
|
|
17
|
+
if port <= 0 or port > 65535:
|
|
18
|
+
raise ValueError("""port "{}" is invalid""".format(port))
|
|
19
|
+
self.__scheme = scheme
|
|
20
|
+
self.__host = host
|
|
21
|
+
self.__port = port
|
|
22
|
+
self.__username = username
|
|
23
|
+
self.__password = password
|
|
24
|
+
|
|
25
|
+
@staticmethod
|
|
26
|
+
def from_uri(uri: str, username: Optional[str] = None, password: Optional[str] = None) -> 'ProxyConfiguration':
|
|
27
|
+
"""
|
|
28
|
+
Constructs a ProxyConfiguration from a URI; if username and/or password
|
|
29
|
+
are given they will be used instead of corresponding data in the URI
|
|
30
|
+
"""
|
|
31
|
+
parsed = urlparse(uri)
|
|
32
|
+
scheme = parsed.scheme
|
|
33
|
+
host = parsed.hostname + parsed.path
|
|
34
|
+
port = parsed.port
|
|
35
|
+
if username is None:
|
|
36
|
+
username = parsed.username
|
|
37
|
+
if password is None:
|
|
38
|
+
password = parsed.password
|
|
39
|
+
if port is None:
|
|
40
|
+
if scheme == "http":
|
|
41
|
+
port = 80
|
|
42
|
+
elif scheme == "https":
|
|
43
|
+
port = 443
|
|
44
|
+
else:
|
|
45
|
+
raise ValueError("unsupported scheme: " + scheme)
|
|
46
|
+
return ProxyConfiguration(scheme=scheme,
|
|
47
|
+
host=host,
|
|
48
|
+
port=port,
|
|
49
|
+
username=username,
|
|
50
|
+
password=password)
|
|
51
|
+
|
|
52
|
+
@property
|
|
53
|
+
def scheme(self) -> str:
|
|
54
|
+
return self.__scheme
|
|
55
|
+
|
|
56
|
+
@scheme.setter
|
|
57
|
+
def scheme(self, scheme: str) -> None:
|
|
58
|
+
self.__scheme = scheme
|
|
59
|
+
|
|
60
|
+
@property
|
|
61
|
+
def host(self) -> str:
|
|
62
|
+
return self.__host
|
|
63
|
+
|
|
64
|
+
@host.setter
|
|
65
|
+
def host(self, host: str) -> None:
|
|
66
|
+
self.__host = host
|
|
67
|
+
|
|
68
|
+
@property
|
|
69
|
+
def port(self) -> int:
|
|
70
|
+
return self.__port
|
|
71
|
+
|
|
72
|
+
@port.setter
|
|
73
|
+
def port(self, port: int) -> None:
|
|
74
|
+
self.__port = port
|
|
75
|
+
|
|
76
|
+
@property
|
|
77
|
+
def username(self) -> Optional[str]:
|
|
78
|
+
return self.__username
|
|
79
|
+
|
|
80
|
+
@username.setter
|
|
81
|
+
def username(self, username: Optional[str]) -> None:
|
|
82
|
+
self.__username = username
|
|
83
|
+
|
|
84
|
+
@property
|
|
85
|
+
def password(self) -> Optional[str]:
|
|
86
|
+
return self.__password
|
|
87
|
+
|
|
88
|
+
@password.setter
|
|
89
|
+
def password(self, password: Optional[str]) -> None:
|
|
90
|
+
self.__password = password
|
|
91
|
+
|
|
92
|
+
def __str__(self):
|
|
93
|
+
"""
|
|
94
|
+
Return a proxy string in the form scheme://username:password@host:port
|
|
95
|
+
or scheme://host:port if authentication is absent
|
|
96
|
+
|
|
97
|
+
Supports HTTP Basic Auth
|
|
98
|
+
"""
|
|
99
|
+
if self.username is None or self.password is None:
|
|
100
|
+
return r"{0}://{1}:{2}".format(self.scheme, self.host, self.port)
|
|
101
|
+
else:
|
|
102
|
+
return r"{0}://{3}:{4}@{1}:{2}".format(self.scheme, self.host, self.port, self.username, self.password)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
#
|
|
3
|
+
# This file was automatically generated.
|
|
4
|
+
#
|
|
5
|
+
from typing import List, Optional
|
|
6
|
+
|
|
7
|
+
from .api_exception import ApiException
|
|
8
|
+
|
|
9
|
+
from onlinepayments.sdk.domain.api_error import APIError
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class ReferenceException(ApiException):
|
|
13
|
+
"""
|
|
14
|
+
Represents an error response from the payment platform when a non-existing or removed object is trying to be accessed.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
def __init__(self, status_code: int, response_body: str, error_id: Optional[str], errors: Optional[List[APIError]],
|
|
18
|
+
message: str = "the payment platform returned a reference error response"):
|
|
19
|
+
super(ReferenceException, self).__init__(status_code, response_body, error_id, errors, message)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
#
|
|
3
|
+
# This file was automatically generated.
|
|
4
|
+
#
|
|
5
|
+
from typing import List, Optional
|
|
6
|
+
|
|
7
|
+
from .api_exception import ApiException
|
|
8
|
+
|
|
9
|
+
from onlinepayments.sdk.domain.api_error import APIError
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class ValidationException(ApiException):
|
|
13
|
+
"""
|
|
14
|
+
Represents an error response from the payment platform when validation of requests failed.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
def __init__(self, status_code: int, response_body: str, error_id: Optional[str], errors: Optional[List[APIError]],
|
|
18
|
+
message: str = "the payment platform returned an incorrect request error response"):
|
|
19
|
+
super(ValidationException, self).__init__(status_code, response_body, error_id, errors, message)
|
|
File without changes
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
class ApiVersionMismatchException(RuntimeError):
|
|
2
|
+
"""
|
|
3
|
+
Represents an error because a webhooks event has an API version that this version of the SDK does not support.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
def __init__(self, event_api_version: str, sdk_api_version: str):
|
|
7
|
+
super(ApiVersionMismatchException, self).__init__(
|
|
8
|
+
"event API version" + event_api_version + " is not compatible with SDK API version" + sdk_api_version)
|
|
9
|
+
self.__event_api_version = event_api_version
|
|
10
|
+
self.__sdk_api_version = sdk_api_version
|
|
11
|
+
|
|
12
|
+
@property
|
|
13
|
+
def event_api_version(self) -> str:
|
|
14
|
+
"""
|
|
15
|
+
:return: The API version from the webhooks event.
|
|
16
|
+
"""
|
|
17
|
+
return self.__event_api_version
|
|
18
|
+
|
|
19
|
+
@property
|
|
20
|
+
def sdk_api_version(self) -> str:
|
|
21
|
+
"""
|
|
22
|
+
:return: The API version that this version of the SDK supports.
|
|
23
|
+
"""
|
|
24
|
+
return self.__sdk_api_version
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
from .secret_key_not_available_exception import SecretKeyNotAvailableException
|
|
2
|
+
from .secret_key_store import SecretKeyStore
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class InMemorySecretKeyStore(SecretKeyStore):
|
|
6
|
+
"""
|
|
7
|
+
An in-memory secret key store.
|
|
8
|
+
This implementation can be used in applications where secret keys can be
|
|
9
|
+
specified at application startup.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
@staticmethod
|
|
13
|
+
def instance() -> 'InMemorySecretKeyStore':
|
|
14
|
+
return _IN_MEMORY_SECRET_KEY_CACHE_INSTANCE
|
|
15
|
+
|
|
16
|
+
__store = {}
|
|
17
|
+
|
|
18
|
+
def get_secret_key(self, key_id: str) -> str:
|
|
19
|
+
try:
|
|
20
|
+
secret_key = self.__store[key_id]
|
|
21
|
+
except KeyError:
|
|
22
|
+
raise SecretKeyNotAvailableException("could not find secret key for key id " + key_id, key_id)
|
|
23
|
+
return secret_key
|
|
24
|
+
|
|
25
|
+
def store_secret_key(self, key_id: str, secret_key: str) -> None:
|
|
26
|
+
"""
|
|
27
|
+
Stores the given secret key for the given key ID.
|
|
28
|
+
"""
|
|
29
|
+
if key_id is None or not key_id.strip():
|
|
30
|
+
raise ValueError("key_id is required")
|
|
31
|
+
elif secret_key is None or not secret_key.strip():
|
|
32
|
+
raise ValueError("secret_key is required")
|
|
33
|
+
self.__store[key_id] = secret_key
|
|
34
|
+
|
|
35
|
+
def remove_secret_key(self, key_id: str) -> None:
|
|
36
|
+
"""
|
|
37
|
+
Removes the secret key for the given key ID.
|
|
38
|
+
"""
|
|
39
|
+
self.__store.pop(key_id)
|
|
40
|
+
|
|
41
|
+
def clear(self) -> None:
|
|
42
|
+
"""
|
|
43
|
+
Removes all stored secret keys.
|
|
44
|
+
"""
|
|
45
|
+
self.__store.clear()
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
_IN_MEMORY_SECRET_KEY_CACHE_INSTANCE = InMemorySecretKeyStore()
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
from typing import Optional
|
|
2
|
+
|
|
3
|
+
from .signature_validation_exception import SignatureValidationException
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class SecretKeyNotAvailableException(SignatureValidationException):
|
|
7
|
+
"""
|
|
8
|
+
Represents an error that causes a secret key to not be available.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
def __init__(self, key_id: str, message: Optional[str] = None, cause: Optional[Exception] = None):
|
|
12
|
+
super(SecretKeyNotAvailableException, self).__init__(message=message,
|
|
13
|
+
cause=cause)
|
|
14
|
+
self.__key_id = key_id
|
|
15
|
+
|
|
16
|
+
@property
|
|
17
|
+
def key_id(self) -> str:
|
|
18
|
+
return self.__key_id
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
from abc import ABC, abstractmethod
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class SecretKeyStore(ABC):
|
|
5
|
+
"""
|
|
6
|
+
A store of secret keys. Implementations could store secret keys in a database, on disk, etc.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
@abstractmethod
|
|
10
|
+
def get_secret_key(self, key_id: str) -> str:
|
|
11
|
+
"""
|
|
12
|
+
:return: The secret key for the given key ID. Never None.
|
|
13
|
+
:raise SecretKeyNotAvailableException: If the secret key for the given key ID is not available.
|
|
14
|
+
"""
|
|
15
|
+
raise NotImplementedError
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
from typing import Optional
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class SignatureValidationException(RuntimeError):
|
|
5
|
+
"""
|
|
6
|
+
Represents an error while validating webhooks signatures.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
def __init__(self, message: Optional[str] = None, cause: Optional[Exception] = None):
|
|
10
|
+
if message and cause:
|
|
11
|
+
super(SignatureValidationException, self).__init__(message, cause)
|
|
12
|
+
elif message:
|
|
13
|
+
super(SignatureValidationException, self).__init__(message)
|
|
14
|
+
elif cause:
|
|
15
|
+
super(SignatureValidationException, self).__init__(cause)
|
|
16
|
+
else:
|
|
17
|
+
super(SignatureValidationException, self).__init__()
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import hmac
|
|
2
|
+
import hashlib
|
|
3
|
+
from base64 import b64encode
|
|
4
|
+
from typing import Union, Sequence
|
|
5
|
+
|
|
6
|
+
from .secret_key_store import SecretKeyStore
|
|
7
|
+
from .signature_validation_exception import SignatureValidationException
|
|
8
|
+
|
|
9
|
+
from onlinepayments.sdk.communication.request_header import RequestHeader
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class SignatureValidator(object):
|
|
13
|
+
"""
|
|
14
|
+
Validator for webhooks signatures.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
def __init__(self, secret_key_store: SecretKeyStore):
|
|
18
|
+
if secret_key_store is None:
|
|
19
|
+
raise ValueError("secret_key_store is required")
|
|
20
|
+
self.__secret_key_store = secret_key_store
|
|
21
|
+
|
|
22
|
+
def validate(self, body: Union[str, bytes], request_headers: Sequence[RequestHeader]) -> None:
|
|
23
|
+
"""
|
|
24
|
+
Validates the given body using the given request headers.
|
|
25
|
+
|
|
26
|
+
:raise SignatureValidationException: If the body could not be validated successfully.
|
|
27
|
+
"""
|
|
28
|
+
self.__validate_body(body, request_headers)
|
|
29
|
+
|
|
30
|
+
def __validate_body(self, body: Union[str, bytes], request_headers: Sequence[RequestHeader]) -> None:
|
|
31
|
+
signature = self.__get_header_value(request_headers, "X-GCS-Signature")
|
|
32
|
+
key_id = self.__get_header_value(request_headers, "X-GCS-KeyId")
|
|
33
|
+
secret_key = self.__secret_key_store.get_secret_key(key_id)
|
|
34
|
+
unencoded_result = hmac.new(secret_key.encode("utf-8"), body, hashlib.sha256).digest()
|
|
35
|
+
expected_signature = b64encode(unencoded_result)
|
|
36
|
+
is_valid = hmac.compare_digest(signature.encode("utf-8"), expected_signature)
|
|
37
|
+
if is_valid is False:
|
|
38
|
+
raise SignatureValidationException("failed to validate signature: " + signature)
|
|
39
|
+
|
|
40
|
+
@staticmethod
|
|
41
|
+
def __get_header_value(request_headers: Sequence[RequestHeader], header_name: str) -> str:
|
|
42
|
+
value = None
|
|
43
|
+
for header in request_headers:
|
|
44
|
+
if header_name.lower() == header.name.lower():
|
|
45
|
+
if value is None:
|
|
46
|
+
value = header.value
|
|
47
|
+
else:
|
|
48
|
+
raise SignatureValidationException("encountered multiple occurrences of header '" + header_name + "'")
|
|
49
|
+
if value is None:
|
|
50
|
+
raise SignatureValidationException("could not find header '" + header_name + "'")
|
|
51
|
+
return value
|
|
52
|
+
|
|
53
|
+
# Used for unit tests
|
|
54
|
+
@property
|
|
55
|
+
def secret_key_store(self) -> SecretKeyStore:
|
|
56
|
+
return self.__secret_key_store
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
#
|
|
2
|
+
# This file was automatically generated.
|
|
3
|
+
#
|
|
4
|
+
from typing import Sequence, Union
|
|
5
|
+
|
|
6
|
+
from onlinepayments.sdk.communication.request_header import RequestHeader
|
|
7
|
+
from onlinepayments.sdk.domain.web_hooks_event import WebhooksEvent
|
|
8
|
+
from onlinepayments.sdk.json.marshaller import Marshaller
|
|
9
|
+
from .api_version_mismatch_exception import ApiVersionMismatchException
|
|
10
|
+
from .secret_key_store import SecretKeyStore
|
|
11
|
+
from .signature_validator import SignatureValidator
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class WebhooksHelper(object):
|
|
15
|
+
"""
|
|
16
|
+
Online Payments platform v1 webhooks helper.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
def __init__(self, marshaller: Marshaller, secret_key_store: SecretKeyStore):
|
|
20
|
+
if marshaller is None:
|
|
21
|
+
raise ValueError("marshaller is required")
|
|
22
|
+
self.__marshaller = marshaller
|
|
23
|
+
self.__signature_validator = SignatureValidator(secret_key_store)
|
|
24
|
+
|
|
25
|
+
def unmarshal(self, body: Union[str, bytes], request_headers: Sequence[RequestHeader]) -> WebhooksEvent:
|
|
26
|
+
"""
|
|
27
|
+
Unmarshals the given body, while also validating it using the given request headers.
|
|
28
|
+
|
|
29
|
+
:raise SignatureValidationException: If the body could not be validated successfully.
|
|
30
|
+
:raise ApiVersionMismatchException: If the resulting event has an API
|
|
31
|
+
version that this version of the SDK does not support.
|
|
32
|
+
:return: The body unmarshalled as a WebhooksEvent.
|
|
33
|
+
"""
|
|
34
|
+
self.__signature_validator.validate(body, request_headers)
|
|
35
|
+
|
|
36
|
+
event = self.__marshaller.unmarshal(body.decode('utf-8'), WebhooksEvent)
|
|
37
|
+
self.__validate_api_version(event)
|
|
38
|
+
return event
|
|
39
|
+
|
|
40
|
+
@staticmethod
|
|
41
|
+
def __validate_api_version(event: WebhooksEvent) -> None:
|
|
42
|
+
if "v1" != event.api_version:
|
|
43
|
+
raise ApiVersionMismatchException(event.api_version, "v1")
|
|
44
|
+
|
|
45
|
+
# Used for unit tests
|
|
46
|
+
@property
|
|
47
|
+
def marshaller(self) -> Marshaller:
|
|
48
|
+
return self.__marshaller
|
|
49
|
+
|
|
50
|
+
@property
|
|
51
|
+
def secret_key_store(self) -> SecretKeyStore:
|
|
52
|
+
return self.__signature_validator.secret_key_store
|