From 4de50e3491f3146fab331936259d1d9af8b89eb6 Mon Sep 17 00:00:00 2001 From: aasgoel Date: Fri, 7 Jun 2024 12:33:25 +0530 Subject: [PATCH 01/29] commenting out updateinvoices --- .../InvoiceSettings/updateinvoicesettings.py | 120 +++++++++--------- 1 file changed, 60 insertions(+), 60 deletions(-) diff --git a/samples/Invoicing/InvoiceSettings/updateinvoicesettings.py b/samples/Invoicing/InvoiceSettings/updateinvoicesettings.py index 2cee9fb..dbf1712 100644 --- a/samples/Invoicing/InvoiceSettings/updateinvoicesettings.py +++ b/samples/Invoicing/InvoiceSettings/updateinvoicesettings.py @@ -1,73 +1,73 @@ -from CyberSource import * -from pathlib import Path -import os -import json -from importlib.machinery import SourceFileLoader +# from CyberSource import * +# from pathlib import Path +# import os +# import json +# from importlib.machinery import SourceFileLoader -config_file = os.path.join(os.getcwd(), "data", "Configuration.py") -configuration = SourceFileLoader("module.name", config_file).load_module() +# config_file = os.path.join(os.getcwd(), "data", "Configuration.py") +# configuration = SourceFileLoader("module.name", config_file).load_module() -# To delete None values in Input Request Json body -def del_none(d): - for key, value in list(d.items()): - if value is None: - del d[key] - elif isinstance(value, dict): - del_none(value) - return d +# # To delete None values in Input Request Json body +# def del_none(d): +# for key, value in list(d.items()): +# if value is None: +# del d[key] +# elif isinstance(value, dict): +# del_none(value) +# return d -def updateinvoicesettings(): - invoiceSettingsInformationMerchantLogo = "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" - invoiceSettingsInformationMerchantDisplayName = "Custom Merchant Display Name" - invoiceSettingsInformationCustomEmailMessage = "Custom merchant email message" - invoiceSettingsInformationEnableReminders = True - invoiceSettingsInformationHeaderStyleFontColor = "#000001" - invoiceSettingsInformationHeaderStyleBackgroundColor = "#FFFFFF" - invoiceSettingsInformationHeaderStyle = InvoicingV2InvoiceSettingsGet200ResponseInvoiceSettingsInformationHeaderStyle( - font_color = invoiceSettingsInformationHeaderStyleFontColor, - background_color = invoiceSettingsInformationHeaderStyleBackgroundColor - ) +# def updateinvoicesettings(): +# invoiceSettingsInformationMerchantLogo = "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" +# invoiceSettingsInformationMerchantDisplayName = "Custom Merchant Display Name" +# invoiceSettingsInformationCustomEmailMessage = "Custom merchant email message" +# invoiceSettingsInformationEnableReminders = True +# invoiceSettingsInformationHeaderStyleFontColor = "#000001" +# invoiceSettingsInformationHeaderStyleBackgroundColor = "#FFFFFF" +# invoiceSettingsInformationHeaderStyle = InvoicingV2InvoiceSettingsGet200ResponseInvoiceSettingsInformationHeaderStyle( +# font_color = invoiceSettingsInformationHeaderStyleFontColor, +# background_color = invoiceSettingsInformationHeaderStyleBackgroundColor +# ) - invoiceSettingsInformationDeliveryLanguage = "en-US" - invoiceSettingsInformationDefaultCurrencyCode = "USD" - invoiceSettingsInformationPayerAuthenticationInInvoicing = "enable" - invoiceSettingsInformation = Invoicingv2invoiceSettingsInvoiceSettingsInformation( - merchant_logo = invoiceSettingsInformationMerchantLogo, - merchant_display_name = invoiceSettingsInformationMerchantDisplayName, - custom_email_message = invoiceSettingsInformationCustomEmailMessage, - enable_reminders = invoiceSettingsInformationEnableReminders, - header_style = invoiceSettingsInformationHeaderStyle.__dict__, - delivery_language = invoiceSettingsInformationDeliveryLanguage, - default_currency_code = invoiceSettingsInformationDefaultCurrencyCode, - payer_authentication_in_invoicing = invoiceSettingsInformationPayerAuthenticationInInvoicing - ) +# invoiceSettingsInformationDeliveryLanguage = "en-US" +# invoiceSettingsInformationDefaultCurrencyCode = "USD" +# invoiceSettingsInformationPayerAuthenticationInInvoicing = "enable" +# invoiceSettingsInformation = Invoicingv2invoiceSettingsInvoiceSettingsInformation( +# merchant_logo = invoiceSettingsInformationMerchantLogo, +# merchant_display_name = invoiceSettingsInformationMerchantDisplayName, +# custom_email_message = invoiceSettingsInformationCustomEmailMessage, +# enable_reminders = invoiceSettingsInformationEnableReminders, +# header_style = invoiceSettingsInformationHeaderStyle.__dict__, +# delivery_language = invoiceSettingsInformationDeliveryLanguage, +# default_currency_code = invoiceSettingsInformationDefaultCurrencyCode, +# payer_authentication_in_invoicing = invoiceSettingsInformationPayerAuthenticationInInvoicing +# ) - requestObj = InvoiceSettingsRequest( - invoice_settings_information = invoiceSettingsInformation.__dict__ - ) +# requestObj = InvoiceSettingsRequest( +# invoice_settings_information = invoiceSettingsInformation.__dict__ +# ) - requestObj = del_none(requestObj.__dict__) - requestObj = json.dumps(requestObj) +# requestObj = del_none(requestObj.__dict__) +# requestObj = json.dumps(requestObj) - try: - config_obj = configuration.Configuration() - client_config = config_obj.get_configuration() - api_instance = InvoiceSettingsApi(client_config) - return_data, status, body = api_instance.update_invoice_settings(requestObj) +# try: +# config_obj = configuration.Configuration() +# client_config = config_obj.get_configuration() +# api_instance = InvoiceSettingsApi(client_config) +# return_data, status, body = api_instance.update_invoice_settings(requestObj) - print("\nAPI RESPONSE CODE : ", status) - print("\nAPI RESPONSE BODY : ", body) +# print("\nAPI RESPONSE CODE : ", status) +# print("\nAPI RESPONSE BODY : ", body) - write_log_audit(status) - return return_data - except Exception as e: - write_log_audit(e.status if hasattr(e, 'status') else 999) - print("\nException when calling InvoiceSettingsApi->update_invoice_settings: %s\n" % e) +# write_log_audit(status) +# return return_data +# except Exception as e: +# write_log_audit(e.status if hasattr(e, 'status') else 999) +# print("\nException when calling InvoiceSettingsApi->update_invoice_settings: %s\n" % e) -def write_log_audit(status): - print(f"[Sample Code Testing] [{Path(__file__).stem}] {status}") +# def write_log_audit(status): +# print(f"[Sample Code Testing] [{Path(__file__).stem}] {status}") -if __name__ == "__main__": - updateinvoicesettings() +# if __name__ == "__main__": +# updateinvoicesettings() From a186caa1e1b9a714a7c30072c485a510f93d76e4 Mon Sep 17 00:00:00 2001 From: aasgoel Date: Fri, 7 Jun 2024 13:45:20 +0530 Subject: [PATCH 02/29] Ignoring the auth tests --- sampleCodeIgnoreList.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/sampleCodeIgnoreList.txt b/sampleCodeIgnoreList.txt index 0cc09df..f50d12c 100644 --- a/sampleCodeIgnoreList.txt +++ b/sampleCodeIgnoreList.txt @@ -2,3 +2,4 @@ .*/data/.* .*Flex_Security_Exception.py .*/Webhooks/.* +.*/authentication/.* From c80b828598b6427711df728824e613c32cfcfd72 Mon Sep 17 00:00:00 2001 From: aasgoel Date: Mon, 10 Jun 2024 10:42:21 +0530 Subject: [PATCH 03/29] Adding the required Validation Files --- .../csharp_expected_results.json | 209 +++++++ .../java_expected_results.json | 210 +++++++ .../json_expected_results.json | 528 ++++++++++++++++++ .../node_expected_results.json | 199 +++++++ .../ExpectedResults/php_expected_results.json | 185 ++++++ .../python_expected_results.json | 211 +++++++ .../ruby_expected_results.json | 211 +++++++ Validation/json_to_prettified_html.py | 171 ++++++ Validation/response_code_validator.py | 96 ++++ Validation/sample_code_log_processor.py | 67 +++ 10 files changed, 2087 insertions(+) create mode 100644 Validation/ExpectedResults/csharp_expected_results.json create mode 100644 Validation/ExpectedResults/java_expected_results.json create mode 100644 Validation/ExpectedResults/json_expected_results.json create mode 100644 Validation/ExpectedResults/node_expected_results.json create mode 100644 Validation/ExpectedResults/php_expected_results.json create mode 100644 Validation/ExpectedResults/python_expected_results.json create mode 100644 Validation/ExpectedResults/ruby_expected_results.json create mode 100644 Validation/json_to_prettified_html.py create mode 100644 Validation/response_code_validator.py create mode 100644 Validation/sample_code_log_processor.py diff --git a/Validation/ExpectedResults/csharp_expected_results.json b/Validation/ExpectedResults/csharp_expected_results.json new file mode 100644 index 0000000..ff3a6bb --- /dev/null +++ b/Validation/ExpectedResults/csharp_expected_results.json @@ -0,0 +1,209 @@ +{ + "StandAloneHttpSignature": "200", + "StandAloneJWT": "200", + "DeleteMethod": "200", + "GetMethod": "404", + "GetObjectMethod": "404", + "PostMethod": "201", + "PostObjectMethod": "201", + "PutMethod": "201", + "DeleteGenerateHeaders": "200", + "GetGenerateHeaders": "200", + "PostGenerateHeaders": "200", + "PutGenerateHeaders": "200", + "GenerateKeyLegacyTokenFormat": "200", + "FlexTokenizeCard": "200", + "GenerateKey": "200", + "CreateAndSendInvoiceImmediately": "201", + "CreateDraftInvoice": "201", + "CreateInvoiceAndAssignItSpecificInvoiceNumber": "400", + "CreateInvoiceWithoutSendingIt": "400", + "GetInvoiceDetails": "200", + "GetInvoiceSettings": "200", + "UpdateInvoiceSettings": "200", + "AuthenticationWithNewAccount": "201", + "AuthenticationWithNORedirect": "201", + "EnrollWithCustomerIdAsPaymentInformation": "201", + "EnrollWithPendingAuthentication": "201", + "EnrollWithTransientToken": "400", + "EnrollWithTravelInformation": "201", + "PendingAuthenticationWithUnknownPath": "201", + "SetupCompletionWithCardNumber": "201", + "SetupCompletionWithFlexTransientToken": "400", + "SetupCompletionWithFluidDataValueAndPaymentSolution": "400", + "SetupCompletionWithSecureStorageToken": "400", + "SetupCompletionWithTMSToken": "201", + "SetupCompletionWithTokenizedCard": "201", + "ValidateAuthenticationResults": "201", + "AuthorizationUsingSwipedTrackData": "201", + "CaptureOfAuthorizationThatUsedSwipedTrackData": "400", + "SimpleAuthorizationInternet": "201", + "CapturePayment": "201", + "ServiceFeesWithCreditCardTransaction": "201", + "CapturePaymentServiceFee": "201", + "RestaurantAuthorization": "201", + "RestaurantCaptureWithGratuity": "400", + "Credit": "201", + "CreditUsingBluefinPCIP2PEForCardPresentEnabledAcquirer": "502", + "CreditUsingBluefinPCIP2PEWithVisaPlatformConnect": "502", + "CreditWithCustomerPaymentInstrumentAndShippingAddressTokenId": "201", + "CreditWithCustomerTokenId": "201", + "CreditWithInstrumentIdentifierTokenId": "201", + "ElectronicCheckStandAloneCredits": "201", + "ServiceFeesCredit": "201", + "AmericanExpressDirectEMVWithContactRead": "201", + "AuthorizationCaptureForTimeoutVoidFlow": "201", + "AuthorizationForIncrementalAuthorizationFlow": "201", + "AuthorizationForTimeoutReversalFlow": "201", + "AuthorizationSkipDecisionManagerForSingleTransaction": "201", + "AuthorizationUsingBluefinPCIP2PEForCardPresentEnabledAcquirer": "502", + "AuthorizationUsingBluefinPCIP2PEWithVisaPlatformConnect": "502", + "AuthorizationWithCaptureSale": "201", + "AuthorizationWithCustomerPaymentInstrumentAndShippingAddressTokenId": "201", + "AuthorizationWithCustomerTokenCreation": "201", + "AuthorizationWithCustomerTokenDefaultPaymentInstrumentAndShippingAddressCreation": "201", + "AuthorizationWithCustomerTokenId": "201", + "AuthorizationWithDecisionManager": "201", + "AuthorizationWithDecisionManagerBuyerInformation": "201", + "AuthorizationWithDecisionManagerCustomSetup": "201", + "AuthorizationWithDecisionManagerDeviceInformation": "201", + "AuthorizationWithDecisionManagerMerchantDefinedInformation": "201", + "AuthorizationWithDecisionManagerShippingInformation": "201", + "AuthorizationWithDecisionManagerTravelInformation": "201", + "AuthorizationWithDMAcceptPAEnroll": "201", + "AuthorizationWithDMRejectPAEnroll": "201", + "AuthorizationWithDMReviewPAEnroll": "201", + "AuthorizationWithInstrumentIdentifierTokenCreation": "201", + "AuthorizationWithInstrumentIdentifierTokenId": "201", + "AuthorizationWithLegacyToken": "201", + "AuthorizationWithPAEnrollAuthenticationNeeded": "201", + "AuthorizationWithPayerAuthValidation": "201", + "AuthorizationWithTMSTokenBypassingNetworkToken": "201", + "DigitalPaymentGooglePay": "201", + "DigitalPaymentsApplePay": "201", + "ElectronicCheckDebits": "201", + "ElectronicCheckDebitsWithLegacyToken": "201", + "IncrementalAuthorization": "400", + "LevelIIData": "201", + "LevelIIIData": "201", + "PartialAuthorization": "201", + "PaymentNetworkTokenization": "201", + "PaymentWithFlexToken": "400", + "PaymentWithFlexTokenCreatePermanentTMSToken": "400", + "SaleUsingEMVTechnologyWithContactless": "201", + "SaleUsingEMVTechnologyWithContactlessReadForCardPresentEnabledAcquirer": "201", + "SaleUsingEMVTechnologyWithContactlessReadWithVisaPlatformConnect": "201", + "SaleUsingEMVTechnologyWithContactReadOneForCardPresentEnabledAcquirer": "201", + "SaleUsingEMVTechnologyWithContactReadTwoForCardPresentEnabledAcquirer": "201", + "SaleUsingEMVTechnologyWithContactReadWithVisaPlatformConnect": "201", + "SaleUsingKeyedDataForCardPresentEnabledAcquirer": "201", + "SaleUsingKeyedDataWithBalanceInquiry": "201", + "SaleUsingKeyedDataWithVisaPlatformConnect": "201", + "SaleUsingSwipedTrackDataForCardPresentEnabledAcquirer": "201", + "SaleUsingSwipedTrackDataWithVisaPlatformConnect": "201", + "Swiped": "201", + "ZeroDollarAuthorization": "201", + "ElectronicCheckFollowonRefund": "201", + "RefundCapture": "201", + "RefundPayment": "201", + "ProcessAuthorizationReversal": "201", + "ServiceFeesAuthorizationReversal": "201", + "TimeoutReversal": "201", + "TimeoutVoid": "201", + "VoidCapture": "201", + "VoidCredit": "201", + "VoidPayment": "201", + "VoidRefund": "201", + "PayoutCardNotToken": "400", + "PayoutToken": "400", + "GetChargebackDetails": "404", + "GetChargebackSummaries": "404", + "GetConversionDetailTransactions": "400", + "InterchangeClearingLevelDataForAccountOrMerchant": "404", + "GetNetfundingInformationForAccountOrMerchant": "400", + "GetNotificationOfChanges": "400", + "GetPaymentBatchSummaryData": "400", + "GetPurchaseAndRefundDetails": "400", + "GetReportDefinition": "200", + "GetReportingResourceInformation": "200", + "DownloadReport": "404", + "CreateAdhocReport": "400", + "GetReportBasedOnReportId": "404", + "RetrieveAvailableReports": "200", + "CreateClassicStandardReportSubscription": "400", + "CreateReportSubscription": "400", + "DeleteSubscriptionOfReportNameByOrganization": "404", + "GetAllSubscriptions": "200", + "GetSubscriptionForReportName": "404", + "GetRetrievalDetails": "404", + "GetRetrievalSummaries": "404", + "AddDataToList": "201", + "AddDuplicateInformation": "201", + "BasicDMTransaction": "201", + "DMWithBuyerInformation": "201", + "DMWithDecisionProfileRejectResponse": "201", + "DMWithDeviceInformation": "201", + "DMWithMerchantDefinedInformation": "201", + "DMWithScoreExceedsThresholdResponse": "201", + "DMWithShippingInformation": "201", + "DMWithTravelInformation": "201", + "MarkAsSuspect": "201", + "RemoveFromHistory": "201", + "AddressMatchNotFound": "201", + "ApartmentNumberMissingOrNotFound": "201", + "CanadianBillingDetails": "201", + "ComplianceStatusCompleted": "201", + "CustomerMatchDeniedPartiesList": "201", + "ExportComplianceInformationProvided": "201", + "MultipleLineItems": "201", + "MultipleSanctionLists": "201", + "NoCompanyName": "201", + "ShippingDetailsNotUSOrCanada": "201", + "VerboseRequestWithAllFields": "201", + "DownloadFileWithFileIdentifier": "404", + "GetListOfFiles": "400", + "CreateCustomer": "201", + "DeleteCustomer": "204", + "RetrieveCustomer": "200", + "UpdateCustomer": "200", + "UpdateCustomersDefaultPaymentInstrument": "200", + "UpdateCustomersDefaultShippingAddress": "200", + "CreateCustomerDefaultPaymentInstrumentCard": "201", + "CreateCustomerNonDefaultPaymentInstrumentCard": "201", + "CreateCustomerPaymentInstrumentBankAccount": "201", + "CreateCustomerPaymentInstrumentPinlessDebit": "201", + "DeleteCustomerPaymentInstrument": "204", + "ListPaymentInstrumentsForCustomer": "200", + "RetrieveCustomerPaymentInstrument": "200", + "CreateCustomerDefaultShippingAddress": "201", + "CreateCustomerNonDefaultShippingAddress": "201", + "DeleteCustomerShippingAddress": "204", + "ListShippingAddressesForCustomer": "200", + "RetrieveCustomerShippingAddress": "200", + "CreateInstrumentIdentifierBankAccount": "200", + "CreateInstrumentIdentifierCard": "200", + "CreateInstrumentIdentifierCardEnrollForNetworkToken": "200", + "DeleteInstrumentIdentifier": "409", + "EnrollInstrumentIdentifierForNetworkTokenization": "202", + "ListPaymentInstrumentsForInstrumentIdentifier": "200", + "RetrieveInstrumentIdentifier": "200", + "UpdateInstrumentIdentifierPreviousTransactionId": "200", + "CreatePaymentInstrumentBankAccount": "201", + "CreatePaymentInstrumentCard": "201", + "CreatePaymentInstrumentPinlessDebit": "201", + "DeletePaymentInstrument": "204", + "RetrievePaymentInstrument": "200", + "UpdatePaymentInstrument": "200", + "GetIndividualBatchFile": "404", + "GetListOfBatchFiles": "404", + "GetTransactionDetailsForGivenBatchId": "404", + "RetrieveTransaction": "200", + "CreateSearchRequest": "201", + "GetSearchResults": "200", + "GetUserInformationDeprecated": "405", + "BasicTaxCalculationRequest": "201", + "CommittedTaxCallRequest": "201", + "CommittedTaxRefundCallRequest": "201", + "TaxRefundRequest": "201", + "VoidCommittedTaxCall": "201" +} \ No newline at end of file diff --git a/Validation/ExpectedResults/java_expected_results.json b/Validation/ExpectedResults/java_expected_results.json new file mode 100644 index 0000000..ea15002 --- /dev/null +++ b/Validation/ExpectedResults/java_expected_results.json @@ -0,0 +1,210 @@ +{ + "GetNetfundingInformationForAccountOrMerchant": "200", + "GetIndividualBatchFile": "404", + "GetListOfBatchFiles": "404", + "GetTransactionDetailsForGivenBatchId": "404", + "GenerateKey": "200", + "GenerateKeyLegacyTokenFormat": "200", + "FlexTokenizeCard": "200", + "GetPurchaseAndRefundDetails": "400", + "GetReportBasedOnReportId": "404", + "CreateAdhocReport": "400", + "RetrieveAvailableReports": "200", + "GetPaymentBatchSummaryData": "400", + "DeleteGenerateHeaders": "200", + "DeleteMethod": "200", + "PostObjectMethod": "201", + "PostGenerateHeaders": "200", + "StandAloneMetaKey": "400", + "GetObjectMethod": "404", + "GetGenerateHeaders": "200", + "reportDownload": "200", + "GetMethod": "404", + "PutMethod": "404", + "PutGenerateHeaders": "200", + "PostMethod": "201", + "StandaloneJwt": "200", + "SimpleAuthorizationInternet": "201", + "RetrieveTransaction": "200", + "DMWithScoreExceedsThresholdResponse": "201", + "DMWithMerchantDefinedInformation": "201", + "AddDuplicateInformation": "201", + "DMWithTravelInformation": "201", + "DMWithDeviceInformation": "201", + "DMWithDecisionProfileRejectResponse": "201", + "BasicDMTransaction": "201", + "MarkAsSuspect": "201", + "DMWithBuyerInformation": "201", + "RemoveFromHistory": "201", + "AddDataToList": "201", + "DMWithShippingInformation": "201", + "GetRetrievalSummaries": "404", + "CreateDraftInvoice": "201", + "GetInvoiceDetails": "200", + "CreateInvoiceWithoutSendingIt": "400", + "CreateInvoiceAndAssignItSpecificInvoiceNumber": "400", + "CreateAndSendInvoiceImmediately": "201", + "UpdateInvoiceSettings": "200", + "GetInvoiceSettings": "200", + "PayoutCardNotToken": "400", + "PayoutToken": "400", + "EnrollWithCustomerIdAsPaymentInformation": "201", + "SetupCompletionWithSecureStorageToken": "400", + "EnrollWithTransientToken": "400", + "SetupCompletionWithTokenizedCard": "201", + "EnrollWithTravelInformation": "201", + "ValidateAuthenticationResults": "201", + "AuthenticationWithNORedirect": "201", + "SetupCompletionWithFluidDataValueAndPaymentSolution": "400", + "AuthenticationWithNewAccount": "201", + "SetupCompletionWithFlexTransientToken": "400", + "PendingAuthenticationWithUnknownPath": "201", + "SetupCompletionWithCardNumber": "201", + "EnrollWithPendingAuthentication": "201", + "SetupCompletionWithTMSToken": "201", + "GetChargebackSummaries": "404", + "AmericanExpressDirectEMVWithContactRead": "201", + "AuthorizationWithCaptureSale": "201", + "AuthorizationWithDecisionManagerDeviceInformation": "201", + "AuthorizationWithInstrumentIdentifierTokenId": "201", + "ElectronicCheckDebitsWithLegacyToken": "201", + "RestaurantAuthorization": "201", + "SaleUsingKeyedDataWithBalanceInquiry": "201", + "AuthorizationForIncrementalAuthorizationFlow": "201", + "AuthorizationWithCustomerTokenCreation": "201", + "AuthorizationWithDecisionManagerShippingInformation": "201", + "AuthorizationWithPAEnrollAuthenticationNeeded": "201", + "LevelIIData": "201", + "SaleUsingEMVTechnologyWithContactlessReadForCardPresentEnabledAcquirer": "201", + "SaleUsingSwipedTrackDataForCardPresentEnabledAcquirer": "201", + "AuthorizationForTimeoutReversalFlow": "201", + "AuthorizationWithCustomerTokenDefaultPaymentInstrumentAndShippingAddressCreation": "201", + "AuthorizationWithDecisionManagerTravelInformation": "201", + "AuthorizationWithPayerAuthValidation": "201", + "LevelIIIData": "201", + "SaleUsingEMVTechnologyWithContactlessReadWithVisaPlatformConnect": "201", + "SaleUsingSwipedTrackDataWithVisaPlatformConnect": "201", + "AuthorizationUsingSwipedTrackData": "201", + "AuthorizationWithDecisionManagerCustomSetup": "201", + "AuthorizationWithInstrumentIdentifierTokenCreation": "201", + "ElectronicCheckDebits": "201", + "PaymentWithFlexTokenCreatePermanentTMSToken": "400", + "SaleUsingKeyedDataForCardPresentEnabledAcquirer": "201", + "ZeroDollarAuthorization": "201", + "AuthorizationUsingBluefinPCIP2PEWithVisaPlatformConnect": "502", + "AuthorizationWithDecisionManagerBuyerInformation": "201", + "AuthorizationWithDMReviewPAEnroll": "201", + "DigitalPaymentsApplePay": "201", + "PaymentWithFlexToken": "400", + "SaleUsingEMVTechnologyWithContactReadWithVisaPlatformConnect": "201", + "Swiped": "201", + "AuthorizationSkipDecisionManagerForSingleTransaction": "201", + "AuthorizationWithCustomerTokenId": "201", + "AuthorizationWithDMAcceptPAEnroll": "201", + "AuthorizationWithTMSTokenBypassingNetworkToken": "201", + "PartialAuthorization": "201", + "SaleUsingEMVTechnologyWithContactReadOneForCardPresentEnabledAcquirer": "201", + "ServiceFeesWithCreditCardTransaction": "201", + "AuthorizationUsingBluefinPCIP2PEForCardPresentEnabledAcquirer": "502", + "AuthorizationWithDecisionManager": "201", + "AuthorizationWithDMRejectPAEnroll": "201", + "DigitalPaymentGooglePay": "201", + "PaymentNetworkTokenization": "201", + "SaleUsingEMVTechnologyWithContactReadTwoForCardPresentEnabledAcquirer": "201", + "AuthorizationCaptureForTimeoutVoidFlow": "201", + "AuthorizationWithCustomerPaymentInstrumentAndShippingAddressTokenId": "201", + "AuthorizationWithDecisionManagerMerchantDefinedInformation": "201", + "AuthorizationWithLegacyToken": "201", + "IncrementalAuthorization": "201", + "SaleUsingEMVTechnologyWithContactless": "201", + "SaleUsingKeyedDataWithVisaPlatformConnect": "201", + "UpdateCustomersDefaultShippingAddress": "200", + "CreateCustomer": "201", + "UpdateCustomersDefaultPaymentInstrument": "200", + "UpdateCustomer": "200", + "DeleteCustomer": "204", + "RetrieveCustomer": "200", + "GetChargebackDetails": "404", + "ProcessAuthorizationReversal": "201", + "ServiceFeesAuthorizationReversal": "201", + "TimeoutReversal": "201", + "InterchangeClearingLevelDataForAccountOrMerchant": "404", + "GetRetrievalDetails": "404", + "GetNotificationOfChanges": "400", + "CreateCustomerNonDefaultShippingAddress": "201", + "CreateCustomerDefaultShippingAddress": "201", + "ListShippingAddressesForCustomer": "200", + "RetrieveCustomerShippingAddress": "200", + "DeleteCustomerShippingAddress": "204", + "GetConversionDetailTransactions": "400", + "GetReportingResourceInformation": "200", + "GetReportDefinition": "200", + "GetUserInformationDeprecated": "405", + "Credit": "201", + "CreditUsingBluefinPCIP2PEWithVisaPlatformConnect": "502", + "CreditWithCustomerPaymentInstrumentAndShippingAddressTokenId": "201", + "ServiceFeesCredit": "201", + "ElectronicCheckStandAloneCredits": "201", + "CreditWithCustomerTokenId": "201", + "CreditWithInstrumentIdentifierTokenId": "201", + "CreditUsingBluefinPCIP2PEForCardPresentEnabledAcquirer": "502", + "ComplianceStatusCompleted": "201", + "CanadianBillingDetails": "201", + "VerboseRequestWithAllFields": "201", + "ExportComplianceInformationProvided": "201", + "ApartmentNumberMissingOrNotFound": "201", + "ShippingDetailsNotUSOrCanada": "201", + "AddressMatchNotFound": "201", + "NoCompanyName": "201", + "MultipleLineItems": "201", + "MultipleSanctionLists": "201", + "CustomerMatchDeniedPartiesList": "201", + "CreateCustomerDefaultPaymentInstrumentCard": "201", + "CreateCustomerPaymentInstrumentBankAccount": "201", + "RetrieveCustomerPaymentInstrument": "200", + "ListPaymentInstrumentsForCustomer": "200", + "CreateCustomerPaymentInstrumentPinlessDebit": "201", + "CreateCustomerNonDefaultPaymentInstrumentCard": "201", + "DeleteCustomerPaymentInstrument": "204", + "RetrievePaymentInstrument": "200", + "CreatePaymentInstrumentCard": "201", + "DeletePaymentInstrument": "204", + "CreatePaymentInstrumentPinlessDebit": "201", + "CreatePaymentInstrumentBankAccount": "201", + "UpdatePaymentInstrument": "200", + "CreateClassicStandardReportSubscription": "400", + "GetSubscriptionForReportName": "404", + "GetAllSubscriptions": "200", + "CreateReportSubscription": "400", + "DeleteSubscriptionOfReportNameByOrganization": "404", + "CreateSearchRequest": "201", + "GetSearchResults": "200", + "DownloadFileWithFileIdentifier": "404", + "GetListOfFiles": "400", + "CommittedTaxCallRequest": "201", + "VoidCommittedTaxCall": "201", + "CommittedTaxRefundCallRequest": "201", + "TaxRefundRequest": "201", + "BasicTaxCalculationRequest": "201", + "ElectronicCheckFollowonRefund": "201", + "CapturePayment": "201", + "RefundCapture": "201", + "RefundPayment": "201", + "DownloadReport": "200", + "RestaurantCaptureWithGratuity": "400", + "CapturePaymentServiceFee": "201", + "CaptureOfAuthorizationThatUsedSwipedTrackData": "400", + "VoidCredit": "201", + "VoidPayment": "201", + "VoidCapture": "201", + "TimeoutVoid": "201", + "VoidRefund": "201", + "EnrollInstrumentIdentifierForNetworkTokenization": "202", + "CreateInstrumentIdentifierCard": "200", + "DeleteInstrumentIdentifier": "409", + "RetrieveInstrumentIdentifier": "200", + "CreateInstrumentIdentifierCardEnrollForNetworkToken": "200", + "UpdateInstrumentIdentifierPreviousTransactionId": "200", + "CreateInstrumentIdentifierBankAccount": "200", + "ListPaymentInstrumentsForInstrumentIdentifier": "200" +} \ No newline at end of file diff --git a/Validation/ExpectedResults/json_expected_results.json b/Validation/ExpectedResults/json_expected_results.json new file mode 100644 index 0000000..90b3f9d --- /dev/null +++ b/Validation/ExpectedResults/json_expected_results.json @@ -0,0 +1,528 @@ +{ + "/pts/v2/payments": { + "post": { + "Simple Authorization(Internet)": 201, + "Authorization with Capture(Sale)": 201, + "Payment with Flex Token": 400, + "Payment with Flex Token(Create Permanent TMS token)": 400, + "Authorization with Customer Token Creation": 201, + "Authorization with Customer Token Id": 400, + "Authorization with Customer Token, Default Payment Instrument and Shipping Address Creation": 400, + "Authorization with TMS Token bypassing Network Token": 201, + "Authorization with Customer, Payment Instrument and Shipping Address Token Id": 201, + "Authorization with Instrument Identifier Token Creation": 201, + "Authorization with Decision Manager": 201, + "Authorization - Skip DecisionManager for single transaction": 201, + "Authorization with Decision Manager (Device Information)": 201, + "Authorization with Decision Manager (Merchant Defined Information)": 201, + "Authorization with Decision Manager (Travel Information)": 201, + "Authorization with Decision Manager (Buyer Information)": 201, + "Authorization with Decision Manager (Shipping Information)": 201, + "Authorization with Decision Manager (custom setup)": 201, + "Authorization with PA Enroll (Authentication Needed)": 201, + "Authorization with Payer Auth Validation": 201, + "Authorization with DM(Accept) + PA Enroll": 201, + "Authorization with DM(Review) + PA Enroll": 201, + "Authorization with DM(Reject) + PA Enroll": 201, + "Payment Network Tokenization": 201, + "Digital Payment - GooglePay": 201, + "Digital Payments - ApplePay": 201, + "Zero Dollar Authorization": 201, + "Level II Data": 201, + "Level III Data": 201, + "Partial Authorization": 201, + "Electronic Check Debits": 201, + "Electronic Check Debits with Legacy Token": 400, + "Service Fees with Credit Card transaction": 201, + "Authorization Using Swiped Track Data": 201, + "Sale Using Swiped Track Data with Visa Platform Connect": 201, + "Sale Using Keyed Data with Visa Platform Connect": 201, + "Sale Using Keyed Data with Balance Inquiry": 201, + "Sale Using EMV Technology with Contact Read with Visa Platform Connect": 201, + "Sale Using EMV Technology with Contactless Read with Visa Platform Connect": 201, + "Authorization Using Bluefin PCI P2PE with Visa Platform Connect": 502, + "Restaurant Authorization": 201, + "Sale Using EMV Technology with a Contactless": 201, + "Sale Using EMV Technology with Contact Read (One) for Card Present Enabled Acquirer": 201, + "Swiped": 201, + "Sale Using Swiped Track Data for Card Present Enabled Acquirer": 201, + "Sale Using Keyed Data for Card Present Enabled Acquirer": 201, + "American Express Direct - EMV with Contact Read": 201, + "Sale Using EMV Technology with Contact Read (Two) for Card Present Enabled Acquirer": 201, + "Sale Using EMV Technology with Contactless Read for Card Present Enabled Acquirer": 201, + "Authorization Using Bluefin PCI P2PE for Card Present Enabled Acquirer": 502, + "Authorization with Instrument Identifier Token Id": 201, + "Authorization with Legacy Token": 400 + } + }, + "/pts/v2/payments/{id}": { + "patch": { + "Incremental Authorization": 400 + } + }, + "/pts/v2/payments/{id}/reversals": { + "post": { + "Process an Authorization Reversal": 201, + "Service Fees Authorization Reversal": 400 + } + }, + "/pts/v2/reversals/": { + "post": { + "Timeout Reversal": 400 + } + }, + "/pts/v2/payments/{id}/captures": { + "post": { + "Capture a Payment": 201, + "Capture a Payment - Service Fee": 400, + "Capture of Authorization that used Swiped track data": 401, + "Restaurant Capture with Gratuity": 401 + } + }, + "/pts/v2/payments/{id}/refunds": { + "post": { + "Refund a Payment": 400, + "Electronic check follow-on Refund": 400 + } + }, + "/pts/v2/captures/{id}/refunds": { + "post": { + "Refund a Capture": 201 + } + }, + "/pts/v2/credits": { + "post": { + "Credit": 201, + "Electronic Check Stand-Alone Credits": 201, + "Service Fees Credit": 201, + "Credit with Customer Token Id": 400, + "Credit with Customer, Payment Instrument and Shipping Address Token Id": 400, + "Credit with Instrument Identifier Token Id": 400, + "Credit Using Bluefin PCI P2PE with Visa Platform Connect": 502, + "Credit Using Bluefin PCI P2PE for Card Present Enabled Acquirer": 502 + } + }, + "/pts/v2/payments/{id}/voids": { + "post": { + "Void a Payment": 201 + } + }, + "/pts/v2/captures/{id}/voids": { + "post": { + "Void a Capture": 201 + } + }, + "/pts/v2/refunds/{id}/voids": { + "post": { + "Void a Refund": 201 + } + }, + "/pts/v2/credits/{id}/voids": { + "post": { + "Void a Credit": 201 + } + }, + "/pts/v2/voids/": { + "post": { + "Timeout void": 400 + } + }, + "/pts/v1/transaction-batches": { + "get": { + "Get a List of Batch Files": 404 + } + }, + "/pts/v1/transaction-batches/{id}": { + "get": { + "Get Individual Batch File": 401 + } + }, + "/pts/v1/transaction-batch-details/{id}": { + "get": { + "Get Transaction Details for a given Batch Id": 401 + } + }, + "/tms/v2/customers": { + "post": { + "Create Customer": 201 + } + }, + "/tms/v2/customers/{customerTokenId}": { + "get": { + "Retrieve a Customer": 200 + }, + "patch": { + "Update Customer": 200, + "Update Customers default Payment Instrument": 401, + "Update Customers default Shipping Address": 401 + } + }, + "/tms/v2/customers/{customerTokenId}/shipping-addresses": { + "post": { + "Create Customer Default Shipping Address": 201, + "Create Customer Non-Default Shipping Address": 201 + }, + "get": { + "List Shipping Addresses for a Customer": 200 + } + }, + "/tms/v2/customers/{customerTokenId}/shipping-addresses/{shippingAddressTokenId}": { + "get": { + "Retrieve a Customer Shipping Address": 200 + }, + "patch": { + "Update Customer Default Shipping Address": 200 + } + }, + "/tms/v2/customers/{customerTokenId}/payment-instruments": { + "post": { + "Create Customer Default Payment Instrument (Card)": 401, + "Create Customer Non-Default Payment Instrument (Card)": 401, + "Create Customer Payment Instrument (Bank Account)": 401, + "Create Customer Payment Instrument (Pinless Debit)": 401 + }, + "get": { + "List Payment Instruments for a Customer": 401 + } + }, + "/tms/v2/customers/{customerTokenId}/payment-instruments/{paymentInstrumentTokenId}": { + "get": { + "Retrieve a Customer Payment Instrument": 401 + }, + "patch": {} + }, + "/tms/v1/paymentinstruments": { + "post": { + "Create Payment Instrument (Card)": 400, + "Create Payment Instrument (Bank Account)": 400, + "Create Payment Instrument (Pinless Debit)": 400 + } + }, + "/tms/v1/paymentinstruments/{paymentInstrumentTokenId}": { + "get": { + "Retrieve a Payment Instrument": 401 + }, + "patch": { + "Update Payment Instrument": 401 + } + }, + "/tms/v1/instrumentidentifiers": { + "post": { + "Create Instrument Identifier (Card)": 200, + "Create Instrument Identifier (Bank Account)": 200, + "Create Instrument Identifier (Card & Enroll for Network Token)": 200 + } + }, + "/tms/v1/instrumentidentifiers/{instrumentIdentifierTokenId}": { + "get": { + "Retrieve an Instrument Identifier": 200 + }, + "patch": { + "Update Instrument Identifier previousTransactionId": 401 + } + }, + "/tms/v1/instrumentidentifiers/{instrumentIdentifierTokenId}/paymentinstruments": { + "get": { + "List Payment Instruments for an Instrument Identifier": 200 + } + }, + "/tms/v1/instrumentidentifiers/{instrumentIdentifierTokenId}/enrollment": { + "post": { + "Enroll Instrument Identifier for Network Tokenization": 202 + } + }, + "/flex/v1/keys": { + "post": { + "Generate Key": 200 + } + }, + "/flex/v1/tokens": { + "post": { + "Flex Tokenize Card": 400 + } + }, + "/risk/v1/decisions": { + "post": { + "Basic DM Transaction": 201, + "DM With Device Information": 201, + "DM With Merchant Defined Information": 201, + "DM With Travel Information": 201, + "DM With Buyer Information": 201, + "DM With Shipping Information": 201, + "DM With Score_Exceeds_Threshold Response": 201, + "DM With Decision_Profile_Reject Response": 201 + } + }, + "/risk/v1/authentication-setups": { + "post": { + "Setup Completion with Card Number": 201, + "Setup Completion with Fluid Data Value and Payment Solution": 400, + "Setup Completion with Tokenized Card": 201, + "Setup Completion with TMS Token": 400, + "Setup Completion with Visa Checkout": 400, + "Setup Completion with Flex Transient Token": 400, + "Setup Completion with Secure Storage Token": 400 + } + }, + "/risk/v1/authentications": { + "post": { + "Enroll with Pending Authentication": 201, + "Enroll with Travel Information": 201, + "Authentication with NO Redirect": 201, + "Authentication with New Account": 201, + "Pending Authentication with Unknown path": 201, + "Enroll with customerId as payment information": 400, + "Enroll with transient token": 400 + } + }, + "/risk/v1/authentication-results": { + "post": { + "Validate authentication results": 201 + } + }, + "/risk/v1/lists/{type}/entries": { + "post": { + "Add Data to a List": 401, + "Add Duplicate Information": 401 + } + }, + "/risk/v1/decisions/{id}/marking": { + "post": { + "Mark as Suspect": 201, + "Remove from History": 201 + } + }, + "/risk/v1/address-verifications": { + "post": { + "Verbose Request with all fields": 201, + "Shipping Details not US or Canada": 201, + "Canadian Billing Details": 201, + "Multiple Line Items": 201, + "Apartment Number Missing or Not Found": 201, + "Address Match Not Found": 201 + } + }, + "/risk/v1/export-compliance-inquiries": { + "post": { + "Customer Match Denied Parties List": 201, + "Export Compliance Information Provided": 201, + "Compliance Status Completed": 201, + "Multiple Sanction Lists": 201, + "No Company Name": 201 + } + }, + "/pts/v2/payouts": { + "post": { + "Payout (Card not Token)": 400, + "Payout (Token)": 400 + } + }, + "/tss/v2/transactions/{id}": { + "get": { + "Retrieve a Transaction": 200 + } + }, + "/tss/v2/searches": { + "post": { + "Create a search request": 201 + } + }, + "/tss/v2/searches/{searchId}": { + "get": { + "Get Search Results": 200 + } + }, + "/reporting/v3/report-downloads": { + "get": { + "Download a Report": 404 + } + }, + "/reporting/v3/reports": { + "get": { + "Retrieve Available Reports": 400 + }, + "post": { + "Create Adhoc Report": 400 + } + }, + "/reporting/v3/reports/{reportId}": { + "get": { + "Get Report Based on Report Id": 401 + } + }, + "/reporting/v3/report-definitions/{reportDefinitionName}": { + "get": { + "Get Report Definition": 401 + } + }, + "/reporting/v3/report-definitions": { + "get": { + "Get Reporting Resource Information": 200 + } + }, + "/reporting/v3/report-subscriptions": { + "get": { + "Get All Subscriptions": 200 + }, + "put": { + "Create Report Subscription": 400 + } + }, + "/reporting/v3/report-subscriptions/{reportName}": { + "get": { + "Get Subscription for Report Name": 200 + } + }, + "/reporting/v3/predefined-report-subscriptions": { + "put": { + "Create Classic/Standard Report Subscription": 400 + } + }, + "/reporting/v3/notification-of-changes": { + "get": { + "Get Notification of Changes": 400 + } + }, + "/reporting/v3/purchase-refund-details": { + "get": { + "Get Purchase and Refund Details": 400 + } + }, + "/reporting/v3/payment-batch-summaries": { + "get": { + "Get Payment Batch Summary Data": 400 + } + }, + "/reporting/v3/conversion-details": { + "get": { + "Get Conversion Detail Transactions": 400 + } + }, + "/reporting/v3/net-fundings": { + "get": { + "Get Netfunding Information for an Account or a Merchant": 400 + } + }, + "/reporting/v3/dtds/{reportDefinitionNameVersion}": { + "get": { + "Download DTD for Report": 404 + } + }, + "/reporting/v3/xsds/{reportDefinitionNameVersion}": { + "get": { + "Download XSD for Report": 404 + } + }, + "/reporting/v3/chargeback-summaries": { + "get": { + "Get Chargeback Summaries": 400 + } + }, + "/reporting/v3/chargeback-details": { + "get": { + "Get Chargeback Details": 400 + } + }, + "/reporting/v3/retrieval-summaries": { + "get": { + "Get Retrieval Summaries": 400 + } + }, + "/reporting/v3/retrieval-details": { + "get": { + "Get Retrieval Details": 400 + } + }, + "/reporting/v3/interchange-clearing-level-details": { + "get": { + "Interchange Clearing Level data for an account or a merchant": 400 + } + }, + "/sfs/v1/file-details": { + "get": { + "Get List of Files": 400 + } + }, + "/sfs/v1/files/{fileId}": { + "get": { + "Download a File with File Identifier": 401 + } + }, + "/invoicing/v2/invoices": { + "post": { + "Create a draft invoice": 201, + "Create and send the invoice immediately": 201, + "Create an invoice and assign it a specific invoice number": 400, + "Create an invoice without sending it": 400 + }, + "get": { + "Get a List of Invoices": 200 + } + }, + "/invoicing/v2/invoices/{id}": { + "get": { + "Get Invoice Details": 200 + }, + "put": {} + }, + "/invoicing/v2/invoices/{id}/delivery": { + "post": {} + }, + "/invoicing/v2/invoices/{id}/cancelation": { + "post": {} + }, + "/invoicing/v2/invoiceSettings": { + "put": { + "UpdateInvoiceSettings": 200 + }, + "get": { + "Get Invoice Settings": 200 + } + }, + "/ums/v1/users": { + "get": { + "Get User Information - Deprecated": 405 + } + }, + "/ums/v1/users/search": { + "post": {} + }, + "/vas/v2/tax": { + "post": { + "Basic Tax Calculation Request": 201, + "Tax Refund Request": 201, + "Committed Tax Call Request": 201, + "Committed Tax Refund Call Request": 201 + } + }, + "/vas/v2/tax/{id}": { + "patch": { + "Void a Committed Tax Call": 401 + } + }, + "/kms/v2/keys-sym": { + "post": {} + }, + "/kms/v2/keys-sym/{keyId}": { + "get": { + "Retrieves shared secret key details": 401 + } + }, + "/kms/v2/keys-sym/deletes": { + "post": {} + }, + "/kms/v2/keys-asym": { + "post": {} + }, + "/kms/v2/keys-asym/{keyId}": { + "get": { + "Retrieves PKCS#12 key details": 401 + } + }, + "/kms/v2/keys-asym/deletes": { + "post": {} + }, + "/kms/v2/keys-sym/verifi": { + "post": {} + } +} \ No newline at end of file diff --git a/Validation/ExpectedResults/node_expected_results.json b/Validation/ExpectedResults/node_expected_results.json new file mode 100644 index 0000000..d5502d7 --- /dev/null +++ b/Validation/ExpectedResults/node_expected_results.json @@ -0,0 +1,199 @@ +{ + "StandAloneHttpSignature": "400", + "StandAloneJWT": "400", + "generate-key-legacy-token-format": "200", + "flex-tokenize-card": "200", + "generate-key": "200", + "create-and-send-invoice-immediately": "201", + "create-draft-invoice": "201", + "create-invoice-and-assign-it-specific-invoice-number": "400", + "create-invoice-without-sending-it": "400", + "get-invoice-details": "200", + "get-invoice-settings": "200", + "updateinvoicesettings": "200", + "authentication-with-new-account": "201", + "authentication-with-no-redirect": "201", + "enroll-with-customerid-as-payment-information": "201", + "enroll-with-pending-authentication": "201", + "enroll-with-transient-token": "400", + "enroll-with-travel-information": "201", + "pending-authentication-with-unknown-path": "201", + "setup-completion-with-card-number": "201", + "setup-completion-with-flex-transient-token": "400", + "setup-completion-with-fluid-data-value-and-payment-solution": "400", + "setup-completion-with-secure-storage-token": "400", + "setup-completion-with-tms-token": "201", + "setup-completion-with-tokenized-card": "201", + "validate-authentication-results": "201", + "authorization-using-swiped-track-data": "201", + "capture-of-authorization-that-used-swiped-track-data": "400", + "service-fees-with-credit-card-transaction": "201", + "capture-payment-service-fee": "201", + "simple-authorizationinternet": "201", + "capture-payment": "201", + "restaurant-authorization": "201", + "restaurant-capture-with-gratuity": "400", + "credit-using-bluefin-pci-p2pe-for-card-present-enabled-acquirer": "502", + "credit-using-bluefin-pci-p2pe-with-visa-platform-connect": "502", + "credit-with-customer-payment-instrument-and-shipping-address-token-id": "201", + "credit-with-customer-token-id": "201", + "credit-with-instrument-identifier-token-id": "201", + "credit": "201", + "electronic-check-standalone-credits": "201", + "service-fees-credit": "201", + "american-express-direct-emv-with-contact-read": "201", + "authorization-capture-for-timeout-void-flow": "201", + "authorization-for-incremental-authorization-flow": "201", + "authorization-for-timeout-reversal-flow": "201", + "authorization-skip-decisionmanager-for-single-transaction": "201", + "authorization-using-bluefin-pci-p2pe-for-card-present-enabled-acquirer": "502", + "authorization-using-bluefin-pci-p2pe-with-visa-platform-connect": "502", + "authorization-with-capturesale": "201", + "authorization-with-customer-payment-instrument-and-shipping-address-token-id": "201", + "authorization-with-customer-token-creation": "201", + "authorization-with-customer-token-default-payment-instrument-and-shipping-address-creation": "201", + "authorization-with-customer-token-id": "201", + "authorization-with-decision-manager-buyer-information": "201", + "authorization-with-decision-manager-custom-setup": "201", + "authorization-with-decision-manager-device-information": "201", + "authorization-with-decision-manager-merchant-defined-information": "201", + "authorization-with-decision-manager-shipping-information": "201", + "authorization-with-decision-manager-travel-information": "201", + "authorization-with-decision-manager": "201", + "authorization-with-dmaccept-pa-enroll": "201", + "authorization-with-dmreject-pa-enroll": "201", + "authorization-with-dmreview-pa-enroll": "201", + "authorization-with-instrument-identifier-token-creation": "201", + "authorization-with-instrument-identifier-token-id": "201", + "authorization-with-legacy-token": "201", + "authorization-with-pa-enroll-authentication-needed": "201", + "authorization-with-payer-auth-validation": "201", + "authorization-with-tms-token-bypassing-network-token": "201", + "digital-payment-googlepay": "201", + "digital-payments-applepay": "201", + "electronic-check-debits-with-legacy-token": "201", + "electronic-check-debits": "201", + "incremental-authorization": "400", + "level-ii-data": "201", + "level-iii-data": "201", + "partial-authorization": "201", + "payment-network-tokenization": "201", + "payment-with-flex-token-create-permanent-tms-token": "400", + "payment-with-flex-token": "400", + "sale-using-emv-technology-with-contact-read-one-for-card-present-enabled-acquirer": "201", + "sale-using-emv-technology-with-contact-read-two-for-card-present-enabled-acquirer": "201", + "sale-using-emv-technology-with-contact-read-with-visa-platform-connect": "201", + "sale-using-emv-technology-with-contactless-read-for-card-present-enabled-acquirer": "201", + "sale-using-emv-technology-with-contactless-read-with-visa-platform-connect": "201", + "sale-using-emv-technology-with-contactless": "201", + "sale-using-keyed-data-for-card-present-enabled-acquirer": "201", + "sale-using-keyed-data-with-balance-inquiry": "201", + "sale-using-keyed-data-with-visa-platform-connect": "201", + "sale-using-swiped-track-data-for-card-present-enabled-acquirer": "201", + "sale-using-swiped-track-data-with-visa-platform-connect": "201", + "swiped": "201", + "zero-dollar-authorization": "201", + "electronic-check-follow-on-refund": "201", + "refund-capture": "201", + "refund-payment": "201", + "process-authorization-reversal": "201", + "service-fees-authorization-reversal": "201", + "timeout-reversal": "201", + "timeout-void": "201", + "void-capture": "201", + "void-credit": "201", + "void-payment": "201", + "void-refund": "201", + "payout-card-not-token": "400", + "payout-token": "400", + "get-chargeback-details": "404", + "get-chargeback-summaries": "404", + "get-conversion-detail-transactions": "400", + "interchange-clearing-level-data-for-account-or-merchant": "404", + "get-netfunding-information-for-account-or-merchant": "400", + "get-notification-of-changes": "400", + "get-payment-batch-summary-data": "400", + "get-purchase-and-refund-details": "400", + "get-report-definition": "200", + "get-reporting-resource-information": "200", + "download-report": "200", + "create-adhoc-report": "400", + "get-report-based-on-report-id": "404", + "retrieve-available-reports": "200", + "create-classicstandard-report-subscription": "400", + "create-report-subscription": "400", + "delete-subscription-of-report-name-by-organization": "404", + "get-all-subscriptions": "200", + "get-subscription-for-report-name": "404", + "get-retrieval-details": "404", + "get-retrieval-summaries": "404", + "add-data-to-list": "201", + "add-duplicate-information": "201", + "basic-dm-transaction": "201", + "dm-with-buyer-information": "201", + "dm-with-decisionprofilereject-response": "201", + "dm-with-device-information": "201", + "dm-with-merchant-defined-information": "201", + "dm-with-scoreexceedsthreshold-response": "201", + "dm-with-shipping-information": "201", + "dm-with-travel-information": "201", + "mark-as-suspect": "201", + "remove-from-history": "201", + "address-match-not-found": "201", + "apartment-number-missing-or-not-found": "201", + "canadian-billing-details": "201", + "compliance-status-completed": "201", + "customer-match-denied-parties-list": "201", + "export-compliance-information-provided": "201", + "multiple-line-items": "201", + "multiple-sanction-lists": "201", + "no-company-name": "201", + "shipping-details-not-us-or-canada": "201", + "verbose-request-with-all-fields": "201", + "download-file-with-file-identifier": "200", + "get-list-of-files": "400", + "create-customer": "201", + "delete-customer": "204", + "retrieve-customer": "200", + "update-customer": "200", + "update-customers-default-payment-instrument": "200", + "update-customers-default-shipping-address": "200", + "create-customer-default-payment-instrument-card": "201", + "create-customer-non-default-payment-instrument-card": "201", + "create-customer-payment-instrument-bank-account": "201", + "create-customer-payment-instrument-pinless-debit": "201", + "delete-customer-payment-instrument": "204", + "list-payment-instruments-for-customer": "200", + "retrieve-customer-payment-instrument": "200", + "create-customer-default-shipping-address": "201", + "create-customer-non-default-shipping-address": "201", + "delete-customer-shipping-address": "204", + "list-shipping-addresses-for-customer": "200", + "retrieve-customer-shipping-address": "200", + "create-instrument-identifier-bank-account": "200", + "create-instrument-identifier-card-enroll-for-network-token": "200", + "create-instrument-identifier-card": "200", + "delete-instrument-identifier": "409", + "enroll-instrument-identifier-for-network-tokenization": "202", + "list-payment-instruments-for-instrument-identifier": "200", + "retrieve-instrument-identifier": "200", + "update-instrument-identifier-previoustransactionid": "200", + "create-payment-instrument-bank-account": "201", + "create-payment-instrument-card": "201", + "create-payment-instrument-pinless-debit": "201", + "delete-payment-instrument": "204", + "retrieve-payment-instrument": "200", + "update-payment-instrument": "200", + "get-individual-batch-file": "404", + "get-list-of-batch-files": "404", + "get-transaction-details-for-given-batch-id": "200", + "retrieve-transaction": "200", + "create-search-request": "201", + "get-search-results": "200", + "get-user-information-deprecated": "405", + "basic-tax-calculation-request": "201", + "committed-tax-call-request": "201", + "committed-tax-refund-call-request": "201", + "tax-refund-request": "201", + "void-committed-tax-call": "201" +} \ No newline at end of file diff --git a/Validation/ExpectedResults/php_expected_results.json b/Validation/ExpectedResults/php_expected_results.json new file mode 100644 index 0000000..73b5b39 --- /dev/null +++ b/Validation/ExpectedResults/php_expected_results.json @@ -0,0 +1,185 @@ +{ + "deleteMethod": "200", + "getGenerateHeaders": "200", + "getMethod": "404", + "postGenerateHeaders": "200", + "postMethod": "201", + "postMethodJsonModel": "201", + "putGenerateHeaders": "200", + "putMethod": "201", + "StandAloneHttpSignature": "200", + "StandAloneJWT": "200", + "GenerateKeyLegacyTokenFormat": "200", + "GenerateKey": "200", + "CreateAndSendInvoiceImmediately": "201", + "CreateDraftInvoice": "200", + "CreateInvoiceAndAssignItSpecificInvoiceNumber": "400", + "CreateInvoiceWithoutSendingIt": "400", + "GetInvoiceSettings": "200", + "UpdateInvoiceSettings": "200", + "AuthenticationWithNewAccount": "201", + "AuthenticationWithNORedirect": "201", + "EnrollWithCustomerIdAsPaymentInformation": "201", + "EnrollWithPendingAuthentication": "201", + "EnrollWithTransientToken": "400", + "EnrollWithTravelInformation": "201", + "PendingAuthenticationWithUnknownPath": "201", + "SetupCompletionWithCardNumber": "201", + "SetupCompletionWithFlexTransientToken": "400", + "SetupCompletionWithFluidDataValueAndPaymentSolution": "400", + "SetupCompletionWithSecureStorageToken": "400", + "SetupCompletionWithTMSToken": "201", + "SetupCompletionWithTokenizedCard": "201", + "ValidateAuthenticationResults": "201", + "CaptureOfAuthorizationThatUsedSwipedTrackData": "400", + "SimpleAuthorizationInternet": "200", + "ServiceFeesWithCreditCardTransaction": "201", + "RestaurantCaptureWithGratuity": "400", + "Credit": "201", + "CreditUsingBluefinPCIP2PEForCardPresentEnabledAcquirer": "502", + "CreditUsingBluefinPCIP2PEWithVisaPlatformConnect": "502", + "CreditWithCustomerPaymentInstrumentAndShippingAddressTokenId": "201", + "CreditWithCustomerTokenId": "201", + "CreditWithInstrumentIdentifierTokenId": "201", + "ElectronicCheckStandAloneCredits": "201", + "ServiceFeesCredit": "201", + "AmericanExpressDirectEMVWithContactRead": "201", + "AuthorizationCaptureForTimeoutVoidFlow": "201", + "AuthorizationForIncrementalAuthorizationFlow": "400", + "AuthorizationForTimeoutReversalFlow": "201", + "AuthorizationSkipDecisionManagerForSingleTransaction": "201", + "AuthorizationUsingBluefinPCIP2PEForCardPresentEnabledAcquirer": "502", + "AuthorizationUsingBluefinPCIP2PEWithVisaPlatformConnect": "502", + "AuthorizationUsingSwipedTrackData": "201", + "AuthorizationWithCaptureSale": "201", + "AuthorizationWithCustomerPaymentInstrumentAndShippingAddressTokenId": "201", + "AuthorizationWithCustomerTokenCreation": "201", + "AuthorizationWithCustomerTokenDefaultPaymentInstrumentAndShippingAddressCreation": "201", + "AuthorizationWithCustomerTokenId": "201", + "AuthorizationWithDecisionManager": "201", + "AuthorizationWithDecisionManagerBuyerInformation": "201", + "AuthorizationWithDecisionManagerCustomSetup": "201", + "AuthorizationWithDecisionManagerDeviceInformation": "201", + "AuthorizationWithDecisionManagerMerchantDefinedInformation": "201", + "AuthorizationWithDecisionManagerShippingInformation": "201", + "AuthorizationWithDecisionManagerTravelInformation": "201", + "AuthorizationWithDMAcceptPAEnroll": "201", + "AuthorizationWithDMRejectPAEnroll": "201", + "AuthorizationWithDMReviewPAEnroll": "201", + "AuthorizationWithInstrumentIdentifierTokenCreation": "201", + "AuthorizationWithInstrumentIdentifierTokenId": "201", + "AuthorizationWithLegacyToken": "201", + "AuthorizationWithPAEnrollAuthenticationNeeded": "201", + "AuthorizationWithPayerAuthValidation": "201", + "AuthorizationWithTMSTokenBypassingNetworkToken": "201", + "DigitalPaymentGooglePay": "201", + "DigitalPaymentsApplePay": "201", + "ElectronicCheckDebits": "201", + "ElectronicCheckDebitsWithLegacyToken": "201", + "LevelIIData": "201", + "LevelIIIData": "201", + "PartialAuthorization": "201", + "PaymentNetworkTokenization": "201", + "PaymentWithFlexToken": "400", + "PaymentWithFlexTokenCreatePermanentTMSToken": "400", + "RestaurantAuthorization": "201", + "SaleUsingEMVTechnologyWithContactless": "201", + "SaleUsingEMVTechnologyWithContactlessReadForCardPresentEnabledAcquirer": "201", + "SaleUsingEMVTechnologyWithContactlessReadWithVisaPlatformConnect": "201", + "SaleUsingEMVTechnologyWithContactReadOneForCardPresentEnabledAcquirer": "201", + "SaleUsingEMVTechnologyWithContactReadTwoForCardPresentEnabledAcquirer": "201", + "SaleUsingEMVTechnologyWithContactReadWithVisaPlatformConnect": "201", + "SaleUsingKeyedDataForCardPresentEnabledAcquirer": "201", + "SaleUsingKeyedDataWithBalanceInquiry": "201", + "SaleUsingKeyedDataWithVisaPlatformConnect": "201", + "SaleUsingSwipedTrackDataForCardPresentEnabledAcquirer": "201", + "SaleUsingSwipedTrackDataWithVisaPlatformConnect": "201", + "Swiped": "201", + "ZeroDollarAuthorization": "201", + "TimeoutReversal": "201", + "TimeoutVoid": "201", + "PayoutCardNotToken": "400", + "PayoutToken": "400", + "GetChargebackDetails": "404", + "GetChargebackSummaries": "404", + "GetConversionDetailTransactions": "400", + "InterchangeClearingLevelDataForAccountOrMerchant": "404", + "GetNetfundingInformationForAccountOrMerchant": "400", + "GetNotificationOfChanges": "400", + "GetPaymentBatchSummaryData": "400", + "GetPurchaseAndRefundDetails": "404", + "GetReportDefinition": "200", + "GetReportingResourceInformation": "200", + "DownloadReport": "404", + "CreateAdhocReport": "400", + "GetReportBasedOnReportId": "404", + "RetrieveAvailableReports": "200", + "CreateClassicStandardReportSubscription": "400", + "CreateReportSubscription": "400", + "DeleteSubscriptionOfReportNameByOrganization": "404", + "GetAllSubscriptions": "200", + "GetSubscriptionForReportName": "404", + "GetRetrievalDetails": "404", + "GetRetrievalSummaries": "404", + "AddDataToList": "201", + "AddDuplicateInformation": "201", + "BasicDMTransaction": "201", + "DMWithBuyerInformation": "201", + "DMWithDecisionProfileRejectResponse": "201", + "DMWithDeviceInformation": "201", + "DMWithMerchantDefinedInformation": "201", + "DMWithScoreExceedsThresholdResponse": "201", + "DMWithShippingInformation": "201", + "DMWithTravelInformation": "201", + "MarkAsSuspect": "201", + "RemoveFromHistory": "201", + "AddressMatchNotFound": "201", + "ApartmentNumberMissingOrNotFound": "201", + "CanadianBillingDetails": "201", + "ComplianceStatusCompleted": "201", + "CustomerMatchDeniedPartiesList": "201", + "ExportComplianceInformationProvided": "201", + "MultipleLineItems": "201", + "MultipleSanctionLists": "201", + "NoCompanyName": "201", + "ShippingDetailsNotUSOrCanada": "201", + "VerboseRequestWithAllFields": "201", + "DownloadFileWithFileIdentifier": "404", + "GetListOfFiles": "400", + "CreateCustomer": "204", + "RetrieveCustomer": "200", + "UpdateCustomer": "200", + "UpdateCustomersDefaultPaymentInstrument": "200", + "UpdateCustomersDefaultShippingAddress": "200", + "CreateCustomerDefaultPaymentInstrumentCard": "201", + "CreateCustomerNonDefaultPaymentInstrumentCard": "204", + "CreateCustomerPaymentInstrumentBankAccount": "201", + "CreateCustomerPaymentInstrumentPinlessDebit": "201", + "ListPaymentInstrumentsForCustomer": "200", + "RetrieveCustomerPaymentInstrument": "200", + "CreateCustomerDefaultShippingAddress": "201", + "CreateCustomerNonDefaultShippingAddress": "204", + "ListShippingAddressesForCustomer": "200", + "RetrieveCustomerShippingAddress": "200", + "CreateInstrumentIdentifierBankAccount": "200", + "CreateInstrumentIdentifierCard": "409", + "CreateInstrumentIdentifierCardEnrollForNetworkToken": "200", + "EnrollInstrumentIdentifierForNetworkTokenization": "202", + "ListPaymentInstrumentsForInstrumentIdentifier": "200", + "RetrieveInstrumentIdentifier": "200", + "UpdateInstrumentIdentifierPreviousTransactionId": "200", + "CreatePaymentInstrumentBankAccount": "201", + "CreatePaymentInstrumentCard": "204", + "CreatePaymentInstrumentPinlessDebit": "201", + "RetrievePaymentInstrument": "200", + "UpdatePaymentInstrument": "200", + "GetIndividualBatchFile": "404", + "GetListOfBatchFiles": "404", + "GetTransactionDetailsForGivenBatchId": "404", + "CreateSearchRequest": "200", + "GetUserInformationDeprecated": "405", + "BasicTaxCalculationRequest": "201", + "CommittedTaxCallRequest": "201", + "CommittedTaxRefundCallRequest": "201", + "TaxRefundRequest": "201" +} \ No newline at end of file diff --git a/Validation/ExpectedResults/python_expected_results.json b/Validation/ExpectedResults/python_expected_results.json new file mode 100644 index 0000000..a25d156 --- /dev/null +++ b/Validation/ExpectedResults/python_expected_results.json @@ -0,0 +1,211 @@ +{ + "DeleteMethod": "200", + "Delete_Generate_Headers": "200", + "GetMethod": "200", + "GetObjectMethod": "400", + "Get_Generate_Headers": "200", + "PostMethod": "200", + "PostObjectMethod": "200", + "Post_Generate_Headers": "200", + "PutMethod": "200", + "Put_Generate_Headers": "200", + "StandAloneHttpSignature": "200", + "StandAloneJWT": "200", + "StandAloneMetaKey": "400", + "StandAloneOAuth": "400", + "flex-tokenize-card": "200", + "generate-key-legacy-token-format": "200", + "generate-key": "200", + "create-and-send-invoice-immediately": "201", + "create-draft-invoice": "201", + "create-invoice-and-assign-it-specific-invoice-number": "400", + "create-invoice-without-sending-it": "400", + "get-invoice-details": "200", + "get-invoice-settings": "200", + "updateinvoicesettings": "200", + "authentication-with-new-account": "201", + "authentication-with-no-redirect": "201", + "enroll-with-customerid-as-payment-information": "201", + "enroll-with-pending-authentication": "201", + "enroll-with-transient-token": "400", + "enroll-with-travel-information": "201", + "pending-authentication-with-unknown-path": "201", + "setup-completion-with-card-number": "201", + "setup-completion-with-flex-transient-token": "400", + "setup-completion-with-fluid-data-value-and-payment-solution": "400", + "setup-completion-with-secure-storage-token": "400", + "setup-completion-with-tms-token": "201", + "setup-completion-with-tokenized-card": "201", + "validate-authentication-results": "201", + "capture-of-authorization-that-used-swiped-track-data": "400", + "capture-payment-service-fee": "201", + "capture-payment": "201", + "restaurant-capture-with-gratuity": "400", + "credit-using-bluefin-pci-p2pe-for-card-present-enabled-acquirer": "502", + "credit-using-bluefin-pci-p2pe-with-visa-platform-connect": "502", + "credit-with-customer-payment-instrument-and-shipping-address-token-id": "201", + "credit-with-customer-token-id": "201", + "credit-with-instrument-identifier-token-id": "201", + "credit": "201", + "electronic-check-standalone-credits": "201", + "service-fees-credit": "201", + "american-express-direct-emv-with-contact-read": "201", + "authorization-capture-for-timeout-void-flow": "201", + "authorization-for-incremental-authorization-flow": "201", + "authorization-for-timeout-reversal-flow": "201", + "authorization-skip-decisionmanager-for-single-transaction": "201", + "authorization-using-bluefin-pci-p2pe-for-card-present-enabled-acquirer": "502", + "authorization-using-bluefin-pci-p2pe-with-visa-platform-connect": "502", + "authorization-using-swiped-track-data": "201", + "authorization-with-capturesale": "201", + "authorization-with-customer-payment-instrument-and-shipping-address-token-id": "201", + "authorization-with-customer-token-creation": "201", + "authorization-with-customer-token-default-payment-instrument-and-shipping-address-creation": "201", + "authorization-with-customer-token-id": "201", + "authorization-with-decision-manager-buyer-information": "201", + "authorization-with-decision-manager-custom-setup": "201", + "authorization-with-decision-manager-device-information": "201", + "authorization-with-decision-manager-merchant-defined-information": "201", + "authorization-with-decision-manager-shipping-information": "201", + "authorization-with-decision-manager-travel-information": "201", + "authorization-with-decision-manager": "201", + "authorization-with-dmaccept-pa-enroll": "201", + "authorization-with-dmreject-pa-enroll": "201", + "authorization-with-dmreview-pa-enroll": "201", + "authorization-with-instrument-identifier-token-creation": "201", + "authorization-with-instrument-identifier-token-id": "201", + "authorization-with-legacy-token": "201", + "authorization-with-pa-enroll-authentication-needed": "201", + "authorization-with-payer-auth-validation": "201", + "authorization-with-tms-token-bypassing-network-token": "201", + "digital-payment-googlepay": "201", + "digital-payments-applepay": "201", + "electronic-check-debits-with-legacy-token": "201", + "electronic-check-debits": "201", + "incremental-authorization": "400", + "level-ii-data": "201", + "level-iii-data": "201", + "partial-authorization": "201", + "payment-network-tokenization": "201", + "payment-with-flex-token": "400", + "payment-with-flex-tokencreate-permanent-tms-token": "400", + "restaurant-authorization": "201", + "sale-using-emv-technology-with-contact-read-one-for-card-present-enabled-acquirer": "201", + "sale-using-emv-technology-with-contact-read-two-for-card-present-enabled-acquirer": "201", + "sale-using-emv-technology-with-contact-read-with-visa-platform-connect": "201", + "sale-using-emv-technology-with-contactless-read-for-card-present-enabled-acquirer": "201", + "sale-using-emv-technology-with-contactless-read-with-visa-platform-connect": "201", + "sale-using-emv-technology-with-contactless": "201", + "sale-using-keyed-data-for-card-present-enabled-acquirer": "201", + "sale-using-keyed-data-with-balance-inquiry": "201", + "sale-using-keyed-data-with-visa-platform-connect": "201", + "sale-using-swiped-track-data-for-card-present-enabled-acquirer": "201", + "sale-using-swiped-track-data-with-visa-platform-connect": "201", + "service-fees-with-credit-card-transaction": "201", + "simple-authorizationinternet": "201", + "swiped": "201", + "zero-dollar-authorization": "201", + "electronic-check-followon-refund": "201", + "refund-capture": "201", + "refund-payment": "201", + "process-authorization-reversal": "201", + "service-fees-authorization-reversal": "201", + "timeout-reversal": "201", + "timeout-void": "201", + "void-capture": "201", + "void-credit": "201", + "void-payment": "201", + "void-refund": "201", + "payout-card-not-token": "400", + "payout-token": "400", + "get-chargeback-details": "404", + "get-chargeback-summaries": "404", + "get-conversion-detail-transactions": "400", + "interchange-clearing-level-data-for-account-or-merchant": "404", + "get-netfunding-information-for-account-or-merchant": "400", + "get-notification-of-changes": "400", + "get-payment-batch-summary-data": "400", + "get-purchase-and-refund-details": "404", + "get-report-definition": "200", + "get-reporting-resource-information": "200", + "download-report": "404", + "create-adhoc-report": "400", + "get-report-based-on-report-id": "404", + "retrieve-available-reports": "200", + "create-classicstandard-report-subscription": "400", + "create-report-subscription": "400", + "delete-subscription-of-report-name-by-organization": "404", + "get-all-subscriptions": "200", + "get-subscription-for-report-name": "404", + "get-retrieval-details": "404", + "get-retrieval-summaries": "404", + "add-data-to-list": "201", + "add-duplicate-information": "201", + "basic-dm-transaction": "201", + "dm-with-buyer-information": "201", + "dm-with-decisionprofilereject-response": "201", + "dm-with-device-information": "201", + "dm-with-merchant-defined-information": "201", + "dm-with-scoreexceedsthreshold-response": "201", + "dm-with-shipping-information": "201", + "dm-with-travel-information": "201", + "mark-as-suspect": "201", + "remove-from-history": "201", + "address-match-not-found": "201", + "apartment-number-missing-or-not-found": "201", + "canadian-billing-details": "201", + "compliance-status-completed": "201", + "customer-match-denied-parties-list": "201", + "export-compliance-information-provided": "201", + "multiple-line-items": "201", + "multiple-sanction-lists": "201", + "no-company-name": "201", + "shipping-details-not-us-or-canada": "201", + "verbose-request-with-all-fields": "201", + "download-file-with-file-identifier": "404", + "get-list-of-files": "400", + "create-customer": "201", + "delete-customer": "204", + "retrieve-customer": "200", + "update-customer": "200", + "update-customers-default-payment-instrument": "200", + "update-customers-default-shipping-address": "200", + "create-customer-default-payment-instrument-card": "201", + "create-customer-nondefault-payment-instrument-card": "201", + "create-customer-payment-instrument-bank-account": "201", + "create-customer-payment-instrument-pinless-debit": "201", + "delete-customer-payment-instrument": "204", + "list-payment-instruments-for-customer": "200", + "retrieve-customer-payment-instrument": "200", + "create-customer-default-shipping-address": "201", + "create-customer-nondefault-shipping-address": "201", + "delete-customer-shipping-address": "204", + "list-shipping-addresses-for-customer": "200", + "retrieve-customer-shipping-address": "200", + "create-instrument-identifier-bank-account": "200", + "create-instrument-identifier-card-enroll-for-network-token": "200", + "create-instrument-identifier-card": "200", + "delete-instrument-identifier": "409", + "enroll-instrument-identifier-for-network-tokenization": "202", + "list-payment-instruments-for-instrument-identifier": "200", + "retrieve-instrument-identifier": "200", + "update-instrument-identifier-previoustransactionid": "200", + "create-payment-instrument-bank-account": "201", + "create-payment-instrument-card": "201", + "create-payment-instrument-pinless-debit": "201", + "delete-payment-instrument": "204", + "retrieve-payment-instrument": "200", + "update-payment-instrument": "200", + "get-individual-batch-file": "404", + "get-list-of-batch-files": "404", + "get-transaction-details-for-given-batch-id": "404", + "retrieve-transaction": "200", + "create-search-request": "201", + "get-search-results": "200", + "get-user-information-deprecated": "405", + "basic-tax-calculation-request": "201", + "committed-tax-call-request": "201", + "committed-tax-refund-call-request": "201", + "tax-refund-request": "201", + "void-committed-tax-call": "201" +} \ No newline at end of file diff --git a/Validation/ExpectedResults/ruby_expected_results.json b/Validation/ExpectedResults/ruby_expected_results.json new file mode 100644 index 0000000..fdd7efb --- /dev/null +++ b/Validation/ExpectedResults/ruby_expected_results.json @@ -0,0 +1,211 @@ +{ + "DeleteGenerateHeaders": "200", + "DeleteMethod": "200", + "GetGenerateHeaders": "200", + "GetMethod": "404", + "GetObjectMethod": "404", + "PostGenerateHeaders": "200", + "PostMethod": "201", + "PostObjectMethod": "201", + "PutGenerateHeaders": "200", + "PutMethod": "201", + "StandAloneHttpSignature": "200", + "StandAloneJWT": "200", + "StandAloneMetaKey": "400", + "StandAloneOAuth": "400", + "flex-tokenize-card": "200", + "generate-key-legacy-token-format": "200", + "generate-key": "200", + "create-and-send-invoice-immediately": "201", + "create-draft-invoice": "201", + "create-invoice-and-assign-it-specific-invoice-number": "400", + "create-invoice-without-sending-it": "400", + "get-invoice-details": "200", + "get-invoice-settings": "200", + "updateinvoicesettings": "200", + "authentication-with-new-account": "201", + "authentication-with-no-redirect": "201", + "enroll-with-customerid-as-payment-information": "201", + "enroll-with-pending-authentication": "201", + "enroll-with-transient-token": "400", + "enroll-with-travel-information": "201", + "pending-authentication-with-unknown-path": "201", + "setup-completion-with-card-number": "201", + "setup-completion-with-flex-transient-token": "400", + "setup-completion-with-fluid-data-value-and-payment-solution": "400", + "setup-completion-with-secure-storage-token": "400", + "setup-completion-with-tms-token": "201", + "setup-completion-with-tokenized-card": "201", + "validate-authentication-results": "201", + "capture-of-authorization-that-used-swiped-track-data": "400", + "capture-payment-service-fee": "201", + "capture-payment": "201", + "restaurant-capture-with-gratuity": "400", + "credit-using-bluefin-pci-p2pe-for-card-present-enabled-acquirer": "502", + "credit-using-bluefin-pci-p2pe-with-visa-platform-connect": "502", + "credit-with-customer-payment-instrument-and-shipping-address-token-id": "201", + "credit-with-customer-token-id": "201", + "credit-with-instrument-identifier-token-id": "201", + "credit": "201", + "electronic-check-standalone-credits": "201", + "service-fees-credit": "201", + "american-express-direct-emv-with-contact-read": "201", + "authorization-capture-for-timeout-void-flow": "201", + "authorization-for-incremental-authorization-flow": "201", + "authorization-for-timeout-reversal-flow": "201", + "authorization-skip-decisionmanager-for-single-transaction": "201", + "authorization-using-bluefin-pci-p2pe-for-card-present-enabled-acquirer": "502", + "authorization-using-bluefin-pci-p2pe-with-visa-platform-connect": "502", + "authorization-using-swiped-track-data": "201", + "authorization-with-capturesale": "201", + "authorization-with-customer-payment-instrument-and-shipping-address-token-id": "201", + "authorization-with-customer-token-creation": "201", + "authorization-with-customer-token-default-payment-instrument-and-shipping-address-creation": "201", + "authorization-with-customer-token-id": "201", + "authorization-with-decision-manager-buyer-information": "201", + "authorization-with-decision-manager-custom-setup": "201", + "authorization-with-decision-manager-device-information": "201", + "authorization-with-decision-manager-merchant-defined-information": "201", + "authorization-with-decision-manager-shipping-information": "201", + "authorization-with-decision-manager-travel-information": "201", + "authorization-with-decision-manager": "201", + "authorization-with-dmaccept-pa-enroll": "201", + "authorization-with-dmreject-pa-enroll": "201", + "authorization-with-dmreview-pa-enroll": "201", + "authorization-with-instrument-identifier-token-creation": "201", + "authorization-with-instrument-identifier-token-id": "201", + "authorization-with-legacy-token": "201", + "authorization-with-pa-enroll-authentication-needed": "201", + "authorization-with-payer-auth-validation": "201", + "authorization-with-tms-token-bypassing-network-token": "201", + "digital-payment-googlepay": "201", + "digital-payments-applepay": "201", + "electronic-check-debits-with-legacy-token": "201", + "electronic-check-debits": "201", + "incremental-authorization": "400", + "level-ii-data": "201", + "level-iii-data": "201", + "partial-authorization": "201", + "payment-network-tokenization": "201", + "payment-with-flex-token-create-permanent-tms-token": "400", + "payment-with-flex-token": "400", + "restaurant-authorization": "201", + "sale-using-emv-technology-with-contact-read-one-for-card-present-enabled-acquirer": "201", + "sale-using-emv-technology-with-contact-read-two-for-card-present-enabled-acquirer": "201", + "sale-using-emv-technology-with-contact-read-with-visa-platform-connect": "201", + "sale-using-emv-technology-with-contactless-read-for-card-present-enabled-acquirer": "201", + "sale-using-emv-technology-with-contactless-read-with-visa-platform-connect": "201", + "sale-using-emv-technology-with-contactless": "201", + "sale-using-keyed-data-for-card-present-enabled-acquirer": "201", + "sale-using-keyed-data-with-balance-inquiry": "201", + "sale-using-keyed-data-with-visa-platform-connect": "201", + "sale-using-swiped-track-data-for-card-present-enabled-acquirer": "201", + "sale-using-swiped-track-data-with-visa-platform-connect": "201", + "service-fees-with-credit-card-transaction": "201", + "simple-authorizationinternet": "201", + "swiped": "201", + "zero-dollar-authorization": "201", + "electronic-check-follow-on-refund": "201", + "refund-capture": "201", + "refund-payment": "201", + "process-authorization-reversal": "201", + "service-fees-authorization-reversal": "201", + "timeout-reversal": "201", + "timeout-void": "201", + "void-capture": "201", + "void-credit": "201", + "void-payment": "201", + "void-refund": "201", + "payout-card-not-token": "400", + "payout-token": "400", + "get-chargeback-details": "404", + "get-chargeback-summaries": "404", + "get-conversion-detail-transactions": "400", + "interchange-clearing-level-data-for-account-or-merchant": "404", + "get-netfunding-information-for-account-or-merchant": "400", + "get-notification-of-changes": "400", + "get-payment-batch-summary-data": "400", + "get-purchase-and-refund-details": "404", + "get-report-definition": "200", + "get-reporting-resource-information": "200", + "download-report": "404", + "create-adhoc-report": "400", + "get-report-based-on-report-id": "404", + "retrieve-available-reports": "200", + "create-classicstandard-report-subscription": "400", + "create-report-subscription": "400", + "delete-subscription-of-report-name-by-organization": "404", + "get-all-subscriptions": "200", + "get-subscription-for-report-name": "404", + "get-retrieval-details": "404", + "get-retrieval-summaries": "404", + "add-data-to-list": "201", + "add-duplicate-information": "201", + "basic-dm-transaction": "201", + "dm-with-buyer-information": "201", + "dm-with-decisionprofilereject-response": "201", + "dm-with-device-information": "201", + "dm-with-merchant-defined-information": "201", + "dm-with-scoreexceedsthreshold-response": "201", + "dm-with-shipping-information": "201", + "dm-with-travel-information": "201", + "mark-as-suspect": "201", + "remove-from-history": "201", + "address-match-not-found": "201", + "apartment-number-missing-or-not-found": "201", + "canadian-billing-details": "201", + "compliance-status-completed": "201", + "customer-match-denied-parties-list": "201", + "export-compliance-information-provided": "201", + "multiple-line-items": "201", + "multiple-sanction-lists": "201", + "no-company-name": "201", + "shipping-details-not-us-or-canada": "201", + "verbose-request-with-all-fields": "201", + "download-file-with-file-identifier": "404", + "get-list-of-files": "400", + "create-customer": "201", + "delete-customer": "204", + "retrieve-customer": "200", + "update-customer": "200", + "update-customers-default-payment-instrument": "200", + "update-customers-default-shipping-address": "200", + "create-customer-default-payment-instrument-card": "201", + "create-customer-non-default-payment-instrument-card": "201", + "create-customer-payment-instrument-bank-account": "201", + "create-customer-payment-instrument-pinless-debit": "201", + "delete-customer-payment-instrument": "204", + "list-payment-instruments-for-customer": "200", + "retrieve-customer-payment-instrument": "200", + "create-customer-default-shipping-address": "201", + "create-customer-non-default-shipping-address": "201", + "delete-customer-shipping-address": "204", + "list-shipping-addresses-for-customer": "200", + "retrieve-customer-shipping-address": "200", + "create-instrument-identifier-bank-account": "200", + "create-instrument-identifier-card-enroll-for-network-token": "200", + "create-instrument-identifier-card": "200", + "delete-instrument-identifier": "409", + "enroll-instrument-identifier-for-network-tokenization": "202", + "list-payment-instruments-for-instrument-identifier": "200", + "retrieve-instrument-identifier": "200", + "update-instrument-identifier-previoustransactionid": "200", + "create-payment-instrument-bank-account": "201", + "create-payment-instrument-card": "201", + "create-payment-instrument-pinless-debit": "201", + "delete-payment-instrument": "204", + "retrieve-payment-instrument": "200", + "update-payment-instrument": "200", + "get-individual-batch-file": "404", + "get-list-of-batch-files": "404", + "get-transaction-details-for-given-batch-id": "404", + "retrieve-transaction": "200", + "create-search-request": "201", + "get-search-results": "200", + "get-user-information-deprecated": "405", + "basic-tax-calculation-request": "201", + "committed-tax-call-request": "201", + "committed-tax-refund-call-request": "201", + "tax-refund-request": "201", + "void-committed-tax-call": "201" +} \ No newline at end of file diff --git a/Validation/json_to_prettified_html.py b/Validation/json_to_prettified_html.py new file mode 100644 index 0000000..6be05d2 --- /dev/null +++ b/Validation/json_to_prettified_html.py @@ -0,0 +1,171 @@ + +""" +IMPORTS +""" + +import argparse +import os +import re +import copy +import json +import re +from json2html import * +from xhtml2pdf import pisa +from bs4 import BeautifulSoup as bs, Tag + +""" +ARGUMENT PARSER +""" + +def parse_arguments(): + parser = argparse.ArgumentParser(description="Converts JSON result data to HTML") + parser.add_argument("--input", "-i", help="JSON file containing result data to be rendered") + parser.add_argument("--output", "-o", help="HTML file generated from the JSON data") + + args = parser.parse_args() + input_file = args.input + output_file = args.output + return input_file, output_file + +""" +LOAD JSON FILE +""" + +def load_json_file(file): + with open(file, "r") as file_handle: + file_contents = json.load(file_handle) + return file_contents + +""" +CONVERT JSON TO HTML +""" + +def convert_json_to_html(data, file): + with open(file, "w") as file_handle: + file_handle.write(json2html.convert(json=data)) + +""" +PRETTIFY HTML +""" + +def prettify_html(file): + with open(file, "r") as file_handle: + soup = bs(file_handle, "html.parser") + + # Processing table + table_tag = soup.table + table_tag.name = "table" + table_tag["style"] = """ + width: 95%; + border-collapse:collapse; + margin-left:auto; + margin-right:auto; + font-family: Helvetica, sans-serif; + font-size: 10px; + vertical-align: bottom; + """ + + # Processing second column + second_col_tags = soup.find_all("td") + for second_col_single_tag in second_col_tags: + more_style = "" + if "FAILURE" in second_col_single_tag.contents[0]: + more_style = """ + color: #FFFFFF; + background-color: #E34234 + """ + elif "SUCCESS" in second_col_single_tag.contents[0]: + more_style = """ + color: #000000; + background-color: #50C878 + """ + elif "SAMPLE CODE" in second_col_single_tag.contents[0]: + more_style = """ + color: #E34234; + background-color: #FFE135 + """ + second_col_single_tag.name = "td" + second_col_single_tag["style"] = "text-align: center; padding-top: 2px; padding-bottom: 0px; vertical-align: middle;" + more_style + + # Processing first column + first_col_tags = soup.find_all("th") + first_col_style = """ + text-align: left; + padding-top: 2px; + padding-bottom: 0px; + vertical-align: middle; + padding-left: 10px; + """ + for first_col_single_tag in first_col_tags: + first_col_single_tag.name = "td" + first_col_single_tag["style"] = first_col_style + + # Create header rows + first_column_style = """ + text-align: center; + padding-top: 2px; + padding-bottom: 0px; + padding-left: 10px; + color: #FFFFFF; + background-color: #333399; + font-size: 12px; + width: 70%; + """ + first_column_header = soup.new_tag("th", style=first_column_style) + first_column_header.insert(3, "Sample Code Tested") + + second_column_style = """ + text-align: center; + padding-top: 2px; + padding-bottom: 0px; + color: #FFFFFF; + background-color: #333399; + font-size: 12px; + width: 30%; + """ + second_column_header = soup.new_tag("th", style=second_column_style) + second_column_header.insert(3, "Validation Result") + + # Insert header rows into table + table_tag.insert(0, second_column_header) + table_tag.insert(0, first_column_header) + + with open(file, "wb") as file_handle: + file_handle.write(soup.prettify("utf-8")) + +""" +CONVERT HTML TO PDF +""" + +def convert_html_to_pdf(file): + with open(file, "r") as src: + source_html = src.read() + + output_file = file.split(".")[0] + ".pdf" + + try: + with open(output_file, "w+b") as result_file: + pisa_status = pisa.CreatePDF(source_html, dest=result_file) + + if pisa_status.err != 0: + raise Exception('Error during PDF file creation:\n' + pisa_status.err) + except Exception as e: + raise e + +""" +MAIN FUNCTION +""" + +def main(): + input_file, output_file = parse_arguments() + json_data = load_json_file(input_file) + convert_json_to_html(json_data, output_file) + prettify_html(output_file) + + try: + convert_html_to_pdf(output_file) + except Exception as e: + print(e) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/Validation/response_code_validator.py b/Validation/response_code_validator.py new file mode 100644 index 0000000..098a7b7 --- /dev/null +++ b/Validation/response_code_validator.py @@ -0,0 +1,96 @@ + +""" +IMPORTS +""" + +import argparse +import re +import json + +""" +ARGUMENT PARSER +""" + +def parse_arguments(): + parser = argparse.ArgumentParser(description="Validates Response Codes for Requests") + parser.add_argument("--expected", "-e", help="Source file containing the expected response codes for the requests") + parser.add_argument("--actual", "-a", help="Log file for the current testing run") + parser.add_argument("--output", "-o", help="Output JSON file for the result of validation") + + args = parser.parse_args() + expected = args.expected + actual = args.actual + output = args.output + return expected, actual, output + +""" +ADD TO JSON OBJECT +""" + +def add_to_json_object(json_obj, key, value): + json_obj[key] = value + return json_obj + +""" +DUMP JSON TO FILE +""" + +def dump_json_to_file(json_obj, filepath): + with open(filepath, "w") as file: + json.dump(json_obj, file, ensure_ascii=False, indent=4) + +""" +LOAD EXPECTED JSON FILE +""" + +def load_file(file): + file_content = json.load(open(file, "r")) + if "/pts/v2/payments" in file_content: + flat_json_object = {} + for path in file_content: + path_content = file_content[path] + for verb in path_content: + samples_content = path_content[verb] + for sample_name, response_code in samples_content.items(): + flat_json_object = add_to_json_object(flat_json_object, sample_name, response_code) + return flat_json_object + else: + return file_content + +""" +COMPARE RESULTS +""" + +def compare_results(expected, actual): + code_map = {} + for sample, response in actual.items(): + if sample in expected: + if expected[sample] == response: + validation = "SUCCESS" + else: + validation = "FAILURE [ Expected : " + str(expected[sample]) + " | Actual : " + str(response) + " ]" + + code_map = add_to_json_object(code_map, sample, validation) + expected.pop(sample) + else: + code_map = add_to_json_object(code_map, sample, "UNEXPECTED SAMPLE CODE FOUND") + + for remaining_sample, remaining_response in expected.items(): + code_map = add_to_json_object(code_map, remaining_sample, "SAMPLE CODE NOT EXECUTED | Expected : " + str(remaining_response)) + + return code_map + +""" +MAIN FUNCTION +""" + +def main(): + expected_json_file, actuals_json_file, destination_file = parse_arguments() + expected_results = load_file(expected_json_file) + actual_results = load_file(actuals_json_file) + + validation_results = compare_results(expected_results, actual_results) + dump_json_to_file(validation_results, destination_file) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/Validation/sample_code_log_processor.py b/Validation/sample_code_log_processor.py new file mode 100644 index 0000000..7e4a62c --- /dev/null +++ b/Validation/sample_code_log_processor.py @@ -0,0 +1,67 @@ + +""" +IMPORTS +""" + +import argparse +import re +import json + +""" +ARGUMENT PARSER +""" + +def parse_arguments(): + parser = argparse.ArgumentParser(description="Processes the log file from Sample Code Testing") + parser.add_argument("--log", "-l", help="Log file for the current testing run of Sample Codes") + parser.add_argument("--output", "-o", help="JSON file to store the actual results from the current testing run") + + args = parser.parse_args() + log_path = args.log + output_file = args.output + return log_path, output_file + +""" +LOG FILE PROCESSOR +""" + +def process_log_file(filepath): + with open(filepath, "r", encoding = "utf-8") as file: + contents = file.read() + matches = re.findall(r"(\[Sample Code Testing\]) (\[([A-Za-z0-9\-_]+)\]) ([0-9]{3})", contents) + + return matches + +""" +ADD TO JSON OBJECT +""" + +def add_to_json_object(json_obj, key, value): + json_obj[key] = value + return json_obj + +""" +DUMP JSON TO FILE +""" + +def dump_json_to_file(filepath, src): + with open(filepath, "w") as file: + json.dump(src, file, ensure_ascii=False, indent=4) + +""" +MAIN FUNCTION +""" + +def main(): + current_log_file, output_json_file = parse_arguments() + log_statements = process_log_file(current_log_file) + + code_map = {} + for statement in log_statements: + if statement[2] not in ("Configuration"): + code_map = add_to_json_object(code_map, statement[2], statement[3]) + + dump_json_to_file(output_json_file, code_map) + +if __name__ == "__main__": + main() \ No newline at end of file From b0d39b08c96ed15a19843429f026d9f0ff9e3c16 Mon Sep 17 00:00:00 2001 From: aasgoel Date: Tue, 11 Jun 2024 10:43:02 +0530 Subject: [PATCH 04/29] Update sampleCodeIgnoreList.txt --- sampleCodeIgnoreList.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sampleCodeIgnoreList.txt b/sampleCodeIgnoreList.txt index f50d12c..947ebc2 100644 --- a/sampleCodeIgnoreList.txt +++ b/sampleCodeIgnoreList.txt @@ -2,4 +2,4 @@ .*/data/.* .*Flex_Security_Exception.py .*/Webhooks/.* -.*/authentication/.* + From eccbb17e87d29036a8a45be06d3698ba861a348c Mon Sep 17 00:00:00 2001 From: aasgoel Date: Tue, 11 Jun 2024 10:56:19 +0530 Subject: [PATCH 05/29] Update sampleCodeIgnoreList.txt --- sampleCodeIgnoreList.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sampleCodeIgnoreList.txt b/sampleCodeIgnoreList.txt index 947ebc2..f50d12c 100644 --- a/sampleCodeIgnoreList.txt +++ b/sampleCodeIgnoreList.txt @@ -2,4 +2,4 @@ .*/data/.* .*Flex_Security_Exception.py .*/Webhooks/.* - +.*/authentication/.* From 30320fc433b1d13671a2e6151c54f6dc5fc42e90 Mon Sep 17 00:00:00 2001 From: aasgoel Date: Tue, 18 Jun 2024 18:40:17 +0530 Subject: [PATCH 06/29] Removed the commenting from updateinvoicesettings.py --- .../InvoiceSettings/updateinvoicesettings.py | 120 +++++++++--------- 1 file changed, 60 insertions(+), 60 deletions(-) diff --git a/samples/Invoicing/InvoiceSettings/updateinvoicesettings.py b/samples/Invoicing/InvoiceSettings/updateinvoicesettings.py index dbf1712..2cee9fb 100644 --- a/samples/Invoicing/InvoiceSettings/updateinvoicesettings.py +++ b/samples/Invoicing/InvoiceSettings/updateinvoicesettings.py @@ -1,73 +1,73 @@ -# from CyberSource import * -# from pathlib import Path -# import os -# import json -# from importlib.machinery import SourceFileLoader +from CyberSource import * +from pathlib import Path +import os +import json +from importlib.machinery import SourceFileLoader -# config_file = os.path.join(os.getcwd(), "data", "Configuration.py") -# configuration = SourceFileLoader("module.name", config_file).load_module() +config_file = os.path.join(os.getcwd(), "data", "Configuration.py") +configuration = SourceFileLoader("module.name", config_file).load_module() -# # To delete None values in Input Request Json body -# def del_none(d): -# for key, value in list(d.items()): -# if value is None: -# del d[key] -# elif isinstance(value, dict): -# del_none(value) -# return d +# To delete None values in Input Request Json body +def del_none(d): + for key, value in list(d.items()): + if value is None: + del d[key] + elif isinstance(value, dict): + del_none(value) + return d -# def updateinvoicesettings(): -# invoiceSettingsInformationMerchantLogo = "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" -# invoiceSettingsInformationMerchantDisplayName = "Custom Merchant Display Name" -# invoiceSettingsInformationCustomEmailMessage = "Custom merchant email message" -# invoiceSettingsInformationEnableReminders = True -# invoiceSettingsInformationHeaderStyleFontColor = "#000001" -# invoiceSettingsInformationHeaderStyleBackgroundColor = "#FFFFFF" -# invoiceSettingsInformationHeaderStyle = InvoicingV2InvoiceSettingsGet200ResponseInvoiceSettingsInformationHeaderStyle( -# font_color = invoiceSettingsInformationHeaderStyleFontColor, -# background_color = invoiceSettingsInformationHeaderStyleBackgroundColor -# ) +def updateinvoicesettings(): + invoiceSettingsInformationMerchantLogo = "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" + invoiceSettingsInformationMerchantDisplayName = "Custom Merchant Display Name" + invoiceSettingsInformationCustomEmailMessage = "Custom merchant email message" + invoiceSettingsInformationEnableReminders = True + invoiceSettingsInformationHeaderStyleFontColor = "#000001" + invoiceSettingsInformationHeaderStyleBackgroundColor = "#FFFFFF" + invoiceSettingsInformationHeaderStyle = InvoicingV2InvoiceSettingsGet200ResponseInvoiceSettingsInformationHeaderStyle( + font_color = invoiceSettingsInformationHeaderStyleFontColor, + background_color = invoiceSettingsInformationHeaderStyleBackgroundColor + ) -# invoiceSettingsInformationDeliveryLanguage = "en-US" -# invoiceSettingsInformationDefaultCurrencyCode = "USD" -# invoiceSettingsInformationPayerAuthenticationInInvoicing = "enable" -# invoiceSettingsInformation = Invoicingv2invoiceSettingsInvoiceSettingsInformation( -# merchant_logo = invoiceSettingsInformationMerchantLogo, -# merchant_display_name = invoiceSettingsInformationMerchantDisplayName, -# custom_email_message = invoiceSettingsInformationCustomEmailMessage, -# enable_reminders = invoiceSettingsInformationEnableReminders, -# header_style = invoiceSettingsInformationHeaderStyle.__dict__, -# delivery_language = invoiceSettingsInformationDeliveryLanguage, -# default_currency_code = invoiceSettingsInformationDefaultCurrencyCode, -# payer_authentication_in_invoicing = invoiceSettingsInformationPayerAuthenticationInInvoicing -# ) + invoiceSettingsInformationDeliveryLanguage = "en-US" + invoiceSettingsInformationDefaultCurrencyCode = "USD" + invoiceSettingsInformationPayerAuthenticationInInvoicing = "enable" + invoiceSettingsInformation = Invoicingv2invoiceSettingsInvoiceSettingsInformation( + merchant_logo = invoiceSettingsInformationMerchantLogo, + merchant_display_name = invoiceSettingsInformationMerchantDisplayName, + custom_email_message = invoiceSettingsInformationCustomEmailMessage, + enable_reminders = invoiceSettingsInformationEnableReminders, + header_style = invoiceSettingsInformationHeaderStyle.__dict__, + delivery_language = invoiceSettingsInformationDeliveryLanguage, + default_currency_code = invoiceSettingsInformationDefaultCurrencyCode, + payer_authentication_in_invoicing = invoiceSettingsInformationPayerAuthenticationInInvoicing + ) -# requestObj = InvoiceSettingsRequest( -# invoice_settings_information = invoiceSettingsInformation.__dict__ -# ) + requestObj = InvoiceSettingsRequest( + invoice_settings_information = invoiceSettingsInformation.__dict__ + ) -# requestObj = del_none(requestObj.__dict__) -# requestObj = json.dumps(requestObj) + requestObj = del_none(requestObj.__dict__) + requestObj = json.dumps(requestObj) -# try: -# config_obj = configuration.Configuration() -# client_config = config_obj.get_configuration() -# api_instance = InvoiceSettingsApi(client_config) -# return_data, status, body = api_instance.update_invoice_settings(requestObj) + try: + config_obj = configuration.Configuration() + client_config = config_obj.get_configuration() + api_instance = InvoiceSettingsApi(client_config) + return_data, status, body = api_instance.update_invoice_settings(requestObj) -# print("\nAPI RESPONSE CODE : ", status) -# print("\nAPI RESPONSE BODY : ", body) + print("\nAPI RESPONSE CODE : ", status) + print("\nAPI RESPONSE BODY : ", body) -# write_log_audit(status) -# return return_data -# except Exception as e: -# write_log_audit(e.status if hasattr(e, 'status') else 999) -# print("\nException when calling InvoiceSettingsApi->update_invoice_settings: %s\n" % e) + write_log_audit(status) + return return_data + except Exception as e: + write_log_audit(e.status if hasattr(e, 'status') else 999) + print("\nException when calling InvoiceSettingsApi->update_invoice_settings: %s\n" % e) -# def write_log_audit(status): -# print(f"[Sample Code Testing] [{Path(__file__).stem}] {status}") +def write_log_audit(status): + print(f"[Sample Code Testing] [{Path(__file__).stem}] {status}") -# if __name__ == "__main__": -# updateinvoicesettings() +if __name__ == "__main__": + updateinvoicesettings() From 06730185bff27e70ba5dd1d102e78e01ebbfd6c7 Mon Sep 17 00:00:00 2001 From: aasgoel Date: Tue, 18 Jun 2024 18:48:18 +0530 Subject: [PATCH 07/29] Added updateinvoicesettings.py to Sample Code Ignore List --- sampleCodeIgnoreList.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/sampleCodeIgnoreList.txt b/sampleCodeIgnoreList.txt index f50d12c..6646bd1 100644 --- a/sampleCodeIgnoreList.txt +++ b/sampleCodeIgnoreList.txt @@ -3,3 +3,4 @@ .*Flex_Security_Exception.py .*/Webhooks/.* .*/authentication/.* +.*updateinvoicesettings.py From e7324e1b5cf839ba3324de573e660b08ef186617 Mon Sep 17 00:00:00 2001 From: aasgoel Date: Wed, 19 Jun 2024 14:31:34 +0530 Subject: [PATCH 08/29] Uncommented updateinvoicesettings --- .../InvoiceSettings/updateinvoicesettings.py | 120 +++++++++--------- .../Subscriptions/update-subscription.py | 2 +- 2 files changed, 61 insertions(+), 61 deletions(-) diff --git a/samples/Invoicing/InvoiceSettings/updateinvoicesettings.py b/samples/Invoicing/InvoiceSettings/updateinvoicesettings.py index dbf1712..2cee9fb 100644 --- a/samples/Invoicing/InvoiceSettings/updateinvoicesettings.py +++ b/samples/Invoicing/InvoiceSettings/updateinvoicesettings.py @@ -1,73 +1,73 @@ -# from CyberSource import * -# from pathlib import Path -# import os -# import json -# from importlib.machinery import SourceFileLoader +from CyberSource import * +from pathlib import Path +import os +import json +from importlib.machinery import SourceFileLoader -# config_file = os.path.join(os.getcwd(), "data", "Configuration.py") -# configuration = SourceFileLoader("module.name", config_file).load_module() +config_file = os.path.join(os.getcwd(), "data", "Configuration.py") +configuration = SourceFileLoader("module.name", config_file).load_module() -# # To delete None values in Input Request Json body -# def del_none(d): -# for key, value in list(d.items()): -# if value is None: -# del d[key] -# elif isinstance(value, dict): -# del_none(value) -# return d +# To delete None values in Input Request Json body +def del_none(d): + for key, value in list(d.items()): + if value is None: + del d[key] + elif isinstance(value, dict): + del_none(value) + return d -# def updateinvoicesettings(): -# invoiceSettingsInformationMerchantLogo = "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" -# invoiceSettingsInformationMerchantDisplayName = "Custom Merchant Display Name" -# invoiceSettingsInformationCustomEmailMessage = "Custom merchant email message" -# invoiceSettingsInformationEnableReminders = True -# invoiceSettingsInformationHeaderStyleFontColor = "#000001" -# invoiceSettingsInformationHeaderStyleBackgroundColor = "#FFFFFF" -# invoiceSettingsInformationHeaderStyle = InvoicingV2InvoiceSettingsGet200ResponseInvoiceSettingsInformationHeaderStyle( -# font_color = invoiceSettingsInformationHeaderStyleFontColor, -# background_color = invoiceSettingsInformationHeaderStyleBackgroundColor -# ) +def updateinvoicesettings(): + invoiceSettingsInformationMerchantLogo = "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" + invoiceSettingsInformationMerchantDisplayName = "Custom Merchant Display Name" + invoiceSettingsInformationCustomEmailMessage = "Custom merchant email message" + invoiceSettingsInformationEnableReminders = True + invoiceSettingsInformationHeaderStyleFontColor = "#000001" + invoiceSettingsInformationHeaderStyleBackgroundColor = "#FFFFFF" + invoiceSettingsInformationHeaderStyle = InvoicingV2InvoiceSettingsGet200ResponseInvoiceSettingsInformationHeaderStyle( + font_color = invoiceSettingsInformationHeaderStyleFontColor, + background_color = invoiceSettingsInformationHeaderStyleBackgroundColor + ) -# invoiceSettingsInformationDeliveryLanguage = "en-US" -# invoiceSettingsInformationDefaultCurrencyCode = "USD" -# invoiceSettingsInformationPayerAuthenticationInInvoicing = "enable" -# invoiceSettingsInformation = Invoicingv2invoiceSettingsInvoiceSettingsInformation( -# merchant_logo = invoiceSettingsInformationMerchantLogo, -# merchant_display_name = invoiceSettingsInformationMerchantDisplayName, -# custom_email_message = invoiceSettingsInformationCustomEmailMessage, -# enable_reminders = invoiceSettingsInformationEnableReminders, -# header_style = invoiceSettingsInformationHeaderStyle.__dict__, -# delivery_language = invoiceSettingsInformationDeliveryLanguage, -# default_currency_code = invoiceSettingsInformationDefaultCurrencyCode, -# payer_authentication_in_invoicing = invoiceSettingsInformationPayerAuthenticationInInvoicing -# ) + invoiceSettingsInformationDeliveryLanguage = "en-US" + invoiceSettingsInformationDefaultCurrencyCode = "USD" + invoiceSettingsInformationPayerAuthenticationInInvoicing = "enable" + invoiceSettingsInformation = Invoicingv2invoiceSettingsInvoiceSettingsInformation( + merchant_logo = invoiceSettingsInformationMerchantLogo, + merchant_display_name = invoiceSettingsInformationMerchantDisplayName, + custom_email_message = invoiceSettingsInformationCustomEmailMessage, + enable_reminders = invoiceSettingsInformationEnableReminders, + header_style = invoiceSettingsInformationHeaderStyle.__dict__, + delivery_language = invoiceSettingsInformationDeliveryLanguage, + default_currency_code = invoiceSettingsInformationDefaultCurrencyCode, + payer_authentication_in_invoicing = invoiceSettingsInformationPayerAuthenticationInInvoicing + ) -# requestObj = InvoiceSettingsRequest( -# invoice_settings_information = invoiceSettingsInformation.__dict__ -# ) + requestObj = InvoiceSettingsRequest( + invoice_settings_information = invoiceSettingsInformation.__dict__ + ) -# requestObj = del_none(requestObj.__dict__) -# requestObj = json.dumps(requestObj) + requestObj = del_none(requestObj.__dict__) + requestObj = json.dumps(requestObj) -# try: -# config_obj = configuration.Configuration() -# client_config = config_obj.get_configuration() -# api_instance = InvoiceSettingsApi(client_config) -# return_data, status, body = api_instance.update_invoice_settings(requestObj) + try: + config_obj = configuration.Configuration() + client_config = config_obj.get_configuration() + api_instance = InvoiceSettingsApi(client_config) + return_data, status, body = api_instance.update_invoice_settings(requestObj) -# print("\nAPI RESPONSE CODE : ", status) -# print("\nAPI RESPONSE BODY : ", body) + print("\nAPI RESPONSE CODE : ", status) + print("\nAPI RESPONSE BODY : ", body) -# write_log_audit(status) -# return return_data -# except Exception as e: -# write_log_audit(e.status if hasattr(e, 'status') else 999) -# print("\nException when calling InvoiceSettingsApi->update_invoice_settings: %s\n" % e) + write_log_audit(status) + return return_data + except Exception as e: + write_log_audit(e.status if hasattr(e, 'status') else 999) + print("\nException when calling InvoiceSettingsApi->update_invoice_settings: %s\n" % e) -# def write_log_audit(status): -# print(f"[Sample Code Testing] [{Path(__file__).stem}] {status}") +def write_log_audit(status): + print(f"[Sample Code Testing] [{Path(__file__).stem}] {status}") -# if __name__ == "__main__": -# updateinvoicesettings() +if __name__ == "__main__": + updateinvoicesettings() diff --git a/samples/RecurringBillingSubscriptions/Subscriptions/update-subscription.py b/samples/RecurringBillingSubscriptions/Subscriptions/update-subscription.py index acc7c26..51bbaf2 100644 --- a/samples/RecurringBillingSubscriptions/Subscriptions/update-subscription.py +++ b/samples/RecurringBillingSubscriptions/Subscriptions/update-subscription.py @@ -94,7 +94,7 @@ def update_subscription(): return return_data except Exception as e: - write_log_audit(e.status) + write_log_audit(e.status if hasattr(e, 'status') else 999) print("\nException when calling SubscriptionsApi->update_subscription: %s\n" % e) def write_log_audit(status): From 2ab9951c57f9b4f6469ec027414c972da30efb85 Mon Sep 17 00:00:00 2001 From: aasgoel Date: Wed, 3 Jul 2024 15:41:29 +0530 Subject: [PATCH 09/29] changes to write_log_audit(e.status) --- samples/RecurringBillingSubscriptions/Plans/get-plan.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/RecurringBillingSubscriptions/Plans/get-plan.py b/samples/RecurringBillingSubscriptions/Plans/get-plan.py index 06e355a..cd4d66b 100644 --- a/samples/RecurringBillingSubscriptions/Plans/get-plan.py +++ b/samples/RecurringBillingSubscriptions/Plans/get-plan.py @@ -36,7 +36,7 @@ def get_plan(): return return_data except Exception as e: - write_log_audit(e.status) + write_log_audit(e.status if hasattr(e, 'status') else 999) print("\nException when calling PlansApi->get_plan: %s\n" % e) def write_log_audit(status): From 7da525b661702ea6b199ad793b7268022a1a1318 Mon Sep 17 00:00:00 2001 From: aasgoel Date: Wed, 3 Jul 2024 15:47:43 +0530 Subject: [PATCH 10/29] fixing bad indent --- samples/RecurringBillingSubscriptions/Plans/get-plan.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/RecurringBillingSubscriptions/Plans/get-plan.py b/samples/RecurringBillingSubscriptions/Plans/get-plan.py index cd4d66b..c672cf2 100644 --- a/samples/RecurringBillingSubscriptions/Plans/get-plan.py +++ b/samples/RecurringBillingSubscriptions/Plans/get-plan.py @@ -36,7 +36,7 @@ def get_plan(): return return_data except Exception as e: - write_log_audit(e.status if hasattr(e, 'status') else 999) + write_log_audit(e.status if hasattr(e, 'status') else 999) print("\nException when calling PlansApi->get_plan: %s\n" % e) def write_log_audit(status): From 6bad37de44ed1ae96d04c03b2413fab48495d8e1 Mon Sep 17 00:00:00 2001 From: gaubansa Date: Mon, 5 Aug 2024 16:23:37 +0530 Subject: [PATCH 11/29] adding bin loop up samples --- samples/BinLookup/bin-lookup-with-card.py | 65 +++++++++++++++++++ .../bin-lookup-with-healthcare-card.py | 61 +++++++++++++++++ .../bin-lookup-with-network-token.py | 61 +++++++++++++++++ .../bin-lookup-with-tms-customer-id.py | 61 +++++++++++++++++ ...n-lookup-with-tms-instrument-identifier.py | 61 +++++++++++++++++ ...bin-lookup-with-tms-jti-transient-token.py | 57 ++++++++++++++++ ...bin-lookup-with-tms-jwt-transient-token.py | 57 ++++++++++++++++ .../bin-lookup-with-tms-payment-instrument.py | 61 +++++++++++++++++ 8 files changed, 484 insertions(+) create mode 100644 samples/BinLookup/bin-lookup-with-card.py create mode 100644 samples/BinLookup/bin-lookup-with-healthcare-card.py create mode 100644 samples/BinLookup/bin-lookup-with-network-token.py create mode 100644 samples/BinLookup/bin-lookup-with-tms-customer-id.py create mode 100644 samples/BinLookup/bin-lookup-with-tms-instrument-identifier.py create mode 100644 samples/BinLookup/bin-lookup-with-tms-jti-transient-token.py create mode 100644 samples/BinLookup/bin-lookup-with-tms-jwt-transient-token.py create mode 100644 samples/BinLookup/bin-lookup-with-tms-payment-instrument.py diff --git a/samples/BinLookup/bin-lookup-with-card.py b/samples/BinLookup/bin-lookup-with-card.py new file mode 100644 index 0000000..8b50e79 --- /dev/null +++ b/samples/BinLookup/bin-lookup-with-card.py @@ -0,0 +1,65 @@ +from CyberSource import * +import os +import json +from importlib.machinery import SourceFileLoader +from pathlib import Path + +config_file = os.path.join(os.getcwd(), "data", "Configuration.py") +configuration = SourceFileLoader("module.name", config_file).load_module() + +# To delete None values in Input Request Json body +def del_none(d): + for key, value in list(d.items()): + if value is None: + del d[key] + elif isinstance(value, dict): + del_none(value) + elif isinstance(value, list): + for item in value: + del_none(item) + return d + +def bin_lookup_with_card(): + clientReferenceInformation = Binv1binlookupClientReferenceInformation( + ) + + paymentInformationCardNumber = "4111111111111111" + paymentInformationCard = Binv1binlookupPaymentInformationCard( + number = paymentInformationCardNumber + ) + + paymentInformation = Binv1binlookupPaymentInformation( + card = paymentInformationCard.__dict__ + ) + + requestObj = CreateBinLookupRequest( + client_reference_information = clientReferenceInformation.__dict__, + payment_information = paymentInformation.__dict__ + ) + + + requestObj = del_none(requestObj.__dict__) + requestObj = json.dumps(requestObj) + + + try: + config_obj = configuration.Configuration() + client_config = config_obj.get_configuration() + api_instance = BinLookupApi(client_config) + return_data, status, body = api_instance.get_account_info(requestObj) + + print("\nAPI RESPONSE CODE : ", status) + print("\nAPI RESPONSE BODY : ", body) + + write_log_audit(status) + + return return_data + except Exception as e: + write_log_audit(e.status) + print("\nException when calling BinLookupApi->get_account_info: %s\n" % e) + +def write_log_audit(status): + print(f"[Sample Code Testing] [{Path(__file__).stem}] {status}") + +if __name__ == "__main__": + bin_lookup_with_card() \ No newline at end of file diff --git a/samples/BinLookup/bin-lookup-with-healthcare-card.py b/samples/BinLookup/bin-lookup-with-healthcare-card.py new file mode 100644 index 0000000..5b41627 --- /dev/null +++ b/samples/BinLookup/bin-lookup-with-healthcare-card.py @@ -0,0 +1,61 @@ +from CyberSource import * +import os +import json +from importlib.machinery import SourceFileLoader +from pathlib import Path + +config_file = os.path.join(os.getcwd(), "data", "Configuration.py") +configuration = SourceFileLoader("module.name", config_file).load_module() + +# To delete None values in Input Request Json body +def del_none(d): + for key, value in list(d.items()): + if value is None: + del d[key] + elif isinstance(value, dict): + del_none(value) + elif isinstance(value, list): + for item in value: + del_none(item) + return d + +def bin_lookup_with_healthcare_card(): + paymentInformationCardNumber = "4288900100000" + paymentInformationCard = Binv1binlookupPaymentInformationCard( + number = paymentInformationCardNumber + ) + + paymentInformation = Binv1binlookupPaymentInformation( + card = paymentInformationCard.__dict__ + ) + + requestObj = CreateBinLookupRequest( + payment_information = paymentInformation.__dict__ + ) + + + requestObj = del_none(requestObj.__dict__) + requestObj = json.dumps(requestObj) + + + try: + config_obj = configuration.Configuration() + client_config = config_obj.get_configuration() + api_instance = BinLookupApi(client_config) + return_data, status, body = api_instance.get_account_info(requestObj) + + print("\nAPI RESPONSE CODE : ", status) + print("\nAPI RESPONSE BODY : ", body) + + write_log_audit(status) + + return return_data + except Exception as e: + write_log_audit(e.status) + print("\nException when calling BinLookupApi->get_account_info: %s\n" % e) + +def write_log_audit(status): + print(f"[Sample Code Testing] [{Path(__file__).stem}] {status}") + +if __name__ == "__main__": + bin_lookup_with_healthcare_card() \ No newline at end of file diff --git a/samples/BinLookup/bin-lookup-with-network-token.py b/samples/BinLookup/bin-lookup-with-network-token.py new file mode 100644 index 0000000..a076cf7 --- /dev/null +++ b/samples/BinLookup/bin-lookup-with-network-token.py @@ -0,0 +1,61 @@ +from CyberSource import * +import os +import json +from importlib.machinery import SourceFileLoader +from pathlib import Path + +config_file = os.path.join(os.getcwd(), "data", "Configuration.py") +configuration = SourceFileLoader("module.name", config_file).load_module() + +# To delete None values in Input Request Json body +def del_none(d): + for key, value in list(d.items()): + if value is None: + del d[key] + elif isinstance(value, dict): + del_none(value) + elif isinstance(value, list): + for item in value: + del_none(item) + return d + +def bin_lookup_with_network_token(): + paymentInformationCardNumber = "4895370016313691" + paymentInformationCard = Binv1binlookupPaymentInformationCard( + number = paymentInformationCardNumber + ) + + paymentInformation = Binv1binlookupPaymentInformation( + card = paymentInformationCard.__dict__ + ) + + requestObj = CreateBinLookupRequest( + payment_information = paymentInformation.__dict__ + ) + + + requestObj = del_none(requestObj.__dict__) + requestObj = json.dumps(requestObj) + + + try: + config_obj = configuration.Configuration() + client_config = config_obj.get_configuration() + api_instance = BinLookupApi(client_config) + return_data, status, body = api_instance.get_account_info(requestObj) + + print("\nAPI RESPONSE CODE : ", status) + print("\nAPI RESPONSE BODY : ", body) + + write_log_audit(status) + + return return_data + except Exception as e: + write_log_audit(e.status) + print("\nException when calling BinLookupApi->get_account_info: %s\n" % e) + +def write_log_audit(status): + print(f"[Sample Code Testing] [{Path(__file__).stem}] {status}") + +if __name__ == "__main__": + bin_lookup_with_network_token() \ No newline at end of file diff --git a/samples/BinLookup/bin-lookup-with-tms-customer-id.py b/samples/BinLookup/bin-lookup-with-tms-customer-id.py new file mode 100644 index 0000000..7cc2e83 --- /dev/null +++ b/samples/BinLookup/bin-lookup-with-tms-customer-id.py @@ -0,0 +1,61 @@ +from CyberSource import * +import os +import json +from importlib.machinery import SourceFileLoader +from pathlib import Path + +config_file = os.path.join(os.getcwd(), "data", "Configuration.py") +configuration = SourceFileLoader("module.name", config_file).load_module() + +# To delete None values in Input Request Json body +def del_none(d): + for key, value in list(d.items()): + if value is None: + del d[key] + elif isinstance(value, dict): + del_none(value) + elif isinstance(value, list): + for item in value: + del_none(item) + return d + +def bin_lookup_with_tms_customer_id(): + paymentInformationCustomerId = "E5426CFDE77F7390E053A2598D0A925D" + paymentInformationCustomer = GetAllSubscriptionsResponsePaymentInformationCustomer( + id = paymentInformationCustomerId + ) + + paymentInformation = Binv1binlookupPaymentInformation( + customer = paymentInformationCustomer.__dict__ + ) + + requestObj = CreateBinLookupRequest( + payment_information = paymentInformation.__dict__ + ) + + + requestObj = del_none(requestObj.__dict__) + requestObj = json.dumps(requestObj) + + + try: + config_obj = configuration.Configuration() + client_config = config_obj.get_configuration() + api_instance = BinLookupApi(client_config) + return_data, status, body = api_instance.get_account_info(requestObj) + + print("\nAPI RESPONSE CODE : ", status) + print("\nAPI RESPONSE BODY : ", body) + + write_log_audit(status) + + return return_data + except Exception as e: + write_log_audit(e.status) + print("\nException when calling BinLookupApi->get_account_info: %s\n" % e) + +def write_log_audit(status): + print(f"[Sample Code Testing] [{Path(__file__).stem}] {status}") + +if __name__ == "__main__": + bin_lookup_with_tms_customer_id() \ No newline at end of file diff --git a/samples/BinLookup/bin-lookup-with-tms-instrument-identifier.py b/samples/BinLookup/bin-lookup-with-tms-instrument-identifier.py new file mode 100644 index 0000000..f5b4089 --- /dev/null +++ b/samples/BinLookup/bin-lookup-with-tms-instrument-identifier.py @@ -0,0 +1,61 @@ +from CyberSource import * +import os +import json +from importlib.machinery import SourceFileLoader +from pathlib import Path + +config_file = os.path.join(os.getcwd(), "data", "Configuration.py") +configuration = SourceFileLoader("module.name", config_file).load_module() + +# To delete None values in Input Request Json body +def del_none(d): + for key, value in list(d.items()): + if value is None: + del d[key] + elif isinstance(value, dict): + del_none(value) + elif isinstance(value, list): + for item in value: + del_none(item) + return d + +def bin_lookup_with_tms_instrument_identifier(): + paymentInformationInstrumentIdentifierId = "7010000000016241111" + paymentInformationInstrumentIdentifier = Ptsv2paymentsPaymentInformationInstrumentIdentifier( + id = paymentInformationInstrumentIdentifierId + ) + + paymentInformation = Binv1binlookupPaymentInformation( + instrument_identifier = paymentInformationInstrumentIdentifier.__dict__ + ) + + requestObj = CreateBinLookupRequest( + payment_information = paymentInformation.__dict__ + ) + + + requestObj = del_none(requestObj.__dict__) + requestObj = json.dumps(requestObj) + + + try: + config_obj = configuration.Configuration() + client_config = config_obj.get_configuration() + api_instance = BinLookupApi(client_config) + return_data, status, body = api_instance.get_account_info(requestObj) + + print("\nAPI RESPONSE CODE : ", status) + print("\nAPI RESPONSE BODY : ", body) + + write_log_audit(status) + + return return_data + except Exception as e: + write_log_audit(e.status) + print("\nException when calling BinLookupApi->get_account_info: %s\n" % e) + +def write_log_audit(status): + print(f"[Sample Code Testing] [{Path(__file__).stem}] {status}") + +if __name__ == "__main__": + bin_lookup_with_tms_instrument_identifier() \ No newline at end of file diff --git a/samples/BinLookup/bin-lookup-with-tms-jti-transient-token.py b/samples/BinLookup/bin-lookup-with-tms-jti-transient-token.py new file mode 100644 index 0000000..6143132 --- /dev/null +++ b/samples/BinLookup/bin-lookup-with-tms-jti-transient-token.py @@ -0,0 +1,57 @@ +from CyberSource import * +import os +import json +from importlib.machinery import SourceFileLoader +from pathlib import Path + +config_file = os.path.join(os.getcwd(), "data", "Configuration.py") +configuration = SourceFileLoader("module.name", config_file).load_module() + +# To delete None values in Input Request Json body +def del_none(d): + for key, value in list(d.items()): + if value is None: + del d[key] + elif isinstance(value, dict): + del_none(value) + elif isinstance(value, list): + for item in value: + del_none(item) + return d + +def bin_lookup_with_tms_jti_transient_token(): + tokenInformationJti = "1E0WC1GO87JG1BDP0CQ8SCR1TTK86U9N98H3WH8IFM9MVEWTIYFI62F4941E7A92" + tokenInformation = Binv1binlookupTokenInformation( + jti = tokenInformationJti + ) + + requestObj = CreateBinLookupRequest( + token_information = tokenInformation.__dict__ + ) + + + requestObj = del_none(requestObj.__dict__) + requestObj = json.dumps(requestObj) + + + try: + config_obj = configuration.Configuration() + client_config = config_obj.get_configuration() + api_instance = BinLookupApi(client_config) + return_data, status, body = api_instance.get_account_info(requestObj) + + print("\nAPI RESPONSE CODE : ", status) + print("\nAPI RESPONSE BODY : ", body) + + write_log_audit(status) + + return return_data + except Exception as e: + write_log_audit(e.status) + print("\nException when calling BinLookupApi->get_account_info: %s\n" % e) + +def write_log_audit(status): + print(f"[Sample Code Testing] [{Path(__file__).stem}] {status}") + +if __name__ == "__main__": + bin_lookup_with_tms_jti_transient_token() \ No newline at end of file diff --git a/samples/BinLookup/bin-lookup-with-tms-jwt-transient-token.py b/samples/BinLookup/bin-lookup-with-tms-jwt-transient-token.py new file mode 100644 index 0000000..3dbd6f0 --- /dev/null +++ b/samples/BinLookup/bin-lookup-with-tms-jwt-transient-token.py @@ -0,0 +1,57 @@ +from CyberSource import * +import os +import json +from importlib.machinery import SourceFileLoader +from pathlib import Path + +config_file = os.path.join(os.getcwd(), "data", "Configuration.py") +configuration = SourceFileLoader("module.name", config_file).load_module() + +# To delete None values in Input Request Json body +def del_none(d): + for key, value in list(d.items()): + if value is None: + del d[key] + elif isinstance(value, dict): + del_none(value) + elif isinstance(value, list): + for item in value: + del_none(item) + return d + +def bin_lookup_with_tms_jwt_transient_token(): + tokenInformationTransientTokenJwt = "eyJraWQiOiIwODd0bk1DNU04bXJHR3JHMVJQTkwzZ2VyRUh5VWV1ciIsImFsZyI6IlJTMjU2In0.eyJpc3MiOiJGbGV4LzA4IiwiZXhwIjoxNjYwMTk1ODcwLCJ0eXBlIjoiYXBpLTAuMS4wIiwiaWF0IjoxNjYwMTk0OTcwLCJqdGkiOiIxRTBXQzFHTzg3SkcxQkRQMENROFNDUjFUVEs4NlU5Tjk4SDNXSDhJRk05TVZFV1RJWUZJNjJGNDk0MUU3QTkyIiwiY29udGVudCI6eyJwYXltZW50SW5mb3JtYXRpb24iOnsiY2FyZCI6eyJudW1iZXIiOnsibWFza2VkVmFsdWUiOiJYWFhYWFhYWFhYWFgxMTExIiwiYmluIjoiNDExMTExIn0sInR5cGUiOnsidmFsdWUiOiIwMDEifX19fX0.MkCLbyvufN4prGRvHJcqCu1WceDVlgubZVpShNWQVjpuFQUuqwrKg284sC7ucVKuIsOU0DTN8_OoxDLduvZhS7X_5TnO0QjyA_aFxbRBvU_bEz1l9V99VPADG89T-fox_L6sLUaoTJ8T4PyD7rkPHEA0nmXbqQCVqw4Czc5TqlKCwmL-Fe0NBR2HlOFI1PrSXT-7_wI-JTgXI0dQzb8Ub20erHwOLwu3oni4_ZmS3rGI_gxq2MHi8pO-ZOgA597be4WfVFAx1wnMbareqR72a0QM4DefeoltrpNqXSaASVyb5G0zuqg-BOjWJbawmg2QgcZ_vE3rJ6PDgWROvp9Tbw" + tokenInformation = Binv1binlookupTokenInformation( + transient_token_jwt = tokenInformationTransientTokenJwt + ) + + requestObj = CreateBinLookupRequest( + token_information = tokenInformation.__dict__ + ) + + + requestObj = del_none(requestObj.__dict__) + requestObj = json.dumps(requestObj) + + + try: + config_obj = configuration.Configuration() + client_config = config_obj.get_configuration() + api_instance = BinLookupApi(client_config) + return_data, status, body = api_instance.get_account_info(requestObj) + + print("\nAPI RESPONSE CODE : ", status) + print("\nAPI RESPONSE BODY : ", body) + + write_log_audit(status) + + return return_data + except Exception as e: + write_log_audit(e.status) + print("\nException when calling BinLookupApi->get_account_info: %s\n" % e) + +def write_log_audit(status): + print(f"[Sample Code Testing] [{Path(__file__).stem}] {status}") + +if __name__ == "__main__": + bin_lookup_with_tms_jwt_transient_token() \ No newline at end of file diff --git a/samples/BinLookup/bin-lookup-with-tms-payment-instrument.py b/samples/BinLookup/bin-lookup-with-tms-payment-instrument.py new file mode 100644 index 0000000..b62fd84 --- /dev/null +++ b/samples/BinLookup/bin-lookup-with-tms-payment-instrument.py @@ -0,0 +1,61 @@ +from CyberSource import * +import os +import json +from importlib.machinery import SourceFileLoader +from pathlib import Path + +config_file = os.path.join(os.getcwd(), "data", "Configuration.py") +configuration = SourceFileLoader("module.name", config_file).load_module() + +# To delete None values in Input Request Json body +def del_none(d): + for key, value in list(d.items()): + if value is None: + del d[key] + elif isinstance(value, dict): + del_none(value) + elif isinstance(value, list): + for item in value: + del_none(item) + return d + +def bin_lookup_with_tms_payment_instrument(): + paymentInformationPaymentInstrumentId = "E5427539180789D0E053A2598D0AF053" + paymentInformationPaymentInstrument = Ptsv2paymentsPaymentInformationPaymentInstrument( + id = paymentInformationPaymentInstrumentId + ) + + paymentInformation = Binv1binlookupPaymentInformation( + payment_instrument = paymentInformationPaymentInstrument.__dict__ + ) + + requestObj = CreateBinLookupRequest( + payment_information = paymentInformation.__dict__ + ) + + + requestObj = del_none(requestObj.__dict__) + requestObj = json.dumps(requestObj) + + + try: + config_obj = configuration.Configuration() + client_config = config_obj.get_configuration() + api_instance = BinLookupApi(client_config) + return_data, status, body = api_instance.get_account_info(requestObj) + + print("\nAPI RESPONSE CODE : ", status) + print("\nAPI RESPONSE BODY : ", body) + + write_log_audit(status) + + return return_data + except Exception as e: + write_log_audit(e.status) + print("\nException when calling BinLookupApi->get_account_info: %s\n" % e) + +def write_log_audit(status): + print(f"[Sample Code Testing] [{Path(__file__).stem}] {status}") + +if __name__ == "__main__": + bin_lookup_with_tms_payment_instrument() \ No newline at end of file From ac66553a3e1d9d00f82b056cb91af496f3435c02 Mon Sep 17 00:00:00 2001 From: gaubansa Date: Mon, 12 Aug 2024 11:40:14 +0530 Subject: [PATCH 12/29] testing jwt --- data/Configuration.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/Configuration.py b/data/Configuration.py index 5e47abc..3fe8928 100644 --- a/data/Configuration.py +++ b/data/Configuration.py @@ -3,7 +3,7 @@ class Configuration: def __init__(self): - self.authentication_type ="http_signature" + self.authentication_type ="jwt" self.merchantid = "testrest" self.alternative_merchantid = "testrest_cpctv" self.run_environment = "apitest.cybersource.com" From e12dd918487d9c78fe5fd6c6a97b65197daeaaf5 Mon Sep 17 00:00:00 2001 From: gaubansa Date: Mon, 12 Aug 2024 12:16:58 +0530 Subject: [PATCH 13/29] adding updated p12 file --- data/Configuration.py | 2 +- resources/testrest_cpctv.p12 | Bin 3585 -> 4971 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/data/Configuration.py b/data/Configuration.py index 3fe8928..6b85f0d 100644 --- a/data/Configuration.py +++ b/data/Configuration.py @@ -16,7 +16,7 @@ def __init__(self): self.key_pass = "testrest" self.key_file_name = "testrest" self.alternative_key_alias = "testrest_cpctv" - self.alternative_key_pass = "testrest_cpctv" + self.alternative_key_pass = "Ap!C38tp12@" self.alternative_key_file_name = "testrest_cpctv" self.keys_directory = os.path.join(os.getcwd(), "resources") # HTTP PARAMETERS diff --git a/resources/testrest_cpctv.p12 b/resources/testrest_cpctv.p12 index 9bb718b0db2072b41e99593cd669d3965e572c95..6caeeeae57e0e39117a65ce1ee7e86df0fa40703 100644 GIT binary patch literal 4971 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 literal 3585 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 Date: Mon, 12 Aug 2024 13:21:00 +0530 Subject: [PATCH 14/29] Update Configuration.py --- data/Configuration.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/Configuration.py b/data/Configuration.py index 6b85f0d..cdc4e07 100644 --- a/data/Configuration.py +++ b/data/Configuration.py @@ -3,7 +3,7 @@ class Configuration: def __init__(self): - self.authentication_type ="jwt" + self.authentication_type ="http_signature" self.merchantid = "testrest" self.alternative_merchantid = "testrest_cpctv" self.run_environment = "apitest.cybersource.com" @@ -143,4 +143,4 @@ def get_indermediate_configuration(self): configuration_dictionary["log_config"] = log_config #configuration_dictionary["proxy_address"] = self.proxy_address #configuration_dictionary["proxy_port"] = self.proxy_port - return configuration_dictionary \ No newline at end of file + return configuration_dictionary From 915a1630e692761636000af1c618ac21b3a53b87 Mon Sep 17 00:00:00 2001 From: Bansal Date: Wed, 28 Aug 2024 15:22:09 +0530 Subject: [PATCH 15/29] updating sample code for new version of SDK --- .../PayerAuthentication/authentication-with-new-account.py | 4 ++-- .../PayerAuthentication/authentication-with-no-redirect.py | 4 ++-- .../enroll-with-customerid-as-payment-information.py | 2 +- .../PayerAuthentication/enroll-with-pending-authentication.py | 4 ++-- samples/PayerAuthentication/enroll-with-transient-token.py | 2 +- samples/PayerAuthentication/enroll-with-travel-information.py | 4 ++-- .../pending-authentication-with-unknown-path.py | 4 ++-- .../PayerAuthentication/setup-completion-with-card-number.py | 2 +- .../setup-completion-with-flex-transient-token.py | 2 +- ...p-completion-with-fluid-data-value-and-payment-solution.py | 2 +- .../setup-completion-with-secure-storage-token.py | 2 +- .../PayerAuthentication/setup-completion-with-tms-token.py | 2 +- .../setup-completion-with-tokenized-card.py | 2 +- .../PayerAuthentication/validate-authentication-results.py | 2 +- 14 files changed, 19 insertions(+), 19 deletions(-) diff --git a/samples/PayerAuthentication/authentication-with-new-account.py b/samples/PayerAuthentication/authentication-with-new-account.py index abea1a2..0f2ece9 100644 --- a/samples/PayerAuthentication/authentication-with-new-account.py +++ b/samples/PayerAuthentication/authentication-with-new-account.py @@ -18,7 +18,7 @@ def del_none(d): def authentication_with_new_account(): clientReferenceInformationCode = "New Account" - clientReferenceInformation = Riskv1decisionsClientReferenceInformation( + clientReferenceInformation = Riskv1authenticationsetupsClientReferenceInformation( code = clientReferenceInformationCode ) @@ -61,7 +61,7 @@ def authentication_with_new_account(): paymentInformationCardExpirationMonth = "12" paymentInformationCardExpirationYear = "2025" paymentInformationCardNumber = "4000990000000004" - paymentInformationCard = Riskv1authenticationsPaymentInformationCard( + paymentInformationCard = Riskv1authenticationsetupsPaymentInformationCard( type = paymentInformationCardType, expiration_month = paymentInformationCardExpirationMonth, expiration_year = paymentInformationCardExpirationYear, diff --git a/samples/PayerAuthentication/authentication-with-no-redirect.py b/samples/PayerAuthentication/authentication-with-no-redirect.py index 8375ccb..a891652 100644 --- a/samples/PayerAuthentication/authentication-with-no-redirect.py +++ b/samples/PayerAuthentication/authentication-with-no-redirect.py @@ -25,7 +25,7 @@ def authentication_with_no_redirect(): solution_id = clientReferenceInformationPartnerSolutionId ) - clientReferenceInformation = Riskv1decisionsClientReferenceInformation( + clientReferenceInformation = Riskv1authenticationsetupsClientReferenceInformation( code = clientReferenceInformationCode, partner = clientReferenceInformationPartner.__dict__ ) @@ -69,7 +69,7 @@ def authentication_with_no_redirect(): paymentInformationCardExpirationMonth = "12" paymentInformationCardExpirationYear = "2025" paymentInformationCardNumber = "4000990000000004" - paymentInformationCard = Riskv1authenticationsPaymentInformationCard( + paymentInformationCard = Riskv1authenticationsetupsPaymentInformationCard( type = paymentInformationCardType, expiration_month = paymentInformationCardExpirationMonth, expiration_year = paymentInformationCardExpirationYear, diff --git a/samples/PayerAuthentication/enroll-with-customerid-as-payment-information.py b/samples/PayerAuthentication/enroll-with-customerid-as-payment-information.py index 31b0b3f..e45f172 100644 --- a/samples/PayerAuthentication/enroll-with-customerid-as-payment-information.py +++ b/samples/PayerAuthentication/enroll-with-customerid-as-payment-information.py @@ -18,7 +18,7 @@ def del_none(d): def enroll_with_customerid_as_payment_information(): clientReferenceInformationCode = "UNKNOWN" - clientReferenceInformation = Riskv1decisionsClientReferenceInformation( + clientReferenceInformation = Riskv1authenticationsetupsClientReferenceInformation( code = clientReferenceInformationCode ) diff --git a/samples/PayerAuthentication/enroll-with-pending-authentication.py b/samples/PayerAuthentication/enroll-with-pending-authentication.py index dc80771..d31a53b 100644 --- a/samples/PayerAuthentication/enroll-with-pending-authentication.py +++ b/samples/PayerAuthentication/enroll-with-pending-authentication.py @@ -18,7 +18,7 @@ def del_none(d): def enroll_with_pending_authentication(): clientReferenceInformationCode = "cybs_test" - clientReferenceInformation = Riskv1decisionsClientReferenceInformation( + clientReferenceInformation = Riskv1authenticationsetupsClientReferenceInformation( code = clientReferenceInformationCode ) @@ -61,7 +61,7 @@ def enroll_with_pending_authentication(): paymentInformationCardExpirationMonth = "12" paymentInformationCardExpirationYear = "2025" paymentInformationCardNumber = "4000000000000101" - paymentInformationCard = Riskv1authenticationsPaymentInformationCard( + paymentInformationCard = Riskv1authenticationsetupsPaymentInformationCard( type = paymentInformationCardType, expiration_month = paymentInformationCardExpirationMonth, expiration_year = paymentInformationCardExpirationYear, diff --git a/samples/PayerAuthentication/enroll-with-transient-token.py b/samples/PayerAuthentication/enroll-with-transient-token.py index 1546319..b839c1d 100644 --- a/samples/PayerAuthentication/enroll-with-transient-token.py +++ b/samples/PayerAuthentication/enroll-with-transient-token.py @@ -18,7 +18,7 @@ def del_none(d): def enroll_with_transient_token(): clientReferenceInformationCode = "UNKNOWN" - clientReferenceInformation = Riskv1decisionsClientReferenceInformation( + clientReferenceInformation = Riskv1authenticationsetupsClientReferenceInformation( code = clientReferenceInformationCode ) diff --git a/samples/PayerAuthentication/enroll-with-travel-information.py b/samples/PayerAuthentication/enroll-with-travel-information.py index 58ebb5c..3acfc2d 100644 --- a/samples/PayerAuthentication/enroll-with-travel-information.py +++ b/samples/PayerAuthentication/enroll-with-travel-information.py @@ -18,7 +18,7 @@ def del_none(d): def enroll_with_travel_information(): clientReferenceInformationCode = "cybs_test" - clientReferenceInformation = Riskv1decisionsClientReferenceInformation( + clientReferenceInformation = Riskv1authenticationsetupsClientReferenceInformation( code = clientReferenceInformationCode ) @@ -61,7 +61,7 @@ def enroll_with_travel_information(): paymentInformationCardExpirationMonth = "12" paymentInformationCardExpirationYear = "2025" paymentInformationCardNumber = "5200340000000015" - paymentInformationCard = Riskv1authenticationsPaymentInformationCard( + paymentInformationCard = Riskv1authenticationsetupsPaymentInformationCard( type = paymentInformationCardType, expiration_month = paymentInformationCardExpirationMonth, expiration_year = paymentInformationCardExpirationYear, diff --git a/samples/PayerAuthentication/pending-authentication-with-unknown-path.py b/samples/PayerAuthentication/pending-authentication-with-unknown-path.py index 2bda067..be38c40 100644 --- a/samples/PayerAuthentication/pending-authentication-with-unknown-path.py +++ b/samples/PayerAuthentication/pending-authentication-with-unknown-path.py @@ -18,7 +18,7 @@ def del_none(d): def pending_authentication_with_unknown_path(): clientReferenceInformationCode = "UNKNOWN" - clientReferenceInformation = Riskv1decisionsClientReferenceInformation( + clientReferenceInformation = Riskv1authenticationsetupsClientReferenceInformation( code = clientReferenceInformationCode ) @@ -61,7 +61,7 @@ def pending_authentication_with_unknown_path(): paymentInformationCardExpirationMonth = "12" paymentInformationCardExpirationYear = "2025" paymentInformationCardNumber = "4012001037490014" - paymentInformationCard = Riskv1authenticationsPaymentInformationCard( + paymentInformationCard = Riskv1authenticationsetupsPaymentInformationCard( type = paymentInformationCardType, expiration_month = paymentInformationCardExpirationMonth, expiration_year = paymentInformationCardExpirationYear, diff --git a/samples/PayerAuthentication/setup-completion-with-card-number.py b/samples/PayerAuthentication/setup-completion-with-card-number.py index ea45abf..119687b 100644 --- a/samples/PayerAuthentication/setup-completion-with-card-number.py +++ b/samples/PayerAuthentication/setup-completion-with-card-number.py @@ -25,7 +25,7 @@ def setup_completion_with_card_number(): solution_id = clientReferenceInformationPartnerSolutionId ) - clientReferenceInformation = Riskv1decisionsClientReferenceInformation( + clientReferenceInformation = Riskv1authenticationsetupsClientReferenceInformation( code = clientReferenceInformationCode, partner = clientReferenceInformationPartner.__dict__ ) diff --git a/samples/PayerAuthentication/setup-completion-with-flex-transient-token.py b/samples/PayerAuthentication/setup-completion-with-flex-transient-token.py index ffcc78a..d5ad6ac 100644 --- a/samples/PayerAuthentication/setup-completion-with-flex-transient-token.py +++ b/samples/PayerAuthentication/setup-completion-with-flex-transient-token.py @@ -18,7 +18,7 @@ def del_none(d): def setup_completion_with_flex_transient_token(): clientReferenceInformationCode = "cybs_test" - clientReferenceInformation = Riskv1decisionsClientReferenceInformation( + clientReferenceInformation = Riskv1authenticationsetupsClientReferenceInformation( code = clientReferenceInformationCode ) diff --git a/samples/PayerAuthentication/setup-completion-with-fluid-data-value-and-payment-solution.py b/samples/PayerAuthentication/setup-completion-with-fluid-data-value-and-payment-solution.py index 79c6153..2559945 100644 --- a/samples/PayerAuthentication/setup-completion-with-fluid-data-value-and-payment-solution.py +++ b/samples/PayerAuthentication/setup-completion-with-fluid-data-value-and-payment-solution.py @@ -18,7 +18,7 @@ def del_none(d): def setup_completion_with_fluid_data_value_and_payment_solution(): clientReferenceInformationCode = "cybs_test" - clientReferenceInformation = Riskv1decisionsClientReferenceInformation( + clientReferenceInformation = Riskv1authenticationsetupsClientReferenceInformation( code = clientReferenceInformationCode ) diff --git a/samples/PayerAuthentication/setup-completion-with-secure-storage-token.py b/samples/PayerAuthentication/setup-completion-with-secure-storage-token.py index ead820a..695f9f2 100644 --- a/samples/PayerAuthentication/setup-completion-with-secure-storage-token.py +++ b/samples/PayerAuthentication/setup-completion-with-secure-storage-token.py @@ -18,7 +18,7 @@ def del_none(d): def setup_completion_with_secure_storage_token(): clientReferenceInformationCode = "cybs_test" - clientReferenceInformation = Riskv1decisionsClientReferenceInformation( + clientReferenceInformation = Riskv1authenticationsetupsClientReferenceInformation( code = clientReferenceInformationCode ) diff --git a/samples/PayerAuthentication/setup-completion-with-tms-token.py b/samples/PayerAuthentication/setup-completion-with-tms-token.py index 4ed5f1b..8be6e3f 100644 --- a/samples/PayerAuthentication/setup-completion-with-tms-token.py +++ b/samples/PayerAuthentication/setup-completion-with-tms-token.py @@ -18,7 +18,7 @@ def del_none(d): def setup_completion_with_tms_token(): clientReferenceInformationCode = "cybs_test" - clientReferenceInformation = Riskv1decisionsClientReferenceInformation( + clientReferenceInformation = Riskv1authenticationsetupsClientReferenceInformation( code = clientReferenceInformationCode ) diff --git a/samples/PayerAuthentication/setup-completion-with-tokenized-card.py b/samples/PayerAuthentication/setup-completion-with-tokenized-card.py index 0dc9e1d..6fdfaf5 100644 --- a/samples/PayerAuthentication/setup-completion-with-tokenized-card.py +++ b/samples/PayerAuthentication/setup-completion-with-tokenized-card.py @@ -18,7 +18,7 @@ def del_none(d): def setup_completion_with_tokenized_card(): clientReferenceInformationCode = "cybs_test" - clientReferenceInformation = Riskv1decisionsClientReferenceInformation( + clientReferenceInformation = Riskv1authenticationsetupsClientReferenceInformation( code = clientReferenceInformationCode ) diff --git a/samples/PayerAuthentication/validate-authentication-results.py b/samples/PayerAuthentication/validate-authentication-results.py index 19edebd..fbfd4c2 100644 --- a/samples/PayerAuthentication/validate-authentication-results.py +++ b/samples/PayerAuthentication/validate-authentication-results.py @@ -28,7 +28,7 @@ def validate_authentication_results(): solution_id = clientReferenceInformationPartnerSolutionId ) - clientReferenceInformation = Riskv1decisionsClientReferenceInformation( + clientReferenceInformation = Riskv1authenticationsetupsClientReferenceInformation( code = clientReferenceInformationCode, partner = clientReferenceInformationPartner.__dict__ ) From 2a322694221b90a187e19b1c52bd93ebb8f90cda Mon Sep 17 00:00:00 2001 From: Bansal Date: Thu, 19 Sep 2024 14:58:17 +0530 Subject: [PATCH 16/29] adding defaultDeveloperID to override the cybs developerId --- data/Configuration.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/data/Configuration.py b/data/Configuration.py index cdc4e07..33c1fe3 100644 --- a/data/Configuration.py +++ b/data/Configuration.py @@ -42,6 +42,9 @@ def __init__(self): #self.proxy_address = "userproxy.com" #self.proxy_port = "" + #Add the property if required to override the cybs default developerId in all request body + self.defaultDeveloperId="" + #Optional default Axa/Client Headers- Client can add additional headers self.default_headers ={ "Ocp-Apim-Subscription-Key":"=fchgfchgvjhvjh5536hg", "Ocp-Apim-Trace":"dfgcjgvjkhbkjkjhnkjvjgchdxh", @@ -67,6 +70,7 @@ def get_configuration(self): configuration_dictionary["use_metakey"] = self.use_metakey configuration_dictionary["portfolio_id"] = self.portfolio_id configuration_dictionary["timeout"] = self.timeout + configuration_dictionary['defaultDeveloperId'] = self.defaultDeveloperId configuration_dictionary['jwePEMFileDirectory'] = self.JWEPemFIleDirectory log_config = LogConfiguration() log_config.set_enable_log(self.enable_log) From 884ea88d81930241f87339602aaac75ae7fb1211 Mon Sep 17 00:00:00 2001 From: Surya Prakash Nayak Date: Thu, 26 Sep 2024 12:24:39 +0530 Subject: [PATCH 17/29] Sample code for Merchant boarding API --- data/MerchantBoardingConfiguration.py | 85 ++++++ .../MerchantBoarding/create_registration.py | 204 +++++++++++++++ .../merchant-boarding-amex-direct.py | 231 ++++++++++++++++ .../merchant-boarding-barclays.py | 199 ++++++++++++++ .../merchant-boarding-bin-lookup.py | 131 ++++++++++ .../MerchantBoarding/merchant-boarding-cup.py | 213 +++++++++++++++ .../merchant-boarding-eftpos.py | 155 +++++++++++ .../merchant-boarding-fdi-global.py | 189 ++++++++++++++ .../MerchantBoarding/merchant-boarding-gpx.py | 246 +++++++++++++++++ .../merchant-boarding-smart-fdc.py | 199 ++++++++++++++ .../merchant-boarding-tsys.py | 247 ++++++++++++++++++ .../MerchantBoarding/merchant-boarding-vpc.py | 241 +++++++++++++++++ 12 files changed, 2340 insertions(+) create mode 100644 data/MerchantBoardingConfiguration.py create mode 100644 samples/MerchantBoarding/create_registration.py create mode 100644 samples/MerchantBoarding/merchant-boarding-amex-direct.py create mode 100644 samples/MerchantBoarding/merchant-boarding-barclays.py create mode 100644 samples/MerchantBoarding/merchant-boarding-bin-lookup.py create mode 100644 samples/MerchantBoarding/merchant-boarding-cup.py create mode 100644 samples/MerchantBoarding/merchant-boarding-eftpos.py create mode 100644 samples/MerchantBoarding/merchant-boarding-fdi-global.py create mode 100644 samples/MerchantBoarding/merchant-boarding-gpx.py create mode 100644 samples/MerchantBoarding/merchant-boarding-smart-fdc.py create mode 100644 samples/MerchantBoarding/merchant-boarding-tsys.py create mode 100644 samples/MerchantBoarding/merchant-boarding-vpc.py diff --git a/data/MerchantBoardingConfiguration.py b/data/MerchantBoardingConfiguration.py new file mode 100644 index 0000000..b1770c6 --- /dev/null +++ b/data/MerchantBoardingConfiguration.py @@ -0,0 +1,85 @@ +import os +from CyberSource.logging.log_configuration import LogConfiguration + +class Configuration: + def __init__(self): + self.authentication_type ="jwt" + self.merchantid = "" + + self.run_environment = "apitest.cybersource.com" + # new property has been added for user to configure the base path so that request can route the API calls via Azure Management URL. + # Example: If intermediate url is https://manage.windowsazure.com then in property input can be same url or manage.windowsazure.com. + + self.IntermediateHost="https://manage.windowsazure.com" + self.request_json_path = "src/main/resources/request.json" + + # JWT PARAMETERS + self.key_alias = "" + self.key_pass = "" + self.key_file_name = "" + self.keys_directory = "" + + # HTTP PARAMETERS + self.merchant_keyid = "" + self.merchant_secretkey = "" + + + # META KEY PARAMETERS + self.use_metakey = False + self.portfolio_id = '' + # CONNECTION TIMEOUT PARAMETER + self.timeout = 1000 + # LOG PARAMETERS + self.enable_log = True + self.log_file_name = "cybs" + self.log_maximum_size = 10487560 + self.log_directory = os.path.join(os.getcwd(), "Logs") + self.log_level = "Debug" + self.enable_masking = False + self.log_format = "%(asctime)s - %(name)s - %(levelname)s - %(message)s" + self.log_date_format = "%Y-%m-%d %H:%M:%S" + # PROXY PARAMETERS + #self.proxy_address = "userproxy.com" + #self.proxy_port = "" + + #Optional default Axa/Client Headers- Client can add additional headers + # self.default_headers ={ "Ocp-Apim-Subscription-Key":"=fchgfchgvjhvjh5536hg", + # "Ocp-Apim-Trace":"dfgcjgvjkhbkjkjhnkjvjgchdxh", + # "Host":"manage.windowsazure.com"} + + # PEM Key file path for decoding JWE Response Enter the folder path where the .pem file is located. + # It is optional property, require adding only during JWE decryption. + # self.JWEPemFIleDirectory = os.path.join(os.getcwd(), "resources", "NetworkTokenCert.pem") + + # Assigning the configuration properties in the configuration dictionary + def get_merchant_boarding_configuration(self): + configuration_dictionary = ({}) + configuration_dictionary["authentication_type"] = self.authentication_type + configuration_dictionary["merchantid"] = self.merchantid + configuration_dictionary["run_environment"] = self.run_environment + configuration_dictionary["request_json_path"] = self.request_json_path + configuration_dictionary["key_alias"] = self.key_alias + configuration_dictionary["key_password"] = self.key_pass + configuration_dictionary["key_file_name"] = self.key_file_name + configuration_dictionary["keys_directory"] = self.keys_directory + configuration_dictionary["merchant_keyid"] = self.merchant_keyid + configuration_dictionary["merchant_secretkey"] = self.merchant_secretkey + configuration_dictionary["use_metakey"] = self.use_metakey + configuration_dictionary["portfolio_id"] = self.portfolio_id + configuration_dictionary["timeout"] = self.timeout + # configuration_dictionary['jwePEMFileDirectory'] = self.JWEPemFIleDirectory + log_config = LogConfiguration() + log_config.set_enable_log(self.enable_log) + log_config.set_log_directory(self.log_directory) + log_config.set_log_file_name(self.log_file_name) + log_config.set_log_maximum_size(self.log_maximum_size) + log_config.set_log_level(self.log_level) + log_config.set_enable_masking(self.enable_masking) + log_config.set_log_format(self.log_format) + log_config.set_log_date_format(self.log_date_format) + configuration_dictionary["log_config"] = log_config + #configuration_dictionary["proxy_address"] = self.proxy_address + #configuration_dictionary["proxy_port"] = self.proxy_port + return configuration_dictionary + + diff --git a/samples/MerchantBoarding/create_registration.py b/samples/MerchantBoarding/create_registration.py new file mode 100644 index 0000000..6fdcbc7 --- /dev/null +++ b/samples/MerchantBoarding/create_registration.py @@ -0,0 +1,204 @@ +from CyberSource import * +from pathlib import Path +import os +import json +from importlib.machinery import SourceFileLoader + +config_file = os.path.join(os.getcwd(), "data", "MerchantBoardingConfiguration.py") +configuration = SourceFileLoader("module.name", config_file).load_module() + +# To delete None values in Input Request Json body +def del_none(d): + for key, value in list(d.items()): + if value is None: + del d[key] + elif isinstance(value, dict): + del_none(value) + return d + +def create_registration(): + + + + + req_obj = PostRegistrationBody() + + organization_information = Boardingv1registrationsOrganizationInformation() + organization_information.parent_organization_id = "apitester00" + #organization_information.type = Boardingv1registrationsOrganizationInformation.TypeEnum.MERCHANT + organization_information.type = "MERCHANT" + organization_information.configurable = True + + business_information = Boardingv1registrationsOrganizationInformationBusinessInformation() + business_information.name = "StuartWickedFastEatz" + + address = Boardingv1registrationsOrganizationInformationBusinessInformationAddress() + address.country = "US" + address.address1 = "123456 SandMarket" + address.locality = "ORMOND BEACH" + address.administrative_area = "FL" + address.postal_code = "32176" + business_information.address = address.__dict__ + + business_information.website_url = "https://www.StuartWickedEats.com" + business_information.phone_number = "6574567813" + + business_contact = Boardingv1registrationsOrganizationInformationBusinessInformationBusinessContact() + business_contact.first_name = "Stuart" + business_contact.last_name = "Stuart" + business_contact.phone_number = "6574567813" + business_contact.email = "svc_email_bt@corpdev.visa.com" + business_information.business_contact = business_contact.__dict__ + business_information.merchant_category_code = "5999" + organization_information.business_information = business_information.__dict__ + + req_obj.organization_information = organization_information.__dict__ + + product_information = Boardingv1registrationsProductInformation() + selected_products = Boardingv1registrationsProductInformationSelectedProducts() + + payments = PaymentsProducts() + + # Payer Authentication + payer_authentication = PaymentsProductsPayerAuthentication() + subscription_information = PaymentsProductsPayerAuthenticationSubscriptionInformation() + subscription_information.enabled = True + payer_authentication.subscription_information = subscription_information.__dict__ + + configuration_information = PaymentsProductsPayerAuthenticationConfigurationInformation() + configurations = PayerAuthConfig() + card_types = PayerAuthConfigCardTypes() + verified_by_visa = PayerAuthConfigCardTypesVerifiedByVisa() + currencies = [] + + currency1 = PayerAuthConfigCardTypesVerifiedByVisaCurrencies() + currency1.currency_codes = ["ALL"] + currency1.acquirer_id = "469216" + currency1.processor_merchant_id = "678855" + currencies.append(currency1.__dict__) + + verified_by_visa.currencies = currencies + card_types.verified_by_visa = verified_by_visa.__dict__ + configurations.card_types = card_types.__dict__ + configuration_information.configurations = configurations.__dict__ + payer_authentication.configuration_information = configuration_information.__dict__ + payments.payer_authentication = payer_authentication.__dict__ + + # Card Processing + card_processing = PaymentsProductsCardProcessing() + subscription_information2 = PaymentsProductsCardProcessingSubscriptionInformation() + subscription_information2.enabled = True + features = {"cardNotPresent": PaymentsProductsCardProcessingSubscriptionInformationFeatures(enabled=True).__dict__} + subscription_information2.features = features + card_processing.subscription_information = subscription_information2.__dict__ + + configuration_information2 = PaymentsProductsCardProcessingConfigurationInformation() + configurations2 = CardProcessingConfig() + common = CardProcessingConfigCommon() + common.merchant_category_code = "1234" + + merchant_descriptor_information = CardProcessingConfigCommonMerchantDescriptorInformation() + merchant_descriptor_information.name = "r4ef" + merchant_descriptor_information.city = "Bellevue" + merchant_descriptor_information.country = "US" + merchant_descriptor_information.phone = "4255547845" + merchant_descriptor_information.state = "WA" + merchant_descriptor_information.street = "StreetName" + merchant_descriptor_information.zip = "98007" + common.merchant_descriptor_information = merchant_descriptor_information.__dict__ + + processors = {"tsys": CardProcessingConfigCommonProcessors( + merchant_id="123456789101", + terminal_id="1231", + industry_code="D", + vital_number="71234567", + merchant_bin_number="123456", + merchant_location_number="00001", + store_id="1234", + settlement_currency="USD" + ).__dict__} + common.processors = processors + configurations2.common = common.__dict__ + + features2 = CardProcessingConfigFeatures() + card_not_present = CardProcessingConfigFeaturesCardNotPresent() + card_not_present.visa_straight_through_processing_only = True + features2.card_not_present = card_not_present.__dict__ + configurations2.features = features2.__dict__ + configuration_information2.configurations = configurations2.__dict__ + card_processing.configuration_information = configuration_information2.__dict__ + payments.card_processing = card_processing.__dict__ + + # Virtual Terminal + virtual_terminal = PaymentsProductsVirtualTerminal() + subscription_information3 = PaymentsProductsPayerAuthenticationSubscriptionInformation() + subscription_information3.enabled = True + virtual_terminal.subscription_information = subscription_information3.__dict__ + payments.virtual_terminal = virtual_terminal.__dict__ + + # Customer Invoicing + customer_invoicing = PaymentsProductsTax() + subscription_information4 = PaymentsProductsPayerAuthenticationSubscriptionInformation() + subscription_information4.enabled = True + customer_invoicing.subscription_information = subscription_information4.__dict__ + payments.customer_invoicing = customer_invoicing.__dict__ + + # Payouts + payouts = PaymentsProductsPayouts() + subscription_information5 = PaymentsProductsPayerAuthenticationSubscriptionInformation() + subscription_information5.enabled = True + payouts.subscription_information = subscription_information5.__dict__ + payments.payouts = payouts.__dict__ + + selected_products.payments = payments.__dict__ + + # Commerce Solutions + commerce_solutions = CommerceSolutionsProducts() + token_management = CommerceSolutionsProductsTokenManagement() + subscription_information6 = PaymentsProductsPayerAuthenticationSubscriptionInformation() + subscription_information6.enabled = True + token_management.subscription_information = subscription_information6.__dict__ + commerce_solutions.token_management = token_management.__dict__ + selected_products.commerce_solutions = commerce_solutions.__dict__ + + # Risk + risk = RiskProducts() + fraud_management_essentials = RiskProductsFraudManagementEssentials() + subscription_information7 = PaymentsProductsPayerAuthenticationSubscriptionInformation() + subscription_information7.enabled = True + fraud_management_essentials.subscription_information = subscription_information7.__dict__ + + configuration_information5 = RiskProductsFraudManagementEssentialsConfigurationInformation() + template_id = "E4EDB280-9DAC-4698-9EB9-9434D40FF60C" + configuration_information5.template_id = template_id + fraud_management_essentials.configuration_information = configuration_information5.__dict__ + risk.fraud_management_essentials = fraud_management_essentials.__dict__ + + selected_products.risk = risk.__dict__ + product_information.selected_products = selected_products.__dict__ + req_obj.product_information = product_information.__dict__ + + req_obj = del_none(req_obj.__dict__) + req_obj = json.dumps(req_obj) + + + try: + config_obj = configuration.Configuration() + client_config = config_obj.get_merchant_boarding_configuration() + api_instance = MerchantBoardingApi(client_config) + return_data, status, body = api_instance.post_registration(req_obj) + + print("\nAPI RESPONSE CODE : ", status) + print("\nAPI RESPONSE BODY : ", body) + + write_log_audit(status) + return return_data + except Exception as e: + write_log_audit(e.status if hasattr(e, 'status') else 999) + print("\nException when calling MerchantBoardingApi->post_registration: %s\n" % e) + +def write_log_audit(status): + print(f"[Sample Code Testing] [{Path(__file__).stem}] {status}") + +if __name__ == "__main__": + create_registration() diff --git a/samples/MerchantBoarding/merchant-boarding-amex-direct.py b/samples/MerchantBoarding/merchant-boarding-amex-direct.py new file mode 100644 index 0000000..6de7e1e --- /dev/null +++ b/samples/MerchantBoarding/merchant-boarding-amex-direct.py @@ -0,0 +1,231 @@ +from CyberSource import * +from pathlib import Path +import os +import json +import uuid +from importlib.machinery import SourceFileLoader + + +config_file = os.path.join(os.getcwd(), "data", "MerchantBoardingConfiguration.py") +configuration = SourceFileLoader("module.name", config_file).load_module() + +# To delete None values in Input Request Json body +def del_none(d): + for key, value in list(d.items()): + if value is None: + del d[key] + elif isinstance(value, dict): + del_none(value) + return d + +def merchant_boarding_amex_direct(): + + + req_obj = PostRegistrationBody() + + organization_info = Boardingv1registrationsOrganizationInformation() + organization_info.parent_organization_id = "apitester00" + organization_info.type = "MERCHANT" + organization_info.configurable = True + + business_info = Boardingv1registrationsOrganizationInformationBusinessInformation() + business_info.name = "StuartWickedFastEatz" + + address = Boardingv1registrationsOrganizationInformationBusinessInformationAddress() + address.country = "US" + address.address1 = "123456 SandMarket" + address.locality = "ORMOND BEACH" + address.administrative_area = "FL" + address.postal_code = "32176" + business_info.address = address.__dict__ + business_info.website_url = "https://www.StuartWickedEats.com" + business_info.phone_number = "6574567813" + + business_contact = Boardingv1registrationsOrganizationInformationBusinessInformationBusinessContact() + business_contact.first_name = "Stuart" + business_contact.last_name = "Stuart" + business_contact.phone_number = "6574567813" + business_contact.email = "svc_email_bt@corpdev.visa.com" + business_info.business_contact = business_contact.__dict__ + business_info.merchant_category_code = "5999" + organization_info.business_information = business_info.__dict__ + + req_obj.organization_information = organization_info.__dict__ + + product_information = Boardingv1registrationsProductInformation() + selected_products = Boardingv1registrationsProductInformationSelectedProducts() + + payments = PaymentsProducts() + card_processing = PaymentsProductsCardProcessing() + subscription_information = PaymentsProductsCardProcessingSubscriptionInformation() + + subscription_information.enabled = True + features = {} + + obj1 = PaymentsProductsCardProcessingSubscriptionInformationFeatures() + obj1.enabled = True + features["cardNotPresent"] = obj1.__dict__ + features["cardPresent"] = obj1.__dict__ + subscription_information.features = features + card_processing.subscription_information = subscription_information.__dict__ + + configuration_information = PaymentsProductsCardProcessingConfigurationInformation() + + configurations = CardProcessingConfig() + common = CardProcessingConfigCommon() + common.merchant_category_code = "1799" + merchant_descriptor_information = CardProcessingConfigCommonMerchantDescriptorInformation() + merchant_descriptor_information.city = "Cupertino" + merchant_descriptor_information.country = "USA" + merchant_descriptor_information.name = "Mer name" + merchant_descriptor_information.phone = "8885554444" + merchant_descriptor_information.zip = "94043" + merchant_descriptor_information.state = "CA" + merchant_descriptor_information.street = "mer street" + merchant_descriptor_information.url = "www.test.com" + + common.merchant_descriptor_information = merchant_descriptor_information.__dict__ + + common.sub_merchant_id = "123457" + common.sub_merchant_business_name = "bus name" + + processors = {} + obj2 = CardProcessingConfigCommonProcessors() + acquirer = CardProcessingConfigCommonAcquirer() + + obj2.acquirer = acquirer.__dict__ + currencies = {} + obj3 = CardProcessingConfigCommonCurrencies1() + obj3.enabled = True + obj3.enabled_card_present = False + obj3.enabled_card_present = True + obj3.terminal_id = "" + obj3.service_enablement_number = "1234567890" + currencies["AED"] = obj3.__dict__ + currencies["FJD"] = obj3.__dict__ + currencies["USD"] = obj3.__dict__ + + obj2.currencies = currencies + + payment_types = {} + obj4 = CardProcessingConfigCommonPaymentTypes() + obj4.enabled = True + payment_types["AMERICAN_EXPRESS"] = obj4.__dict__ + + obj2.payment_types = payment_types + obj2.allow_multiple_bills = False + obj2.avs_format = "basic" + obj2.batch_group = "amexdirect_vme_default" + obj2.enable_auto_auth_reversal_after_void = False + obj2.enhanced_data = "disabled" + obj2.enable_level2 = False + obj2.amex_transaction_advice_addendum1 = "amex123" + processors["acquirer"] = obj2.__dict__ + + common.processors = processors + configurations.common = common.__dict__ + + features2 = CardProcessingConfigFeatures() + card_not_present = CardProcessingConfigFeaturesCardNotPresent() + + processors3 = {} + obj5 = CardProcessingConfigFeaturesCardNotPresentProcessors() + obj5.relax_address_verification_system = True + obj5.relax_address_verification_system_allow_expired_card = True + obj5.relax_address_verification_system_allow_zip_without_country = False + processors3["amexdirect"] = obj5.__dict__ + + card_not_present.processors = processors3 + features2.card_not_present = card_not_present.__dict__ + configurations.features = features2.__dict__ + configuration_information.configurations = configurations.__dict__ + template_id = uuid.UUID("2B80A3C7-5A39-4CC3-9882-AC4A828D3646").__dict__ + configuration_information.template_id = template_id + card_processing.configuration_information = configuration_information.__dict__ + payments.card_processing = card_processing.__dict__ + + virtual_terminal = PaymentsProductsVirtualTerminal() + subscription_information2 = PaymentsProductsPayerAuthenticationSubscriptionInformation() + + subscription_information2.enabled = True + virtual_terminal.subscription_information = subscription_information2.__dict__ + + configuration_information3 = PaymentsProductsVirtualTerminalConfigurationInformation() + + template_id2 = uuid.UUID("9FA1BB94-5119-48D3-B2E5-A81FD3C657B5").__dict__ + configuration_information3.template_id = template_id2 + virtual_terminal.configuration_information = configuration_information3.__dict__ + payments.virtual_terminal = virtual_terminal.__dict__ + + customer_invoicing = PaymentsProductsTax() + subscription_information6 = PaymentsProductsPayerAuthenticationSubscriptionInformation() + + subscription_information6.enabled = True + customer_invoicing.subscription_information = subscription_information6.__dict__ + payments.customer_invoicing = customer_invoicing.__dict__ + selected_products.payments = payments.__dict__ + + risk = RiskProducts() + selected_products.risk = risk.__dict__ + + commerce_solutions = CommerceSolutionsProducts() + token_management = CommerceSolutionsProductsTokenManagement() + + subscription_information7 = PaymentsProductsPayerAuthenticationSubscriptionInformation() + + subscription_information7.enabled = True + token_management.subscription_information = subscription_information7.__dict__ + configuration_information4 = CommerceSolutionsProductsTokenManagementConfigurationInformation() + + template_id3 = uuid.UUID("D62BEE20-DCFD-4AA2-8723-BA3725958ABA").__dict__ + configuration_information4.template_id = template_id3 + token_management.configuration_information = configuration_information4.__dict__ + commerce_solutions.token_management = token_management.__dict__ + selected_products.commerce_solutions = commerce_solutions.__dict__ + + value_added_services = ValueAddedServicesProducts() + transaction_search = PaymentsProductsTax() + subscription_information8 = PaymentsProductsPayerAuthenticationSubscriptionInformation() + + subscription_information8.enabled = True + transaction_search.subscription_information = subscription_information8.__dict__ + + value_added_services.transaction_search = transaction_search.__dict__ + reporting = PaymentsProductsTax() + subscription_information9 = PaymentsProductsPayerAuthenticationSubscriptionInformation() + + subscription_information9.enabled = True + reporting.subscription_information = subscription_information9.__dict__ + value_added_services.reporting = reporting.__dict__ + + selected_products.value_added_services = value_added_services.__dict__ + product_information.selected_products = selected_products.__dict__ + req_obj.product_information = product_information.__dict__ + + + + + req_obj = del_none(req_obj.__dict__) + req_obj = json.dumps(req_obj) + + + try: + config_obj = configuration.Configuration() + client_config = config_obj.get_merchant_boarding_configuration() + api_instance = MerchantBoardingApi(client_config) + return_data, status, body = api_instance.post_registration(req_obj) + + print("\nAPI RESPONSE CODE : ", status) + print("\nAPI RESPONSE BODY : ", body) + + write_log_audit(status) + return return_data + except Exception as e: + write_log_audit(e.status if hasattr(e, 'status') else 999) + print("\nException when calling MerchantBoardingApi->post_registration: %s\n" % e) + +def write_log_audit(status): + print(f"[Sample Code Testing] [{Path(__file__).stem}] {status}") + +if __name__ == "__main__": + merchant_boarding_amex_direct() diff --git a/samples/MerchantBoarding/merchant-boarding-barclays.py b/samples/MerchantBoarding/merchant-boarding-barclays.py new file mode 100644 index 0000000..e40dce8 --- /dev/null +++ b/samples/MerchantBoarding/merchant-boarding-barclays.py @@ -0,0 +1,199 @@ +from CyberSource import * +from pathlib import Path +import os +import json +from importlib.machinery import SourceFileLoader +from uuid import UUID + +config_file = os.path.join(os.getcwd(), "data", "MerchantBoardingConfiguration.py") +configuration = SourceFileLoader("module.name", config_file).load_module() + +# To delete None values in Input Request Json body +def del_none(d): + for key, value in list(d.items()): + if value is None: + del d[key] + elif isinstance(value, dict): + del_none(value) + return d + +def merchant_boarding_barclays(): + + + req_obj = PostRegistrationBody() + + organization_info = Boardingv1registrationsOrganizationInformation() + organization_info.parent_organization_id = "apitester00" + organization_info.type = "MERCHANT" + organization_info.configurable = True + + business_info = Boardingv1registrationsOrganizationInformationBusinessInformation() + business_info.name = "StuartWickedFastEatz" + + address = Boardingv1registrationsOrganizationInformationBusinessInformationAddress() + address.country = "US" + address.address1 = "123456 SandMarket" + address.locality = "ORMOND BEACH" + address.administrative_area = "FL" + address.postal_code = "32176" + business_info.address = address.__dict__ + business_info.website_url = "https://www.StuartWickedEats.com" + business_info.phone_number = "6574567813" + + business_contact = Boardingv1registrationsOrganizationInformationBusinessInformationBusinessContact() + business_contact.first_name = "Stuart" + business_contact.last_name = "Stuart" + business_contact.phone_number = "6574567813" + business_contact.email = "svc_email_bt@corpdev.visa.com" + business_info.business_contact = business_contact.__dict__ + business_info.merchant_category_code = "5999" + organization_info.business_information = business_info.__dict__ + + req_obj.organization_information = organization_info.__dict__ + + product_info = Boardingv1registrationsProductInformation() + selected_products = Boardingv1registrationsProductInformationSelectedProducts() + + payments = PaymentsProducts() + card_processing = PaymentsProductsCardProcessing() + subscription_info = PaymentsProductsCardProcessingSubscriptionInformation() + subscription_info.enabled = True + + features = { + "cardNotPresent": PaymentsProductsCardProcessingSubscriptionInformationFeatures(enabled=True).__dict__, + "cardPresent": PaymentsProductsCardProcessingSubscriptionInformationFeatures(enabled=True).__dict__ + } + subscription_info.features = features + card_processing.subscription_information = subscription_info.__dict__ + + configuration_info = PaymentsProductsCardProcessingConfigurationInformation() + configurations = CardProcessingConfig() + common = CardProcessingConfigCommon() + common.merchant_category_code = "5999" + common.default_auth_type_code = "FINAL" + + processors = { + "barclays2": CardProcessingConfigCommonProcessors( + acquirer=CardProcessingConfigCommonAcquirer().__dict__, + currencies={ + "AED": CardProcessingConfigCommonCurrencies1( + enabled=True, + enabled_card_present=False, + enabled_card_not_present=True, + merchant_id="1234", + service_enablement_number="", + terminal_ids=["12351245"] + ).__dict__, + "USD": CardProcessingConfigCommonCurrencies1( + enabled=True, + enabled_card_present=False, + enabled_card_not_present=True, + merchant_id="1234", + service_enablement_number="", + terminal_ids=["12351245"] + ).__dict__ + }, + payment_types={ + "MASTERCARD": CardProcessingConfigCommonPaymentTypes(enabled=True).__dict__, + "VISA": CardProcessingConfigCommonPaymentTypes(enabled=True).__dict__ + }, + batch_group="barclays2_16", + quasi_cash=False, + enhanced_data="disabled", + merchant_id="124555", + enable_multi_currency_processing="false" + ).__dict__ + } + common.processors = processors + configurations.common = common.__dict__ + features3 = CardProcessingConfigFeatures() + card_not_present = CardProcessingConfigFeaturesCardNotPresent() + processors4 = { + "barclays2": CardProcessingConfigFeaturesCardNotPresentProcessors( + payouts=CardProcessingConfigFeaturesCardNotPresentPayouts( + merchant_id="1233", + terminal_id="1244" + ).__dict__ + ).__dict__ + } + card_not_present.processors = processors4 + features3.card_not_present = card_not_present.__dict__ + configurations.features = features3.__dict__ + configuration_info.configurations = configurations.__dict__ + configuration_info.template_id = UUID("0A413572-1995-483C-9F48-FCBE4D0B2E86").__dict__ + card_processing.configuration_information = configuration_info.__dict__ + payments.card_processing = card_processing.__dict__ + + virtual_terminal = PaymentsProductsVirtualTerminal() + subscription_info2 = PaymentsProductsPayerAuthenticationSubscriptionInformation() + subscription_info2.enabled = True + virtual_terminal.subscription_information = subscription_info2.__dict__ + configuration_info2 = PaymentsProductsVirtualTerminalConfigurationInformation() + configuration_info2.template_id = UUID("E4EDB280-9DAC-4698-9EB9-9434D40FF60C").__dict__ + virtual_terminal.configuration_information = configuration_info2.__dict__ + payments.virtual_terminal = virtual_terminal.__dict__ + + customer_invoicing = PaymentsProductsTax() + subscription_info3 = PaymentsProductsPayerAuthenticationSubscriptionInformation() + subscription_info3.enabled = True + customer_invoicing.subscription_information = subscription_info3.__dict__ + payments.customer_invoicing = customer_invoicing.__dict__ + + selected_products.payments = payments.__dict__ + + risk2 = RiskProducts() + selected_products.risk = risk2.__dict__ + + commerce_solutions = CommerceSolutionsProducts() + token_management = CommerceSolutionsProductsTokenManagement() + subscription_info5 = PaymentsProductsPayerAuthenticationSubscriptionInformation() + subscription_info5.enabled = True + token_management.subscription_information = subscription_info5.__dict__ + configuration_info5 = CommerceSolutionsProductsTokenManagementConfigurationInformation() + configuration_info5.template_id = UUID("D62BEE20-DCFD-4AA2-8723-BA3725958ABA").__dict__ + token_management.configuration_information = configuration_info5.__dict__ + commerce_solutions.token_management = token_management.__dict__ + selected_products.commerce_solutions = commerce_solutions.__dict__ + + value_added_services = ValueAddedServicesProducts() + transaction_search = PaymentsProductsTax() + subscription_info6 = PaymentsProductsPayerAuthenticationSubscriptionInformation() + subscription_info6.enabled = True + transaction_search.subscription_information = subscription_info6.__dict__ + value_added_services.transaction_search = transaction_search.__dict__ + + reporting = PaymentsProductsTax() + subscription_info7 = PaymentsProductsPayerAuthenticationSubscriptionInformation() + subscription_info7.enabled = True + reporting.subscription_information = subscription_info7.__dict__ + value_added_services.reporting = reporting.__dict__ + selected_products.value_added_services = value_added_services.__dict__ + + product_info.selected_products = selected_products.__dict__ + req_obj.product_information = product_info.__dict__ + + + req_obj = del_none(req_obj.__dict__) + req_obj = json.dumps(req_obj) + + + try: + config_obj = configuration.Configuration() + client_config = config_obj.get_merchant_boarding_configuration() + api_instance = MerchantBoardingApi(client_config) + return_data, status, body = api_instance.post_registration(req_obj) + + print("\nAPI RESPONSE CODE : ", status) + print("\nAPI RESPONSE BODY : ", body) + + write_log_audit(status) + return return_data + except Exception as e: + write_log_audit(e.status if hasattr(e, 'status') else 999) + print("\nException when calling MerchantBoardingApi->post_registration: %s\n" % e) + +def write_log_audit(status): + print(f"[Sample Code Testing] [{Path(__file__).stem}] {status}") + +if __name__ == "__main__": + merchant_boarding_barclays() diff --git a/samples/MerchantBoarding/merchant-boarding-bin-lookup.py b/samples/MerchantBoarding/merchant-boarding-bin-lookup.py new file mode 100644 index 0000000..324844f --- /dev/null +++ b/samples/MerchantBoarding/merchant-boarding-bin-lookup.py @@ -0,0 +1,131 @@ +from CyberSource import * +from pathlib import Path +import os +import json +import uuid +from importlib.machinery import SourceFileLoader + + +config_file = os.path.join(os.getcwd(), "data", "MerchantBoardingConfiguration.py") +configuration = SourceFileLoader("module.name", config_file).load_module() + +# To delete None values in Input Request Json body +def del_none(d): + for key, value in list(d.items()): + if value is None: + del d[key] + elif isinstance(value, dict): + del_none(value) + return d + +def merchant_boarding_bin_lookup(): + + # Creating the main request object + req_obj = PostRegistrationBody() + + # Organization Information + organization_information = Boardingv1registrationsOrganizationInformation() + organization_information.parent_organization_id = "apitester00" + organization_information.type = "MERCHANT" + organization_information.configurable = True + + # Business Information + business_information = Boardingv1registrationsOrganizationInformationBusinessInformation() + business_information.name = "StuartWickedFastEatz" + + # Address Information + address = Boardingv1registrationsOrganizationInformationBusinessInformationAddress() + address.country = "US" + address.address1 = "123456 SandMarket" + address.locality = "ORMOND BEACH" + address.administrative_area = "FL" + address.postal_code = "32176" + + # Assigning address to business information + business_information.address = address.__dict__ + business_information.website_url = "https://www.StuartWickedEats.com" + business_information.phone_number = "6574567813" + + # Business Contact Information + business_contact = Boardingv1registrationsOrganizationInformationBusinessInformationBusinessContact() + business_contact.first_name = "Stuart" + business_contact.last_name = "Stuart" + business_contact.phone_number = "6574567813" + business_contact.email = "svc_email_bt@corpdev.visa.com" + + # Assigning business contact to business information + business_information.business_contact = business_contact.__dict__ + business_information.merchant_category_code = "5999" + + # Assigning business information to organization information + organization_information.business_information = business_information.__dict__ + + # Assigning organization information to request object + req_obj.organization_information = organization_information.__dict__ + + # Product Information + product_information = Boardingv1registrationsProductInformation() + selected_products = Boardingv1registrationsProductInformationSelectedProducts() + + # Payments Product + payments = PaymentsProducts() + selected_products.payments = payments.__dict__ + + # Risk Product + risk = RiskProducts() + selected_products.risk = risk.__dict__ + + # Commerce Solutions Product + commerce_solutions = CommerceSolutionsProducts() + bin_lookup = CommerceSolutionsProductsBinLookup() + subscription_information = PaymentsProductsPayerAuthenticationSubscriptionInformation() + + subscription_information.enabled = True + bin_lookup.subscription_information = subscription_information.__dict__ + + configuration_information = CommerceSolutionsProductsBinLookupConfigurationInformation() + configurations = CommerceSolutionsProductsBinLookupConfigurationInformationConfigurations() + + configurations.is_payout_options_enabled = False + configurations.is_account_prefix_enabled = True + + configuration_information.configurations = configurations.__dict__ + bin_lookup.configuration_information = configuration_information.__dict__ + + commerce_solutions.bin_lookup = bin_lookup.__dict__ + selected_products.commerce_solutions = commerce_solutions.__dict__ + + # Value Added Services + value_added_services = ValueAddedServicesProducts() + selected_products.value_added_services = value_added_services.__dict__ + + # Assigning selected products to product information + product_information.selected_products = selected_products.__dict__ + + # Assigning product information to request object + req_obj.product_information = product_information.__dict__ + + req_obj = del_none(req_obj.__dict__) + req_obj = json.dumps(req_obj) + + + try: + config_obj = configuration.Configuration() + client_config = config_obj.get_merchant_boarding_configuration() + api_instance = MerchantBoardingApi(client_config) + return_data, status, body = api_instance.post_registration(req_obj) + + print("\nAPI RESPONSE CODE : ", status) + print("\nAPI RESPONSE BODY : ", body) + + write_log_audit(status) + return return_data + except Exception as e: + write_log_audit(e.status if hasattr(e, 'status') else 999) + print("\nException when calling MerchantBoardingApi->post_registration: %s\n" % e) + +def write_log_audit(status): + print(f"[Sample Code Testing] [{Path(__file__).stem}] {status}") + +if __name__ == "__main__": + merchant_boarding_bin_lookup() diff --git a/samples/MerchantBoarding/merchant-boarding-cup.py b/samples/MerchantBoarding/merchant-boarding-cup.py new file mode 100644 index 0000000..02add74 --- /dev/null +++ b/samples/MerchantBoarding/merchant-boarding-cup.py @@ -0,0 +1,213 @@ +from CyberSource import * +from pathlib import Path +import os +import json +import uuid +from importlib.machinery import SourceFileLoader + + +config_file = os.path.join(os.getcwd(), "data", "MerchantBoardingConfiguration.py") +configuration = SourceFileLoader("module.name", config_file).load_module() + +# To delete None values in Input Request Json body +def del_none(d): + for key, value in list(d.items()): + if value is None: + del d[key] + elif isinstance(value, dict): + del_none(value) + return d + +def merchant_boarding_cup(): + + # Creating the main request object + req_obj = PostRegistrationBody() + + # Organization Information + organization_information = Boardingv1registrationsOrganizationInformation() + organization_information.parent_organization_id = "apitester00" + organization_information.type = "MERCHANT" + organization_information.configurable = True + + # Business Information + business_information = Boardingv1registrationsOrganizationInformationBusinessInformation() + business_information.name = "StuartWickedFastEatz" + + # Address Information + address = Boardingv1registrationsOrganizationInformationBusinessInformationAddress() + address.country = "US" + address.address1 = "123456 SandMarket" + address.locality = "ORMOND BEACH" + address.administrative_area = "FL" + address.postal_code = "32176" + + # Assigning address to business information + business_information.address = address.__dict__ + business_information.website_url = "https://www.StuartWickedEats.com" + business_information.phone_number = "6574567813" + + # Business Contact Information + business_contact = Boardingv1registrationsOrganizationInformationBusinessInformationBusinessContact() + business_contact.first_name = "Stuart" + business_contact.last_name = "Stuart" + business_contact.phone_number = "6574567813" + business_contact.email = "svc_email_bt@corpdev.visa.com" + + # Assigning business contact to business information + business_information.business_contact = business_contact.__dict__ + business_information.merchant_category_code = "5999" + + # Assigning business information to organization information + organization_information.business_information = business_information.__dict__ + + # Assigning organization information to request object + req_obj.organization_information = organization_information.__dict__ + + # Product Information + product_information = Boardingv1registrationsProductInformation() + selected_products = Boardingv1registrationsProductInformationSelectedProducts() + + # Payments Product + payments = PaymentsProducts() + card_processing = PaymentsProductsCardProcessing() + subscription_information = PaymentsProductsCardProcessingSubscriptionInformation() + + subscription_information.enabled = True + features = {} + + # Card Processing Features + obj1 = PaymentsProductsCardProcessingSubscriptionInformationFeatures() + obj1.enabled = True + features["cardNotPresent"] = obj1.__dict__ + features["cardPresent"] = obj1.__dict__ + + subscription_information.features = features + card_processing.subscription_information = subscription_information.__dict__ + + # Card Processing Configuration Information + configuration_information = PaymentsProductsCardProcessingConfigurationInformation() + configurations = CardProcessingConfig() + common = CardProcessingConfigCommon() + common.merchant_category_code = "1799" + processors = {} + + # Common Processors + obj2 = CardProcessingConfigCommonProcessors() + acquirer = CardProcessingConfigCommonAcquirer() + acquirer.country_code = "344_hongkong" + acquirer.institution_id = "22344" + obj2.acquirer = acquirer.__dict__ + + currencies = {} + + # Common Currencies + obj3 = CardProcessingConfigCommonCurrencies1() + obj3.enabled = True + obj3.enabled_card_present = False + obj3.enabled_card_not_present = True + obj3.merchant_id = "112233" + obj3.terminal_id = "11224455" + obj3.service_enablement_number = "" + currencies["HKD"] = obj3.__dict__ + currencies["AUD"] = obj3.__dict__ + currencies["USD"] = obj3.__dict__ + + obj2.currencies = currencies + + payment_types = {} + + # Common Payment Types + obj4 = CardProcessingConfigCommonPaymentTypes() + obj4.enabled = True + payment_types["CUP"] = obj4.__dict__ + obj2.payment_types = payment_types + + processors["CUP"] = obj2.__dict__ + common.processors = processors + configurations.common = common.__dict__ + configuration_information.configurations = configurations.__dict__ + + template_id = uuid.UUID("1D8BC41A-F04E-4133-87C8-D89D1806106F").__dict__ + configuration_information.template_id = template_id + card_processing.configuration_information = configuration_information.__dict__ + payments.card_processing = card_processing.__dict__ + + # Virtual Terminal + virtual_terminal = PaymentsProductsVirtualTerminal() + subscription_information2 = PaymentsProductsPayerAuthenticationSubscriptionInformation() + subscription_information2.enabled = True + virtual_terminal.subscription_information = subscription_information2.__dict__ + + configuration_information2 = PaymentsProductsVirtualTerminalConfigurationInformation() + template_id2 = uuid.UUID("9FA1BB94-5119-48D3-B2E5-A81FD3C657B5").__dict__ + configuration_information2.template_id = template_id2 + virtual_terminal.configuration_information = configuration_information2.__dict__ + payments.virtual_terminal = virtual_terminal.__dict__ + + # Customer Invoicing + customer_invoicing = PaymentsProductsTax() + subscription_information3 = PaymentsProductsPayerAuthenticationSubscriptionInformation() + subscription_information3.enabled = True + customer_invoicing.subscription_information = subscription_information3.__dict__ + payments.customer_invoicing = customer_invoicing.__dict__ + selected_products.payments = payments.__dict__ + + # Risk Product + risk = RiskProducts() + selected_products.risk = risk.__dict__ + + # Commerce Solutions Product + commerce_solutions = CommerceSolutionsProducts() + token_management = CommerceSolutionsProductsTokenManagement() + subscription_information4 = PaymentsProductsPayerAuthenticationSubscriptionInformation() + subscription_information4.enabled = True + token_management.subscription_information = subscription_information4.__dict__ + + configuration_information3 = CommerceSolutionsProductsTokenManagementConfigurationInformation() + template_id3 = uuid.UUID("9FA1BB94-5119-48D3-B2E5-A81FD3C657B5").__dict__ + configuration_information3.template_id = template_id3 + token_management.configuration_information = configuration_information3.__dict__ + commerce_solutions.token_management = token_management.__dict__ + selected_products.commerce_solutions = commerce_solutions.__dict__ + + # Value Added Services + value_added_services = ValueAddedServicesProducts() + + transaction_search = PaymentsProductsTax() + subscription_information5 = PaymentsProductsPayerAuthenticationSubscriptionInformation() + subscription_information5.enabled = True + transaction_search.subscription_information = subscription_information5.__dict__ + value_added_services.transaction_search = transaction_search.__dict__ + + reporting = PaymentsProductsTax() + reporting.subscription_information = subscription_information5.__dict__ + value_added_services.reporting = reporting.__dict__ + + selected_products.value_added_services = value_added_services.__dict__ + product_information.selected_products = selected_products.__dict__ + req_obj.product_information = product_information.__dict__ + + req_obj = del_none(req_obj.__dict__) + req_obj = json.dumps(req_obj) + + + try: + config_obj = configuration.Configuration() + client_config = config_obj.get_merchant_boarding_configuration() + api_instance = MerchantBoardingApi(client_config) + return_data, status, body = api_instance.post_registration(req_obj) + + print("\nAPI RESPONSE CODE : ", status) + print("\nAPI RESPONSE BODY : ", body) + + write_log_audit(status) + return return_data + except Exception as e: + write_log_audit(e.status if hasattr(e, 'status') else 999) + print("\nException when calling MerchantBoardingApi->post_registration: %s\n" % e) + +def write_log_audit(status): + print(f"[Sample Code Testing] [{Path(__file__).stem}] {status}") + +if __name__ == "__main__": + merchant_boarding_cup() diff --git a/samples/MerchantBoarding/merchant-boarding-eftpos.py b/samples/MerchantBoarding/merchant-boarding-eftpos.py new file mode 100644 index 0000000..cc95465 --- /dev/null +++ b/samples/MerchantBoarding/merchant-boarding-eftpos.py @@ -0,0 +1,155 @@ +from CyberSource import * +from pathlib import Path +import os +import json +import uuid +from importlib.machinery import SourceFileLoader + + +config_file = os.path.join(os.getcwd(), "data", "MerchantBoardingConfiguration.py") +configuration = SourceFileLoader("module.name", config_file).load_module() + +# To delete None values in Input Request Json body +def del_none(d): + for key, value in list(d.items()): + if value is None: + del d[key] + elif isinstance(value, dict): + del_none(value) + return d + +def merchant_boarding_eftpos(): + + req_obj = PostRegistrationBody() + + organization_information = Boardingv1registrationsOrganizationInformation() + organization_information.parent_organization_id = "apitester00" + organization_information.type = "MERCHANT" + organization_information.configurable = True + + business_information = Boardingv1registrationsOrganizationInformationBusinessInformation() + business_information.name = "StuartWickedFastEatz" + + address = Boardingv1registrationsOrganizationInformationBusinessInformationAddress() + address.country = "US" + address.address1 = "123456 SandMarket" + address.locality = "ORMOND BEACH" + address.administrative_area = "FL" + address.postal_code = "32176" + business_information.address = address.__dict__ + + business_information.website_url = "https://www.StuartWickedEats.com" + business_information.phone_number = "6574567813" + + business_contact = Boardingv1registrationsOrganizationInformationBusinessInformationBusinessContact() + business_contact.first_name = "Stuart" + business_contact.last_name = "Stuart" + business_contact.phone_number = "6574567813" + business_contact.email = "svc_email_bt@corpdev.visa.com" + business_information.business_contact = business_contact.__dict__ + + business_information.merchant_category_code = "5999" + organization_information.business_information = business_information.__dict__ + + req_obj.organization_information = organization_information.__dict__ + + product_information = Boardingv1registrationsProductInformation() + selected_products = Boardingv1registrationsProductInformationSelectedProducts() + + payments = PaymentsProducts() + card_processing = PaymentsProductsCardProcessing() + subscription_information = PaymentsProductsCardProcessingSubscriptionInformation() + subscription_information.enabled = True + + features = {} + + obj1 = PaymentsProductsCardProcessingSubscriptionInformationFeatures() + obj1.enabled = True + features["cardNotPresent"] = obj1.__dict__ + + obj1.enabled = False + features["cardPresent"] = obj1.__dict__ + + subscription_information.features = features + card_processing.subscription_information = subscription_information.__dict__ + + configuration_information = PaymentsProductsCardProcessingConfigurationInformation() + configurations = CardProcessingConfig() + common = CardProcessingConfigCommon() + common.merchant_category_code = "5999" + common.prefer_cobadged_secondary_brand = True + + processors = {} + + obj5 = CardProcessingConfigCommonProcessors() + acquirer = CardProcessingConfigCommonAcquirer() + acquirer.country_code = "344_hongkong" + acquirer.institution_id = "22344" + + obj5.acquirer = acquirer.__dict__ + + currencies = {} + + obj6 = CardProcessingConfigCommonCurrencies1() + obj6.enabled = True + obj6.merchant_id = "12345612344" + obj6.terminal_id = "12121212" + currencies["AUD"] = obj6.__dict__ + + obj5.currencies = currencies + + payment_types = {} + + obj7 = CardProcessingConfigCommonPaymentTypes() + obj7.enabled = True + payment_types["EFTPOS"] = obj7.__dict__ + + obj5.payment_types = payment_types + obj5.enable_cvv_response_indicator = True + obj5.enable_least_cost_routing = True + obj5.merchant_tier = "000" + + processors["EFTPOS"] = obj5.__dict__ + + common.processors = processors + configurations.common = common.__dict__ + + features2 = CardProcessingConfigFeatures() + configurations.features = features2.__dict__ + configuration_information.configurations = configurations.__dict__ + + template_id = uuid.UUID("1F9B7F6E-F0DB-44C8-BF8E-5013E34C0F87").__dict__ + configuration_information.template_id = template_id + + card_processing.configuration_information = configuration_information.__dict__ + payments.card_processing = card_processing.__dict__ + selected_products.payments = payments.__dict__ + + product_information.selected_products = selected_products.__dict__ + req_obj.product_information = product_information.__dict__ + + + req_obj = del_none(req_obj.__dict__) + req_obj = json.dumps(req_obj) + + + try: + config_obj = configuration.Configuration() + client_config = config_obj.get_merchant_boarding_configuration() + api_instance = MerchantBoardingApi(client_config) + return_data, status, body = api_instance.post_registration(req_obj) + + print("\nAPI RESPONSE CODE : ", status) + print("\nAPI RESPONSE BODY : ", body) + + write_log_audit(status) + return return_data + except Exception as e: + write_log_audit(e.status if hasattr(e, 'status') else 999) + print("\nException when calling MerchantBoardingApi->post_registration: %s\n" % e) + +def write_log_audit(status): + print(f"[Sample Code Testing] [{Path(__file__).stem}] {status}") + +if __name__ == "__main__": + merchant_boarding_eftpos() diff --git a/samples/MerchantBoarding/merchant-boarding-fdi-global.py b/samples/MerchantBoarding/merchant-boarding-fdi-global.py new file mode 100644 index 0000000..1d74ca7 --- /dev/null +++ b/samples/MerchantBoarding/merchant-boarding-fdi-global.py @@ -0,0 +1,189 @@ +from CyberSource import * +from pathlib import Path +import os +import json +import uuid +from importlib.machinery import SourceFileLoader + + +config_file = os.path.join(os.getcwd(), "data", "MerchantBoardingConfiguration.py") +configuration = SourceFileLoader("module.name", config_file).load_module() + +# To delete None values in Input Request Json body +def del_none(d): + for key, value in list(d.items()): + if value is None: + del d[key] + elif isinstance(value, dict): + del_none(value) + return d + +def merchant_boarding_fdi_global(): + + + req_obj = PostRegistrationBody() + + organization_information = Boardingv1registrationsOrganizationInformation() + organization_information.parent_organization_id = "apitester00" + organization_information.type = "MERCHANT" + organization_information.configurable = True + + business_information = Boardingv1registrationsOrganizationInformationBusinessInformation() + business_information.name = "StuartWickedFastEatz" + + address = Boardingv1registrationsOrganizationInformationBusinessInformationAddress() + address.country = "US" + address.address1 = "123456 SandMarket" + address.locality = "ORMOND BEACH" + address.administrative_area = "FL" + address.postal_code = "32176" + business_information.address = address.__dict__ + + business_information.website_url = "https://www.StuartWickedEats.com" + business_information.phone_number = "6574567813" + + business_contact = Boardingv1registrationsOrganizationInformationBusinessInformationBusinessContact() + business_contact.first_name = "Stuart" + business_contact.last_name = "Stuart" + business_contact.phone_number = "6574567813" + business_contact.email = "svc_email_bt@corpdev.visa.com" + business_information.business_contact = business_contact.__dict__ + + business_information.merchant_category_code = "5999" + organization_information.business_information = business_information.__dict__ + + req_obj.organization_information = organization_information.__dict__ + + product_information = Boardingv1registrationsProductInformation() + selected_products = Boardingv1registrationsProductInformationSelectedProducts() + + payments = PaymentsProducts() + card_processing = PaymentsProductsCardProcessing() + subscription_information = PaymentsProductsCardProcessingSubscriptionInformation() + + subscription_information.enabled = True + features = {} + + obj1 = PaymentsProductsCardProcessingSubscriptionInformationFeatures() + obj1.enabled = True + features["cardNotPresent"] = obj1.__dict__ + features["cardPresent"] = obj1.__dict__ + subscription_information.features = features + card_processing.subscription_information = subscription_information.__dict__ + + configuration_information = PaymentsProductsCardProcessingConfigurationInformation() + + configurations = CardProcessingConfig() + common = CardProcessingConfigCommon() + common.merchant_category_code = "0742" + common.default_auth_type_code = "PRE" + common.process_level3_data = "ignored" + common.master_card_assigned_id = "123456789" + common.enable_partial_auth = True + + processors = {} + obj5 = CardProcessingConfigCommonProcessors() + acquirer = CardProcessingConfigCommonAcquirer() + obj5.acquirer = acquirer.__dict__ + + currencies = {} + obj6 = CardProcessingConfigCommonCurrencies1() + obj6.enabled = True + obj6.enabled_card_present = False + obj6.enabled_card_not_present = True + obj6.merchant_id = "123456789mer" + obj6.terminal_id = "12345ter" + obj6.service_enablement_number = "" + currencies["CHF"] = obj6.__dict__ + currencies["HRK"] = obj6.__dict__ + currencies["ERN"] = obj6.__dict__ + currencies["USD"] = obj6.__dict__ + + obj5.currencies = currencies + + payment_types = {} + obj7 = CardProcessingConfigCommonPaymentTypes() + obj7.enabled = True + payment_types["MASTERCARD"] = obj7.__dict__ + payment_types["DISCOVER"] = obj7.__dict__ + payment_types["JCB"] = obj7.__dict__ + payment_types["VISA"] = obj7.__dict__ + payment_types["AMERICAN_EXPRESS"] = obj7.__dict__ + payment_types["DINERS_CLUB"] = obj7.__dict__ + payment_types["CUP"] = obj7.__dict__ + currencies2 = {} + ob1 = CardProcessingConfigCommonCurrencies() + ob1.enabled = True + ob1.terminal_id = "pint123" + ob1.merchant_id = "pinm123" + ob1.service_enablement_number = None + currencies2["USD"] = ob1.__dict__ + obj7.currencies = currencies2 + payment_types["PIN_DEBIT"] = obj7.__dict__ + + obj5.payment_types = payment_types + obj5.batch_group = "fdiglobal_vme_default" + obj5.enhanced_data = "disabled" + obj5.enable_pos_network_switching = True + obj5.enable_transaction_reference_number = True + + processors["fdiglobal"] = obj5.__dict__ + + common.processors = processors + configurations.common = common.__dict__ + + features2 = CardProcessingConfigFeatures() + + card_not_present = CardProcessingConfigFeaturesCardNotPresent() + + processors3 = {} + obj9 = CardProcessingConfigFeaturesCardNotPresentProcessors() + obj9.relax_address_verification_system = True + obj9.relax_address_verification_system_allow_expired_card = True + obj9.relax_address_verification_system_allow_zip_without_country = True + + processors3["fdiglobal"] = obj9.__dict__ + card_not_present.processors = processors3 + + card_not_present.visa_straight_through_processing_only = True + card_not_present.amex_transaction_advice_addendum1 = "amex12345" + card_not_present.ignore_address_verification_system = True + features2.card_not_present = card_not_present.__dict__ + + configurations.features = features2.__dict__ + configuration_information.configurations = configurations.__dict__ + template_id = uuid.UUID("685A1FC9-3CEC-454C-9D8A-19205529CE45").__dict__ + configuration_information.template_id = template_id + + card_processing.configuration_information = configuration_information.__dict__ + payments.card_processing = card_processing.__dict__ + selected_products.payments = payments.__dict__ + + product_information.selected_products = selected_products.__dict__ + req_obj.product_information = product_information.__dict__ + + + req_obj = del_none(req_obj.__dict__) + req_obj = json.dumps(req_obj) + + + try: + config_obj = configuration.Configuration() + client_config = config_obj.get_merchant_boarding_configuration() + api_instance = MerchantBoardingApi(client_config) + return_data, status, body = api_instance.post_registration(req_obj) + + print("\nAPI RESPONSE CODE : ", status) + print("\nAPI RESPONSE BODY : ", body) + + write_log_audit(status) + return return_data + except Exception as e: + write_log_audit(e.status if hasattr(e, 'status') else 999) + print("\nException when calling MerchantBoardingApi->post_registration: %s\n" % e) + +def write_log_audit(status): + print(f"[Sample Code Testing] [{Path(__file__).stem}] {status}") + +if __name__ == "__main__": + merchant_boarding_fdi_global() diff --git a/samples/MerchantBoarding/merchant-boarding-gpx.py b/samples/MerchantBoarding/merchant-boarding-gpx.py new file mode 100644 index 0000000..a18ca10 --- /dev/null +++ b/samples/MerchantBoarding/merchant-boarding-gpx.py @@ -0,0 +1,246 @@ +from CyberSource import * +from pathlib import Path +import os +import json +import uuid +from importlib.machinery import SourceFileLoader + + +config_file = os.path.join(os.getcwd(), "data", "MerchantBoardingConfiguration.py") +configuration = SourceFileLoader("module.name", config_file).load_module() + +# To delete None values in Input Request Json body +def del_none(d): + for key, value in list(d.items()): + if value is None: + del d[key] + elif isinstance(value, dict): + del_none(value) + return d + +def merchant_boarding_gpx(): + + req_obj = PostRegistrationBody() + + + organization_info = Boardingv1registrationsOrganizationInformation() + organization_info.parent_organization_id = "apitester00" + organization_info.type = "MERCHANT" + organization_info.configurable = True + + business_info = Boardingv1registrationsOrganizationInformationBusinessInformation() + business_info.name = "StuartWickedFastEatz" + + address = Boardingv1registrationsOrganizationInformationBusinessInformationAddress() + address.country = "US" + address.address1 = "123456 SandMarket" + address.locality = "ORMOND BEACH" + address.administrative_area = "FL" + address.postal_code = "32176" + business_info.address = address.__dict__ + business_info.website_url = "https://www.StuartWickedEats.com" + business_info.phone_number = "6574567813" + + business_contact = Boardingv1registrationsOrganizationInformationBusinessInformationBusinessContact() + business_contact.first_name = "Stuart" + business_contact.last_name = "Stuart" + business_contact.phone_number = "6574567813" + business_contact.email = "svc_email_bt@corpdev.visa.com" + business_info.business_contact = business_contact.__dict__ + business_info.merchant_category_code = "5999" + organization_info.business_information = business_info.__dict__ + + req_obj.organization_information = organization_info.__dict__ + + # Create and set Product Information + product_information = Boardingv1registrationsProductInformation() + selected_products = Boardingv1registrationsProductInformationSelectedProducts() + + # Set Payments Products + payments = PaymentsProducts() + card_processing = PaymentsProductsCardProcessing() + subscription_information = PaymentsProductsCardProcessingSubscriptionInformation() + subscription_information.enabled = True + features = {} + + # Set subscription features + obj1 = PaymentsProductsCardProcessingSubscriptionInformationFeatures() + obj1.enabled = True + features["cardNotPresent"] = obj1.__dict__ + features["cardPresent"] = obj1.__dict__ + subscription_information.features = features + card_processing.subscription_information = subscription_information.__dict__ + + # Set configuration information + configuration_information = PaymentsProductsCardProcessingConfigurationInformation() + configurations = CardProcessingConfig() + common = CardProcessingConfigCommon() + common.merchant_category_code = "1799" + common.default_auth_type_code = "FINAL" + common.food_and_consumer_service_id = "1456" + common.master_card_assigned_id = "4567" + common.sic_code = "1345" + common.enable_partial_auth = False + common.allow_captures_greater_than_authorizations = False + common.enable_duplicate_merchant_reference_number_blocking = False + common.credit_card_refund_limit_percent = "2" + common.business_center_credit_card_refund_limit_percent = "3" + + # Set processors + processors = {} + obj5 = CardProcessingConfigCommonProcessors() + acquirer = CardProcessingConfigCommonAcquirer() + acquirer.country_code = "840_usa" + acquirer.file_destination_bin = "123456" + acquirer.interbank_card_association_id = "1256" + acquirer.institution_id = "113366" + acquirer.discover_institution_id = "1567" + obj5.acquirer = acquirer.__dict__ + + # Set currencies + currencies = {} + obj6 = CardProcessingConfigCommonCurrencies1() + obj6.enabled = True + obj6.enabled_card_present = False + obj6.enabled_card_not_present = True + obj6.terminal_id = "" + obj6.service_enablement_number = "" + currencies["AED"] = obj6.__dict__ + obj5.currencies = currencies + + # Set payment types + payment_types = {} + obj7 = CardProcessingConfigCommonPaymentTypes() + obj7.enabled = True + payment_types["MASTERCARD"] = obj7.__dict__ + payment_types["DISCOVER"] = obj7.__dict__ + payment_types["JCB"] = obj7.__dict__ + payment_types["VISA"] = obj7.__dict__ + payment_types["DINERS_CLUB"] = obj7.__dict__ + payment_types["PIN_DEBIT"] = obj7.__dict__ + obj5.payment_types = payment_types + + obj5.allow_multiple_bills = True + obj5.batch_group = "gpx" + obj5.business_application_id = "AA" + obj5.enhanced_data = "disabled" + obj5.fire_safety_indicator = False + obj5.aba_number = "1122445566778" + obj5.merchant_verification_value = "234" + obj5.quasi_cash = False + obj5.merchant_id = "112233" + obj5.terminal_id = "112244" + processors["gpx"] = obj5.__dict__ + + common.processors = processors + configurations.common = common.__dict__ + + features2 = CardProcessingConfigFeatures() + card_not_present = CardProcessingConfigFeaturesCardNotPresent() + processors3 = {} + obj9 = CardProcessingConfigFeaturesCardNotPresentProcessors() + obj9.enable_ems_transaction_risk_score = True + obj9.relax_address_verification_system = True + obj9.relax_address_verification_system_allow_expired_card = True + obj9.relax_address_verification_system_allow_zip_without_country = True + processors3["gpx"] = obj9.__dict__ + card_not_present.processors = processors3 + card_not_present.visa_straight_through_processing_only = False + card_not_present.ignore_address_verification_system = False + features2.card_not_present = card_not_present.__dict__ + + card_present = CardProcessingConfigFeaturesCardPresent() + processors2 = {} + obj4 = CardProcessingConfigFeaturesCardPresentProcessors() + obj4.financial_institution_id = "1347" + obj4.pin_debit_network_order = "23456" + obj4.pin_debit_reimbursement_code = "43567" + obj4.default_point_of_sale_terminal_id = "5432" + processors2["gpx"] = obj4.__dict__ + card_present.processors = processors2 + card_present.enable_terminal_id_lookup = False + features2.card_present = card_present.__dict__ + + configurations.features = features2.__dict__ + configuration_information.configurations = configurations.__dict__ + template_id = uuid.UUID("D2A7C000-5FCA-493A-AD21-469744A19EEA").__dict__ + configuration_information.template_id = template_id + card_processing.configuration_information = configuration_information.__dict__ + payments.card_processing = card_processing.__dict__ + + virtual_terminal = PaymentsProductsVirtualTerminal() + subscription_information5 = PaymentsProductsPayerAuthenticationSubscriptionInformation() + subscription_information5.enabled = True + virtual_terminal.subscription_information = subscription_information5.__dict__ + + configuration_information5 = PaymentsProductsVirtualTerminalConfigurationInformation() + template_id2 = uuid.UUID("9FA1BB94-5119-48D3-B2E5-A81FD3C657B5").__dict__ + configuration_information5.template_id = template_id2 + virtual_terminal.configuration_information = configuration_information5.__dict__ + payments.virtual_terminal = virtual_terminal.__dict__ + + customer_invoicing = PaymentsProductsTax() + subscription_information6 = PaymentsProductsPayerAuthenticationSubscriptionInformation() + subscription_information6.enabled = True + customer_invoicing.subscription_information = subscription_information6.__dict__ + payments.customer_invoicing = customer_invoicing.__dict__ + selected_products.payments = payments.__dict__ + + risk = RiskProducts() + selected_products.risk = risk.__dict__ + + commerce_solutions = CommerceSolutionsProducts() + token_management = CommerceSolutionsProductsTokenManagement() + subscription_information7 = PaymentsProductsPayerAuthenticationSubscriptionInformation() + subscription_information7.enabled = True + token_management.subscription_information = subscription_information7.__dict__ + + configuration_information7 = CommerceSolutionsProductsTokenManagementConfigurationInformation() + template_id3 = uuid.UUID("D62BEE20-DCFD-4AA2-8723-BA3725958ABA").__dict__ + configuration_information7.template_id = template_id3 + token_management.configuration_information = configuration_information7.__dict__ + commerce_solutions.token_management = token_management.__dict__ + selected_products.commerce_solutions = commerce_solutions.__dict__ + + value_added_services = ValueAddedServicesProducts() + transaction_search = PaymentsProductsTax() + subscription_information9 = PaymentsProductsPayerAuthenticationSubscriptionInformation() + subscription_information9.enabled = True + transaction_search.subscription_information = subscription_information9.__dict__ + value_added_services.transaction_search = transaction_search.__dict__ + + reporting = PaymentsProductsTax() + subscription_information3 = PaymentsProductsPayerAuthenticationSubscriptionInformation() + subscription_information3.enabled = True + reporting.subscription_information = subscription_information3.__dict__ + value_added_services.reporting = reporting.__dict__ + selected_products.value_added_services = value_added_services.__dict__ + + product_information.selected_products = selected_products.__dict__ + req_obj.product_information = product_information.__dict__ + + + req_obj = del_none(req_obj.__dict__) + req_obj = json.dumps(req_obj) + + + try: + config_obj = configuration.Configuration() + client_config = config_obj.get_merchant_boarding_configuration() + api_instance = MerchantBoardingApi(client_config) + return_data, status, body = api_instance.post_registration(req_obj) + + print("\nAPI RESPONSE CODE : ", status) + print("\nAPI RESPONSE BODY : ", body) + + write_log_audit(status) + return return_data + except Exception as e: + write_log_audit(e.status if hasattr(e, 'status') else 999) + print("\nException when calling MerchantBoardingApi->post_registration: %s\n" % e) + +def write_log_audit(status): + print(f"[Sample Code Testing] [{Path(__file__).stem}] {status}") + +if __name__ == "__main__": + merchant_boarding_gpx() diff --git a/samples/MerchantBoarding/merchant-boarding-smart-fdc.py b/samples/MerchantBoarding/merchant-boarding-smart-fdc.py new file mode 100644 index 0000000..a60c207 --- /dev/null +++ b/samples/MerchantBoarding/merchant-boarding-smart-fdc.py @@ -0,0 +1,199 @@ +from CyberSource import * +from pathlib import Path +import os +import json +import uuid +from importlib.machinery import SourceFileLoader + + +config_file = os.path.join(os.getcwd(), "data", "MerchantBoardingConfiguration.py") +configuration = SourceFileLoader("module.name", config_file).load_module() + +# To delete None values in Input Request Json body +def del_none(d): + for key, value in list(d.items()): + if value is None: + del d[key] + elif isinstance(value, dict): + del_none(value) + return d + +def merchant_boarding_smart_fdc(): + + req_obj = PostRegistrationBody() + + organization_information = Boardingv1registrationsOrganizationInformation() + organization_information.parent_organization_id = "apitester00" + organization_information.type = "MERCHANT" + organization_information.configurable = True + + business_information = Boardingv1registrationsOrganizationInformationBusinessInformation() + business_information.name = "StuartWickedFastEatz" + + address = Boardingv1registrationsOrganizationInformationBusinessInformationAddress() + address.country = "US" + address.address1 = "123456 SandMarket" + address.locality = "ORMOND BEACH" + address.administrative_area = "FL" + address.postal_code = "32176" + business_information.address = address.__dict__ + + business_information.website_url = "https://www.StuartWickedEats.com" + business_information.phone_number = "6574567813" + + business_contact = Boardingv1registrationsOrganizationInformationBusinessInformationBusinessContact() + business_contact.first_name = "Stuart" + business_contact.last_name = "Stuart" + business_contact.phone_number = "6574567813" + business_contact.email = "svc_email_bt@corpdev.visa.com" + business_information.business_contact = business_contact.__dict__ + + business_information.merchant_category_code = "5999" + organization_information.business_information = business_information.__dict__ + + req_obj.organization_information = organization_information.__dict__ + + product_information = Boardingv1registrationsProductInformation() + selected_products = Boardingv1registrationsProductInformationSelectedProducts() + + payments = PaymentsProducts() + card_processing = PaymentsProductsCardProcessing() + subscription_information = PaymentsProductsCardProcessingSubscriptionInformation() + + subscription_information.enabled = True + features = {} + + obj1 = PaymentsProductsCardProcessingSubscriptionInformationFeatures() + obj1.enabled = True + features["cardNotPresent"] = obj1.__dict__ + features["cardPresent"] = obj1.__dict__ + subscription_information.features = features + card_processing.subscription_information = subscription_information.__dict__ + + configuration_information = PaymentsProductsCardProcessingConfigurationInformation() + + configurations = CardProcessingConfig() + common = CardProcessingConfigCommon() + common.merchant_category_code = "1799" + common.default_auth_type_code = "FINAL" + common.enable_partial_auth = True + + processors = {} + obj5 = CardProcessingConfigCommonProcessors() + acquirer = CardProcessingConfigCommonAcquirer() + + obj5.acquirer = acquirer.__dict__ + + payment_types = {} + obj7 = CardProcessingConfigCommonPaymentTypes() + obj7.enabled = True + + payment_types["MASTERCARD"] = obj7.__dict__ + payment_types["DISCOVER"] = obj7.__dict__ + payment_types["JCB"] = obj7.__dict__ + payment_types["VISA"] = obj7.__dict__ + payment_types["DINERS_CLUB"] = obj7.__dict__ + payment_types["AMERICAN_EXPRESS"] = obj7.__dict__ + + obj5.payment_types = payment_types + + obj5.batch_group = "smartfdc_00" + obj5.merchant_id = "00001234567" + obj5.terminal_id = "00007654321" + + processors["smartfdc"] = obj5.__dict__ + + common.processors = processors + + configurations.common = common.__dict__ + + configuration_information.configurations = configurations.__dict__ + + template_id = uuid.UUID("3173DA78-A71E-405B-B79C-928C1A9C6AB2").__dict__ + configuration_information.template_id = template_id + + card_processing.configuration_information = configuration_information.__dict__ + payments.card_processing = card_processing.__dict__ + + virtual_terminal = PaymentsProductsVirtualTerminal() + subscription_information5 = PaymentsProductsPayerAuthenticationSubscriptionInformation() + subscription_information5.enabled = True + virtual_terminal.subscription_information = subscription_information5.__dict__ + + configuration_information5 = PaymentsProductsVirtualTerminalConfigurationInformation() + template_id2 = uuid.UUID("9FA1BB94-5119-48D3-B2E5-A81FD3C657B5").__dict__ + configuration_information5.template_id = template_id2 + virtual_terminal.configuration_information = configuration_information5.__dict__ + + payments.virtual_terminal = virtual_terminal.__dict__ + + customer_invoicing = PaymentsProductsTax() + subscription_information6 = PaymentsProductsPayerAuthenticationSubscriptionInformation() + subscription_information6.enabled = True + customer_invoicing.subscription_information = subscription_information6.__dict__ + payments.customer_invoicing = customer_invoicing.__dict__ + + selected_products.payments = payments.__dict__ + + risk = RiskProducts() + selected_products.risk = risk.__dict__ + + commerce_solutions = CommerceSolutionsProducts() + + token_management = CommerceSolutionsProductsTokenManagement() + subscription_information7 = PaymentsProductsPayerAuthenticationSubscriptionInformation() + subscription_information7.enabled = True + token_management.subscription_information = subscription_information7.__dict__ + + configuration_information7 = CommerceSolutionsProductsTokenManagementConfigurationInformation() + template_id3 = uuid.UUID("D62BEE20-DCFD-4AA2-8723-BA3725958ABA").__dict__ + configuration_information7.template_id = template_id3 + token_management.configuration_information = configuration_information7.__dict__ + + commerce_solutions.token_management = token_management.__dict__ + selected_products.commerce_solutions = commerce_solutions.__dict__ + + value_added_services = ValueAddedServicesProducts() + + transaction_search = PaymentsProductsTax() + subscription_information9 = PaymentsProductsPayerAuthenticationSubscriptionInformation() + subscription_information9.enabled = True + transaction_search.subscription_information = subscription_information9.__dict__ + value_added_services.transaction_search = transaction_search.__dict__ + + reporting = PaymentsProductsTax() + subscription_information3 = PaymentsProductsPayerAuthenticationSubscriptionInformation() + subscription_information3.enabled = True + reporting.subscription_information = subscription_information3.__dict__ + value_added_services.reporting = reporting.__dict__ + + selected_products.value_added_services = value_added_services.__dict__ + + product_information.selected_products = selected_products.__dict__ + req_obj.product_information = product_information.__dict__ + + + req_obj = del_none(req_obj.__dict__) + req_obj = json.dumps(req_obj) + + + try: + config_obj = configuration.Configuration() + client_config = config_obj.get_merchant_boarding_configuration() + api_instance = MerchantBoardingApi(client_config) + return_data, status, body = api_instance.post_registration(req_obj) + + print("\nAPI RESPONSE CODE : ", status) + print("\nAPI RESPONSE BODY : ", body) + + write_log_audit(status) + return return_data + except Exception as e: + write_log_audit(e.status if hasattr(e, 'status') else 999) + print("\nException when calling MerchantBoardingApi->post_registration: %s\n" % e) + +def write_log_audit(status): + print(f"[Sample Code Testing] [{Path(__file__).stem}] {status}") + +if __name__ == "__main__": + merchant_boarding_smart_fdc() diff --git a/samples/MerchantBoarding/merchant-boarding-tsys.py b/samples/MerchantBoarding/merchant-boarding-tsys.py new file mode 100644 index 0000000..1ae6794 --- /dev/null +++ b/samples/MerchantBoarding/merchant-boarding-tsys.py @@ -0,0 +1,247 @@ +from CyberSource import * +from pathlib import Path +import os +import json +import uuid +from importlib.machinery import SourceFileLoader + + +config_file = os.path.join(os.getcwd(), "data", "MerchantBoardingConfiguration.py") +configuration = SourceFileLoader("module.name", config_file).load_module() + +# To delete None values in Input Request Json body +def del_none(d): + for key, value in list(d.items()): + if value is None: + del d[key] + elif isinstance(value, dict): + del_none(value) + return d + +def merchant_boarding_tsys(): + + req_obj = PostRegistrationBody() + + organization_info = Boardingv1registrationsOrganizationInformation() + organization_info.parent_organization_id = "apitester00" + organization_info.type = "MERCHANT" + organization_info.configurable = True + + business_info = Boardingv1registrationsOrganizationInformationBusinessInformation() + business_info.name = "StuartWickedFastEatz" + + address = Boardingv1registrationsOrganizationInformationBusinessInformationAddress() + address.country = "US" + address.address1 = "123456 SandMarket" + address.locality = "ORMOND BEACH" + address.administrative_area = "FL" + address.postal_code = "32176" + business_info.address = address.__dict__ + business_info.website_url = "https://www.StuartWickedEats.com" + business_info.phone_number = "6574567813" + + business_contact = Boardingv1registrationsOrganizationInformationBusinessInformationBusinessContact() + business_contact.first_name = "Stuart" + business_contact.last_name = "Stuart" + business_contact.phone_number = "6574567813" + business_contact.email = "svc_email_bt@corpdev.visa.com" + business_info.business_contact = business_contact.__dict__ + business_info.merchant_category_code = "5999" + organization_info.business_information = business_info.__dict__ + + req_obj.organization_information = organization_info.__dict__ + + product_information = Boardingv1registrationsProductInformation() + selected_products = Boardingv1registrationsProductInformationSelectedProducts() + + payments = PaymentsProducts() + card_processing = PaymentsProductsCardProcessing() + subscription_information = PaymentsProductsCardProcessingSubscriptionInformation() + + subscription_information.enabled = True + features = {} + + obj1 = PaymentsProductsCardProcessingSubscriptionInformationFeatures() + obj1.enabled = True + features["cardNotPresent"] = obj1.__dict__ + features["cardPresent"] = obj1.__dict__ + subscription_information.features = features + card_processing.subscription_information = subscription_information.__dict__ + + configuration_information = PaymentsProductsCardProcessingConfigurationInformation() + + configurations = CardProcessingConfig() + common = CardProcessingConfigCommon() + common.merchant_category_code = "5999" + common.process_level3_data = "ignored" + common.default_auth_type_code = "FINAL" + common.enable_partial_auth = False + common.amex_vendor_code = "2233" + + merchant_descriptor_information = CardProcessingConfigCommonMerchantDescriptorInformation() + + merchant_descriptor_information.city = "cupertino" + merchant_descriptor_information.country = "USA" + merchant_descriptor_information.name = "kumar" + merchant_descriptor_information.state = "CA" + merchant_descriptor_information.phone = "888555333" + merchant_descriptor_information.zip = "94043" + merchant_descriptor_information.street = "steet1" + + common.merchant_descriptor_information = merchant_descriptor_information.__dict__ + + processors = {} + obj5 = CardProcessingConfigCommonProcessors() + acquirer = CardProcessingConfigCommonAcquirer() + + obj5.acquirer = acquirer.__dict__ + + currencies = {} + + obj6 = CardProcessingConfigCommonCurrencies1() + obj6.enabled = True + obj6.enabled_card_present = True + obj6.enabled_card_not_present = True + obj6.terminal_id = "1234" + obj6.service_enablement_number = "" + + currencies["CAD"] = obj6.__dict__ + + obj5.currencies = currencies + + payment_types = {} + obj7 = CardProcessingConfigCommonPaymentTypes() + obj7.enabled = True + + payment_types["MASTERCARD"] = obj7.__dict__ + payment_types["VISA"] = obj7.__dict__ + + obj5.payment_types = payment_types + + obj5.bank_number = "234576" + obj5.chain_number = "223344" + obj5.batch_group = "vital_1130" + obj5.enhanced_data = "disabled" + obj5.industry_code = "D" + obj5.merchant_bin_number = "765576" + obj5.merchant_id = "834215123456" + obj5.merchant_location_number = "00001" + obj5.store_id = "2563" + obj5.vital_number = "71234567" + obj5.quasi_cash = False + obj5.send_amex_level2_data = None + obj5.soft_descriptor_type = "1 - trans_ref_no" + obj5.travel_agency_code = "2356" + obj5.travel_agency_name = "Agent" + + processors["tsys"] = obj5.__dict__ + + common.processors = processors + + configurations.common = common.__dict__ + + features2 = CardProcessingConfigFeatures() + + card_not_present = CardProcessingConfigFeaturesCardNotPresent() + + card_not_present.visa_straight_through_processing_only = False + card_not_present.amex_transaction_advice_addendum1 = None + + features2.card_not_present = card_not_present.__dict__ + + configurations.features = features2.__dict__ + configuration_information.configurations = configurations.__dict__ + template_id = uuid.UUID("818048AD-2860-4D2D-BC39-2447654628A1").__dict__ + configuration_information.template_id = template_id + + card_processing.configuration_information = configuration_information.__dict__ + payments.card_processing = card_processing.__dict__ + + virtual_terminal = PaymentsProductsVirtualTerminal() + subscription_information5 = PaymentsProductsPayerAuthenticationSubscriptionInformation() + subscription_information5.enabled = True + virtual_terminal.subscription_information = subscription_information5.__dict__ + + configuration_information5 = PaymentsProductsVirtualTerminalConfigurationInformation() + template_id2 = uuid.UUID("9FA1BB94-5119-48D3-B2E5-A81FD3C657B5").__dict__ + configuration_information5.template_id = template_id2 + virtual_terminal.configuration_information = configuration_information5.__dict__ + + payments.virtual_terminal = virtual_terminal.__dict__ + + customer_invoicing = PaymentsProductsTax() + + subscription_information6 = PaymentsProductsPayerAuthenticationSubscriptionInformation() + subscription_information6.enabled = True + customer_invoicing.subscription_information = subscription_information6.__dict__ + payments.customer_invoicing = customer_invoicing.__dict__ + + selected_products.payments = payments.__dict__ + + risk = RiskProducts() + + selected_products.risk = risk.__dict__ + + commerce_solutions = CommerceSolutionsProducts() + + token_management = CommerceSolutionsProductsTokenManagement() + + subscription_information7 = PaymentsProductsPayerAuthenticationSubscriptionInformation() + subscription_information7.enabled = True + token_management.subscription_information = subscription_information7.__dict__ + + configuration_information7 = CommerceSolutionsProductsTokenManagementConfigurationInformation() + + template_id3 = uuid.UUID("D62BEE20-DCFD-4AA2-8723-BA3725958ABA").__dict__ + configuration_information7.template_id = template_id3 + token_management.configuration_information = configuration_information7.__dict__ + + commerce_solutions.token_management = token_management.__dict__ + selected_products.commerce_solutions = commerce_solutions.__dict__ + + value_added_services = ValueAddedServicesProducts() + + transaction_search = PaymentsProductsTax() + + subscription_information9 = PaymentsProductsPayerAuthenticationSubscriptionInformation() + subscription_information9.enabled = True + transaction_search.subscription_information = subscription_information9.__dict__ + value_added_services.transaction_search = transaction_search.__dict__ + + reporting = PaymentsProductsTax() + subscription_information3 = PaymentsProductsPayerAuthenticationSubscriptionInformation() + subscription_information3.enabled = True + reporting.subscription_information = subscription_information3.__dict__ + value_added_services.reporting = reporting.__dict__ + + selected_products.value_added_services = value_added_services.__dict__ + + product_information.selected_products = selected_products.__dict__ + req_obj.product_information = product_information.__dict__ + + + + req_obj = del_none(req_obj.__dict__) + req_obj = json.dumps(req_obj) + + + try: + config_obj = configuration.Configuration() + client_config = config_obj.get_merchant_boarding_configuration() + api_instance = MerchantBoardingApi(client_config) + return_data, status, body = api_instance.post_registration(req_obj) + + print("\nAPI RESPONSE CODE : ", status) + print("\nAPI RESPONSE BODY : ", body) + + write_log_audit(status) + return return_data + except Exception as e: + write_log_audit(e.status if hasattr(e, 'status') else 999) + print("\nException when calling MerchantBoardingApi->post_registration: %s\n" % e) + +def write_log_audit(status): + print(f"[Sample Code Testing] [{Path(__file__).stem}] {status}") + +if __name__ == "__main__": + merchant_boarding_tsys() diff --git a/samples/MerchantBoarding/merchant-boarding-vpc.py b/samples/MerchantBoarding/merchant-boarding-vpc.py new file mode 100644 index 0000000..087c6f2 --- /dev/null +++ b/samples/MerchantBoarding/merchant-boarding-vpc.py @@ -0,0 +1,241 @@ +from CyberSource import * +from pathlib import Path +import os +import json +import uuid +from importlib.machinery import SourceFileLoader + + +config_file = os.path.join(os.getcwd(), "data", "MerchantBoardingConfiguration.py") +configuration = SourceFileLoader("module.name", config_file).load_module() + +# To delete None values in Input Request Json body +def del_none(d): + for key, value in list(d.items()): + if value is None: + del d[key] + elif isinstance(value, dict): + del_none(value) + return d + +def merchant_boarding_vpc(): + + + req_obj = PostRegistrationBody() + + organization_info = Boardingv1registrationsOrganizationInformation() + organization_info.parent_organization_id = "apitester00" + organization_info.type = "MERCHANT" + organization_info.configurable = True + + business_info = Boardingv1registrationsOrganizationInformationBusinessInformation() + business_info.name = "StuartWickedFastEatz" + + address = Boardingv1registrationsOrganizationInformationBusinessInformationAddress() + address.country = "US" + address.address1 = "123456 SandMarket" + address.locality = "ORMOND BEACH" + address.administrative_area = "FL" + address.postal_code = "32176" + business_info.address = address.__dict__ + business_info.website_url = "https://www.StuartWickedEats.com" + business_info.phone_number = "6574567813" + + business_contact = Boardingv1registrationsOrganizationInformationBusinessInformationBusinessContact() + business_contact.first_name = "Stuart" + business_contact.last_name = "Stuart" + business_contact.phone_number = "6574567813" + business_contact.email = "svc_email_bt@corpdev.visa.com" + business_info.business_contact = business_contact.__dict__ + business_info.merchant_category_code = "5999" + organization_info.business_information = business_info.__dict__ + + req_obj.organization_information = organization_info.__dict__ + + + product_information = Boardingv1registrationsProductInformation() + selected_products = Boardingv1registrationsProductInformationSelectedProducts() + + payments = PaymentsProducts() + card_processing = PaymentsProductsCardProcessing() + subscription_information = PaymentsProductsCardProcessingSubscriptionInformation() + + subscription_information.enabled = True + features = {} + + obj1 = PaymentsProductsCardProcessingSubscriptionInformationFeatures() + obj1.enabled = True + features["cardNotPresent"] = obj1.__dict__ + features["cardPresent"] = obj1.__dict__ + subscription_information.features = features + card_processing.subscription_information = subscription_information.__dict__ + + configuration_information = PaymentsProductsCardProcessingConfigurationInformation() + configurations = CardProcessingConfig() + common = CardProcessingConfigCommon() + common.merchant_category_code = "1799" + common.default_auth_type_code = "FINAL" + common.master_card_assigned_id = None + common.sic_code = None + common.enable_partial_auth = False + common.enable_interchange_optimization = False + common.enable_split_shipment = False + common.visa_delegated_authentication_id = "123457" + common.domestic_merchant_id = "123458" + common.credit_card_refund_limit_percent = "2" + common.business_center_credit_card_refund_limit_percent = "3" + common.allow_captures_greater_than_authorizations = False + common.enable_duplicate_merchant_reference_number_blocking = False + + processors = {} + obj5 = CardProcessingConfigCommonProcessors() + acquirer = CardProcessingConfigCommonAcquirer() + acquirer.country_code = "840_usa" + acquirer.file_destination_bin = "444500" + acquirer.interbank_card_association_id = "3684" + acquirer.institution_id = "444571" + acquirer.discover_institution_id = None + obj5.acquirer = acquirer.__dict__ + + payment_types = {} + obj7 = CardProcessingConfigCommonPaymentTypes() + obj7.enabled = True + + currencies = {} + obj2 = CardProcessingConfigCommonCurrencies() + obj2.enabled = True + obj2.enabled_card_present = False + obj2.enabled_card_not_present = True + obj2.terminal_id = "113366" + obj2.merchant_id = "113355" + obj2.service_enablement_number = None + currencies["CAD"] = obj2.__dict__ + currencies["USD"] = obj2.__dict__ + obj7.currencies = currencies + payment_types["VISA"] = obj7.__dict__ + obj5.payment_types = payment_types + + obj5.acquirer_merchant_id = "123456" + obj5.allow_multiple_bills = False + obj5.batch_group = "vdcvantiv_est_00" + obj5.business_application_id = "AA" + obj5.enable_auto_auth_reversal_after_void = True + obj5.enable_expresspay_pan_translation = None + obj5.merchant_verification_value = "123456" + obj5.quasi_cash = False + obj5.enable_transaction_reference_number = True + processors["VPC"] = obj5.__dict__ + common.processors = processors + configurations.common = common.__dict__ + + features2 = CardProcessingConfigFeatures() + card_not_present = CardProcessingConfigFeaturesCardNotPresent() + processors3 = {} + obj9 = CardProcessingConfigFeaturesCardNotPresentProcessors() + obj9.enable_ems_transaction_risk_score = None + obj9.relax_address_verification_system = True + obj9.relax_address_verification_system_allow_expired_card = True + obj9.relax_address_verification_system_allow_zip_without_country = True + processors3["VPC"] = obj9.__dict__ + card_not_present.processors = processors3 + card_not_present.visa_straight_through_processing_only = False + card_not_present.ignore_address_verification_system = True + features2.card_not_present = card_not_present.__dict__ + + card_present = CardProcessingConfigFeaturesCardPresent() + processors2 = {} + obj4 = CardProcessingConfigFeaturesCardPresentProcessors() + obj4.default_point_of_sale_terminal_id = "223344" + processors2["VPC"] = obj4.__dict__ + card_present.processors = processors2 + card_present.enable_terminal_id_lookup = False + features2.card_present = card_present.__dict__ + + configurations.features = features2.__dict__ + configuration_information.configurations = configurations.__dict__ + + template_id = uuid.UUID("D671CE88-2F09-469C-A1B4-52C47812F792").__dict__ + configuration_information.template_id = template_id + + card_processing.configuration_information = configuration_information.__dict__ + payments.card_processing = card_processing.__dict__ + + virtual_terminal = PaymentsProductsVirtualTerminal() + subscription_information5 = PaymentsProductsPayerAuthenticationSubscriptionInformation() + subscription_information5.enabled = True + virtual_terminal.subscription_information = subscription_information5.__dict__ + + configuration_information5 = PaymentsProductsVirtualTerminalConfigurationInformation() + template_id2 = uuid.UUID("9FA1BB94-5119-48D3-B2E5-A81FD3C657B5").__dict__ + configuration_information5.template_id = template_id2 + virtual_terminal.configuration_information = configuration_information5.__dict__ + + payments.virtual_terminal = virtual_terminal.__dict__ + + customer_invoicing = PaymentsProductsTax() + subscription_information6 = PaymentsProductsPayerAuthenticationSubscriptionInformation() + subscription_information6.enabled = True + customer_invoicing.subscription_information = subscription_information6.__dict__ + payments.customer_invoicing = customer_invoicing.__dict__ + + selected_products.payments = payments.__dict__ + + risk = RiskProducts() + selected_products.risk = risk.__dict__ + + commerce_solutions = CommerceSolutionsProducts() + token_management = CommerceSolutionsProductsTokenManagement() + subscription_information7 = PaymentsProductsPayerAuthenticationSubscriptionInformation() + subscription_information7.enabled = True + token_management.subscription_information = subscription_information7.__dict__ + + configuration_information7 = CommerceSolutionsProductsTokenManagementConfigurationInformation() + template_id3 = uuid.UUID("D62BEE20-DCFD-4AA2-8723-BA3725958ABA").__dict__ + configuration_information7.template_id = template_id3 + token_management.configuration_information = configuration_information7.__dict__ + + commerce_solutions.token_management = token_management.__dict__ + selected_products.commerce_solutions = commerce_solutions.__dict__ + + value_added_services = ValueAddedServicesProducts() + transaction_search = PaymentsProductsTax() + subscription_information9 = PaymentsProductsPayerAuthenticationSubscriptionInformation() + subscription_information9.enabled = True + transaction_search.subscription_information = subscription_information9.__dict__ + value_added_services.transaction_search = transaction_search.__dict__ + + reporting = PaymentsProductsTax() + subscription_information3 = PaymentsProductsPayerAuthenticationSubscriptionInformation() + subscription_information3.enabled = True + reporting.subscription_information = subscription_information3.__dict__ + value_added_services.reporting = reporting.__dict__ + + selected_products.value_added_services = value_added_services.__dict__ + + product_information.selected_products = selected_products.__dict__ + req_obj.product_information = product_information.__dict__ + + req_obj = del_none(req_obj.__dict__) + req_obj = json.dumps(req_obj) + + + try: + config_obj = configuration.Configuration() + client_config = config_obj.get_merchant_boarding_configuration() + api_instance = MerchantBoardingApi(client_config) + return_data, status, body = api_instance.post_registration(req_obj) + + print("\nAPI RESPONSE CODE : ", status) + print("\nAPI RESPONSE BODY : ", body) + + write_log_audit(status) + return return_data + except Exception as e: + write_log_audit(e.status if hasattr(e, 'status') else 999) + print("\nException when calling MerchantBoardingApi->post_registration: %s\n" % e) + +def write_log_audit(status): + print(f"[Sample Code Testing] [{Path(__file__).stem}] {status}") + +if __name__ == "__main__": + merchant_boarding_vpc() From 15ca80fce5656d28331900ed7ab428c59ad6c78c Mon Sep 17 00:00:00 2001 From: Surya Prakash Nayak Date: Thu, 3 Oct 2024 12:48:05 +0530 Subject: [PATCH 18/29] MerchantBoarding Sample code classes aAdded to ignore list in testing --- sampleCodeIgnoreList.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/sampleCodeIgnoreList.txt b/sampleCodeIgnoreList.txt index 6646bd1..93a63bc 100644 --- a/sampleCodeIgnoreList.txt +++ b/sampleCodeIgnoreList.txt @@ -3,4 +3,5 @@ .*Flex_Security_Exception.py .*/Webhooks/.* .*/authentication/.* +.*/MerchantBoarding/.* .*updateinvoicesettings.py From 946946d87403e7802b7d4702c54d491bbe44a806 Mon Sep 17 00:00:00 2001 From: Surya Prakash Nayak Date: Fri, 4 Oct 2024 00:34:22 +0530 Subject: [PATCH 19/29] Code formatting --- .../MerchantBoarding/create_registration.py | 284 ++++++------- .../merchant-boarding-amex-direct.py | 324 +++++++-------- .../merchant-boarding-barclays.py | 238 ++++++----- .../merchant-boarding-bin-lookup.py | 124 +++--- .../MerchantBoarding/merchant-boarding-cup.py | 269 ++++++------ .../merchant-boarding-eftpos.py | 209 +++++----- .../merchant-boarding-fdi-global.py | 2 +- .../MerchantBoarding/merchant-boarding-gpx.py | 270 +++++------- .../merchant-boarding-smart-fdc.py | 288 +++++++------ .../merchant-boarding-tsys.py | 391 +++++++++--------- .../MerchantBoarding/merchant-boarding-vpc.py | 322 +++++++-------- 11 files changed, 1313 insertions(+), 1408 deletions(-) diff --git a/samples/MerchantBoarding/create_registration.py b/samples/MerchantBoarding/create_registration.py index 6fdcbc7..4b9c3fd 100644 --- a/samples/MerchantBoarding/create_registration.py +++ b/samples/MerchantBoarding/create_registration.py @@ -21,162 +21,166 @@ def create_registration(): - req_obj = PostRegistrationBody() - - organization_information = Boardingv1registrationsOrganizationInformation() - organization_information.parent_organization_id = "apitester00" - #organization_information.type = Boardingv1registrationsOrganizationInformation.TypeEnum.MERCHANT - organization_information.type = "MERCHANT" - organization_information.configurable = True - - business_information = Boardingv1registrationsOrganizationInformationBusinessInformation() - business_information.name = "StuartWickedFastEatz" - - address = Boardingv1registrationsOrganizationInformationBusinessInformationAddress() - address.country = "US" - address.address1 = "123456 SandMarket" - address.locality = "ORMOND BEACH" - address.administrative_area = "FL" - address.postal_code = "32176" - business_information.address = address.__dict__ - - business_information.website_url = "https://www.StuartWickedEats.com" - business_information.phone_number = "6574567813" - - business_contact = Boardingv1registrationsOrganizationInformationBusinessInformationBusinessContact() - business_contact.first_name = "Stuart" - business_contact.last_name = "Stuart" - business_contact.phone_number = "6574567813" - business_contact.email = "svc_email_bt@corpdev.visa.com" - business_information.business_contact = business_contact.__dict__ - business_information.merchant_category_code = "5999" - organization_information.business_information = business_information.__dict__ - - req_obj.organization_information = organization_information.__dict__ - - product_information = Boardingv1registrationsProductInformation() - selected_products = Boardingv1registrationsProductInformationSelectedProducts() - - payments = PaymentsProducts() + business_contact = Boardingv1registrationsOrganizationInformationBusinessInformationBusinessContact( + first_name="Stuart", + last_name="Stuart", + phone_number="6574567813", + email="svc_email_bt@corpdev.visa.com" + ) + + # Business Address + business_address = Boardingv1registrationsOrganizationInformationBusinessInformationAddress( + country="US", + address1="123456 SandMarket", + locality="ORMOND BEACH", + administrative_area="FL", + postal_code="32176" + ) + + # Business Information + business_information = Boardingv1registrationsOrganizationInformationBusinessInformation( + name="StuartWickedFastEatz", + address=business_address.__dict__, + website_url="https://www.StuartWickedEats.com", + phone_number="6574567813", + business_contact=business_contact.__dict__, + merchant_category_code="5999" + ) + + # Organization Information + organization_information = Boardingv1registrationsOrganizationInformation( + parent_organization_id="apitester00", + type="MERCHANT", + configurable=True, + business_information=business_information.__dict__ + ) # Payer Authentication - payer_authentication = PaymentsProductsPayerAuthentication() - subscription_information = PaymentsProductsPayerAuthenticationSubscriptionInformation() - subscription_information.enabled = True - payer_authentication.subscription_information = subscription_information.__dict__ - - configuration_information = PaymentsProductsPayerAuthenticationConfigurationInformation() - configurations = PayerAuthConfig() - card_types = PayerAuthConfigCardTypes() - verified_by_visa = PayerAuthConfigCardTypesVerifiedByVisa() - currencies = [] - - currency1 = PayerAuthConfigCardTypesVerifiedByVisaCurrencies() - currency1.currency_codes = ["ALL"] - currency1.acquirer_id = "469216" - currency1.processor_merchant_id = "678855" - currencies.append(currency1.__dict__) - - verified_by_visa.currencies = currencies - card_types.verified_by_visa = verified_by_visa.__dict__ - configurations.card_types = card_types.__dict__ - configuration_information.configurations = configurations.__dict__ - payer_authentication.configuration_information = configuration_information.__dict__ - payments.payer_authentication = payer_authentication.__dict__ + currency1 = PayerAuthConfigCardTypesVerifiedByVisaCurrencies( + currency_codes=["ALL"], + acquirer_id="469216", + processor_merchant_id="678855" + ) + verified_by_visa = PayerAuthConfigCardTypesVerifiedByVisa( + currencies=[currency1.__dict__] + ) + card_types = PayerAuthConfigCardTypes( + verified_by_visa=verified_by_visa.__dict__ + ) + configurations = PayerAuthConfig( + card_types=card_types.__dict__ + ) + configuration_information = PaymentsProductsPayerAuthenticationConfigurationInformation( + configurations=configurations.__dict__ + ) + payer_authentication = PaymentsProductsPayerAuthentication( + subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation(enabled=True).__dict__, + configuration_information=configuration_information.__dict__ + ) # Card Processing - card_processing = PaymentsProductsCardProcessing() - subscription_information2 = PaymentsProductsCardProcessingSubscriptionInformation() - subscription_information2.enabled = True - features = {"cardNotPresent": PaymentsProductsCardProcessingSubscriptionInformationFeatures(enabled=True).__dict__} - subscription_information2.features = features - card_processing.subscription_information = subscription_information2.__dict__ - - configuration_information2 = PaymentsProductsCardProcessingConfigurationInformation() - configurations2 = CardProcessingConfig() - common = CardProcessingConfigCommon() - common.merchant_category_code = "1234" - - merchant_descriptor_information = CardProcessingConfigCommonMerchantDescriptorInformation() - merchant_descriptor_information.name = "r4ef" - merchant_descriptor_information.city = "Bellevue" - merchant_descriptor_information.country = "US" - merchant_descriptor_information.phone = "4255547845" - merchant_descriptor_information.state = "WA" - merchant_descriptor_information.street = "StreetName" - merchant_descriptor_information.zip = "98007" - common.merchant_descriptor_information = merchant_descriptor_information.__dict__ - + merchant_descriptor_information = CardProcessingConfigCommonMerchantDescriptorInformation( + name="r4ef", + city="Bellevue", + country="US", + phone="4255547845", + state="WA", + street="StreetName", + zip="98007" + ) processors = {"tsys": CardProcessingConfigCommonProcessors( - merchant_id="123456789101", - terminal_id="1231", - industry_code="D", - vital_number="71234567", - merchant_bin_number="123456", - merchant_location_number="00001", - store_id="1234", - settlement_currency="USD" + merchant_id="123456789101", + terminal_id="1231", + industry_code="D", + vital_number="71234567", + merchant_bin_number="123456", + merchant_location_number="00001", + store_id="1234", + settlement_currency="USD" ).__dict__} - common.processors = processors - configurations2.common = common.__dict__ - - features2 = CardProcessingConfigFeatures() - card_not_present = CardProcessingConfigFeaturesCardNotPresent() - card_not_present.visa_straight_through_processing_only = True - features2.card_not_present = card_not_present.__dict__ - configurations2.features = features2.__dict__ - configuration_information2.configurations = configurations2.__dict__ - card_processing.configuration_information = configuration_information2.__dict__ - payments.card_processing = card_processing.__dict__ + common = CardProcessingConfigCommon( + merchant_category_code="1234", + merchant_descriptor_information=merchant_descriptor_information.__dict__, + processors=processors + ) + features = CardProcessingConfigFeatures( + card_not_present=CardProcessingConfigFeaturesCardNotPresent( + visa_straight_through_processing_only=True + ).__dict__ + ) + configurations2 = CardProcessingConfig( + common=common.__dict__, + features=features.__dict__ + ) + configuration_information2 = PaymentsProductsCardProcessingConfigurationInformation( + configurations=configurations2.__dict__ + ) + card_processing = PaymentsProductsCardProcessing( + subscription_information=PaymentsProductsCardProcessingSubscriptionInformation( + enabled=True, + features={"cardNotPresent": PaymentsProductsCardProcessingSubscriptionInformationFeatures(enabled=True).__dict__} + ).__dict__, + configuration_information=configuration_information2.__dict__ + ) # Virtual Terminal - virtual_terminal = PaymentsProductsVirtualTerminal() - subscription_information3 = PaymentsProductsPayerAuthenticationSubscriptionInformation() - subscription_information3.enabled = True - virtual_terminal.subscription_information = subscription_information3.__dict__ - payments.virtual_terminal = virtual_terminal.__dict__ + virtual_terminal = PaymentsProductsVirtualTerminal( + subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation(enabled=True).__dict__ + ) # Customer Invoicing - customer_invoicing = PaymentsProductsTax() - subscription_information4 = PaymentsProductsPayerAuthenticationSubscriptionInformation() - subscription_information4.enabled = True - customer_invoicing.subscription_information = subscription_information4.__dict__ - payments.customer_invoicing = customer_invoicing.__dict__ + customer_invoicing = PaymentsProductsTax( + subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation(enabled=True).__dict__ + ) # Payouts - payouts = PaymentsProductsPayouts() - subscription_information5 = PaymentsProductsPayerAuthenticationSubscriptionInformation() - subscription_information5.enabled = True - payouts.subscription_information = subscription_information5.__dict__ - payments.payouts = payouts.__dict__ - - selected_products.payments = payments.__dict__ + payouts = PaymentsProductsPayouts( + subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation(enabled=True).__dict__ + ) # Commerce Solutions - commerce_solutions = CommerceSolutionsProducts() - token_management = CommerceSolutionsProductsTokenManagement() - subscription_information6 = PaymentsProductsPayerAuthenticationSubscriptionInformation() - subscription_information6.enabled = True - token_management.subscription_information = subscription_information6.__dict__ - commerce_solutions.token_management = token_management.__dict__ - selected_products.commerce_solutions = commerce_solutions.__dict__ + token_management = CommerceSolutionsProductsTokenManagement( + subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation(enabled=True).__dict__ + ) + commerce_solutions = CommerceSolutionsProducts( + token_management=token_management.__dict__ + ) # Risk - risk = RiskProducts() - fraud_management_essentials = RiskProductsFraudManagementEssentials() - subscription_information7 = PaymentsProductsPayerAuthenticationSubscriptionInformation() - subscription_information7.enabled = True - fraud_management_essentials.subscription_information = subscription_information7.__dict__ - - configuration_information5 = RiskProductsFraudManagementEssentialsConfigurationInformation() - template_id = "E4EDB280-9DAC-4698-9EB9-9434D40FF60C" - configuration_information5.template_id = template_id - fraud_management_essentials.configuration_information = configuration_information5.__dict__ - risk.fraud_management_essentials = fraud_management_essentials.__dict__ - - selected_products.risk = risk.__dict__ - product_information.selected_products = selected_products.__dict__ - req_obj.product_information = product_information.__dict__ + configuration_information5 = RiskProductsFraudManagementEssentialsConfigurationInformation( + template_id="E4EDB280-9DAC-4698-9EB9-9434D40FF60C" + ) + fraud_management_essentials = RiskProductsFraudManagementEssentials( + subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation(enabled=True).__dict__, + configuration_information=configuration_information5.__dict__ + ) + risk = RiskProducts( + fraud_management_essentials=fraud_management_essentials.__dict__ + ) + + # Selected Products + selected_products = Boardingv1registrationsProductInformationSelectedProducts( + payments=PaymentsProducts( + payer_authentication=payer_authentication.__dict__, + card_processing=card_processing.__dict__, + virtual_terminal=virtual_terminal.__dict__, + customer_invoicing=customer_invoicing.__dict__, + payouts=payouts.__dict__ + ).__dict__, + commerce_solutions=commerce_solutions.__dict__, + risk=risk.__dict__ + ) + + # Product Information + product_information = Boardingv1registrationsProductInformation( + selected_products=selected_products.__dict__ + ) + + # Final Request Object + req_obj = PostRegistrationBody( + organization_information=organization_information.__dict__, + product_information=product_information.__dict__ + ) req_obj = del_none(req_obj.__dict__) req_obj = json.dumps(req_obj) diff --git a/samples/MerchantBoarding/merchant-boarding-amex-direct.py b/samples/MerchantBoarding/merchant-boarding-amex-direct.py index 6de7e1e..2244707 100644 --- a/samples/MerchantBoarding/merchant-boarding-amex-direct.py +++ b/samples/MerchantBoarding/merchant-boarding-amex-direct.py @@ -23,185 +23,161 @@ def merchant_boarding_amex_direct(): req_obj = PostRegistrationBody() - organization_info = Boardingv1registrationsOrganizationInformation() - organization_info.parent_organization_id = "apitester00" - organization_info.type = "MERCHANT" - organization_info.configurable = True - - business_info = Boardingv1registrationsOrganizationInformationBusinessInformation() - business_info.name = "StuartWickedFastEatz" - - address = Boardingv1registrationsOrganizationInformationBusinessInformationAddress() - address.country = "US" - address.address1 = "123456 SandMarket" - address.locality = "ORMOND BEACH" - address.administrative_area = "FL" - address.postal_code = "32176" - business_info.address = address.__dict__ - business_info.website_url = "https://www.StuartWickedEats.com" - business_info.phone_number = "6574567813" - - business_contact = Boardingv1registrationsOrganizationInformationBusinessInformationBusinessContact() - business_contact.first_name = "Stuart" - business_contact.last_name = "Stuart" - business_contact.phone_number = "6574567813" - business_contact.email = "svc_email_bt@corpdev.visa.com" - business_info.business_contact = business_contact.__dict__ - business_info.merchant_category_code = "5999" + organization_info = Boardingv1registrationsOrganizationInformation( + parent_organization_id="apitester00", + type="MERCHANT", + configurable=True + ) + + business_info = Boardingv1registrationsOrganizationInformationBusinessInformation( + name="StuartWickedFastEatz", + address=Boardingv1registrationsOrganizationInformationBusinessInformationAddress( + country="US", + address1="123456 SandMarket", + locality="ORMOND BEACH", + administrative_area="FL", + postal_code="32176" + ).__dict__, + website_url="https://www.StuartWickedEats.com", + phone_number="6574567813", + business_contact=Boardingv1registrationsOrganizationInformationBusinessInformationBusinessContact( + first_name="Stuart", + last_name="Stuart", + phone_number="6574567813", + email="svc_email_bt@corpdev.visa.com" + ).__dict__, + merchant_category_code="5999" + ) + organization_info.business_information = business_info.__dict__ req_obj.organization_information = organization_info.__dict__ - product_information = Boardingv1registrationsProductInformation() - selected_products = Boardingv1registrationsProductInformationSelectedProducts() - - payments = PaymentsProducts() - card_processing = PaymentsProductsCardProcessing() - subscription_information = PaymentsProductsCardProcessingSubscriptionInformation() - - subscription_information.enabled = True - features = {} - - obj1 = PaymentsProductsCardProcessingSubscriptionInformationFeatures() - obj1.enabled = True - features["cardNotPresent"] = obj1.__dict__ - features["cardPresent"] = obj1.__dict__ - subscription_information.features = features - card_processing.subscription_information = subscription_information.__dict__ - - configuration_information = PaymentsProductsCardProcessingConfigurationInformation() - - configurations = CardProcessingConfig() - common = CardProcessingConfigCommon() - common.merchant_category_code = "1799" - merchant_descriptor_information = CardProcessingConfigCommonMerchantDescriptorInformation() - merchant_descriptor_information.city = "Cupertino" - merchant_descriptor_information.country = "USA" - merchant_descriptor_information.name = "Mer name" - merchant_descriptor_information.phone = "8885554444" - merchant_descriptor_information.zip = "94043" - merchant_descriptor_information.state = "CA" - merchant_descriptor_information.street = "mer street" - merchant_descriptor_information.url = "www.test.com" - - common.merchant_descriptor_information = merchant_descriptor_information.__dict__ - - common.sub_merchant_id = "123457" - common.sub_merchant_business_name = "bus name" - - processors = {} - obj2 = CardProcessingConfigCommonProcessors() - acquirer = CardProcessingConfigCommonAcquirer() - - obj2.acquirer = acquirer.__dict__ - currencies = {} - obj3 = CardProcessingConfigCommonCurrencies1() - obj3.enabled = True - obj3.enabled_card_present = False - obj3.enabled_card_present = True - obj3.terminal_id = "" - obj3.service_enablement_number = "1234567890" - currencies["AED"] = obj3.__dict__ - currencies["FJD"] = obj3.__dict__ - currencies["USD"] = obj3.__dict__ - - obj2.currencies = currencies - - payment_types = {} - obj4 = CardProcessingConfigCommonPaymentTypes() - obj4.enabled = True - payment_types["AMERICAN_EXPRESS"] = obj4.__dict__ - - obj2.payment_types = payment_types - obj2.allow_multiple_bills = False - obj2.avs_format = "basic" - obj2.batch_group = "amexdirect_vme_default" - obj2.enable_auto_auth_reversal_after_void = False - obj2.enhanced_data = "disabled" - obj2.enable_level2 = False - obj2.amex_transaction_advice_addendum1 = "amex123" - processors["acquirer"] = obj2.__dict__ - - common.processors = processors - configurations.common = common.__dict__ - - features2 = CardProcessingConfigFeatures() - card_not_present = CardProcessingConfigFeaturesCardNotPresent() - - processors3 = {} - obj5 = CardProcessingConfigFeaturesCardNotPresentProcessors() - obj5.relax_address_verification_system = True - obj5.relax_address_verification_system_allow_expired_card = True - obj5.relax_address_verification_system_allow_zip_without_country = False - processors3["amexdirect"] = obj5.__dict__ - - card_not_present.processors = processors3 - features2.card_not_present = card_not_present.__dict__ - configurations.features = features2.__dict__ - configuration_information.configurations = configurations.__dict__ - template_id = uuid.UUID("2B80A3C7-5A39-4CC3-9882-AC4A828D3646").__dict__ - configuration_information.template_id = template_id - card_processing.configuration_information = configuration_information.__dict__ - payments.card_processing = card_processing.__dict__ - - virtual_terminal = PaymentsProductsVirtualTerminal() - subscription_information2 = PaymentsProductsPayerAuthenticationSubscriptionInformation() - - subscription_information2.enabled = True - virtual_terminal.subscription_information = subscription_information2.__dict__ - - configuration_information3 = PaymentsProductsVirtualTerminalConfigurationInformation() - - template_id2 = uuid.UUID("9FA1BB94-5119-48D3-B2E5-A81FD3C657B5").__dict__ - configuration_information3.template_id = template_id2 - virtual_terminal.configuration_information = configuration_information3.__dict__ - payments.virtual_terminal = virtual_terminal.__dict__ - - customer_invoicing = PaymentsProductsTax() - subscription_information6 = PaymentsProductsPayerAuthenticationSubscriptionInformation() - - subscription_information6.enabled = True - customer_invoicing.subscription_information = subscription_information6.__dict__ - payments.customer_invoicing = customer_invoicing.__dict__ - selected_products.payments = payments.__dict__ - - risk = RiskProducts() - selected_products.risk = risk.__dict__ - - commerce_solutions = CommerceSolutionsProducts() - token_management = CommerceSolutionsProductsTokenManagement() - - subscription_information7 = PaymentsProductsPayerAuthenticationSubscriptionInformation() - - subscription_information7.enabled = True - token_management.subscription_information = subscription_information7.__dict__ - configuration_information4 = CommerceSolutionsProductsTokenManagementConfigurationInformation() - - template_id3 = uuid.UUID("D62BEE20-DCFD-4AA2-8723-BA3725958ABA").__dict__ - configuration_information4.template_id = template_id3 - token_management.configuration_information = configuration_information4.__dict__ - commerce_solutions.token_management = token_management.__dict__ - selected_products.commerce_solutions = commerce_solutions.__dict__ - - value_added_services = ValueAddedServicesProducts() - transaction_search = PaymentsProductsTax() - subscription_information8 = PaymentsProductsPayerAuthenticationSubscriptionInformation() - - subscription_information8.enabled = True - transaction_search.subscription_information = subscription_information8.__dict__ - - value_added_services.transaction_search = transaction_search.__dict__ - reporting = PaymentsProductsTax() - subscription_information9 = PaymentsProductsPayerAuthenticationSubscriptionInformation() - - subscription_information9.enabled = True - reporting.subscription_information = subscription_information9.__dict__ - value_added_services.reporting = reporting.__dict__ - - selected_products.value_added_services = value_added_services.__dict__ - product_information.selected_products = selected_products.__dict__ + subscription_information = PaymentsProductsCardProcessingSubscriptionInformation( + enabled=True, + features={ + "cardNotPresent": PaymentsProductsCardProcessingSubscriptionInformationFeatures(enabled=True).__dict__, + "cardPresent": PaymentsProductsCardProcessingSubscriptionInformationFeatures(enabled=True).__dict__ + } + ) + + common = CardProcessingConfigCommon( + merchant_category_code="1799", + merchant_descriptor_information=CardProcessingConfigCommonMerchantDescriptorInformation( + city="Cupertino", + country="USA", + name="Mer name", + phone="8885554444", + zip="94043", + state="CA", + street="mer street", + url="www.test.com" + ).__dict__, + sub_merchant_id="123457", + sub_merchant_business_name="bus name", + processors={ + "acquirer": CardProcessingConfigCommonProcessors( + acquirer=CardProcessingConfigCommonAcquirer().__dict__, + currencies={ + "AED": CardProcessingConfigCommonCurrencies1( + enabled=True, + enabled_card_present=True, + terminal_id="", + service_enablement_number="1234567890" + ).__dict__, + "FJD": CardProcessingConfigCommonCurrencies1( + enabled=True, + enabled_card_present=True, + terminal_id="", + service_enablement_number="1234567890" + ).__dict__, + "USD": CardProcessingConfigCommonCurrencies1( + enabled=True, + enabled_card_present=True, + terminal_id="", + service_enablement_number="1234567890" + ).__dict__ + }, + payment_types={ + "AMERICAN_EXPRESS": CardProcessingConfigCommonPaymentTypes(enabled=True).__dict__ + }, + allow_multiple_bills=False, + avs_format="basic", + batch_group="amexdirect_vme_default", + enable_auto_auth_reversal_after_void=False, + enhanced_data="disabled", + enable_level2=False, + amex_transaction_advice_addendum1="amex123" + ).__dict__ + } + ) + + features2 = CardProcessingConfigFeatures( + card_not_present=CardProcessingConfigFeaturesCardNotPresent( + processors={ + "amexdirect": CardProcessingConfigFeaturesCardNotPresentProcessors( + relax_address_verification_system=True, + relax_address_verification_system_allow_expired_card=True, + relax_address_verification_system_allow_zip_without_country=False + ).__dict__ + } + ).__dict__ + ) + + configuration_information = PaymentsProductsCardProcessingConfigurationInformation( + configurations=CardProcessingConfig( + common=common.__dict__, + features=features2.__dict__ + ).__dict__, + template_id=str(uuid.UUID("2B80A3C7-5A39-4CC3-9882-AC4A828D3646")) + ) + + card_processing = PaymentsProductsCardProcessing( + subscription_information=subscription_information.__dict__, + configuration_information=configuration_information.__dict__ + ) + + virtual_terminal = PaymentsProductsVirtualTerminal( + subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation(enabled=True).__dict__, + configuration_information=PaymentsProductsVirtualTerminalConfigurationInformation( + template_id=str(uuid.UUID("9FA1BB94-5119-48D3-B2E5-A81FD3C657B5")) + ).__dict__ + ) + + customer_invoicing = PaymentsProductsTax( + subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation(enabled=True).__dict__ + ) + + selected_products = Boardingv1registrationsProductInformationSelectedProducts( + payments=PaymentsProducts( + card_processing=card_processing.__dict__, + virtual_terminal=virtual_terminal.__dict__, + customer_invoicing=customer_invoicing.__dict__ + ).__dict__, + risk=RiskProducts().__dict__, + commerce_solutions=CommerceSolutionsProducts( + token_management=CommerceSolutionsProductsTokenManagement( + subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation(enabled=True).__dict__, + configuration_information=CommerceSolutionsProductsTokenManagementConfigurationInformation( + template_id=str(uuid.UUID("D62BEE20-DCFD-4AA2-8723-BA3725958ABA")) + ).__dict__ + ).__dict__ + ).__dict__, + value_added_services=ValueAddedServicesProducts( + transaction_search=PaymentsProductsTax( + subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation(enabled=True).__dict__ + ).__dict__, + reporting=PaymentsProductsTax( + subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation(enabled=True).__dict__ + ).__dict__ + ).__dict__ + ) + + product_information = Boardingv1registrationsProductInformation( + selected_products=selected_products.__dict__ + ) + req_obj.product_information = product_information.__dict__ - diff --git a/samples/MerchantBoarding/merchant-boarding-barclays.py b/samples/MerchantBoarding/merchant-boarding-barclays.py index e40dce8..d4725f6 100644 --- a/samples/MerchantBoarding/merchant-boarding-barclays.py +++ b/samples/MerchantBoarding/merchant-boarding-barclays.py @@ -22,57 +22,50 @@ def merchant_boarding_barclays(): req_obj = PostRegistrationBody() - organization_info = Boardingv1registrationsOrganizationInformation() - organization_info.parent_organization_id = "apitester00" - organization_info.type = "MERCHANT" - organization_info.configurable = True - - business_info = Boardingv1registrationsOrganizationInformationBusinessInformation() - business_info.name = "StuartWickedFastEatz" - - address = Boardingv1registrationsOrganizationInformationBusinessInformationAddress() - address.country = "US" - address.address1 = "123456 SandMarket" - address.locality = "ORMOND BEACH" - address.administrative_area = "FL" - address.postal_code = "32176" - business_info.address = address.__dict__ - business_info.website_url = "https://www.StuartWickedEats.com" - business_info.phone_number = "6574567813" - - business_contact = Boardingv1registrationsOrganizationInformationBusinessInformationBusinessContact() - business_contact.first_name = "Stuart" - business_contact.last_name = "Stuart" - business_contact.phone_number = "6574567813" - business_contact.email = "svc_email_bt@corpdev.visa.com" - business_info.business_contact = business_contact.__dict__ - business_info.merchant_category_code = "5999" - organization_info.business_information = business_info.__dict__ + # Organization Information + address = Boardingv1registrationsOrganizationInformationBusinessInformationAddress( + country="US", + address1="123456 SandMarket", + locality="ORMOND BEACH", + administrative_area="FL", + postal_code="32176" + ) + + business_contact = Boardingv1registrationsOrganizationInformationBusinessInformationBusinessContact( + first_name="Stuart", + last_name="Stuart", + phone_number="6574567813", + email="svc_email_bt@corpdev.visa.com" + ) + + business_info = Boardingv1registrationsOrganizationInformationBusinessInformation( + name="StuartWickedFastEatz", + address=address.__dict__, + website_url="https://www.StuartWickedEats.com", + phone_number="6574567813", + business_contact=business_contact.__dict__, + merchant_category_code="5999" + ) + + organization_info = Boardingv1registrationsOrganizationInformation( + parent_organization_id="apitester00", + type="MERCHANT", + configurable=True, + business_information=business_info.__dict__ + ) req_obj.organization_information = organization_info.__dict__ - product_info = Boardingv1registrationsProductInformation() - selected_products = Boardingv1registrationsProductInformationSelectedProducts() + # Product Information + card_processing_subscription_info = PaymentsProductsCardProcessingSubscriptionInformation( + enabled=True, + features={ + "cardNotPresent": PaymentsProductsCardProcessingSubscriptionInformationFeatures(enabled=True).__dict__, + "cardPresent": PaymentsProductsCardProcessingSubscriptionInformationFeatures(enabled=True).__dict__ + } + ) - payments = PaymentsProducts() - card_processing = PaymentsProductsCardProcessing() - subscription_info = PaymentsProductsCardProcessingSubscriptionInformation() - subscription_info.enabled = True - - features = { - "cardNotPresent": PaymentsProductsCardProcessingSubscriptionInformationFeatures(enabled=True).__dict__, - "cardPresent": PaymentsProductsCardProcessingSubscriptionInformationFeatures(enabled=True).__dict__ - } - subscription_info.features = features - card_processing.subscription_information = subscription_info.__dict__ - - configuration_info = PaymentsProductsCardProcessingConfigurationInformation() - configurations = CardProcessingConfig() - common = CardProcessingConfigCommon() - common.merchant_category_code = "5999" - common.default_auth_type_code = "FINAL" - - processors = { + card_processing_processors = { "barclays2": CardProcessingConfigCommonProcessors( acquirer=CardProcessingConfigCommonAcquirer().__dict__, currencies={ @@ -104,11 +97,14 @@ def merchant_boarding_barclays(): enable_multi_currency_processing="false" ).__dict__ } - common.processors = processors - configurations.common = common.__dict__ - features3 = CardProcessingConfigFeatures() - card_not_present = CardProcessingConfigFeaturesCardNotPresent() - processors4 = { + + common_config = CardProcessingConfigCommon( + merchant_category_code="5999", + default_auth_type_code="FINAL", + processors=card_processing_processors + ) + + card_not_present_processors = { "barclays2": CardProcessingConfigFeaturesCardNotPresentProcessors( payouts=CardProcessingConfigFeaturesCardNotPresentPayouts( merchant_id="1233", @@ -116,60 +112,90 @@ def merchant_boarding_barclays(): ).__dict__ ).__dict__ } - card_not_present.processors = processors4 - features3.card_not_present = card_not_present.__dict__ - configurations.features = features3.__dict__ - configuration_info.configurations = configurations.__dict__ - configuration_info.template_id = UUID("0A413572-1995-483C-9F48-FCBE4D0B2E86").__dict__ - card_processing.configuration_information = configuration_info.__dict__ - payments.card_processing = card_processing.__dict__ - - virtual_terminal = PaymentsProductsVirtualTerminal() - subscription_info2 = PaymentsProductsPayerAuthenticationSubscriptionInformation() - subscription_info2.enabled = True - virtual_terminal.subscription_information = subscription_info2.__dict__ - configuration_info2 = PaymentsProductsVirtualTerminalConfigurationInformation() - configuration_info2.template_id = UUID("E4EDB280-9DAC-4698-9EB9-9434D40FF60C").__dict__ - virtual_terminal.configuration_information = configuration_info2.__dict__ - payments.virtual_terminal = virtual_terminal.__dict__ - - customer_invoicing = PaymentsProductsTax() - subscription_info3 = PaymentsProductsPayerAuthenticationSubscriptionInformation() - subscription_info3.enabled = True - customer_invoicing.subscription_information = subscription_info3.__dict__ - payments.customer_invoicing = customer_invoicing.__dict__ - - selected_products.payments = payments.__dict__ - - risk2 = RiskProducts() - selected_products.risk = risk2.__dict__ - - commerce_solutions = CommerceSolutionsProducts() - token_management = CommerceSolutionsProductsTokenManagement() - subscription_info5 = PaymentsProductsPayerAuthenticationSubscriptionInformation() - subscription_info5.enabled = True - token_management.subscription_information = subscription_info5.__dict__ - configuration_info5 = CommerceSolutionsProductsTokenManagementConfigurationInformation() - configuration_info5.template_id = UUID("D62BEE20-DCFD-4AA2-8723-BA3725958ABA").__dict__ - token_management.configuration_information = configuration_info5.__dict__ - commerce_solutions.token_management = token_management.__dict__ - selected_products.commerce_solutions = commerce_solutions.__dict__ - - value_added_services = ValueAddedServicesProducts() - transaction_search = PaymentsProductsTax() - subscription_info6 = PaymentsProductsPayerAuthenticationSubscriptionInformation() - subscription_info6.enabled = True - transaction_search.subscription_information = subscription_info6.__dict__ - value_added_services.transaction_search = transaction_search.__dict__ - - reporting = PaymentsProductsTax() - subscription_info7 = PaymentsProductsPayerAuthenticationSubscriptionInformation() - subscription_info7.enabled = True - reporting.subscription_information = subscription_info7.__dict__ - value_added_services.reporting = reporting.__dict__ - selected_products.value_added_services = value_added_services.__dict__ - - product_info.selected_products = selected_products.__dict__ + + features_config = CardProcessingConfigFeatures( + card_not_present=CardProcessingConfigFeaturesCardNotPresent( + processors=card_not_present_processors + ).__dict__ + ) + + card_processing_configuration = PaymentsProductsCardProcessingConfigurationInformation( + configurations=CardProcessingConfig( + common=common_config.__dict__, + features=features_config.__dict__ + ).__dict__, + template_id=str(UUID("0A413572-1995-483C-9F48-FCBE4D0B2E86")) + ) + + card_processing = PaymentsProductsCardProcessing( + subscription_information=card_processing_subscription_info.__dict__, + configuration_information=card_processing_configuration.__dict__ + ) + + virtual_terminal_configuration = PaymentsProductsVirtualTerminalConfigurationInformation( + template_id=str(UUID("E4EDB280-9DAC-4698-9EB9-9434D40FF60C")) + ) + + virtual_terminal = PaymentsProductsVirtualTerminal( + subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation( + enabled=True + ).__dict__, + configuration_information=virtual_terminal_configuration.__dict__ + ) + + customer_invoicing = PaymentsProductsTax( + subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation( + enabled=True + ).__dict__ + ) + + token_management_configuration = CommerceSolutionsProductsTokenManagementConfigurationInformation( + template_id=str(UUID("D62BEE20-DCFD-4AA2-8723-BA3725958ABA")) + ) + + token_management = CommerceSolutionsProductsTokenManagement( + subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation( + enabled=True + ).__dict__, + configuration_information=token_management_configuration.__dict__ + ) + + transaction_search = PaymentsProductsTax( + subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation( + enabled=True + ).__dict__ + ) + + reporting = PaymentsProductsTax( + subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation( + enabled=True + ).__dict__ + ) + + value_added_services = ValueAddedServicesProducts( + transaction_search=transaction_search.__dict__, + reporting=reporting.__dict__ + ) + + payments = PaymentsProducts( + card_processing=card_processing.__dict__, + virtual_terminal=virtual_terminal.__dict__, + customer_invoicing=customer_invoicing.__dict__ + ) + + selected_products = Boardingv1registrationsProductInformationSelectedProducts( + payments=payments.__dict__, + risk=RiskProducts().__dict__, + commerce_solutions=CommerceSolutionsProducts( + token_management=token_management.__dict__ + ).__dict__, + value_added_services=value_added_services.__dict__ + ) + + product_info = Boardingv1registrationsProductInformation( + selected_products=selected_products.__dict__ + ) + req_obj.product_information = product_info.__dict__ diff --git a/samples/MerchantBoarding/merchant-boarding-bin-lookup.py b/samples/MerchantBoarding/merchant-boarding-bin-lookup.py index 324844f..cea70de 100644 --- a/samples/MerchantBoarding/merchant-boarding-bin-lookup.py +++ b/samples/MerchantBoarding/merchant-boarding-bin-lookup.py @@ -20,42 +20,42 @@ def del_none(d): def merchant_boarding_bin_lookup(): - # Creating the main request object + req_obj = PostRegistrationBody() # Organization Information - organization_information = Boardingv1registrationsOrganizationInformation() - organization_information.parent_organization_id = "apitester00" - organization_information.type = "MERCHANT" - organization_information.configurable = True - - # Business Information - business_information = Boardingv1registrationsOrganizationInformationBusinessInformation() - business_information.name = "StuartWickedFastEatz" + organization_information = Boardingv1registrationsOrganizationInformation( + parent_organization_id="apitester00", + type="MERCHANT", + configurable=True + ) # Address Information - address = Boardingv1registrationsOrganizationInformationBusinessInformationAddress() - address.country = "US" - address.address1 = "123456 SandMarket" - address.locality = "ORMOND BEACH" - address.administrative_area = "FL" - address.postal_code = "32176" - - # Assigning address to business information - business_information.address = address.__dict__ - business_information.website_url = "https://www.StuartWickedEats.com" - business_information.phone_number = "6574567813" + address = Boardingv1registrationsOrganizationInformationBusinessInformationAddress( + country="US", + address1="123456 SandMarket", + locality="ORMOND BEACH", + administrative_area="FL", + postal_code="32176" + ) # Business Contact Information - business_contact = Boardingv1registrationsOrganizationInformationBusinessInformationBusinessContact() - business_contact.first_name = "Stuart" - business_contact.last_name = "Stuart" - business_contact.phone_number = "6574567813" - business_contact.email = "svc_email_bt@corpdev.visa.com" + business_contact = Boardingv1registrationsOrganizationInformationBusinessInformationBusinessContact( + first_name="Stuart", + last_name="Stuart", + phone_number="6574567813", + email="svc_email_bt@corpdev.visa.com" + ) - # Assigning business contact to business information - business_information.business_contact = business_contact.__dict__ - business_information.merchant_category_code = "5999" + # Business Information + business_information = Boardingv1registrationsOrganizationInformationBusinessInformation( + name="StuartWickedFastEatz", + address=address.__dict__, + website_url="https://www.StuartWickedEats.com", + phone_number="6574567813", + business_contact=business_contact.__dict__, + merchant_category_code="5999" + ) # Assigning business information to organization information organization_information.business_information = business_information.__dict__ @@ -63,48 +63,50 @@ def merchant_boarding_bin_lookup(): # Assigning organization information to request object req_obj.organization_information = organization_information.__dict__ - # Product Information - product_information = Boardingv1registrationsProductInformation() - selected_products = Boardingv1registrationsProductInformationSelectedProducts() - - # Payments Product - payments = PaymentsProducts() - selected_products.payments = payments.__dict__ - - # Risk Product - risk = RiskProducts() - selected_products.risk = risk.__dict__ + # Subscription Information + subscription_information = PaymentsProductsPayerAuthenticationSubscriptionInformation( + enabled=True + ) - # Commerce Solutions Product - commerce_solutions = CommerceSolutionsProducts() - bin_lookup = CommerceSolutionsProductsBinLookup() - subscription_information = PaymentsProductsPayerAuthenticationSubscriptionInformation() - - subscription_information.enabled = True - bin_lookup.subscription_information = subscription_information.__dict__ - - configuration_information = CommerceSolutionsProductsBinLookupConfigurationInformation() - configurations = CommerceSolutionsProductsBinLookupConfigurationInformationConfigurations() - - configurations.is_payout_options_enabled = False - configurations.is_account_prefix_enabled = True + # Configurations + configurations = CommerceSolutionsProductsBinLookupConfigurationInformationConfigurations( + is_payout_options_enabled=False, + is_account_prefix_enabled=True + ) - configuration_information.configurations = configurations.__dict__ - bin_lookup.configuration_information = configuration_information.__dict__ + # Configuration Information + configuration_information = CommerceSolutionsProductsBinLookupConfigurationInformation( + configurations=configurations.__dict__ + ) - commerce_solutions.bin_lookup = bin_lookup.__dict__ - selected_products.commerce_solutions = commerce_solutions.__dict__ + # Bin Lookup + bin_lookup = CommerceSolutionsProductsBinLookup( + subscription_information=subscription_information.__dict__, + configuration_information=configuration_information.__dict__ + ) - # Value Added Services - value_added_services = ValueAddedServicesProducts() - selected_products.value_added_services = value_added_services.__dict__ + # Commerce Solutions Product + commerce_solutions = CommerceSolutionsProducts( + bin_lookup=bin_lookup.__dict__ + ) + + # Selected Products + selected_products = Boardingv1registrationsProductInformationSelectedProducts( + payments=PaymentsProducts().__dict__, + risk=RiskProducts().__dict__, + commerce_solutions=commerce_solutions.__dict__, + value_added_services=ValueAddedServicesProducts().__dict__ + ) - # Assigning selected products to product information - product_information.selected_products = selected_products.__dict__ + # Product Information + product_information = Boardingv1registrationsProductInformation( + selected_products=selected_products.__dict__ + ) # Assigning product information to request object req_obj.product_information = product_information.__dict__ + req_obj = del_none(req_obj.__dict__) req_obj = json.dumps(req_obj) diff --git a/samples/MerchantBoarding/merchant-boarding-cup.py b/samples/MerchantBoarding/merchant-boarding-cup.py index 02add74..c546d23 100644 --- a/samples/MerchantBoarding/merchant-boarding-cup.py +++ b/samples/MerchantBoarding/merchant-boarding-cup.py @@ -20,136 +20,122 @@ def del_none(d): def merchant_boarding_cup(): - # Creating the main request object + + # Create main request object req_obj = PostRegistrationBody() # Organization Information - organization_information = Boardingv1registrationsOrganizationInformation() - organization_information.parent_organization_id = "apitester00" - organization_information.type = "MERCHANT" - organization_information.configurable = True + organization_info = Boardingv1registrationsOrganizationInformation( + parent_organization_id="apitester00", + type="MERCHANT", + configurable=True + ) # Business Information - business_information = Boardingv1registrationsOrganizationInformationBusinessInformation() - business_information.name = "StuartWickedFastEatz" - - # Address Information - address = Boardingv1registrationsOrganizationInformationBusinessInformationAddress() - address.country = "US" - address.address1 = "123456 SandMarket" - address.locality = "ORMOND BEACH" - address.administrative_area = "FL" - address.postal_code = "32176" - - # Assigning address to business information - business_information.address = address.__dict__ - business_information.website_url = "https://www.StuartWickedEats.com" - business_information.phone_number = "6574567813" - - # Business Contact Information - business_contact = Boardingv1registrationsOrganizationInformationBusinessInformationBusinessContact() - business_contact.first_name = "Stuart" - business_contact.last_name = "Stuart" - business_contact.phone_number = "6574567813" - business_contact.email = "svc_email_bt@corpdev.visa.com" - - # Assigning business contact to business information - business_information.business_contact = business_contact.__dict__ - business_information.merchant_category_code = "5999" - - # Assigning business information to organization information - organization_information.business_information = business_information.__dict__ - - # Assigning organization information to request object - req_obj.organization_information = organization_information.__dict__ + business_info = Boardingv1registrationsOrganizationInformationBusinessInformation( + name="StuartWickedFastEatz", + address=Boardingv1registrationsOrganizationInformationBusinessInformationAddress( + country="US", + address1="123456 SandMarket", + locality="ORMOND BEACH", + administrative_area="FL", + postal_code="32176" + ).__dict__, + website_url="https://www.StuartWickedEats.com", + phone_number="6574567813", + business_contact=Boardingv1registrationsOrganizationInformationBusinessInformationBusinessContact( + first_name="Stuart", + last_name="Stuart", + phone_number="6574567813", + email="svc_email_bt@corpdev.visa.com" + ).__dict__, + merchant_category_code="5999" + ) + + organization_info.business_information = business_info.__dict__ + req_obj.organization_information = organization_info.__dict__ # Product Information product_information = Boardingv1registrationsProductInformation() selected_products = Boardingv1registrationsProductInformationSelectedProducts() # Payments Product - payments = PaymentsProducts() - card_processing = PaymentsProductsCardProcessing() - subscription_information = PaymentsProductsCardProcessingSubscriptionInformation() - - subscription_information.enabled = True - features = {} - - # Card Processing Features - obj1 = PaymentsProductsCardProcessingSubscriptionInformationFeatures() - obj1.enabled = True - features["cardNotPresent"] = obj1.__dict__ - features["cardPresent"] = obj1.__dict__ - - subscription_information.features = features - card_processing.subscription_information = subscription_information.__dict__ - - # Card Processing Configuration Information - configuration_information = PaymentsProductsCardProcessingConfigurationInformation() - configurations = CardProcessingConfig() - common = CardProcessingConfigCommon() - common.merchant_category_code = "1799" - processors = {} - - # Common Processors - obj2 = CardProcessingConfigCommonProcessors() - acquirer = CardProcessingConfigCommonAcquirer() - acquirer.country_code = "344_hongkong" - acquirer.institution_id = "22344" - obj2.acquirer = acquirer.__dict__ - - currencies = {} - - # Common Currencies - obj3 = CardProcessingConfigCommonCurrencies1() - obj3.enabled = True - obj3.enabled_card_present = False - obj3.enabled_card_not_present = True - obj3.merchant_id = "112233" - obj3.terminal_id = "11224455" - obj3.service_enablement_number = "" - currencies["HKD"] = obj3.__dict__ - currencies["AUD"] = obj3.__dict__ - currencies["USD"] = obj3.__dict__ - - obj2.currencies = currencies - - payment_types = {} - - # Common Payment Types - obj4 = CardProcessingConfigCommonPaymentTypes() - obj4.enabled = True - payment_types["CUP"] = obj4.__dict__ - obj2.payment_types = payment_types - - processors["CUP"] = obj2.__dict__ - common.processors = processors - configurations.common = common.__dict__ - configuration_information.configurations = configurations.__dict__ - - template_id = uuid.UUID("1D8BC41A-F04E-4133-87C8-D89D1806106F").__dict__ - configuration_information.template_id = template_id - card_processing.configuration_information = configuration_information.__dict__ - payments.card_processing = card_processing.__dict__ - - # Virtual Terminal - virtual_terminal = PaymentsProductsVirtualTerminal() - subscription_information2 = PaymentsProductsPayerAuthenticationSubscriptionInformation() - subscription_information2.enabled = True - virtual_terminal.subscription_information = subscription_information2.__dict__ - - configuration_information2 = PaymentsProductsVirtualTerminalConfigurationInformation() - template_id2 = uuid.UUID("9FA1BB94-5119-48D3-B2E5-A81FD3C657B5").__dict__ - configuration_information2.template_id = template_id2 - virtual_terminal.configuration_information = configuration_information2.__dict__ - payments.virtual_terminal = virtual_terminal.__dict__ - - # Customer Invoicing - customer_invoicing = PaymentsProductsTax() - subscription_information3 = PaymentsProductsPayerAuthenticationSubscriptionInformation() - subscription_information3.enabled = True - customer_invoicing.subscription_information = subscription_information3.__dict__ - payments.customer_invoicing = customer_invoicing.__dict__ + subscription_information = PaymentsProductsCardProcessingSubscriptionInformation( + enabled=True, + features={ + "cardNotPresent": PaymentsProductsCardProcessingSubscriptionInformationFeatures(enabled=True).__dict__, + "cardPresent": PaymentsProductsCardProcessingSubscriptionInformationFeatures(enabled=True).__dict__ + } + ) + + configuration_information = PaymentsProductsCardProcessingConfigurationInformation( + configurations=CardProcessingConfig( + common=CardProcessingConfigCommon( + merchant_category_code="1799", + processors={ + "CUP": CardProcessingConfigCommonProcessors( + acquirer=CardProcessingConfigCommonAcquirer( + country_code="344_hongkong", + institution_id="22344" + ).__dict__, + currencies={ + "HKD": CardProcessingConfigCommonCurrencies1( + enabled=True, + enabled_card_present=False, + enabled_card_not_present=True, + merchant_id="112233", + terminal_id="11224455", + service_enablement_number="" + ).__dict__, + "AUD": CardProcessingConfigCommonCurrencies1( + enabled=True, + enabled_card_present=False, + enabled_card_not_present=True, + merchant_id="112233", + terminal_id="11224455", + service_enablement_number="" + ).__dict__, + "USD": CardProcessingConfigCommonCurrencies1( + enabled=True, + enabled_card_present=False, + enabled_card_not_present=True, + merchant_id="112233", + terminal_id="11224455", + service_enablement_number="" + ).__dict__, + }, + payment_types={ + "CUP": CardProcessingConfigCommonPaymentTypes(enabled=True).__dict__ + } + ).__dict__, + } + ).__dict__, + ).__dict__, + template_id=str(uuid.UUID("1D8BC41A-F04E-4133-87C8-D89D1806106F")) + ) + + card_processing = PaymentsProductsCardProcessing( + subscription_information=subscription_information.__dict__, + configuration_information=configuration_information.__dict__ + ) + + virtual_terminal = PaymentsProductsVirtualTerminal( + subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation(enabled=True).__dict__, + configuration_information=PaymentsProductsVirtualTerminalConfigurationInformation( + template_id=str(uuid.UUID("9FA1BB94-5119-48D3-B2E5-A81FD3C657B5")) + ).__dict__ + ) + + customer_invoicing = PaymentsProductsTax( + subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation(enabled=True).__dict__ + ) + + payments = PaymentsProducts( + card_processing=card_processing.__dict__, + virtual_terminal=virtual_terminal.__dict__, + customer_invoicing=customer_invoicing.__dict__ + ) + selected_products.payments = payments.__dict__ # Risk Product @@ -157,31 +143,32 @@ def merchant_boarding_cup(): selected_products.risk = risk.__dict__ # Commerce Solutions Product - commerce_solutions = CommerceSolutionsProducts() - token_management = CommerceSolutionsProductsTokenManagement() - subscription_information4 = PaymentsProductsPayerAuthenticationSubscriptionInformation() - subscription_information4.enabled = True - token_management.subscription_information = subscription_information4.__dict__ - - configuration_information3 = CommerceSolutionsProductsTokenManagementConfigurationInformation() - template_id3 = uuid.UUID("9FA1BB94-5119-48D3-B2E5-A81FD3C657B5").__dict__ - configuration_information3.template_id = template_id3 - token_management.configuration_information = configuration_information3.__dict__ - commerce_solutions.token_management = token_management.__dict__ - selected_products.commerce_solutions = commerce_solutions.__dict__ + token_management = CommerceSolutionsProductsTokenManagement( + subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation(enabled=True).__dict__, + configuration_information=CommerceSolutionsProductsTokenManagementConfigurationInformation( + template_id=str(uuid.UUID("9FA1BB94-5119-48D3-B2E5-A81FD3C657B5")) + ).__dict__ + ) - # Value Added Services - value_added_services = ValueAddedServicesProducts() + commerce_solutions = CommerceSolutionsProducts( + token_management=token_management.__dict__ + ) - transaction_search = PaymentsProductsTax() - subscription_information5 = PaymentsProductsPayerAuthenticationSubscriptionInformation() - subscription_information5.enabled = True - transaction_search.subscription_information = subscription_information5.__dict__ - value_added_services.transaction_search = transaction_search.__dict__ + selected_products.commerce_solutions = commerce_solutions.__dict__ - reporting = PaymentsProductsTax() - reporting.subscription_information = subscription_information5.__dict__ - value_added_services.reporting = reporting.__dict__ + # Value Added Services + transaction_search = PaymentsProductsTax( + subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation(enabled=True).__dict__ + ) + + reporting = PaymentsProductsTax( + subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation(enabled=True).__dict__ + ) + + value_added_services = ValueAddedServicesProducts( + transaction_search=transaction_search.__dict__, + reporting=reporting.__dict__ + ) selected_products.value_added_services = value_added_services.__dict__ product_information.selected_products = selected_products.__dict__ diff --git a/samples/MerchantBoarding/merchant-boarding-eftpos.py b/samples/MerchantBoarding/merchant-boarding-eftpos.py index cc95465..cf4cb61 100644 --- a/samples/MerchantBoarding/merchant-boarding-eftpos.py +++ b/samples/MerchantBoarding/merchant-boarding-eftpos.py @@ -20,112 +20,123 @@ def del_none(d): def merchant_boarding_eftpos(): + + # Create main request object req_obj = PostRegistrationBody() - organization_information = Boardingv1registrationsOrganizationInformation() - organization_information.parent_organization_id = "apitester00" - organization_information.type = "MERCHANT" - organization_information.configurable = True - - business_information = Boardingv1registrationsOrganizationInformationBusinessInformation() - business_information.name = "StuartWickedFastEatz" - - address = Boardingv1registrationsOrganizationInformationBusinessInformationAddress() - address.country = "US" - address.address1 = "123456 SandMarket" - address.locality = "ORMOND BEACH" - address.administrative_area = "FL" - address.postal_code = "32176" - business_information.address = address.__dict__ - - business_information.website_url = "https://www.StuartWickedEats.com" - business_information.phone_number = "6574567813" - - business_contact = Boardingv1registrationsOrganizationInformationBusinessInformationBusinessContact() - business_contact.first_name = "Stuart" - business_contact.last_name = "Stuart" - business_contact.phone_number = "6574567813" - business_contact.email = "svc_email_bt@corpdev.visa.com" - business_information.business_contact = business_contact.__dict__ - - business_information.merchant_category_code = "5999" + # Organization Information + organization_information = Boardingv1registrationsOrganizationInformation( + parent_organization_id="apitester00", + type="MERCHANT", + configurable=True + ) + + # Business Information + business_information = Boardingv1registrationsOrganizationInformationBusinessInformation( + name="StuartWickedFastEatz", + address=Boardingv1registrationsOrganizationInformationBusinessInformationAddress( + country="US", + address1="123456 SandMarket", + locality="ORMOND BEACH", + administrative_area="FL", + postal_code="32176" + ).__dict__, + website_url="https://www.StuartWickedEats.com", + phone_number="6574567813", + business_contact=Boardingv1registrationsOrganizationInformationBusinessInformationBusinessContact( + first_name="Stuart", + last_name="Stuart", + phone_number="6574567813", + email="svc_email_bt@corpdev.visa.com" + ).__dict__, + merchant_category_code="5999" + ) + organization_information.business_information = business_information.__dict__ req_obj.organization_information = organization_information.__dict__ - product_information = Boardingv1registrationsProductInformation() - selected_products = Boardingv1registrationsProductInformationSelectedProducts() - - payments = PaymentsProducts() - card_processing = PaymentsProductsCardProcessing() - subscription_information = PaymentsProductsCardProcessingSubscriptionInformation() - subscription_information.enabled = True - - features = {} - - obj1 = PaymentsProductsCardProcessingSubscriptionInformationFeatures() - obj1.enabled = True - features["cardNotPresent"] = obj1.__dict__ - - obj1.enabled = False - features["cardPresent"] = obj1.__dict__ - - subscription_information.features = features - card_processing.subscription_information = subscription_information.__dict__ - - configuration_information = PaymentsProductsCardProcessingConfigurationInformation() - configurations = CardProcessingConfig() - common = CardProcessingConfigCommon() - common.merchant_category_code = "5999" - common.prefer_cobadged_secondary_brand = True - - processors = {} - - obj5 = CardProcessingConfigCommonProcessors() - acquirer = CardProcessingConfigCommonAcquirer() - acquirer.country_code = "344_hongkong" - acquirer.institution_id = "22344" - - obj5.acquirer = acquirer.__dict__ - - currencies = {} - - obj6 = CardProcessingConfigCommonCurrencies1() - obj6.enabled = True - obj6.merchant_id = "12345612344" - obj6.terminal_id = "12121212" - currencies["AUD"] = obj6.__dict__ - - obj5.currencies = currencies - - payment_types = {} - - obj7 = CardProcessingConfigCommonPaymentTypes() - obj7.enabled = True - payment_types["EFTPOS"] = obj7.__dict__ - - obj5.payment_types = payment_types - obj5.enable_cvv_response_indicator = True - obj5.enable_least_cost_routing = True - obj5.merchant_tier = "000" - - processors["EFTPOS"] = obj5.__dict__ - - common.processors = processors - configurations.common = common.__dict__ - - features2 = CardProcessingConfigFeatures() - configurations.features = features2.__dict__ - configuration_information.configurations = configurations.__dict__ - - template_id = uuid.UUID("1F9B7F6E-F0DB-44C8-BF8E-5013E34C0F87").__dict__ - configuration_information.template_id = template_id - - card_processing.configuration_information = configuration_information.__dict__ - payments.card_processing = card_processing.__dict__ - selected_products.payments = payments.__dict__ + # Subscription Information Features + features = { + "cardNotPresent": PaymentsProductsCardProcessingSubscriptionInformationFeatures(enabled=True).__dict__, + "cardPresent": PaymentsProductsCardProcessingSubscriptionInformationFeatures(enabled=False).__dict__ + } + + # Subscription Information + subscription_information = PaymentsProductsCardProcessingSubscriptionInformation( + enabled=True, + features=features + ) + + # Acquirer Information + acquirer = CardProcessingConfigCommonAcquirer( + country_code="344_hongkong", + institution_id="22344" + ) + + # Currencies Information + currencies = { + "AUD": CardProcessingConfigCommonCurrencies1( + enabled=True, + merchant_id="12345612344", + terminal_id="12121212" + ).__dict__ + } + + # Payment Types Information + payment_types = { + "EFTPOS": CardProcessingConfigCommonPaymentTypes(enabled=True).__dict__ + } + + # Processors Information + processors = { + "EFTPOS": CardProcessingConfigCommonProcessors( + acquirer=acquirer.__dict__, + currencies=currencies, + payment_types=payment_types, + enable_cvv_response_indicator=True, + enable_least_cost_routing=True, + merchant_tier="000" + ).__dict__ + } + + # Common Configuration + common = CardProcessingConfigCommon( + merchant_category_code="5999", + prefer_cobadged_secondary_brand=True, + processors=processors + ) + + # Configuration Information + configuration_information = PaymentsProductsCardProcessingConfigurationInformation( + configurations=CardProcessingConfig( + common=common.__dict__, + features=CardProcessingConfigFeatures().__dict__ + ).__dict__, + template_id=str(uuid.UUID("1F9B7F6E-F0DB-44C8-BF8E-5013E34C0F87")) + ) + + # Card Processing + card_processing = PaymentsProductsCardProcessing( + subscription_information=subscription_information.__dict__, + configuration_information=configuration_information.__dict__ + ) + + # Payments + payments = PaymentsProducts( + card_processing=card_processing.__dict__ + ) + + # Selected Products + selected_products = Boardingv1registrationsProductInformationSelectedProducts( + payments=payments.__dict__ + ) + + # Product Information + product_information = Boardingv1registrationsProductInformation( + selected_products=selected_products.__dict__ + ) - product_information.selected_products = selected_products.__dict__ req_obj.product_information = product_information.__dict__ diff --git a/samples/MerchantBoarding/merchant-boarding-fdi-global.py b/samples/MerchantBoarding/merchant-boarding-fdi-global.py index 1d74ca7..46b1f8c 100644 --- a/samples/MerchantBoarding/merchant-boarding-fdi-global.py +++ b/samples/MerchantBoarding/merchant-boarding-fdi-global.py @@ -152,7 +152,7 @@ def merchant_boarding_fdi_global(): configurations.features = features2.__dict__ configuration_information.configurations = configurations.__dict__ - template_id = uuid.UUID("685A1FC9-3CEC-454C-9D8A-19205529CE45").__dict__ + template_id = str(uuid.UUID("685A1FC9-3CEC-454C-9D8A-19205529CE45")) configuration_information.template_id = template_id card_processing.configuration_information = configuration_information.__dict__ diff --git a/samples/MerchantBoarding/merchant-boarding-gpx.py b/samples/MerchantBoarding/merchant-boarding-gpx.py index a18ca10..189f67d 100644 --- a/samples/MerchantBoarding/merchant-boarding-gpx.py +++ b/samples/MerchantBoarding/merchant-boarding-gpx.py @@ -20,200 +20,132 @@ def del_none(d): def merchant_boarding_gpx(): + req_obj = PostRegistrationBody() - - organization_info = Boardingv1registrationsOrganizationInformation() - organization_info.parent_organization_id = "apitester00" - organization_info.type = "MERCHANT" - organization_info.configurable = True - - business_info = Boardingv1registrationsOrganizationInformationBusinessInformation() - business_info.name = "StuartWickedFastEatz" - - address = Boardingv1registrationsOrganizationInformationBusinessInformationAddress() - address.country = "US" - address.address1 = "123456 SandMarket" - address.locality = "ORMOND BEACH" - address.administrative_area = "FL" - address.postal_code = "32176" - business_info.address = address.__dict__ - business_info.website_url = "https://www.StuartWickedEats.com" - business_info.phone_number = "6574567813" - - business_contact = Boardingv1registrationsOrganizationInformationBusinessInformationBusinessContact() - business_contact.first_name = "Stuart" - business_contact.last_name = "Stuart" - business_contact.phone_number = "6574567813" - business_contact.email = "svc_email_bt@corpdev.visa.com" - business_info.business_contact = business_contact.__dict__ - business_info.merchant_category_code = "5999" - organization_info.business_information = business_info.__dict__ + organization_info = Boardingv1registrationsOrganizationInformation( + parent_organization_id="apitester00", + type="MERCHANT", + configurable=True + ) + + business_info = Boardingv1registrationsOrganizationInformationBusinessInformation( + name="StuartWickedFastEatz", + address={ + "country": "US", + "address1": "123456 SandMarket", + "locality": "ORMOND BEACH", + "administrative_area": "FL", + "postal_code": "32176" + }, + website_url="https://www.StuartWickedEats.com", + phone_number="6574567813", + business_contact={ + "first_name": "Stuart", + "last_name": "Stuart", + "phone_number": "6574567813", + "email": "svc_email_bt@corpdev.visa.com" + }, + merchant_category_code="5999" + ) + organization_info.business_information = business_info.__dict__ req_obj.organization_information = organization_info.__dict__ - # Create and set Product Information + # Product Information product_information = Boardingv1registrationsProductInformation() selected_products = Boardingv1registrationsProductInformationSelectedProducts() - # Set Payments Products + # Payments Products payments = PaymentsProducts() card_processing = PaymentsProductsCardProcessing() - subscription_information = PaymentsProductsCardProcessingSubscriptionInformation() - subscription_information.enabled = True - features = {} - - # Set subscription features - obj1 = PaymentsProductsCardProcessingSubscriptionInformationFeatures() - obj1.enabled = True - features["cardNotPresent"] = obj1.__dict__ - features["cardPresent"] = obj1.__dict__ - subscription_information.features = features + subscription_information = PaymentsProductsCardProcessingSubscriptionInformation( + enabled=True, + features={ + "cardNotPresent": {"enabled": True}, + "cardPresent": {"enabled": True} + } + ) card_processing.subscription_information = subscription_information.__dict__ - # Set configuration information + # Configuration Information configuration_information = PaymentsProductsCardProcessingConfigurationInformation() - configurations = CardProcessingConfig() - common = CardProcessingConfigCommon() - common.merchant_category_code = "1799" - common.default_auth_type_code = "FINAL" - common.food_and_consumer_service_id = "1456" - common.master_card_assigned_id = "4567" - common.sic_code = "1345" - common.enable_partial_auth = False - common.allow_captures_greater_than_authorizations = False - common.enable_duplicate_merchant_reference_number_blocking = False - common.credit_card_refund_limit_percent = "2" - common.business_center_credit_card_refund_limit_percent = "3" - - # Set processors - processors = {} - obj5 = CardProcessingConfigCommonProcessors() - acquirer = CardProcessingConfigCommonAcquirer() - acquirer.country_code = "840_usa" - acquirer.file_destination_bin = "123456" - acquirer.interbank_card_association_id = "1256" - acquirer.institution_id = "113366" - acquirer.discover_institution_id = "1567" - obj5.acquirer = acquirer.__dict__ - - # Set currencies - currencies = {} - obj6 = CardProcessingConfigCommonCurrencies1() - obj6.enabled = True - obj6.enabled_card_present = False - obj6.enabled_card_not_present = True - obj6.terminal_id = "" - obj6.service_enablement_number = "" - currencies["AED"] = obj6.__dict__ - obj5.currencies = currencies - - # Set payment types - payment_types = {} - obj7 = CardProcessingConfigCommonPaymentTypes() - obj7.enabled = True - payment_types["MASTERCARD"] = obj7.__dict__ - payment_types["DISCOVER"] = obj7.__dict__ - payment_types["JCB"] = obj7.__dict__ - payment_types["VISA"] = obj7.__dict__ - payment_types["DINERS_CLUB"] = obj7.__dict__ - payment_types["PIN_DEBIT"] = obj7.__dict__ - obj5.payment_types = payment_types - - obj5.allow_multiple_bills = True - obj5.batch_group = "gpx" - obj5.business_application_id = "AA" - obj5.enhanced_data = "disabled" - obj5.fire_safety_indicator = False - obj5.aba_number = "1122445566778" - obj5.merchant_verification_value = "234" - obj5.quasi_cash = False - obj5.merchant_id = "112233" - obj5.terminal_id = "112244" - processors["gpx"] = obj5.__dict__ - - common.processors = processors - configurations.common = common.__dict__ - - features2 = CardProcessingConfigFeatures() - card_not_present = CardProcessingConfigFeaturesCardNotPresent() - processors3 = {} - obj9 = CardProcessingConfigFeaturesCardNotPresentProcessors() - obj9.enable_ems_transaction_risk_score = True - obj9.relax_address_verification_system = True - obj9.relax_address_verification_system_allow_expired_card = True - obj9.relax_address_verification_system_allow_zip_without_country = True - processors3["gpx"] = obj9.__dict__ - card_not_present.processors = processors3 - card_not_present.visa_straight_through_processing_only = False - card_not_present.ignore_address_verification_system = False - features2.card_not_present = card_not_present.__dict__ - - card_present = CardProcessingConfigFeaturesCardPresent() - processors2 = {} - obj4 = CardProcessingConfigFeaturesCardPresentProcessors() - obj4.financial_institution_id = "1347" - obj4.pin_debit_network_order = "23456" - obj4.pin_debit_reimbursement_code = "43567" - obj4.default_point_of_sale_terminal_id = "5432" - processors2["gpx"] = obj4.__dict__ - card_present.processors = processors2 - card_present.enable_terminal_id_lookup = False - features2.card_present = card_present.__dict__ - - configurations.features = features2.__dict__ - configuration_information.configurations = configurations.__dict__ - template_id = uuid.UUID("D2A7C000-5FCA-493A-AD21-469744A19EEA").__dict__ - configuration_information.template_id = template_id + common = CardProcessingConfigCommon( + merchant_category_code="1799", + default_auth_type_code="FINAL", + food_and_consumer_service_id="1456", + master_card_assigned_id="4567", + sic_code="1345", + enable_partial_auth=False, + allow_captures_greater_than_authorizations=False, + enable_duplicate_merchant_reference_number_blocking=False, + credit_card_refund_limit_percent="2", + business_center_credit_card_refund_limit_percent="3", + processors={ + "gpx": { + "acquirer": { + "country_code": "840_usa", + "file_destination_bin": "123456", + "interbank_card_association_id": "1256", + "institution_id": "113366", + "discover_institution_id": "1567" + }, + "currencies": { + "AED": { + "enabled": True, + "enabled_card_present": False, + "enabled_card_not_present": True, + "terminal_id": "", + "service_enablement_number": "" + } + }, + "payment_types": { + "MASTERCARD": {"enabled": True}, + "DISCOVER": {"enabled": True}, + "JCB": {"enabled": True}, + "VISA": {"enabled": True}, + "DINERS_CLUB": {"enabled": True}, + "PIN_DEBIT": {"enabled": True} + }, + "allow_multiple_bills": True, + "batch_group": "gpx", + "business_application_id": "AA", + "enhanced_data": "disabled", + "fire_safety_indicator": False, + "aba_number": "1122445566778", + "merchant_verification_value": "234", + "quasi_cash": False, + "merchant_id": "112233", + "terminal_id": "112244" + } + } + ) + configuration_information.configurations = {"common": common.__dict__} + configuration_information.template_id = str(uuid.UUID("D2A7C000-5FCA-493A-AD21-469744A19EEA")) card_processing.configuration_information = configuration_information.__dict__ + payments.card_processing = card_processing.__dict__ + payments.virtual_terminal = { + "subscription_information": {"enabled": True}, + "configuration_information": {"template_id": str(uuid.UUID("9FA1BB94-5119-48D3-B2E5-A81FD3C657B5"))} + } - virtual_terminal = PaymentsProductsVirtualTerminal() - subscription_information5 = PaymentsProductsPayerAuthenticationSubscriptionInformation() - subscription_information5.enabled = True - virtual_terminal.subscription_information = subscription_information5.__dict__ - - configuration_information5 = PaymentsProductsVirtualTerminalConfigurationInformation() - template_id2 = uuid.UUID("9FA1BB94-5119-48D3-B2E5-A81FD3C657B5").__dict__ - configuration_information5.template_id = template_id2 - virtual_terminal.configuration_information = configuration_information5.__dict__ - payments.virtual_terminal = virtual_terminal.__dict__ - - customer_invoicing = PaymentsProductsTax() - subscription_information6 = PaymentsProductsPayerAuthenticationSubscriptionInformation() - subscription_information6.enabled = True - customer_invoicing.subscription_information = subscription_information6.__dict__ - payments.customer_invoicing = customer_invoicing.__dict__ + payments.customer_invoicing = {"subscription_information": {"enabled": True}} selected_products.payments = payments.__dict__ risk = RiskProducts() selected_products.risk = risk.__dict__ commerce_solutions = CommerceSolutionsProducts() - token_management = CommerceSolutionsProductsTokenManagement() - subscription_information7 = PaymentsProductsPayerAuthenticationSubscriptionInformation() - subscription_information7.enabled = True - token_management.subscription_information = subscription_information7.__dict__ - - configuration_information7 = CommerceSolutionsProductsTokenManagementConfigurationInformation() - template_id3 = uuid.UUID("D62BEE20-DCFD-4AA2-8723-BA3725958ABA").__dict__ - configuration_information7.template_id = template_id3 - token_management.configuration_information = configuration_information7.__dict__ - commerce_solutions.token_management = token_management.__dict__ + commerce_solutions.token_management = { + "subscription_information": {"enabled": True}, + "configuration_information": {"template_id": str(uuid.UUID("D62BEE20-DCFD-4AA2-8723-BA3725958ABA"))} + } selected_products.commerce_solutions = commerce_solutions.__dict__ value_added_services = ValueAddedServicesProducts() - transaction_search = PaymentsProductsTax() - subscription_information9 = PaymentsProductsPayerAuthenticationSubscriptionInformation() - subscription_information9.enabled = True - transaction_search.subscription_information = subscription_information9.__dict__ - value_added_services.transaction_search = transaction_search.__dict__ - - reporting = PaymentsProductsTax() - subscription_information3 = PaymentsProductsPayerAuthenticationSubscriptionInformation() - subscription_information3.enabled = True - reporting.subscription_information = subscription_information3.__dict__ - value_added_services.reporting = reporting.__dict__ + value_added_services.transaction_search = {"subscription_information": {"enabled": True}} + value_added_services.reporting = {"subscription_information": {"enabled": True}} selected_products.value_added_services = value_added_services.__dict__ product_information.selected_products = selected_products.__dict__ diff --git a/samples/MerchantBoarding/merchant-boarding-smart-fdc.py b/samples/MerchantBoarding/merchant-boarding-smart-fdc.py index a60c207..1bbf91d 100644 --- a/samples/MerchantBoarding/merchant-boarding-smart-fdc.py +++ b/samples/MerchantBoarding/merchant-boarding-smart-fdc.py @@ -20,157 +20,147 @@ def del_none(d): def merchant_boarding_smart_fdc(): + req_obj = PostRegistrationBody() - organization_information = Boardingv1registrationsOrganizationInformation() - organization_information.parent_organization_id = "apitester00" - organization_information.type = "MERCHANT" - organization_information.configurable = True - - business_information = Boardingv1registrationsOrganizationInformationBusinessInformation() - business_information.name = "StuartWickedFastEatz" - - address = Boardingv1registrationsOrganizationInformationBusinessInformationAddress() - address.country = "US" - address.address1 = "123456 SandMarket" - address.locality = "ORMOND BEACH" - address.administrative_area = "FL" - address.postal_code = "32176" - business_information.address = address.__dict__ - - business_information.website_url = "https://www.StuartWickedEats.com" - business_information.phone_number = "6574567813" - - business_contact = Boardingv1registrationsOrganizationInformationBusinessInformationBusinessContact() - business_contact.first_name = "Stuart" - business_contact.last_name = "Stuart" - business_contact.phone_number = "6574567813" - business_contact.email = "svc_email_bt@corpdev.visa.com" - business_information.business_contact = business_contact.__dict__ - - business_information.merchant_category_code = "5999" - organization_information.business_information = business_information.__dict__ - - req_obj.organization_information = organization_information.__dict__ - - product_information = Boardingv1registrationsProductInformation() - selected_products = Boardingv1registrationsProductInformationSelectedProducts() - - payments = PaymentsProducts() - card_processing = PaymentsProductsCardProcessing() - subscription_information = PaymentsProductsCardProcessingSubscriptionInformation() - - subscription_information.enabled = True - features = {} - - obj1 = PaymentsProductsCardProcessingSubscriptionInformationFeatures() - obj1.enabled = True - features["cardNotPresent"] = obj1.__dict__ - features["cardPresent"] = obj1.__dict__ - subscription_information.features = features - card_processing.subscription_information = subscription_information.__dict__ - - configuration_information = PaymentsProductsCardProcessingConfigurationInformation() - - configurations = CardProcessingConfig() - common = CardProcessingConfigCommon() - common.merchant_category_code = "1799" - common.default_auth_type_code = "FINAL" - common.enable_partial_auth = True - - processors = {} - obj5 = CardProcessingConfigCommonProcessors() - acquirer = CardProcessingConfigCommonAcquirer() - - obj5.acquirer = acquirer.__dict__ - - payment_types = {} - obj7 = CardProcessingConfigCommonPaymentTypes() - obj7.enabled = True - - payment_types["MASTERCARD"] = obj7.__dict__ - payment_types["DISCOVER"] = obj7.__dict__ - payment_types["JCB"] = obj7.__dict__ - payment_types["VISA"] = obj7.__dict__ - payment_types["DINERS_CLUB"] = obj7.__dict__ - payment_types["AMERICAN_EXPRESS"] = obj7.__dict__ - - obj5.payment_types = payment_types - - obj5.batch_group = "smartfdc_00" - obj5.merchant_id = "00001234567" - obj5.terminal_id = "00007654321" - - processors["smartfdc"] = obj5.__dict__ - - common.processors = processors - - configurations.common = common.__dict__ - - configuration_information.configurations = configurations.__dict__ - - template_id = uuid.UUID("3173DA78-A71E-405B-B79C-928C1A9C6AB2").__dict__ - configuration_information.template_id = template_id - - card_processing.configuration_information = configuration_information.__dict__ - payments.card_processing = card_processing.__dict__ - - virtual_terminal = PaymentsProductsVirtualTerminal() - subscription_information5 = PaymentsProductsPayerAuthenticationSubscriptionInformation() - subscription_information5.enabled = True - virtual_terminal.subscription_information = subscription_information5.__dict__ - - configuration_information5 = PaymentsProductsVirtualTerminalConfigurationInformation() - template_id2 = uuid.UUID("9FA1BB94-5119-48D3-B2E5-A81FD3C657B5").__dict__ - configuration_information5.template_id = template_id2 - virtual_terminal.configuration_information = configuration_information5.__dict__ - - payments.virtual_terminal = virtual_terminal.__dict__ - - customer_invoicing = PaymentsProductsTax() - subscription_information6 = PaymentsProductsPayerAuthenticationSubscriptionInformation() - subscription_information6.enabled = True - customer_invoicing.subscription_information = subscription_information6.__dict__ - payments.customer_invoicing = customer_invoicing.__dict__ - - selected_products.payments = payments.__dict__ - - risk = RiskProducts() - selected_products.risk = risk.__dict__ - - commerce_solutions = CommerceSolutionsProducts() - - token_management = CommerceSolutionsProductsTokenManagement() - subscription_information7 = PaymentsProductsPayerAuthenticationSubscriptionInformation() - subscription_information7.enabled = True - token_management.subscription_information = subscription_information7.__dict__ - - configuration_information7 = CommerceSolutionsProductsTokenManagementConfigurationInformation() - template_id3 = uuid.UUID("D62BEE20-DCFD-4AA2-8723-BA3725958ABA").__dict__ - configuration_information7.template_id = template_id3 - token_management.configuration_information = configuration_information7.__dict__ - - commerce_solutions.token_management = token_management.__dict__ - selected_products.commerce_solutions = commerce_solutions.__dict__ - - value_added_services = ValueAddedServicesProducts() - - transaction_search = PaymentsProductsTax() - subscription_information9 = PaymentsProductsPayerAuthenticationSubscriptionInformation() - subscription_information9.enabled = True - transaction_search.subscription_information = subscription_information9.__dict__ - value_added_services.transaction_search = transaction_search.__dict__ - - reporting = PaymentsProductsTax() - subscription_information3 = PaymentsProductsPayerAuthenticationSubscriptionInformation() - subscription_information3.enabled = True - reporting.subscription_information = subscription_information3.__dict__ - value_added_services.reporting = reporting.__dict__ - - selected_products.value_added_services = value_added_services.__dict__ - - product_information.selected_products = selected_products.__dict__ - req_obj.product_information = product_information.__dict__ + organization_info = Boardingv1registrationsOrganizationInformation( + parent_organization_id="apitester00", + type="MERCHANT", + configurable=True + ) + + business_address = Boardingv1registrationsOrganizationInformationBusinessInformationAddress( + country="US", + address1="123456 SandMarket", + locality="ORMOND BEACH", + administrative_area="FL", + postal_code="32176" + ).__dict__ + + business_contact = Boardingv1registrationsOrganizationInformationBusinessInformationBusinessContact( + first_name="Stuart", + last_name="Stuart", + phone_number="6574567813", + email="svc_email_bt@corpdev.visa.com" + ).__dict__ + + business_info = Boardingv1registrationsOrganizationInformationBusinessInformation( + name="StuartWickedFastEatz", + address=business_address, + website_url="https://www.StuartWickedEats.com", + phone_number="6574567813", + business_contact=business_contact, + merchant_category_code="5999" + ).__dict__ + + organization_info.business_information = business_info + req_obj.organization_information = organization_info.__dict__ + + subscription_features = { + "cardNotPresent": PaymentsProductsCardProcessingSubscriptionInformationFeatures(enabled=True).__dict__, + "cardPresent": PaymentsProductsCardProcessingSubscriptionInformationFeatures(enabled=True).__dict__ + } + + subscription_info = PaymentsProductsCardProcessingSubscriptionInformation( + enabled=True, + features=subscription_features + ).__dict__ + + payment_types = { + "MASTERCARD": CardProcessingConfigCommonPaymentTypes(enabled=True).__dict__, + "DISCOVER": CardProcessingConfigCommonPaymentTypes(enabled=True).__dict__, + "JCB": CardProcessingConfigCommonPaymentTypes(enabled=True).__dict__, + "VISA": CardProcessingConfigCommonPaymentTypes(enabled=True).__dict__, + "DINERS_CLUB": CardProcessingConfigCommonPaymentTypes(enabled=True).__dict__, + "AMERICAN_EXPRESS": CardProcessingConfigCommonPaymentTypes(enabled=True).__dict__ + } + + processors = { + "smartfdc": CardProcessingConfigCommonProcessors( + acquirer=CardProcessingConfigCommonAcquirer().__dict__, + payment_types=payment_types, + batch_group="smartfdc_00", + merchant_id="00001234567", + terminal_id="00007654321" + ).__dict__ + } + + common_config = CardProcessingConfigCommon( + merchant_category_code="1799", + default_auth_type_code="FINAL", + enable_partial_auth=True, + processors=processors + ).__dict__ + + configurations = CardProcessingConfig(common=common_config).__dict__ + + configuration_info = PaymentsProductsCardProcessingConfigurationInformation( + configurations=configurations, + template_id=str(uuid.UUID("3173DA78-A71E-405B-B79C-928C1A9C6AB2")) + ).__dict__ + + card_processing = PaymentsProductsCardProcessing( + subscription_information=subscription_info, + configuration_information=configuration_info + ).__dict__ + + virtual_terminal_subscription = PaymentsProductsPayerAuthenticationSubscriptionInformation(enabled=True).__dict__ + virtual_terminal_config = PaymentsProductsVirtualTerminalConfigurationInformation( + template_id=str(uuid.UUID("9FA1BB94-5119-48D3-B2E5-A81FD3C657B5")) + ).__dict__ + + virtual_terminal = PaymentsProductsVirtualTerminal( + subscription_information=virtual_terminal_subscription, + configuration_information=virtual_terminal_config + ).__dict__ + + customer_invoicing = PaymentsProductsTax( + subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation(enabled=True).__dict__ + ).__dict__ + + payments = PaymentsProducts( + card_processing=card_processing, + virtual_terminal=virtual_terminal, + customer_invoicing=customer_invoicing + ).__dict__ + + token_management_subscription = PaymentsProductsPayerAuthenticationSubscriptionInformation(enabled=True).__dict__ + token_management_config = CommerceSolutionsProductsTokenManagementConfigurationInformation( + template_id=str(uuid.UUID("D62BEE20-DCFD-4AA2-8723-BA3725958ABA")) + ).__dict__ + + token_management = CommerceSolutionsProductsTokenManagement( + subscription_information=token_management_subscription, + configuration_information=token_management_config + ).__dict__ + + commerce_solutions = CommerceSolutionsProducts(token_management=token_management).__dict__ + + transaction_search = PaymentsProductsTax( + subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation(enabled=True).__dict__ + ).__dict__ + + reporting = PaymentsProductsTax( + subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation(enabled=True).__dict__ + ).__dict__ + + value_added_services = ValueAddedServicesProducts( + transaction_search=transaction_search, + reporting=reporting + ).__dict__ + + selected_products = Boardingv1registrationsProductInformationSelectedProducts( + payments=payments, + risk=RiskProducts().__dict__, + commerce_solutions=commerce_solutions, + value_added_services=value_added_services + ).__dict__ + + product_information = Boardingv1registrationsProductInformation( + selected_products=selected_products + ).__dict__ + + req_obj.product_information = product_information req_obj = del_none(req_obj.__dict__) diff --git a/samples/MerchantBoarding/merchant-boarding-tsys.py b/samples/MerchantBoarding/merchant-boarding-tsys.py index 1ae6794..90d7826 100644 --- a/samples/MerchantBoarding/merchant-boarding-tsys.py +++ b/samples/MerchantBoarding/merchant-boarding-tsys.py @@ -20,204 +20,203 @@ def del_none(d): def merchant_boarding_tsys(): + req_obj = PostRegistrationBody() - organization_info = Boardingv1registrationsOrganizationInformation() - organization_info.parent_organization_id = "apitester00" - organization_info.type = "MERCHANT" - organization_info.configurable = True - - business_info = Boardingv1registrationsOrganizationInformationBusinessInformation() - business_info.name = "StuartWickedFastEatz" - - address = Boardingv1registrationsOrganizationInformationBusinessInformationAddress() - address.country = "US" - address.address1 = "123456 SandMarket" - address.locality = "ORMOND BEACH" - address.administrative_area = "FL" - address.postal_code = "32176" - business_info.address = address.__dict__ - business_info.website_url = "https://www.StuartWickedEats.com" - business_info.phone_number = "6574567813" - - business_contact = Boardingv1registrationsOrganizationInformationBusinessInformationBusinessContact() - business_contact.first_name = "Stuart" - business_contact.last_name = "Stuart" - business_contact.phone_number = "6574567813" - business_contact.email = "svc_email_bt@corpdev.visa.com" - business_info.business_contact = business_contact.__dict__ - business_info.merchant_category_code = "5999" - organization_info.business_information = business_info.__dict__ - - req_obj.organization_information = organization_info.__dict__ - - product_information = Boardingv1registrationsProductInformation() - selected_products = Boardingv1registrationsProductInformationSelectedProducts() - - payments = PaymentsProducts() - card_processing = PaymentsProductsCardProcessing() - subscription_information = PaymentsProductsCardProcessingSubscriptionInformation() - - subscription_information.enabled = True - features = {} - - obj1 = PaymentsProductsCardProcessingSubscriptionInformationFeatures() - obj1.enabled = True - features["cardNotPresent"] = obj1.__dict__ - features["cardPresent"] = obj1.__dict__ - subscription_information.features = features - card_processing.subscription_information = subscription_information.__dict__ - - configuration_information = PaymentsProductsCardProcessingConfigurationInformation() - - configurations = CardProcessingConfig() - common = CardProcessingConfigCommon() - common.merchant_category_code = "5999" - common.process_level3_data = "ignored" - common.default_auth_type_code = "FINAL" - common.enable_partial_auth = False - common.amex_vendor_code = "2233" - - merchant_descriptor_information = CardProcessingConfigCommonMerchantDescriptorInformation() - - merchant_descriptor_information.city = "cupertino" - merchant_descriptor_information.country = "USA" - merchant_descriptor_information.name = "kumar" - merchant_descriptor_information.state = "CA" - merchant_descriptor_information.phone = "888555333" - merchant_descriptor_information.zip = "94043" - merchant_descriptor_information.street = "steet1" - - common.merchant_descriptor_information = merchant_descriptor_information.__dict__ - - processors = {} - obj5 = CardProcessingConfigCommonProcessors() - acquirer = CardProcessingConfigCommonAcquirer() - - obj5.acquirer = acquirer.__dict__ - - currencies = {} - - obj6 = CardProcessingConfigCommonCurrencies1() - obj6.enabled = True - obj6.enabled_card_present = True - obj6.enabled_card_not_present = True - obj6.terminal_id = "1234" - obj6.service_enablement_number = "" - - currencies["CAD"] = obj6.__dict__ - - obj5.currencies = currencies - - payment_types = {} - obj7 = CardProcessingConfigCommonPaymentTypes() - obj7.enabled = True - - payment_types["MASTERCARD"] = obj7.__dict__ - payment_types["VISA"] = obj7.__dict__ - - obj5.payment_types = payment_types - - obj5.bank_number = "234576" - obj5.chain_number = "223344" - obj5.batch_group = "vital_1130" - obj5.enhanced_data = "disabled" - obj5.industry_code = "D" - obj5.merchant_bin_number = "765576" - obj5.merchant_id = "834215123456" - obj5.merchant_location_number = "00001" - obj5.store_id = "2563" - obj5.vital_number = "71234567" - obj5.quasi_cash = False - obj5.send_amex_level2_data = None - obj5.soft_descriptor_type = "1 - trans_ref_no" - obj5.travel_agency_code = "2356" - obj5.travel_agency_name = "Agent" - - processors["tsys"] = obj5.__dict__ - - common.processors = processors - - configurations.common = common.__dict__ - - features2 = CardProcessingConfigFeatures() - - card_not_present = CardProcessingConfigFeaturesCardNotPresent() - - card_not_present.visa_straight_through_processing_only = False - card_not_present.amex_transaction_advice_addendum1 = None - - features2.card_not_present = card_not_present.__dict__ - - configurations.features = features2.__dict__ - configuration_information.configurations = configurations.__dict__ - template_id = uuid.UUID("818048AD-2860-4D2D-BC39-2447654628A1").__dict__ - configuration_information.template_id = template_id - - card_processing.configuration_information = configuration_information.__dict__ - payments.card_processing = card_processing.__dict__ - - virtual_terminal = PaymentsProductsVirtualTerminal() - subscription_information5 = PaymentsProductsPayerAuthenticationSubscriptionInformation() - subscription_information5.enabled = True - virtual_terminal.subscription_information = subscription_information5.__dict__ - - configuration_information5 = PaymentsProductsVirtualTerminalConfigurationInformation() - template_id2 = uuid.UUID("9FA1BB94-5119-48D3-B2E5-A81FD3C657B5").__dict__ - configuration_information5.template_id = template_id2 - virtual_terminal.configuration_information = configuration_information5.__dict__ - - payments.virtual_terminal = virtual_terminal.__dict__ - - customer_invoicing = PaymentsProductsTax() - - subscription_information6 = PaymentsProductsPayerAuthenticationSubscriptionInformation() - subscription_information6.enabled = True - customer_invoicing.subscription_information = subscription_information6.__dict__ - payments.customer_invoicing = customer_invoicing.__dict__ - - selected_products.payments = payments.__dict__ - - risk = RiskProducts() - - selected_products.risk = risk.__dict__ - - commerce_solutions = CommerceSolutionsProducts() - - token_management = CommerceSolutionsProductsTokenManagement() - - subscription_information7 = PaymentsProductsPayerAuthenticationSubscriptionInformation() - subscription_information7.enabled = True - token_management.subscription_information = subscription_information7.__dict__ - - configuration_information7 = CommerceSolutionsProductsTokenManagementConfigurationInformation() - - template_id3 = uuid.UUID("D62BEE20-DCFD-4AA2-8723-BA3725958ABA").__dict__ - configuration_information7.template_id = template_id3 - token_management.configuration_information = configuration_information7.__dict__ - - commerce_solutions.token_management = token_management.__dict__ - selected_products.commerce_solutions = commerce_solutions.__dict__ - - value_added_services = ValueAddedServicesProducts() - - transaction_search = PaymentsProductsTax() - - subscription_information9 = PaymentsProductsPayerAuthenticationSubscriptionInformation() - subscription_information9.enabled = True - transaction_search.subscription_information = subscription_information9.__dict__ - value_added_services.transaction_search = transaction_search.__dict__ - - reporting = PaymentsProductsTax() - subscription_information3 = PaymentsProductsPayerAuthenticationSubscriptionInformation() - subscription_information3.enabled = True - reporting.subscription_information = subscription_information3.__dict__ - value_added_services.reporting = reporting.__dict__ - - selected_products.value_added_services = value_added_services.__dict__ - - product_information.selected_products = selected_products.__dict__ - req_obj.product_information = product_information.__dict__ + business_address = Boardingv1registrationsOrganizationInformationBusinessInformationAddress( + country="US", + address1="123456 SandMarket", + locality="ORMOND BEACH", + administrative_area="FL", + postal_code="32176" + ).__dict__ + + business_contact = Boardingv1registrationsOrganizationInformationBusinessInformationBusinessContact( + first_name="Stuart", + last_name="Stuart", + phone_number="6574567813", + email="svc_email_bt@corpdev.visa.com" + ).__dict__ + + business_information = Boardingv1registrationsOrganizationInformationBusinessInformation( + name="StuartWickedFastEatz", + address=business_address, + website_url="https://www.StuartWickedEats.com", + phone_number="6574567813", + business_contact=business_contact, + merchant_category_code="5999" + ).__dict__ + + organization_info = Boardingv1registrationsOrganizationInformation( + parent_organization_id="apitester00", + type="MERCHANT", + configurable=True, + business_information=business_information + ).__dict__ + + req_obj.organization_information = organization_info + + card_not_present = PaymentsProductsCardProcessingSubscriptionInformationFeatures(enabled=True).__dict__ + card_present = PaymentsProductsCardProcessingSubscriptionInformationFeatures(enabled=True).__dict__ + features = { + "cardNotPresent": card_not_present, + "cardPresent": card_present + } + + subscription_information = PaymentsProductsCardProcessingSubscriptionInformation( + enabled=True, + features=features + ).__dict__ + + merchant_descriptor_information = CardProcessingConfigCommonMerchantDescriptorInformation( + city="cupertino", + country="USA", + name="kumar", + state="CA", + phone="888555333", + zip="94043", + street="steet1" + ).__dict__ + + currencies = { + "CAD": CardProcessingConfigCommonCurrencies1( + enabled=True, + enabled_card_present=True, + enabled_card_not_present=True, + terminal_id="1234", + service_enablement_number="" + ).__dict__ + } + + payment_types = { + "MASTERCARD": CardProcessingConfigCommonPaymentTypes(enabled=True).__dict__, + "VISA": CardProcessingConfigCommonPaymentTypes(enabled=True).__dict__ + } + + tsys_processor = CardProcessingConfigCommonProcessors( + acquirer=CardProcessingConfigCommonAcquirer().__dict__, + currencies=currencies, + payment_types=payment_types, + bank_number="234576", + chain_number="223344", + batch_group="vital_1130", + enhanced_data="disabled", + industry_code="D", + merchant_bin_number="765576", + merchant_id="834215123456", + merchant_location_number="00001", + store_id="2563", + vital_number="71234567", + quasi_cash=False, + send_amex_level2_data=None, + soft_descriptor_type="1 - trans_ref_no", + travel_agency_code="2356", + travel_agency_name="Agent" + ).__dict__ + + processors = {"tsys": tsys_processor} + + common = CardProcessingConfigCommon( + merchant_category_code="5999", + process_level3_data="ignored", + default_auth_type_code="FINAL", + enable_partial_auth=False, + amex_vendor_code="2233", + merchant_descriptor_information=merchant_descriptor_information, + processors=processors + ).__dict__ + + card_not_present_feature = CardProcessingConfigFeaturesCardNotPresent( + visa_straight_through_processing_only=False, + amex_transaction_advice_addendum1=None + ).__dict__ + + features2 = CardProcessingConfigFeatures( + card_not_present=card_not_present_feature + ).__dict__ + + configurations = CardProcessingConfig( + common=common, + features=features2 + ).__dict__ + + configuration_information = PaymentsProductsCardProcessingConfigurationInformation( + configurations=configurations, + template_id=str(uuid.UUID("818048AD-2860-4D2D-BC39-2447654628A1")) + ).__dict__ + + card_processing = PaymentsProductsCardProcessing( + subscription_information=subscription_information, + configuration_information=configuration_information + ).__dict__ + + virtual_terminal_subscription = PaymentsProductsPayerAuthenticationSubscriptionInformation( + enabled=True + ).__dict__ + + virtual_terminal_configuration = PaymentsProductsVirtualTerminalConfigurationInformation( + template_id=str(uuid.UUID("9FA1BB94-5119-48D3-B2E5-A81FD3C657B5")) + ).__dict__ + + virtual_terminal = PaymentsProductsVirtualTerminal( + subscription_information=virtual_terminal_subscription, + configuration_information=virtual_terminal_configuration + ).__dict__ + + customer_invoicing = PaymentsProductsTax( + subscription_information=virtual_terminal_subscription + ).__dict__ + + payments = PaymentsProducts( + card_processing=card_processing, + virtual_terminal=virtual_terminal, + customer_invoicing=customer_invoicing + ).__dict__ + + risk = RiskProducts().__dict__ + + token_management_subscription = PaymentsProductsPayerAuthenticationSubscriptionInformation( + enabled=True + ).__dict__ + + token_management_configuration = CommerceSolutionsProductsTokenManagementConfigurationInformation( + template_id=str(uuid.UUID("D62BEE20-DCFD-4AA2-8723-BA3725958ABA")) + ).__dict__ + + token_management = CommerceSolutionsProductsTokenManagement( + subscription_information=token_management_subscription, + configuration_information=token_management_configuration + ).__dict__ + + commerce_solutions = CommerceSolutionsProducts( + token_management=token_management + ).__dict__ + + transaction_search = PaymentsProductsTax( + subscription_information=virtual_terminal_subscription + ).__dict__ + + reporting = PaymentsProductsTax( + subscription_information=virtual_terminal_subscription + ).__dict__ + + value_added_services = ValueAddedServicesProducts( + transaction_search=transaction_search, + reporting=reporting + ).__dict__ + + selected_products = Boardingv1registrationsProductInformationSelectedProducts( + payments=payments, + risk=risk, + commerce_solutions=commerce_solutions, + value_added_services=value_added_services + ).__dict__ + + product_information = Boardingv1registrationsProductInformation( + selected_products=selected_products + ).__dict__ + + req_obj.product_information = product_information diff --git a/samples/MerchantBoarding/merchant-boarding-vpc.py b/samples/MerchantBoarding/merchant-boarding-vpc.py index 087c6f2..2b5a21e 100644 --- a/samples/MerchantBoarding/merchant-boarding-vpc.py +++ b/samples/MerchantBoarding/merchant-boarding-vpc.py @@ -21,194 +21,172 @@ def del_none(d): def merchant_boarding_vpc(): + + req_obj = PostRegistrationBody() - organization_info = Boardingv1registrationsOrganizationInformation() - organization_info.parent_organization_id = "apitester00" - organization_info.type = "MERCHANT" - organization_info.configurable = True - - business_info = Boardingv1registrationsOrganizationInformationBusinessInformation() - business_info.name = "StuartWickedFastEatz" - - address = Boardingv1registrationsOrganizationInformationBusinessInformationAddress() - address.country = "US" - address.address1 = "123456 SandMarket" - address.locality = "ORMOND BEACH" - address.administrative_area = "FL" - address.postal_code = "32176" - business_info.address = address.__dict__ - business_info.website_url = "https://www.StuartWickedEats.com" - business_info.phone_number = "6574567813" - - business_contact = Boardingv1registrationsOrganizationInformationBusinessInformationBusinessContact() - business_contact.first_name = "Stuart" - business_contact.last_name = "Stuart" - business_contact.phone_number = "6574567813" - business_contact.email = "svc_email_bt@corpdev.visa.com" - business_info.business_contact = business_contact.__dict__ - business_info.merchant_category_code = "5999" - organization_info.business_information = business_info.__dict__ + # Organization Information + organization_info = Boardingv1registrationsOrganizationInformation( + parent_organization_id="apitester00", + type="MERCHANT", + configurable=True + ) + + business_address = { + "country": "US", + "address1": "123456 SandMarket", + "locality": "ORMOND BEACH", + "administrative_area": "FL", + "postal_code": "32176" + } + + business_contact = { + "first_name": "Stuart", + "last_name": "Stuart", + "phone_number": "6574567813", + "email": "svc_email_bt@corpdev.visa.com" + } + + business_info = Boardingv1registrationsOrganizationInformationBusinessInformation( + name="StuartWickedFastEatz", + address=business_address, + website_url="https://www.StuartWickedEats.com", + phone_number="6574567813", + business_contact=business_contact, + merchant_category_code="5999" + ) + organization_info.business_information = business_info.__dict__ req_obj.organization_information = organization_info.__dict__ - + # Product Information product_information = Boardingv1registrationsProductInformation() selected_products = Boardingv1registrationsProductInformationSelectedProducts() - payments = PaymentsProducts() - card_processing = PaymentsProductsCardProcessing() - subscription_information = PaymentsProductsCardProcessingSubscriptionInformation() - - subscription_information.enabled = True - features = {} - - obj1 = PaymentsProductsCardProcessingSubscriptionInformationFeatures() - obj1.enabled = True - features["cardNotPresent"] = obj1.__dict__ - features["cardPresent"] = obj1.__dict__ - subscription_information.features = features - card_processing.subscription_information = subscription_information.__dict__ - - configuration_information = PaymentsProductsCardProcessingConfigurationInformation() - configurations = CardProcessingConfig() - common = CardProcessingConfigCommon() - common.merchant_category_code = "1799" - common.default_auth_type_code = "FINAL" - common.master_card_assigned_id = None - common.sic_code = None - common.enable_partial_auth = False - common.enable_interchange_optimization = False - common.enable_split_shipment = False - common.visa_delegated_authentication_id = "123457" - common.domestic_merchant_id = "123458" - common.credit_card_refund_limit_percent = "2" - common.business_center_credit_card_refund_limit_percent = "3" - common.allow_captures_greater_than_authorizations = False - common.enable_duplicate_merchant_reference_number_blocking = False - - processors = {} - obj5 = CardProcessingConfigCommonProcessors() - acquirer = CardProcessingConfigCommonAcquirer() - acquirer.country_code = "840_usa" - acquirer.file_destination_bin = "444500" - acquirer.interbank_card_association_id = "3684" - acquirer.institution_id = "444571" - acquirer.discover_institution_id = None - obj5.acquirer = acquirer.__dict__ - - payment_types = {} - obj7 = CardProcessingConfigCommonPaymentTypes() - obj7.enabled = True - - currencies = {} - obj2 = CardProcessingConfigCommonCurrencies() - obj2.enabled = True - obj2.enabled_card_present = False - obj2.enabled_card_not_present = True - obj2.terminal_id = "113366" - obj2.merchant_id = "113355" - obj2.service_enablement_number = None - currencies["CAD"] = obj2.__dict__ - currencies["USD"] = obj2.__dict__ - obj7.currencies = currencies - payment_types["VISA"] = obj7.__dict__ - obj5.payment_types = payment_types - - obj5.acquirer_merchant_id = "123456" - obj5.allow_multiple_bills = False - obj5.batch_group = "vdcvantiv_est_00" - obj5.business_application_id = "AA" - obj5.enable_auto_auth_reversal_after_void = True - obj5.enable_expresspay_pan_translation = None - obj5.merchant_verification_value = "123456" - obj5.quasi_cash = False - obj5.enable_transaction_reference_number = True - processors["VPC"] = obj5.__dict__ - common.processors = processors - configurations.common = common.__dict__ - - features2 = CardProcessingConfigFeatures() - card_not_present = CardProcessingConfigFeaturesCardNotPresent() - processors3 = {} - obj9 = CardProcessingConfigFeaturesCardNotPresentProcessors() - obj9.enable_ems_transaction_risk_score = None - obj9.relax_address_verification_system = True - obj9.relax_address_verification_system_allow_expired_card = True - obj9.relax_address_verification_system_allow_zip_without_country = True - processors3["VPC"] = obj9.__dict__ - card_not_present.processors = processors3 - card_not_present.visa_straight_through_processing_only = False - card_not_present.ignore_address_verification_system = True - features2.card_not_present = card_not_present.__dict__ - - card_present = CardProcessingConfigFeaturesCardPresent() - processors2 = {} - obj4 = CardProcessingConfigFeaturesCardPresentProcessors() - obj4.default_point_of_sale_terminal_id = "223344" - processors2["VPC"] = obj4.__dict__ - card_present.processors = processors2 - card_present.enable_terminal_id_lookup = False - features2.card_present = card_present.__dict__ - - configurations.features = features2.__dict__ - configuration_information.configurations = configurations.__dict__ - - template_id = uuid.UUID("D671CE88-2F09-469C-A1B4-52C47812F792").__dict__ - configuration_information.template_id = template_id - - card_processing.configuration_information = configuration_information.__dict__ - payments.card_processing = card_processing.__dict__ - - virtual_terminal = PaymentsProductsVirtualTerminal() - subscription_information5 = PaymentsProductsPayerAuthenticationSubscriptionInformation() - subscription_information5.enabled = True - virtual_terminal.subscription_information = subscription_information5.__dict__ - - configuration_information5 = PaymentsProductsVirtualTerminalConfigurationInformation() - template_id2 = uuid.UUID("9FA1BB94-5119-48D3-B2E5-A81FD3C657B5").__dict__ - configuration_information5.template_id = template_id2 - virtual_terminal.configuration_information = configuration_information5.__dict__ - - payments.virtual_terminal = virtual_terminal.__dict__ - - customer_invoicing = PaymentsProductsTax() - subscription_information6 = PaymentsProductsPayerAuthenticationSubscriptionInformation() - subscription_information6.enabled = True - customer_invoicing.subscription_information = subscription_information6.__dict__ - payments.customer_invoicing = customer_invoicing.__dict__ + # Payments + subscription_features = { + "cardNotPresent": {"enabled": True}, + "cardPresent": {"enabled": True} + } + + subscription_information = PaymentsProductsCardProcessingSubscriptionInformation( + enabled=True, + features=subscription_features + ) + + common_processors = { + "VPC": CardProcessingConfigCommonProcessors( + acquirer={ + "country_code": "840_usa", + "file_destination_bin": "444500", + "interbank_card_association_id": "3684", + "institution_id": "444571" + }, + acquirer_merchant_id="123456", + allow_multiple_bills=False, + batch_group="vdcvantiv_est_00", + business_application_id="AA", + enable_auto_auth_reversal_after_void=True, + merchant_verification_value="123456", + quasi_cash=False, + enable_transaction_reference_number=True + ).__dict__ + } + + common_config = CardProcessingConfigCommon( + merchant_category_code="1799", + default_auth_type_code="FINAL", + visa_delegated_authentication_id="123457", + domestic_merchant_id="123458", + credit_card_refund_limit_percent="2", + business_center_credit_card_refund_limit_percent="3", + processors=common_processors + ) + + features_card_not_present_processors = { + "VPC": CardProcessingConfigFeaturesCardNotPresentProcessors( + relax_address_verification_system=True, + relax_address_verification_system_allow_expired_card=True, + relax_address_verification_system_allow_zip_without_country=True + ).__dict__ + } + + features_card_not_present = CardProcessingConfigFeaturesCardNotPresent( + processors=features_card_not_present_processors, + ignore_address_verification_system=True + ) + + features_card_present_processors = { + "VPC": CardProcessingConfigFeaturesCardPresentProcessors( + default_point_of_sale_terminal_id="223344" + ).__dict__ + } + + features_card_present = CardProcessingConfigFeaturesCardPresent( + processors=features_card_present_processors + ) + + features_config = CardProcessingConfigFeatures( + card_not_present=features_card_not_present.__dict__, + card_present=features_card_present.__dict__ + ) + + configurations = CardProcessingConfig( + common=common_config.__dict__, + features=features_config.__dict__ + ) + + configuration_information = PaymentsProductsCardProcessingConfigurationInformation( + template_id=str(uuid.UUID("D671CE88-2F09-469C-A1B4-52C47812F792")), + configurations=configurations.__dict__ + ) + + card_processing = PaymentsProductsCardProcessing( + subscription_information=subscription_information.__dict__, + configuration_information=configuration_information.__dict__ + ) + + payments = PaymentsProducts( + card_processing=card_processing.__dict__, + virtual_terminal=PaymentsProductsVirtualTerminal( + subscription_information={"enabled": True}, + configuration_information={ + "template_id": str(uuid.UUID("9FA1BB94-5119-48D3-B2E5-A81FD3C657B5")) + } + ).__dict__, + customer_invoicing=PaymentsProductsTax( + subscription_information={"enabled": True} + ).__dict__ + ) selected_products.payments = payments.__dict__ + # Risk risk = RiskProducts() selected_products.risk = risk.__dict__ - commerce_solutions = CommerceSolutionsProducts() - token_management = CommerceSolutionsProductsTokenManagement() - subscription_information7 = PaymentsProductsPayerAuthenticationSubscriptionInformation() - subscription_information7.enabled = True - token_management.subscription_information = subscription_information7.__dict__ - - configuration_information7 = CommerceSolutionsProductsTokenManagementConfigurationInformation() - template_id3 = uuid.UUID("D62BEE20-DCFD-4AA2-8723-BA3725958ABA").__dict__ - configuration_information7.template_id = template_id3 - token_management.configuration_information = configuration_information7.__dict__ - - commerce_solutions.token_management = token_management.__dict__ + # Commerce Solutions + token_management = CommerceSolutionsProductsTokenManagement( + subscription_information={"enabled": True}, + configuration_information={ + "template_id": str(uuid.UUID("D62BEE20-DCFD-4AA2-8723-BA3725958ABA")) + } + ) + + commerce_solutions = CommerceSolutionsProducts( + token_management=token_management.__dict__ + ) selected_products.commerce_solutions = commerce_solutions.__dict__ - value_added_services = ValueAddedServicesProducts() - transaction_search = PaymentsProductsTax() - subscription_information9 = PaymentsProductsPayerAuthenticationSubscriptionInformation() - subscription_information9.enabled = True - transaction_search.subscription_information = subscription_information9.__dict__ - value_added_services.transaction_search = transaction_search.__dict__ - - reporting = PaymentsProductsTax() - subscription_information3 = PaymentsProductsPayerAuthenticationSubscriptionInformation() - subscription_information3.enabled = True - reporting.subscription_information = subscription_information3.__dict__ - value_added_services.reporting = reporting.__dict__ + # Value-Added Services + value_added_services = ValueAddedServicesProducts( + transaction_search=PaymentsProductsTax( + subscription_information={"enabled": True} + ).__dict__, + reporting=PaymentsProductsTax( + subscription_information={"enabled": True} + ).__dict__ + ) selected_products.value_added_services = value_added_services.__dict__ From 8f3543e811df3c219e50f15b3577e638364406af Mon Sep 17 00:00:00 2001 From: monkumar Date: Mon, 7 Oct 2024 17:38:30 +0530 Subject: [PATCH 20/29] added MIT Framework Samples --- ...t-initiating-instalment-subscription-uk.py | 141 +++++++++++++++++ .../cit-initiating-recurring-subscription.py | 141 +++++++++++++++++ .../cit-placing-credential-on-file.py | 133 ++++++++++++++++ ...ndustry-practice-delayed-charge-ri-visa.py | 147 ++++++++++++++++++ .../mit-industry-practice-resubmission.py | 139 +++++++++++++++++ samples/Payments/Payments/mit-instalment.py | 137 ++++++++++++++++ samples/Payments/Payments/mit-recurring.py | 137 ++++++++++++++++ .../mit-unscheduled-credential-on-file.py | 137 ++++++++++++++++ 8 files changed, 1112 insertions(+) create mode 100644 samples/Payments/Payments/cit-initiating-instalment-subscription-uk.py create mode 100644 samples/Payments/Payments/cit-initiating-recurring-subscription.py create mode 100644 samples/Payments/Payments/cit-placing-credential-on-file.py create mode 100644 samples/Payments/Payments/mit-industry-practice-delayed-charge-ri-visa.py create mode 100644 samples/Payments/Payments/mit-industry-practice-resubmission.py create mode 100644 samples/Payments/Payments/mit-instalment.py create mode 100644 samples/Payments/Payments/mit-recurring.py create mode 100644 samples/Payments/Payments/mit-unscheduled-credential-on-file.py diff --git a/samples/Payments/Payments/cit-initiating-instalment-subscription-uk.py b/samples/Payments/Payments/cit-initiating-instalment-subscription-uk.py new file mode 100644 index 0000000..4662680 --- /dev/null +++ b/samples/Payments/Payments/cit-initiating-instalment-subscription-uk.py @@ -0,0 +1,141 @@ +from CyberSource import * +import os +import json +from importlib.machinery import SourceFileLoader +from pathlib import Path + +config_file = os.path.join(os.getcwd(), "data", "Configuration.py") +configuration = SourceFileLoader("module.name", config_file).load_module() + +# To delete None values in Input Request Json body +def del_none(d): + for key, value in list(d.items()): + if value is None: + del d[key] + elif isinstance(value, dict): + del_none(value) + elif isinstance(value, list): + for item in value: + del_none(item) + return d + +def cit_initiating_instalment_subscription_uk(): + clientReferenceInformationCode = "TC50171_3" + clientReferenceInformation = Ptsv2paymentsClientReferenceInformation( + code = clientReferenceInformationCode + ) + + processingInformationCapture = False + processingInformationCommerceIndicator = "vbv" + processingInformationAuthorizationOptionsIgnoreAvsResult = False + processingInformationAuthorizationOptionsIgnoreCvResult = False + processingInformationAuthorizationOptionsInitiatorCredentialStoredOnFile = True + processingInformationAuthorizationOptionsInitiator = Ptsv2paymentsProcessingInformationAuthorizationOptionsInitiator( + credential_stored_on_file = processingInformationAuthorizationOptionsInitiatorCredentialStoredOnFile + ) + + processingInformationAuthorizationOptions = Ptsv2paymentsProcessingInformationAuthorizationOptions( + ignore_avs_result = processingInformationAuthorizationOptionsIgnoreAvsResult, + ignore_cv_result = processingInformationAuthorizationOptionsIgnoreCvResult, + initiator = processingInformationAuthorizationOptionsInitiator.__dict__ + ) + + processingInformationRecurringOptionsLoanPayment = False + processingInformationRecurringOptionsFirstRecurringPayment = True + processingInformationRecurringOptions = Ptsv2paymentsProcessingInformationRecurringOptions( + loan_payment = processingInformationRecurringOptionsLoanPayment, + first_recurring_payment = processingInformationRecurringOptionsFirstRecurringPayment + ) + + processingInformation = Ptsv2paymentsProcessingInformation( + capture = processingInformationCapture, + commerce_indicator = processingInformationCommerceIndicator, + authorization_options = processingInformationAuthorizationOptions.__dict__, + recurring_options = processingInformationRecurringOptions.__dict__ + ) + + paymentInformationCardNumber = "4111111111111111" + paymentInformationCardExpirationMonth = "12" + paymentInformationCardExpirationYear = "2031" + paymentInformationCard = Ptsv2paymentsPaymentInformationCard( + number = paymentInformationCardNumber, + expiration_month = paymentInformationCardExpirationMonth, + expiration_year = paymentInformationCardExpirationYear + ) + + paymentInformation = Ptsv2paymentsPaymentInformation( + card = paymentInformationCard.__dict__ + ) + + orderInformationAmountDetailsTotalAmount = "102.21" + orderInformationAmountDetailsCurrency = "GBP" + orderInformationAmountDetails = Ptsv2paymentsOrderInformationAmountDetails( + total_amount = orderInformationAmountDetailsTotalAmount, + currency = orderInformationAmountDetailsCurrency + ) + + orderInformationBillToFirstName = "John" + orderInformationBillToLastName = "Doe" + orderInformationBillToAddress1 = "1 Market St" + orderInformationBillToLocality = "san francisco" + orderInformationBillToAdministrativeArea = "CA" + orderInformationBillToPostalCode = "94105" + orderInformationBillToCountry = "US" + orderInformationBillToEmail = "test@cybs.com" + orderInformationBillToPhoneNumber = "4158880000" + orderInformationBillTo = Ptsv2paymentsOrderInformationBillTo( + first_name = orderInformationBillToFirstName, + last_name = orderInformationBillToLastName, + address1 = orderInformationBillToAddress1, + locality = orderInformationBillToLocality, + administrative_area = orderInformationBillToAdministrativeArea, + postal_code = orderInformationBillToPostalCode, + country = orderInformationBillToCountry, + email = orderInformationBillToEmail, + phone_number = orderInformationBillToPhoneNumber + ) + + orderInformation = Ptsv2paymentsOrderInformation( + amount_details = orderInformationAmountDetails.__dict__, + bill_to = orderInformationBillTo.__dict__ + ) + + consumerAuthenticationInformationCavv = "EHuWW9PiBkWvqE5juRwDzAUFBAk=" + consumerAuthenticationInformation = Ptsv2paymentsConsumerAuthenticationInformation( + cavv = consumerAuthenticationInformationCavv + ) + + requestObj = CreatePaymentRequest( + client_reference_information = clientReferenceInformation.__dict__, + processing_information = processingInformation.__dict__, + payment_information = paymentInformation.__dict__, + order_information = orderInformation.__dict__, + consumer_authentication_information = consumerAuthenticationInformation.__dict__ + ) + + + requestObj = del_none(requestObj.__dict__) + requestObj = json.dumps(requestObj) + + + try: + config_obj = configuration.Configuration() + client_config = config_obj.get_configuration() + api_instance = PaymentsApi(client_config) + return_data, status, body = api_instance.create_payment(requestObj) + + print("\nAPI RESPONSE CODE : ", status) + print("\nAPI RESPONSE BODY : ", body) + + write_log_audit(status) + + return return_data + except Exception as e: + write_log_audit(e.status) + print("\nException when calling PaymentsApi->create_payment: %s\n" % e) + +def write_log_audit(status): + print(f"[Sample Code Testing] [{Path(__file__).stem}] {status}") + +if __name__ == "__main__": + cit_initiating_instalment_subscription_uk() \ No newline at end of file diff --git a/samples/Payments/Payments/cit-initiating-recurring-subscription.py b/samples/Payments/Payments/cit-initiating-recurring-subscription.py new file mode 100644 index 0000000..4d14813 --- /dev/null +++ b/samples/Payments/Payments/cit-initiating-recurring-subscription.py @@ -0,0 +1,141 @@ +from CyberSource import * +import os +import json +from importlib.machinery import SourceFileLoader +from pathlib import Path + +config_file = os.path.join(os.getcwd(), "data", "Configuration.py") +configuration = SourceFileLoader("module.name", config_file).load_module() + +# To delete None values in Input Request Json body +def del_none(d): + for key, value in list(d.items()): + if value is None: + del d[key] + elif isinstance(value, dict): + del_none(value) + elif isinstance(value, list): + for item in value: + del_none(item) + return d + +def cit_initiating_recurring_subscription(): + clientReferenceInformationCode = "TC50171_3" + clientReferenceInformation = Ptsv2paymentsClientReferenceInformation( + code = clientReferenceInformationCode + ) + + processingInformationCapture = False + processingInformationCommerceIndicator = "vbv" + processingInformationAuthorizationOptionsIgnoreAvsResult = False + processingInformationAuthorizationOptionsIgnoreCvResult = False + processingInformationAuthorizationOptionsInitiatorCredentialStoredOnFile = True + processingInformationAuthorizationOptionsInitiator = Ptsv2paymentsProcessingInformationAuthorizationOptionsInitiator( + credential_stored_on_file = processingInformationAuthorizationOptionsInitiatorCredentialStoredOnFile + ) + + processingInformationAuthorizationOptions = Ptsv2paymentsProcessingInformationAuthorizationOptions( + ignore_avs_result = processingInformationAuthorizationOptionsIgnoreAvsResult, + ignore_cv_result = processingInformationAuthorizationOptionsIgnoreCvResult, + initiator = processingInformationAuthorizationOptionsInitiator.__dict__ + ) + + processingInformationRecurringOptionsLoanPayment = False + processingInformationRecurringOptionsFirstRecurringPayment = True + processingInformationRecurringOptions = Ptsv2paymentsProcessingInformationRecurringOptions( + loan_payment = processingInformationRecurringOptionsLoanPayment, + first_recurring_payment = processingInformationRecurringOptionsFirstRecurringPayment + ) + + processingInformation = Ptsv2paymentsProcessingInformation( + capture = processingInformationCapture, + commerce_indicator = processingInformationCommerceIndicator, + authorization_options = processingInformationAuthorizationOptions.__dict__, + recurring_options = processingInformationRecurringOptions.__dict__ + ) + + paymentInformationCardNumber = "4111111111111111" + paymentInformationCardExpirationMonth = "12" + paymentInformationCardExpirationYear = "2031" + paymentInformationCard = Ptsv2paymentsPaymentInformationCard( + number = paymentInformationCardNumber, + expiration_month = paymentInformationCardExpirationMonth, + expiration_year = paymentInformationCardExpirationYear + ) + + paymentInformation = Ptsv2paymentsPaymentInformation( + card = paymentInformationCard.__dict__ + ) + + orderInformationAmountDetailsTotalAmount = "102.21" + orderInformationAmountDetailsCurrency = "GBP" + orderInformationAmountDetails = Ptsv2paymentsOrderInformationAmountDetails( + total_amount = orderInformationAmountDetailsTotalAmount, + currency = orderInformationAmountDetailsCurrency + ) + + orderInformationBillToFirstName = "John" + orderInformationBillToLastName = "Doe" + orderInformationBillToAddress1 = "1 Market St" + orderInformationBillToLocality = "san francisco" + orderInformationBillToAdministrativeArea = "CA" + orderInformationBillToPostalCode = "94105" + orderInformationBillToCountry = "US" + orderInformationBillToEmail = "test@cybs.com" + orderInformationBillToPhoneNumber = "4158880000" + orderInformationBillTo = Ptsv2paymentsOrderInformationBillTo( + first_name = orderInformationBillToFirstName, + last_name = orderInformationBillToLastName, + address1 = orderInformationBillToAddress1, + locality = orderInformationBillToLocality, + administrative_area = orderInformationBillToAdministrativeArea, + postal_code = orderInformationBillToPostalCode, + country = orderInformationBillToCountry, + email = orderInformationBillToEmail, + phone_number = orderInformationBillToPhoneNumber + ) + + orderInformation = Ptsv2paymentsOrderInformation( + amount_details = orderInformationAmountDetails.__dict__, + bill_to = orderInformationBillTo.__dict__ + ) + + consumerAuthenticationInformationCavv = "EHuWW9PiBkWvqE5juRwDzAUFBAk=" + consumerAuthenticationInformation = Ptsv2paymentsConsumerAuthenticationInformation( + cavv = consumerAuthenticationInformationCavv + ) + + requestObj = CreatePaymentRequest( + client_reference_information = clientReferenceInformation.__dict__, + processing_information = processingInformation.__dict__, + payment_information = paymentInformation.__dict__, + order_information = orderInformation.__dict__, + consumer_authentication_information = consumerAuthenticationInformation.__dict__ + ) + + + requestObj = del_none(requestObj.__dict__) + requestObj = json.dumps(requestObj) + + + try: + config_obj = configuration.Configuration() + client_config = config_obj.get_configuration() + api_instance = PaymentsApi(client_config) + return_data, status, body = api_instance.create_payment(requestObj) + + print("\nAPI RESPONSE CODE : ", status) + print("\nAPI RESPONSE BODY : ", body) + + write_log_audit(status) + + return return_data + except Exception as e: + write_log_audit(e.status) + print("\nException when calling PaymentsApi->create_payment: %s\n" % e) + +def write_log_audit(status): + print(f"[Sample Code Testing] [{Path(__file__).stem}] {status}") + +if __name__ == "__main__": + cit_initiating_recurring_subscription() \ No newline at end of file diff --git a/samples/Payments/Payments/cit-placing-credential-on-file.py b/samples/Payments/Payments/cit-placing-credential-on-file.py new file mode 100644 index 0000000..a8a3e1e --- /dev/null +++ b/samples/Payments/Payments/cit-placing-credential-on-file.py @@ -0,0 +1,133 @@ +from CyberSource import * +import os +import json +from importlib.machinery import SourceFileLoader +from pathlib import Path + +config_file = os.path.join(os.getcwd(), "data", "Configuration.py") +configuration = SourceFileLoader("module.name", config_file).load_module() + +# To delete None values in Input Request Json body +def del_none(d): + for key, value in list(d.items()): + if value is None: + del d[key] + elif isinstance(value, dict): + del_none(value) + elif isinstance(value, list): + for item in value: + del_none(item) + return d + +def cit_placing_credential_on_file(): + clientReferenceInformationCode = "TC50171_3" + clientReferenceInformation = Ptsv2paymentsClientReferenceInformation( + code = clientReferenceInformationCode + ) + + processingInformationCapture = False + processingInformationCommerceIndicator = "vbv" + processingInformationAuthorizationOptionsIgnoreAvsResult = False + processingInformationAuthorizationOptionsIgnoreCvResult = False + processingInformationAuthorizationOptionsInitiatorCredentialStoredOnFile = True + processingInformationAuthorizationOptionsInitiator = Ptsv2paymentsProcessingInformationAuthorizationOptionsInitiator( + credential_stored_on_file = processingInformationAuthorizationOptionsInitiatorCredentialStoredOnFile + ) + + processingInformationAuthorizationOptions = Ptsv2paymentsProcessingInformationAuthorizationOptions( + ignore_avs_result = processingInformationAuthorizationOptionsIgnoreAvsResult, + ignore_cv_result = processingInformationAuthorizationOptionsIgnoreCvResult, + initiator = processingInformationAuthorizationOptionsInitiator.__dict__ + ) + + processingInformation = Ptsv2paymentsProcessingInformation( + capture = processingInformationCapture, + commerce_indicator = processingInformationCommerceIndicator, + authorization_options = processingInformationAuthorizationOptions.__dict__ + ) + + paymentInformationCardNumber = "4111111111111111" + paymentInformationCardExpirationMonth = "12" + paymentInformationCardExpirationYear = "2031" + paymentInformationCard = Ptsv2paymentsPaymentInformationCard( + number = paymentInformationCardNumber, + expiration_month = paymentInformationCardExpirationMonth, + expiration_year = paymentInformationCardExpirationYear + ) + + paymentInformation = Ptsv2paymentsPaymentInformation( + card = paymentInformationCard.__dict__ + ) + + orderInformationAmountDetailsTotalAmount = "102.21" + orderInformationAmountDetailsCurrency = "GBP" + orderInformationAmountDetails = Ptsv2paymentsOrderInformationAmountDetails( + total_amount = orderInformationAmountDetailsTotalAmount, + currency = orderInformationAmountDetailsCurrency + ) + + orderInformationBillToFirstName = "John" + orderInformationBillToLastName = "Doe" + orderInformationBillToAddress1 = "1 Market St" + orderInformationBillToLocality = "san francisco" + orderInformationBillToAdministrativeArea = "CA" + orderInformationBillToPostalCode = "94105" + orderInformationBillToCountry = "US" + orderInformationBillToEmail = "test@cybs.com" + orderInformationBillToPhoneNumber = "4158880000" + orderInformationBillTo = Ptsv2paymentsOrderInformationBillTo( + first_name = orderInformationBillToFirstName, + last_name = orderInformationBillToLastName, + address1 = orderInformationBillToAddress1, + locality = orderInformationBillToLocality, + administrative_area = orderInformationBillToAdministrativeArea, + postal_code = orderInformationBillToPostalCode, + country = orderInformationBillToCountry, + email = orderInformationBillToEmail, + phone_number = orderInformationBillToPhoneNumber + ) + + orderInformation = Ptsv2paymentsOrderInformation( + amount_details = orderInformationAmountDetails.__dict__, + bill_to = orderInformationBillTo.__dict__ + ) + + consumerAuthenticationInformationCavv = "EHuWW9PiBkWvqE5juRwDzAUFBAk=" + consumerAuthenticationInformation = Ptsv2paymentsConsumerAuthenticationInformation( + cavv = consumerAuthenticationInformationCavv + ) + + requestObj = CreatePaymentRequest( + client_reference_information = clientReferenceInformation.__dict__, + processing_information = processingInformation.__dict__, + payment_information = paymentInformation.__dict__, + order_information = orderInformation.__dict__, + consumer_authentication_information = consumerAuthenticationInformation.__dict__ + ) + + + requestObj = del_none(requestObj.__dict__) + requestObj = json.dumps(requestObj) + + + try: + config_obj = configuration.Configuration() + client_config = config_obj.get_configuration() + api_instance = PaymentsApi(client_config) + return_data, status, body = api_instance.create_payment(requestObj) + + print("\nAPI RESPONSE CODE : ", status) + print("\nAPI RESPONSE BODY : ", body) + + write_log_audit(status) + + return return_data + except Exception as e: + write_log_audit(e.status) + print("\nException when calling PaymentsApi->create_payment: %s\n" % e) + +def write_log_audit(status): + print(f"[Sample Code Testing] [{Path(__file__).stem}] {status}") + +if __name__ == "__main__": + cit_placing_credential_on_file() \ No newline at end of file diff --git a/samples/Payments/Payments/mit-industry-practice-delayed-charge-ri-visa.py b/samples/Payments/Payments/mit-industry-practice-delayed-charge-ri-visa.py new file mode 100644 index 0000000..a17def1 --- /dev/null +++ b/samples/Payments/Payments/mit-industry-practice-delayed-charge-ri-visa.py @@ -0,0 +1,147 @@ +from CyberSource import * +import os +import json +from importlib.machinery import SourceFileLoader +from pathlib import Path + +config_file = os.path.join(os.getcwd(), "data", "Configuration.py") +configuration = SourceFileLoader("module.name", config_file).load_module() + +# To delete None values in Input Request Json body +def del_none(d): + for key, value in list(d.items()): + if value is None: + del d[key] + elif isinstance(value, dict): + del_none(value) + elif isinstance(value, list): + for item in value: + del_none(item) + return d + +def mit_industry_practice_delayed_charge_ri_visa(): + clientReferenceInformationCode = "TC50171_3" + clientReferenceInformation = Ptsv2paymentsClientReferenceInformation( + code = clientReferenceInformationCode + ) + + processingInformationCapture = False + processingInformationCommerceIndicator = "vbv" + processingInformationAuthorizationOptionsIgnoreAvsResult = False + processingInformationAuthorizationOptionsIgnoreCvResult = False + processingInformationAuthorizationOptionsInitiatorType = "merchant" + processingInformationAuthorizationOptionsInitiatorStoredCredentialUsed = True + processingInformationAuthorizationOptionsInitiatorMerchantInitiatedTransactionReason = "2" + processingInformationAuthorizationOptionsInitiatorMerchantInitiatedTransactionPreviousTransactionId = "123456789012345" + processingInformationAuthorizationOptionsInitiatorMerchantInitiatedTransaction = Ptsv2paymentsProcessingInformationAuthorizationOptionsInitiatorMerchantInitiatedTransaction( + reason = processingInformationAuthorizationOptionsInitiatorMerchantInitiatedTransactionReason, + previous_transaction_id = processingInformationAuthorizationOptionsInitiatorMerchantInitiatedTransactionPreviousTransactionId + ) + + processingInformationAuthorizationOptionsInitiator = Ptsv2paymentsProcessingInformationAuthorizationOptionsInitiator( + type = processingInformationAuthorizationOptionsInitiatorType, + stored_credential_used = processingInformationAuthorizationOptionsInitiatorStoredCredentialUsed, + merchant_initiated_transaction = processingInformationAuthorizationOptionsInitiatorMerchantInitiatedTransaction.__dict__ + ) + + processingInformationAuthorizationOptions = Ptsv2paymentsProcessingInformationAuthorizationOptions( + ignore_avs_result = processingInformationAuthorizationOptionsIgnoreAvsResult, + ignore_cv_result = processingInformationAuthorizationOptionsIgnoreCvResult, + initiator = processingInformationAuthorizationOptionsInitiator.__dict__ + ) + + processingInformation = Ptsv2paymentsProcessingInformation( + capture = processingInformationCapture, + commerce_indicator = processingInformationCommerceIndicator, + authorization_options = processingInformationAuthorizationOptions.__dict__ + ) + + paymentInformationCardNumber = "4111111111111111" + paymentInformationCardExpirationMonth = "12" + paymentInformationCardExpirationYear = "2031" + paymentInformationCardType = "001" + paymentInformationCard = Ptsv2paymentsPaymentInformationCard( + number = paymentInformationCardNumber, + expiration_month = paymentInformationCardExpirationMonth, + expiration_year = paymentInformationCardExpirationYear, + type = paymentInformationCardType + ) + + paymentInformation = Ptsv2paymentsPaymentInformation( + card = paymentInformationCard.__dict__ + ) + + orderInformationAmountDetailsTotalAmount = "102.21" + orderInformationAmountDetailsCurrency = "GBP" + orderInformationAmountDetails = Ptsv2paymentsOrderInformationAmountDetails( + total_amount = orderInformationAmountDetailsTotalAmount, + currency = orderInformationAmountDetailsCurrency + ) + + orderInformationBillToFirstName = "John" + orderInformationBillToLastName = "Doe" + orderInformationBillToAddress1 = "1 Market St" + orderInformationBillToLocality = "san francisco" + orderInformationBillToAdministrativeArea = "CA" + orderInformationBillToPostalCode = "94105" + orderInformationBillToCountry = "US" + orderInformationBillToEmail = "test@cybs.com" + orderInformationBillToPhoneNumber = "4158880000" + orderInformationBillTo = Ptsv2paymentsOrderInformationBillTo( + first_name = orderInformationBillToFirstName, + last_name = orderInformationBillToLastName, + address1 = orderInformationBillToAddress1, + locality = orderInformationBillToLocality, + administrative_area = orderInformationBillToAdministrativeArea, + postal_code = orderInformationBillToPostalCode, + country = orderInformationBillToCountry, + email = orderInformationBillToEmail, + phone_number = orderInformationBillToPhoneNumber + ) + + orderInformation = Ptsv2paymentsOrderInformation( + amount_details = orderInformationAmountDetails.__dict__, + bill_to = orderInformationBillTo.__dict__ + ) + + consumerAuthenticationInformationCavv = "EHuWW9PiBkWvqE5juRwDzAUFBAk=" + consumerAuthenticationInformationParesStatus = "Y" + consumerAuthenticationInformation = Ptsv2paymentsConsumerAuthenticationInformation( + cavv = consumerAuthenticationInformationCavv, + pares_status = consumerAuthenticationInformationParesStatus + ) + + requestObj = CreatePaymentRequest( + client_reference_information = clientReferenceInformation.__dict__, + processing_information = processingInformation.__dict__, + payment_information = paymentInformation.__dict__, + order_information = orderInformation.__dict__, + consumer_authentication_information = consumerAuthenticationInformation.__dict__ + ) + + + requestObj = del_none(requestObj.__dict__) + requestObj = json.dumps(requestObj) + + + try: + config_obj = configuration.Configuration() + client_config = config_obj.get_configuration() + api_instance = PaymentsApi(client_config) + return_data, status, body = api_instance.create_payment(requestObj) + + print("\nAPI RESPONSE CODE : ", status) + print("\nAPI RESPONSE BODY : ", body) + + write_log_audit(status) + + return return_data + except Exception as e: + write_log_audit(e.status) + print("\nException when calling PaymentsApi->create_payment: %s\n" % e) + +def write_log_audit(status): + print(f"[Sample Code Testing] [{Path(__file__).stem}] {status}") + +if __name__ == "__main__": + mit_industry_practice_delayed_charge_ri_visa() \ No newline at end of file diff --git a/samples/Payments/Payments/mit-industry-practice-resubmission.py b/samples/Payments/Payments/mit-industry-practice-resubmission.py new file mode 100644 index 0000000..c33a779 --- /dev/null +++ b/samples/Payments/Payments/mit-industry-practice-resubmission.py @@ -0,0 +1,139 @@ +from CyberSource import * +import os +import json +from importlib.machinery import SourceFileLoader +from pathlib import Path + +config_file = os.path.join(os.getcwd(), "data", "Configuration.py") +configuration = SourceFileLoader("module.name", config_file).load_module() + +# To delete None values in Input Request Json body +def del_none(d): + for key, value in list(d.items()): + if value is None: + del d[key] + elif isinstance(value, dict): + del_none(value) + elif isinstance(value, list): + for item in value: + del_none(item) + return d + +def mit_industry_practice_resubmission(): + clientReferenceInformationCode = "TC50171_3" + clientReferenceInformation = Ptsv2paymentsClientReferenceInformation( + code = clientReferenceInformationCode + ) + + processingInformationCapture = False + processingInformationCommerceIndicator = "moto" + processingInformationAuthorizationOptionsIgnoreAvsResult = False + processingInformationAuthorizationOptionsIgnoreCvResult = False + processingInformationAuthorizationOptionsInitiatorType = "merchant" + processingInformationAuthorizationOptionsInitiatorStoredCredentialUsed = True + processingInformationAuthorizationOptionsInitiatorMerchantInitiatedTransactionReason = "1" + processingInformationAuthorizationOptionsInitiatorMerchantInitiatedTransactionPreviousTransactionId = "123456789012345" + processingInformationAuthorizationOptionsInitiatorMerchantInitiatedTransaction = Ptsv2paymentsProcessingInformationAuthorizationOptionsInitiatorMerchantInitiatedTransaction( + reason = processingInformationAuthorizationOptionsInitiatorMerchantInitiatedTransactionReason, + previous_transaction_id = processingInformationAuthorizationOptionsInitiatorMerchantInitiatedTransactionPreviousTransactionId + ) + + processingInformationAuthorizationOptionsInitiator = Ptsv2paymentsProcessingInformationAuthorizationOptionsInitiator( + type = processingInformationAuthorizationOptionsInitiatorType, + stored_credential_used = processingInformationAuthorizationOptionsInitiatorStoredCredentialUsed, + merchant_initiated_transaction = processingInformationAuthorizationOptionsInitiatorMerchantInitiatedTransaction.__dict__ + ) + + processingInformationAuthorizationOptions = Ptsv2paymentsProcessingInformationAuthorizationOptions( + ignore_avs_result = processingInformationAuthorizationOptionsIgnoreAvsResult, + ignore_cv_result = processingInformationAuthorizationOptionsIgnoreCvResult, + initiator = processingInformationAuthorizationOptionsInitiator.__dict__ + ) + + processingInformation = Ptsv2paymentsProcessingInformation( + capture = processingInformationCapture, + commerce_indicator = processingInformationCommerceIndicator, + authorization_options = processingInformationAuthorizationOptions.__dict__ + ) + + paymentInformationCardNumber = "4111111111111111" + paymentInformationCardExpirationMonth = "12" + paymentInformationCardExpirationYear = "2031" + paymentInformationCardType = "001" + paymentInformationCard = Ptsv2paymentsPaymentInformationCard( + number = paymentInformationCardNumber, + expiration_month = paymentInformationCardExpirationMonth, + expiration_year = paymentInformationCardExpirationYear, + type = paymentInformationCardType + ) + + paymentInformation = Ptsv2paymentsPaymentInformation( + card = paymentInformationCard.__dict__ + ) + + orderInformationAmountDetailsTotalAmount = "102.21" + orderInformationAmountDetailsCurrency = "GBP" + orderInformationAmountDetails = Ptsv2paymentsOrderInformationAmountDetails( + total_amount = orderInformationAmountDetailsTotalAmount, + currency = orderInformationAmountDetailsCurrency + ) + + orderInformationBillToFirstName = "John" + orderInformationBillToLastName = "Doe" + orderInformationBillToAddress1 = "1 Market St" + orderInformationBillToLocality = "san francisco" + orderInformationBillToAdministrativeArea = "CA" + orderInformationBillToPostalCode = "94105" + orderInformationBillToCountry = "US" + orderInformationBillToEmail = "test@cybs.com" + orderInformationBillToPhoneNumber = "4158880000" + orderInformationBillTo = Ptsv2paymentsOrderInformationBillTo( + first_name = orderInformationBillToFirstName, + last_name = orderInformationBillToLastName, + address1 = orderInformationBillToAddress1, + locality = orderInformationBillToLocality, + administrative_area = orderInformationBillToAdministrativeArea, + postal_code = orderInformationBillToPostalCode, + country = orderInformationBillToCountry, + email = orderInformationBillToEmail, + phone_number = orderInformationBillToPhoneNumber + ) + + orderInformation = Ptsv2paymentsOrderInformation( + amount_details = orderInformationAmountDetails.__dict__, + bill_to = orderInformationBillTo.__dict__ + ) + + requestObj = CreatePaymentRequest( + client_reference_information = clientReferenceInformation.__dict__, + processing_information = processingInformation.__dict__, + payment_information = paymentInformation.__dict__, + order_information = orderInformation.__dict__ + ) + + + requestObj = del_none(requestObj.__dict__) + requestObj = json.dumps(requestObj) + + + try: + config_obj = configuration.Configuration() + client_config = config_obj.get_configuration() + api_instance = PaymentsApi(client_config) + return_data, status, body = api_instance.create_payment(requestObj) + + print("\nAPI RESPONSE CODE : ", status) + print("\nAPI RESPONSE BODY : ", body) + + write_log_audit(status) + + return return_data + except Exception as e: + write_log_audit(e.status) + print("\nException when calling PaymentsApi->create_payment: %s\n" % e) + +def write_log_audit(status): + print(f"[Sample Code Testing] [{Path(__file__).stem}] {status}") + +if __name__ == "__main__": + mit_industry_practice_resubmission() \ No newline at end of file diff --git a/samples/Payments/Payments/mit-instalment.py b/samples/Payments/Payments/mit-instalment.py new file mode 100644 index 0000000..d503726 --- /dev/null +++ b/samples/Payments/Payments/mit-instalment.py @@ -0,0 +1,137 @@ +from CyberSource import * +import os +import json +from importlib.machinery import SourceFileLoader +from pathlib import Path + +config_file = os.path.join(os.getcwd(), "data", "Configuration.py") +configuration = SourceFileLoader("module.name", config_file).load_module() + +# To delete None values in Input Request Json body +def del_none(d): + for key, value in list(d.items()): + if value is None: + del d[key] + elif isinstance(value, dict): + del_none(value) + elif isinstance(value, list): + for item in value: + del_none(item) + return d + +def mit_instalment(): + clientReferenceInformationCode = "TC50171_3" + clientReferenceInformation = Ptsv2paymentsClientReferenceInformation( + code = clientReferenceInformationCode + ) + + processingInformationCapture = False + processingInformationCommerceIndicator = "install" + processingInformationAuthorizationOptionsIgnoreAvsResult = False + processingInformationAuthorizationOptionsIgnoreCvResult = False + processingInformationAuthorizationOptionsInitiatorType = "merchant" + processingInformationAuthorizationOptionsInitiatorStoredCredentialUsed = True + processingInformationAuthorizationOptionsInitiatorMerchantInitiatedTransactionPreviousTransactionId = "123456789012345" + processingInformationAuthorizationOptionsInitiatorMerchantInitiatedTransaction = Ptsv2paymentsProcessingInformationAuthorizationOptionsInitiatorMerchantInitiatedTransaction( + previous_transaction_id = processingInformationAuthorizationOptionsInitiatorMerchantInitiatedTransactionPreviousTransactionId + ) + + processingInformationAuthorizationOptionsInitiator = Ptsv2paymentsProcessingInformationAuthorizationOptionsInitiator( + type = processingInformationAuthorizationOptionsInitiatorType, + stored_credential_used = processingInformationAuthorizationOptionsInitiatorStoredCredentialUsed, + merchant_initiated_transaction = processingInformationAuthorizationOptionsInitiatorMerchantInitiatedTransaction.__dict__ + ) + + processingInformationAuthorizationOptions = Ptsv2paymentsProcessingInformationAuthorizationOptions( + ignore_avs_result = processingInformationAuthorizationOptionsIgnoreAvsResult, + ignore_cv_result = processingInformationAuthorizationOptionsIgnoreCvResult, + initiator = processingInformationAuthorizationOptionsInitiator.__dict__ + ) + + processingInformation = Ptsv2paymentsProcessingInformation( + capture = processingInformationCapture, + commerce_indicator = processingInformationCommerceIndicator, + authorization_options = processingInformationAuthorizationOptions.__dict__ + ) + + paymentInformationCardNumber = "4111111111111111" + paymentInformationCardExpirationMonth = "12" + paymentInformationCardExpirationYear = "2031" + paymentInformationCardType = "001" + paymentInformationCard = Ptsv2paymentsPaymentInformationCard( + number = paymentInformationCardNumber, + expiration_month = paymentInformationCardExpirationMonth, + expiration_year = paymentInformationCardExpirationYear, + type = paymentInformationCardType + ) + + paymentInformation = Ptsv2paymentsPaymentInformation( + card = paymentInformationCard.__dict__ + ) + + orderInformationAmountDetailsTotalAmount = "102.21" + orderInformationAmountDetailsCurrency = "GBP" + orderInformationAmountDetails = Ptsv2paymentsOrderInformationAmountDetails( + total_amount = orderInformationAmountDetailsTotalAmount, + currency = orderInformationAmountDetailsCurrency + ) + + orderInformationBillToFirstName = "John" + orderInformationBillToLastName = "Doe" + orderInformationBillToAddress1 = "1 Market St" + orderInformationBillToLocality = "san francisco" + orderInformationBillToAdministrativeArea = "CA" + orderInformationBillToPostalCode = "94105" + orderInformationBillToCountry = "US" + orderInformationBillToEmail = "test@cybs.com" + orderInformationBillToPhoneNumber = "4158880000" + orderInformationBillTo = Ptsv2paymentsOrderInformationBillTo( + first_name = orderInformationBillToFirstName, + last_name = orderInformationBillToLastName, + address1 = orderInformationBillToAddress1, + locality = orderInformationBillToLocality, + administrative_area = orderInformationBillToAdministrativeArea, + postal_code = orderInformationBillToPostalCode, + country = orderInformationBillToCountry, + email = orderInformationBillToEmail, + phone_number = orderInformationBillToPhoneNumber + ) + + orderInformation = Ptsv2paymentsOrderInformation( + amount_details = orderInformationAmountDetails.__dict__, + bill_to = orderInformationBillTo.__dict__ + ) + + requestObj = CreatePaymentRequest( + client_reference_information = clientReferenceInformation.__dict__, + processing_information = processingInformation.__dict__, + payment_information = paymentInformation.__dict__, + order_information = orderInformation.__dict__ + ) + + + requestObj = del_none(requestObj.__dict__) + requestObj = json.dumps(requestObj) + + + try: + config_obj = configuration.Configuration() + client_config = config_obj.get_configuration() + api_instance = PaymentsApi(client_config) + return_data, status, body = api_instance.create_payment(requestObj) + + print("\nAPI RESPONSE CODE : ", status) + print("\nAPI RESPONSE BODY : ", body) + + write_log_audit(status) + + return return_data + except Exception as e: + write_log_audit(e.status) + print("\nException when calling PaymentsApi->create_payment: %s\n" % e) + +def write_log_audit(status): + print(f"[Sample Code Testing] [{Path(__file__).stem}] {status}") + +if __name__ == "__main__": + mit_instalment() \ No newline at end of file diff --git a/samples/Payments/Payments/mit-recurring.py b/samples/Payments/Payments/mit-recurring.py new file mode 100644 index 0000000..1219f87 --- /dev/null +++ b/samples/Payments/Payments/mit-recurring.py @@ -0,0 +1,137 @@ +from CyberSource import * +import os +import json +from importlib.machinery import SourceFileLoader +from pathlib import Path + +config_file = os.path.join(os.getcwd(), "data", "Configuration.py") +configuration = SourceFileLoader("module.name", config_file).load_module() + +# To delete None values in Input Request Json body +def del_none(d): + for key, value in list(d.items()): + if value is None: + del d[key] + elif isinstance(value, dict): + del_none(value) + elif isinstance(value, list): + for item in value: + del_none(item) + return d + +def mit_recurring(): + clientReferenceInformationCode = "TC50171_3" + clientReferenceInformation = Ptsv2paymentsClientReferenceInformation( + code = clientReferenceInformationCode + ) + + processingInformationCapture = False + processingInformationCommerceIndicator = "recurring" + processingInformationAuthorizationOptionsIgnoreAvsResult = False + processingInformationAuthorizationOptionsIgnoreCvResult = False + processingInformationAuthorizationOptionsInitiatorType = "merchant" + processingInformationAuthorizationOptionsInitiatorStoredCredentialUsed = True + processingInformationAuthorizationOptionsInitiatorMerchantInitiatedTransactionPreviousTransactionId = "123456789012345" + processingInformationAuthorizationOptionsInitiatorMerchantInitiatedTransaction = Ptsv2paymentsProcessingInformationAuthorizationOptionsInitiatorMerchantInitiatedTransaction( + previous_transaction_id = processingInformationAuthorizationOptionsInitiatorMerchantInitiatedTransactionPreviousTransactionId + ) + + processingInformationAuthorizationOptionsInitiator = Ptsv2paymentsProcessingInformationAuthorizationOptionsInitiator( + type = processingInformationAuthorizationOptionsInitiatorType, + stored_credential_used = processingInformationAuthorizationOptionsInitiatorStoredCredentialUsed, + merchant_initiated_transaction = processingInformationAuthorizationOptionsInitiatorMerchantInitiatedTransaction.__dict__ + ) + + processingInformationAuthorizationOptions = Ptsv2paymentsProcessingInformationAuthorizationOptions( + ignore_avs_result = processingInformationAuthorizationOptionsIgnoreAvsResult, + ignore_cv_result = processingInformationAuthorizationOptionsIgnoreCvResult, + initiator = processingInformationAuthorizationOptionsInitiator.__dict__ + ) + + processingInformation = Ptsv2paymentsProcessingInformation( + capture = processingInformationCapture, + commerce_indicator = processingInformationCommerceIndicator, + authorization_options = processingInformationAuthorizationOptions.__dict__ + ) + + paymentInformationCardNumber = "4111111111111111" + paymentInformationCardExpirationMonth = "12" + paymentInformationCardExpirationYear = "2031" + paymentInformationCardType = "001" + paymentInformationCard = Ptsv2paymentsPaymentInformationCard( + number = paymentInformationCardNumber, + expiration_month = paymentInformationCardExpirationMonth, + expiration_year = paymentInformationCardExpirationYear, + type = paymentInformationCardType + ) + + paymentInformation = Ptsv2paymentsPaymentInformation( + card = paymentInformationCard.__dict__ + ) + + orderInformationAmountDetailsTotalAmount = "102.21" + orderInformationAmountDetailsCurrency = "GBP" + orderInformationAmountDetails = Ptsv2paymentsOrderInformationAmountDetails( + total_amount = orderInformationAmountDetailsTotalAmount, + currency = orderInformationAmountDetailsCurrency + ) + + orderInformationBillToFirstName = "John" + orderInformationBillToLastName = "Doe" + orderInformationBillToAddress1 = "1 Market St" + orderInformationBillToLocality = "san francisco" + orderInformationBillToAdministrativeArea = "CA" + orderInformationBillToPostalCode = "94105" + orderInformationBillToCountry = "US" + orderInformationBillToEmail = "test@cybs.com" + orderInformationBillToPhoneNumber = "4158880000" + orderInformationBillTo = Ptsv2paymentsOrderInformationBillTo( + first_name = orderInformationBillToFirstName, + last_name = orderInformationBillToLastName, + address1 = orderInformationBillToAddress1, + locality = orderInformationBillToLocality, + administrative_area = orderInformationBillToAdministrativeArea, + postal_code = orderInformationBillToPostalCode, + country = orderInformationBillToCountry, + email = orderInformationBillToEmail, + phone_number = orderInformationBillToPhoneNumber + ) + + orderInformation = Ptsv2paymentsOrderInformation( + amount_details = orderInformationAmountDetails.__dict__, + bill_to = orderInformationBillTo.__dict__ + ) + + requestObj = CreatePaymentRequest( + client_reference_information = clientReferenceInformation.__dict__, + processing_information = processingInformation.__dict__, + payment_information = paymentInformation.__dict__, + order_information = orderInformation.__dict__ + ) + + + requestObj = del_none(requestObj.__dict__) + requestObj = json.dumps(requestObj) + + + try: + config_obj = configuration.Configuration() + client_config = config_obj.get_configuration() + api_instance = PaymentsApi(client_config) + return_data, status, body = api_instance.create_payment(requestObj) + + print("\nAPI RESPONSE CODE : ", status) + print("\nAPI RESPONSE BODY : ", body) + + write_log_audit(status) + + return return_data + except Exception as e: + write_log_audit(e.status) + print("\nException when calling PaymentsApi->create_payment: %s\n" % e) + +def write_log_audit(status): + print(f"[Sample Code Testing] [{Path(__file__).stem}] {status}") + +if __name__ == "__main__": + mit_recurring() \ No newline at end of file diff --git a/samples/Payments/Payments/mit-unscheduled-credential-on-file.py b/samples/Payments/Payments/mit-unscheduled-credential-on-file.py new file mode 100644 index 0000000..f19af62 --- /dev/null +++ b/samples/Payments/Payments/mit-unscheduled-credential-on-file.py @@ -0,0 +1,137 @@ +from CyberSource import * +import os +import json +from importlib.machinery import SourceFileLoader +from pathlib import Path + +config_file = os.path.join(os.getcwd(), "data", "Configuration.py") +configuration = SourceFileLoader("module.name", config_file).load_module() + +# To delete None values in Input Request Json body +def del_none(d): + for key, value in list(d.items()): + if value is None: + del d[key] + elif isinstance(value, dict): + del_none(value) + elif isinstance(value, list): + for item in value: + del_none(item) + return d + +def mit_unscheduled_credential_on_file(): + clientReferenceInformationCode = "TC50171_3" + clientReferenceInformation = Ptsv2paymentsClientReferenceInformation( + code = clientReferenceInformationCode + ) + + processingInformationCapture = False + processingInformationCommerceIndicator = "internet" + processingInformationAuthorizationOptionsIgnoreAvsResult = False + processingInformationAuthorizationOptionsIgnoreCvResult = False + processingInformationAuthorizationOptionsInitiatorType = "merchant" + processingInformationAuthorizationOptionsInitiatorStoredCredentialUsed = True + processingInformationAuthorizationOptionsInitiatorMerchantInitiatedTransactionPreviousTransactionId = "123456789012345" + processingInformationAuthorizationOptionsInitiatorMerchantInitiatedTransaction = Ptsv2paymentsProcessingInformationAuthorizationOptionsInitiatorMerchantInitiatedTransaction( + previous_transaction_id = processingInformationAuthorizationOptionsInitiatorMerchantInitiatedTransactionPreviousTransactionId + ) + + processingInformationAuthorizationOptionsInitiator = Ptsv2paymentsProcessingInformationAuthorizationOptionsInitiator( + type = processingInformationAuthorizationOptionsInitiatorType, + stored_credential_used = processingInformationAuthorizationOptionsInitiatorStoredCredentialUsed, + merchant_initiated_transaction = processingInformationAuthorizationOptionsInitiatorMerchantInitiatedTransaction.__dict__ + ) + + processingInformationAuthorizationOptions = Ptsv2paymentsProcessingInformationAuthorizationOptions( + ignore_avs_result = processingInformationAuthorizationOptionsIgnoreAvsResult, + ignore_cv_result = processingInformationAuthorizationOptionsIgnoreCvResult, + initiator = processingInformationAuthorizationOptionsInitiator.__dict__ + ) + + processingInformation = Ptsv2paymentsProcessingInformation( + capture = processingInformationCapture, + commerce_indicator = processingInformationCommerceIndicator, + authorization_options = processingInformationAuthorizationOptions.__dict__ + ) + + paymentInformationCardNumber = "4111111111111111" + paymentInformationCardExpirationMonth = "12" + paymentInformationCardExpirationYear = "2031" + paymentInformationCardType = "001" + paymentInformationCard = Ptsv2paymentsPaymentInformationCard( + number = paymentInformationCardNumber, + expiration_month = paymentInformationCardExpirationMonth, + expiration_year = paymentInformationCardExpirationYear, + type = paymentInformationCardType + ) + + paymentInformation = Ptsv2paymentsPaymentInformation( + card = paymentInformationCard.__dict__ + ) + + orderInformationAmountDetailsTotalAmount = "102.21" + orderInformationAmountDetailsCurrency = "GBP" + orderInformationAmountDetails = Ptsv2paymentsOrderInformationAmountDetails( + total_amount = orderInformationAmountDetailsTotalAmount, + currency = orderInformationAmountDetailsCurrency + ) + + orderInformationBillToFirstName = "John" + orderInformationBillToLastName = "Doe" + orderInformationBillToAddress1 = "1 Market St" + orderInformationBillToLocality = "san francisco" + orderInformationBillToAdministrativeArea = "CA" + orderInformationBillToPostalCode = "94105" + orderInformationBillToCountry = "US" + orderInformationBillToEmail = "test@cybs.com" + orderInformationBillToPhoneNumber = "4158880000" + orderInformationBillTo = Ptsv2paymentsOrderInformationBillTo( + first_name = orderInformationBillToFirstName, + last_name = orderInformationBillToLastName, + address1 = orderInformationBillToAddress1, + locality = orderInformationBillToLocality, + administrative_area = orderInformationBillToAdministrativeArea, + postal_code = orderInformationBillToPostalCode, + country = orderInformationBillToCountry, + email = orderInformationBillToEmail, + phone_number = orderInformationBillToPhoneNumber + ) + + orderInformation = Ptsv2paymentsOrderInformation( + amount_details = orderInformationAmountDetails.__dict__, + bill_to = orderInformationBillTo.__dict__ + ) + + requestObj = CreatePaymentRequest( + client_reference_information = clientReferenceInformation.__dict__, + processing_information = processingInformation.__dict__, + payment_information = paymentInformation.__dict__, + order_information = orderInformation.__dict__ + ) + + + requestObj = del_none(requestObj.__dict__) + requestObj = json.dumps(requestObj) + + + try: + config_obj = configuration.Configuration() + client_config = config_obj.get_configuration() + api_instance = PaymentsApi(client_config) + return_data, status, body = api_instance.create_payment(requestObj) + + print("\nAPI RESPONSE CODE : ", status) + print("\nAPI RESPONSE BODY : ", body) + + write_log_audit(status) + + return return_data + except Exception as e: + write_log_audit(e.status) + print("\nException when calling PaymentsApi->create_payment: %s\n" % e) + +def write_log_audit(status): + print(f"[Sample Code Testing] [{Path(__file__).stem}] {status}") + +if __name__ == "__main__": + mit_unscheduled_credential_on_file() \ No newline at end of file From 93ab4ea8f6c7cb35fb599797c405c2cdd178d8d7 Mon Sep 17 00:00:00 2001 From: mahmishr Date: Wed, 5 Feb 2025 09:39:13 +0530 Subject: [PATCH 21/29] "samples" --- .../generate-capture-context-accept-card.py | 76 +++++++ .../generate-capture-context-accept-check.py | 59 +++++ ...ture-context-for-click-to-pay-dropin-ui.py | 112 ++++++++++ .../UnifiedCheckout/generate-unified-checkout | 82 +++++-- ...ified-checkout-passing-billing-shipping.py | 210 ++++++++++++++++++ 5 files changed, 518 insertions(+), 21 deletions(-) create mode 100644 samples/FlexMicroform/generate-capture-context-accept-card.py create mode 100644 samples/FlexMicroform/generate-capture-context-accept-check.py create mode 100644 samples/UnifiedCheckout/generate-capture-context-for-click-to-pay-dropin-ui.py create mode 100644 samples/UnifiedCheckout/generate-unified-checkout-passing-billing-shipping.py diff --git a/samples/FlexMicroform/generate-capture-context-accept-card.py b/samples/FlexMicroform/generate-capture-context-accept-card.py new file mode 100644 index 0000000..c5566b1 --- /dev/null +++ b/samples/FlexMicroform/generate-capture-context-accept-card.py @@ -0,0 +1,76 @@ +from CyberSource import * +import os +import json +from importlib.machinery import SourceFileLoader +from pathlib import Path + +config_file = os.path.join(os.getcwd(), "data", "Configuration.py") +configuration = SourceFileLoader("module.name", config_file).load_module() + +# To delete None values in Input Request Json body +def del_none(d): + for key, value in list(d.items()): + if value is None: + del d[key] + elif isinstance(value, dict): + del_none(value) + return d + +def generate_capture_context_accept_card(): + clientVersion = "v2" + + targetOrigins = [] + targetOrigins.append("https://www.test.com") + allowedPaymentTypes = [] + allowedPaymentTypes.append("CARD") + + allowedCardNetworks = [] + allowedCardNetworks.append("VISA") + allowedCardNetworks.append("MASTERCARD") + allowedCardNetworks.append("AMEX") + allowedCardNetworks.append("CARNET") + allowedCardNetworks.append("CARTESBANCAIRES") + allowedCardNetworks.append("CUP") + allowedCardNetworks.append("DINERSCLUB") + allowedCardNetworks.append("DISCOVER") + allowedCardNetworks.append("EFTPOS") + allowedCardNetworks.append("ELO") + allowedCardNetworks.append("JCB") + allowedCardNetworks.append("JCREW") + allowedCardNetworks.append("MADA") + allowedCardNetworks.append("MAESTRO") + allowedCardNetworks.append("MEEZA") + requestObj = GenerateCaptureContextRequest( + client_version = clientVersion, + target_origins = targetOrigins, + allowed_card_networks = allowedCardNetworks, + allowed_payment_types=allowedPaymentTypes + + ) + + + requestObj = del_none(requestObj.__dict__) + requestObj = json.dumps(requestObj) + + + try: + config_obj = configuration.Configuration() + client_config = config_obj.get_configuration() + api_instance = MicroformIntegrationApi(client_config) + return_data, status, body = api_instance.generate_capture_context(requestObj) + + print("\nAPI RESPONSE CODE : ", status) + print("\nAPI RESPONSE BODY : ", body) + + write_log_audit(status) + + return return_data + except Exception as e: + write_log_audit(e.status) + print("\nException when calling MicroformIntegrationApi->generate_capture_context: %s\n" % e) + +def write_log_audit(status): + print(f"[Sample Code Testing] [{Path(__file__).stem}] {status}") + +if __name__ == "__main__": + generate_capture_context_accept_card() \ No newline at end of file diff --git a/samples/FlexMicroform/generate-capture-context-accept-check.py b/samples/FlexMicroform/generate-capture-context-accept-check.py new file mode 100644 index 0000000..1138ebb --- /dev/null +++ b/samples/FlexMicroform/generate-capture-context-accept-check.py @@ -0,0 +1,59 @@ +from CyberSource import * +from CyberSource.rest import ApiException +from CyberSource import GenerateCaptureContextRequest +import os +import json +from importlib.machinery import SourceFileLoader +from pathlib import Path + +config_file = os.path.join(os.getcwd(), "data", "Configuration.py") +configuration = SourceFileLoader("module.name", config_file).load_module() + +# To delete None values in Input Request Json body +def del_none(d): + for key, value in list(d.items()): + if value is None: + del d[key] + elif isinstance(value, dict): + del_none(value) + return d + +def generate_capture_context_accept_check(): + clientVersion = "v2" + + targetOrigins = [] + targetOrigins.append("https://www.test.com") + allowedPaymentTypes = [] + allowedPaymentTypes.append("CHECK") + requestObj = GenerateCaptureContextRequest( + client_version = clientVersion, + target_origins = targetOrigins, + allowed_payment_types=allowedPaymentTypes + ) + + + requestObj = del_none(requestObj.__dict__) + requestObj = json.dumps(requestObj) + + + try: + config_obj = configuration.Configuration() + client_config = config_obj.get_configuration() + api_instance = MicroformIntegrationApi(client_config) + return_data, status, body = api_instance.generate_capture_context(requestObj) + + print("\nAPI RESPONSE CODE : ", status) + print("\nAPI RESPONSE BODY : ", body) + + write_log_audit(status) + + return return_data + except Exception as e: + write_log_audit(e.status) + print("\nException when calling MicroformIntegrationApi->generate_capture_context: %s\n" % e) + +def write_log_audit(status): + print(f"[Sample Code Testing] [{Path(__file__).stem}] {status}") + +if __name__ == "__main__": + generate_capture_context_accept_check() \ No newline at end of file diff --git a/samples/UnifiedCheckout/generate-capture-context-for-click-to-pay-dropin-ui.py b/samples/UnifiedCheckout/generate-capture-context-for-click-to-pay-dropin-ui.py new file mode 100644 index 0000000..8a56e8e --- /dev/null +++ b/samples/UnifiedCheckout/generate-capture-context-for-click-to-pay-dropin-ui.py @@ -0,0 +1,112 @@ +from CyberSource import * +from CyberSource.rest import ApiException +from CyberSource.models import Upv1capturecontextsCaptureMandate, Upv1capturecontextsOrderInformationAmountDetails, Upv1capturecontextsOrderInformation, GenerateUnifiedCheckoutCaptureContextRequest +from pathlib import Path +import os +import json +from importlib.machinery import SourceFileLoader + +config_file = os.path.join(os.getcwd(), "data", "Configuration.py") +configuration = SourceFileLoader("module.name", config_file).load_module() + +# To delete None values in Input Request Json body +def del_none(d): + for key, value in list(d.items()): + if value is None: + del d[key] + elif isinstance(value, dict): + del_none(value) + return d + +def generate_unified_checkout_capture_context(): + + clientVersion = "0.23" + + targetOrigins = [] + targetOrigins.append("https://yourCheckoutPage.com") + + allowedCardNetworks = [] + allowedCardNetworks.append("VISA") + allowedCardNetworks.append("MASTERCARD") + allowedCardNetworks.append("AMEX") + allowedCardNetworks.append("CARNET") + allowedCardNetworks.append("CARTESBANCAIRES") + allowedCardNetworks.append("CUP") + allowedCardNetworks.append("DINERSCLUB") + allowedCardNetworks.append("DISCOVER") + allowedCardNetworks.append("EFTPOS") + allowedCardNetworks.append("ELO") + allowedCardNetworks.append("JCB") + allowedCardNetworks.append("JCREW") + allowedCardNetworks.append("MADA") + allowedCardNetworks.append("MAESTRO") + allowedCardNetworks.append("MEEZA") + + allowedPaymentTypes = [] + allowedPaymentTypes.append("CLICKTOPAY") + country = "US" + locale = "en_US" + captureMandateBillingType = "FULL" + captureMandateRequestEmail = True + captureMandateRequestPhone = True + captureMandateRequestShipping = True + + captureMandateShipToCountries = [] + captureMandateShipToCountries.append("US") + captureMandateShipToCountries.append("GB") + captureMandateShowAcceptedNetworkIcons = True + captureMandate = Upv1capturecontextsCaptureMandate( + billing_type = captureMandateBillingType, + request_email = captureMandateRequestEmail, + request_phone = captureMandateRequestPhone, + request_shipping = captureMandateRequestShipping, + ship_to_countries = captureMandateShipToCountries, + show_accepted_network_icons = captureMandateShowAcceptedNetworkIcons + ) + + orderInformationAmountDetailsTotalAmount = "21.00" + orderInformationAmountDetailsCurrency = "USD" + orderInformationAmountDetails = Upv1capturecontextsOrderInformationAmountDetails( + total_amount = orderInformationAmountDetailsTotalAmount, + currency = orderInformationAmountDetailsCurrency + ) + + orderInformation = Upv1capturecontextsOrderInformation( + amount_details = orderInformationAmountDetails.__dict__ + ) + + requestObj = GenerateUnifiedCheckoutCaptureContextRequest( + client_version = clientVersion, + target_origins = targetOrigins, + allowed_card_networks = allowedCardNetworks, + allowed_payment_types = allowedPaymentTypes, + country = country, + locale = locale, + capture_mandate = captureMandate.__dict__, + order_information = orderInformation.__dict__ + ) + + + requestObj = del_none(requestObj.__dict__) + requestObj = json.dumps(requestObj) + + try: + config_obj = configuration.Configuration() + client_config = config_obj.get_configuration() + api_instance = UnifiedCheckoutCaptureContextApi(client_config) + return_data, status, body = api_instance.generate_unified_checkout_capture_context(requestObj) + + print("\nAPI RESPONSE CODE : ", status) + print("\nAPI RESPONSE BODY : ", body) + + write_log_audit(status) + return return_data + except Exception as e: + write_log_audit(e.status if hasattr(e, 'status') else 999) + print("\nException when calling TaxesApi->calculate_tax: %s\n" % e) + +def write_log_audit(status): + print(f"[Sample Code Testing] [{Path(__file__).stem}] {status}") + +if __name__ == "__main__": + generate_unified_checkout_capture_context() diff --git a/samples/UnifiedCheckout/generate-unified-checkout b/samples/UnifiedCheckout/generate-unified-checkout index 16ec7a6..e20a5dc 100644 --- a/samples/UnifiedCheckout/generate-unified-checkout +++ b/samples/UnifiedCheckout/generate-unified-checkout @@ -18,41 +18,81 @@ def del_none(d): def generate_unified_checkout_capture_context(): + clientVersion = "0.23" + + targetOrigins = [] + targetOrigins.append("https://yourCheckoutPage.com") + + allowedCardNetworks = [] + allowedCardNetworks.append("VISA") + allowedCardNetworks.append("MASTERCARD") + allowedCardNetworks.append("AMEX") + allowedCardNetworks.append("CARNET") + allowedCardNetworks.append("CARTESBANCAIRES") + allowedCardNetworks.append("CUP") + allowedCardNetworks.append("DINERSCLUB") + allowedCardNetworks.append("DISCOVER") + allowedCardNetworks.append("EFTPOS") + allowedCardNetworks.append("ELO") + allowedCardNetworks.append("JCB") + allowedCardNetworks.append("JCREW") + allowedCardNetworks.append("MADA") + allowedCardNetworks.append("MAESTRO") + allowedCardNetworks.append("MEEZA") + + allowedPaymentTypes = [] + allowedPaymentTypes.append("APPLEPAY") + allowedPaymentTypes.append("CHECK") + allowedPaymentTypes.append("CLICKTOPAY") + allowedPaymentTypes.append("GOOGLEPAY") + allowedPaymentTypes.append("PANENTRY") + allowedPaymentTypes.append("PAZE") + country = "US" + locale = "en_US" + captureMandateBillingType = "FULL" + captureMandateRequestEmail = True + captureMandateRequestPhone = True + captureMandateRequestShipping = True + + captureMandateShipToCountries = [] + captureMandateShipToCountries.append("US") + captureMandateShipToCountries.append("GB") + captureMandateShowAcceptedNetworkIcons = True captureMandate = Upv1capturecontextsCaptureMandate( - billing_type="FULL", - request_email=True, - request_phone=True, - request_shipping=True, - ship_to_countries=["US","GB"], - show_accepted_network_icons=True + billing_type = captureMandateBillingType, + request_email = captureMandateRequestEmail, + request_phone = captureMandateRequestPhone, + request_shipping = captureMandateRequestShipping, + ship_to_countries = captureMandateShipToCountries, + show_accepted_network_icons = captureMandateShowAcceptedNetworkIcons ) - amountDetails = Upv1capturecontextsOrderInformationAmountDetails( - total_amount="21.00", - currency="USD" + orderInformationAmountDetailsTotalAmount = "21.00" + orderInformationAmountDetailsCurrency = "USD" + orderInformationAmountDetails = Upv1capturecontextsOrderInformationAmountDetails( + total_amount = orderInformationAmountDetailsTotalAmount, + currency = orderInformationAmountDetailsCurrency ) + orderInformation = Upv1capturecontextsOrderInformation( - amount_details=amountDetails.__dict__ + amount_details = orderInformationAmountDetails.__dict__ ) requestObj = GenerateUnifiedCheckoutCaptureContextRequest( - target_origins = ["https://the-up-demo.appspot.com"], - client_version = "0.15", - allowed_card_networks = ["VISA","MASTERCARD","AMEX"], - allowed_payment_types=["PANENTRY","SRC"], - country="US", - locale="en_US", - capture_mandate=captureMandate.__dict__, - order_information=orderInformation.__dict__ + client_version = clientVersion, + target_origins = targetOrigins, + allowed_card_networks = allowedCardNetworks, + allowed_payment_types = allowedPaymentTypes, + country = country, + locale = locale, + capture_mandate = captureMandate.__dict__, + order_information = orderInformation.__dict__ ) - - requestObj = del_none(requestObj.__dict__) requestObj = json.dumps(requestObj) - try: config_obj = configuration.Configuration() client_config = config_obj.get_configuration() diff --git a/samples/UnifiedCheckout/generate-unified-checkout-passing-billing-shipping.py b/samples/UnifiedCheckout/generate-unified-checkout-passing-billing-shipping.py new file mode 100644 index 0000000..25f3575 --- /dev/null +++ b/samples/UnifiedCheckout/generate-unified-checkout-passing-billing-shipping.py @@ -0,0 +1,210 @@ +from CyberSource import * +from CyberSource.rest import ApiException +from pathlib import Path +import os +import json +from importlib.machinery import SourceFileLoader + +config_file = os.path.join(os.getcwd(), "data", "Configuration.py") +configuration = SourceFileLoader("module.name", config_file).load_module() + +# To delete None values in Input Request Json body +def del_none(d): + for key, value in list(d.items()): + if value is None: + del d[key] + elif isinstance(value, dict): + del_none(value) + return d + +def generate_unified_checkout_capture_context(): + + clientVersion = "0.23" + + targetOrigins = [] + targetOrigins.append("https://yourCheckoutPage.com") + + allowedCardNetworks = [] + allowedCardNetworks.append("VISA") + allowedCardNetworks.append("MASTERCARD") + allowedCardNetworks.append("AMEX") + allowedCardNetworks.append("CARNET") + allowedCardNetworks.append("CARTESBANCAIRES") + allowedCardNetworks.append("CUP") + allowedCardNetworks.append("DINERSCLUB") + allowedCardNetworks.append("DISCOVER") + allowedCardNetworks.append("EFTPOS") + allowedCardNetworks.append("ELO") + allowedCardNetworks.append("JCB") + allowedCardNetworks.append("JCREW") + allowedCardNetworks.append("MADA") + allowedCardNetworks.append("MAESTRO") + allowedCardNetworks.append("MEEZA") + + allowedPaymentTypes = [] + allowedPaymentTypes.append("APPLEPAY") + allowedPaymentTypes.append("CHECK") + allowedPaymentTypes.append("CLICKTOPAY") + allowedPaymentTypes.append("GOOGLEPAY") + allowedPaymentTypes.append("PANENTRY") + allowedPaymentTypes.append("PAZE") + country = "US" + locale = "en_US" + captureMandateBillingType = "FULL" + captureMandateRequestEmail = True + captureMandateRequestPhone = True + captureMandateRequestShipping = True + + captureMandateShipToCountries = [] + captureMandateShipToCountries.append("US") + captureMandateShipToCountries.append("GB") + captureMandateShowAcceptedNetworkIcons = True + captureMandate = Upv1capturecontextsCaptureMandate( + billing_type = captureMandateBillingType, + request_email = captureMandateRequestEmail, + request_phone = captureMandateRequestPhone, + request_shipping = captureMandateRequestShipping, + ship_to_countries = captureMandateShipToCountries, + show_accepted_network_icons = captureMandateShowAcceptedNetworkIcons + ) + + orderInformationAmountDetailsTotalAmount = "21.00" + orderInformationAmountDetailsCurrency = "USD" + orderInformationAmountDetails = Upv1capturecontextsOrderInformationAmountDetails( + total_amount = orderInformationAmountDetailsTotalAmount, + currency = orderInformationAmountDetailsCurrency + ) + + orderInformationBillToAddress1 = "277 Park Avenue" + orderInformationBillToAddress2 = "50th Floor" + orderInformationBillToAddress3 = "Desk NY-50110" + orderInformationBillToAddress4 = "address4" + orderInformationBillToAdministrativeArea = "NY" + orderInformationBillToBuildingNumber = "buildingNumber" + orderInformationBillToCountry = "US" + orderInformationBillToDistrict = "district" + orderInformationBillToLocality = "New York" + orderInformationBillToPostalCode = "10172" + orderInformationBillToCompanyName = "Visa Inc" + orderInformationBillToCompanyAddress1 = "900 Metro Center Blvd" + orderInformationBillToCompanyAddress2 = "address2" + orderInformationBillToCompanyAddress3 = "address3" + orderInformationBillToCompanyAddress4 = "address4" + orderInformationBillToCompanyAdministrativeArea = "CA" + orderInformationBillToCompanyBuildingNumber = "1" + orderInformationBillToCompanyCountry = "US" + orderInformationBillToCompanyDistrict = "district" + orderInformationBillToCompanyLocality = "Foster City" + orderInformationBillToCompanyPostalCode = "94404" + orderInformationBillToCompany = Upv1capturecontextsOrderInformationBillToCompany( + name = orderInformationBillToCompanyName, + address1 = orderInformationBillToCompanyAddress1, + address2 = orderInformationBillToCompanyAddress2, + address3 = orderInformationBillToCompanyAddress3, + address4 = orderInformationBillToCompanyAddress4, + administrative_area = orderInformationBillToCompanyAdministrativeArea, + building_number = orderInformationBillToCompanyBuildingNumber, + country = orderInformationBillToCompanyCountry, + district = orderInformationBillToCompanyDistrict, + locality = orderInformationBillToCompanyLocality, + postal_code = orderInformationBillToCompanyPostalCode + ) + + orderInformationBillToEmail = "john.doe@visa.com" + orderInformationBillToFirstName = "John" + orderInformationBillToLastName = "Doe" + orderInformationBillToMiddleName = "F" + orderInformationBillToNameSuffix = "Jr" + orderInformationBillToTitle = "Mr" + orderInformationBillToPhoneNumber = "1234567890" + orderInformationBillToPhoneType = "phoneType" + orderInformationBillTo = Upv1capturecontextsOrderInformationBillTo( + address1 = orderInformationBillToAddress1, + address2 = orderInformationBillToAddress2, + address3 = orderInformationBillToAddress3, + address4 = orderInformationBillToAddress4, + administrative_area = orderInformationBillToAdministrativeArea, + building_number = orderInformationBillToBuildingNumber, + country = orderInformationBillToCountry, + district = orderInformationBillToDistrict, + locality = orderInformationBillToLocality, + postal_code = orderInformationBillToPostalCode, + company = orderInformationBillToCompany.__dict__, + email = orderInformationBillToEmail, + first_name = orderInformationBillToFirstName, + last_name = orderInformationBillToLastName, + middle_name = orderInformationBillToMiddleName, + name_suffix = orderInformationBillToNameSuffix, + title = orderInformationBillToTitle, + phone_number = orderInformationBillToPhoneNumber, + phone_type = orderInformationBillToPhoneType + ) + + orderInformationShipToAddress1 = "CyberSource" + orderInformationShipToAddress2 = "Victoria House" + orderInformationShipToAddress3 = "15-17 Gloucester Street" + orderInformationShipToAddress4 = "string" + orderInformationShipToAdministrativeArea = "CA" + orderInformationShipToBuildingNumber = "string" + orderInformationShipToCountry = "GB" + orderInformationShipToDistrict = "string" + orderInformationShipToLocality = "Belfast" + orderInformationShipToPostalCode = "BT1 4LS" + orderInformationShipToFirstName = "Joe" + orderInformationShipToLastName = "Soap" + orderInformationShipTo = Upv1capturecontextsOrderInformationShipTo( + address1 = orderInformationShipToAddress1, + address2 = orderInformationShipToAddress2, + address3 = orderInformationShipToAddress3, + address4 = orderInformationShipToAddress4, + administrative_area = orderInformationShipToAdministrativeArea, + building_number = orderInformationShipToBuildingNumber, + country = orderInformationShipToCountry, + district = orderInformationShipToDistrict, + locality = orderInformationShipToLocality, + postal_code = orderInformationShipToPostalCode, + first_name = orderInformationShipToFirstName, + last_name = orderInformationShipToLastName + ) + + orderInformation = Upv1capturecontextsOrderInformation( + amount_details = orderInformationAmountDetails.__dict__, + bill_to = orderInformationBillTo.__dict__, + ship_to = orderInformationShipTo.__dict__ + ) + + requestObj = GenerateUnifiedCheckoutCaptureContextRequest( + client_version = clientVersion, + target_origins = targetOrigins, + allowed_card_networks = allowedCardNetworks, + allowed_payment_types = allowedPaymentTypes, + country = country, + locale = locale, + capture_mandate = captureMandate.__dict__, + order_information = orderInformation.__dict__ + ) + + + requestObj = del_none(requestObj.__dict__) + requestObj = json.dumps(requestObj) + + try: + config_obj = configuration.Configuration() + client_config = config_obj.get_configuration() + api_instance = UnifiedCheckoutCaptureContextApi(client_config) + return_data, status, body = api_instance.generate_unified_checkout_capture_context(requestObj) + + print("\nAPI RESPONSE CODE : ", status) + print("\nAPI RESPONSE BODY : ", body) + + write_log_audit(status) + return return_data + except Exception as e: + write_log_audit(e.status if hasattr(e, 'status') else 999) + print("\nException when calling TaxesApi->calculate_tax: %s\n" % e) + +def write_log_audit(status): + print(f"[Sample Code Testing] [{Path(__file__).stem}] {status}") + +if __name__ == "__main__": + generate_unified_checkout_capture_context() From 2014aec8b269d824f524dcf339ba9ba6e9912239 Mon Sep 17 00:00:00 2001 From: Bansal Date: Fri, 7 Feb 2025 15:36:31 +0530 Subject: [PATCH 22/29] mle sample code added --- data/MLEConfiguration.py | 147 ++++++++++++++++++ samples/MLEFeature/PaymentsWithMLE.py | 114 ++++++++++++++ .../PaymentsWithMLEControlFromMAPConfig.py | 115 ++++++++++++++ ...PaymentsWithMLEControlFromMapConfigOnly.py | 115 ++++++++++++++ 4 files changed, 491 insertions(+) create mode 100644 data/MLEConfiguration.py create mode 100644 samples/MLEFeature/PaymentsWithMLE.py create mode 100644 samples/MLEFeature/PaymentsWithMLEControlFromMAPConfig.py create mode 100644 samples/MLEFeature/PaymentsWithMLEControlFromMapConfigOnly.py diff --git a/data/MLEConfiguration.py b/data/MLEConfiguration.py new file mode 100644 index 0000000..54c53e4 --- /dev/null +++ b/data/MLEConfiguration.py @@ -0,0 +1,147 @@ +import os +from CyberSource.logging.log_configuration import LogConfiguration + +class MLEConfiguration: + def __init__(self): + self.authentication_type ="JWT" #for MLE feature auth type should be JWT + self.merchantid = "testrest" + self.run_environment = "apitest.cybersource.com" + + # JWT PARAMETERS + self.key_alias = "testrest" + self.key_pass = "testrest" + self.key_file_name = "testrest" + self.keys_directory = os.path.join(os.getcwd(), "resources") + + # META KEY PARAMETERS + self.use_metakey = False + self.portfolio_id = '' + + # CONNECTION TIMEOUT PARAMETER + self.timeout = 1000 + # LOG PARAMETERS + self.enable_log = True + self.log_file_name = "cybs" + self.log_maximum_size = 10487560 + self.log_directory = os.path.join(os.getcwd(), "Logs") + self.log_level = "Debug" + self.enable_masking = True + self.log_format = "%(asctime)s - %(name)s - %(levelname)s - %(message)s" + self.log_date_format = "%Y-%m-%d %H:%M:%S" + # PROXY PARAMETERS + #self.proxy_address = "userproxy.com" + #self.proxy_port = "" + + # PEM Key file path for decoding JWE Response Enter the folder path where the .pem file is located. + # It is optional property, require adding only during JWE decryption. + self.JWEPemFIleDirectory = os.path.join(os.getcwd(), "resources", "NetworkTokenCert.pem") + + # MLEConfiguration1 + def get_configuration_with_mle_Type1(self): + configuration_dictionary = ({}) + configuration_dictionary["authentication_type"] = self.authentication_type + configuration_dictionary["merchantid"] = self.merchantid + configuration_dictionary["run_environment"] = self.run_environment + configuration_dictionary["key_alias"] = self.key_alias + configuration_dictionary["key_password"] = self.key_pass + configuration_dictionary["key_file_name"] = self.key_file_name + configuration_dictionary["keys_directory"] = self.keys_directory + configuration_dictionary["use_metakey"] = self.use_metakey + configuration_dictionary["portfolio_id"] = self.portfolio_id + configuration_dictionary["timeout"] = self.timeout + configuration_dictionary['jwePEMFileDirectory'] = self.JWEPemFIleDirectory + + # MLE Config Use Type 1 + configuration_dictionary['useMLEGlobally'] = True #globally MLE will be enabled for all the MLE supported APIs by Cybs in SDK + configuration_dictionary['mleKeyAlias'] = "CyberSource_SJC_US" #this is optional paramter, not required to set the parameter if custom value is not required for MLE key alias. Default value is "CyberSource_SJC_US". + + #Log Config + log_config = LogConfiguration() + log_config.set_enable_log(self.enable_log) + log_config.set_log_directory(self.log_directory) + log_config.set_log_file_name(self.log_file_name) + log_config.set_log_maximum_size(self.log_maximum_size) + log_config.set_log_level(self.log_level) + log_config.set_enable_masking(self.enable_masking) + log_config.set_log_format(self.log_format) + log_config.set_log_date_format(self.log_date_format) + configuration_dictionary["log_config"] = log_config + #configuration_dictionary["proxy_address"] = self.proxy_address + #configuration_dictionary["proxy_port"] = self.proxy_port + return configuration_dictionary + + # MLEConfiguration2 + def get_configuration_with_mle_Type2(self): + configuration_dictionary = ({}) + configuration_dictionary["authentication_type"] = self.authentication_type + configuration_dictionary["merchantid"] = self.merchantid + configuration_dictionary["run_environment"] = self.run_environment + configuration_dictionary["key_alias"] = self.key_alias + configuration_dictionary["key_password"] = self.key_pass + configuration_dictionary["key_file_name"] = self.key_file_name + configuration_dictionary["keys_directory"] = self.keys_directory + configuration_dictionary["use_metakey"] = self.use_metakey + configuration_dictionary["portfolio_id"] = self.portfolio_id + configuration_dictionary["timeout"] = self.timeout + configuration_dictionary['jwePEMFileDirectory'] = self.JWEPemFIleDirectory + + # MLE Config Use Type 2 + configuration_dictionary['useMLEGlobally'] = True #globally MLE will be enabled for all the MLE supported APIs by Cybs in SDK + configuration_dictionary['mapToControlMLEonAPI'] = { + "create_payment":False, #only create_payment function will have MLE=false i.e. (/pts/v2/payments POST API) out of all MLE supported APIs + "capture_payment":True #capture_payment function will have MLE=true i.e. (/pts/v2/payments/{id}/captures POST API), if it not in list of MLE supportedAPIs else it will already have MLE=true by global MLE parameter. + } + configuration_dictionary['mleKeyAlias'] = "CyberSource_SJC_US" #this is optional paramter, not required to set the parameter if custom value is not required for MLE key alias. Default value is "CyberSource_SJC_US". + + #Log Config + log_config = LogConfiguration() + log_config.set_enable_log(self.enable_log) + log_config.set_log_directory(self.log_directory) + log_config.set_log_file_name(self.log_file_name) + log_config.set_log_maximum_size(self.log_maximum_size) + log_config.set_log_level(self.log_level) + log_config.set_enable_masking(self.enable_masking) + log_config.set_log_format(self.log_format) + log_config.set_log_date_format(self.log_date_format) + configuration_dictionary["log_config"] = log_config + #configuration_dictionary["proxy_address"] = self.proxy_address + #configuration_dictionary["proxy_port"] = self.proxy_port + return configuration_dictionary + + # MLEConfiguration3 + def get_configuration_with_mle_Type3(self): + configuration_dictionary = ({}) + configuration_dictionary["authentication_type"] = self.authentication_type + configuration_dictionary["merchantid"] = self.merchantid + configuration_dictionary["run_environment"] = self.run_environment + configuration_dictionary["key_alias"] = self.key_alias + configuration_dictionary["key_password"] = self.key_pass + configuration_dictionary["key_file_name"] = self.key_file_name + configuration_dictionary["keys_directory"] = self.keys_directory + configuration_dictionary["use_metakey"] = self.use_metakey + configuration_dictionary["portfolio_id"] = self.portfolio_id + configuration_dictionary["timeout"] = self.timeout + configuration_dictionary['jwePEMFileDirectory'] = self.JWEPemFIleDirectory + + # MLE Config Use Type 3 + configuration_dictionary['useMLEGlobally'] = False #globally MLE will be disabled for all the APIs in SDK + configuration_dictionary['mapToControlMLEonAPI'] ={ + "create_payment":True, #only create_payment function will have MLE=true i.e. (/pts/v2/payments POST API) + "capture_payment":True #only capture_payment function will have MLE=true i.e. (/pts/v2/payments/{id}/captures POST API) + } + configuration_dictionary['mleKeyAlias'] = "CyberSource_SJC_US" #this is optional paramter, not required to set the parameter if custom value is not required for MLE key alias. Default value is "CyberSource_SJC_US". + + #Log Config + log_config = LogConfiguration() + log_config.set_enable_log(self.enable_log) + log_config.set_log_directory(self.log_directory) + log_config.set_log_file_name(self.log_file_name) + log_config.set_log_maximum_size(self.log_maximum_size) + log_config.set_log_level(self.log_level) + log_config.set_enable_masking(self.enable_masking) + log_config.set_log_format(self.log_format) + log_config.set_log_date_format(self.log_date_format) + configuration_dictionary["log_config"] = log_config + #configuration_dictionary["proxy_address"] = self.proxy_address + #configuration_dictionary["proxy_port"] = self.proxy_port + return configuration_dictionary diff --git a/samples/MLEFeature/PaymentsWithMLE.py b/samples/MLEFeature/PaymentsWithMLE.py new file mode 100644 index 0000000..3bd9a62 --- /dev/null +++ b/samples/MLEFeature/PaymentsWithMLE.py @@ -0,0 +1,114 @@ +from CyberSource import * +from pathlib import Path +import os +import json +from importlib.machinery import SourceFileLoader + +config_file = os.path.join(os.getcwd(), "data", "MLEConfiguration.py") +configuration = SourceFileLoader("module.name", config_file).load_module() + +# To delete None values in Input Request Json body +def del_none(d): + for key, value in list(d.items()): + if value is None: + del d[key] + elif isinstance(value, dict): + del_none(value) + return d + +def simple_authorization_internet_with_MLE(flag): + + clientReferenceInformationCode = "TC50171_3" + clientReferenceInformation = Ptsv2paymentsClientReferenceInformation( + code = clientReferenceInformationCode + ) + + processingInformationCapture = False + if flag: + processingInformationCapture = True + + processingInformation = Ptsv2paymentsProcessingInformation( + capture = processingInformationCapture + ) + + paymentInformationCardNumber = "4111111111111111" + paymentInformationCardExpirationMonth = "12" + paymentInformationCardExpirationYear = "2031" + paymentInformationCard = Ptsv2paymentsPaymentInformationCard( + number = paymentInformationCardNumber, + expiration_month = paymentInformationCardExpirationMonth, + expiration_year = paymentInformationCardExpirationYear + ) + + paymentInformation = Ptsv2paymentsPaymentInformation( + card = paymentInformationCard.__dict__ + ) + + orderInformationAmountDetailsTotalAmount = "102.21" + orderInformationAmountDetailsCurrency = "USD" + orderInformationAmountDetails = Ptsv2paymentsOrderInformationAmountDetails( + total_amount = orderInformationAmountDetailsTotalAmount, + currency = orderInformationAmountDetailsCurrency + ) + + orderInformationBillToFirstName = "John" + orderInformationBillToLastName = "Doe" + orderInformationBillToAddress1 = "1 Market St" + orderInformationBillToLocality = "san francisco" + orderInformationBillToAdministrativeArea = "CA" + orderInformationBillToPostalCode = "94105" + orderInformationBillToCountry = "US" + orderInformationBillToEmail = "test@cybs.com" + orderInformationBillToPhoneNumber = "4158880000" + orderInformationBillTo = Ptsv2paymentsOrderInformationBillTo( + first_name = orderInformationBillToFirstName, + last_name = orderInformationBillToLastName, + address1 = orderInformationBillToAddress1, + locality = orderInformationBillToLocality, + administrative_area = orderInformationBillToAdministrativeArea, + postal_code = orderInformationBillToPostalCode, + country = orderInformationBillToCountry, + email = orderInformationBillToEmail, + phone_number = orderInformationBillToPhoneNumber + ) + + orderInformation = Ptsv2paymentsOrderInformation( + amount_details = orderInformationAmountDetails.__dict__, + bill_to = orderInformationBillTo.__dict__ + ) + + requestObj = CreatePaymentRequest( + client_reference_information = clientReferenceInformation.__dict__, + processing_information = processingInformation.__dict__, + payment_information = paymentInformation.__dict__, + order_information = orderInformation.__dict__ + ) + + + requestObj = del_none(requestObj.__dict__) + requestObj = json.dumps(requestObj) + + + try: + config_obj = configuration.MLEConfiguration() + + # add useMLEGlobally=true in config to enable the MLE feature globally in SDK for all supported APIs + client_config = config_obj.get_configuration_with_mle_Type1() + + api_instance = PaymentsApi(client_config) + return_data, status, body = api_instance.create_payment(requestObj) + + print("\nAPI RESPONSE CODE : ", status) + print("\nAPI RESPONSE BODY : ", body) + + write_log_audit(status) + return return_data + except Exception as e: + write_log_audit(e.status if hasattr(e, 'status') else 999) + print("\nException when calling PaymentsApi->create_payment: %s\n" % e) + +def write_log_audit(status): + print(f"[Sample Code Testing] [{Path(__file__).stem}] {status}") + +if __name__ == "__main__": + simple_authorization_internet_with_MLE(False) diff --git a/samples/MLEFeature/PaymentsWithMLEControlFromMAPConfig.py b/samples/MLEFeature/PaymentsWithMLEControlFromMAPConfig.py new file mode 100644 index 0000000..1c2d00b --- /dev/null +++ b/samples/MLEFeature/PaymentsWithMLEControlFromMAPConfig.py @@ -0,0 +1,115 @@ +from CyberSource import * +from pathlib import Path +import os +import json +from importlib.machinery import SourceFileLoader + +config_file = os.path.join(os.getcwd(), "data", "MLEConfiguration.py") +configuration = SourceFileLoader("module.name", config_file).load_module() + +# To delete None values in Input Request Json body +def del_none(d): + for key, value in list(d.items()): + if value is None: + del d[key] + elif isinstance(value, dict): + del_none(value) + return d + +def simple_authorization_internet_with_Map_Control_MLE(flag): + + + clientReferenceInformationCode = "TC50171_3" + clientReferenceInformation = Ptsv2paymentsClientReferenceInformation( + code = clientReferenceInformationCode + ) + + processingInformationCapture = False + if flag: + processingInformationCapture = True + + processingInformation = Ptsv2paymentsProcessingInformation( + capture = processingInformationCapture + ) + + paymentInformationCardNumber = "4111111111111111" + paymentInformationCardExpirationMonth = "12" + paymentInformationCardExpirationYear = "2031" + paymentInformationCard = Ptsv2paymentsPaymentInformationCard( + number = paymentInformationCardNumber, + expiration_month = paymentInformationCardExpirationMonth, + expiration_year = paymentInformationCardExpirationYear + ) + + paymentInformation = Ptsv2paymentsPaymentInformation( + card = paymentInformationCard.__dict__ + ) + + orderInformationAmountDetailsTotalAmount = "102.21" + orderInformationAmountDetailsCurrency = "USD" + orderInformationAmountDetails = Ptsv2paymentsOrderInformationAmountDetails( + total_amount = orderInformationAmountDetailsTotalAmount, + currency = orderInformationAmountDetailsCurrency + ) + + orderInformationBillToFirstName = "John" + orderInformationBillToLastName = "Doe" + orderInformationBillToAddress1 = "1 Market St" + orderInformationBillToLocality = "san francisco" + orderInformationBillToAdministrativeArea = "CA" + orderInformationBillToPostalCode = "94105" + orderInformationBillToCountry = "US" + orderInformationBillToEmail = "test@cybs.com" + orderInformationBillToPhoneNumber = "4158880000" + orderInformationBillTo = Ptsv2paymentsOrderInformationBillTo( + first_name = orderInformationBillToFirstName, + last_name = orderInformationBillToLastName, + address1 = orderInformationBillToAddress1, + locality = orderInformationBillToLocality, + administrative_area = orderInformationBillToAdministrativeArea, + postal_code = orderInformationBillToPostalCode, + country = orderInformationBillToCountry, + email = orderInformationBillToEmail, + phone_number = orderInformationBillToPhoneNumber + ) + + orderInformation = Ptsv2paymentsOrderInformation( + amount_details = orderInformationAmountDetails.__dict__, + bill_to = orderInformationBillTo.__dict__ + ) + + requestObj = CreatePaymentRequest( + client_reference_information = clientReferenceInformation.__dict__, + processing_information = processingInformation.__dict__, + payment_information = paymentInformation.__dict__, + order_information = orderInformation.__dict__ + ) + + + requestObj = del_none(requestObj.__dict__) + requestObj = json.dumps(requestObj) + + + try: + config_obj = configuration.MLEConfiguration() + + # useMLEGlobally=true in config, but mapToControlMLEonAPI has create_payment=false, so MLE will be disabled only for create_payment function/method. + client_config = config_obj.get_configuration_with_mle_Type2() + + api_instance = PaymentsApi(client_config) + return_data, status, body = api_instance.create_payment(requestObj) + + print("\nAPI RESPONSE CODE : ", status) + print("\nAPI RESPONSE BODY : ", body) + + write_log_audit(status) + return return_data + except Exception as e: + write_log_audit(e.status if hasattr(e, 'status') else 999) + print("\nException when calling PaymentsApi->create_payment: %s\n" % e) + +def write_log_audit(status): + print(f"[Sample Code Testing] [{Path(__file__).stem}] {status}") + +if __name__ == "__main__": + simple_authorization_internet_with_Map_Control_MLE(False) diff --git a/samples/MLEFeature/PaymentsWithMLEControlFromMapConfigOnly.py b/samples/MLEFeature/PaymentsWithMLEControlFromMapConfigOnly.py new file mode 100644 index 0000000..16f6281 --- /dev/null +++ b/samples/MLEFeature/PaymentsWithMLEControlFromMapConfigOnly.py @@ -0,0 +1,115 @@ +from CyberSource import * +from pathlib import Path +import os +import json +from importlib.machinery import SourceFileLoader + +config_file = os.path.join(os.getcwd(), "data", "MLEConfiguration.py") +configuration = SourceFileLoader("module.name", config_file).load_module() + +# To delete None values in Input Request Json body +def del_none(d): + for key, value in list(d.items()): + if value is None: + del d[key] + elif isinstance(value, dict): + del_none(value) + return d + +def simple_authorization_internet_with_Only_Map_Control_MLE(flag): + + + clientReferenceInformationCode = "TC50171_3" + clientReferenceInformation = Ptsv2paymentsClientReferenceInformation( + code = clientReferenceInformationCode + ) + + processingInformationCapture = False + if flag: + processingInformationCapture = True + + processingInformation = Ptsv2paymentsProcessingInformation( + capture = processingInformationCapture + ) + + paymentInformationCardNumber = "4111111111111111" + paymentInformationCardExpirationMonth = "12" + paymentInformationCardExpirationYear = "2031" + paymentInformationCard = Ptsv2paymentsPaymentInformationCard( + number = paymentInformationCardNumber, + expiration_month = paymentInformationCardExpirationMonth, + expiration_year = paymentInformationCardExpirationYear + ) + + paymentInformation = Ptsv2paymentsPaymentInformation( + card = paymentInformationCard.__dict__ + ) + + orderInformationAmountDetailsTotalAmount = "102.21" + orderInformationAmountDetailsCurrency = "USD" + orderInformationAmountDetails = Ptsv2paymentsOrderInformationAmountDetails( + total_amount = orderInformationAmountDetailsTotalAmount, + currency = orderInformationAmountDetailsCurrency + ) + + orderInformationBillToFirstName = "John" + orderInformationBillToLastName = "Doe" + orderInformationBillToAddress1 = "1 Market St" + orderInformationBillToLocality = "san francisco" + orderInformationBillToAdministrativeArea = "CA" + orderInformationBillToPostalCode = "94105" + orderInformationBillToCountry = "US" + orderInformationBillToEmail = "test@cybs.com" + orderInformationBillToPhoneNumber = "4158880000" + orderInformationBillTo = Ptsv2paymentsOrderInformationBillTo( + first_name = orderInformationBillToFirstName, + last_name = orderInformationBillToLastName, + address1 = orderInformationBillToAddress1, + locality = orderInformationBillToLocality, + administrative_area = orderInformationBillToAdministrativeArea, + postal_code = orderInformationBillToPostalCode, + country = orderInformationBillToCountry, + email = orderInformationBillToEmail, + phone_number = orderInformationBillToPhoneNumber + ) + + orderInformation = Ptsv2paymentsOrderInformation( + amount_details = orderInformationAmountDetails.__dict__, + bill_to = orderInformationBillTo.__dict__ + ) + + requestObj = CreatePaymentRequest( + client_reference_information = clientReferenceInformation.__dict__, + processing_information = processingInformation.__dict__, + payment_information = paymentInformation.__dict__, + order_information = orderInformation.__dict__ + ) + + + requestObj = del_none(requestObj.__dict__) + requestObj = json.dumps(requestObj) + + + try: + config_obj = configuration.MLEConfiguration() + + # useMLEGlobally=false in config, but mapToControlMLEonAPI has create_payment=true, so MLE will be enabled only for create_payment function/method. + client_config = config_obj.get_configuration_with_mle_Type3() + + api_instance = PaymentsApi(client_config) + return_data, status, body = api_instance.create_payment(requestObj) + + print("\nAPI RESPONSE CODE : ", status) + print("\nAPI RESPONSE BODY : ", body) + + write_log_audit(status) + return return_data + except Exception as e: + write_log_audit(e.status if hasattr(e, 'status') else 999) + print("\nException when calling PaymentsApi->create_payment: %s\n" % e) + +def write_log_audit(status): + print(f"[Sample Code Testing] [{Path(__file__).stem}] {status}") + +if __name__ == "__main__": + simple_authorization_internet_with_Only_Map_Control_MLE(False) From 500c4ddbbefc3661ae03755d85ead7151c3c5e7b Mon Sep 17 00:00:00 2001 From: gnongsie Date: Mon, 24 Mar 2025 16:19:36 +0530 Subject: [PATCH 23/29] Update to SDK v0.0.63 --- data/Configuration.py | 4 ++- resources/NetworkTokenCert.pem | 31 +++++++++++++++++-- .../Subscriptions/create-subscription.py | 2 +- .../get-chargeback-details.py | 4 +-- .../get-chargeback-summaries.py | 4 +-- .../get-conversion-detail-transactions.py | 4 +-- ...ring-level-data-for-account-or-merchant.py | 4 +-- ...ing-information-for-account-or-merchant.py | 4 +-- .../get-notification-of-changes.py | 4 +-- .../get-payment-batch-summary-data.py | 4 +-- .../get-purchase-and-refund-details.py | 4 +-- .../Reporting/Reports/create-adhoc-report.py | 4 +-- .../Reports/retrieve-available-reports.py | 4 +-- .../RetrievalDetails/get-retrieval-details.py | 4 +-- .../get-retrieval-summaries.py | 4 +-- samples/SecureFileShare/get-list-of-files.py | 4 +-- samples/networkToken/NetworkToken.py | 15 ++++++++- 17 files changed, 72 insertions(+), 32 deletions(-) diff --git a/data/Configuration.py b/data/Configuration.py index 33c1fe3..b134a13 100644 --- a/data/Configuration.py +++ b/data/Configuration.py @@ -35,9 +35,10 @@ def __init__(self): self.log_maximum_size = 10487560 self.log_directory = os.path.join(os.getcwd(), "Logs") self.log_level = "Debug" - self.enable_masking = False + self.enable_masking = True self.log_format = "%(asctime)s - %(name)s - %(levelname)s - %(message)s" self.log_date_format = "%Y-%m-%d %H:%M:%S" + self.useMLEGlobally = False # PROXY PARAMETERS #self.proxy_address = "userproxy.com" #self.proxy_port = "" @@ -72,6 +73,7 @@ def get_configuration(self): configuration_dictionary["timeout"] = self.timeout configuration_dictionary['defaultDeveloperId'] = self.defaultDeveloperId configuration_dictionary['jwePEMFileDirectory'] = self.JWEPemFIleDirectory + configuration_dictionary['useMLEGlobally'] = self.useMLEGlobally log_config = LogConfiguration() log_config.set_enable_log(self.enable_log) log_config.set_log_directory(self.log_directory) diff --git a/resources/NetworkTokenCert.pem b/resources/NetworkTokenCert.pem index 98f6e3f..0b7e396 100644 --- a/resources/NetworkTokenCert.pem +++ b/resources/NetworkTokenCert.pem @@ -1,3 +1,28 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEpAIBAAKCAQEA2tNGgpyJKgviPHjuNmcF+5tPjFsxBKebsto9swyebVcJVYu5Mp4Yz8VnhPbEdkyzckTtAulXQYA82iPYG/BHEbChR/PHwO3yCsbTDDNQlkB0R5c5Py/Ts4BSLvIwkbJEvd/SQxTPaPOOYjqbqSfzJ4oKsCGzW+K94UnZic8b5II8CrKlLZLZSO2RoURFg+4htjXhikBJXqJdDhneZCgnMxbWU8MKbdXXJUIDZq0jMkNUNOi1xdzLHhZQl464kD+VocTUS06Ky8h/FBU6xRJciLQW7/VieqzVxG5MGxwcSNfbiozG7aHw+Nt4Awkt6N2VpcxL6AmOXoKRH5om1yCNhwIDAQABAoIBAQCky1WfiVl288ol9oCXMdD8ogMvVYG92qfT8q1iiQ9KkrBx3y7SouNWnXiPVvOvj6XYWXYQqj/PEU9CjJn0uGgdN2LOeBWoAso0OXW5C3AWJ2YqgAVZw5/v36SEvFm9b357a/LCGAr3I+zHpxGRO4fP8BKKgGa9vS14W5BbS0DbPZ9/QvzRfinw6l+/l2mnPihB8KyvABtsiBv0ylh525JY3SFp7bx9qLePjYXMR9u8P+LhD4CPvps5htj1E/JSV3nysNYUP7qc3m4OPhrT46ly2vIMVYDWrHw7i9CGf4XVtZuJ0jRSaG/FaS/ggvy4wzeBkjWkfx+PROG1RYLBWuBJAoGBAP/GwOWn4UgDFqc6W3qhZU4j1uHzsYuFCaagof151dV3YdTBOSVx40zq3sWxNkgFhAAJLF7RywYslWW8UEEsLjjdjMjofJBEYIS3I3wUGpU85x//SUwlf1cO5rIg+hehU+m/dgSPFwh/jaBxBb1u9wX5B18N/3kGbwBcchs9mJxtAoGBANsEQHGLf3RYUZ/HMB3QpVNwYbE904CVhU+foRuiog0o9jBJEgnQeuMcDd4sEenhDobuI5+W8VdFSD4h9n2fwoUStqx5uLAenWH/zquuaH+q1/Nz/IO78GoUoaerPV32HZWv5oPafYO6sMPt2TDVhcWmpnDMQkx/54iuKfLigfFDAoGBAOVNyC2bniozKqHtfYmpG+s70i9rjCZqtMY/iDp4ea4QgxJ7z8G0InUYs3NEdkeHOlnV34N6TatRWPaGJuTmuOGeLdMIKnQj+OvCS/u3AkX8/a//7DRqAYmJAGV9jviUV2hdj25y4dFqmQvXh6/WxXsDUQp0wC4+CFGoj1vAkwrZAoGANBtG2by+jgeVI9ZX9D/3lWpfU7PJ5gWsuczYn6KJu2fLaqF30S3wjqfWBM2nVWVd92wgvY9Dy+eH0IB0DF8+ADr7iv1Km1wtRWt+2AmegwE6b4lgwlasVBCkhSeQahJr53j59tS8l+KKu5KS4bNrKCMF5kAyZdDoXPRStp59G9ECgYB2lLPPN/OsecBnl5ye9vuBpw6VUlsxUk3UGlDIKZTx46UJm1RCVCis0O434s49nHATzylyaT2ED77HdvOQSx9eqh3+goS+xs3DPBry477TwiP1Cvo/+7neIrS7uO7B6fHBWze7jk59JD7Rs5wANMfErmv8bX1LPoXq43i2ZQGBNA== ------END RSA PRIVATE KEY----- +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC4aEj4mUxdBAea +YVtGmuJ1e4+QNj80t/K5kYP2xKc576t5V08Z643O6T+kNYoFRRBADhs0yPfBM0rK +p+f8y6EiMTI/IjlB99OS16CXgprQKYoFAV8xUvUntbkOkCpyn157l05XLgnnIP+P +Y1Y7/vlcq/ODpZPj6l4kKyeQwx3OQ8fQ1zsSPJ0SYhKu+M+oVGGH2ybEUaIBirWC +v3XA/x32lz6AIyRF+IDqthBTTurWtwiYBWm6xJuTw8zZT+etm8bSNbRFnTNIkEtt +DglA5qCeKQWKM6vgFO9+cnUaV7egT9rbS/DyxJXGP3yfJbWwaaWs5xRZHrlJUioB +XSN/jOzVAgMBAAECggEAB++xCEXss+oa+6lp+LlsupqlPJMhGD88aoEZOVMQUV1/ +tzqrNFXfZgLC0unc9UoaH2+b+yMVCpMPCna8dLQ8zJBqda4e4bhtOhoelravu/q1 +rm53LtO/qkRXYQmSUhmKwu3pmLXqBjD03rJrQSzBhZv+4HENUtdA0vSqgL/s9fYB +BQHnq1wYPSHGonMdQCOBh2JeLqoJVnrU3tdrfu9gppS0a/olKN5s5+5jO4tf3wWH +DeDUDwIN7+vw/pzYOzTTJOs/hWIbxzr4wxYhG2RRBbKwyrbBRwS7GMSQfPA+BuYW +ZF9fPUP7L8SMwME/cIQ4ZKQVyun+5QDQvDSWxG7hIQKBgQDwSvIyRjuTlVP9zkWR +ihyYW6I5BQivnd5kjEHFWYoH/XXwEJTk/lB8hFVJx02S0iBxxQW+3AUF52ejKWVq +7AI6khhooBcc0iImh0Dm2qy912N0SLn29lfz8Lgb47lvCOvvgUUZqZDuugYPhCaU +zbRBEaXXXzZq64JvI0GNDjM2hQKBgQDEdidphv/ZItWOhsaaRBav56jVsRscXcIR +Xe+Fnz5NTDE8OJeJwCNLkmrV5GZTlHVc1aQ6eUOPgOUiJhr4MNN4CIf+fDbhpw6d +m8sHfGEmKt18Ei7fXaSlvICNz5SHkZ3M52nDfKUcp8W+2zB8iIUdXokhHJk4/drT +sI9nsoF2EQKBgAGmYhdaSBpxUgxSGEQxkJSzPF/r2u1pxhcmp2T1gm8fnGmzk3In +FOJl/jfteGjjrHlbgviWhipONnX2WM3tJO7GBgjh4IbAIp/lGdr78We0TOiFf1Fk +y6HPK1R1sdZDV2tjldfhRC9/c38zxxgKeYxg1KSv8K23REQDF/Yh/NQJAoGBAMLq +Ks4S5zGJ0vEWHGKfXRbmsuZYUXqCNvG+Dc63oDtWdZ620voTC7GFscNGWJNhvlL9 +j3OILhRpIGwR/D3zS0tSw4IjwNt+QAz0raleqJAShS38aE6p/JmGfNC1ezpJqZLK +oW8W8kWM2q8xjlhvpgnuagTU99vIWFwgVxbdzn3RAoGBANmfExNfl/WhPby8BRCU +OAt39sWZbm5j6USdUcnENs7XQ6vRLLFbPn1oUJiw8YSFn0QSmZXAHYPmLBoSKo9N +xXrEdoDF22Exktb9/Htq/Iw0V+2xmKss7OCYOZS8erNPQ9BgqMmQC7faoEgDiGOS +MMtHbJvYmrSvZgBF1E3snHE+ +-----END PRIVATE KEY----- diff --git a/samples/RecurringBillingSubscriptions/Subscriptions/create-subscription.py b/samples/RecurringBillingSubscriptions/Subscriptions/create-subscription.py index dd67810..b0e5153 100644 --- a/samples/RecurringBillingSubscriptions/Subscriptions/create-subscription.py +++ b/samples/RecurringBillingSubscriptions/Subscriptions/create-subscription.py @@ -51,7 +51,7 @@ def create_subscription(): subscriptionInformationPlanId = "6868912495476705603955" subscriptionInformationName = "Subscription with PlanId" - subscriptionInformationStartDate = "2024-06-11" + subscriptionInformationStartDate = "2025-06-11" subscriptionInformation = Rbsv1subscriptionsSubscriptionInformation( plan_id = subscriptionInformationPlanId, name = subscriptionInformationName, diff --git a/samples/Reporting/ChargebackDetails/get-chargeback-details.py b/samples/Reporting/ChargebackDetails/get-chargeback-details.py index 1f3cccb..31a668b 100644 --- a/samples/Reporting/ChargebackDetails/get-chargeback-details.py +++ b/samples/Reporting/ChargebackDetails/get-chargeback-details.py @@ -19,8 +19,8 @@ def del_none(d): def get_chargeback_details(): # QUERY PARAMETERS organization_id = "testrest" - start_time = "2021-08-01T00:00:00Z" - end_time = "2021-09-01T23:59:59Z" + start_time = "2024-08-01T00:00:00Z" + end_time = "2024-09-01T23:59:59Z" try: config_obj = configuration.Configuration() diff --git a/samples/Reporting/ChargebackSummaries/get-chargeback-summaries.py b/samples/Reporting/ChargebackSummaries/get-chargeback-summaries.py index 7f4a5e1..6bde12e 100644 --- a/samples/Reporting/ChargebackSummaries/get-chargeback-summaries.py +++ b/samples/Reporting/ChargebackSummaries/get-chargeback-summaries.py @@ -19,8 +19,8 @@ def del_none(d): def get_chargeback_summaries(): # QUERY PARAMETERS organization_id = "testrest" - start_time = "2021-08-01T00:00:00Z" - end_time = "2021-09-01T23:59:59Z" + start_time = "2024-08-01T00:00:00Z" + end_time = "2024-09-01T23:59:59Z" try: config_obj = configuration.Configuration() diff --git a/samples/Reporting/ConversionDetails/get-conversion-detail-transactions.py b/samples/Reporting/ConversionDetails/get-conversion-detail-transactions.py index 60b0fa9..2f80bf0 100644 --- a/samples/Reporting/ConversionDetails/get-conversion-detail-transactions.py +++ b/samples/Reporting/ConversionDetails/get-conversion-detail-transactions.py @@ -17,8 +17,8 @@ def del_none(d): return d def get_conversion_detail_transactions(): - startTime = "2020-10-21T00:00:00Z" - endTime = "2020-10-21T23:00:00Z" + startTime = "2024-10-21T00:00:00Z" + endTime = "2024-10-21T23:00:00Z" organizationId = "testrest" try: diff --git a/samples/Reporting/InterchangeClearingLevelDetails/interchange-clearing-level-data-for-account-or-merchant.py b/samples/Reporting/InterchangeClearingLevelDetails/interchange-clearing-level-data-for-account-or-merchant.py index 17d9976..5bf5bec 100644 --- a/samples/Reporting/InterchangeClearingLevelDetails/interchange-clearing-level-data-for-account-or-merchant.py +++ b/samples/Reporting/InterchangeClearingLevelDetails/interchange-clearing-level-data-for-account-or-merchant.py @@ -19,8 +19,8 @@ def del_none(d): def interchange_clearing_level_data_for_account_or_merchant(): # QUERY PARAMETERS organization_id = "testrest" - start_time = "2021-08-01T00:00:00Z" - end_time = "2021-09-01T23:59:59Z" + start_time = "2024-08-01T00:00:00Z" + end_time = "2024-09-01T23:59:59Z" try: config_obj = configuration.Configuration() diff --git a/samples/Reporting/NetFundings/get-netfunding-information-for-account-or-merchant.py b/samples/Reporting/NetFundings/get-netfunding-information-for-account-or-merchant.py index 0639c1b..c5edda4 100644 --- a/samples/Reporting/NetFundings/get-netfunding-information-for-account-or-merchant.py +++ b/samples/Reporting/NetFundings/get-netfunding-information-for-account-or-merchant.py @@ -17,8 +17,8 @@ def del_none(d): return d def get_netfunding_information_for_account_or_merchant(): - startTime = "2021-01-01T00:00:00Z" - endTime = "2021-01-02T23:59:59Z" + startTime = "2024-01-01T00:00:00Z" + endTime = "2024-01-02T23:59:59Z" organizationId = "testrest" try: diff --git a/samples/Reporting/NotificationOfChanges/get-notification-of-changes.py b/samples/Reporting/NotificationOfChanges/get-notification-of-changes.py index 212ac77..57b33ca 100644 --- a/samples/Reporting/NotificationOfChanges/get-notification-of-changes.py +++ b/samples/Reporting/NotificationOfChanges/get-notification-of-changes.py @@ -17,8 +17,8 @@ def del_none(d): return d def get_notification_of_changes(): - startTime = "2021-10-01T12:00:00Z" - endTime = "2021-10-10T12:00:00Z" + startTime = "2024-10-01T12:00:00Z" + endTime = "2024-10-10T12:00:00Z" try: config_obj = configuration.Configuration() diff --git a/samples/Reporting/PaymentBatchSummaries/get-payment-batch-summary-data.py b/samples/Reporting/PaymentBatchSummaries/get-payment-batch-summary-data.py index 2913d7c..e39735d 100644 --- a/samples/Reporting/PaymentBatchSummaries/get-payment-batch-summary-data.py +++ b/samples/Reporting/PaymentBatchSummaries/get-payment-batch-summary-data.py @@ -17,8 +17,8 @@ def del_none(d): return d def get_payment_batch_summary_data(): - startTime = "2020-09-01T12:00:00Z" - endTime = "2020-09-30T12:00:00Z" + startTime = "2024-09-01T12:00:00Z" + endTime = "2024-09-30T12:00:00Z" organizationId = "testrest" try: diff --git a/samples/Reporting/PurchaseAndRefundDetails/get-purchase-and-refund-details.py b/samples/Reporting/PurchaseAndRefundDetails/get-purchase-and-refund-details.py index e1a2860..bf092b7 100644 --- a/samples/Reporting/PurchaseAndRefundDetails/get-purchase-and-refund-details.py +++ b/samples/Reporting/PurchaseAndRefundDetails/get-purchase-and-refund-details.py @@ -17,8 +17,8 @@ def del_none(d): return d def get_purchase_and_refund_details(): - startTime = "2021-10-01T12:00:00Z" - endTime = "2021-10-30T12:00:00Z" + startTime = "2024-10-01T12:00:00Z" + endTime = "2024-10-30T12:00:00Z" organizationId = "testrest" paymentSubtype = "VI" viewBy = "requestDate" diff --git a/samples/Reporting/Reports/create-adhoc-report.py b/samples/Reporting/Reports/create-adhoc-report.py index 6328872..a079a83 100644 --- a/samples/Reporting/Reports/create-adhoc-report.py +++ b/samples/Reporting/Reports/create-adhoc-report.py @@ -26,8 +26,8 @@ def create_adhoc_report(): reportMimeType = "application/xml" reportName = "testrest_v2" timezone = "GMT" - reportStartTime = "2021-03-01T17:30:00.000+05:30" - reportEndTime = "2021-03-02T17:30:00.000+05:30" + reportStartTime = "2024-03-01T17:30:00.000+05:30" + reportEndTime = "2024-03-02T17:30:00.000+05:30" reportPreferencesSignedAmounts = True reportPreferencesFieldNameConvention = "SOAPI" reportPreferences = Reportingv3reportsReportPreferences( diff --git a/samples/Reporting/Reports/retrieve-available-reports.py b/samples/Reporting/Reports/retrieve-available-reports.py index 40fa7aa..b1a88ad 100644 --- a/samples/Reporting/Reports/retrieve-available-reports.py +++ b/samples/Reporting/Reports/retrieve-available-reports.py @@ -17,8 +17,8 @@ def del_none(d): return d def retrieve_available_reports(): - startTime = "2021-04-01T00:00:00Z" - endTime = "2021-04-03T23:59:59Z" + startTime = "2024-04-01T00:00:00Z" + endTime = "2024-04-03T23:59:59Z" timeQueryType = "executedTime" reportMimeType = "application/xml" diff --git a/samples/Reporting/RetrievalDetails/get-retrieval-details.py b/samples/Reporting/RetrievalDetails/get-retrieval-details.py index 4b63d1f..b540fbc 100644 --- a/samples/Reporting/RetrievalDetails/get-retrieval-details.py +++ b/samples/Reporting/RetrievalDetails/get-retrieval-details.py @@ -19,8 +19,8 @@ def del_none(d): def get_retrieval_details(): # QUERY PARAMETERS organization_id = "testrest" - start_time = "2021-08-01T00:00:00Z" - end_time = "2021-09-01T23:59:59Z" + start_time = "2024-08-01T00:00:00Z" + end_time = "2024-09-01T23:59:59Z" try: config_obj = configuration.Configuration() diff --git a/samples/Reporting/RetrievalSummaries/get-retrieval-summaries.py b/samples/Reporting/RetrievalSummaries/get-retrieval-summaries.py index 4bd76ab..fe85f1e 100644 --- a/samples/Reporting/RetrievalSummaries/get-retrieval-summaries.py +++ b/samples/Reporting/RetrievalSummaries/get-retrieval-summaries.py @@ -19,8 +19,8 @@ def del_none(d): def get_retrieval_summaries(): # QUERY PARAMETERS organization_id = "testrest" - start_time = "2021-08-01T00:00:00Z" - end_time = "2021-09-01T23:59:59Z" + start_time = "2024-08-01T00:00:00Z" + end_time = "2024-09-01T23:59:59Z" try: config_obj = configuration.Configuration() diff --git a/samples/SecureFileShare/get-list-of-files.py b/samples/SecureFileShare/get-list-of-files.py index cbfe2cf..2446dc5 100644 --- a/samples/SecureFileShare/get-list-of-files.py +++ b/samples/SecureFileShare/get-list-of-files.py @@ -17,8 +17,8 @@ def del_none(d): return d def get_list_of_files(): - startDate = "2020-07-20" - endDate = "2020-07-30" + startDate = "2024-07-20" + endDate = "2024-07-30" organizationId = "testrest" name = None diff --git a/samples/networkToken/NetworkToken.py b/samples/networkToken/NetworkToken.py index 8385469..e507c59 100644 --- a/samples/networkToken/NetworkToken.py +++ b/samples/networkToken/NetworkToken.py @@ -1,5 +1,6 @@ import os from importlib.machinery import SourceFileLoader +from jwcrypto import jwk from CyberSource.utilities.JWEResponse.JWEUtility import JWEUtility from authenticationsdk.core.MerchantConfiguration import MerchantConfiguration @@ -19,6 +20,12 @@ def del_none(d): del_none(value) return d +def get_private_key_from_pem_file(pem_file_path): + with open(pem_file_path, 'r') as pem_file: + cert = pem_file.read() + private_key = jwk.JWK.from_pem(cert.encode('utf-8')) + return private_key + def network_token(): config_obj = configuration.Configuration() client_config = config_obj.get_configuration() @@ -33,7 +40,13 @@ def network_token(): encoded_response = payment_credentials_from_network_token(token_id) #Step-III - decoded_response = JWEUtility.decrypt_jwe_response(encoded_response, merchant_config) + + # The following method JWEUtility.decrypt_jwe_response(encoded_response, merchant_config) has been deprecated. + # decoded_response = JWEUtility.decrypt_jwe_response(encoded_response, merchant_config) + + # Using the new method JWEUtility.decrypt_jwe_response_using_private_key(private_key, encoded_response) instead + private_key = get_private_key_from_pem_file(merchant_config.get_jwePEMFileDirectory()) + decoded_response = JWEUtility.decrypt_jwe_response_using_private_key(private_key, encoded_response) print("Decoded Response") print(decoded_response) From 5ea5faa686591a84f4c531ba7dcdd96aaabbc6f5 Mon Sep 17 00:00:00 2001 From: gnongsie Date: Wed, 7 May 2025 11:23:17 +0530 Subject: [PATCH 24/29] Added disclaimer --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 92f9ef7..ad0ca44 100644 --- a/README.md +++ b/README.md @@ -164,3 +164,7 @@ with the following code: # For PRODUCTION use # self.run_environment = "api.cybersource.com" ``` + +## Disclaimer + +Cybersource may allow Customer to access, use, and/or test a Cybersource product or service that may still be in development or has not been market-tested (“Beta Product”) solely for the purpose of evaluating the functionality or marketability of the Beta Product (a “Beta Evaluation”). Notwithstanding any language to the contrary, the following terms shall apply with respect to Customer’s participation in any Beta Evaluation (and the Beta Product(s)) accessed thereunder): The Parties will enter into a separate form agreement detailing the scope of the Beta Evaluation, requirements, pricing, the length of the beta evaluation period (“Beta Product Form”). Beta Products are not, and may not become, Transaction Services and have not yet been publicly released and are offered for the sole purpose of internal testing and non-commercial evaluation. Customer’s use of the Beta Product shall be solely for the purpose of conducting the Beta Evaluation. Customer accepts all risks arising out of the access and use of the Beta Products. Cybersource may, in its sole discretion, at any time, terminate or discontinue the Beta Evaluation. Customer acknowledges and agrees that any Beta Product may still be in development and that Beta Product is provided “AS IS” and may not perform at the level of a commercially available service, may not operate as expected and may be modified prior to release. CYBERSOURCE SHALL NOT BE RESPONSIBLE OR LIABLE UNDER ANY CONTRACT, TORT (INCLUDING NEGLIGENCE), OR OTHERWISE RELATING TO A BETA PRODUCT OR THE BETA EVALUATION (A) FOR LOSS OR INACCURACY OF DATA OR COST OF PROCUREMENT OF SUBSTITUTE GOODS, SERVICES OR TECHNOLOGY, (B) ANY CLAIM, LOSSES, DAMAGES, OR CAUSE OF ACTION ARISING IN CONNECTION WITH THE BETA PRODUCT; OR (C) FOR ANY INDIRECT, INCIDENTAL OR CONSEQUENTIAL DAMAGES INCLUDING, BUT NOT LIMITED TO, LOSS OF REVENUES AND LOSS OF PROFITS. From 193412131df423e290e1c3a544ac37492b2e8528 Mon Sep 17 00:00:00 2001 From: gnongsie Date: Thu, 8 May 2025 11:19:19 +0530 Subject: [PATCH 25/29] Replaced license with appropriate document --- LICENSE | 21 -------------------- license.txt | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 21 deletions(-) delete mode 100644 LICENSE create mode 100644 license.txt diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 73ea250..0000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2018 CyberSource - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/license.txt b/license.txt new file mode 100644 index 0000000..f264cdf --- /dev/null +++ b/license.txt @@ -0,0 +1,57 @@ + +CyberSource Software Development Kit (SDK) License Agreement +v. July 9, 2014 + +1 +SDK LICENSE AGREEMENT + +This Software Development Kit (“SDK”) License Agreement (“Agreement”) is between you (both the individual downloading the SDK and any legal entity on behalf of which such individual is acting) (“You” or “Your”) and CyberSource Corporation (“CyberSource’). +IT IS IMPORTANT THAT YOU READ CAREFULLY AND UNDERSTAND THIS AGREEMENT. BY CLICKING THE “I ACCEPT” BUTTON OR AN EQUIVALENT INDICATOR OR BY DOWNLOADING, INSTALLING OR USING THE SDK OR THE DOCUMENTATION, YOU AGREE TO BE BOUND BY THIS AGREEMENT. IF YOU DO NOT AGREE TO BE BOUND BY THIS AGREEMENT, YOU WILL NOT BE PERMITTED TO (AND YOU WILL HAVE NO RIGHT TO) DOWNLOAD, INSTALL OR USE THE SDK OR THE DOCUMENTATION. +1. DEFINITIONS +1.1 “Application(s)” means software programs that You develop to operate with the Gateway using components of the Software. +1.2 “Documentation” means the materials made available to You in connection with the Software by or on behalf of CyberSource pursuant to this Agreement. +1.3 “Gateway” means any electronic payment platform maintained and operated by CyberSource and any of its affiliates. +1.4 “Software” means all of the software included in the software development kit made available to You by or on behalf of CyberSource pursuant to this Agreement, including but not limited to sample source code, code snippets, software tools, code libraries, sample applications, Documentation and any upgrades, modified versions, updates, and/or additions thereto, if any, made available to You by or on behalf of CyberSource pursuant to this Agreement. +2. GRANT OF LICENSE; RESTRICTIONS +2.1 Limited License. Subject to and conditioned upon Your compliance with the terms of this Agreement, CyberSource hereby grants to You a limited, revocable, non-exclusive, non-transferable, royalty-free license during the term of this Agreement to: (a) in any country worldwide, use, reproduce, modify, and create derivative works of the components of the Software solely for the purpose of developing, testing and manufacturing Applications; (b) distribute, sell or otherwise provide Your Applications that include components of the Software to Your end users in all countries worldwide; and (c) use the Documentation in connection with the foregoing activities. The license to distribute Applications that include components of the Software as set forth in subsection (b) above includes the right to grant sublicenses to Your end users to use such components of the Software as incorporated into such Applications, subject to the limitations and restrictions set forth in this Agreement. +2.2 Restrictions. You shall not (and shall have no right to): (a) make or distribute copies of the Software or the Documentation, in whole or in part, except as expressly permitted pursuant to Section 2.1; (b) alter or remove any copyright, trademark, trade name or other proprietary notices, legends, symbols or labels appearing on or in the Software or Documentation; (c) sublicense (or purport to sublicense) the Software or the Documentation, in whole or in part, to any third party except as expressly permitted pursuant to Section 2.1; (d) engage in any activity with the Software, including the development or distribution of an Application, that interferes with, disrupts, damages, or accesses in an unauthorized manner the Gateway or platform, servers, or systems of CyberSource, any of its affiliates, or any third party; (e) make any statements that Your Application is “certified” or otherwise endorsed, or that its performance is guaranteed, by CyberSource or any of its affiliates; or (f) otherwise use or exploit the Software or the Documentation for any purpose other than to develop and distribute Applications as expressly permitted by this Agreement. +2.3 Ownership. You shall retain ownership of Your Applications developed in accordance with this Agreement, subject to CyberSource’s ownership of the Software and Documentation (including CyberSource’s ownership of any portion of the Software or Documentation incorporated in Your Applications). You acknowledge and agree that all right, title and interest in and to the Software and Documentation shall, at all times, be and remain the exclusive property of CyberSource and that You do not have or acquire any rights, express or implied, in the Software or Documentation except those rights expressly granted under this Agreement. +2.4 No Support. CyberSource has no obligation to provide support, maintenance, upgrades, modifications or new releases of the Software. +2.5 Open Source Software. You hereby acknowledge that the Software may contain software that is distributed under “open source” +license terms (“Open Source Software”). You shall review the Documentation in order to determine which portions of the Software are Open Source Software and are licensed under such Open Source Software license terms. To the extent any such license requires that CyberSource provide You any rights with respect to such Open Source Software that are inconsistent with the limited rights granted to You in this Agreement, then such rights in the applicable Open Source Software license shall take precedence over the rights and restrictions granted in this Agreement, but solely with respect to such Open Source Software. You acknowledge that the Open Source Software license is solely between You and the applicable licensor of the Open Source Software and that Your use, reproduction and distribution of Open Source Software shall be in compliance with applicable Open Source Software license. You understand and agree that CyberSource is not liable for any loss or damage that You may experience as a result of Your use of Open Source Software and that You will look solely to the licensor of the Open Source Software in the event of any such loss or damage. +2.6 License to CyberSource. In the event You choose to submit any suggestions, feedback or other information or materials related to the Software or Documentation or Your use thereof (collectively, “Feedback”) to CyberSource, You hereby grant to CyberSource a worldwide, non-exclusive, royalty-free, transferable, sublicensable, perpetual and irrevocable license to use and otherwise exploit such Feedback in connection with the Software, Documentation, and other products and services. +2.7 Use. +(a) You represent, warrant and agree to use the Software and write Applications only for purposes permitted by (i) this Agreement; (ii) applicable law and regulation, including, without limitation, the Payment Card Industry Data Security Standard (PCI DSS); and (iii) generally accepted practices or guidelines in the relevant jurisdictions. +(b) You represent, warrant and agree that if You use the Software to develop Applications for general public end users, that You will protect the privacy and legal rights of those users. If the Application receives or stores personal or sensitive information provided by end users, it must do so securely and in compliance with all applicable laws and regulations, including card association regulations. If the Application receives CyberSource account information, the Application may only use that information to access the end user's CyberSource account. +(c) You represent, warrant and agree that You are solely responsible for (and that neither CyberSource nor its affiliates have any responsibility to You or to any third party for): (i) any data, content, or resources that You obtain, transmit or display through the Application; and (ii) any breach of Your obligations under this Agreement, any applicable third party license, or any applicable law or regulation, and for the consequences of any such breach. +3. WARRANTY DISCLAIMER; LIMITATION OF LIABILITY +3.1 Disclaimer. THE SOFTWARE AND THE DOCUMENTATION ARE PROVIDED ON AN “AS IS” AND “AS AVAILABLE” BASIS WITH NO WARRANTY. YOU AGREE THAT YOUR USE OF THE SOFTWARE AND THE DOCUMENTATION IS AT YOUR SOLE RISK AND YOU ARE SOLELY RESPONSIBLE FOR ANY DAMAGE TO YOUR COMPUTER SYSTEM OR OTHER DEVICE OR LOSS OF DATA THAT RESULTS FROM SUCH USE. TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, CYBERSOURCE AND ITS AFFILIATES EXPRESSLY DISCLAIM ALL WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, WITH RESPECT TO THE SOFTWARE AND THE DOCUMENTATION, INCLUDING ALL WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, SATISFACTORY QUALITY, ACCURACY, TITLE AND NON-INFRINGEMENT, AND ANY +CyberSource Software Development Kit (SDK) License Agreement +v. July 9, 2014 + +2 +WARRANTIES THAT MAY ARISE OUT OF COURSE OF PERFORMANCE, COURSE OF DEALING OR USAGE OF TRADE. NEITHER CYBERSOURCE NOR ITS AFFILIATES WARRANT THAT THE FUNCTIONS OR INFORMATION CONTAINED IN THE SOFTWARE OR THE DOCUMENTATION WILL MEET ANY REQUIREMENTS OR NEEDS YOU MAY HAVE, OR THAT THE SOFTWARE OR DOCUMENTATION WILL OPERATE ERROR FREE, OR THAT THE SOFTWARE OR DOCUMENTATION IS COMPATIBLE WITH ANY PARTICULAR OPERATING SYSTEM. +3.2 Limitation of Liability. IN NO EVENT SHALL CYBERSOURCE AND ITS AFFILIATES BE LIABLE FOR ANY INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL OR PUNITIVE DAMAGES, OR DAMAGES FOR LOSS OF PROFITS, REVENUE, BUSINESS, SAVINGS, DATA, USE OR COST OF SUBSTITUTE PROCUREMENT, INCURRED BY YOU OR ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT, EVEN IF CYBERSOURCE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES OR IF SUCH DAMAGES ARE FORESEEABLE. IN NO EVENT SHALL THE ENTIRE LIABILITY OF CYBERSOURCE AND AFFILIATES ARISING FROM OR RELATING TO THIS AGREEMENT OR THE SUBJECT MATTER HEREOF EXCEED ONE HUNDRED U.S. DOLLARS ($100). THE PARTIES ACKNOWLEDGE THAT THE LIMITATIONS OF LIABILITY IN THIS SECTION 3.2 AND IN THE OTHER PROVISIONS OF THIS AGREEMENT AND THE ALLOCATION OF RISK HEREIN ARE AN ESSENTIAL ELEMENT OF THE BARGAIN BETWEEN THE PARTIES, WITHOUT WHICH CYBERSOURCE WOULD NOT HAVE ENTERED INTO THIS AGREEMENT. +4. INDEMNIFICATION +You shall indemnify, hold harmless and, at CyberSource’s request, defend CyberSource and its affiliates and their officers, directors, employees, and agents from and against any claim, suit or proceeding, and any associated liabilities, costs, damages and expenses, including reasonable attorneys’ fees, that arise out of relate to: (i) Your Applications or the use or distribution thereof and Your use or distribution of the Software or the Documentation (or any portion thereof including Open Source Software), including, but not limited to, any allegation that any such Application or any such use or distribution infringes, misappropriates or otherwise violates any intellectual property (including, without limitation, copyright, patent, and trademark), privacy, publicity or other rights of any third party, or has caused the death or injury of any person or damage to any property; (ii) Your alleged or actual breach of this Agreement; (iii) the alleged or actual breach of this Agreement by any party to whom you have provided Your Applications, the Software or the Documentation or (iii) Your alleged or actual violation of or non-compliance with any applicable laws, legislation, policies, rules, regulations or governmental requirements (including, without limitation, any laws, legislation, policies, rules, regulations or governmental requirements related to privacy and data collection). +5. TERMINATION +This Agreement and the licenses granted to you herein are effective until terminated. CyberSource may terminate this Agreement and the licenses granted to You at any time. Upon termination of this Agreement, You shall cease all use of the Software and the Documentation, return to CyberSource or destroy all copies of the Software and Documentation and related materials in Your possession, and so certify to CyberSource. Except for the license to You granted herein, the terms of this Agreement shall survive termination. +6. CONFIDENTIAL INFORMATION +a. You hereby agree (i) to hold CyberSource’s Confidential Information in strict confidence and to take reasonable precautions to protect such Confidential Information (including, without limitation, all precautions You employ with respect to Your own confidential materials), (ii) not to divulge any such Confidential Information to any third person; (iii) not to make any use whatsoever at any time of such Confidential Information except as strictly licensed hereunder, (iv) not to remove or export from the United States or re-export any such Confidential Information or any direct product thereof, except in compliance with, and with all licenses and approvals required under applicable U.S. and foreign export laws and regulations, including, without limitation, those of the U.S. Department of Commerce. +b. “Confidential Information” shall mean any data or information, oral or written, treated as confidential that relates to CyberSource’s past, present, or future research, development or business activities, including without limitation any unannounced products and services, any information relating to services, developments, inventions, processes, plans, financial information, customer data, revenue, transaction volume, forecasts, projections, application programming interfaces, Software and Documentation. +7. General Terms +7.1 Law. This Agreement and all matters arising out of or relating to this Agreement shall be governed by the internal laws of the State of California without giving effect to any choice of law rule. This Agreement shall not be governed by the United Nations Convention on Contracts for the International Sales of Goods, the application of which is expressly excluded. In the event of any controversy, claim or dispute between the parties arising out of or relating to this Agreement, such controversy, claim or dispute shall be resolved in the state or federal courts in Santa Clara County, California, and the parties hereby irrevocably consent to the jurisdiction and venue of such courts. +7.2 Logo License. CyberSource hereby grants to You the right to use, reproduce, publish, perform and display CyberSource logo solely in accordance with the current CyberSource brand guidelines. +7.3 Severability and Waiver. If any provision of this Agreement is held to be illegal, invalid or otherwise unenforceable, such provision shall be enforced to the extent possible consistent with the stated intention of the parties, or, if incapable of such enforcement, shall be deemed to be severed and deleted from this Agreement, while the remainder of this Agreement shall continue in full force and effect. The waiver by either party of any default or breach of this Agreement shall not constitute a waiver of any other or subsequent default or breach. +7.4 No Assignment. You may not assign, sell, transfer, delegate or otherwise dispose of, whether voluntarily or involuntarily, by operation of law or otherwise, this Agreement or any rights or obligations under this Agreement without the prior written consent of CyberSource, which may be withheld in CyberSource’s sole discretion. Any purported assignment, transfer or delegation by You shall be null and void. Subject to the foregoing, this Agreement shall be binding upon and shall inure to the benefit of the parties and their respective successors and assigns. +7.5 Government Rights. If You (or any person or entity to whom you provide the Software or Documentation) are an agency or instrumentality of the United States Government, the Software and Documentation are “commercial computer software” and “commercial computer software documentation,” and pursuant to FAR 12.212 or DFARS 227.7202, and their successors, as applicable, use, reproduction and disclosure of the Software and Documentation are governed by the terms of this Agreement. +7.6 Export Administration. You shall comply fully with all relevant export laws and regulations of the United States, including, without limitation, the U.S. Export Administration Regulations (collectively “Export Controls”). Without limiting the generality of the foregoing, You shall not, and You shall require Your representatives not to, export, direct or transfer the Software or the Documentation, or any direct product thereof, to any destination, person or entity restricted or prohibited by the Export Controls. +7.7 Privacy. In order to continually innovate and improve the Software, Licensee understands and agrees that CyberSource may collect certain usage statistics including but not limited to a unique identifier, associated IP address, version number of software, and information on which tools and/or services in the Software are being used and how they are being used. +7.8 Headings. The headings to the Sections and Subsections of this Agreement are included merely for convenience of reference and shall not affect the meaning of the language included therein. +7.9 Entire Agreement; Amendments. This Agreement constitutes the entire agreement between the parties and supersedes all prior or contemporaneous agreements or representations, written or oral, concerning the subject matter of this Agreement. CyberSource may make changes to this Agreement, Software or Documentation in its sole discretion. When these changes are made, CyberSource will make a new version of the Agreement, Software or Documentation available on the website where the + +CyberSource Software Development Kit (SDK) License Agreement +v. July 9, 2014 +3 +Software is available. This Agreement may not be modified or amended by You except in a writing signed by a duly authorized representative of each party. You acknowledge and agree that CyberSource has not made any representations, warranties or agreements of any kind, except as expressly set forth herein. +BY CLICKING “I ACCEPT,” “I AGREE” OR AN EQUIVALENT INDICATOR OR BY DOWNLOADING, INSTALLING OR USING THE SOFTWARE OR THE DOCUMENTATION, YOU ACKNOWLEDGE AND AGREE THAT (1) YOU HAVE READ AND REVIEWED THIS AGREEMENT IN ITS ENTIRETY, (2) YOU AGREE TO BE BOUND BY THIS AGREEMENT, (3) YOU HAVE THE POWER, AUTHORITY AND LEGAL RIGHT TO ENTER INTO THIS AGREEMENT ON BEHALF OF YOU AND, (4) THIS AGREEMENT CONSTITUTES BINDING AND ENFORCEABLE OBLIGATIONS OF YOU. From 27d5d401fb72135d1880f1bf2ac6dcdb15756fff Mon Sep 17 00:00:00 2001 From: mahmishr Date: Wed, 14 May 2025 09:40:05 +0530 Subject: [PATCH 26/29] samples updated --- .../Invoices/create-and-send-invoice-immediately.py | 6 +++--- samples/Invoicing/Invoices/create-draft-invoice.py | 6 +++--- .../create-invoice-and-assign-it-specific-invoice-number.py | 6 +++--- .../Invoicing/Invoices/create-invoice-without-sending-it.py | 6 +++--- samples/Invoicing/Invoices/update-invoice.py | 6 +++--- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/samples/Invoicing/Invoices/create-and-send-invoice-immediately.py b/samples/Invoicing/Invoices/create-and-send-invoice-immediately.py index 119bf4c..5de6aa1 100644 --- a/samples/Invoicing/Invoices/create-and-send-invoice-immediately.py +++ b/samples/Invoicing/Invoices/create-and-send-invoice-immediately.py @@ -40,9 +40,9 @@ def create_and_send_invoice_immediately(): orderInformationAmountDetailsTotalAmount = "2623.64" orderInformationAmountDetailsCurrency = "USD" orderInformationAmountDetailsDiscountAmount = "126.08" - orderInformationAmountDetailsDiscountPercent = 5.00 - orderInformationAmountDetailsSubAmount = 2749.72 - orderInformationAmountDetailsMinimumPartialAmount = 20.00 + orderInformationAmountDetailsDiscountPercent = "5.00" + orderInformationAmountDetailsSubAmount = "2749.72" + orderInformationAmountDetailsMinimumPartialAmount = "20.00" orderInformationAmountDetailsTaxDetailsType = "State Tax" orderInformationAmountDetailsTaxDetailsAmount = "208.04" orderInformationAmountDetailsTaxDetailsRate = "8.25" diff --git a/samples/Invoicing/Invoices/create-draft-invoice.py b/samples/Invoicing/Invoices/create-draft-invoice.py index f437199..7fe2521 100644 --- a/samples/Invoicing/Invoices/create-draft-invoice.py +++ b/samples/Invoicing/Invoices/create-draft-invoice.py @@ -40,9 +40,9 @@ def create_draft_invoice(): orderInformationAmountDetailsTotalAmount = "2623.64" orderInformationAmountDetailsCurrency = "USD" orderInformationAmountDetailsDiscountAmount = "126.08" - orderInformationAmountDetailsDiscountPercent = 5.00 - orderInformationAmountDetailsSubAmount = 2749.72 - orderInformationAmountDetailsMinimumPartialAmount = 20.00 + orderInformationAmountDetailsDiscountPercent = "5.00" + orderInformationAmountDetailsSubAmount = "2749.72" + orderInformationAmountDetailsMinimumPartialAmount = "20.00" orderInformationAmountDetailsTaxDetailsType = "State Tax" orderInformationAmountDetailsTaxDetailsAmount = "208.00" orderInformationAmountDetailsTaxDetailsRate = "8.25" diff --git a/samples/Invoicing/Invoices/create-invoice-and-assign-it-specific-invoice-number.py b/samples/Invoicing/Invoices/create-invoice-and-assign-it-specific-invoice-number.py index e227725..49be13d 100644 --- a/samples/Invoicing/Invoices/create-invoice-and-assign-it-specific-invoice-number.py +++ b/samples/Invoicing/Invoices/create-invoice-and-assign-it-specific-invoice-number.py @@ -42,9 +42,9 @@ def create_invoice_and_assign_it_specific_invoice_number(): orderInformationAmountDetailsTotalAmount = "2623.64" orderInformationAmountDetailsCurrency = "USD" orderInformationAmountDetailsDiscountAmount = "126.08" - orderInformationAmountDetailsDiscountPercent = 5.00 - orderInformationAmountDetailsSubAmount = 2749.72 - orderInformationAmountDetailsMinimumPartialAmount = 20.00 + orderInformationAmountDetailsDiscountPercent = "5.00" + orderInformationAmountDetailsSubAmount = "2749.72" + orderInformationAmountDetailsMinimumPartialAmount = "20.00" orderInformationAmountDetailsTaxDetailsType = "State Tax" orderInformationAmountDetailsTaxDetailsAmount = "208.04" orderInformationAmountDetailsTaxDetailsRate = "8.25" diff --git a/samples/Invoicing/Invoices/create-invoice-without-sending-it.py b/samples/Invoicing/Invoices/create-invoice-without-sending-it.py index 518bc5f..6f6d4ca 100644 --- a/samples/Invoicing/Invoices/create-invoice-without-sending-it.py +++ b/samples/Invoicing/Invoices/create-invoice-without-sending-it.py @@ -42,9 +42,9 @@ def create_invoice_without_sending_it(): orderInformationAmountDetailsTotalAmount = "2623.64" orderInformationAmountDetailsCurrency = "USD" orderInformationAmountDetailsDiscountAmount = "126.08" - orderInformationAmountDetailsDiscountPercent = 5.00 - orderInformationAmountDetailsSubAmount = 2749.72 - orderInformationAmountDetailsMinimumPartialAmount = 20.00 + orderInformationAmountDetailsDiscountPercent = "5.00" + orderInformationAmountDetailsSubAmount = "2749.72" + orderInformationAmountDetailsMinimumPartialAmount = "20.00" orderInformationAmountDetailsTaxDetailsType = "State Tax" orderInformationAmountDetailsTaxDetailsAmount = "208.04" orderInformationAmountDetailsTaxDetailsRate = "8.25" diff --git a/samples/Invoicing/Invoices/update-invoice.py b/samples/Invoicing/Invoices/update-invoice.py index 73a608e..f3b83d5 100644 --- a/samples/Invoicing/Invoices/update-invoice.py +++ b/samples/Invoicing/Invoices/update-invoice.py @@ -44,9 +44,9 @@ def update_invoice(): orderInformationAmountDetailsTotalAmount = "2623.64" orderInformationAmountDetailsCurrency = "USD" orderInformationAmountDetailsDiscountAmount = "126.08" - orderInformationAmountDetailsDiscountPercent = 5.00 - orderInformationAmountDetailsSubAmount = 2749.72 - orderInformationAmountDetailsMinimumPartialAmount = 20.00 + orderInformationAmountDetailsDiscountPercent = "5.00" + orderInformationAmountDetailsSubAmount = "2749.72" + orderInformationAmountDetailsMinimumPartialAmount = "20.00" orderInformationAmountDetailsTaxDetailsType = "State Tax" orderInformationAmountDetailsTaxDetailsAmount = "208.00" orderInformationAmountDetailsTaxDetailsRate = "8.25" From b20fa6b3fc6b8571b29dd9dc460ab7f9fe6e6ea5 Mon Sep 17 00:00:00 2001 From: mahmishr Date: Mon, 2 Jun 2025 13:26:29 +0530 Subject: [PATCH 27/29] samples updated --- samples/MerchantBoarding/create_registration.py | 6 ------ .../merchant-boarding-amex-direct.py | 5 ----- .../merchant-boarding-barclays.py | 15 --------------- .../merchant-boarding-bin-lookup.py | 5 ----- samples/MerchantBoarding/merchant-boarding-cup.py | 5 ----- .../merchant-boarding-smart-fdc.py | 7 ------- .../MerchantBoarding/merchant-boarding-tsys.py | 12 ------------ 7 files changed, 55 deletions(-) diff --git a/samples/MerchantBoarding/create_registration.py b/samples/MerchantBoarding/create_registration.py index 4b9c3fd..1409ea4 100644 --- a/samples/MerchantBoarding/create_registration.py +++ b/samples/MerchantBoarding/create_registration.py @@ -74,7 +74,6 @@ def create_registration(): configurations=configurations.__dict__ ) payer_authentication = PaymentsProductsPayerAuthentication( - subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation(enabled=True).__dict__, configuration_information=configuration_information.__dict__ ) @@ -125,22 +124,18 @@ def create_registration(): # Virtual Terminal virtual_terminal = PaymentsProductsVirtualTerminal( - subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation(enabled=True).__dict__ ) # Customer Invoicing customer_invoicing = PaymentsProductsTax( - subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation(enabled=True).__dict__ ) # Payouts payouts = PaymentsProductsPayouts( - subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation(enabled=True).__dict__ ) # Commerce Solutions token_management = CommerceSolutionsProductsTokenManagement( - subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation(enabled=True).__dict__ ) commerce_solutions = CommerceSolutionsProducts( token_management=token_management.__dict__ @@ -151,7 +146,6 @@ def create_registration(): template_id="E4EDB280-9DAC-4698-9EB9-9434D40FF60C" ) fraud_management_essentials = RiskProductsFraudManagementEssentials( - subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation(enabled=True).__dict__, configuration_information=configuration_information5.__dict__ ) risk = RiskProducts( diff --git a/samples/MerchantBoarding/merchant-boarding-amex-direct.py b/samples/MerchantBoarding/merchant-boarding-amex-direct.py index 2244707..a91dcce 100644 --- a/samples/MerchantBoarding/merchant-boarding-amex-direct.py +++ b/samples/MerchantBoarding/merchant-boarding-amex-direct.py @@ -138,14 +138,12 @@ def merchant_boarding_amex_direct(): ) virtual_terminal = PaymentsProductsVirtualTerminal( - subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation(enabled=True).__dict__, configuration_information=PaymentsProductsVirtualTerminalConfigurationInformation( template_id=str(uuid.UUID("9FA1BB94-5119-48D3-B2E5-A81FD3C657B5")) ).__dict__ ) customer_invoicing = PaymentsProductsTax( - subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation(enabled=True).__dict__ ) selected_products = Boardingv1registrationsProductInformationSelectedProducts( @@ -157,7 +155,6 @@ def merchant_boarding_amex_direct(): risk=RiskProducts().__dict__, commerce_solutions=CommerceSolutionsProducts( token_management=CommerceSolutionsProductsTokenManagement( - subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation(enabled=True).__dict__, configuration_information=CommerceSolutionsProductsTokenManagementConfigurationInformation( template_id=str(uuid.UUID("D62BEE20-DCFD-4AA2-8723-BA3725958ABA")) ).__dict__ @@ -165,10 +162,8 @@ def merchant_boarding_amex_direct(): ).__dict__, value_added_services=ValueAddedServicesProducts( transaction_search=PaymentsProductsTax( - subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation(enabled=True).__dict__ ).__dict__, reporting=PaymentsProductsTax( - subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation(enabled=True).__dict__ ).__dict__ ).__dict__ ) diff --git a/samples/MerchantBoarding/merchant-boarding-barclays.py b/samples/MerchantBoarding/merchant-boarding-barclays.py index d4725f6..5eeffd2 100644 --- a/samples/MerchantBoarding/merchant-boarding-barclays.py +++ b/samples/MerchantBoarding/merchant-boarding-barclays.py @@ -137,16 +137,10 @@ def merchant_boarding_barclays(): ) virtual_terminal = PaymentsProductsVirtualTerminal( - subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation( - enabled=True - ).__dict__, configuration_information=virtual_terminal_configuration.__dict__ ) customer_invoicing = PaymentsProductsTax( - subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation( - enabled=True - ).__dict__ ) token_management_configuration = CommerceSolutionsProductsTokenManagementConfigurationInformation( @@ -154,22 +148,13 @@ def merchant_boarding_barclays(): ) token_management = CommerceSolutionsProductsTokenManagement( - subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation( - enabled=True - ).__dict__, configuration_information=token_management_configuration.__dict__ ) transaction_search = PaymentsProductsTax( - subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation( - enabled=True - ).__dict__ ) reporting = PaymentsProductsTax( - subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation( - enabled=True - ).__dict__ ) value_added_services = ValueAddedServicesProducts( diff --git a/samples/MerchantBoarding/merchant-boarding-bin-lookup.py b/samples/MerchantBoarding/merchant-boarding-bin-lookup.py index cea70de..0ad6437 100644 --- a/samples/MerchantBoarding/merchant-boarding-bin-lookup.py +++ b/samples/MerchantBoarding/merchant-boarding-bin-lookup.py @@ -63,10 +63,6 @@ def merchant_boarding_bin_lookup(): # Assigning organization information to request object req_obj.organization_information = organization_information.__dict__ - # Subscription Information - subscription_information = PaymentsProductsPayerAuthenticationSubscriptionInformation( - enabled=True - ) # Configurations configurations = CommerceSolutionsProductsBinLookupConfigurationInformationConfigurations( @@ -81,7 +77,6 @@ def merchant_boarding_bin_lookup(): # Bin Lookup bin_lookup = CommerceSolutionsProductsBinLookup( - subscription_information=subscription_information.__dict__, configuration_information=configuration_information.__dict__ ) diff --git a/samples/MerchantBoarding/merchant-boarding-cup.py b/samples/MerchantBoarding/merchant-boarding-cup.py index c546d23..6649a3e 100644 --- a/samples/MerchantBoarding/merchant-boarding-cup.py +++ b/samples/MerchantBoarding/merchant-boarding-cup.py @@ -120,14 +120,12 @@ def merchant_boarding_cup(): ) virtual_terminal = PaymentsProductsVirtualTerminal( - subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation(enabled=True).__dict__, configuration_information=PaymentsProductsVirtualTerminalConfigurationInformation( template_id=str(uuid.UUID("9FA1BB94-5119-48D3-B2E5-A81FD3C657B5")) ).__dict__ ) customer_invoicing = PaymentsProductsTax( - subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation(enabled=True).__dict__ ) payments = PaymentsProducts( @@ -144,7 +142,6 @@ def merchant_boarding_cup(): # Commerce Solutions Product token_management = CommerceSolutionsProductsTokenManagement( - subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation(enabled=True).__dict__, configuration_information=CommerceSolutionsProductsTokenManagementConfigurationInformation( template_id=str(uuid.UUID("9FA1BB94-5119-48D3-B2E5-A81FD3C657B5")) ).__dict__ @@ -158,11 +155,9 @@ def merchant_boarding_cup(): # Value Added Services transaction_search = PaymentsProductsTax( - subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation(enabled=True).__dict__ ) reporting = PaymentsProductsTax( - subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation(enabled=True).__dict__ ) value_added_services = ValueAddedServicesProducts( diff --git a/samples/MerchantBoarding/merchant-boarding-smart-fdc.py b/samples/MerchantBoarding/merchant-boarding-smart-fdc.py index 1bbf91d..6ebb392 100644 --- a/samples/MerchantBoarding/merchant-boarding-smart-fdc.py +++ b/samples/MerchantBoarding/merchant-boarding-smart-fdc.py @@ -104,18 +104,15 @@ def merchant_boarding_smart_fdc(): configuration_information=configuration_info ).__dict__ - virtual_terminal_subscription = PaymentsProductsPayerAuthenticationSubscriptionInformation(enabled=True).__dict__ virtual_terminal_config = PaymentsProductsVirtualTerminalConfigurationInformation( template_id=str(uuid.UUID("9FA1BB94-5119-48D3-B2E5-A81FD3C657B5")) ).__dict__ virtual_terminal = PaymentsProductsVirtualTerminal( - subscription_information=virtual_terminal_subscription, configuration_information=virtual_terminal_config ).__dict__ customer_invoicing = PaymentsProductsTax( - subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation(enabled=True).__dict__ ).__dict__ payments = PaymentsProducts( @@ -124,24 +121,20 @@ def merchant_boarding_smart_fdc(): customer_invoicing=customer_invoicing ).__dict__ - token_management_subscription = PaymentsProductsPayerAuthenticationSubscriptionInformation(enabled=True).__dict__ token_management_config = CommerceSolutionsProductsTokenManagementConfigurationInformation( template_id=str(uuid.UUID("D62BEE20-DCFD-4AA2-8723-BA3725958ABA")) ).__dict__ token_management = CommerceSolutionsProductsTokenManagement( - subscription_information=token_management_subscription, configuration_information=token_management_config ).__dict__ commerce_solutions = CommerceSolutionsProducts(token_management=token_management).__dict__ transaction_search = PaymentsProductsTax( - subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation(enabled=True).__dict__ ).__dict__ reporting = PaymentsProductsTax( - subscription_information=PaymentsProductsPayerAuthenticationSubscriptionInformation(enabled=True).__dict__ ).__dict__ value_added_services = ValueAddedServicesProducts( diff --git a/samples/MerchantBoarding/merchant-boarding-tsys.py b/samples/MerchantBoarding/merchant-boarding-tsys.py index 90d7826..6414566 100644 --- a/samples/MerchantBoarding/merchant-boarding-tsys.py +++ b/samples/MerchantBoarding/merchant-boarding-tsys.py @@ -150,21 +150,15 @@ def merchant_boarding_tsys(): configuration_information=configuration_information ).__dict__ - virtual_terminal_subscription = PaymentsProductsPayerAuthenticationSubscriptionInformation( - enabled=True - ).__dict__ - virtual_terminal_configuration = PaymentsProductsVirtualTerminalConfigurationInformation( template_id=str(uuid.UUID("9FA1BB94-5119-48D3-B2E5-A81FD3C657B5")) ).__dict__ virtual_terminal = PaymentsProductsVirtualTerminal( - subscription_information=virtual_terminal_subscription, configuration_information=virtual_terminal_configuration ).__dict__ customer_invoicing = PaymentsProductsTax( - subscription_information=virtual_terminal_subscription ).__dict__ payments = PaymentsProducts( @@ -175,16 +169,12 @@ def merchant_boarding_tsys(): risk = RiskProducts().__dict__ - token_management_subscription = PaymentsProductsPayerAuthenticationSubscriptionInformation( - enabled=True - ).__dict__ token_management_configuration = CommerceSolutionsProductsTokenManagementConfigurationInformation( template_id=str(uuid.UUID("D62BEE20-DCFD-4AA2-8723-BA3725958ABA")) ).__dict__ token_management = CommerceSolutionsProductsTokenManagement( - subscription_information=token_management_subscription, configuration_information=token_management_configuration ).__dict__ @@ -193,11 +183,9 @@ def merchant_boarding_tsys(): ).__dict__ transaction_search = PaymentsProductsTax( - subscription_information=virtual_terminal_subscription ).__dict__ reporting = PaymentsProductsTax( - subscription_information=virtual_terminal_subscription ).__dict__ value_added_services = ValueAddedServicesProducts( From f680ab60586d47e077357592f93fe672be2ac9ff Mon Sep 17 00:00:00 2001 From: mahmishr Date: Mon, 2 Jun 2025 13:36:25 +0530 Subject: [PATCH 28/29] samples updated --- .../Subscriptions/create-subscription.py | 2 +- .../Subscriptions/update-subscription.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/RecurringBillingSubscriptions/Subscriptions/create-subscription.py b/samples/RecurringBillingSubscriptions/Subscriptions/create-subscription.py index b0e5153..4cc05fd 100644 --- a/samples/RecurringBillingSubscriptions/Subscriptions/create-subscription.py +++ b/samples/RecurringBillingSubscriptions/Subscriptions/create-subscription.py @@ -20,7 +20,7 @@ def create_subscription(): clientReferenceInformationCode = "TC501713" clientReferenceInformationPartnerDeveloperId = "ABCD1234" clientReferenceInformationPartnerSolutionId = "GEF1234" - clientReferenceInformationPartner = Riskv1decisionsClientReferenceInformationPartner( + clientReferenceInformationPartner = Rbsv1subscriptionsClientReferenceInformationPartner( developer_id = clientReferenceInformationPartnerDeveloperId, solution_id = clientReferenceInformationPartnerSolutionId ) diff --git a/samples/RecurringBillingSubscriptions/Subscriptions/update-subscription.py b/samples/RecurringBillingSubscriptions/Subscriptions/update-subscription.py index 51bbaf2..d452bfe 100644 --- a/samples/RecurringBillingSubscriptions/Subscriptions/update-subscription.py +++ b/samples/RecurringBillingSubscriptions/Subscriptions/update-subscription.py @@ -23,7 +23,7 @@ def update_subscription(): clientReferenceInformationCode = "APGHU" clientReferenceInformationPartnerDeveloperId = "ABCD1234" clientReferenceInformationPartnerSolutionId = "GEF1234" - clientReferenceInformationPartner = Riskv1decisionsClientReferenceInformationPartner( + clientReferenceInformationPartner = Rbsv1subscriptionsClientReferenceInformationPartner( developer_id = clientReferenceInformationPartnerDeveloperId, solution_id = clientReferenceInformationPartnerSolutionId ) From 6d3f0f2005d2cb5fb88f62c6efe64ba85d905b36 Mon Sep 17 00:00:00 2001 From: mahmishr Date: Wed, 4 Jun 2025 09:15:49 +0530 Subject: [PATCH 29/29] complete mandate added --- ...rate-capture-context-for-click-to-pay-dropin-ui.py | 10 ++++++++-- ...erate-unified-checkout-passing-billing-shipping.py | 9 ++++++++- ...-unified-checkout => generate-unified-checkout.py} | 11 +++++++++-- 3 files changed, 25 insertions(+), 5 deletions(-) rename samples/UnifiedCheckout/{generate-unified-checkout => generate-unified-checkout.py} (93%) diff --git a/samples/UnifiedCheckout/generate-capture-context-for-click-to-pay-dropin-ui.py b/samples/UnifiedCheckout/generate-capture-context-for-click-to-pay-dropin-ui.py index 8a56e8e..11b39e6 100644 --- a/samples/UnifiedCheckout/generate-capture-context-for-click-to-pay-dropin-ui.py +++ b/samples/UnifiedCheckout/generate-capture-context-for-click-to-pay-dropin-ui.py @@ -1,6 +1,6 @@ from CyberSource import * from CyberSource.rest import ApiException -from CyberSource.models import Upv1capturecontextsCaptureMandate, Upv1capturecontextsOrderInformationAmountDetails, Upv1capturecontextsOrderInformation, GenerateUnifiedCheckoutCaptureContextRequest +from CyberSource.models import Upv1capturecontextsCaptureMandate, Upv1capturecontextsOrderInformationAmountDetails, Upv1capturecontextsOrderInformation, GenerateUnifiedCheckoutCaptureContextRequest, Upv1capturecontextsCompleteMandate from pathlib import Path import os import json @@ -74,6 +74,11 @@ def generate_unified_checkout_capture_context(): orderInformation = Upv1capturecontextsOrderInformation( amount_details = orderInformationAmountDetails.__dict__ ) + + completemandate = Upv1capturecontextsCompleteMandate( + type= "CAPTURE", + decision_manager = False + ) requestObj = GenerateUnifiedCheckoutCaptureContextRequest( client_version = clientVersion, @@ -83,7 +88,8 @@ def generate_unified_checkout_capture_context(): country = country, locale = locale, capture_mandate = captureMandate.__dict__, - order_information = orderInformation.__dict__ + order_information = orderInformation.__dict__, + complete_mandate = completemandate.__dict__ ) diff --git a/samples/UnifiedCheckout/generate-unified-checkout-passing-billing-shipping.py b/samples/UnifiedCheckout/generate-unified-checkout-passing-billing-shipping.py index 25f3575..909888e 100644 --- a/samples/UnifiedCheckout/generate-unified-checkout-passing-billing-shipping.py +++ b/samples/UnifiedCheckout/generate-unified-checkout-passing-billing-shipping.py @@ -172,6 +172,11 @@ def generate_unified_checkout_capture_context(): bill_to = orderInformationBillTo.__dict__, ship_to = orderInformationShipTo.__dict__ ) + + completemandate = Upv1capturecontextsCompleteMandate( + type= "CAPTURE", + decision_manager = False + ) requestObj = GenerateUnifiedCheckoutCaptureContextRequest( client_version = clientVersion, @@ -181,7 +186,9 @@ def generate_unified_checkout_capture_context(): country = country, locale = locale, capture_mandate = captureMandate.__dict__, - order_information = orderInformation.__dict__ + order_information = orderInformation.__dict__, + complete_mandate = completemandate.__dict__ + ) diff --git a/samples/UnifiedCheckout/generate-unified-checkout b/samples/UnifiedCheckout/generate-unified-checkout.py similarity index 93% rename from samples/UnifiedCheckout/generate-unified-checkout rename to samples/UnifiedCheckout/generate-unified-checkout.py index e20a5dc..8b64005 100644 --- a/samples/UnifiedCheckout/generate-unified-checkout +++ b/samples/UnifiedCheckout/generate-unified-checkout.py @@ -18,7 +18,7 @@ def del_none(d): def generate_unified_checkout_capture_context(): - clientVersion = "0.23" + clientVersion = "0.26" targetOrigins = [] targetOrigins.append("https://yourCheckoutPage.com") @@ -77,6 +77,11 @@ def generate_unified_checkout_capture_context(): orderInformation = Upv1capturecontextsOrderInformation( amount_details = orderInformationAmountDetails.__dict__ ) + + completemandate = Upv1capturecontextsCompleteMandate( + type= "CAPTURE", + decision_manager = False + ) requestObj = GenerateUnifiedCheckoutCaptureContextRequest( client_version = clientVersion, @@ -86,7 +91,9 @@ def generate_unified_checkout_capture_context(): country = country, locale = locale, capture_mandate = captureMandate.__dict__, - order_information = orderInformation.__dict__ + order_information = orderInformation.__dict__, + complete_mandate = completemandate.__dict__ + )