From a05ad18c9661e828343244d0ab8e2af55a8cfaa0 Mon Sep 17 00:00:00 2001 From: Kumar Date: Thu, 31 Oct 2019 02:35:27 -0500 Subject: [PATCH 1/8] updated the code to latest sdk --- classes/class-gf-securesubmit.php | 126 +- classes/includes/composer.json | 5 + classes/includes/composer.lock | 63 + classes/includes/vendor/autoload.php | 7 + .../includes/vendor/composer/ClassLoader.php | 445 + classes/includes/vendor/composer/LICENSE | 21 + .../vendor/composer/autoload_classmap.php | 9 + .../vendor/composer/autoload_namespaces.php | 9 + .../vendor/composer/autoload_psr4.php | 10 + .../vendor/composer/autoload_real.php | 52 + .../vendor/composer/autoload_static.php | 31 + .../includes/vendor/composer/installed.json | 49 + .../vendor/globalpayments/php-sdk/.gitignore | 9 + .../vendor/globalpayments/php-sdk/.travis.yml | 25 + .../vendor/globalpayments/php-sdk/LICENSE.md | 264 + .../vendor/globalpayments/php-sdk/README.md | 136 + .../globalpayments/php-sdk/composer.json | 44 + .../globalpayments/php-sdk/composer.lock | 4199 ++++ .../globalpayments/php-sdk/docker-compose.yml | 27 + .../globalpayments/php-sdk/docs-config.php | 17 + .../examples/consumer-authentication/JWT.php | 64 + .../consumer-authentication/cruise.php | 341 + .../php-sdk/examples/echeck/index.html | 144 + .../php-sdk/examples/echeck/process.php | 50 + .../end-to-end/assets/heartland-styles.css | 167 + .../examples/end-to-end/assets/images/cvv.png | Bin 0 -> 17130 bytes .../end-to-end/assets/images/cvv1.png | Bin 0 -> 21113 bytes .../end-to-end/assets/images/cvv2.png | Bin 0 -> 26322 bytes .../end-to-end/assets/images/ss-cvv@2x.png | Bin 0 -> 23730 bytes .../assets/images/ss-inputcard-blank@2x.png | Bin 0 -> 2166 bytes .../assets/images/ss-saved-amex@2x.png | Bin 0 -> 17012 bytes .../assets/images/ss-saved-discover@2x.png | Bin 0 -> 23467 bytes .../assets/images/ss-saved-jcb@2x.png | Bin 0 -> 33220 bytes .../assets/images/ss-saved-mastercard.png | Bin 0 -> 45026 bytes .../assets/images/ss-saved-mastercard@2x.png | Bin 0 -> 30646 bytes .../assets/images/ss-saved-visa@2x.png | Bin 0 -> 10480 bytes .../assets/images/ss-savedcards-amex@2x.png | Bin 0 -> 47321 bytes .../end-to-end/assets/images/ss-shield-ie.png | Bin 0 -> 31456 bytes .../end-to-end/assets/images/ss-shield@1x.png | Bin 0 -> 36611 bytes .../end-to-end/assets/images/ss-shield@2x.png | Bin 0 -> 59755 bytes .../php-sdk/examples/end-to-end/charge.php | 64 + .../php-sdk/examples/end-to-end/index.html | 373 + .../php-sdk/examples/gift/charge.php | 33 + .../php-sdk/examples/gift/index.php | 18 + .../iframe-pay-invoice/assets/main.js | 206 + .../examples/iframe-pay-invoice/charge.php | 66 + .../examples/iframe-pay-invoice/index.html | 168 + .../iframe-recurring-signup/assets/main.js | 207 + .../iframe-recurring-signup/charge.php | 119 + .../iframe-recurring-signup/index.html | 165 + .../examples/manual-tokenize/assets/main.js | 206 + .../examples/manual-tokenize/charge.php | 66 + .../examples/manual-tokenize/index.html | 166 + .../examples/pay-invoice/assets/main.js | 206 + .../php-sdk/examples/pay-invoice/charge.php | 74 + .../php-sdk/examples/pay-invoice/index.html | 169 + .../point-of-sale/e3-swipe/assets/apples.png | Bin 0 -> 56960 bytes .../point-of-sale/e3-swipe/assets/bananas.png | Bin 0 -> 38289 bytes .../point-of-sale/e3-swipe/assets/oranges.png | Bin 0 -> 82861 bytes .../e3-swipe/assets/secure.submit-1.1.0.js | 266 + .../point-of-sale/e3-swipe/charge.php | 75 + .../point-of-sale/e3-swipe/index.html | 130 + .../examples/recurring-signup-ach/charge.php | 125 + .../examples/recurring-signup-ach/index.html | 168 + .../vendor/globalpayments/php-sdk/phpcs.xml | 5 + .../globalpayments/php-sdk/phpunit.xml.dist | 48 + .../vendor/globalpayments/php-sdk/sami.phar | Bin 0 -> 2461851 bytes .../src/Builders/AuthorizationBuilder.php | 1117 + .../php-sdk/src/Builders/BaseBuilder.php | 94 + .../Builders/BaseBuilder/ValidationClause.php | 277 + .../Builders/BaseBuilder/ValidationTarget.php | 103 + .../src/Builders/BaseBuilder/Validations.php | 46 + .../src/Builders/ManagementBuilder.php | 383 + .../php-sdk/src/Builders/RecurringBuilder.php | 92 + .../php-sdk/src/Builders/ReportBuilder.php | 44 + .../php-sdk/src/Builders/Secure3dBuilder.php | 1228 + .../src/Builders/TransactionBuilder.php | 99 + .../src/Builders/TransactionReportBuilder.php | 148 + .../php-sdk/src/Entities/Address.php | 96 + .../Entities/AlternativePaymentResponse.php | 53 + .../php-sdk/src/Entities/BatchSummary.php | 37 + .../php-sdk/src/Entities/BrowserData.php | 32 + .../php-sdk/src/Entities/Customer.php | 156 + .../php-sdk/src/Entities/DccRateData.php | 59 + .../src/Entities/DccResponseResult.php | 72 + .../php-sdk/src/Entities/DecisionManager.php | 96 + .../php-sdk/src/Entities/EcommerceInfo.php | 55 + .../php-sdk/src/Entities/EncryptionData.php | 70 + .../php-sdk/src/Entities/Enum.php | 36 + .../src/Entities/Enums/AccountType.php | 11 + .../src/Entities/Enums/AddressType.php | 11 + .../src/Entities/Enums/AgeIndicator.php | 15 + .../src/Entities/Enums/AliasAction.php | 12 + .../Entities/Enums/AlternativePaymentType.php | 144 + .../Enums/AuthenticationRequestType.php | 15 + .../Entities/Enums/AuthenticationSource.php | 12 + .../Enums/ChallengeRequestIndicator.php | 13 + .../Entities/Enums/ChallengeWindowSize.php | 14 + .../php-sdk/src/Entities/Enums/CheckType.php | 12 + .../php-sdk/src/Entities/Enums/ColorDepth.php | 18 + .../Enums/CustomerAuthenticationMethod.php | 15 + .../Entities/Enums/CvnPresenceIndicator.php | 13 + .../src/Entities/Enums/DccProcessor.php | 11 + .../src/Entities/Enums/DccRateType.php | 11 + .../src/Entities/Enums/DeliveryTimeFrame.php | 13 + .../src/Entities/Enums/EcommerceChannel.php | 21 + .../src/Entities/Enums/EncyptedMobileType.php | 11 + .../src/Entities/Enums/EntryMethod.php | 12 + .../src/Entities/Enums/Environment.php | 11 + .../src/Entities/Enums/ExceptionCodes.php | 55 + .../src/Entities/Enums/FraudFilterMode.php | 12 + .../src/Entities/Enums/GiftEntryMethod.php | 12 + .../php-sdk/src/Entities/Enums/HppVersion.php | 11 + .../src/Entities/Enums/InquiryType.php | 13 + .../src/Entities/Enums/MessageCategory.php | 11 + .../src/Entities/Enums/MessageVersion.php | 10 + .../Entities/Enums/MethodUrlCompletion.php | 12 + .../Entities/Enums/OrderTransactionType.php | 14 + .../src/Entities/Enums/PaymentMethodType.php | 18 + .../src/Entities/Enums/PaymentSchedule.php | 12 + .../src/Entities/Enums/PreOrderIndicator.php | 11 + .../Enums/PriorAuthenticationMethod.php | 13 + .../php-sdk/src/Entities/Enums/ReasonCode.php | 44 + .../src/Entities/Enums/RecurringSequence.php | 12 + .../src/Entities/Enums/RecurringType.php | 11 + .../src/Entities/Enums/ReorderIndicator.php | 11 + .../php-sdk/src/Entities/Enums/ReportType.php | 12 + .../php-sdk/src/Entities/Enums/Risk.php | 11 + .../src/Entities/Enums/ScheduleFrequency.php | 17 + .../src/Entities/Enums/SdkInterface.php | 12 + .../php-sdk/src/Entities/Enums/SdkUiType.php | 14 + .../php-sdk/src/Entities/Enums/SecCode.php | 15 + .../src/Entities/Enums/Secure3dVersion.php | 13 + .../src/Entities/Enums/ServiceEndpoints.php | 19 + .../src/Entities/Enums/ShippingMethod.php | 16 + .../Enums/StoredCredentialInitiator.php | 12 + .../Enums/StoredCredentialSequence.php | 11 + .../Entities/Enums/StoredCredentialType.php | 12 + .../php-sdk/src/Entities/Enums/TaxType.php | 12 + .../src/Entities/Enums/TimeZoneConversion.php | 12 + .../Entities/Enums/TransactionModifier.php | 23 + .../src/Entities/Enums/TransactionType.php | 41 + .../src/Entities/Exceptions/ApiException.php | 20 + .../Entities/Exceptions/ArgumentException.php | 18 + .../Entities/Exceptions/BuilderException.php | 18 + .../Exceptions/ConfigurationException.php | 18 + .../Entities/Exceptions/GatewayException.php | 39 + .../Exceptions/NotImplementedException.php | 16 + .../UnsupportedTransactionException.php | 16 + .../src/Entities/FraudManagementResponse.php | 30 + .../src/Entities/HostedPaymentData.php | 99 + .../php-sdk/src/Entities/IRecurringEntity.php | 54 + .../src/Entities/MerchantDataCollection.php | 190 + .../php-sdk/src/Entities/MerchantKVP.php | 69 + .../php-sdk/src/Entities/RecurringEntity.php | 110 + .../src/Entities/Reporting/AltPaymentData.php | 38 + .../Reporting/AltPaymentProcessorInfo.php | 20 + .../src/Entities/Reporting/CheckData.php | 35 + .../src/Entities/Reporting/LodgingData.php | 30 + .../src/Entities/Reporting/SearchCriteria.php | 44 + .../Reporting/SearchCriteriaBuilder.php | 236 + .../Entities/Reporting/TransactionSummary.php | 386 + .../php-sdk/src/Entities/Schedule.php | 436 + .../php-sdk/src/Entities/StoredCredential.php | 19 + .../php-sdk/src/Entities/ThreeDSecure.php | 364 + .../php-sdk/src/Entities/Transaction.php | 461 + .../src/Entities/TransactionSummary.php | 142 + .../php-sdk/src/Gateways/Gateway.php | 135 + .../php-sdk/src/Gateways/GatewayResponse.php | 16 + .../php-sdk/src/Gateways/Gp3DSProvider.php | 427 + .../php-sdk/src/Gateways/IPaymentGateway.php | 32 + .../src/Gateways/IRecurringService.php | 10 + .../src/Gateways/ISecure3dProvider.php | 20 + .../php-sdk/src/Gateways/PayPlanConnector.php | 670 + .../php-sdk/src/Gateways/PorticoConnector.php | 1878 ++ .../php-sdk/src/Gateways/RealexConnector.php | 1413 ++ .../php-sdk/src/Gateways/RestGateway.php | 46 + .../php-sdk/src/Gateways/XmlGateway.php | 35 + .../php-sdk/src/HostedPaymentConfig.php | 149 + .../AlternativePaymentMethod.php | 109 + .../php-sdk/src/PaymentMethods/Cash.php | 25 + .../php-sdk/src/PaymentMethods/Credit.php | 224 + .../src/PaymentMethods/CreditCardData.php | 219 + .../src/PaymentMethods/CreditTrackData.php | 11 + .../php-sdk/src/PaymentMethods/Debit.php | 80 + .../src/PaymentMethods/DebitTrackData.php | 11 + .../php-sdk/src/PaymentMethods/EBT.php | 95 + .../src/PaymentMethods/EBTCardData.php | 91 + .../src/PaymentMethods/EBTTrackData.php | 13 + .../php-sdk/src/PaymentMethods/ECheck.php | 46 + .../php-sdk/src/PaymentMethods/GiftCard.php | 256 + .../PaymentMethods/Interfaces/IAuthable.php | 8 + .../Interfaces/IBalanceable.php | 8 + .../PaymentMethods/Interfaces/ICardData.php | 7 + .../PaymentMethods/Interfaces/IChargable.php | 8 + .../PaymentMethods/Interfaces/IEditable.php | 8 + .../Interfaces/IEncryptable.php | 7 + .../Interfaces/IPaymentMethod.php | 7 + .../Interfaces/IPinProtected.php | 7 + .../PaymentMethods/Interfaces/IPrePayable.php | 8 + .../PaymentMethods/Interfaces/IRefundable.php | 8 + .../PaymentMethods/Interfaces/IReversable.php | 8 + .../PaymentMethods/Interfaces/ISecure3d.php | 10 + .../Interfaces/ITokenizable.php | 10 + .../PaymentMethods/Interfaces/ITrackData.php | 7 + .../PaymentMethods/Interfaces/IVerifyable.php | 8 + .../PaymentMethods/Interfaces/IVoidable.php | 7 + .../PaymentMethods/RecurringPaymentMethod.php | 268 + .../PaymentMethods/TransactionReference.php | 33 + .../php-sdk/src/Services/BatchService.php | 16 + .../php-sdk/src/Services/CreditService.php | 149 + .../php-sdk/src/Services/DeviceService.php | 23 + .../php-sdk/src/Services/HostedService.php | 143 + .../php-sdk/src/Services/RecurringService.php | 43 + .../php-sdk/src/Services/ReportingService.php | 31 + .../php-sdk/src/Services/Secure3dService.php | 35 + .../php-sdk/src/ServicesConfig.php | 141 + .../php-sdk/src/ServicesContainer.php | 207 + .../Builders/TerminalAuthBuilder.php | 184 + .../Terminals/Builders/TerminalBuilder.php | 38 + .../Builders/TerminalManageBuilder.php | 96 + .../src/Terminals/ConnectionConfig.php | 52 + .../src/Terminals/ConnectionContainer.php | 62 + .../src/Terminals/DeviceController.php | 17 + .../Enums/ApplicationCryptogramType.php | 11 + .../php-sdk/src/Terminals/Enums/BaudRate.php | 13 + .../src/Terminals/Enums/ConnectionModes.php | 13 + .../src/Terminals/Enums/ControlCodes.php | 24 + .../src/Terminals/Enums/CurrencyType.php | 14 + .../php-sdk/src/Terminals/Enums/DataBits.php | 11 + .../src/Terminals/Enums/DeviceSettings.php | 15 + .../src/Terminals/Enums/DeviceType.php | 12 + .../Terminals/Enums/DownloadEnvironment.php | 11 + .../src/Terminals/Enums/DownloadTime.php | 21 + .../src/Terminals/Enums/DownloadType.php | 11 + .../php-sdk/src/Terminals/Enums/StopBits.php | 11 + .../HPA/Entities/Enums/HpaMessageFormat.php | 11 + .../HPA/Entities/Enums/HpaMessageId.php | 34 + .../HPA/Entities/Enums/HpaSendFileType.php | 29 + .../Terminals/HPA/Entities/HpaResponse.php | 152 + .../src/Terminals/HPA/Entities/LineItem.php | 29 + .../Terminals/HPA/Entities/SendFileData.php | 17 + .../src/Terminals/HPA/HpaController.php | 274 + .../src/Terminals/HPA/HpaInterface.php | 428 + .../src/Terminals/HPA/HpaTcpInterface.php | 367 + .../HPA/Requests/HpaSendFileRequest.php | 65 + .../Responses/HpaDiagnosticReportResponse.php | 135 + .../HPA/Responses/HpaEodResponse.php | 174 + .../HPA/Responses/HpaSendSafResponse.php | 160 + .../Interfaces/IDeviceCommInterface.php | 14 + .../Terminals/Interfaces/IDeviceInterface.php | 85 + .../Interfaces/IDeviceResponseHandler.php | 8 + .../Interfaces/IRequestIdProvider.php | 15 + .../php-sdk/src/Terminals/TerminalUtils.php | 52 + .../php-sdk/src/Utils/GenerationUtils.php | 159 + .../php-sdk/test/Data/TestCards.php | 271 + .../php-sdk/test/Data/TestChecks.php | 37 + .../Gateways/PorticoConnector/AchTest.php | 65 + .../Certifications/CheckTest.php | 481 + .../Certifications/EcommerceCheckTest.php | 108 + .../Certifications/EcommerceTest.php | 1668 ++ .../Certifications/MotoCheckTest.php | 108 + .../Certifications/MotoTest.php | 1697 ++ .../Certifications/RecurringTest.php | 560 + .../Certifications/RetailTest.php | 1982 ++ .../Gateways/PorticoConnector/CreditTest.php | 270 + .../Gateways/PorticoConnector/DebitTest.php | 73 + .../Gateways/PorticoConnector/EbtTest.php | 90 + .../Gateways/PorticoConnector/GiftTest.php | 119 + .../PorticoReportingTests.php | 296 + .../PorticoTokenManagementTest.php | 72 + .../Gateways/RealexConnector/AcsResponse.php | 44 + .../Gateways/RealexConnector/ApiTestCase.php | 999 + .../Certifications/SdkTest.php | 18930 ++++++++++++++++ .../Gateways/RealexConnector/CreditTest.php | 285 + .../RealexConnector/Hpp/RealexHppClient.php | 249 + .../Gateways/RealexConnector/HppTest.php | 654 + .../Gateways/RealexConnector/HppTestCase.php | 247 + .../RealexConnector/Realex3dSecureTests.php | 500 + .../RealexConnector/RealexApmTest.php | 185 + .../RealexConnector/RecurringTest.php | 390 + .../RealexConnector/Secure3dServiceTests.php | 772 + .../RealexConnector/ThreeDSecureAcsClient.php | 116 + .../Gateways/Terminals/HPA/HpaAdminTests.php | 361 + .../Gateways/Terminals/HPA/HpaCreditTests.php | 225 + .../Gateways/Terminals/HPA/HpaDebitTests.php | 119 + .../Gateways/Terminals/HPA/HpaEbtTests.php | 102 + .../Gateways/Terminals/HPA/HpaGiftTests.php | 150 + .../sampleimages/hpa_banner_iSC250_60_480.jpg | Bin 0 -> 13453 bytes .../sampleimages/hpa_logo_iSC250_272_480.jpg | Bin 0 -> 10913 bytes .../HPA/sampleimages/image_500_500.jpg | Bin 0 -> 15070 bytes .../HPA/vrf/HpaVerificationTests.php | 456 + .../Gateways/Terminals/RequestIdProvider.php | 14 + .../AuthorizationBuilder/ValidationTest.php | 101 + .../Gateways/RealexConnector/CreditTest.php | 47 + .../globalpayments/php-sdk/test/setup.php | 3 + 296 files changed, 60500 insertions(+), 63 deletions(-) create mode 100644 classes/includes/composer.json create mode 100644 classes/includes/composer.lock create mode 100644 classes/includes/vendor/autoload.php create mode 100644 classes/includes/vendor/composer/ClassLoader.php create mode 100644 classes/includes/vendor/composer/LICENSE create mode 100644 classes/includes/vendor/composer/autoload_classmap.php create mode 100644 classes/includes/vendor/composer/autoload_namespaces.php create mode 100644 classes/includes/vendor/composer/autoload_psr4.php create mode 100644 classes/includes/vendor/composer/autoload_real.php create mode 100644 classes/includes/vendor/composer/autoload_static.php create mode 100644 classes/includes/vendor/composer/installed.json create mode 100644 classes/includes/vendor/globalpayments/php-sdk/.gitignore create mode 100644 classes/includes/vendor/globalpayments/php-sdk/.travis.yml create mode 100644 classes/includes/vendor/globalpayments/php-sdk/LICENSE.md create mode 100644 classes/includes/vendor/globalpayments/php-sdk/README.md create mode 100644 classes/includes/vendor/globalpayments/php-sdk/composer.json create mode 100644 classes/includes/vendor/globalpayments/php-sdk/composer.lock create mode 100644 classes/includes/vendor/globalpayments/php-sdk/docker-compose.yml create mode 100644 classes/includes/vendor/globalpayments/php-sdk/docs-config.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/consumer-authentication/JWT.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/consumer-authentication/cruise.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/echeck/index.html create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/echeck/process.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/heartland-styles.css create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/cvv.png create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/cvv1.png create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/cvv2.png create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-cvv@2x.png create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-inputcard-blank@2x.png create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-saved-amex@2x.png create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-saved-discover@2x.png create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-saved-jcb@2x.png create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-saved-mastercard.png create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-saved-mastercard@2x.png create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-saved-visa@2x.png create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-savedcards-amex@2x.png create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-shield-ie.png create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-shield@1x.png create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-shield@2x.png create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/charge.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/index.html create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/gift/charge.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/gift/index.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/iframe-pay-invoice/assets/main.js create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/iframe-pay-invoice/charge.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/iframe-pay-invoice/index.html create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/iframe-recurring-signup/assets/main.js create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/iframe-recurring-signup/charge.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/iframe-recurring-signup/index.html create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/manual-tokenize/assets/main.js create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/manual-tokenize/charge.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/manual-tokenize/index.html create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/pay-invoice/assets/main.js create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/pay-invoice/charge.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/pay-invoice/index.html create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/point-of-sale/e3-swipe/assets/apples.png create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/point-of-sale/e3-swipe/assets/bananas.png create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/point-of-sale/e3-swipe/assets/oranges.png create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/point-of-sale/e3-swipe/assets/secure.submit-1.1.0.js create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/point-of-sale/e3-swipe/charge.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/point-of-sale/e3-swipe/index.html create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/recurring-signup-ach/charge.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/recurring-signup-ach/index.html create mode 100644 classes/includes/vendor/globalpayments/php-sdk/phpcs.xml create mode 100644 classes/includes/vendor/globalpayments/php-sdk/phpunit.xml.dist create mode 100644 classes/includes/vendor/globalpayments/php-sdk/sami.phar create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Builders/AuthorizationBuilder.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Builders/BaseBuilder.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Builders/BaseBuilder/ValidationClause.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Builders/BaseBuilder/ValidationTarget.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Builders/BaseBuilder/Validations.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Builders/ManagementBuilder.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Builders/RecurringBuilder.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Builders/ReportBuilder.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Builders/Secure3dBuilder.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Builders/TransactionBuilder.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Builders/TransactionReportBuilder.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Address.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/AlternativePaymentResponse.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/BatchSummary.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/BrowserData.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Customer.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/DccRateData.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/DccResponseResult.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/DecisionManager.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/EcommerceInfo.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/EncryptionData.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enum.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/AccountType.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/AddressType.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/AgeIndicator.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/AliasAction.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/AlternativePaymentType.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/AuthenticationRequestType.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/AuthenticationSource.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/ChallengeRequestIndicator.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/ChallengeWindowSize.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/CheckType.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/ColorDepth.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/CustomerAuthenticationMethod.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/CvnPresenceIndicator.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/DccProcessor.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/DccRateType.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/DeliveryTimeFrame.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/EcommerceChannel.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/EncyptedMobileType.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/EntryMethod.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/Environment.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/ExceptionCodes.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/FraudFilterMode.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/GiftEntryMethod.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/HppVersion.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/InquiryType.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/MessageCategory.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/MessageVersion.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/MethodUrlCompletion.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/OrderTransactionType.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/PaymentMethodType.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/PaymentSchedule.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/PreOrderIndicator.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/PriorAuthenticationMethod.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/ReasonCode.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/RecurringSequence.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/RecurringType.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/ReorderIndicator.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/ReportType.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/Risk.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/ScheduleFrequency.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/SdkInterface.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/SdkUiType.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/SecCode.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/Secure3dVersion.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/ServiceEndpoints.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/ShippingMethod.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/StoredCredentialInitiator.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/StoredCredentialSequence.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/StoredCredentialType.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/TaxType.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/TimeZoneConversion.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/TransactionModifier.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/TransactionType.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Exceptions/ApiException.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Exceptions/ArgumentException.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Exceptions/BuilderException.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Exceptions/ConfigurationException.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Exceptions/GatewayException.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Exceptions/NotImplementedException.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Exceptions/UnsupportedTransactionException.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/FraudManagementResponse.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/HostedPaymentData.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/IRecurringEntity.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/MerchantDataCollection.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/MerchantKVP.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/RecurringEntity.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Reporting/AltPaymentData.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Reporting/AltPaymentProcessorInfo.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Reporting/CheckData.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Reporting/LodgingData.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Reporting/SearchCriteria.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Reporting/SearchCriteriaBuilder.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Reporting/TransactionSummary.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Schedule.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/StoredCredential.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/ThreeDSecure.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Transaction.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/TransactionSummary.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Gateways/Gateway.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Gateways/GatewayResponse.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Gateways/Gp3DSProvider.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Gateways/IPaymentGateway.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Gateways/IRecurringService.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Gateways/ISecure3dProvider.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Gateways/PayPlanConnector.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Gateways/PorticoConnector.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Gateways/RealexConnector.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Gateways/RestGateway.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Gateways/XmlGateway.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/HostedPaymentConfig.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/AlternativePaymentMethod.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Cash.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Credit.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/CreditCardData.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/CreditTrackData.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Debit.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/DebitTrackData.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/EBT.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/EBTCardData.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/EBTTrackData.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/ECheck.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/GiftCard.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Interfaces/IAuthable.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Interfaces/IBalanceable.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Interfaces/ICardData.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Interfaces/IChargable.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Interfaces/IEditable.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Interfaces/IEncryptable.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Interfaces/IPaymentMethod.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Interfaces/IPinProtected.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Interfaces/IPrePayable.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Interfaces/IRefundable.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Interfaces/IReversable.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Interfaces/ISecure3d.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Interfaces/ITokenizable.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Interfaces/ITrackData.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Interfaces/IVerifyable.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Interfaces/IVoidable.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/RecurringPaymentMethod.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/TransactionReference.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Services/BatchService.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Services/CreditService.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Services/DeviceService.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Services/HostedService.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Services/RecurringService.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Services/ReportingService.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Services/Secure3dService.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/ServicesConfig.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/ServicesContainer.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Builders/TerminalAuthBuilder.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Builders/TerminalBuilder.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Builders/TerminalManageBuilder.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/ConnectionConfig.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/ConnectionContainer.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/DeviceController.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Enums/ApplicationCryptogramType.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Enums/BaudRate.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Enums/ConnectionModes.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Enums/ControlCodes.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Enums/CurrencyType.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Enums/DataBits.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Enums/DeviceSettings.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Enums/DeviceType.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Enums/DownloadEnvironment.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Enums/DownloadTime.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Enums/DownloadType.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Enums/StopBits.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Entities/Enums/HpaMessageFormat.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Entities/Enums/HpaMessageId.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Entities/Enums/HpaSendFileType.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Entities/HpaResponse.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Entities/LineItem.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Entities/SendFileData.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/HpaController.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/HpaInterface.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/HpaTcpInterface.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Requests/HpaSendFileRequest.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Responses/HpaDiagnosticReportResponse.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Responses/HpaEodResponse.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Responses/HpaSendSafResponse.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Interfaces/IDeviceCommInterface.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Interfaces/IDeviceInterface.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Interfaces/IDeviceResponseHandler.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Interfaces/IRequestIdProvider.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/TerminalUtils.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Utils/GenerationUtils.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Data/TestCards.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Data/TestChecks.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/AchTest.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/CheckTest.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/EcommerceCheckTest.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/EcommerceTest.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/MotoCheckTest.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/MotoTest.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/RecurringTest.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/RetailTest.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/CreditTest.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/DebitTest.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/EbtTest.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/GiftTest.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/PorticoReportingTests.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/PorticoTokenManagementTest.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/AcsResponse.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/ApiTestCase.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/Certifications/SdkTest.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/CreditTest.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/Hpp/RealexHppClient.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/HppTest.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/HppTestCase.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/Realex3dSecureTests.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/RealexApmTest.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/RecurringTest.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/Secure3dServiceTests.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/ThreeDSecureAcsClient.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/HpaAdminTests.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/HpaCreditTests.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/HpaDebitTests.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/HpaEbtTests.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/HpaGiftTests.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/sampleimages/hpa_banner_iSC250_60_480.jpg create mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/sampleimages/hpa_logo_iSC250_272_480.jpg create mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/sampleimages/image_500_500.jpg create mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/vrf/HpaVerificationTests.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/RequestIdProvider.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Unit/Builders/AuthorizationBuilder/ValidationTest.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Unit/Gateways/RealexConnector/CreditTest.php create mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/setup.php diff --git a/classes/class-gf-securesubmit.php b/classes/class-gf-securesubmit.php index 47afee0..708cf5b 100755 --- a/classes/class-gf-securesubmit.php +++ b/classes/class-gf-securesubmit.php @@ -1,6 +1,21 @@ HpsAccountType::CHECKING, - 2 => HpsAccountType::SAVINGS, + 1 => AccountType::CHECKING, + 2 => AccountType::SAVINGS, ); $checkTypeOptions = array( - 1 => HpsCheckType::PERSONAL, - 2 => HpsCheckType::BUSINESS, + 1 => CheckType::PERSONAL, + 2 => CheckType::BUSINESS, ); if (key_exists($accountType, $accountTypeOptions) && key_exists($checkType, $checkTypeOptions)) { @@ -1409,9 +1424,9 @@ private function authorizeCC($feed, $submission_data, $form, $entry) try { $config = $this->getHpsServicesConfig($this->getSecretApiKey($feed)); - $service = new HpsCreditService($config); - + $cardHolder = $this->buildCardHolder($feed, $submission_data, $entry); + $address = $this->buildAddress($feed, $submission_data, $entry); /** * if fraud_velocity_attempts is less than the $HeartlandHPS_FailCount then we know @@ -1423,11 +1438,6 @@ private function authorizeCC($feed, $submission_data, $form, $entry) return $this->authorization_error(wp_sprintf('%s %s', $fraud_message, $issuerResponse)); //throw new HpsException(wp_sprintf('%s %s', $fraud_message, $issuerResponse)); } - $response = $this->getSecureSubmitJsResponse(); - $token = new HpsTokenData(); - $token->tokenValue = ($response != null - ? $response->token_value - : ''); /** * CardHolder Authentication (3D Secure) @@ -1465,11 +1475,11 @@ private function authorizeCC($feed, $submission_data, $form, $entry) ? $data->Payment->ExtendedData->XID : ''; - $secureEcommerce = new HpsSecureEcommerce(); + $secureEcommerce = new EcommerceInfo(); $secureEcommerce->type = '3DSecure'; - $secureEcommerce->dataSource = $dataSource; - $secureEcommerce->data = $cavv; - $secureEcommerce->eciFlag = $eciFlag; + $secureEcommerce->paymentDataSource = $dataSource; + $secureEcommerce->cavv = $cavv; + $secureEcommerce->eci = $eciFlag; $secureEcommerce->xid = $xid; } @@ -1481,36 +1491,17 @@ private function authorizeCC($feed, $submission_data, $form, $entry) $currency = GFCommon::get_currency(); $transaction = null; if ($isAuth) { - $transaction = $service->authorize( - $submission_data['payment_amount'], - $currency, - $token, - $cardHolder, - false, - null, - null, - false, - $cpcReq, - null, - null, - $secureEcommerce - ); + $transaction = $cardHolder->authorize($submission_data['payment_amount']) + ->withCurrency($currency) + ->withAddress($address) + ->withAllowDuplicates(true) + ->execute(); } else { - $transaction = $service->charge( - $submission_data['payment_amount'], - $currency, - $token, - $cardHolder, - false, - null, - null, - false, - $cpcReq, - null, - null, - null, - $secureEcommerce - ); + $transaction = $cardHolder->charge($submission_data['payment_amount']) + ->withCurrency($currency) + ->withAddress($address) + ->withAllowDuplicates(true) + ->execute(); } do_action('heartland_gravityforms_transaction_success', $form, $entry, $transaction, $response); self::get_instance()->transaction_response = $transaction; @@ -1529,27 +1520,30 @@ private function authorizeCC($feed, $submission_data, $form, $entry) $amount_formatted, $transaction->transactionId ); - if ($cpcReq - && ($transaction->cpcIndicator == 'B' - || $transaction->cpcIndicator == 'R' - || $transaction->cpcIndicator == 'S') + && ($transaction->commercialIndicator == 'B' + || $transaction->commercialIndicator == 'R' + || $transaction->commercialIndicator == 'S') ) { - $cpcData = new HpsCPCData(); - $cpcData->CardHolderPONbr = $this->getLevelIICustomerPO($feed); + $CardHolderPONbr = $this->getLevelIICustomerPO($feed); if ($this->getLevelIITaxType($feed) == "SALES_TAX") { - $cpcData->TaxType = HpsTaxType::SALES_TAX; + $TaxType = HpsTaxType::SALES_TAX; } elseif ($this->getLevelIITaxType($feed) == "NOTUSED") { - $cpcData->TaxType = HpsTaxType::NOTUSED; + $TaxType = HpsTaxType::NOTUSED; } elseif ($this->getLevelIITaxType($feed) == "TAXEXEMPT") { - $cpcData->TaxType = HpsTaxType::TAXEXEMPT; + $TaxType = HpsTaxType::TAXEXEMPT; } - $cpcData->TaxAmt = $this->getLevelIICustomerTaxAmount($feed); + $TaxAmt = $this->getLevelIICustomerTaxAmount($feed); - if (!empty($cpcData->CardHolderPONbr) && !empty($cpcData->TaxType) && !empty($cpcData->TaxAmt)) { + if (!empty($CardHolderPONbr) && !empty($TaxType) && !empty($TaxAmt)) { $cpcResponse = $service->cpcEdit($transaction->transactionId, $cpcData); + $cpcResponse = $response->edit() + ->withPoNumber($CardHolderPONbr) + ->withTaxType($TaxType) + ->withTaxAmount($TaxAmt) + ->execute(); $note .= sprintf(__(' CPC Response Code: %s', $this->_slug), $cpcResponse->responseCode); } } @@ -1671,11 +1665,13 @@ private function buildCardHolder($feed, $submission_data, $entry) $firstName = rgar($submission_data, 'card_name'); } - $cardHolder = new HpsCardHolder(); + $cardHolder = new CreditCardData(); $cardHolder->firstName = $firstName; $cardHolder->lastName = $lastName; - $cardHolder->address = $this->buildAddress($feed, $submission_data, $entry); - + $response = $this->getSecureSubmitJsResponse(); + $cardHolder->token = ($response != null + ? $response->token_value + : ''); return $cardHolder; } @@ -1718,7 +1714,7 @@ private function buildCheckHolder($feed, $submission_data, $entry) private function buildAddress($feed, $submission_data, $entry) { $isRecurring = isset($feed['meta']['transactionType']) && $feed['meta']['transactionType'] == 'subscription'; - $address = new HpsAddress(); + $address = new Address(); $address->address = rgar($submission_data, 'address') . rgar($submission_data, 'address2'); @@ -1788,7 +1784,7 @@ public function populateCreditCardLastFour($form) public function includeSecureSubmitSDK() { - require_once plugin_dir_path(__FILE__) . 'includes/Hps.php'; + require_once plugin_dir_path(__FILE__) . 'includes/vendor/autoload.php'; do_action('gform_securesubmit_post_include_api'); } @@ -2666,13 +2662,17 @@ private function getHpsServicesConfig($key) { static $config = null; if (empty($config)) { - $config = new HpsServicesConfig(); + /*$config = new HpsServicesConfig(); $config->secretApiKey = $key; $config->developerId = '002914'; - $config->versionNumber = '1916'; + $config->versionNumber = '1916';*/ + $config = new ServicesConfig(); + $config->secretApiKey = $key; + $config->serviceUrl = "https://cert.api2.heartlandportico.com"; + $service = ServicesContainer::configure($config); } - return $config; + return $service; } /** diff --git a/classes/includes/composer.json b/classes/includes/composer.json new file mode 100644 index 0000000..be7fe54 --- /dev/null +++ b/classes/includes/composer.json @@ -0,0 +1,5 @@ +{ + "require": { + "globalpayments/php-sdk": "^1.3" + } +} diff --git a/classes/includes/composer.lock b/classes/includes/composer.lock new file mode 100644 index 0000000..ef68e2f --- /dev/null +++ b/classes/includes/composer.lock @@ -0,0 +1,63 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "54ffb0e9c4978df9f979e8d9285f5356", + "packages": [ + { + "name": "globalpayments/php-sdk", + "version": "1.3.3", + "source": { + "type": "git", + "url": "https://github.com/globalpayments/php-sdk.git", + "reference": "1fd0393b3fc231fcff2977a152b7a7b9e0c1d57f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/globalpayments/php-sdk/zipball/1fd0393b3fc231fcff2977a152b7a7b9e0c1d57f", + "reference": "1fd0393b3fc231fcff2977a152b7a7b9e0c1d57f", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-dom": "*", + "ext-openssl": "*", + "php": ">= 5.5.9" + }, + "require-dev": { + "brianium/paratest": "dev-master", + "phpstan/phpstan-shim": "^0.8.4", + "phpunit/phpunit": "~5.0", + "squizlabs/php_codesniffer": "2.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "GlobalPayments\\Api\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Heartland Payment Systems" + } + ], + "description": "PHP SDK for processing payments with Global Payments, including Heartland Payment Systems and Realex Payments", + "homepage": "https://developer.heartlandpaymentsystems.com/documentation", + "time": "2019-10-03T15:15:47+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [] +} diff --git a/classes/includes/vendor/autoload.php b/classes/includes/vendor/autoload.php new file mode 100644 index 0000000..cea4692 --- /dev/null +++ b/classes/includes/vendor/autoload.php @@ -0,0 +1,7 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Autoload; + +/** + * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. + * + * $loader = new \Composer\Autoload\ClassLoader(); + * + * // register classes with namespaces + * $loader->add('Symfony\Component', __DIR__.'/component'); + * $loader->add('Symfony', __DIR__.'/framework'); + * + * // activate the autoloader + * $loader->register(); + * + * // to enable searching the include path (eg. for PEAR packages) + * $loader->setUseIncludePath(true); + * + * In this example, if you try to use a class in the Symfony\Component + * namespace or one of its children (Symfony\Component\Console for instance), + * the autoloader will first look for the class under the component/ + * directory, and it will then fallback to the framework/ directory if not + * found before giving up. + * + * This class is loosely based on the Symfony UniversalClassLoader. + * + * @author Fabien Potencier + * @author Jordi Boggiano + * @see http://www.php-fig.org/psr/psr-0/ + * @see http://www.php-fig.org/psr/psr-4/ + */ +class ClassLoader +{ + // PSR-4 + private $prefixLengthsPsr4 = array(); + private $prefixDirsPsr4 = array(); + private $fallbackDirsPsr4 = array(); + + // PSR-0 + private $prefixesPsr0 = array(); + private $fallbackDirsPsr0 = array(); + + private $useIncludePath = false; + private $classMap = array(); + private $classMapAuthoritative = false; + private $missingClasses = array(); + private $apcuPrefix; + + public function getPrefixes() + { + if (!empty($this->prefixesPsr0)) { + return call_user_func_array('array_merge', $this->prefixesPsr0); + } + + return array(); + } + + public function getPrefixesPsr4() + { + return $this->prefixDirsPsr4; + } + + public function getFallbackDirs() + { + return $this->fallbackDirsPsr0; + } + + public function getFallbackDirsPsr4() + { + return $this->fallbackDirsPsr4; + } + + public function getClassMap() + { + return $this->classMap; + } + + /** + * @param array $classMap Class to filename map + */ + public function addClassMap(array $classMap) + { + if ($this->classMap) { + $this->classMap = array_merge($this->classMap, $classMap); + } else { + $this->classMap = $classMap; + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, either + * appending or prepending to the ones previously set for this prefix. + * + * @param string $prefix The prefix + * @param array|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories + */ + public function add($prefix, $paths, $prepend = false) + { + if (!$prefix) { + if ($prepend) { + $this->fallbackDirsPsr0 = array_merge( + (array) $paths, + $this->fallbackDirsPsr0 + ); + } else { + $this->fallbackDirsPsr0 = array_merge( + $this->fallbackDirsPsr0, + (array) $paths + ); + } + + return; + } + + $first = $prefix[0]; + if (!isset($this->prefixesPsr0[$first][$prefix])) { + $this->prefixesPsr0[$first][$prefix] = (array) $paths; + + return; + } + if ($prepend) { + $this->prefixesPsr0[$first][$prefix] = array_merge( + (array) $paths, + $this->prefixesPsr0[$first][$prefix] + ); + } else { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $this->prefixesPsr0[$first][$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, either + * appending or prepending to the ones previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param array|string $paths The PSR-4 base directories + * @param bool $prepend Whether to prepend the directories + * + * @throws \InvalidArgumentException + */ + public function addPsr4($prefix, $paths, $prepend = false) + { + if (!$prefix) { + // Register directories for the root namespace. + if ($prepend) { + $this->fallbackDirsPsr4 = array_merge( + (array) $paths, + $this->fallbackDirsPsr4 + ); + } else { + $this->fallbackDirsPsr4 = array_merge( + $this->fallbackDirsPsr4, + (array) $paths + ); + } + } elseif (!isset($this->prefixDirsPsr4[$prefix])) { + // Register directories for a new namespace. + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } elseif ($prepend) { + // Prepend directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + (array) $paths, + $this->prefixDirsPsr4[$prefix] + ); + } else { + // Append directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $this->prefixDirsPsr4[$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, + * replacing any others previously set for this prefix. + * + * @param string $prefix The prefix + * @param array|string $paths The PSR-0 base directories + */ + public function set($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr0 = (array) $paths; + } else { + $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, + * replacing any others previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param array|string $paths The PSR-4 base directories + * + * @throws \InvalidArgumentException + */ + public function setPsr4($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr4 = (array) $paths; + } else { + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } + } + + /** + * Turns on searching the include path for class files. + * + * @param bool $useIncludePath + */ + public function setUseIncludePath($useIncludePath) + { + $this->useIncludePath = $useIncludePath; + } + + /** + * Can be used to check if the autoloader uses the include path to check + * for classes. + * + * @return bool + */ + public function getUseIncludePath() + { + return $this->useIncludePath; + } + + /** + * Turns off searching the prefix and fallback directories for classes + * that have not been registered with the class map. + * + * @param bool $classMapAuthoritative + */ + public function setClassMapAuthoritative($classMapAuthoritative) + { + $this->classMapAuthoritative = $classMapAuthoritative; + } + + /** + * Should class lookup fail if not found in the current class map? + * + * @return bool + */ + public function isClassMapAuthoritative() + { + return $this->classMapAuthoritative; + } + + /** + * APCu prefix to use to cache found/not-found classes, if the extension is enabled. + * + * @param string|null $apcuPrefix + */ + public function setApcuPrefix($apcuPrefix) + { + $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; + } + + /** + * The APCu prefix in use, or null if APCu caching is not enabled. + * + * @return string|null + */ + public function getApcuPrefix() + { + return $this->apcuPrefix; + } + + /** + * Registers this instance as an autoloader. + * + * @param bool $prepend Whether to prepend the autoloader or not + */ + public function register($prepend = false) + { + spl_autoload_register(array($this, 'loadClass'), true, $prepend); + } + + /** + * Unregisters this instance as an autoloader. + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + } + + /** + * Loads the given class or interface. + * + * @param string $class The name of the class + * @return bool|null True if loaded, null otherwise + */ + public function loadClass($class) + { + if ($file = $this->findFile($class)) { + includeFile($file); + + return true; + } + } + + /** + * Finds the path to the file where the class is defined. + * + * @param string $class The name of the class + * + * @return string|false The path if found, false otherwise + */ + public function findFile($class) + { + // class map lookup + if (isset($this->classMap[$class])) { + return $this->classMap[$class]; + } + if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { + return false; + } + if (null !== $this->apcuPrefix) { + $file = apcu_fetch($this->apcuPrefix.$class, $hit); + if ($hit) { + return $file; + } + } + + $file = $this->findFileWithExtension($class, '.php'); + + // Search for Hack files if we are running on HHVM + if (false === $file && defined('HHVM_VERSION')) { + $file = $this->findFileWithExtension($class, '.hh'); + } + + if (null !== $this->apcuPrefix) { + apcu_add($this->apcuPrefix.$class, $file); + } + + if (false === $file) { + // Remember that this class does not exist. + $this->missingClasses[$class] = true; + } + + return $file; + } + + private function findFileWithExtension($class, $ext) + { + // PSR-4 lookup + $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; + + $first = $class[0]; + if (isset($this->prefixLengthsPsr4[$first])) { + $subPath = $class; + while (false !== $lastPos = strrpos($subPath, '\\')) { + $subPath = substr($subPath, 0, $lastPos); + $search = $subPath . '\\'; + if (isset($this->prefixDirsPsr4[$search])) { + $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); + foreach ($this->prefixDirsPsr4[$search] as $dir) { + if (file_exists($file = $dir . $pathEnd)) { + return $file; + } + } + } + } + } + + // PSR-4 fallback dirs + foreach ($this->fallbackDirsPsr4 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { + return $file; + } + } + + // PSR-0 lookup + if (false !== $pos = strrpos($class, '\\')) { + // namespaced class name + $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) + . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); + } else { + // PEAR-like class name + $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; + } + + if (isset($this->prefixesPsr0[$first])) { + foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { + if (0 === strpos($class, $prefix)) { + foreach ($dirs as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + } + } + } + + // PSR-0 fallback dirs + foreach ($this->fallbackDirsPsr0 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + + // PSR-0 include paths. + if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { + return $file; + } + + return false; + } +} + +/** + * Scope isolated include. + * + * Prevents access to $this/self from included files. + */ +function includeFile($file) +{ + include $file; +} diff --git a/classes/includes/vendor/composer/LICENSE b/classes/includes/vendor/composer/LICENSE new file mode 100644 index 0000000..f27399a --- /dev/null +++ b/classes/includes/vendor/composer/LICENSE @@ -0,0 +1,21 @@ + +Copyright (c) Nils Adermann, Jordi Boggiano + +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/classes/includes/vendor/composer/autoload_classmap.php b/classes/includes/vendor/composer/autoload_classmap.php new file mode 100644 index 0000000..7a91153 --- /dev/null +++ b/classes/includes/vendor/composer/autoload_classmap.php @@ -0,0 +1,9 @@ + array($vendorDir . '/globalpayments/php-sdk/src'), +); diff --git a/classes/includes/vendor/composer/autoload_real.php b/classes/includes/vendor/composer/autoload_real.php new file mode 100644 index 0000000..8c3f11c --- /dev/null +++ b/classes/includes/vendor/composer/autoload_real.php @@ -0,0 +1,52 @@ += 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); + if ($useStaticLoader) { + require_once __DIR__ . '/autoload_static.php'; + + call_user_func(\Composer\Autoload\ComposerStaticInita72bf99c073d7f73aa177c21b69d17ba::getInitializer($loader)); + } else { + $map = require __DIR__ . '/autoload_namespaces.php'; + foreach ($map as $namespace => $path) { + $loader->set($namespace, $path); + } + + $map = require __DIR__ . '/autoload_psr4.php'; + foreach ($map as $namespace => $path) { + $loader->setPsr4($namespace, $path); + } + + $classMap = require __DIR__ . '/autoload_classmap.php'; + if ($classMap) { + $loader->addClassMap($classMap); + } + } + + $loader->register(true); + + return $loader; + } +} diff --git a/classes/includes/vendor/composer/autoload_static.php b/classes/includes/vendor/composer/autoload_static.php new file mode 100644 index 0000000..fc7ae04 --- /dev/null +++ b/classes/includes/vendor/composer/autoload_static.php @@ -0,0 +1,31 @@ + + array ( + 'GlobalPayments\\Api\\' => 19, + ), + ); + + public static $prefixDirsPsr4 = array ( + 'GlobalPayments\\Api\\' => + array ( + 0 => __DIR__ . '/..' . '/globalpayments/php-sdk/src', + ), + ); + + public static function getInitializer(ClassLoader $loader) + { + return \Closure::bind(function () use ($loader) { + $loader->prefixLengthsPsr4 = ComposerStaticInita72bf99c073d7f73aa177c21b69d17ba::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInita72bf99c073d7f73aa177c21b69d17ba::$prefixDirsPsr4; + + }, null, ClassLoader::class); + } +} diff --git a/classes/includes/vendor/composer/installed.json b/classes/includes/vendor/composer/installed.json new file mode 100644 index 0000000..dfb2237 --- /dev/null +++ b/classes/includes/vendor/composer/installed.json @@ -0,0 +1,49 @@ +[ + { + "name": "globalpayments/php-sdk", + "version": "1.3.3", + "version_normalized": "1.3.3.0", + "source": { + "type": "git", + "url": "https://github.com/globalpayments/php-sdk.git", + "reference": "1fd0393b3fc231fcff2977a152b7a7b9e0c1d57f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/globalpayments/php-sdk/zipball/1fd0393b3fc231fcff2977a152b7a7b9e0c1d57f", + "reference": "1fd0393b3fc231fcff2977a152b7a7b9e0c1d57f", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-dom": "*", + "ext-openssl": "*", + "php": ">= 5.5.9" + }, + "require-dev": { + "brianium/paratest": "dev-master", + "phpstan/phpstan-shim": "^0.8.4", + "phpunit/phpunit": "~5.0", + "squizlabs/php_codesniffer": "2.*" + }, + "time": "2019-10-03T15:15:47+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "GlobalPayments\\Api\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Heartland Payment Systems" + } + ], + "description": "PHP SDK for processing payments with Global Payments, including Heartland Payment Systems and Realex Payments", + "homepage": "https://developer.heartlandpaymentsystems.com/documentation" + } +] diff --git a/classes/includes/vendor/globalpayments/php-sdk/.gitignore b/classes/includes/vendor/globalpayments/php-sdk/.gitignore new file mode 100644 index 0000000..caae86d --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/.gitignore @@ -0,0 +1,9 @@ +composer.phar +/vendor/ + +# Commit your application's lock file http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file +# You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file +# composer.lock +composer +/docs/ +/docs-cache/ diff --git a/classes/includes/vendor/globalpayments/php-sdk/.travis.yml b/classes/includes/vendor/globalpayments/php-sdk/.travis.yml new file mode 100644 index 0000000..fc15400 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/.travis.yml @@ -0,0 +1,25 @@ +language: php + +sudo: false +branches: + only: + - master + +php: + - '7.0' + +install: + - composer install + +script: + # Build docs + - composer docs + +deploy: + local-dir: docs + provider: pages + skip-cleanup: true + github-token: $GITHUB_TOKEN # Set in the settings page of your repository, as a secure variable + keep-history: true + on: + branch: master diff --git a/classes/includes/vendor/globalpayments/php-sdk/LICENSE.md b/classes/includes/vendor/globalpayments/php-sdk/LICENSE.md new file mode 100644 index 0000000..0671f06 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/LICENSE.md @@ -0,0 +1,264 @@ +The GNU General Public License, Version 2, June 1991 (GPLv2) +============================================================ + +> Copyright (C) 1989, 1991 Free Software Foundation, Inc. +> 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +Everyone is permitted to copy and distribute verbatim copies of this license +document, but changing it is not allowed. + + +Preamble +-------- + +The licenses for most software are designed to take away your freedom to share +and change it. By contrast, the GNU General Public License is intended to +guarantee your freedom to share and change free software--to make sure the +software is free for all its users. This General Public License applies to most +of the Free Software Foundation's software and to any other program whose +authors commit to using it. (Some other Free Software Foundation software is +covered by the GNU Library General Public License instead.) You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our +General Public Licenses are designed to make sure that you have the freedom to +distribute copies of free software (and charge for this service if you wish), +that you receive source code or can get it if you want it, that you can change +the software or use pieces of it in new free programs; and that you know you can +do these things. + +To protect your rights, we need to make restrictions that forbid anyone to deny +you these rights or to ask you to surrender the rights. These restrictions +translate to certain responsibilities for you if you distribute copies of the +software, or if you modify it. + +For example, if you distribute copies of such a program, whether gratis or for a +fee, you must give the recipients all the rights that you have. You must make +sure that they, too, receive or can get the source code. And you must show them +these terms so they know their rights. + +We protect your rights with two steps: (1) copyright the software, and (2) offer +you this license which gives you legal permission to copy, distribute and/or +modify the software. + +Also, for each author's protection and ours, we want to make certain that +everyone understands that there is no warranty for this free software. If the +software is modified by someone else and passed on, we want its recipients to +know that what they have is not the original, so that any problems introduced by +others will not reflect on the original authors' reputations. + +Finally, any free program is threatened constantly by software patents. We wish +to avoid the danger that redistributors of a free program will individually +obtain patent licenses, in effect making the program proprietary. To prevent +this, we have made it clear that any patent must be licensed for everyone's free +use or not licensed at all. + +The precise terms and conditions for copying, distribution and modification +follow. + + +Terms And Conditions For Copying, Distribution And Modification +--------------------------------------------------------------- + +**0.** This License applies to any program or other work which contains a notice +placed by the copyright holder saying it may be distributed under the terms of +this General Public License. The "Program", below, refers to any such program or +work, and a "work based on the Program" means either the Program or any +derivative work under copyright law: that is to say, a work containing the +Program or a portion of it, either verbatim or with modifications and/or +translated into another language. (Hereinafter, translation is included without +limitation in the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not covered by +this License; they are outside its scope. The act of running the Program is not +restricted, and the output from the Program is covered only if its contents +constitute a work based on the Program (independent of having been made by +running the Program). Whether that is true depends on what the Program does. + +**1.** You may copy and distribute verbatim copies of the Program's source code +as you receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice and +disclaimer of warranty; keep intact all the notices that refer to this License +and to the absence of any warranty; and give any other recipients of the Program +a copy of this License along with the Program. + +You may charge a fee for the physical act of transferring a copy, and you may at +your option offer warranty protection in exchange for a fee. + +**2.** You may modify your copy or copies of the Program or any portion of it, +thus forming a work based on the Program, and copy and distribute such +modifications or work under the terms of Section 1 above, provided that you also +meet all of these conditions: + +* **a)** You must cause the modified files to carry prominent notices stating + that you changed the files and the date of any change. + +* **b)** You must cause any work that you distribute or publish, that in whole + or in part contains or is derived from the Program or any part thereof, to + be licensed as a whole at no charge to all third parties under the terms of + this License. + +* **c)** If the modified program normally reads commands interactively when + run, you must cause it, when started running for such interactive use in the + most ordinary way, to print or display an announcement including an + appropriate copyright notice and a notice that there is no warranty (or + else, saying that you provide a warranty) and that users may redistribute + the program under these conditions, and telling the user how to view a copy + of this License. (Exception: if the Program itself is interactive but does + not normally print such an announcement, your work based on the Program is + not required to print an announcement.) + +These requirements apply to the modified work as a whole. If identifiable +sections of that work are not derived from the Program, and can be reasonably +considered independent and separate works in themselves, then this License, and +its terms, do not apply to those sections when you distribute them as separate +works. But when you distribute the same sections as part of a whole which is a +work based on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the entire whole, +and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your +rights to work written entirely by you; rather, the intent is to exercise the +right to control the distribution of derivative or collective works based on the +Program. + +In addition, mere aggregation of another work not based on the Program with the +Program (or with a work based on the Program) on a volume of a storage or +distribution medium does not bring the other work under the scope of this +License. + +**3.** You may copy and distribute the Program (or a work based on it, under +Section 2) in object code or executable form under the terms of Sections 1 and 2 +above provided that you also do one of the following: + +* **a)** Accompany it with the complete corresponding machine-readable source + code, which must be distributed under the terms of Sections 1 and 2 above on + a medium customarily used for software interchange; or, + +* **b)** Accompany it with a written offer, valid for at least three years, to + give any third party, for a charge no more than your cost of physically + performing source distribution, a complete machine-readable copy of the + corresponding source code, to be distributed under the terms of Sections 1 + and 2 above on a medium customarily used for software interchange; or, + +* **c)** Accompany it with the information you received as to the offer to + distribute corresponding source code. (This alternative is allowed only for + noncommercial distribution and only if you received the program in object + code or executable form with such an offer, in accord with Subsection b + above.) + +The source code for a work means the preferred form of the work for making +modifications to it. For an executable work, complete source code means all the +source code for all modules it contains, plus any associated interface +definition files, plus the scripts used to control compilation and installation +of the executable. However, as a special exception, the source code distributed +need not include anything that is normally distributed (in either source or +binary form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component itself +accompanies the executable. + +If distribution of executable or object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the source code +from the same place counts as distribution of the source code, even though third +parties are not compelled to copy the source along with the object code. + +**4.** You may not copy, modify, sublicense, or distribute the Program except as +expressly provided under this License. Any attempt otherwise to copy, modify, +sublicense or distribute the Program is void, and will automatically terminate +your rights under this License. However, parties who have received copies, or +rights, from you under this License will not have their licenses terminated so +long as such parties remain in full compliance. + +**5.** You are not required to accept this License, since you have not signed +it. However, nothing else grants you permission to modify or distribute the +Program or its derivative works. These actions are prohibited by law if you do +not accept this License. Therefore, by modifying or distributing the Program (or +any work based on the Program), you indicate your acceptance of this License to +do so, and all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +**6.** Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the original +licensor to copy, distribute or modify the Program subject to these terms and +conditions. You may not impose any further restrictions on the recipients' +exercise of the rights granted herein. You are not responsible for enforcing +compliance by third parties to this License. + +**7.** If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), conditions +are imposed on you (whether by court order, agreement or otherwise) that +contradict the conditions of this License, they do not excuse you from the +conditions of this License. If you cannot distribute so as to satisfy +simultaneously your obligations under this License and any other pertinent +obligations, then as a consequence you may not distribute the Program at all. +For example, if a patent license would not permit royalty-free redistribution of +the Program by all those who receive copies directly or indirectly through you, +then the only way you could satisfy both it and this License would be to refrain +entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply and the +section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or +other property right claims or to contest validity of any such claims; this +section has the sole purpose of protecting the integrity of the free software +distribution system, which is implemented by public license practices. Many +people have made generous contributions to the wide range of software +distributed through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing to +distribute software through any other system and a licensee cannot impose that +choice. + +This section is intended to make thoroughly clear what is believed to be a +consequence of the rest of this License. + +**8.** If the distribution and/or use of the Program is restricted in certain +countries either by patents or by copyrighted interfaces, the original copyright +holder who places the Program under this License may add an explicit +geographical distribution limitation excluding those countries, so that +distribution is permitted only in or among countries not thus excluded. In such +case, this License incorporates the limitation as if written in the body of this +License. + +**9.** The Free Software Foundation may publish revised and/or new versions of +the General Public License from time to time. Such new versions will be similar +in spirit to the present version, but may differ in detail to address new +problems or concerns. + +Each version is given a distinguishing version number. If the Program specifies +a version number of this License which applies to it and "any later version", +you have the option of following the terms and conditions either of that version +or of any later version published by the Free Software Foundation. If the +Program does not specify a version number of this License, you may choose any +version ever published by the Free Software Foundation. + +**10.** If you wish to incorporate parts of the Program into other free programs +whose distribution conditions are different, write to the author to ask for +permission. For software which is copyrighted by the Free Software Foundation, +write to the Free Software Foundation; we sometimes make exceptions for this. +Our decision will be guided by the two goals of preserving the free status of +all derivatives of our free software and of promoting the sharing and reuse of +software generally. + + +No Warranty +----------- + +**11.** BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR +THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE +STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM +"AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +**12.** IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR +INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA +BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER +OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. diff --git a/classes/includes/vendor/globalpayments/php-sdk/README.md b/classes/includes/vendor/globalpayments/php-sdk/README.md new file mode 100644 index 0000000..3653399 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/README.md @@ -0,0 +1,136 @@ + + Global Payments logo + + +# Heartland & Global Payments PHP SDK + +This SDK makes it easy to integrate your PHP application with our Card Not Present and Card Present APIs. + +## Solutions + +### General / Omnichannel + +* API Payment Processing +* Apple Pay & Google Pay +* Secure Card Storage & Customer Management +* Subscriptions / Recurring Billing Solutions +* Credit, Debit, Gift & Loyalty, and eCheck/ACH + +### Card Not Present (Ecommerce & MOTO) Specific + +* Minimize PCI compliance requirements with Hosted Payment Solutions +* 140+ Authorization Currencies & 16 Settlement Currencies +* 150+ Local Payment Methods Worldwide +* Account Updater +* Inbuilt Fraud Prevention Rules +* 3D Secure, AVS and CVV Checks +* 260+ Global Enterprise Fraud Rules + +### Card Present (Terminal & POS) Specific + +* Secure End-To-End Encryption + +## Requirements + +- PHP 5.5.9+ +- OpenSSL 1.0.1+ +- PHP Curl extension +- PHP DOM extension +- PHP OpenSSL extension + +## Installation + +Installing the SDK into your solution is usually be done by either using Composer/Packagist, or by adding the project to your solution and referencing it directly. + +To install via [Composer/Packagist](https://packagist.org/packages/globalpayments/php-sdk): + +``` +composer require globalpayments/php-sdk +``` + +To install via a direct download: + +Download and unzip or, using Git, [clone the repository](https://github.com/globalpayments/php-sdk) from GitHub. See more on [how to clone repositories](https://help.github.com/articles/cloning-a-repository/). + +``` +git clone https://github.com/globalpayments/php-sdk +``` + +## Documentation and Examples + +You can find the latest SDK documentation along with code examples and test cards on the [Global Payments](https://developer.realexpayments.com) and [Heartland](https://developer.heartlandpaymentsystems.com/documentation) Developer Hubs. + +In addition you can find working examples in the our example code repository. + +*Quick Tip*: The included [test suite](https://github.com/globalpayments/php-sdk/tree/master/test) can be a great source of code samples for using the SDK! + +#### Process a Payment Example + +```csharp +$card = new CreditCardData(); +$card->number = "4111111111111111"; +$card->expMonth = "12"; +$card->expYear = "2025"; +$card->cvn = "123"; + +try { + $response = $card->charge(129.99) + ->withCurrency("EUR") + ->execute(); + + $result = $response->responseCode; // 00 == Success + $message = $response->responseMessage; // [ test system ] AUTHORISED +} catch (ApiException $e) { + // handle errors +} +``` + +#### Test Card Data + +Name | Number | Exp Month | Exp Year | CVN +----------- | ---------------- | --------- | -------- | ---- +Visa | 4263970000005262 | 12 | 2025 | 123 +MasterCard | 2223000010005780 | 12 | 2019 | 900 +MasterCard | 5425230000004415 | 12 | 2025 | 123 +Discover | 6011000000000087 | 12 | 2025 | 123 +Amex | 374101000000608 | 12 | 2025 | 1234 +JCB | 3566000000000000 | 12 | 2025 | 123 +Diners Club | 36256000000725 | 12 | 2025 | 123 + +#### Testing Exceptions + +During your integration you will want to test for specific issuer responses such as 'Card Declined'. Because our sandbox environments do not actually reach out to issuing banks for authorizations, there are specific transaction amounts and/or card numbers that will trigger gateway and issuing bank responses. Please contact your support representative for a complete listing of values used to simulate transaction AVS/CVV results, declines, errors, and other responses that can be caught in your code. Example error handling code: + +```php +try { + $response = $card->charge(129.99) + ->withCurrency("EUR") + ->execute(); +} catch (BuilderException $e) { + // handle builder errors +} catch (ConfigurationException $e) { + // handle errors related to your services configuration +} catch (GatewayException $e) { + // handle gateway errors/exceptions +} catch (UnsupportedTransactionException $e) { + // handle errors when the configured gateway doesn't support + // desired transaction +} catch (ApiException $e) { + // handle all other errors +} +``` + +## Contributing + +All our code is open sourced and we encourage fellow developers to contribute and help improve it! + +1. Fork it +2. Create your feature branch (`git checkout -b my-new-feature`) +3. Ensure SDK tests are passing +4. Commit your changes (`git commit -am 'Add some feature'`) +5. Push to the branch (`git push origin my-new-feature`) +6. Create new Pull Request + +## License + +This project is licensed under the GNU General Public License v2.0. Please see [LICENSE.md](LICENSE.md) located at the project's root for more details. diff --git a/classes/includes/vendor/globalpayments/php-sdk/composer.json b/classes/includes/vendor/globalpayments/php-sdk/composer.json new file mode 100644 index 0000000..ae26fd4 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/composer.json @@ -0,0 +1,44 @@ +{ + "name": "globalpayments/php-sdk", + "description": "PHP SDK for processing payments with Global Payments, including Heartland Payment Systems and Realex Payments", + "keywords": [ + ], + "homepage": "https://developer.heartlandpaymentsystems.com/documentation", + "license": "GPL-2.0-or-later", + "authors": [ + { + "name": "Heartland Payment Systems" + } + ], + "require": { + "php": ">= 5.5.9", + "ext-curl": "*", + "ext-dom": "*", + "ext-openssl": "*" + }, + "require-dev": { + "phpunit/phpunit": "~5.0", + "brianium/paratest": "dev-master", + "squizlabs/php_codesniffer": "2.*", + "phpstan/phpstan-shim": "^0.8.4" + }, + "autoload": { + "psr-4": { + "GlobalPayments\\Api\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "GlobalPayments\\Api\\Tests\\": "test/" + } + }, + "scripts": { + "docs": "@php sami.phar update docs-config.php", + "pretest": "@composer test:lint", + "test": "@composer pretest && paratest --coverage-html=coverage.html --colors -f --stop-on-failure", + "test:lint": "phpcs" + }, + "config": { + "process-timeout":0 + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/composer.lock b/classes/includes/vendor/globalpayments/php-sdk/composer.lock new file mode 100644 index 0000000..0260065 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/composer.lock @@ -0,0 +1,4199 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "This file is @generated automatically" + ], + "content-hash": "5400d26ad80e42feba9aa303ed2a3d0c", + "packages": [], + "packages-dev": [ + { + "name": "brianium/habitat", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/brianium/habitat.git", + "reference": "d0979e3bb379cbc78ecb42b3ac171bc2b7e06d96" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/brianium/habitat/zipball/d0979e3bb379cbc78ecb42b3ac171bc2b7e06d96", + "reference": "d0979e3bb379cbc78ecb42b3ac171bc2b7e06d96", + "shasum": "" + }, + "require-dev": { + "monolog/monolog": ">=1.5.0", + "phpunit/phpunit": ">=3.7.21" + }, + "type": "library", + "autoload": { + "psr-0": { + "Habitat": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian", + "email": "scaturrob@gmail.com", + "homepage": "http://brianscaturro.com", + "role": "Lead" + } + ], + "description": "A dependable php environment", + "time": "2013-06-08T04:42:29+00:00" + }, + { + "name": "brianium/paratest", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/brianium/paratest.git", + "reference": "b4c5be606a03af51c313c12018a5e80d0ab9b94b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/brianium/paratest/zipball/b4c5be606a03af51c313c12018a5e80d0ab9b94b", + "reference": "b4c5be606a03af51c313c12018a5e80d0ab9b94b", + "shasum": "" + }, + "require": { + "brianium/habitat": "1.0.0", + "composer/semver": "~1.2", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-simplexml": "*", + "php": ">=5.5.11", + "phpunit/php-timer": ">=1.0.4", + "phpunit/phpunit": "~5.0", + "symfony/console": "~2.3|~3.0", + "symfony/process": "~2.3|~3.0" + }, + "bin": [ + "bin/paratest" + ], + "type": "library", + "autoload": { + "psr-0": { + "ParaTest": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Scaturro", + "email": "scaturrob@gmail.com", + "homepage": "http://brianscaturro.com", + "role": "Lead" + } + ], + "description": "Parallel testing for PHP", + "homepage": "https://github.com/brianium/paratest", + "keywords": [ + "concurrent", + "parallel", + "phpunit", + "testing" + ], + "time": "2017-06-07T20:20:03+00:00" + }, + { + "name": "cilex/cilex", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/Cilex/Cilex.git", + "reference": "7acd965a609a56d0345e8b6071c261fbdb926cb5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Cilex/Cilex/zipball/7acd965a609a56d0345e8b6071c261fbdb926cb5", + "reference": "7acd965a609a56d0345e8b6071c261fbdb926cb5", + "shasum": "" + }, + "require": { + "cilex/console-service-provider": "1.*", + "php": ">=5.3.3", + "pimple/pimple": "~1.0", + "symfony/finder": "~2.1", + "symfony/process": "~2.1" + }, + "require-dev": { + "phpunit/phpunit": "3.7.*", + "symfony/validator": "~2.1" + }, + "suggest": { + "monolog/monolog": ">=1.0.0", + "symfony/validator": ">=1.0.0", + "symfony/yaml": ">=1.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-0": { + "Cilex": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "mike.vanriel@naenius.com" + } + ], + "description": "The PHP micro-framework for Command line tools based on the Symfony2 Components", + "homepage": "http://cilex.github.com", + "keywords": [ + "cli", + "microframework" + ], + "time": "2014-03-29T14:03:13+00:00" + }, + { + "name": "cilex/console-service-provider", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/Cilex/console-service-provider.git", + "reference": "25ee3d1875243d38e1a3448ff94bdf944f70d24e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Cilex/console-service-provider/zipball/25ee3d1875243d38e1a3448ff94bdf944f70d24e", + "reference": "25ee3d1875243d38e1a3448ff94bdf944f70d24e", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "pimple/pimple": "1.*@dev", + "symfony/console": "~2.1" + }, + "require-dev": { + "cilex/cilex": "1.*@dev", + "silex/silex": "1.*@dev" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-0": { + "Cilex\\Provider\\Console": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Mike van Riel", + "email": "mike.vanriel@naenius.com" + } + ], + "description": "Console Service Provider", + "keywords": [ + "cilex", + "console", + "pimple", + "service-provider", + "silex" + ], + "time": "2012-12-19T10:50:58+00:00" + }, + { + "name": "composer/semver", + "version": "1.4.2", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "c7cb9a2095a074d131b65a8a0cd294479d785573" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/c7cb9a2095a074d131b65a8a0cd294479d785573", + "reference": "c7cb9a2095a074d131b65a8a0cd294479d785573", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.5 || ^5.0.5", + "phpunit/phpunit-mock-objects": "2.3.0 || ^3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "time": "2016-08-30T16:08:34+00:00" + }, + { + "name": "container-interop/container-interop", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/container-interop/container-interop.git", + "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/container-interop/container-interop/zipball/79cbf1341c22ec75643d841642dd5d6acd83bdb8", + "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8", + "shasum": "" + }, + "require": { + "psr/container": "^1.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Interop\\Container\\": "src/Interop/Container/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Promoting the interoperability of container objects (DIC, SL, etc.)", + "homepage": "https://github.com/container-interop/container-interop", + "time": "2017-02-14T19:40:03+00:00" + }, + { + "name": "doctrine/annotations", + "version": "v1.4.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/annotations.git", + "reference": "54cacc9b81758b14e3ce750f205a393d52339e97" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/54cacc9b81758b14e3ce750f205a393d52339e97", + "reference": "54cacc9b81758b14e3ce750f205a393d52339e97", + "shasum": "" + }, + "require": { + "doctrine/lexer": "1.*", + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "doctrine/cache": "1.*", + "phpunit/phpunit": "^5.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Docblock Annotations Parser", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "annotations", + "docblock", + "parser" + ], + "time": "2017-02-24T16:22:25+00:00" + }, + { + "name": "doctrine/instantiator", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", + "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", + "shasum": "" + }, + "require": { + "php": ">=5.3,<8.0-DEV" + }, + "require-dev": { + "athletic/athletic": "~0.1.8", + "ext-pdo": "*", + "ext-phar": "*", + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "~2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.com/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://github.com/doctrine/instantiator", + "keywords": [ + "constructor", + "instantiate" + ], + "time": "2015-06-14T21:17:01+00:00" + }, + { + "name": "doctrine/lexer", + "version": "v1.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c", + "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\Common\\Lexer\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "lexer", + "parser" + ], + "time": "2014-09-09T13:34:57+00:00" + }, + { + "name": "erusev/parsedown", + "version": "1.6.2", + "source": { + "type": "git", + "url": "https://github.com/erusev/parsedown.git", + "reference": "1bf24f7334fe16c88bf9d467863309ceaf285b01" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/erusev/parsedown/zipball/1bf24f7334fe16c88bf9d467863309ceaf285b01", + "reference": "1bf24f7334fe16c88bf9d467863309ceaf285b01", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "Parsedown": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Emanuil Rusev", + "email": "hello@erusev.com", + "homepage": "http://erusev.com" + } + ], + "description": "Parser for Markdown.", + "homepage": "http://parsedown.org", + "keywords": [ + "markdown", + "parser" + ], + "time": "2017-03-29T16:04:15+00:00" + }, + { + "name": "herrera-io/json", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/kherge-php/json.git", + "reference": "60c696c9370a1e5136816ca557c17f82a6fa83f1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/kherge-php/json/zipball/60c696c9370a1e5136816ca557c17f82a6fa83f1", + "reference": "60c696c9370a1e5136816ca557c17f82a6fa83f1", + "shasum": "" + }, + "require": { + "ext-json": "*", + "justinrainbow/json-schema": ">=1.0,<2.0-dev", + "php": ">=5.3.3", + "seld/jsonlint": ">=1.0,<2.0-dev" + }, + "require-dev": { + "herrera-io/phpunit-test-case": "1.*", + "mikey179/vfsstream": "1.1.0", + "phpunit/phpunit": "3.7.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "files": [ + "src/lib/json_version.php" + ], + "psr-0": { + "Herrera\\Json": "src/lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kevin Herrera", + "email": "kevin@herrera.io", + "homepage": "http://kevin.herrera.io" + } + ], + "description": "A library for simplifying JSON linting and validation.", + "homepage": "http://herrera-io.github.com/php-json", + "keywords": [ + "json", + "lint", + "schema", + "validate" + ], + "abandoned": "kherge/json", + "time": "2013-10-30T16:51:34+00:00" + }, + { + "name": "herrera-io/phar-update", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/kherge-abandoned/php-phar-update.git", + "reference": "00a79e1d5b8cf3c080a2e3becf1ddf7a7fea025b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/kherge-abandoned/php-phar-update/zipball/00a79e1d5b8cf3c080a2e3becf1ddf7a7fea025b", + "reference": "00a79e1d5b8cf3c080a2e3becf1ddf7a7fea025b", + "shasum": "" + }, + "require": { + "herrera-io/json": "1.*", + "kherge/version": "1.*", + "php": ">=5.3.3" + }, + "require-dev": { + "herrera-io/phpunit-test-case": "1.*", + "mikey179/vfsstream": "1.1.0", + "phpunit/phpunit": "3.7.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "files": [ + "src/lib/constants.php" + ], + "psr-0": { + "Herrera\\Phar\\Update": "src/lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kevin Herrera", + "email": "kevin@herrera.io", + "homepage": "http://kevin.herrera.io" + } + ], + "description": "A library for self-updating Phars.", + "homepage": "http://herrera-io.github.com/php-phar-update", + "keywords": [ + "phar", + "update" + ], + "abandoned": true, + "time": "2013-10-30T17:23:01+00:00" + }, + { + "name": "jms/metadata", + "version": "1.6.0", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/metadata.git", + "reference": "6a06970a10e0a532fb52d3959547123b84a3b3ab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/metadata/zipball/6a06970a10e0a532fb52d3959547123b84a3b3ab", + "reference": "6a06970a10e0a532fb52d3959547123b84a3b3ab", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "doctrine/cache": "~1.0", + "symfony/cache": "~3.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.5.x-dev" + } + }, + "autoload": { + "psr-0": { + "Metadata\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Class/method/property metadata management in PHP", + "keywords": [ + "annotations", + "metadata", + "xml", + "yaml" + ], + "time": "2016-12-05T10:18:33+00:00" + }, + { + "name": "jms/parser-lib", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/parser-lib.git", + "reference": "c509473bc1b4866415627af0e1c6cc8ac97fa51d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/parser-lib/zipball/c509473bc1b4866415627af0e1c6cc8ac97fa51d", + "reference": "c509473bc1b4866415627af0e1c6cc8ac97fa51d", + "shasum": "" + }, + "require": { + "phpoption/phpoption": ">=0.9,<2.0-dev" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-0": { + "JMS\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache2" + ], + "description": "A library for easily creating recursive-descent parsers.", + "time": "2012-11-18T18:08:43+00:00" + }, + { + "name": "jms/serializer", + "version": "1.7.1", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/serializer.git", + "reference": "4fad8bbbe76e05de3b79ffa3db027058ed3813ff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/4fad8bbbe76e05de3b79ffa3db027058ed3813ff", + "reference": "4fad8bbbe76e05de3b79ffa3db027058ed3813ff", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1.0", + "doctrine/instantiator": "^1.0.3", + "jms/metadata": "~1.1", + "jms/parser-lib": "1.*", + "php": ">=5.5.0", + "phpcollection/phpcollection": "~0.1", + "phpoption/phpoption": "^1.1" + }, + "conflict": { + "jms/serializer-bundle": "<1.2.1", + "twig/twig": "<1.12" + }, + "require-dev": { + "doctrine/orm": "~2.1", + "doctrine/phpcr-odm": "^1.3|^2.0", + "ext-pdo_sqlite": "*", + "jackalope/jackalope-doctrine-dbal": "^1.1.5", + "phpunit/phpunit": "^4.8|^5.0", + "propel/propel1": "~1.7", + "symfony/expression-language": "^2.6|^3.0", + "symfony/filesystem": "^2.1", + "symfony/form": "~2.1|^3.0", + "symfony/translation": "^2.1|^3.0", + "symfony/validator": "^2.2|^3.0", + "symfony/yaml": "^2.1|^3.0", + "twig/twig": "~1.12|~2.0" + }, + "suggest": { + "doctrine/cache": "Required if you like to use cache functionality.", + "doctrine/collections": "Required if you like to use doctrine collection types as ArrayCollection.", + "symfony/yaml": "Required if you'd like to serialize data to YAML format." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8-dev" + } + }, + "autoload": { + "psr-0": { + "JMS\\Serializer": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Library for (de-)serializing data of any complexity; supports XML, JSON, and YAML.", + "homepage": "http://jmsyst.com/libs/serializer", + "keywords": [ + "deserialization", + "jaxb", + "json", + "serialization", + "xml" + ], + "time": "2017-05-15T08:35:42+00:00" + }, + { + "name": "justinrainbow/json-schema", + "version": "1.6.1", + "source": { + "type": "git", + "url": "https://github.com/justinrainbow/json-schema.git", + "reference": "cc84765fb7317f6b07bd8ac78364747f95b86341" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/cc84765fb7317f6b07bd8ac78364747f95b86341", + "reference": "cc84765fb7317f6b07bd8ac78364747f95b86341", + "shasum": "" + }, + "require": { + "php": ">=5.3.29" + }, + "require-dev": { + "json-schema/json-schema-test-suite": "1.1.0", + "phpdocumentor/phpdocumentor": "~2", + "phpunit/phpunit": "~3.7" + }, + "bin": [ + "bin/validate-json" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6.x-dev" + } + }, + "autoload": { + "psr-4": { + "JsonSchema\\": "src/JsonSchema/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Bruno Prieto Reis", + "email": "bruno.p.reis@gmail.com" + }, + { + "name": "Justin Rainbow", + "email": "justin.rainbow@gmail.com" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + }, + { + "name": "Robert Schönthal", + "email": "seroscho@googlemail.com" + } + ], + "description": "A library to validate a json schema.", + "homepage": "https://github.com/justinrainbow/json-schema", + "keywords": [ + "json", + "schema" + ], + "time": "2016-01-25T15:43:01+00:00" + }, + { + "name": "kherge/version", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/kherge-abandoned/Version.git", + "reference": "f07cf83f8ce533be8f93d2893d96d674bbeb7e30" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/kherge-abandoned/Version/zipball/f07cf83f8ce533be8f93d2893d96d674bbeb7e30", + "reference": "f07cf83f8ce533be8f93d2893d96d674bbeb7e30", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-0": { + "KevinGH\\Version": "src/lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kevin Herrera", + "email": "me@kevingh.com" + } + ], + "description": "A parsing and comparison library for semantic versioning.", + "homepage": "http://github.com/kherge/Version", + "abandoned": true, + "time": "2012-08-16T17:13:03+00:00" + }, + { + "name": "monolog/monolog", + "version": "1.22.1", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "1e044bc4b34e91743943479f1be7a1d5eb93add0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/1e044bc4b34e91743943479f1be7a1d5eb93add0", + "reference": "1e044bc4b34e91743943479f1be7a1d5eb93add0", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "psr/log": "~1.0" + }, + "provide": { + "psr/log-implementation": "1.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "graylog2/gelf-php": "~1.0", + "jakub-onderka/php-parallel-lint": "0.9", + "php-amqplib/php-amqplib": "~2.4", + "php-console/php-console": "^3.1.3", + "phpunit/phpunit": "~4.5", + "phpunit/phpunit-mock-objects": "2.3.0", + "ruflin/elastica": ">=0.90 <3.0", + "sentry/sentry": "^0.13", + "swiftmailer/swiftmailer": "~5.3" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-mongo": "Allow sending log messages to a MongoDB server", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "php-console/php-console": "Allow sending log messages to Google Chrome", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server", + "sentry/sentry": "Allow sending log messages to a Sentry server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "http://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "time": "2017-03-13T07:08:03+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.6.1", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "8e6e04167378abf1ddb4d3522d8755c5fd90d102" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/8e6e04167378abf1ddb4d3522d8755c5fd90d102", + "reference": "8e6e04167378abf1ddb4d3522d8755c5fd90d102", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "doctrine/collections": "1.*", + "phpunit/phpunit": "~4.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "homepage": "https://github.com/myclabs/DeepCopy", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "time": "2017-04-12T18:52:22+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v1.4.1", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "f78af2c9c86107aa1a34cd1dbb5bbe9eeb0d9f51" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f78af2c9c86107aa1a34cd1dbb5bbe9eeb0d9f51", + "reference": "f78af2c9c86107aa1a34cd1dbb5bbe9eeb0d9f51", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "files": [ + "lib/bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "time": "2015-09-19T14:15:08+00:00" + }, + { + "name": "phpcollection/phpcollection", + "version": "0.5.0", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-collection.git", + "reference": "f2bcff45c0da7c27991bbc1f90f47c4b7fb434a6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-collection/zipball/f2bcff45c0da7c27991bbc1f90f47c4b7fb434a6", + "reference": "f2bcff45c0da7c27991bbc1f90f47c4b7fb434a6", + "shasum": "" + }, + "require": { + "phpoption/phpoption": "1.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.4-dev" + } + }, + "autoload": { + "psr-0": { + "PhpCollection": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache2" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "General-Purpose Collection Library for PHP", + "keywords": [ + "collection", + "list", + "map", + "sequence", + "set" + ], + "time": "2015-05-17T12:39:23+00:00" + }, + { + "name": "phpdocumentor/fileset", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/Fileset.git", + "reference": "bfa78d8fa9763dfce6d0e5d3730c1d8ab25d34b0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/Fileset/zipball/bfa78d8fa9763dfce6d0e5d3730c1d8ab25d34b0", + "reference": "bfa78d8fa9763dfce6d0e5d3730c1d8ab25d34b0", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/finder": "~2.1" + }, + "require-dev": { + "phpunit/phpunit": "~3.7" + }, + "type": "library", + "autoload": { + "psr-0": { + "phpDocumentor": [ + "src/", + "tests/unit/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Fileset component for collecting a set of files given directories and file paths", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "files", + "fileset", + "phpdoc" + ], + "time": "2013-08-06T21:07:42+00:00" + }, + { + "name": "phpdocumentor/graphviz", + "version": "1.0.4", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/GraphViz.git", + "reference": "a906a90a9f230535f25ea31caf81b2323956283f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/GraphViz/zipball/a906a90a9f230535f25ea31caf81b2323956283f", + "reference": "a906a90a9f230535f25ea31caf81b2323956283f", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "phpDocumentor": [ + "src/", + "tests/unit" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "mike.vanriel@naenius.com" + } + ], + "time": "2016-02-02T13:00:08+00:00" + }, + { + "name": "phpdocumentor/phpdocumentor", + "version": "v2.9.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/phpDocumentor2.git", + "reference": "be607da0eef9b9249c43c5b4820d25d631c73667" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/phpDocumentor2/zipball/be607da0eef9b9249c43c5b4820d25d631c73667", + "reference": "be607da0eef9b9249c43c5b4820d25d631c73667", + "shasum": "" + }, + "require": { + "cilex/cilex": "~1.0", + "erusev/parsedown": "~1.0", + "herrera-io/phar-update": "1.0.3", + "jms/serializer": ">=0.12", + "monolog/monolog": "~1.6", + "php": ">=5.3.3", + "phpdocumentor/fileset": "~1.0", + "phpdocumentor/graphviz": "~1.0", + "phpdocumentor/reflection": "^3.0", + "phpdocumentor/reflection-docblock": "~2.0", + "symfony/config": "~2.3", + "symfony/console": "~2.3", + "symfony/event-dispatcher": "~2.1", + "symfony/process": "~2.0", + "symfony/stopwatch": "~2.3", + "symfony/validator": "~2.2", + "twig/twig": "~1.3", + "zendframework/zend-cache": "~2.1", + "zendframework/zend-config": "~2.1", + "zendframework/zend-filter": "~2.1", + "zendframework/zend-i18n": "~2.1", + "zendframework/zend-serializer": "~2.1", + "zendframework/zend-servicemanager": "~2.1", + "zendframework/zend-stdlib": "~2.1", + "zetacomponents/document": ">=1.3.1" + }, + "require-dev": { + "behat/behat": "~3.0", + "mikey179/vfsstream": "~1.2", + "mockery/mockery": "~0.9@dev", + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "~1.4", + "symfony/expression-language": "~2.4" + }, + "suggest": { + "ext-twig": "Enabling the twig extension improves the generation of twig based templates.", + "ext-xslcache": "Enabling the XSLCache extension improves the generation of xml based templates." + }, + "bin": [ + "bin/phpdoc.php", + "bin/phpdoc" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-develop": "2.9-dev" + } + }, + "autoload": { + "psr-0": { + "phpDocumentor": [ + "src/", + "tests/unit/" + ], + "Cilex\\Provider": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Documentation Generator for PHP", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "api", + "application", + "dga", + "documentation", + "phpdoc" + ], + "time": "2016-05-22T09:50:56+00:00" + }, + { + "name": "phpdocumentor/reflection", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/Reflection.git", + "reference": "793bfd92d9a0fc96ae9608fb3e947c3f59fb3a0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/Reflection/zipball/793bfd92d9a0fc96ae9608fb3e947c3f59fb3a0d", + "reference": "793bfd92d9a0fc96ae9608fb3e947c3f59fb3a0d", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^1.0", + "php": ">=5.3.3", + "phpdocumentor/reflection-docblock": "~2.0", + "psr/log": "~1.0" + }, + "require-dev": { + "behat/behat": "~2.4", + "mockery/mockery": "~0.8", + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "phpDocumentor": [ + "src/", + "tests/unit/", + "tests/mocks/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Reflection library to do Static Analysis for PHP Projects", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "time": "2016-05-21T08:42:32+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "2.0.5", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "e6a969a640b00d8daa3c66518b0405fb41ae0c4b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/e6a969a640b00d8daa3c66518b0405fb41ae0c4b", + "reference": "e6a969a640b00d8daa3c66518b0405fb41ae0c4b", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "suggest": { + "dflydev/markdown": "~1.0", + "erusev/parsedown": "~1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "phpDocumentor": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "mike.vanriel@naenius.com" + } + ], + "time": "2016-01-25T08:17:30+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.5.0", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "94e644f7d2051a5f0fcf77d81605f152eecff0ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/94e644f7d2051a5f0fcf77d81605f152eecff0ed", + "reference": "94e644f7d2051a5f0fcf77d81605f152eecff0ed", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "4.7.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "psr-0": { + "PhpOption\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache2" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "time": "2015-07-25T16:39:46+00:00" + }, + { + "name": "phpspec/prophecy", + "version": "v1.7.0", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "93d39f1f7f9326d746203c7c056f300f7f126073" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/93d39f1f7f9326d746203c7c056f300f7f126073", + "reference": "93d39f1f7f9326d746203c7c056f300f7f126073", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "php": "^5.3|^7.0", + "phpdocumentor/reflection-docblock": "^2.0|^3.0.2", + "sebastian/comparator": "^1.1|^2.0", + "sebastian/recursion-context": "^1.0|^2.0|^3.0" + }, + "require-dev": { + "phpspec/phpspec": "^2.5|^3.2", + "phpunit/phpunit": "^4.8 || ^5.6.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6.x-dev" + } + }, + "autoload": { + "psr-0": { + "Prophecy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + }, + { + "name": "Marcello Duarte", + "email": "marcello.duarte@gmail.com" + } + ], + "description": "Highly opinionated mocking framework for PHP 5.3+", + "homepage": "https://github.com/phpspec/prophecy", + "keywords": [ + "Double", + "Dummy", + "fake", + "mock", + "spy", + "stub" + ], + "time": "2017-03-02T20:05:34+00:00" + }, + { + "name": "phpstan/phpstan-shim", + "version": "0.8.4", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan-shim.git", + "reference": "0f18bcb91b7ee29571fab315d334752b123dc003" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan-shim/zipball/0f18bcb91b7ee29571fab315d334752b123dc003", + "reference": "0f18bcb91b7ee29571fab315d334752b123dc003", + "shasum": "" + }, + "require": { + "php": "~7.0" + }, + "provide": { + "phpstan/phpstan": "0.8" + }, + "bin": [ + "phpstan.phar" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.8-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPStan Phar distribution", + "time": "2017-08-25T08:33:08+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "4.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ef7b2f56815df854e66ceaee8ebe9393ae36a40d", + "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-xmlwriter": "*", + "php": "^5.6 || ^7.0", + "phpunit/php-file-iterator": "^1.3", + "phpunit/php-text-template": "^1.2", + "phpunit/php-token-stream": "^1.4.2 || ^2.0", + "sebastian/code-unit-reverse-lookup": "^1.0", + "sebastian/environment": "^1.3.2 || ^2.0", + "sebastian/version": "^1.0 || ^2.0" + }, + "require-dev": { + "ext-xdebug": "^2.1.4", + "phpunit/phpunit": "^5.7" + }, + "suggest": { + "ext-xdebug": "^2.5.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "time": "2017-04-02T07:44:40+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "1.4.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3cc8f69b3028d0f96a9078e6295d86e9bf019be5", + "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "time": "2016-10-03T07:40:28+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "time": "2015-06-21T13:50:34+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "1.0.9", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", + "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "time": "2017-02-26T11:10:40+00:00" + }, + { + "name": "phpunit/php-token-stream", + "version": "1.4.11", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "e03f8f67534427a787e21a385a67ec3ca6978ea7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/e03f8f67534427a787e21a385a67ec3ca6978ea7", + "reference": "e03f8f67534427a787e21a385a67ec3ca6978ea7", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Wrapper around PHP's tokenizer extension.", + "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "keywords": [ + "tokenizer" + ], + "time": "2017-02-27T10:12:30+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "5.7.20", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "3cb94a5f8c07a03c8b7527ed7468a2926203f58b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3cb94a5f8c07a03c8b7527ed7468a2926203f58b", + "reference": "3cb94a5f8c07a03c8b7527ed7468a2926203f58b", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "myclabs/deep-copy": "~1.3", + "php": "^5.6 || ^7.0", + "phpspec/prophecy": "^1.6.2", + "phpunit/php-code-coverage": "^4.0.4", + "phpunit/php-file-iterator": "~1.4", + "phpunit/php-text-template": "~1.2", + "phpunit/php-timer": "^1.0.6", + "phpunit/phpunit-mock-objects": "^3.2", + "sebastian/comparator": "^1.2.4", + "sebastian/diff": "^1.4.3", + "sebastian/environment": "^1.3.4 || ^2.0", + "sebastian/exporter": "~2.0", + "sebastian/global-state": "^1.1", + "sebastian/object-enumerator": "~2.0", + "sebastian/resource-operations": "~1.0", + "sebastian/version": "~1.0.3|~2.0", + "symfony/yaml": "~2.1|~3.0" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "3.0.2" + }, + "require-dev": { + "ext-pdo": "*" + }, + "suggest": { + "ext-xdebug": "*", + "phpunit/php-invoker": "~1.1" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.7.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "time": "2017-05-22T07:42:55+00:00" + }, + { + "name": "phpunit/phpunit-mock-objects", + "version": "3.4.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", + "reference": "3ab72b65b39b491e0c011e2e09bb2206c2aa8e24" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/3ab72b65b39b491e0c011e2e09bb2206c2aa8e24", + "reference": "3ab72b65b39b491e0c011e2e09bb2206c2aa8e24", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "php": "^5.6 || ^7.0", + "phpunit/php-text-template": "^1.2", + "sebastian/exporter": "^1.2 || ^2.0" + }, + "conflict": { + "phpunit/phpunit": "<5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.4" + }, + "suggest": { + "ext-soap": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Mock Object library for PHPUnit", + "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", + "keywords": [ + "mock", + "xunit" + ], + "time": "2016-12-08T20:27:08+00:00" + }, + { + "name": "pimple/pimple", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/silexphp/Pimple.git", + "reference": "2019c145fe393923f3441b23f29bbdfaa5c58c4d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/silexphp/Pimple/zipball/2019c145fe393923f3441b23f29bbdfaa5c58c4d", + "reference": "2019c145fe393923f3441b23f29bbdfaa5c58c4d", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-0": { + "Pimple": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Pimple is a simple Dependency Injection Container for PHP 5.3", + "homepage": "http://pimple.sensiolabs.org", + "keywords": [ + "container", + "dependency injection" + ], + "time": "2013-11-22T08:30:29+00:00" + }, + { + "name": "psr/container", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "time": "2017-02-14T16:28:37+00:00" + }, + { + "name": "psr/log", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", + "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2016-10-10T12:19:37+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7 || ^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "time": "2017-03-04T06:30:41+00:00" + }, + { + "name": "sebastian/comparator", + "version": "1.2.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", + "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "sebastian/diff": "~1.2", + "sebastian/exporter": "~1.2 || ~2.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "http://www.github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "time": "2017-01-29T09:50:25+00:00" + }, + { + "name": "sebastian/diff", + "version": "1.4.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4", + "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff" + ], + "time": "2017-05-22T07:24:03+00:00" + }, + { + "name": "sebastian/environment", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5795ffe5dc5b02460c3e34222fee8cbe245d8fac", + "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "time": "2016-11-26T07:53:53+00:00" + }, + { + "name": "sebastian/exporter", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4", + "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "sebastian/recursion-context": "~2.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "http://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "time": "2016-11-19T08:54:04+00:00" + }, + { + "name": "sebastian/global-state", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4", + "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.2" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "time": "2015-10-12T03:26:01+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1311872ac850040a79c3c058bea3e22d0f09cbb7", + "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7", + "shasum": "" + }, + "require": { + "php": ">=5.6", + "sebastian/recursion-context": "~2.0" + }, + "require-dev": { + "phpunit/phpunit": "~5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "time": "2017-02-18T15:18:39+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/2c3ba150cbec723aa057506e73a8d33bdb286c9a", + "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "time": "2016-11-19T07:33:16+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", + "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", + "shasum": "" + }, + "require": { + "php": ">=5.6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "time": "2015-07-28T20:34:47+00:00" + }, + { + "name": "sebastian/version", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "time": "2016-10-03T07:35:21+00:00" + }, + { + "name": "seld/jsonlint", + "version": "1.6.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/jsonlint.git", + "reference": "791f8c594f300d246cdf01c6b3e1e19611e301d8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/791f8c594f300d246cdf01c6b3e1e19611e301d8", + "reference": "791f8c594f300d246cdf01c6b3e1e19611e301d8", + "shasum": "" + }, + "require": { + "php": "^5.3 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.5" + }, + "bin": [ + "bin/jsonlint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Seld\\JsonLint\\": "src/Seld/JsonLint/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "JSON Linter", + "keywords": [ + "json", + "linter", + "parser", + "validator" + ], + "time": "2017-03-06T16:42:24+00:00" + }, + { + "name": "squizlabs/php_codesniffer", + "version": "2.9.1", + "source": { + "type": "git", + "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", + "reference": "dcbed1074f8244661eecddfc2a675430d8d33f62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/dcbed1074f8244661eecddfc2a675430d8d33f62", + "reference": "dcbed1074f8244661eecddfc2a675430d8d33f62", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=5.1.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "bin": [ + "scripts/phpcs", + "scripts/phpcbf" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "classmap": [ + "CodeSniffer.php", + "CodeSniffer/CLI.php", + "CodeSniffer/Exception.php", + "CodeSniffer/File.php", + "CodeSniffer/Fixer.php", + "CodeSniffer/Report.php", + "CodeSniffer/Reporting.php", + "CodeSniffer/Sniff.php", + "CodeSniffer/Tokens.php", + "CodeSniffer/Reports/", + "CodeSniffer/Tokenizers/", + "CodeSniffer/DocGenerators/", + "CodeSniffer/Standards/AbstractPatternSniff.php", + "CodeSniffer/Standards/AbstractScopeSniff.php", + "CodeSniffer/Standards/AbstractVariableSniff.php", + "CodeSniffer/Standards/IncorrectPatternException.php", + "CodeSniffer/Standards/Generic/Sniffs/", + "CodeSniffer/Standards/MySource/Sniffs/", + "CodeSniffer/Standards/PEAR/Sniffs/", + "CodeSniffer/Standards/PSR1/Sniffs/", + "CodeSniffer/Standards/PSR2/Sniffs/", + "CodeSniffer/Standards/Squiz/Sniffs/", + "CodeSniffer/Standards/Zend/Sniffs/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Greg Sherwood", + "role": "lead" + } + ], + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "http://www.squizlabs.com/php-codesniffer", + "keywords": [ + "phpcs", + "standards" + ], + "time": "2017-05-22T02:43:20+00:00" + }, + { + "name": "symfony/config", + "version": "v2.8.22", + "source": { + "type": "git", + "url": "https://github.com/symfony/config.git", + "reference": "0b8541d18507d10204a08384640ff6df3c739ebe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/config/zipball/0b8541d18507d10204a08384640ff6df3c739ebe", + "reference": "0b8541d18507d10204a08384640ff6df3c739ebe", + "shasum": "" + }, + "require": { + "php": ">=5.3.9", + "symfony/filesystem": "~2.3|~3.0.0" + }, + "require-dev": { + "symfony/yaml": "~2.7|~3.0.0" + }, + "suggest": { + "symfony/yaml": "To use the yaml reference dumper" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Config\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Config Component", + "homepage": "https://symfony.com", + "time": "2017-04-12T14:07:15+00:00" + }, + { + "name": "symfony/console", + "version": "v2.8.22", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "3ef6ef64abecd566d551d9e7f6393ac6e93b2462" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/3ef6ef64abecd566d551d9e7f6393ac6e93b2462", + "reference": "3ef6ef64abecd566d551d9e7f6393ac6e93b2462", + "shasum": "" + }, + "require": { + "php": ">=5.3.9", + "symfony/debug": "^2.7.2|~3.0.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/event-dispatcher": "~2.1|~3.0.0", + "symfony/process": "~2.1|~3.0.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/process": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "https://symfony.com", + "time": "2017-06-02T14:36:56+00:00" + }, + { + "name": "symfony/debug", + "version": "v3.0.9", + "source": { + "type": "git", + "url": "https://github.com/symfony/debug.git", + "reference": "697c527acd9ea1b2d3efac34d9806bf255278b0a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/debug/zipball/697c527acd9ea1b2d3efac34d9806bf255278b0a", + "reference": "697c527acd9ea1b2d3efac34d9806bf255278b0a", + "shasum": "" + }, + "require": { + "php": ">=5.5.9", + "psr/log": "~1.0" + }, + "conflict": { + "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" + }, + "require-dev": { + "symfony/class-loader": "~2.8|~3.0", + "symfony/http-kernel": "~2.8|~3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Debug\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Debug Component", + "homepage": "https://symfony.com", + "time": "2016-07-30T07:22:48+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v2.8.22", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "1377400fd641d7d1935981546aaef780ecd5bf6d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/1377400fd641d7d1935981546aaef780ecd5bf6d", + "reference": "1377400fd641d7d1935981546aaef780ecd5bf6d", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "^2.0.5|~3.0.0", + "symfony/dependency-injection": "~2.6|~3.0.0", + "symfony/expression-language": "~2.6|~3.0.0", + "symfony/stopwatch": "~2.3|~3.0.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony EventDispatcher Component", + "homepage": "https://symfony.com", + "time": "2017-06-02T07:47:27+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v3.0.9", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "b2da5009d9bacbd91d83486aa1f44c793a8c380d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/b2da5009d9bacbd91d83486aa1f44c793a8c380d", + "reference": "b2da5009d9bacbd91d83486aa1f44c793a8c380d", + "shasum": "" + }, + "require": { + "php": ">=5.5.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Filesystem Component", + "homepage": "https://symfony.com", + "time": "2016-07-20T05:43:46+00:00" + }, + { + "name": "symfony/finder", + "version": "v2.8.22", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "4f4e84811004e065a3bb5ceeb1d9aa592630f9ad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/4f4e84811004e065a3bb5ceeb1d9aa592630f9ad", + "reference": "4f4e84811004e065a3bb5ceeb1d9aa592630f9ad", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Finder Component", + "homepage": "https://symfony.com", + "time": "2017-06-01T20:52:29+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "f29dca382a6485c3cbe6379f0c61230167681937" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/f29dca382a6485c3cbe6379f0c61230167681937", + "reference": "f29dca382a6485c3cbe6379f0c61230167681937", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "time": "2017-06-09T14:24:12+00:00" + }, + { + "name": "symfony/process", + "version": "v2.8.22", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "d54232f5682fda2f8bbebff7c81b864646867ab9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/d54232f5682fda2f8bbebff7c81b864646867ab9", + "reference": "d54232f5682fda2f8bbebff7c81b864646867ab9", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "https://symfony.com", + "time": "2017-05-08T01:19:21+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v2.8.22", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "e02577b841394a78306d7b547701bb7bb705bad5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/e02577b841394a78306d7b547701bb7bb705bad5", + "reference": "e02577b841394a78306d7b547701bb7bb705bad5", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Stopwatch Component", + "homepage": "https://symfony.com", + "time": "2017-04-12T14:07:15+00:00" + }, + { + "name": "symfony/translation", + "version": "v3.0.9", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "eee6c664853fd0576f21ae25725cfffeafe83f26" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/eee6c664853fd0576f21ae25725cfffeafe83f26", + "reference": "eee6c664853fd0576f21ae25725cfffeafe83f26", + "shasum": "" + }, + "require": { + "php": ">=5.5.9", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/config": "<2.8" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~2.8|~3.0", + "symfony/intl": "~2.8|~3.0", + "symfony/yaml": "~2.8|~3.0" + }, + "suggest": { + "psr/log": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Translation Component", + "homepage": "https://symfony.com", + "time": "2016-07-30T07:22:48+00:00" + }, + { + "name": "symfony/validator", + "version": "v2.8.22", + "source": { + "type": "git", + "url": "https://github.com/symfony/validator.git", + "reference": "9f323f762ad21bfb9df7c1afacbdd8addf0f8c50" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/validator/zipball/9f323f762ad21bfb9df7c1afacbdd8addf0f8c50", + "reference": "9f323f762ad21bfb9df7c1afacbdd8addf0f8c50", + "shasum": "" + }, + "require": { + "php": ">=5.3.9", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation": "~2.4|~3.0.0" + }, + "require-dev": { + "doctrine/annotations": "~1.0", + "doctrine/cache": "~1.0", + "egulias/email-validator": "^1.2.1", + "symfony/config": "~2.2|~3.0.0", + "symfony/expression-language": "~2.4|~3.0.0", + "symfony/http-foundation": "~2.3|~3.0.0", + "symfony/intl": "~2.7.25|^2.8.18|~3.2.5", + "symfony/property-access": "~2.3|~3.0.0", + "symfony/yaml": "^2.0.5|~3.0.0" + }, + "suggest": { + "doctrine/annotations": "For using the annotation mapping. You will also need doctrine/cache.", + "doctrine/cache": "For using the default cached annotation reader and metadata cache.", + "egulias/email-validator": "Strict (RFC compliant) email validation", + "symfony/config": "", + "symfony/expression-language": "For using the 2.4 Expression validator", + "symfony/http-foundation": "", + "symfony/intl": "", + "symfony/property-access": "For using the 2.4 Validator API", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Validator\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Validator Component", + "homepage": "https://symfony.com", + "time": "2017-06-02T14:36:56+00:00" + }, + { + "name": "symfony/yaml", + "version": "v3.3.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "9752a30000a8ca9f4b34b5227d15d0101b96b063" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/9752a30000a8ca9f4b34b5227d15d0101b96b063", + "reference": "9752a30000a8ca9f4b34b5227d15d0101b96b063", + "shasum": "" + }, + "require": { + "php": ">=5.5.9" + }, + "require-dev": { + "symfony/console": "~2.8|~3.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.3-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Yaml Component", + "homepage": "https://symfony.com", + "time": "2017-06-02T22:05:06+00:00" + }, + { + "name": "twig/twig", + "version": "v1.34.3", + "source": { + "type": "git", + "url": "https://github.com/twigphp/Twig.git", + "reference": "451c6f4197e113e24c1c85bc3fc8c2d77adeff2e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/451c6f4197e113e24c1c85bc3fc8c2d77adeff2e", + "reference": "451c6f4197e113e24c1c85bc3fc8c2d77adeff2e", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "psr/container": "^1.0", + "symfony/debug": "~2.7", + "symfony/phpunit-bridge": "~3.3@dev" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.34-dev" + } + }, + "autoload": { + "psr-0": { + "Twig_": "lib/" + }, + "psr-4": { + "Twig\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" + }, + { + "name": "Twig Team", + "homepage": "http://twig.sensiolabs.org/contributors", + "role": "Contributors" + } + ], + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "http://twig.sensiolabs.org", + "keywords": [ + "templating" + ], + "time": "2017-06-07T18:45:17+00:00" + }, + { + "name": "zendframework/zend-cache", + "version": "2.7.2", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-cache.git", + "reference": "c98331b96d3b9d9b24cf32d02660602edb34d039" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-cache/zipball/c98331b96d3b9d9b24cf32d02660602edb34d039", + "reference": "c98331b96d3b9d9b24cf32d02660602edb34d039", + "shasum": "" + }, + "require": { + "php": "^5.5 || ^7.0", + "zendframework/zend-eventmanager": "^2.6.2 || ^3.0", + "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3", + "zendframework/zend-stdlib": "^2.7 || ^3.0" + }, + "require-dev": { + "phpbench/phpbench": "^0.10.0", + "phpunit/phpunit": "^4.8", + "zendframework/zend-coding-standard": "~1.0.0", + "zendframework/zend-serializer": "^2.6", + "zendframework/zend-session": "^2.6.2" + }, + "suggest": { + "ext-apc": "APC or compatible extension, to use the APC storage adapter", + "ext-apcu": "APCU >= 5.1.0, to use the APCu storage adapter", + "ext-dba": "DBA, to use the DBA storage adapter", + "ext-memcache": "Memcache >= 2.0.0 to use the Memcache storage adapter", + "ext-memcached": "Memcached >= 1.0.0 to use the Memcached storage adapter", + "ext-mongo": "Mongo, to use MongoDb storage adapter", + "ext-redis": "Redis, to use Redis storage adapter", + "ext-wincache": "WinCache, to use the WinCache storage adapter", + "ext-xcache": "XCache, to use the XCache storage adapter", + "mongofill/mongofill": "Alternative to ext-mongo - a pure PHP implementation designed as a drop in replacement", + "zendframework/zend-serializer": "Zend\\Serializer component", + "zendframework/zend-session": "Zend\\Session component" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev", + "dev-develop": "2.8-dev" + }, + "zf": { + "component": "Zend\\Cache", + "config-provider": "Zend\\Cache\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Zend\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides a generic way to cache any data", + "homepage": "https://github.com/zendframework/zend-cache", + "keywords": [ + "cache", + "zf2" + ], + "time": "2016-12-16T11:35:47+00:00" + }, + { + "name": "zendframework/zend-config", + "version": "2.6.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-config.git", + "reference": "2920e877a9f6dca9fa8f6bd3b1ffc2e19bb1e30d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-config/zipball/2920e877a9f6dca9fa8f6bd3b1ffc2e19bb1e30d", + "reference": "2920e877a9f6dca9fa8f6bd3b1ffc2e19bb1e30d", + "shasum": "" + }, + "require": { + "php": "^5.5 || ^7.0", + "zendframework/zend-stdlib": "^2.7 || ^3.0" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "zendframework/zend-filter": "^2.6", + "zendframework/zend-i18n": "^2.5", + "zendframework/zend-json": "^2.6.1", + "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3" + }, + "suggest": { + "zendframework/zend-filter": "Zend\\Filter component", + "zendframework/zend-i18n": "Zend\\I18n component", + "zendframework/zend-json": "Zend\\Json to use the Json reader or writer classes", + "zendframework/zend-servicemanager": "Zend\\ServiceManager for use with the Config Factory to retrieve reader and writer instances" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6-dev", + "dev-develop": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Config\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides a nested object property based user interface for accessing this configuration data within application code", + "homepage": "https://github.com/zendframework/zend-config", + "keywords": [ + "config", + "zf2" + ], + "time": "2016-02-04T23:01:10+00:00" + }, + { + "name": "zendframework/zend-eventmanager", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-eventmanager.git", + "reference": "c3bce7b7d47c54040b9ae51bc55491c72513b75d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-eventmanager/zipball/c3bce7b7d47c54040b9ae51bc55491c72513b75d", + "reference": "c3bce7b7d47c54040b9ae51bc55491c72513b75d", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "athletic/athletic": "^0.1", + "container-interop/container-interop": "^1.1.0", + "phpunit/phpunit": "^5.6", + "zendframework/zend-coding-standard": "~1.0.0", + "zendframework/zend-stdlib": "^2.7.3 || ^3.0" + }, + "suggest": { + "container-interop/container-interop": "^1.1.0, to use the lazy listeners feature", + "zendframework/zend-stdlib": "^2.7.3 || ^3.0, to use the FilterChain feature" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev", + "dev-develop": "3.2-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\EventManager\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Trigger and listen to events within a PHP application", + "homepage": "https://github.com/zendframework/zend-eventmanager", + "keywords": [ + "event", + "eventmanager", + "events", + "zf2" + ], + "time": "2016-12-19T21:47:12+00:00" + }, + { + "name": "zendframework/zend-filter", + "version": "2.7.2", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-filter.git", + "reference": "b8d0ff872f126631bf63a932e33aa2d22d467175" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-filter/zipball/b8d0ff872f126631bf63a932e33aa2d22d467175", + "reference": "b8d0ff872f126631bf63a932e33aa2d22d467175", + "shasum": "" + }, + "require": { + "php": "^5.5 || ^7.0", + "zendframework/zend-stdlib": "^2.7 || ^3.0" + }, + "require-dev": { + "pear/archive_tar": "^1.4", + "phpunit/phpunit": "^6.0.10 || ^5.7.17", + "zendframework/zend-coding-standard": "~1.0.0", + "zendframework/zend-crypt": "^2.6 || ^3.0", + "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3", + "zendframework/zend-uri": "^2.5" + }, + "suggest": { + "zendframework/zend-crypt": "Zend\\Crypt component, for encryption filters", + "zendframework/zend-i18n": "Zend\\I18n component for filters depending on i18n functionality", + "zendframework/zend-servicemanager": "Zend\\ServiceManager component, for using the filter chain functionality", + "zendframework/zend-uri": "Zend\\Uri component, for the UriNormalize filter" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev", + "dev-develop": "2.8-dev" + }, + "zf": { + "component": "Zend\\Filter", + "config-provider": "Zend\\Filter\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Zend\\Filter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides a set of commonly needed data filters", + "homepage": "https://github.com/zendframework/zend-filter", + "keywords": [ + "filter", + "zf2" + ], + "time": "2017-05-17T20:56:17+00:00" + }, + { + "name": "zendframework/zend-hydrator", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-hydrator.git", + "reference": "22652e1661a5a10b3f564cf7824a2206cf5a4a65" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-hydrator/zipball/22652e1661a5a10b3f564cf7824a2206cf5a4a65", + "reference": "22652e1661a5a10b3f564cf7824a2206cf5a4a65", + "shasum": "" + }, + "require": { + "php": "^5.5 || ^7.0", + "zendframework/zend-stdlib": "^2.7 || ^3.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "^2.0@dev", + "zendframework/zend-eventmanager": "^2.6.2 || ^3.0", + "zendframework/zend-filter": "^2.6", + "zendframework/zend-inputfilter": "^2.6", + "zendframework/zend-serializer": "^2.6.1", + "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3" + }, + "suggest": { + "zendframework/zend-eventmanager": "^2.6.2 || ^3.0, to support aggregate hydrator usage", + "zendframework/zend-filter": "^2.6, to support naming strategy hydrator usage", + "zendframework/zend-serializer": "^2.6.1, to use the SerializableStrategy", + "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3, to support hydrator plugin manager usage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-release-1.0": "1.0-dev", + "dev-release-1.1": "1.1-dev", + "dev-master": "2.0-dev", + "dev-develop": "2.1-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Hydrator\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-hydrator", + "keywords": [ + "hydrator", + "zf2" + ], + "time": "2016-02-18T22:38:26+00:00" + }, + { + "name": "zendframework/zend-i18n", + "version": "2.7.4", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-i18n.git", + "reference": "d3431e29cc00c2a1c6704e601d4371dbf24f6a31" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-i18n/zipball/d3431e29cc00c2a1c6704e601d4371dbf24f6a31", + "reference": "d3431e29cc00c2a1c6704e601d4371dbf24f6a31", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^5.6", + "zendframework/zend-stdlib": "^2.7 || ^3.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0.8 || ^5.7.15", + "zendframework/zend-cache": "^2.6.1", + "zendframework/zend-coding-standard": "~1.0.0", + "zendframework/zend-config": "^2.6", + "zendframework/zend-eventmanager": "^2.6.2 || ^3.0", + "zendframework/zend-filter": "^2.6.1", + "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3", + "zendframework/zend-validator": "^2.6", + "zendframework/zend-view": "^2.6.3" + }, + "suggest": { + "ext-intl": "Required for most features of Zend\\I18n; included in default builds of PHP", + "zendframework/zend-cache": "Zend\\Cache component", + "zendframework/zend-config": "Zend\\Config component", + "zendframework/zend-eventmanager": "You should install this package to use the events in the translator", + "zendframework/zend-filter": "You should install this package to use the provided filters", + "zendframework/zend-i18n-resources": "Translation resources", + "zendframework/zend-servicemanager": "Zend\\ServiceManager component", + "zendframework/zend-validator": "You should install this package to use the provided validators", + "zendframework/zend-view": "You should install this package to use the provided view helpers" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev", + "dev-develop": "2.8-dev" + }, + "zf": { + "component": "Zend\\I18n", + "config-provider": "Zend\\I18n\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Zend\\I18n\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-i18n", + "keywords": [ + "i18n", + "zf2" + ], + "time": "2017-05-17T17:00:12+00:00" + }, + { + "name": "zendframework/zend-json", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-json.git", + "reference": "f42a1588e75c2a3e338cd94c37906231e616daab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-json/zipball/f42a1588e75c2a3e338cd94c37906231e616daab", + "reference": "f42a1588e75c2a3e338cd94c37906231e616daab", + "shasum": "" + }, + "require": { + "php": "^5.5 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "^2.3", + "zendframework/zend-stdlib": "^2.7 || ^3.0" + }, + "suggest": { + "zendframework/zend-json-server": "For implementing JSON-RPC servers", + "zendframework/zend-xml2json": "For converting XML documents to JSON" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev", + "dev-develop": "3.1-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Json\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides convenience methods for serializing native PHP to JSON and decoding JSON to native PHP", + "homepage": "https://github.com/zendframework/zend-json", + "keywords": [ + "json", + "zf2" + ], + "time": "2016-04-01T02:34:00+00:00" + }, + { + "name": "zendframework/zend-serializer", + "version": "2.8.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-serializer.git", + "reference": "ff74ea020f5f90866eb28365327e9bc765a61a6e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-serializer/zipball/ff74ea020f5f90866eb28365327e9bc765a61a6e", + "reference": "ff74ea020f5f90866eb28365327e9bc765a61a6e", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0", + "zendframework/zend-json": "^2.5 || ^3.0", + "zendframework/zend-stdlib": "^2.7 || ^3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.5", + "squizlabs/php_codesniffer": "^2.3.1", + "zendframework/zend-math": "^2.6", + "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3" + }, + "suggest": { + "zendframework/zend-math": "(^2.6 || ^3.0) To support Python Pickle serialization", + "zendframework/zend-servicemanager": "(^2.7.5 || ^3.0.3) To support plugin manager support" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev", + "dev-develop": "2.9-dev" + }, + "zf": { + "component": "Zend\\Serializer", + "config-provider": "Zend\\Serializer\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Zend\\Serializer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides an adapter based interface to simply generate storable representation of PHP types by different facilities, and recover", + "homepage": "https://github.com/zendframework/zend-serializer", + "keywords": [ + "serializer", + "zf2" + ], + "time": "2016-06-21T17:01:55+00:00" + }, + { + "name": "zendframework/zend-servicemanager", + "version": "2.7.8", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-servicemanager.git", + "reference": "2ae3b6e4978ec2e9ff52352e661946714ed989f9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-servicemanager/zipball/2ae3b6e4978ec2e9ff52352e661946714ed989f9", + "reference": "2ae3b6e4978ec2e9ff52352e661946714ed989f9", + "shasum": "" + }, + "require": { + "container-interop/container-interop": "~1.0", + "php": "^5.5 || ^7.0" + }, + "require-dev": { + "athletic/athletic": "dev-master", + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "zendframework/zend-di": "~2.5", + "zendframework/zend-mvc": "~2.5" + }, + "suggest": { + "ocramius/proxy-manager": "ProxyManager 0.5.* to handle lazy initialization of services", + "zendframework/zend-di": "Zend\\Di component" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev", + "dev-develop": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\ServiceManager\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-servicemanager", + "keywords": [ + "servicemanager", + "zf2" + ], + "time": "2016-12-19T19:14:29+00:00" + }, + { + "name": "zendframework/zend-stdlib", + "version": "2.7.7", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-stdlib.git", + "reference": "0e44eb46788f65e09e077eb7f44d2659143bcc1f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-stdlib/zipball/0e44eb46788f65e09e077eb7f44d2659143bcc1f", + "reference": "0e44eb46788f65e09e077eb7f44d2659143bcc1f", + "shasum": "" + }, + "require": { + "php": "^5.5 || ^7.0", + "zendframework/zend-hydrator": "~1.1" + }, + "require-dev": { + "athletic/athletic": "~0.1", + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "zendframework/zend-config": "~2.5", + "zendframework/zend-eventmanager": "~2.5", + "zendframework/zend-filter": "~2.5", + "zendframework/zend-inputfilter": "~2.5", + "zendframework/zend-serializer": "~2.5", + "zendframework/zend-servicemanager": "~2.5" + }, + "suggest": { + "zendframework/zend-eventmanager": "To support aggregate hydrator usage", + "zendframework/zend-filter": "To support naming strategy hydrator usage", + "zendframework/zend-serializer": "Zend\\Serializer component", + "zendframework/zend-servicemanager": "To support hydrator plugin manager usage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-release-2.7": "2.7-dev", + "dev-master": "3.0-dev", + "dev-develop": "3.1-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Stdlib\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-stdlib", + "keywords": [ + "stdlib", + "zf2" + ], + "time": "2016-04-12T21:17:31+00:00" + }, + { + "name": "zetacomponents/base", + "version": "1.9", + "source": { + "type": "git", + "url": "https://github.com/zetacomponents/Base.git", + "reference": "f20df24e8de3e48b6b69b2503f917e457281e687" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zetacomponents/Base/zipball/f20df24e8de3e48b6b69b2503f917e457281e687", + "reference": "f20df24e8de3e48b6b69b2503f917e457281e687", + "shasum": "" + }, + "require-dev": { + "zetacomponents/unit-test": "*" + }, + "type": "library", + "autoload": { + "classmap": [ + "src" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Sergey Alexeev" + }, + { + "name": "Sebastian Bergmann" + }, + { + "name": "Jan Borsodi" + }, + { + "name": "Raymond Bosman" + }, + { + "name": "Frederik Holljen" + }, + { + "name": "Kore Nordmann" + }, + { + "name": "Derick Rethans" + }, + { + "name": "Vadym Savchuk" + }, + { + "name": "Tobias Schlitt" + }, + { + "name": "Alexandru Stanoi" + } + ], + "description": "The Base package provides the basic infrastructure that all packages rely on. Therefore every component relies on this package.", + "homepage": "https://github.com/zetacomponents", + "time": "2014-09-19T03:28:34+00:00" + }, + { + "name": "zetacomponents/document", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/zetacomponents/Document.git", + "reference": "688abfde573cf3fe0730f82538fbd7aa9fc95bc8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zetacomponents/Document/zipball/688abfde573cf3fe0730f82538fbd7aa9fc95bc8", + "reference": "688abfde573cf3fe0730f82538fbd7aa9fc95bc8", + "shasum": "" + }, + "require": { + "zetacomponents/base": "*" + }, + "require-dev": { + "zetacomponents/unit-test": "dev-master" + }, + "type": "library", + "autoload": { + "classmap": [ + "src" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Sebastian Bergmann" + }, + { + "name": "Kore Nordmann" + }, + { + "name": "Derick Rethans" + }, + { + "name": "Tobias Schlitt" + }, + { + "name": "Alexandru Stanoi" + } + ], + "description": "The Document components provides a general conversion framework for different semantic document markup languages like XHTML, Docbook, RST and similar.", + "homepage": "https://github.com/zetacomponents", + "time": "2013-12-19T11:40:00+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": { + "brianium/paratest": 20 + }, + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">= 5.5.9", + "ext-curl": "*", + "ext-dom": "*", + "ext-openssl": "*" + }, + "platform-dev": [] +} \ No newline at end of file diff --git a/classes/includes/vendor/globalpayments/php-sdk/docker-compose.yml b/classes/includes/vendor/globalpayments/php-sdk/docker-compose.yml new file mode 100644 index 0000000..edb9600 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/docker-compose.yml @@ -0,0 +1,27 @@ +version: "2.1" +services: + php: + image: php:${PHP_VERSION}-alpine + volumes: + - .:/src + working_dir: /src + environment: + COMPOSER_ALLOW_SUPERUSER: 1 + + setup: + extends: + service: php + command: > + sh -c "php --version && + php -r \"copy('https://getcomposer.org/installer', 'composer-setup.php');\" && + php -r \"if (hash_file('SHA384', 'composer-setup.php') === '55d6ead61b29c7bdee5cccfb50076874187bd9f21f65d8991d46ec5cc90518f447387fb9f76ebae1fbbacf329e583e30') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;\" && + php composer-setup.php --filename=composer && + php -r \"unlink('composer-setup.php');\" && + php composer install" + + test: + extends: + service: php + command: php composer test + + diff --git a/classes/includes/vendor/globalpayments/php-sdk/docs-config.php b/classes/includes/vendor/globalpayments/php-sdk/docs-config.php new file mode 100644 index 0000000..893d0ba --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/docs-config.php @@ -0,0 +1,17 @@ +files() + ->name('*.php') + ->in($dir = __DIR__ . '/src'); + +return new Sami($iterator, [ + 'title' => 'GlobalPayments\Api', + 'build_dir' => dirname($dir) . '/docs', + 'cache_dir' => dirname($dir) . '/docs-cache', + 'remote_repository' => new GitHubRemoteRepository('globalpayments/php-sdk', dirname($dir)), +]); diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/consumer-authentication/JWT.php b/classes/includes/vendor/globalpayments/php-sdk/examples/consumer-authentication/JWT.php new file mode 100644 index 0000000..16f16ff --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/examples/consumer-authentication/JWT.php @@ -0,0 +1,64 @@ + + * @license Custom https://github.com/hps/heartland-php/blob/master/LICENSE.txt + * @link https://developer.heartlandpaymentsystems.com + */ + +class JWT +{ + /** + * Encodes a JWT with a `$key` and a `$payload` + * + * @param string $key key used to sign the JWT + * @param mixed $payload payload to be included + * + * @return string + */ + public static function encode($key = '', $payload = array()) + { + $header = array('typ' => 'JWT', 'alg' => 'HS256'); + + $parts = array( + self::urlsafeBase64Encode(json_encode($header)), + self::urlsafeBase64Encode(json_encode($payload)), + ); + $signingData = implode('.', $parts); + $signature = self::sign($key, $signingData); + $parts[] = self::urlsafeBase64Encode($signature); + + return implode('.', $parts); + } + + /** + * Creates a url-safe base64 encoded AnyValuesToken + * + * @param string $data data to be encoded + * + * @return string + */ + public static function urlsafeBase64Encode($data) + { + return str_replace('=', '', strtr(base64_encode($data), '+/', '-_')); + } + + /** + * Signs a set of `$signingData` with a given `$key` + * + * @param string $key key used to sign the JWT + * @param string $signingData data to be signed + * + * @return string + */ + public static function sign($key, $signingData) + { + return hash_hmac('sha256', $signingData, $key, true); + } +}; diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/consumer-authentication/cruise.php b/classes/includes/vendor/globalpayments/php-sdk/examples/consumer-authentication/cruise.php new file mode 100644 index 0000000..625ff58 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/examples/consumer-authentication/cruise.php @@ -0,0 +1,341 @@ +'; + print_r($_GET); + print ''; + + $config = new ServicesConfig(); + $config->secretApiKey = 'skapi_cert_MT2PAQB-9VQA5Z1mOXQbzZcH6O5PpdhjWtFhMBoL4A'; + $config->serviceUrl = 'https://cert.api2.heartlandportico.com'; + + ServicesContainer::configure($config); + + $card = new CreditCardData(); + $card->token = $_GET['heartlandToken']; + + $secureEcommerce = new EcommerceInfo(); + $secureEcommerce->paymentDataSource = $_GET['cardType']; + $secureEcommerce->cavv = $_GET['cavv']; + $secureEcommerce->eci = substr($_GET['eciflag'], 1); + $secureEcommerce->xid = $_GET['xid']; + + $response = $card->charge(15) + ->withCurrency('USD') + ->withEcommerceInfo($secureEcommerce) + ->execute(); + + print '
';
+    print_r($response);
+    print '
'; +} else { + $orderNumber = str_shuffle('abcdefghijklmnopqrstuvwxyz'); + //$apiIdentifier = 'Merchant-uatmerchant-Key'; + //$orgUnitId = '55ef3e43f723aa431c9969ae'; + //$apiKey = 'ac848959-f878-4f62-a0a2-4b2a648446c3'; + $apiIdentifier = '579bc985da529378f0ec7d0e'; + $orgUnitId = '5799c3c433fadd4cf427d01a'; + $apiKey = 'a32ed153-3759-4302-a314-546811590b43'; + + $data = array( + 'jti' => str_shuffle('abcdefghijklmnopqrstuvwxyz'), + 'iat' => time(), + 'iss' => $apiIdentifier, + 'OrgUnitId' => $orgUnitId, + 'Payload' => array( + 'OrderDetails' => array( + 'OrderNumber' => $orderNumber, + 'Amount' => '1500', + 'CurrencyCode' => '840', + ), + ), + ); + $jwt = JWT::encode($apiKey, $data); + ?> +
+
+
+
+
+
+ + + + + + + + + +
+
+ +
+ + + + + + + + HPS e-check example + + + +

HPS e-check example

+
+

Billing Information

+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ +

Payment Information

+
+ +
+ +
+
+ +

Check Information

+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + +
+ + diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/echeck/process.php b/classes/includes/vendor/globalpayments/php-sdk/examples/echeck/process.php new file mode 100644 index 0000000..7e646ad --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/examples/echeck/process.php @@ -0,0 +1,50 @@ +secretApiKey = 'skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A'; +$config->serviceUrl = 'https://cert.api2.heartlandportico.com'; +$config->versionNumber = '0000'; +$config->developerId = '000000'; + +ServicesContainer::configure($config); + +$address = new Address(); +$address->address = $_POST['holder_address_address']; +$address->city = $_POST['holder_address_city']; +$address->state = $_POST['holder_address_state']; +$address->zip = $_POST['holder_address_zip']; + +$eCheck = new ECheck(); +$eCheck->accountNumber = $_POST['check_accountnumber']; +$eCheck->routingNumber = $_POST['check_routingnumber']; +$eCheck->checkType = $_POST['check_type']; +$eCheck->secCode = SecCode::WEB; +$eCheck->accountType = $_POST['account_type']; +$eCheck->entryMode = EntryMethod::MANUAL; +$eCheck->checkHolderName = 'John Doe'; + +try { + $response = $eCheck->charge($_POST['payment_amount']) + ->withCurrency('USD') + ->withAddress($address) + ->execute(); + + printf('Success! Transaction ID: %s', $response->transactionId); +} catch (Exception $e) { + printf('Error running check sale: %s', $e->getMessage()); + printf('
%s
', print_r($e, true)); +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/heartland-styles.css b/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/heartland-styles.css new file mode 100644 index 0000000..63bdcb4 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/heartland-styles.css @@ -0,0 +1,167 @@ +body { + font-family: sans-serif; +} + +iframe { + width:100%; + float: left; +} +.form-group { + height: 40px; +} +h2 { + margin: 7px 0; +} +#ss-card, +#ss-date, +#ss-cvv { + height: 85px; +} +#ss-card { + margin-bottom: 55px; + display: block; +} +#ss-date { + float: left; + display: block; +} +#ss-cvv.form-group { + float: right; +} +.iframeholder { + width:100%; +} +.ie8 form .iframeholder { + padding: 10px; +} +.iframeholder::after { + content: ''; + display: block; + width: 100%; + height: 0px; + clear: both; + position: relative; +} +.ie8 form .form-group { + margin-bottom: 5px; +} +textarea { + padding: 10px; + font-family: sans-serif; +} +label[for=iframesCardNumber], +label[for=iframesCardExpiration], +label[for=iframesCardCvv] { + text-transform: uppercase; + font-weight: 500; + font-size: 13px; + color: #555; + line-height: 1.5; +} +.ie8 form label { + padding-left: 10px; + margin: 0px; +} +#heartland-frame-cardExpiration, +#heartland-frame-cardCvv, +#heartland-frame-cardNumber, +.ie8 #heartland-frame-cardExpiration, +.ie8 #heartland-frame-cardCvv, +.ie8 #heartland-frame-cardNumber { + width: 100%; +} +iframe { + margin: 0; + padding: 0; + border: none; + width: value; + height: value; +} +#ss-banner { + background: transparent url(images/ss-shield@2x.png) no-repeat left center; + height: 40px; + background-size: 280px 34px; + margin-bottom: 7px; +} +.ie8 #ss-banner { + background: transparent url(images/ss-shield-ie.png) no-repeat left center; +} +.btn-primary { + display: block; + border-radius: 0px; + font-size: 18px; + float: right; + background-color: #36b46e; + border: 1px solid #2a8d56; + margin-bottom: 10px; + height: 50px; + color: #ffffff; + width: 100%; +} +.btn-primary:hover, +.btn-primary:focus { + color: #fff; + background-color: #2a8d56; +} +.ie8 .btn-primary { + width: 15%; +} +.red { + color: #ce2027; + margin-left: 2px; + font-size: 17px; +} +.container { + margin: 5px; +} +#ss-date.form-group, +#ss-cvv.form-group { + width: 100%; +} +@media screen and (min-width: 767px) { + #heartland-frame-cardNumber { + width: 100%; + } +} +@media screen and (min-width: 696px) { + #ss-date.form-group, + #ss-cvv.form-group { + width: 48%; + } +} +@media screen and (min-width: 636px) { + #ss-card { + margin-bottom: 40px; + } +} +@media screen and (min-width: 450px) { + .btn-primary, + .ie8 .btn-primary { + width: 10em; + } + .container { + margin: 20px; + } +} + +#ss-banner { + background: transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-shield@2x.png?raw=true) no-repeat left center; + height: 40px; + background-size: 280px 34px; + margin-bottom: 7px; +} + +user agent stylesheet +div { + display: block; +} + +.form-row { + margin-top: 10px; +} + +.form-wrapper { + display: block; + width: 300px; + margin: 10px auto; +} \ No newline at end of file diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/cvv.png b/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/cvv.png new file mode 100644 index 0000000000000000000000000000000000000000..4d97b60689ca3bc2cc74c2a3cc18d85ab96fc734 GIT binary patch literal 17130 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 E0HHLTJpcdz literal 0 HcmV?d00001 diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/cvv1.png b/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/cvv1.png new file mode 100644 index 0000000000000000000000000000000000000000..1877174cc7607b1eacdf88a199da45e070bc3c7c GIT binary patch literal 21113 zcmeI4cT`hZx4acDLK z1q1~I3kpaVlr9b(=_R4VyTJmJaq{N9?|bY06V`Iw?6c3_=bYc!d*73@Rtz|$t+ss& z&lUgxwyU31)&qbIC;(v7`f(H3!gI>E4t#93J8A3)0B|AtKQ`AiMP~qzp%G7?p`6ju zl*N&4;TSv_OMtuD+JU_RKwi<+4ui8MPz13A3nEDYI#yT$6(r&nphgl}qFQ!J1WV#c zcL##LyY^|EyERS*4^>2Ok$05^9oP~m7(rKC8u6ChVD?pFa z2NXP`bxKf)>_8BdfJ?$~qDXN;DH%9YLQ+ab>Zl+Jlo6uR2$U#HR7O@pOjZ;n_~j3Z z-U5D-cfgy=>M5&!84i>bpq3Phoh$<3;^G2#5rdN*ED%T;85x8q3V}kwz#cG1HxdQo z3L`lReRlHIk21j#=RmZh5XmG#x?c>I>_kz3Lg@p2`}?vkTf1)qksQCU11Tb0F?I+f zTomy=BRuY#jh&N&&Fa+fI0V6lU`rrT96>weckS#f$rQ4qCHZfL{HFfffx$h|()u>` zcjs$s``w`(DJsq&f-gwFYw38}&5nT3BRG2`XK*P(-&;L}Xuh^NfAU1v{O#Nc zuEf7Fqia5!t%kzq9g+vvDy!r`z);8zr^#d+^yer$^%bF@lG18a2_DkI;D{tT*TeD% zMx(VIU-L&$#!v`oFd`*kqT(==W5D<1G3wgv^gq!6c<5%~4pqn5Z-g_jQQxxcSRaCy9<=yt=K6V=$Um zYnwj7{?Dyn6*k1x8fAxZa3s((PyzZi1-})wZ#9cgyCA%M95)VemU zZ?*|8?enKZc7Xfy6AmKD%1&_4iI3$>tOnj054g1sEa!EcZYA{j(wC z0P+a>`@n|yf3Ovf80UX)BmP-l{qHv7yEW?nb0gLw8E1(hSrG7O#MdDH+VIcz?(>fR zIlI1Q>|e7{p8krG1v43pD$HsIA>|Q&Xltm0 z{~O!&dPdtdQv(u_f<}EAj-h#-75z>6xyb8-hdu&YQbIyZLLR}`%xH0n=t{6Tqf7*= zu_L{zNJxT1tr{_EzH4c`W+^5HzF5{Q*J-|3e%`Ki2ej2p{M-s2|G<+c;@i>lFG>2X zn*Ap~tS#w3>6O73YY+w?%taP1=6o2mEL;pgn2Ri2%=s{AS-2R0Fc(?4nDb%KvT!i~ zVJ@<8G3UdeW#M7~!dztGV$O#_%fiI~gt^GV#hed=mW7J}2y>Bzi#Z<#EejU|5auEa z7jr%gS{5z_Ak0M;F6Mj~v@BcK_1pttZ0RS%YHM3W$;B!e` z`S@wq*5M8h%5`eu?1T>dhhOH{j%GE9-an^-NxA+<#=1mKWvDPSn8M_feRC=^FBz@$lIUwyTifX1|lru&@@zozTN! zv0)X2$s*H!*I)1_&5M&Ns^n_rr{vx4oIU~o4!XtQR4;D>e8Sj(pHN>Pz==)3v2x(+ z<45jQ348$i*#SZPw+CoQm%zs{sl&NHD1g6Le0AObP_RD+f_!xq2>VwrM3)zG@6DUa zXp@kR-ZZ_#_v#e>K&42WNmnja7TIuYPfcq<=7f4;jgz9{!P8f&gvih{5o+ri5N5iv<> zxUBgC+E-?{!RKOE*%HkBa*#jUv8o@rA?yG){Z>nh%Zz_41TuC12k^(jdYJ<9I_0^c zF>ftpxTE)Zu$}y^8loFl$x$=)_ALiQ>?o9fHxl@zyv|al=w!`Kl)z&+-|!Bfp4ga5 zHGuY3FL&QKDRuz`Y&MJvR4Xpfi;BYG{wMqdX`7VL7IfVBkdh<(4$ zv;XnfhGWXP!-ykzhw`d%_yM4qNXfK~RCh10a!A_fWq!4EC*jVL$4MKWnU0tlnwqvXW#RSm%d6~Ge(>3$RpBdg7!UX) zcx7r@m229AZSCHfn&-+hGHxH*UKYaULs8AjxV={hKYv4SMhh4asEt+M7K2E)bS z-R>C;daNB=k<=`oRuC>Q+dz-L`TT${QTOL?TNia};YK%Di(0@#KcC?R|)pxCr z(m4SSQJdxmv!(WBn`4XbT8*^2F29Oy*Jr!Hxr18SB+r+Lug(8U@_ikD&7Piv{~`Mafkmf}MBe5t%1(w7hJmnHFw~2R zJ(q04*#L*AKjHkJPv>h9Z~=<|&=XhWS5WSa)2ig~Ui7M5;pKr!p3W~k_sLf(dm;GB zHvgi~Ae$AJmz@66sr|^epZ%D3RMRQ0xyV}8 z)0shyfkPgMv)O;>P{Zf-y-MK|5sLU@J^RFDu_ugEU+e6a1czF_`EgDKHjzCX`h*uA zd)qpwF-B!pgy6Y=Y4}5{)X$lN-a``+TEdTW7 z3Yb1H$7>oK<6)L+>ehrEu1@+SxwR|;l; z)cWyKg@?WG%VeqK$+D=@6`6%VUDx);Lwiw0otf2n7F@6MxNfxFDzD@<+|41s81Xc- zwopQ%{;{ozVWx$#o7;^raI*p$rdu^8`lpIN4Ek_OQ!|wBH-r>uJ#_k`-7;o|ax3rc zZtcAgC2}z?6d92kW>2#Q3VJJ^(B_B4iWfgRYWpvhc$;-W4<`4f-R{cC@@My^7;Tds ziK$Y0n0@fW%3Mc4N!Dg=Ae%Jw;z@mxf%dy4scyeF)InWUcYPdc{jGa zHwU*;m>E!nQQ=;S_q%eDEBIa%h_F0rpHqA?=0gLwO4V|H$6j{fB&&L7Fk(k=dHc(inea@*6Hk)>wF5^qxh&%zUrmCJCUENvn)G8xLPY+CNGN&rO&wh zz+h+fJ5g_YXi_a-i`4NyCf}P#ObnSVq4pp?EM2xGmn<0?7MHzSnGkqrUM)bIo#Q3X z8Y(LgyppBf7Z()es2?B9-bu4xuBy5i;nBl2l}vIx-|kj6 zqI*uhd3CWD_=6)w-kO@1=%cOq7o8HHh;X$yJdWK(YH|HP*uV3n={k#2PVv&oQjOk@5{RH1|!9JRdOiy1aiF^ zZpo3OdXbiC!6WEmA`LcDTo#D9A7mVTzGc+IbA>}u99(lKe_YvnF4>ER50cO5w&tIW zFZ-}P!PBZI6gKF(skV5xIxbLi10R~CdDJYA5~^6&GCn_)mA^1sU&bHW9V(aC(fKnM zXNY4hS}a7`^IRL*ByFQ!}ujxiW2mt&USH)yg3Uc+d89j?vocp9`s# zHf0qZRpl2)Eic{8QcvqBJ(2co-%Hk#6zv4*-$!Z#FD_M*o@fi-py;(FfXCA+BD%pz1R)ej?T_;m$42(CpEuAuhvo0X@GD4%zP@YJ za78oDMI=_u{OZBb(eVzA;CtQz6Py)u+&LuCLna#W{VUDtL7lKA`TtEWy% zG`cL}#qvt!v&BPSJWP>W^wg&o2F%AoP}7gko3Y1_jCoe zE{}pov%CRtkzN=0*+Z61rUst7^}Hi%SJeh5dJQ52lg_q|9y@LJboyaZ4L;CiG-o1{lNro+n2eJ-jc68csZqT(Mce7 zW=f$r;^WxzXzAYevK_u;I@!MPV7J{t@>OA%wZre-e%=3jC8l>)KTrMwg#y)+_cSTC50>7E;QczxPlHyc?E9uqLCU8Uy|B^XBSf6>L!hVH&dBA{ zw(P{!*i0}fX&S}b%yhbxV8G~$QA_R%=NUeyQFq|p5u-8MO}mvP>eF-xc?IU)y*) zE`;gz*-qJNup)Z!%UM}frEv6z%MO!wO-=oRABf`c9ZZUAwdULcfmvjAP(K=wpBmuk zv*?fxEfSZzC)s3!3O!n#GB@(+Sb1GF=N38Y>q{@R4;*+!$5XE~b%;;ywY<9}zq;Jv z)Ue;nmf;=Q>Jf%nVbhsOZa!qM!pq;+&L*r8_5o%kxo1;5zif4UmXJR>g zgUL;$32nt~H2cBQ&8uF6L9b%y5kj1lVXWGozWT@JN@Y63LVjDh2ZEaJy??Y&eGrPR z8F8V^-W+eg+TR_fn}U7cYm~Y)Po-|RU*2dI0KOfrmh~foK;Nler(zU5oZHI4Ak=Au zXwpgG_%{lz92_C=n3>tq6Bc|c6Lq#2i(-|32?+aLE$TKdS^0TK}Q!c=b zC(R&`iE>0=+R|||17q$$F2q%T&K-Qz#IX;1z&L;0=H%wN{9<;J+oDvcB&LZr(;}Vw zn7;nh7O2=oz4jWb&b+*Fe`qy4TjJG5O3v5)Q7r1aOSP2EMbU=;d`wv% zFFe3jWBJz0${<%-{sc)&OPtge75OA8GP=J7s+2XqQmfEryF$C4Ur;>bX}_s|Z>;0c zOc$67_(h3ZTJijW7jsf;6^L=*=JmVn4jFM3Zb*L zZ|!`729Nd`hxrr_kAxHSAGM{>{H%`}ZsIY5g;q-~N{{q{#WjR2O&>g~Qw%1!2RqRn zr;T?x<(m>7%095Is7^Aot$fdFH7 zTt@g8XKU~@bkhW1;Co?c7vgo&O0VWZRjw7dutzJ-#~VAR;;U|yf=ADbX3NpaS+U^B zX=u}R?SSX~31Rhw_#@U`9a-o2w(GP-xeo-cvGV1ud2eSRgWZE3c59A-fU~xePV^GTDmP)a36JdC0}S)bA;Q_ znS!sa6kw!b4RU0ayTxd*&V;6aaw+74dD{*=>VNg@ zjz!wjbJtF!*M)Kc9m{wyAL(a*U5_QIv71BZ6Q$w2fm#3jIh;naUE{x6wq}$3BZBf| zw~1WENL}neBf*d`4UQe_crk51zoged@*@@xnuK z^0G9!!JZ(R@9}b=PGgJTwov+U|M;yNykNN~^-%Q6HKHjFZl#~@pG7F{p+|6uN8uAN zd^$O_o;T)TKQ`th4?c><4!t#d_1?nl(~NEdEpIYZKma__e+mJ=W0%hfr%gm8;}=s8 zJ$cXzYinCs@U`^pjkG+Mv%mjkI(XDSB;QpBR$a-fXqvr=DLB<71*hI7XO3+Uk>H#9?F zPKVul4}RYQ_D4w6?v(@ZcyI>*hj+63Q{ZfZM)!B3KJ5e?>ie=M9ribHz+5_i@L8Vl zjC~w-SOj6lB{N>^3JegoUJiQm1F&BRe@%uD7&xE<7UiZbvFN)QMV`l%ZJZT1`m`_m zDt3keKId)VA_(tO<VBlY#XjnuL!&n@<-7~BGUWRLgNBt5C|+5@y!RYWFw zy1day(+jxK{O0P_UWk420vyvtXYKB>2APF65mnv>^p!W8H^>P_*>{V4w^lmZRAIlL?+?W3F6e z!wvj|JaMo;cXV3(0Q5#K58xkDT&bZ!1h4&EMWHp1b^<+*r{-Uxk>1sNV#Uu^Qc>V& zA>b9NFtyA-;DO3PoQTMgUxl#8m4otlfF6HgA*?xEKv=aLFJ#nO-61OKv@cI9H)0Hdt@Em9N@qwUZc*WD|9pqsjfZ`q;Og4 zDD>c2ZUFTF4SoM;IsXXMFfuY4k$)7tfg2F!`-$`44(RXR3JPMDU4Tu_u)?vh{hIXu P98z6HTRHQ@h2Q=Q+UTrq literal 0 HcmV?d00001 diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/cvv2.png b/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/cvv2.png new file mode 100644 index 0000000000000000000000000000000000000000..445fbed132e6883099621c0f6ce7b0819a7775a3 GIT binary patch literal 26322 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⋛@?w#X*OvKouYkP93fiytiRY6aty9Gs5rRjE`J7I3KD$kP6hi|I5J+j} zCg9n`LcWUQPmhZVD+(uL^(^H>gLpc|Wnw6FKp;DXMd)~a_y~^u8xRP=@`KhUdK$md z+V0G|Atv}JkhjW3iDNE%;(LR06*+!t;1wFxY*;`DB5->1<>+Atcq>R9+?#uh0y*e^ zm-g_Xa;3hATb7vUEs;=%TpUzTdj&qw0Uh}N0$94Afq{W6rSNqWP&Z*L^c_PVinh-PscpU$96GT`F1q%#EuEj| zO>~7YxVZtyFm23%U36@($#=DxtP4-vNJf*%6my>)QhQNFMicprvx>21kE=Cyi?hj(D4-o`q^J+?{NtQox1MfM798#L>d!f9hut+UZomH)gM_8cq4U-PZJ^r w-X8*+`JX+a1@7p-d~W+UC9>06*8{Nj;|NCnwaIg@z(^ocVsfI{!jHWE4`CUAng9R* literal 0 HcmV?d00001 diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-cvv@2x.png b/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-cvv@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7959068ab8bb4358c3cc7d6bb32c8b51645d5bd9 GIT binary patch literal 23730 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 Ri}kDG2HQ+@Z)!Uq{C~kepho}z literal 0 HcmV?d00001 diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-inputcard-blank@2x.png b/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-inputcard-blank@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4050c006ec57472947d3863b0f08173c248201d7 GIT binary patch literal 2166 zcmV-+2#NQJP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 YZFVdQ&MBb@09^obF#rGn literal 0 HcmV?d00001 diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-saved-discover@2x.png b/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-saved-discover@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..30007be3647fd45d6e2e82c4427e0b5e62347174 GIT binary patch literal 23467 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 <@?~%RH$@O*e0{*{DC@ z_TUqH@U{u`Aw!3IW$5nXL4wOB`=v?vE!YPI8`_~J5$Ue)p}YC%5>viroHwz5Esu9k zYPkOW8TWD9E_Q_)A9|2#a>^Ey1K3CQ`D zt#}NWeHKsiqu|XoClaK(kr^f#Ww*D#yvSwsq8NYJEqXJTG}DWWPCld8CEHo5t?b=6 z`6o9#ClI}*)rR5_pnLdgZ2@++ku<$|XJ+YWfu|dG(e|l7eTZNT)ep*QWm01w!@Pbj zZb@2$!QE8aHq9%2ey8r0s88rZoPpuCmd^~xbYrMfAg5WajkaC!42mD9x^>j@r1H;z z=kA3&cZ0|V!{Z*uzXL6?98@aYf9}M%^USvAM!EYF3+|0^6l|!ak2M+e!&mzHOvMQuOU-N-GezqgasaJ zmmCUuZ}@#2)v;pdWam`x!o&>Z3x;YZ5*SCuc1+fC4Ht7%Zt?;*SxRRHNRYb<33cc4 z&ppW@#8eY8HG}GbcNS;k5GDlHQ&;l(4tXBbV<)qb9K*HZF_3)OOWtA4o$U2BhI?P> zLg@^J?Pd1Ymv})BSv#Ya;g9#(thlzwNQX478eCtozranw_+yyGa?gWc%Q^~;zbm})*46Dr8McH#3!SnVw2}UN?pQN_Fda1 zG%=PQ!x>tXFRh>hO#NC0WbmifT(Jir2Nx^OVCxvoFDe4Qb&+AAlIsR~zJ~$azPjgc zvDm3T_~i7umJ(zk$h0z^YMyN!OLvNv_RJd88v^CvOlhXPziqQ;(^T#j6C+5I5m_|x zyx`iy_Lsf;u%OP8DpI&C-}*-6Q^)br4y)DbVoEE$F0!fp#HG>8mZ;5xSFw@j@T3-P zI2#|Lo<@X|@d&KYkbWV9DERt<4+LjwSqKWWv7M9fy&oyJ5twIuN9Ax6Zz<$0Kk5Pe z!rMKVj21j0IjP7|QpVziwN-o+VED_UM?a8;Beg4haI^5+Qb+r0Q>spu~?0H3@+bVOntnZ#x$crv0rty**AB-8* zL|+bV*H_$q`chVkwX*e19n|s)#Ia3RqhIrlW7x<*7X_Ixb0PY&J$+^oJs)u;ESwvr z`fZ~)C~f|>(lmH3i8u}rR`m44Ia5xc=|dfEW@zJen@5Nwk7swVu!YjK4j65R-?x^| zbAPOvt;3!~lV9~b%dLwcH=10iG~VIyg@tN;HQ1oao<-d1)|L4ovEu+d$iYbLw#jII z5~NN=M%tmQs=jvgt=1CSFjcTTN=N4~;z2$Nl1(Jlxo-fP)JFj;BN<

O&vGzr^e- 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 U!n^on;N~X=Pgg&ebxsLQ05Uf6U;qFB literal 0 HcmV?d00001 diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-saved-mastercard.png b/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-saved-mastercard.png new file mode 100644 index 0000000000000000000000000000000000000000..c6ef7fa4cf4e068f0a87447b5a827e35c5f7e78c GIT binary patch literal 45026 zcmeFa1yo$kwy4{u6?cM=B#GMr!9^YhrE%1_0b9 zGgM4fRW=?AoXsAK%7*wQ$l5AnBa$kMhWkB=rG7$&g!wdtEN22+sSQg)0+ygVI|L>w z$}a+2i2*eXc^qMx>~&ONZb;bYs|C+o%WsWmtNpiCV}fgMk1{F-5n2&Z6Q$XdIQ&qH zM2WHH1G_pp7nYfX{gEl{0GNms#$=8+6i|S3AAWv%@>Yaq0F>J(3L>CYKCP97F!&B* zQ#3^f%I^hKt5YnuETZ2dfUrlDXg)w#63Qn1sN>?o-qOpXna>k0e%_h zDV|UO?F2GxsO(q(=|gacIKYe#@ODrwOah?60(fL1+ra}EX9TdwsGCRw-q!$H2QX2} z0f?vo7NwAvbO2aSfI&9}g&W{S3gD6Cp*sHoeHrH369}o4a{f9>9tnSKL`HiAb#*3U z+5s6H`bV6G(1xkPOds7-@PPj881qMc06=yuHl(#jH*N#yWdj48QPt@BjGHa+cjQJ! zOSdb7C3eC9z=D&{@GS##1->62yr1>$YpPvXGd+}S=d*B=atz@rK=#I@`jOptHWE28 zbrTaS%gf_WJ4Ce&KdXD+nts%8Rll*i@ZrBcJDG1@r1S^s`b)u{&wuPYmdhg?j6-^1 zG`$)vbzOsUcTF@(-XUXDr}5;`lF|eFDDl*YBVZnRsAwGBC#sP<Ouqn#IyaMycZ!jZo_40g(qx-n{Gq7HsE|AO4;#I6jK!0*pJY`fbMO8C~Z*x zd!i=>%wL3w*jts%g5vGanLa+RMHjHcxHLq}Y@==TM}igUMto>UHW>nC6sAEDg@}{# z@|>(q8umdrC23E{BPDX#SPp4cgDdOmUZQbJ00 ztVtv;B$yXUA8E+r3uP;*>#;66aE*Yh!5Y#G6yF|1KV-)A3=!+#qI?i42BfKrftLC3 zMs?)Dh~$WkGQ|c%Q5w56K1F=bq_Jf=0#5=1DSh|L<&5R_WwvF4WwJwUq+Y{$F8VoLD+#^A*Qr=X}Acurg*Nn?~>*6 z@kYb(x>Q-XShtebQZQ0%pKCm+e&U54`x*Jw(^u552%a#j78U0g&laORKYHG)8eOEP z;$0^BoK0n^2TP=Dy3@N#+5kbFbb5H3($l*1#&_LNP%Lis4cLnV*6jg)Eh09?kJ%7n^H0dm1(c>&&&GNxk7Jc67Can}}`g5BiIW<9@5IopC+_olT= zLT~09)f?-}f)goJ4fqOFO86<%0bKr19QL;SM9f`N2TEeP?ZRSthOZ2h7GA{G4fE%I zm5h|ch%oQeS)yFB?zHaArG}>_qn4H5l;2HNmaogF%jc8hlk4j5>wn$r1t!}h=sl}t2r}11%w?eWsqm=4fLuo?+RzaOY zyh2IlH`Dg_2h}~*MKyTuSH|I|%Broay$wx`a7=4Hm9_82H^qC`dq>^~AfN?LpqCJ7 z5&1Y)Iy~Z4{)b~nrx0k?cHMY zN-M)cC|R#qEa%?(D2gfin^vt+FoT$5)l0|T*W|etpBe7q2%ZW$WGx9U@pH`rXEpWv zxLRwvYkC#iZ8P;>&WZU_+!^0_+zkT?{HUNzVM6^y{I#L4&ON-yTB3w_r@*J>6FVXi z*>xh=BGCb*0V{2#WMYrA3!0*sMmaRO znKa(a$Ehx))<6N?Cf2~X*cf}!Vlw&oYST^ARTG!qx8RrMx1VgnYnX{&A@o>Q#Jq*m zWJInO&0km5q8)pJP;LrVH)-h){mheCl1bmc(^v6%Duye4FY9jS!N&&+an*T2vg(XP z8mmojEqKcL?cJx4m$2dJgVf;P^4Eq{Ke7I*ShAy@ROZt}?ICaJuh;fDpsfnZatq}- z^2$r^t?98HT}2IM&ABSW%b*MbLF~}5vPV-mN!Y&Qw9{@Y1i`kSTT-SIDvL@w>Wl|X zMoczVXBjiK(G!c4R+G?e&?Y7;(dN`DcTP?vrkIoZX{QPH8uu-3azHPd$fvF8|f!EBH$0s^UzjEVOvz zJn_m}w^YH}ey0m&1m*^T0=;^y?#oxA5dl@@=x_8}Qs`YI&9@nQu8e4$XwM_lI~OVJ z#NC%S&XDHLh|zc_T_QZ+E+CAOxDc5VF%7@hZdHhv{P4VCr?X=Nf2W&H}@BuO8EBVMO9Ce2uS> zZ$Rg;*6FZ(YUQDNt$OM^UVZCLr%nFb_)*2KhV+KivN|2hx?PW^Do>NM4T4Orftlkb z_k+iG-@az@2+TAcdDxzPIy;$rJmcd)b2HG}FyTtGTiU4DsDCWHBQha26Z}<3`*wPK zZ`#+Q)iwKQcv|WV{$=3cZR|-jh8SFQN_1}!TF_P|w;&JCqL9PQ#&v<%pz$DeCeH2a z+ukyq$IL$GU$@2vhLeYLk`9yNTdckEZZ=!D@ZL>ze(WS}?r~#d)jL+Z+G%s0b|u=& zox@OE_9FGAy)(P`aH29)a21aiAAbi6lYDdyVq=^F07Qw+RW+P6u^1X%@a#C|+0djQ?c@}v)F|e7rw1)#&#X~_A z1ejh6*T`o|BsATs2N z-@({~S6N*0kK!Pb0J)iylN~QJv#YBslPepOt%E5uD-RD3GYgOz2xNrhV03i1aWZsc zv~i^P-N~PR#KDdr2Xi|ob6XqI?|u!9Y@MA1$jQGK^w-ZH?XtG}s~{W4KiEMiGP@bt zF|#tUF#nU0G3YNFJ7)*0->PN|Vg_4*t-&@-CrV zKVoz;H~9}0`L6koW?(n-|6ulA^Sjw^W9s*==7&({6>|U^I@vm?+S*zP{ytp)K8Qii zVc&-*DXqLA$lT`p>5Pt_`CpCx9y)*f1B)9vfdwJ9oQ$k2jI8Xctn9oTKwefJMizEn z7M35J{GRh)e8@wlk+GqZ;SXL|8CkehS=o5m*m!~5j4T{~dAXPOU;Wq`o13`*x4itF z^9LWsAYKz&2WvwoL33+EQ!ulgjVV9#--$ou{B8X5%GfwM8QOrrGU9@e1SWHHV_qI^ zFoz*K8;Ft3kll!p9n8wbXvhWvG4imRm>8NEas$CYp5JiD%l~NpZ?45{LC)W&5XANG ztBtWO2;%;)p~TAuHeojen;0^JIk_OnS-E%^d5ny~jD}nsMqq9*w+TCs$)5%N;OyTD zQgkqfEQW?wKjit|7Gp?ZKp@Bn3@L_@jh)qyk==-mospZv#Dvj^1<1u|!o_1~$jR|% z5&z)k--?npcZ7^Q_a84`!4!nk-?+czF==)Fy8}l>YOZ~fAe_8%vX8!Np`QJnEyZ;}||8p6xW?-BDYNGt^ z>bG3~*@>gAiIc0L16afqGD7})v-o$v_YMEG0Dk80TZEPQ{|jB=Xz234*AW~>Tp&&s zHZUUxn2n2(os$K~Xk={6$;izHpaQ)fQ|BpL@6EfugT(SQD?1;ZdGRVx( z#uRKU$oyy9{!IA4sqc)qxmiJ6T%3&ThAfajKrkDlArB85qcIN`7{txN#bU_D`e*z8 zr+xR2`^2xl`)dibwQ&JE{7)7^$Wm(v32VU)j)Eo*w$`MEc6L_gAj9tqDzl4?@gH&F zU;7ZLlP&2Fo8|B1fAI1D;W#x0JDC4ZR+%4a3HlQg>HlSI{@-3#|9kPu@7?-qZvGiD z{JvA(k6QkWg#JCs`5q@j!aecd$EW1?S@nIR{drIWiAx|y4&EQQ{~2cfcbC+EF~2t( z|L_h8EdPu&|7U^U@0I(({GYtr{_lpDznAh4ZvHOqPx3zi{vm|n|7)${6|=Rnb&$6; z1`D$BGyhZa4?h1^Lmp2(`~B&Zprf*sD5;Eu7$++aCnqD239@bdW4?d%^Jj!D0y!~! z4}=|msO0w@|NEE_H8j1S`lkXCmHpW}++08|$Wcp@OOi{Jl~sa+n@yaRn}bJ;3nO`&EIwcK}f^@E$xR!|EAOU9;#b8{}zg~ zva_>5ewbOm|NX=ENBzIrYW~FbNBzIr{%!i)#@tB|_(yU7lKg|!_rvn>R-6-^Z1GMU*bak`%53dHjr<6aD{xOL(FlM z8szIBNI}xd@&JGb> zBmGks!j4<>n{zKvv-*&Qz4t!U4Rg~A_iqfS5)!m+q{^;b0czo9K(dqL><<&qyaeCO z>WSxKO|0NwTNwb1@rDfmrHR5I3S3mPhYt`Zce-u3%-B7OD%eOQ=uXsB6A-Sh!r$E9 z>P)OWjh)$b`?OcnZBs+6`FPmOc-ZO`g*QW%9Up-`G&E!K%^P@Y3yV@}vK-N*6wT89 zZnHY-yq_nT{iL?Mca6pw+3170i@mWb+5s+Sp~4Qwflt`13l z0=1L9^ZEnySXC_pJzniL;ZPxtB5CMG`5B=gRQn#h$E0*UZEH5PoV%E{=G zrNE9M+}5!)MfDxLV`Ba!|Kba`hJ4Zsx$bseCe$sv^_DPHADnX?u{-!eewS!ToQ~w_ z2r5^SP$~i$h8e$ajR+YML{7=!$ickOWLKr z$3{4eZKHks-uf^e8Io6Vuw8AXdZS)E=<0NkyTdG|x<`42JLu*NcP90yaJwt3=n2XA7IKSg8eA4^rP>cK`n zT}}Qt4(S66dz*1P=e>%-+1;X|6oJ?W=ef1M)4>?b&U4;p%16f=a}~PoE6fbxj|C|3 zBbPi2I{^*=-Ws2vu$H+2;eKEO8FUu94qjO&w>I*7Ay?+rWoFVkUx_vej9dG z!tBF5pGW2UCD)d#BGAnxy|K)QS6upBPBpLVuFleIg(-LhTb)1Ip&iXN)Wk7*`+(4N zS>Deo=d!24-0R2$T5pNwbIl`iXWt#d)9XbEtvS#5!*{oSFGglal48#f4kRC8m8xyq zws?a_OKWV1+^%*?E?!{qSda#aSf8mVdNCmlbhiDOBI&4AgkrG41&}Qk*b*JuJl&-&rQD$Q~uzJTW?(yFK+~be%q^{4yGU zYmOvg0nk?&{j$2}dv~(yd%a`>S+HO;&>w;A0ywA(eHOK?&L{bfpZ81j(zLzgs}>Mk z=criopR3rz!5~L?YZj4Z0}Pj>C~uD)@z`q`biG+3aiuH2E=ul=4J?KYG+GnGm>Kn& zvc5~q7@!=E1C$$^tYu&vwJG|@4q5V-Ixii#=)kD9*iodl+&nJJUu-L!D~RcP-SeWQ z%Gu&Zz4@@(d#N+LLoxIjem@i`^bLfJ`Aww0cdz<~GdY*(L-Mc8K3I%dyKixchU$Eg z_PjR)JTNltixC+k)~r>QdivkD+;9ev_U(D>x2-irM%KkswaY*m8*GljJ;0&GG&m$h zTwfyWyFFdg+|N~yitG*zdpRl%45xnR|Lq%SW$RPPVe^(nTiWVWA({A{)(h| z$Vt4!%1}zW&ik?_Q~Y`=aB}lh$2Mo4x2(UsV`<$k&>TaZatY2GhDJ!-BG25EYM>|ypf zRS_4lOP}FGU!hSWLU#k@=dM@x_)kt$s9&`qB#**Lq-7&6k%68;U-?Mu^ex*jg!*}s z`pfHkhE%;v4=26s+FsyJiQ`$f6PE!GLuy>N_U)^V^Vi-*N{aH?e6+;5JjBV4>~8K+ z_g8>|C7Cy&!6X_Ntz#(%J3?Iv1NF6`9DvxBZdpu7#F29})^gkShV2-$yIJE|C7lS? z-Owpdlx*@_Y&rJU93dYJ^%A@u7$~V_=YWs59iQqXAKHgXQrs{%yM=mBRfFT@6{F~f zV6A%t@cG4zJQ{K0llx|zKdA~jJmlTVmf*imwX+Sn8h0T@C2kmdo@w8SFyMVg~o)GCoxcda{6sh#&dP z^x1v5K*y#G(G!iEOj!ehAyUP8@ zVyxLaoTlW4JabtVh1;Ul9&t$Vwf`5uO~3n>7B`M^evL7vb)JPfZhI!nDnwqQ06oRQ zctsye{t?|z2YHTT9)e9>c2QlO#a+$*zQSTd2qSc)j_==LOf0lkxY{;5j^6+4K!gpt_zi8W}Li;i|DilSd5NfqQPJ4dmR|{tN<13NoB}2 zWRr)6Di{Kn0b<`M;~zn3W}nQ^_wcw*g%;y29hq=v&=O;ua?REn1B(H4y%JPg9-7=m zyR{mSi5{)R(PB>q)~_cLS?Wp<{9vpG4RtLqU$-mZ`52`u)`0b7=V4>ksGRd7|JowI zq*01q#y3aZ6!3EG8_(a^GCU-DNRH8^v z86TPqBO+@tF`-S(A7YE=cwrAch<6 zvyI>D60#i1pfDiI`P0zOvH5*{1pOI1UQAv}Z__z+i7_dk>K)EPZ}5KRZbk`h2W!MxS zSxEw=b6OAK!x$@x^Be{YT^>WdP{GVldBl?MXT5=0Ih%FN>&%|*NjBvnB62mKQze; z=1w^g#zwlP+Tiy|esz>HI0Pkc=5D=ddeQcAqANpbaG{;`W!NE>ljRC`eI1~7SlQuB zK*Llny0&2Rt@Ux45KFP53f`%{A>j@_T|&Qo3_HdPSdA98*wZ+DhhZLl{Hs3q$<_(n znUGi{g@<|i^sx^v%xYdX=<9zn-OB(N8zOZZ5`6OrLLb0n^YK$c|=>;&U z*A88qEhmXB6%UhYF_4B~qC!H*Zhrvzyl8vrs;v7HL6j{!4v+!hY@pO|fvm%=S`Bju zY(kzY*R23KV<-fK0WH#&aZzO1wrxca5Cz>%ZywD)+*?!EZ-QD1?Mtmd@;YsU4?eas zG+RY`{P7bS6~_5=U{*8(3H8Gang_s8$|$U7xb`jZLmQ;HxW|3#*&n*ZEhGt54yBgq z8dBS)*tTy7kdKKn1s9AH>l9 zZxT$Kqr$;;lX2c(*R;rr-;#p z{~M!jJ+zHpGIRXo5fQFRof{Y2LjRzooXx#?Jnqh@1R!lQ*@zq8G0l6fwnkgATV69a zxYKJ7J8Z4^oMZTI0g^sV%=cnb@P)S=*e5{E33Ckw3PRXZUPM?5ybUYbG`kGV&CMra zV4WI}iMe~{!HI7MI^(nGsDb5_w|Z)J*SgvD@FIyH@@Z5mz4<09E62Get=5l@LWQoZ zlv@t5H_Mvw6`y~dr|0oI2lsY+?u*Ec7DN}H0uZlUlmnx-U!%Uwm!?vQj}g9PtN{$2 zz4LvU_rdwp3Ypj)_NdW47J~zywLc}$e1I^HsU^Lh{#{3vuW#~@H!f}S$yGe2KV;J&ci=9ZGu3ZjE6JR%ilgaOVVyj3O(>49)P@6-qunRtEw>hnT1A+l=+8 zS&@>gLPD3KxPm@cXG#*}R4Wr*9MU)P@_>&16tNxx zTd(zs$h^EqE&I??i3}ne+izfC=E{9CYerFUn-}VLm=3efaq1)5?62Ez-T|$((35;z zOcFjKu>aWy@9xSs=R<#&wc^{3jLHBUTWS0> zt#o#@fh&wgVD#OE7?SCxPG=O8O!H07%rnj3L9o-*l5ewG-f2)Awk{rSElXn{a-d(qF0Jz$pyTDb zF}jme_VF1RRe{R>mr;;Ub@Tg}K9Xwy+K^w0fdZ6yQEWYEv2M+PiRgIS$%R*=r8(}M zuQzr8%ZR|_KmttGN&$}TVk6v5g2_Zm#$5Z|+v3HQy_=++nwIWzJf_SkwQjbCUaZAK zMXU0q@EDY`HDMKgI0*`)&C53+arlJE0=Fs`&Kpz0;BGN##o-DoO?yJ;kpXr_4VO8 zbV9$ii=MZ&&`zmK1Uyj+ClL;%)3COZ7(zt~8=IEyp&LxM2wdJFqI`M4$*mO2E6L4k zgeMIbHzcz;6?O5?>3i!gRx5^3J?kV6PsWzc4`x))aOr4!I;AbfU;Vf}t4Za5R zHG-rB<}THY38}|NBXf%)snrg)=9&k+U2hSjd}*{AL%Lyy$k{aB?yMxC?@w;cg|P^h zD1RX&=pEszn7N+Sy-96e|j{yV;F<^DZVJT>sSLIc z(2Q&OP}S(ViWu7!Ons^uXozn|J8_EZ3}?2YU>fL7YOcJ-MY86U8|^LfX$g!g?^6n{ z&Cicl*PD%p60%f!MwD-C6Y+VUmnsi#8-Q; zKfq_{b~^D+od2~ADT=o!^+d`CnepL;`R)aHPUq73EDG3IX#Uds zmAm@Tih(DQJ~1VD{JN}q8J0lzQ$6Z=_*|jEu(rTxg z#YaMh3C>S$uHP>(kNb^DuLY;K9Wn1lld}0Gr%6!|e@pnJhSXxe6@I;;XzSnAgVSQC zc8nIqYga{-)dyWWt)-S!b-2S3oSZnTkl8O0FdQri--0T|Tk3W3p`vhIVSc_Xu~3S= z5>94NuH85+zen3v-Qm+$Ur=^Ia6wix-cCq$r7BVWQ5`|8t26Uf^rOSRU7cp%t0SwK zLvMC`vPtjtq}LO;$CfmDK!m{5*ya(f2b#+G0z3#9RjjtVA99(U+uZms95o#~KS7jf+p;NuIWlLFg_%0J) zTQ=c`uLO$>=|@??X7x7+++5Zo9e7cAUmi$(OOSJ#?1rlOy0fOF*A6{hqS==;7(IL0 z4~28FmL5rqI4vCW#QjMf3QF#-V{SpPalU-y?$H&2rQ4mqP(>UdO`5{@sRinsJ)89B z15-u#aMsqnvMGMmV^1@{LkEQ1fFeiD%!Hm2^|kV*Nl_zFC#&qbx~#>;^|>>+`CYzD zGVSSLK`^{&7SWDKZ}E-boPGm}+%Keb2?L)OGwj9~VJ05Z1qTdDm$&Imug8ylF65*{v(qaxE9eX_J5V6349WNI?ey zBM$M)gTXK6!!jM2VaV65fT3irtQ3{_T$+8HGpXyVy5MB!oI% zXe2%-HyjpOGKOb-EV!X4w3X$~F#T)m^Y%vECfjD&lH6eP(Ojfu0S8#95beg~az<_G zn@#oH5HEgXu5CE4Y1cVlsV16(IN9WCcQ(2t{U{Q%R!R4WojGkKfAqqRfH-~e0Q+>Q z2iL?=-&_m_K2y^RD8Eu_)MFsflR$9-bp}H@Mlcfha8w7D!P`w5ws>M6e%ix;2Ob}Q zY%Ii7^b;@v-AB!RaU+lQgpzx|m|qO*Zwnymov{*W1OynmcmNCoPQCI zCt;514ARzbdlYpmDT7hxdM?wOm@%Hp7Bje}+y)i4e#dRS}VwoQ>t8 zMrGFn8Y9g(f;JMZ*g~lwZp|xl_2~L*iwZ&5=U)k~M&3H?jLu zzMmedf$UIh;$zS@e6bOm63++qrl`GfRb}OtmL`E~$VoxETZV#*Yh?43Nbm(bU$f!s z31fT{zR4@@9W;{4eP1Du6bdQceZF+c)Dx@e zBLOGFp_GEJx18n?vA8l;zZZF>I@=>G?J*NLSX4~f3>-i`;IeWep z&|J@pD$I6(IJqu8J)A4hcsh3zk(o*z$56}DviUr!n|#z{MWO`Q;DUt;PoXh1Mv&`e zXEbrZHh=uSg!fg2k3DD2v?IlliTG~vp7q9jfsjw=W*Bv&4GpI@zjn1(R!0Zu{pau_r;>>Fh-75xT zHnjA%wa>XVwvb0g3-0V_L?lH;J7GSmhYTTuLH>#Bc#q&q!hDXh!tI{mP20&EpU;}w zE_Jt$y;mOdQ_1{X9ffLD?edaFSHOY%ZrEHzm(&c%JqKMAlTkZGNe(2rw8y2Umr;b0(SCCzX?-_$9&x!E zv`mqi<6?|@9;5lsl8Jee4_8m7N3NL{{ki86wG#E}F>_f*lD2KlNDFDX{o$Mrxd)G+ zN8J)M8*eZ5@Chy_s;+`@gBXP;%*bnKiAF=Lh;5%^E3= z?vtYud;_g42aMwy0M^M<%&Cf4PY#EYI~OQo0emi8UCDmuZH*yZLR`3%!{}G6Xxl~A z<+*f8AH7gCDWLI!qH4}B7tcuXE^ku@s)OXp8XW{Dv6`!bg7g-bK*mCoTWxD1lHo!C zBG%4;V=4m~z?eaK-1ZBFcI2{JBaw);Ptq*N@761$kj7Hb;NYsrEGJ;tW4rrektEwl zn>Q_vL(Z>CWox)>=Csix!tj zvg2X`5VFM<;nDXWDYCr6=V$%)VQPbdkDiyXq_*SG=M#;AIxz}DHB}hF@co>mDB$m=kDmsXbV=0!lv%l@8U-kK?r0mt(hqRXBZO1=vH;L%pn&fh5aJZjLpf;@bH77oWqDMbf^g zT3X$xK?kaJTA-Gj+E)7FtH7rp(1i3tMPkz}F_c{{yz5a2w@f>AZ?EHaH4Roa|1gbYR!YPr0`Y5e#`5%`z#?-K>e_0*8#;;P=H_cTiv6Jk9!l?p ze8eJDyK~5yX%;sCJOTXdxiL*ZU?uw@0{pFBr}l z9_avSXRgs%^8Bg7jk9aEOx>n^C}pA&>Uq}M4oQZt+dND%yy<*fZXT2yG0aa++8`U9 z--<1dY8!_EuN&`t7!?YbpUUT)AH}#rofEDvIpA?50TT=!J>4eG#3AC!Gy2%`Rz|vT zBw3C)vI}JK33YY3Fdfy`TR^0NKtNQkXZq|*iyf4n7_tQ1@NTuRJX&NwvbXnccRG|3 z<<_icPyN~KQuTol8vH8t#5v_T@e!};l2KzHunmoe7}sE&nS2Q1y=`N-y>Q@|ewtR@lop|4r{oK~7FmCNT{W(P_6`ZQ;v0Au3OF{)1P;UGIvDqN^-HZ+cJF zgW|6S8MaK0wlesywwapuUxHcR=q(0Q6SF?!IOn%qoyTMKWQ3j0#%fJ=F#Grw)!W7< zoQbbNq1`}1(#YkB=0r?w`Kla+j%P(UAKR!ygI4u>Odq%228++697r$)`693OoQ zzY?qzU`i5N1ZN6nb-Y9Pyv~@;u`0-u>6thwzh{?yc)o@fk72dSk6*+)^0A-mZtH~} z`4e?D6AJgCi+Ny+UDSm_k zxgYC?v|76758tujJbns!99|7gNbSE-arD}W?JP%3jMEE~4wq+1Kv57$PzX(mygwI(G9};60}r0o>68?b$s`{VtA@LG zmAak+aIoX`AL7=s=J@K9V~`>3VA6LNyWmz_{Dnex<_%%;_9|So?(cvSKtu z&?3u`;B_DJMP<+&w@=5}GpEda|IYrqKc-FVgKn2yd zJ%DL$ZUgBc$FPIAWWe4uA7%Rm&ZZqde!m?MOBBUDmS(GW$~|hI|7Zc%?gMyBsoIJ! z%z7$KdXOJVSJ#R(No-m8nbA=-Jj2v1^?A}9IXde5mvSx>kLO+7gPNy=uTFI-o6Z$c zwZDzZ5c18?U2km=jU(_U%XwVilAg%J@ZXuBDNf(g_*`wRt)q89ZZ*x{^q)A{%!*9) zzB}3v5{x3=dGp~zQnd?TMh5!i6y$!(gt^%^XlmDl_+m_uxMig#;r570nGy+!(YEJP zS1wGD5euqKR&*av}DzBDgwbU$pZ;g2(m} zL@I#%7psE6)OwrQsmYFomYauL6fFz3Wq8RB$mTZNhFu7e+v5|`AInap74IJEdwRYI zehP2mCD?8Hjs1NCXQb|PtxOLKgfz~tmg+|zxo(whJ!D~#3SWQf3A(q z)_urAqI%EFpbMd&TkDkd(;2gw57*+G-IP4*Mo-FMU8#WUrGuU0vxZ>{iOWlY?b)%O z+-RG%BK@0y;H)w!Qh)u*6JL;=O{|K&Azy-mWj}Y%H0>dY$UkIze57bXvCtWkX6hc* zm^0|p>vj9t%Q)SzV(rLkEts$kLE5Y~3w)iXyxev;Yw!hh(4g^zWZu(ijpi+w9#5?0 z-5S2j`(*UpRin#~1#BE*>fQB-G15Y&O8x2+ikv_n;qX>(h9x=^RAm`UNp^FrCZ90q zDt`6^GfJ4%obEND2p|U2WEly*y41tYgFei6U8(2HKfR zbYUTHJE&mtjcM-H zRvPZKK2xOSFT_`hIp`@`yzZl_cv8F6h^BKjueohQ|8eh(oNPZ5+;Gv(h3;@B^z>qw zz%&OnElFG5dg*oxLn;YnR3v()yL6CYDYO(0HbDe|I%Ju~#eS=9idGuk?rVEi+m6s_ zW5eJ~pMd%pp{L&Zn-9<-&~Lrmka{Yr?Vc*wk{Zn5~}tM+M`>JVvmHfgp5 zHOLH89DcBlhXpkcS^CWqdRF#s+Y1z;k3(%si{UW=*SV8w9@^SU@uE}Bqh zBrFOW?N1v5SozWI&qFALh2VMLk3>V^czA_$BjUzNcS(@lydgznOa<{Kp^r=OUdeO? z3IlDz)^lI@^hp~wxfDjg!Dpigd>uEV^e0Azg+lRB-j4~4=ZBXT{un8Za)7mhSV_Cg z;wSCYmeRKpbN7|(u7LX-q*o9$gI2U{`840V)i1l-n7TGO)!bAoKjYYKFngYGvu`1Y zvU)5Jbhh3jX9r|{7r1DJ(>*k6+Q}S>2u&L%95*4G&Lgayl_FRJCGsq&90wNoaGFxn z`@@WxSV5ho)`Rh>goxgPJkp7QfB+^2BoQ4Lt$HHrpfMup4<7Gv^VSLDNn_aaf{ygl z{IgFY*=-bgQ(*f05vd=}_}(7XOzkxuaiwC_>yZM_A4WA2?^P^#BS}h`wqxgu4(?+R zbj4~P*|`(Oefs#Gvs-KsvGWwo0QYoy=t%U8-j5ag@ExB^ph=;3s?sDm+EuB>#Okfm zHk1nddYlxyD&e=f*o-(MCkwasgdEQ|h7VaL=R;YkSKEs-ErKt)M0a9?UxwiwXn)AW z0hst))G%E4xW=RpBY+gEEt$Ak08BWERI+-ieXCd3HfM#lzUWb+sTfyQ%f``a<_f$6 zb6qM<(q!fMYJI22fr5CbFA2}65>gEtdhO9HqDDgvP#>gAPc#8?)gKU9b3{8Eb@Hx% zMv@Cs^J_%O5{VVzX7z~L6E5ir+;)21`?!VtSk@UWV@_UwlA(LLXAU7 z>VB!GjAJFmW3R;C>}3)TH*6(YsUdy4h~q1SH>WmKfgK=VsJ*tV7jG>bEW2M$aQA|Y zC*&J2IS@E({5V1qHWy1m>3ydA>Qo|+ql+Bp#x{}Pu6*DpH1M2E^L2d8kO(PVO=zR@ z9r?Upc9M!RkA9jRgOD0~+Dc`b?QPYOtp4Sgar{6jv*?(l!sZs~BRJ%;z}ks);!k~w zR4D~|ccu)Q3ecwyza@3;^vCc9f$h!NF;O>5zP+8;;B_)vHTG-?b$IZyu+Jb&bV65* z^+iwlOphN=RiLx2yj0eghX+C59@_OsDw(%J=scgx_T(t4^{58?WDgje@`n%1Xc$HAG!=_<>S=J`X4k_hm# z!xpi4zLeR%RQ9~6@S477{6xgd0MW(Dwl~y(nQ?ljNJSt4DppeV7==cu1LPUfG?!)% zt(nMBgg)g~M2z>uPy}tf753oyDKnBs&Y1z3NS2Eo%cnx1!9((tKo}U-OiI#qr!RMd zcl^UQ+Z9=3a<4C9@ZQ3w`NDiC362&y`?lT|)3bcYh~Sr=x21VAIQWEdPvk}VQbgiU5JkCWhbFQmva`!!NS1)01 zK6f^DAKBLgq-Ofpnv2;!&ycgJIw;1G^>Lx!=#5(3VnduQd!o~CuTif3qA^^TmZrJ9 z>(w9wAb_^B5fG7=S9R`H?=PP=@Q4O0C6Dxcip(9Ui##xON#`>qRXItr%U2=I>mw5M z`h|pS(h%p6dW%Z?(f~5N<<@L0H|V`V;-u7r9MhMuP!e(M99!R-zMORu;FwXTwD#~4 zC=aaGB8faTV9}Ieo0ztPB6YshW72AQ5ZE8ZfEFY`B&EbplwCzm*-x3CW+@6wTYuq~%leaD#D;x)p!GJT1IC(B3Zj3jy zKAnEk@tm^15Eg9r2_;oTGz<2Xr5CgcrrYgWmHSt;B=3<{@@_0D`x_1qSWbS*3fjmeLt+l&_wUBw~^uRwlE?|eOXE&1tFbou-jEGh?Inj{qO zJR^Mu8qv6^WxA+Z<0d;(TC}Au<8Y7^uGO5L_7FNXus*^e>ABm|SMOrfy__sa8OmYH zKQK){P`=f_b%-i+yKP`N-{E~Kcy(SN7)uLyldxyJGN%?_?*;?4Mz^s~cb42kjFI}{ z#X$PiZUgPf<<_2x;LD?8KmaMNx&HY_MaWIt_Q9}&gPHOQl1geCl)a`*p1FFo;dzp= z(5X>xf;hjTB*D(lEoE(5&-|Bp!9sT*YJIU=NFj zTy$smd|Q}K2|@|}H~=WQ61)$R-d^`kj6cP|JWqIQf;5!M-*>a?3VFkh zIh%Dt@pyccCay2Af{CI*M?<~L3wWpKtCd*mveN?jXV|x}@wkza3R(@Pwi80P2g+M1 zrp?rR8Kk{Roh&{yl!G(f#Vr{k6Kg(^g=gMIc}|6ylARx2H4m;{CFoocP`Yw&?5G+U zeVkzRm1%7<#h^tFn~UCd$%TdPX2OB2XW|ujU6&^%^(3C#dV_6&^z-rd`E2YD66+kf zDD^#eGCEV(xZpiKhHxHbpL@aXxUl!o;R5^CAMj&7f~V0MLWM`8#DTo3p!ikDSNtmR zNbKvL5LSsgycHD!ZT&T|1LSQ0*k{H=sqlBT|!j~iLELQ?h z1$h@5@gr#+9Mou~`Ie*4Vf^y}`LwbP@5_xnPXdAhlmfaUv6mi@7aXqQnOd%K?CI6` z>F^_;4(&+BcGA8wHh;Dgl2slKZmIVRN)qfHPO>Rjn8ABlP%G0`?R_NSgCY#;R5z18=Pb?i-)y>WJS3~bBB9VvZ@lq>}W zc_S<&Nv5<-L!y+u!m-fNiXYT7dXP>?IIoD{4-%U*9NHpygXFKuo zXDo4udPNW-%CbC1%b@HTJF%nJGOVq1ve4Ui)W|5fLOgSjKssqZ&EO*J^ak_W0yUHS zNT)HIXSn|i6$WFUcH`(y38`DECbyiMm?$+-1C6&2%mpfPh>^N3BueZE2=wj_4;AcE zidGIxjqo%7K_xRQM(u0%4`C6$kMz|rB(=XryW(^eKr4ft$1&n^b{-BnP{6?S%k=)g zA`TeHMX7xcg0R*PBwDDZ{`zHbm)(rI^hKxrG#Bbb*G6XfJ%>_a9#s?ptgEA(g32>+vO;Xi}eA*1;$ zJ`I@)3R~Bxm7fp1WoOKK68-5}zOr&*9~0xtm7Sf{ds_Q2wTT08w|ErQ^KDgiLI&|I z>WKgMp_0pUD*t(A~mK}N33o1l)iKnV&vxKmOq!)~?Ue_)hDI8p0 zBM!|Pw(?)0+J6R@`z*@c>h!MpT_Fy|EL0C=PzX+!fBN*6 zPXi5nH-(miSLROq#DLu}b>}U-Nqh{9CqK=3>9DRncEe>*Xfo!WJ~-hb#dUIVN$)og zj)-VmcB1R#zVZHQd}lzT0X#H)*n$AVZ*o%4nijv^MUe7Et)6X3?;@*R4XR2!l>>=B zXzMJs!o#?BLn}_^2|iJw`s(Pi6E%V;*`uz0%8I{YW$#$_edDvlFJE+%K7H!T={KK9 z+pj{|L`6kyx`}GC5i=-U`?M}}7Y&Kz+|4C4I#pX=zag`{+*!fb_d+SCIg$bkV>iRwRq#U~N9)GMM(~M~a59Iu zczuUy*?Mnh=XgR=QVq(0b7*zXgO|L!Z2*lg1basv!JJ)OY>Uv)82vptIjLn+A)+6} zFdMX|gCIKf@pX&5y1ToJOEdmYhp|OyM1+J@8S)1+GqdfmMfpu<;pDlUBk{VZBQ@1b zm29bue)z*S&zuf7ryW;US2@-;Hd4s2Fr1pvILZ^6DMI873fyopq67HS(9qDg;3O4& z@ZiA-&aGRMZ0zhl^n85fD)<=h8vj1fs!eB^+4FGJ(bn$SSY6c_9~~7KMIY$2jir`M z0>kE0$>xD=TKN9sM+z&}HG6w|x$T{u3(GR(xn+qa9<0Pri)utGXG>gebkwQ)rnCC+{Q z`t?XvY;WkawzjsIUFXM|D!dp+*yzuGbKdq+B}K(fp_2o2LsdnEYvb||dV1YXkh1FD zy?YgjN?-G@`Tf+-R!KhQfY5%~L22Qy9;#QIU0?4rO#!EX#``nmdIeGPqGK2W{QNx@ zR#vBq_V!!lmLmm6GFnC>*KEdp&+p6A%lb?Wl^~ax-y9G6aqH2Y3b=RUCyf`D8%#UrT5i+ zcRj=k3kz}Jb+-poQc}pWYj~+~a$$irTwGk(wZ9oOMs)uEP5qK+KBhv(u~+Qi%VxZa zF)M*gBp`>jj*fzo(l3j0x)3^uD=&22fsOlotcK6b&JkPcP{&8UD#*My7w2d3A?YkJ zad9?;822ep0oo|Vy$%&uM~g4sch3JlX5jc6c@}4)H99d-+d8{tY;0<3)4#gsXTT{> zi~rNKOt~`kJVtRLEjV>O(JbX?c)B^L_l!X?>rSHPR$;|tbyiuK<5;YQp1Y!#*Xdif z&ad4`0vDO3rQ0j2mJL@Qva%L0qtP5Xf5w*E*S(tpGlX5}*oJbi2J7;P4GMfmZ%7xAV%-H)%ZgM}hj$ANpX+F2*d2&vGG-rr%`oM6^68>Nf`z zR;>i7lxk^Z^~FWFWm6S1u?*VTDk|a|nq*rU#bXjPhA-@h62nc=1&!&mKV(07!Y3dU3kQ!9yNabSG5H zyxi!3I&{{$Z;Ks4bOgsj_D~&9=lV#!Ns*o&9_E&oNooUH_!wj3<7Rbd`{NSCGF)Fa zgva=%g?F}s3kH_~-tP3codanXN!)GPQnAv}p|Gj&e7@Y5&f@U*r(eDcdeZwPi}2-B zj7KcWxj5c8z8zft=zBOFgw`OE`JzO~tG?=$nMI9zL&#&7g+{}nr|rYRq$m2Ky1M$7 zB+`W@wrlp5S=;X$IECMWs6Ce2sHmupqPxFwB`Sre=TnWY#F`}f`CYZ*AJ4R(#(wv9 zbT!QPY;TmNawRXnh#2GkCgP+>Oe;EfbQM|eeIj(3gI=WsNORsBkXIOm>Z~7KC0l1T z&Uo!dqIhW*u|vVy^z`(^ zxx|M$z2bzL@%4%U#4(QUH| zl)^(I?A#HGX4HB_(#4}?fFe5))MDD=$js7yb2TEF{@sIvR5kBW15N`@Ql@)}>n@&f zh~}jD64hu_)#?uAje%!O%Lb>j)NcP~)ld95@N04BLu_m;vv=gLwze1A+QMX6JGbZO z=Ob43JY40iAxg4kyZcu6)YR12ii?X=1rl#3M7w`T4{o0RIc=v@ZOl-EN_qA2rE>{e zr+k!C({OaF%)+xAME-E8{cJ0T>d0>E2esG2A|lKtQwQj&3(VBs>_~PoLhZWE-`G zQ!TpJ=?xn5oC12P=Q~UKGOHC1ne(dT8HBKPN_u;rncc#{aZS$o%*D>_S*LgEBjE`L zFGa|*9G*T6iAqXhRr+r0UMh>Zy0X%f!eiE>itz*sa_R%4BPVHQO^rx?QIXB$7L(!k z)|B?Mwv(PVzCS<)+DpB(@gEHZPFs_S>t(MNky)-u%EJ5geeLRcusbv~R7c33XrlEM zo}AXZ7@BM7|4=)8AEkMBy*WHB70=mE>R}+#idfu+E-3SdUNJKtU+mnR@kd$uD2D#2 zDOFX~J1#Y1x*g|E^v>;$grPJc=~zG^%z%_Ci6(lB(+m#}cN&R5%by3#Fll^;$<33NyNm$J()%;epZjV^O#7XxI7@w zfQwz9`9in19jy3ux`bBN)}U6#p=w-bx7<`%B{_6{d`#pqlRaHecAZSCt|ouGzrPQK z)WkQz4yG5MSQ{D5zKdjigpbuXI4I@rE|i#<$kmXPk|I9fF<(&DL%!#8r3Q6ga@$Qs zMa7L7I4-?hI97LeclO8j8}I$*=H@ohH7J{fp5)E|5tsxyaD)#USIE~sUMI*{F>eB`}0TM z&~PS5T#86$!bZUF@mnA+vnu8X3{CF&p8<+bC! zU%m!w0U=0EL80~CoM3gN5T{{$zWJ|{Fc~SS;PiQ_6-qF3MKD=~-|7$k@Ohu2ujGM8 z-K231N*wbKPnxlfg~h|&le4dp*QdAK+Pk|MA3S(7gbwU+{*W#Yam=bwBx=(>u{LBX;Twq4?!d%CN<;iaYPX9Y8$7eA7aEmH5J1dLvX`y`$YTDXv z&K6hVA|WQmA5_ok9yceaoo*dp9Qpka!$Wiw18gKDE(0^OV>jREmuHErHK_33MVtek zp^H9AY$QLd!(&=}$5X>{dtRLfBZ9DVK>aiN|Jn)4D=RYs+n%Yx3!<0gW(|=9nmz<& z3uVJWEzZ)cPRL{0C0Jx5a>^6b+_*j88F8Wm$q37EWnf?+LCBG5Fk6)wcFf=3e^U~q z#`p5_66aNQSfoqz{fr;o@oOMUF;T#lT1ZF;aD_gE&hPP+;?Yo)jTx-5=+Rs>a6_n~ zYMw>aD-Yi_(%RPT5d#x_9Yu2fXclewBm~;W8X6=bt{Zd18u}&%2DBj< zW-0Eb{=2S%lz^8wKvf);v*KaPo4gNDa-NT941c2$Hto4wxPY18vW@L{*HM5@KXpSxbzGJ z=e*xd>VL}1`ILT?mU7qcmlsDSC5f!qnwXgl{`mvIOUuD=C;EZm4y3hXzYNLMZ*K;_ zeiMGKso5?7_nuRF6|{0_i{z6hR~6&g|8=qYdU4U$Q4IF*Xc@2K^z?UduXb%zuAdST z+C|W{&6i(B5n{w;XbOI-zfgSVfBId=c;9GuHRa0}O7K_lW@cxbtsABTDbkOL-gOw$ z-M{bG)Fipkoz#ZIQTtdp!1h%&RmIxcT8Sd3rY0%!+Q97ATq+hv+dTEs@^VM`{PQi3Is{S=;umlS ztD^uI(dw$vbW^}<`k&~7!I2T-JsrTsX%d5Q*||s-HnzDD9oyTA)=Ay12Mrfzvv-C3 zTU%vo_0aZvZZ#-sAK$+*4_;gnDv9ssGA=Is6;nPU*x1-<{woN|Axk5}w0N?at)%oxI$4aa5+hfgF>`UGT|+2GL7FW-w3eF*rU zC+LRW%VqfD7Y89|68|c&!`Sfbcn@@&G?_(bJjWfvs`B#Kz`z@&rKOdp+nsXdiLjVe zt3@@H%U_cW?H{h#0zGtY>R5BBd12(v&7hE8St*zo2?`Ez{7>^VmZH$xl@$wNVPV6l zs{H&_e@hl3BBF0rNNxZ-$R>&%NpoA>_D6Y+>2^HEs9pb@L6=?$0t1Ft9FvtoTDhLNx0< z_(os3Qb7Xq^74K&>!t28-N7bv1H4p96;IyZcL7mLCl368AoKvBdKW%yqY;zDYw2AH z(uz&{JIe~XuC5NTj)QTHIfjRGQaa->(s=*K3tSeK)rOK1uBPKri*i9qJSSl)5OmlV zXDHXH`6e8WkI!FyPD;YQ@xCiXEa}G&e&E&e&dz+v$;ob_)KKm*F)?+$wpzG8Z0!!J zmbq=sBxHK87FH}RE&Vj${1g=>si#LB78Zta?dtE&&W!rmJ&#C}#E}tou#f~M?4%Oh z?yJ3gxdnowe{!-1u2jtgjE%**|L!RC-Q+enx&i4xk%o*PNVSMfNI&r|Dx>{Ki`0V_C9M z8{Gm^#>06pfyPLe4^G?l_4PfLm6cVZV3;FBqtOw2t~>tGK(PnqGkR9{q7oCy7_&fY z0w{%TngXFKvqF~Im4-J@8^DKiOt{U4A+8gU@4|cg1fiFDetsUTaWjZ%Crn`SZ*F!< z2q&kMG}*>DUgY*AOMs`m?nD`Lm)K29UivP6AJrbg-H=RrKY#w5j@ZbYq#A;-$p;0R z_+I|-Z@y7o!nAQv%%zTtJvpze1jDJteuEf)0`w>5&LsNa1p>kK)j+YGb>|nM>gHzi zouE3_W>v@b(yrDp3U?s&8S^Ljw)+H#&nN@B0wh+OVF~QSPe@qe;YlD&RAtDnbeYhljg1AsJ{X-{B{04L znyYnjC(MFv%6%~zrWczJ&(3qufovC_f)<;v5kaJMC5yng@4I1(+YQp@5dR?n20OvguTujCiE^7csH zcnwZLWxJAmd=j?_h`rl@{lF!C8YC<_ZOqO80gweb!1dO&ED>-%x{b#73nX|XF)!Fk zh$==%Q!oa=j0CKBJ^wrQ7xz1oN7_U^B2Xm_T0fF;p?8kFi0<8!@%{nz6e`xmr`T8- zZ*MVocXzJaFam#Jo|5s&hdgQszymC&sL04Cy1JD5=iBkQ#l?3##R4+`|C*Yb5<=(d zPd22AM?nnTbz}pTDg&3m=r~v(hqCP%V?it&C=mCvM>>aWJNTYIh(wFbbe5r!5m}`i zh<-?+*Y}#|9ZHPa@Ggs@%$bV(XdJ@_2&N+7y;yt3xOya@Q*#Ro!=m10Wo4Znwn>yb$T>ADXYZ|K1%D5ZIVPS3DT$^))a$Zm2t)?O0GRK ziu|4Sic{JUl0wTYSq2tIjnr#nqAG*DxdcNEU;;Q2Ee}sLc&aR~L^7FKL++|$f}inw z162e29Hy|K8M-4)9|fm5fYV%T(!?-eN3;L5Dpwyqfc*X1VWh3k}`dL;otF zO~`k&eMn?S+#?;$3Y%A5UBV4hG}H}|p;B=s9-f{?d1UZBmJmr;&n^_>NY8z&Yg=1e zT#HkA_?{;S!<5 zv#_+R+8?vbU@~0nNj`JlIT74qzF3xitlPb;5b7 z;41Q2j=%tRv2+y)%0>YE2?87e^>6d*6;t9HBj((RO-HRIUWEW$K&i02#o{_23JD!m zHW22Wox<|iLHPC6Z`_owLv&U*-VF5Lqfst_w5M0JB{rLD83-G`gd=4N)->#Ce zKIV3~dh6ZW&Ur&%D_mlVCC7r9S1SQ4n4)tnGnwfnBqS_wa7=2#Tz>EWZG1m8I@-2d z0neSW6HNaY3S{sceQ_QEHM~Hb748cbHA`oIcNb(2xQWIPYAF8@%8Dq5kU4=I>A(_+#Au6Q)an~;Royv%I?<58P{;$<@y8p)r>NKF+s?Nj02XwFkwvVIBI0oOQTY-}utKQ=zz@n}9i8raH4cE5S%w{M>)Y%2ZAdc`Ti zWC_b>!QJ1aD=sMbWm?v<+jPmZAG(WwpAFE%G2_OEIZq zTNev53z15K1BGM{tQ6P~3#sR{_*lPoui)b1_MuQ=D%qjArfU;bgcajq=`38giy+AC zOi^|*v9b1$r=_lFz2`4pRIQbErq{CEr`nHFWPiOi(*lLFZ)gbC5W04kBB;b-IFIFe z0mv)U6oB>z4X5)Q&F)MBC?`TtqUvgoXHR!}%^l=AC8tXBDSk~y={hmgncIg;Q=uWx7j~Dd@s!+IKBOMEUQ+D zVT=7v4|Fb!$bW-hGtCbzs~4|cbt`hz{aO@1s7jFC3u2@W5G6~aDl9JMSR3I<>V8RB zWD5S)_i?KqfzMQA*=(iTz3D>?i4s8|=YYyqjE;($gMe{>&aB-XP%L5gA&rzHH)u4#2e~*O_kxJg>-(EZ{9{mjTwi~LsjWj3*xTDX zL5b=2@88gQfM^xS%z}V;mG)B}=uC{w$e%x?ahdcYTjwX}pu*|X z)6<+Q{!j~{{To6DQ~Iih7*cGfXK3F=Ro~+m{x(!kWkX_*h&$0IAZT{lB+dyy$bv!a zzFs~Wt{C(2BQ6^;j;iPu2DDcgZ{kss4pxE@IPFqnl%i{EVG;6%w z!LKdr4pmKoOTE75jv(dh5NH_U$vy%tOEyn@599vB+x&B*cL+qF_-84`gQL^*QsWh0 z9xX_yzeP10AgLU;=;)g&{_(R#NeErtT6d70sRt)#KyEkV z8%`P7v@XLJ04bd%eQ-GkSf4MnvU-m9R-sJ=JtU~lhdfX4<)Kxz?vl}Oo*?Y}5bi-2 z{5Y>=MSa8dvGUBUtZ9d;KMlSTN&MC`S@C*?BL!No&jcPk_yBz_P=rg4Ra1!)#Io&ZA-9mcmP2JcJuCJ979 zHNm44{5e)`Sq1*fr7#D4ga?-Z9S0KK0y2<>0JE#316xjD-9-fG2Xr8zVuJ4N>gsyL z3}@JeeFdSn0x^s{m;&PhqKMNOC|_1FEf$;Rx3}OoNF$)>9}7(Qo4(`u>5*pPNFUBj zE@Yq_7Uq+G0N$a41Ro3v9i;GZJTTRojPGb|EH5u-W@itA`vqRB;A$Q`tg^Dw?lJA| zMC9Vt+c&O*GYlIG6B>~wWC)@+mX7N1IM5r@E55_=d3wsVO4m&^#qP(e z_D^I*W`Qa9xb39&4kXGFNAPbTebQNOf#+m+y5}JVlQbYpOcoQAzRt!8 zkmeOr^8W?E>FDTK+B^Q%X6Ys&*>I2k<9zs_jaZhD^V#HGi3b+4!T381-JW%M zc@}R9*6rP>8{0jIGQ5dbx;BT&ac^*eHRMsw*7-V@Ynv<$9h7NN5Uk6R#H!xGp%qu6 zT?iCN#yB~ExVdkYrm0mmxH64$Rnr^WTjIN>L>DLd#%)q9ghEFDr?@y-ZEfveE)vhH z1J08Z5=f_SlZ)4vL?uXO|B)NxqG8$%)Ke#V?Q|zKl+gXA%abRKs-QhCE^ zkZNMH%NK4tiOr)c!}&CcR`02QKcz@1%b%Gu==mZP0hH(;m23(}?9vEn(`1z(m~251 z0a+FxCMMoUv>FhayN0ve%zX0s<8z_=_tVNVGv}aLCQwAO`w=>R)IkEIxZ42lhkt3# zH-jWp`Ijm4mhDTK`6MJ#!G~AKvVbh>z5bYa!c?hK4dUGQqvS z$zHcRFr_4mIx^NrB9Y9xb<2Z~7a)nw`5rwg1eOW;-8|~Q+67GwuOlyUaM~{8qC6+Z zyy95p=hl-r6EHj#o<9BT^c-ng#s_b55#}&dpg=c^pS*Ao7BRjO$PPnQ{pK+o)l2D9 zs_NW6LkEH8) zf?tNDWMAfEr&;df%I#o^b#!#B0OMa&Uqi#SghAnQRBCj5yyhi>2s`*;o83SMWoS-X za5o9KyCR^uh+$G|L50bvZ{7hak-VxZO@*a3G>Q#41)&t}h-DAHajHQr93HyGGbprz z?RC^ABsnP~ht?z4Cab>Z$CZ?oZLt zWhVhwS63fN8@H)h|NZXWyTWKj4K2iFBdHBMLRXkS-=|>yoa8lj>1Rep zMk2fil?7fQw6%|WV08X|1&mh@PM)r4G^*~2Tk8HRyGBe6 z@F}dR3U94-v{t@nn&k?HQ~@%wKB&wLF!H7@H1 zh3fetnIZru_3R<(H87Hs$kzE;Rj1)9(AE?^7`_>OM6Bq!&H=VaeWUtIk^w%EKSVzhC$aDwM{Bpcgdmc662;&p zu3zb9C@Faj;!P?D?~y0CXtpp_bNVZXI;|vu+vN91EUU&j9S4VP4Jc<&y^m?%w$0vW zXU7X|xf^~fkWN3H3eyTd!aXajZw)R*gkni)7+S*eX zWhjR6)ml9cGBPrnr>3N$<%D@2`Y==B1Cx9LHPzJ%DH~_u5fQczSXd6n!Na2l?w#_C zmq%@VWtMj5O)M#=THs6eM~}{2eSFR>A=gL2o?9OS4n8wz;vf~B2s4@>#@9*!SxDfW zdecwIdDDTZgz^3fe5=p#;DLL7ef{~nvy%hg5*XF%w|l*5e?ayVhD?a=274ODsIpQEC- zT@Z-=alD`m_}HSO3GhS9&(6*qulc>T&%EWzeM0GB>gDD25_U`nv_~;efOTNAU?0B} zQ)Ar0#w~?e;3x)g9ay2Y`5jpSDaxk84BGGO=EujI4tZ^Z zCxAt?FhdLD0?P(^dXp!x@j8ltkTQr%!2*$AROR)M_&b9F@bF`>&Tqm^(m-Ni0)-C+ zyI2FczMlx?8aRQ^oR}VwOp7`14`wDNb>Mtfz3uIPC`m|MX-RR9rEJHd7?!{H?4C$7 z4hG`NX~oS$No?j%TDOC(X%0yzt*NQmfzFVEzP^4gi~>@SlD6+2d8z-LvlGM>PFBen zwg`Ak`;UAS(Z|rxoojlbEi=HwZTXYB_dtd4!89K~6f^|{k!|}Y?B!+}btWAv0rR(L$CGy{Jsx_|BI@DAcR9Jr5kn%A&T}4>y(cibr#XE%@MLpW!Hw-{Z&J za5rJHv%}`RHf6{O7}#2!oteplM%6<;a%CeguUdM1tbc|rB29z}B)#v7vc1z@lx)ey tOc%!Z_g{1PzmBW_|C)x+<~qN)l2LtA+dBKh*cJGvAfqB(Bx&&OzW_q_Pm%xt literal 0 HcmV?d00001 diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-saved-mastercard@2x.png b/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-saved-mastercard@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2795df60dc7a3bd140678401beba074649ebae42 GIT binary patch literal 30646 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 literal 0 HcmV?d00001 diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-saved-visa@2x.png b/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-saved-visa@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2b5babd19fc35664fe34630fb691df2ecaa2d8af GIT binary patch literal 10480 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 Ht-}8gC*9C5 literal 0 HcmV?d00001 diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-savedcards-amex@2x.png b/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-savedcards-amex@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..82c542be1bf6e71241d5fa98c64259b03067ff75 GIT binary patch literal 47321 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 CGd&dm literal 0 HcmV?d00001 diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-shield-ie.png b/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-shield-ie.png new file mode 100644 index 0000000000000000000000000000000000000000..c4583f434eefdeee5910fc13667277e9a8a23879 GIT binary patch literal 31456 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 z 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 literal 0 HcmV?d00001 diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-shield@1x.png b/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-shield@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..900656c067600cf8e3b2d5132b4094afc266cd17 GIT binary patch literal 36611 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 literal 0 HcmV?d00001 diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-shield@2x.png b/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-shield@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e8a7fa57aa745ec09702d6ca5764531026dce5da GIT binary patch literal 59755 zcmeFZ1z40_*RVZwcStjYNHYwLba#UYq6{!}cS<+XNQpE^m$Yv+H1$a6|SZti-k^x4gdhKnbY=8r#{hLrm<9pzQ88_OQDF z03lI#dx)_W)EQ_5HM6i4rv1>|Mhmns5vIMzqYP5EmxP*I$ay+KH9b|dj6JQ41x#o~ zMbL%Z1z`?spw1AWyN$K2lc2jW?RUR|u7si0RaIH5SRlDW`o_q=Hy}P3~^_(b)x&t$sc~C zpiah)7WU2-cDBH4zYrrk7iVEw+UtV;eEr@o8~Z;CvUU2M9gHG}JH(!YlO4qIZ;X_c ze{N=D^N*HJ&Kl6aTK10xI%#>>Lpd~{PIfMi#!%SpbpKQZCueC_Sd)H7^dC5qc7@tH z|D!7t<3Ih_yEs~Z2W?`^0kwwOz)YNA6gdB}E%xSi&UQ}bcK-(8pXz^$(b>ZE->|sW z{97}qyT!jTyVm?>_C2P4>uMobAPY)5LLts}j#_qh)*`=!tJ)v62TDqQ4^JSYGQ`-z z_PR+-LL7fL`YUw)@&}cII73BXq0P$%;$;JawK#bMIYENluo&kS1c82V^4pz%^Py~K zVqxm>gAYD7Fz2-oFl>Zy{^;X}JOAzjHWW=D&XE7e%a8Z|s~=@$L3vvzXNavaR9;F1 z)^>Ia3ll*oRDcJ>4KiUfftZ@GaT}Qmun9n+oUkiy2rs9xF-QOm{@%!cHNW9n%Ffv3 zI+S3pf6E~zcE&LGe+Gykzp)Y2h=-q-O#lSqW8>uH6JUdYxdqrvcsRjOh!L2Vm)GQv zf_`vzvmmIWg)7uV#?j8^`?$A@d47B?FYE1!>-n-j{$ z2jb^uu;99;^n>iL zO8sVWUC?hg{6kEc@N$_7@Cks~xCM-1Z#>3)Y(`wXd~6^d9xg5rFT_*;!u^N;AI$%K z8E)oK+usuqY~1i`adHZRc?G$+{zx9b)#UqK|K5p{ovE`M#1SfP1{%2L!g#fjT;gm|iCo z3mb?Tl*8WE4CrhJgxK3#TNp#G!-B)r*5vnf!=D-LkB0u>k zWAo2s_j|(q|2D7wr*rjn-u|!m-9IeKe&y9a=EOe}#vfzjzmjdf=a~OZD!tCOf2Q6) z3i%;p{XMPy56&U~=kn_RJ#GGP=hgpg6LDk7^!IN4Yqt8AHP8QF$L4QQ{IAQ{KbGD% zm%TzJ#)77Hjy4cykspT2U&6m&3jMi65tOvEwsVB-ETJN>dF`LX|7i8czCs+fRlHt( zJN@fg?fdFm0%G>B((BIqePzc5;^Y(Ol9UnP=a%8+=K)JfNl8dcgT#5I!2CSYk`n*B z;rnlPkYETunBN4-$Hr&M1O0sm1r;!2GchrSaPjjPn;LV&c56RhUH%)_Tt)&$oF?2R z{{yahxcI@GT)YDR1Fj(;P98pEkn#V3YbY4X%MUgJvzhP<@WWV}@Uuac-y+{MX3)F|2HVLZ{;2-D>0g%GwieDJu%P~4 znZJpDu)01I`)#ai!p?!ABD}D@Cain@F8;fPnuR;mT35;fc5dTzz4zt6ZrFFDzia-{ z^8R0zFepD-{-F8Y^0%)0;mr1X^7u^(I}wH*Msxgm8hs_8lm5^7yy59r zAvcixOz;cW&*ko-*W3)j!++|d2Pbpy%I1ix_ojLr?+FI+c}{7mo**U#wO(EY-71If<>zi|DG z&JEo!TsM&XOz;cW&*ko-*W3)j!++|d2Pbpy%I1ix_ojLr?+FI+c}{7mo**U#wO(EY-71If<> zzi|DG&JEo!TsM&XOz;cW&*Rf7Bxb0OZWeONnc_&+ccqr4VXQ_4?Kq3#vqeB!>ksA|m|4QfgS5O$}V8 zM}oq&l}gGzT&5{FwPLjWDY^CN*B8GR z{($xYPeb9x=2h( zdJVfk$nZuSl#hywo8+`7k&26l?`fahQy$+0fRFfpw5F%IA_sJ5?|soVnC^r52rAzT zt=$~pQNFl8{*szoIlahY)=iA@$oyZ8d_e#sl3swpbPQIo1k6sv)pr|LdA!w$pW=~a z8n3eUWKX#450!*n&fvhwo%2iV3u-7#pHyY5ZBM8%I>%e2Wt{d!s}n+VyH?J-SM0sb zy`)#mYaYt-IxaMiw<+&*{Yzulec}D&nCKK-&b=i2a3!P&cMg4FmB0*^FxzQ*T#yJ} z^VltUe@zT zYP`0}Pn3n@fad^cE6*H>WeKYM9y%tXPrYfx7=eU6@YH@ea^!~ZfRcWdSGx{ovu(kI zK-T;RsEX<_b4q@R@X}~3@8P-N^;kEAG3|qBI|v!&l;+-%OcT@4HKTR<${Z1(CY^+QSf4KAM~Qp#GP&gPwQKTxOkJo>4P^tbEa=s4ljvq<1<-@IJ=xk$!4504IYG3g_ehUW_4&p{Zcf z1Z5P8b6SCq&Ln|KsE<}p=yW^BL_bUFU4*C$AS~(;E*$04Ix3y9+~@FUj8neav{5fG zZo`vRibYri64KC1z**oT!JqmQ(SY(7OmqAsmI&7FCBZObQ@(&R1nFHLK8y1Hwx5N0vHo0D!+ zBt32I-~OBz<}OV;NVkY#)k4b}3+eULunqzSiOG@Hv@D?0(`Ml_x?BoUq>&V2>b1>wCi3ciO?8 z$9k5u9q~;@;p`lhlb;q{L@IIgw#>?{?#&=6e?-Q*kL+E{p51TNMNJiZ_l;$UyzV|{ z!lcRz3vooF!2@Fkbe6@cXSA_XMXUy+E~9$M1yu&-OJ%6B;0Zro5E{34*CDyr?IA+8 ztr8?B78|sG7eJfe4Z;lQ0A{P1yEzeKBbB45e52m)EAhi_muxTfnTegBpAR@bK9-`` zqSgw+O-xR{M?_4_fR98F9~%OtJtPZ1EEZipzjfl;9f%_q_tXqdz3&2Vtq0e|2`n8I zZ`(}vMz_KbK1Cg9+)TF`Lw(xxu8|ZRGC4MUKMstp*SSr9?+K6? zwMWz@44QaEjtr@y(S?jCNZ?ni!iAOZAqI*&8!QNml19BI$SBEBzM4v|EZ`;Uy=PVb8+ituQq>iJHlf7D1bXw#O?K zE(pz8W}pxxdbk86snVMP;)bu+hrRoH-O<#rj@~ln+h8?B2Laz^P$16-6779CZ8i6s z-Ya`OJgma_!q-qY%0d6jpBl;#MR3yjqO&jgD5WUdo<;nX>}^_b{M_?)O0*dc zKtGjVOpX6sl_L<}XaKOx-fZ{C?jRwwYe$O*&*xB<$Y7cv12%hh4|W&$#Uw9YB%Kv< zKrf3W>XI&i<^eeY1p&o+OGHH6NQ78~J$i+VoO_*fGke9(+t2(z9HBK#8qmd-VG!4> z58=EMaw49z;x$Ut$pJb5?E%<`WXqLz;?9?*+=%RZS?|T6){S1S@X0@aX|*a(;BNaq z-MiWmSy53(T}x9+4OxvSyZ}{eQcAPZSKm-_oW2;oxH7q9%5DhTM}tScs4X^dHhTHV z+UCnQ2E?5?D^E^>7>@vS?5r$J`jjM^)M0X@A=F@W3X=&IyaDoXcjnbAMT>fAeCiNs zLPBYYJlfQax0w*2naorq>R}|#P(1g?8WFt&mkK^pXpWGW#3>4(I^9tR-kY0Qc)#`S zjO_E@mK2|<<1m+pGHedNaac8c8IIBA_hNHjc+qG(MBTXei5 zw`cD>37PEUVde~@UvGy4-Z2a|xZU12EZ$F;72=Zu%R|@6-Phj3!i?qWWc%K{W8cNH zW87Q?C1bHRNCgW4$6u=pAldDcDA-2+B_%>^L3&@?qeJJpfCnx4)|J#_Th(|C!Q35& zG_=l_Mf!9Cud9|0mU6OPPTdHCXgaj^(!T5sV2x94W>-)l7s{wS7M*K`F$bw%ZaIXQ>EJ>f(WVM~jZJ4w`mA<~eLEb0p=le8Oa82~;(PTKjVw^|&oS$O2K z>mXGeH<&Uyc^tFw z6j$e!sm+_uB?lXY2%npqBE3XSDjETK7{rtBufTKKP8*=+k#aiqJHM@oPYdS9-bGA{ zqztz3wWxTuvAZX8RmoQ={uroclhxR&hmRO zZpC=G1=$N<+??(gXLQ72QlBJ^J_)Uo6f31;^WneN3N26m0;E@&xpjnuK{pp3V)Zyo z5Zz_nO(`WQ%Ec)K++<{y5@NvMKass{Lr6@iW_01+i^l)3J+3_qlx4Ac;_f#rW(Jqr zd4U9BI?V7J@#mP)$7PFf`UK*~6YVp!M?}6q)a`E}M#k*(R$x)20HNdFT`!>a7=Wqeff=`{I}M1<=>F4+g0KR_gG`f zK-i2C_;56G;h6VWV$cF20^-h_C{EDfrtTfB6`VE*0$p?~jEbCcMUqphHz)4j-)hRU z#(aQ_lVv1CefQHSg&(?nydMTu11d?*e*RvZy5Ts^_MK&P!_=T6hFAU1iN~}^!k6Kf zA2>OE>0c^+6AyXOQ1^VNCL|15wkrudqhBm-a!W0I4+3T6s@H5KT}IZdVuau+b+4k zkxW#O!l-)dR{2_FBQ?#evvgW7oNt%3Fc0TbmFf4Ja(dEvmU2=@x1NNs z_IMJymM8aBS%#bX#ieN3Tiru*F?S6nbO90#A);|U$DJ7so)G#zs2y+ zwlVqj3(4UU{@=I5)n;S$*}<7UwXw^mjvDdv7p0I8+sdz@nQ|k;ee(ugi2Ka)YgOOYLc6a1@J} z?gvk|BC*~Ff$y|4!!sUkT>^NC%qzO?F}x}eYyP$zKFGP;i0h5xyo4svimLl$x%1n) zwg7R4G-9K%FFcJh9PpMgk%vP6VqCauCTv}HU0v5lO}sA;&w|O@iw-o)iVZguB6w{( z)6<$%@0vgCP_Qrbv$&+OZ74-SloHl{Gz(F!63Y_Vj*ZhJUD0L4c-9?=G-HTi(t<2~ zn(!nrps8PK3hO9h6oDYQf6*LeU(2I{{9;nKBgVX8_L3eQH-HOMx1jy)1vv=3f(qFP zeL!-n8kz%i$8z`oHZV$IDg>;4hv>6vf@v(oOmxBa{aqF?<@EnT{LAh!vnVf2n3(zA13>|F8zU2 zm8{hLo+i1Ji}}S%$mOnOp2hodfL9w;9`iPW_C?pixo(UM>kHKJ4Vm^3CZj3&JZ`$V z9xtIzGQDGW^^veB1Q$FtI&$?5C_+2^l>RsX7=AQ3fj|kyKAf1j(@QgMZ+@SEX#AU$ zaUIr)9f?l$=f|0uIRKtR--2{iIU}lgk&ADGbbt(QZ|^6aGy7e0Z8dQ_{Xy~bIgZ%G zBgggO<#KXX^4mkFU3iRAdwd6b)o4ZT)?_!18YoM9kXJ9Z zkkf4=^{J%M5~&4{DP-MZ^dvC52iFi+io%?`vH%}D0Q7<+J+h48k2NCiFT>)-&Lapy z?lj{W$q(e18ADd;%6UAgEmwl5>Ay=)1fdA(R14Y<&bt*>2Xv}LH?^3ePy&?j-s6m5 z&0_E%T`bPm%43si(ur+Eo7V-y=eWtCR1_8lZJgKneMRssVULxLr8*%IxW zCyiNVn{ve~Gaga)4FZRa2gmj#gMU{(T>I0SWFy&WnpB50LKq#ovlK;~U9N4U+;(ar zXJ45@af@rE6^XyaEqKfduTp`9@4q-5W~cFZs}+mG0oP>X`RY ztLsZe(_XaJ5PiU`h1`ZN;Tmd?^{tAj!Hg$(3m`(dB7RCu|3pjNNtU<5qRXXU;oG+E zmcDLyqG$tV>@By;$yO1w7m1hj7iw=DWUqfgeJf6%3srgwvN$8_R3i7XqbWCsRH_;U z`w|4@&Zf9uAK|g@mSApk)P(NMnuW{xFwvYnjN7>W2?`N7XK7mgLGnopA^7XPJ3if* zp}xURgKMv-9MlTn0P1a?UdL`ixE5rs=J#>&=VuN{dg3!F<(9ipOk6`AvimTz%l7^dZ^D5&^b2lM&$?9qL{ys?9;zND1~SR~Cn{_-gcdw!v9l z@P;Q6l6gMf4m>nlzOF2!+RO+JBm(>aJr@W7`F?7T^LWliN(Iah<>pzyN9V#xoHS}+ z_DnkVJM=pKF-Wv7_(R5BH93R1kVpOQV)(Wah+>mNg5mi%Pme;-8Y6K_zAQ$%x6`-@ z%G52|uq@Tme#vPs-}M2=;mW-Zc{r_y`uYJ$g)$52X)fWr5plV9kLv<%p{WI>bLf3) zG{^LNhHkQ-L{5Zxncdr#peo{F=Z~{5BEkbFhCk*>z>mb}9mXt@NQ2wCABua2?lS?% zyh2wSepf(7-Edb&OVyG%dO_R1(djlnbt&YvEY>7;^MEG0R|9;N>kDsI@Eq1%T?O5XxsYmvM( zr<46^9_%(rBrTy9SjME5ggh*h5=+R5zwYZ=Vj&Sw&^3FCqM2}fe-%klZV>wsB!opV z>DCxK4;5N)@g5o;C(ZpTei&}>+hS86S%6O1!dy#_aaQ}%9Cx@OLL5Ql}Rh#r~9Er(OSW?Ia^#w z!9T5$w5AtDxK3=hPNv|FSkPsRU$e(_ei-<{M;EDnYy>AbTfnWR#pa!3IehvOPKubleT90_{|iM5tQ+54GEFVHpl>#ZHiFsKQT;p&Il)W`Gkr%30T+7 z8h_YaAhwLd`5ucD95l$$_Ug8g*WDSP#Z^FFUER~Q7}4ixX=(i~DFxxh#U`*PXB)Ny z7*wA1FLwlz&tJW7{;-)FBO-y?(crMw@S*i$bxJiA9DKIu6@x|2D+TBu&6aHZ`f*TT zC5V8`W}2hzYiAdZ=$q2}HLIN`U@k6F0Y`eiMRz(`3J0lgl!23nJ#CP;+%IO~JIJiK z?HMHXP_{+kqFbn*spC5JQMw%-^--_c^Q#dC$B29htFs~JC~a~*(7XJY+y>0gYidfn zx;$%(q85Elpu+Fp*(pJozrr`kt^B_A!j?fPrTx>0=*YOLC?(1RrSa|q*YPraJ{8e# z&MHDjQUGTIvoFUxton6P80-yxrKP1)Ui~f`X4#~obWbi#+fVqiQ<4EHcvVe22tlYb zlG-NEaji?5bJgfcRCILA{0;;0&2>469RdB9L+E>Wep*zwO<3kNP)JWZnT5sa`9A9w z0L;vhEHh>v-s?z4FAnR~K}8D@#Bci|(D}wZX~3YrY{HZG;H57i7I$O97sM}B{c54Y zmK7riHuY3W7emVL&a;B>Gh&5n()$ldnAHiu|^O~cE`=PVuL8?sE zLpNSWjbMd?jKfn7OGqm5P((}+V}qvC@l+!yy>3e*W`*hc5r~A$0M5f&s+(%%UOaLV z_QqOyjHjWyuUFQsZE(vkh4@^JYb6k2W2UA**Y)`b{vtant2cbehJXDXHCMoctRCdi zC-~1h*1^Y9C_wDxl$PT0?Jsbm+b7#^0|yfBfxxjLY$J9}6e}PA&(dg) zmB9gZ5%eDi_tdPU_bmq$Lf(-AFv)qNd@ny`#&x~=yqT_)#$EJQq;apjd9~bX6v(2m z1B;C%sBgvnnh-PshDwuxc)7O8q|C=(!jm68POUQT`*=`KOx+QPBhugGvPZ&eO=8>| zWwC%a^`%X!orrnYCt|ma*lvd&cUkccp(9V3c@lg9dkC83L`_6V1l*+U)8zVE_xGG85(KRnzJXe_scRC88dkB{%n)pMlt+87N!WdoR)OvuZAId)C)yt96%&ps!U_Y%_6 zBQ4TiT20#~ucPnm?3~Pga2DK|EV)HQL}WetlBxP@^M}^8L`{_ySjID&Z*X9Ykg$C( zLYvKn#EgI2=7Kn2(dt90+wdK#$*YAtxXhKqrx2ZuoOFejhTR6ZIlwqm=m2-FeFLv6P$5vc;{Mnhcz%$4jKO?s;Gdq&!75Jbtnn%q@i%qm6SFNYz2 zl1<|v4LTN2*$fb+IS8}+-bd~G#;T%)_`Yuk z(yh^a#pIB#OzWcZ^3C8|55vBS?3LEI!#dA_p8_Cs*p8r-&da6}hr$o@vDV&qxYBhU zha|9^Q&dz$64DVPdfA^RpP<|1Y@s!jcE%v&cIVh8#(IfbXlGd-A^8?zD5VQQb!U}j z0$xi3&;n2B632X+`U~~Qm4O2k(T`Q{W!OxO8JFXFzvuMn^<;E*vF1mtyP{d;c=he< zQ=#ZLCfi1fG^`L;m%XVc(vie)Am2;x^2W_HRJn`uwV3<0mPDEbN-M8E4d+URVwZ`w zr8B3Mplev2JDy}exO?{C>8+Era8x!g+o2b&d^lfHoW3ac-Oo@N%?vOPTGS?k&nA^+ zOg&lho!rSS;C(XL_9Or+1ISd<+QL*}h+nkvP-1xVVaLf+2{vF6I^kRqBhmytPLEa^ zHogS59Q)OiW6CMJdYro2z)lLrBfUO{lp@?`#?Y?1FQxo#9Z}l;NYN75Aj%bz=oEJR zthB6wJ7>k(D#jFHNN8*VG;E=wCiGgxtcE~NJc+8o@)T4=s!%a?#MamzyE(Ot7VhNs zB6LhiwfB5)4;o&Cw1+a?9>d%Uk$Ynw9cH1oqE!%XAvGOb&!-e_q1$(44qsTTreR}9 z!Z21T(XWIS!X)p2K9Bw4WBLR#rbI|>1tfr*zJQx^$UHitmX6+o$kI}I6w4}=DHpSQ zOiJF>P-hPpY|M3D7E=ryqj;)ZkVNlI4u811XcAzz!+YV!Yrr|CA_XDRDOJ!U|4?_a zz%TX?jDnj*xz`X6jHz8$9@{3``S&UwPDN_;bJ(0W&*lf^*ymZqa_#|`8FE{Y9?6Hn5))>#UbRQ;GVL?{dVHK1RG5Cy= zZMiz9UA0Yx>VaiOEQlbWsUu?Ov8S_QXZAbRN2c!r>57gN(IdW=1;ASxhX^A?yd4Q<*LWKGNF@%FoX~d8+)3Kdwx_-f_WY8cyxu!{NP(w&5AG%!RCyI(D(< zi}%eQm!G%X(m0&Du=u1}>uu(Ev7@-@Zy7kp<G0GsV$Wdup8bZPiiy;3-2ngKXYg{^3g3Hf{%{))+%rr1Bi)0gn+_; zjfjn?qV>$2-vM5Qu#kY;tcJNXR2aD+5%um%*&-*b6)6i+O_B;*+pbF|eWW=SEKgGl zArA?LXk=?N42(d+$&{!Mv*!)oXE8~y>Rvp>JD~V#CL#DxcJQHL@QBG&6It)EQs>%> zD;1STI?@*T!{=~CCJa0o;GOJ|I;ROgEo8Tkyh78h)p0elP_70=AKrmfMP?GO&+u|q zpU<=2-RlXuqA<@5!szb3ryjMHZddUZP8ICj@*0^PMM5nWNkT}Doo>QWd(1fV)e71+ zNgUyz#Q3x{vgbah_siQZ zzihW(j!MRTfGxr(ysX!d^vvF*;BB3R1HS~~FbD`dcP@Hgd!2mCb%s|$sTX$%n#8j5 ziK<&lvARTCBH4N}vWCD`gy=KY2LaT03Rux%`1i?E^g&^*A4L1TWQE@xEo^2z-NNU7 zh6?Fr5jF1$%3%*9uU!x)w*4TdtZrsMHC2?K?Z?eP>ui?L5gMCS84xSjmy@eqHtu3z z%rvLr2fA2xVmf(+dRNq5pcvooF%ejXlpqvtVCcQ0fq}fnvNt9tN*8u$@rSRa$msS# zn`*P0lmTL)Y%OT+s>o|sVhq{aL?_&mX#CFha*;)YiAU*-V);*{`%}U+m%Ne&mBsLU z9C))FD8zCY17Z^=tjplD{fhOddoIggWLai0PgO_Jk4_j2Gs%UwRmY1tF!ci;_9%Lq z@(z5qksp53o)8}}c+k6JpF^uAfjsdgE{P`vs@)&&c>EC@Wk`b#$IT5S4c4;fwvOh> z&$I3$W_+mHpD8U@lZhm)_Yl#A=# zC(*Ahu>zXt??_AHfm-dH4djxwkT8|TJ*m3Tw+0co(%huWk zyO74l7q4g|;XI#4TR2sCsxD_ODw+9<6jo#X!olVJ3lSjlGySy;~PyJdOR z&$=xoyYLUYjG%(+v682gJ7?)$hg+gosTUvG zsQrf0**ukF3RlA4ZzMm8)*PKKHy}rAX*wQLY&@N{qFYhKxWyhdS3iL6mW9rYK|@Eb zb&G#~`Ph#OZAYcbFYN9NnDwG0wg9d}&)&Ub2RW1gtZ6t150YHps@-T0 z!2{r9B73}V+*%bIQz=u!5hg^@?feLv0vt!hk6z}AWL}@M;G!a?+;wBWI`0!TN~8|X zjTS5>DtiU5&8aqCS8Xoo*6ZuTBHbDts}A4~M^-}!!`)t@c|ss2w#o2STj1H@j;M$A z8-fR%=bF!w?juS*XGE=X#0o)^ZpG#E6L6-8#vOa9A=^2~yO{Q8NNW;rdXE(nq(H<;g-w7o2K&_*EvF2-I z6PC!$an9`%Z2cE}yOXm*G zB!XeQKA!QD`CJ1YHum}X`!AJcfO0SLqQt~${9V$~N@wK^X9NQxrwv(`{I~;jIb)7i zrznKZlAF;Gi`6LD6YW36#o6DsO5Gq0ZxkZD8$PGUUW7HNw#s6nJi|;(JY=lBgDzO; zMz5_XQOD|G{7maysVUFu*+gGj(C{u#X1~T26L|AuNj=c|K`@%x%%x`ZSsVY@+xK^yw#qtBD;& zr7YNvZ+!VGJ<~G_N38mwxopKJ7LhC-=6ZO0k%3yDv6!teAEX)fX(Dhc$zKvhzBnaM z387yosrs6Ixt?c<3a9UixZ|}zTU_iML`aX8kUxT%Z(N6=Oq4iH;{18;gVr#|+E_`` zr#DN@t2lL3I8Rmb-uHUssb zuB-skuWi^O*QbbYWvN>@(kqwd1K%O;?(SMz0d3k}^od=TXLAQsXv09K=zh- z!RDgtQE6wM}3r1#*w_+|pt-_vw4TaiO{U^9D zR9FxdCvhV}w6ucw2wtOS6<}&OrgB?oz&3LCtAnV0zs9NO${cN`+w}%3d^@o7oof-V zheO}3wVED-?K6?;|n zh=|vq$tUqHdLUqof4f!dJ^#APv&mG%z=td}TBu6n6b$*Ke2!M&b{Ngb`~hvMjA$h! zrCPq>(O3qY6MQx3ZS2p?o>9n9W|s(uxAmz7_M-@jM<}d{4Tu!-#OF`wUC8OudWxa` zK^Gus84<92c7AUNI}jc2leHTDxaoM#RGE@L**!`-<#S##biIQl{-_oVF`!;CE&JR?QN>r)daR>7og4VuipOh6~KcTE8dO?1>EBbE8N@0e?m2ot!K>cTd z;NrpX*>bG+t~Q2J-p$^T_o{co+KiqiPn5V66fye>Z=bg;%BC~(ecT*Nc6S&cAOUBv zstQ&ofvxLxwkhVu1E;gq$ibiO<+0e26s)iamvc9Go=q-AYSunKh=r@Akq;h`f@{?~ z*xJ8*=xKVl;p_#b5Vk+lZR&~_(rNJ#dIXQeR;SCh?(t>4<|uL?HHX(yeuuULUyrWR zJT4g`pET0F#R;23ve7X$HORS{N=KPM^jk^`oz-_eN7)T>84LrKJ_Z21>nh_3sP!=5 z5VXWKB4p%}%_UaVkVYQsE6se->#yEirYtG;IJz*h6?(gx48E;(fr&~YC!O7t_4L#8 z2YqkmzP#&YfDH?^TmsZuk+Z~%FR{A;T-bSW9e`)-_NM;x2&2nLZ*YUA{Bp_F9Dpu> zd+`(1fIL1>>=h&x1c5ipaM4Mq<58}83-9d3h;ZOlW%TGwmQ~x1zYk)@W6&E#3Ofn^ z+CJaty~G zDvqQ3x}Ye~LifI3frTcqLL}*6IwaU0Zmsu8?xVKHtOiYlenpyvV9N*G2M;QN_o!EUo>$xcp1;xING1o3p;cZ}go z6I^9E9esXpN*AK@{Gl&B3hP$ zsYiepm>)`P=swi6fa8!ByU4DDt2aB`-+1$?eo}%fbV5 zXI)$qF#_;tblu+~7%=Z3BN9v`sM_)}ywFq%E{qm9ldEwXQ9dn8#{KhUq=blIIa?ux z$=mkA25she?fKy;Ux9_EjnGbiZo+qHpQ=ZQVui@WSE#5)+8vR!52R*rX75Z@K1(yA zHgGq2j0FEo3F~3b19&e=zvK0oc;N^z}DR&}8N2Z>Mu~NpIY4=gP(uz)nW+n%462=pTA)Bu$a)=LL)#U@baQW%!`q zyK+W*0cW2m@uaTA-vWz_Tn)NqPWrIt^_tvVuTKp}doEIgO?UbWA{&qr7M!i}1f~>8 zn-nr1)4=O@@Tt&PiVt{Qq(W^2tlBH1jD=Ttpd5$&5Wg%e3D`eV2_PK1*xSl61%G91`_qJayf9XWp5` z0ZO#NGL6s3Ed2$+JPqNV4q5rU^{b4z`|{f^nPYmQW1|-AwJM{iG;v|?zL1P{ORc_5 zJN2fRJ283sq2a07EfJ}hC@Qwa!q(V<23snbS%@YzM_D$n`PkjQj?`}n=Z`ZogXiGA zTWQh7V%2uIc2bMpG8q^j)d3$>oI0)GW?;L1Jdqu=oKZIhdAftK;Y7>MdO-JNOR%3# zk>oYAxiSypqOmJ4yXww>Xzotu_;_+_0B7>;?Qd};i6BVCW2a(!IahVk)g)+H!ZVa$ zAY`H1id3=riqN;dpDYnQFdVODo?yLGpSc*_lWyg)d%$L`tJl-qmgu-ilS*t*!32?w zox7}H$$Z1Iw)JGL@i@Hp*~eA!yxT=21qNB5)z8)~XX8|Fue97evQ$`t$`UO(*^c@6 zxy2PF7ja_~;Rg^7Lf%8{1KN>Es$45Ucc0?0$nwz5G2cG8dRy^GltDRd!X&2G>qAT5ON((mbie&uXRD#qkHaPg0Q{fc zaFyKxPdHPXXlUTWaxg2G*|5pU?xdf#h0khtIP4sy#$`_jK;?6+u5$O_B|{o)+Yylz zX8Rabi|(8DvXaDG3b}DH!QwIs+=ZA!ZCdZ7Dc(ymlm3_&h)q3PXV0951@HjXCIk2? z{3}8IP48j@ue5E&UBbq1D*&b#`VMHiSSSnz)0P961OEE7WitoDGUhQbidJQ(1FDLiM zyUNkTg`C;veZ-K{f=C3Lv_41hn4_r$MbHPm3W`k&cyDf09s+1PrDgZUTNL9)=_FL! zi(!nIgZ(8DB$w z64jGwMc>4Q#$>5i&$xDZy9LLpiO;EPn(O}2YcIkpp_t`@15_@*kZ%9>V2qeM!FjKE z^G-gfY`zHW7qX<64`hoc?Aepq9m4QsKD)>1xhqXL{WNw%x$fg$9BPjgU*JpC!Hw*r z`tdu>)9f)WZ~a)#-G|7}kICY-R3lG|XqOWo6IZ6xz8xvW5@|BE{OZyW{Dgz_dFLA! zk;jY6W&@|dZ*zilwfwFVDGxltl4G7ueH@n&wPP(c{fM{2%7K2=@sXa`U_@;2s z>L}FY0Yo&E`G_AexkW$BR!@Mt0Buhp;H!lk`bfqku`*nRB<|SlX@@`sp4KUymjF#skpXYM?B(+(ro56CP>352;ctt%l9PClI*Sljqv!+jJh=!j(e=$b)9O3wbF;ZC zTJAJG*$$yXpSd-ACK34AO>98M-a$$cK6dyjGC^u%?p;L#}{lBZI_;r zd?mHzZQ0&|L+N}@y`*N{HclH!_jt1urBMQ5-~9z7CK3+c{qPFeU(RH-67CJp^aFw- ztdFoW`A@JDawpi~7w_yaZ0#Svlu!PAt+2h`PHaFhZyX_QP-83)&R;Lc)F5Uw5ch?| zRO0>5RF?`;Z!HILyzRX`!g+0G?cYk@;&j>7!t4sm?Pxif(oZ+#S4&q(Z!jGq11x&( zv4!B&hi$cf-Xyne+F^L#a<=%iZKqsMYfgZ9fb< zl6VDu@b%jU=HRyoc%=uoBMGzKIyk&c)Z7oeczNJQv&KvuogicIUX5IG6;ZNr1R(Dkovl%vg%$u~k z?H#TPN45LQ&%@^ry3lwB5Vw0)$l=%sxW39JjBvE31#4!?O2)pojO1g(3eCxuA5|K~ zB!CyJ{a-YlQ*>QzxP@aIjcvEF*_e%O+iC2ianjh<4jZenZQE*Wp7ozI&cz-hynNU9 zy>mWut}{-hc6&1M+>X$2TUHbTh0U!g>i79VB{t<5+058bw>eX@5if{^H98rEX6K%e z?{iR*@r^G9esFCW=*kOoog`QN zshTx(X^mx}Jjuxa)9|&QFUsb4YcaxlX_mH{^NJga=I-I@7Di}J<2Bs}>aAmDY84}! zL89b$Vo}{6xn@KR3Ed8L_8KEkwxT5566}|>Q}wH`zDvp$)e48tceMz$r>TZhw;~Ik z;j1!Tm!xD{eObtJI@dh%FT)a~{IwQ)Vwz>4f}tkT}2E{$!ae4CUg&lLsp zDTcx_*6;Qp$Ufr&lWS@coY;w-Jg3(2S092U{`Q95$Llp3dKCQjw8!`7#CZr@Q6? zIsdVur5ZRaIQ+nxSIdozc^n`7f$pzVzQ#ia5i%!(Sp&FfM%r8TOR8{$|k@sQ*fZ`S-s0g zG4jS>7wR!YfL7yCFH;@1^2Q$D;kM@E$^zShlbTMhfd{Qkk1s1RTuGfR@ARw`dE9O+ z8AD6Rl?ADu(HtS(YG4(5)Qh%8>pgz~IFXl4r0rl~)zYD+^sjau~Pa^-3gd+{yEM>>>KOlGOo5@)EvJQ(49q=YsQ2l+M$|OSS8;(F!@3Yj1%SF77X6@6>^EbyhYpveKung>S!ZBO3xLYl4d;&+wWQdSi zkH^+gu}j4li5461kbR0$ykB8|`d*2zZ=wkU8a(C|mXg=%K1`g($BG5IO1wzY58i^~ zwb3dziOUqt1Xa#=Nz-}GKd!G^fkj>Gz0zEgG5JyLU41W&@p$Pnm2gx8f}IULQME*H zf5a?pkJHBNRj3@Dbu<%^FXz{X#QifmT&@aU^Q~JKww>F-V|i(~YDJ4}cV*}!7V({o z7KqDhmr7Ucb4GES>H7kDA5vWiOU zUM%16@UUgw!pq0&WgI0Q;!ME_t7p{$s)nu;w3e0@VE5GluCW*VP9lwBY={9ziR+fn z?L>lEp+wAXSz&B}PP080Hum*@Gx`tnOzZiyq6U}O)pGw4I6tRcrUZt_!U;v!n(WG} zs?0V!JORQl%w;nytFR|oWH zK@5e?(jFT;K_BkEFl3XDx90>ifK)b0e7!EowBJpTB#tndWR*_@2%JoS&zkop>AeA1 zu&WW8-0x{UgK;E^R#sL~tVX^qp4_H(4e6=wXFQuo+UO#Z)#4}G8Y^mKb_7&Z8{B6{ zQJ(&9VwNBK3SkBA@sZ2tSI4R;O=kBQf!mLouA^|4?FTYreY039zXh^Q)wg1-B^WX* zU{tBZrmg4>cPQ=XUO7Km4_J-Giq+UQp_!p@Z?Hvo*Udc&<7YS#J;{%U0&WZ_KLHWZ z&IZ8|I**;ej}LdW-tZjBQUzjRT-QE|Ym(Yu;g zS5d7L8)wXb66lyioi;W)8uKzP7oTV!@d!6p2FTp?BZ9%WUDHe(~1H{;U zY1j+gbH7K8QAZCs10u&4QW)wEVTyaCo8QpzvjYY(5>cK4s+go2?_Or8857NQGU~_h+b%vlr!$K?3x{^+}o>sRz%aozqopHr)PZOLTEXevy>| zac;Y8p*e6}cW6ue$Uc!Bia63x!(q(0+m|dY{wGHchly;twX~CJMmQ3`hEPx>5z=!mM`?&6?Mi4T9m`QSB24LtGKlv=t@gO8z0=m+rbt!*lug zMWW7@Wl@RuLD3qQ?sSym+xS}&;l&h}@%(Sk2FW&6CSDXu#RFhc?y>?uiQ`I7zH-F`uiX4!a?%;e5el!Pv$7qC#FA$h}gx>+wt>=`n~+|Fq4 zX^Zg^OT-7pz-V{A{0E)tCDWmE2l$kGj34Ft3sz5sBjNRC@wlXMJCUC)=?rcG+-2ue zfnS;tBL$9VcaqlCa{5;r-hwJj-aAMSka#;H90gqCL9J7Q83*?XM9b4a_QQnRlHQO3 z0O$^1uGzQSm98z#f3NVU(P@qa04WYQT^hMGG!4tI4|@N{^wRF)fy&Ew0NwrYam(MK zwX}jV`0!9+DP3BQe}N4knApM=xrL=zwu6g@u6~4XaTi}UhalXBp(EHza9xLtN^?T0 zhMZ?1EZl9w$=TlE(#U;nP*W}W_+>5u9)YI*j>v@7cp0l!_qbHEP8rBJ$RuK}F;$YBAAF0`HM}LW^=}2tNZrTZxkd=Ub)=CLdtq2-n ztYe719JL56TtBqpK>!Kb2aj|>J84>-v`czh=^JW^e5;#%x-cnn&o7co|0Gi?oP`tN z({>}IcnsCR5>u@vsKOIZ(h~L+ZMEpi%}MvUxLN_y44BBT^r`(makZpZISG&3uLosvgw_q0qG9`OQ!<*h3sdb;pp(S2{$eQz zFRbl%GbPqb#xhZH7$T(_JQ{|K9*fT_FI9yw%=0Ol0O~cNqVfO@A}>CeG@XP_|n7yJHxKC4a*c&vW%%;hzo7zf27A zh)s*nJBMpTSXd^V#qG>Q_qXeY)(35MVi%+Zq0eYcOaIUJ{gwQ!`yw6Q&`;m=y|(`E z^YjSM9vkA0eK1XbuVE0TUmKT(d0)?4^b%2dLb7C8%-#oZ>g`TdgSs;=3c26^3>8e7 z$us?{ZX=Ye>CAEwqxx)fH7cVne_icC-l9W$@19rY;Z8}cl=eg zOZ2hX>|pSPQL|f3LvH|3sWcpN-`;#a?rZ#=0Ge`Mhs(GhE`?cd6u`-b*rxc!jEsD9 z+8Y|!tJ_XNytJ&y_D}eo-e3HFqNq4l^BQ}@OZ3uK(1XYX~F zs5+pACk|i`&TlyE4<`V0bp-H~feL^|{PJCNUi*8b^5YvWPkxQm5&5KktWw^uDy^A}R&)EDVSp8N+GcU2+99UIZ&dqY3Xphf5JnE}5QW$FEhQi+ zvPP0uCD9pSu)n)r__99|@`NHiPL>u73?Q~Vrs`N`CRx;5HS&Xby7)mOHbEU{9Bg+4 zD^qM2@*4g=S9UB5ntP?Wz23DxbU>&D(Mm;%k>N%*RawL)ns|G9UZl#P{5wA^^84`` zSS>3`hG*2kDla|!75)_AtU~NKEFuZRsyF3^RLkAWEg~dOS}C=KBhbEgK6i|}&4D!x zs>?`pxS`|QgD2bwoMy}Ev92p-PWF%Smt8QMrg?3`UNtfW;%xC$UD>0nGYmCsZmgbM zlnGOrF092j{hrc#*&Z@sHS!&Eqqym)rTguDS-)U<$RLR#w4UN8$#=Io5;-GE5t7kl-+Bwl({{bF*P>3P2MkdUa12PNo-d;n4UZD zWA6IH^!`|cPIOD3dlbxk&3xzzZEqC$veamXV+2dveCJzt#~MOyViV_+w+`|mr{BUJ zh!Az&l2L5X=w9c*d{2r~S>4YyC1UUgfZ*4N$JW1WpTUaiHjqA1&YWbhS$TE1*xmcjJ_ z*9BPjEIU+P)syjc*#kB&D(!{!1D(a(!nhjWEnPjV#J~0&g@KZ|q^e^zyp%zPHiGDel-NpQ z8%{5CnIprhL3De1+S1syO{5g2 zWDQaS2=2}1rd;5ZVs@2!EPc(sPGpaxwqLLJmgl3p(9vbxXP6`%dFAd zDHvZg>N_W@-Pqx8jBPROZ-g%Bx_#$uj-4`gF>=iu#eK7;i6EU@sn5tVcN?wwqtNl>kMTj4FF|`AGA}KtQa%0)9$Qfg%c( zstsv;L!*nFu>e99sa@XzlT4uY>P)G(>WV>KQ2?jiEHILg8>U3~{yc8DV7EsO-_??7 z!RYk+_$dj(2`5TrZJymWy_)PRiWW%>EmKCIEs&`Brsy3j&CTi!ugXpJT@n9uxYkV3 zA1rx}IsHP4oun(+lbmz(l9=w2cgLcsU_7{ImYcfjP`R6)umlN-3Cs{Zr@D};Lr$LyLG|us z;@*g#VD_JE_jDMsa7`o|(Wvx3_cvk#PzN-)R8;z1wt_{yXf0s0u*dQoru{1LUr^IX z$j$8BG6Z>BR4Y2Exf?6zHnwJUyjpA22V{Si z?TOa*uD|-d{RB48t+#A%B6HsdSLe*H`TCO*CbOz6_`>e)56lAef4v{=vrETvJ8)3Q zn+tJe13vh+61^Bd2 z2*+d`Xj7ntvLuZ`0W%fpOEAiM5xdcn8umiR3Yzo6a?aK(+^cpO;ZtlsOYBNY?fI$$LVa%$$zQro+7YMHoBC&n}yAz9++4)&_YoB?NbKMt%(|rit!H z6~jpJbm>I3%gt{+1jseJ4-SU@B*K=N%9Z%W}E{lsw`sHj!Qri7%KQunx zSKLJp$VAD4y@ggs&ota=*rX}yz5BFx8Md%hPUbw%R&$Un4YuIY5-PRe|5cG<%=SjC zW`gaUjK>rIn3|h4TXSr$^5*oYkg-37&zkRRt6p*8bUY8ief`W(dm1qvS(|%4ntN34 z;iu$y3gANTxS90Vyfb09HXb>?eNqWOe$%OI{RN9k@SO~10jYcJ5ov(*ahc{dOWdbLt*+~9qoHfaP@jI`x?6*tb2huU!C%3&64QUh_`P+hu8!yG z(_hb&bAH|hrJXQBG2}!qZi6wLmk-ZQrlvMf2^B_@al5 zHOW6W+p2zH8MXR=wmJ{*{PW;nGXF<6(uL2l#Oi8|cq6#t#w~gC)&qv%>di$vm-8Ur zx3*07d~3Zi<0ZCe->57P=91!XgV2EI5ogQ9VD+>U8psngMur!ptHlj_Njat0C#xRmfA4kLiae-Sc8WuL`}g)wNIb4?d4=qhInaU@21HgV zZA@t@k{0maw!Fm~WS34;7va0;&B#P~U8kJB50+J7lhMCZ|8>shyhug2rL}9*jrcCZ zH!Y`a^hmF7Zt)9j%TqB^8HBfgX6I&uPub3;a&KG(NV97|@w1xvW-hzP z6AO!se285x?N7_^{c7SOaFR*7J*-dA@Jp@6;EVlVr>>d`qce4qWDbda?cNY!QDNy~ zloJ$7BE?^rjG`sj!WYwmuCZi>x@`r&$bu_tFRk)p?>!pa;38`4(Xv9`*FWA^8Vd{;g$#{+=hw>WOQMa;L<0IobOHv%H zQ02gRk)pWh^#vZu5XR-lFIGh{Z}GcicX;H~K3FOa_g@mZf=z1i(Z7|94lSl633PPRmMCuGkii;V6pi-u~b z!&1x1L6*sL|71E%WNTp~sWm-}QB|B{nBjaX`1(6h(X+kAZ9L@Bm-= zYD_3IpL4dsY7K6Pd{mOJD0qq7tj#w`)2ql}w&C2Xy0EG@xGhzeK%VcJP=HY!uL6SlPAvbXP;ZoUAJHjl~QhohY287N;o6 zENaL0+uF5QeBlLS2`eNYDb54ya)`hHwGcs+(rapN$IME^LHS0R@- zIttY!Gx#DD0HCC-4!%rbM%oeQ?!M@ASSg_^{U1`wzg1V8oa(G~0;tYxs(8u6Vw}%m zS$Wn1RaD|ZMT-ts*BYUmzrPhm`|n&?VY+UI<}Gt<0m~wR?4^`WN^a@AVdu z;Fh}NyAlV97f(c?oB>R(5I#Rccre2 z=L}U8;&`geN-l=P@r}Gj2?E>xNRmVUm6_x)A z%wxk12O1i>o&N#|sXcXlzIIX19V%pUR`q;8Rfi!}^JmX~1S~VNtL+|i2Tc(XaNv&t zBnzT;xkd2(PDMsm_CLY>zdRcdapk`mrT~x>6jfrD6?e|+Cqw*A?Q!VK z=WhP!{4((mR_dB4@*3?|)PoF06P8jogcg=0kq6q)oVqu)~KAl$TB2^b}gEUjTcfWJIY{EE(HoH6gdzPVky)JjM1nXbTF#K#zo3}vfc8V|2!56wUCxeo;qf%RpYwtNvjWPDf& z9ZsSmXUJ119z81{q=P*fE0seZTP>8fx&Z+}MnwYX!eyABWiP+h;lTls4@;}jRV|j^ zOB47E!#xShfJTu)qhM*z%(MeC@4wKRpypE}EYnK@NK<812Kc{>mR30>AsAhM zk&Qf%_ggAsL9_Xb0dDT=ih;Qt*&9rc+9EL#X2%BNtpD0QqUn#%mVUIFeq&u34dy?a z2j4%`rvIGf>MW7J%y$}M75oHC$dnBqs1R9sex*Q2nMr@vb(<^IbzLO=-SJ~D!r}?8 z%~v3J8(vcB?Ky7WBZ4{rYO%Vw3B#P+a_O%aQPs*!8NBh>E)yI-(mA?XX^d9=afB%y znk%={&>=;7PuR&QbUdO#$62rM8)CG;&AA>vpNy={$vPdrb%|7BaGSz`nK;#i4vlHY z&vLg|aw)|i5k0Z%OSuKFF{}%_l}Db+>r|c8_D3@f;`qu+MtgwIpk}zYTW#10geBev zK88EJgP7Ld59cHMBZ-;1#a<8REBue^F7m5Qq2N-_B*+2lfOuA^+sfK&`2eJyZUAom z8Zgoz9hdYx{y6T4GPj=tn|Wcig5FZ=%_sw&ke?4Fi{4SUO)$8HoL!j8Fuh z3=t3!TY-L!|Dw#2L~dBm&(HVAzaCpd7wcgwYc8g9xP+G@Wv1`3mH!$p%~vB({@YFs z`snk2-a#7Pg87RRr1;DyV!<{(TnDp1mhvdJ2u|HLAcL*bE*2k~=bacct`6;(i0zv? z6v{e4e}7UOudYoJ(C?rT#^CskY)KY(bb~Z*c~4LSi6I(9c`HHx+n_&*fiY6gi0ZIZ zZ6$zm9b86`JGQw^lJmL*q^RS`h5>=0OiwBe-Dgylx@v6dsG7KTJ{<-;VPNMCv1g^7 ztteYFzVM!-a^yZ&j-iMDUTf!4JL8N`PTjJ0dNTTfo$TJaK`SRi##in~CYoAO2Xdv- z@bMJr(tSdvtIobH(EWBt?YDk|y=J}C%)Q8NR})M})$6xd9N)zD6<;6gArOv$U+4SK z?_K;v@Mn7<PTghH_b80Pq@lQaGy9qfA4^WjXf8nGo zQTZ^7cXLJ2Yc~H0`yqKa%e*H3TlP;te6)U?l}yg7GanBg3JQLnhyZGI_(#clM*3J$^Vj zLcjWh-Ey`i^vCe1{~A8#%K^je<5r@~JYmQq*vbNBMvL&$iH zJPX;ZJbSYw7&+5y#$Y zXsoTRExVccTL>Qv@0&3ciQf|$j;2-R@6JnrzJg=A98YIkX>H>HvNmI zu_+j6zQXKWk#0n3_kCeSRl}FVp?*7Hscn3nL@7kyNxf2r`1NvA~NtkOV=BMQLl*rtc^uWfPgjYVs!g3#m7g zTP&1w<69G2n{~DXfikN6dFOwxXg1i7b7n#(l65q->$1dFW0nsDP56k0FuOhzF9W4BDyr+Q$(u@&uyXD~vN|x9@K{sqqJvYTza030 zCqLz&r-79xmckb6RPl|D84*4H_d~jTSLr}9*>4W$IFBQkrBA+UrrY-a~O{jriUrB*Q0m4K%J!wq1U@`XmiLyvkmhzq)uNL{DLL?NV6JxyOXq9?4noUE|49rUtDGE197?`?VH5^C z;HG1F6i*=t8!76WERC1JVzqN*_n#Z0v_QBvE66T+-(ppm z%=@eBIkK#}CZi^VRA7wD&gfK_OP>Jda6JiIJt*MjF^VmMW(Yl#w4JlmD*_MdO)sMmSm!#sKs$zv&2FGjQe#T}tnq>Y5 zAy7Qj3($HKQ&Wd3YC7@3Q30f5-S72ZJCvZ&N`n<9aF!|7|6cPLuxtpgixEl#aF3e> z4TEbS((5upmFoC@zm%Acmks9Z?EDk>8fY5W1&U50Dnu`CpO+h~RQ8_%Sf2$1x>+`f z1Dfj7Sj`X&eDAS=h+`3e+9zZX0BG|*kOPRb83Ina$^VLWhA#oN`sU`QW&gKq%giC% z)bQ~3?G#htzw?#)$C}u;tK6#?43BNIyezOeJxV8ev56#UH!7%}Ic5lqw1_gZ@6}O<`=8JkseeXOK$+2f zM-)YHTw1o(q=s{2Zj+c3Tg45mZuBY;)7OU?^V921i5F3SWz^NTOGQ?~5>b;!6a8JG zK)k%~GNErkjLE&>iucissQJ8k#F%+aoP8TcsyYGkYL;Cmix&wttc45KR-S#yvqmws z8qjA`MQ4?G}zy)VQSY@a$CxVedm(=z}**-?q*7PL(aY$d_ zR1;3tL#iEhVD%N}5H(cej>8-89XbApryMDE>_r8|MJhzPg_Yr2|YnW z?}buJ3!#)aLtYl^ue(Sff-THY^bbq0HQ$*r*%0ytD{uB`ly4 zdbT*t*mAPV%_%D=&o9RuCp8UIvGyd(wK>?r2J}y{B%X03t$rngMd7R017lynt`}gA z7rT({oC^kdd|%yFyNd#f8Ai#+h)|N#aSrQW22Pg!jO5yf!l=u2_opbD?cVtIbefQ$ zkH3R0_r~2evvwGaV-wy|%}0kRh~S??b1(9Sh2mZ(D(DS zoR;Y-h3UZ5^e66DQfi?;&O}nQHE?xqHqcHY3c>av*heOnp~1{;!G4(SgIl$r#`{}k zZL|Pet8&b9diTzbjx0KrlCM^?lqfv=@#Z9-^D2r|EG%*VS)uZCEdUe@z=u||oqX=+ z+W?3hU19x~1T3EEt*5AXa6j)SdIA?%%{o(Q)6DFzEdQMaBjg5JbZya*)w3+H56@USlc*H(i-zm7ylGx&M0zs z$RNDBrGC?Ap*u^Jz+%NnfvPQM>~CeU>#3qseU=v$$^1<}E=p=Qp&ZDkXx~>gbaYc1 zT#)mMNxad0R6i;lT%?Ljm)Eo!K%Yt3+Yn7|T{1Z1tMc>xQg2vF`ME2VtKP{hIl2Bv zx#W$o64n)HztQRD)J*_)NhldsXk&1Q#UX@~nHDAFq`uNuec|g{8}azxE}=Obb;ngE z+44YlyJocwTpFwa8; zGXKpc`%h~*Q@!wVmITlK9o31P(7R{HCL767GT1%B`Itz3jc@D>UQQBf*gf)@UjvEL ze$wrAO)+h+-WCuO{^sj>W-#1HMFWM6``t~Rgr6O*(J{wL!`t&Ati1B87pFRIVK#rY zm6~7sV=j+AGQ!NxbhwGl5{oDan^FXN<8BxFcmDzoBt$_a>CyiGqVl{X z!gh8{0E=;CkL_zi-@PKg(oG^KBO{~v#~2#yKZqHqdNE#Yu=?+qUIY?F{6LNlXte}N z2r)Hk%z*l{d$8Ty&o_(zI$2-2Xgv-$Si+fSBQvpbOz_G?C3oc|95Thy!T|^0bd~xUM9_0w2C29TN1WI%{s9+xYtlLvYmjv zhyY?-f^j-yrrmSU1AJB!eW_=M(jgpwiWQWmlmaiH9#k<1lDoK;q;Vx97*vP&I^ZI8 zD<=0017h`iT&_#<%ljLZueF&rk8rl_hl-msGSj_VG7cd@mplS%BEzDfH-DQI!qJ+y zE0!SNyeQRe$}MvS5#OMSnySwoCd)$D_ZCX0G(H^K5)A6W3+>KGUMTktiE5STFu|7*w&~r`puxoK*$Kl zKulyD{ok|oQfC{v(S2dRc|Md_slN|N6?W8V9W7ubqyK|Z+8v|mOC$s*jf5zfPdJX| zyK{JRxf9Cp8HW~kx#rdOi*BH`qMH2$fr|JGF64bObc=cbW*=Rl@~cg9j4)wjo^J-^ zToU2pf>?%RBb~<|D?1|{@m~f@OU|!Dp}=`ujcX(B`gU>>Cp+KZcffl3Nue2DAFVjUVm z2rlYs*Ry>UdD-Db!E7fPdyyThb>n#&4w6v;r~&wzDKX+bYxYV$ zRwdmIUHQ9ISdpdCmP%fs3(C3ElL43vJ#qZqd&*+b>M9 zcyX#+#@l1-PcrWx8*PnQNlCo8Mnf2my+w)EEmzrAwi|v>&vqt-LAgCw4tCODv&Psq-gn1=1+@1d2QK#74xo#}cB3sB04FO)M)v+Jo|nkbV(sR5 zUl;+SI+6Q;9m=fN*07KJ8eT!H%Qa;I&Gg8!SR+vwr@C2-% z9Y?(GvX||zY-kvuOJe%ySKznOF6ZR_+EPaN8Z7}u_@#9ZClldJanGa3DC0Gq0 zYV<9l)EcI_t#fA5{MOHklbKr?pyaX4w{m)4l6qvXiNTP&hm*5A?Zo#ELq6@V6-oI4 z>gXLhjiIt-t}JSpmHcYD>&$n&NtQ?v=5DPHaqp=(VRqju`hAJf)b0Ih13BtT!crqc zHFY$>`;<`B$5F2M!0LTcji#)j4m?zlCFsBOYfgu5hu+%Wq=U|9GU%Q{wNWcse0F1G zylp>Of*3l&@-RkUl|Rmb(@!*f9z``&n=|xB2E<&0Xg1>;8M)S?GMcZnID4MV>Sa-_ z0PT!XKLlH*d&tw(CDBQ)!PcO>WZJxyOlolixshlQ3A4{FXz3d5k; z?EpaOH^1`iJn7o=eESg0zPi#D+`2egGgC_|pkWl~IciMazQ=DISgO}ybk?B$Z@d;k%PxX561XZp3_QAT2 z|7hKR8$83c^Liuz?lq+-F=3yt4D@iufBdUps})y=mriAv1s~4*FL|VVHNI0_Wa`8! zW!p4-{1=zW?W~%V96eg~g~Ra(Q{-NF1OX1~ZTdHuDKi_kcsnF9o-ZMrp6u{CJ|IgZ}BixSV zyRh7te0jiodfTeCb`zI$0VFQRG4lwx?1uV zLpd93FZLIGvvS}n<=839S%d5_VaUoKt)(EX7%S%3*+DP`WJ2vE1AmLrCgX4iT8y{J z7ckgsWGMf|A|m4UUFejI1; zb!XS7#K=>Gyf7jOa0Ufm{zl64iK3fV(szkG>eBS_d3#EQoI*cN-qm6Kz9(zZ#N;@Q)r!30#4>))iz#${w?g%W2nk%WH z^g|17&>Y@WjR|b3&bM-vQ+cYt~M?N4wZHM(KoWE<^q) zH+^8RN7(+-HO0_LGqDDTP)a#^k#ro?qg&k8BOcLIaW*V|nOhp?+johuq#Nb7`i+4s zm%c$PU%XpRyKoW<)e{>`QF8q+k21oKW~)?q@yhM9>|r^`LSuAnR$dm4-cA}Bo)H~! z1aDCNa!N1oB->+oY%86otxi&ryf0<-`?ewc4rUSQTV9LJ-tMQwaFDSUpQ%BoCm$1bTC!g6@g>+oFEOH#CwV+SOl3T^PD{%Pjr`CNCtczTri_*m*e zI?oLs+cTOlhyKwSQvbR>R2GZ<)-oa{@#@|3dZBVMTZr>dIdZwv83mIiTU?@fNB4Ot z=gnoe#^=_FBb2beqp{+e`)!@|MTJmRNB@;Fv4)1lV*Q<`r7mdQ>&&w4(Nb~-B{7of z((%#X|0oHOg@T18Q>@)#JL`f)8+)3|52hOFD~MDoin2cpd>FwH{c9POg7Yw0I6Gbd z7^7}WJYZ_LoK-dd&TRKs2`p8}9tAQ&?pp<%wwkiBHBsl@*Ft2Xa2ObzRz4^sn~=BW zTAQ(sl=-cxQ<$#*{OuS`3(Z;HZGWakoTikGma6IZv%pv zJR=$#gip&UQ_jn~2z}6itHN0jT`-fMKAjoXcetoXjegpDBbr}W?kH0I;PkfZ`lZz6 zA?_#mpKnEIe_64JB$}RZootz1N?d6GbKOG5qiw4pE038DG~H@z`{gkg?_Qr4LRSl= zgsIX{N9*fNTMYvOtBWVc{4wDy6TBMw7fq|P-E4!=Cr5j&B5tGNsk}CJ;m>a?KD;aB zR8=4jvWbBgQ6UQh{w?#~dKckEHRk~ril65-**q6%oIcmR5}kf#YzAE|GcpIxwDASA zrT+L^Lae_=N*nk7cp%1)RkR$H3~Z}bhIy+=DYu>nP4fF%Eq!Tqps$78B#8KSRZ3&O zjcq+_20Qd8#ng}-yW@U2#;4nSur7<=5Xs8cch8{XMFKrTO5X^w`5Ku;uqBO) zSgshcF{_6wOFmvZcDt~`zldo-cZ53Dh*r_y5go?9JAxnv$r^7Ef6^3D?@vL-mJzkT zf$E?qjT{XT>~oSM2itKpcKj=Z&@D=)r|Y4peP%jJ5t-v}xd2ypM{1#2#9<48xGZmG z7~)uCGFX)`aHv3SLrKA+N4V?0_pR&0RD#y`#)0*p;?(qb4bsV`t)Qp5fbAH@)1>akf??izu{7nrR$#iIL&SUSA2Zl9w&TdA0|+I*2o}z(3hIj6A{3?o zLYJV5@`O9YFsPuIf`6hSfO!DnOq0`c=Dgp9!WchxTX4P=`|=ic#8wm~-RnUH9*nyz?VMa#pd)zStM~OjQ~-+|U1eyg(6m zq33Lsn=6uejy0>Cu{g!iiFSrq@#MRK(y7ytU4vs+XlRE=+3w^z5xr<`i8P51e6|3DnAw-Y1>O>%#Q5Y?s&&XshoIgzoxtFQ$xW66@-TkGZ z+X=#<{c8jj)$Qs0`Lm z9~I>7(|HpT$vcL_SFRWQeGrTy8&Kl;mD)5)=#i^JKD^veR^|AuRw(Te5FjzrMi-|i zaXoTh(qc+gEJIV4ikRH3`Apb$s@wMh1kNOw@&);(Bp7(LQ^wD>c!pe^DV?Q9)14^T z>+!Wrt(JkI2YRAhvK8&)aQbWuVy%f23RXNJZr_?ME?6LLRc$eu-Q3T}(vR@m5+ME- zBfbN?ix5)59PbEiVq)3IAyfKSxaRPJrdlRj?Nhc);2+HdQ8Jwqq1Y{2SnKmG2-)Vz zx@J^Z%D94GT5=YA2oQ-V4@@f%`wyYf!8?Pq^6RvmKWs(Chn@Lp5G~JYXGfaog0}W8 z5?c94^Hl>?U-Q`mvUZvxc;Ng6t%&>uy@({fC28m+bdK<7j*zd3m_m7;kK*yWf5B}N zzF&p;gGT88B9|ErMH}d^*AeK?!}YzdfuRy5t^-ZSP-#oK^YfBrF%;4i(ht{tc$XFf zZuu3&$y-a#vbbyNCJPz=-2Ket^m}|&@k|I(@h({7zW%y zPoP))@fa5p7RA;Irt%p+=FK1a=Np)T5WG+)a4)=#zY7K6c+uip)=R8=?1vJcE?wDznQS)kFM=;qbG}3WDFcZY$ z;OX~S_323ItG_|glmEtQ5Fw*4Fk=fR|HUR??r+8hzCP0W{8x>ZrV=ZY{GK;1o3!c} zxaSdaW&SSoiBf}FDnK>aLHHr9;i7zoVbG_x>9^fmOJ^&YqAkt`Oj=0Rj|{q6M86M( zZ49eh+p@`X8eVDzF-e&*%JA0!+1K1dGmxA?UBQ;{z&@dOnk zX`nP+p7l4L58WRv>1cFV!2^4;_4PRsq?{8Qis6k6Q9<-0r-DLd&@AL)aU>C!>CJeg zd7}rv#$)v}IAOusWe4o4#`7e!^rqB`pZw7c&1I#9aBe-LbHjc8&~oIe)f$Ly)Db&} zJawOlz3dyg0H0l!B=M>t<+2cW$WEpdK!CJP=NK8~INo=8zkJZ?OI*X^{jmblH<(ne zGpQz`mFY<`;YhC?e}d$yxLH+T`JUN#N!W4{Oc?T_X9Zw2V49K zXSLaF4`w_0CEnZ{i6jR5dI}20{1=X(ie1y4nk?B=nTz>L42j>oQDIhW702Wnz73}w6XzlEu8`cPwNP!-vxWW-MQp2B+nCIo48`RT=4Nk!6)z%$rjA@EV9%df7rATfNcbCG7a>6VmAj5Q5TK!S1)y%`(7Qo%*ur_u8N4 zwDlc#xLNSze?)x1qb|i z#hI1+c^yr_%4^*ljKq6SFUOwHzK%Bc*0?^t0c0P}^vYe5k^$>ySEglS{*K92~29>B8SH$2MAOA<5D? z9pmPpiBDd>wN4eqmTe%k76FwC?@)8?Xu6}wOuX@YW%KIz$yTl|VHtH-=07M zT9#@I9YP*j8@~KckYw7-8&%dg-A!*6Axbnfo)Amn7X4C;8Hv>ey4xzY1JnSeDCWb1 z5j$C5GBT!M0$!-CvwMPbbg|doAqS zR0su_sPW(MENk&HMn5@s5f{9t*c{V3{l&<_(uns_=tuXLfH-pe8+S-&nc_MQ4vYP25T z#4iq)dv~p&z0+|f1CiqA$%rCS71g2<1-{on3Sg5S3IX0@p5fP$#2<7yG20)+T8Mr5 zteq80Oq}`b=_3=@RHc;uQ6h z<0AF+4!g@0!YX*jti#Z6x>7k2%jaVIwq#V58?ys+@|E4cE_u$NCM6$Q|!V8G$tG~I;BD-qD%3iqe;We?FF8)g9SfB@V>N}R=7ryyx) z9XknAik#PaZEuZPR`2zxvpjaD&x3)9g@6TLts7dN*&HE+O(?*D3_JH%1bOcI@M@mx z5HZiPIaOr-h~3xD@=Arh!vXzpo6AI+=pEXV%w;Nh!lTmJ0vAhU6M>mv_PP)~>5AH@qf;m@Wnm z4WMy$B){>8V}k~C*eFjj#j|dk8!l_=GY(uR-kF=2N%t4OfCIY%%|gs4O;vuyDgHT2 zMhDOV=5LO!tHM5bCz!R75u$tWzDNpakhO=y@2jk*|qjPs8 z3w!NSoZS+0n~%fdH^1=PYb4od`yDO!bOc<+$kBzIJi;UqmpN~qN8#GuU{4Nb8|{2^2k2DsoLA-up_hd&pMzkBW-yXu zota(31UK^d6}tq)ya}m*dz3qB!egKwkucgrYrBFeHt#Ae;gy=<85Zz-^SlT=mIQ}O*}HqP$1 zj>n=$R9Ougk4-S+Cxw0YT1y{zEHaR^yMK&PhuYGORv?Ad0+zMdPB}eRm8EWGw9SKw#nPUdVK3h1hhWON{#g8f zJTre-Vi;D-$H74bSY&&J&fP>ijc)9WdZcd7o57)4K3r*~Z@q48hpqm))^C77k#vA{o1i0`294^UgniH}2h<>^0ox2Jlws6QuWo*rkn8s=(xue|1{(t0J zcm>20NGOz2Vc!~5JyrH4KePQNm3DLHI;A!)9^03&vv{jAI;V2A(k^$q50~AeNN5ld zbr?abSeuKaw_HOH{k3E8p3_`f6Y;=Bypdn7e5k`#r@Zvo$@s?ybrm1I^*uo`h*Zy$0@VP6>p^iD{y`CQLROhal1CoCJ_Dx+g(;OpFyud+8EJ<{gre{;)h?6 zW^g#puPY?tzxMLCV|g;tYuYT6gB~>}Gbb|I%erA`UlrEfm{6m-q*RcqHDojogk#c1 z36-f%=ouso=)m7N*&I)kmot>gjeH=TE*@N=HuyDM>thwvjl6+M$=vD{JtL_hzcy%B z7Vs2}WFS?j(reMXwW`y&j!1BQl&R0hTq@E+Y^>PEWdnPqMRYbkqU_+p)KQAns_=#F?sVBg*CB6FlI~=YcKGlc5GITFYg&>U@J~$9s`8`I5Z(n zCB?x$NK)t(y~I;(m|kDk{e+wEU&p`9VwxMOLZsW6?SjyXOUoJA zTFcKFb0iw0AXAn4O7f|9t2z?cW;6D5_{7}|cC30CW;GW)&XkzsiiZ?2&iH}P)ny6G za!JK50tP-#?5*F*;RK3Xm^H*v7e8jLvBqG`Ev3(ek{fjF`3a6iEA0T3_QFb?G@?_l zms4YUGqk4-8sp2@s|S7BYU*ck!J}tC)XY#q*Z>Y^We`JvENhwW0RQL{Fy$)91_$qB z%C+>%-J(S9>(EP@7r!IVcQF=67nYcQhC@Gj;ky{J8-XFA#|WQ;_9C(G`p56@>KK1!Y?gOypW2S?hGMm3>#;V3 z4#Do0A=tFlsMbO{?`Q1LpEZ~Z-FdZ%)41~iCPm+cMXeuy4y6ivIv>v#=Koa^RQPrm z8Gw2Ej7cN`$4(5zDvok{@)1+<2-vID4{$P)QncVri6hA%7vlLNvwv0|cP8FKr<#^L zJ6OqXakfFRWr)D`v*hY$Etb&x)Slle;pfhBJ`1JlD17Rrr_W*$%8&;|N9mdT7TRSK45m=#u=Dpk6bT(i zLrsh9#7)geLQwe=Ayo32#^bvo4>lAO`vmx1gXC;oez!iXjYa%N^FKM$WMY zqVReKjvpw~*TmX9TMVTl#GthP6T6e9>2Lh%>&~VoM$8ooQ~Eo7U7XvKKXhUhiaHlY z`x5JLlhdIHo8`e&Td-Gwl~ylim~BlVZ#596<63F=<8EwhgrUbu-#xsAd5)`Lwg8#z zBczQlEFTDqZirOI`kOg^)<+S#;%1-796E?iCNw0wR_FQ7~rm5@WSKxvXjXD=M_)5s!Qr;Fr_au?Ca zDHDtGFfJmyx3dc!tJ(c-SQ#|kwN4#=Ue9=h!BdP|;UEZMhb7ORKHWKY8So4?&J zby{G(5;c0gLjh$+DJCd@SgZqut0w=-tKOv{?q~TcxNtCBoC+kxusZ*@W^V_J^&A)V@S@m!r4$yN_MwG4m!Suv{*Z`^<>F-0(an93h=?9dN1nc2` z;Mz{~q-Zj!y03U>Dw;>6>a*PTnwKRG$l@&D;?QT@gKyHS!)De=SGMlX0KWZQ`(k||0_Bbd=L-s>NKb?ke`G$MZ? zyhW*9_FR(7A1fCp$HL0j#V*pgYXkHLDCHDimUXK|r>r)yp^W!pc0(R5 zf4_hAhk3w^Ve&-fYzQp4%^fC7($>}0jah$&{}gQAw%m9L zz4!L+TuVyx$dezBJR0m!sY9)qu)#uhT(xJU+CUjaPf}4(F2;>9+ooTb@?w3PN?i?Wm?-~10H zWxpXNrwj;`xgOT64~pj9dx(ge%A0B-{8Q8j5pcimC;k38fiCx^6i0s>dzWN;qJ0MW zl1517(S}Xyi$6p#$IVZhBReji;*v7tMQKZg%SSc!Em!pHurN^qNkn|{)%;k^+n}7AM37%yTfY~L|4@HKB$U$@XWu3;aC%Z*F%mux8OrXY1 zC_ZEXf_ubpw7W|p4@s;eiMkOh@1!n|zv;A3f4=|<0UjudcPFvJpOWTnv(+q+w>T7l|{5+D~1>LEqi{Ofv zVK6~czoM3Z)xtQL@vjJG8zs(*Fe;voofXu2>`2JE;$TS9E#d?+N?!A)RBjLFxpURI zIArrq{E=Bbq#7IzSb))BF^D^*1^TM)Wm8q}d8DZIJeM zK@5Jw*u`R~jIROH=p}=(a-_dI++g7MCs*VxX&cP212wX=y<;3@x^G%JP1m0i2x9+c zpQf}vGgCI!+K^{+So|OpBIJ(&7~p(2M-wP1j2b~kV6Zr6i~JbL?FHU$gwoRJ&=#vP z=Frck)#~84Fk zYM}Uh$tlx3{PI~HKylClx7BM&^<#Jg)_V(uiEeiU(-!Q{I_?nPiDpoKf~3`XV-b1@ za6h(bkskU3Dja=~h7&obA^H(!-@1e?EY-n4nxQUXuyC^f_^Dt%VG`>X(YSi2hra{g z6^t5zWO>oH+z!V-Xtc2B?{@i zS-Rg((J0TY^vdyCaaWO1XJzNXHa%!a5aTmbq>>CL=Fa-d?*Mz_RP}~)!So}>-r$F1 zvM)o_rA$UyaoY1KV`iMxABTP)pHQ4ni_IOnPZ!`|>+v=jM{NoM- zx%{K%5%(R!n*d(-HolN;d)eLXtNVwczLCIYCwf1NE4Am7aPhpKP|^p5Zo<(Pa?OKV zHor^}{2&(OqSlqTJdDZLZ7`SnZHfFDbEoA4x3|yhAw9gd3DFY&ezX!Zxk=z#OPBkD z%)K|e@&>Y!&;0LF{psu(wyw`o66amzN~T%6d-cno$CKG*C4!e}x6lz>0j{j__o2+eu~<5+&_%NHRkSjgYU738c@=KLK@&nt z3A;F-U2oBsVbQlG>YI5Aiv(5Vd>e`KNCK}Oq30N=W0s&fNU+auXRKbnX7cpnDymCt}*_ zl1RHOl|K}>cCFjA76|S>ydoxshC?tj)Wp9fzu&RUMopFWtOWSX8r%PjxiR#KEH_4y zn;#3L!?yl3*53FS-7p(L!PYJu*QdA=;5YzW6Lj}=8>9&SI z4owZ2*;{F}dO(Y6efH{her4b+jHi`_jU^q*+^6~Elqpo?5asEr^ zg>jX$)7cH})?H_dl!O0}|FVEd&x?5`r~Iw$?Y?y7yHGouA-^Z;X-BshQ^{E@6|3U~ z<}}&;=kH34K+}jT)rLCYV2dLYI-)ucbAE7IIziQq0axQ^DaE%PxzJ_Ql5 zfJ-~7w>&(LJ{8uO>WI8|cwg*oz#s3TT zSF+ZF($n*FRATSOfbL-dW*h(X(d?^EMAummHfxR2p1}Kb1uH$@x%vm;;z!fM9g zRU4c*8z1kKpBkjUJ@Rd!2!_4Sw(eml!4uId`*PPWi+PD`M%z%gA|kAVPPT3(Yt6Bg z?D&amU|00-3TVOeE`+sB(5#vV|%mTdfxj>H8XhB;pCecfv zwx#M&{7T<2>U8~{M1_}Fb=os(zZJD)ap<}H18`H|C5&gOALaFQhXJb#t8+jGO&JhpepAZ+>M@3<{~q^Z_gq=iVF zuGYAmJA=vR`ep~|3o2T3sWUuF^8qFhatoNd5s*H9hpvUXmN<#dyPtsFsh`*VrC|7a zZUx`}yk1Tp73IL}MC$IoRR1vo)*`u_*E&#IAFZ4G`g`i2 zp3tUF2vSBBb>eZ*v5UR2g=pDvBo;>bHjFrZH|kN?@{~}9QHABR3UOCOUoEUcTy&uU zM;Fr2Ai)>+)dHk&BL1w)xqxp;g^Up4P~_o&7P#LM4lLQv z(O(OPX9_%EKM*eRC9pmmyly~m{&r}7{U?WUCkJo+JA&Wd@o=RkOPzrnvCMWUx(r+Y z=;Nn#dMgWyWNd^;dxvKDCEe}*D?F%<_oU)XZ#5VPiECsP?a&-%!?av7x$|!f?ezJI zRjjkW)8*+sdqbek~&6)aC}d znIbM@V0?o8w3DH{y3ns5)SsdY5^k-+q}KKw`0d;B_Srem$yW8_Nl^iSD7*oEsOIIYC*4~Gw5j`K+LFWAb6>0p zJYzDt`_`-ZMv>E+`dOmbm9|ZLo7v>{~dq5A-r7 zCxI0KNqjhY#M{dzhz*`d85%gY+p$20$^)mXa!qbWMo;8bt7s;}S&reWUq22OAZnJD z#vl3aRi4@M9lY8LIO!Lex6dVnCqf?9tB|9?sPY_`9f)EHi3r2&crPD{F7$h&ww`ru z7OC}C7y{+(q9jsNy7DIF`qy?bF;vpS8A2N+k;o!cBfKOEtZzlVBiHe~NJ;-47R4$C zDyvX0)Yn2lWX}UPkhYo!JXZnEWkAS$qKhw)SyDWu^cchtX2JY(bC+@L+NRl0n9pgaR;gqhSRZ^@exKau=D@h71}cMrqQOu zCd;N$LuAH&$qk{&h?B5M@gZk}j^T)sISB&nj`*JfDtYjdegP&RDF9Fam{6R2tSS)Y zMbpP`#oIUV?K4?Brs0@Skxc+viK*-VIg$wMS5Y|R4{a<<1+v+2uu_)SkgJxli2N^t Cq_?yH literal 0 HcmV?d00001 diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/charge.php b/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/charge.php new file mode 100644 index 0000000..842dd5b --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/charge.php @@ -0,0 +1,64 @@ +secretApiKey = 'skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A'; +$config->serviceUrl = 'https://cert.api2.heartlandportico.com'; + +ServicesContainer::configure($config); + +$card = new CreditCardData(); +$card->token = $_GET['token_value']; + +$address = new Address(); +$address->streetAddress1 = $_GET["Address"]; +$address->city = $_GET["City"]; +$address->state = $_GET["State"]; +$address->postalCode = preg_replace('/[^0-9]/', '', $_GET["Zip"]); +$address->country = "United States"; + +try { + $response = $card->charge(15) + ->withCurrency('USD') + ->withAddress($address) + ->withAllowDuplicates(true) + ->execute(); + + $body = '

Success!

'; + $body .= '

Thank you, ' . $_GET['FirstName'] . ', for your order of $15.

'; + + echo "Transaction Success your transaction Id is: " . $response->transactionId; + + // i'm running windows, so i had to update this: + //ini_set("SMTP", "my-mail-server"); + + sendEmail($_GET['EMAIL'], 'donotreply@e-hps.com', 'Successful Charge!', $body, true); +} catch (Exception $e) { + echo 'Failure: ' . $e->getMessage(); + exit; +} + +function sendEmail($to, $from, $subject, $body, $isHtml) { + $message = ''; + $message .= $body; + $message .= ''; + + $headers = "From: $from\r\n"; + $headers .= "Reply-To: $from\r\n"; + + if ($isHtml) { + $headers .= "MIME-Version: 1.0\r\n"; + $headers .= "Content-type: text/html; charset=ISO-8859-1\r\n"; + } + + mail($to, $subject, $message, $headers); +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/index.html b/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/index.html new file mode 100644 index 0000000..2ac5165 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/index.html @@ -0,0 +1,373 @@ + + + + + + + + + + + + + + Simple Payment Form Demo + + + + + + + +
+
+

PHP SecureSubmit Example

+
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + +

Card Information

+
+
+ +
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+ +
+ +
+ + + + +
+
+ + + + diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/gift/charge.php b/classes/includes/vendor/globalpayments/php-sdk/examples/gift/charge.php new file mode 100644 index 0000000..de9ed97 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/examples/gift/charge.php @@ -0,0 +1,33 @@ +secretApiKey = 'skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A'; +$config->serviceUrl = 'https://cert.api2.heartlandportico.com'; + +ServicesContainer::configure($config); + +try { + $card = new GiftCard(); + $card->number = $_GET["card-number"]; + + $response = $card->charge(1) + ->withCurrency('USD') + ->execute(); + + //echo $response->responseCode; + echo "Transaction success transaction Id: " . $response->transactionId; +} catch (Exception $e) { + echo $e->getMessage(); +} + + diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/gift/index.php b/classes/includes/vendor/globalpayments/php-sdk/examples/gift/index.php new file mode 100644 index 0000000..26d75e9 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/examples/gift/index.php @@ -0,0 +1,18 @@ + + + + + GiftCard Example + + +
+ Card Number:
+ +

+ +
+ + \ No newline at end of file diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/iframe-pay-invoice/assets/main.js b/classes/includes/vendor/globalpayments/php-sdk/examples/iframe-pay-invoice/assets/main.js new file mode 100644 index 0000000..c3857aa --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/examples/iframe-pay-invoice/assets/main.js @@ -0,0 +1,206 @@ +(function (document, Heartland) { + // Create a new `HPS` object with the necessary configuration + var hps = new Heartland.HPS({ + publicKey: 'pkapi_cert_P6dRqs1LzfWJ6HgGVZ', + type: 'iframe', + // Configure the iframe fields to tell the library where + // the iframe should be inserted into the DOM and some + // basic options + fields: { + cardNumber: { + target: 'iframesCardNumber', + placeholder: '•••• •••• •••• ••••' + }, + cardExpiration: { + target: 'iframesCardExpiration', + placeholder: 'MM / YYYY' + }, + cardCvv: { + target: 'iframesCardCvv', + placeholder: 'CVV' + }, + submit: { + target: 'iframesSubmit' + } + }, + // Collection of CSS to inject into the iframes. + // These properties can match the site's styles + // to create a seamless experience. + style: { + 'input': { + 'background': '#fff', + 'border': '1px solid', + 'border-color': '#bbb3b9 #c7c1c6 #c7c1c6', + 'box-sizing': 'border-box', + 'font-family': 'serif', + 'font-size': '16px', + 'line-height': '1', + 'margin': '0 .5em 0 0', + 'max-width': '100%', + 'outline': '0', + 'padding': '0.5278em', + 'vertical-align': 'baseline', + 'height': '50px', + 'width': '100% !important' + }, + '#heartland-field': { + 'font-family': 'sans-serif', + 'box-sizing': 'border-box', + 'display': 'block', + 'height': '50px', + 'padding': '6px 12px', + 'font-size': '14px', + 'line-height': '1.42857143', + 'color': '#555', + 'background-color': '#fff', + 'border': '1px solid #ccc', + 'border-radius': '0px', + '-webkit-box-shadow': 'inset 0 1px 1px rgba(0,0,0,.075)', + 'box-shadow': 'inset 0 1px 1px rgba(0,0,0,.075)', + '-webkit-transition': 'border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s', + '-o-transition': 'border-color ease-in-out .15s,box-shadow ease-in-out .15s', + 'transition': 'border-color ease-in-out .15s,box-shadow ease-in-out .15s', + 'width': '100%' + }, + '#heartland-field[name=submit]': { + 'background-color': '#36b46e', + 'font-family': 'sans-serif', + 'text-transform': 'uppercase', + 'color': '#ffffff', + 'border': '0px solid transparent' + }, + '#heartland-field[name=submit]:focus': { + 'color': '#ffffff', + 'background-color': '#258851', + 'outline': 'none' + }, + '#heartland-field[name=submit]:hover': { + 'background-color': '#258851' + }, + '#heartland-field-wrapper #heartland-field:focus': { + 'border': '1px solid #3989e3', + 'outline': 'none', + 'box-shadow': 'none', + 'height': '50px' + }, + 'heartland-field-wrapper #heartland-field': { + 'height': '50px' + }, + 'input[type=submit]': { + 'box-sizing': 'border-box', + 'display': 'inline-block', + 'padding': '6px 12px', + 'margin-bottom': '0', + 'font-size': '14px', + 'font-weight': '400', + 'line-height': '1.42857143', + 'text-align': 'center', + 'white-space': 'nowrap', + 'vertical-align': 'middle', + '-ms-touch-action': 'manipulation', + 'touch-action': 'manipulation', + 'cursor': 'pointer', + '-webkit-user-select': 'none', + '-moz-user-select': 'none', + '-ms-user-select': 'none', + 'user-select': 'none', + 'background-image': 'none', + 'border': '1px solid transparent', + 'border-radius': '4px', + 'color': '#fff', + 'background-color': '#337ab7', + 'border-color': '#2e6da4' + }, + '#heartland-field[placeholder]': { + 'letter-spacing': '3px' + }, + '#heartland-field[name=cardCvv]': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/cvv1.png?raw=true) no-repeat right', + 'background-size': '63px 40px', + }, + 'input#heartland-field[name=cardNumber]': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-inputcard-blank@2x.png?raw=true) no-repeat right', + 'background-size': '55px 35px'}, + '#heartland-field.invalid.card-type-visa': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-visa@2x.png?raw=true) no-repeat right', + 'background-size': '83px 88px', + 'background-position-y': '-44px' + }, + '#heartland-field.valid.card-type-visa': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-visa@2x.png?raw=true) no-repeat right top', + 'background-size': '82px 86px' + }, + '#heartland-field.invalid.card-type-discover': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-discover@2x.png?raw=true) no-repeat right', + 'background-size': '85px 90px', + 'background-position-y': '-44px' + }, + '#heartland-field.valid.card-type-discover': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-discover@2x.png?raw=true) no-repeat right', + 'background-size': '85px 90px', + 'background-position-y': '1px' + }, + '#heartland-field.invalid.card-type-amex': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-savedcards-amex@2x.png?raw=true) no-repeat right', + 'background-size': '50px 90px', + 'background-position-y': '-44px' + }, + '#heartland-field.valid.card-type-amex': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-savedcards-amex@2x.png?raw=true) no-repeat right top', + 'background-size': '50px 90px' + }, + '#heartland-field.invalid.card-type-mastercard': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-mastercard.png?raw=true) no-repeat right', + 'background-size': '62px 105px', + 'background-position-y': '-52px' + }, + '#heartland-field.valid.card-type-mastercard': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-mastercard.png?raw=true) no-repeat right', + 'background-size': '62px 105px', + 'background-position-y': '-1px' + }, + '#heartland-field.invalid.card-type-jcb': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-jcb@2x.png?raw=true) no-repeat right', + 'background-size': '55px 94px', + 'background-position-y': '-44px' + }, + '#heartland-field.valid.card-type-jcb': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-jcb@2x.png?raw=true) no-repeat right top', + 'background-size': '55px 94px', + 'background-position-y': '2px' + }, + 'input#heartland-field[name=cardNumber]::-ms-clear': { + 'display': 'none' + } + }, + // Callback when a token is received from the service + onTokenSuccess: function (resp) { + document.querySelector("input[name=token_value]").value = resp.token_value; + Heartland.Events.removeHandler(document.getElementById('payment_form'), 'submit'); + document.getElementById('payment_form').submit(); + }, + // Callback when an error is received from the service + onTokenError: function (resp) { + alert('There was an error: ' + resp.error.message); + }, + // Callback when an event is fired within an iFrame + onEvent: function (ev) { + console.log(ev); + } + }); + + // Attach a handler to interrupt the form submission + Heartland.Events.addHandler(document.getElementById('iframes'), 'submit', function (e) { + // Prevent the form from continuing to the `action` address + e.preventDefault(); + // Tell the iframes to tokenize the data + hps.Messages.post( + { + accumulateData: true, + action: 'tokenize', + message: 'pkapi_cert_jKc1FtuyAydZhZfbB3' + }, + 'cardNumber' + ); + }); +}(document, Heartland)); \ No newline at end of file diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/iframe-pay-invoice/charge.php b/classes/includes/vendor/globalpayments/php-sdk/examples/iframe-pay-invoice/charge.php new file mode 100644 index 0000000..a75b2a3 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/examples/iframe-pay-invoice/charge.php @@ -0,0 +1,66 @@ +secretApiKey = 'skapi_cert_MYl2AQAowiQAbLp5JesGKh7QFkcizOP2jcX9BrEMqQ'; +$config->serviceUrl = 'https://cert.api2.heartlandportico.com'; + +ServicesContainer::configure($config); + +$card = new CreditCardData(); +$card->token = $_GET['token_value']; + +$address = new Address(); +$address->streetAddress1 = $_GET["Address"]; +$address->city = $_GET["City"]; +$address->state = $_GET["State"]; +$address->postalCode = preg_replace('/[^0-9]/', '', $_GET["Zip"]); +$address->country = "United States"; + + +try { + $response = $card->charge(15) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber($_GET["invoice_number"]) + ->execute(); + + $body = '

Success!

'; + $body .= '

Thank you, ' . $_GET['FirstName'] . ', for your order of $' . $_GET["payment_amount"] . '.

'; + + echo "Transaction Success!
Transaction Id: " . $response->transactionId; + echo "
Invoice Number: " . $_GET["invoice_number"]; + + // i'm running windows, so i had to update this: + //ini_set("SMTP", "my-mail-server"); + + sendEmail($_GET['EMAIL'], 'donotreply@e-hps.com', 'Successful Charge!', $body, true); +} catch (Exception $e) { + echo 'Failure: ' . $e->getMessage(); + exit; +} + +function sendEmail($to, $from, $subject, $body, $isHtml) { + $message = ''; + $message .= $body; + $message .= ''; + + $headers = "From: $from\r\n"; + $headers .= "Reply-To: $from\r\n"; + + if ($isHtml) { + $headers .= "MIME-Version: 1.0\r\n"; + $headers .= "Content-type: text/html; charset=ISO-8859-1\r\n"; + } + + mail($to, $subject, $message, $headers); +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/iframe-pay-invoice/index.html b/classes/includes/vendor/globalpayments/php-sdk/examples/iframe-pay-invoice/index.html new file mode 100644 index 0000000..21aaa8f --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/examples/iframe-pay-invoice/index.html @@ -0,0 +1,168 @@ + + + + + + + + Simple Payment Form Demo + + + +
+

PHP SecureSubmit Example

+
+

Billing Information

+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ +

Payment Information

+
+ +
+ +
+
+
+ +
+ +
+
+ +

Card Information

+
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+
+ + +
+ + +
+
+
+ + + + + + diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/iframe-recurring-signup/assets/main.js b/classes/includes/vendor/globalpayments/php-sdk/examples/iframe-recurring-signup/assets/main.js new file mode 100644 index 0000000..3930174 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/examples/iframe-recurring-signup/assets/main.js @@ -0,0 +1,207 @@ +(function (document, Heartland) { + // Create a new `HPS` object with the necessary configuration + var hps = new Heartland.HPS({ + publicKey: 'pkapi_cert_jKc1FtuyAydZhZfbB3', + type: 'iframe', + // Configure the iframe fields to tell the library where + // the iframe should be inserted into the DOM and some + // basic options + fields: { + cardNumber: { + target: 'iframesCardNumber', + placeholder: '•••• •••• •••• ••••' + }, + cardExpiration: { + target: 'iframesCardExpiration', + placeholder: 'MM / YYYY' + }, + cardCvv: { + target: 'iframesCardCvv', + placeholder: 'CVV' + }, + submit: { + target: 'iframesSubmit' + } + }, + // Collection of CSS to inject into the iframes. + // These properties can match the site's styles + // to create a seamless experience. + style: { + 'input': { + 'background': '#fff', + 'border': '1px solid', + 'border-color': '#bbb3b9 #c7c1c6 #c7c1c6', + 'box-sizing': 'border-box', + 'font-family': 'serif', + 'font-size': '16px', + 'line-height': '1', + 'margin': '0 .5em 0 0', + 'max-width': '100%', + 'outline': '0', + 'padding': '0.5278em', + 'vertical-align': 'baseline', + 'height': '50px', + 'width': '100% !important' + }, + '#heartland-field': { + 'font-family': 'sans-serif', + 'box-sizing': 'border-box', + 'display': 'block', + 'height': '50px', + 'padding': '6px 12px', + 'font-size': '14px', + 'line-height': '1.42857143', + 'color': '#555', + 'background-color': '#fff', + 'border': '1px solid #ccc', + 'border-radius': '0px', + '-webkit-box-shadow': 'inset 0 1px 1px rgba(0,0,0,.075)', + 'box-shadow': 'inset 0 1px 1px rgba(0,0,0,.075)', + '-webkit-transition': 'border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s', + '-o-transition': 'border-color ease-in-out .15s,box-shadow ease-in-out .15s', + 'transition': 'border-color ease-in-out .15s,box-shadow ease-in-out .15s', + 'width': '100%' + }, + '#heartland-field[name=submit]': { + 'background-color': '#36b46e', + 'font-family': 'sans-serif', + 'text-transform': 'uppercase', + 'color': '#ffffff', + 'border': '0px solid transparent' + }, + '#heartland-field[name=submit]:focus': { + 'color': '#ffffff', + 'background-color': '#258851', + 'outline': 'none' + }, + '#heartland-field[name=submit]:hover': { + 'background-color': '#258851' + }, + '#heartland-field-wrapper #heartland-field:focus': { + 'border': '1px solid #3989e3', + 'outline': 'none', + 'box-shadow': 'none', + 'height': '50px' + }, + 'heartland-field-wrapper #heartland-field': { + 'height': '50px' + }, + 'input[type=submit]': { + 'box-sizing': 'border-box', + 'display': 'inline-block', + 'padding': '6px 12px', + 'margin-bottom': '0', + 'font-size': '14px', + 'font-weight': '400', + 'line-height': '1.42857143', + 'text-align': 'center', + 'white-space': 'nowrap', + 'vertical-align': 'middle', + '-ms-touch-action': 'manipulation', + 'touch-action': 'manipulation', + 'cursor': 'pointer', + '-webkit-user-select': 'none', + '-moz-user-select': 'none', + '-ms-user-select': 'none', + 'user-select': 'none', + 'background-image': 'none', + 'border': '1px solid transparent', + 'border-radius': '4px', + 'color': '#fff', + 'background-color': '#337ab7', + 'border-color': '#2e6da4' + }, + '#heartland-field[placeholder]': { + 'letter-spacing': '3px' + }, + '#heartland-field[name=cardCvv]': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/cvv1.png?raw=true) no-repeat right', + 'background-size': '63px 40px', + }, + 'input#heartland-field[name=cardNumber]': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-inputcard-blank@2x.png?raw=true) no-repeat right', + 'background-size': '55px 35px'}, + '#heartland-field.invalid.card-type-visa': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-visa@2x.png?raw=true) no-repeat right', + 'background-size': '83px 88px', + 'background-position-y': '-44px' + }, + '#heartland-field.valid.card-type-visa': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-visa@2x.png?raw=true) no-repeat right top', + 'background-size': '82px 86px' + }, + '#heartland-field.invalid.card-type-discover': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-discover@2x.png?raw=true) no-repeat right', + 'background-size': '85px 90px', + 'background-position-y': '-44px' + }, + '#heartland-field.valid.card-type-discover': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-discover@2x.png?raw=true) no-repeat right', + 'background-size': '85px 90px', + 'background-position-y': '1px' + }, + '#heartland-field.invalid.card-type-amex': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-savedcards-amex@2x.png?raw=true) no-repeat right', + 'background-size': '50px 90px', + 'background-position-y': '-44px' + }, + '#heartland-field.valid.card-type-amex': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-savedcards-amex@2x.png?raw=true) no-repeat right top', + 'background-size': '50px 90px' + }, + '#heartland-field.invalid.card-type-mastercard': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-mastercard.png?raw=true) no-repeat right', + 'background-size': '62px 105px', + 'background-position-y': '-52px' + }, + '#heartland-field.valid.card-type-mastercard': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-mastercard.png?raw=true) no-repeat right', + 'background-size': '62px 105px', + 'background-position-y': '-1px' + }, + '#heartland-field.invalid.card-type-jcb': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-jcb@2x.png?raw=true) no-repeat right', + 'background-size': '55px 94px', + 'background-position-y': '-44px' + }, + '#heartland-field.valid.card-type-jcb': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-jcb@2x.png?raw=true) no-repeat right top', + 'background-size': '55px 94px', + 'background-position-y': '2px' + }, + 'input#heartland-field[name=cardNumber]::-ms-clear': { + 'display': 'none' + } + }, + // Callback when a token is received from the service + onTokenSuccess: function (resp) { + document.querySelector("input[name=token_value]").value = resp.token_value; + document.querySelector("input[name=card_last_four]").value = resp.last_four; + Heartland.Events.removeHandler(document.getElementById('payment_form'), 'submit'); + document.getElementById('payment_form').submit(); + }, + // Callback when an error is received from the service + onTokenError: function (resp) { + alert('There was an error: ' + resp.error.message); + }, + // Callback when an event is fired within an iFrame + onEvent: function (ev) { + console.log(ev); + } + }); + + // Attach a handler to interrupt the form submission + Heartland.Events.addHandler(document.getElementById('iframes'), 'submit', function (e) { + // Prevent the form from continuing to the `action` address + e.preventDefault(); + // Tell the iframes to tokenize the data + hps.Messages.post( + { + accumulateData: true, + action: 'tokenize', + message: 'pkapi_cert_jKc1FtuyAydZhZfbB3' + }, + 'cardNumber' + ); + }); +}(document, Heartland)); \ No newline at end of file diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/iframe-recurring-signup/charge.php b/classes/includes/vendor/globalpayments/php-sdk/examples/iframe-recurring-signup/charge.php new file mode 100644 index 0000000..6c0ffe6 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/examples/iframe-recurring-signup/charge.php @@ -0,0 +1,119 @@ +secretApiKey = 'skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A'; +$config->serviceUrl = 'https://cert.api2.heartlandportico.com'; + +ServicesContainer::configure($config); + +$_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING); +$_GET = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING); + +function SendEmail($to, $from, $subject, $body, $isHtml) { + $message = ''; + $message .= $body; + $message .= ''; + + $headers = "From: $from\r\n"; + $headers .= "Reply-To: $from\r\n"; + + if ($isHtml) { + $headers .= "MIME-Version: 1.0\r\n"; + $headers .= "Content-type: text/html; charset=ISO-8859-1\r\n"; + } + + mail($to, $subject, $message, $headers); +} + +function getIdentifier($id) { + $identifierBase = '%s-%s' . substr(str_shuffle('abcdefghijklmnopqrstuvwxyz'), 0, 10); + return sprintf($identifierBase, date('Ymd'), $id); +} + +function createCustomer() { + $customer = new Customer(); + $customer->id = getIdentifier('Person'); + $customer->firstName = $_GET["FirstName"]; + $customer->lastName = $_GET["LastName"]; + $customer->status = 'Active'; + $customer->email = $_GET['Email']; + $customer->address = new Address(); + $customer->address->streetAddress1 = $_GET["Address"]; + $customer->address->city = $_GET["City"]; + $customer->address->province = $_GET["State"]; + $customer->address->postalCode = $_GET["Zip"]; + $customer->address->country = 'USA'; + $customer->workPhone = $_GET["PhoneNumber"]; + + $newCustomer = $customer->create(); + + return $newCustomer; +} + +function createPaymentMethod($customer) { + $card = new CreditCardData(); + $card->token = $_GET['token_value']; + + $paymentMethod = $customer->addPaymentMethod( + getIdentifier('CreditV'), $card + )->create(); + + return $paymentMethod; +} + +function createSchedule($customerKey, $paymentMethodKey, $amount) { + $schedule = new Schedule(); + + $schedule->id = getIdentifier('CreditV'); + $schedule->customerKey = $customerKey; + $schedule->paymentKey = $paymentMethodKey; + $schedule->amount = $amount; + $schedule->currency = 'USD'; + $schedule->startDate = date('mdY', strtotime("last day of next month")); + $schedule->paymentSchedule = PaymentSchedule::LAST_DAY_OF_THE_MONTH; //or PaymentSchedule::FIRST_DAY_OF_THE_MONTH + $schedule->frequency = ScheduleFrequency::MONTHLY; //'Monthly', 'Bi-Monthly', 'Quarterly', 'Semi-Annually' + //$schedule->duration = HpsPayPlanScheduleDuration::ONGOING; + $schedule->reprocessingCount = 1; + $schedule->emailReceipt = 'Never'; + $schedule->status = 'Active'; + $schedule->reprocessingCount = 1; + + $response = $schedule->create(); + + return $response; +} + +try { + $customer = createCustomer(); + $paymentMethod = createPaymentMethod($customer); + $schedule = createSchedule($customer->key, $paymentMethod->key, $_GET['payment_amount']); + + echo 'Your payment scheduled successfully
'; + printf('Customer Key: %s
', $customer->key); + printf('Payment Method Key: %s
', $paymentMethod->key); + printf('Schedule Key: %s
', $schedule->key); +} catch (Exception $e) { + die($e->getMessage()); +} + + +$body = '

Success!

'; +$body .= '

Thank you, ' . $_GET['FirstName'] . ', for your subscription.'; + + + +// i'm running windows, so i had to update this: +//ini_set("SMTP", "my-mail-server"); + +//SendEmail($_GET['Email'], 'donotreply@e-hps.com', 'Successful Charge!', $body, true); diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/iframe-recurring-signup/index.html b/classes/includes/vendor/globalpayments/php-sdk/examples/iframe-recurring-signup/index.html new file mode 100644 index 0000000..dbc41bb --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/examples/iframe-recurring-signup/index.html @@ -0,0 +1,165 @@ + + + + + + + + Simple Recurring Payment Signup Form Demo + + + +

+

PHP SecureSubmit Example

+
+

Billing Information

+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ +

Subscription Information

+
+ +
+ +
+
+ +

Card Information

+
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+
+ +
+ + +
+
+
+ + + + + + diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/manual-tokenize/assets/main.js b/classes/includes/vendor/globalpayments/php-sdk/examples/manual-tokenize/assets/main.js new file mode 100644 index 0000000..b5a5bda --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/examples/manual-tokenize/assets/main.js @@ -0,0 +1,206 @@ +(function (document, Heartland) { + // Create a new `HPS` object with the necessary configuration + var hps = new Heartland.HPS({ + publicKey: 'pkapi_cert_jKc1FtuyAydZhZfbB3', + type: 'iframe', + // Configure the iframe fields to tell the library where + // the iframe should be inserted into the DOM and some + // basic options + fields: { + cardNumber: { + target: 'iframesCardNumber', + placeholder: '•••• •••• •••• ••••' + }, + cardExpiration: { + target: 'iframesCardExpiration', + placeholder: 'MM / YYYY' + }, + cardCvv: { + target: 'iframesCardCvv', + placeholder: 'CVV' + }, + submit: { + target: 'iframesSubmit' + } + }, + // Collection of CSS to inject into the iframes. + // These properties can match the site's styles + // to create a seamless experience. + style: { + 'input': { + 'background': '#fff', + 'border': '1px solid', + 'border-color': '#bbb3b9 #c7c1c6 #c7c1c6', + 'box-sizing': 'border-box', + 'font-family': 'serif', + 'font-size': '16px', + 'line-height': '1', + 'margin': '0 .5em 0 0', + 'max-width': '100%', + 'outline': '0', + 'padding': '0.5278em', + 'vertical-align': 'baseline', + 'height': '50px', + 'width': '100% !important' + }, + '#heartland-field': { + 'font-family': 'sans-serif', + 'box-sizing': 'border-box', + 'display': 'block', + 'height': '50px', + 'padding': '6px 12px', + 'font-size': '14px', + 'line-height': '1.42857143', + 'color': '#555', + 'background-color': '#fff', + 'border': '1px solid #ccc', + 'border-radius': '0px', + '-webkit-box-shadow': 'inset 0 1px 1px rgba(0,0,0,.075)', + 'box-shadow': 'inset 0 1px 1px rgba(0,0,0,.075)', + '-webkit-transition': 'border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s', + '-o-transition': 'border-color ease-in-out .15s,box-shadow ease-in-out .15s', + 'transition': 'border-color ease-in-out .15s,box-shadow ease-in-out .15s', + 'width': '100%' + }, + '#heartland-field[name=submit]': { + 'background-color': '#36b46e', + 'font-family': 'sans-serif', + 'text-transform': 'uppercase', + 'color': '#ffffff', + 'border': '0px solid transparent' + }, + '#heartland-field[name=submit]:focus': { + 'color': '#ffffff', + 'background-color': '#258851', + 'outline': 'none' + }, + '#heartland-field[name=submit]:hover': { + 'background-color': '#258851' + }, + '#heartland-field-wrapper #heartland-field:focus': { + 'border': '1px solid #3989e3', + 'outline': 'none', + 'box-shadow': 'none', + 'height': '50px' + }, + 'heartland-field-wrapper #heartland-field': { + 'height': '50px' + }, + 'input[type=submit]': { + 'box-sizing': 'border-box', + 'display': 'inline-block', + 'padding': '6px 12px', + 'margin-bottom': '0', + 'font-size': '14px', + 'font-weight': '400', + 'line-height': '1.42857143', + 'text-align': 'center', + 'white-space': 'nowrap', + 'vertical-align': 'middle', + '-ms-touch-action': 'manipulation', + 'touch-action': 'manipulation', + 'cursor': 'pointer', + '-webkit-user-select': 'none', + '-moz-user-select': 'none', + '-ms-user-select': 'none', + 'user-select': 'none', + 'background-image': 'none', + 'border': '1px solid transparent', + 'border-radius': '4px', + 'color': '#fff', + 'background-color': '#337ab7', + 'border-color': '#2e6da4' + }, + '#heartland-field[placeholder]': { + 'letter-spacing': '3px' + }, + '#heartland-field[name=cardCvv]': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/cvv1.png?raw=true) no-repeat right', + 'background-size': '63px 40px', + }, + 'input#heartland-field[name=cardNumber]': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-inputcard-blank@2x.png?raw=true) no-repeat right', + 'background-size': '55px 35px'}, + '#heartland-field.invalid.card-type-visa': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-visa@2x.png?raw=true) no-repeat right', + 'background-size': '83px 88px', + 'background-position-y': '-44px' + }, + '#heartland-field.valid.card-type-visa': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-visa@2x.png?raw=true) no-repeat right top', + 'background-size': '82px 86px' + }, + '#heartland-field.invalid.card-type-discover': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-discover@2x.png?raw=true) no-repeat right', + 'background-size': '85px 90px', + 'background-position-y': '-44px' + }, + '#heartland-field.valid.card-type-discover': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-discover@2x.png?raw=true) no-repeat right', + 'background-size': '85px 90px', + 'background-position-y': '1px' + }, + '#heartland-field.invalid.card-type-amex': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-savedcards-amex@2x.png?raw=true) no-repeat right', + 'background-size': '50px 90px', + 'background-position-y': '-44px' + }, + '#heartland-field.valid.card-type-amex': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-savedcards-amex@2x.png?raw=true) no-repeat right top', + 'background-size': '50px 90px' + }, + '#heartland-field.invalid.card-type-mastercard': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-mastercard.png?raw=true) no-repeat right', + 'background-size': '62px 105px', + 'background-position-y': '-52px' + }, + '#heartland-field.valid.card-type-mastercard': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-mastercard.png?raw=true) no-repeat right', + 'background-size': '62px 105px', + 'background-position-y': '-1px' + }, + '#heartland-field.invalid.card-type-jcb': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-jcb@2x.png?raw=true) no-repeat right', + 'background-size': '55px 94px', + 'background-position-y': '-44px' + }, + '#heartland-field.valid.card-type-jcb': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-jcb@2x.png?raw=true) no-repeat right top', + 'background-size': '55px 94px', + 'background-position-y': '2px' + }, + 'input#heartland-field[name=cardNumber]::-ms-clear': { + 'display': 'none' + } + }, + // Callback when a token is received from the service + onTokenSuccess: function (resp) { + document.querySelector("input[name=token_value]").value = resp.token_value; + Heartland.Events.removeHandler(document.getElementById('payment_form'), 'submit'); + document.getElementById('payment_form').submit(); + }, + // Callback when an error is received from the service + onTokenError: function (resp) { + alert('There was an error: ' + resp.error.message); + }, + // Callback when an event is fired within an iFrame + onEvent: function (ev) { + console.log(ev); + } + }); + + // Attach a handler to interrupt the form submission + Heartland.Events.addHandler(document.getElementById('iframes'), 'submit', function (e) { + // Prevent the form from continuing to the `action` address + e.preventDefault(); + // Tell the iframes to tokenize the data + hps.Messages.post( + { + accumulateData: true, + action: 'tokenize', + message: 'pkapi_cert_jKc1FtuyAydZhZfbB3' + }, + 'cardNumber' + ); + }); +}(document, Heartland)); \ No newline at end of file diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/manual-tokenize/charge.php b/classes/includes/vendor/globalpayments/php-sdk/examples/manual-tokenize/charge.php new file mode 100644 index 0000000..35e5e6d --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/examples/manual-tokenize/charge.php @@ -0,0 +1,66 @@ +secretApiKey = 'skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A'; +$config->serviceUrl = 'https://cert.api2.heartlandportico.com'; + +ServicesContainer::configure($config); + +$card = new CreditCardData(); +$card->token = $_GET['token_value']; + +$address = new Address(); +$address->streetAddress1 = $_GET["Address"]; +$address->city = $_GET["City"]; +$address->state = $_GET["State"]; +$address->postalCode = preg_replace('/[^0-9]/', '', $_GET["Zip"]); +$address->country = "United States"; + +try { + $response = $card->charge(15) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber($_GET["invoice_number"]) + ->withAllowDuplicates(true) + ->execute(); + + $body = '

Success!

'; + $body .= '

Thank you, ' . $_GET['FirstName'] . ', for your order of $' . $_GET["payment_amount"] . '.

'; + + echo "Transaction Id: " . $response->transactionId; + echo "
Invoice Number: " . $_GET["invoice_number"]; + + // i'm running windows, so i had to update this: + //ini_set("SMTP", "my-mail-server"); + + sendEmail($_GET['EMAIL'], 'donotreply@e-hps.com', 'Successful Charge!', $body, true); +} catch (Exception $e) { + echo 'Failure: ' . $e->getMessage(); + exit; +} + +function sendEmail($to, $from, $subject, $body, $isHtml) { + $message = ''; + $message .= $body; + $message .= ''; + + $headers = "From: $from\r\n"; + $headers .= "Reply-To: $from\r\n"; + + if ($isHtml) { + $headers .= "MIME-Version: 1.0\r\n"; + $headers .= "Content-type: text/html; charset=ISO-8859-1\r\n"; + } + + mail($to, $subject, $message, $headers); +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/manual-tokenize/index.html b/classes/includes/vendor/globalpayments/php-sdk/examples/manual-tokenize/index.html new file mode 100644 index 0000000..469bc62 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/examples/manual-tokenize/index.html @@ -0,0 +1,166 @@ + + + + + + + + Simple Payment Form Demo + + + + + + +
+

PHP SecureSubmit Example

+
+

Billing Information

+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ +

Payment Information

+
+ +
+ +
+
+
+ +
+ +
+
+ +

Card Information

+
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
+
+ +
+ +
+
+ + + + diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/pay-invoice/assets/main.js b/classes/includes/vendor/globalpayments/php-sdk/examples/pay-invoice/assets/main.js new file mode 100644 index 0000000..c3857aa --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/examples/pay-invoice/assets/main.js @@ -0,0 +1,206 @@ +(function (document, Heartland) { + // Create a new `HPS` object with the necessary configuration + var hps = new Heartland.HPS({ + publicKey: 'pkapi_cert_P6dRqs1LzfWJ6HgGVZ', + type: 'iframe', + // Configure the iframe fields to tell the library where + // the iframe should be inserted into the DOM and some + // basic options + fields: { + cardNumber: { + target: 'iframesCardNumber', + placeholder: '•••• •••• •••• ••••' + }, + cardExpiration: { + target: 'iframesCardExpiration', + placeholder: 'MM / YYYY' + }, + cardCvv: { + target: 'iframesCardCvv', + placeholder: 'CVV' + }, + submit: { + target: 'iframesSubmit' + } + }, + // Collection of CSS to inject into the iframes. + // These properties can match the site's styles + // to create a seamless experience. + style: { + 'input': { + 'background': '#fff', + 'border': '1px solid', + 'border-color': '#bbb3b9 #c7c1c6 #c7c1c6', + 'box-sizing': 'border-box', + 'font-family': 'serif', + 'font-size': '16px', + 'line-height': '1', + 'margin': '0 .5em 0 0', + 'max-width': '100%', + 'outline': '0', + 'padding': '0.5278em', + 'vertical-align': 'baseline', + 'height': '50px', + 'width': '100% !important' + }, + '#heartland-field': { + 'font-family': 'sans-serif', + 'box-sizing': 'border-box', + 'display': 'block', + 'height': '50px', + 'padding': '6px 12px', + 'font-size': '14px', + 'line-height': '1.42857143', + 'color': '#555', + 'background-color': '#fff', + 'border': '1px solid #ccc', + 'border-radius': '0px', + '-webkit-box-shadow': 'inset 0 1px 1px rgba(0,0,0,.075)', + 'box-shadow': 'inset 0 1px 1px rgba(0,0,0,.075)', + '-webkit-transition': 'border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s', + '-o-transition': 'border-color ease-in-out .15s,box-shadow ease-in-out .15s', + 'transition': 'border-color ease-in-out .15s,box-shadow ease-in-out .15s', + 'width': '100%' + }, + '#heartland-field[name=submit]': { + 'background-color': '#36b46e', + 'font-family': 'sans-serif', + 'text-transform': 'uppercase', + 'color': '#ffffff', + 'border': '0px solid transparent' + }, + '#heartland-field[name=submit]:focus': { + 'color': '#ffffff', + 'background-color': '#258851', + 'outline': 'none' + }, + '#heartland-field[name=submit]:hover': { + 'background-color': '#258851' + }, + '#heartland-field-wrapper #heartland-field:focus': { + 'border': '1px solid #3989e3', + 'outline': 'none', + 'box-shadow': 'none', + 'height': '50px' + }, + 'heartland-field-wrapper #heartland-field': { + 'height': '50px' + }, + 'input[type=submit]': { + 'box-sizing': 'border-box', + 'display': 'inline-block', + 'padding': '6px 12px', + 'margin-bottom': '0', + 'font-size': '14px', + 'font-weight': '400', + 'line-height': '1.42857143', + 'text-align': 'center', + 'white-space': 'nowrap', + 'vertical-align': 'middle', + '-ms-touch-action': 'manipulation', + 'touch-action': 'manipulation', + 'cursor': 'pointer', + '-webkit-user-select': 'none', + '-moz-user-select': 'none', + '-ms-user-select': 'none', + 'user-select': 'none', + 'background-image': 'none', + 'border': '1px solid transparent', + 'border-radius': '4px', + 'color': '#fff', + 'background-color': '#337ab7', + 'border-color': '#2e6da4' + }, + '#heartland-field[placeholder]': { + 'letter-spacing': '3px' + }, + '#heartland-field[name=cardCvv]': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/cvv1.png?raw=true) no-repeat right', + 'background-size': '63px 40px', + }, + 'input#heartland-field[name=cardNumber]': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-inputcard-blank@2x.png?raw=true) no-repeat right', + 'background-size': '55px 35px'}, + '#heartland-field.invalid.card-type-visa': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-visa@2x.png?raw=true) no-repeat right', + 'background-size': '83px 88px', + 'background-position-y': '-44px' + }, + '#heartland-field.valid.card-type-visa': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-visa@2x.png?raw=true) no-repeat right top', + 'background-size': '82px 86px' + }, + '#heartland-field.invalid.card-type-discover': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-discover@2x.png?raw=true) no-repeat right', + 'background-size': '85px 90px', + 'background-position-y': '-44px' + }, + '#heartland-field.valid.card-type-discover': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-discover@2x.png?raw=true) no-repeat right', + 'background-size': '85px 90px', + 'background-position-y': '1px' + }, + '#heartland-field.invalid.card-type-amex': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-savedcards-amex@2x.png?raw=true) no-repeat right', + 'background-size': '50px 90px', + 'background-position-y': '-44px' + }, + '#heartland-field.valid.card-type-amex': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-savedcards-amex@2x.png?raw=true) no-repeat right top', + 'background-size': '50px 90px' + }, + '#heartland-field.invalid.card-type-mastercard': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-mastercard.png?raw=true) no-repeat right', + 'background-size': '62px 105px', + 'background-position-y': '-52px' + }, + '#heartland-field.valid.card-type-mastercard': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-mastercard.png?raw=true) no-repeat right', + 'background-size': '62px 105px', + 'background-position-y': '-1px' + }, + '#heartland-field.invalid.card-type-jcb': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-jcb@2x.png?raw=true) no-repeat right', + 'background-size': '55px 94px', + 'background-position-y': '-44px' + }, + '#heartland-field.valid.card-type-jcb': { + 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-jcb@2x.png?raw=true) no-repeat right top', + 'background-size': '55px 94px', + 'background-position-y': '2px' + }, + 'input#heartland-field[name=cardNumber]::-ms-clear': { + 'display': 'none' + } + }, + // Callback when a token is received from the service + onTokenSuccess: function (resp) { + document.querySelector("input[name=token_value]").value = resp.token_value; + Heartland.Events.removeHandler(document.getElementById('payment_form'), 'submit'); + document.getElementById('payment_form').submit(); + }, + // Callback when an error is received from the service + onTokenError: function (resp) { + alert('There was an error: ' + resp.error.message); + }, + // Callback when an event is fired within an iFrame + onEvent: function (ev) { + console.log(ev); + } + }); + + // Attach a handler to interrupt the form submission + Heartland.Events.addHandler(document.getElementById('iframes'), 'submit', function (e) { + // Prevent the form from continuing to the `action` address + e.preventDefault(); + // Tell the iframes to tokenize the data + hps.Messages.post( + { + accumulateData: true, + action: 'tokenize', + message: 'pkapi_cert_jKc1FtuyAydZhZfbB3' + }, + 'cardNumber' + ); + }); +}(document, Heartland)); \ No newline at end of file diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/pay-invoice/charge.php b/classes/includes/vendor/globalpayments/php-sdk/examples/pay-invoice/charge.php new file mode 100644 index 0000000..add3c51 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/examples/pay-invoice/charge.php @@ -0,0 +1,74 @@ +secretApiKey = 'skapi_cert_MYl2AQAowiQAbLp5JesGKh7QFkcizOP2jcX9BrEMqQ'; +$config->serviceUrl = 'https://cert.api2.heartlandportico.com'; + +ServicesContainer::configure($config); + +$card = new CreditCardData(); +$card->token = $_GET['token_value']; + +$address = new Address(); +$address->streetAddress1 = $_GET["Address"]; +$address->city = $_GET["City"]; +$address->state = $_GET["State"]; +$address->postalCode = preg_replace('/[^0-9]/', '', $_GET["Zip"]); +$address->country = "United States"; + +/* + $validCardHolder = new HpsCardHolder(); + $validCardHolder->firstName = $_GET["FirstName"]; + $validCardHolder->lastName = $_GET["LastName"]; + $validCardHolder->address = $address; + $validCardHolder->phoneNumber = preg_replace('/[^0-9]/', '', $_GET["PhoneNumber"]); + */ + +try { + $response = $card->charge(15) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber($_GET["invoice_number"]) + ->withAllowDuplicates(true) + ->execute(); + + $body = '

Success!

'; + $body .= '

Thank you, ' . $_GET['FirstName'] . ', for your order of $' . $_GET["payment_amount"] . '.

'; + + echo "Transaction Id: " . $response->transactionId; + echo "
Invoice Number: " . $_GET["invoice_number"]; + + // i'm running windows, so i had to update this: + //ini_set("SMTP", "my-mail-server"); + + sendEmail($_GET['EMAIL'], 'donotreply@e-hps.com', 'Successful Charge!', $body, true); +} catch (Exception $e) { + echo 'Failure: ' . $e->getMessage(); + exit; +} + +function sendEmail($to, $from, $subject, $body, $isHtml) { + $message = ''; + $message .= $body; + $message .= ''; + + $headers = "From: $from\r\n"; + $headers .= "Reply-To: $from\r\n"; + + if ($isHtml) { + $headers .= "MIME-Version: 1.0\r\n"; + $headers .= "Content-type: text/html; charset=ISO-8859-1\r\n"; + } + + mail($to, $subject, $message, $headers); +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/pay-invoice/index.html b/classes/includes/vendor/globalpayments/php-sdk/examples/pay-invoice/index.html new file mode 100644 index 0000000..4bfe929 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/examples/pay-invoice/index.html @@ -0,0 +1,169 @@ + + + + + + + + Simple Payment Form Demo + + + + + +
+

PHP SecureSubmit Example

+
+

Billing Information

+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ +

Payment Information

+
+ +
+ +
+
+
+ +
+ +
+
+ +

Card Information

+
+
+ +
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+ +
+ +
+ +
+ +
+
+ + + + + diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/point-of-sale/e3-swipe/assets/apples.png b/classes/includes/vendor/globalpayments/php-sdk/examples/point-of-sale/e3-swipe/assets/apples.png new file mode 100644 index 0000000000000000000000000000000000000000..f0542ab87010c4d58386856c5f4a80b4df4e21f7 GIT binary patch literal 56960 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%0Dk@L*Ma+;Is~IdB0%*j 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
BH8YF6Th4cXMbc#_DnMH z4%6~0Z)p44!{p`%l;x9Sw?o&3m^nA^I}tG3>PYgkOMUhlgZvd`{AZCYbTE(zPy#&f zoQ2@x1+wTCZMb~t_X*Ia!F>r$9b3}3qMEzZt|m%IIA^F>m`}~KlwcNBhI-_ zAifaoRC9jiZ1rus*HKFj(?Kjf%}mxFj6NQcjvjRU4_Y=iHi%W+vZq3`505=jdr~4V zgLa@!56ROfRfWRstO91O&?*zrMo6^WE{=mGn|86RfGDh|?5Dx?r>p^7pe|801aWxS z4f*@mNQ~j1mk+wu0y7+$iBwhu#VC9BKRll-g|w|erC;a_m_dF@8)E(5eUj|#fnH_N z!U+rfWb18KG%GsA zQoClR68cM`?bOCg-JRc8Q&zW$hBetiIeq$tBnOhjr7s-(@UfZag3{pBa`ADkeB0qd zn`#Yr!FSc9N^G0x!0FPA=~B|EnSn=%^4=hw5k{sE7e*i9u%`B}Px6e8Yc_ui;&(L6 zScC3M$6{6`d^T64x*nfFW-nKp#-Q!a7u}7a*8a&jR?ug55B6#tH3G^FeeC`@ccfc+ z;IpRT7f7GY%{@(6(LXY+TPL*W**W_Um>*@3N5O+$PcuvtRrieRQMF3C3vRVR&x^1^ zLcoxKN9{Var{5KtZ9$Wu=fBzOZ}<{_$NF+fz2_p(zgm-4#`VQV`dUsfTha3pP&%MD z%|2ejEk5Q=`d|7HXH}m$G-}>9_Gj&PXh4oyAj^L$m$MGS_4j+p4|>V%A7^Yj_E?AA z02d}~d-gaFyg30i*uA*nTO^^d83OU0PiHj&7@`Q0hSGnY<_L`y2hsCjXp~lI9P1+${rpK3H;}i>Gc5phMaAH)T9)E`%v=J7pUTMY|BgQOJ?xMSconC0_hA_^LhyT zqt8I_@2`!(MyN$ceWBi#)Y%ZipF+qIi>wp>lLn6v$J9KX0~lX6?kXCOEKA-7vcWN; z`?&mm_m1h_&hHx`ch=*1U{8*eso&1b_bf^HRXZVE{Ca9&PwJQNeMCG@@YNg#y~*Q~ z5~%b1$9JFSw3p{7S-et?vPs-Z5D^DY)_dq@M{LheI3$c7@&aLzjJmGhsEX$qgbil( zVtO{3eR<xQ}=V!KV8&issO~fF)(HvTsywl&WeL*dv0Q?wQ#} z%oPn~Ku)$qbak`X;e$Yh3~58IDOXY>I2G^!?|p=!Lj$;mV0J^OJy57_lIki)j?t$~ za`rz8hr!+djK##n6d8fl<KZq-XWwYv`(=)8^@S-t#_g8&zR~AwS zY+-@Oyj)bvnz&v+s+?=rvhEVaxA4;voegfm$H_zhJPafY+()wYmxR=@Y(?mxCH5Hw zp|o#^n(yTC6W@*GQYh zTl@F?e8s#TWN4{=X3(?`UE=KBxl;%|Q#;0c-ZMkR6lk2z5m@aN3OGw&qMYC!Vz z#{Ap!4uMo@$l)8QuFK(Csit>V$+Kr!i8#+1FDzy#^IW~r_;^UY)~))tl9UbMq&^X9 znn-5C7N#xMRz3? z&UL+-=ke1HEZnE(rIBwB5n*Q*Q(~JB8KPDE@>D6@T57(h`LI>p!sC|s*RRZ+g!Lv- zjyI4dI?5&`HQkIEJEAmJh73rvLNCqek;0xW|C_ft#mdh%KvpW^|LOW2vk4>Y@b% zZI&4dpMCV9A_b#M{B^RcS+AB&*dj7 ziC!B2JPB(8+Bn)?%}cBRSI`d&PU23&yfl0i{&lzgXfFvcUzstTlBhp9fbP>7{PWcR g|6l*_$^g=^>)BnHn;-@>*=J_R&x152uj=P<= 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 literal 0 HcmV?d00001 diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/point-of-sale/e3-swipe/assets/secure.submit-1.1.0.js b/classes/includes/vendor/globalpayments/php-sdk/examples/point-of-sale/e3-swipe/assets/secure.submit-1.1.0.js new file mode 100644 index 0000000..de741e2 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/examples/point-of-sale/e3-swipe/assets/secure.submit-1.1.0.js @@ -0,0 +1,266 @@ +/*global $, jQuery*/ +var hps = (function ($) { + "use strict"; + + var HPS; + + HPS = { + + Tag: "SecureSubmit", + + Urls: { + CERT: "https://cert.api2.heartlandportico.com/Hps.Exchange.PosGateway.Hpf.v1/api/token", + PROD: "https://api2.heartlandportico.com/SecureSubmit.v1/api/token" + }, + + tokenize: function (options) { + var gateway_url, params, env; + + // add additional service parameters + params = $.param({ + "api_key": options.data.public_key, + "object": "token", + "token_type": "supt", + "_method": "post", + "card[number]": $.trim(options.data.number), + "card[cvc]": $.trim(options.data.cvc), + "card[exp_month]": $.trim(options.data.exp_month), + "card[exp_year]": $.trim(options.data.exp_year) + }); + + env = options.data.public_key.split("_")[1]; + + if (env === "cert") { + gateway_url = HPS.Urls.CERT; + } else { + gateway_url = HPS.Urls.PROD; + } + + // request token + $.ajax({ + cache: false, + url: gateway_url, + data: params, + dataType: "jsonp", + success: function (response) { + + // Request failed, handle error + if (typeof response.error === 'object') { + // call error handler if provided and valid + if (typeof options.error === 'function') { + options.error(response.error); + } else { + // handle exception + HPS.error(response.error.message); + } + } else if (typeof options.success === 'function') { + options.success(response); + } + } + }); + }, + + tokenize_swipe: function (options) { + var gateway_url, params, env; + + params = $.param({ + "api_key": options.data.public_key, + "object": "token", + "token_type": "supt", + "_method": "post", + "card[track_method]": "swipe", + "card[track]": $.trim(options.data.track) + }); + + env = options.data.public_key.split("_")[1]; + + if (env === "cert") { + gateway_url = HPS.Urls.CERT; + } else { + gateway_url = HPS.Urls.PROD; + } + + // request token + $.ajax({ + cache: false, + url: gateway_url, + data: params, + dataType: "jsonp", + success: function (response) { + + // Request failed, handle error + if (typeof response.error === 'object') { + // call error handler if provided and valid + if (typeof options.error === 'function') { + options.error(response.error); + } else { + // handle exception + HPS.error(response.error.message); + } + } else if (typeof options.success === 'function') { + options.success(response); + } + } + }); + }, + + trim: function (string) { + + if (string !== undefined && typeof string === "string") { + + string = string.toString().replace(/^\s\s*/, '').replace(/\s\s*$/, ''); + } + + return string; + }, + + empty: function (val) { + return val === undefined || val.length === 0; + }, + + error: function (message) { + $.error([HPS.Tag, ": ", message].join("")); + }, + + configureElement: function (options) { + + // set plugin data + $(this).data(HPS.Tag, { + public_key: options.public_key, + success: options.success, + error: options.error + }); + + // add event handler for form submission + $(this).submit(function (e) { + + var theForm, data, i, cardType; + + // stop form from submitting + e.preventDefault(); + + // remove name attributes from sensitive fields + $("#card_number").removeAttr("name"); + $("#card_cvc").removeAttr("name"); + $("#exp_month").removeAttr("name"); + $("#exp_year").removeAttr("name"); + + theForm = $(this); + + // get data from storage + data = theForm.data(HPS.Tag); + + // validate form - jQuery validate plugin + if (typeof theForm.validate === 'function') { + theForm.validate(); + // validation failed + if (!theForm.valid()) { + return; + } + } + + HPS.tokenize({ + data: { + public_key: data.public_key, + number: $.trim($("#card_number").val()), + cvc: $.trim($("#card_cvc").val()), + exp_month: $.trim($("#exp_month").val()), + exp_year: $.trim($("#exp_year").val()) + }, + success: function (response) { + // create field and append to form + $("").attr({ + type: "hidden", + id: "token_value", + name: "token_value", + value: jresponse.token_value + }).appendTo(theForm); + + var re = { + visa: /^4[0-9]{12}(?:[0-9]{3})?$/, + mastercard: /^5[1-5][0-9]{14}$/, + amex: /^3[47][0-9]{13}$/, + diners: /^3(?:0[0-5]|[68][0-9])[0-9]{11}$/, + discover: /^6(?:011|5[0-9]{2})[0-9]{12}$/, + jcb: /^(?:2131|1800|35\d{3})\d{11}$/ + }; + + if (re.visa.test($.trim($("#card_number").val()))) { + cardType = 'visa'; + } else if (re.mastercard.test($.trim($("#card_number").val()))) { + cardType = 'mastercard'; + } else if (re.amex.test($.trim($("#card_number").val()))) { + cardType = 'amex'; + } else if (re.diners.test($.trim($("#card_number").val()))) { + cardType = 'diners'; + } else if (re.discover.test($.trim($("#card_number").val()))) { + cardType = 'discover'; + } else if (re.jcb.test($.trim($("#card_number").val()))) { + cardType = 'jcb'; + } + + $("").attr({ + type: "hidden", + id: "card_type", + name: "card_type", + value: cardType + }).appendTo(theForm); + + $("").attr({ + type: "hidden", + id: "exp_month", + name: "exp_month", + value: $.trim($("#exp_month").val()) + }).appendTo(theForm); + + $("").attr({ + type: "hidden", + id: "exp_year", + name: "exp_year", + value: $.trim($("#exp_year").val()) + }).appendTo(theForm); + + $("").attr({ + type: "hidden", + id: "last_four", + name: "last_four", + value: $("#card_number").val().slice(-4) + }).appendTo(theForm); + + // success handler provided + if (typeof data.success === 'function') { + // call the handler with payload + if (data.success(response) === false) { + return; // stop processing + } + } + + theForm.unbind('submit'); // unbind event handler + theForm.submit(); // submit the form + }, + error: function (response) { + if (typeof data.error === 'function') { + data.error(response); + } + } + }); + + }); + } + }; + + $.fn.SecureSubmit = function (options) { + + return this.each(function () { + if (!$(this).is("form") || typeof options !== 'object' || HPS.hasData($(this))) { + + return; + } + + HPS.configureElement.apply(this, [options]); + }); + }; + + return HPS; +}(jQuery)); + diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/point-of-sale/e3-swipe/charge.php b/classes/includes/vendor/globalpayments/php-sdk/examples/point-of-sale/e3-swipe/charge.php new file mode 100644 index 0000000..3072fc9 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/examples/point-of-sale/e3-swipe/charge.php @@ -0,0 +1,75 @@ +secretApiKey = 'skapi_cert_MYl2AQAowiQAbLp5JesGKh7QFkcizOP2jcX9BrEMqQ'; +$config->serviceUrl = 'https://cert.api2.heartlandportico.com'; + +ServicesContainer::configure($config); + +$card = new CreditCardData(); +$card->token = $_GET['securesubmit_token']; + +try { + $response = $card->charge(28.97) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + + $body = '

Success!

'; + $body .= '

Thank you, for your order of $15.

'; + + echo "Transaction Success your transaction Id is: " . $response->transactionId; +} catch (Exception $e) { + echo 'Failure: ' . $e->getMessage(); + exit; +} +?> + + + + + + + + + Simple Payment Form Demo + + + + + + + + +
+
+
+
+

 Thank you for your order.

+

Order Id: transactionId ?>

+

+ Your order has been processed and a reciept has been emailed to the account we have on file. +

+
+
+ +

What just happened?

+
    +
  •  The encrypted card data was collected from the reader.

  • +
  •  The encrypted data was sent directly to Heartland for tokenization.

  • +
  •  The corresponding token was added to the form as a hidden input.

  • +
  •  The form was submitted and the token was charged.

  • +
+

An encrypted card was sent over an SSL, encrypted connection where it was tokenized. This token was then submitted to the merchant and charged. Yes please.

+
+ + diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/point-of-sale/e3-swipe/index.html b/classes/includes/vendor/globalpayments/php-sdk/examples/point-of-sale/e3-swipe/index.html new file mode 100644 index 0000000..f501dc9 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/examples/point-of-sale/e3-swipe/index.html @@ -0,0 +1,130 @@ + + + + + + + + Simple Payment Form Demo + + + + + + + + +
+

PHP POS SecureSubmit Example

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 SKUItemQuantityPrice
BA0001Very Tasty Banana Bundle + 2$4.99
OR1021High Vitamin C, Certified Organic, Sun-Grown Oranges + 5$12.99
AP1973Certified Organic Granny Smith Green Apples + 10$10.99
 Total:$28.97
 
+ + + +
+ + + diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/recurring-signup-ach/charge.php b/classes/includes/vendor/globalpayments/php-sdk/examples/recurring-signup-ach/charge.php new file mode 100644 index 0000000..e76855e --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/examples/recurring-signup-ach/charge.php @@ -0,0 +1,125 @@ +'; + $message .= $body; + $message .= ''; + + $headers = "From: $from\r\n"; + $headers .= "Reply-To: $from\r\n"; + + if ($isHtml) { + $headers .= "MIME-Version: 1.0\r\n"; + $headers .= "Content-type: text/html; charset=ISO-8859-1\r\n"; + } + + mail($to, $subject, $message, $headers); +} + +function getIdentifier($id) { + $identifierBase = '%s-%s' . substr(str_shuffle('abcdefghijklmnopqrstuvwxyz'), 0, 10); + return sprintf($identifierBase, date('Ymd'), $id); +} + +function createCustomer() { + $customer = new Customer(); + $customer->id = getIdentifier('Person'); + $customer->firstName = $_GET["FirstName"]; + $customer->lastName = $_GET["LastName"]; + $customer->status = 'Active'; + $customer->email = $_GET['Email']; + $customer->address = new Address(); + $customer->address->streetAddress1 = $_GET["Address"]; + $customer->address->city = $_GET["City"]; + $customer->address->province = $_GET["State"]; + $customer->address->postalCode = $_GET["Zip"]; + $customer->address->country = 'USA'; + $customer->workPhone = $_GET["PhoneNumber"]; + $customer->key = $customer->id; + + $newCustomer = $customer->create(); + + return $newCustomer; +} + +function createPaymentMethod($customer) { + $check = new ECheck(); + $check->accountType = $_GET['account_type']; + $check->checkType = $_GET['check_type']; + $check->secCode = SecCode::WEB; + $check->routingNumber = $_GET['RoutingNumber']; + $check->accountNumber = $_GET['AccountNumber']; + + $paymentMethod = $customer->addPaymentMethod( + getIdentifier('CreditV'), $check + )->create(); + + return $paymentMethod; +} + +function createSchedule($customerKey, $paymentMethodKey, $amount) { + $schedule = new Schedule(); + + $schedule->id = getIdentifier('CreditV'); + $schedule->customerKey = $customerKey; + $schedule->paymentKey = $paymentMethodKey; + $schedule->amount = $amount; + $schedule->currency = 'USD'; + $schedule->startDate = date('mdY', strtotime("last day of next month")); + $schedule->paymentSchedule = PaymentSchedule::LAST_DAY_OF_THE_MONTH; //or PaymentSchedule::FIRST_DAY_OF_THE_MONTH + $schedule->frequency = ScheduleFrequency::MONTHLY; //'Monthly', 'Bi-Monthly', 'Quarterly', 'Semi-Annually' + //$schedule->duration = HpsPayPlanScheduleDuration::ONGOING; + $schedule->reprocessingCount = 1; + $schedule->emailReceipt = 'Never'; + $schedule->status = 'Active'; + + $response = $schedule->create(); + + return $response; +} + +$config = new ServicesConfig(); +$config->secretApiKey = 'skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A'; +$config->serviceUrl = 'https://cert.api2.heartlandportico.com'; + +ServicesContainer::configure($config); + +$_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING); +$_GET = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING); + +try { + $customer = createCustomer(); + $paymentMethod = createPaymentMethod($customer); + $schedule = createSchedule($customer->key, $paymentMethod->key, $_GET['payment_amount']); + + echo 'Your ACH payment scheduled successfully
'; + printf('Customer Key: %s
', $customer->key); + printf('Payment Method Key: %s
', $paymentMethod->key); + printf('Schedule Key: %s
', $schedule->key); +} catch (Exception $e) { + die($e->getMessage()); +} + + +$body = '

Success!

'; +$body .= '

Thank you, ' . $_GET['FirstName'] . ', for your subscription.'; + + +// i'm running windows, so i had to update this: +//ini_set("SMTP", "my-mail-server"); + +//SendEmail($_GET['Email'], 'donotreply@e-hps.com', 'Successful Charge!', $body, true); diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/recurring-signup-ach/index.html b/classes/includes/vendor/globalpayments/php-sdk/examples/recurring-signup-ach/index.html new file mode 100644 index 0000000..6a5257b --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/examples/recurring-signup-ach/index.html @@ -0,0 +1,168 @@ + + + + + + + + Simple Recurring Payment Signup Form Demo + + + +

+

PHP SecureSubmit Example

+
+

Billing Information

+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ +

Subscription Information

+
+ +
+ +
+
+ +

ACH Information

+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+ +
+
+
+ + diff --git a/classes/includes/vendor/globalpayments/php-sdk/phpcs.xml b/classes/includes/vendor/globalpayments/php-sdk/phpcs.xml new file mode 100644 index 0000000..b72a034 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/phpcs.xml @@ -0,0 +1,5 @@ + + + ./src + + diff --git a/classes/includes/vendor/globalpayments/php-sdk/phpunit.xml.dist b/classes/includes/vendor/globalpayments/php-sdk/phpunit.xml.dist new file mode 100644 index 0000000..1993192 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/phpunit.xml.dist @@ -0,0 +1,48 @@ + + + + + + + + + + + + ./test/ + + + ./test/Unit/ + + + ./test/Integration/ + + + ./test/Integration/Gateways/PorticoConnector/Certifications/ + ./test/Integration/Gateways/RealexConnector/Certifications/ + + + ./test/Integration/Gateways/PorticoConnector/ + + + ./test/Integration/Gateways/RealexConnector/ + + + + + + + ./src/ + + ./test/ + + + + + diff --git a/classes/includes/vendor/globalpayments/php-sdk/sami.phar b/classes/includes/vendor/globalpayments/php-sdk/sami.phar new file mode 100644 index 0000000000000000000000000000000000000000..c341b0430a00e0315438085d93c73c01410a1ed6 GIT binary patch literal 2461851 zcmcFs2b^m~)qm0ny-M@3)W>6aFFm_?@ZhCyvPm|*0Yb`6Z=0R~ihv@Z@>Gyw1Cc69 zlO_TJB7%S@h*Yrwp9ly@m-3x+@67DYZZ?}_!Qc1s-{j@~=ggTiXU?3NJ9EH((t5Qb zjb(~buGknWr^}Kfj>7*+4?R>ecIcReD{_@+jZ2Kh+GF}sYb|_<-*3ogin+0LtyZqC zlS)&WTDl%v8!r{4X|7U%C)Q+2QlMEAE48HXd#NOo96KbQk5;S4aji_XRy|~uD;=$@ zTD^Mg1PT7NZe1Z-#y<{OmEe-mdcL-{%>UqUNrjuOXDZy-D*OUUTQ#`NY&Aqgshe4N*N$h%(;3_X?f`k=tkQm6T;w50+@XR?3&6iQ|gV0#_}ABvqsc zK*1;oV(!PcY)vWl>qk+pR#f=#hnoryBfg|O{#yF*LH!=)8xGnB37*{bGkocY8(QIO zD8c^y2$Gq+AbW?%j(F_TE-iiffPPO`YtdRJj)gzGRwx|t{nh{6i9X)9>J=`U$A{0} zQm8tjD)Yo!^x=Jblx;v$wS(@t3O@S1J%mRQFTMMDCw){o_h>91jpveJr@Y-)6FI(9 zv2US6tSMJYtv1r_zl}hL_~5O2E2T5^qeDy5vqJQhOd`ceE%io8W#l#&s)2Zt=FVei8M>j%@Nm(1Z3>)~m#Z{{7Bzz}z)pm?=9=eOKadSUUeDwc zs0=CLLfp;UxP%HSADqjO&u~Jmv#SNc5HI`dbq`XqBZnn3l#0nrst(>eQ!1jE?-Q#- z{K-#N-cOl_(5I;t=gP<@)s-{s1Cncq4iHa#=(HOtxpi={8J|=T-BhWRD(p)vBn@QP zXo%Nt^-7%cTxk)_`zxIo7t)oQ@;b$1J)Lu$u;_M^Rf0585{^ZWjeu>iC;4>Lj zng3&6vD=L?J}Kx(*NA5F(O8~i-(o2lQVQZ%e-ii%EyXlSDKp6=L@wP0BuD{>x4(Vn z!?b{zQ3~*INv^^b<6O@+FOs4VpP#yYcUsg)b@9}TwM?PAE~k{&hV{3s8 zF|)-EYbo1?q1lMP5xL3`ag~VEr*6x_l!;NetNduj5eJF5)iyDvNbT^H4z5-a;-Twc z_(g|^82;vE$59;&F<20dN(EATv@MK}MhMW58S$icOp>* z;$Q4<$0_%^;Z@;*xdFr`$QmHlh1fPoZ>Ovyv>ApwNU0-&B0m21g)dXeAqI92S1#fF zAzj{yv=!nluW#}SC6f+ZYu1sz1p^*74&qPm+)$)cqNzx4$BQ!xh^7UBZia%91+no* zGiwIboIr&Pv{^pMJMTiYl1r4DMF=*9FCFBIwV5IxoOcKx;$D%xo~2TWT*Y8~pserB z3bG;I^?~*&$|dS8196#J5KmG8uOk8?wtxTqDM~7Gjzf@wl>3}4NQwCObsw@B#d;`! zc-w&p=LT(}N(`g1X%K(@#!Y{vk`7z_Ibx9ZCxjHSx!tQQo<0~p_mdW)=R|>bxj!UM z0rB1+aBTV|a^S^GE)(bNr5vr`bUIau7Ql31G9ANs*~Nd$&tqTROQaTJ<;{>r( z#0%szmr_QN%N$Idx)|ml;{2Gs*S12BMZEp}vYL_(U3D`MmMXkDk0R!4uL)`7ow^+O}xOMYvkWQ-BcqcJS2oZmI&7WCZCCcM2VL&{gsa59fF-O`J@grAx z1FfxYD7``Qrd)w4SE6lWreNk^o`m*TBC;atwwm0Hk`Ep&Fj)n1YmMVa2_(WUj(GS^ zUz()EgO3vPhRMK^x}Ma=N#*CZt%p8TDk?ng`b zBq|Xq@kNL$QU9&XOp7oqrxMT~<57Nmt&tiazIfN`2UGeD%b_=B8rXkk2{&TvZ>Gm7 zw|+U?j!d!6PhP5o9r1-<{E>N*4a;H|B2Ka75$g(O^vmO}^NV0&?kC$Te?hgPTaMhW zyr7f{kf3KlJUUp}hLSH!a9620zd0}3{Q;KCURHPVrZdT!olEk@DDF=CU9-stRQhFg zC%yzvCY9!k5O*iV-v47ZIg(H3-45iNQ9BvpClQ1HYaB>rAH`4VGsS47E%?b32ruHd zUcBjD$~%fqC~qG>IrZSb*eb#(4LiSxg?{p~@~&(y|4CG$ho5|J$LCmbZ+S(ON_j3? z>@l8f+~vn?a<@D^2}LZ_)BpbV0t;tEs}qApN6^NC5kZh0g|&ZSJxbief+v1>EVZUl zMiWs1y+)JwwzqtN(vRYP7=4e?PzN4#%!scZ`PBmDpZ)~+XDX~3Cz4_i_jvM@n`kl1GEr*+=DL}< zpeV5gz4*q-3R=Rl`We5n8O`_TXV+}Bv0kvON{}KJ_OtVk@UzJNlc+=wf3(tm;$c)z z%QDxV!OtJRvfbO1eZz9h$+0l_xnL7DTY6g__rl<3FU5GC%DpTH2MfKd12jMZ*v}9z z+wIIFXaUycCH{582;$3zbu1FnEvJxPA>7w@d$vq#uwhx`3q!d0u^+SLv}N_I zMMJnPt+z?2^vmj5i-&M`+_URRw1{Q7YHuM5si+06dfQ*V{5#6OELTnV7je}W+naS- z%<|fT-=mn$@KbDYto!OACmLx9gD*;m$25Ls4Lt!zGYtt!5iMu__j}7?76PCi%m>Hr zWQnlJ5v(8f%kk1`iL{9Rr;oXhN;`O7aZV4&DI|0FoQrr1(PpQ7cqXMDMa4X|9<;H5 z`74ttHj^7!Xk)1k8+-Vv3g{AjWCrkOPhayC6?&985HB<=0r4`Y2r=RZPixqo#0~Iy z*dU50o{424J!KJniyCe*>_VS67>>aCZ{umhjZwuyb{ zrHB0O0;-3RByL0nA15cuMU2`0^YdkqwlYGGixX1B{Ws=0N;*m+2A9kY5E!71olbZW zUw+{Xw$p1AUTZO)uP21g_9)>+JjHkY6;$3)oR1YuHws%HOG)0$&LGr?FRkC}x0HGm zb>L{>3t@S`%@k~A7?h6E;Jf4fJ$$aWFvMsSUEV+I={(nJx6 zZ>)dz*Hpcugi~JF?3XvS1aml?5F@_*=663!iAU)ZUj7Xp+9&QN%!r0xzq1cz9%Ys$ zFfY)`*GLhFKYZZ89cU4w*s_nSU@jAF`8$Lb@zLyWU6ghdo%oTIrBpP88S&rW3Ee`O zM`=c$nNH}{gc$MhhhBM-5|1))1frD;?$1Y6NC_|EK^s>-L3u|JIGo|~33H{yFHegF z4meI?D^#QOL7tfRnQbC2;;Kvk%64%LX%KW58{HrG8gyZt%pm^x(Z?C>kQ)kcXBaAV zAF^cz@%3#sY(})-*!WSIg`wA{EGA>(E;KM_s%{**@rX*p54REZ66W) zw;jK~UzqX^saq!qjMn9Amw9D~gTBCS?=j0Ae19k(rn22}j!lHNLOke}Kd=`DhTKi! zg;aEuPt}Nb=}PZ^i@ljLWET(!rABAH5EF7hKO&MMnr~LJB;1g0h7g-zeWY9!Odw25 z0MY%-EL*3-stggO&tn!Qv!G}`;URu?V1;4(v#B|ZrWX60T9RZ2hxpR|lgvkM7)f|X z6y9gz=d;-J#1Y_!#tJjGA;%=5m^p6I_TOtkO!O6q-`(eDU!i(2E>nD|F~ghVPY6Ha zv7d`3DF2Yz?S)k^lQ(XDN(w;S>c&UepelObYmoK99tDtH$GoS$iIjr4!&4tV_lZ@* z4ljOTQ;Vzdf7eZ3NDEkYQ_t-gzK+xZQU2qteng8HGKsrTQ{7vLZz07Xu3PaPwkWym zn#^s~6&vkOe{=aev?ilMDbEHcy~UiIe5?@{6*M^108z&o8BQ3c{TcNt%!bVEiB zNGH|9!fB4TMez{yNXfq$WgT*|$+JRAQJ8Yqi4R7+Gx5RplynqP4fs|SFY2{~6>*o% zCfQ&#?3jTHm`n9xf7usyRHNTQR9z&wm&!Y=2{2|FJncw^ImFkb=bTE3hs-?)+Qk?4 z=Q`jaTM9BGei&YFq0}Skm_N1xHL>?r0xRMNr|)>kvRK)s)b*t05LPAQ@+Ys zg{;|^h^&a`=U#k?(vBo6(DDk<5mLm-UCK{W(ox#V3_E*ZX2J7{L%q#vPydDT4w>EJ zbzm-4c+QQ)Dr3tcl**inp^W(={-){y`Q@uk#v zZ>GG%PRwweq`VZ7|16>k#IapdY$0S62jSsr^-7U9h@%KC;s@LPlcm5%acDvs74my1 z?`eb>@$y}35vq?-#?PjRqZGeoW_j*Lri3B)-S8tO<<%vkWlXRO$NZd2dI@5_`3y_(z*zx9 zM|}%Rkm~Z8D8DAVJ@KK4=l%UJES=&0WXgd>nK%bqKZTvckCR45yyrUx4{eT-8W|6< z;v4yEgcWhq=MHE40Y_`(Ha{7|4kVWLn#acfupDXUHgkwqK5yFj%D0xqTIGmAzD0C^ zc-=#PIEAu~62bu`uh)MNPQ-IR$RA2MM`^8K8sY$+^<=_|82#0ilay66l);H#@3m|p z3@C_4{CLIxQO4mi%*J{F-j&97pWIR4LtKCJJ6lk`;l@1ZbZ|%+oSlG_8i_!O_(Nrl zZK>WcRHYdudtDy69{~;=PZ5v&LV-;+hD(SCGSv*c+l+)ek`_Wd?1am4HVhHVhiU{pbAbRIz`;| z+#j%f+2B!{z$JCS5tx~>u-5hq5}+U+|HO%3r+OW{p$MrfT~?!%FR$2yZ+XQ1PB3+r zLpXti80VrXA>OK0Tto>6w|pX@uax78{P?ohc0zL_K7HrWEQK?;V-hIEE$sqdfnp-A zHr~xL*u#n`dY#`z+6J+5$YCt&zF~0Vsc^Mg+XedpA>5Zjz*I~`EBu089NyMLaS`u$ zA@CU0>fi}77)9r}#hN&2Pk|b7)#tW)gi;Ug`rs_Z3@k2o1V6=KoU4~G zfmo?j!?Py%$<66Rfr#54wU3gL^m80FIHyVqeVX*0x#Mu?0ak6|*$_{7v3dt3?HAz8 zBPD0z2svTO`wSVC5dZM68`zAgpJ6V-OH(P7`ZkieMNGW9p6w&t&_|hzP_w~~a-T~K z3h~|_)PF?Iu-ozwTS> z?jzKkAylQT?+{kRgRlKEOO6h26=YbT#CsAABOZ9p3ww+pt^rQNz}^je#VPAMBxpta z=nH{eDQmyk`8*{cE7FMvgwGOM#8;oXBSmTZIok!a{JAt#&_9v9C}RApwHReI58ji- z2f&DqYoR5G4-&lUsegZ;me4P8Gf(EO66l#Nl>fgVDUQF0WB=Td`J#Szh_nuJtvx)48{yV<;5Tzf&lm*!tefJ1;B@rL-_)G6&yDEk- zy?Ojpawl;dh}(aEs{oZ;KZ;@&4B1Vh7sMTZcO~oML$|3oIZH*qgm`|$$1mEzhSnim zDJq4!QA&H(UP9+Vv;Bvv?U4wVPKqh>*NIXPPuj|J57qP#0Rdsg znK5O34J;SkKH^VIm$QRWM`E4m#k%>bK&`t0 z1zsxX-n$6ZN4za_{ZB^`R6OmZycd!&1@WztWs33+5odMJ5h?M?odkgqzgYS^Tizcc zlAS-Tqtus@lhF`Ed)~uBxI>q6Ze4S`Bgr%jF}2m%m(!XbvINUwLD|Kv+G!kHwM z41bpa)^}^t&WI=LPi7k#j{f9JwwK`WE3#H|3K`uHpS|~3Ep60eKlx(kx(?QNC$f_X z@v7b5WUrG2KKX)uQT{ByXGkYSocQAJ#%WcL|5QrEqk+?<3Mo58>TTr8uyBSqHj(nLCgmf(b;90bwEXC&Q@*JcEkM?q z6#gEG4H5tG`~w%#!as!$4JArphi{IQ`~vA&i0@zXXEt>^{?n;83AP1OKZ>M35Dz-G zau%)iai31vFnU8)M<{v&v2?_T-aqZjwCLogR5Upz7>@`i611Qsw0Fca%+G8|C5U~x z5|GkoN$H5IuetGlT6*f!Ej?Jt)Tqt3i3o^~D+)iPA{_teh#+hTA=N*W%<>R-x>5cN zE&Ed#PoPApm!p+_k90T0>LZbJX~Cb8$$R0Pd|LG7MBj*O$`@y7(VvpOy`_4EmE9)Y z4N?8_pFzDrB~l&lPPB@y$^ zlY$YIx99vYGvH*+xKvG8s5=j`Z|I*9Pq)7P6eSW(LkYt|B8VXynK%dO z{zeAwNnptuj400`ZG-sKLszgJpdtaQ?Lx9tY)i|fd>d}@$*(EkQR|S}mO98ENOTwE zEKxunGh2G8fE(s&x;PQ;7r_2mmDY=yM6?!_=1Wbkg701+w?ZdyBi_E#dbX=;L~b~t zVvhS_!i~87Q(LnP-r7Or?wT%Mw}T)h;)!Qo`A4b&(R7h&AOW{(q@?6pgq>l2A}VMe8PuahkzC^9vbwB|$Ud)kp3q8x zgf7Z2fFx)yi2uH#^mi)Z0F++X9|qAtf>)#{ncydtMr>ZOPmWTG(oKs==`X?^wBRrk zbaA>%R`Ky0KeC)sq{O1E@sh;Ce4&f>E5wixudqM0j?ymL@7U9#8xpR7U!xuoEq`3g zHaJ)pYw0-~WVa&V>rS-$EcjC3PyPY4Ac8@OF(Qn-WzZ{`yuuTT*Zg zUciDTTu>s`q)yTxi2urNx+ks4^auqBP1>`V2T53t`108gvz^)pFDxbwuZ6*>zi_{1 zIS+@P(nQemG^(qo94 z&oag3%Oa+q5Fdr8{CR;*aR*?+Lw7_>;y3jUJT=5-Y_i35Lu&?^v>bn60KJvAMAmZ< zr~Y-?qqKfK2F|(q@%lDF3{~T|oxKRhwr25_= zriOUsS(oofdHd9pG63(~pV*E++)|Jc(f($Yy~@;MaHRE|BM@oM5&5RzUl*Ufn%q-U{l5VtwS&GJcu$>@VL zb2s0wJ}2-Ye(jbW*lzqD17i;vLxp@d-46Q*bcmasxp6W-=PYx zCw>qyk~@RN7CmBWDqa^KBf6K2g@}J_J<}3dZ#e8#J7w%KUNae~Sk%eUVT%oosKv*K77>5@&KM)^5nC)IW=vgu zB}w`U;>9{W+wV1ytkxo&K$l6t9XI?U3@ZU;y^IheKK|hC5vqh9vBg4J3GocSs<9~T zF2DOTTYBqb=j{0&7yo{XNQwB+%rP955@K~a8J+Jc=IDA|Tl*bCi1_3yhiNEbpN<2s zixx06tw^Nd^K~`+nZ%Y5*FCp6%Wn4Zyo(Zh zYi(hBw|z&!Z6Kbxaqv@VT=N>sKJM2&v776VnBZ9bg{qAgo zS05jMVFWZ8KiOn;5Wd8AYmq?`(Rt+)zoeQ_EG{c!6xQ=fl{vN!kq|5I$cm3&FI z9-=)-$PhpL%EK$EXooCGHYd>M$heJo`rSvcbm7th2^?MR`XUre1C@*RxbGiSpz#3( z@^bu|YlFn5h_5NHVJ}rKt#WG-x}B~G#{taMFi!dh;_L5jJdp||y6J4bXAmC77bhWY zQ=Oyw!`4Fm5TlpQ9gEv%@SCGb;mM(T;dRD+4ibnEPuyF_g8V+tZyu4gn7~+Em`t}| z){A;a{KdEDj>G5^$Pqd>UR4a?;9MR558@8wLfl6G?+L1|K0_1X@(Q`Mg_K8=J%)&> zH}z^txoSzX@X@2)ZUqxUsSxkoET6b3j%5IeK@wc3fF?Qk}gWNAh5G+wTZ zSDXq;e~1`6qWifhn?W5mSgn|=-Ir(w(e;-bFQYOYx;PJS=5XkCs=@z-H9H%2MWBKZ zw>(D9#=kxaqAYO98>5kKBhVn;ZCdvOD$K!43Bwrt+X@VbKe*b>wl1$7h=E2RSf!n} z5SS3}dgin2G><+buuvubzq}Xd@=h0m1gIj!)3ZLd3f8CbMSMm~zhvm-cdOk6E=2!} zSKUDM)W@laxVpp=?;wBSjGI|fsE-|qsD#K0)wK^%JmTrMUj9WYQlB_L;DJr0T(p2a zjsM&w+`~j?h>!nC&(>9z6i(Qw$`hh+aWYgP2DiHXV=7!9eF=$UIuDskBi~1yFyhwF zoqYeGxuI7V{PTtfJWVjV}u2E_mAA7U?!^bw128HDN49M!kUK#I8Hu!EUP?=!dT zMb)MK=ZW?aE6z7p(5m*)KHW92XL`Bg*7sgG4S} z99 zG2(F#&z%R*rxEGnXsF2y2K+Fb(l3$oUt|)AcobR8j(IOrGFsL5kxk`|4#W> zj<*jFKgN*B0~>EnAZ`_L<=X36|LJ4%0uTS+u4a6UG$Z0g&pnW(RqGQE5h@{6U^4xU zWC0OdZ}0PCN^}4iK3PhfAES}kIzO!ciNxrL|9Iqh_D)%!a0+)*LewuxjtSqOrpLDx zoIBzPcbqy)rRk#~LPxSCb5wF78REv=er%az-NK5&@*`JmgH#2$eKpSUGv>L!y7ZnQ zegW~ov5%Qo?lG6_$!dn8dgdj5N&F#V`ITdCqBZZK$ezU3874X^QhY-E$sZiR4jnjR zz}k!Gy6S%!sXt=&$)L7pT?{Zi6KRQqC8(CeF<^*=0`qC)l>EJsf>`dnqx+~g9sg>{Z7+; zl&(iUWT9lj`KH~3Um%2t=bS#)qJ%xd3qr_DL8^=6Jj%!w;nZLDElPPBX-LG|@2Gx{ zlJ=OcFCb+^U8W&s+{e;cLm9_M%{}lVGzr9SSI%G_7M#+2FGQrlv$62W zX<`S6*}q-Kp6oGcB2U82$NWq}YN%Ihr2^O{d_liN%45l}fmr+Nbu9PY({u0@p-)TE z8a&Zrid)Dk&S>84Tf;KoJ(79z1%+*#we%viuMxk2_?+y5&8XIOi)xMu3(bf(Kfr;p zaIp=n!7h~fKSa5RcYOViY$0}W%VXr&aZlIOtzIOBOeZWs z*B0`s2`}P>uk6cSg&a`WBD|cokhDV7i&)!guR0aBN0MfKt1Tq^6_F6pbiwWH)$pE! zM|aKXyDqMHrH7PK(oTrC-M24W=w009uy%4qYw3lO{+?7D@fZ7C#eCQRl6ts!9d=4J z=In}=g?(#lh+(m#Bi{7-!)H=`4$!x}aJs-EoghUNi@4uo=dtyN#XUHcN$M?CYWxI@ zcm)*lFcPOBen`}UD+km}JQ3n}|8GF(B35g+;0_;FO$9=cmd%->|mh6AknIfM>z?1q25 zPU(8MxrKBtK^f*K=(2mbYLPJz@rnmKZAv>(^$D#nQ{ZQyUGnY=nNHLz;@Yk6Vdt&( z=sFAK?X`MwK2ZSTkM@3I9hJ04I%tj%`V4P{W;P<8O5{R3_loQ$l;&Wdofnr=8h*+z z%+jzWRuKk7Uqj1wUGOK40KWphG+7{1{# zDXmODQ8H!Nw?|*5bm1ptI)zNd5MM|u*_5tF*vCZSnRte-9)%ZlVap?K_MfwuYd>^x z4f7;Ye=*Zy0-Z~e4~XF}UU3htT91iXw?IK?>Qb}Hh!Q0Khq(W$ef~#@_U|LkoQAhM zTBr=--p}PE^ywZkH4{U4nw)`v%Dsaq7x6HQ?^a5(YDp3NwM?FGA2Ya2R4U>V?_b8U zO+Bo?9WCTB66g1&z{?uqeIO6+D$pSAVtkQB_dVi4o@VaUt#86~4+TK1p8h!&5AM6L z4*Zj*D%^)4?2_~l*%429YsGoA`aNt*c$Cc*vG^{pQiak`3dAjcv@?5mO|_U5jEd28 z*=n5dAzt*^*I8<}N9JvwX#Crpj1*hhNUDjrBJ`P^Xf=D}ZRTVa&h z?_w<_9FU4~{0830L>(deZoiskLl%3IuL-|{v1S*ZMBHcJudqqzejvj<-^ka%UxfGj zXe&QOs*k9CX71D<*rn0);V_sfiu+|^Scs25d=ooQpoe9{uVKS+ZB49_Nu*%!Hoiyc zAn#I!Nb!h!Jaj2reD4vZ&ZD6(b3u}8{{Gn5E`mZ35B~P0zJg19=VB~K_hazllt(J9^QTs zozZ|q?~%@c_>aqMY;GY6&w3CU;4F2xSPDY*xzygXFabrMj`;N#Z~Foj>5w@kFUo|v zLTPp&(je~sxxJ339EUBQ#{Ws;A;jRlt1h6Dh7prXW8blax8{Ru=AYrmDfEXGQ)suVc0ltOW5X%}k9_ ziRLSPYbfkFnDaLsqA|pMS04Hu$~U0Kx|(t&;X?ey!O=S@*Ah;Lb_KGt%`zs`5Yh0N zJKv%#qFGOm8j{m>h=tA7PkbG!`TD(2r)-CVxh>wSaI9oql&xQRN zF%ZOC%yU~^_V3#~81A7)cGyNJ9q|#1XPTDYzZ&>7o}f|^h5{t|JP`x&KYO)yr$qh3 zJf4UhDkQ!!VE=~>I+k+u_t0}3a8?mlp*I5jln8|Q`Y$Kgrm+4aw?I}(@J6?RG!3Hq zIL~QRp8hV2r!b_sc+QLK9+?`?bt1_XAU^ZLsYc3m5O6Q<9(XPzzkrY<^+7aj_1H0# zU;qW1;NDRFyy!>CNQ0>QD9wEO0IfY29ARriG{hS%;u#O!Ql`T6kJtFx%n{A??sLho zg_ytcH}6oo{$a!dI*8p;MLbawMf^Jv5%JjrZ)PE7|M6=+rykxx5w3RLgXj+N>8np? z>4D*76!@gN1m7Ol5*ZO|2Wi>dXf)0u&v_l;MBM)Vs}oe0kWyR9&_qo`2?{X$CJe_ZZu2M~+H zUAg=m?gk<;V(hSQvv6jlrZZ+5XtH8+nA+%M$pF!cR*!&W5m8OWL^YVHrIA=iY!~s_ zE0e4*h?ZD~AfAOgqmlJ`q5{MXXP>ta{xg6@^k9Mg zv?LZ1x7o&@IaqY8g92WIPNUZ#J5oAr0>LY&R zGv9rcvW_(5z$-?rRv1;>2)^4PnL;6Hqcj^k0zehqZ z#C5M5*~_nrp?r)1Zu~^0{&%HdQ-}xu>hYgZDTnh|Fv=$Qmpg=UW;GeT5VybYwQDJ< zXccMz&kCefxH^R&ybmL7kGS2gx9&qiLP!Rd%Sajw@x713pP_uiHIBdsdAej2 z?)E`-ZXnAGh*xd%GFvkquIBWR5@h@bkreUIr+HbRr5>ueEnH1ktMQ$4HyV*E5-O5{cS_ob4*Qs&_XO`aJKHsF0G8QuR2_`ho}-f9_?biM3fgc32a z$;Dryl*1YmEHustGu1Z;BjS7auRD-34(HhUdV67lF5D1#08u95Q7_(Trld+JWbk<0 zPiN@jt26KV*I8#!y5ZV}r;|E4J_&v~sW#$y>Tl$iMOor~x|s6I@pGcfp>&n_kX}rA zM`!EPDCGdDA#=W7<)?_dlD0tH`Alz`avZ#LTfockXvcPvN<=*5iFbFP4ED8trYB-x6PAU<){i+`dd z1JuP@2C!MO1hgH|F5=eTYq030|HcB|X1(QToP%(H?}0ZHNf5W6bRSP8S+%s$ z;l3u+Z<$aarhQMc4mbb>P4hfN!bQZJS4;1pQY@`p;T6uVbqS1JaeBzdu*%CHqh#Yt zR*799g4L1|nGkRN{8lPTv$Ra~#t_kR^G~)HWI}x9GSGQ3p>eI*caX<&JXdzY?3Wv4#R2Z;PPJ)=SjqEAh!Nue`({~a`x0S{|Q!pb%>wYC=Q2J!gKHeq2w|A|u9@_LsYCx{&*K78==chiRH z?*mA;f)mMwB{_b(EQ;qKbco+LTeBCXGr;G?W6=3@kW|y<@g(7dFo|dM;!$%#(b$C2 zn?|K43-hdiACdM)T=mzlK12%`Reo~tDBWweBQaUTJ?@dS?E|CA4~79->uYT$|4LE- zqWk3b#Z>+cBPs|E<7V7nB)UP=DgVnBDEgb;{I+$K;Gj)@@~0=>9r4xGe_?5!{t4dR zd|fvEDpVE+BE%<+a<+KhKeqDnr+3d~p{#@jam&5$XX8cxV1}@WHhhS?#1VhG>T|S7 z`bUcb56^E5N&YhR44D#VvA*zJ9)qXYU^4KMb_roW!_GQ+_e33ncTlx7z5O?Bknd8J!JSgvIK{ms0;D6>%aD8O0`7K6}2GAb9{MQ!L$%F zd%M_XmHwfTSXt&useqO)K5XhMSEpE(VQ@i%)vEoWtopJk=8@} zp)zs>Rny?6AWDEdLz)j!^34cKl0f3OMBJmSx7aIz>%P27j#PjTh7^Un#p7NA*Y=<*5=m`SY0#A~fBASA` zSt;W#@R^M7QP@D4hxak?=U*c~NBp7og0=MLFxg%K3G)o@JnD7s`&UWxAnyIr8*KUZ zp!v_yw`%#(hXqC+KF zO{>W)zlYYke9^^FDmECRZkwN9P6_s!FAapZ0vBrcMp6ev{}vXOk7w3SiWOoQ63TRy zTO@%9;;$-y{~s-Pzj@^n24AI4j(5T0uO$y7Dqh@$%@hyp{V>@}Fc(lI$n%J@u!$|> z9?<)FS3L%k-?_(+Bab6K_uj-Mi^kq|Ms(ef8s-uymH zYc?n8Ii%Aee&4mn$Mnhh1)?rQ9Za#mV1tN{%@&RHF=kDo>v!q0`P^4n(+7z?A|^k3 znuRjpvH{}o48_j)(6d!Fb2!VL=nr+#jd|(d>!B2EQzdv~%@!FqLot^4W2Nh2V>{FnW%qfaxtnftkP?oTXt-PS_6h$o+5W8pT2 zSETt0B{)EgE0?MnJdumNEbf6zlEnXjY+DdH5YPF)t-nO&VE%gkLsHn_t*^&(98_o_ z-8rPUBmS-M$mx_0=M}w$vt(*h^;j=1vEzC1lnG|(eYxz>o?N?-Y9e0t?d1PaxtJpn zViY__K9l4Zg?~aE3F4No9?niffGiHJ2}U*W1V8$tE*~Mj0P({IDr|UI_=qpf39lS{ zlY|S1=8Lyrjmbt7CKvw*nL~(=tNX$xyKPBpv+ybUIEr@%iF**Qe)9e+=~MeIsF4p| z@n)}>;iLKO1e-&A`Dc{QwBRhkgCq)FpApu?tI+-|p?7zg6L+wL2u z0^p92C0MFeDLXP@4PV4sxa(tWyjp$2C5VQ2kK6noOx>z`%W0@EjZ4}~QX&4=Fn89IdP%8(EIV80D(yA$wQ~4BLU?FH=sAd|y*Ip9WsTtLDs#KSLgZKT>4jUtQq2f`!( z&$a8ef>ela|8pC*%(1j{fa9q$NnGe?7xG_&;Q{Rd@$k=mW_v2p(#`=-m#pF@5?-21 z2oIuS&s|vleQCR5Jc3<4Kn5Yiiyk~`4=T{oM6fbfta8yxJS|8>h%NzKaa{WeN`$$Z z{+14}FK6JgG;FX}$xw~B`Qz7rlaegm<@m9N=h$t3LB)vg*WPB6j->@D;4Ugbkc)N} zNDv(#-M$|cWa-xChk>lX@{a=q7Q|I5=|PlbX;DOql@Y^3{9Vz+rjUD5#d;yogZFFk z-Dmz!9JHSxt$}#kQ+{TxF#HRxAv}cFtg&adB?AuPd+nR|q0+MHlkg1x->xa@*~B*? zj-R^w;q*Z^wIrHK}GXFv>e|XeyDFJJCN&pvir}A7+j{AuahzW2NMn zK{w_pm1<)KSdPym@%kFB3ctV~iM|@cJCeteuwXIfD0SdY=IB_o3XiWF3v!7uXQ?qZ zrWli{*2xv?Wa=@6Os*NTIDCZ1m(Enj;QyjyF;;A7ty-oXi;D_HVaj}-p{rncy*yol z3|EF1YwQq%ZuQzRh?}e27`zw6jbZi_&-ahRt0(O-SnsXCJRW2c%etyMR>3-oi^B>g zVQvBxsSF&Kcy3Z(kN_%a69ba3mCD_yIV ztLvoFbZRa6$=XsSC9S~TKp3^EQt~APYWx?{O0>BK3t>TZm263o79r-uGnrt6R8tzO z!y;IwSe1&UBzm<%jUXa~Lk+6DXyWRjxGs|eWXIbN#^7iW{7Hp_&m4+Ns+QnScm~DQ ztDv(cyeB#a8)Ncg(lL;L`~}8z9R7LOSgFGQ1fK`Z=wQ%FbK`|l;<#!x53Lca!oA;I z16m9Q0PK#O+30rFt4@c{22X(e63;v9~|>e=@e?sx-t0#r-*80@yVz< zo=j+>nhAAGshUtHlnIq)f|EyM@+2oqsFm6YPAi*;$tD#tjeJs}oYcmnQQ0I4A%QpY zGRbIbjNe7XK^Ky&pZ`C}8vLK$WU)HO3?`4yYPK45J`?|~#9_4>tww`ES1P1*O{-p) zvYMQU30bG3bLvyM*>o;r(Kcmzo!f8L8TB&`ceQD7hm8TZ+hS_k0{)K4?a-+#I=SB@ zF{B++o{(7{4Mx(O(NuF7s{B6~T8~fp)@@FGPdRbix9kLjhUT zqHRY*9<{`wSA~qeoXTNLwH;ZL!f7Am@kAwsg~WRs|f#4_1R49`;=c1$R^9q7}5nt>L;RRmjMa28+UDwq(MF z^u)L#o#yQi;WXgV1WV+Le%AHAl%w>btgvcNuye=g?nT(dVSbrHf0M@SFR$fOb6t$WZ2qi7q+Ww4}ne=~Bd+ZbYPE)~-`bTW&< zJ8SV;V@jjjq}RLsI_O1uojE%*%~d9~T8&)NNlmNG6G5{qR?MnwA&1Rpa_Xj|-dJ&5 zkt@t_ep|>>C`farggToJYQhtKry0q>J*)7A!xUj5*QJuhD#Zfv&Fc)GaGkV{MKN=6p~gZC))Ya zY;<~xYcV;E3muC@I7rJ2=Uy364jW(mX4X7<%mL+iWS4P zxWXiI8C9QNZfnGp?vz_*YFRqEi14h#XUZk267j?Sg0_(`=#6fljx#r9>KUU>?J$~J zj;yZfFzTc5T^qiG&nfnu!yIoJIyxJYO7yz0PnWZq9iCj%ESUSWsimKaS+tpOu;q&e z6LqUat+0ojX@^JGG^Y42VK+4s-k3rw1AnD=c&bec7_9{SGL&uWe%Q>ag1tL4-}u0{ zgYjAQ#wPf$lxbR5f^ooYj7p64Xe1lgWL2{9>13nP%BURq=y=&WB{j`f?S+8J?bS|N zTpm>+QRuWfiB79#ogUXXGhq!JQBu%FqK$H^E%UZD)wskrrJE}GWYZ3ZERgj}Rmz0d z;n(})6X3^Mh6$x~Chwgro3$#7GT`(XW3S*x6N6gJ8Bm$a z!HgyjE_J5Sw&|TNNnGxQF~zU3Of)&CJ!sd5+v-cqzCQ@Lo>=2vLkonlp)u;-f| zwJGBdI)YqO)2if51%o3Mnbw*uv$l?x=cG1cE=`PA z+WxXuno}EHx|9R#*phW;!8-|qXTsPt>7`9Kj2z&IvN{)U8dDzlVG^8}PiNG*r=$+O zjQ2Ojlsl-`ds3Vt9QC*rp>`?nwku_(j?Y_?N;_Kbf)UDZmcS4Np3tO|7hT1qNvn`q z719a&Y^IU*nWv4@@}#R(EgG7YhP%M|C$yE&Y{}!b$MS~hnNB+^Px}&1iy`J1Z)%KL zNm%ZWO;#$6im#YV!CbPs%E)jy4griNzw(?Y|9*O8RsHq3cuRe?@W+fZqhxhaQUqt5y(TAyF)u4v*(ZLPr>Bq3GE z>-J=0shGnwR058v5cNM6stj& z@@K6rQ%C2aZqop+PvrST|K{+~f0GcO+MG(qoepCdTpomN#uT_hT{DQ^WzjW?zRT(z z4zI2`MZH=p!JL30G>dR}LuNN45 zbw+S|E**x!?veri*6XHYE}Kp>ZZAxh3jTnhHC-LI2D~wY)+tR-88s49#bs}(63JF^ z+#;K>Hbc&swvseYC}%>duq|xMrHyi#*~N`3YvXZMrs^-HC%m(T;b%}#TUVA?Xt zmF$&9sZ*9zHSM6y&4s+>+^oJmE}JTH(oAYxt}8ZU`AXJY_m!#*XV_ckYLO&ock4@$ zWGI)Pt@-j?#^|dyrcw@rEn|vJXPpx7gg2FRx75C*L1m9u)9qTI8dNINB}2hfN)~;2 zQ_*g-Ona>MPQsuKMLMqHtgTt9#MM)lqNiSMI~pa`v{7bP8|)Havfgy28wyKk)(noh z9rnyvLpEtD*DQPTs&ce5J6?fV%B&$;PBjvpNJy(~&jxkAP)et7`zsok#y6{PI?}q5 z#vo~@T!w;bl17{QqS2r)_=G4OLN&qDk#Nl@glj(ZdU~B7Mka8N9bE!#amuYSNz5s? zzc6l{3Mk_7sj7ZfUsFeFwo*;0ZAQ`=Rnv*~f+vZOvX#=RqlL99HciYujFc9~mJu$5Ooxlf|eDrl6CkQi)Kc)#RF% zl0}&>$O;){QmHRk>{*>tvS8Xo{B9v^_N7~`QeGAHOw8z~>n68-R%NN$WYSY&GH=Zb-u zXv15ojVm)+2u$_4xF@cwWoNP~d(rOg6_DWVh)PULBlrwz{8 zqFl^5&!1!W{JfM0H(AglH6fAaHpG&th^^F7XX=SiJ!eX{ra5hBexQc41c!BMdj1Sd z0<-XtL+__PaVAg*w4-1S5ZqR+rhGlzR<))`@6qe3K65^jhv}>kTADrWM92wYB-s8` zq9KVFs;!xWucSiw=pp~6$pwyhR6Pu4_&Zs;P; zyu@nJ)?-t-mdB?z3WN@yOGE;}Yc(8lcC1E6%0Csz#4P!&)vRwvgYtB|nCnUrNFZ0x zfI&*12zg2|rLCNp%HfbO<>-*m+h>At2LGRh-W_LFr-XT7+tKl>oxXgO>Q6E+i?J;I zNyG|VuKu6_@=Srt)t{t0$Fi9I1{)bA{LtvAYl>$3B&VN@P8B9&PUVbt+>x*3_130O zs#AERA$QJQk((zo`EcA6beohDnS#Zw4uw-qkI9mR1^d`+OfE6`Ei>a8MQyrZj+8C& zg3k$V*=&o&4LVcMY1Xu(o^r$L2t}r4=FCLL9du}%Sy!ksX|mZ2YDLJVh__>POFh@} z$0c!lGv)J6hLz=MtH#nc2U@16CNz-_VH$_RPl2Wg}Rck)W)sOaBzw54@8Jxbx@ z6m7FBUCzl8*+@v4&;{(1!CJEAPdXL0j;rP?h9*@Zowh0;&op9{g3cCdsgshdLNj6L zC})Fd2WPbC8@0GWZf#rZ`ewsE8}ivb6V*gB!R4cq&4w&z*Lo9*VkWNjL7H0^%w(jg znp9O!I}(0t)F6?DRn2TWZ>j24T4$o93a7(i@2s*=%bTmpS#3rGNtLOLZ=5SldM#;N zsqU&33LdxL6KL1f8g<#MGF5_E&}F6~leFs7>5$nQE9c$1j?~y{#wyWBx6Qxp9GDW-2KN8Q?XWoMDf}pSA%hbD`e^gSXxj`(!8rzNH_ON zzxEs&;L9aPhiM!gS}eXd%~&9uH1;qK2%~C7li#7Y(gDEk394oBVgMpMbzKq(xm#|d zZk#xDzf%b*=C(Q?D+->UL_J2o*_ni_g>1&4FUJbbM!cwl#Dh(3owDU48C7c9(ke@0 z!MrTq)>orJbH<*@wQN3JmW~ut2GK}i3e*!*HhEm>uEz=i7+zXsd=^HA7WnHHJ_D%_ zhi^JJ|A$@a*K!OJG~&dt)d2Zmqgypi^DRCTKxI(=p#;o<|Y4`1?0W1kJY zzC{LcNYfS=Cj;>XJ8sLEB+m}X4k0LYfzjvTANN|stnnEy%l28?vRwvR>M?hQith(y&*Nt z=LIT$xqa3%ZK>90vsPU^U@o|4r)3RKqgk8wg(qsMsc1ejkx;oE`i{GrE;XGs-?UcF z)u*CiXJp1Mv6SVLrcP;QN?un^!NQSE@8+suOF0`-sGx(|byAbT=xkTYeqByCrIqEU zEeV66(8=f;^0bmm1menEQ#lce7Q7Wn+T*q41ND$2uWz{G8BHYB$x7`Cl{aoyWc;~^ zG;S!tye}JROD)BTR?8BE=?<5xwj+8)q*(W>X0a%7IzdU%Zg)+)U240=IcVkBT_y46mlVzSVgbcC%zTfwa~2IXQuEbQGi!&;V_c0PZLf`Iw5(;WEhX>b@^!89;hqyGL0$`NH^`3yKDn_n1fg!GZHaEB4NA2U5Fr!m}gm~r9G3Yj4M&f0PMa`;^{ zIB(%j;`RGmrmW5_3@Ig_!4GNrDGv-C+IGYz%KSif2TNy#8zHZ45UK|*GlI3l`2t@( zm}IEKFeM5I<57xF*<-e6;B1h?B&oNjD+QxGq%lO=g-SpzHxx4}E)z)EElriYJ~Q1e zL?h1ebcj>H3TdFGXs7C(!gMCw(8w~*l2_BoR;&@F&h4%0CH`XFn$SAp*-1`Q4`<}j zRIwNzPkG$aNl(X7&SbsHe70FH_?^=wzr#_|G=dddn42z?!|~Z5r*btr0j)IeHMOM% ziA5V|#$5(iQ*WQvSL;z#q6po(tduvh)q2ug@|bK^lh&?l&U)*if^oby8#YVrzJy+$ zGsw-kaKYk|mxHcUPS?^(LNTj_Ys{E6^@d-kQFCddIw@_1;Ns5?j9HO(BCb{XbIMLT zqN~<@%6!}F^toD-xq`tQ*Q;~oMm(&Um`T*r*>XjaS9-FJ33;Hp%`j9!gXfldXutAVjWm`g zhc1liBXFe-VSU6Sa|x*<@VF_HW&TWBA}qM!I)}k*G%IG*7Of|0vYJay#e}aN&!=@W zTCKvTwI||DmB#Hhk2j*z-hzVjX%*UZ&S#xSxebkcxa{<#Ve%m}g@Yw;CY=lzDoS(1 zsGpSAa}HZrVR4(J)y}kYe8v%0n*7q5GMH**a~*HBX_ie?)bda&VTE*eQ`(Be(+<5_ zl8&X!($M&L#AC@CCv}FJEA4f5awd5+*W%I{X~|HLnaV|FNd_Zcr^RU_3a%EMO zj;1y8iEJkzo#FIT;IM5b`)s&VC=33qcQPD~n-^T7z0_P2i013C(*k1X4D3Z+!b_5P zdMRfKxjN|JO#^k7`kwPDqdq^+QTo79c7@UschHlgp2O|8wx)c#7>#(%CUY)A6DVen z-*3>*L_!`VIMs^7YZ6wS`6aouK4S6sCB#u0V-|BK-qy8n@y;q_xJk-f2SKa@mb7)9 z8Ka{mq|E1imldQIr!W?XJ*?E=#upd6pVSa!ELc&L^j=al1oJg_+8Z=xqT^}3zS-eg zGsd{7?Q%AKp{a3gWX9w!7efudC8((94aQn*+7s4D)GDs+)WysVT`;dxwhiqzBtmIdr-2y04{O}$f7tXXDc(g{nvl5IB<6Omvm7OY50^?Z3I zE1PjBb8VN>V91s8=~x(6=&jn8OB1mMTK`YncXTPLc5To374Mt@K?EI=K?KQ&GlHUk zl7syEZ(E_ex=)AmykUKVK4&e;wyZ9=_ug094{Ddr`&0QWQxy%{E?-Y+^n{Zch60y*6u=hbtW<93>0A}z#zYz^113cX{yU2-*#)>S1vTw{7Fh|GXGhUKFLZuv(Mt6q3k`MAI@Ti`oRf7xVbD@^!QQo#$p~q5w zJngU$W6P(n4+;ZR{s*H7hsl&Bn+f?r!LSSF-sHW$T`6QQ+Pov9Q?%V-Hpl4fn?wib z#~-Q3ugoL-Hi3FnKfO`E-lxc$s^iP^ z_4^yudCfRKb3ZS+z&pmSDy31m%(!o;b@~-20aaHaw6zM`drRKEQM2pkgRlQAP z#!jaC=Gp0phimf;5*v~5u2(9J5BhP3n^)up^F;$qi(3>6wc2g88zAihgK2!*SJ);| znOg9t^5KGIo4c(jjC`gc$ApU5Z+ll9$&}k1FZns5^bk1<>2Z%{3rAiqN|&};?UQY_ zJyw{2d#zJ@Q*Kfs=AO&L9*eug&*LZ7YUKJDF@&=#>jgvcAnJK$ZjpN!kLGH%$iiMb zZ{oZmZMnQ;_b4s>Yz6wc?1BZ(ELNMiq@zbt1qXn8q_Yapk8kpHOg-X8Yy5>8b0kTo zv;5>l9{AI~5VrHdA}AXV6ocPr6cZ$A@y9m#TOD}$fm+C|`_t+F*E8REgG}hZo%!Q` zeCF?Rw)i~r74OTLFZxs}`_CBKP4yq=|9j*7p~)!U3c$w=Dggut2>kjQzmy}uYQ7k! zFOBnS{C`dG%i+Coel^o?*N~5kQ~Z<2#lyW>5?JS3QRHiDWY5KklmcmzA8G_f5u%d-svK<=89C z+zA_!K+xNPTzWbd-NUiwOZ{>>Tt=_i6eupp!@*oozxSjzD4%yPsQAe_w(-6`ZU?== zj3w)p97g?!nEVd#TzA1LyzUhkTs2)Z0*cYnx zu_s-UvYvV23?ph#1QG8USi2TMrLz$v2L51>hj* ze&Bk-FTsA{^T*!VN3Du-sh@!y&W{q08D&#&YRcF_}OW{$=qHlx9s#L zw}g7*a0RF$bI{cN?u`L5X|4%v&$_(%rh9smJ(bY+{|L){eM&eh7w7WuGVYhOeZ_R<6rQNdFxDaTTPLb`8FXQi3gqD z)FAU!QQzFp>1K4?usMmxgvv1g3S1y}!xIaQmLxkoDr!JvRMzjRxmOltw#7x}6l0g( zS#!p2TZ!V@{qTVHbsgOwg{iXDK%CaV!>s+HcEjunsLz()%+&U9&8&Y{8$Jlz|6oA) zYo(B0y2A0BuJCu$LGd3~ihn;HeAB!Dtdjn49$RU!1AtwBJ6GS2)i;9kMQjo;@Eq{( z*>K;rg+E`@W$W!310BLk{0!Q{zdvND&V5sAdtV!}&*utxF~e^UmcX7rA1vu>iIF%W zyaVR_{8G<;gFb&K(Kf(ke@CBbyP9(9paKq%k-{_1=N@HO4ny7_uH77|yi;}Y#M!m8 z1>qs*(|vbw%6LE?Ph;2$k9`%F7Sdo{Rt=_Vt$Iuu6&{n88<(g2Vd{e_77S12`tEpYn3t8H?ipk$a71Q5ym{*4={s^xG3mg5J}{;PvQ z{@B9U_$0pzWTAzzzgCK$yOuYR+v~>^;bA#`y`#U0489HCe>wbtDwe#KLUu-#``5@# zdz{qv_d#X=o(UXU<*roe6c2w2HW$EV24C_?$iP`;n?PC=s(BOxZy%VJQ8U@zmjzbt z5i~R_+X$YP6JR&RAF)~3IHhYHF@a{5({iyp(oRC4J1u_@8S^1MOVh8|Jd1Nv?w)5% zyKMIHc7?GOB8&Mnw~I9{4qJ9RtqaJ*yyhg(^gLS86RTC5_^18OCgV`97KJ&@hx@=f z1LHTY>Ru^FHLep^U=`qhVP2N?u;qc{EycUYHN52}ENkydj5d5ha`Z{I(da%}S5Aa{qgSTs7-|jGPwth+(^!GCOR5?!0b%i&a9_9BHS3AmF%Ip zl`^(5JSz^n^V@C+jv@WMCU`&rzp$RKx^in>hW+hEEIUHw>3~I#=Ip7~<{8$@KaDkC zYXVFSpHfYpE8a~subQxfnjmM~AKsXj+FCBA)0e3hc{#cMI@bQnnt;G4o9p~HPCfde zCLH}M5cl9i^Na6*?C|~DwsJo_>w4%3HmK4iq8io#R()SAHtRL0f{Fzw&km9`IL|-bx58BP&bF3fi!M~~t zFxK+y>boz}4tg*x{H&&U`679)`>C0EIS{3s^ZdXXh|Lpx5!lho$8#)#v_E(knt(Y@2)_tTrp$rY z?(=tZ=4Xdgd{>x!vjBYcK>kC7^8rsGcyrQo9Y^%?jpY4y5qJz7u1(-~`)TU; zUEK~R=^c&&F%I!vjPoHXMRZ_@jn8Ip;Xsa)4De%qQ#FAMX0!;-1tAWIZ9c>};2nKA zHlg6$Kq~?NEHAaHKOiCL{iuJvy$O{-$-|QBccId^U(9!lsQ$8ueyV`pYA=#PIRoGe zNbpk~k`nxXJN)Dk{nyMg!tNu#FAN^-P9TKbs;jlFAN)jOI%6$*Kt~R%4y!9Jr$tIL zmz5}U2H>fR6G5F>0!4Z>~>fIf{UuEeP-faplKJ1+JoZSy+}_yIY3$u zAUv8MUXQW8eGoW5f|P&UwJvjZjls$!7URQ4WDnDX@HrlW6=$o#xu~wa<6aET3b_Vt z01gm$jyl>!Qt>o7j>NE@X?%OXN_ZFv0j+6ytmIlKpu3~2wlTdya(Z^kVraZ@Rfvmt zqQ$lG*bZGsw*DxTUXs-G`GH!iBc5i)og0YaK3x@bU7NQpB^0MihZ_@BX9{N^?Q)a% z^&0bO^eoX#tLR;&`Y5Rw`J>9L8=9ICsdwKnunwNj_BTEQ`U~;e!H<>ce`FT@7~iKJT9&ZYBQEV^u>CD`Sd5hfL#>_`%!BrH`CAZsd48m4%8{- zY~!Dhxo8JJD(&1oN_ZKWqGEGN_ZBvYV}QTN@gIGq9LRpIo$BYwpt}_g<^$lm9k65n z(_4zX{C&W6yM(|`#H43hFRVlKW(%yBHU8%GeDqJZcV=?S2Pk1jvNP$td47&+P(6;@ z{y=Dp){hTDb#x@eLi70yxx(kVt+er|+Q297aMp#|q8K}y?PXF6$4I<$_vG3geHtQ= zX1LgjLyxm$IQFne{*HP2ZiI|$(r?KjB6m!^Iom>hR&85ou$CbO>tQ%Ix?$?)!`uc| z!WS!h)SB+`Y%OfH#mL91>CX7HOJtGET?YwPH^CpCiP7nI>Z*_@yhw{?&{1^6&I2tu zO=^J)<#7}nZ(nYtyE{A9SulFpG+FOJKU6cxNtW3V4URx?+(2f7bx@9DW)pXOOpl2W zEh7eYnUz>x{m#X%YbUghV;@$K9rlfxr2K~o&>L0K9kcS2ziu)H$ z{X{^}1CNKk)^p=cdbCQn>t0*7!L?0C6d@J+<|dRAX1izCK5nNtW2BDeoRzxbL~`>Mnz9flPOtFAx1= z^+e@l#n?^HMS%FzHZu4*?!3O!!iKIL+9^xLq{VkEd86rVEf4KF-sU=pmBW$PokqtE3v zSvz6kM4NrkW?Os(ZlJI^fIwSt9#>YEYyqDgl(nPgK|FEhrXX6|=OU{&9W9xHU!UzZ z*@A2iXLk1s>f%Kf-tMb_^JuWLnhBWG)=e%}EbE_&lg+HG`nU+g*j=`mXCkQfT=y4i zb>~2_Qu%Q|J^2Hbj-^|Mx=|0{fI6z(!t&FHtdZ0w02$xOVVESo`c;wNxLbcZAT4Dg zKz63JwH;B!&TO$AKP~uPPIKWqb@68T;x>k@YfeLZ!C*KpjXkYS-}3V#oPJO4N*nb0 zI1Pi~ZQMLel*c_pMr`GaS845K%%F$&&FY9ja}oOL`KGbHWgN!d8`4uw?B%8`$eUHH zK$?c`K}v?5VsNxR)A^>^3q{$W@sDhu@_BcC?G9(~osMFxj?3lEu#kl7OGQ@_-r#`jWo=uL~HjeXnbg%zwx+2uRyA> zYa+!zw2rqb)c{0EibuDJ?kvxg=2Uhgp`CD+yF@mYEm#~Nt3oZUhb3kF4I2}&D9g<6 z?Bq&^<(>ph)(Nxx_Q;}poRkh5ZAD^q81aW4b+pXY=t@_RE6bZ@&ut18skO&(y6w!< zHeE41D}^cbM+iqgSMMU9_bh;4rjz^?o)P?)kSBkB!ZQM!+rh7DoGz+=Y%>w)GnG@Y z{S+&{nU_9|^Pj%?FJJ$#p}w)3AKDyHRlDj7eV-8M2R{6)-!Hyh%Q^lhpy(Bn66o9q zjdj%xoAk#|7VCBDBG8Y=I`^Jm0)VCS^#z~)*4JSAZw@}>Q_oFyQy4D7cFQHXT%OQi zyV=A-UL0xPxHxSt54l)(c2>8- zm>ry*#-it48uuA?=<8Zh?t00~f(L6#ff1|K!QHg;6*oDl_K$mC7;g^ALex-?Y=-qE z+Nx|G7aj^eaU*@Oc4II}ceBS$>1&&nRW3kP-CcdPp#}M{?u};-`vOxHa&X#! zdK|2@Z$^OEj@(QgdJ^*<*NGBi;|LxrE@i^h>7N~(mDIYv*EpTF;+mNagQIKYDB{a; zt?s}cdp{n}$9X15k$(8=ix}{>ND$Ey?-Xg;@2+se7suXEa?gRNu5<3=#%x0E=D8qZ zt7N<*`t%7Q|GK;T=OOoBzxMS1wYxjLaOmQ%>J{;C#|!fH`1lz2zcGApym()~{`Gi) zD5#Hv&YGaZ!$EZN<)C{>wm&X@9CUyEBwxSL=RxLx6VLeDC7T}U+FWsf9YLNN}fc<<+ea)Mv%H+{*XoIJs7X&MO+)94 z!O9aYF3;(zrhDm8)m?$bh>}|S4H>S+G$(zgKkt-=GSy)XsVMwbZvZ|Ru=7Q% z^yRh4KVJNcV3g~xW}A-#kj2h~M)#>`&J5DEyK}qi4v;xQ1@4;X%r#NbWS4o&k%f@* znO~{iBUbhtw#i&A#Jy22Y8`wD;)oepY8$I8JEAEaj#uQglWzP{sJS-d4@gcrm!(tA z@>+WIqn#cC(v`Ms9-0rKAK>5HVDXbg(*l0Mui~6t*~OsZWbf5&-0YFVVwb7i&#H}g z65C8=9e{hFeFDN!4+Yi~Cj*aSknf>lgtLpCR>%GA7Hms`>Okpp+6`wCxW5~t7d$c( zA-i}`{(zkDCM%+veAiqd;BB)%teH+^p-;EzeKGR|APD~P<|~7F=)pd^Q4E{D7(uN# zWdzY+jf5!FLZ~g;E|s}ZH??jbFo0_}I{sU($!C}6J#MeCJJ9g`&IkFoBT$N7y&myb z(YEy8IRei*_ml9Gbgai@atIK*zo_igCI%x1-u+Ga*{w~CWXs7p! zAJ-<3v;M$he+7Quao@CziFYf_%ZiV@dGT{L`DD!`@5>7$e~69%T0X$(`eMyq^ZxC3 zktM2$yk(YTugnsFceK#=BR-!8_LA@Ls|Nvc0UV zfVG8irt!(4+4jiJyloOoK69hLInE3xlt(RF*N`Gdot_J)mS-@sP%GT2>*pz_`!W$S zDH8yL*tELE981Y{t^AM~9RA`C;?&(#p@BXn=~$h3bMfc(GHse-5VgCr&WX^BKouuU zW9o?E<#}C!67MQ8=R1AL&iAxm;?dHo8yI<*zG<$f-Mz(5bOg~9!%bBU3p0V}BG7v~ zTy9;t2$j8-$uVJeq!O*H?s0v{jkQ)JaepEr0dudZkT5B-*>`Pu#m?tt=U_I;^j383 zK;K%Yksm48bU!hPZDr_stL_9h@Kzyr@Ya`OZx#e)FPJ{VW>UVWCJwTmT(*fFFcw+dDHbv_6|pN6cj z$gZfIF54@IoL1URGqzbq-_K8F+;}VF8C(MQd`(HAV^(W_Iq`&tS4|!FLG7()aLS=i zFhbgA4uo7cA_ucW9CmKURe%&Gwg{Pf}7epGQS(gkxu4SN!#& zL!S{%JoY?vISBBipgpN}f<)27y64#j9l(cw_C<=~)}?$ahK&OfKxk22PQDRVTSmum zyP&75i4*H?Gtd3pjP&IQSitozF+z}CNu-IQF@2(|a8HQ#y&X$zyOfE1pm!#Nx$=sU z5?l0wSU1J!COkNIc|KUw6mlNLRs-k`+sJjUd_h$*B?3^5^bCogVCP!<%=(K(n0 zNbGek!+4K(vzY}oebSzc*&iRzRXEHM=x+U|C2U3&F|ig>SY$&c(PCXOA?lRsty?eH zZTffU%-6d8o7v@G$Y`Yat#&(~IL+@QmCApoc7F>kgW3(DW#8eGpKJHeBMj7T?#+Vl+!@ox^s;@By{3-n6OMC9=GEXvn&K}%c z+W99CJ;SBwhJTFsIU$K3&JmUm5-uw-?GBw#7^gT(Y)`@R5*Baurg*6vP#i~*a(w3G4y^d z%NQ0RmcDbg7?U5yv`LqvMS`~Nc)d1ylAMQpiZ$cZ`g#P$oAYhYb*DvB`EA{wMmKG* zt>0&D8`51Fj9Nh=fr+E?#q0%0FDsUua^V03Q<+tw@Y>|$Q>xf%s!pS$&8WV}j-^U1 z9dSQLIiC6P4OjJ@4b-(KwWQ67&~nV+sNoOGF39qd4j6pA*#lO^ZiTH- zBR4i69pnxHC+Re;LoC7|+%st*Pj-I=G6y*|%an-h&Z@QET|>l{RoXk_<`CB4g|Vh| z!wS3SN9^jm8sphQ%XPqI^{SIqiKS+jqJukuJz|?K;}NHEnkIRk%6b}u1GlAOn&Gzd zg;REk?z#daZF))|ih|$Y@$(aGoy4i_?^lD_dPX`gdV%U32S0gN%E%_YCXlWJH0N#G z>?@N01jGKo0{o~hvdIl`yrPXoA}GdRj`D71+y%Fn%+i*BP^aHs{EOHAB1s{HB!zD@ z>DM3xXpiNXn{Vbqo>_=?$Et;B)dVdm^;1-YXL)e}0HZle>IdL`IdD`o48F(@0Y^`@PU!QYyh zfNN3Y9@o6s%Jx>7E2_(3|JKqxkMsZnudQGo6Jr;Uvf@-xhAF*ix%0t}84EmOyHwW( ze2h75XI{idqSXz^Kh*03=c^MTJU2vjS#3A@wx20?h(ed}Xb&|<@B>`t)e;8UrdI1S z2ntAh-*V)u<5igzSOvUDKh2ZDr)EO8o1XGhv(=TDF zY6~uJHJ|AS%{gZ`G`rSRS{UU@C%LGb8TDc9cK(6C8D0P#za*z_tVqcYG`FeWke53b zG#=Tb>+W1)x&-nYK58piH|MTuIQyu$x+J<7z7JUBnAg>9*6Uup zBgYju`->$~==iDdGumcqfR{1cKdEb@H|I~ZGA!+j{_AaN>A6kLzxB=iZRQrL7wlLy zpLN?3sgQ7O9OK44hX$TRoY*A%74RZ(F!p_qg9m=)Ef3!K@RW*>G9mf}sG0#((fK!p z;Y*nWNjc>bzBu29rkN$QYD0liw-g(I7xa<*W+bJf+OYY{D^u2(`IA-3{{7PQQLA zgKH`Z+3a^Y-WnHQ?M@2E7L-`lpf?iCsk7~a2=Wh0+r)?+`5FV#?bg&Xg~%|mIAx|v zUMXc|g7p`$A=GHA~Fm40$g>e!*i4;efYEPBHFYX_XEgO|2qW zL7|n_$?~~$Hx%n~DBc6xs+p1p^wiX`a*3DV6;$_HeLj2P?Ic$#ZZ;UEM~$gZvHV`% zBu!`Kr9)(8=Eh63PmgCh+>zoMqx#RG^gW;XN6_t zO9cJAcrnURQ$`sVq5nlb^CyvW#3b%=oD+oK7cFH3j*WpQUh~`ua#ZinUcY&<38=&l zYkao9o5t!WR%HN(G4FIZZg)vUf#kLms%jJV&w{?3y#NU%gEDn~ltOcr6Y8?tL&0BP zh8uQ?W$oH0vANoF7c1p`2&rDT=FUOEn#|=Q1CejQ8uGiv+N>4^truh|0NPzxZc;xywnM2&LlCYJ9F2&jpnxq89n0GY>Wa$TT|yqEdY>K5P!aw@m9PM^!SW{f(nlc{9Y2;rTro2NIXP zx12O0cD`lLgADUcr1oN{Nqs3Jmj9M(H=s6 zx89|Dq|m@3U|zwzKNMjsgrH9XLH7xLnELKm`uWueDh4~u`<$z~jkO`QdB{&?REQM5 z5~3)lWYycJeOahGWV1c{*+g&-!!;3>Z-mwQ_8>1JJ1 zDvwb;9Ac&@p#8UL?nz_KJ)kiSl3B5v0R9dCDh*q-yf;o9Ue>XjoJzg9_IrCRE z%&bruDA2@#o79$;Gm6N^uuxblau40Mxu@ekbqx$Kl0^67I#adb&M~o{^Y`L`hA^f^ zs7_DXvpq0Eg-@joq6uNn-3*MY86vl*OyX0JwVw5HzkA+wuyhOP`pMh8WSoxJA-r33 zk*-4?P%XpL1ZHJ!P0BqJ4WBozxb7G*yt^SdX%Re39_O>KdjS6fA)U(kFcU}Jstxlw z%Ijk5*FmA>icrkB@LbOa?4sHj^c?f?Df+aa)bqw`m@V5^4$?^FLpFv@VvunM*&~@w z?=11!2>DUd0uT?Ktd5r1=1%z#H)piBo7-{MuuJ}S^i*IDsQwG&d*4%VUTdO$t7HG$ zaU|+*NeJJXy5E5@%-04EIv@oc*WZ*VAfR;+8{)xUn(E}n86jv@A{kO8A@ShLCJJcH zQWwlVcaWwRI`}x{4`DZG7lfE3#*@5xj|lh@a0ppPZ-o^W9!w!D7vg|<`6@YwhVHW) z^q2393>XsJSF{*7B0m@z3e>mD>knj#5eL7T&R;wvFAE9KvtKrNWIAl{0A;uY;RR~u z1`@HM+~eu=eI-S_eJ z73!zUuU#Z?G=Ei!pI)Lz$gPEaM`iNLa{Ctt=DXKqzh)m7d!WuW2@&Fk4eM*hB3830 zN++j9Wez>8**(1h{?k)It^%Gp$OM%Ves4Gq;f0$g8Q-rm!V_lm#HV7~&rf$~XDMQE ze^)ttXV6`4WK`em{EL1IO!K_bu`#2fTfVc+2bn+bJ5Ijx7bR`6d=b13xe=6dg51SP zyiLtcS%;@BsY-lRBnSm-n!>vFeoR+m<>4S9Vd z?9H*%Qe|Cmxq^iC6U{cs{k+iHF1Y}cvbq~VW~n>UBn`%yAVyN~nQFiJJTMR31S;|I zCp~t>i5j9Vbg;259o1}VhSJK*mYwQ7te$!Iy#ACk_Umr({2ph2K{&;l5(w9ZVA{-3 z!{<+N^!fYavdu#v$YK&7Ur)x55zhX%TL?*>>pZznlhLqvC4k{WzT&CE();K3b^R4k z`gWs!1iV7#ne^lR=zo92kdLhU-wKR)Dc-OnAJZmUp#6!N3x{2xaL<>J4fN-|ZzsUE z`8t4}=g+bKcNGHt|5hOioqrEBh6)k?b~)Q0s>D~`{vTE1@>BBU->L+7h_2=TMwNIO zN zYBDHth?~hvB7W*+KE-*=VD?u6JLj5JsobF@pT;v0HA5xB7Uxim%Hxsk^3w^ zu#M-nrty3I`7A%bM%=-fq9$DI=;@{Gj+aEb>K$sXv4d7h#8HW>~ZqV>3B7YQ`6D=$Mo z@Z>5kz^7JjbK0Dcn!goN;z(Qm;zbNr9uIcOK2BZ_0fZ2_?8$iLY4`)MAAiw0WgM`Dt;y)fYV-ajIwl?^XE{tkCO4Gy@%L@e_b>Fs>O!~=2bL? zzZDJa|69>0KeN`MXe93%`!_%6kA2S%efWE{4hX#fHWA-=-3}`V9BjOJh5Nr;z<-*We#%<-8npl-^&j(hRuEfj zlvg(xRnnKv?5tR-dcZ-KRl$16AX08Y_c#Q><*{=r&gV(uk)D()!uMAOS-FKjNF(`i(; z80sd(ide1VR>o$){>CU0>#e{tj^XIC6_ z{+s%@{QAcK<_*s8yGGtpnP15SFII5@wfLLe6#yx~pOSCa^nVly$n*Viw=0DDY=bbc zYZ&3V9}fACGamA-=C@4HpU(Gx1~Gu*fBz1*35fXgzr8cO@xOb6-xP^ohP1&VK%(>y zw2v+H=AP^i*Y+ZU54?PiZg8d!RWtik~w? zc@P>O7YN@dn9JEuW(X(=Vbjwt-~k0_`pc!pYNA+m*~+PBatRqQLS3Comdw&y_hxj0 zqXG$+#38mq2Me4a8WViJ$&g8?1ZnIPxIdLunu({Uf(rozHGnVgF5cp52H_NSFz!#Z zPU~AdtdsdN2ImLDI?18xYHyAuy0nQ|DXRLG!9PTCLyd!y0$*H-lxF0`=R6*kMhdiZ2{Z8QYb zXT=T)JT>XtQ)7&$`)PS?R7Xzlc+zhu0ch&%>TT*!S%|%{#n&ESQq#OX1S_Kf z%Yp+@VP26z5Nwjc7WEg%nSeVJ2BNv)W@%SKj?NXjp7OQ043dQ^m~8)ePri*PZ&@a? zG=LL)3L#np{(ntY1`!87gnLMNNcvL>UwSylPoF|fIuYFCpPz%W%B*E1XJ1l zE#2Y!%5k;d$LE!+#RZVu)A|rSrjoLoCyHGlNojb458i^fqj1Wi11tUEFI1r{)~d|? z?pOkj@NK!rYv=UW-_(EWSVCSm8|*(?>tD{L|IV?LWfqO}B@f<;x2;S+???VEOnK`q zufH((9n8vd>J*oU8s^)wLLjZASOw{LIJRO_Qd_FLLFzmoUS*|{QCOYHG6xh-tx9CD z4R2k>cz@VBmkq;j-R5C1>_Xr%q#Zwop+xqbgZa1A(nyUSi!L!GKe24Q7%LT$B35v? zt!e3=UoIYDC(8AxxcV8hARP?MKz!zdMF|Y6$`PVI$Qj90YUjh&9T|3W924bu?kD?f z2*ELtS44zA@0L#Ay4l-7;mMAjtClit-=EiE4cnIGc?Vif6MvZPBJek4J=7<)x=?pIYQhvqJ8=1zchT+Sn!&SaFA{JnWxXkO70?0NH69-|-O z%^s~~+zy)aut@YTE7E@M9e$}K{u^%vNm+0ft-r0f;W?}Lm7?z-wi~O!f5@0X#2+5i z@4Lr-*yUb+d6>Vf83r2twaOhdM6X@Nuv+XOK)}oUE_W#P?-$|PTMGa)+mCd5@%wWB zs`db*e9Uy;S$|0V+kJiZJ}Wo(k~9BKK>X4VLwwC^XZtq+aRhdK2>ihzR%jz=VLJ(w zqPCE$b_IO%L3gzc(WHAy?)58e*)5u1Z(*d2YgB=(Ipny568x;_6wnV{A+A2B?3rlH z*1dMSjD8!>H}I)+J$5coW`dDu7V4G0lO^n$Vv!qR>-7#cyWVv)ERb?cu%YZ)MX89X zKRvLfzk6!mYckt1+ccXtXLnR_vbY!+YIL@^aguZub8VaOQ6O*)`0+>--N7cpM#XnRw~|-qTLRmVPSIYl z%VX>28RW4t(CyS6b{&5PZRoQZ^Z%369j| zr`n!e#n=!^`h-Ean%De_Sf7va^B`dBP&o4BA;Xr#6%m-Klk8(tGNx0t0lKN4fpTq3 zC3qI0dtP53`T~D5c))tftg-d%tX=UKv_@-Bsh)|=Ttn;3%#u?)p9p7Y@LM}>1xY!0 za;3uVF`LYu=1GEjJ8=>n3e5jmluYlo%?80|9gp)SO}a*|e5uRySC;|TzL`?uqDn+{E2sO(WSmPdx& z42(TfWVto=-~zjvtCMZcE5uWk`(^L$1gn2~*p=j_l(W|%#3b?jt~PwwCUH~Xw!J`5 z@~$;kdd-KPVXYGXNESDV+QPO{bj)Dic6vwroLkj-O6i1Z1sa8gA@ht{Wt5e*76c}^ zcy<91B_n9hF3a-ZsIk);&g-By(&6URl`wkacT8}uiH4v%!SQJoT*F>p;!4EfXzdw| zmBTtD&{0pNiNnf{oH(FYmWu7czgF2IZ^QhI4|a$J^hw9ojM%M~HbB&BNv`|u23QKU z*26VzIjX52XqxcpIOI<|)9+w)HB~aa2U#jx_!M(WW`+@1dAq;*m1Wwl2TQxmD}e-l zl%o;kdR}g$&=z*3JXg_xh8k(`iNZU)G9A$`nenLd82Z3db*Dg@3H~iKNa8kqeNyC`UsspeyXmpDL0^>*K1#y zMYfWw+v<2aogeyT+>xq^P_+mc<9=3Cl9q6dFIO_>Epq+9PFq-V_@ttPt0YftR{~6C z2nS*!SqNjKYPV5bmDK9gmrG3TMA&wZz~XQS2I6XK&EVaz?a{*$ZO(_8*`jt%SPlO? za=Yt8^scOQN&{Xzw7j0+!+!!R{MWDIum08=$PX~Xau8Ji0WI)c@=LM*U!UFoS!?jV zYWhoS@YW8zApzf81D7QY!H)iqTLb++X$=G&cCf;5ya175y6%}lndE%2mQp*#W+hb_ zPEN$BIJ#!hW}>CxytBwHfWdZTWEmn{D~`I>447zBAZ}JB#EUHF{@QF{y9_KC>lt#D zW6L%H>v<)gLCd#0Ei2_NJWCQ|q~Pp%t+HOz{^6D*8mvgFS;(rQt-(My@rWKwQM*1H z;(A;Yj{MXgOR%jvvLp|2{>;t3WwPOzZp!DAbB*zq#|NA<4j8l55J9l@y3?fnAnDx-YVLgfb_n z4>gA%)PZXmajSK9d3fBwB>ZH%bno6z6V2TFC}Ivq56#6x*Wi5WMyZw0kNc_^&Iz?lO$6o9dhjtl(Q=~w(Hx6t9QIY2vZJwk=M*n z?)Yp?d5q;dL0Ja%`U0j|ccW=(p15oAATkSVWp*#O^&N$jgXMNWi7eVcd$x0*W~?xE z;&nP?MM!&fqpydQoIMzrM; z5S4cxBXjbx+X5XBF}GN`WvSa9##Os;w-J5uGPIEkonQtzNy-Hogbnj>{5?4W_57_h zP`UEugg^aG(#Uhvd)RQssmcl9i2(k%FeVo-j6!7Nb;z>txFjCzEz#v~2+9OG6_89U z!-7I^aloQu@I*Ur$N(PwG~j>W6i|L25YTY631DA-k4=0XKE4hXKox_4Y8Qn{^N_EUwg|HmAGdZz&8ZN7zpC<7oQ8D$dK{?`+eX;$QwWe7=!wqA^r(s zFdnfCOGtuuNzk4&05JMzlJje47~9PoLxQ$Rnt$a{ zc?ny=yzSCtwig$AGI!&aJb`cjspHI$)MRJGeaj1E3fY1;h1rn&<3JFwANYK`Lmr!Y zYab&Bde^6^h;n%@l)#(U4FnvJ#d2;zW`TKaT8 zHZ`&-s=^yn9ETEve2W+xlKl@!u0WB#Z!E$|8e=9CCN^2zlfXPk$21tg2=H)qC%A zPDgZf1zlAOQPP|_GspNwMbQZ47<4i~sq#Ia&vx#sAuw7qvEQ}5YleZQh3svc?~TiH zcLU!@M|dfXZ5h{c>qDuRSq+IevbgOYyfYvvYESO9QUfl@Ohp3z7rvCJ!5>k~*HB)H z&~A5K9X7s^0!3esAv-!0qDuv22j>AoAmhg3!L>Edf5y0gy3z zXJ3S_Pt1<3b5J%8{kfHnou1uevlNT8;HK+iSyw=5Il}qERPLLdZw5D{_3#V-lwa0R zA6MEUp7MN^a%+9B?H;Bfmx&{74C^BAMDMT=hvg%3`gGNRBllm;+b=oTlP3zZ{&J|Y z(C?oF>_5$IzF@Ea18o>%zk1N0(erR3`5pC|(tdiTr8C0<*vEZMaNwC%kuzp7CI)WV zFG=vS5l-S;+5wC?@UIxqr&_p=Z2SjT`L%fJ078MuJpXiY0exyZSaE`?=T?2|7q%cG?C_;L(y_ zmiz9Mc@2c~cw+wm&PQ{nJ%q4%b6e!R%ra2Bar$bCCgG!H5kq!l;c^GNZet zVf3+PH?coEc?p^8&aQ=8`cOjD%!Lpy%I)5ZOFy<2J96Rz0<=2$%7svDB34>ebw&6& z1n0>Oadfx6i0ulHMc3QI-mr?7yRL3dyv7VS!)68NUe2-vmjB&o17%T z%nL1eiL96;LKxA@t7w9S!Z@y1e9U>e!TA(%?m+ZI^Wy!+_w)W_xeBZ9rG8o{kXh`2 z<#TLrt6+&*s#I(pSXv`*g^2X!@!{H1A0+WHWq%L3Nkgpkd}ZeB6;M3p6e7hJguI)0 zgZXtE{1X!Tk1c1PrJMFR=H?Rk9h1G}c1p@F04P@F{Spn_eC($lI&fnR9`%cI&<8cw|SM^0>kom%?O!ero(K6%Vl<9 zJoa!kp}Ba-_C`qyNc;#_+s;hFtUfP#-l==tND5iz;(ZUIsTsJ0o&`72y%WMarVUFI zI#tK(M8FE`j*o3H%nqm{x#OA`OPFi^#WrEoRebaRp$ot3{#pHH@%!8Pk^#{p)C!-Y zYYLLQe*Kd(B>vN)cQ8y=eLB5JNE?Dh?|_`2gCQ&egO@Uc6%JNaHq};lm~P3S z5c*_Iy_llFO$Lm3j=dWj-Z-OQUWA43J8MeM^E>kzu0NB$YLhCUJOz-I`(=<0Rg?Dd zh9J2GGz?&@m9uxY)PG<=fVGVxMba^@b~KNqQgji!xVUQsWiw)Q7UU87Z5w-0d)pEv z!JKeC>}Q>@C|}Y{N@kag*s>aW5BX#vc8k(&rk3Go{T zBw0kFCSN%+5YKk$Mr!iFx8@{O^{rKAvv7N|P)s z@PU#65GQ7@BK?V@@0;sV#k0EE)!~K*)dn0?Q;XUel%ts==8Hq4g6>l0J0YL4EcI8omB%U}_td z1`mVL(yc9+CgOlR^_RBjA0;)E|ELpS)(Mt{betBY{dn-W>^6U z13J1!EcQ)~m7g0>*B-61Y<_T0zfB+M4+`en3TA zC=XBf?(vR=YGb>@oY1%+jOXO-KQLTy;Gv==2kCz_+az+>Q^36IBsY61|}{r z6JRnS1XHA=hiiMHxAh$K|{>;K{XTQvE% zH@E&DF?pZW+TYeJHhQjE%lV@xrs>BG=!QsAJi;{c;kMwxlhEI;V>DHK@kzb1cAn_E zA3;$m1P5AY8G??vw_=TFC;Vyi!oc%%@nI6Lt$^KbvY%W%So|ytCi4)gX_>kup3jA4 zTE9<3hsy8rDI$a9ll2hjt*9K0JdTUt<38hTmG;acmB=a`=d zBuROGflE)%(2xf#(cmO}R*0|a@XKq+$rQl&|NYvZ9ltb4!ICRtYu|?tT#`(qd9F z3*h!<28Yxn6`Vpqrdto}3(4lqdmHxWJ$neZrx?2daj4wlK=s_}U9scq`|zM5rwri) zsJAl(mWBikIKHgswU2#LdnOh#wI&;TFa#gv}vEvpixQB;~R%gm}bH8X<#X>Ex5^nz3O&{gjrx zY+sS{612?lzt~IEZx9yX=X%RhIOLoII|Eu+M~EvAOMMM;8<|ewz)A_T1hES7y`1*|?N&2;9diNIV_gr09=AraJ+%I9ZQ`x8OysUOPzLSVh zMo=_}=cS#|11DPt+jI{@!Zvg7)N;37w!?JNdV&OdUvMP@^{5&_59r1Hp#h(Cmlqig z!i`x@&t09`h!cktPDvJiK4aacZ=P(%i%Tre9!{LD>6T+t<30}6>E0@gE0SOzU}-o- zWMKzX5me&I!=BePFTPVNq0D7oXgc$erJ?q-7z9w0+%<&04m zpy*g8!rb%A`#EauHa=@ud-k@}A_B~2MFNnAoGWU(gL>jpwtwNX(ta7=lI&JOrF`+r z01&PJ)XA%H@UP&Q&t2%_i@)whMiuDBi+ z#nJ}}7tms!i6M+}2Jg9<0@6Tx$k%i&LmK6Ka3X9d&G!ujr1!23nXd3l9=;t7$ETI| z=Rot-(%zQrJuf{G| z(ca&+(s--Q0KV%Ak)f6s-j$&2yG(#09Ma~$}R8}RX_`!qNnVc_HChKw2{H${HVNiCLyi7HwQ7EvX{vfpI+662tL zs%W<}HVU*^9gUTt-OMA3-v%zbO}*>-D5h1+j(zOnY#1Jc<+M@GzR>OWfjU6%~_BgTuboBb8a;g7K|qm3=D}ba(rGG z9YiTWR{%nOn`x5~B!1fDl3KwzMT2qw7JAfY4TgDu&j)e~oFgM(DX|nfX@U&i5J*&k zKf(l;0zy3^l`Fy z2E%V~bJ?BO&1%aw_A-Wci+hL$5OLP^r-u!04Icd=!e9?HBn=zn;jm!gQZ%?%;4XxH zpnCmcon;{78G>LwdLn&;>ur8ssn9~A6D-P`ELJ@Ci0W=NA<$jtP)by1*C=YR(C z!vIIYi0a2b1{0e16=McfEieD(^8>Mr{V$<2u$>lr0nozG&`3mdm#eamX)s8?tGHn8 z*-E*Ijf+)*=<_+WnRAkx^99UgEp(NIUesWusQRD_J3HYKAQ}D<(iF#$L5}-*OA~uE zTK9*zh8>&Xpot~-4@0gWBNtpj-5N3 zl@|NTs`k0zp$>SKK$85HY?cV@SwnxYeZgbWwx`{Z$(G?`J_5q&UpwPpw!4qmnfF~U zOWzvgf23-BY;=G3Ik5NFR`(@8{+E^XnYu+0KQ)W~|88|ZaZ2x_`=qR~KkoA9P5vF6 z_TEW1UD)av7Rb8La({$xEq8eF_1g9Cm-X`oj{I+S@SisD6fj$_`Qt0w`%8Ys=SuPQ zvfym=3y10RXruu~1inE4{3@(nbQVg07Q&>#z9;+&IA@%o?#+F9>F*~XsmHMjjLN+3 zQ;1~1|ZR9|!+fazagO#{`1A;Aw1~ zXoq&1h!tTwEY$}DL+s);%&A!1wE2bQZ0q~}^yDqoYr9NW5WagK0dXN8HEoRskndoZQ-5gY|76ttap?LbGd_0P_=NC}G=fX%pf+h6-t+rdf=`t$c)=D9gk&z(kl zGd+JJv*}F5_(>;jCKxrIoGqrci!;+CZ3Fr9pRPOP6=g<3hfZ@R7K{+C;6a5IY&3Yc zZ(AVA%k-OZg4Hz07d}w@>igsMv1@&QXRs?jw=L=Ib1)z>Y7$&F`LanvVTZpqYVFGw z_^~M=AY=^QPHP}~VJJi9$OAn;eIXi^y5aB)29#MA*tuU$ZXgl(c2wlSdGNbU_@xhk z5A%1QCDa-{lnsA8f3pf0&(WxK60HgitNk%*|`u9louT%y|%U0s)r9%~~UyB?B# zu%@EY`w^nn#lt=}nzIUUU{A2H<$iHbDe+X|ZrAg=IAO)i95;wS@k#` zs7=*kI1QY=Ty8Gm-L7*rIGU8E==U@k9~4ADFv}tAHm)SxB^X~9w9#`q8+S;*icr$6 zIlF=GaLA*JQ+V>WI&U~$6nUgi7{0py%PG&%{j&MzW5*+3!;s%@bbmd?$icy5U2X^rd>d+qw|V6-h?IBhx{A-;^`N8 z^(jm?|6qPVFEOw=@e(-XE2I(z1mY{D@{5P`6=f_N*aQY8<`v*J>+bpai)rddc-xbH z@XGdn!V8KqfO8i7GQEaF)AJX81Rg<%D~w9O#s@}l>}}hFD*O2wbABif7Js%4zh2%) z+YtG`ad{tC2eYG3Si}GL@;z9UIZ-g@^zY7As3^vtoY-IWWnKv@v`mA%uLyTHl-JvUdJzdxBEHXJM7 z9QFXq#{3z>l9MR7`h422I2L&v7OBye=Z;ywU3Ii_*Jz4#V~V605|-@mZNtN7+wkK^$o;l&D0^ys#SZR9gQg^&;iS=Bt$7JD z=Kuo0UuQ~a8$SJmlLX~8Qq%E4{Gk`SK5l=g0hB1Q%Uq4Y( zEcx}FpJ5x6X*d$X=FTpl=GQb8RxO0hcPA}3eNjhLGaIZRj{ zNcb&8Q0cPq9?qSIfzcR5!sgDb7zl{Rx^mSPc5WO&dPv|N=(B?pj@ijMag;@qz+u%; zZe6n69w>@+(|W%5AivpAU=(Q{DQ&J%z|&PHF|&;rpU0dR*$%r^rzFHj*{e+awgaLK zGtr&(qGcP|8f3TRl$a69zun|!6bZ}4VID9<=iDv?LoP=Wnk~?)&@; zDClSQV>SO^_&vwz2kvEG{rXOT?m;X=dU~zRklJ~d={JfYSkY@B+oy<=)qB8!%*R0xamQbJ#vRY%muH!A%$Z zFykUGC9HB}I}jB@M6n(Q%4L46E@%%Oi{89~dKl`UH*-R}Ff*~FBU;9IZ3tQ3Ce6AdlwghibGa4FHgHTG6iX$0hay!Na5gAU3Ufr5Ux>5Wbvk(8wuwlDK5s^^nek zwGg((g%|Mc47ilVig|d^Kp!8VMfF!9>=GCXj-t%FZ@|G9u{RWm1U$301h4=Tx~~I2 z?*g15@ zVi`wo|F2CgqxWHi6Bp56mh-<8oS3JiaQvl0ggco{?yJi=~Nt+rFo^0Zof5sf5XL46q!Lq;aV8D=$tMGK)Xfrd86r?*K zanpGRW{rjx3;HHJ8L!JV#PY##=fMa|-l(EU1>rX2BPejm@hXw8W319|>@|H$z3pxj)?A`cFLfBv;TsX+u#5MzD__OD>}xSpFki-Wi%{O92PWU;fshxx!dR zg0-GcDdY3|LH7UC4{W&(Y&Db5e3$7x#U-LiUY{Gqv##J@Mh=*4+ExdUiZj&PHITxH zE?7lCNR**PTMW;bNbsRUXYBbyoheyQ_s8cC{ZbNrUE?7I_aVNwNIf_Af&Rn(!XNToWwF(cKb;$tG z=ME%@x)w8J0CFY2FV2hVC?o3mPOgN*2t*?$z75$OJ!9Nv_oOUgC_S~H8$z2EFx@l9 zBuTJIUzRmUyFhllI>PzETc0sdVZ_XQ6bs}I2b{)l_veiViEA+grvWxX>+8L0?xG`Z zJ5GZWNgiDw$hQb~%h02khkzv|pw{8`Yb--_Nm^|;cacFPtLJHDC2Mw5Q0=u4{D$hq z^Q8z10yB*pOZfe$JTld+l+nbOp#P14j*cka$?G{(!Z(?I%ddyUGJ`J06Fn z&kk(~fv7N(Z{FvA&yIfjTAts3`S%}s>)!mjFSt)->>9XC7|iG8_l@Dli?7#y9a{Wy zSzrI*=T#y9o6Gw7s=j?@f4i)ILq0t9TyQY>Kt3>3rgY+XxE~TeOA2RL$~ZHJ<OsWud{Thwjc4i<0DDALmNQZVVXTg1Sk>hlHZMkWXeZ4os=m_> ziPpxE;DCQ~CYALqIXyjzNrD|Pk7*Q%yF^DOOq8X2HMU2gK@q-22S|2+@keYwECHwh zs=Yq1WBSoc29DBVhHjxz0(p_&R@GJqZ;;exc+(Dyp|6YmfJQiZI015Bb(gYzv89H&0Ky)@?gV<2oQ9lm1af1FG7<&fxs^hF^rjY>w+~1m<^; z>-t5o&1IP!7oc}vTsqUC0&uv8Yrlye(w>szN!}8YvOTq7yzmABu&WH!2+I{tZysnY znD}m^EvLom)V7Dow~l%!IyVuiyYk4j{_e;FGdi^t`>-*1jUU(xsobw3dQj0lq283B z;cF!?7l-`PWP8ar_1fsl+?ljiTaFDbsY@Y zr;=WKk6VO7DBNB#j>#H;6P=$FyI^zMw2-NO^%nQ*p}$#B?WW<)XFW7+mGeJ)+N@iL7^n98mzI z|KaQWq+Ky@+6I$?@el~2DfDN5qQChTGmdcV=D54JxyB6zw<>vAt}&lgHAs`0<->PK?etWDuz5k>F*fCdKP^gBno^=6qX8HGWi@SoA7SG%xn;- zTx}o-I)n!uAR|8{dM}+rR=nOh@*@2{mth)zQnH{g4t@dSHHsR2 z8-LNVJfPA&U8cv1$~|a#W8~Kf63}Quc@pn#`o5lNu&x7S{w0|L@D~J$eOW~tPzqxn zSXEz^eZ8d$>=VTE1o~avvgn@Oe*~I9&rF8=of!6PLB2R$0^P`-9X-Ra-+5HrJHM;` z0Rnp~r?BT6c{Yf?A}4=2^8R3SQ5S%uHPBhgg2NdoVp{q|M+03ZZ2;Q$<@w8=ApV!e z>bU*@eBqOK_?MX=lYW!MFq(GbvI1NV&ky~H@Gz(YOt7AoUeo*wyb#!fzm8f!Q~A6# zNXXmrh=VIDs-s;joS=t?&qC5L&+U>XJ97rk&QqN3_U1a$$s(YzQj)^HByaJ(9K)g{ z^ZoS#8TV_`=Ot{|`HGBt*HtQZ$$awI=+a+WrV66c}tD|t-&jTQSm(4hvc^%x zM?9GuZUH)yL>`=jK7^M+!f( zXH!r(p?YXdRBaq8gA0!#51Zv=$lIk^uX4QJPU{80w#VA2PcrQxZ0#3(8Ra+49gf># zy1H=`sFG4YnvFD!y3;tg|vd!j#z$Bk=TX<3}~fj+Gj@Iy4t z1vd+1SzWpE42K|WoklSH@VsL7VQJK-s$?e47S%2pCme6B6f|iXxO=wNP+}mi-Ok&* z)=tq?lTaJo@ivMS(~+a~PFQp2^`_=`%0_40jFIrAcl6@hB7j7dd^Rr1spC+*&TdUl zs3=#QwYHQG?Sl}~FeTUfu)ftuy4?J05p4R|QQR^r~R-S=J6?%0It0sb8!ZuTC@LuVP(FJfH`r-xiukfensCwo~+us9c=>hC#V&96@buCoJD3n2iY)cR2q9iYc|*g85cT3D>#wf1zUU3At;~VyYXSy-aEx_*U`;y<&QcpdFxt+2$u6gQL`1wf zBtEM|{t}e<;7u~ed(mywa?5n}x`{?`m`CSh5fj^@f0n4y+~v}==?SY=3~#$u!`&WT zawT!tA=(;xZzzb$4`3oCSADT43}>h;zdFYL7zQq7VohwULOX8x#Vs>Kj@DGXf)3v1 zh=pkA%>!=m5|l1ILTxiP0RYO`aPBTn$7sws*BOzFGWC)Dj)S3UO#9zeyP<6S@5 z!R|Qdtyc3a>;z^;YkPIC@PkMpCqf}lL##MaQ{tpFQA^2nK=CR=ccp2ZouwCpDQpL0 zS`d?YQJi|g@^+xyZQAZR(Wl(+c7et;dhr6%$NvkLP7a-ubt zgU_5HFVI3`NPy&7l?3fP@~I%h$4R)TXknx)1S95nVval6Y^Ae({`r}EZ=l0t#zN@R z2#N6_9?Qy7y};UHtM<@sHmU?aW&fq7kMmNW)0GKc`d@S2)D$1i0Na z<2r@dY^f5q<)K}BK&sxz#6^vy(w96Ip4>~u=ioHZ3UCka$Ayk@D@2J=l;qu&4rtPQ z?sHBoACd;kdS$oa!K+a3uks9 zE5n9;Yb^tpUjUKNfptx8$3ER%&ZLE2wkyv>IfG~xU;wUAaf(qicwW&0elaq)-tqby+k~D<&sB^B#dwt}(r~#Ppvx@)HhV4xLUz=0b z3>)q%H04Wp91PtGW$lB5`g!(xSI)ko?LaB?h72{~IeNMepGllo>IDc_;5C@nrSr#& za6bKFv~*1pgy%9qmtXE*$N*)hiy5toN4SEc0{oL7nHJDm3-v=$A#i4T9*MpUmciHY znG6O6^d~n5T586ZkKnU(0Bp`3JRme8{PMxRnLx<&l@LMGDR@BOtO1sRsU;uY@Yr7# z)M&{#fQQR72+jqfTv5H=Wile$duKvhKj4C1m2KVHt4fP|Vh$nW#(jGYtR&hSeJ1f1 z=d?H5M(d*(WfyMD!#lkz3!|yP;s?g6nF9s#7?Hh`Ma;IRNb`?Sw=-L8!jRfX&Z zJ^<3;z`GFV_pl%-XLCE>_gF@79jbyWdVO2oVo(CN!=*cqmj@FisDmn|zuoZoomm)- zYn>Ht6axhb$=!aAm2$|p%4x$NIa}Wio>@CEFu6ET7Hzf}b>Z|mR*$s}Nw5b^o_b+V zm_fZH$Wu&%dOyr_sf4U^dp@p(aLYKY`B>+p=?lamvSx<1H;up7C+O`(%b5hsPGCrn zD}7v_L)F>&O}vj?!D=+P2Nnl)!RIoLTzr4!VyxD!<#<%o?Ob6{FiF)iqOVz63q>i~ z!4)V8nuN=|bETAHb=`v@^h`=O#k!NFbd-Z#bk7tQk&BKdq1VUpp8J@9heuG_D>)HHmEd8FOEh*D~kI1^@ls> zS94A{@lWZBj$J`AkWO4pp2_(Q7~h--oz2A_tsb3eD1NDB%2S?S>Qiv}8)YZ>cWn&h+wjuL#K+t~(9* zoEDfM7f?V4%$^dxV>g@uii>6DX02~{#OfgtQM4w3_vIyl#p?zPBeXiEcO|T6%`%OG zR1Y9IkFs@>8wHb?Y2}2m#*-zg+&pE_ar}5jN3k!E@dnVo4h0%sil5ReuzY*d?raY& zR?Rvl(<-Yr z-&nT`VKGIzSQNwD3i##`px~7%?q!{n-qK(5?YQIlV9Q_-MGLN7F1XSz6H43~S!%3d zO(diSsxicK*JZN0vj^gcKGNQ0H;}K>SG~U!cX^lGBy`7kl8~la2H~;9vD-o_^B9m{x1?{CQGyD?CT%0 z>xLTyR|(8VS@D~q;&bx#x9S4Y)}gv+KAGYgb4pTNPh5T6s<_SU4=4!(q~BH-#n08n zQ`ct6l>FgUm7n{u|B77G-UPcpl0LwaO1=D=5Ef9qGGC#o_$(Y`LxVJ@=V)2efDF^K zpzCj5Ga;Iyp1B9m8-!%1g8foqyz7)*&?rN50`hO4|9z7{u=kf5=<~%Z_3dp#N8`Ws zu91Ix+yC8n{gkj}Kd)k+{u^iv!~ZY6+i!a2;+z0)Njk>^zu!ga!eNaD68uCcj@!|M zEE|KwVdj)FYDU7tXceY-QIGar5)26@qzRqQ47YC8T$&|(T>z-)z)GX5mW;59x(7rm z%ym5w?PBI<_*sdPEAiBg*Z?yu2v$E2Wz7?~@hdMkSG zqLAp(ZDVHH!LlP$7sYdJ1X>JXw)XlZdH~=ac0;FrUNv}%30qAGy^ZCDX$^Tnfp!xN zXS$aR$Vi70f<;6h`eJ5!;ro*wN2S@oKrRlpjZ#_MgInHeixAokN}ge$pIz|z$on`K zf)R&%jfwGB$I?|zCFdZ3|OUk=l#2$X2M6GUkM^P&SyVsn4n??T8BUM87#SQ*xkkeVH|53HC%pkwWi_h1to7NuTq zH*8;=db&qjneV}W4(Dyn1I+xGsCRzV$x0g9$s>YuZ{Now3osL!S``Rq{% zWFeHXe1p`%-FP!;prW+9h?4tSUY^iR8ri$6m7={4Gan<%LZ!Y_%6i>hg4raS6Scke z#&sF@&f=QOr%`+#Y$Nqbp5R#j=_LGm+V}(F>zfguBydf!0^L0JC9;>)>~J3$D9s7X z0?GFKN#paN@#UL;{@$O3yvV1LR~|xT`y9{;(xP9o6-yYMY9_Z7BwkJ~K-KM{ENC-i zvL7OcM@N(5m)GNPScP$ARwZ5D5H@hGp#Mhe7FKkw!MaP$ z=mE>tooedVEQXQO&1NN3FkrZJn}+MMk;n%pEUX8pRcGV6i5|@wi}rn><;c^rx&zM% zy(74BN#kvz-b#`+ZXsk9H!0?9FiDkz1}08c5dHgn>vNsuv-I*-==xO{|HE4UNvZo@ z^Zs@9eYw-yPj|XTw)aph>!T(P@Ss=oEq9CPcdQi!?CzTJdKZ)-Zk&f?bvQGj)? z7Fck2KoGWT<4-~fXJud3wl`D9>Xp3nUil*Lu8wCp{2Z0NmBd^<1-}trawciMEu=L_ z*}g8MptF3i9vI5sQU{^IroCWf~yO~2C-d1L5nPq;4YMvj7RXXTF^4Dm4HyfG$+O@$i=vRjmY|-bo(&Zy|%g?Fp}eH zw%^s}cF9U5XT?_2og?)ak7EG(2o0ho9UmBQM-uTtTgKj5hnOmRcse(WOa`D=#Wsld6q# zj9iwOe+KO++uf;QwK)PdZe#4bchDlJ0T0k>eG~SoKWHXDoObW+otGQp=>h*HJmQY* zVp`>(YanSYFsgh>MovQPf}y~ww3{v)Z83=gUAtd%&d9<$&< zlAJa3fpAVXQW>}7J)NVR)DUYAi8t$;$J+KuN!l1??Pb*iZS_2C^7z6Wh3zAjLDjWX z@GuGr!PBT!Ve@6C=S1C<4`mxFduXg5xdtg`Rj8^olhzcoSz5eov)*ob6*4Df?b05c!e6kg!H2PK*z|)b`EVUu=$QN zz6`FtJ@}&4q!ogqW}9hW9TzbwP+_@Jl^q+mq7hX!lRQX4BrGLv7N>k*x5|1;L0H6p zJ^#Zh%s(`%n*s-oG?RV3h9J+*LsJahr^7aGT*AsQ37yr)73|NqZhHSE-r`UUvV)@B!rN;ww}9%$JcHvIK+0cgaVW(P z=j-?3%Cl<$K4Yqj9H?p^r1w#3M$ zTG5lnf^iI*zij(L1f~W$Ja)N0FPG5Ad^AaFD9i3XhM3~G()6Hnvm=-LFr^J0!Tn6P zE)q>F$QuFtCD+)BtgyTV$M!+q)|S#)f-JTV2z>HY) z8qK6T##Vba1f$|khzpr0t6BD9%jFq{xYEmc+T8F3m&|8*d7)0c$!^@maXtGTzq600 zUBuY-Fo}}a=fcQ_Llc3~cRdq$jKqt@d9Qa1kO*9+(00kT&4{93m#78D+B3!>M8sOwL}sI}a$ z_Z_4{LvtlK<#SbTuD7w4h5SX#Kz>DLum_oWgFJyD`6;vcojmg$a|UOjw_EGgHbah> zVwf~>ec3@D!W-D*kIN`sS@J^AsS0S)I!XdcQC>+)V#!kZ2{1}3aS-%Vo;$#e<&Ibi z_~AXN;(bL7+FD64xA%`Bw+51nE&%FeKPMc$U)|BW(?I_0K^S@g3iBvh1DFLdd)f33 zRel^)6URHSX#{EEji*B&q2u*&I^SfS3t5%hW6Xe01sAkgR9AZnh!~it9GPmS`>lf! z1-d|XXS%Fh$l(a8kgw17D$9clG|}c@5R-CCW)Pvp9iiDOrE>rjNPV8B5rS76OrS$* zY$3973*3o`+8WT9LYIO(-7ag%rgE`Y)(%|K?x;BOr7e=IAnG*>qGJJULWgBusRz^3 zgn1+2&4x42p}W+Bri=U)tJpiF*e$Z_O+WwJI?5R4M=AS{^K;PCUsp@evq7BfXYzoi z1ClgV{HwTYMVToN$MHh?zpY$B#|3TG_x_{=P0Y8pDo8FnkXeEa0l!4N1(ZeV{Kl9C zTQPWSxCf+Ny*xHD2oxcV=gXm5;L-=MhF&@@C@^zCGz(C0Ld?DO)N#Sruh&?x76UNd zs-HTpZv=~1o%lAZHKEEKKv=s(09N~vhXCT){qO~`%K&1RJuiRgy8wFV%FkBHAL_?v zd-YAn^|@j$#;q4=w4gY>e9yeZ*V5s^!}bYOy(ZWx0N)QIa?;atwqPK4#DgxEj0)${ zL~iWnbbH{!ymAIqkuS{3F{D19ubW3ftmBET1|S#GV!bW5I|tMl>2#3mQp?sovMe#AQ_Lu}c)f0%<7F2K z3ISuAR%+)huo>0>-mZ(B*I_;Z3iI}1Laa{(4cgRV-ti>g`vp3m zxoJmv^U?^q6L-cng4v^>a?;d;vn6c5++Yzh^q_SM19!b=E%FN7*bM|q(fY4PeqaZEBfQE+)%iMT{rT-` z!5wq(f8Hr8y|_6H)&9JgT@TqDa1#}_Fwd0^?)n51&-;ToPE(l{1{H0H!qXLD!I)bj z%ZC(+DD(tr^I-&(yQE3|b=aB4PEPfcp>M;-KJlHvADjgaQXsQmtx2X`hHN?R2j@nP zyiV4gH{;sY$*(MOpm6s9iBe<%nWF09euGo1?fS=HD0KpOwToL(%3Cml?sr*p_a6Gb zyFJ8mQZUF81feJq?p1~t=F2{q5dGMjz`kS%!xPFvte{JJL(6CtI@f@Kv_OuMagjN2 zbqjFzE5&c3rAF;QpaWf}?MlD8VrP%SRb+?2Koak8T$tE=wQX$c%y(-YwD-WRPr=^u z^oKxHvF)d=5=|p~#2tH0lRyewY1gc1#XM_&TgynAHJ-v2XZuqb__wu;rJtqF_(Rpg zSX+2tXOoy|+h0>tE}iUqW)EUuWBXYcb49Gq{j!704^wfAX|(|e;; zV()K_)<3SoU$i<1oW2E}Q_j!}V07?I{$^=@T>^;wDOj3UUwfXHJUb8*22`$3g6T`W zLcP>0P`nK0dU=$~^P0D%!dhOp0&sgvAGbX&)cX~HT~M4!Pnc>Sj1h8qdRraxUW%93 zhk(E!Ht~eRy(Lq{RIWG%>cjI*qr}jLIE(v2z0hnFqSV3Tu8&1l=Wd2;OKF!Lp^@Qs z_eD>yqZ>}CCha2)Efm~Zt@+_--sqOFAL(UjG{@!AA~uf(!rP8O;bDx{H*V{Ov!Woa5~7msA>HH~-@mZOqew@rPIE%^xViQjMBi@X`?NF_tie}Uqk*`y!qje>cM=`l9gNy~j-PPIyTctUc zz8*HJC1(K}sgSb(F+KOsK* zPt(pDWga$@Cl}k}KiSx?F3(5k8rW~g@IZ7huEmeo>ptwk8k2iYI=r*bzIAF5+7S-s z50@W&CZ6}FUxwL)-^2UcRKfsJAc z6oOD=P%7_0@h9lwCSvOwJj| zUy3_Tsj-S)HrNbpp#nlbWB;Oxg?J{w?I9>4_+AvFm%(pmF%JmF5h2A!+=HtOP1ZNn zuS{u?YM?e??>^N!jUX*KFD06Nv_iMBJZI=FonUktUZ-ItDjPbxZB~jW5O^Knm3TtGnQ(Ry3X*&_n%XDUkpC z*FT5VPwV=Ju;6d&J2yOQ)$M1k3QtW>@~paa^2PMKo&480P(^qSir`WCoD{w3{+2Hy zE)aRcR|djIeagLy4`0^V3>arCKrcKOLmEqAr+Yiu1Lg+mQei1GP`ono@=YV~(`(mX z^7t6YCHf|8cxna_5F@+_S6GsHS%2?@y+jM%w|5E-iKmqvHV_g#SmFE>7JiJQK9=Su zCW-@nDu@Zc3kz=xb4cngXD;HvEqU~;lW?~iV*AtboB;2XwB42vK;~Z@l*PvzN zlHB|K0Kp4zeok44Ojs9ZAvpFD44qhpL*}BDSH19mXnV6JWwCB+`CvP*3XqtmJp@&*+;{_+0LVud z#H)sMsl#zi0dTGhyQkxmU(iOdKwG-Mg0#RO(mEP}h-?wtB=mpFT zsWRQ~LGg~B!`Vc3Pm8|wod?OY<=49S@S*#aes3Se>d=*4ItxxOYPB^8?;aQ-;Mg9 z?*BX_yf>NQgZ|-c{b2|3AS%7;&B{4%2`$sMR(mN)v-c*d90nZi)ZKskRz6)z$A#&@>@`#)^0OA&@1(d~b#b3eu_$HeE0O!9P zi~B!pXJBez(=9=odqAtxn@d(BWKz16Yfbsu+AS_2r06P3yl~XDiub#}f3Qv`J><2q&o*fN1Mm^>?I+a6|U zz_;sgw>v^WDOeB~`4*gM7n-f%L7_&)QVofi_42862``kA;I&|ST@gS#TGk--7JTh` zW7!J?{63$DD>AY;aY$UJz2)Mz$E}XFV3!UtFzNO1cY3f`2vCwytMB(7MAJ_k<>gC} zY$zOjSP;CXDZ6vx($DK~%8=s%)NU1|40c|fL%TZ%Yq65fz*a=33e}+DKOAR3_W69* zosw;ps(b-i;Vy zSksz#dJ!y6(W3Pxx`#9=Z(mQSkTI{2QzFO?|8(s8Rwh_QHKw<}6bgSI0ti1PW61VA zIw#E9L9Wa1K30?YlOfPR^Z7N!{76HBF{beDL-;5K82EuN+#XCQ{SU?e`{oVpuSg22 z_?7zhxj}!lwP5RjsH~T10l+9~^=41}`L;hko3EKFJQ?sLsLTKO+5A*4Am1P5el8bg zU6e9PC6p{Co>>V7TWvqD)4jS%v^eTc<FK_W7qRzdtZ44zl(0Zy)z?wxac1Gq6`~1vYn9fY1Xc*j{Lf^n7+hf>U zcaV^+tcH$Ib_K+KpF=6$1l3Uj0>J|%?A9r{=UnrZtkF^t@ z?@e$j@T=3YDegQFMQjx+;2w}}@m&1VfQQ0yr-x5#FJPvSYXLo$^gQTzm|EMZglC0fxX%|z%v`Py z6yqjoeNX*U2+p<^4hCWbmgy%2U36=xnpvzCugQ%f!n`=&#zJu8A>F-L6U#=7%^D|X##1%v%9&0%&cf!5 zu-aDAtfM&O&_&?&O&nJ8Y1}}nJIiXgCZg+@45NoL1{vjH zEr#{g=YX}1RXD%B3KpP*{hP~pvUn3m>(Y4#31kO6*4q#}$n=$e*!j|i5|FFc1ljFQ z!~=*>pEqEVL60DO=8N$lG^_G1+(EnC25M$+0X9?5-ADpKaKtGjL!Z(6?YjflO;a%`n^eU2FPGymZp_d|e*x z2_ns|TvZd9wPt2y{ZN~@XXg=no=6>xkVDEpKtKUy?0RRN^97*Cl*jWsFh2}c$H-NG zX)tuyzDzygRpF$f_kn~_PC|%qVzCd+3NAouRZZS{POn$T-8q#2sFKlp|r~v&rS?8q3``VAGq}qT#Q5m88?py;?1$})Q_sX2)3rm_pn^C z4CQZjQwqD5x-?)~wSO>v8n#D>xQ9_Q!pZgap=#uG z(2k1Ut7OpK1VaEa`YrS;e|4cRH98o07RD=Hf69ak>TrXl`cc)GUfqUcRm2bFV6Pq# z!sUFq4_3QOUE+ul&xh#ryo3J=&3#}5KRGJi^$b-&zic;WswVD^A9>xsU~Zwb0L<;T?|(npNB$Xe`{9p#DQe63!@=;bsC|pL zwE@(-IM8XXLPf}D9?Du`c z8|H0A;p@O%Ej2$qHn3?R3+JQh?lTb}^ z>7EPuHdjW^VY_JtniIN9DKSnN$T`iyZt^(Sc$7cqnLJZ@$iVuHnA53lJgxwUp`=M@nDHS{YO#GKN4W%*;XxomwA#GUne zk4?Lf;H-%=yA8Qg=tWQS8D*8yvVTH3YaMyU>-Z?Xf*V%DYtfPe9AparJDPQnj{l6b%_jy4&ohs|ZnPQiupu zJ3|%+8vC?m9Uwgw>jGyllnz{A-M+Cj<1nor>}=G2*LQbwXETm`F*7_Ik}0*EyGdYoH_wzq)JKjz>oPa{aRwzj5Fh6B*x^wfKJd8XyMe8Ix4d;Q1O z?EMl>_w;KC{b&Ed-&(T}ItB~m^hGTgE64Cr~f(Fpxut2X0J+W3{-yr)u%&@XIC)baW6K~FJ$P|O+2e9Vh88SF=pc$4t z0qxpPJnncDl@9b$usHg8B3>@Z1~^x6mG&u%knvpU;vpzSckCEfMES2KLq~26WuNv{iuU%az&;CTlki{?kD3xkJVTFbp|*7UH5 z@nHi(QsWeW7)y(8wox~ddL*6!z-DeK1V^!E#tfWd9xSIc4n?%OhZ|E=kB2V49B3oW zaVio0F$AkLB)K}KHY5zWmmc-{vCS}zeKwfhLPd~?F#?5IoVE3JdzAdxbJP|ScDvhR z$u+G$+()w6-S&<B5qGL(I#iUO81R^!HTVQT_2H3^ucrCg3x0+FDPFI6${)gG&#|;cZv1i4It@ z18G@)%7z}Dq7dY>${P?SuKWyJk?D;P-tx=fNKqTW=(9UE^FtmztWA03v79Oceo;czi+|YMMCxotaAfI2 zpV`4kSURV~Sth{=_>47(RkFCfZX-Ip4{o z9eH)9TtwNf)SSEdPd0#-{z{pwoe{&kK2|*3mgX_ZqLjZrNs;Z7bFlGOHDPRX(5wKj z#Fda`w@}Jj$5~uhWgUOZos2y!+@qVB1RzbZW{p=y2R@7&D&b$uzixUf-X?SJc@>-g zfOZn<_pc4%4^Z6K0FV5`0PnM${^$SxbuU3*`m5dJTd}R)%%%vaElg=-w^SE#*!|wh z22jJ_$*V!JZEhgK=%(21q`lY0 zCw}2u|9Q0B^EBk=M`(M`c>jL0A#24UP7L0F06IH1dXE3`R& znZNrbUpX8LP!uu0o;&~f-QM!IY>xLSCHR+KnS!q&<*V!X;oSHbQvR~TB^qb4WwXzCp9&# z^pE5OaHKc`JE&o6nOqRr8BE#dHRZsq*QwrlTl1z(?)TsV+% zbP$tx)VC62+KG4oV2Tv$;j&>4D89KT78cpn4ICg_aiV}`vG2iPQpY}-86u;tj7MtF zq>2JSxLG6g?S|^wE-zNYrT}08wq2goNK-co!>+axNG7CYZ;Y!5oj)K}t!`{*&BWSe z_y&3;s#I`b-g=R(cIXYsu0SjdA65o!Eb(USx^!A~khX>A7~P~cK9dvNq&k1FH}5(PjMwtPw(zS0aB zfT01DZzh zg`D9+S=dXp&&8f)I%zXDWOg`&ta#12`S!oQojQ1AQFJ_g$ZExJ;byVuvukDS~Sq(z>ye`Dp zY|TOH=OsXYQ!zoht^B)Q(hn-dPZ0cPKM5GUPZ%>lK?waq^ZqFDtKQ=P1NTFt^^&%{ z$%@5We3PjRq};e)S+wP`7+yXu5y$dt(;Rc>te@m_ zE(TGC%ZnVgledR+|7_`XdD_oc6gb@yA_^gW7;IysFyn^W=2ORet!S7QYVD;lYF4$L z2K|h8l34Dz&+S3qkgJRb;40ZP=YsJJyTc|B{KB02m zgcbULOpX0@RGrN%u}cV@_ON3?SgFFWHW*WySYeZ^q&C44t>D%Y^0<9k`81{hdNP1~ zz}j!=J8@z|bku-#6P})1xF66TDlc6WBdg zhY1J}4r5vm1TdwLDHmHYX|6aHQVOHV$Z$YdG$#!5wujxRT5rzXcutg<(pNGplx%N+ z!swI^her-xml-h1Qv5hc8B#~{UUrQeDHO#6i@RI5?OKRY1OOLACvoH2Yjgl%9LiK{ zn&)^>OLKQPsf2xS&K>R7(k-|;Wsvz|79fq{2nnG6f~Rh=(8b?|+f%mUCyGl}>)3zd z1)iEvB}M=<+uUW?g->fk2SK?Qh)iYG`%*soK%x&x5IAk*yYzU7B<7urw&&1ba)~3T zL!!y{R!X3>WIwArOC_z#NeYMod@=0^l(1dN|6_CNeTDs&uKLS?)1p6 zTyz@Dhucb}7+r?`THpP)A;ld3*Q+exqR*ciLSFb-11&~EVEZrLvN=9%fgff0Ta<=U z%J1>tB}k-71_BbZ zZnAu}Rk{)e2!dHUK$WEU=F+c*jA?9$WnbKuWPU0yC=xq0u8S3ha7~{uHbPYKop3!9Jmg*tsg=f z6h_^&m96Ah=22k@3Eqai8-&Gaz_WH{Hf8S|uyZpy$!br!r`v(OrUPa5XLKnFEbaFHhv?EH1zFVxCc73KjuIsOScZ#qs~6B9E8J(0gK<}0!gt7F zfap?B{5}%l62tdo+<=-khE-t;BB0S*J1+R`3eo&_yI+MY9H1C=r`--m!{s3V z!@G9;`AVKw%~_MsQVT|7Z?K_Ni&L}%m;lG5i_@Q@4stPFs0hpK4iFQ#4NdA4VYkZ58IFmm_ELzG__?kOf71s0ez1J%GUIYgB=B@|W%)c#@g? z=dpl^%HKJj;oH~bm0amgDW<0_t+70JPcA%ISP!0{oVsNd2T zUxQcEKq=KmP5n*M&3`3j%!h@pK9_Ils_M2w@iw@1em8H0hzTefUg5pp5JnKe_lb;q z2hu`X5)4~k|9%WyWs&)QlYu2&GD2vA<)X9)?Mu$@{(`L z)3S$zaJD$QY;d~|yVgyoL=fgB#n`KZG3&mOaj_Q@U}$iUFP8RMw$Nx@>4q z6EaKU;*9hK0yX?cS?#66wmcj*&wLJjVBPNxa&Wy}`cMzj3KQj8}Ddkxf(xF@swNNjbF*fg3v5_hdQ zw4?YCT&~dgQt!{!fdhH*cAydLC@#Hq28ZCPkzfV^@5QN8`$5wv*I^AIa6((<_xCc~ zh!|vEpzZF+cmhBSRf+W5fWM)<4dm$N2=SM<(@;}i-XBqebiC7#4S3_^Y2IlDqmH^Y z>E32LIU*tQz4IX4=ZC%sh@GG`|BYb!T`$cX-b#3L&%ccXxNWW<>FuSwd|7*5IX!O) z@*Z_XB3!+^ePL1D`!z@X@=^JI=nwaOM!!4YzJ;v7NI>t3v|jtb{Ef-`rg%ta*$4i( z1gJtNAJ&I{^xAt$xfv^1LDsljDhw32RjwP&Jmn|e&XYOXvpS-QyxcQe(B0Fc%u>+B zkYbDX_WL+WA5Cym_BnlmEydOV3mmWHO5ZP&5VeqXUO&{F(A0e&QmC~k@ftDbL}>?E ztn$Xg*Th=qA>afn3pd~IwLKqSmvf*A$6+^=!>MGniu2F|L!DBw0pXlXEC(0nI}G5} zKnEv_8NVCrlZ#8}wFxMluz)|6wPd(}{mTj5J_uJN9p6a(Mw*KgkVyjiq7_SMwLoa3 z!W{G2R$L~!s>o^|3&}(Gt#$)g*|eMsz8znV6LTk}C(`%rV$k4>5g4D!+20d6)bu{J zx9fi_uBiBwVuc$_XuG z0sLlnV2baTPw?}+G3&krxv;qVcI~1GbU(r;1Bl}pX1Fl_ZIs+*N#%4^9?%V+PVdVo z=vR`j{xkyS^%3wMAF)S2uKLikXFmJT-(pgswO+zv`h9EtqlO2E-zVDR$EW;1dBy-8 z{ryw^H_!O9#z$DI7k`OI{ech4T}NqaDdI-NW#Y!}VDo*@O?BU;tE{!qWm@7LC|q~* zjFg&}-HSu6S5&g(%{m7=U0n%=ScHd7;$F^X6Z850&h`iHY-Wafkn?S$>l!pjc zcA&*W%YVm%XnL%()f$9tjM$5qosXw2}l6G;HtLczyb`_r1 zq=68pUOws2#bk=9hQ1~Dn39KFt}hrJL%2mra7TLF(kF9YatcHO2FsDQ=lGHub9YwB z6chmL-HLigrPhcjI>R$NK!Vj(S~v5H6}lY6Hf6F{fI_k7hXG_-(&<)|b~YT*pyTWF zGCdB$`sC5;+ff6*Nf0d?={_RUF_rgV7aSmYD>=ak@+iL%~ z`VcbahHMV+*z=!?doKmD%W4!yW^ZDN_>+h@k-xhcNCkMtKvQJs&@?Dw#eG~b; z0B;op>Z)i*hXXe#g%awZ%Xl(gAG9kcV1RWAba*!}pi_r}Hz0l^+H)FQ(H1LAkF% zYYCK+@-bCUm?Ar zbhzu9z>2%lF%iT^XnwiVQs++HuXe3#Cv1ZhsQL<_w$~g)J<+0lzv%D_`D}ciF9{b9 z&=yK{u_UbB9?;RmLwyt-dCUk799hYE!cG>Xw%+!q{m$Ma(ZRh)Rd!}%{+VM3l5Ev- z*<~l67);`ZrCT_2>;m_BJXr%@pE|45>wGyrn6u}OzUAW2F0KjU!JP^QIigan31Mah z_aPbk<2j3&)ED-XuhL9L&TC^@!*nHw1icEzrXwBGf=;Z70hLDYdRTcWU|XlT`nFT# za81D(46du+lcOO~=>?7g#?vbSemeE^(6YUF1P*;7(Od9ll&{4eiN$+&YTiFWK`lIA zqsq5n%T2Px(gC74-+Sf10{dS00Q8+sl^Y(z7&TIvR|901mx`3u8>R{FhOt5$rUCzf{ZE(j-^aDqU+*-qL1MZ+p?#A78)JolN5oC_mt2$XN4iJ)IS^Qqy__!0)q`#j?nj zZO70AkN`=ANQZVZnc-@3xXSP zqmuq8-AdyYPBXehN3dngby%ONlkThL5r|okuLyy7gmJP)N9ddrvuz*3;c!6i&uYX) zbk4H#zBOs-vL{9_nO2_q&-{Up?iSCo-yLP(Wb>~MGk@Fa*y7dY%D?3uNN74jo;@84 zjAPScTH{)9Ea@Ydf&0s~)F3pMqap16=L;SAzv^(oLI7B~f9P<%rf8oXF8N!BOE6I7 zr`+)O2=FiQ&9_5OJ}C=~iN8PeEN~k@^uC>Wetn6rSBQMW7XHthc(0fEdWA5!_zx=<&z1?fRWmpr|j)F|zro0RUJccRSJJ6A*m8X~`YuFi~7gzA|R zj~B?pi;h111gLYJE!d3T4Ehs*LEzQh`kmm`B)d2v8-qjqh{L>j4(5O;gpYNHdAbPjy7hmfAwyK@}=_Nuv zDMOd#|K=sWULo>-^%7q-(Vr95erik)m$iwCCqY?8nvp|!pcbOgGYA;ev$VxS3j{)l z-QN`HRA08w^sv819jHEL%*3@*ysmHIy>yhs0lUBT3}}45=Of;UeWCB)f^N+0nB*kkhdXpUUa7A)AICt?OU}q zor}X)1iO>O-T3IBsz)pQ&euH%w6fhZ!9+t76CElEp8fH%b&AQzTFr3 z&7FVkC%zat(068%382OuXn`>L(S1-YYjZz%lz^<+04BNZ0^-Fc_Xk3_S;d z=KH4^a=T!x!0ZA^*Sf>?L_&9&g^(?rV#u(+K)!6aZeg6Aw|c1V_cX^N(B}N?7g)s;Eg%pKS{WX`nL(hS; zpTq!fBM%OxUSadM1sohomyce>tG0mpin>Q<_W@3v3rr8+3al^uKFrVOk41X};*bfh z?bqVHDDR|*pKk*Z>^BMCn|BI=+rA6kY;8$Up{k=)84?KJBzOYA$zezuouSf0_YV-f zJ0?raP@e)UKy?{`!IRdWK40z}#sV^0&hBOM*RFY^{vTQpwvDW;vvbp`a? z)5_|@$pQ>^UlVnqA#2x#9@^>}8#|4GBsZf4ZIliC5n^-!1E+7U^+8X9D|8ScF8+x@ zWHuzgLwLoxgC;}5-vjQ-boiq+tTWrqRplb#%I0M=Rx;Y#+M?XDWrC1P|-37EQ#DWBorm?PT>5)gRr|fp~1XpCAT^L-B z09F!|*{l*8WLwF0q|p-0)ppDgmJzamhv=gC^l(@+ywPXOCXguY4hx2Xvu{1t!vWk* zKIUEzy&|mHejOFMy;`28s4LELZqVxo@!*}7`U3!!bB_q+;G<5Ztag0fz@cnxB!l2~!k z19P&LgFFL){FL4friPgh5hnZNzAhC@zFshIeW{v#b-w0D_0}Bk8^RT4fUZUS;TDbO zfMhmla6IB6kZxxiH3mr0gKlX?Do5n+G>DiXqR@5Os>iQ6NF^y90V>{kTXgxurZ(`L9HLql2dr>G7&5J<0f=alyl8&i&fUTM^c(%ch>MdY#{ z$;mz_hbasXYi^(KZ$^0-4i~z8-kL(z?|_&^-`BO@&+9Z9s;K{XvXvgw=cicit-&kO zfYABdqWRY)bN~8i-|MgWoMB_nd2QY#z%yi-WE}-N12O1tmQf&_|7^s05p^IX_U$0@ zBIz?&a)4#=6r8W$sX7Kwb$~`#s(_%Mv?H-4S`W+kxE%654m7uFOk zPUhuvDTV(Bk+J%cI()fAp@_~t?++0*cHrDAfa8A?i9ES7!(_jb^>eg zqH^Y27!?%EpSOW^9>xT+_$AJJbzLFp;_xE-eF;$Dj0&^Fk4Ln>r3Aw(uwW;cQt%oD z_ytJfm-1-AVh^GoxPT$9@Y7>7SGwh@j%hI>)b)=*eAiCP{OkWg-Hp3f1!z-;&spY7 zect~JKUZ0}OCrA}SS8TrgvI+`s5+kLY5|2Zg{b!pi8@su&J0K@79jhc#1(gBj*jNq z2T;*IdDl#K<&&9B*L^&$t9-M5-f!E)?#JSm^a6jw@QCx>IY;QB#Fpj&*o*RM*N$8d z_%*yV3?1E}(+>S1_KM1uk-c6f7JO`P^*U7Uzgg`KX!|IUY{#gO2Y6wx^57gftvkWBeiY{Ib z)EFRZKpPhaF(>%FG_V(tVdhbVS{h)xasl5p$Hz+74B!LFC*NSq!>Q?Dpp~r%+*T&H zf>zvg>99LRFdGv&wPG|;7l`S?J#jlvgXudgbaL0%loa~Bc z_Yt!>h-P%C$lR}6_KD*&QzwbyN;5>`aNEhjmj#W40txU2 zy^D&=QL9x*D%5i6BJ!hWip8R5m7U1eVs>zt&e=^4Pmf69WPX1Xq0Agky`wfDL1%xU0e z2U!xZlOUgNp6~S(iYq2ZbGyaQqK+mhYd5EtybN zg5?}$8Xw!x>HBB*s@{RZnt!%d5z)aq&`OOjxvVTYcW2YRf)QYb`Hc(kIcNKuAOnhM z?*61XH$MY#hi0TjeejbdfCKA&330 zY8Nk>&mxj+UeSFZ0>1eTwt-&1qwKf$W;m?~a*ub7MLgK$c_IS$ygDh6rRiL@`uR-u zJ>5Juukj9CI1O1tb*dt5pQw;2yUzQkFh6+x%BMj^cXQk+{WFZ{v79{{P+f<$aJy$` zYR%D*qI?p!WU!(Gi47w@mCkqDjLH}>%=MwzNS@2sB}9D?`fi5;y*Z*neZYbPN;Jl_ zo1}`gN)ioT`VN(Pz8jw-){N-^0QVFEvfdviV>(}W>`|{gbYB-WYi=y;4 zUt<=n*nI#0W=S5$G2hu!m&PIJ~&-pmH|g3n|MvC!{g&7L z-|y$s(ZnlgYtJdili>FXK7*KaQkz7O|#})$0et*DsLd*Guncu6^C!zMc{MqUrVZX@a@06w}GXY-pB%pQnLmt{!#OG#m;uXpgob_8g>lfO^wSsdnLbv-(oClibCE@M`;NmX` zFm!*DF$ataS%iFPFr=A0Y(4~ZxgQKKRu2$_)9~!R`^b6MWMQE8R-pF&2u|df?)z=* zYsZ=()#Gy}3_I7i{bHKbua`V%AX&NCh*y4h2f%%OzoA&*Ab<_U{J?I!~zBX>Oez4|JXpWYO{H$Zw1TH`@1Q)1Jd?!ZFXE zx>~Yp^CoyP-l7A3c~k+WH1As&`2D~8i$i!R8bGf|;Ardp`+&#C-*+{zO~bbKI#R&l z<>TxEAwAV^-#^&#-!7Hc{qqY?FQ>8@VeTvfwss?i6(X^d4zX)LI0WY{b4bkKa#4rb zB5Z4KC-haLw2cmH$FIf9``}$wY@`u`(zABQvqVGgj<$Cr@Py>a5EPj<*+brgHQ%hv zX;cm&>W$yjLcZ%Wnf-c$$Gi8d?Y2-x3j z#@0l7k$P~=($BW@hje%6t~eOwbNtXOxi(0E?mNv%6j6n{4w3yfCz{0(S%oO7Xs2S? zbLCMa8B+7M_uLw&a+O!D@7Y}&%oHK-tcdo~tMXS={G9W}SbmWZ#6tc@usWu79gjxmTS^f2&gu zw7!dp2{?mJx&Cy(f9h2kFu;RV>8FneOyo>BIK#^Q2Cd`hiVwl|ka`pvLRj9n7(WH< z{Q!n)UYVmLh=$)B&#%_%6O0-d904bAH^1_xUYw>MZk*Kb`mHau+FL&0+pzf6I)#1% zj1GV#Kt>z0iCRh3voa+HrEI0}tpPE~@0zIq(wir(KVnHNM`Ng5;-S z0mfazV5O^nAj7AqU*?nOUB|s2c~=lW-3yA^6l$?DnO!9>({4y3e;^n06w^5rgikOZ z&&@M8VqH7X0Xj>o3-nV_mq?{9Qgd+ukN}9Q#$%2iYnN{TkTA@*r)+vfsdeO2cAYtz z7A6~9aONRx-uo<^|Ig$+Zuqji7+}EY!)>#jWn!wI)Y^D%DgqrZGjVnf(UKEIiQ)#f z0owFQIi19QU6y-?_pdp^H8D^&afg+&&B5HcLrv2=ao-r*n4&s%ps%0|V06wfE9I3FzbzwDWoAU+*hkw4(v?iT8{6!!Zx! z#n)UJuHt`t5$E}pUf&nE64wXB(qS;Gm_yK3168yW~Awg`7`ifL*oa+lU(bOXO}V2lRRTSdPbg zH*S}gyZ9tMmtlp-^%#P{Y>i0}0bp|%K&a88Kj|1;jrqdtYN3g)f0>DK>Ek|ta```YTBX;v{%i&O=TGq|uaVeaSJ~#pR%)SUhQc4} zcjoZh_AQhlKgN(ko)sS}44flg&DRTTs;1~-iKK!n4Z`(AcL=;YWEL3cRf;uJLnt*Zw|0OX&lM2JwU8F?4+o32VFw8* z7uHbMdb{i4V(cw(JH_?A1x@19X;!dVm}@EDK4czlLwPME8ijat z?I3aW-D~};n97)^%{6+Au8qxEUYy&zfKSKa`A9(Z_9nnZUfHeRMYqDa?6=;GKd!8m zXa+aCx{}Z4hVW}LoM3hgTzvijqOoMp<&{DYDaGA=r(ls!(}_z zcW1j?flEe&Wj^kuMF+0^u>ixo}LKn(Qcdpj% zR^eBV2JaN>`OsQgFZBo8Vd?=8O=Wpa#lRDRzCKLaiZZ^8RaFxDQ7AaU1~!j#IWr{163}%5)yQdH5yjZ7W`O*w4~yGr z33!UA(gRxHjS#__VKSxam)K>eQ(hjKqE>j|+fm*6LY`@%o`}*VYX@O#e5-j%d+AOK zp!NI}CFzVCz&7!@5dMB_#y%tPKfD2?#j1_M>TPNLs#JfJ7W{QZg-mEzQNM;{Cx(9e z2U5Mg{^a~NlWYPm6U485a7ZtTZfvUJjpqCgE_sK?eMhB(gH*t!9wf#zA5(lj8KB;| zL?7X)->5zE{0f(N=Zn5$d)@+6-x4QYT1^4yb-#J^m$ms%4-V0;e|hwOF-1aF3Uta$ z(+Dp5datVF4j?4=`6iX^dFC4pX!NatL)RS)NMW*&X68othShLP1GK`4-`I(J;OZR~ zwwZ^ZEhH!Hqhh^;SuJ{?k>82O+KRA%wwBotDGrWrY_ZzXI|5)WawXzgW%I^a!;2G4 z)3h3YN)R?R@xcj_=iLLycf{h(pk)X!n_>4@YpMPa@AZB|@$`wR52kV3fRs-%Qcp)W zc(^O{JB)=pyS#0#S%kSLxt5Ct*;8?!=u+$T@~*+y7qCT8A#9wgMa3D?}_$mrD;n|H#e4(56h2m<^u?bGOj` z*>alhbBY8LY3LF_eDQCWqd!>1ew13_tTd?U03$R0DMFJbUAFhf#R4wSLa*PuDXxpX6G)YY+s6pP24804S1{pgvrV9P^hzeA zg_AF*6Cmb}Q*O&J2B>y=k8g$3nK}RNIQVWeW4ztemaSlFNClZQE4hIXMagL)PL^W! zcE3x@i+ky&lD*@M2hsuk0AX6;N>WO%hc!3TDY+ap)QEU|36yxUG%}(KgjCMUsXqtu zN+axRn|C-gr}y-fg-Mz*Ns*K=(sE z&3ool`X;lok@JQ>$Tx8RKH8W@w}}X-$rZtGcEWDYUcDQ(iqCGs=G&T$IshP-!q9=` zFc%K!y+WVeb@mcJHkdP7dWd(zJRss~e4Jm1lVV=Ia|CfkvZj#k`$G8p6*bk5@<)C8 zJ|50Kvo(?VQOfs@3yT>+cI?#kSc`{uVO32vTx z8{DT%-t`3E-3FCw0xW*w$F@dgo?ku5kCx;ST9RBS!RQ~qYFTHaU4(8SN; z-Mld!I^X4nz7(bOtTxtxHRW15?2fp3ERf1x!Y#O^*dud=SZel;p2uo!1H3tf^eu<= zB;5CSkm)L$GZ(bB0!$1)s{l)!5ChpR)WnL*1zdn!F(SP-6V91ELQ)^+Ski_Eo!_O} zRhELEVeo<3Ofv*oaGSwGySsvY^QK%5q+zi4>s8zJ&|pzT1%gR+wLBvjetT$3Ssp3t z%-yaLEQp6}iTl+#Ar{QOduW)nkeGILbOx*LnQ-c}u0^jV3K+JHOblf(sOwdLx~PVD zMt=*lj2?1RNGk(SoTN?N&JB^}`*xA6J|ixWC@z5B9>nFbSTPpk#(qQ6qAu(qv^z;x z*81Ui61GBkTbqqBDI%uymZ@s>h8ids@A*Am`P6Xe=6zwn3@;+9gXpT>x2_e&@k`5Ob@&h7yRk%#u9tWV; zCG{EChL!GLz}z&o?PA`nd?qgQ^SMUGk-CJZq!D*_0x+jqusUBSf4hmB0})E9@R- zd~m1+c;`22D6}c*SY*5ywn!RAWMG|AP7=aa0gPhr1a~--qM$R~1;X5Zr$>DY@8oGV z(x49yXy?v7JTj4aj1?}k8g{@L6v4zkPz7=T17XmtkM&>~k}0Xf+1d>gELkfCQn6CRDk;2yB} zL9quX+I8M#n{Bz-t{&69w+ctYq6Dq@7i*AW8Ba+t83i|ZbW@e2ta%+#&ks;qR2_>S za)YJua=YHC58}@9ZSpv+qVo&rW|Wq`+u~(S(2mZy0v-FDDtw(WXB|- z4qeiN=tM8DeFF&5BSa6g_=ivfs0q~Vv6@%Cl81YEct(@^KfBT_Ga?lpuEwR0w^{31 zo^UVY#m0p|tKi^oQV*I8=eVd5Rxb9tE*JJWDNrbDa2?;WAwK}KL%*ndl-Oe~q*OwD z4}rgyLE74x#2uA3JjfxC@ziRCMk~Q?VAHkQRZ|QEy@Ion)uwkW zI#+0Duclzw35*OWS=1r%^-R{6sk*=UX(e1o^bthEg3v}JlAKV^Ko6EN0bGOcuwaJO zaZc|xJICH9+f+MO6*^Pe0-f0ka@_AI6qkCqu`+eoZ?4;HlLB9gJ1FUdH0Qm}#g4%C zvx_aGvTX_oJJcHYL@bXm>$Z=Z+J49EJ@NoFOH8h)>7;Cu(kK)P zAxN5cx4_lOO4VMXISXLK2f7$5isxHqfpql3L{?2V_clhmk!1&h~Z2mPKgMW=% z^j{;n{ntpW3|#oj1d=lSmjE}x9}|0Ek-QZYnfDi$%thG#rF(B*e*}E+1m6b!s=xl% zxQDNQ`+f8N8$gxo-@Xx9zyGHAYx9dv@5jFH|F{49W1+)5M|8^%Hz5Igi@(nhp2d*< zH40vX(J@45y=iPXgu;)I%5&PguL#2SxihP&AY@^JLD&u)Cj<&^H9+g-!xaL+eYC0|^>~5+1weo5 zV^FN)r^XS)>eW?JumB)CuRAg=Q8mqPUMSfDmQf?ISsVKoGlD7O1Uk^dv)ee>yrlIq zlx7g_Syd9W0s7l+h@xo59Cjl)iiD|}O=P`&(+JTq1$`1@-s?FJ3PPRD_r7hxbx)2V z&7^TICEeI(y1Br=&)1eY!)pi}P8P_p^Ed72{A|KgxGoqHY?fZd-cy$Z=136uf4l7| zs1UvcPg)E>&M5q~vj+c|M6Is5Q&u_heC|4kNgUg1z^cJPxb@pK77h-0@i7?WRiSM{ zoM;XdgEc6phUi+nhO@O_yuH5g%!r`i7^K`7@bFJ9RFLBJa#}xMI}xhMPp`?SQv~~M z%PXDN7EnOs=e&XOS*w1vZbe={-zFd~ZNVu(zyxyaAxiFVZxhYlfk7f)4TlkyPs8($ zEC4VAk^EB;J`A3YGA(k|Kfn0Q4BNYor`N#j2gPmyx;yZbzdb5RQZ0ijX_0OijnJoW z-xQwFaByq*VdWqSfE6D+On92Scd1$z!q-idgALXghk-si7`)Hm-{)&W^X_ z2aA}pE|fjTmq3iy2&mOH21vE+I`+K6)DL7Gnw)*;#YXbG$3zqY1$7$yj?^v*@46?;N>^Ntda{PV(;e+>Ab8h3Wi`v9IKD1Vbssw`>d+38a`TLdRfs7(9Pec)v(I2F0nU!y zyxB2C>$E8RgrHQj>p(P+=_sn|O)BIJ;>YblI&>FJovy{;q?@poB42sHXQk(OB?1A5 zMi6e9oEMOKCIF^B2th5owDc{lH?b2Vu#t)*@f3m<-Y65waWb;blq%B!;!mlx4!)MV zxD8xSN|QJUhNisiz?(Bc2H?tD@RSDT8nJ5KJK~diUtz_LC!8!AT-VlnZg@MTMg`UkNrfz5E^h!^1->t zphc45$_2kt{EG%+IjHyE+HI7f&y8?nbeHP4K;MF$AE*`hmv<^;@G zG$<(0dd&oRJ*XOY3>$6Bx*MJXXO%{txi&ep@} zVr22QXIvDL#8G9hEKYN*0cvj*MA}IXgk(YE=H&)nVx(iP)*(O-W+Mz-nUaR#-X}U#&K!MX8>n%SVsPMaQ3z1+M|4$SM=Pe5H5j_@e zx&ZjM+lDIJjDz=U1KWmgXCGXxxFsz3pU_?Q*Yi@`V#}?O)a9Mn%i?JkCiTQk{FTXK zABdx^2;L{&Le>Dmq{yO?$8B)qTs^-&K&qs~!sVJzhH!n5JNtnW=p1{i^m5z|vhA9V zyu7pp7(-(902$Acl7B=fZz>mymjmhQVd6~;@%rWRT!a6ElH&gs| z>50JC30ir##%|WuxA@a=U!a(woG&Ph>`~xC_s2@jgbRp<3|FtWqm#iZ=)lrV z=mAFMU@p;YFTz`!FCsSZ4|uI zq-1~qDx)1A-LHXlThbj18Lc{p^|vJ(v!Wf7J3Vp|d@6|ztSJ^tgOBgO8<)}q`xgyM z{kFcB$^WRu`46@-e>zW@-Sa%fKKc^g5RS7NPs$bloB8t@?g&ate0=T*-j7FdWs%xM zFhIKcR6s(R_D`#{7iQ~CnJG}flTx!FLSE%Av<#jNJqUc`_fi+`Wb*V^i}9`WgSHpE zRy<92qr2_Cocg8-hX%q7tEc03`@AQK0&M}6Kc}=$2N>L@!fk+MhudJkf=fm;$ZxF{ zptg>$NAup`Jo_8u-)bWu6HuZ)3i?hnPuyEORx%*BY5_|5y%+PKjS8U7epdJIy~($y zONfmff}r%nwecdVF;BSx4;!HsFu5P>hkp|k;LjWxl6qku`Dca^_=2eJ&TH|Csvd5P zPbfuiZ~G9kVbFMc>n_(rJmy^lduxv}4*moSh?DKda#X3Tw#^~;-3o43RMwUgc0>=^ z^6|*lyG^McL9N*)++#l}<}xXki*2D%tnLx!y`J&8!wl3%qN2!*bK(JzJAp0A{<0G> zmJEc4P|=HI+qCDFEux5uHbR{!+9PPn+|`bq5G}6FB0B8wu?ySkvb^4EBy`#k)Yrx} zY8$+=)4VgpYtCuH360r)r0>~A3Sopv8R(K(VM)SJ$GY~Lj3ESjx3E;N7O2BX0K1Y4 zR0tUoI{Iy}Iz0eAh&JlIV6Lc(UBsb`F-7FO-W0#8}8U-Ko zpx(t`L`$&~;_UJ`=z@oPD)mmu*V}S}SNrZg8reoi(mV6A-j zR*G19M{tm6iPPPoubca0vmX-`;F>2Md1Rd|0LIhW(dv=C-x+(yUAJ0bUi2FqmIYTx zFjbUb2rWBorXME^K2~iA%25mwB*H|UPPc#=~k)M6>&jraa9zJzWk)sQ2ic(M@H^v1=&fpwkrp+0zN;xul$ya(5XYO#- z-liKP>=+h8bcX2ciHGK>Lf}~sY0eJ=@yWvBz2w03N=4_#RqKQfR++_SHu@x2v;-vn zxgafXq_|yg6Ih>5He@O5GArD0VrN?BsT{L4MBy|hq8Te8k3EGJ*h_J}7!rSxHnldj zhe?3<0%WOgf>u$N0t@RpI zR~kwmApE88GjWL@c-{c;w;d#tVcd@o;ksbXvLtT>9$-$RC9c9vwQC@tm_rkKY!UR4 z5!zPHPAIQNFl~X90E(OSYI3Gj&rIiksw*hvIm=8w42mq62NA66<-j8+^P#kGCJ00a3S8>G(nU~{ z)<(8S&6;;(m8~KRjm?-wF)vq1;Al?@jlxjPHR8CBbYs$AB6A%6A&Z|K8%yaxs z56oe6vHC5oh-z0>;^Mg70Bafd>?utF=Wa`Vy<}u983j2Yb@rxGhgP;aF zp>Nq%!Ium_g_K~>n(O{~yz#!>WCBMXiTW;=+0Wk0Pss}OY4~CV>P0cVU<>X7xVB@S zoVCf2vSvM>6zsTiLo+<4;DF4AqpItw;eoO#=&;jj&&Jyo30-mENTrG)I=elWtKK}0 z2P4~p67Fi!lUwMWBX)kUia8AHMSpO&+h|-cnHRy25Q45( z$Oxq$1eIOV`m|nZ4M|>G*WU<+cMC@K3Zf8k!8P^D4sXR{C&Kr?u7Qdq1+77I1m&&R ziag#S6B0_J7U{vvNo~Cj^P0uD$Dz}d`Bg~yt`h2Pu;_zK9+G7Vi`&6?lzY8cUyW>8 z4UmGSNVmdw*PAL&hCA zB4wE;Ux(JG9_o*0mGu<+rRe)iiPjAX|M^@ANDiMwCoor{;5hn#x;^2HfaTdKx(UXV z8PHmr{I znSOK%??>;qMuB*16yC#5DMP*m%U~0>d#0TkOw|0v+UnWEV=rjCrkE+@zF5ZPfj;Q` zWet0tn2+&hbVLR16wgm@aXigI2c>CukFCuTeV`*Y?jvs8%o#CgXRrYB@yI}&Wt+^1 z#d-Uy$Zl>|u=bx_cQiMA??Htq*EgG1b14Se@MZ^o-!05Uh=aC)_xueXP)zc#NpXM_ zc*R;~K2To_1X|F(un#^N=>ZMMVh&5iNHF(BF{_a{Zu*C|P9aefM+d22=#Ce+g52$kg_%A$cNNL~ zL61-pW~=MtEN`%42QBG+vpn-cxWVQcd|bOyd>1AMGicbsulNhs#_jpGd0GLV8>5KO zax7(Ap}%c5mSB@jKq7;B=&RN|yqll?#)$s{Wm|qJh}|1M)_T1;9@jdOM>U5xv~t+{ zmhy9Cz?qP_!RxHTK8*X~Ci>mw1`22^amVBBvT%+nc{+3oTzw|H z4J>w_`B7}aHIc)fzG8LR-oq!DxFZqjd z$6(!H3z2eRa`S|4E2v_31yYQ^kIloY3L?B;@HCj4|JPq9uky;U3IAg6eOQ+TAecU# zcE4P4|M3{SKTEdzhZYYQU_VB&<2(M6&c%m94$JV1ftgC0>R-8xvcc0WKE zMoCsL!~m=5Zve90_p7iiEzCB&z)Ojq%>JbpN&YGdRp-OFw-13ER+v(YQ z74VQ8=UJV0ugQ3ZU0ih=6J3Qwq4H*T8XeDaxV zlv|SLFgxNjlAbrc4~pKfDRQN#CJA!|N;NM+0>^=ObJjh%I8yLYOyX9x>GWErR0mE) zZ2jn?&y`JmW4<>(t`(V&$&D_Xv>~% zTwRONbSw<9Y)Hc%mdkZ>k4|v;O)Z5@s~SX~7|A@OR4+LW<=kV0EU9Rw7i_q}0mBr# zs&Hxg;6$Gb9~gZ+Y5}`v5ej($YYu_GTuE9OixaFUfw6IfDB1pCk2e|+K}-*TisZg1 z>6n(LzV7=yP zH+)3z+a1}Q6#T3TR}lf=&b{4=0*l{@cHOS_I_};Myq{R=Zx@wpcsE`il5?FDUJdNZ zpG%+N7-s)X$jE|fPgeU=_ z43rl+fSK0MLmnpMO=vu8*;mlylWyE>Nk@MxVJ%f18|8aJQI;2N)?u^Pu=^+$N2Rr&Mo5$wg?nc$M^i{ zlV3b@qOw7L+oy_9soxQ2%A)5zDJ1c?FMbM1fJZm+?8hVByS5sEb|wcSYUhLD6_yFB z_i`T*&F?QD&k#VpgY?Pr2?>1{GJU($BtHaCJzrx^dM;!>O%Hy*!IkIaQk)zPjC2aT zCX22YH13C(}&A%$3if-8L@YuXi5=bNw7VwPl?Cj0x(4blC?_IfD%K}@xm

X~E;9!Q2^$~@Dor2{AVw4AWvnIMy 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�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
    ZBrpS6;%x?+uxEPJ-9ewi( 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

    + /// Indicates fraud. + /// + const FRAUD = 'FRAUD'; + + /// + /// Indicates a false positive. + /// + const FALSE_POSITIVE = 'FALSEPOSITIVE'; + + /// + /// Indicates desired good is out of stock. + /// + const OUT_OF_STOCK = 'OUTOFSTOCK'; + + /// + /// Indicates desired good is in of stock. + /// + const IN_STOCK = 'INSTOCK'; + + /// + /// Indicates another reason. + /// + const OTHER = 'OTHER'; + + /// + /// Indicates reason was not given. + /// + const NOT_GIVEN = 'NOTGIVEN'; +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/RecurringSequence.php b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/RecurringSequence.php new file mode 100644 index 0000000..83397af --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/RecurringSequence.php @@ -0,0 +1,12 @@ +responseCode = $responseCode; + $this->responseMessage = $responseMessage; + + parent::__construct($message, $innerException); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Exceptions/NotImplementedException.php b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Exceptions/NotImplementedException.php new file mode 100644 index 0000000..a0d673e --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Exceptions/NotImplementedException.php @@ -0,0 +1,16 @@ + + */ + public $supplementaryData; + + /** + * Instantiates a new `HostedPaymentData` object. + * + * @return + */ + public function __construct() + { + $this->supplementaryData = []; + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/IRecurringEntity.php b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/IRecurringEntity.php new file mode 100644 index 0000000..8f9cbd9 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/IRecurringEntity.php @@ -0,0 +1,54 @@ + + */ + public static function findAll(); + + /** + * The current record should be updated. + * + * Any modified properties will be persisted with the gateway. + * + * @throws ApiException Thrown when the record cannot be updated. + * @return + */ + public function saveChanges(); +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/MerchantDataCollection.php b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/MerchantDataCollection.php new file mode 100644 index 0000000..3f53e53 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/MerchantDataCollection.php @@ -0,0 +1,190 @@ + + */ + private $collection; + + /** + * @return string + */ + public function get($key) + { + foreach ($this->collection as $kvp) { + if ($kvp->getKey() == $key && $kvp->isVisible()) { + return $kvp->getValue(); + } + } + return null; + } + + /** + * @return array + */ + public function getKeys() + { + $keys = []; + foreach ($this->collection as $kvp) { + if ($kvp->isVisible()) { + array_push($keys, $kvp->getKey()); + } + } + return $keys; + } + + /** + * @return int + */ + public function count() + { + $count = 0; + foreach ($this->collection as $kvp) { + if ($kvp->isVisible()) { + $count++; + } + } + return $count; + } + + /** + * @return int + */ + private function indexOf($key) + { + for ($i=0; $icollection); $i++) { + if ($this->collection[$i]->getKey() == $key) { + return $i; + } + } + return -1; + } + + /** + * @return array + */ + public function getHiddenValues() + { + $list = []; + foreach ($this->collection as $kvp) { + if (!$kvp->isVisible()) { + array_push($list, $kvp); + } + } + return $list; + } + + public function __construct() + { + $this->collection = []; + } + + /** + * @return void + */ + public function add($key, $value, $visible = true) + { + if ($this->hasKey($key)) { + if ($visible) { + throw new ApiException(sprintf('Key %s already exists in the collection.', $key)); + } else { + unset($this->collection[$this->indexOf($key)]); + $this->collection = array_values($this->collection); + } + } + + $kvp = new MerchantKVP(); + $kvp->setKey($key); + $kvp->setValue($value); + $kvp->setVisible($visible); + + array_push($this->collection, $kvp); + } + + /** + * @return string + */ + public function getValue($key, $converter = null) + { + foreach ($this->collection as $kvp) { + if ($kvp->getKey() == $key) { + if ($converter != null) { + return $converter($kvp->getValue()); + } else { + return $kvp->getValue(); + } + } + } + return null; + } + + /** + * @return bool + */ + public function hasKey($key) + { + return $this->getValue($key) != null; + } + + /** + * @return void + */ + public function mergeHidden($oldCollection) + { + foreach ($oldCollection->getHiddenValues() as $kvp) { + if (!$this->hasKey($kvp->getKey())) { + array_push($this->collection, $kvp); + } + } + } + + /** + * @return MerchantDataCollection + */ + public static function parse($kvpString, $decoder = null) + { + $collection = new MerchantDataCollection(); + + $decryptedKvp = (string)base64_decode($kvpString); + if ($decoder != null) { + $decryptedKvp = $decoder($decryptedKvp); + } + + $merchantData = explode('|', $decryptedKvp); + foreach ($merchantData as $kvp) { + $data = explode(':', $kvp); + $collection->add($data[0], $data[1], (bool)$data[2]); + } + + return $collection; + } + + /** + * @return string + */ + public function toString($encoder = null) + { + $sb = ''; + + foreach ($this->collection as $kvp) { + $sb .= sprintf('%s:%s:%s|', $kvp->getKey(), $kvp->getValue(), $kvp->isVisible()); + } + + $pos = strrpos($sb, '|'); + $sb = substr($sb, 0, $pos) . substr($sb, $pos+1); + + try { + $formatted = (string)$sb; + if ($encoder != null) { + $formatted = $encoder($formatted); + } + + return (string)base64_encode($formatted); + } catch (UnsupportedEncodingException $e) { + return null; + } + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/MerchantKVP.php b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/MerchantKVP.php new file mode 100644 index 0000000..cf43e59 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/MerchantKVP.php @@ -0,0 +1,69 @@ +key; + } + + /** + * @return void + */ + public function setKey($key) + { + $this->key = $key; + } + + /** + * @return string + */ + public function getValue() + { + return $this->value; + } + + /** + * @return void + */ + public function setValue($value) + { + $this->value = $value; + } + + /** + * @return bool + */ + public function isVisible() + { + return $this->visible; + } + + /** + * @return void + */ + public function setVisible($visible) + { + $this->visible = $visible; + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/RecurringEntity.php b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/RecurringEntity.php new file mode 100644 index 0000000..d11dd02 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/RecurringEntity.php @@ -0,0 +1,110 @@ + + */ +abstract class RecurringEntity implements IRecurringEntity +{ + /** + * All resource should be supplied a merchant-/application-defined ID. + * + * @var string + */ + public $id; + + /** + * All resources should be supplied a gateway-defined ID. + * + * @var string + */ + public $key; + + /** + * {@inheritDoc} + */ + public function create() + { + return RecurringService::create($this); + } + + /** + * {@inheritDoc} + */ + public function delete($force = false) + { + try { + return RecurringService::delete($this, $force); + } catch (ApiException $exc) { + throw new ApiException('Failed to delete record, see inner exception for more details', $exc); + } + } + + /** + * {@inheritDoc} + */ + public static function find($id) + { + $client = ServicesContainer::instance()->getRecurringClient(); + if (!$client->supportsRetrieval) { + throw new UnsupportedTransactionException(); + } + + $identifier = static::getIdentifierName(); + $response = RecurringService::search(static::class) + ->addSearchCriteria($identifier, $id) + ->execute(); + $entity = isset($response[0]) ? $response[0] : null; + + if ($entity !== null) { + return RecurringService::get($entity); + } + + return null; + } + + /** + * {@inheritDoc} + */ + public static function findAll() + { + $client = ServicesContainer::instance()->getRecurringClient(); + if (!$client->supportsRetrieval) { + throw new UnsupportedTransactionException(); + } + + return RecurringService::search(static::class)->execute(); + } + + /** + * {@inheritDoc} + */ + public function saveChanges() + { + try { + return RecurringService::edit($this); + } catch (ApiException $exc) { + throw new ApiException('Update failed, see inner exception for more details', $exc); + } + } + + protected static function getIdentifierName() + { + if (static::class === Customer::class) { + return 'customerIdentifier'; + } elseif (static::class === RecurringPaymentMethod::class) { + return 'paymentMethodIdentifier'; + } elseif (static::class === Schedule::class) { + return 'scheduleIdentifier'; + } + return ''; + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Reporting/AltPaymentData.php b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Reporting/AltPaymentData.php new file mode 100644 index 0000000..1c7587e --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Reporting/AltPaymentData.php @@ -0,0 +1,38 @@ + + */ + public $cardTypes; + + /** + * @var string + */ + public $checkFirstName; + + /** + * @var string + */ + public $checkLastName; + + /** + * @var string + */ + public $checkName; + + /** + * @var string + */ + public $checkNumber; + + /** + * @var string + */ + public $clerkId; + + /** + * @var string + */ + public $clientTransactionId; + + /** + * @var string + */ + public $customerId; + + /** + * @var string + */ + public $displayName; + + /** + * @var DateTime + */ + public $endDate; + + /** + * @var string + */ + public $giftCurrency; + + /** + * @var string + */ + public $giftMaskedAlias; + + /** + * @var bool + */ + public $fullyCaptured; + + /** + * @var string + */ + public $invoiceNumber; + + /** + * @var string + */ + public $issuerResult; + + /** + * @var string + */ + public $issuerTransactionId; + + /** + * @var bool + */ + public $oneTime; + + /** + * @var string + */ + public $paymentMethodKey; + + /** + * @var IEnumerable + */ + public $paymentTypes; + + /** + * @var string + */ + public $referenceNumber; + + /** + * @var IEnumerable + */ + public $transactionType; + + /** + * @var decimal + */ + public $settlementAmount; + + /** + * @var string + */ + public $scheduleId; + + /** + * @var string + */ + public $siteTrace; + + /** + * @var DateTime + */ + public $startDate; + + /** + * @var string + */ + public $uniqueDeviceId; + + /** + * @var string + */ + public $username; + + public function __construct(TransactionReportBuilder $reportBuilder = null) + { + $this->reportBuilder = $reportBuilder; + } + + public function and($criteria, $value) + { + if (property_exists($this, $criteria)) { + $this->{$criteria} = $value; + } + return $this; + } + + public function execute($configName = "default") + { + if (($this->reportBuilder) === null) { + throw new ArgumentException( + sprintf( + 'ReportBuilder is null', + $this->reportBuilder, + static::class + ) + ); + } + return $this->reportBuilder->execute($configName); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Reporting/TransactionSummary.php b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Reporting/TransactionSummary.php new file mode 100644 index 0000000..4b85dc9 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Reporting/TransactionSummary.php @@ -0,0 +1,386 @@ +customerKey = $customerKey; + $this->paymentKey = $paymentKey; + } + + /** + * The total amount for the schedule (`Schedule::$amount` + `Schedule::$taxAmount`). + * + * @return float|string|null + */ + public function getTotalAmount() + { + return $this->amount + $this->taxAmount; + } + + /** + * Sets the schedule's amount. + * + * @param float|string $value The amount + * + * @return Schedule + */ + public function withAmount($value) + { + $this->amount = $value; + return $this; + } + + /** + * Sets the schedule's currency. + * + * @param string $value The currency + * + * @return Schedule + */ + public function withCurrency($value) + { + $this->currency = $value; + return $this; + } + + /** + * Sets the schedule's customer. + * + * @param string $value The customer's key + * + * @return Schedule + */ + public function withCustomerKey($value) + { + $this->customerKey = $value; + return $this; + } + + /** + * Sets the schedule's description. + * + * @param string $value The description + * + * @return Schedule + */ + public function withDescription($value) + { + $this->description = $value; + return $this; + } + + /** + * Sets the schedule's device ID. + * + * @param integer $value The device ID + * + * @return Schedule + */ + public function withDeviceId($value) + { + $this->deviceId = $value; + return $this; + } + + /** + * Sets whether the schedule should send email notifications. + * + * @param boolean $value The email notification flag + * + * @return Schedule + */ + public function withEmailNotification($value) + { + $this->emailNotification = $value; + return $this; + } + + /** + * Sets when the schedule should email receipts. + * + * @param EmailReceipt $value When the schedule should email receipts + * + * @return Schedule + */ + public function withEmailReceipt($value) + { + $this->emailReceipt = $value; + return $this; + } + + /** + * Sets the schedule's end date. + * + * @param DateTime $value The end date + * + * @return Schedule + */ + public function withEndDate($value) + { + $this->endDate = $value; + return $this; + } + + /** + * Sets the schedule's frequency. + * + * @param string $value The frequency + * + * @return Schedule + */ + public function withFrequency($value) + { + $this->frequency = $value; + return $this; + } + + /** + * Sets the schedule's invoice number. + * + * @param string $value The invoice number + * + * @return Schedule + */ + public function withInvoiceNumber($value) + { + $this->invoiceNumber = $value; + return $this; + } + + /** + * Sets the schedule's name. + * + * @param string $value The name + * + * @return Schedule + */ + public function withName($value) + { + $this->name = $value; + return $this; + } + + /** + * Sets the schedule's number of payments. + * + * @param integer $value The number of payments + * + * @return Schedule + */ + public function withNumberOfPayments($value) + { + $this->numberOfPayments = $value; + return $this; + } + + /** + * Sets the schedule's purchase order (PO) number. + * + * @param string $value The purchase order (PO) number + * + * @return Schedule + */ + public function withPoNumber($value) + { + $this->poNumber = $value; + return $this; + } + + /** + * Sets the schedule's payment method. + * + * @param string $value The payment method's key + * + * @return Schedule + */ + public function withPaymentKey($value) + { + $this->paymentKey = $value; + return $this; + } + + /** + * Sets the schedule's recurring schedule. + * + * @param PaymentSchedule $value The recurring schedule + * + * @return Schedule + */ + public function withPaymentSchedule($value) + { + $this->paymentSchedule = $value; + return $this; + } + + /** + * Sets the schedule's reprocessing count. + * + * @param integer $value The reprocessing count + * + * @return Schedule + */ + public function withReprocessingCount($value) + { + $this->reprocessingCount = $value; + return $this; + } + + /** + * Sets the schedule's start date. + * + * @param DateTime $value The start date + * + * @return Schedule + */ + public function withStartDate($value) + { + $this->startDate = $value; + return $this; + } + + /** + * Sets the schedule's status. + * + * @param string $value The new status + * + * @return Schedule + */ + public function withStatus($value) + { + $this->status = $value; + return $this; + } + + /** + * Sets the schedule's tax amount. + * + * @param float|string $value The tax amount + * + * @return Schedule + */ + public function withTaxAmount($value) + { + $this->taxAmount = $value; + return $this; + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/StoredCredential.php b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/StoredCredential.php new file mode 100644 index 0000000..20133f0 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/StoredCredential.php @@ -0,0 +1,19 @@ +amount; + } + + /** + * @return void + */ + public function setAmount($value) + { + $this->amount = $value; + $this->getMerchantData()->add('amount', $this->amount, false); + } + + /** + * Consumer authentication (3DSecure) verification value + * + * @var string + */ + public $cavv; + + /** + * @var bool + */ + public $challengeMandated; + + /** + * @var string + */ + public $criticalityIndicator; + + /** + * @var string + */ + private $currency; + + /** + * @return string + */ + public function getCurrency() + { + return $this->currency; + } + + /** + * @return string + */ + public function setCurrency($value) + { + $this->currency = $value; + $this->merchantData->add('currency', $this->currency, false); + } + + /** + * @var string + */ + public $directoryServerTransactionId; + + /** + * @var string + */ + public $directoryServerEndVersion; + + /** + * @var string + */ + public $directoryServerStartVersion; + + /** + * Consumer authentication (3DSecure) electronic commerce indicator + * + * @var int + */ + public $eci; + + /** + * The enrollment status + * + * @var string + */ + public $enrolled; + + /** + * The URL of the Issuing Bank's ACS + * + * @var string + */ + public $issuerAcsUrl; + + /** + * A KVP collection of merchant supplied data + * + * @var MerchantDataCollection + */ + private $merchantData; + + /** + * @return MerchantDataCollection + */ + public function getMerchantData() + { + if (empty($this->merchantData)) { + $this->merchantData = new MerchantDataCollection(); + } + return $this->merchantData; + } + + /** + * @return void + */ + public function setMerchantData($merchantData) + { + if (!empty($this->merchantData)) { + $merchantData->mergeHidden($this->merchantData); + } + + $this->merchantData = $merchantData; + if ($this->merchantData->hasKey('amount')) { + $this->amount = $this->merchantData->getValue('amount'); + } + if ($this->merchantData->hasKey('currency')) { + $this->currency = $this->merchantData->getValue('currency'); + } + if ($this->merchantData->hasKey('orderId')) { + $this->orderId = $this->merchantData->getValue('orderId'); + } + if ($this->merchantData->hasKey('version')) { + $this->version = $this->merchantData->getValue('version'); + } + } + + /** + * @var string + */ + public $messageCategory; + + /** + * @var string + */ + public $messageExtensionId; + + /** + * @var string + */ + public $messageExtensionName; + + /** + * @var string + */ + public $messageVersion; + + /** + * The order ID used for the initial transaction + * + * @var string + */ + private $orderId; + + /** + * @return string + */ + public function getOrderId() + { + return $this->orderId; + } + + /** + * @return void + */ + public function setOrderId($value) + { + $this->orderId = $value; + $this->merchantData->add('orderId', $this->orderId, false); + } + + /** + * The Payer Authentication Request returned by the Enrollment Server. + * Must be sent to the Issuing Bank's ACS (Access Control Server) URL. + * + * @var string + */ + public $payerAuthenticationRequest; + + /** + * Consumer authentication (3DSecure) source + * + * @var string + */ + public $paymentDataSource; + + /** + * Consumer authentication (3DSecure) type. + * Default value is "3DSecure" + * + * @var string + */ + public $paymentDataType; + + /** + * @var string + */ + public $sdkInterface; + + /** + * @var enum + */ + public $sdkUiType; + + /** + * @var string + */ + public $serverTransactionId; + + /** + * @var string + */ + public $status; + + /** + * @var string + */ + public $statusReason; + + /** @var Secure3dVersion */ + private $version; + + /** @return Secure3dVersion */ + public function getVersion() + { + return $this->version; + } + + /** @return void */ + public function setVersion($version) + { + $this->version = $version; + $this->merchantData->add('version', $version, false); + } + + /** + * Consumer authentication (3DSecure) transaction ID + * + * @var string + */ + public $xid; + + public function __construct() + { + $this->paymentDataType = '3DSecure'; + if (empty($this->merchantData)) { + $this->merchantData = new MerchantDataCollection(); + } + } + + /** + * @return void + */ + public function merge(ThreeDSecure $secureEcom) + { + if (!empty($secureEcom)) { + $this->acsTransactionId = $this->mergeValue($this->acsTransactionId, $secureEcom->acsTransactionId); + $this->acsEndVersion = $this->mergeValue($this->acsEndVersion, $secureEcom->acsEndVersion); + $this->acsStartVersion = $this->mergeValue($this->acsStartVersion, $secureEcom->acsStartVersion); + $this->algorithm = $this->mergeValue($this->algorithm, $secureEcom->algorithm); + $this->amount = $this->mergeValue($this->amount, $secureEcom->amount); + $this->authenticationSource = $this->mergeValue($this->authenticationSource, $secureEcom->authenticationSource); + $this->authenticationType = $this->mergeValue($this->authenticationType, $secureEcom->authenticationType); + $this->authenticationValue = $this->mergeValue($this->authenticationValue, $secureEcom->authenticationValue); + $this->cardHolderResponseInfo = $this->mergeValue($this->cardHolderResponseInfo, $secureEcom->cardHolderResponseInfo); + $this->cavv = $this->mergeValue($this->cavv, $secureEcom->cavv); + $this->challengeMandated = $this->mergeValue($this->challengeMandated, $secureEcom->challengeMandated); + $this->criticalityIndicator = $this->mergeValue($this->criticalityIndicator, $secureEcom->criticalityIndicator); + $this->currency = $this->mergeValue($this->currency, $secureEcom->currency); + $this->directoryServerTransactionId = $this->mergeValue($this->directoryServerTransactionId, $secureEcom->directoryServerTransactionId); + $this->directoryServerEndVersion = $this->mergeValue($this->directoryServerEndVersion, $secureEcom->directoryServerEndVersion); + $this->directoryServerStartVersion = $this->mergeValue($this->directoryServerStartVersion, $secureEcom->directoryServerStartVersion); + $this->eci = $this->mergeValue($this->eci, $secureEcom->eci); + $this->enrolled = $this->mergeValue($this->enrolled, $secureEcom->enrolled); + $this->issuerAcsUrl = $this->mergeValue($this->issuerAcsUrl, $secureEcom->issuerAcsUrl); + $this->messageCategory = $this->mergeValue($this->messageCategory, $secureEcom->messageCategory); + $this->messageExtensionId = $this->mergeValue($this->messageExtensionId, $secureEcom->messageExtensionId); + $this->messageExtensionName = $this->mergeValue($this->messageExtensionName, $secureEcom->messageExtensionName); + $this->messageVersion = $this->mergeValue($this->messageVersion, $secureEcom->messageVersion); + $this->orderId = $this->mergeValue($this->orderId, $secureEcom->orderId); + $this->payerAuthenticationRequest = $this->mergeValue($this->payerAuthenticationRequest, $secureEcom->payerAuthenticationRequest); + $this->paymentDataSource = $this->mergeValue($this->paymentDataSource, $secureEcom->paymentDataSource); + $this->paymentDataType = $this->mergeValue($this->paymentDataType, $secureEcom->paymentDataType); + $this->sdkInterface = $this->mergeValue($this->sdkInterface, $secureEcom->sdkInterface); + $this->sdkUiType = $this->mergeValue($this->sdkUiType, $secureEcom->sdkUiType); + $this->serverTransactionId = $this->mergeValue($this->serverTransactionId, $secureEcom->serverTransactionId); + $this->status = $this->mergeValue($this->status, $secureEcom->status); + $this->statusReason = $this->mergeValue($this->statusReason, $secureEcom->statusReason); + $this->version = $this->mergeValue($this->version, $secureEcom->version); + $this->xid = $this->mergeValue($this->xid, $secureEcom->xid); + } + } + + /** + * @return mixed + */ + public function mergeValue($currentValue, $mergeValue) + { + if ($mergeValue == null) { + return $currentValue; + } + return $mergeValue; + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Transaction.php b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Transaction.php new file mode 100644 index 0000000..ffae75b --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Transaction.php @@ -0,0 +1,461 @@ +transactionReference = new TransactionReference(); + $txn->transactionReference->transactionId = $transactionId; + $txn->transactionReference->paymentMethodType = $paymentMethodType; + $txn->transactionReference->orderId = $orderId; + return $txn; + } + + /** + * Creates an additional authorization against the original transaction. + * + * @param string|float $amount The additional amount to authorize + * + * @return AuthorizationBuilder + */ + public function additionalAuth($amount = null) + { + return (new AuthorizationBuilder(TransactionType::AUTH)) + ->withPaymentMethod($this->transactionReference) + ->withAmount($amount); + } + + /** + * Captures the original transaction. + * + * @param string|float $amount The amount to capture + * + * @return ManagementBuilder + */ + public function capture($amount = null) + { + return (new ManagementBuilder(TransactionType::CAPTURE)) + ->withPaymentMethod($this->transactionReference) + ->withAmount($amount); + } + + /** + * Edits the original transaction. + * + * @return ManagementBuilder + */ + public function edit() + { + $builder = (new ManagementBuilder(TransactionType::EDIT)) + ->withPaymentMethod($this->transactionReference); + + if ($this->commercialIndicator !== null) { + $builder = $builder->withModifier(TransactionModifier::LEVEL_II); + } + + return $builder; + } + + /** + * Places the original transaction on hold. + * + * @return ManagementBuilder + */ + public function hold() + { + return (new ManagementBuilder(TransactionType::HOLD)) + ->withPaymentMethod($this->transactionReference); + } + + /** + * Refunds/returns the original transaction. + * + * @param string|float $amount The amount to refund/return + * + * @return ManagementBuilder + */ + public function refund($amount = null) + { + return (new ManagementBuilder(TransactionType::REFUND)) + ->withPaymentMethod($this->transactionReference) + ->withAmount($amount); + } + + /** + * Releases the original transaction from a hold. + * + * @return ManagementBuilder + */ + public function release() + { + return (new ManagementBuilder(TransactionType::RELEASE)) + ->withPaymentMethod($this->transactionReference); + } + + /** + * Reverses the original transaction. + * + * @param string|float $amount The original authorization amount + * + * @return ManagementBuilder + */ + public function reverse($amount = null) + { + return (new ManagementBuilder(TransactionType::REVERSAL)) + ->withPaymentMethod($this->transactionReference) + ->withAmount($amount); + } + + /** + * Voids the original transaction. + * + * @return ManagementBuilder + */ + public function void() + { + return (new ManagementBuilder(TransactionType::VOID)) + ->withPaymentMethod($this->transactionReference); + } + + public function __get($name) + { + switch ($name) { + case 'authorizationCode': + if ($this->transactionReference !== null) { + return $this->transactionReference->authCode; + } + return null; + case 'clientTransactionId': + if ($this->transactionReference !== null) { + return $this->transactionReference->clientTransactionId; + } + return null; + case 'orderId': + if ($this->transactionReference !== null) { + return $this->transactionReference->orderId; + } + return null; + case 'paymentMethodType': + if ($this->transactionReference !== null) { + return $this->transactionReference->paymentMethodType; + } + return PaymentMethodType::CREDIT; + case 'transactionId': + if ($this->transactionReference !== null) { + return $this->transactionReference->transactionId; + } + return null; + default: + break; + } + + if (property_exists($this, $name)) { + return $this->{$name}; + } + + throw new ArgumentException(sprintf('Property `%s` does not exist on Transaction', $name)); + } + + public function __isset($name) + { + return in_array($name, [ + 'transactionId', + 'orderId', + 'authorizationId', + 'paymentMethodType', + 'clientTransactionId', + ]) || isset($this->{$name}); + } + + public function __set($name, $value) + { + switch ($name) { + case 'authorizationCode': + if (!$this->transactionReference instanceof TransactionReference) { + $this->transactionReference = new TransactionReference(); + } + $this->transactionReference->authCode = $value; + return; + case 'clientTransactionId': + if (!$this->transactionReference instanceof TransactionReference) { + $this->transactionReference = new TransactionReference(); + } + $this->transactionReference->clientTransactionId = $value; + return; + case 'orderId': + if (!$this->transactionReference instanceof TransactionReference) { + $this->transactionReference = new TransactionReference(); + } + $this->transactionReference->orderId = $value; + return; + case 'paymentMethodType': + if (!$this->transactionReference instanceof TransactionReference) { + $this->transactionReference = new TransactionReference(); + } + $this->transactionReference->paymentMethodType = $value; + return; + case 'transactionId': + if (!$this->transactionReference instanceof TransactionReference) { + $this->transactionReference = new TransactionReference(); + } + $this->transactionReference->transactionId = $value; + return; + default: + break; + } + + if (property_exists($this, $name)) { + return $this->{$name} = $value; + } + + throw new ArgumentException(sprintf('Property `%s` does not exist on Transaction', $name)); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/TransactionSummary.php b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/TransactionSummary.php new file mode 100644 index 0000000..fca931c --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/TransactionSummary.php @@ -0,0 +1,142 @@ + + */ + public $headers; + + /** + * @var integer|string + */ + public $timeout; + + /** + * @var string + */ + public $serviceUrl; + + /** + * @var array + */ + public $curlOptions; + + /** + * @param string $contentType + * + * @return + */ + public function __construct($contentType) + { + $this->headers = []; + $this->contentType = $contentType; + } + + /** + * @return array + */ + protected function getHttpOptions() + { + return []; + } + + /** + * Uses cURL to communicate with the gateway service + * + * @param string $verb + * @param string $endpoint + * @param string|null $data + * @param array|null $queryStringParams + * + * @throws \Exception + * @return GatewayResponse + */ + protected function sendRequest( + $verb, + $endpoint, + $data = null, + array $queryStringParams = null, + $headers = [] + ) { + try { + $queryString = $this->buildQueryString($queryStringParams); + $request = curl_init($this->serviceUrl . $endpoint . $queryString); + + $this->headers = array_merge($this->headers, $headers, [ + 'Content-Type' => sprintf('%s', $this->contentType), + 'Content-Length' => $data === null ? 0 : strlen($data), + ]); + + $headers = []; + foreach ($this->headers as $key => $value) { + $headers[] = $key . ': '. $value; + } + + curl_setopt($request, CURLOPT_CONNECTTIMEOUT, $this->timeout); + curl_setopt($request, CURLOPT_TIMEOUT, $this->timeout); + curl_setopt($request, CURLOPT_RETURNTRANSFER, true); + curl_setopt($request, CURLOPT_SSL_VERIFYPEER, false); //true,); + curl_setopt($request, CURLOPT_SSL_VERIFYHOST, false); //2,); + curl_setopt($request, CURLOPT_CUSTOMREQUEST, strtoupper($verb)); + curl_setopt($request, CURLOPT_POSTFIELDS, $data); + curl_setopt($request, CURLOPT_HTTPHEADER, $headers); + curl_setopt($request, CURLOPT_PROTOCOLS, CURLPROTO_HTTPS); + curl_setopt($request, CURLOPT_VERBOSE, false); + curl_setopt($request, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2); + + if ($this->curlOptions != null && !empty($this->curlOptions)) { + curl_setopt_array($request, $this->curlOptions); + } + + $curlResponse = curl_exec($request); + $curlInfo = curl_getinfo($request); + $curlError = curl_errno($request); + + $response = new GatewayResponse(); + $response->statusCode = $curlInfo['http_code']; + $response->rawResponse = $curlResponse; + return $response; + } catch (\Exception $e) { + throw new \Exception( + "Error occurred while communicating with gateway.", + $e->getCode(), + $e + ); + } + } + + /** + * @param array|null $queryStringParams + * + * @return string + */ + private function buildQueryString(array $queryStringParams = null) + { + if ($queryStringParams === null) { + return ''; + } + + $query = []; + + foreach ($queryStringParams as $key => $value) { + $query[] = sprintf('%s=%s', $key, $value); + } + + return sprintf('?%s', implode('&', $query)); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Gateways/GatewayResponse.php b/classes/includes/vendor/globalpayments/php-sdk/src/Gateways/GatewayResponse.php new file mode 100644 index 0000000..f573a66 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Gateways/GatewayResponse.php @@ -0,0 +1,16 @@ +version; + } + + /** @return void */ + public function setAccountId($accountId) + { + $this->accountId = $accountId; + } + /** @return void */ + public function setMerchantId($merchantId) + { + $this->merchantId = $merchantId; + } + /** @return void */ + public function setSharedSecret($sharedSecret) + { + $this->sharedSecret = $sharedSecret; + } + /** @return void */ + public function setChallengeNotificationUrl($challengeNotificationUrl) + { + $this->challengeNotificationUrl = $challengeNotificationUrl; + } + /** @return void */ + public function setMerchantContactUrl($merchantContactUrl) + { + $this->merchantContactUrl = $merchantContactUrl; + } + /** @return void */ + public function setMethodNotificationUrl($methodNotificationUrl) + { + $this->methodNotificationUrl = $methodNotificationUrl; + } + + protected function maybeSetKey(array $arr, $key, $value = null) + { + if (!is_null($value)) { + $arr[$key] = $value; + } + return $arr; + } + + /** + * @throws ApiException + * @return Transaction */ + public function processSecure3d(Secure3dBuilder $builder) + { + $transType = $builder->getTransactionType(); + $timestamp = date("Y-m-d\TH:i:s.u"); + $paymentMethod = $builder->getPaymentMethod(); + $secure3d = $paymentMethod; + + $request = []; + if ($transType === TransactionType::VERIFY_ENROLLED) { + $request = $this->maybeSetKey($request, 'request_timestamp', $timestamp); + $request = $this->maybeSetKey($request, 'merchant_id', $this->merchantId); + $request = $this->maybeSetKey($request, 'account_id', $this->accountId); + $request = $this->maybeSetKey($request, 'method_notification_url', $this->methodNotificationUrl); + + $hashValue = ''; + if ($paymentMethod instanceof CreditCardData) { + $cardData = $paymentMethod; + $request = $this->maybeSetKey($request, 'number', $cardData->number); + $request = $this->maybeSetKey($request, 'scheme', $this->mapCardScheme(strtoupper($cardData->getCardType()))); + $hashValue = $cardData->number; + } elseif ($paymentMethod instanceof RecurringPaymentMethod) { + $storedCard = $paymentMethod; + $request = $this->maybeSetKey($request, 'payer_reference', $storedCard->customerKey); + $request = $this->maybeSetKey($request, 'payment_method_reference', $storedCard->key); + $hashValue = $storedCard->customerKey; + } + + $hash = GenerationUtils::generateHash($this->sharedSecret, implode('.', [$timestamp, $this->merchantId, $hashValue])); + $headers['Authorization'] = sprintf('securehash %s', $hash); + + $rawResponse = $this->doTransaction('POST', 'protocol-versions', json_encode($request), null, $headers); + return $this->mapResponse($rawResponse); + } elseif ($transType === TransactionType::VERIFY_SIGNATURE) { + $hash = GenerationUtils::generateHash($this->sharedSecret, implode('.', [$timestamp, $this->merchantId, $builder->getServerTransactionId()])); + $headers['Authorization'] = sprintf('securehash %s', $hash); + + $queryValues = []; + $queryValues['merchant_id'] = $this->merchantId; + $queryValues['request_timestamp'] = $timestamp; + $rawResponse = $this->doTransaction('GET', sprintf('authentications/%s', $builder->getServerTransactionId()), null, $queryValues, $headers); + return $this->mapResponse($rawResponse); + } elseif ($transType === TransactionType::INITIATE_AUTHENTICATION) { + $orderId = $builder->getOrderId(); + if (empty($orderId)) { + $orderId = GenerationUtils::generateOrderId(); + } + + $secureEcom = $secure3d->threeDSecure; + + $request = $this->maybeSetKey($request, 'request_timestamp', $timestamp); + $request = $this->maybeSetKey($request, 'authentication_source', $builder->getAuthenticationSource()); + $request = $this->maybeSetKey($request, 'authentication_request_type', $builder->getAuthenticationRequestType()); + $request = $this->maybeSetKey($request, 'message_category', $builder->getMessageCategory()); + $request = $this->maybeSetKey($request, 'message_version', '2.1.0'); + $request = $this->maybeSetKey($request, 'server_trans_id', $secureEcom->serverTransactionId); + $request = $this->maybeSetKey($request, 'merchant_id', $this->merchantId); + $request = $this->maybeSetKey($request, 'account_id', $this->accountId); + $request = $this->maybeSetKey($request, 'challenge_notification_url', $this->challengeNotificationUrl); + $request = $this->maybeSetKey($request, 'method_url_completion', $builder->getMethodUrlCompletion()); + $request = $this->maybeSetKey($request, 'merchant_contact_url', $this->merchantContactUrl); + $request = $this->maybeSetKey($request, 'merchant_initiated_request_type', $builder->getMerchantInitiatedRequestType()); + + // card details + $hashValue = ''; + $request['card_detail'] = []; + if ($paymentMethod instanceof CreditCardData) { + $cardData = $paymentMethod; + $hashValue = $cardData->number; + + $request['card_detail'] = $this->maybeSetKey($request['card_detail'], 'number', $cardData->number); + $request['card_detail'] = $this->maybeSetKey($request['card_detail'], 'scheme', strtoupper($cardData->getCardType())); + $request['card_detail'] = $this->maybeSetKey($request['card_detail'], 'expiry_month', $cardData->expMonth); + $request['card_detail'] = $this->maybeSetKey($request['card_detail'], 'expiry_year', substr($cardData->expYear, 2)); + $request['card_detail'] = $this->maybeSetKey($request['card_detail'], 'full_name', $cardData->cardHolderName); + + if (!empty($cardData->cardHolderName)) { + $names = explode(' ', $cardData->cardHolderName); + if (count($names) >= 1) { + $request['card_detail'] = $this->maybeSetKey($request['card_detail'], 'first_name', $names[0]); + } + if (count($names) >= 2) { + $request['card_detail'] = $this->maybeSetKey($request['card_detail'], 'last_name', $names[1]); + } + } + } elseif ($paymentMethod instanceof RecurringPaymentMethod) { + $storedCard = $paymentMethod; + $hashValue = $storedCard->customerKey; + + $request['card_detail'] = $this->maybeSetKey($request['card_detail'], 'payer_reference', $storedCard->customerKey); + $request['card_detail'] = $this->maybeSetKey($request['card_detail'], 'payment_method_reference', $storedCard->key); + } + + // order details + $request['order'] = []; + $request['order'] = $this->maybeSetKey($request['order'], 'amount', preg_replace('/[^0-9]/', '', sprintf('%01.2f', $builder->getAmount()))); + $request['order'] = $this->maybeSetKey($request['order'], 'currency', $builder->getCurrency()); + $request['order'] = $this->maybeSetKey($request['order'], 'id', $orderId); + $request['order'] = $this->maybeSetKey($request['order'], 'address_match_indicator', ($builder->isAddressMatchIndicator() ? true : false)); + $request['order'] = $this->maybeSetKey($request['order'], 'date_time_created', (new \DateTime($builder->getOrderCreateDate()))->format(\DateTime::RFC3339_EXTENDED)); + $request['order'] = $this->maybeSetKey($request['order'], 'gift_card_count', $builder->getGiftCardCount()); + $request['order'] = $this->maybeSetKey($request['order'], 'gift_card_currency', $builder->getGiftCardCurrency()); + $request['order'] = $this->maybeSetKey($request['order'], 'gift_card_amount', preg_replace('/[^0-9]/', '', sprintf('%01.2f', $builder->getGiftCardAmount()))); + $request['order'] = $this->maybeSetKey($request['order'], 'delivery_email', $builder->getDeliveryEmail()); + $request['order'] = $this->maybeSetKey($request['order'], 'delivery_timeframe', $builder->getDeliveryTimeframe()); + $request['order'] = $this->maybeSetKey($request['order'], 'shipping_method', $builder->getShippingMethod()); + $request['order'] = $this->maybeSetKey($request['order'], 'shipping_name_matches_cardholder_name', $builder->getShippingNameMatchesCardHolderName()); + $request['order'] = $this->maybeSetKey($request['order'], 'preorder_indicator', $builder->getPreOrderIndicator()); + $request['order'] = $this->maybeSetKey($request['order'], 'reorder_indicator', $builder->getReorderIndicator()); + $request['order'] = $this->maybeSetKey($request['order'], 'transaction_type', $builder->getOrderTransactionType()); + $request['order'] = $this->maybeSetKey($request['order'], 'preorder_availability_date', null !== $builder->getPreOrderAvailabilityDate() ? date('Y-m-d', $builder->getPreOrderAvailabilityDate()) : null); + + // shipping address + $shippingAddress = $builder->getShippingAddress(); + if (!empty($shippingAddress)) { + $request['order']['shipping_address'] = []; + $request['order']['shipping_address'] = $this->maybeSetKey($request['order']['shipping_address'], 'line1', $shippingAddress->streetAddress1); + $request['order']['shipping_address'] = $this->maybeSetKey($request['order']['shipping_address'], 'line2', $shippingAddress->streetAddress2); + $request['order']['shipping_address'] = $this->maybeSetKey($request['order']['shipping_address'], 'line3', $shippingAddress->streetAddress3); + $request['order']['shipping_address'] = $this->maybeSetKey($request['order']['shipping_address'], 'city', $shippingAddress->city); + $request['order']['shipping_address'] = $this->maybeSetKey($request['order']['shipping_address'], 'postal_code', $shippingAddress->postalCode); + $request['order']['shipping_address'] = $this->maybeSetKey($request['order']['shipping_address'], 'state', $shippingAddress->state); + $request['order']['shipping_address'] = $this->maybeSetKey($request['order']['shipping_address'], 'country', $shippingAddress->countryCode); + } + + // payer + $request['payer'] = []; + $request['payer'] = $this->maybeSetKey($request['payer'], 'email', $builder->getCustomerEmail() ?? null); + $request['payer'] = $this->maybeSetKey($request['payer'], 'id', $builder->getCustomerAccountId()); + $request['payer'] = $this->maybeSetKey($request['payer'], 'account_age', $builder->getAccountAgeIndicator()); + $request['payer'] = $this->maybeSetKey($request['payer'], 'account_creation_date', null !== $builder->getAccountCreateDate() ? date('Y-m-d', strtotime($builder->getAccountCreateDate())) : null); + $request['payer'] = $this->maybeSetKey($request['payer'], 'account_change_indicator', $builder->getAccountChangeIndicator()); + $request['payer'] = $this->maybeSetKey($request['payer'], 'account_change_date', null !== $builder->getAccountChangeDate() ? date('Y-m-d', strtotime($builder->getAccountChangeDate())) : null); + $request['payer'] = $this->maybeSetKey($request['payer'], 'account_password_change_indicator', $builder->getPasswordChangeIndicator()); + $request['payer'] = $this->maybeSetKey($request['payer'], 'account_password_change_date', null !== $builder->getPasswordChangeDate() ? date('Y-m-d', strtotime($builder->getPasswordChangeDate())) : null); + $request['payer'] = $this->maybeSetKey($request['payer'], 'payment_account_age_indicator', $builder->getAccountAgeIndicator()); + $request['payer'] = $this->maybeSetKey($request['payer'], 'payment_account_creation_date', null !== $builder->getAccountCreateDate() ? date('Y-m-d', strtotime($builder->getAccountCreateDate())) : null); + $request['payer'] = $this->maybeSetKey($request['payer'], 'purchase_count_last_6months', $builder->getNumberOfPurchasesInLastSixMonths()); + $request['payer'] = $this->maybeSetKey($request['payer'], 'transaction_count_last_24hours', $builder->getNumberOfTransactionsInLast24Hours()); + $request['payer'] = $this->maybeSetKey($request['payer'], 'transaction_count_last_year', $builder->getNumberOfTransactionsInLastYear()); + $request['payer'] = $this->maybeSetKey($request['payer'], 'provision_attempt_count_last_24hours', $builder->getNumberOfAddCardAttemptsInLast24Hours()); + $request['payer'] = $this->maybeSetKey($request['payer'], 'shipping_address_creation_indicator', $builder->getShippingAddressUsageIndicator()); + $request['payer'] = $this->maybeSetKey($request['payer'], 'shipping_address_creation_date', null !== $builder->getShippingAddressCreateDate() ? date('Y-m-d', strtotime($builder->getShippingAddressCreateDate())) : null); + + // suspicious activity + if ($builder->getPreviousSuspiciousActivity() != null) { + $request['payer'] = $this->maybeSetKey($request['payer'], 'suspicious_account_activity', $builder->getPreviousSuspiciousActivity() ? 'SUSPICIOUS_ACTIVITY' : 'NO_SUSPICIOUS_ACTIVITY'); + } + + // home phone + if (!empty($builder->getHomeNumber())) { + $request['payer']['home_phone'] = []; + $request['payer']['home_phone'] = $this->maybeSetKey($request['payer']['home_phone'], 'country_code', $builder->getHomeCountryCode()); + $request['payer']['home_phone'] = $this->maybeSetKey($request['payer']['home_phone'], 'subscriber_number', $builder->getHomeNumber()); + } + + // work phone + if (!empty($builder->getWorkNumber())) { + $request['payer']['work_phone'] = []; + $request['payer']['work_phone'] = $this->maybeSetKey($request['payer']['work_phone'], 'country_code', $builder->getWorkCountryCode()); + $request['payer']['work_phone'] = $this->maybeSetKey($request['payer']['work_phone'], 'subscriber_number', $builder->getWorkNumber()); + } + + // payer login data + if ($builder->hasPayerLoginData()) { + $request['payer_login_data'] = []; + $request['payer_login_data'] = $this->maybeSetKey($request['payer_login_data'], 'authentication_data', $builder->getCustomerAuthenticationData()); + $request['payer_login_data'] = $this->maybeSetKey($request['payer_login_data'], 'authentication_timestamp', $builder->getCustomerAuthenticationTimestamp()); + $request['payer_login_data'] = $this->maybeSetKey($request['payer_login_data'], 'authentication_type', $builder->getCustomerAuthenticationMethod()); + } + + // prior authentication data + if ($builder->hasPriorAuthenticationData()) { + $request['payer_prior_three_ds_authentication_data'] = []; + $request['payer_prior_three_ds_authentication_data'] = $this->maybeSetKey($request['payer_prior_three_ds_authentication_data'], 'authentication_method', $builder->getPriorAuthenticationMethod()); + $request['payer_prior_three_ds_authentication_data'] = $this->maybeSetKey($request['payer_prior_three_ds_authentication_data'], 'acs_transaction_id', $builder->getPriorAuthenticationTransactionId()); + $request['payer_prior_three_ds_authentication_data'] = $this->maybeSetKey($request['payer_prior_three_ds_authentication_data'], 'authentication_timestamp', date('Y-m-d\TH:i:s.u\Z', strtotime($builder->getPriorAuthenticationTimestamp()))); + $request['payer_prior_three_ds_authentication_data'] = $this->maybeSetKey($request['payer_prior_three_ds_authentication_data'], 'authentication_data', $builder->getPriorAuthenticationData()); + } + + // recurring authorization data + if ($builder->hasRecurringAuthData()) { + $request['recurring_authorization_data'] = []; + $request['recurring_authorization_data'] = $this->maybeSetKey($request['recurring_authorization_data'], 'max_number_of_installments', $builder->getMaxNumberOfInstallments()); + $request['recurring_authorization_data'] = $this->maybeSetKey($request['recurring_authorization_data'], 'frequency', $builder->getRecurringAuthorizationFrequency()); + $request['recurring_authorization_data'] = $this->maybeSetKey($request['recurring_authorization_data'], 'expiry_date', date('Y-m-d\TH:i:s.u\Z', strtotime($builder->getRecurringAuthorizationExpiryDate()))); + } + + // billing details + $billingAddress = $builder->getBillingAddress(); + if (!empty($billingAddress)) { + $request['payer']['billing_address'] = []; + $request['payer']['billing_address'] = $this->maybeSetKey($request['payer']['billing_address'], 'line1', $billingAddress->streetAddress1); + $request['payer']['billing_address'] = $this->maybeSetKey($request['payer']['billing_address'], 'line2', $billingAddress->streetAddress2); + $request['payer']['billing_address'] = $this->maybeSetKey($request['payer']['billing_address'], 'line3', $billingAddress->streetAddress3); + $request['payer']['billing_address'] = $this->maybeSetKey($request['payer']['billing_address'], 'city', $billingAddress->city); + $request['payer']['billing_address'] = $this->maybeSetKey($request['payer']['billing_address'], 'postal_code', $billingAddress->postalCode); + $request['payer']['billing_address'] = $this->maybeSetKey($request['payer']['billing_address'], 'state', $billingAddress->state); + $request['payer']['billing_address'] = $this->maybeSetKey($request['payer']['billing_address'], 'country', $billingAddress->countryCode); + } + + // mobile phone + if (!empty($builder->getMobileNumber())) { + $request['payer']['mobile_phone'] = []; + $request['payer']['mobile_phone'] = $this->maybeSetKey($request['payer']['mobile_phone'], 'country_code', $builder->getMobileCountryCode()); + $request['payer']['mobile_phone'] = $this->maybeSetKey($request['payer']['mobile_phone'], 'subscriber_number', $builder->getMobileNumber()); + } + + // browser_data + $browserData = $builder->getBrowserData(); + if (!empty($browserData)) { + $request['browser_data'] = []; + $request['browser_data'] = $this->maybeSetKey($request['browser_data'], 'accept_header', $browserData->acceptHeader); + $request['browser_data'] = $this->maybeSetKey($request['browser_data'], 'color_depth', $browserData->colorDepth); + $request['browser_data'] = $this->maybeSetKey($request['browser_data'], 'ip', $browserData->ipAddress); + $request['browser_data'] = $this->maybeSetKey($request['browser_data'], 'java_enabled', $browserData->javaEnabled); + $request['browser_data'] = $this->maybeSetKey($request['browser_data'], 'javascript_enabled', $browserData->javaScriptEnabled); + $request['browser_data'] = $this->maybeSetKey($request['browser_data'], 'language', $browserData->language); + $request['browser_data'] = $this->maybeSetKey($request['browser_data'], 'screen_height', $browserData->screenHeight); + $request['browser_data'] = $this->maybeSetKey($request['browser_data'], 'screen_width', $browserData->screenWidth); + $request['browser_data'] = $this->maybeSetKey($request['browser_data'], 'challenge_window_size', $browserData->challengWindowSize); + $request['browser_data'] = $this->maybeSetKey($request['browser_data'], 'timezone', $browserData->timeZone); + $request['browser_data'] = $this->maybeSetKey($request['browser_data'], 'user_agent', $browserData->userAgent); + } + + // mobile fields + if ($builder->hasMobileFields()) { + $request['sdk_information'] = []; + $request['sdk_information'] = $this->maybeSetKey($request['sdk_information'], 'application_id', $builder->getApplicationId()); + $request['sdk_information'] = $this->maybeSetKey($request['sdk_information'], 'ephemeral_public_key', $builder->getEphemeralPublicKey()); + $request['sdk_information'] = $this->maybeSetKey($request['sdk_information'], 'maximum_timeout', $builder->getMaximumTimeout()); + $request['sdk_information'] = $this->maybeSetKey($request['sdk_information'], 'reference_number', $builder->getReferenceNumber()); + $request['sdk_information'] = $this->maybeSetKey($request['sdk_information'], 'sdk_trans_id', $builder->getSdkTransactionId()); + $request['sdk_information'] = $this->maybeSetKey($request['sdk_information'], 'encoded_data', $builder->getEncodedData()); + } + + // device render options + if ($builder->getSdkInterface() != null || $builder->getSdkUiTypes() != null) { + $request['sdk_information']['device_render_options'] = []; + $request['sdk_information']['device_render_options'] = $this->maybeSetKey($request['sdk_information']['device_render_options'], 'sdk_interface', $builder->getSdkInterface()); + $request['sdk_information']['device_render_options'] = $this->maybeSetKey($request['sdk_information']['device_render_options'], 'sdk_ui_type', $builder->getSdkUiTypes()); + } + + $hash = GenerationUtils::generateHash($this->sharedSecret, implode('.', [$timestamp, $this->merchantId, $hashValue, $secureEcom->serverTransactionId])); + $headers['Authorization'] = sprintf('securehash %s', $hash); + $rawResponse = $this->doTransaction('POST', 'authentications', json_encode($request, JSON_UNESCAPED_SLASHES), null, $headers); + return $this->mapResponse($rawResponse); + } + + throw new ApiException(sprintf('Unknown transaction type %s.', $transType)); + } + + /** @return Transaction */ + private function mapResponse($rawResponse) + { + $doc = json_decode($rawResponse, true); + $secureEcom = new ThreeDSecure(); + + // check enrolled + $secureEcom->serverTransactionId = $doc['server_trans_id'] ?? null; + if (array_key_exists('enrolled', $doc)) { + $secureEcom->enrolled = (bool)$doc['enrolled']; + } + $secureEcom->issuerAcsUrl = ($doc['method_url'] ?? null) . ($doc['challenge_request_url'] ?? null); + + // get authentication data + $secureEcom->acsTransactionId = $doc['acs_trans_id'] ?? null; + $secureEcom->directoryServerTransactionId = $doc['ds_trans_id'] ?? null; + $secureEcom->authenticationType = $doc['authentication_type'] ?? null; + $secureEcom->authenticationValue = $doc['authentication_value'] ?? null; + $secureEcom->eci = $doc['eci'] ?? null; + $secureEcom->status = $doc['status'] ?? null; + $secureEcom->statusReason = $doc['status_reason'] ?? null; + $secureEcom->authenticationSource = $doc['authentication_source'] ?? null; + $secureEcom->messageCategory = $doc['message_category'] ?? null; + $secureEcom->messageVersion = $doc['message_version'] ?? null; + + // challenge mandated + if (array_key_exists('challenge_mandated', $doc)) { + $secureEcom->challengeMandated = (bool)$doc['challenge_mandated']; + } + + // initiate authentication + $secureEcom->cardHolderResponseInfo = $doc['cardHolder_response_info'] ?? null; + + // device_render_options + if (array_key_exists('device_render_options', $doc)) { + $renderOptions = $doc['device_render_options']; + $secureEcom->sdkInterface = $renderOptions['sdk_interface'] ?? null; + $secureEcom->sdkUiType = $renderOptions['sdk_ui_type'] ?? null; + } + + // message_extension + if (array_key_exists('message_extension', $doc)) { + $secureEcom->criticalityIndicator = $doc['message_extension']['criticality_indicator'] ?? null; + $secureEcom->messageExtensionId = $doc['message_extension']['id'] ?? null; + $secureEcom->messageExtensionName = $doc['message_extension']['name'] ?? null; + } + + // versions + $secureEcom->directoryServerEndVersion = $doc['ds_protocol_version_end'] ?? null; + $secureEcom->directoryServerStartVersion = $doc['ds_protocol_version_start'] ?? null; + $secureEcom->acsEndVersion = $doc['acs_protocol_version_end'] ?? null; + $secureEcom->acsStartVersion = $doc['acs_protocol_version_start'] ?? null; + + // payer authentication request + if (array_key_exists('method_data', $doc)) { + $methodData = $doc['method_data']; + $secureEcom->payerAuthenticationRequest = $methodData['encoded_method_data'] ?? null; + } elseif (array_key_exists('encoded_creq', $doc)) { + $secureEcom->payerAuthenticationRequest = $doc['encoded_creq'] ?? null; + } + + $response = new Transaction(); + $response->threeDSecure = $secureEcom; + return $response; + } + + private function mapCardScheme($cardType) + { + if ($cardType == "MC") { + return "MASTERCARD"; + } elseif ($cardType == "DINERSCLUB") { + return "DINERS"; + } else { + return $cardType; + } + } + + /** + * @throws GatewayException + * @return string */ + private function handleResponse(GatewayResponse $response) + { + if ($response->statusCode != 200 && $response->statusCode != 204) { + $parsed = json_decode($response->rawResponse, true); + if (array_key_exists('error', $parsed)) { + $error = $parsed['error']; + throw new GatewayException(sprintf("Status code: %s - %s", $response->statusCode, $error)); + } + throw new GatewayException(sprintf("Status code: %s - %s", $response->statusCode, $error)); + } + return $response->rawResponse; + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Gateways/IPaymentGateway.php b/classes/includes/vendor/globalpayments/php-sdk/src/Gateways/IPaymentGateway.php new file mode 100644 index 0000000..e3a6a86 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Gateways/IPaymentGateway.php @@ -0,0 +1,32 @@ +apiKey; + default: + break; + } + + if (property_exists($this, $name)) { + return $this->{$name}; + } + + throw new ArgumentException(sprintf('Property `%s` does not exist on PayPlanConnector', $name)); + } + + public function __isset($name) + { + return in_array($name, [ + 'secretApiKey', + ]) || isset($this->{$name}); + } + + public function __set($name, $value) + { + switch ($name) { + case 'secretApiKey': + $this->apiKey = $value; + $auth = sprintf('Basic %s', base64_encode($value)); + $this->headers['Authorization'] = $auth; + return; + default: + break; + } + + if (property_exists($this, $name)) { + return $this->{$name} = $value; + } + + throw new ArgumentException(sprintf('Property `%s` does not exist on PayPlanConnector', $name)); + } + + public function processRecurring(RecurringBuilder $builder) + { + $request = []; + + if ($builder->transactionType === TransactionType::CREATE + || $builder->transactionType === TransactionType::EDIT + ) { + if ($builder->entity instanceof Customer) { + $request = $this->buildCustomer($request, $builder->entity); + } + + if ($builder->entity instanceof RecurringPaymentMethod) { + $request = $this->buildPaymentMethod($request, $builder->entity, $builder->transactionType); + } + + if ($builder->entity instanceof Schedule) { + $request = $this->buildSchedule($request, $builder->entity, $builder->transactionType); + } + } + + if ($builder->transactionType === TransactionType::SEARCH) { + foreach ($builder->searchCriteria as $key => $value) { + $request[$key] = $value; + } + } + + foreach ($request as $key => $value) { + if ($value !== 0 && empty($value)) { + unset($request[$key]); + } + } + + $response = $this->doTransaction( + $this->mapMethod($builder->transactionType), + $this->mapUrl($builder), + $request === [] ? '{}' : json_encode($request) + ); + return $this->mapResponse($builder, $response); + } + + #region Mappers + protected function mapResponse($builder, $rawResponse) + { + // this is for DELETE which returns nothing + if (empty($rawResponse)) { + return null; + } + + // else do the whole shebang + $response = json_decode($rawResponse); + + if ($builder->entity instanceof Customer + && $builder->transactionType === TransactionType::SEARCH + ) { + $customers = []; + foreach ($response->results as $customer) { + $customers[] = $this->hydrateCustomer($customer); + } + return $customers; + } + + if ($builder->entity instanceof Customer) { + return $this->hydrateCustomer($response); + } + + if ($builder->entity instanceof RecurringPaymentMethod + && $builder->transactionType === TransactionType::SEARCH + ) { + $methods = []; + foreach ($response->results as $method) { + $methods[] = $this->hydratePaymentMethod($method); + } + return $methods; + } + + if ($builder->entity instanceof RecurringPaymentMethod) { + return $this->hydratePaymentMethod($response); + } + + if ($builder->entity instanceof Schedule + && $builder->transactionType === TransactionType::SEARCH + ) { + $schedules = []; + foreach ($response->results as $schedule) { + $schedules[] = $this->hydrateSchedule($schedule); + } + return $schedules; + } + + if ($builder->entity instanceof Schedule) { + return $this->hydrateSchedule($response); + } + + return $response; + } + + protected function mapMethod($type) + { + switch ($type) { + case TransactionType::CREATE: + case TransactionType::SEARCH: + return 'POST'; + case TransactionType::EDIT: + return 'PUT'; + case TransactionType::DELETE: + return 'DELETE'; + default: + return 'GET'; + } + } + + protected function mapUrl(RecurringBuilder $builder) + { + $suffix = ''; + if ($builder->transactionType === TransactionType::FETCH + || $builder->transactionType === TransactionType::DELETE + || $builder->transactionType === TransactionType::EDIT + ) { + $suffix = '/' . $builder->entity->key; + } + + if ($builder->entity instanceof Customer) { + return sprintf( + '%s%s', + $builder->transactionType === TransactionType::SEARCH ? 'searchCustomers' : 'customers', + $suffix + ); + } + + if ($builder->entity instanceof RecurringPaymentMethod) { + $paymentMethod = ''; + if ($builder->transactionType === TransactionType::CREATE) { + $paymentMethod = $builder->entity->paymentMethod instanceof Credit ? 'CreditCard' : 'ACH'; + } elseif ($builder->transactionType === TransactionType::EDIT) { + $paymentMethod = str_replace($builder->entity->paymentType, ' ', ''); + } + return sprintf( + '%s%s%s', + $builder->transactionType === TransactionType::SEARCH ? 'searchPaymentMethods' : 'paymentMethods', + $paymentMethod, + $suffix + ); + } + + if ($builder->entity instanceof Schedule) { + return sprintf( + '%s%s', + $builder->transactionType === TransactionType::SEARCH ? 'searchSchedules' : 'schedules', + $suffix + ); + } + + throw new UnsupportedTransactionException(); + } + #endregion + + #region Build Entities + protected function buildCustomer($request, Customer $customer = null) + { + if ($customer === null) { + return $request; + } + + $request['customerIdentifier'] = $customer->id; + $request['firstName'] = $customer->firstName; + $request['lastName'] = $customer->lastName; + $request['company'] = $customer->company; + $request['customerStatus'] = $customer->status; + $request['primaryEmail'] = $customer->email; + $request['phoneDay'] = $customer->homePhone; + $request['phoneEvening'] = $customer->workPhone; + $request['phoneMobile'] = $customer->mobilePhone; + $request['fax'] = $customer->fax; + $request['title'] = $customer->title; + $request['department'] = $customer->department; + $request = $this->buildAddress($request, $customer->address); + + return $request; + } + + protected function buildPaymentMethod($request, RecurringPaymentMethod $payment, $type) + { + if ($payment === null) { + return $request; + } + + $request['preferredPayment'] = $payment->preferredPayment; + $request['paymentMethodIdentifier'] = $payment->id; + $request['customerKey'] = $payment->customerKey; + $request['nameOnAccount'] = $payment->nameOnAccount; + $request = $this->buildAddress($request, $payment->address); + + if ($type === TransactionType::CREATE) { + $tokenValue; + list($hasToken, $tokenValue) = $this->hasToken($payment->paymentMethod); + $paymentInfo = null; + $paymentInfoKey = null; + if ($payment->paymentMethod instanceof ICardData) { + $method = $payment->paymentMethod; + $paymentInfoKey = $hasToken ? 'alternateIdentity' : 'card'; + $paymentInfo = [ + $hasToken ? 'token' : 'number' => $hasToken ? $tokenValue : $method->number, + 'expMon' => $method->expMonth, + 'expYear' => $method->expYear, + ]; + + if ($hasToken) { + $paymentInfo['type'] = 'SINGLEUSETOKEN'; + } + + $request['cardVerificationValue'] = $method->cvn; + } elseif ($payment->paymentMethod instanceof ITrackData) { + $method = $payment->paymentMethod; + $paymentInfoKey = 'track'; + $paymentInfo = [ + 'data' => $method->value, + 'dataEntryMode' => strtoupper($method->entryMethod), + ]; + } + + if ($payment->paymentMethod instanceof ECheck) { + $check = $payment->paymentMethod; + $request['achType'] = $this->mapAccountType($check->accountType); + $request['accountType'] = $this->mapCheckType($check->checkType); + $request['telephoneIndicator'] = + $check->secCode === SecCode::CCD || $check->secCode == SecCode::PPD + ? false + : true; + $request['routingNumber'] = $check->routingNumber; + $request['accountNumber'] = $check->accountNumber; + $request['accountHolderYob'] = $check->birthYear; + $request['driversLicenseState'] = $check->driversLicenseState; + $request['driversLicenseNumber'] = $check->driversLicenseNumber; + $request['socialSecurityNumberLast4'] = $check->ssnLast4; + unset($request['country']); + } + + if ($payment->paymentMethod instanceof IEncryptable) { + $enc = $payment->paymentMethod->encryptionData; + if ($enc != null) { + $paymentInfo['trackNumber'] = $enc->trackNumber; + $paymentInfo['key'] = $enc->ktb; + $paymentInfo['encryptionType'] = 'E3'; + } + } + } else { // EDIT FIELDS + unset($request['customerKey']); + $request['paymentStatus'] = $payment->status; + $request['cpcTaxType'] = $payment->taxType; + $request['expirationDate'] = $payment->expirationDate; + } + + if ($paymentInfo !== null) { + $request[$paymentInfoKey] = $paymentInfo; + } + + return $request; + } + + protected function mapAccountType($type) + { + switch ($type) { + case AccountType::CHECKING: + return 'Checking'; + case AccountType::SAVINGS: + return 'Savings'; + } + } + + protected function mapCheckType($type) + { + switch ($type) { + case CheckType::PERSONAL: + return 'Personal'; + case CheckType::BUSINESS: + return 'Business'; + } + } + + protected function buildSchedule($request, Schedule $schedule, $type) + { + $mapDuration = function () use ($schedule) { + if ($schedule->numberOfPayments !== null) { + return 'Limited Number'; + } + + if ($schedule->endDate !== null) { + return 'End Date'; + } + + return 'Ongoing'; + }; + + $mapProcessingDate = function () use ($schedule) { + $frequencies = [ 'Monthly', 'Bi-Monthly', 'Quarterly', 'Semi-Annually' ]; + if (in_array($schedule->frequency, $frequencies)) { + switch ($schedule->paymentSchedule) { + case PaymentSchedule::FIRST_DAY_OF_THE_MONTH: + return 'First'; + case PaymentSchedule::LAST_DAY_OF_THE_MONTH: + return 'Last'; + default: + $day = $schedule->startDate->format('d'); + return $day > 28 ? 'Last' : $day; + } + } + + if ($schedule->frequency == 'Semi-Monthly') { + return $schedule->paymentSchedule === PaymentSchedule::LAST_DAY_OF_THE_MONTH + ? 'Last' + : 'First'; + } + + return null; + }; + + if ($schedule === null) { + return $request; + } + + $request['scheduleIdentifier'] = $schedule->id; + $request['scheduleName'] = $schedule->name; + $request['scheduleStatus'] = $schedule->status; + $request['paymentMethodKey'] = $schedule->paymentKey; + + $request = $this->buildAmount($request, 'subtotalAmount', $schedule->amount, $schedule->currency, $type); + $request = $this->buildAmount($request, 'taxAmount', $schedule->taxAmount, $schedule->currency, $type); + + $request['deviceId'] = $schedule->deviceId; + $request['processingDateInfo'] = $mapProcessingDate(); + $request = $this->buildDate($request, 'endDate', $schedule->endDate, ($type === TransactionType::EDIT)); + $request['reprocessingCount'] = $schedule->reprocessingCount ?: 3; + $request['emailReceipt'] = $schedule->emailReceipt; + $request['emailAdvanceNotice'] = $schedule->emailNotification ? 'Yes' : 'No'; + // debt repay ind + $request['invoiceNbr'] = $schedule->invoiceNumber; + $request['poNumber'] = $schedule->poNumber; + $request['description'] = $schedule->description; + $request['numberOfPayments'] = $schedule->numberOfPayments; + + if ($type === TransactionType::CREATE) { + $request['customerKey'] = $schedule->customerKey; + $request = $this->buildDate($request, 'startDate', $schedule->startDate); + $request['frequency'] = $schedule->frequency; + $request['duration'] = $mapDuration(); + } else { // Edit Fields + if (!$schedule->hasStarted) { + $request = $this->buildDate($request, 'startDate', $schedule->startDate); + $request['frequency'] = $schedule->frequency; + $request['duration'] = $mapDuration(); + } else { + $request = $this->buildDate($request, 'cancellationDate', $schedule->cancellationDate); + $request = $this->buildDate($request, 'nextProcressingDate', $schedule->nextProcessingDate); + } + } + + return $request; + } + + protected function buildDate($request, $name, \DateTime $date = null, $force = false) + { + if ($date !== null || $force) { + $value = $date !== null ? $date->format('mdY') : null; + $request[$name] = $value; + } + return $request; + } + + protected function buildAmount($request, $name, $amount, $currency, $type) + { + if ($amount !== null) { + $node = [ + 'value' => $amount * 100, + ]; + + if ($type === TransactionType::CREATE) { + $node['currency'] = $currency; + } + + $request[$name] = $node; + } + return $request; + } + + protected function buildAddress($request, Address $address) + { + if ($address !== null) { + $request['addressLine1'] = $address->streetAddress1; + $request['addressLine2'] = $address->streetAddress2; + $request['city'] = $address->city; + $request['country'] = $address->country; + $request['stateProvince'] = $address->province; + $request['zipPostalCode'] = $address->postalCode; + } + return $request; + } + #endregion + + #region Hydrate Entities + protected function hydrateCustomer($response) + { + $customer = new Customer(); + $customer->key = isset($response->customerKey) ? $response->customerKey : null; + $customer->id = isset($response->customerIdentifier) ? $response->customerIdentifier : null; + $customer->firstName = isset($response->firstName) ? $response->firstName : null; + $customer->lastName = isset($response->lastName) ? $response->lastName : null; + $customer->company = isset($response->company) ? $response->company : null; + $customer->status = isset($response->customerStatus) ? $response->customerStatus : null; + $customer->title = isset($response->title) ? $response->title : null; + $customer->department = isset($response->department) ? $response->department : null; + $customer->email = isset($response->primaryEmail) ? $response->primaryEmail : null; + $customer->homePhone = isset($response->phoneDay) ? $response->phoneDay : null; + $customer->workPhone = isset($response->phoneEvening) ? $response->phoneEvening : null; + $customer->mobilePhone = isset($response->phoneMobile) ? $response->phoneMobile : null; + $customer->fax = isset($response->fax) ? $response->fax : null; + $customer->address = new Address(); + $customer->address->streetAddress1 = isset($response->addressLine1) ? $response->addressLine1 : null; + $customer->address->streetAddress2 = isset($response->addressLine2) ? $response->addressLine2 : null; + $customer->address->city = isset($response->city) ? $response->city : null; + $customer->address->province = isset($response->stateProvince) ? $response->stateProvince : null; + $customer->address->postalCode = isset($response->zipPostalCode) ? $response->zipPostalCode : null; + $customer->address->country = isset($response->country) ? $response->country : null; + return $customer; + } + + protected function hydratePaymentMethod($response) + { + $paymentMethod = new RecurringPaymentMethod(); + $paymentMethod->key = isset($response->paymentMethodKey) ? $response->paymentMethodKey : null; + $paymentMethod->paymentType = isset($response->paymentMethodType) ? $response->paymentMethodType : null; + $paymentMethod->preferredPayment = isset($response->preferredPayment) ? $response->preferredPayment : null; + $paymentMethod->status = isset($response->paymentStatus) ? $response->paymentStatus : null; + $paymentMethod->id = isset($response->paymentMethodIdentifier) ? $response->paymentMethodIdentifier : null; + $paymentMethod->customerKey = isset($response->customerKey) ? $response->customerKey : null; + $paymentMethod->nameOnAccount = isset($response->nameOnAccount) ? $response->nameOnAccount : null; + $paymentMethod->commercialIndicator = isset($response->cpcInd) ? $response->cpcInd : null; + $paymentMethod->taxType = isset($response->cpcTaxType) ? $response->cpcTaxType : null; + $paymentMethod->expirationDate = isset($response->expirationDate) ? $response->expirationDate : null; + $paymentMethod->address = new Address(); + $paymentMethod->address->streetAddress1 = isset($response->addressLine1) ? $response->addressLine1 : null; + $paymentMethod->address->streetAddress2 = isset($response->addressLine2) ? $response->addressLine2 : null; + $paymentMethod->address->city = isset($response->city) ? $response->city : null; + $paymentMethod->address->state = isset($response->stateProvince) ? $response->stateProvince : null; + $paymentMethod->address->postalCode= isset($response->zipPostalCode) ? $response->zipPostalCode : null; + $paymentMethod->address->country = isset($response->country) ? $response->country : null; + return $paymentMethod; + } + + protected function hydrateSchedule($response) + { + $schedule = new Schedule(); + $schedule->key = isset($response->scheduleKey) ? $response->scheduleKey : null; + $schedule->id = isset($response->scheduleIdentifier) ? $response->scheduleIdentifier : null; + $schedule->customerKey = isset($response->customerKey) ? $response->customerKey : null; + $schedule->name = isset($response->scheduleName) ? $response->scheduleName : null; + $schedule->status = isset($response->scheduleStatus) ? $response->scheduleStatus : null; + $schedule->paymentKey = isset($response->paymentMethodKey) ? $response->paymentMethodKey : null; + if (isset($response->subtotalAmount)) { + $subtotal = $response->subtotalAmount; + $schedule->amount = $subtotal->value; + $schedule->currency = $subtotal->currency; + } + if (isset($response->taxAmount)) { + $taxAmount = $response->taxAmount; + $schedule->taxAmount = $taxAmount->value; + } + $schedule->deviceId = isset($response->deviceId) ? $response->deviceId : null; + $schedule->startDate = $response->startDate; + $schedule->paymentSchedule = isset($response->processingDateInfo) ? $response->processingDateInfo : null; + switch ($schedule->paymentSchedule) { + case 'Last': + $schedule->paymentSchedule = PaymentSchedule::LAST_DAY_OF_THE_MONTH; + break; + case 'First': + $schedule->paymentSchedule = PaymentSchedule::FIRST_DAY_OF_THE_MONTH; + break; + default: + $schedule->paymentSchedule = PaymentSchedule::DYNAMIC; + break; + } + $schedule->frequency = isset($response->frequency) ? $response->frequency : null; + $schedule->endDate = isset($response->endDate) ? $response->endDate : null; + $schedule->reprocessingCount = isset($response->reprocessingCount) ? $response->reprocessingCount : null; + $schedule->emailReceipt = isset($response->emailReceipt) ? $response->emailReceipt : null; + $schedule->emailNotification = isset($response->emailAdvanceNotice) ? $response->emailAdvanceNotice : null; + if ($schedule->emailNotification === null + || $schedule->emailNotification === 'No' + ) { + $schedule->emailNotification = false; + } else { + $schedule->emailNotification = true; + } + // dept repay indicator + $schedule->invoiceNumber = isset($response->invoiceNbr) ? $response->invoiceNbr : null; + $schedule->poNumber = isset($response->poNumber) ? $response->poNumber : null; + $schedule->description = isset($response->Description) ? $response->Description : null; + // statusSetDate + $schedule->nextProcessingDate = isset($response->nextProcessingDate) + ? \DateTime::createFromFormat('dmY', $response->nextProcessingDate) + : null; + // previousProcessingDate + // approvedTransactionCount + // failureCount + // totalApprovedAmountToDate + // numberOfPaymentsRemaining + $schedule->cancellationDate = isset($response->cancellationDate) ? $response->cancellationDate : null; + // creationDate + // lastChangeDate + $schedule->hasStarted = isset($response->scheduleStarted) ? $response->scheduleStarted : null; + return $schedule; + } + #endregion + + #region Validations + + /** + * Tests the payment method for a token value + * + * @param IPaymentMethod $paymentMethod The payment method + * + * @return [bool, string|null] + */ + protected function hasToken(IPaymentMethod $paymentMethod) + { + $tokenValue = null; + + if (!empty($paymentMethod->token)) { + $tokenValue = $paymentMethod->token; + return [true, $tokenValue]; + } + + return [false, $tokenValue]; + } + + #endregion +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Gateways/PorticoConnector.php b/classes/includes/vendor/globalpayments/php-sdk/src/Gateways/PorticoConnector.php new file mode 100644 index 0000000..e075a22 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Gateways/PorticoConnector.php @@ -0,0 +1,1878 @@ +createElement($this->mapRequestType($builder)); + $block1 = $xml->createElement('Block1'); + + if ($builder->paymentMethod->paymentMethodType !== PaymentMethodType::GIFT + && $builder->paymentMethod->paymentMethodType !== PaymentMethodType::ACH + && ($builder->transactionType === TransactionType::AUTH + || $builder->transactionType === TransactionType::SALE) + ) { + if ($builder->paymentMethod->paymentMethodType !== PaymentMethodType::RECURRING + || $builder->paymentMethod->paymentType !== 'ACH' + ) { + $block1->appendChild( + $xml->createElement( + 'AllowDup', + ($builder->allowDuplicates ? 'Y' : 'N') + ) + ); + } + + if ($builder->transactionModifier === TransactionModifier::NONE + && $builder->paymentMethod->paymentMethodType !== PaymentMethodType::EBT + && $builder->paymentMethod->paymentMethodType !== PaymentMethodType::RECURRING + ) { + $block1->appendChild( + $xml->createElement( + 'AllowPartialAuth', + ($builder->allowPartialAuth ? 'Y' : 'N') + ) + ); + } + } + + if ($builder->amount !== null) { + $block1->appendChild($xml->createElement('Amt', $builder->amount)); + } + + if ($builder->gratuity !== null) { + $block1->appendChild( + $xml->createElement('GratuityAmtInfo', $builder->gratuity) + ); + } + + if ($builder->convenienceAmount !== null) { + $block1->appendChild($xml->createElement('ConvenienceAmtInfo', $builder->convenienceAmount)); + } + + if ($builder->shippingAmount !== null) { + $block1->appendChild($xml->createElement('ShippingAmtInfo', $builder->shippingAmount)); + } + + if ($builder->cashBackAmount !== null) { + $block1->appendChild( + $xml->createElement( + $builder->paymentMethod->paymentMethodType === PaymentMethodType::DEBIT + ? 'CashbackAmtInfo' + : 'CashBackAmount', + $builder->cashBackAmount + ) + ); + } + + if ($builder->offlineAuthCode !== null) { + $block1->appendChild( + $xml->createElement('OfflineAuthCode', $builder->offlineAuthCode) + ); + } + + if ($builder->transactionType === TransactionType::ALIAS) { + $block1->appendChild($xml->createElement('Action', AliasAction::validate($builder->aliasAction))); + $block1->appendChild($xml->createElement('Alias', $builder->alias)); + } + + $isCheck = ($builder->paymentMethod->paymentMethodType === PaymentMethodType::ACH) + || ($builder->paymentMethod instanceof RecurringPaymentMethod + && $builder->paymentMethod->paymentType === 'ACH'); + + $propertyName = $isCheck ? 'checkHolderName' : 'cardHolderName'; + if ($isCheck + || $builder->billingAddress !== null + || isset($builder->paymentMethod->{$propertyName}) + ) { + if ($builder->transactionType !== TransactionType::REVERSAL) { + $address = $this->hydrateHolder($xml, $builder, $isCheck); + } + if (!empty($address)) { + $block1->appendChild($address); + } + } + list($hasToken, $tokenValue) = $this->hasToken($builder->paymentMethod); + + $cardData = $xml->createElement( + $builder->transactionType === TransactionType::REPLACE ? 'OldCardData' : 'CardData' + ); + if ($builder->paymentMethod instanceof ICardData) { + $cardData->appendChild( + $this->hydrateManualEntry( + $xml, + $builder, + $hasToken, + $tokenValue + ) + ); + } elseif ($builder->paymentMethod instanceof ITrackData) { + $trackData = $this->hydrateTrackData( + $xml, + $builder, + $hasToken, + $tokenValue + ); + + if ($builder->paymentMethod->paymentMethodType === PaymentMethodType::DEBIT) { + $block1->appendChild($trackData); + } else { + $cardData->appendChild($trackData); + } + } elseif ($builder->paymentMethod instanceof GiftCard) { + if ($builder->currency !== null) { + $block1->appendChild($xml->createElement('Currency', strtoupper($builder->currency))); + } + + if ($builder->transactionType === TransactionType::REPLACE) { + $newCard = $xml->createElement('NewCardData'); + $newCard->appendChild( + $xml->createElement( + $builder->replacementCard->valueType, + $builder->replacementCard->value + ) + ); + + if ($builder->replacementCard->pin !== null) { + $newCard->appendChild( + $xml->createElement( + 'PIN', + $builder->replacementCard->pin + ) + ); + } + $block1->appendChild($newCard); + } + + if ($builder->paymentMethod->value !== null) { + $cardData->appendChild( + $xml->createElement( + $builder->paymentMethod->valueType, + $builder->paymentMethod->value + ) + ); + } + + if ($builder->paymentMethod->pin !== null) { + $cardData->appendChild( + $xml->createElement( + 'PIN', + $builder->paymentMethod->pin + ) + ); + } + } elseif ($builder->paymentMethod instanceof ECheck) { + $block1->appendChild($xml->createElement('CheckAction', 'SALE')); + + if (empty($builder->paymentMethod->token)) { + $accountInfo = $xml->createElement('AccountInfo'); + $accountInfo->appendChild($xml->createElement('RoutingNumber', $builder->paymentMethod->routingNumber)); + $accountInfo->appendChild($xml->createElement('AccountNumber', $builder->paymentMethod->accountNumber)); + $accountInfo->appendChild($xml->createElement('CheckNumber', $builder->paymentMethod->checkNumber)); + $accountInfo->appendChild($xml->createElement('MICRData', $builder->paymentMethod->micrNumber)); + $accountInfo->appendChild( + $xml->createElement( + 'AccountType', + $this->hydrateAccountType($builder->paymentMethod->accountType) + ) + ); + $block1->appendChild($accountInfo); + } else { + $block1->appendChild($xml->createElement('TokenValue', $builder->paymentMethod->token)); + } + + $block1->appendChild( + $xml->createElement( + 'DataEntryMode', + strtoupper($this->hydrateEntryMethod($builder->paymentMethod->entryMode)) + ) + ); + $block1->appendChild( + $xml->createElement( + 'CheckType', + $this->hydrateCheckType($builder->paymentMethod->checkType) + ) + ); + $block1->appendChild($xml->createElement('SECCode', $builder->paymentMethod->secCode)); + + $verify = $xml->createElement('VerifyInfo'); + $verify->appendChild( + $xml->createElement( + 'CheckVerify', + ($builder->paymentMethod->checkVerify ? 'Y' : 'N') + ) + ); + $verify->appendChild( + $xml->createElement( + 'ACHVerify', + ($builder->paymentMethod->achVerify ? 'Y' : 'N') + ) + ); + $block1->appendChild($verify); + } + + if ($builder->paymentMethod instanceof TransactionReference) { + $block1->appendChild($xml->createElement('GatewayTxnId', $builder->paymentMethod->transactionId)); + $block1->appendChild($xml->createElement('ClientTxnId', $builder->paymentMethod->clientTransactionId)); + } + + if ($builder->paymentMethod instanceof RecurringPaymentMethod) { + $method = $builder->paymentMethod; + + if ($method->paymentType === 'ACH') { + $block1->appendChild($xml->createElement('CheckAction', 'SALE')); + } + + $block1->appendChild($xml->createElement('PaymentMethodKey', $method->key)); + + if ($method->paymentMethod !== null && $method->paymentMethod instanceof CreditCardData) { + $data = $xml->createElement('PaymentMethodKeyData'); + + if ($method->paymentMethod->expMonth !== null) { + $data->appendChild($xml->createElement('ExpMonth', $method->paymentMethod->expMonth)); + } + + if ($method->paymentMethod->expYear !== null) { + $data->appendChild($xml->createElement('ExpYear', $method->paymentMethod->expYear)); + } + + if ($method->paymentMethod->cvn !== null) { + $data->appendChild($xml->createElement('CVV2', $method->paymentMethod->cvn)); + } + + $block1->appendChild($data); + } + + $data = $xml->createElement('RecurringData'); + if ($builder->scheduleId !== null) { + $data->appendChild($xml->createElement('ScheduleID', $builder->scheduleId)); + } + $data->appendChild($xml->createElement('OneTime', $builder->oneTimePayment ? 'Y' : 'N')); + $block1->appendChild($data); + } + + if ($builder->paymentMethod instanceof IPinProtected + && $builder->transactionType !== TransactionType::REVERSAL + ) { + $block1->appendChild($xml->createElement('PinBlock', $builder->paymentMethod->pinBlock)); + } + + if ($builder->paymentMethod instanceof IEncryptable + && isset($builder->paymentMethod->encryptionData) + && null !== $builder->paymentMethod->encryptionData + ) { + $enc = $this->hydrateEncryptionData($xml, $builder); + + if ($builder->paymentMethod->paymentMethodType === PaymentMethodType::DEBIT) { + $block1->appendChild($enc); + } else { + $cardData->appendChild($enc); + } + } + + if ($builder->paymentMethod instanceof ITokenizable) { + $cardData->appendChild( + $xml->createElement( + 'TokenRequest', + $builder->requestMultiUseToken ? 'Y' : 'N' + ) + ); + } + + if ($cardData->childNodes->length > 0 && $builder->aliasAction !== AliasAction::CREATE) { + $block1->appendChild($cardData); + } + + if ($builder->paymentMethod instanceof IBalanceable && $builder->balanceInquiryType !== null) { + $block1->appendChild($xml->createElement('BalanceInquiryType', $builder->balanceInquiryType)); + } + + if ($builder->level2Request === true) { + $block1->appendChild($xml->createElement('CPCReq', 'Y')); + } + + if ($builder->customerId !== null + || $builder->description !== null + || $builder->invoiceNumber !== null + ) { + $block1->appendChild($this->hydrateAdditionalTxnFields($xml, $builder)); + } + + if ($builder->ecommerceInfo !== null) { + $block1->appendChild($xml->createElement('Ecommerce', $builder->ecommerceInfo->channel)); + + if (!empty($builder->invoiceNumber) || !empty($builder->ecommerceInfo->shipMonth)) { + $direct = $xml->createElement('DirectMktData'); + if (!empty($builder->invoiceNumber)) { + $direct->appendChild($xml->createElement('DirectMktInvoiceNbr', $builder->invoiceNumber)); + } + if (!empty($builder->ecommerceInfo->shipDay)) { + $direct->appendChild($xml->createElement('DirectMktShipDay', $builder->ecommerceInfo->shipDay)); + } + if (!empty($builder->ecommerceInfo->shipMonth)) { + $direct->appendChild($xml->createElement('DirectMktShipMonth', $builder->ecommerceInfo->shipMonth)); + } + } + if (!empty($builder->paymentMethod->threeDSecure)) { + $secure = $xml->createElement('SecureECommerce'); + if (!empty($builder->paymentMethod->threeDSecure->paymentDataSource)) { + $direct->appendChild( + $xml->createElement( + 'PaymentDataSource', + $builder->paymentMethod->threeDSecure->paymentDataSource + ) + ); + } + if (!empty($builder->paymentMethod->threeDSecure->paymentDataType)) { + $direct->appendChild( + $xml->createElement( + 'TypeOfPaymentData', + $builder->paymentMethod->threeDSecure->paymentDataType + ) + ); + } + if (!empty($builder->paymentMethod->threeDSecure->cavv)) { + $direct->appendChild($xml->createElement('PaymentData', $builder->paymentMethod->threeDSecure->cavv)); + } + if (!empty($builder->paymentMethod->threeDSecure->eci)) { + $direct->appendChild($xml->createElement('ECommerceIndicator', $builder->paymentMethod->threeDSecure->eci)); + } + if (!empty($builder->paymentMethod->threeDSecure->xid)) { + $direct->appendChild($xml->createElement('XID', $builder->paymentMethod->threeDSecure->xid)); + } + } + } + + if ($builder->dynamicDescriptor !== null) { + $block1->appendChild( + $xml->createElement('TxnDescriptor', $builder->dynamicDescriptor) + ); + } + + $transaction->appendChild($block1); + + $response = $this->doTransaction($this->buildEnvelope($xml, $transaction)); + return $this->mapResponse($response, $builder, $this->buildEnvelope($xml, $transaction)); + } + + public function serializeRequest(AuthorizationBuilder $builder) + { + throw new UnsupportedTransactionException('Portico does not support hosted payments.'); + } + + /** + * {@inheritdoc} + * + * @param ManagementBuilder $builder The transaction's builder + * + * @return Transaction + */ + public function manageTransaction(ManagementBuilder $builder) + { + $xml = new DOMDocument('1.0', 'utf-8'); + + // build request + $transaction = $xml->createElement($this->mapRequestType($builder)); + + if ($builder->transactionType !== TransactionType::BATCH_CLOSE) { + $root = null; + if ($builder->transactionType === TransactionType::REVERSAL + || $builder->transactionType === TransactionType::REFUND + || $builder->paymentMethod->paymentMethodType === PaymentMethodType::GIFT + || $builder->paymentMethod->paymentMethodType === PaymentMethodType::ACH + ) { + $root = $xml->createElement('Block1'); + } else { + $root = $transaction; + } + + // Transaction ID + if ($builder->paymentMethod !== null && !empty($builder->paymentMethod->transactionId)) { + $root->appendChild( + $xml->createElement('GatewayTxnId', $builder->paymentMethod->transactionId) + ); + } + + // Level II Data + if ($builder->transactionType === TransactionType::EDIT + && $builder->transactionModifier === TransactionModifier::LEVEL_II + ) { + $cpc = $xml->createElement('CPCData'); + + if ($builder->poNumber !== null) { + $cpc->appendChild( + $xml->createElement('CardHolderPONbr', $builder->poNumber) + ); + } + + if ($builder->taxType !== null) { + $cpc->appendChild( + $xml->createElement( + 'TaxType', + TaxType::validate($builder->taxType) + ) + ); + } + + if ($builder->taxAmount !== null) { + $cpc->appendChild($xml->createElement('TaxAmt', $builder->taxAmount)); + } + + $root->appendChild($cpc); + } else { + // amount + if ($builder->amount !== null) { + $root->appendChild($xml->createElement('Amt', $builder->amount)); + } + + // auth amount + if ($builder->authAmount !== null) { + $root->appendChild($xml->createElement('AuthAmt', $builder->authAmount)); + } + + // gratuity + if ($builder->gratuity !== null) { + $root->appendChild( + $xml->createElement('GratuityAmtInfo', $builder->gratuity) + ); + } + } + + // Additional Txn Fields + // TODO + + // Token Management + if ($builder->transactionType === TransactionType::TOKEN_UPDATE + || $builder->transactionType === TransactionType::TOKEN_DELETE + ) { + $token = $builder->paymentMethod; + + // Set the token value + $root->appendChild($xml->createElement('TokenValue', $token->token)); + + $tokenActions = $root->appendChild($xml->createElement('TokenActions')); + if ($builder->transactionType === TransactionType::TOKEN_UPDATE) { + $setElement = $tokenActions->appendChild($xml->createElement('Set')); + + $expMonth = $setElement->appendChild($xml->createElement('Attribute')); + $expMonth->appendChild($xml->createElement('Name', 'expmonth')); + $expMonth->appendChild($xml->createElement('Value', $token->expMonth)); + + $expYear = $setElement->appendChild($xml->createElement('Attribute')); + $expYear->appendChild($xml->createElement('Name', 'expyear')); + $expYear->appendChild($xml->createElement('Value', $token->expYear)); + } else { + $tokenActions->appendChild($xml->createElement('Delete')); + } + } + + if ($builder->transactionType === TransactionType::REVERSAL + || $builder->transactionType === TransactionType::REFUND + || $builder->paymentMethod->paymentMethodType === PaymentMethodType::GIFT + || $builder->paymentMethod->paymentMethodType === PaymentMethodType::ACH + ) { + $transaction->appendChild($root); + } + } + + $response = $this->doTransaction($this->buildEnvelope($xml, $transaction)); + return $this->mapResponse($response, $builder, $this->buildEnvelope($xml, $transaction)); + } + + public function processReport(ReportBuilder $builder) + { + $xml = new DOMDocument('1.0', 'utf-8'); + + $transaction = $xml->createElement($this->mapReportType($builder)); + $transaction->appendChild($xml->createElement('TzConversion', $builder->timeZoneConversion)); + + if ($builder instanceof TransactionReportBuilder) { + /* if ($builder->deviceId !== null) { + $transaction->appendChild($xml->createElement('DeviceId', $builder->deviceId)); + } + + if ($builder->startDate !== null) { + $transaction->appendChild($xml->createElement('RptStartUtcDT', $builder->startDate->format())); + } + + if ($builder->endDate !== null) { + $transaction->appendChild($xml->createElement('RptEndUtcDT', $builder->endDate->format())); + } */ + + if ($builder->transactionId !== null) { + $transaction->appendChild($xml->createElement('TxnId', $builder->transactionId)); + } else { + $criteria = $transaction->appendChild($xml->createElement('Criteria')); + + if ($builder->searchBuilder->startDate !== null) { + $criteria->appendChild($xml->createElement( + 'StartUtcDT', + $builder->searchBuilder->startDate + )); + } + if ($builder->searchBuilder->endDate !== null) { + $criteria->appendChild($xml->createElement( + 'EndUtcDT', + $builder->searchBuilder->endDate + )); + } + if ($builder->searchBuilder->authCode !== null) { + $criteria->appendChild($xml->createElement( + 'AuthCode', + $builder->searchBuilder->authCode + )); + } + if ($builder->searchBuilder->cardHolderLastName !== null) { + $criteria->appendChild($xml->createElement( + 'CardHolderLastName', + $builder->searchBuilder->cardHolderLastName + )); + } + if ($builder->searchBuilder->cardHolderFirstName !== null) { + $criteria->appendChild($xml->createElement( + 'CardHolderFirstName', + $builder->searchBuilder->cardHolderFirstName + )); + } + if ($builder->searchBuilder->cardNumberFirstSix !== null) { + $criteria->appendChild($xml->createElement( + 'CardNbrFirstSix', + $builder->searchBuilder->cardNumberFirstSix + )); + } + if ($builder->searchBuilder->cardNumberLastFour !== null) { + $criteria->appendChild($xml->createElement( + 'CardNbrLastFour', + $builder->searchBuilder->cardNumberLastFour + )); + } + if ($builder->searchBuilder->invoiceNumber !== null) { + $criteria->appendChild($xml->createElement( + 'InvoiceNbr', + $builder->searchBuilder->invoiceNumber + )); + } + if ($builder->searchBuilder->cardHolderPoNumber !== null) { + $criteria->appendChild($xml->createElement( + 'CardHolderPONbr', + $builder->searchBuilder->cardHolderPoNumber + )); + } + if ($builder->searchBuilder->customerId !== null) { + $criteria->appendChild($xml->createElement( + 'CustomerID', + $builder->searchBuilder->customerId + )); + } + if ($builder->searchBuilder->issuerResult !== null) { + $criteria->appendChild($xml->createElement( + 'IssuerResult', + $builder->searchBuilder->issuerResult + )); + } + if ($builder->searchBuilder->settlementAmount !== null) { + $criteria->appendChild($xml->createElement( + 'SettlementAmt', + $builder->searchBuilder->settlementAmount + )); + } + if ($builder->searchBuilder->issuerTransactionId !== null) { + $criteria->appendChild($xml->createElement( + 'IssTxnId', + $builder->searchBuilder->issuerTransactionId + )); + } + if ($builder->searchBuilder->referenceNumber !== null) { + $criteria->appendChild($xml->createElement( + 'RefNbr', + $builder->searchBuilder->referenceNumber + )); + } + if ($builder->searchBuilder->username !== null) { + $criteria->appendChild($xml->createElement( + 'UserName', + $builder->searchBuilder->username + )); + } + if ($builder->searchBuilder->clerkId !== null) { + $criteria->appendChild($xml->createElement( + 'ClerkID', + $builder->searchBuilder->clerkId + )); + } + if ($builder->searchBuilder->batchSequenceNumber !== null) { + $criteria->appendChild($xml->createElement( + 'BatchSeqNbr', + $builder->searchBuilder->batchSequenceNumber + )); + } + if ($builder->searchBuilder->batchId !== null) { + $criteria->appendChild($xml->createElement( + 'BatchId', + $builder->searchBuilder->batchId + )); + } + if ($builder->searchBuilder->siteTrace !== null) { + $criteria->appendChild($xml->createElement( + 'SiteTrace', + $builder->searchBuilder->siteTrace + )); + } + if ($builder->searchBuilder->displayName !== null) { + $criteria->appendChild($xml->createElement( + 'DisplayName', + $builder->searchBuilder->displayName + )); + } + if ($builder->searchBuilder->clientTransactionId !== null) { + $criteria->appendChild($xml->createElement( + 'ClientTxnId', + $builder->searchBuilder->clientTransactionId + )); + } + if ($builder->searchBuilder->uniqueDeviceId !== null) { + $criteria->appendChild($xml->createElement( + 'UniqueDeviceId', + $builder->searchBuilder->uniqueDeviceId + )); + } + if ($builder->searchBuilder->accountNumberLastFour !== null) { + $criteria->appendChild($xml->createElement( + 'AcctNbrLastFour', + $builder->searchBuilder->accountNumberLastFour + )); + } + if ($builder->searchBuilder->bankRoutingNumber !== null) { + $criteria->appendChild($xml->createElement( + 'BankRountingNbr', + $builder->searchBuilder->bankRoutingNumber + )); + } + if ($builder->searchBuilder->checkNumber !== null) { + $criteria->appendChild($xml->createElement( + 'CheckNbr', + $builder->searchBuilder->checkNumber + )); + } + if ($builder->searchBuilder->checkFirstName !== null) { + $criteria->appendChild($xml->createElement( + 'CheckFirstName', + $builder->searchBuilder->checkFirstName + )); + } + if ($builder->searchBuilder->checkLastName !== null) { + $criteria->appendChild($xml->createElement( + 'CheckLastName', + $builder->searchBuilder->checkLastName + )); + } + if ($builder->searchBuilder->checkName !== null) { + $criteria->appendChild($xml->createElement( + 'CheckName', + $builder->searchBuilder->checkName + )); + } + if ($builder->searchBuilder->giftCurrency !== null) { + $criteria->appendChild($xml->createElement( + 'GiftCurrency', + $builder->searchBuilder->giftCurrency + )); + } + if ($builder->searchBuilder->giftMaskedAlias !== null) { + $criteria->appendChild($xml->createElement( + 'GiftMaskedAlias', + $builder->searchBuilder->giftMaskedAlias + )); + } + if ($builder->searchBuilder->oneTime !== null) { + $criteria->appendChild($xml->createElement( + 'OneTime', + $builder->searchBuilder->oneTime + )); + } + if ($builder->searchBuilder->paymentMethodKey !== null) { + $criteria->appendChild($xml->createElement( + 'PaymentMethodKey', + $builder->searchBuilder->paymentMethodKey + )); + } + if ($builder->searchBuilder->scheduleId !== null) { + $criteria->appendChild($xml->createElement( + 'ScheduleID', + $builder->searchBuilder->scheduleId + )); + } + if ($builder->searchBuilder->buyerEmailAddress !== null) { + $criteria->appendChild($xml->createElement( + 'BuyerEmailAddress', + $builder->searchBuilder->buyerEmailAddress + )); + } + if ($builder->searchBuilder->altPaymentStatus !== null) { + $criteria->appendChild($xml->createElement( + 'AltPaymentStatus', + $builder->searchBuilder->altPaymentStatus + )); + } + if ($builder->searchBuilder->fullyCaptured !== null) { + $criteria->appendChild($xml->createElement( + 'FullyCapturedInd', + $builder->searchBuilder->fullyCaptured + )); + } + } + } + $response = $this->doTransaction($this->buildEnvelope($xml, $transaction)); + return $this->mapReportResponse($response, $builder); + } + + /** + * Wraps a transaction with a SOAP envelope + * + * @param DOMDocument $xml The current DOMDocument object + * @param DOMElement $transaction The current transaction to wrap + * + * @return DOMElement + */ + protected function buildEnvelope(DOMDocument $xml, DOMElement $transaction) + { + $soapEnvelope = $xml->createElement('soapenv:Envelope'); + $soapEnvelope->setAttribute( + 'xmlns:soapenv', + 'http://schemas.xmlsoap.org/soap/envelope/' + ); + $soapEnvelope->setAttribute('xmlns', static::XML_NAMESPACE); + + $soapBody = $xml->createElement('soapenv:Body'); + $request = $xml->createElement('PosRequest'); + + $version = $xml->createElement('Ver1.0'); + $header = $xml->createElement('Header'); + + if (!empty($this->secretApiKey)) { + $header->appendChild( + $xml->createElement('SecretAPIKey', trim($this->secretApiKey)) + ); + } + if (!empty($this->siteId)) { + $header->appendChild( + $xml->createElement('SiteId', $this->siteId) + ); + } + if (!empty($this->deviceId)) { + $header->appendChild( + $xml->createElement('DeviceId', $this->deviceId) + ); + } + if (!empty($this->licenseId)) { + $header->appendChild( + $xml->createElement('LicenseId', $this->licenseId) + ); + } + if (!empty($this->username)) { + $header->appendChild( + $xml->createElement('UserName', $this->username) + ); + } + if (!empty($this->password)) { + $header->appendChild( + $xml->createElement('Password', $this->password) + ); + } + if (!empty($this->developerId)) { + $header->appendChild( + $xml->createElement('DeveloperID', $this->developerId) + ); + } + if (!empty($this->versionNumber)) { + $header->appendChild( + $xml->createElement('VersionNbr', $this->versionNumber) + ); + } + + $version->appendChild($header); + $transactionElement = $xml->createElement('Transaction'); + $transactionElement->appendChild($xml->importNode($transaction, true)); + $version->appendChild($transactionElement); + + $request->appendChild($version); + $soapBody->appendChild($request); + $soapEnvelope->appendChild($soapBody); + $xml->appendChild($soapEnvelope); + + return $xml->saveXML(); + } + + /** + * Deserializes the gateway's XML response + * + * @param string $rawResponse The XML response + * @param BaseBuilder $builder The original transaction builder + * + * @throws Exception + * @return Transaction + */ + protected function mapResponse($rawResponse, BaseBuilder $builder, $request) + { + $result = new Transaction(); + + // TODO: handle non-200 responses + + $root = $this->xml2object($rawResponse)->{'Ver1.0'}; + $acceptedCodes = ['00', '0', '85', '10']; + + $gatewayRspCode = $this->normalizeResponse((string)$root->Header->GatewayRspCode); + $gatewayRspText = (string)$root->Header->GatewayRspMsg; + + if (!in_array($gatewayRspCode, $acceptedCodes)) { + throw new GatewayException( + sprintf( + 'Unexpected Gateway Response: %s - %s. ', + $gatewayRspCode, + $gatewayRspText + ), + $gatewayRspCode, + $gatewayRspText + ); + } + + $item = $root->Transaction->{$this->mapRequestType($builder)}; + + $result->responseCode = isset($item) && isset($item->RspCode) + ? $this->normalizeResponse((string)$item->RspCode) + : $gatewayRspCode; + $result->responseMessage = isset($item) && isset($item->RspText) + ? (string)$item->RspText + : $gatewayRspText; + + if (isset($item) && isset($item->AuthAmt)) { + $result->authorizedAmount = (string)$item->AuthAmt; + } + + if (isset($item) && isset($item->AvailableBalance)) { + $result->availableBalance = (string)$item->AvailableBalance; + } + + if (isset($item) && isset($item->AVSRsltCode)) { + $result->avsResponseCode = (string)$item->AVSRsltCode; + } + + if (isset($item) && isset($item->AVSRsltText)) { + $result->avsResponseMessage = (string)$item->AVSRsltText; + } + + if (isset($item) && isset($item->BalanceAmt)) { + $result->balanceAmount = (string)$item->BalanceAmt; + } + + if (isset($item) && isset($item->CardType)) { + $result->cardType = (string)$item->CardType; + } + + if (isset($item) && isset($item->CardLast4)) { + $result->cardLast4 = (string)$item->TokenPANLast4; + } + + if (isset($item) && isset($item->CAVVResultCode)) { + $result->cavvResponseCode = (string)$item->CAVVResultCode; + } + + if (isset($item) && isset($item->CPCInd)) { + $result->commercialIndicator = (string)$item->CPCInd; + } + + if (isset($item) && isset($item->CVVRsltCode)) { + $result->cvnResponseCode = (string)$item->CVVRsltCode; + } + + if (isset($item) && isset($item->CVVRsltText)) { + $result->cvnResponseMessage = (string)$item->CVVRsltText; + } + + if (isset($item) && isset($item->EMVIssuerResp)) { + $result->emvIssuerResponse = (string)$item->EMVIssuerResp; + } + + if (isset($item) && isset($item->PointsBalanceAmt)) { + $result->pointsBalanceAmount = (string)$item->PointsBalanceAmt; + } + + if (isset($item) && isset($item->RecurringDataCode)) { + $result->recurringDataCode = (string)$item->RecurringDataCode; + } + + if (isset($item) && isset($item->RefNbr)) { + $result->referenceNumber = (string)$item->RefNbr; + } + + if (isset($item) && isset($item->TxnDescriptor)) { + $result->transactionDescriptor = (string)$item->TxnDescriptor; + } + + if ($builder->paymentMethod !== null) { + $result->transactionReference = new TransactionReference(); + $result->transactionReference->transactionId = (string)$root->Header->GatewayTxnId; + $result->transactionReference->paymentMethodType = $builder->paymentMethod->paymentMethodType; + + if (isset($item) && isset($item->AuthCode)) { + $result->transactionReference->authCode = (string)$item->AuthCode; + } + } + + if (isset($item) && isset($item->CardData)) { + $result->giftCard = new GiftCard(); + $result->giftCard->number = (string)$item->CardData->CardNbr; + $result->giftCard->alias = (string)$item->CardData->Alias; + $result->giftCard->pin = (string)$item->CardData->PIN; + } + + if (isset($root->Header->TokenData) && isset($root->Header->TokenData->TokenValue)) { + $result->token = (string)$root->Header->TokenData->TokenValue; + } + + if (isset($item) && isset($item->BatchId)) { + $result->batchSummary = new BatchSummary(); + $result->batchSummary->id = (string)$item->BatchId; + $result->batchSummary->transactionCount = (string)$item->TxnCnt; + $result->batchSummary->totalAmount = (string)$item->TotalAmt; + $result->batchSummary->sequenceNumber = (string)$item->BatchSeqNbr; + } + + return $result; + } + + protected function mapReportResponse($rawResponse, ReportBuilder $builder) + { + $root = $this->xml2object($rawResponse)->{'Ver1.0'}; + $doc = $root->Transaction->{$this->mapReportType($builder)}; + + if ((($builder->reportType === ReportType::ACTIVITY) + || ($builder->reportType === ReportType::FIND_TRANSACTIONS)) + && isset($doc->Transactions)) { + $response = []; + foreach ($doc->Transactions as $item) { + $response[] = $this->hydrateTransactionSummary($item); + } + return $response; + } + + if ($builder->reportType === ReportType::TRANSACTION_DETAIL) { + return $this->hydrateTransactionSummary($doc->Transactions); + } + + return null; + } + + protected function hydrateTransactionSummary($item) + { + $summary = new TransactionSummary(); + + if (isset($item) && isset($item->AcctDataSrc)) { + $summary->accountDataSource = (string)$item->AcctDataSrc; + } + + if (isset($item) && isset($item->Amt)) { + $summary->amount = (string)$item->Amt; + } + + if (isset($item) && isset($item->AuthAmt)) { + $summary->authorizatedAmount = (string)$item->AuthAmt; + } + + if (isset($item) && isset($item->AuthCode)) { + $summary->authCode = (string)$item->AuthCode; + } + + if (isset($item) && isset($item->BatchCloseDT)) { + $summary->batchCloseDate = (string)$item->BatchCloseDT; + } + + if (isset($item) && isset($item->BatchSeqNbr)) { + $summary->batchSequenceNumber = (string)$item->BatchSeqNbr; + } + + if (isset($item) && isset($item->CardHolderData)) { + if (isset($item->CardHolderData->CardHolderFirstName)) { + $summary->cardHolderFirstName = $item->CardHolderData->CardHolderFirstName; + } + if (isset($item->CardHolderData->CardHolderLastName)) { + $summary->cardHolderLastName = $item->CardHolderData->CardHolderLastName; + } + } + + if (isset($item) && isset($item->CardSwiped)) { + $summary->cardSwiped = (string)$item->CardSwiped; + } + + if (isset($item) && isset($item->CardType)) { + $summary->cardType = (string)$item->CardType; + } + + if (isset($item) && isset($item->ClerkId)) { + $summary->clerkId = (string)$item->ClerkId; + } + + if (isset($item) && isset($item->ClientTxnId)) { + $summary->clientTransactionId = (string)$item->ClientTxnId; + } + + if (isset($item) && isset($item->ConvenienceAmtInfo)) { + $summary->convenienceAmount = (string)$item->ConvenienceAmtInfo; + } + + if (isset($item) && isset($item->DeviceId)) { + $summary->deviceId = (string)$item->DeviceId; + } + + if (isset($item) && isset($item->GratuityAmtInfo)) { + $summary->gratuityAmount = (string)$item->GratuityAmtInfo; + } + + if (isset($item) && (isset($item->RspCode) || isset($item->IssuerRspCode))) { + $summary->issuerResponseCode = + isset($item->RspCode) + ? (string)$item->RspCode + : (string)$item->IssuerRspCode; + } + + if (isset($item) && (isset($item->RspText) || isset($item->IssuerRspText))) { + $summary->issuerResponseMessage = + isset($item->RspText) + ? (string)$item->RspText + : (string)$item->IssuerRspText; + } + + if (isset($item) && isset($item->IssTxnId)) { + $summary->issuerTransactionId = (string)$item->IssTxnId; + } + + if (isset($item) && isset($item->MaskedCardNbr)) { + $summary->maskedCardNumber = (string)$item->MaskedCardNbr; + } + + if (isset($item) && isset($item->OriginalGatewayTxnId)) { + $summary->originalTransactionId = (string)$item->OriginalGatewayTxnId; + } + + if (isset($item) && isset($item->GatewayRspCode)) { + $summary->gatewayResponseCode = $this->normalizeResponse((string)$item->GatewayRspCode); + } + + if (isset($item) && isset($item->GatewayResponseMsg)) { + $summary->gatewayResponseMessage = (string)$item->GatewayResponseMsg; + } + + if (isset($item) && isset($item->PaymentType)) { + $summary->paymentType = (string)$item->PaymentType; + } + + if (isset($item) && isset($item->CardHolderPONbr)) { + $summary->poNumber = (string)$item->CardHolderPONbr; + } + + if (isset($item) && isset($item->RefNbr)) { + $summary->referenceNumber = (string)$item->RefNbr; + } + + if (isset($item) && isset($item->RspDT)) { + $summary->responseDate = (string)$item->RspDT; + } + + if (isset($item) && isset($item->ServiceName)) { + $summary->serviceName = (string)$item->ServiceName; + } + + if (isset($item) && isset($item->SettlementAmt)) { + $summary->settlementAmount = (string)$item->SettlementAmt; + } + + if (isset($item) && isset($item->ShippingAmtInfo)) { + $summary->shippingAmount = (string)$item->ShippingAmtInfo; + } + + if (isset($item) && isset($item->SiteTrace)) { + $summary->siteTrace = (string)$item->SiteTrace; + } + + if (isset($item) && (isset($item->TxnStatus) || isset($item->Status))) { + $summary->status = isset($item->TxnStatus) ? (string)$item->TxnStatus : (string)$item->Status; + } + + if (isset($item) && (isset($item->TaxAmtInfo) || isset($item->TaxAmt))) { + $summary->taxAmount = isset($item->TaxAmtInfo) ? (string)$item->TaxAmtInfo : (string)$item->TaxAmt; + } + + if (isset($item) && isset($item->TaxType)) { + $summary->taxType = (string)$item->TaxType; + } + + if (isset($item) && (isset($item->TxnUtcDT) || isset($item->ReqUtcDT))) { + $summary->transactionDate = isset($item->TxnUtcDT) ? (string)$item->TxnUtcDT : (string)$item->ReqUtcDT; + } + + if (isset($item) && isset($item->GatewayTxnId)) { + $summary->transactionId = (string)$item->GatewayTxnId; + } + + if (isset($item) && isset($item->TxnStatus)) { + $summary->transactionStatus = (string)$item->TxnStatus; + } + + if (isset($item) && isset($item->UserName)) { + $summary->userName = (string)$item->UserName; + } + + if (isset($item) && isset($item->AdditionalTxnFields)) { + if (isset($item->AdditionalTxnFields->Description)) { + $summary->description = (string)$item->AdditionalTxnFields->Description; + } + + if (isset($item->AdditionalTxnFields->InvoiceNbr)) { + $summary->invoiceNumber = (string)$item->AdditionalTxnFields->InvoiceNbr; + } + + if (isset($item->AdditionalTxnFields->CustomerID)) { + $summary->customerId = (string)$item->AdditionalTxnFields->CustomerID; + } + } + + if (isset($item) && isset($item->UniqueDeviceId)) { + $summary->uniqueDeviceId = (string)$item->UniqueDeviceId; + } + + if (isset($item) && isset($item->AdditionalTxnFields->TxnDescriptor)) { + $summary->transactionDescriptor = (string)$item->AdditionalTxnFields->TxnDescriptor; + } + + if (isset($item) && isset($item->GiftCurrency)) { + $summary->giftCurrency = (string)$item->GiftCurrency; + } + + if (isset($item) && isset($item->GiftMaskedAlias)) { + $summary->maskedAlias = (string)$item->GiftMaskedAlias; + } + + if (isset($item) && isset($item->PaymentMethodKey)) { + $summary->paymentMethodKey = (string)$item->PaymentMethodKey; + } + + if (isset($item) && isset($item->ScheduleID)) { + $summary->scheduleId = (string)$item->ScheduleID; + } + + if (isset($item) && isset($item->OneTime)) { + $summary->oneTimePayment = (string)$item->OneTime; + } + + if (isset($item) && isset($item->RecurringDataCode)) { + $summary->recurringDataCode = (string)$item->RecurringDataCode; + } + + if (isset($item) && isset($item->SurchargeAmtInfo)) { + $summary->surchargeAmount = (string)$item->SurchargeAmtInfo; + } + + if (isset($item) && isset($item->FraudInfoRule)) { + $summary->fraudRuleInfo = (string)$item->UserNFraudInfoRuleame; + } + + if (isset($item) && isset($item->RepeatCount)) { + $summary->repeatCount = (string)$item->RepeatCount; + } + + if (isset($item) && isset($item->EMVChipCondition)) { + $summary->emvChipCondition = (string)$item->EMVChipCondition; + } + + if (isset($item) && isset($item->HasEMVTag)) { + $summary->hasEmvTags = (string)$item->HasEMVTag; + } + + if (isset($item) && isset($item->HasEcomPaymentData)) { + $summary->hasEcomPaymentData = (string)$item->HasEcomPaymentData; + } + + if (isset($item) && isset($item->CAVVResultCode)) { + $summary->cavvResponseCode = (string)$item->CAVVResultCode; + } + + if (isset($item) && isset($item->TokenPANLast4)) { + $summary->tokenPanLastFour = (string)$item->TokenPANLast4; + } + + if (isset($item) && isset($item->Company)) { + $summary->companyName = (string)$item->Company; + } + + if (isset($item) && isset($item->CustomerFirstname)) { + $summary->customerFirstName = (string)$item->CustomerFirstname; + } + + if (isset($item) && isset($item->CustomerLastName)) { + $summary->customerLastName = (string)$item->CustomerLastName; + } + + if (isset($item) && isset($item->DebtRepaymentIndicator)) { + $summary->debtRepaymentIndicator = (string)$item->DebtRepaymentIndicator; + } + + if (isset($item) && isset($item->CaptureAmtInfo)) { + $summary->captureAmount = (string)$item->CaptureAmtInfo; + } + + if (isset($item) && isset($item->FullyCapturedInd)) { + $summary->fullyCaptured = (string)$item->FullyCapturedInd; + } + + // lodging data + if (isset($item) && isset($item->LodgingData)) { + $summary->lodgingData = new LodgingData(); + $summary->lodgingData->prestigiousPropertyLimit = (string)$item->LodgingData->PrestigiousPropertyLimit; + $summary->lodgingData->noShow = (string)$item->LodgingData->NoShow; + $summary->lodgingData->advancedDepositType = (string)$item->LodgingData->AdvancedDepositType; + $summary->lodgingData->lodgingDataEdit = (string)$item->LodgingData->LodgingDataEdit; + $summary->lodgingData->preferredCustomer = (string)$item->LodgingData->PreferredCustomer; + } + + // check data + if (isset($item) && isset($item->CheckData)) { + $summary->checkData = new CheckData(); + $summary->checkData->accountInfo = $item->CheckData->AccountInfo; + $summary->checkData->consumerInfo = $item->CheckData->ConsumerInfo; + $summary->checkData->dataEntryMode = (string)$item->CheckData->DataEntryMode; + $summary->checkData->checkType = (string)$item->CheckData->CheckType; + $summary->checkData->secCode = (string)$item->CheckData->SECCode; + $summary->checkData->checkAction = (string)$item->CheckData->CheckAction; + } + + // alt payment data + if (isset($item) && isset($item->AltPaymentData)) { + $summary->altPaymentData = new AltPaymentData(); + $summary->altPaymentData->buyerEmailAddress = (string)$item->AltPaymentData->BuyerEmailAddress; + $summary->altPaymentData->stateDate = (string)$item->AltPaymentData->StatusDT; + $summary->altPaymentData->status = (string)$item->AltPaymentData->Status; + $summary->altPaymentData->statusMessage = (string)$item->AltPaymentData->StatusMsg; + + $summary->altPaymentData->processorResponseInfo = new AltPaymentProcessorInfo(); + foreach ($summary->altPaymentData->processorResponseInfo as $info) { + $pri = new AltPaymentProcessorInfo(); + $pri->code = (string)$info->Code; + $pri->message = (string)$info->Message; + $pri->type = (string)$info->Type; + $summary->altPaymentData->processorResponseInfo->add($pri); + } + } + + return $summary; + } + + /** + * Maps a transaction builder to a Portico request type + * + * @param BaseBuilder $builder Transaction builder + * + * @return string + */ + protected function mapRequestType(BaseBuilder $builder) + { + switch ($builder->transactionType) { + case TransactionType::BATCH_CLOSE: + return 'BatchClose'; + case TransactionType::DECLINE: + if ($builder->paymentMethod->paymentMethodType === PaymentMethodType::GIFT) { + return 'GiftCardDeactivate'; + } elseif ($builder->transactionModifier === TransactionModifier::CHIP_DECLINE) { + return 'ChipCardDecline'; + } elseif ($builder->transactionModifier === TransactionModifier::FRAUD_DECLINE) { + return 'OverrideFraudDecline'; + } + throw new NotImplementedException(); + case TransactionType::VERIFY: + if ($builder->transactionModifier === TransactionModifier::ENCRYPTED_MOBILE) { + throw new UnsupportedTransactionException('Transaction not supported for this payment method.'); + } + return 'CreditAccountVerify'; + case TransactionType::CAPTURE: + return 'CreditAddToBatch'; + case TransactionType::AUTH: + if ($builder->paymentMethod->paymentMethodType === PaymentMethodType::CREDIT) { + if ($builder->transactionModifier === TransactionModifier::ADDITIONAL) { + return 'CreditAdditionalAuth'; + } elseif ($builder->transactionModifier === TransactionModifier::INCREMENTAL) { + return 'CreditIncrementalAuth'; + } elseif ($builder->transactionModifier === TransactionModifier::OFFLINE) { + return 'CreditOfflineAuth'; + } elseif ($builder->transactionModifier == TransactionModifier::RECURRING) { + return 'RecurringBillingAuth'; + } elseif ($builder->transactionModifier === TransactionModifier::ENCRYPTED_MOBILE) { + throw new UnsupportedTransactionException('Transaction not supported for this payment method.'); + } + + return 'CreditAuth'; + } elseif ($builder->paymentMethod->paymentMethodType === PaymentMethodType::RECURRING) { + return 'RecurringBillingAuth'; + } + throw new UnsupportedTransactionException('Transaction not supported for this payment method.'); + case TransactionType::SALE: + if ($builder->paymentMethod->paymentMethodType === PaymentMethodType::CREDIT) { + if ($builder->transactionModifier === TransactionModifier::OFFLINE) { + return 'CreditOfflineSale'; + } elseif ($builder->transactionModifier === TransactionModifier::ENCRYPTED_MOBILE) { + throw new UnsupportedTransactionException('Transaction not supported for this payment method.'); + } elseif ($builder->transactionModifier == TransactionModifier::RECURRING) { + return 'RecurringBilling'; + } else { + return 'CreditSale'; + } + } elseif ($builder->paymentMethod->paymentMethodType == PaymentMethodType::RECURRING) { + if ($builder->paymentMethod->paymentType == 'ACH') { + return 'CheckSale'; + } + return 'RecurringBilling'; + } elseif ($builder->paymentMethod->paymentMethodType === PaymentMethodType::DEBIT) { + return 'DebitSale'; + } elseif ($builder->paymentMethod->paymentMethodType === PaymentMethodType::CASH) { + return 'CashSale'; + } elseif ($builder->paymentMethod->paymentMethodType === PaymentMethodType::ACH) { + return 'CheckSale'; + } elseif ($builder->paymentMethod->paymentMethodType === PaymentMethodType::EBT) { + if ($builder->transactionModifier === TransactionModifier::CASH_BACK) { + return 'EBTCashBackPurchase'; + } elseif ($builder->transactionModifier === TransactionModifier::VOUCHER) { + return 'EBTVoucherPurchase'; + } else { + return 'EBTFSPurchase'; + } + } elseif ($builder->paymentMethod->paymentMethodType === PaymentMethodType::GIFT) { + return 'GiftCardSale'; + } + throw new UnsupportedTransactionException('Transaction not supported for this payment method.'); + case TransactionType::REFUND: + if ($builder->paymentMethod->paymentMethodType === PaymentMethodType::CREDIT) { + return 'CreditReturn'; + } elseif ($builder->paymentMethod->paymentMethodType === PaymentMethodType::DEBIT) { + return 'DebitReturn'; + } elseif ($builder->paymentMethod->paymentMethodType === PaymentMethodType::CASH) { + return 'CashReturn'; + } elseif ($builder->paymentMethod->paymentMethodType === PaymentMethodType::EBT) { + return 'EBTFSReturn'; + } + throw new UnsupportedTransactionException('Transaction not supported for this payment method.'); + case TransactionType::REVERSAL: + if ($builder->paymentMethod->paymentMethodType === PaymentMethodType::CREDIT) { + return 'CreditReversal'; + } elseif ($builder->paymentMethod->paymentMethodType === PaymentMethodType::DEBIT) { + return 'DebitReversal'; + } elseif ($builder->paymentMethod->paymentMethodType === PaymentMethodType::GIFT) { + return 'GiftCardReversal'; + } + throw new UnsupportedTransactionException('Transaction not supported for this payment method.'); + case TransactionType::EDIT: + if ($builder->transactionModifier === TransactionModifier::LEVEL_II) { + return 'CreditCPCEdit'; + } else { + return 'CreditTxnEdit'; + } + break; + case TransactionType::VOID: + if ($builder->paymentMethod->paymentMethodType === PaymentMethodType::CREDIT) { + return 'CreditVoid'; + } elseif ($builder->paymentMethod->paymentMethodType === PaymentMethodType::ACH) { + return 'CheckVoid'; + } elseif ($builder->paymentMethod->paymentMethodType === PaymentMethodType::GIFT) { + return 'GiftCardVoid'; + } + throw new UnsupportedTransactionException('Transaction not supported for this payment method.'); + case TransactionType::ADD_VALUE: + if ($builder->paymentMethod->paymentMethodType === PaymentMethodType::CREDIT) { + return 'PrePaidAddValue'; + } elseif ($builder->paymentMethod->paymentMethodType === PaymentMethodType::DEBIT) { + return 'DebitAddValue'; + } elseif ($builder->paymentMethod->paymentMethodType === PaymentMethodType::GIFT) { + return 'GiftCardAddValue'; + } + throw new UnsupportedTransactionException('Transaction not supported for this payment method.'); + case TransactionType::BALANCE: + if ($builder->paymentMethod->paymentMethodType === PaymentMethodType::CREDIT) { + return 'PrePaidBalanceInquiry'; + } elseif ($builder->paymentMethod->paymentMethodType === PaymentMethodType::EBT) { + return 'EBTBalanceInquiry'; + } elseif ($builder->paymentMethod->paymentMethodType === PaymentMethodType::GIFT) { + return 'GiftCardBalance'; + } + throw new UnsupportedTransactionException('Transaction not supported for this payment method.'); + case TransactionType::ACTIVATE: + return 'GiftCardActivate'; + case TransactionType::ALIAS: + return 'GiftCardAlias'; + case TransactionType::REPLACE: + return 'GiftCardReplace'; + case TransactionType::REWARD: + return 'GiftCardReward'; + case TransactionType::TOKEN_DELETE: + case TransactionType::TOKEN_UPDATE: + return 'ManageTokens'; + default: + break; + } + + throw new UnsupportedTransactionException('Unknown transaction'); + } + + protected function mapReportType(ReportBuilder $builder) + { + switch ($builder->reportType) { + case ReportType::ACTIVITY: + case ReportType::TRANSACTION_DETAIL: + case ReportType::FIND_TRANSACTIONS: + return 'FindTransactions'; + default: + throw new UnsupportedTransactionException(); + } + } + + /** + * Converts a XML string to a simple object for use, + * removing extra nodes that are not necessary for + * handling the response + * + * @param string $xml Response XML from the gateway + * + * @return \SimpleXMLElement + */ + protected function xml2object($xml) + { + $envelope = simplexml_load_string( + $xml, + 'SimpleXMLElement', + 0, + 'http://schemas.xmlsoap.org/soap/envelope/' + ); + + foreach ($envelope->Body as $response) { + $children = $response->children(static::XML_NAMESPACE); + foreach ($children as $item) { + return $item; + } + } + + throw new Exception('XML from gateway could not be parsed'); + } + + /** + * Tests the payment method for a token value + * + * @param IPaymentMethod $paymentMethod The payment method + * + * @return [bool, string|null] + */ + protected function hasToken(IPaymentMethod $paymentMethod) + { + $tokenValue = null; + + if ($paymentMethod instanceof ITokenizable && !empty($paymentMethod->token)) { + $tokenValue = $paymentMethod->token; + return [true, $tokenValue]; + } + + return [false, $tokenValue]; + } + + /** + * Normalizes response code for success responses + * + * @param string $input Original response code + * + * @return string + */ + protected function normalizeResponse($input) + { + if (in_array($input, ['0', '85'])) { + $input = '00'; + } + + return $input; + } + + /** + * Serializes builder information into XML + * + * @param DOMDocument $xml XML instance + * @param BaseBuilder $builder Request builder + * @param bool $isCheck If payment method is ACH + * + * @return DOMElement + */ + protected function hydrateHolder(DOMDocument $xml, BaseBuilder $builder, $isCheck = false) + { + $holder = $xml->createElement($isCheck ? 'ConsumerInfo' : 'CardHolderData'); + + if ($isCheck && $builder->paymentMethod instanceof RecurringPaymentMethod) { + return null; + } + + if ($builder->billingAddress !== null) { + $holder->appendChild( + $xml->createElement($isCheck ? 'Address1' : 'CardHolderAddr', $builder->billingAddress->streetAddress1) + ); + $holder->appendChild( + $xml->createElement($isCheck ? 'City' : 'CardHolderCity', $builder->billingAddress->city) + ); + $holder->appendChild( + $xml->createElement($isCheck ? 'State' : 'CardHolderState', $builder->billingAddress->getProvince()) + ); + $holder->appendChild( + $xml->createElement($isCheck ? 'Zip' : 'CardHolderZip', $builder->billingAddress->postalCode) + ); + } + + $propertyName = $isCheck ? 'checkHolderName' : 'cardHolderName'; + if (!empty($builder->paymentMethod->{$propertyName})) { + $names = explode(' ', $builder->paymentMethod->{$propertyName}, 2); + $holder->appendChild( + $xml->createElement($isCheck ? 'FirstName' : 'CardHolderFirstName', $names[0]) + ); + + if (isset($names[1])) { + $holder->appendChild( + $xml->createElement($isCheck ? 'LastName' : 'CardHolderLastName', $names[1]) + ); + } + } + + if ($isCheck) { + if ($builder->paymentMethod->checkHolderName !== null) { + $holder->appendChild($xml->createElement('CheckName', $builder->paymentMethod->checkHolderName)); + } + + if ($builder->paymentMethod->phoneNumber !== null) { + $holder->appendChild($xml->createElement('PhoneNumber', $builder->paymentMethod->phoneNumber)); + } + + if ($builder->paymentMethod->driversLicenseNumber !== null) { + $holder->appendChild($xml->createElement('DLNumber', $builder->paymentMethod->driversLicenseNumber)); + } + + if ($builder->paymentMethod->driversLicenseState !== null) { + $holder->appendChild($xml->createElement('DLState', $builder->paymentMethod->driversLicenseState)); + } + + if ($builder->paymentMethod->ssnLast4 !== null + || $builder->paymentMethod->birthYear !== null + ) { + $identity = $xml->createElement('IdentityInfo'); + $identity->appendChild($xml->createElement('SSNL4', $builder->paymentMethod->ssnLast4)); + $identity->appendChild($xml->createElement('DOBYear', $builder->paymentMethod->birthYear)); + $holder->appendChild($identity); + } + } + + return $holder; + } + + protected function hydrateAccountType($type) + { + switch ($type) { + case AccountType::CHECKING: + return 'CHECKING'; + case AccountType::SAVINGS: + return 'SAVINGS'; + } + } + + /** + * Serializes builder information into XML + * + * @param DOMDocument $xml XML instance + * @param BaseBuilder $builder Request builder + * + * @return DOMElement + */ + protected function hydrateAdditionalTxnFields(DOMDocument $xml, BaseBuilder $builder) + { + $additionalTxnFields = $xml->createElement('AdditionalTxnFields'); + + if ($builder->description !== null && $builder->description !== '') { + $additionalTxnFields->appendChild( + $xml->createElement('Description', $builder->description) + ); + } + + if ($builder->invoiceNumber !== null && $builder->invoiceNumber !== '') { + $additionalTxnFields->appendChild( + $xml->createElement('InvoiceNbr', $builder->invoiceNumber) + ); + } + + if ($builder->customerId !== null && $builder->customerId !== '') { + $additionalTxnFields->appendChild( + $xml->createElement('CustomerID', $builder->customerId) + ); + } + + return $additionalTxnFields; + } + + protected function hydrateCheckType($type) + { + switch ($type) { + case CheckType::PERSONAL: + return 'PERSONAL'; + case CheckType::BUSINESS: + return 'BUSINESS'; + case CheckType::PAYROLL: + return 'PAYROLL'; + } + } + + /** + * Serializes builder information into XML + * + * @param DOMDocument $xml XML instance + * @param BaseBuilder $builder Request builder + * + * @return DOMElement + */ + protected function hydrateEncryptionData(DOMDocument $xml, BaseBuilder $builder) + { + $enc = $xml->createElement('EncryptionData'); + + if ($builder->paymentMethod->encryptionData->version !== null) { + $enc->appendChild($xml->createElement('Version', $builder->paymentMethod->encryptionData->version)); + } + + if ($builder->paymentMethod->encryptionData->trackNumber !== null) { + $enc->appendChild($xml->createElement('TrackNumber', $builder->paymentMethod->encryptionData->trackNumber)); + } + + if ($builder->paymentMethod->encryptionData->ktb !== null) { + $enc->appendChild($xml->createElement('KTB', $builder->paymentMethod->encryptionData->ktb)); + } + + if ($builder->paymentMethod->encryptionData->ksn !== null) { + $enc->appendChild($xml->createElement('KSN', $builder->paymentMethod->encryptionData->ksn)); + } + + return $enc; + } + + protected function hydrateEntryMethod($method) + { + switch ($method) { + case EntryMethod::MANUAL: + return 'Manual'; + case EntryMethod::SWIPE: + return 'Swipe'; + case EntryMethod::PROXIMITY: + return 'Proximity'; + } + } + + /** + * Serializes builder information into XML + * + * @param DOMDocument $xml XML instance + * @param BaseBuilder $builder Request builder + * @param bool $hasToken If request builder is using token data + * @param string $tokenValue Token if `$hasToken` is `true` + * + * @return DOMElement + */ + protected function hydrateManualEntry(DOMDocument $xml, BaseBuilder $builder, $hasToken = false, $tokenValue = null) + { + if ($hasToken) { + $me = $xml->createElement('TokenData'); + } else { + $me = $xml->createElement('ManualEntry'); + } + + if ($hasToken || isset($builder->paymentMethod->number)) { + $me->appendChild( + $xml->createElement( + $hasToken ? 'TokenValue' : 'CardNbr', + $hasToken ? $tokenValue : $builder->paymentMethod->number + ) + ); + } + + if (isset($builder->paymentMethod->expMonth)) { + $me->appendChild($xml->createElement('ExpMonth', $builder->paymentMethod->expMonth)); + } + + if (isset($builder->paymentMethod->expYear)) { + $me->appendChild($xml->createElement('ExpYear', $builder->paymentMethod->expYear)); + } + + if (isset($builder->paymentMethod->cvn)) { + $me->appendChild($xml->createElement('CVV2', $builder->paymentMethod->cvn)); + } + + $me->appendChild( + $xml->createElement('CardPresent', ($builder->paymentMethod->cardPresent ? 'Y' : 'N')) + ); + + $me->appendChild( + $xml->createElement('ReaderPresent', ($builder->paymentMethod->readerPresent ? 'Y' : 'N')) + ); + + return $me; + } + + /** + * Serializes builder information into XML + * + * @param DOMDocument $xml XML instance + * @param BaseBuilder $builder Request builder + * @param bool $hasToken If request builder is using token data + * @param string $tokenValue Token if `$hasToken` is `true` + * + * @return DOMElement + */ + protected function hydrateTrackData(DOMDocument $xml, BaseBuilder $builder, $hasToken = false, $tokenValue = null) + { + $trackData = $xml->createElement($hasToken ? 'TokenValue' : 'TrackData'); + + if ($hasToken) { + $trackData->appendChild($xml->createElement('TokenValue', $tokenValue)); + return $trackData; + } + + $trackData->appendChild($xml->createTextNode($builder->paymentMethod->value)); + if ($builder->paymentMethod->paymentMethodType !== PaymentMethodType::DEBIT) { + $trackData->setAttribute( + 'method', + $builder->paymentMethod->entryMethod === EntryMethod::SWIPE + ? 'swipe' + : 'proximity' + ); + } + + return $trackData; + } + + public function supportsHostedPayments() + { + return $this->supportsHostedPayments; + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Gateways/RealexConnector.php b/classes/includes/vendor/globalpayments/php-sdk/src/Gateways/RealexConnector.php new file mode 100644 index 0000000..47b30f4 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Gateways/RealexConnector.php @@ -0,0 +1,1413 @@ +transactionModifier) && + $builder->transactionModifier === TransactionModifier::ENCRYPTED_MOBILE && + $builder->paymentMethod->mobileType === EncyptedMobileType::GOOGLE_PAY && + (empty($builder->amount) || empty($builder->currency)) + ) { + throw new BuilderException("Amount and Currency cannot be null for google payment"); + } + + $xml = new DOMDocument(); + $timestamp = isset($builder->timestamp) ? $builder->timestamp : GenerationUtils::generateTimestamp(); + $orderId = isset($builder->orderId) ? $builder->orderId : GenerationUtils::generateOrderId(); + $transactionType = $this->mapAuthRequestType($builder); + + // Build Request + $request = $xml->createElement("request"); + $request->setAttribute("timestamp", $timestamp); + $request->setAttribute("type", $transactionType); + + $request->appendChild($xml->createElement("merchantid", $this->merchantId)); + + if ($this->accountId !== null) { + $request->appendChild($xml->createElement("account", $this->accountId)); + } + if ($this->channel !== null) { + $request->appendChild($xml->createElement("channel", $this->channel)); + } + + $request->appendChild($xml->createElement("orderid", $orderId)); + + if (isset($builder->amount)) { + $amount = $xml->createElement("amount", preg_replace('/[^0-9]/', '', sprintf('%01.2f', $builder->amount))); + $amount->setAttribute("currency", $builder->currency); + $request->appendChild($amount); + } + + // This needs to be figured out based on txn type and set to 0, 1 or MULTI + if ($builder->transactionType === TransactionType::SALE || $builder->transactionType == TransactionType::AUTH) { + $autoSettle = $builder->transactionType === TransactionType::SALE ? "1" : "0"; + $element = $xml->createElement("autosettle"); + $element->setAttribute("flag", $autoSettle); + $request->appendChild($element); + } + + // For Fraud Decision Manager + if (!empty($builder->customerData)) { + $customerValue = $builder->customerData; + $customer = $xml->createElement("customer"); + $customer->appendChild($xml->createElement("customerid", $customerValue->id)); + $customer->appendChild($xml->createElement("firstname", $customerValue->firstName)); + $customer->appendChild($xml->createElement("lastname", $customerValue->lastName)); + $customer->appendChild($xml->createElement("dateofbirth", $customerValue->dateOfBirth)); + $customer->appendChild($xml->createElement("customerpassword", $customerValue->customerPassword)); + $customer->appendChild($xml->createElement("email", $customerValue->email)); + $customer->appendChild($xml->createElement("domainname", $customerValue->domainName)); + $customer->appendChild($xml->createElement("devicefingerprint", $customerValue->deviceFingerPrint)); + $customer->appendChild($xml->createElement("phonenumber", $customerValue->homePhone)); + $request->appendChild($customer); + } + + if (!empty($builder->productData)) { + $prod = []; + $productValues = $builder->productData; + $products = $xml->createElement("products"); + + foreach ($productValues as $prod) { + $product = $xml->createElement("product"); + $product->appendChild($xml->createElement('product_id', $prod['product_id'])); + $product->appendChild($xml->createElement('productname', $prod['productname'])); + $product->appendChild($xml->createElement('quantity', $prod['quantity'])); + $product->appendChild($xml->createElement('unitprice', $prod['unitprice'])); + $product->appendChild($xml->createElement('gift', $prod['gift'])); + $product->appendChild($xml->createElement('type', $prod['type'])); + $product->appendChild($xml->createElement('risk', $prod['risk'])); + $product->appendChild($products); + $request->appendChild($product); + } + } + + if ($builder->decisionManager !== null) { + $dmValues = $builder->decisionManager; + $fraud = $xml->createElement("fraud"); + $dm = $fraud->appendChild($xml->createElement('dm')); + $dm->appendChild($xml->createElement('billtohostname', $dmValues->billToHostName)); + $dm->appendChild($xml->createElement( + 'billtohttpbrowsercookiesaccepted', + ($dmValues->billToHttpBrowserCookiesAccepted) != true ? 'false' : 'true' + )); + $dm->appendChild($xml->createElement('billtohttpbrowseremail', $dmValues->billToHttpBrowserEmail)); + $dm->appendChild($xml->createElement('billtohttpbrowsertype', $dmValues->billToHttpBrowserType)); + $dm->appendChild($xml->createElement('billtoipnetworkaddress', $dmValues->billToIpNetworkAddress)); + $dm->appendChild($xml->createElement( + 'businessrulesscorethreshold', + $dmValues->businessRulessCoreThresHold + )); + $dm->appendChild($xml->createElement('billtopersonalid', $dmValues->billToPersonalId)); + $dm->appendChild($xml->createElement('invoiceheadertendertype', $dmValues->invoiceHeaderTenderType)); + $dm->appendChild($xml->createElement( + 'invoiceheaderisgift', + ($dmValues->invoiceHeaderIsGift) != true ? 'false' : 'true' + )); + $dm->appendChild($xml->createElement('decisionmanagerprofile', $dmValues->decisionManagerProfile)); + $dm->appendChild($xml->createElement( + 'invoiceheaderreturnsaccepted', + ($dmValues->invoiceHeaderReturnsAccepted) != true ? 'false' : 'true' + )); + $dm->appendChild($xml->createElement('itemhosthedge', $dmValues->itemHostHedge)); + $dm->appendChild($xml->createElement('itemnonsensicalhedge', $dmValues->itemNonsensicalHedge)); + $dm->appendChild($xml->createElement('itemobscenitieshedge', $dmValues->itemObscenitiesHedge)); + $dm->appendChild($xml->createElement('itemphonehedge', $dmValues->itemPhoneHedge)); + $dm->appendChild($xml->createElement('itemtimehedge', $dmValues->itemTimeHedge)); + $dm->appendChild($xml->createElement('itemvelocityhedge', $dmValues->itemVelocityHedge)); + $request->appendChild($dm); + } + + if (!empty($builder->customData)) { + $cust = []; + $customValues = $builder->customData; + $custom = $xml->createElement("custom"); + + foreach ($customValues as $cust) { + $custom->appendChild($xml->createElement('field01', $cust['field01'])); + $custom->appendChild($xml->createElement('field02', $cust['field02'])); + $custom->appendChild($xml->createElement('field03', $cust['field03'])); + $custom->appendChild($xml->createElement('field04', $cust['field04'])); + $request->appendChild($custom); + } + } + + // For DCC rate lookup + if ($builder->transactionType === TransactionType::DCC_RATE_LOOKUP) { + $dccinfo = $xml->createElement("dccinfo"); + $dccinfo->appendChild($xml->createElement("ccp", $builder->dccProcessor)); + $dccinfo->appendChild($xml->createElement("type", $builder->dccType)); + $dccinfo->appendChild($xml->createElement("ratetype", $builder->dccRateType)); + $request->appendChild($dccinfo); + } + + // For DCC charge/auth + if (!empty($builder->dccRateData)) { + $dccinfo = $xml->createElement("dccinfo"); + + $amount = $xml->createElement("amount", preg_replace('/[^0-9]/', '', $builder->dccRateData->amount)); + $amount->setAttribute("currency", $builder->dccRateData->currency); + + $dccinfo->appendChild($amount); + $dccinfo->appendChild($xml->createElement("ccp", $builder->dccRateData->dccProcessor)); + $dccinfo->appendChild($xml->createElement("type", $builder->dccRateData->dccType)); + $dccinfo->appendChild($xml->createElement("rate", $builder->dccRateData->dccRate)); + $dccinfo->appendChild($xml->createElement("ratetype", $builder->dccRateData->dccRateType)); + $request->appendChild($dccinfo); + } + + // Hydrate the payment data fields + if ($builder->paymentMethod instanceof CreditCardData) { + $card = $builder->paymentMethod; + + if ($builder->transactionModifier === TransactionModifier::ENCRYPTED_MOBILE) { + $request->appendChild($xml->createElement("token", $card->token)); + $request->appendChild($xml->createElement("mobile", $card->mobileType)); + } else { + $cardElement = $xml->createElement("card"); + $cardElement->appendChild($xml->createElement("number", $card->number)); + $cardElement->appendChild($xml->createElement("expdate", $card->getShortExpiry())); + $cardElement->appendChild($xml->createElement("chname", $card->cardHolderName)); + $cardElement->appendChild($xml->createElement("type", strtoupper($card->getCardType()))); + + if ($card->cvn !== null) { + //if cvn number is not empty indicator should be PRESENT + $cvnPresenceIndicator = (!empty($card->cvn)) ? + CvnPresenceIndicator::PRESENT: + $card->cvnPresenceIndicator; + + $cvnElement = $xml->createElement("cvn"); + $cvnElement->appendChild($xml->createElement("number", $card->cvn)); + $cvnElement->appendChild($xml->createElement("presind", $cvnPresenceIndicator)); + $cardElement->appendChild($cvnElement); + } + $request->appendChild($cardElement); + } + // issueno + $hash = ''; + if ($builder->transactionType === TransactionType::VERIFY) { + $hash = GenerationUtils::generateHash( + $this->sharedSecret, + implode('.', [ + $timestamp, + $this->merchantId, + $orderId, + $card->number + ]) + ); + } else { + $requestValues = $this->getShal1RequestValues($timestamp, $orderId, $builder, $card); + + $hash = GenerationUtils::generateHash( + $this->sharedSecret, + implode('.', $requestValues) + ); + } + + $request->appendChild($xml->createElement("sha1hash", $hash)); + } + if ($builder->paymentMethod instanceof RecurringPaymentMethod) { + $recurring = $builder->paymentMethod; + $request->appendChild($xml->createElement("payerref", $recurring->customerKey)); + $request->appendChild($xml->createElement( + "paymentmethod", + isset($recurring->key) ? $recurring->key : $recurring->id + )); + + if ($builder->cvn !== null && $builder->cvn !== '') { + $paymentData = $xml->createElement("paymentdata"); + $cvn = $xml->createElement("cvn"); + $cvn->appendChild($xml->createElement("number", $builder->cvn)); + $paymentData->appendChild($cvn); + $request->appendChild($paymentData); + } + + $hash = ''; + if ($builder->transactionType === TransactionType::VERIFY) { + if (!empty($builder->transactionModifier) && + $builder->transactionModifier === TransactionModifier::SECURE3D) { + $hash = GenerationUtils::generateHash( + $this->sharedSecret, + implode('.', [ + $timestamp, + $this->merchantId, + $orderId, + preg_replace('/[^0-9]/', '', sprintf('%01.2f', $builder->amount)), + $builder->currency, + $recurring->customerKey, + ]) + ); + } else { + $hash = GenerationUtils::generateHash( + $this->sharedSecret, + implode('.', [ + $timestamp, + $this->merchantId, + $orderId, + $recurring->customerKey, + ]) + ); + } + } else { + $hash = GenerationUtils::generateHash( + $this->sharedSecret, + implode('.', [ + $timestamp, + $this->merchantId, + $orderId, + preg_replace('/[^0-9]/', '', sprintf('%01.2f', $builder->amount)), + $builder->currency, + $recurring->customerKey, + ]) + ); + } + $request->appendChild($xml->createElement("sha1hash", $hash)); + } else { + // TODO: Token Processing + //$request->appendChild($xml->createElement("sha1hash", GenerateHash(order, token)); + } + + // refund hash + if ($builder->transactionType === TransactionType::REFUND) { + $request->appendChild($xml->createElement( + "refundhash", + GenerationUtils::generateHash($this->refundPassword) ?: '' + )); + } + + + + if ($builder->paymentMethod instanceof AlternativePaymentMethod) { + $this->buildAlternativePaymentMethod($builder, $request, $xml); + } + + // comment ...TODO: needs to be multiple + if ($builder->description != null) { + $comments = $xml->createElement("comments"); + $comment = $xml->createElement("comment", $builder->description); + $comment->setAttribute("id", "1"); + $comments->appendChild($comment); + + $request->appendChild($comments); + } + + if ($builder->paymentMethod instanceof AlternativePaymentMethod) { + $hash = GenerationUtils::generateHash( + $this->sharedSecret, + implode('.', [ + $timestamp, + $this->merchantId, + $orderId, + preg_replace('/[^0-9]/', '', sprintf('%01.2f', $builder->amount)), + $builder->currency, + $builder->paymentMethod->alternativePaymentMethodType, + ]) + ); + $request->appendChild($xml->createElement("sha1hash", $hash)); + } + + if ($builder->recurringType !== null || $builder->recurringSequence !== null) { + $recurring = $xml->createElement("recurring"); + $recurring->setAttribute("type", strtolower($builder->recurringType)); + $recurring->setAttribute("sequence", strtolower($builder->recurringSequence)); + $request->appendChild($recurring); + } + + // fraud filter + $this->buildFraudFilter($builder, $xml, $request); + + // tssinfo + + // stored credential + if ($builder->storedCredential != null) { + $storedCredential = $xml->createElement("storedcredential"); + $storedCredential->appendChild($xml->createElement("type", $builder->storedCredential->type)); + $storedCredential->appendChild($xml->createElement("initiator", $builder->storedCredential->initiator)); + $storedCredential->appendChild($xml->createElement("sequence", $builder->storedCredential->sequence)); + $storedCredential->appendChild($xml->createElement("srd", $builder->storedCredential->schemeId)); + $request->appendChild($storedCredential); + } + + // mpi + $secureEcom = $builder->paymentMethod->threeDSecure; + if (!empty($secureEcom)) { + $mpi = $xml->createElement("mpi"); + $mpi->appendChild($xml->createElement("eci", $secureEcom->eci)); + $mpi->appendChild($xml->createElement("cavv", $secureEcom->cavv)); + $mpi->appendChild($xml->createElement("xid", $secureEcom->xid)); + + if ($secureEcom->directoryServerTransactionId != null || $secureEcom->authenticationValue != null || $secureEcom->messageVersion != null) { + $mpi->appendChild($xml->createElement("ds_trans_id", $secureEcom->directoryServerTransactionId)); + $mpi->appendChild($xml->createElement("authentication_value", $secureEcom->authenticationValue)); + $mpi->appendChild($xml->createElement("message_version", $secureEcom->messageVersion)); + } + $request->appendChild($mpi); + } + + $acceptedResponseCodes = $this->mapAcceptedCodes($transactionType); + $response = $this->doTransaction($xml->saveXML($request)); + return $this->mapResponse($response, $acceptedResponseCodes); + } + + /** + * @return Transaction + */ + public function processSecure3d(Secure3dBuilder $builder) + { + $transType = $builder->getTransactionType(); + + if ($transType === TransactionType::VERIFY_ENROLLED) { + $authBuilder = (new AuthorizationBuilder($transType, $builder->getPaymentMethod())) + ->withAmount($builder->getAmount()) + ->withCurrency($builder->getCurrency()) + ->withOrderId($builder->getOrderId()); + + return $this->processAuthorization($authBuilder); + } elseif ($transType === TransactionType::VERIFY_SIGNATURE) { + // Get our three d secure object + $secureEcom = $builder->getThreeDSecure(); + + // Create our transaction reference + $reference = new TransactionReference(); + $reference->orderId = $secureEcom->getOrderId(); + + $managementBuilder = (new ManagementBuilder($transType)) + ->withAmount($secureEcom->getAmount()) + ->withCurrency($secureEcom->getCurrency()) + ->withPayerAuthenticationResponse($builder->getPayerAuthenticationResponse()) + ->withPaymentMethod($reference); + return $this->manageTransaction($managementBuilder); + } + throw new UnsupportedTransactionException(sprintf("Unknown transaction type %s", $transType)); + } + + public function serializeRequest(AuthorizationBuilder $builder) + { + // check for hpp config + if ($this->hostedPaymentConfig === null) { + throw new ApiException("Hosted configuration missing, Please check you configuration."); + } + + // check for right transaction types + if ($builder->transactionType !== TransactionType::SALE + && $builder->transactionType !== TransactionType::AUTH + && $builder->transactionType !== TransactionType::VERIFY + ) { + throw new UnsupportedTransactionException("Only Charge and Authorize are supported through HPP."); + } + + $orderId = isset($builder->orderId) ? $builder->orderId : GenerationUtils::generateOrderId(); + $timestamp = isset($builder->timestamp) ? $builder->timestamp : GenerationUtils::generateTimestamp(); + + $this->setSerializeData('MERCHANT_ID', $this->merchantId); + $this->setSerializeData('ACCOUNT', $this->accountId); + $this->setSerializeData('CHANNEL', $this->channel); + $this->setSerializeData('ORDER_ID', $orderId); + if ($builder->amount !== null) { + $this->setSerializeData('AMOUNT', preg_replace('/[^0-9]/', '', sprintf('%01.2f', $builder->amount))); + } + $this->setSerializeData('CURRENCY', $builder->currency); + $this->setSerializeData('TIMESTAMP', $timestamp); + $this->setSerializeData( + 'AUTO_SETTLE_FLAG', + ($builder->transactionType == TransactionType::SALE) ? "1" : "0" + ); + $this->setSerializeData('COMMENT1', $builder->description); + + if (isset($this->hostedPaymentConfig->requestTransactionStabilityScore)) { + $this->serializeData["RETURN_TSS"] = + $this->hostedPaymentConfig->requestTransactionStabilityScore ? "1" : "0"; + } + if (isset($this->hostedPaymentConfig->directCurrencyConversionEnabled)) { + $this->serializeData["DCC_ENABLE"] = + $this->hostedPaymentConfig->directCurrencyConversionEnabled ? "1" : "0"; + } + if (!empty($builder->hostedPaymentData)) { + $this->setSerializeData('CUST_NUM', $builder->hostedPaymentData->customerNumber); + + if (!empty($this->hostedPaymentConfig->displaySavedCards) && + !empty($builder->hostedPaymentData->customerKey)) { + $this->setSerializeData('HPP_SELECT_STORED_CARD', $builder->hostedPaymentData->customerKey); + } + + if (isset($builder->hostedPaymentData->offerToSaveCard)) { + $this->setSerializeData( + 'OFFER_SAVE_CARD', + $builder->hostedPaymentData->offerToSaveCard ? "1" : "0" + ); + } + if (isset($builder->hostedPaymentData->customerExists)) { + $this->setSerializeData( + 'PAYER_EXIST', + $builder->hostedPaymentData->customerExists ? "1" : "0" + ); + } + if (isset($builder->hostedPaymentData->customerKey)) { + $this->setSerializeData('PAYER_REF', $builder->hostedPaymentData->customerKey); + } + if (isset($builder->hostedPaymentData->paymentKey)) { + $this->setSerializeData('PMT_REF', $builder->hostedPaymentData->paymentKey); + } + if (isset($builder->hostedPaymentData->productId)) { + $this->setSerializeData('PROD_ID', $builder->hostedPaymentData->productId); + } + } elseif (isset($builder->customerId)) { + $this->setSerializeData('CUST_NUM', $builder->customerId); + } + if (!empty($builder->shippingAddress)) { + // Fraud values + $this->setSerializeData('SHIPPING_CODE', $builder->shippingAddress->postalCode); + $this->setSerializeData('SHIPPING_CO', $builder->shippingAddress->country); + + // 3DS 2.0 values + $this->setSerializeData('HPP_SHIPPING_STREET1', $builder->shippingAddress->streetAddress1); + $this->setSerializeData('HPP_SHIPPING_STREET2', $builder->shippingAddress->streetAddress2); + $this->setSerializeData('HPP_SHIPPING_STREET3', $builder->shippingAddress->streetAddress3); + $this->setSerializeData('HPP_SHIPPING_CITY', $builder->shippingAddress->city); + $this->setSerializeData('HPP_SHIPPING_STATE', $builder->shippingAddress->state); + $this->setSerializeData('HPP_SHIPPING_POSTALCODE', $builder->shippingAddress->postalCode); + $this->setSerializeData('HPP_SHIPPING_COUNTRY', $builder->shippingAddress->country); + } + if (!empty($builder->billingAddress)) { + // Fraud values + $this->setSerializeData('BILLING_CODE', $builder->billingAddress->postalCode); + $this->setSerializeData('BILLING_CO', $builder->billingAddress->country); + + // 3DS 2.0 values + $this->setSerializeData('HPP_BILLING_STREET1', $builder->billingAddress->streetAddress1); + $this->setSerializeData('HPP_BILLING_STREET2', $builder->billingAddress->streetAddress2); + $this->setSerializeData('HPP_BILLING_STREET3', $builder->billingAddress->streetAddress3); + $this->setSerializeData('HPP_BILLING_CITY', $builder->billingAddress->city); + $this->setSerializeData('HPP_BILLING_STATE', $builder->billingAddress->state); + $this->setSerializeData('HPP_BILLING_POSTALCODE', $builder->billingAddress->postalCode); + $this->setSerializeData('HPP_BILLING_COUNTRY', $builder->billingAddress->country); + } + + $this->setSerializeData('VAR_REF', $builder->clientTransactionId); + $this->setSerializeData('HPP_LANG', $this->hostedPaymentConfig->language); + $this->setSerializeData('MERCHANT_RESPONSE_URL', $this->hostedPaymentConfig->responseUrl); + $this->setSerializeData('CARD_PAYMENT_BUTTON', $this->hostedPaymentConfig->paymentButtonText); + if (!empty($builder->hostedPaymentData)) { + $this->setSerializeData('HPP_CUSTOMER_EMAIL', $builder->hostedPaymentData->customerEmail); + $this->setSerializeData('HPP_CUSTOMER_PHONENUMBER_MOBILE', $builder->hostedPaymentData->customerPhoneMobile); + $this->setSerializeData('HPP_CHALLENGE_REQUEST_INDICATOR', $builder->hostedPaymentData->challengeRequest); + if (isset($builder->hostedPaymentData->addressesMatch)) { + $this->setSerializeData('HPP_ADDRESS_MATCH_INDICATOR', $builder->hostedPaymentData->addressesMatch ? 'TRUE' : 'FALSE'); + } + } + if (isset($this->hostedPaymentConfig->cardStorageEnabled)) { + $this->setSerializeData('CARD_STORAGE_ENABLE', $this->hostedPaymentConfig->cardStorageEnabled ? '1' : '0'); + } + if ($builder->transactionType === TransactionType::VERIFY) { + $this->setSerializeData( + 'VALIDATE_CARD_ONLY', + $builder->transactionType === TransactionType::VERIFY ? '1' : '0' + ); + } + if (!empty($this->hostedPaymentConfig->FraudFilterMode)) { + $this->setSerializeData('HPP_FRAUD_FILTER_MODE', $this->hostedPaymentConfig->FraudFilterMode); + } + + if ($builder->recurringType !== null || $builder->recurringSequence !== null) { + $this->setSerializeData('RECURRING_TYPE', strtolower($builder->recurringType)); + $this->setSerializeData('RECURRING_SEQUENCE', strtolower($builder->recurringSequence)); + } + if (isset($this->hostedPaymentConfig->version)) { + $this->setSerializeData('HPP_VERSION', $this->hostedPaymentConfig->version); + } + + $toHash = [ + $timestamp, + $this->merchantId, + $orderId, + ($builder->amount !== null) ? preg_replace('/[^0-9]/', '', sprintf('%01.2f', $builder->amount)) : null, + $builder->currency, + ]; + + if ($this->hostedPaymentConfig->cardStorageEnabled + || ($builder->hostedPaymentData != null + && $builder->hostedPaymentData->offerToSaveCard) + || $this->hostedPaymentConfig->displaySavedCards + ) { + $toHash[] = ($builder->hostedPaymentData->customerKey !== null) ? + $builder->hostedPaymentData->customerKey : + null; + $toHash[] = ($builder->hostedPaymentData->paymentKey !== null) ? + $builder->hostedPaymentData->paymentKey : + null; + } + + if ($this->hostedPaymentConfig->fraudFilterMode !== FraudFilterMode::NONE) { + $toHash[] = $this->hostedPaymentConfig->fraudFilterMode; + } + + $this->serializeData["SHA1HASH"] = GenerationUtils::generateHash($this->sharedSecret, implode('.', $toHash)); + return GenerationUtils::convertArrayToJson($this->serializeData, $this->hostedPaymentConfig->version); + } + + /** + * {@inheritdoc} + * + * @param ManagementBuilder $builder The transaction's builder + * + * @return Transaction + */ + public function manageTransaction(ManagementBuilder $builder) + { + $xml = new DOMDocument(); + $timestamp = GenerationUtils::generateTimestamp(); + $orderId = $builder->orderId ?: GenerationUtils::generateOrderId(); + $transactionType = $this->mapManageRequestType($builder); + // Build Request + $request = $xml->createElement("request"); + $request->setAttribute("timestamp", $timestamp); + $request->setAttribute("type", $transactionType); + + $request->appendChild($xml->createElement("merchantid", $this->merchantId)); + + if ($this->accountId !== null) { + $request->appendChild($xml->createElement("account", $this->accountId)); + } + if (is_null($builder->alternativePaymentType)) { + $request->appendChild($xml->createElement("channel", $this->channel)); + } + + if ($builder->amount !== null) { + $amount = $xml->createElement("amount", preg_replace('/[^0-9]/', '', sprintf('%01.2f', $builder->amount))); + $amount->setAttribute("currency", $builder->currency); + $request->appendChild($amount); + } elseif ($builder->transactionType === TransactionType::CAPTURE) { + throw new BuilderException("Amount cannot be null for capture."); + } + + $request->appendChild($xml->createElement("orderid", $orderId)); + $request->appendChild($xml->createElement("pasref", $builder->transactionId)); + + // rebate hash + if ($builder->transactionType === TransactionType::REFUND && + is_null($builder->alternativePaymentType)) { + $request->appendChild($xml->createElement("authcode", $builder->paymentMethod->authCode)); + } + + // reason code + if ($builder->reasonCode !== null) { + $request->appendChild($xml->createElement("reasoncode", $builder->reasonCode)); + } + + if ($builder->alternativePaymentType !== null) { + $request->appendChild($xml->createElement("paymentmethod", $builder->alternativePaymentType)); + } + + if ($builder->transactionType === TransactionType::VERIFY_SIGNATURE) { + $request->appendChild($xml->createElement("pares", $builder->payerAuthenticationResponse)); + } + + // comments needs to be multiple + if ($builder->description !== null) { + $comments = $xml->createElement("comments"); + $comment = $xml->createElement("comment", $builder->description); + $comment->setAttribute("id", "1"); + $comments->appendChild($comment); + $request->appendChild($comments); + } + + $toHash = [ + $timestamp, + $this->merchantId, + $orderId, + ($builder->amount !== null ? preg_replace('/[^0-9]/', '', sprintf('%01.2f', $builder->amount)) : ''), + ($builder->currency !== null ? $builder->currency : ''), + ($builder->alternativePaymentType !== null ? $builder->alternativePaymentType : '') + ]; + + $request->appendChild( + $xml->createElement( + "sha1hash", + GenerationUtils::generateHash($this->sharedSecret, implode('.', $toHash)) + ) + ); + + // rebate hash + if ($builder->transactionType === TransactionType::REFUND) { + $request->appendChild( + $xml->createElement( + "refundhash", + GenerationUtils::generateHash(isset($this->rebatePassword) ? $this->rebatePassword : '') + ) + ); + } + + $response = $this->doTransaction($xml->saveXML($request)); + return $this->mapResponse($response, $this->mapAcceptedCodes($transactionType)); + } + + public function processReport(ReportBuilder $builder) + { + throw new UnsupportedTransactionException( + 'Reporting functionality is not supported through this gateway.' + ); + } + + public function processRecurring(RecurringBuilder $builder) + { + $xml = new DOMDocument(); + $timestamp = GenerationUtils::generateTimestamp(); + $orderId = $builder->orderId ? $builder->orderId : GenerationUtils::generateOrderId(); + + // Build Request + $request = $xml->createElement("request"); + $request->setAttribute("timestamp", $timestamp); + $request->setAttribute("type", $this->mapRecurringRequestType($builder)); + + $request->appendChild($xml->createElement("merchantid", $this->merchantId)); + + if ($this->accountId !== null) { + $request->appendChild($xml->createElement("account", $this->accountId)); + } + $request->appendChild($xml->createElement("channel", $this->channel)); + $request->appendChild($xml->createElement("orderid", $orderId)); + + if ($builder->transactionType == TransactionType::CREATE || + $builder->transactionType == TransactionType::EDIT) { + if ($builder->entity instanceof Customer) { + $hash = GenerationUtils::generateHash( + $this->sharedSecret, + implode('.', [ + $timestamp, + $this->merchantId, + $orderId, + '', + '', + $builder->entity->key + ]) + ); + + $request->appendChild($this->buildCustomer($xml, $builder)); + } elseif ($builder->entity instanceof RecurringPaymentMethod) { + $payment = $builder->entity; + $paymentKey = (!empty($payment->key)) ? $payment->key : $payment->id; + + if ($builder->transactionType == TransactionType::CREATE) { + $hash = GenerationUtils::generateHash( + $this->sharedSecret, + implode('.', [ + $timestamp, + $this->merchantId, + $orderId, + '', + '', + $payment->customerKey, + $payment->paymentMethod->cardHolderName, + $payment->paymentMethod->number + ]) + ); + } else { + $hash = GenerationUtils::generateHash( + $this->sharedSecret, + implode('.', [ + $timestamp, + $this->merchantId, + $payment->customerKey, + $paymentKey, + $payment->paymentMethod->getShortExpiry(), + $payment->paymentMethod->number + ]) + ); + } + $request->appendChild($this->buildCardElement($xml, $payment, $paymentKey)); + $request->appendChild($xml->createElement("defaultcard", 1)); + } + + //set hash value + $request->appendChild($xml->createElement("sha1hash", $hash)); + } elseif ($builder->transactionType == TransactionType::DELETE) { + if ($builder->entity instanceof RecurringPaymentMethod) { + $payment = $builder->entity; + $paymentKey = (!empty($payment->key)) ? $payment->key : $payment->id; + $cardElement = $xml->createElement("card"); + $cardElement->appendChild($xml->createElement("ref", $paymentKey)); + $cardElement->appendChild($xml->createElement("payerref", $payment->customerKey)); + $request->appendChild($cardElement); + + $hash = GenerationUtils::generateHash( + $this->sharedSecret, + implode('.', [ + $timestamp, + $this->merchantId, + $payment->customerKey, + $paymentKey + ]) + ); + $request->appendChild($xml->createElement("sha1hash", $hash)); + } + } + + $response = $this->doTransaction($xml->saveXML($request)); + return $this->mapResponse($response); + } + + private function buildCustomer($xml, $builder) + { + $customer = $builder->entity; + $type = 'Retail'; + if ($builder->transactionType === TransactionType::EDIT) { + $type = 'Subscriber'; + } + $payer = $xml->createElement("payer"); + $payer->setAttribute("ref", (!empty($customer->key)) ? $customer->key : + GenerationUtils::generateRecurringKey()); + $payer->setAttribute("type", $type); + + $payer->appendChild($xml->createElement("title", $customer->title)); + $payer->appendChild($xml->createElement("firstname", $customer->firstName)); + $payer->appendChild($xml->createElement("surname", $customer->lastName)); + $payer->appendChild($xml->createElement("company", $customer->company)); + + + if ($customer->address != null) { + $address = $xml->createElement("address"); + $address->appendChild($xml->createElement("line1", $customer->address->streetAddress1)); + $address->appendChild($xml->createElement("line2", $customer->address->streetAddress2)); + $address->appendChild($xml->createElement("line3", $customer->address->streetAddress3)); + $address->appendChild($xml->createElement("city", $customer->address->city)); + $address->appendChild($xml->createElement("county", $customer->address->getProvince())); + $address->appendChild($xml->createElement("postcode", $customer->address->postalCode)); + + $country = $xml->createElement("country", $customer->address->country); + if (!empty($customer->address->countryCode)) { + $country->setAttribute("code", $customer->address->countryCode); + } + $address->appendChild($country); + + $payer->appendChild($address); + } + + $phonenumbers = $xml->createElement("phonenumbers"); + $phonenumbers->appendChild($xml->createElement("home", $customer->homePhone)); + $phonenumbers->appendChild($xml->createElement("work", $customer->workPhone)); + $phonenumbers->appendChild($xml->createElement("fax", $customer->fax)); + $phonenumbers->appendChild($xml->createElement("mobile", $customer->mobilePhone)); + + $payer->appendChild($phonenumbers); + $payer->appendChild($xml->createElement("email", $customer->email)); + + return $payer; + } + + private function buildCardElement($xml, $payment, $paymentKey = '') + { + $card = $payment->paymentMethod; + $cardElement = $xml->createElement("card"); + $cardElement->appendChild($xml->createElement("ref", $paymentKey)); + $cardElement->appendChild($xml->createElement("payerref", $payment->customerKey)); + $cardElement->appendChild($xml->createElement("number", $card->number)); + $cardElement->appendChild($xml->createElement("expdate", $card->getShortExpiry())); + $cardElement->appendChild($xml->createElement("chname", $card->cardHolderName)); + $cardElement->appendChild($xml->createElement("type", strtoupper($card->getCardType()))); + + return $cardElement; + } + + /** + * Deserializes the gateway's XML response + * + * @param string $rawResponse The XML response + * + * @return Transaction + */ + protected function mapResponse($rawResponse, array $acceptedCodes = null) + { + $result = new Transaction(); + + $root = $this->xml2object($rawResponse); + + $this->checkResponse($root, $acceptedCodes); + + $result->responseCode = (string)$root->result; + $result->responseMessage = (string)$root->message; + $result->cvnResponseCode = (string)$root->cvnresult; + $result->avsResponseCode = (string)$root->avspostcoderesponse; + $result->avsAddressResponse = (string)$root->avsaddressresponse; + $result->transactionReference = new TransactionReference(); + $result->transactionReference->paymentMethodType = PaymentMethodType::CREDIT; + $result->transactionReference->transactionId = (string)$root->pasref; + $result->transactionReference->authCode = (string)$root->authcode; + $result->transactionReference->orderId = (string)$root->orderid; + $result->timestamp = (!empty($root->attributes()->timestamp)) ? + (string) $root->attributes()->timestamp : + ''; + + // 3d secure enrolled + if (!empty($root->enrolled)) { + $result->threeDSecure = new ThreeDSecure(); + $result->threeDSecure->enrolled = (string)$root->enrolled; + $result->threeDSecure->xid = (string)$root->xid; + $result->threeDSecure->issuerAcsUrl = (string)$root->url; + $result->threeDSecure->payerAuthenticationRequest = (string)$root->pareq; + } + + // 3d secure signature + if (!empty($root->threedsecure)) { + $secureEcom = new ThreeDSecure(); + $secureEcom->status = (string)$root->threedsecure->status; + $secureEcom->eci = (string)$root->threedsecure->eci; + $secureEcom->cavv = (string)$root->threedsecure->cavv; + $secureEcom->xid = (string)$root->threedsecure->xid; + $secureEcom->algorithm = (int)$root->threedsecure->algorithm; + $result->threeDSecure = $secureEcom; + } + + // stored credential + $result->schemeId = (string)$root->srd; + + // dccinfo + if (!empty($root->dccinfo)) { + $result->dccResponseResult = new DccResponseResult(); + + $result->dccResponseResult->cardHolderCurrency = (string)$root->dccinfo->cardholdercurrency; + $result->dccResponseResult->cardHolderAmount = (string)$root->dccinfo->cardholderamount; + $result->dccResponseResult->cardHolderRate = (string)$root->dccinfo->cardholderrate; + $result->dccResponseResult->merchantCurrency = (string)$root->dccinfo->merchantcurrency; + $result->dccResponseResult->merchantAmount = (string)$root->dccinfo->merchantamount; + $result->dccResponseResult->marginRatePercentage = (string)$root->dccinfo->marginratepercentage; + $result->dccResponseResult->exchangeRateSourceName = (string)$root->dccinfo->exchangeratesourcename; + $result->dccResponseResult->commissionPercentage = (string)$root->dccinfo->commissionpercentage; + $result->dccResponseResult->exchangeRateSourceTimestamp = (string) + $root->dccinfo->exchangeratesourcetimestamp; + } + + // fraud filter + if (!empty($root->fraudresponse)) { + $fraudResponse = $root->fraudresponse; + $result->fraudFilterResponse = new FraudManagementResponse(); + + foreach ($fraudResponse->attributes() as $attrName => $attrValue) { + $result->fraudFilterResponse->fraudResponseMode = (!empty($attrValue)) ? (string) $attrValue : ''; + } + + $result->fraudFilterResponse->fraudResponseResult = (!empty($fraudResponse->result)) ? + (string) $fraudResponse->result : ''; + + if (!empty($fraudResponse->rules)) { + foreach ($fraudResponse->rules->rule as $rule) { + $ruleDetails = [ + 'id' => (string) $rule->attributes()->id, + 'name' => (string) $rule->attributes()->name, + 'action' => (string) $rule->action + ]; + $result->fraudFilterResponse->fraudResponseRules[] = $ruleDetails; + } + } + } + + // alternativePaymentResponse + if (!empty($root->paymentmethoddetails)) { + $result->alternativePaymentResponse = new AlternativePaymentResponse(); + + $result->alternativePaymentResponse->paymentMethod = (string) + $root->paymentmethoddetails->paymentmethod; + $result->alternativePaymentResponse->bankAccount = (string) + $root->paymentmethoddetails->bankaccount; + $result->alternativePaymentResponse->accountHolderName = (string) + $root->paymentmethoddetails->accountholdername; + $result->alternativePaymentResponse->country = (string) + $root->paymentmethoddetails->country; + $result->alternativePaymentResponse->redirectUrl = (string) + $root->paymentmethoddetails->redirecturl; + $result->alternativePaymentResponse->paymentPurpose = (string) + $root->paymentmethoddetails->paymentpurpose; + } + + return $result; + } + + protected function checkResponse($root, array $acceptedCodes = null) + { + if ($acceptedCodes === null) { + $acceptedCodes = [ "00" ]; + } + + $responseCode = (string)$root->result; + $responseMessage = (string)$root->message; + + if (!in_array($responseCode, $acceptedCodes)) { + throw new GatewayException( + sprintf('Unexpected Gateway Response: %s - %s', $responseCode, $responseMessage), + $responseCode, + $responseMessage + ); + } + } + + /** + * Generates a request hash from the request data + * + * @param string $timestamp Request timestamp + * @param string $orderId Request order ID + * @param string $amount Request amount + * @param string $currency Request currency + * @param string $paymentData Request payment data + * @param bool $verify Is request a verify transaction + * + * @return string + */ + protected function generateHash( + $timestamp, + $orderId, + $amount, + $currency, + $paymentData = null, + $verify = false + ) { + $data = [ + $timestamp, + $this->merchantId, + $orderId, + ]; + + if (false === $verify) { + $data[] = $amount; + $data[] = $currency; + } + + $data[] = $paymentData; + + return GenerationUtils::generateHash( + $this->sharedSecret, + implode('.', $data) + ); + } + + /** + * Maps a transaction builder to a Realex request type + * + * @param AuthorizationBuilder $builder Transaction builder + * + * @return string + */ + protected function mapAuthRequestType(AuthorizationBuilder $builder) + { + switch ($builder->transactionType) { + case TransactionType::SALE: + case TransactionType::AUTH: + if ($builder->paymentMethod->paymentMethodType == PaymentMethodType::CREDIT) { + if ($builder->transactionModifier === TransactionModifier::OFFLINE) { + return 'offline'; + } elseif ($builder->transactionModifier === TransactionModifier::ENCRYPTED_MOBILE) { + return 'auth-mobile'; + } + } elseif ($builder->paymentMethod->paymentMethodType == PaymentMethodType::RECURRING) { + return (!empty($builder->recurringSequence) && + $builder->recurringSequence == RecurringSequence::FIRST) ? + 'auth' : + 'receipt-in'; + } elseif ($builder->paymentMethod->paymentMethodType == PaymentMethodType::APM) { + return "payment-set"; + } + return 'auth'; + case TransactionType::CAPTURE: + return 'settle'; + case TransactionType::VERIFY: + if ($builder->paymentMethod->paymentMethodType == PaymentMethodType::RECURRING) { + if (!empty($builder->transactionModifier) && + $builder->transactionModifier === TransactionModifier::SECURE3D) { + return 'realvault-3ds-verifyenrolled'; + } + return 'receipt-in-otb'; + } + return 'otb'; + case TransactionType::REFUND: + if ($builder->paymentMethod->paymentMethodType == PaymentMethodType::CREDIT) { + return 'credit'; + } + return 'payment-out'; + case TransactionType::DCC_RATE_LOOKUP: + if ($builder->paymentMethod->paymentMethodType == PaymentMethodType::CREDIT) { + return "dccrate"; + } + return "realvault-dccrate"; + + case TransactionType::REVERSAL: + // TODO: should be customer type + throw new UnsupportedTransactionException( + 'The selected gateway does not support this transaction type.' + ); + case TransactionType::VERIFY_ENROLLED: + return '3ds-verifyenrolled'; + default: + return 'unknown'; + } + } + + /** + * Maps a transaction builder to a Realex request type + * + * @param ManagementBuilder $builder Transaction builder + * + * @return string + */ + protected function mapManageRequestType(ManagementBuilder $builder) + { + switch ($builder->transactionType) { + case TransactionType::CAPTURE: + return 'settle'; + case TransactionType::HOLD: + return 'hold'; + case TransactionType::REFUND: + if ($builder->alternativePaymentType !== null) { + return 'payment-credit'; + } + return 'rebate'; + case TransactionType::RELEASE: + return 'release'; + case TransactionType::VOID: + case TransactionType::REVERSAL: + return 'void'; + case TransactionType::VERIFY_SIGNATURE: + return '3ds-verifysig'; + default: + return 'unknown'; + } + } + + /** + * Maps a transaction builder to a Realex request type + * + * @param RecurringBuilder $builder Transaction builder + * + * @return string + */ + private function mapRecurringRequestType(RecurringBuilder $builder) + { + $entity = $builder->entity; + + switch ($builder->transactionType) { + case TransactionType::CREATE: + if ($entity instanceof Customer) { + return "payer-new"; + } elseif ($entity instanceof RecurringPaymentMethod) { + return "card-new"; + } + throw new UnsupportedTransactionException( + 'The selected gateway does not support this transaction type.' + ); + case TransactionType::EDIT: + if ($entity instanceof Customer) { + return "payer-edit"; + } elseif ($entity instanceof RecurringPaymentMethod) { + return "card-update-card"; + } + throw new UnsupportedTransactionException(); + case TransactionType::DELETE: + if ($entity instanceof RecurringPaymentMethod) { + return "card-cancel-card"; + } + throw new UnsupportedTransactionException( + 'The selected gateway does not support this transaction type.' + ); + default: + throw new UnsupportedTransactionException( + 'The selected gateway does not support this transaction type.' + ); + } + } + + /** + * Converts a XML string to a simple object for use, + * removing extra nodes that are not necessary for + * handling the response + * + * @param string $xml Response XML from the gateway + * + * @return SimpleXMLElement + */ + protected function xml2object($xml) + { + $envelope = simplexml_load_string( + $xml, + 'SimpleXMLElement' + ); + + return $envelope; + } + + /** + * Return the request values for Shal hash generation based on transaction type + * EncyptedMobileType::GOOGLE_PAY requires amount and currency with token + * EncyptedMobileType::APPLE_PAY doesn't requires amount and currency. token contains those values + * + * @param string $timestamp current timestamp + * @param int $orderId current order id + * @param object $builder auth builder object + * @param object $card + * + * @return array + */ + private function getShal1RequestValues($timestamp, $orderId, $builder, $card) + { + $requestValues = [ + $timestamp, + $this->merchantId, + $orderId, + preg_replace('/[^0-9]/', '', sprintf('%01.2f', $builder->amount)), + $builder->currency, + $card->number + ]; + + if (($builder->transactionModifier === TransactionModifier::ENCRYPTED_MOBILE)) { + switch ($card->mobileType) { + case EncyptedMobileType::GOOGLE_PAY: + $requestValues = [ + $timestamp, + $this->merchantId, + $orderId, + preg_replace('/[^0-9]/', '', sprintf('%01.2f', $builder->amount)), + $builder->currency, + $card->token + ]; + break; + + case EncyptedMobileType::APPLE_PAY: + $requestValues = [ + $timestamp, + $this->merchantId, + $orderId, + '', + '', + $card->token + ]; + break; + } + } + return $requestValues; + } + + public function buildFraudFilter($builder, $xml, $request) + { + // tssinfo fraudfilter + // fraudfilter + if (!empty($builder->fraudFilter)) { + $fraudFilter = $xml->createElement("fraudfilter"); + $fraudFilter->setAttribute("mode", $builder->fraudFilter); + $request->appendChild($fraudFilter); + } + if ($builder->customerId !== null || $builder->productId !== null || + $builder->clientTransactionId !== null || $builder->verifyAddress !== false + ) { + $tssInfo = $xml->createElement("tssinfo"); + + if (!empty($builder->customerId)) { + $tssInfo->appendChild($xml->createElement("custnum", $builder->customerId)); + } + + if (!empty($builder->productId)) { + $tssInfo->appendChild($xml->createElement("prodid", $builder->productId)); + } + + if (!empty($builder->clientTransactionId)) { + $tssInfo->appendChild($xml->createElement("varref", $builder->clientTransactionId)); + } + + if (!empty($builder->customerIpAddress)) { + $tssInfo->appendChild($xml->createElement("custipaddress", $builder->customerIpAddress)); + } + + if (!empty($builder->billingAddress)) { + $billingAddress = $xml->createElement("address"); + $billingAddress->setAttribute("type", 'billing'); + $billingAddress->appendChild($xml->createElement("code", $builder->billingAddress->postalCode)); + $billingAddress->appendChild($xml->createElement("country", $builder->billingAddress->country)); + $tssInfo->appendChild($billingAddress); + } + + if (!empty($builder->shippingAddress)) { + $shippingAddress = $xml->createElement("address"); + $shippingAddress->setAttribute("type", 'shipping'); + $shippingAddress->appendChild($xml->createElement("code", $builder->shippingAddress->postalCode)); + $shippingAddress->appendChild($xml->createElement("country", $builder->shippingAddress->country)); + $tssInfo->appendChild($shippingAddress); + } + if (!empty($tssInfo->childNodes->length)) { + $request->appendChild($tssInfo); + } + } + return; + } + + public function supportsHostedPayments() + { + return $this->supportsHostedPayments; + } + + + public function buildAlternativePaymentMethod($builder, $request, $xml) + { + $request->appendChild($xml->createElement( + "paymentmethod", + $builder->paymentMethod->alternativePaymentMethodType + )); + + $paymentMethodDetails = $xml->createElement("paymentmethoddetails"); + $paymentMethodDetails->appendChild( + $xml->createElement("returnurl", $builder->paymentMethod->returnUrl) + ); + $paymentMethodDetails->appendChild( + $xml->createElement("statusupdateurl", $builder->paymentMethod->statusUpdateUrl) + ); + + if (!empty($builder->paymentMethod->descriptor)) { + $paymentMethodDetails->appendChild( + $xml->createElement("descriptor", $builder->paymentMethod->descriptor) + ); + } + + $paymentMethodDetails->appendChild($xml->createElement("country", $builder->paymentMethod->country)); + $paymentMethodDetails->appendChild($xml->createElement( + "accountholdername", + $builder->paymentMethod->accountHolderName + )); + + $request->appendChild($paymentMethodDetails); + + return; + } + + private function mapAcceptedCodes($paymentMethodType) + { + switch ($paymentMethodType) { + case "3ds-verifysig": + case "3ds-verifyenrolled": + return ["00", "110"]; + case PaymentMethodType::APM: + return ["01"]; + default: + return ["00"]; + } + } + + private function setSerializeData($key, $value = null) + { + if ($value !== null) { + $this->serializeData[$key] = $value; + } + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Gateways/RestGateway.php b/classes/includes/vendor/globalpayments/php-sdk/src/Gateways/RestGateway.php new file mode 100644 index 0000000..58852cc --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Gateways/RestGateway.php @@ -0,0 +1,46 @@ +|null $queryStringParams + * + * @throws GatewayException + * @return string + */ + protected function doTransaction( + $verb, + $endpoint, + $data = null, + array $queryStringParams = null, + $headers = [] + ) { + $response = $this->sendRequest($verb, $endpoint, $data, $queryStringParams, $headers); + + if (!in_array($response->statusCode, [200, 204])) { + $parsed = json_decode($response->rawResponse); + $error = isset($parsed->error) ? $parsed->error : $parsed; + throw new GatewayException( + sprintf( + 'Status Code: %s - %s', + $response->statusCode, + isset($error->error_description) ? $error->error_description : (isset($error->message) ? $error->message : (string) $error) + ) + ); + } + + return $response->rawResponse; + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Gateways/XmlGateway.php b/classes/includes/vendor/globalpayments/php-sdk/src/Gateways/XmlGateway.php new file mode 100644 index 0000000..ceffdd2 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Gateways/XmlGateway.php @@ -0,0 +1,35 @@ +sendRequest('POST', '', $request); + + if (200 !== $response->statusCode) { + throw new GatewayException( + sprintf( + 'Unexpected HTTP status code [%s]', + $response->statusCode + ) + ); + } + + return $response->rawResponse; + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/HostedPaymentConfig.php b/classes/includes/vendor/globalpayments/php-sdk/src/HostedPaymentConfig.php new file mode 100644 index 0000000..4a939af --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/HostedPaymentConfig.php @@ -0,0 +1,149 @@ +cardStorageEnabled = $cardStorageEnabled; + } + + public function isDynamicCurrencyConversionEnabled() + { + return $dynamicCurrencyConversionEnabled; + } + + public function setDynamicCurrencyConversionEnabled($directCurrencyConversionEnabled) + { + $this->dynamicCurrencyConversionEnabled = $directCurrencyConversionEnabled; + } + + public function isDisplaySavedCards() + { + return $displaySavedCards; + } + + public function setDisplaySavedCards($displaySavedCards) + { + $this->displaySavedCards = $displaySavedCards; + } + + public function getFraudFilterMode() + { + return $fraudFilterMode; + } + + public function setFraudFilterMode($fraudFilterMode) + { + $this->fraudFilterMode = $fraudFilterMode; + } + + public function getLanguage() + { + return $language; + } + + public function setLanguage($language) + { + $this->language = $language; + } + + public function getPaymentButtonText() + { + return $paymentButtonText; + } + + public function setPaymentButtonText($paymentButtonText) + { + $this->paymentButtonText = $paymentButtonText; + } + + public function getPostDimensions() + { + return $postDimensions; + } + + public function setPostDimensions($postDimensions) + { + $this->postDimensions = $postDimensions; + } + + public function getPostResponse() + { + return $postResponse; + } + + public function setPostResponse($postResponse) + { + $this->postResponse = $postResponse; + } + + public function getResponseUrl() + { + return $responseUrl; + } + + public function setResponseUrl($responseUrl) + { + $this->responseUrl = $responseUrl; + } + + public function isRequestTransactionStabilityScore() + { + return $requestTransactionStabilityScore; + } + + public function setRequestTransactionStabilityScore($requestTransactionStabilityScore) + { + $this->requestTransactionStabilityScore = $requestTransactionStabilityScore; + } + + public function getVersion() + { + return $version; + } + + public function setVersion($version) + { + $this->version = $version; + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/AlternativePaymentMethod.php b/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/AlternativePaymentMethod.php new file mode 100644 index 0000000..be67ccb --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/AlternativePaymentMethod.php @@ -0,0 +1,109 @@ +alternativePaymentMethodType = $alternativePaymentMethodType; + } + + /** + * This is a mandatory request used to initiate an APM transaction, + * the payment-set is used to advise the payment scheme of the details of a new transaction and + * to retrieve the necessary information required to facilitate authentication + * + * @param string|float $amount Amount to authorize + * + * @return AuthorizationBuilder + */ + public function charge($amount = null) + { + return (new AuthorizationBuilder(TransactionType::SALE, $this)) + ->withModifier(TransactionModifier::ALTERNATIVE_PAYMENT_METHOD) + ->withAmount($amount); + } + + public function addValue($amount = null) + { + throw new NotImplementedException(); + } + + public function refund($amount = null) + { + throw new NotImplementedException(); + } + + public function reverse($amount = null) + { + throw new NotImplementedException(); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Cash.php b/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Cash.php new file mode 100644 index 0000000..da21145 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Cash.php @@ -0,0 +1,25 @@ +withAmount($amount != null ? $amount : ($this->threeDSecure != null ? $this->threeDSecure->getAmount() : null)) + ->withCurrency($this->threeDSecure != null ? $this->threeDSecure->getCurrency() : null) + ->withOrderId($this->threeDSecure != null ? $this->threeDSecure->getOrderId() : null) + ->withAmountEstimated($isEstimated); + } + + /** + * Authorizes the payment method and captures the entire authorized amount + * + * @param string|float $amount Amount to authorize + * + * @return AuthorizationBuilder + */ + public function charge($amount = null) + { + return (new AuthorizationBuilder(TransactionType::SALE, $this)) + ->withAmount($amount != null ? $amount : ($this->threeDSecure != null ? $this->threeDSecure->getAmount() : null)) + ->withCurrency($this->threeDSecure != null ? $this->threeDSecure->getCurrency() : null) + ->withOrderId($this->threeDSecure != null ? $this->threeDSecure->getOrderId() : null); + } + + /** + * Adds value to the payment method + * + * @param string|float $amount Amount to add + * + * @return AuthorizationBuilder + */ + public function addValue($amount = null) + { + return (new AuthorizationBuilder(TransactionType::ADD_VALUE, $this)) + ->withAmount($amount); + } + + /** + * Inquires the balance of the payment method + * + * @param InquiryType $inquiry Type of inquiry + * + * @return AuthorizationBuilder + */ + public function balanceInquiry($inquiry = null) + { + return (new AuthorizationBuilder(TransactionType::BALANCE, $this)) + ->withBalanceInquiryType($inquiry); + } + + /** + * Refunds the payment method + * + * @param string|float $amount Amount to refund + * + * @return AuthorizationBuilder + */ + public function refund($amount = null) + { + return (new AuthorizationBuilder(TransactionType::REFUND, $this)) + ->withAmount($amount); + } + + /** + * Reverses the payment method + * + * @param string|float $amount Amount to reverse + * + * @return AuthorizationBuilder + */ + public function reverse($amount = null) + { + return (new AuthorizationBuilder(TransactionType::REVERSAL, $this)) + ->withAmount($amount); + } + + /** + * Verifies the payment method + * + * @return AuthorizationBuilder + */ + public function verify() + { + return new AuthorizationBuilder(TransactionType::VERIFY, $this); + } + + /** + * Tokenizes the payment method + * + * @return AuthorizationBuilder + */ + public function tokenize() + { + return $this->verify() + ->withRequestMultiUseToken(true); + } + + /** + * Updates the token expiry date with the values proced to the card object + * + * @return bool value indicating success/failure + */ + public function updateTokenExpiry() + { + if (empty($this->token)) { + throw new BuilderException('Token cannot be null'); + } + + try { + (new ManagementBuilder(TransactionType::TOKEN_UPDATE)) + ->withPaymentMethod($this) + ->execute(); + return true; + } catch (ApiException $exc) { + return false; + } + } + + /** + * Deletes the token associated with the current card object + * + * @return bool value indicating success/failure + */ + public function deleteToken() { + if (empty($this->token)) { + throw new BuilderException('Token cannot be null'); + } + + try { + (new ManagementBuilder(TransactionType::TOKEN_DELETE)) + ->withPaymentMethod($this) + ->execute(); + return true; + } catch (ApiException $exc) { + return false; + } + } + + public function getDccRate($dccRateType, $amount, $currency, $ccp, $orderId) + { + return (new AuthorizationBuilder(TransactionType::DCC_RATE_LOOKUP, $this)) + ->withAmount($amount) + ->withCurrency($currency) + ->withDccRateType($dccRateType) + ->withDccProcessor($ccp) + ->withDccType("1") + ->withOrderId($orderId) + ->execute(); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/CreditCardData.php b/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/CreditCardData.php new file mode 100644 index 0000000..5d709a1 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/CreditCardData.php @@ -0,0 +1,219 @@ + '/^4/', + 'MC' => '/^(5[1-5]|2[2-7])/', + 'Amex' => '/^3[47]/', + 'DinersClub' => '/^3[0689]/', + 'EnRoute' => '/^2(014|149)/', + 'Discover' => '/^6([045]|22)/', + 'Jcb' => '/^35/', + ]; + + /** + * Instantiates a new credit card + * + * @return + */ + public function __construct() + { + $this->cardPresent = false; + $this->readerPresent = false; + $this->cvnPresenceIndicator = CvnPresenceIndicator::NOT_REQUESTED; + } + + /** + * @return string + */ + public function getShortExpiry() + { + if ($this->expMonth != null && $this->expYear != null) { + return sprintf( + '%s%s', + str_pad($this->expMonth, 2, '0', STR_PAD_LEFT), + substr(str_pad($this->expYear, 4, '0', STR_PAD_LEFT), 2, 2) + ); + } + return null; + } + + /** + * Gets a card's type based on the BIN + * + * @return string + */ + public function getCardType() + { + $number = str_replace( + [' ', '-'], + '', + $this->number + ); + + foreach (static::$cardTypes as $type => $regex) { + if (1 === preg_match($regex, $this->number)) { + return $type; + } + } + + return 'Unknown'; + } + + /** + * Verify whether the cardholder is enrolled in 3DS + * + * @return bool + */ + public function verifyEnrolled($amount, $currency, $orderId = null) + { + $response = (new AuthorizationBuilder(TransactionType::VERIFY_ENROLLED, $this)) + ->withAmount($amount) + ->withCurrency($currency) + ->withOrderId($orderId) + ->execute(); + + if (!empty($response->threeDSecure)) { + $secureEcom = $response->threeDSecure; + $secureEcom->setAmount($amount); + $secureEcom->setCurrency($currency); + $secureEcom->setOrderId($response->orderId); + $this->threeDSecure = $secureEcom; + + if (in_array($this->threeDSecure->enrolled, array('N', 'U'))) { + $this->threeDSecure->xid = null; + if ($this->threeDSecure->enrolled == 'N') { + $this->threeDSecure->eci = $this->cardType == 'MC' ? 1 : 6; + } elseif ($this->threeDSecure->enrolled == 'U') { + $this->threeDSecure->eci = $this->cardType == 'MC' ? 0 : 7; + } + } + + return $this->threeDSecure->enrolled == 'Y'; + } + return false; + } + + /** + * @return bool + */ + public function verifySignature($authorizationResponse, $merchantData = null, $amount = null, $currency = null, $orderId = null) + { + if (empty($this->threeDSecure)) { + $this->threeDSecure = new ThreeDSecure(); + } + + if ($merchantData != null) { + $this->threeDSecure->setMerchantData($merchantData); + } + + if ($amount != null) { + $this->threeDSecure->setAmount($amount); + } + + if ($currency != null) { + $this->threeDSecure->setCurrency($currency); + } + + if ($orderId != null) { + $this->threeDSecure->setOrderId($orderId); + } + + $txnReference = new TransactionReference(); + $txnReference->orderId = $this->threeDSecure->getOrderId(); + + $response = (new ManagementBuilder(TransactionType::VERIFY_SIGNATURE)) + ->withAmount($this->threeDSecure->getAmount()) + ->withCurrency($this->threeDSecure->getCurrency()) + ->withPayerAuthenticationResponse($authorizationResponse) + ->withPaymentMethod($txnReference) + ->execute(); + + $this->threeDSecure->status = $response->threeDSecure->status; + $this->threeDSecure->cavv = $response->threeDSecure->cavv; + $this->threeDSecure->algorithm = $response->threeDSecure->algorithm; + $this->threeDSecure->xid = $response->threeDSecure->xid; + + if (in_array($this->threeDSecure->status, array('A', 'Y')) && $response->responseCode == '00') { + $this->threeDSecure->eci = $response->threeDSecure->eci; + return true; + } else { + $this->threeDSecure->eci = $this->cardType == 'MC' ? 0 : 7; + return false; + } + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/CreditTrackData.php b/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/CreditTrackData.php new file mode 100644 index 0000000..f15eb35 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/CreditTrackData.php @@ -0,0 +1,11 @@ +withAmount($amount); + } + + /** + * Authorizes the payment method and captures the entire authorized amount + * + * @param string|float $amount Amount to authorize + * + * @return AuthorizationBuilder + */ + public function charge($amount = null) + { + return (new AuthorizationBuilder(TransactionType::SALE, $this)) + ->withAmount($amount); + } + + /** + * Refunds the payment method + * + * @param string|float $amount Amount to refund + * + * @return AuthorizationBuilder + */ + public function refund($amount = null) + { + return (new AuthorizationBuilder(TransactionType::REFUND, $this)) + ->withAmount($amount); + } + + /** + * Reverses the payment method + * + * @param string|float $amount Amount to reverse + * + * @return AuthorizationBuilder + */ + public function reverse($amount = null) + { + return (new AuthorizationBuilder(TransactionType::REVERSAL, $this)) + ->withAmount($amount); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/DebitTrackData.php b/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/DebitTrackData.php new file mode 100644 index 0000000..553a705 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/DebitTrackData.php @@ -0,0 +1,11 @@ +withBalanceInquiryType($inquiry) + ->withAmount(0); + } + + /** + * Authorizes the payment method and captures the entire authorized amount + * + * @param string|float $amount Amount to authorize + * + * @return AuthorizationBuilder + */ + public function charge($amount = null) + { + return (new AuthorizationBuilder(TransactionType::SALE, $this)) + ->withAmount($amount); + } + + /** + * Refunds the payment method + * + * @param string|float $amount Amount to refund + * + * @return AuthorizationBuilder + */ + public function refund($amount = null) + { + return (new AuthorizationBuilder(TransactionType::REFUND, $this)) + ->withAmount($amount); + } + + /** + * Reverses the payment method + * + * @param string|float $amount Amount to reverse + * + * @return AuthorizationBuilder + */ + public function reverse($amount = null) + { + throw new NotImplementedException(); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/EBTCardData.php b/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/EBTCardData.php new file mode 100644 index 0000000..3d486ac --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/EBTCardData.php @@ -0,0 +1,91 @@ +cardPresent = false; + $this->readerPresent = false; + $this->cvnPresenceIndicator = CvnPresenceIndicator::NOT_REQUESTED; + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/EBTTrackData.php b/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/EBTTrackData.php new file mode 100644 index 0000000..266c753 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/EBTTrackData.php @@ -0,0 +1,13 @@ +withAmount($amount); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/GiftCard.php b/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/GiftCard.php new file mode 100644 index 0000000..9ac78f2 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/GiftCard.php @@ -0,0 +1,256 @@ +withAlias(AliasAction::ADD, $alias); + } + + /** + * Activates the payment method with the given amount + * + * @param string|float $amount Amount to add + * + * @return AuthorizationBuilder + */ + public function activate($amount = null) + { + return (new AuthorizationBuilder(TransactionType::ACTIVATE, $this)) + ->withAmount($amount); + } + + /** + * Adds value to the payment method + * + * @param string|float $amount Amount to add + * + * @return AuthorizationBuilder + */ + public function addValue($amount = null) + { + return (new AuthorizationBuilder(TransactionType::ADD_VALUE, $this)) + ->withAmount($amount); + } + + /** + * Inquires the balance of the payment method + * + * @param InquiryType $inquiry Type of inquiry + * + * @return AuthorizationBuilder + */ + public function balanceInquiry($inquiry = null) + { + return (new AuthorizationBuilder(TransactionType::BALANCE, $this)) + ->withBalanceInquiryType($inquiry); + } + + /** + * Authorizes the payment method and captures the entire authorized amount + * + * @param string|float $amount Amount to authorize + * + * @return AuthorizationBuilder + */ + public function charge($amount = null) + { + return (new AuthorizationBuilder(TransactionType::SALE, $this)) + ->withAmount($amount); + } + + /** + * Deactivates the payment method + * + * @return AuthorizationBuilder + */ + public function deactivate() + { + return new AuthorizationBuilder(TransactionType::DECLINE, $this); + } + + /** + * Removes an alias to the payment method + * + * @param string $alias Alias to remove + * + * @return AuthorizationBuilder + */ + public function removeAlias($alias = null) + { + return (new AuthorizationBuilder(TransactionType::ALIAS, $this)) + ->withAlias(AliasAction::DELETE, $alias); + } + + /** + * Replaces the payment method with the given one + * + * @param GiftCard $newCard Replacement gift card + * + * @return AuthorizationBuilder + */ + public function replaceWith($newCard = null) + { + return (new AuthorizationBuilder(TransactionType::REPLACE, $this)) + ->withReplacementCard($newCard); + } + + /** + * Reverses the payment method + * + * @param string|float $amount Amount to reverse + * + * @return AuthorizationBuilder + */ + public function reverse($amount = null) + { + return (new AuthorizationBuilder(TransactionType::REVERSAL, $this)) + ->withAmount($amount); + } + + /** + * Rewards the payment method + * + * @param string|float $amount Amount to reward + * + * @return AuthorizationBuilder + */ + public function rewards($amount = null) + { + return (new AuthorizationBuilder(TransactionType::REWARD, $this)) + ->withAmount($amount); + } + + /** + * Creates a new payment method + * + * @param string $alias Alias to use + * + * @return GiftCard + */ + public static function create($alias = null) + { + $card = new static(); + + $response = (new AuthorizationBuilder(TransactionType::ALIAS, $card)) + ->withAlias(AliasAction::CREATE, $alias) + ->execute(); + + if ($response->responseCode === '00') { + return $response->giftCard; + } + + throw new ApiException($response->responseMessage); + } + + public function __get($name) + { + if (!in_array($name, static::$valueTypes)) { + throw new ArgumentException(sprintf('Property `%s` does not exist on GiftCard', $name)); + } + + return $this->value; + } + + public function __isset($name) + { + return in_array($name, static::$valueTypes) || isset($this->{$name}); + } + + public function __set($name, $value) + { + if (!in_array($name, static::$valueTypes)) { + throw new ArgumentException(sprintf('Property `%s` does not exist on GiftCard', $name)); + } + + $this->value = $value; + switch ($name) { + case 'alias': + $this->valueType = 'Alias'; + return; + case 'number': + $this->valueType = 'CardNbr'; + return; + case 'token': + $this->valueType = 'TokenValue'; + return; + case 'trackData': + $this->valueType = 'TrackData'; + return; + } + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Interfaces/IAuthable.php b/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Interfaces/IAuthable.php new file mode 100644 index 0000000..e6dfb46 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Interfaces/IAuthable.php @@ -0,0 +1,8 @@ +paymentMethod = $customerIdOrPaymentMethod; + return; + } + + $this->customerKey = $customerIdOrPaymentMethod; + $this->key = $paymentId; + $this->paymentType = "Credit Card"; // set default + } + + /** + * Creates an authorization against the payment method. + * + * @param float|string|null $amount The amount of the transaction + * + * @return AuthorizationBuilder + */ + public function authorize($amount = null) + { + return (new AuthorizationBuilder(TransactionType::AUTH, $this)) + ->withAmount($amount) + ->withOneTimePayment(true); + } + + /** + * Creates a charge (sale) against the payment method. + * + * @param float|string|null $amount The amount of the transaction + * + * @return AuthorizationBuilder + */ + public function charge($amount = null) + { + return (new AuthorizationBuilder(TransactionType::SALE, $this)) + ->withAmount($amount) + ->withOneTimePayment(true); + } + + /** + * Refunds the payment method. + * + * @param float|string|null $amount The amount of the transaction + * + * @return AuthorizationBuilder + */ + public function refund($amount = null) + { + return (new AuthorizationBuilder(TransactionType::REFUND, $this)) + ->withAmount($amount); + } + + /** + * Verifies the payment method with the issuer. + * + * @return AuthorizationBuilder + */ + public function verify() + { + return new AuthorizationBuilder(TransactionType::VERIFY, $this); + } + + /** + * Creates a recurring schedule using the payment method. + * + * @param string $scheduleId The schedule's identifier + * + * @return Schedule + */ + public function addSchedule($scheduleId) + { + $schedule = new Schedule($this->customerKey, $this->key); + $schedule->id = $scheduleId; + return $schedule; + } + + public function __get($name) + { + switch ($name) { + case 'paymentMethod': + return $this->paymentMethod; + case 'cardHolderName': + return $this->nameOnAccount; + case 'checkHolderName': + return $this->nameOnAccount; + default: + break; + } + + if (property_exists($this, $name)) { + return $this->{$name}; + } + + if ($this->paymentMethod && property_exists($this->paymentMethod, $name)) { + return $this->paymentMethod->{$name}; + } + + throw new ArgumentException(sprintf('Property `%s` does not exist on RecurringPaymentMethod', $name)); + } + + public function __isset($name) + { + return in_array($name, [ + 'paymentMethod', + 'cardHolderName', + 'checkHolderName', + ]) + || isset($this->{$name}) + || ($this->paymentMethod && isset($this->paymentMethod->{$name})); + } + + public function __set($name, $value) + { + switch ($name) { + case 'paymentMethod': + $client = ServicesContainer::instance()->getRecurringClient(); + if (!$client->supportsUpdatePaymentDetails) { + throw new UnsupportedTransactionException(); + } + + $this->paymentMethod = $value; + return; + default: + break; + } + + if (property_exists($this, $name)) { + return $this->{$name} = $value; + } + + throw new ArgumentException(sprintf('Property `%s` does not exist on Transaction', $name)); + } + + public function getDccRate($dccRateType, $amount, $currency, $ccp, $orderId) + { + return (new AuthorizationBuilder(TransactionType::DCC_RATE_LOOKUP, $this)) + ->withAmount($amount) + ->withCurrency($currency) + ->withDccRateType($dccRateType) + ->withDccProcessor($ccp) + ->withDccType("1") + ->withOrderId($orderId) + ->execute(); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/TransactionReference.php b/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/TransactionReference.php new file mode 100644 index 0000000..8160201 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/TransactionReference.php @@ -0,0 +1,33 @@ +execute(); + return new BatchSummary(); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Services/CreditService.php b/classes/includes/vendor/globalpayments/php-sdk/src/Services/CreditService.php new file mode 100644 index 0000000..a3fcf1a --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Services/CreditService.php @@ -0,0 +1,149 @@ +withAmount($amount); + } + + /** + * Creates a manage transaction builder with type `TransactionType::CAPTURE` + * + * @param string|float|TransactionReference $transaction Transaction reference of an authorization + * + * @return ManagementBuilder + */ + public function capture($transaction = null) + { + if (!($transaction instanceof TransactionReference)) { + $transactionReference = new TransactionReference(); + $transactionReference->transactionId = $transaction; + $transactionReference->paymentMethodType = PaymentMethodType::CREDIT; + $transaction = $transactionReference; + } + + return (new ManagementBuilder(TransactionType::CAPTURE)) + ->withPaymentMethod($transaction); + } + + /** + * Authorizes the payment method and captures the entire authorized amount + * + * @param string|float $amount Amount to authorize + * + * @return AuthorizationBuilder + */ + public function charge($amount = null) + { + return (new AuthorizationBuilder(TransactionType::SALE, $this)) + ->withAmount($amount); + } + + public function edit($transaction = null) + { + if (!($transaction instanceof TransactionReference)) { + $transactionReference = new TransactionReference(); + $transactionReference->transactionId = $transaction; + $transactionReference->paymentMethodType = PaymentMethodType::CREDIT; + $transaction = $transactionReference; + } + + return (new ManagementBuilder(TransactionType::EDIT)) + ->withPaymentMethod($transaction); + } + + public function editLevelII($transaction = null) + { + if (!($transaction instanceof TransactionReference)) { + $transactionReference = new TransactionReference(); + $transactionReference->transactionId = $transaction; + $transactionReference->paymentMethodType = PaymentMethodType::CREDIT; + $transaction = $transactionReference; + } + + return (new ManagementBuilder(TransactionType::EDIT)) + ->withModifier(TransactionModifier::LEVEL_II) + ->withPaymentMethod($transaction); + } + + /** + * Refunds the payment method + * + * @param string|float $amount Amount to refund + * + * @return AuthorizationBuilder + */ + public function refund($amount = null) + { + return (new AuthorizationBuilder(TransactionType::REFUND, $this)) + ->withAmount($amount); + } + + /** + * Reverses the payment method + * + * @param string|float $amount Amount to reverse + * + * @return AuthorizationBuilder + */ + public function reverse($amount = null) + { + return (new AuthorizationBuilder(TransactionType::REVERSAL, $this)) + ->withAmount($amount); + } + + /** + * Verifies the payment method + * + * @return AuthorizationBuilder + */ + public function verify() + { + return new AuthorizationBuilder(TransactionType::VERIFY, $this); + } + + public function void($transaction = null) + { + if (!($transaction instanceof TransactionReference)) { + $transactionReference = new TransactionReference(); + $transactionReference->transactionId = $transaction; + $transactionReference->paymentMethodType = PaymentMethodType::CREDIT; + $transaction = $transactionReference; + } + + return (new ManagementBuilder(TransactionType::VOID)) + ->withPaymentMethod($transaction); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Services/DeviceService.php b/classes/includes/vendor/globalpayments/php-sdk/src/Services/DeviceService.php new file mode 100644 index 0000000..a675e58 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Services/DeviceService.php @@ -0,0 +1,23 @@ +device; + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Services/HostedService.php b/classes/includes/vendor/globalpayments/php-sdk/src/Services/HostedService.php new file mode 100644 index 0000000..d3210d3 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Services/HostedService.php @@ -0,0 +1,143 @@ +sharedSecret = $config->sharedSecret; + } + + /** + * Creates an authorization builder with type + * `TransactionType::CREDIT_AUTH` + * + * @param string|float $amount Amount to authorize + * + * @return AuthorizationBuilder + */ + public function authorize($amount = null) + { + return (new AuthorizationBuilder(TransactionType::AUTH)) + ->withAmount($amount); + } + + /** + * Authorizes the payment method and captures the entire authorized amount + * + * @param string|float $amount Amount to authorize + * + * @return AuthorizationBuilder + */ + public function charge($amount = null) + { + return (new AuthorizationBuilder(TransactionType::SALE)) + ->withAmount($amount); + } + + /** + * Verifies the payment method + * + * @return AuthorizationBuilder + */ + public function verify($amount = null) + { + return (new AuthorizationBuilder(TransactionType::VERIFY)) + ->withAmount($amount); + } + + public function void($transaction = null) + { + if (!($transaction instanceof TransactionReference)) { + $transactionReference = new TransactionReference(); + $transactionReference->transactionId = $transaction; + $transactionReference->paymentMethodType = PaymentMethodType::CREDIT; + $transaction = $transactionReference; + } + + return (new ManagementBuilder(TransactionType::VOID)) + ->withPaymentMethod($transaction); + } + + public function parseResponse($response, $encoded = false) + { + $response = json_decode($response, true); + + if ($encoded) { + $iterator = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($response)); + foreach ($iterator as $key => $value) { + $iterator->getInnerIterator()->offsetSet($key, base64_decode($value)); + } + + $response = $iterator->getArrayCopy(); + } + + $timestamp = $response["TIMESTAMP"]; + $merchantId = $response["MERCHANT_ID"]; + $orderId = $response["ORDER_ID"]; + $result = $response["RESULT"]; + $message = $response["MESSAGE"]; + $transactionId = $response["PASREF"]; + $authCode = $response["AUTHCODE"]; + $sha1Hash = $response["SHA1HASH"]; + $hash = GenerationUtils::generateHash($this->sharedSecret, implode('.', [ + $timestamp, + $merchantId, + $orderId, + $result, + $message, + $transactionId, + $authCode + ])); + + if ($hash != $sha1Hash) { + throw new ApiException("Incorrect hash. Please check your code and the Developers Documentation."); + } + + $ref = new TransactionReference(); + $ref->authCode = $authCode; + $ref->orderId = $orderId; + $ref->paymentMethodType = PaymentMethodType::CREDIT; + $ref->transactionId = $transactionId; + + $trans = new Transaction(); + $trans->authorizedAmount = $response["AMOUNT"]; + $trans->cvnResponseCode = $response["CVNRESULT"]; + $trans->responseCode = $result; + $trans->responseMessage = $message; + $trans->avsResponseCode = $response["AVSPOSTCODERESULT"]; + $trans->transactionReference = $ref; + + $trans->responseValues = $response; + + return $trans; + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Services/RecurringService.php b/classes/includes/vendor/globalpayments/php-sdk/src/Services/RecurringService.php new file mode 100644 index 0000000..f28d281 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Services/RecurringService.php @@ -0,0 +1,43 @@ +execute(); + return $response; + } + + public static function delete(RecurringEntity $entity, $force = false) + { + $response = (new RecurringBuilder(TransactionType::DELETE, $entity)) + ->execute(); + return $response; + } + + public static function edit(RecurringEntity $entity) + { + $response = (new RecurringBuilder(TransactionType::EDIT, $entity)) + ->execute(); + return $response; + } + + public static function get($entity) + { + $response = (new RecurringBuilder(TransactionType::FETCH, $entity)) + ->execute(); + return $response; + } + + public static function search($entityType) + { + return new RecurringBuilder(TransactionType::SEARCH, new $entityType()); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Services/ReportingService.php b/classes/includes/vendor/globalpayments/php-sdk/src/Services/ReportingService.php new file mode 100644 index 0000000..eea10a7 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Services/ReportingService.php @@ -0,0 +1,31 @@ +withTransactionId($transactionId); + return $response; + } + + public static function activity() + { + $response = (new TransactionReportBuilder(ReportType::ACTIVITY)); + return $response; + } + + public static function transactionDetail($transactionId) + { + $response = (new TransactionReportBuilder(ReportType::TRANSACTION_DETAIL)) + ->withTransactionId($transactionId); + return $response; + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Services/Secure3dService.php b/classes/includes/vendor/globalpayments/php-sdk/src/Services/Secure3dService.php new file mode 100644 index 0000000..8f08848 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Services/Secure3dService.php @@ -0,0 +1,35 @@ +withPaymentMethod($paymentMethod); + } + + /** @return Secure3dBuilder */ + public static function initiateAuthentication(IPaymentMethod $paymentMethod, ThreeDSecure $secureEcom) + { + $paymentMethod->threeDSecure = $secureEcom; + + return (new Secure3dBuilder(TransactionType::INITIATE_AUTHENTICATION)) + ->withPaymentMethod($paymentMethod); + } + + /** @return Secure3dBuilder */ + public static function getAuthenticationData() + { + return new Secure3dBuilder(TransactionType::VERIFY_SIGNATURE); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/ServicesConfig.php b/classes/includes/vendor/globalpayments/php-sdk/src/ServicesConfig.php new file mode 100644 index 0000000..32248ae --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/ServicesConfig.php @@ -0,0 +1,141 @@ +timeout = 65000; + $this->environment = Environment::TEST; + } + + public function validate() + { + // Portico API key + if (!empty($this->secretApiKey) + && ( + !empty($this->siteId) + || !empty($this->licenseId) + || !empty($this->deviceId) + || !empty($this->username) + || !empty($this->password) + ) + ) { + throw new ConfigurationException( + "Configuration contains both secret API key and legacy credentials. These are mutually exclusive." + ); + } + + // Portico legacy + if (( + !empty($this->siteId) + || !empty($this->licenseId) + || !empty($this->deviceId) + || !empty($this->username) + || !empty($this->password) + ) + && ( + empty($this->siteId) + || empty($this->licenseId) + || empty($this->deviceId) + || empty($this->username) + || empty($this->password) + ) + ) { + throw new ConfigurationException( + "Site, License, Device, Username, and Password should all have values for this configuration." + ); + } + + // Realex + if ((empty($this->secretApiKey) + && ( + empty($this->siteId) + && empty($this->licenseId) + && empty($this->deviceId) + && empty($this->username) + && empty($this->password) + )) + && empty($this->merchantId) + ) { + throw new ConfigurationException( + "MerchantId should not be empty for this configuration." + ); + } + + // Service URL + if (empty($this->serviceUrl) && $this->secure3dVersion == null) { + throw new ConfigurationException( + "Service URL could not be determined from the credentials provided. Please specify an endpoint." + ); + } + + // secure 3d + if ($this->secure3dVersion != null) { + if ($this->secure3dVersion === Secure3dVersion::TWO || $this->secure3dVersion === Secure3dVersion::ANY) { + if (empty($this->challengeNotificationUrl)) { + throw new ConfigurationException("The challenge notification URL is required for 3DS v2 processing."); + } + + if (empty($this->methodNotificationUrl)) { + throw new ConfigurationException("The method notification URL is required for 3DS v2 processing."); + } + } + } + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/ServicesContainer.php b/classes/includes/vendor/globalpayments/php-sdk/src/ServicesContainer.php new file mode 100644 index 0000000..c36c702 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/ServicesContainer.php @@ -0,0 +1,207 @@ +secure3dProviders[$version])) { + return $this->secure3dProviders[$version]; + } elseif ($version == Secure3dVersion::ANY) { + $provider = $this->secure3dProviders[Secure3dVersion::TWO]; + if ($provider == null) { + $provider = $this->secure3dProviders[Secure3dVersion::ONE]; + } + return $provider; + } + return null; + } + + /** @return void */ + private function setSecure3dProvider($version, ISecure3dProvider $provider) + { + $this->secure3dProviders[$version] = $provider; + } + + /** + * ServicesContainer constructor. + * + * @param IGateway $gateway + * + * @return + */ + public function __construct(IPaymentGateway $gateway, IRecurringService $recurring = null) + { + $this->gateway = $gateway; + $this->recurring = $recurring; + } + + /** + * Gets the current `ServicesContainer` instance + * + * @return ServicesContainer + */ + public static function instance() + { + if (static::$instance == null) { + static::$instance = new static(null); + } + return static::$instance; + } + + /** + * Configures the `ServicesContainer` singleton + * + * @param ServicesConfig $config + * + * @return void + */ + public static function configure(ServicesConfig $config) + { + $config->validate(); + + $gateway = null; + if (!empty($config->merchantId)) { + if (empty($config->serviceUrl)) { + if ($config->environment === Environment::TEST) { + $config->serviceUrl = ServiceEndpoints::GLOBAL_ECOM_TEST; + } else { + $config->serviceUrl = ServiceEndpoints::GLOBAL_ECOM_PRODUCTION; + } + } + + $gateway = new RealexConnector(); + $gateway->accountId = $config->accountId; + $gateway->channel = $config->channel; + $gateway->merchantId = $config->merchantId; + $gateway->rebatePassword = $config->rebatePassword; + $gateway->refundPassword = $config->refundPassword; + $gateway->sharedSecret = $config->sharedSecret; + $gateway->timeout = $config->timeout; + $gateway->serviceUrl = $config->serviceUrl; + $gateway->hostedPaymentConfig = $config->hostedPaymentConfig; + $gateway->curlOptions = $config->curlOptions; + static::$instance = new static($gateway, $gateway); + // set default + if ($config->secure3dVersion == null) { + $config->secure3dVersion = Secure3dVersion::ONE; + } + + // secure 3d v1 + if ($config->secure3dVersion === Secure3dVersion::ONE || $config->secure3dVersion === Secure3dVersion::ANY) { + static::$instance->setSecure3dProvider(Secure3dVersion::ONE, $gateway); + } + + // secure 3d v2 + if ($config->secure3dVersion === Secure3dVersion::TWO || $config->secure3dVersion === Secure3dVersion::ANY) { + $secure3d2 = new Gp3DSProvider(); + $secure3d2->setMerchantId($config->merchantId); + $secure3d2->setAccountId($config->accountId); + $secure3d2->setSharedSecret($config->sharedSecret); + $secure3d2->serviceUrl = $config->environment == Environment::TEST ? ServiceEndpoints::THREE_DS_AUTH_TEST : ServiceEndpoints::THREE_DS_AUTH_PRODUCTION; + $secure3d2->setMerchantContactUrl($config->merchantContactUrl); + $secure3d2->setMethodNotificationUrl($config->methodNotificationUrl); + $secure3d2->setChallengeNotificationUrl($config->challengeNotificationUrl); + $secure3d2->timeout = $config->timeout; + + static::$instance->setSecure3dProvider(Secure3dVersion::TWO, $secure3d2); + } + } else { + if (empty($config->serviceUrl) && !empty($config->secretApiKey)) { + $env = explode('_', $config->secretApiKey)[1]; + if ($env == "prod") { + $config->serviceUrl = ServiceEndpoints::PORTICO_PRODUCTION; + } else { + $config->serviceUrl = ServiceEndpoints::PORTICO_TEST; + } + } + + $gateway = new PorticoConnector(); + $gateway->siteId = $config->siteId; + $gateway->licenseId = $config->licenseId; + $gateway->deviceId = $config->deviceId; + $gateway->username = $config->username; + $gateway->password = $config->password; + $gateway->secretApiKey = $config->secretApiKey; + $gateway->developerId = $config->developerId; + $gateway->versionNumber = $config->versionNumber; + $gateway->timeout = $config->timeout; + $gateway->serviceUrl = $config->serviceUrl . '/Hps.Exchange.PosGateway/PosGatewayService.asmx'; + $gateway->curlOptions = $config->curlOptions; + + $payplanEndPoint = (strpos(strtolower($config->serviceUrl), 'cert.') > 0) ? + '/Portico.PayPlan.v2/': + '/PayPlan.v2/'; + + $recurring = new PayPlanConnector(); + $recurring->siteId = $config->siteId; + $recurring->licenseId = $config->licenseId; + $recurring->deviceId = $config->deviceId; + $recurring->username = $config->username; + $recurring->password = $config->password; + $recurring->secretApiKey = $config->secretApiKey; + $recurring->developerId = $config->developerId; + $recurring->versionNumber = $config->versionNumber; + $recurring->timeout = $config->timeout; + $recurring->serviceUrl = $config->serviceUrl . $payplanEndPoint; + $recurring->curlOptions = $config->curlOptions; + + static::$instance = new static($gateway, $recurring); + } + } + + /** + * Gets the configured gateway connector + * + * @return IPaymentGateway + */ + public function getClient() + { + return $this->gateway; + } + + /** + * Gets the configured recurring gateway connector + * + * @return IRecurringService + */ + public function getRecurringClient() + { + return $this->recurring; + } + + /** + * @return ISecure3dProvider + */ + public function getSecure3d($version) + { + $provider = $this->getSecure3dProvider($version); + if ($provider != null) { + return $provider; + } + throw new ConfigurationException(sprintf("Secure 3d is not configured for version %s", $version)); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Builders/TerminalAuthBuilder.php b/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Builders/TerminalAuthBuilder.php new file mode 100644 index 0000000..3f537bd --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Builders/TerminalAuthBuilder.php @@ -0,0 +1,184 @@ +transactionType = $transactionType; + $this->paymentMethodType = $paymentMethodType; + } + + /** + * {@inheritdoc} + * + * @return Transaction + */ + public function execute() + { + parent::execute(); + return ConnectionContainer::instance() + ->processTransaction($this); + } + + public function withAddress($address) + { + $this->address = $address; + return $this; + } + + public function withAllowDuplicates($allowDuplicates) + { + $this->allowDuplicates = $allowDuplicates; + return $this; + } + + public function withAmount($amount) + { + $this->amount = $amount; + return $this; + } + + public function withCashBack($amount) + { + $this->cashBackAmount = $amount; + return $this; + } + + public function withCurrency($value) + { + $this->currency = $value; + return $this; + } + + public function withCustomerCode($customerCode) + { + $this->customerCode = $customerCode; + return $this; + } + + public function withGratuity($gratuity) + { + $this->gratuity = $gratuity; + return $this; + } + + public function withInvoiceNumber($invoiceNumber) + { + $this->invoiceNumber = $invoiceNumber; + return $this; + } + + public function withPaymentMethod($method) + { + $this->paymentMethod = $method; + return $this; + } + + public function withPoNumber($poNumber) + { + $this->poNumber = $poNumber; + return $this; + } + + public function withRequestMultiUseToken($requestMultiUseToken) + { + $this->requestMultiUseToken = $requestMultiUseToken; + return $this; + } + + public function withSignatureCapture($signatureCapture) + { + $this->signatureCapture = $signatureCapture; + return $this; + } + + public function withTaxAmount($taxAmount) + { + $this->taxAmount = $taxAmount; + return $this; + } + + public function withToken($value) + { + if ($this->paymentMethod == null || !($this->paymentMethod instanceof CreditCardData)) { + $this->paymentMethod = new CreditCardData(); + $this->paymentMethod->token = value; + } + return $this; + } + + /** + * Previous request's transaction ID + * + * @param string $transactionId Transaction ID + * + * @return AuthorizationBuilder + */ + public function withTransactionId($transactionId) + { + $this->transactionId = $transactionId; + return $this; + } + + protected function setupValidations() + { + $this->validations->of( + TransactionType::AUTH | + TransactionType::SALE | TransactionType::REFUND + ) + ->with(TransactionModifier::NONE) + ->check('amount')->isNotNull(); + + $this->validations->of( + TransactionType::REFUND + ) + ->check('amount')->isNotNull(); + + $this->validations->of( + TransactionType::REFUND + ) + ->with(PaymentMethodType::CREDIT) + ->check('transactionId')->isNotNull() + ->check('authCode')->isNotNull(); + + $this->validations->of( + TransactionType::ADD_VALUE + ) + ->check('amount')->isNotNull(); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Builders/TerminalBuilder.php b/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Builders/TerminalBuilder.php new file mode 100644 index 0000000..d17d8c4 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Builders/TerminalBuilder.php @@ -0,0 +1,38 @@ +paymentMethodType = $paymentMethodType; + parent::__construct($type); + } + + public function withRequestId($requestId) + { + $this->requestId = $requestId; + return $this; + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Builders/TerminalManageBuilder.php b/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Builders/TerminalManageBuilder.php new file mode 100644 index 0000000..55bfdc0 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Builders/TerminalManageBuilder.php @@ -0,0 +1,96 @@ +transactionType = $transactionType; + $this->paymentMethodType = $paymentMethodType; + } + + /** + * {@inheritdoc} + * + * @return Transaction + */ + public function execute() + { + parent::execute(); + return ConnectionContainer::instance() + ->manageTransaction($this); + } + + public function withAmount($amount) + { + $this->amount = $amount; + return $this; + } + + public function withCurrency($value) + { + $this->currency = $value; + return $this; + } + + public function withGratuity($gratuity) + { + $this->gratuity = $gratuity; + return $this; + } + + public function withPaymentMethod($method) + { + $this->paymentMethod = $method; + return $this; + } + + /** + * Previous request's transaction ID + * + * @param string $transactionId Transaction ID + * + * @return AuthorizationBuilder + */ + public function withTransactionId($transactionId) + { + $this->transactionId = $transactionId; + return $this; + } + + protected function setupValidations() + { + $this->validations->of( + TransactionType::CAPTURE + ) + ->with(TransactionModifier::NONE) + ->check('amount')->isNotNull() + ->check('transactionId')->isNotNull(); + + $this->validations->of( + TransactionType::VOID + ) + ->with(TransactionModifier::NONE) + ->check('transactionId')->isNotNull(); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/ConnectionConfig.php b/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/ConnectionConfig.php new file mode 100644 index 0000000..02c9aa0 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/ConnectionConfig.php @@ -0,0 +1,52 @@ +connectionMode == ConnectionModes::HTTP || + $this->connectionMode == ConnectionModes::TCP_IP) { + if (empty($this->ipAddress)) { + throw new ConfigurationException( + "IpAddress is required for TCP or HTTP communication modes." + ); + } + } + + if (empty($this->port)) { + throw new ConfigurationException( + "Port is required for TCP or HTTP communication modes." + ); + } + + if ($this->deviceType == DeviceType::HPA_ISC250 && + empty($this->requestIdProvider) + ) { + throw new ConfigurationException( + "Request id is mandatory for this transaction. IRequestIdProvider is not implemented" + ); + } + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/ConnectionContainer.php b/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/ConnectionContainer.php new file mode 100644 index 0000000..d608d57 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/ConnectionContainer.php @@ -0,0 +1,62 @@ +deviceController = $deviceController; + } + + /** + * Gets the current `ConnectionContainer` instance + * + * @return ConnectionContainer + */ + public static function instance() + { + if (static::$instance == null) { + static::$instance = new static(null); + } + return static::$instance; + } + + /** + * Configures the `ConnectionContainer` singleton + * + * @param ServicesConfig $config + * + * @return void + */ + public static function configure(ConnectionConfig $config) + { + $config->validate(); + + $deviceController = null; + + switch ($config->deviceType) { + case DeviceType::HPA_ISC250: + static::$instance = new HpaController($config); + break; + } + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/DeviceController.php b/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/DeviceController.php new file mode 100644 index 0000000..c38c275 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/DeviceController.php @@ -0,0 +1,17 @@ +device = new HpaInterface($this); + $this->requestIdProvider = $config->requestIdProvider; + $this->deviceConfig = $config; + + switch ($config->connectionMode) { + case ConnectionModes::TCP_IP: + $this->deviceInterface = new HpaTcpInterface($config); + break; + } + } + + public function manageTransaction($builder) + { + $this->builderData = $builder; + $xml = new \DOMDocument(); + $transactionType = $this->manageTransactionType($builder->transactionType); + // Build Request + $request = $xml->createElement("SIP"); + $request->appendChild($xml->createElement("Version", '1.0')); + $request->appendChild($xml->createElement("ECRId", '1004')); + $request->appendChild($xml->createElement("Request", $transactionType)); + $request->appendChild($xml->createElement("RequestId", "%s")); + $request->appendChild($xml->createElement("TransactionId", $builder->transactionId)); + + $totalAmount = TerminalUtils::formatAmount($builder->amount); + $gratuity = TerminalUtils::formatAmount($builder->gratuity); + if ($builder->gratuity !== null) { + $request->appendChild($xml->createElement("TipAmount", $gratuity)); + $totalAmount += $gratuity; + } else { + $request->appendChild($xml->createElement("TipAmount", 0)); + } + + $request->appendChild($xml->createElement("TotalAmount", $totalAmount)); + + $response = $this->send($xml->saveXML($request)); + return $response; + } + + public function processTransaction($builder) + { + $this->builderData = $builder; + $xml = new \DOMDocument('1.0', 'utf-8'); + $transactionType = $this->manageTransactionType($builder->transactionType); + $cardGroup = $this->manageCardGroup($builder->paymentMethodType); + + $amount = TerminalUtils::formatAmount($builder->amount); + $gratuity = TerminalUtils::formatAmount($builder->gratuity); + $taxAmount = TerminalUtils::formatAmount($builder->taxAmount); + + // Build Request + $request = $xml->createElement("SIP"); + $request->appendChild($xml->createElement("Version", '1.0')); + $request->appendChild($xml->createElement("ECRId", '1004')); + $request->appendChild($xml->createElement("Request", $transactionType)); + $request->appendChild($xml->createElement("RequestId", "%s")); + $request->appendChild($xml->createElement("CardGroup", $cardGroup)); + $request->appendChild($xml->createElement("ConfirmAmount", '0')); + $request->appendChild($xml->createElement("BaseAmount", $amount)); + + if ($builder->gratuity !== null) { + $request->appendChild($xml->createElement("TipAmount", $gratuity)); + } else { + $request->appendChild($xml->createElement("TipAmount", 0)); + } + + if ($builder->taxAmount !== null) { + $request->appendChild($xml->createElement("TaxAmount", $taxAmount)); + } else { + $request->appendChild($xml->createElement("TaxAmount", 0)); + } + + if ($builder->paymentMethodType == PaymentMethodType::EBT) { + $request->appendChild($xml->createElement("EBTAmount", $amount)); + } + + $request->appendChild($xml->createElement("TotalAmount", $amount)); + + $response = $this->send($xml->saveXML($request)); + return $response; + } + + /* + * Send control message to device + * + * @param string $message control message to device + * + * @return HpaResponse parsed device response + */ + + public function send($message, $requestType = null) + { + if (strpos($message, "%s") !== false) { + $requestId = (!empty($this->builderData->requestId)) ? + $this->builderData->requestId : + $this->requestIdProvider->getRequestId(); + $message = sprintf($message, $requestId); + } + //send messaege to gateway + $this->deviceInterface->send(trim($message), $requestType); + + //check response code + $acceptedCodes = ["0"]; + $this->checkResponse($this->deviceInterface->deviceResponse, $acceptedCodes); + return $this->deviceInterface->deviceResponse; + } + + /* + * Check the device response code + * + * @param HpaResponse $gatewayResponse parsed response from device + * @param array $acceptedCodes list of success response codes + * + * @return raise GatewayException incase of different unexpected code + */ + + public function checkResponse($gatewayResponse, $acceptedCodes) + { + if ($acceptedCodes === null) { + $acceptedCodes = ["00"]; + } + + if (!empty($gatewayResponse->resultText) || !empty($gatewayResponse->gatewayResponseMessage)) { + $responseCode = (string) $gatewayResponse->resultCode; + $responseMessage = (string) $gatewayResponse->resultText; + $responseText = (string) $gatewayResponse->gatewayResponseMessage; + + if (!in_array($responseCode, $acceptedCodes)) { + throw new GatewayException( + sprintf( + 'Unexpected Gateway Response: %s - %s : %s', + $responseCode, + $responseMessage, + $responseText + ), + $responseCode, + $responseMessage + ); + } + } else { + throw new GatewayException('Invalid Gateway Response'); + } + } + + /* + * Return message id based on the transaction type + * + * @param $transactionType|TransactionType + * $return HPA message id or UnsupportedTransactionException incase of unknown transaction type + */ + + private function manageTransactionType($transactionType) + { + switch ($transactionType) { + case TransactionType::SALE: + return HpaMessageId::CREDIT_SALE; + case TransactionType::AUTH: + return HpaMessageId::CREDIT_AUTH; + case TransactionType::CAPTURE: + return HpaMessageId::CAPTURE; + case TransactionType::VERIFY: + return HpaMessageId::CARD_VERIFY; + case TransactionType::VOID: + return HpaMessageId::CREDIT_VOID; + case TransactionType::REFUND: + return HpaMessageId::CREDIT_REFUND; + case TransactionType::BALANCE: + return HpaMessageId::BALANCE; + case TransactionType::ADD_VALUE: + return HpaMessageId::ADD_VALUE; + default: + throw new UnsupportedTransactionException( + 'The selected gateway does not support this transaction type.' + ); + } + } + + public function manageCardGroup($paymentMethodType) + { + $cardGroup = $paymentMethodType; + if ($paymentMethodType == PaymentMethodType::CREDIT) { + $cardGroup = 'Credit'; + } elseif ($paymentMethodType == PaymentMethodType::DEBIT) { + $cardGroup = 'Debit'; + } elseif ($paymentMethodType == PaymentMethodType::EBT) { + $cardGroup = 'EBT'; + } elseif ($paymentMethodType == PaymentMethodType::GIFT) { + $cardGroup = 'GIFT'; + } + return $cardGroup; + } + + public function sendFile($sendFileData) + { + $sendFile = new HpaSendFileRequest($this->deviceConfig); + $sendFile->validate($sendFileData); + + $fileInfo = $sendFile->getFileInformation($sendFileData); + + $initialMessage = "" + . "1.0" + . "1004" + . "SendFile" + . "%s" + . "".$sendFileData->imageType."" + . "".$fileInfo['fileSize']."" + . "1" + . ""; + + $initialFileResponse = $this->send($initialMessage, HpaMessageId::SEND_FILE); + + if (!empty($initialFileResponse) && $initialFileResponse->resultCode == 0) { + $splitedImageData = str_split($fileInfo['fileData'], $initialFileResponse->maxDataSize); + $totalMessages = sizeof($splitedImageData); + + for ($i = 0; $i < $totalMessages; $i++) { + $isMultiple = ( ($i+1) != $totalMessages) ? 1 : 0; + $subsequentMessage = "" + . "1.0" + . "1004" + . "SendFile" + . "%s" + . "" . $splitedImageData[$i] . "" + . "" . $isMultiple . "" + . ""; + + $fileResponse = $this->send($subsequentMessage, HpaMessageId::SEND_FILE); + } + return $fileResponse; + } + } + + public function __destruct() + { + $this->device->reset(); + $this->device->closeLane(); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/HpaInterface.php b/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/HpaInterface.php new file mode 100644 index 0000000..ed2dfaa --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/HpaInterface.php @@ -0,0 +1,428 @@ +hpaController = $deviceController; + } + + #region Admin Messages + + /* + * GetAppInfoReport - Admin mode message - Get HeartSIP Application Information Report + */ + + public function initialize() + { + return $this->hpaController->send( + "" + . "1.0" + . "1004" + . "GetAppInfoReport" + . "%s" + . "", + HpaMessageId::GET_INFO_REPORT + ); + } + + /* + * LaneOpen - Admin mode message - Go to Lane Open State + */ + + public function openLane() + { + return $this->hpaController->send( + "" + . "1.0" + . "1004" + . "LaneOpen" + . "%s" + . "" + ); + } + + /* + * LaneClose - Admin mode message - Go to Lane Close State + */ + + public function closeLane() + { + return $this->hpaController->send( + "" + . "1.0" + . "1004" + . "LaneClose" + . "%s" + . "" + ); + } + + /* + * Reset - Admin mode message - Transition SIP to idle state + */ + + public function cancel() + { + return $this->reset(); + } + + /* + * Reboot - Admin mode message - Reboot the SIP device + */ + + public function reboot() + { + return $this->hpaController->send( + "" + . "1.0" + . "1004" + . "Reboot" + . "%s" + . "" + ); + } + + /* + * Reset - Admin mode message - Transition SIP to idle state + */ + + public function reset() + { + return $this->hpaController->send( + "" + . "1.0" + . "1004" + . "Reset" + . "%s" + . "" + ); + } + + public function lineItem($lineItemDetails) + { + if (empty($lineItemDetails->leftText)) { + throw new BuilderException("Line item left text cannot be null"); + } + $message = "" + . "1.0" + . "1004" + . "LineItem" + . "%s" + ."{$lineItemDetails->leftText}"; + + if (!empty($lineItemDetails->rightText)) { + $message .= sprintf("%s", $lineItemDetails->rightText); + } + if (!empty($lineItemDetails->runningLeftText)) { + $message .= sprintf( + "%s", + $lineItemDetails->runningLeftText + ); + } + if (!empty($lineItemDetails->runningRightText)) { + $message .= sprintf( + "%s", + $lineItemDetails->runningRightText + ); + } + + $message .= ""; + return $this->hpaController->send($message); + } + + /* + * StartCard - Admin mode message - Initiate card acquisition prior to a financial transaction. + * The intent is to perform card acquisition while the clerk is ringing up the items + */ + + public function startCard($paymentMethodType = null) + { + $message = "" + . "1.0" + . "1004" + . "StartCard" + . "%s"; + + if ($paymentMethodType !== null) { + $cardGroup = $this->hpaController->manageCardGroup($paymentMethodType); + $message .= "$cardGroup"; + } + + $message .= ""; + + return $this->hpaController->send($message); + } + + #endregion + + #credit + + public function batchClose() + { + return $this->hpaController->send( + "" + . "1.0" + . "1004" + . "EOD" + . "%s" + . "", + HpaMessageId::EOD + ); + } + + public function eod() + { + return $this->batchClose(); + } + + public function creditAuth($amount = null) + { + return (new TerminalAuthBuilder(TransactionType::AUTH, PaymentMethodType::CREDIT)) + ->withAmount($amount); + } + + public function creditCapture($amount = null) + { + return (new TerminalManageBuilder(TransactionType::CAPTURE, PaymentMethodType::CREDIT)) + ->withAmount($amount); + } + + public function creditRefund($amount = null) + { + return (new TerminalAuthBuilder(TransactionType::REFUND, PaymentMethodType::CREDIT)) + ->withAmount($amount); + } + + public function creditSale($amount = null) + { + return (new TerminalAuthBuilder(TransactionType::SALE, PaymentMethodType::CREDIT)) + ->withAmount($amount); + } + + public function creditVerify() + { + return (new TerminalAuthBuilder(TransactionType::VERIFY, PaymentMethodType::CREDIT)); + } + + public function creditVoid() + { + return (new TerminalManageBuilder(TransactionType::VOID, PaymentMethodType::CREDIT)); + } + + #end credit + + public function debitSale($amount = null) + { + return (new TerminalAuthBuilder(TransactionType::SALE, PaymentMethodType::DEBIT)) + ->withAmount($amount); + } + + public function debitRefund($amount = null) + { + return (new TerminalAuthBuilder(TransactionType::REFUND, PaymentMethodType::DEBIT)) + ->withAmount($amount); + } + + public function debitVoid() + { + throw new UnsupportedTransactionException( + 'The selected gateway does not support this transaction type.' + ); + } + + public function disableHostResponseBeep() + { + } + + public function getSignatureFile() + { + } + + public function ebtBalance() + { + return (new TerminalAuthBuilder(TransactionType::BALANCE, PaymentMethodType::EBT)); + } + + public function ebtPurchase($amount = null) + { + return (new TerminalAuthBuilder(TransactionType::SALE, PaymentMethodType::EBT)) + ->withAmount($amount); + } + + public function ebtRefund($amount = null) + { + return (new TerminalAuthBuilder(TransactionType::REFUND, PaymentMethodType::EBT)) + ->withAmount($amount); + } + + public function ebtWithdrawl($amount = null) + { + throw new UnsupportedTransactionException( + 'The selected gateway does not support this transaction type.' + ); + } + + public function startDownload($deviceSettings) + { + $startDownloadRequest = sprintf( + "" + . "1.0" + . "1004" + . "Download" + . "%s" + . "%s" + . "%s" + . "%s" + . "%s" + . "%s" + . "%s", + "%s", + $deviceSettings->hudsUrl, + $deviceSettings->hudsPort, + $deviceSettings->terminalId, + $deviceSettings->applicationId, + $deviceSettings->downloadType, + $deviceSettings->downloadTime + ); + + $startDownloadRequest .= ""; + return $this->hpaController->send($startDownloadRequest); + } + + #Gift Region + public function giftAddValue($amount = null) + { + return (new TerminalAuthBuilder(TransactionType::ADD_VALUE, PaymentMethodType::GIFT)) + ->withAmount($amount) + ->withCurrency(CurrencyType::CURRENCY); + } + + public function giftBalance() + { + return (new TerminalAuthBuilder(TransactionType::BALANCE, PaymentMethodType::GIFT)) + ->withCurrency(CurrencyType::CURRENCY); + } + + public function giftSale($amount = null) + { + return (new TerminalAuthBuilder(TransactionType::SALE, PaymentMethodType::GIFT)) + ->withAmount($amount) + ->withCurrency(CurrencyType::CURRENCY); + } + + public function giftVoid() + { + return (new TerminalManageBuilder(TransactionType::VOID, PaymentMethodType::GIFT)); + } + + public function setSafMode($parameterValue) + { + return $this->hpaController->send( + sprintf( + "" + . "1.0" + . "1004" + . "SetParameter" + . "%s" + . "1" + . "STORMD" + . "%s" + . "", + '%s', + $parameterValue + ) + ); + } + + public function sendSaf() + { + return $this->hpaController->send( + "" + . "1.0" + . "1004" + . "SendSAF" + . "%s" + . "", + HpaMessageId::SENDSAF + ); + } + + public function sendFile($sendFileData) + { + return $this->hpaController->sendFile($sendFileData); + } + + public function getDiagnosticReport($totalFields) + { + return $this->hpaController->send( + sprintf( + "" + . "1.0" + . "1004" + . "GetDiagnosticReport" + . "%s" + . "%s" + . "", + '%s', + $totalFields + ), + HpaMessageId::GET_DIAGNOSTIC_REPORT + ); + } + + public function promptForSignature() + { + return $this->hpaController->send( + sprintf( + "" + . "1.0" + . "1004" + . "SignatureForm" + . "%s" + . "PLEASE SIGN BELOW" + . "", + '%s' + ), + HpaMessageId::SIGNATURE_FORM + ); + } + + public function getLastResponse() + { + return $this->hpaController->send( + sprintf( + "" + . "1.0" + . "1004" + . "GetLastResponse" + . "%s" + . "", + '%s' + ), + HpaMessageId::GET_LAST_RESPONSE + ); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/HpaTcpInterface.php b/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/HpaTcpInterface.php new file mode 100644 index 0000000..8a033af --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/HpaTcpInterface.php @@ -0,0 +1,367 @@ +deviceDetails = $config; + ob_implicit_flush(true); + } + + /* + * Create socket connection with device + * Throws GatewayException incase of connection error + */ + public function connect() + { + if ($this->tcpConnection !== null) { + return; + } + + $errno = ''; + $errstr = ''; + + // open socket + try { + $this->tcpConnection = pfsockopen( + 'tcp://' . $this->deviceDetails->ipAddress, + $this->deviceDetails->port, + $errno, + $errstr, + $this->deviceDetails->timeout + ); + } catch (\Exception $e) { + throw new GatewayException( + sprintf('Device connection error: %s - %s', $errno, $errstr), + $errno, + $errstr + ); + } + } + + /* + * Close TCP socket connection with device + */ + public function disconnect() + { + // close socket + if ($this->tcpConnection !== null) { + fclose($this->tcpConnection); + } + } + + /* + * Send request message to device using socket connection + * @param string $message XML request string + */ + public function send($message, $requestType = null) + { + $this->connect(); + $this->requestType = $requestType; + $out = ''; + + if ($this->tcpConnection !== null) { + try { + $length = TerminalUtils::findLength($message); + + if (false === ($bytes_written = fwrite($this->tcpConnection, $length.$message))) { + throw new GatewayException('Device error: failed to write to socket'); + } else { + //set time out for read and write + stream_set_timeout($this->tcpConnection, $this->deviceDetails->timeout); + + $multipleMessage = true; + do { + // read from socket + $part = fgets($this->tcpConnection); + $out .= $part; + + //break the loop when there is no multiple message + if ($part == "0\n") { + $multipleMessage = false; + } elseif ($part == "\n" && $multipleMessage === false) { + break; + } + } while ($part !== false && !feof($this->tcpConnection)); + } + if (!empty($out)) { + $this->filterResponseMessage($out); + } + } catch (\Exception $e) { + throw new GatewayException( + 'Device error: ' . $e->getMessage(), + null, + $e->getMessage() + ); + } + } + return; + } + + /* + * Filter the device response. remove control characters + * Convert multiple string message as array using keyword + * + * @param XML|String $gatewayResponse XML response from device + */ + private function filterResponseMessage($gatewayResponse) + { + //remove non printable characters + $gatewayResponse = preg_replace('/[\x00-\x09\x0B\x0C\x0E-\x1F\x7F\;]/', '', trim($gatewayResponse)); + + if ($this->requestType == HpaMessageId::EOD) { + //process eod reponse by HpaEodResponse handler + $responseHandler = new HpaEodResponse(); + $this->deviceResponse = $responseHandler->mapResponse($gatewayResponse); + } elseif ($this->requestType == HpaMessageId::SENDSAF) { + //process eod reponse by HpaSendSafResponse handler + $responseHandler = new HpaSendSafResponse(); + $this->deviceResponse = $responseHandler->mapResponse($gatewayResponse); + } elseif ($this->requestType == HpaMessageId::GET_DIAGNOSTIC_REPORT) { + //process Diagnostic Report Response + $responseHandler = new HpaDiagnosticReportResponse(); + $this->deviceResponse = $responseHandler->mapResponse($gatewayResponse); + } elseif ($this->requestType == HpaMessageId::GET_LAST_RESPONSE) { + //process get last response report + $this->deviceResponse = new HpaResponse(); + $this->parseResponse($gatewayResponse); + } elseif ($this->requestType == HpaMessageId::GET_INFO_REPORT) { + $messageList = explode('', $gatewayResponse); + $this->deviceResponse = new HpaResponse(); + + if (!empty($messageList)) { + foreach ($messageList as $message) { + if (!empty($message)) { + //process individual response + if (strpos($message, '') !== false && !strpos($message, '')) { + $message .= ''; + $this->parseResponse($message); + } + } + } + } + } else { + $this->deviceResponse = new HpaResponse(); + $this->parseResponse($gatewayResponse); + } + return; + } + + /* + * Parse device response + * + * @param XML|String $gatewayResponse XML response from device + */ + + public function parseResponse($gatewayResponse) + { + $responseData = TerminalUtils::xmlParse($gatewayResponse); + + if (!empty($responseData)) { + $this->setBasicResponse($responseData); + + //process the records + if (!empty($responseData['Record'])) { + if ($this->deviceResponse->response == 'GetAppInfoReport') { + $this->parseResponseRecord($responseData['Record'], 'initializeResponse'); + } + } + } + return; + } + + /* + * Parse request specific responses + * + * @param XML $gatewayRecord + * @param string $recordType array key to identify the record type + */ + + private function parseResponseRecord($gatewayRecord, $recordType) + { + if (!empty($gatewayRecord['Field'])) { + if (isset($gatewayRecord['Field']['Key']) && isset($gatewayRecord['Field']['Value'])) { + $field = $gatewayRecord['Field']; + $key = $this->convertRecordKey($field['Key']); + $this->deviceResponse->responseData[$recordType]["$key"] = $field['Value']; + } else { + //incase of multi dimensional array + foreach ($gatewayRecord['Field'] as $field) { + if (isset($field['Key']) && isset($field['Value'])) { + $key = $this->convertRecordKey($field['Key']); + $this->deviceResponse->responseData[$recordType]["$key"] = $field['Value']; + } + } + } + } + } + + /* + * Set transaction based response in $deviceResponse + * + * @param array $response + */ + private function parseTransactionResponse($response) + { + $this->setValueInResponse('referenceNumber', $response, 'ReferenceNumber'); + $this->setValueInResponse('cardHolderName', $response, 'CardholderName'); + $this->setValueInResponse('entryMethod', $response, 'CardAcquisition'); + $this->setValueInResponse('approvalCode', $response, 'ApprovalCode'); + $this->setValueInResponse('transactionTime', $response, 'TransactionTime'); + $this->setValueInResponse('maskedCardNumber', $response, 'MaskedPAN'); + $this->setValueInResponse('cardType', $response, 'CardType'); + $this->setValueInResponse('signatureStatus', $response, 'SignatureLine'); + + if (isset($response['TipAdjustAllowed']) && !empty($response['TipAmount'])) { + $this->deviceResponse->tipAmount = TerminalUtils::reformatAmount( + $response['TipAmount'] + ); + } + + if (isset($response['AuthorizedAmount'])) { + $this->deviceResponse->transactionAmount = TerminalUtils::reformatAmount( + $response['AuthorizedAmount'] + ); + } + + //EBT response + $this->setValueInResponse('ebtType', $response, 'EBTType'); + $this->setValueInResponse('pinVerified', $response, 'PinVerified'); + } + + /* + * Set transaction based response in $deviceResponse + * + * @param string $propertyName $deviceResponse object property name + * @param array $response + * @param string $responseKey response key received from device + */ + private function setValueInResponse($propertyName, $response, $responseKey) + { + if (isset($response[$responseKey])) { + $this->deviceResponse->{$propertyName} = $response[$responseKey]; + } + } + + private function setBasicResponse($responseData) + { + $this->setValueInResponse('versionNumber', $responseData, 'Version'); + $this->setValueInResponse('ecrId', $responseData, 'ECRId'); + $this->setValueInResponse('sipId', $responseData, 'SIPId'); + $this->setValueInResponse('deviceId', $responseData, 'DeviceId'); + $this->setValueInResponse('response', $responseData, 'Response'); + $this->setValueInResponse('multipleMessage', $responseData, 'MultipleMessage'); + $this->setValueInResponse('resultCode', $responseData, 'Result'); + $this->setValueInResponse('transactionId', $responseData, 'ResponseId'); + $this->setValueInResponse('responseCode', $responseData, 'ResponseCode'); + $this->setValueInResponse('resultText', $responseData, 'ResultText'); + $this->setValueInResponse('requestId', $responseData, 'RequestId'); + $this->setValueInResponse('responseText', $responseData, 'ResponseText'); + $this->setValueInResponse('gatewayResponseMessage', $responseData, 'GatewayRspMsg'); + $this->setValueInResponse('isStoredResponse', $responseData, 'StoredResponse'); + $this->setValueInResponse('partialApproval', $responseData, 'PartialApproval'); + $this->setValueInResponse('avsResponseText', $responseData, 'AVSResultText'); + $this->setValueInResponse('avsResponseCode', $responseData, 'AVS'); + $this->setValueInResponse('cvvResponseCode', $responseData, 'CVV'); + $this->setValueInResponse('cvvResponseText', $responseData, 'CVVResultText'); + $this->setValueInResponse('signatureData', $responseData, 'AttachmentData'); + + if (isset($responseData['BalanceDueAmount'])) { + $this->deviceResponse->balanceAmountDue = TerminalUtils::reformatAmount( + $responseData['BalanceDueAmount'] + ); + } + + if (isset($responseData['AvailableBalance'])) { + $this->deviceResponse->availableBalance = TerminalUtils::reformatAmount( + $responseData['AvailableBalance'] + ); + } + + //set EMV tags + $this->setValueInResponse('emvApplicationId', $responseData, 'EMV_AID'); + $this->setValueInResponse('emvApplicationName', $responseData, 'EMV_ApplicationName'); + $this->setValueInResponse('emvTerminalVerificationResults', $responseData, 'EMV_TVR'); + $this->setValueInResponse('emvCardHolderVerificationMethod', $responseData, 'EMV_TSI'); + $this->setValueInResponse('emvCryptogramType', $responseData, 'EMV_CryptogramType'); + $this->setValueInResponse('emvCryptogram', $responseData, 'EMV_Cryptogram'); + + //send file response + $this->setValueInResponse('maxDataSize', $responseData, 'MaxDataSize'); + + //process transaction based response + $transactionRequests = [ + HpaMessageId::CREDIT_SALE, + HpaMessageId::CREDIT_REFUND, + HpaMessageId::CREDIT_VOID, + HpaMessageId::CARD_VERIFY, + HpaMessageId::CREDIT_AUTH, + HpaMessageId::CAPTURE + ]; + if (in_array($this->deviceResponse->response, $transactionRequests)) { + $this->parseTransactionResponse($responseData); + } + + if ($this->requestType == HpaMessageId::GET_LAST_RESPONSE && + !empty($responseData['LastResponse'])) { + foreach ($responseData['LastResponse'] as $responseKey => $responseValue) { + $key = ($responseKey == 'SIPId' || $responseKey == 'ECRId') ? + strtolower($responseKey) : lcfirst($responseKey); + $this->deviceResponse->lastResponse[$key] = $responseValue; + } + } + } + + private function convertRecordKey($key) + { + //convert "APPLICATION MODE" key as "applicationMode" + $key = strtolower($key); + $key = lcfirst(ucwords($key)); + $key = str_replace(' ', '', $key); + return $key; + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Requests/HpaSendFileRequest.php b/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Requests/HpaSendFileRequest.php new file mode 100644 index 0000000..f92d8c2 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Requests/HpaSendFileRequest.php @@ -0,0 +1,65 @@ +deviceConfig = $deviceConfig; + } + + public function validate($sendFileInfo) + { + if (empty($sendFileInfo) || empty($sendFileInfo->imageLocation) || + empty($sendFileInfo->imageType)) { + throw new BuilderException("Input error: Image location / type missing"); + } + + //validate file height and width + list($width, $height) = getimagesize($sendFileInfo->imageLocation); + + //validate image size + if ($sendFileInfo->imageType == HpaSendFileType::BANNER) { + if ($this->deviceConfig->deviceType == DeviceType::HPA_ISC250 && + ($height > 60 || $width > 480)) { + throw new BuilderException("Incorrect file height and width"); + } elseif ($this->deviceConfig->deviceType == DeviceType::HPA_IPP350 && + ($height > 40 || $width > 320)) { + throw new BuilderException("Incorrect file height and width"); + } + } elseif ($sendFileInfo->imageType == HpaSendFileType::IDLELOGO) { + if ($this->deviceConfig->deviceType == DeviceType::HPA_ISC250 && + ($height > 272 || $width > 480)) { + throw new BuilderException("Incorrect file height and width"); + } elseif ($this->deviceConfig->deviceType == DeviceType::HPA_IPP350 && + ($height > 240 || $width > 320)) { + throw new BuilderException("Incorrect file height and width"); + } + } + } + + public function getFileInformation($sendFileInfo) + { + try { + //convert image to hexa decimal ASCII format + $hex = unpack("H*", file_get_contents($sendFileInfo->imageLocation)); + $hex = current($hex); + + $fileInfo['fileSize'] = filesize($sendFileInfo->imageLocation); + $fileInfo['fileData'] = $hex; + $fileInfo['fileDataSize'] = strlen($hex); + + return $fileInfo; + } catch (Exception $e) { + throw new BuilderException("Input error: " . $e->getMessage); + } + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Responses/HpaDiagnosticReportResponse.php b/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Responses/HpaDiagnosticReportResponse.php new file mode 100644 index 0000000..3be25c9 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Responses/HpaDiagnosticReportResponse.php @@ -0,0 +1,135 @@ +deviceResponse = new HpaResponse(); + + //incase of muliple message needs to be splitted + //convert the response as array using keyword + $messageList = explode('', $gatewayMultipleResponse); + + if (!empty($messageList)) { + foreach ($messageList as $message) { + if (!empty($message)) { + //process individual response + if (strpos($message, '') !== false && !strpos($message, '')) { + $message .= ''; + $this->parseReportResponse($message); + } + } + } + } + + return $this->deviceResponse; + } + + private function parseReportResponse($gatewayResponse) + { + $responseData = TerminalUtils::xmlParse($gatewayResponse); + + if (!empty($responseData)) { + $responseType = lcfirst($responseData['Response']); + + $this->setValue('versionNumber', $responseData, 'Version'); + $this->setValue('ecrId', $responseData, 'ECRId'); + $this->setValue('sipId', $responseData, 'SIPId'); + $this->setValue('deviceId', $responseData, 'DeviceId'); + $this->setValue('response', $responseData, 'Response'); + $this->setValue('multipleMessage', $responseData, 'MultipleMessage'); + $this->setValue('resultCode', $responseData, 'Result'); + $this->setValue('responseCode', $responseData, 'ResponseCode'); + $this->setValue('resultText', $responseData, 'ResultText'); + $this->setValue('requestId', $responseData, 'RequestId'); + + if (!empty($responseData['Record'])) { + //for GetDiagnosticReport + $this->parseResponseRecord($responseData['Record'], $responseType); + } + } + } + + private function parseResponseRecord($gatewayRecord, $recordType) + { + if (!empty($gatewayRecord['Field'])) { + $data = []; + if (isset($gatewayRecord['Field']['Key']) && isset($gatewayRecord['Field']['Value'])) { + $field = $gatewayRecord['Field']; + $key = $this->formatKey($field['Key']); + $data["$key"] = $field['Value']; + } else { + //incase of multi dimensional array + foreach ($gatewayRecord['Field'] as $field) { + if (isset($field['Key']) && isset($field['Value'])) { + $key = $this->formatKey($field['Key']); + + //convert the string as array when same key value pair repeated + if (isset($data[$key])) { + if (is_array($data[$key]) === false) { + //convert string to array and assign last string as first element of array + $prevValue = $data[$key]; + $data[$key] = [$prevValue]; + } + + $data[$key][] = $field['Value']; + } else { + $data[$key] = $field['Value']; + } + } + } + } + if ($recordType == 'getdiagnosticreport') { + $tableCategory = $this->formatTableCategory($gatewayRecord); + + $this->deviceResponse->responseData[$recordType] + [$tableCategory] [] = $data; + } elseif (!empty($this->deviceResponse->responseData[$recordType])) { + $this->deviceResponse->responseData[$recordType][] = $data; + } else { + $this->deviceResponse->responseData[$recordType] = $data; + } + } + } + + /* + * Set transaction based response in $deviceResponse + * + * @param string $propertyName $deviceResponse object property name + * @param array $response + * @param string $responseKey response key received from device + */ + + private function setValue($propertyName, $response, $responseKey) + { + if (isset($response[$responseKey])) { + $this->deviceResponse->{$propertyName} = $response[$responseKey]; + } + } + + private function formatKey($key) + { + //convert "APPLICATION MODE" key as "applicationMode" + $key = ucwords(strtolower($key)); + $key = str_replace(' ', '', $key); + return $key; + } + + private function formatTableCategory($gatewayRecord) + { + $tableCategory = (!empty($gatewayRecord['TableCategory'])) ? + lcfirst(ucwords(strtolower($gatewayRecord['TableCategory']))) : 'batchReport'; + + $tableCategory = str_replace(' ', '', $tableCategory); + + return $tableCategory; + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Responses/HpaEodResponse.php b/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Responses/HpaEodResponse.php new file mode 100644 index 0000000..eedc9ad --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Responses/HpaEodResponse.php @@ -0,0 +1,174 @@ +deviceResponse = new HpaResponse(); + $this->deviceResponse->responseData = [ + 'getBatchReport' => [ + 'batchSummary' => [], + 'batchReport' => [], + 'visaCardSummary' => [], + 'mastercardCardSummary' => [], + 'americanExpressCardSummary' => [], + 'discoverCardSummary' => [], + 'paypalCardSummary' => [], + 'batchDetail' => [], + 'transactionDetails' => [] + ] + ]; + + //incase of muliple message needs to be splitted + //convert the response as array using keyword + $messageList = explode('', $gatewayMultipleResponse); + + if (!empty($messageList)) { + foreach ($messageList as $message) { + if (!empty($message)) { + //process individual response + if (strpos($message, '') !== false && !strpos($message, '')) { + $message .= ''; + $this->parseEODResponse($message); + } + } + } + } + + return $this->deviceResponse; + } + + private function parseEODResponse($gatewayResponse) + { + $responseData = TerminalUtils::xmlParse($gatewayResponse); + + if (!empty($responseData)) { + $responseType = lcfirst($responseData['Response']); + + if (!empty($responseData['Record'])) { + //for GetBatchReport + $this->parseResponseRecord($responseData['Record'], $responseType); + } elseif ($responseData['Response'] == 'EOD') { + //process main EOD response + $this->setValue('versionNumber', $responseData, 'Version'); + $this->setValue('ecrId', $responseData, 'ECRId'); + $this->setValue('sipId', $responseData, 'SIPId'); + $this->setValue('deviceId', $responseData, 'DeviceId'); + $this->setValue('response', $responseData, 'Response'); + $this->setValue('multipleMessage', $responseData, 'MultipleMessage'); + $this->setValue('resultCode', $responseData, 'Result'); + $this->setValue('transactionId', $responseData, 'ResponseId'); + $this->setValue('responseCode', $responseData, 'ResponseCode'); + $this->setValue('resultText', $responseData, 'ResultText'); + $this->setValue('requestId', $responseData, 'RequestId'); + + //EOD specific + $this->setValue('reversal', $responseData, 'Reversal'); + $this->setValue('emvOfflineDecline', $responseData, 'EMVOfflineDecline'); + $this->setValue('transactionCertificate', $responseData, 'TransactionCertificate'); + $this->setValue('attachment', $responseData, 'Attachment'); + $this->setValue('sendSAF', $responseData, 'SendSAF'); + $this->setValue('batchClose', $responseData, 'BatchClose'); + $this->setValue('heartBeat', $responseData, 'HeartBeat'); + $this->setValue('eMVPDL', $responseData, 'EMVPDL'); + } + } + } + + private function parseResponseRecord($gatewayRecord, $recordType) + { + if (!empty($gatewayRecord['Field'])) { + $data = []; + if (isset($gatewayRecord['Field']['Key']) && isset($gatewayRecord['Field']['Value'])) { + $field = $gatewayRecord['Field']; + $key = $this->formatKey($field['Key']); + $data["$key"] = $this->formatValue($key, $field['Value']); + } else { + //incase of multi dimensional array + foreach ($gatewayRecord['Field'] as $field) { + if (isset($field['Key']) && isset($field['Value'])) { + $key = $this->formatKey($field['Key']); + + //convert the string as array when same key value pair repeated + if (isset($data[$key])) { + if (is_array($data[$key]) === false) { + //convert string to array and assign last string as first element of array + $prevValue = $data[$key]; + $data[$key] = [$prevValue]; + } + + $data[$key][] = $this->formatValue($key, $field['Value']); + } else { + $data[$key] = $this->formatValue($key, $field['Value']); + } + } + } + } + if ($recordType == 'getBatchReport' || $recordType == 'sendSAF') { + $tableCategory = $this->formatTableCategory($gatewayRecord); + + $this->deviceResponse->responseData[$recordType] + [$tableCategory] [] = $data; + } elseif (!empty($this->deviceResponse->responseData[$recordType])) { + $this->deviceResponse->responseData[$recordType][] = $data; + } else { + $this->deviceResponse->responseData[$recordType] = $data; + } + } + } + + /* + * Set transaction based response in $deviceResponse + * + * @param string $propertyName $deviceResponse object property name + * @param array $response + * @param string $responseKey response key received from device + */ + + private function setValue($propertyName, $response, $responseKey) + { + if (isset($response[$responseKey])) { + $this->deviceResponse->{$propertyName} = $response[$responseKey]; + } + } + + private function formatKey($key) + { + //convert "APPLICATION MODE" key as "applicationMode" + $key = lcfirst(ucwords($key)); + $key = str_replace(' ', '', $key); + return $key; + } + + private function formatValue($key, $value) + { + if (!empty($value) && (stripos($key, 'amt') !== false || stripos($key, 'amount') !== false)) { + return TerminalUtils::reformatAmount($value); + } + return $value; + } + + private function formatTableCategory($gatewayRecord) + { + $tableCategory = (!empty($gatewayRecord['TableCategory'])) ? + lcfirst(ucwords(strtolower($gatewayRecord['TableCategory']))) : 'batchReport'; + $tableCategory = str_replace(' ', '', $tableCategory); + + $tableCategory = preg_match("/transaction[0-9]+Detail/", $tableCategory) ? + 'transactionDetails' : $tableCategory; + + //convert approvedSaf#1Record into approvedSafRecords + $tableCategory = preg_match("/\#[0-9]+Record/", $tableCategory) ? + preg_replace("/\#[0-9]+Record/", '', $tableCategory) . 'Records' : $tableCategory; + + return $tableCategory; + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Responses/HpaSendSafResponse.php b/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Responses/HpaSendSafResponse.php new file mode 100644 index 0000000..4711d92 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Responses/HpaSendSafResponse.php @@ -0,0 +1,160 @@ +deviceResponse = new HpaResponse(); + $this->deviceResponse->responseData = [ + 'sendSAF' => [ + 'approvedSafSummary' => [], + 'pendingSafSummary' => [], + 'declinedSafSummary' => [], + 'offlineApprovedSafSummary' => [], + 'partiallyApprovedSafSummary' => [], + 'approvedSafVoidSummary' => [], + 'pendingSafVoidSummary' => [], + 'declinedSafVoidSummary' => [] + ] + ]; + + //incase of muliple message needs to be splitted + //convert the response as array using keyword + $messageList = explode('', $gatewayMultipleResponse); + + if (!empty($messageList)) { + foreach ($messageList as $message) { + if (!empty($message)) { + //process individual response + if (strpos($message, '') !== false && !strpos($message, '')) { + $message .= ''; + $this->parseSAFResponse($message); + } + } + } + } + + return $this->deviceResponse; + } + + private function parseSAFResponse($gatewayResponse) + { + $responseData = TerminalUtils::xmlParse($gatewayResponse); + + if (!empty($responseData)) { + $responseType = lcfirst($responseData['Response']); + + if (!empty($responseData['Record'])) { + //other than SendSAF + $this->parseResponseRecord($responseData['Record'], $responseType); + } + if ($responseData['Response'] == 'SendSAF') { + //process main SendSAF response + $this->setValue('versionNumber', $responseData, 'Version'); + $this->setValue('ecrId', $responseData, 'ECRId'); + $this->setValue('sipId', $responseData, 'SIPId'); + $this->setValue('deviceId', $responseData, 'DeviceId'); + $this->setValue('response', $responseData, 'Response'); + $this->setValue('multipleMessage', $responseData, 'MultipleMessage'); + $this->setValue('resultCode', $responseData, 'Result'); + $this->setValue('transactionId', $responseData, 'ResponseId'); + $this->setValue('responseCode', $responseData, 'ResponseCode'); + $this->setValue('resultText', $responseData, 'ResultText'); + } + } + } + + private function parseResponseRecord($gatewayRecord, $recordType) + { + if (!empty($gatewayRecord['Field'])) { + $data = []; + if (isset($gatewayRecord['Field']['Key']) && isset($gatewayRecord['Field']['Value'])) { + $field = $gatewayRecord['Field']; + $key = $this->formatKey($field['Key']); + $data["$key"] = $this->formatValue($key, $field['Value']); + } else { + //incase of multi dimensional array + foreach ($gatewayRecord['Field'] as $field) { + if (isset($field['Key']) && isset($field['Value'])) { + $key = $this->formatKey($field['Key']); + + //convert the string as array when same key value pair repeated + if (isset($data[$key])) { + if (is_array($data[$key]) === false) { + //convert string to array and assign last string as first element of array + $prevValue = $data[$key]; + $data[$key] = [$prevValue]; + } + + $data[$key][] = $this->formatValue($key, $field['Value']); + } else { + $data[$key] = $this->formatValue($key, $field['Value']); + } + } + } + } + if ($recordType == 'sendSAF') { + $tableCategory = $this->formatTableCategory($gatewayRecord); + + $this->deviceResponse->responseData[$recordType] + [$tableCategory] [] = $data; + } elseif (!empty($this->deviceResponse->responseData[$recordType])) { + $this->deviceResponse->responseData[$recordType][] = $data; + } else { + $this->deviceResponse->responseData[$recordType] = $data; + } + } + } + + /* + * Set transaction based response in $deviceResponse + * + * @param string $propertyName $deviceResponse object property name + * @param array $response + * @param string $responseKey response key received from device + */ + + private function setValue($propertyName, $response, $responseKey) + { + if (isset($response[$responseKey])) { + $this->deviceResponse->{$propertyName} = $response[$responseKey]; + } + } + + private function formatKey($key) + { + //convert "APPLICATION MODE" key as "applicationMode" + $key = lcfirst(ucwords($key)); + $key = str_replace(' ', '', $key); + return $key; + } + + private function formatValue($key, $value) + { + if (!empty($value) && (stripos($key, 'amt') !== false || stripos($key, 'amount') !== false)) { + return TerminalUtils::reformatAmount($value); + } + return $value; + } + + private function formatTableCategory($gatewayRecord) + { + $tableCategory = (!empty($gatewayRecord['TableCategory'])) ? + lcfirst(ucwords(strtolower($gatewayRecord['TableCategory']))) : 'overallReport'; + $tableCategory = str_replace(' ', '', $tableCategory); + + //convert approvedSaf#1Record into approvedSafRecords + $tableCategory = preg_match("/\#[0-9]+Record/", $tableCategory) ? + preg_replace("/\#[0-9]+Record/", '', $tableCategory) . 'Records' : $tableCategory; + + return $tableCategory; + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Interfaces/IDeviceCommInterface.php b/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Interfaces/IDeviceCommInterface.php new file mode 100644 index 0000000..0367698 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Interfaces/IDeviceCommInterface.php @@ -0,0 +1,14 @@ +')); + $gatewayResponse = str_replace(['&', '''], ['&', "'"], $gatewayResponse); + + //convert xml to PHP array + $responseXml = simplexml_load_string($gatewayResponse); + $responseJson = json_encode($responseXml); + $responseData = json_decode($responseJson, true); + + return $responseData; + } + + public static function formatAmount($amount) + { + return preg_replace('/[^0-9]/', '', sprintf('%01.2f', $amount)); + } + + public static function reformatAmount($amount) + { + return $amount / 100; + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Utils/GenerationUtils.php b/classes/includes/vendor/globalpayments/php-sdk/src/Utils/GenerationUtils.php new file mode 100644 index 0000000..29e19cc --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Utils/GenerationUtils.php @@ -0,0 +1,159 @@ +format('YmdHis'); + } + + /** + * Order Id for a initial request should be unique per client ID. This method + * generates a unique order ID using the PHP GUID function and then converts + * it to base64 to shorten the length to 22 characters. Order Id for a subsequent + * request (void, rebate, settle etc.) should use the order Id of the initial + * request. + * + * The order ID uses the PHP GUID (globally unique identifier), so in theory, + * it may not be unique but the odds of this are extremely remote (see + * https://en.wikipedia.org/wiki/Globally_unique_identifier) + * + * @return string + */ + public static function generateOrderId() + { + $uuid = self::getGuid(); + $mostSignificantBits = substr($uuid, 0, 8); + $leastSignificantBits = substr($uuid, 23, 8); + + return substr( + base64_encode($mostSignificantBits . $leastSignificantBits), + 0, + 22 + ); + } + + public static function generateRecurringKey($key = null) + { + if ($key !== null) { + return $key; + } + + $uuid = self::getGuid(); + return strtolower($uuid); + } + + public static function getGuid() + { + if (function_exists('com_create_guid')) { + return trim(com_create_guid(), '{}'); + } + + $data = openssl_random_pseudo_bytes(16); + $data[6] = chr(ord($data[6]) & 0x0f | 0x40); // set version to 0100 + $data[8] = chr(ord($data[8]) & 0x3f | 0x80); // set bits 6-7 to 10 + return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4)); + } + + public static function convertArrayToJson($request, $hppVersion = '') + { + if ($hppVersion != HppVersion::VERSION_2) { + $request = array_map('base64_encode', $request); + } + return json_encode($request); + } + + public static function decodeJson($json, $returnArray = true, $hppVersion = '') + { + if ($hppVersion != HppVersion::VERSION_2) { + return array_map('base64_decode', json_decode($json, true)); + } + return json_decode($json, $returnArray); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Data/TestCards.php b/classes/includes/vendor/globalpayments/php-sdk/test/Data/TestCards.php new file mode 100644 index 0000000..b132d9a --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/test/Data/TestCards.php @@ -0,0 +1,271 @@ +value = $card->value; + $data->encryptionData = $card->encryptionData; + $data->pinBlock = $pinBlock; + return $data; + } + + public static function asEBTTrack($card, $pinBlock) + { + $data = new EBTTrackData(); + $data->value = $card->value; + $data->entryMethod = $card->entryMethod; + $data->encryptionData = $card->encryptionData; + $data->pinBlock = $pinBlock; + return $data; + } + + public static function asEBTManual($card, $pinBlock) + { + $data = new EBTCardData(); + $data->number = $card->number; + $data->expMonth = $card->expMonth; + $data->expYear = $card->expYear; + $data->pinBlock = $pinBlock; + return $data; + } + + public static function visaManual($cardPresent = false, $readerPresent = false) + { + $data = new CreditCardData(); + $data->number = '4012002000060016'; + $data->expMonth = 12; + $data->expYear = 2025; + $data->cvn = '123'; + $data->cardPresent = $cardPresent; + $data->readerPresent = $readerPresent; + return $data; + } + + public static function visaSwipe($entryMethod = null) + { + if ($entryMethod === null) { + $entryMethod = EntryMethod::SWIPE; + } + + $data = new CreditTrackData(); + $data->value = '%B4012002000060016^VI TEST CREDIT^251210118039000000000396?;4012002000060016=25121011803939600000?'; + $data->entryMethod = $entryMethod; + return $data; + } + + public static function visaSwipeEncrypted($entryMethod = null) + { + if ($entryMethod === null) { + $entryMethod = EntryMethod::SWIPE; + } + + $encryptionData = new EncryptionData(); + $encryptionData->version = '01'; + + $data = new CreditTrackData(); + $data->value = ';'; + $data->entryMethod = $entryMethod; + $data->encryptionData = $encryptionData; + return $data; + } + + public static function masterCardManual($cardPresent = false, $readerPresent = false) + { + $data = new CreditCardData(); + $data->number = '5473500000000014'; + $data->expMonth = 12; + $data->expYear = 2025; + $data->cvn = '123'; + $data->cardPresent = $cardPresent; + $data->readerPresent = $readerPresent; + return $data; + } + + public static function masterCardSeries2Manual($cardPresent = false, $readerPresent = false) + { + $data = new CreditCardData(); + $data->number = '2223000010005780'; + $data->expMonth = 12; + $data->expYear = 2019; + $data->cvn = '123'; + $data->cardPresent = $cardPresent; + $data->readerPresent = $readerPresent; + return $data; + } + + public static function masterCardSwipe($entryMethod = null) + { + if ($entryMethod === null) { + $entryMethod = EntryMethod::SWIPE; + } + + $data = new CreditTrackData(); + $data->value = '%B5473500000000014^MC TEST CARD^251210199998888777766665555444433332?;5473500000000014=25121019999888877776?'; + $data->entryMethod = $entryMethod; + return $data; + } + + public static function masterCard24Swipe($entryMethod = null) + { + if ($entryMethod === null) { + $entryMethod = EntryMethod::SWIPE; + } + + $data = new CreditTrackData(); + $data->value = '%B2223000010005780^TEST CARD/EMV BIN-2^19121010000000009210?;2223000010005780=19121010000000009210?'; + $data->entryMethod = $entryMethod; + return $data; + } + + public static function masterCard25Swipe($entryMethod = null) + { + if ($entryMethod === null) { + $entryMethod = EntryMethod::SWIPE; + } + + $data = new CreditTrackData(); + $data->value = '%B2223000010005798^TEST CARD/EMV BIN-2^19121010000000003840?;2223000010005798=19121010000000003840?'; + $data->entryMethod = $entryMethod; + return $data; + } + + public static function masterCardSwipeEncrypted($entryMethod = null) + { + if ($entryMethod === null) { + $entryMethod = EntryMethod::SWIPE; + } + + $encryptionData = new EncryptionData(); + $encryptionData->version = '01'; + + $data = new CreditTrackData(); + $data->value = ''; + $data->entryMethod = $entryMethod; + $data->encryptionData = $encryptionData; + return $data; + } + + public static function discoverManual($cardPresent = false, $readerPresent = false) + { + $data = new CreditCardData(); + $data->number = '6011000990156527'; + $data->expMonth = 12; + $data->expYear = 2025; + $data->cvn = '123'; + $data->cardPresent = $cardPresent; + $data->readerPresent = $readerPresent; + return $data; + } + + public static function discoverSwipe($entryMethod = null) + { + if ($entryMethod === null) { + $entryMethod = EntryMethod::SWIPE; + } + + $data = new CreditTrackData(); + $data->value = '%B6011000990156527^DIS TEST CARD^25121011000062111401?;6011000990156527=25121011000062111401?'; + $data->entryMethod = $entryMethod; + return $data; + } + + public static function discoverSwipeEncrypted($entryMethod = null) + { + if ($entryMethod === null) { + $entryMethod = EntryMethod::SWIPE; + } + + $encryptionData = new EncryptionData(); + $encryptionData->version = '01'; + + $data = new CreditTrackData(); + $data->value = ''; + $data->entryMethod = $entryMethod; + $data->encryptionData = $encryptionData; + return $data; + } + + public static function amexManual($cardPresent = false, $readerPresent = false) + { + $data = new CreditCardData(); + $data->number = '372700699251018'; + $data->expMonth = 12; + $data->expYear = 2025; + $data->cvn = '1234'; + $data->cardPresent = $cardPresent; + $data->readerPresent = $readerPresent; + return $data; + } + + public static function amexSwipe($entryMethod = null) + { + if ($entryMethod === null) { + $entryMethod = EntryMethod::SWIPE; + } + + $data = new CreditTrackData(); + $data->value = '%B3727 006992 51018^AMEX TEST CARD^2512990502700?;372700699251018=2512990502700?'; + $data->entryMethod = $entryMethod; + return $data; + } + + public static function jcbManual($cardPresent = false, $readerPresent = false) + { + $data = new CreditCardData(); + $data->number = '3566007770007321'; + $data->expMonth = 12; + $data->expYear = 2025; + $data->cvn = '123'; + $data->cardPresent = $cardPresent; + $data->readerPresent = $readerPresent; + return $data; + } + + public static function jcbSwipe($entryMethod = null) + { + if ($entryMethod === null) { + $entryMethod = EntryMethod::SWIPE; + } + + $data = new CreditTrackData(); + $data->value = '%B3566007770007321^JCB TEST CARD^2512101100000000000000000064300000?;3566007770007321=25121011000000076435?'; + $data->entryMethod = $entryMethod; + return $data; + } + + public static function giftCard1Swipe() + { + $data = new GiftCard(); + $data->trackData = '%B5022440000000000098^^391200081613?;5022440000000000098=391200081613?'; + return $data; + } + + public static function giftCard2Manual() + { + $data = new GiftCard(); + $data->number = '5022440000000000007'; + return $data; + } + + public static function gsbManual() + { + $data = new CreditCardData(); + $data->number = '6277220572999800'; + $data->expMonth = '12'; + $data->expYear = '2049'; + return $data; + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Data/TestChecks.php b/classes/includes/vendor/globalpayments/php-sdk/test/Data/TestChecks.php new file mode 100644 index 0000000..70eadae --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/test/Data/TestChecks.php @@ -0,0 +1,37 @@ +accountNumber = '24413815'; + $check->routingNumber = '490000018'; + $check->checkType = $checkType; + $check->accountType = $accountType; + $check->secCode = $secCode; + $check->entryMode = EntryMethod::MANUAL; + $check->checkHolderName = 'John Doe'; + $check->driversLicenseNumber = '09876543210'; + $check->driversLicenseState = 'TX'; + $check->phoneNumber = '8003214567'; + $check->birthYear = '1997'; + $check->ssnLast4 = '4321'; + if (!empty($checkHolderName)) { + $check->checkHolderName = $checkHolderName; + } + return $check; + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/AchTest.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/AchTest.php new file mode 100644 index 0000000..61e4a85 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/AchTest.php @@ -0,0 +1,65 @@ +eCheck = new ECheck(); + $this->eCheck->accountNumber = '24413815'; + $this->eCheck->routingNumber = '490000018'; + $this->eCheck->checkType = CheckType::PERSONAL; + $this->eCheck->secCode = SecCode::PPD; + $this->eCheck->accountType = AccountType::CHECKING; + $this->eCheck->entryMode = EntryMethod::MANUAL; + $this->eCheck->checkHolderName = 'John Doe'; + $this->eCheck->driversLicenseNumber = '09876543210'; + $this->eCheck->driversLicenseState = 'TX'; + $this->eCheck->phoneNumber = '8003214567'; + $this->eCheck->birthYear = '1997'; + $this->eCheck->ssnLast4 = '4321'; + + $this->address = new Address(); + $this->address->streetAddress1 = '123 Main St.'; + $this->address->city = 'Downtown'; + $this->address->state = 'NJ'; + $this->address->postalCode = '12345'; + + ServicesContainer::configure($this->getConfig()); + } + + public function testCheckSale() + { + $response = $this->eCheck->charge(11) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + protected function getConfig() + { + $config = new ServicesConfig(); + $config->secretApiKey = 'skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A'; + $config->serviceUrl = ($this->enableCryptoUrl) ? + 'https://cert.api2-c.heartlandportico.com/': + 'https://cert.api2.heartlandportico.com'; + return $config; + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/CheckTest.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/CheckTest.php new file mode 100644 index 0000000..3077c4e --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/CheckTest.php @@ -0,0 +1,481 @@ +secretApiKey = 'skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A'; + $config->serviceUrl = ($this->enableCryptoUrl) ? + 'https://cert.api2-c.heartlandportico.com/': + 'https://cert.api2.heartlandportico.com'; + return $config; + } + + protected function setup() + { + ServicesContainer::configure($this->config()); + + $this->address = new Address(); + $this->address->streetAddress1 = '123 Main St.'; + $this->address->city = 'Downtown'; + $this->address->province = 'NJ'; + $this->address->postalCode = '12345'; + } + + /// ACH Debit - Consumer + + public function test001ConsumerPersonalChecking() + { + $check = TestChecks::certification( + SecCode::PPD, + CheckType::PERSONAL, + AccountType::CHECKING + ); + + $response = $check->charge(11.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + // test case 25 + $voidResponse = $response->void()->execute(); + $this->assertNotNull($voidResponse); + $this->assertEquals('00', $voidResponse->responseCode); + } + + public function test002ConsumerBusinessChecking() + { + $check = TestChecks::certification( + SecCode::PPD, + CheckType::BUSINESS, + AccountType::CHECKING + ); + + $response = $check->charge(12.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test003ConsumerPersonalSavings() + { + $check = TestChecks::certification( + SecCode::PPD, + CheckType::PERSONAL, + AccountType::SAVINGS + ); + + $response = $check->charge(13.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test004ConsumerBusinessSavings() + { + $check = TestChecks::certification( + SecCode::PPD, + CheckType::BUSINESS, + AccountType::SAVINGS + ); + + $response = $check->charge(14.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test005CorporatePersonalChecking() + { + $check = TestChecks::certification( + SecCode::CCD, + CheckType::PERSONAL, + AccountType::CHECKING, + "Heartland Pays" + ); + + $response = $check->charge(15.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + // test case 26 + $voidResponse = $response->void()->execute(); + $this->assertNotNull($voidResponse); + $this->assertEquals('00', $voidResponse->responseCode); + } + + public function test006CorporateBusinessChecking() + { + $check = TestChecks::certification( + SecCode::CCD, + CheckType::BUSINESS, + AccountType::CHECKING, + "Heartland Pays" + ); + + $response = $check->charge(16.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test007CorporatePersonalSavings() + { + $check = TestChecks::certification( + SecCode::CCD, + CheckType::PERSONAL, + AccountType::SAVINGS, + "Heartland Pays" + ); + + $response = $check->charge(17.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test008CorporateBusinessSavings() + { + $check = TestChecks::certification( + SecCode::CCD, + CheckType::BUSINESS, + AccountType::SAVINGS, + "Heartland Pays" + ); + + $response = $check->charge(18.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test009EgoldPersonalChecking() + { + $check = TestChecks::certification( + SecCode::POP, + CheckType::PERSONAL, + AccountType::CHECKING + ); + + $response = $check->charge(11.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test010EgoldBusinessChecking() + { + $check = TestChecks::certification( + SecCode::CCD, + CheckType::BUSINESS, + AccountType::CHECKING + ); + + $response = $check->charge(12.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test011EgoldPersonalSavings() + { + $check = TestChecks::certification( + SecCode::POP, + CheckType::PERSONAL, + AccountType::SAVINGS + ); + + $response = $check->charge(13.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test012EgoldBusinessSavings() + { + $check = TestChecks::certification( + SecCode::POP, + CheckType::BUSINESS, + AccountType::SAVINGS + ); + + $response = $check->charge(14.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test013EsilverPersonalChecking() + { + $check = TestChecks::certification( + SecCode::POP, + CheckType::PERSONAL, + AccountType::CHECKING + ); + + $response = $check->charge(15.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test014EsilverBusinessChecking() + { + $check = TestChecks::certification( + SecCode::CCD, + CheckType::BUSINESS, + AccountType::CHECKING + ); + + $response = $check->charge(16.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test015EsilverPersonalSavings() + { + $check = TestChecks::certification( + SecCode::POP, + CheckType::PERSONAL, + AccountType::SAVINGS + ); + + $response = $check->charge(17.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test016EsilverBusinessSavings() + { + $check = TestChecks::certification( + SecCode::POP, + CheckType::BUSINESS, + AccountType::SAVINGS + ); + + $response = $check->charge(18.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + * @expectedExceptionMessage Processor Configuration error + */ + public function test017EbronzePersonalChecking() + { + $check = TestChecks::certification( + SecCode::EBRONZE, + CheckType::PERSONAL, + AccountType::CHECKING + ); + + $response = $check->charge(19.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + * @expectedExceptionMessage Processor Configuration error + */ + public function test018EbronzeBusinessChecking() + { + $check = TestChecks::certification( + SecCode::EBRONZE, + CheckType::BUSINESS, + AccountType::CHECKING + ); + + $response = $check->charge(20.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + * @expectedExceptionMessage Processor Configuration error + */ + public function test019EbronzePersonalSavings() + { + $check = TestChecks::certification( + SecCode::EBRONZE, + CheckType::PERSONAL, + AccountType::SAVINGS + ); + + $response = $check->charge(21.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + * @expectedExceptionMessage Processor Configuration error + */ + public function test020EbronzeBusinessSavings() + { + $check = TestChecks::certification( + SecCode::EBRONZE, + CheckType::BUSINESS, + AccountType::SAVINGS + ); + + $response = $check->charge(22.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test021WebPersonalChecking() + { + $check = TestChecks::certification( + SecCode::WEB, + CheckType::PERSONAL, + AccountType::CHECKING + ); + + $response = $check->charge(23.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test022WebBusinessChecking() + { + $check = TestChecks::certification( + SecCode::WEB, + CheckType::BUSINESS, + AccountType::CHECKING + ); + + $response = $check->charge(24.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test023WebPersonalSavings() + { + $check = TestChecks::certification( + SecCode::WEB, + CheckType::PERSONAL, + AccountType::SAVINGS + ); + + $response = $check->charge(25.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test024WebBusinessSavings() + { + $check = TestChecks::certification( + SecCode::WEB, + CheckType::BUSINESS, + AccountType::SAVINGS + ); + + $response = $check->charge(5.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/EcommerceCheckTest.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/EcommerceCheckTest.php new file mode 100644 index 0000000..19e5d5a --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/EcommerceCheckTest.php @@ -0,0 +1,108 @@ +secretApiKey = 'skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A'; + $config->serviceUrl = ($this->enableCryptoUrl) ? + 'https://cert.api2-c.heartlandportico.com/': + 'https://cert.api2.heartlandportico.com'; + return $config; + } + + protected function setup() + { + ServicesContainer::configure($this->config()); + + $this->address = new Address(); + $this->address->streetAddress1 = '123 Main St.'; + $this->address->city = 'Downtown'; + $this->address->province = 'NJ'; + $this->address->postalCode = '12345'; + } + + public function test001ConsumerPersonalChecking() + { + $check = TestChecks::certification( + SecCode::WEB, + CheckType::PERSONAL, + AccountType::CHECKING + ); + + $response = $check->charge(19.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test002ConsumerBusinessChecking() + { + $check = TestChecks::certification( + SecCode::WEB, + CheckType::BUSINESS, + AccountType::CHECKING + ); + + $response = $check->charge(20.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test003ConsumerPersonalSavings() + { + $check = TestChecks::certification( + SecCode::WEB, + CheckType::PERSONAL, + AccountType::SAVINGS + ); + + $response = $check->charge(21.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test004ConsumerBusinessSavings() + { + $check = TestChecks::certification( + SecCode::WEB, + CheckType::BUSINESS, + AccountType::SAVINGS + ); + + $response = $check->charge(22.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/EcommerceTest.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/EcommerceTest.php new file mode 100644 index 0000000..ec0d09a --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/EcommerceTest.php @@ -0,0 +1,1668 @@ +secretApiKey = 'skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A'; + $config->serviceUrl = ($this->enableCryptoUrl) ? + 'https://cert.api2-c.heartlandportico.com/': + 'https://cert.api2.heartlandportico.com'; + return $config; + } + + protected function setup() + { + ServicesContainer::configure($this->config()); + $this->publicKey = 'pkapi_cert_jKc1FtuyAydZhZfbB3'; + + $this->ecommerceInfo = new EcommerceInfo(); + $this->ecommerceInfo->channel = EcommerceChannel::ECOM; + } + + public function test000CloseBatch() + { + try { + $response = BatchService::closeBatch(); + $this->assertNotNull($response); + } catch (ApiException $e) { + if (false === strpos($e->getMessage(), static::BATCH_NOT_OPEN) + && false === strpos($e->getMessage(), static::NO_TRANS_IN_BATCH) + ) { + $this->fail($e->getMessage()); + } + } + } + + /// CARD VERIFY + + /// Account Verification + + public function test001VerifyVisa() + { + $card = TestCards::visaManual(); + + $response = $card->verify() + ->withRequestMultiUseToken($this->useTokens) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test002VerifyMasterCard() + { + $card = TestCards::masterCardManual(); + $response = $card->verify() + ->withRequestMultiUseToken($this->useTokens) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test003VerifyDiscover() + { + $address = new Address(); + $address->postalCode = '75024'; + + $card = TestCards::discoverManual(); + + $response = $card->verify() + ->withAddress($address) + ->withRequestMultiUseToken($this->useTokens) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// Address Verification + + public function test004VerifyAmex() + { + $address = new Address(); + $address->postalCode = '75024'; + + $card = TestCards::amexManual(); + + $response = $card->verify() + ->withAddress($address) + ->withRequestMultiUseToken($this->useTokens) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// Balance Inquiry (for Prepaid Card) + + public function test005BalanceInquiryVisa() + { + if (false === $this->usePrepaid) { + $this->markTestSkipped('GSB not configured'); + } + + $card = TestCards::visaManual(); + + $response = $card->balanceInquiry() + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// CREDIT SALE (For Multi-Use Token Only) + + public function test006ChargeVisaToken() + { + $address = new Address(); + $address->streetAddress1 = '6860 Dallas Pkwy'; + $address->postalCode = '75024'; + + $card = TestCards::visaManual(); + + $response = $card->charge() + ->withCurrency('USD') + ->withAmount(13.01) + ->withAddress($address) + ->withRequestMultiUseToken(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals(true, $response->token != null); + self::$visaToken = $response->token; + } + + public function test007ChargeMasterCardToken() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::masterCardManual(); + + $response = $card->charge() + ->withCurrency('USD') + ->withAmount(13.02) + ->withAddress($address) + ->withRequestMultiUseToken(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals(true, $response->token != null); + self::$mastercardToken = $response->token; + } + + public function test008ChargeDiscoverToken() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '750241234'; + + $card = TestCards::discoverManual(); + + $response = $card->charge() + ->withCurrency('USD') + ->withAmount(13.03) + ->withAddress($address) + ->withRequestMultiUseToken(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals(true, $response->token != null); + self::$discoverToken = $response->token; + } + + public function test009ChargeAmexToken() + { + $address = new Address(); + $address->streetAddress1 = '6860 Dallas Pkwy'; + $address->postalCode = '75024'; + + $card = TestCards::visaManual(); + + $response = $card->charge() + ->withCurrency('USD') + ->withAmount(13.04) + ->withAddress($address) + ->withRequestMultiUseToken(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals(true, $response->token != null); + self::$amexToken = $response->token; + } + + /// CREDIT SALE + + public function test010ChargeVisa() + { + $address = new Address(); + $address->streetAddress1 = '6860 Dallas Pkwy'; + $address->postalCode = '75024'; + + $card = TestCards::visaManual(); + if ($this->useTokens) { + $card = new CreditCardData(); + $card->token = self::$visaToken; + } + + $response = $card->charge() + ->withCurrency('USD') + ->withAmount(17.01) + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + + $voidResponse = $response->void() + ->execute(); + $this->assertEquals(true, $voidResponse != null); + $this->assertEquals('00', $voidResponse->responseCode); + } + + public function test011ChargeMastercard() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::masterCardManual(); + if ($this->useTokens) { + $card = new CreditCardData(); + $card->token = self::$mastercardToken; + } + + $response = $card->charge() + ->withCurrency('USD') + ->withAmount(17.02) + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test012ChargeDiscover() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '750241234'; + + $card = TestCards::discoverManual(); + if ($this->useTokens) { + $card = new CreditCardData(); + $card->token = self::$discoverToken; + } + + $response = $card->charge() + ->withCurrency('USD') + ->withAmount(17.03) + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test013ChargeAmex() + { + $address = new Address(); + $address->streetAddress1 = '6860 Dallas Pkwy'; + $address->postalCode = '75024'; + + $card = TestCards::amexManual(); + if ($this->useTokens) { + $card = new CreditCardData(); + $card->token = self::$amexToken; + } + + $response = $card->charge() + ->withCurrency('USD') + ->withAmount(17.04) + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test014ChargeJcb() + { + $address = new Address(); + $address->streetAddress1 = '6860 Dallas Pkwy'; + $address->postalCode = '75024'; + + $card = TestCards::jcbManual(); + + $response = $card->charge() + ->withCurrency('USD') + ->withAmount(17.04) + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test011bChargeMasterCard() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::masterCardSeries2Manual(); + + $response = $card->charge() + ->withCurrency('USD') + ->withAmount(17.02) + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// AUTHORIZATION + + public function test015AuthorizationVisa() + { + # Test 015a Authorization + $address = new Address(); + $address->streetAddress1 = '6860 Dallas Pkwy'; + $address->postalCode = '75024'; + + + $card = TestCards::visaManual(); + + $response = $card->authorize(17.06) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + + # test 015b Capture/AddToBatch + $capture = $response->capture() + ->execute(); + $this->assertEquals(true, $capture != null); + $this->assertEquals('00', $capture->responseCode); + } + + public function test016AuthorizationMastercard() + { + # Test 016a Authorization + $address = new Address(); + $address->streetAddress1 = '6860 Dallas Pkwy'; + $address->postalCode = '750241234'; + + $card = TestCards::masterCardManual(); + + $response = $card->authorize(17.07) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + + # test 016b Capture/AddToBatch + $capture = $response->capture() + ->execute(); + $this->assertEquals(true, $capture != null); + $this->assertEquals('00', $capture->responseCode); + } + + public function test017AuthorizationDiscover() + { + # Test 017a Authorization + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::discoverManual(); + + $response = $card->authorize(17.08) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + + # test 017b Capture/AddToBatch + # do not capture + } + + /// PARTIALLY - APPROVED SALE + + public function test018PartialApprovalVisa() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::visaManual(); + + $response = $card->charge(130) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withAllowPartialAuth(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('10', $response->responseCode); + $this->assertEquals(true, $response->authorizedAmount != null); + $this->assertEquals('110.00', $response->authorizedAmount); + } + + public function test019PartialApprovalDiscover() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::discoverManual(); + + $response = $card->charge(145) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withAllowPartialAuth(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('10', $response->responseCode); + $this->assertEquals(true, $response->authorizedAmount != null); + $this->assertEquals('65.00', $response->authorizedAmount); + } + + public function test020PartialApprovalMastercard() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::discoverManual(); + + $response = $card->charge(155) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withAllowPartialAuth(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('10', $response->responseCode); + $this->assertEquals(true, $response->authorizedAmount != null); + $this->assertEquals('100.00', $response->authorizedAmount); + + $voidResponse = $response->void() + ->execute(); + $this->assertEquals(true, $voidResponse != null); + $this->assertEquals('00', $voidResponse->responseCode); + } + + /// LEVEL II CORPORATE PURCHASE CARD + + public function test021LevelIIResponseB() + { + $address = new Address(); + $address->streetAddress1 = '6860 Dallas Pkwy'; + $address->postalCode = '750241234'; + + $card = TestCards::visaManual(); + + $response = $card->charge(112.34) + ->withCurrency('USD') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('B', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withPoNumber('9876543210') + ->withTaxType(TaxType::NOT_USED) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test022LevelIIResponseB() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '750241234'; + + $card = TestCards::visaManual(); + + $response = $card->charge(112.34) + ->withCurrency('USD') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('B', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withTaxType(TaxType::SALES_TAX) + ->withTaxAmount(1.00) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test023LevelIIResponseR() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::visaManual(); + + $response = $card->charge(123.45) + ->withCurrency('USD') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('R', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withTaxType(TaxType::TAX_EXEMPT) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test024LevelIIResponseS() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::visaManual(); + + $response = $card->charge(134.56) + ->withCurrency('USD') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('S', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withPoNumber('9876543210') + ->withTaxType(TaxType::SALES_TAX) + ->withTaxAmount(1.00) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test025LevelIIResponseS() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::masterCardManual(); + + $response = $card->charge(111.06) + ->withCurrency('USD') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('S', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withPoNumber('9876543210') + ->withTaxType(TaxType::NOT_USED) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test026LevelIIResponseS() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::masterCardManual(); + + $response = $card->charge(111.07) + ->withCurrency('USD') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('S', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withTaxType(TaxType::SALES_TAX) + ->withTaxAmount(1.00) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test027LevelIIResponseS() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::masterCardManual(); + + $response = $card->charge(111.08) + ->withCurrency('USD') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('S', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withPoNumber('9876543210') + ->withTaxType(TaxType::SALES_TAX) + ->withTaxAmount(1.00) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test028LevelIIResponseS() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::masterCardManual(); + + $response = $card->charge(111.09) + ->withCurrency('USD') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('S', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withPoNumber('9876543210') + ->withTaxType(TaxType::TAX_EXEMPT) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test029LevelIINoResponse() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::amexManual(); + + $response = $card->charge(111.10) + ->withCurrency('USD') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('0', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withPoNumber('9876543210') + ->withTaxType(TaxType::NOT_USED) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test030LevelIINoResponse() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '750241234'; + + $card = TestCards::amexManual(); + + $response = $card->charge(111.11) + ->withCurrency('USD') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('0', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withTaxType(TaxType::SALES_TAX) + ->withTaxAmount(1.00) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test031LevelIINoResponse() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::amexManual(); + + $response = $card->charge(111.12) + ->withCurrency('USD') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('0', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withPoNumber('9876543210') + ->withTaxType(TaxType::SALES_TAX) + ->withTaxAmount(1.00) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test032LevelIINoResponse() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::amexManual(); + + $response = $card->charge(111.13) + ->withCurrency('USD') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('0', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withPoNumber('9876543210') + ->withTaxType(TaxType::TAX_EXEMPT) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + /// PRIOR / VOICE AUTHORIZATION + + public function test033OfflineSale() + { + $card = TestCards::visaManual(); + + $response = $card->charge(17.10) + ->withCurrency('USD') + ->withModifier(TransactionModifier::OFFLINE) + ->withOfflineAuthCode('654321') + ->withInvoiceNumber('123456') + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test033OfflineAuthorization() + { + $card = TestCards::visaManual(); + + $response = $card->authorize(17.10) + ->withCurrency('USD') + ->withModifier(TransactionModifier::OFFLINE) + ->withOfflineAuthCode('654321') + ->withInvoiceNumber('123456') + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// RETURN + + public function test034OfflineCreditReturn() + { + $card = TestCards::masterCardManual(); + + $response = $card->refund(15.15) + ->withCurrency('USD') + ->withInvoiceNumber('123456') + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test034bOfflineCreditReturn() + { + $card = TestCards::masterCardManual(); + + $response = $card->refund(15.16) + ->withCurrency('USD') + ->withInvoiceNumber('123456') + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// ONLINE VOID / REVERSAL + + public function test035VoidTest10() + { + // see test 010 + } + + public function test036VoidTest20() + { + // see test 020 + } + + /// Time Out Reversal + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\UnsupportedTransactionException + */ + public function test036bTimeoutReversal() + { + $sale = TestCards::visaManual()->charge(911) + ->withCurrency('USD') + ->withClientTransactionId('987321654') + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $sale != null); + $this->assertEquals('91', $sale->responseCode); + + $response = Transaction::fromId(null, PaymentMethodType::CREDIT); + $response->clientTransactionId = '987321654'; + + $response->reverse(911)->execute(); + } + + /// One time bill payment + + public function test010ChargeVisaOneTime() + { + $address = new Address(); + $address->streetAddress1 = '6860 Dallas Pkwy'; + $address->postalCode = '75024'; + + $card = null; + if ($this->useTokens) { + $card = new CreditCardData(); + $card->token = static::$visaToken; + } else { + $card = TestCards::visaManual(); + } + + $response = $card->charge(13.11) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withOneTimePayment(true) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + + $void = $response->void()->execute(); + + $this->assertEquals(true, $void != null); + $this->assertEquals('00', $void->responseCode); + } + + public function test011ChargeMasterCardOneTime() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '750241234'; + + $card = null; + if ($this->useTokens) { + $card = new CreditCardData(); + $card->token = static::$mastercardToken; + } else { + $card = TestCards::masterCardManual(); + } + + $response = $card->charge(13.12) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withOneTimePayment(true) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test012ChargeDiscoverOneTime() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = null; + if ($this->useTokens) { + $card = new CreditCardData(); + $card->token = static::$discoverToken; + } else { + $card = TestCards::discoverManual(); + } + + $response = $card->charge(13.13) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withOneTimePayment(true) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test013ChargeAmexOneTime() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = null; + if ($this->useTokens) { + $card = new CreditCardData(); + $card->token = static::$amexToken; + } else { + $card = TestCards::amexManual(); + } + + $response = $card->charge(13.14) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withOneTimePayment(true) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test014ChargeJcbOneTime() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = new CreditCardData(); + $card->number = '3566007770007321'; + $card->expMonth = '12'; + $card->expYear = '2025'; + $card->cvn = '123'; + + $response = $card->charge(13.15) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withOneTimePayment(true) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// ADVANCED FRAUD SCREENING + + /** + * TODO: Change code assertions when AFS is enabled on account + */ + public function test037FraudPreventionSale() + { + $card = TestCards::visaManual(); + + $response = $card->charge(15000) + ->withCurrency('USD') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + // $this->assertEquals('FR', $response->responseCode); + } + + /** + * TODO: Change code assertions when AFS is enabled on account + */ + public function test038FraudPreventionReturn() + { + $card = TestCards::visaManual(); + + $response = $card->refund(15000) + ->withCurrency('USD') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + // $this->assertEquals('41', $response->responseCode); + } + + /// ONE CARD - GSB CARD FUNCTIONS + + /// BALANCE INQUIRY + + public function test037BalanceInquiryGsb() + { + if (false === $this->usePrepaid) { + $this->markTestSkipped('GSB not configured'); + } + + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::gsbManual(); + + $response = $card->balanceInquiry() + ->withAddress($address) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// ADD VALUE + + public function test038AddValueGsb() + { + if (false === $this->usePrepaid) { + $this->markTestSkipped('GSB not configured'); + } + + $card = new CreditTrackData(); + $card->value = '%B6277220572999800^ / ^49121010557010000016000000?F;6277220572999800=49121010557010000016?'; + + $response = $card->addValue(15.00) + ->withCurrency('USD') + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// SALE + + public function test039ChargeGsb() + { + if (false === $this->usePrepaid) { + $this->markTestSkipped('GSB not configured'); + } + + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::gsbManual(); + + $response = $card->charge(2.05) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber('123456') + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + + $voidResponse = $response->void() + ->execute(); + $this->assertEquals(true, $voidResponse != null); + $this->assertEquals('00', $voidResponse->responseCode); + } + + public function test040ChargeGsb() + { + if (false === $this->usePrepaid) { + $this->markTestSkipped('GSB not configured'); + } + + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::gsbManual(); + + $response = $card->charge(2.10) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber('123456') + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// ONLINE VOID / REVERSAL + + public function test041VoidGsb() + { + // see test 039 + } + + /// HMS GIFT - REWARDS + + /// ACTIVATE + + public function test042ActivateGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->activate(6.00) + ->withCurrency('USD') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test043ActivateGift2() + { + + $card = TestCards::giftCard2Manual(); + + $response = $card->activate(7.00) + ->withCurrency('USD') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// LOAD / ADD VALUE + + public function test044AddValueGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->addValue(8.00) + ->withCurrency('USD') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test045AddValueGift2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->addValue(9.00) + ->withCurrency('USD') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// BALANCE INQUIRY + + public function test046BalanceInquiryGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->balanceInquiry() + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('10.00', $response->balanceAmount); + } + + public function test047BalanceInquiryGift2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->balanceInquiry() + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('10.00', $response->balanceAmount); + } + + /// REPLACE / TRANSFER + + public function test048ReplaceGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->replaceWith(TestCards::giftCard2Manual()) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('10.00', $response->balanceAmount); + } + + public function test049ReplaceGift2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->replaceWith(TestCards::giftCard1Swipe()) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('10.00', $response->balanceAmount); + } + + /// SALE / REDEEM + + public function test050SaleGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->charge(1.00) + ->withCurrency('USD') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test051SaleGift2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->charge(2.00) + ->withCurrency('USD') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test052SaleGift1Void() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->charge(3.00) + ->withCurrency('USD') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + + $voidResponse = $response->void() + ->execute(); + $this->assertEquals(true, $voidResponse != null); + $this->assertEquals('00', $voidResponse->responseCode); + } + + public function test053SaleGift2Reversal() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->charge(4.00) + ->withCurrency('USD') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + + $reversalResponse = $response->reverse(4.00) + ->execute(); + $this->assertEquals(true, $reversalResponse != null); + $this->assertEquals('00', $reversalResponse->responseCode); + } + + /// VOID + + public function test054VoidGift() + { + // see test 052 + } + + /// REVERSAL + + public function test055ReversalGift() + { + // see test 053 + } + + public function test056ReversalGift2() + { + $card = TestCards::giftCard2Manual(); + + $reversalResponse = $card->reverse(2.00) + ->execute(); + $this->assertEquals(true, $reversalResponse != null); + $this->assertEquals('00', $reversalResponse->responseCode); + } + + /// DEACTIVATE + + public function test057DeactivateGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->deactivate() + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// RECEIPTS MESSAGING + + public function test058ReceiptsMessaging() + { + return; # print and scan receipt for test 51 + } + + /// REWARD + + /// BALANCE INQUIRY + + public function test059BalanceInquiryRewards1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->balanceInquiry() + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('0', $response->pointsBalanceAmount); + } + + public function test060BalanceInquiryRewards2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->balanceInquiry() + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('0', $response->pointsBalanceAmount); + } + + /// ALIAS + + public function test061CreateAliasGift1() + { + $response = GiftCard::create('9725550100'); + + $this->assertEquals(true, $response != null); + } + + public function test062CreateAliasGift2() + { + $response = GiftCard::create('9725550100'); + + $this->assertEquals(true, $response != null); + } + + public function test063AddAliasGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->addAlias('2145550199') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test064AddAliasGift2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->addAlias('2145550199') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test065DeleteAliasGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->removeAlias('2145550199') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// SALE / REDEEM + + public function test066RedeemPointsGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->charge(100) + ->withCurrency('POINTS') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test067RedeemPointsGift2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->charge(200) + ->withCurrency('POINTS') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test068RedeemPointsGift2() + { + $card = new GiftCard(); + $card->alias = '9725550100'; + + $response = $card->charge(300) + ->withCurrency('POINTS') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// REWARDS + + public function test069RewardsGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->rewards(10) + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test070RewardsGift2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->rewards(11) + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// REPLACE / TRANSFER + + public function test071ReplaceGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->replaceWith(TestCards::giftCard2Manual()) + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test072ReplaceGift2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->replaceWith(TestCards::giftCard1Swipe()) + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// DEACTIVATE + + public function test073DeactivateGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->deactivate() + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test074DeactivateGift2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->deactivate() + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// RECEIPTS MESSAGING + + public function test075ReceiptsMessaging() + { + return; # print and scan receipt for test 51 + } + + /// CLOSE BATCH + + public function test999CloseBatch() + { + try { + $response = BatchService::closeBatch(); + $this->assertNotNull($response); + // printf('batch id: %s', $response->id); + // printf('sequence number: %s', $response->sequenceNumber); + } catch (ApiException $e) { + if (false === strpos($e->getMessage(), static::BATCH_NOT_OPEN) + && false === strpos($e->getMessage(), static::NO_TRANS_IN_BATCH) + ) { + $this->fail($e->getMessage()); + } + } + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/MotoCheckTest.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/MotoCheckTest.php new file mode 100644 index 0000000..6400b5c --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/MotoCheckTest.php @@ -0,0 +1,108 @@ +secretApiKey = 'skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A'; + $config->serviceUrl = ($this->enableCryptoUrl) ? + 'https://cert.api2-c.heartlandportico.com/': + 'https://cert.api2.heartlandportico.com'; + return $config; + } + + protected function setup() + { + ServicesContainer::configure($this->config()); + + $this->address = new Address(); + $this->address->streetAddress1 = '123 Main St.'; + $this->address->city = 'Downtown'; + $this->address->province = 'NJ'; + $this->address->postalCode = '12345'; + } + + public function test001ConsumerPersonalChecking() + { + $check = TestChecks::certification( + SecCode::WEB, + CheckType::PERSONAL, + AccountType::CHECKING + ); + + $response = $check->charge(19.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test002ConsumerBusinessChecking() + { + $check = TestChecks::certification( + SecCode::WEB, + CheckType::BUSINESS, + AccountType::CHECKING + ); + + $response = $check->charge(20.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test003ConsumerPersonalSavings() + { + $check = TestChecks::certification( + SecCode::WEB, + CheckType::PERSONAL, + AccountType::SAVINGS + ); + + $response = $check->charge(21.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test004ConsumerBusinessSavings() + { + $check = TestChecks::certification( + SecCode::WEB, + CheckType::BUSINESS, + AccountType::SAVINGS + ); + + $response = $check->charge(22.00) + ->withCurrency('USD') + ->withAddress($this->address) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/MotoTest.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/MotoTest.php new file mode 100644 index 0000000..7c2d29e --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/MotoTest.php @@ -0,0 +1,1697 @@ +secretApiKey = 'skapi_cert_MRCQAQBC_VQACBE0rFaZlbDDPieMGP06JDAtjyS7NQ'; + $config->serviceUrl = ($this->enableCryptoUrl) ? + 'https://cert.api2-c.heartlandportico.com/': + 'https://cert.api2.heartlandportico.com'; + return $config; + } + + protected function setup() + { + ServicesContainer::configure($this->config()); + + $this->ecommerceInfo = new EcommerceInfo(); + $this->ecommerceInfo->channel = EcommerceChannel::MOTO; + } + + public function test000CloseBatch() + { + try { + $response = BatchService::closeBatch(); + $this->assertNotNull($response); + // print 'batch id: ' . $response->id . "\n"; + // print 'sequence number: ' . $response->sequenceNumber . "\n"; + } catch (ApiException $e) { + if (false === strpos($e->getMessage(), static::BATCH_NOT_OPEN) + && false === strpos($e->getMessage(), static::NO_TRANS_IN_BATCH) + ) { + $this->fail($e->getMessage()); + } + } + } + + public function test001VerifyVisa() + { + $card = new CreditCardData(); + $card->number = '4484958240202792'; + $card->expMonth = '12'; + $card->expYear = '2025'; + + $response = $card->verify() + ->withRequestMultiUseToken($this->useTokens) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test002VerifyMasterCard() + { + $card = new CreditCardData(); + $card->number = '5356083898949891'; + $card->expMonth = '12'; + $card->expYear = '2025'; + + $response = $card->verify() + ->withRequestMultiUseToken($this->useTokens) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test003VerifyDiscover() + { + $address = new Address(); + $address->postalCode = '75024'; + + $card = new CreditCardData(); + $card->number = '6223971100014620'; + $card->expMonth = '12'; + $card->expYear = '2025'; + + $response = $card->verify() + ->withAddress($address) + ->withRequestMultiUseToken($this->useTokens) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // StreetAddress verification + + public function test004VerifyAmex() + { + $address = new Address(); + $address->postalCode = '75024'; + + $card = new CreditCardData(); + $card->number = '345039962663847'; + $card->expMonth = '12'; + $card->expYear = '2025'; + + $response = $card->verify() + ->withAddress($address) + ->withRequestMultiUseToken($this->useTokens) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // Balance Inquiry (for prepaid card) + + public function test005BalanceInquiryVisa() + { + $card = new CreditCardData(); + $card->number = '4664383951958601'; + $card->expMonth = '12'; + $card->expYear = '2025'; + + $response = $card->balanceInquiry()->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode, $response->responseMessage); + } + + // CREDIT SALE (for multi-use token only) + + public function test006ChargeVisaToken() + { + $address = new Address(); + $address->streetAddress1 = '6860 Dallas Pkwy'; + $address->postalCode = '75024'; + + $card = new CreditCardData(); + $card->number = '4012002000060016'; + $card->expMonth = '12'; + $card->expYear = '2025'; + + $response = $card->charge(13.01) + ->withCurrency('USD') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAddress($address) + ->withRequestMultiUseToken(true) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + static::$visaToken = $response->token; + } + + public function test007ChargeMasterCardToken() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = new CreditCardData(); + $card->number = '5473500000000014'; + $card->expMonth = '12'; + $card->expYear = '2025'; + $card->cvn = '123'; + + $response = $card->charge(13.02) + ->withCurrency('USD') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAddress($address) + ->withRequestMultiUseToken(true) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + static::$mastercardToken = $response->token; + } + + public function test008ChargeDiscoverToken() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '750241234'; + + $card = new CreditCardData(); + $card->number = '6011000990156527'; + $card->expMonth = '12'; + $card->expYear = '2025'; + $card->cvn = '123'; + + $response = $card->charge(13.03) + ->withCurrency('USD') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAddress($address) + ->withRequestMultiUseToken(true) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + static::$discoverToken = $response->token; + } + + public function test009ChargeAmexToken() + { + $address = new Address(); + $address->streetAddress1 = '6860 Dallas Pkwy'; + $address->postalCode = '75024'; + + $card = new CreditCardData(); + $card->number = '372700699251018'; + $card->expMonth = '12'; + $card->expYear = '2025'; + $card->cvn = '1234'; + + $response = $card->charge(13.04) + ->withCurrency('USD') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAddress($address) + ->withRequestMultiUseToken(true) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + static::$amexToken = $response->token; + } + + // CREDIT SALE + + public function test010ChargeVisa() + { + $address = new Address(); + $address->streetAddress1 = '6860 Dallas Pkwy'; + $address->postalCode = '75024'; + + $card = null; + if ($this->useTokens) { + $card = new CreditCardData(); + $card->token = static::$visaToken; + } else { + $card = TestCards::visaManual(); + } + + $response = $card->charge(17.01) + ->withCurrency('USD') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + // test case 35 + $void = $response->void()->execute(); + + $this->assertNotNull($void); + $this->assertEquals('00', $void->responseCode); + } + + public function test011ChargeMasterCard() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = null; + if ($this->useTokens) { + $card = new CreditCardData(); + $card->token = static::$mastercardToken; + } else { + $card = TestCards::masterCardManual(); + } + + $response = $card->charge(17.02) + ->withCurrency('USD') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test012ChargeDiscover() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '750241234'; + + $card = null; + if ($this->useTokens) { + $card = new CreditCardData(); + $card->token = static::$discoverToken; + } else { + $card = TestCards::discoverManual(); + } + + $response = $card->charge(17.03) + ->withCurrency('USD') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test013ChargeAmex() + { + $address = new Address(); + $address->streetAddress1 = '6860 Dallas Pkwy'; + $address->postalCode = '75024'; + + $card = null; + if ($this->useTokens) { + $card = new CreditCardData(); + $card->token = static::$amexToken; + } else { + $card = TestCards::amexManual(); + } + + $response = $card->charge(17.04) + ->withCurrency('USD') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test014ChargeJcb() + { + $address = new Address(); + $address->streetAddress1 = '6860 Dallas Pkwy'; + $address->postalCode = '750241234'; + + $card = new CreditCardData(); + $card->number = '3566007770007321'; + $card->expMonth = '12'; + $card->expYear = '2025'; + $card->cvn = '123'; + + $response = $card->charge(17.05) + ->withCurrency('USD') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test011bChargeMasterCard() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::masterCardSeries2Manual(); + + $response = $card->charge(17.02) + ->withCurrency('USD') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // AUTHORIZATION + + + public function test015AuthorizationVisa() + { + $address = new Address(); + $address->streetAddress1 = '6860 Dallas Pkwy'; + $address->postalCode = '75024'; + + $card = TestCards::visaManual(); + + $response = $card->authorize(17.06) + ->withCurrency('USD') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + // test case 15b + $capture = $response->capture()->execute(); + + $this->assertNotNull($capture); + $this->assertEquals('00', $capture->responseCode); + } + + public function test016AuthorizationMasterCard() + { + $address = new Address(); + $address->streetAddress1 = '6860 Dallas Pkwy'; + $address->postalCode = '750241234'; + + $card = TestCards::masterCardManual(); + + $response = $card->authorize(17.07) + ->withCurrency('USD') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + // test case 16b + $capture = $response->capture()->execute(); + + $this->assertNotNull($capture); + $this->assertEquals('00', $capture->responseCode); + } + + public function test017AuthorizationDiscover() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::discoverManual(); + + $response = $card->authorize(17.08) + ->withCurrency('USD') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test016bAuthorizationMasterCard() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::masterCardSeries2Manual(); + + $response = $card->authorize(17.02) + ->withCurrency('USD') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // PARTIALLY APPROVED SALE + + public function test018PartialApprovalVisa() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::visaManual(); + + $response = $card->charge(130) + ->withCurrency('USD') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withAllowPartialAuth(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('10', $response->responseCode); + $this->assertEquals('110.00', $response->authorizedAmount); + } + + public function test019PartialApprovalDiscover() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::discoverManual(); + + $response = $card->charge(145) + ->withCurrency('USD') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withAllowPartialAuth(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('10', $response->responseCode); + $this->assertEquals('65.00', $response->authorizedAmount); + } + + public function test020PartialApprovalMasterCard() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::visaManual(); + + $response = $card->charge(155) + ->withCurrency('USD') + ->withEcommerceInfo($this->ecommerceInfo) + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withAllowPartialAuth(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('10', $response->responseCode); + $this->assertEquals('100.00', $response->authorizedAmount); + + // test case 36 + $void = $response->void()->execute(); + + $this->assertNotNull($void); + $this->assertEquals('00', $void->responseCode); + } + /// LEVEL II CORPORATE PURCHASE CARD + + public function test021LevelIIResponseB() + { + $address = new Address(); + $address->streetAddress1 = '6860 Dallas Pkwy'; + $address->postalCode = '750241234'; + + $card = TestCards::visaManual(); + + $response = $card->charge(112.34) + ->withCurrency('USD') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('B', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withPoNumber('9876543210') + ->withTaxType(TaxType::NOT_USED) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test022LevelIIResponseB() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '750241234'; + + $card = TestCards::visaManual(); + + $response = $card->charge(112.34) + ->withCurrency('USD') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('B', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withTaxType(TaxType::SALES_TAX) + ->withTaxAmount(1.00) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test023LevelIIResponseR() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::visaManual(); + + $response = $card->charge(123.45) + ->withCurrency('USD') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('R', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withTaxType(TaxType::TAX_EXEMPT) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test024LevelIIResponseS() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::visaManual(); + + $response = $card->charge(134.56) + ->withCurrency('USD') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('S', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withPoNumber('9876543210') + ->withTaxType(TaxType::SALES_TAX) + ->withTaxAmount(1.00) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test025LevelIIResponseS() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::masterCardManual(); + + $response = $card->charge(111.06) + ->withCurrency('USD') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('S', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withPoNumber('9876543210') + ->withTaxType(TaxType::NOT_USED) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test026LevelIIResponseS() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::masterCardManual(); + + $response = $card->charge(111.07) + ->withCurrency('USD') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('S', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withTaxType(TaxType::SALES_TAX) + ->withTaxAmount(1.00) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test027LevelIIResponseS() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::masterCardManual(); + + $response = $card->charge(111.08) + ->withCurrency('USD') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('S', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withPoNumber('9876543210') + ->withTaxType(TaxType::SALES_TAX) + ->withTaxAmount(1.00) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test028LevelIIResponseS() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::masterCardManual(); + + $response = $card->charge(111.09) + ->withCurrency('USD') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('S', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withPoNumber('9876543210') + ->withTaxType(TaxType::TAX_EXEMPT) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test029LevelIINoResponse() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::amexManual(); + + $response = $card->charge(111.10) + ->withCurrency('USD') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('0', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withPoNumber('9876543210') + ->withTaxType(TaxType::NOT_USED) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test030LevelIINoResponse() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '750241234'; + + $card = TestCards::amexManual(); + + $response = $card->charge(111.11) + ->withCurrency('USD') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('0', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withTaxType(TaxType::SALES_TAX) + ->withTaxAmount(1.00) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test031LevelIINoResponse() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::amexManual(); + + $response = $card->charge(111.12) + ->withCurrency('USD') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('0', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withPoNumber('9876543210') + ->withTaxType(TaxType::SALES_TAX) + ->withTaxAmount(1.00) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function test032LevelIINoResponse() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::amexManual(); + + $response = $card->charge(111.13) + ->withCurrency('USD') + ->withAddress($address) + ->withCommercialRequest(true) + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('0', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withPoNumber('9876543210') + ->withTaxType(TaxType::TAX_EXEMPT) + ->execute(); + + $this->assertEquals(true, $cpcResponse != null); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + /// PRIOR / VOICE AUTHORIZATION + + public function test033OfflineSale() + { + $card = TestCards::visaManual(); + + $response = $card->charge(17.10) + ->withCurrency('USD') + ->withModifier(TransactionModifier::OFFLINE) + ->withOfflineAuthCode('654321') + ->withInvoiceNumber('123456') + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test033OfflineAuthorization() + { + $card = TestCards::visaManual(); + + $response = $card->authorize(17.10) + ->withCurrency('USD') + ->withModifier(TransactionModifier::OFFLINE) + ->withOfflineAuthCode('654321') + ->withInvoiceNumber('123456') + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// RETURN + + public function test034OfflineCreditReturn() + { + $card = TestCards::masterCardManual(); + + $response = $card->refund(15.15) + ->withCurrency('USD') + ->withInvoiceNumber('123456') + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test034bOfflineCreditReturn() + { + $card = TestCards::masterCardManual(); + + $response = $card->refund(15.16) + ->withCurrency('USD') + ->withInvoiceNumber('123456') + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// ONLINE VOID / REVERSAL + + public function test035VoidTest10() + { + // see test 010 + } + + public function test036VoidTest20() + { + // see test 020 + } + + /// Time Out Reversal + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\UnsupportedTransactionException + */ + public function test036bTimeoutReversal() + { + $sale = TestCards::visaManual()->charge(911) + ->withCurrency('USD') + ->withClientTransactionId('987321654') + ->withEcommerceInfo($this->ecommerceInfo) + ->execute(); + + $this->assertEquals(true, $sale != null); + $this->assertEquals('91', $sale->responseCode); + + $response = Transaction::fromId(null, PaymentMethodType::CREDIT); + $response->clientTransactionId = '987321654'; + + $response->reverse(911)->execute(); + } + + /// One time bill payment + + public function test010ChargeVisaOneTime() + { + $address = new Address(); + $address->streetAddress1 = '6860 Dallas Pkwy'; + $address->postalCode = '75024'; + + $card = null; + if ($this->useTokens) { + $card = new CreditCardData(); + $card->token = static::$visaToken; + } else { + $card = TestCards::visaManual(); + } + + $response = $card->charge(13.11) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withOneTimePayment(true) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + + $void = $response->void()->execute(); + + $this->assertEquals(true, $void != null); + $this->assertEquals('00', $void->responseCode); + } + + public function test011ChargeMasterCardOneTime() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '750241234'; + + $card = null; + if ($this->useTokens) { + $card = new CreditCardData(); + $card->token = static::$mastercardToken; + } else { + $card = TestCards::masterCardManual(); + } + + $response = $card->charge(13.12) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withOneTimePayment(true) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test012ChargeDiscoverOneTime() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = null; + if ($this->useTokens) { + $card = new CreditCardData(); + $card->token = static::$discoverToken; + } else { + $card = TestCards::discoverManual(); + } + + $response = $card->charge(13.13) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withOneTimePayment(true) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test013ChargeAmexOneTime() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = null; + if ($this->useTokens) { + $card = new CreditCardData(); + $card->token = static::$amexToken; + } else { + $card = TestCards::amexManual(); + } + + $response = $card->charge(13.14) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withOneTimePayment(true) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test014ChargeJcbOneTime() + { + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = new CreditCardData(); + $card->number = '3566007770007321'; + $card->expMonth = '12'; + $card->expYear = '2025'; + $card->cvn = '123'; + + $response = $card->charge(13.15) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withOneTimePayment(true) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// ADVANCED FRAUD SCREENING + + /** + * TODO: Change code assertions when AFS is enabled on account + */ + public function test037FraudPreventionSale() + { + $card = TestCards::visaManual(); + + $response = $card->charge(15000) + ->withCurrency('USD') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + // $this->assertEquals('FR', $response->responseCode); + } + + /** + * TODO: Change code assertions when AFS is enabled on account + */ + public function test038FraudPreventionReturn() + { + $card = TestCards::visaManual(); + + $response = $card->refund(15000) + ->withCurrency('USD') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + // $this->assertEquals('41', $response->responseCode); + } + + /// ONE CARD - GSB CARD FUNCTIONS + + /// BALANCE INQUIRY + + public function test037BalanceInquiryGsb() + { + if (false === $this->usePrepaid) { + $this->markTestSkipped('GSB not configured'); + } + + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::gsbManual(); + + $response = $card->balanceInquiry() + ->withAddress($address) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// ADD VALUE + + public function test038AddValueGsb() + { + if (false === $this->usePrepaid) { + $this->markTestSkipped('GSB not configured'); + } + + $card = new CreditTrackData(); + $card->value = '%B6277220572999800^ / ^49121010557010000016000000?F;6277220572999800=49121010557010000016?'; + + $response = $card->addValue(15.00) + ->withCurrency('USD') + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// SALE + + public function test039ChargeGsb() + { + if (false === $this->usePrepaid) { + $this->markTestSkipped('GSB not configured'); + } + + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::gsbManual(); + + $response = $card->charge(2.05) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber('123456') + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + + $voidResponse = $response->void() + ->execute(); + $this->assertEquals(true, $voidResponse != null); + $this->assertEquals('00', $voidResponse->responseCode); + } + + public function test040ChargeGsb() + { + if (false === $this->usePrepaid) { + $this->markTestSkipped('GSB not configured'); + } + + $address = new Address(); + $address->streetAddress1 = '6860'; + $address->postalCode = '75024'; + + $card = TestCards::gsbManual(); + + $response = $card->charge(2.10) + ->withCurrency('USD') + ->withAddress($address) + ->withInvoiceNumber('123456') + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// ONLINE VOID / REVERSAL + + public function test041VoidGsb() + { + // see test 039 + } + + /// HMS GIFT - REWARDS + + /// ACTIVATE + + public function test042ActivateGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->activate(6.00) + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test043ActivateGift2() + { + + $card = TestCards::giftCard2Manual(); + + $response = $card->activate(7.00) + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// LOAD / ADD VALUE + + public function test044AddValueGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->addValue(8.00) + ->withCurrency('USD') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test045AddValueGift2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->addValue(9.00) + ->withCurrency('USD') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// BALANCE INQUIRY + + public function test046BalanceInquiryGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->balanceInquiry() + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('10.00', $response->balanceAmount); + } + + public function test047BalanceInquiryGift2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->balanceInquiry() + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('10.00', $response->balanceAmount); + } + + /// REPLACE / TRANSFER + + public function test048ReplaceGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->replaceWith(TestCards::giftCard2Manual()) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('10.00', $response->balanceAmount); + } + + public function test049ReplaceGift2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->replaceWith(TestCards::giftCard1Swipe()) + ->execute(); + + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('10.00', $response->balanceAmount); + } + + /// SALE / REDEEM + + public function test050SaleGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->charge(1.00) + ->withCurrency('USD') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test051SaleGift2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->charge(2.00) + ->withCurrency('USD') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test052SaleGift1Void() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->charge(3.00) + ->withCurrency('USD') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + + $voidResponse = $response->void() + ->execute(); + $this->assertEquals(true, $voidResponse != null); + $this->assertEquals('00', $voidResponse->responseCode); + } + + public function test053SaleGift2Reversal() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->charge(4.00) + ->withCurrency('USD') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + + $reversalResponse = $response->reverse(4.00) + ->execute(); + $this->assertEquals(true, $reversalResponse != null); + $this->assertEquals('00', $reversalResponse->responseCode); + } + + /// VOID + + public function test054VoidGift() + { + // see test 052 + } + + /// REVERSAL + + public function test055ReversalGift() + { + // see test 053 + } + + public function test056ReversalGift2() + { + $card = TestCards::giftCard2Manual(); + + $reversalResponse = $card->reverse(2.00) + ->execute(); + $this->assertEquals(true, $reversalResponse != null); + $this->assertEquals('00', $reversalResponse->responseCode); + } + + /// DEACTIVATE + + public function test057DeactivateGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->deactivate() + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// RECEIPTS MESSAGING + + public function test058ReceiptsMessaging() + { + return; # print and scan receipt for test 51 + } + + /// REWARD + + /// BALANCE INQUIRY + + public function test059BalanceInquiryRewards1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->balanceInquiry() + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('0', $response->pointsBalanceAmount); + } + + public function test060BalanceInquiryRewards2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->balanceInquiry() + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('0', $response->pointsBalanceAmount); + } + + /// ALIAS + + public function test061CreateAliasGift1() + { + $response = GiftCard::create('9725550100'); + + $this->assertEquals(true, $response != null); + } + + public function test062CreateAliasGift2() + { + $response = GiftCard::create('9725550100'); + + $this->assertEquals(true, $response != null); + } + + public function test063AddAliasGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->addAlias('2145550199') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test064AddAliasGift2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->addAlias('2145550199') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test065DeleteAliasGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->removeAlias('2145550199') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// SALE / REDEEM + + public function test066RedeemPointsGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->charge(100) + ->withCurrency('POINTS') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test067RedeemPointsGift2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->charge(200) + ->withCurrency('POINTS') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test068RedeemPointsGift2() + { + $card = new GiftCard(); + $card->alias = '9725550100'; + + $response = $card->charge(300) + ->withCurrency('POINTS') + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// REWARDS + + public function test069RewardsGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->rewards(10) + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test070RewardsGift2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->rewards(11) + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// REPLACE / TRANSFER + + public function test071ReplaceGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->replaceWith(TestCards::giftCard2Manual()) + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test072ReplaceGift2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->replaceWith(TestCards::giftCard1Swipe()) + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// DEACTIVATE + + public function test073DeactivateGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->deactivate() + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + public function test074DeactivateGift2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->deactivate() + ->execute(); + $this->assertEquals(true, $response != null); + $this->assertEquals('00', $response->responseCode); + } + + /// RECEIPTS MESSAGING + + public function test075ReceiptsMessaging() + { + return; # print and scan receipt for test 51 + } + + /// CLOSE BATCH + + public function test999CloseBatch() + { + try { + $response = BatchService::closeBatch(); + $this->assertNotNull($response); + // printf('batch id: %s', $response->id); + // printf('sequence number: %s', $response->sequenceNumber); + } catch (ApiException $e) { + if (false === strpos($e->getMessage(), static::BATCH_NOT_OPEN) + || false === strpos($e->getMessage(), static::NO_TRANS_IN_BATCH) + ) { + $this->fail($e->getMessage()); + } + } + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/RecurringTest.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/RecurringTest.php new file mode 100644 index 0000000..c09bd45 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/RecurringTest.php @@ -0,0 +1,560 @@ +identifierBase, $this->todayDate, $identifier); + } + + /** + * @return ServicesConfig + */ + private function config() + { + $config = new ServicesConfig(); + $config->secretApiKey = 'skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A'; + $config->serviceUrl = ($this->enableCryptoUrl) ? + 'https://cert.api2-c.heartlandportico.com/': + 'https://cert.api2.heartlandportico.com'; + return $config; + } + + protected function setup() + { + ServicesContainer::configure($this->config()); + + $this->todayDate = date('Ymd'); + $this->identifierBase = substr( + sprintf('%s-%%s', GenerationUtils::getGuid()), + 0, + 10 + ); + } + + public function test000CleanUp() + { + try { + $results = Schedule::findAll(); + foreach ($results as $schedule) { + $schedule->delete(true); + } + } catch (\Exception $e) { + } + + try { + $results = RecurringPaymentMethod::findAll(); + foreach ($results as $paymentMethod) { + $paymentMethod->delete(true); + } + } catch (\Exception $e) { + } + + try { + $results = Customer::findAll(); + foreach ($results as $customer) { + $customer->delete(true); + } + } catch (\Exception $e) { + } + } + + // CUSTOMER SETUP + + public function test001AddCustomerPerson() + { + $customer = new Customer(); + $customer->id = $this->getIdentifier('Person'); + $customer->firstName = 'John'; + $customer->lastName = 'Doe'; + $customer->status = 'Active'; + $customer->email = 'john.doe@example.com'; + $customer->address = new Address(); + $customer->address->streetAddress1 = '123 Main St.'; + $customer->address->city = 'Dallas'; + $customer->address->province = 'TX'; + $customer->address->postalCode = '75024'; + $customer->address->country = 'USA'; + $customer->workPhone = '5551112222'; + + $customer = $customer->create(); + + $this->assertNotNull($customer); + $this->assertNotNull($customer->key); + static::$customerPerson = $customer; + + $found = Customer::find($customer->id); + $this->assertNotNull($found); + } + + public function test002AddCustomerBusiness() + { + $customer = new Customer(); + $customer->id = $this->getIdentifier('Business'); + $customer->company = 'AcmeCo'; + $customer->status = 'Active'; + $customer->email = 'john.doe@example.com'; + $customer->address = new Address(); + $customer->address->streetAddress1 = '987 Elm St.'; + $customer->address->city = 'Princeton'; + $customer->address->province = 'NJ'; + $customer->address->postalCode = '12345'; + $customer->address->country = 'USA'; + $customer->workPhone = '5551112222'; + + $customer = $customer->create(); + + $this->assertNotNull($customer); + $this->assertNotNull($customer->key); + static::$customerBusiness = $customer; + } + + // PAYMENT METHOD SETUP + + public function test003AddPaymentCreditVisa() + { + if (static::$customerPerson === null) { + $this->markTestIncomplete(); + } + + $card = new CreditCardData(); + $card->number = '4012002000060016'; + $card->expMonth = '12'; + $card->expYear = '2025'; + + $paymentMethod = static::$customerPerson->addPaymentMethod( + $this->getIdentifier('CreditV'), + $card + )->create(); + + $this->assertNotNull($paymentMethod); + $this->assertNotNull($paymentMethod->key); + static::$paymentMethodVisa = $paymentMethod; + } + + public function test004AddPaymentCreditMasterCard() + { + if (static::$customerPerson === null) { + $this->markTestIncomplete(); + } + + $card = new CreditCardData(); + $card->number = '5473500000000014'; + $card->expMonth = '12'; + $card->expYear = '2025'; + + $paymentMethod = static::$customerPerson->addPaymentMethod( + $this->getIdentifier('CreditMC'), + $card + )->create(); + + $this->assertNotNull($paymentMethod); + $this->assertNotNull($paymentMethod->key); + static::$paymentMethodMasterCard = $paymentMethod; + } + + public function test005AddPaymentCheckPpd() + { + if (static::$customerPerson === null) { + $this->markTestIncomplete(); + } + + $check = new ECheck(); + $check->accountType = AccountType::CHECKING; + $check->checkType = CheckType::PERSONAL; + $check->secCode = SecCode::PPD; + $check->routingNumber = '122000030'; + $check->driversLicenseNumber = '7418529630'; + $check->driversLicenseState = 'TX'; + $check->accountNumber = '1357902468'; + $check->birthYear = 1989; + + $paymentMethod = static::$customerPerson->addPaymentMethod( + $this->getIdentifier('CheckPpd'), + $check + )->create(); + + $this->assertNotNull($paymentMethod); + $this->assertNotNull($paymentMethod->key); + static::$paymentMethodCheckPpd = $paymentMethod; + } + + public function test006AddPaymentCheckCcd() + { + if (static::$customerBusiness === null) { + $this->markTestIncomplete(); + } + + $check = new eCheck(); + $check->accountType = AccountType::CHECKING; + $check->checkType = CheckType::BUSINESS; + $check->secCode = SecCode::CCD; + $check->routingNumber = '122000030'; + $check->driversLicenseNumber = '7418529630'; + $check->driversLicenseState = 'TX'; + $check->accountNumber = '1357902468'; + $check->birthYear = 1989; + + $paymentMethod = static::$customerBusiness->addPaymentMethod( + $this->getIdentifier('CheckCcd'), + $check + )->create(); + + $this->assertNotNull($paymentMethod); + $this->assertNotNull($paymentMethod->key); + static::$paymentMethodCheckCcd = $paymentMethod; + } + + // PAYMENT SETUP - DECLINED + + /** + * expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function test007AddPaymentCheckPpd() + { + if (static::$customerPerson === null) { + $this->markTestIncomplete(); + } + + $check = new eCheck(); + $check->accountType = AccountType::CHECKING; + $check->checkType = CheckType::PERSONAL; + $check->secCode = SecCode::PPD; + $check->routingNumber = '122000030'; + $check->driversLicenseNumber = '7418529630'; + $check->driversLicenseState = 'TX'; + $check->accountNumber = '1357902468'; + $check->birthYear = 1989; + + static::$customerPerson->addPaymentMethod( + $this->getIdentifier('CheckPpd'), + $check + )->create(); + } + + // Recurring Billing using PayPlan - Managed Schedule + + public function test008AddScheduleCreditVisa() + { + if (static::$paymentMethodVisa === null) { + $this->markTestIncomplete(); + } + + $schedule = static::$paymentMethodVisa->addSchedule( + $this->getIdentifier('CreditV') + ) + ->withStatus('Active') + ->withAmount(30.02) + ->withCurrency('USD') + ->withStartDate(\DateTime::createFromFormat('Y-m-d', '2027-02-01')) + ->withFrequency(ScheduleFrequency::WEEKLY) + ->withEndDate(\DateTime::createFromFormat('Y-m-d', '2027-04-01')) + ->withReprocessingCount(2) + ->create(); + + $this->assertNotNull($schedule); + $this->assertNotNull($schedule->key); + static::$scheduleVisa = $schedule; + } + + public function test009AddScheduleCreditMasterCard() { + if (static::$paymentMethodMasterCard == null) { + $this->markTestIncomplete(); + } + + $schedule = static::$paymentMethodMasterCard->addSchedule( + $this->getIdentifier('CreditMC') + ) + ->withStatus('Active') + ->withAmount(30.02) + ->withCurrency('USD') + ->withStartDate(\DateTime::createFromFormat('Y-m-d', '2027-02-01')) + ->withFrequency(ScheduleFrequency::WEEKLY) + ->withEndDate(\DateTime::createFromFormat('Y-m-d', '2027-04-01')) + ->withReprocessingCount(2) + ->create(); + $this->assertNotNull($schedule); + $this->assertNotNull($schedule->key); + static::$scheduleMasterCard = $schedule; + } + + public function test010AddScheduleCheckPPD() { + if (static::$paymentMethodCheckPpd == null) { + $this->markTestIncomplete(); + } + + $schedule = static::$paymentMethodCheckPpd->addSchedule( + $this->getIdentifier('CheckPPD') + ) + ->withStatus('Active') + ->withAmount(30.03) + ->withCurrency('USD') + ->withStartDate(\DateTime::createFromFormat('Y-m-d', '2027-02-01')) + ->withFrequency(ScheduleFrequency::MONTHLY) + ->withReprocessingCount(1) + ->withNumberOfPayments(2) + ->create(); + $this->assertNotNull($schedule); + $this->assertNotNull($schedule->key); + static::$scheduleCheckPpd = $schedule; + } + + public function test011AddScheduleCheckCCD() { + if (static::$paymentMethodCheckCcd == null) { + $this->markTestIncomplete(); + } + + $schedule = static::$paymentMethodCheckCcd->addSchedule( + $this->getIdentifier('CheckCCD') + ) + ->withStatus('Active') + ->withAmount(30.04) + ->withCurrency('USD') + ->withStartDate(\DateTime::createFromFormat('Y-m-d', '2027-02-01')) + ->withFrequency(ScheduleFrequency::BI_WEEKLY) + ->withReprocessingCount(1) + ->create(); + $this->assertNotNull($schedule); + $this->assertNotNull($schedule->key); + static::$scheduleCheckCcd = $schedule; + } + + /** + * expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function test012AddScheduleCreditVisa() { + if (static::$paymentMethodVisa == null) { + $this->markTestIncomplete(); + } + + $schedule = static::$paymentMethodVisa->addSchedule( + $this->getIdentifier('CreditV') + ) + ->withStartDate(\DateTime::createFromFormat('Y-m-d', '2027-02-01')) + ->withAmount(30.01) + ->withCurrency('USD') + ->withFrequency(ScheduleFrequency::WEEKLY) + ->withReprocessingCount(1) + ->withStatus('Active') + ->create(); + } + + /** + * expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function test013AddScheduleCCheckPPD() { + if (static::$paymentMethodCheckPpd == null) { + $this->markTestIncomplete(); + } + + $schedule = static::$paymentMethodCheckPpd->addSchedule( + $this->getIdentifier('CheckPPD') + ) + ->withStatus('Active') + ->withAmount(30.03) + ->withCurrency('USD') + ->withStartDate(\DateTime::createFromFormat('Y-m-d', '2027-02-01')) + ->withFrequency(ScheduleFrequency::MONTHLY) + ->withReprocessingCount(1) + ->withNumberOfPayments(2) + ->create(); + } + + // Recurring Billing using PayPlan - Managed Schedule + + public function test014RecurringBillingVisa() { + if (static::$paymentMethodVisa == null || static::$scheduleVisa == null) { + $this->markTestIncomplete(); + } + + $response = static::$paymentMethodVisa->charge(20.01) + ->withCurrency('USD') + ->withScheduleId(static::$scheduleVisa->key) + ->withOneTimePayment(false) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test015RecurringBillingMasterCard() { + if (true || static::$paymentMethodMasterCard == null || static::$scheduleMasterCard == null) { + $this->markTestIncomplete(); + } + + $response = static::$paymentMethodMasterCard->charge(20.02) + ->withCurrency('USD') + ->withScheduleId(static::$scheduleVisa->key) + ->withOneTimePayment(false) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test016RecurringBillingCheckPPD() { + if (static::$paymentMethodCheckPpd == null || static::$scheduleCheckPpd == null) { + $this->markTestIncomplete(); + } + + $response = static::$paymentMethodCheckPpd->charge(20.03) + ->withCurrency('USD') + ->withScheduleId(static::$scheduleVisa->key) + ->withOneTimePayment(false) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test017RecurringBillingCheckCCD() { + if (static::$paymentMethodCheckCcd == null || static::$scheduleCheckCcd == null) { + $this->markTestIncomplete(); + } + + $response = static::$paymentMethodCheckCcd->charge(20.04) + ->withCurrency('USD') + ->withScheduleId(static::$scheduleVisa->key) + ->withOneTimePayment(false) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // One time bill payment + + public function test018RecurringBillingVisa() { + if (static::$paymentMethodVisa == null) { + $this->markTestIncomplete(); + } + + $response = static::$paymentMethodVisa->charge(20.06) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test019RecurringBillingMasterCard() { + if (static::$paymentMethodMasterCard == null) { + $this->markTestIncomplete(); + } + + $response = static::$paymentMethodMasterCard->charge(20.07) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test020RecurringBillingCheckPPD() { + if (static::$paymentMethodCheckPpd == null) { + $this->markTestIncomplete(); + } + + $response = static::$paymentMethodCheckPpd->charge(20.08) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function test021RecurringBillingCheckCCD() { + if (static::$paymentMethodCheckCcd == null) { + $this->markTestIncomplete(); + } + + $response = static::$paymentMethodCheckCcd->charge(20.09) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // Onetime bill payment - declined + + public function test022RecurringBillingVisa_Decline() { + if (static::$paymentMethodVisa == null) { + $this->markTestIncomplete(); + } + + $response = static::$paymentMethodVisa->charge(10.08) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('51', $response->responseCode); + } + + public function test023RecurringBillingCheckPPD_Decline() { + if (true || static::$paymentMethodCheckPpd == null) { + $this->markTestIncomplete(); + } + + $response = static::$paymentMethodCheckPpd->charge(25.02) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('1', $response->responseCode); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/RetailTest.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/RetailTest.php new file mode 100644 index 0000000..bf52611 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/RetailTest.php @@ -0,0 +1,1982 @@ +secretApiKey = 'skapi_cert_MaePAQBr-1QAqjfckFC8FTbRTT120bVQUlfVOjgCBw'; + $config->serviceUrl = ($this->enableCryptoUrl) ? + 'https://cert.api2-c.heartlandportico.com/': + 'https://cert.api2.heartlandportico.com'; + ServicesContainer::Configure($config); + } + + public function testRetail000CloseBatch() + { + try { + $response = BatchService::closeBatch(); + $this->assertNotNull($response); + // error_log(sprintf('Batch ID: %s', $response->Id)); + // error_log(sprintf('Sequence Number: %s', $response->sequenceNumber)); + } catch (ApiException $e) { + if (false === strpos($e->getMessage(), static::BATCH_NOT_OPEN) + && false === strpos($e->getMessage(), static::NO_TRANS_IN_BATCH) + ) { + $this->fail($e->getMessage()); + } + } + } + + /* + CREDIT CARD FUNCTIONS + CARD VERIFY + ACCOUNT VERIFICATION + */ + + public function testRetail001CardVerifyVisa() + { + $visaenc = TestCards::visaSwipeEncrypted(); + + $response = $visaenc->verify() + ->withAllowDuplicates(true) + ->withRequestMultiUseToken(static::$useTokens) + ->execute(); + $this->assertNotNull($response, '$response is null'); + $this->assertEquals('00', $response->responseCode, $response->responseMessage); + + if (static::$useTokens) { + $this->assertNotNull($response->token, 'token is null'); + + $token = new CreditCardData(); + $token->token = $response->token; + + $saleResponse = $token->charge(15.01) + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals('00', $saleResponse->responseCode); + } + } + + public function testRetail002CardVerifyMastercardSwipe() + { + $cardenc = TestCards::masterCardSwipeEncrypted(); + + $response = $cardenc->verify() + ->withAllowDuplicates(true) + ->withRequestMultiUseToken(static::$useTokens) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + if (static::$useTokens) { + $this->assertNotNull($response->token); + + $token = new CreditCardData(); + $token->token = $response->token; + + $saleResponse = $token->charge(15.02) + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals('00', $saleResponse->responseCode); + } + } + + public function testRetail003CardVerifyDiscover() + { + $discoverenc = TestCards::discoverSwipeEncrypted(); + + $response = $discoverenc->verify() + ->withAllowDuplicates(true) + ->withRequestMultiUseToken(static::$useTokens) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + if (static::$useTokens) { + $this->assertNotNull($response->token); + + $token = new CreditCardData(); + $token->token = $response->token; + + $saleResponse = $token->charge(15.03) + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals('00', $saleResponse->responseCode); + } + } + + // Address Verification + + public function testRetail004CardVerifyAmex() + { + $address = new Address(); + $address->postalCode = '75024'; + + $manualamex = TestCards::amexManual(false, true); + + $response = $manualamex->verify() + ->withAllowDuplicates(true) + ->withAddress($address) + ->withRequestMultiUseToken(static::$useTokens) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + if (static::$useTokens) { + $this->assertNotNull($response->token); + + $token = new CreditCardData(); + $token->token = $response->token; + + $saleResponse = $token->charge(15.04) + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals('00', $saleResponse->responseCode); + } + } + + // Balance Inquiry (for Prepaid) + + public function testRetail005BalanceInquiryVisa() + { + $visaenc = TestCards::visaSwipeEncrypted(); + + $response = $visaenc->balanceInquiry()->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // CREDIT SALE (For multi-use token only) + + public function testRetail006ChargeVisaSwipeToken() + { + $card = TestCards::visaSwipe(); + $response = $card->charge(15.01) + ->withCurrency('USD') + ->withRequestMultiUseToken(true) + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + static::$visatoken = $response->token; + } + + public function testRetail007ChargeMastercardSwipeToken() + { + $card = TestCards::masterCardSwipe(); + $response = $card->charge(15.02) + ->withCurrency('USD') + ->withRequestMultiUseToken(true) + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + static::$mastercardtoken = $response->token; + } + + public function testRetail008ChargeDiscoverSwipeToken() + { + $card = TestCards::discoverSwipe(); + $response = $card->charge(15.03) + ->withCurrency('USD') + ->withRequestMultiUseToken(true) + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + static::$discovertoken = $response->token; + } + + public function testRetail009ChargeAmexSwipeToken() + { + $card = TestCards::amexSwipe(); + $response = $card->charge(15.04) + ->withCurrency('USD') + ->withRequestMultiUseToken(true) + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + static::$amextoken = $response->token; + } + + /* + CREDIT SALE + SWIPED + */ + + public function testRetail010ChargeVisaSwipe() + { + $card = TestCards::visaSwipe(); + $response = $card->charge(15.01) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + // test 59 + $reverse = $response->reverse(15.01) + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($reverse); + $this->assertEquals('00', $reverse->responseCode); + } + + public function testRetail011ChargeMastercardSwipe() + { + $card = TestCards::masterCardSwipe(); + $response = $card->charge(15.02) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail012ChargeDiscoverSwipe() + { + $card = TestCards::discoverSwipe(); + $response = $card->charge(15.03) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail013ChargeAmexSwipe() + { + $card = TestCards::amexSwipe(); + $response = $card->charge(15.04) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail014ChargeJcbSwipe() + { + $card = TestCards::JcbSwipe(); + $response = $card->charge(15.05) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + // test case 58 + $refund = $response->refund(15.05) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($refund); + $this->assertEquals('00', $refund->responseCode); + } + + public function testRetail014aChargeRetailMastercard24() + { + $card = TestCards::masterCard24Swipe(); + $response = $card->charge(15.34) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail014bChargeRetailMastercard25() + { + $card = TestCards::masterCard25Swipe(); + $response = $card->charge(15.34) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail015ChargeVisaSwipe() + { + $card = TestCards::visaSwipe(); + $response = $card->charge(15.06) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + // test case 63 + $reversal = $response->reverse(15.06) + ->withAllowDuplicates(true) + ->withAuthAmount(5.06) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // Manually Entered - Card Present + + public function testRetail016ChargeVisaManualCardPresent() + { + $address = new Address(); + $address->postalCode = '750241234'; + $address->streetAddress1 = '6860 Dallas Pkwy'; + + $manualcard = TestCards::visaManual(true, true); + $response = $manualcard->charge(16.01) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail017ChargeMasterCardManualCardPresent() + { + $address = new Address(); + $address->postalCode = '75024'; + $address->streetAddress1 = '6860 Dallas Pkwy'; + + $manualcard = TestCards::masterCardManual(true, true); + $response = $manualcard->charge(16.02) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + // test case 60 + $reverse = $response->reverse(16.02) + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($reverse); + $this->assertEquals('00', $reverse->responseCode); + } + + public function testRetail018ChargeDiscoverManualCardPresent() + { + $address = new Address(); + $address->postalCode = '750241234'; + + $manualcard = TestCards::discoverManual(true, true); + $response = $manualcard->charge(16.03) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail019ChargeAmexManualCardPresent() + { + $address = new Address(); + $address->postalCode = '75024'; + $address->streetAddress1 = '6860'; + + $manualcard = TestCards::amexManual(true, true); + $response = $manualcard->charge(16.04) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail020ChargeJcbManualCardPresent() + { + $address = new Address(); + $address->postalCode = '75024'; + + $manualcard = TestCards::JcbManual(true, true); + $response = $manualcard->charge(16.05) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail021ChargeDiscoverManualCardPresent() + { + $address = new Address(); + $address->postalCode = '750241234'; + $address->streetAddress1 = '6860 Dallas Pkwy'; + + $manualcard = TestCards::discoverManual(true, true); + $response = $manualcard->charge(16.07) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + // test case 64 + $reversal = $response->reverse(16.07) + ->withAllowDuplicates(true) + ->withAuthAmount(6.07) + ->execute(); + $this->assertNotNull($reversal); + $this->assertEquals('00', $reversal->responseCode); + } + + // Manually Entered - Card Not Present + + public function testRetail022ChargeVisaManualCardNotPresent() + { + $address = new Address(); + $address->postalCode = '750241234'; + $address->streetAddress1 = '6860 Dallas Pkwy'; + + $manualcard = null; + if (static::$useTokens) { + $manualcard = new CreditCardData(); + $manualcard->token = static::$visatoken; + } else { + $manualcard = TestCards::visaManual(false, true); + } + + $response = $manualcard->charge(17.01) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail023ChargeMasterCardManualCardNotPresent() + { + $address = new Address(); + $address->postalCode = '75024'; + $address->streetAddress1 = '6860 Dallas Pkwy'; + + $manualcard = null; + if (static::$useTokens) { + $manualcard = new CreditCardData(); + $manualcard->token = static::$mastercardtoken; + } else { + $manualcard = TestCards::masterCardManual(false, true); + } + + $response = $manualcard->charge(17.02) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + // test case 61 + $reversal = $response->reverse(17.02) + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($reversal); + $this->assertEquals('00', $reversal->responseCode); + } + + public function testRetail024ChargeDiscoverManualCardNotPresent() + { + $address = new Address(); + $address->postalCode = '750241234'; + + $manualcard = null; + if (static::$useTokens) { + $manualcard = new CreditCardData(); + $manualcard->token = static::$discovertoken; + } else { + $manualcard = TestCards::discoverManual(false, true); + } + + $response = $manualcard->charge(17.03) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail025ChargeAmexManualCardNotPresent() + { + $address = new Address(); + $address->postalCode = '75024'; + $address->streetAddress1 = '6860'; + + $manualcard = null; + if (static::$useTokens) { + $manualcard = new CreditCardData(); + $manualcard->token = static::$amextoken; + } else { + $manualcard = TestCards::amexManual(false, true); + } + + $response = $manualcard->charge(17.04) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail026ChargeJcbManualCardNotPresent() + { + $address = new Address(); + $address->postalCode = '75024'; + + $manualcard = TestCards::JcbManual(false, true); + $response = $manualcard->charge(17.05) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // Contactless + + public function testRetail027ChargeVisaContactless() + { + $card = TestCards::visaSwipe(EntryMethod::PROXIMITY); + $response = $card->charge(18.01) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail028ChargeMastercardContactless() + { + $card = TestCards::masterCardSwipe(EntryMethod::PROXIMITY); + + $response = $card->charge(18.02) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail029ChargeDiscoverContactless() + { + $card = TestCards::discoverSwipe(EntryMethod::PROXIMITY); + + $response = $card->charge(18.03) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail030ChargeAmexContactless() + { + $card = TestCards::amexSwipe(EntryMethod::PROXIMITY); + + $response = $card->charge(18.04) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // AUTHORIZATION + + public function testRetail031AuthorizeVisaSwipe() + { + $card = TestCards::visaSwipe(); + + // 031a authorize + $response = $card->authorize(15.08) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + // 031b capture + $captureResponse = $response->capture()->execute(); + $this->assertNotNull($captureResponse); + $this->assertEquals('00', $captureResponse->responseCode); + } + + public function testRetail032AuthorizeVisaSwipeAdditionalAuth() + { + $card = TestCards::visaSwipe(); + + // 032a authorize + $response = $card->authorize(15.09) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + // 032b Additional Auth (restaurant only) + + // 032c Add to batch + $captureResponse = $response->capture()->execute(); + $this->assertNotNull($captureResponse); + $this->assertEquals('00', $captureResponse->responseCode); + } + + public function testRetail033AuthorizeMasterCardSwipe() + { + $card = TestCards::masterCardSwipe(); + + // 033a authorize + $response = $card->authorize(15.10) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + // 033b capture + $captureResponse = $response->capture()->execute(); + $this->assertNotNull($captureResponse); + $this->assertEquals('00', $captureResponse->responseCode); + } + + public function testRetail033aAuthorizeDiscoverSwipe() + { + $card = TestCards::discoverSwipe(); + + $response = $card->authorize(15.10) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // AUTHORIZATION - Manually Entered, Card Present + + public function testRetail034AuthorizeVisaManualCardPresent() + { + $address = new Address(); + $address->postalCode = '75024'; + $address->streetAddress1 = '6860 Dallas Pkwy'; + + $card = TestCards::visaManual(true, true); + + // 034a authorize + $response = $card->authorize(16.08) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + // 034b capture + $captureResponse = $response->capture()->execute(); + $this->assertNotNull($captureResponse); + $this->assertEquals('00', $captureResponse->responseCode); + } + + public function testRetail035AuthorizeVisaManualCardPresentAdditionalAuth() + { + $address = new Address(); + $address->postalCode = '75024'; + $address->streetAddress1 = '6860 Dallas Pkwy'; + + $card = TestCards::visaManual(true, true); + + // 035a authorize + $response = $card->authorize(16.09) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + // 035b Additional Auth (restaurant only) + + // 035c Add to batch + $captureResponse = $response->capture()->execute(); + $this->assertNotNull($captureResponse); + $this->assertEquals('00', $captureResponse->responseCode); + } + + public function testRetail036AuthorizeMasterCardManualCardPresent() + { + $address = new Address(); + $address->postalCode = '75024'; + $address->streetAddress1 = '6860 Dallas Pkwy'; + + $card = TestCards::masterCardManual(true, true); + + // 036a authorize + $response = $card->authorize(16.10) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + // 036b capture + $captureResponse = $response->capture()->execute(); + $this->assertNotNull($captureResponse); + $this->assertEquals('00', $captureResponse->responseCode); + } + + public function testRetail036aAuthorizeDiscoverManualCardPresent() + { + $address = new Address(); + $address->postalCode = '750241234'; + + $card = TestCards::discoverManual(true, true); + $response = $card->authorize(16.10) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // AUTHORIZATION - Manually Entered, Card Not Present + + public function testRetail037AuthorizeVisaManual() + { + $address = new Address(); + $address->postalCode = '750241234'; + $address->streetAddress1 = '6860 Dallas Pkwy'; + + $card = TestCards::visaManual(false, true); + + // 034a authorize + $response = $card->authorize(17.08) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + // 034b capture + $captureResponse = $response->capture()->execute(); + $this->assertNotNull($captureResponse); + $this->assertEquals('00', $captureResponse->responseCode); + } + + public function testRetail038AuthorizeMasterCardManual() + { + $address = new Address(); + $address->postalCode = '750241234'; + $address->streetAddress1 = '6860'; + + $card = TestCards::masterCardManual(false, true); + + // 036a authorize + $response = $card->authorize(17.09) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + // 036b capture + $captureResponse = $response->capture()->execute(); + $this->assertNotNull($captureResponse); + $this->assertEquals('00', $captureResponse->responseCode); + } + + public function testRetail038aAuthorizeDiscoverManual() + { + $address = new Address(); + $address->postalCode = '750241234'; + + $card = TestCards::discoverManual(false, true); + + $response = $card->authorize(17.10) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // PARTIALLY APPROVED SALE (Required) + + public function testRetail039ChargeDiscoverSwipePartialApproval() + { + $card = TestCards::discoverSwipe(); + + $response = $card->charge(40.00) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAllowPartialAuth(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('10', $response->responseCode); + $this->assertEquals(40.00, $response->authorizedAmount); + } + + public function testRetail040ChargeVisaSwipePartialApproval() + { + $card = TestCards::visaSwipe(); + $response = $card->charge(130.00) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAllowPartialAuth(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('10', $response->responseCode); + $this->assertEquals(110.00, $response->authorizedAmount); + } + + public function testRetail041ChargeDiscoverManualPartialApproval() + { + $address = new Address(); + $address->postalCode = '75024'; + $card = TestCards::discoverManual(true, true); + + $response = $card->charge(145.00) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAllowPartialAuth(true) + ->withAddress($address) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('10', $response->responseCode); + $this->assertEquals(65.00, $response->authorizedAmount); + } + + public function testRetail042ChargeMasterCardSwipePartialApproval() + { + $card = TestCards::masterCardSwipe(); + $response = $card->charge(155.00) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAllowPartialAuth(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('10', $response->responseCode); + $this->assertEquals(100.00, $response->authorizedAmount); + + // test case 62 + $reversal = $response->reverse(100.00) + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($reversal); + $this->assertEquals('00', $reversal->responseCode); + } + + /* + SALE WITH GRATUITY + Tip Edit (Tip at Settlement) + */ + + public function testRetail043ChargeVisaSwipeEditGratuity() + { + $card = TestCards::visaSwipe(); + $response = $card->charge(15.12) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + $editResponse = $response->edit() + ->withAllowDuplicates(true) + ->withAmount(18.12) + ->withGratuity(3.00) + ->execute(); + $this->assertNotNull($editResponse); + $this->assertEquals('00', $editResponse->responseCode); + } + + public function testRetail044ChargeMasterCardManualEditGratuity() + { + $address = new Address(); + $address->postalCode = '75024'; + + $card = TestCards::masterCardManual(true, true); + $response = $card->charge(15.13) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + $editResponse = $response->edit() + ->withAllowDuplicates(true) + ->withAmount(18.13) + ->withGratuity(3.00) + ->execute(); + $this->assertNotNull($editResponse); + $this->assertEquals('00', $editResponse->responseCode); + } + + // Tip on Purchase + + public function testRetail045ChargeVisaManualGratuity() + { + $address = new Address(); + $address->postalCode = '75024'; + + $card = TestCards::visaManual(true, true); + + $response = $card->charge(18.61) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->withGratuity(3.50) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail046ChargeMasterCardSwipeGratuity() + { + $card = TestCards::masterCardSwipe(); + + $response = $card->charge(18.62) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withGratuity(3.50) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + $editResponse = $response->edit() + ->withAllowDuplicates(true) + ->withAmount(18.12) + ->withGratuity(3.00) + ->execute(); + $this->assertNotNull($editResponse); + $this->assertEquals('00', $editResponse->responseCode); + } + + // LEVEL II CORPORATE PURCHASE CARD + + public function testRetail047LevelIIVisaSwipeResponseB() + { + $card = TestCards::visaSwipe(); + + $response = $card->charge(112.34) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withCommercialRequest(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('B', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withAllowDuplicates(true) + ->withTaxType(TaxType::SALES_TAX) + ->withTaxAmount(1) + ->execute(); + $this->assertNotNull($cpcResponse); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function testRetail047aLevelIIVisaSwipeResponseB() + { + $card = TestCards::visaSwipe(); + + $response = $card->charge(112.34) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withCommercialRequest(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('B', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withAllowDuplicates(true) + ->withTaxType(TaxType::NOT_USED) + ->execute(); + $this->assertNotNull($cpcResponse); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function testRetail048LevelIIVisaSwipeResponseR() + { + $card = TestCards::visaSwipe(); + + $response = $card->charge(123.45) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withCommercialRequest(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('R', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withAllowDuplicates(true) + ->withTaxType(TaxType::TAX_EXEMPT) + ->execute(); + $this->assertNotNull($cpcResponse); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function testRetail049LevelIIVisaManualResponseS() + { + $address = new Address(); + $address->postalCode = '75024'; + + $card = TestCards::visaManual(true, true); + + $response = $card->charge(134.56) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->withCommercialRequest(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('S', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withAllowDuplicates(true) + ->withPoNumber('9876543210') + ->withTaxType(TaxType::SALES_TAX) + ->withTaxAmount(1) + ->execute(); + $this->assertNotNull($cpcResponse); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function testRetail050LevelIIMasterCardSwipeResponseS() + { + $card = TestCards::masterCardSwipe(); + + $response = $card->charge(111.06) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withCommercialRequest(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('S', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withAllowDuplicates(true) + ->withPoNumber('9876543210') + ->withTaxType(TaxType::NOT_USED) + ->execute(); + $this->assertNotNull($cpcResponse); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function testRetail051LevelIIMasterCardManualResponseS() + { + $address = new Address(); + $address->postalCode = '75024'; + + $card = TestCards::masterCardManual(true, true); + + $response = $card->charge(111.07) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->withCommercialRequest(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('S', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withAllowDuplicates(true) + ->withPoNumber('9876543210') + ->withTaxType(TaxType::SALES_TAX) + ->withTaxAmount(1) + ->execute(); + $this->assertNotNull($cpcResponse); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function testRetail051aLevelIIMasterCardManualResponseS() + { + $address = new Address(); + $address->postalCode = '75024'; + + $card = TestCards::masterCardManual(true, true); + $response = $card->charge(111.08) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->withCommercialRequest(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('S', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withAllowDuplicates(true) + ->withPoNumber('9876543210') + ->withTaxType(TaxType::SALES_TAX) + ->withTaxAmount(1) + ->execute(); + $this->assertNotNull($cpcResponse); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function testRetail052LevelIIMasterCardManualResponseS() + { + $address = new Address(); + $address->postalCode = '75024'; + + $card = TestCards::masterCardManual(true, true); + $response = $card->charge(111.09) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->withCommercialRequest(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('S', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withAllowDuplicates(true) + ->withPoNumber('9876543210') + ->withTaxType(TaxType::TAX_EXEMPT) + ->execute(); + $this->assertNotNull($cpcResponse); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function testRetail053LevelIIAmexSwipeNoResponse() + { + $card = TestCards::amexSwipe(); + $response = $card->charge(111.10) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withCommercialRequest(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('0', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withAllowDuplicates(true) + ->withTaxType(TaxType::SALES_TAX) + ->withTaxAmount(1) + ->execute(); + $this->assertNotNull($cpcResponse); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function testRetail054LevelIIAmexManualNoResponse() + { + $address = new Address(); + $address->postalCode = '75024'; + + $card = TestCards::amexManual(true, true); + + $response = $card->charge(111.11) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->withCommercialRequest(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('0', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withAllowDuplicates(true) + ->withPoNumber('9876543210') + ->withTaxType(TaxType::NOT_USED) + ->execute(); + $this->assertNotNull($cpcResponse); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function testRetail055LevelIIAmexManualNoResponse() + { + $address = new Address(); + $address->postalCode = '75024'; + + $card = TestCards::amexManual(true, true); + $response = $card->charge(111.12) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->withCommercialRequest(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('0', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withAllowDuplicates(true) + ->withPoNumber('9876543210') + ->withTaxType(TaxType::NOT_USED) + ->execute(); + $this->assertNotNull($cpcResponse); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + public function testRetail055aLevelIIAmexManualNoResponse() + { + $address = new Address(); + $address->postalCode = '75024'; + + $card = TestCards::amexManual(true, true); + $response = $card->charge(111.13) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAddress($address) + ->withCommercialRequest(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals('0', $response->commercialIndicator); + + $cpcResponse = $response->edit() + ->withAllowDuplicates(true) + ->withPoNumber('9876543210') + ->withTaxType(TaxType::TAX_EXEMPT) + ->execute(); + $this->assertNotNull($cpcResponse); + $this->assertEquals('00', $cpcResponse->responseCode); + } + + // OFFLINE SALE / AUTHORIZATION + + public function testRetail056OfflineChargeVisaManual() + { + $card = TestCards::visaManual(false, true); + + $response = $card->charge(15.12) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withOfflineAuthCode('654321') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail056OfflineAuthVisaManual() + { + $card = TestCards::visaManual(false, true); + + $response = $card->authorize(15.11) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withOfflineAuthCode('654321') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // RETURN + + public function testRetail057ReturnMasterCard() + { + $card = TestCards::masterCardManual(false, true); + + $response = $card->refund(15.11) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail057aReturnMasterCardSwipe() + { + $card = TestCards::masterCardSwipe(); + $response = $card->refund(15.15) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail058ReturnJcbTransactionId() + { + // See test 14 + } + + // ONLINE VOID / REVERSAL (Required) + + public function testRetail059ReversalVisa() + { + // see test 10 + } + + public function testRetail060ReversalMasterCard() + { + // see test case 17 + } + + public function testRetail061ReversalMasterCard() + { + // see test case 23 + } + + public function testRetail062ReversalMasterCard() + { + // see test case 42 + } + + public function testRetail063ReversalVisaPartial() + { + // see test case 15 + } + + public function testRetail064ReversalDiscoverPartial() + { + // see test 21 + } + + // PIN DEBIT CARD FUNCTIONS + + public function testRetail065DebitSaleVisaSwipe() + { + $card = TestCards::asDebit(TestCards::visaSwipe(), '32539F50C245A6A93D123412324000AA'); + + $response = $card->charge(14.01) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail066DebitSaleMasterCardSwipe() + { + $card = TestCards::asDebit(TestCards::masterCardSwipe(), 'F505AD81659AA42A3D123412324000AB'); + + $response = $card->charge(14.02) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + // test case 71 + $reversal = $response->reverse(14.02) + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($reversal); + $this->assertEquals('00', $reversal->responseCode); + } + + public function testRetail067DebitSaleVisaSwipeCashBack() + { + $card = TestCards::asDebit(TestCards::visaSwipe(), '32539F50C245A6A93D123412324000AA'); + + $response = $card->charge(14.03) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withCashBack(5.00) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail067aDebitSaleMasterCard() + { + $card = TestCards::asDebit(TestCards::masterCardSwipe(), 'F505AD81659AA42A3D123412324000AB'); + + $response = $card->charge(14.04) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // PARTIALLY APPROVED PURCHASE + + public function testRetail068DebitSaleMasterCardPartialApproval() + { + $card = TestCards::asDebit(TestCards::masterCardSwipe(), 'F505AD81659AA42A3D123412324000AB'); + + $response = $card->charge(33.00) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAllowPartialAuth(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('10', $response->responseCode); + $this->assertEquals(22.00, $response->authorizedAmount); + } + + public function testRetail069DebitSaleVisaPartialApproval() + { + $this->markTestSkipped(); + + $card = TestCards::asDebit(TestCards::visaSwipe(), '32539F50C245A6A93D123412324000AA'); + + $response = $card->charge(44.00) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withAllowPartialAuth(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals(33.00, $response->authorizedAmount); + + // test case 72 + $reversal = $response->reverse(33.00) + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($reversal); + $this->assertEquals('00', $reversal->responseCode); + } + + // RETURN + + public function testRetail070DebitReturnVisaSwipe() + { + $card = TestCards::asDebit(TestCards::visaSwipe(), '32539F50C245A6A93D123412324000AA'); + + $response = $card->refund(14.07) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail070aDebitReturnVisaSwipe() + { + $card = TestCards::asDebit(TestCards::visaSwipe(), '32539F50C245A6A93D123412324000AA'); + + $response = $card->refund(14.08) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + $reversalResponse = $response->reverse(14.08) + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($reversalResponse); + $this->assertEquals('00', $reversalResponse->responseCode); + } + + // REVERSAL + + public function testRetail071DebitReversalMasterCard() + { + // see test case 66 + } + + public function testRetail072DebitReversalVisa() + { + // see test case 96 + } + + /* + EBT FUNCTIONS + Food Stamp Purchase + */ + + public function testRetail080EbtfsPurchaseVisaSwipe() + { + $card = TestCards::asEBTTrack(TestCards::visaSwipe(), '32539F50C245A6A93D123412324000AA'); + + $response = $card->charge(101.01) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail081EbtfsPurchaseVisaManual() + { + $card = TestCards::asEBTManual(TestCards::visaManual(false, true), '32539F50C245A6A93D123412324000AA'); + + $response = $card->charge(102.01) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // Food Stamp Electronic Voucher (Manual Entry Only) + + public function testRetail082EbtVoucherPurchaseVisa() + { + $card = TestCards::asEBTManual(TestCards::visaManual(false, true), '32539F50C245A6A93D123412324000AA'); + $card->SerialNumber = '123456789012345'; + $card->approvalCode = '123456'; + + $response = $card->charge(103.01) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // Food Stamp Balance Inquiry + + public function testRetail083EbtfsReturnVisaSwipe() + { + $card = TestCards::asEBTTrack(TestCards::visaSwipeEncrypted(), '32539F50C245A6A93D123412324000AA'); + + $response = $card->refund(104.01) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail084EbtfsReturnVisaManual() + { + $card = TestCards::asEBTManual(TestCards::visaManual(false, true), '32539F50C245A6A93D123412324000AA'); + + $response = $card->refund(105.01) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // Food Stamp Balance Inquiry + + public function testRetail085EbtBalanceInquiryVisaSwipe() + { + $card = TestCards::asEBTTrack(TestCards::visaSwipeEncrypted(), '32539F50C245A6A93D123412324000AA'); + + $response = $card->balanceInquiry()->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail086EbtBalanceInquiryVisaManual() + { + $card = TestCards::asEBTManual(TestCards::visaManual(true, true), '32539F50C245A6A93D123412324000AA'); + + $response = $card->balanceInquiry()->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + /* + $this->assertEquals('00', $response->responseCode); + EBT CASH BENEFITS + Cash Back Purchase + */ + + public function testRetail087EbtCashBackPurchaseVisaSwipe() + { + $card = TestCards::asEBTTrack(TestCards::visaSwipeEncrypted(), '32539F50C245A6A93D123412324000AA'); + + $response = $card->charge(106.01) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withCashBack(5.00) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail088EbtCashBackPurchaseVisaManual() + { + $card = TestCards::asEBTManual(TestCards::visaManual(false, true), '32539F50C245A6A93D123412324000AA'); + + $response = $card->charge(107.01) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withCashBack(5.00) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // No Cash Back Purchase + + public function testRetail089EbtCashBackPurchaseVisaSwipeNoCashBack() + { + $card = TestCards::asEBTTrack(TestCards::visaSwipeEncrypted(), '32539F50C245A6A93D123412324000AA'); + + $response = $card->charge(108.01) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withCashBack(0) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail090EbtCashBackPurchaseVisaManualNoCashBack() + { + $card = TestCards::asEBTManual(TestCards::visaManual(false, true), '32539F50C245A6A93D123412324000AA'); + + $response = $card->charge(109.01) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withCashBack(0) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // Cash Back Balance Inquiry + + public function testRetail091EbtBalanceInquiryVisaSwipeCash() + { + $card = TestCards::asEBTTrack(TestCards::visaSwipeEncrypted(), '32539F50C245A6A93D123412324000AA'); + + $response = $card->balanceInquiry(InquiryType::CASH)->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail092EbtBalanceInquiryVisaManualCash() + { + $card = TestCards::asEBTManual(TestCards::visaManual(true, true), '32539F50C245A6A93D123412324000AA'); + + $response = $card->balanceInquiry(InquiryType::CASH)->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + // Cash Benefits Withdrawal + + public function testRetail093EbtBenefitWithDrawalVisaSwipe() + { + $card = TestCards::asEBTTrack(TestCards::visaSwipeEncrypted(), '32539F50C245A6A93D123412324000AA'); + + $response = $card->charge(110.01) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testRetail094EbtBenefitWithDrawalVisaManual() + { + $card = TestCards::asEBTManual(TestCards::visaManual(false, true), '32539F50C245A6A93D123412324000AA'); + + $response = $card->charge(111.01) + ->withAllowDuplicates(true) + ->withCurrency('USD') + ->withCashBack(0) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + /* + HMS GIFT - REWARDS + GIFT + ACTIVATE + */ + + public function testRetail095ActivateGift1Swipe() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->activate(6.00)->execute(); + $this->assertNotNull($response); + $this->assertEquals('0', $response->responseCode); + } + + public function testRetail096ActivateGift2Manual() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->activate(7.00)->execute(); + $this->assertNotNull($response); + $this->assertEquals('0', $response->responseCode); + } + + // ADD VALUE + + public function testRetail097AddValueGift1Swipe() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->addValue(8.00) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('0', $response->responseCode); + } + + public function testRetail098AddValueGift2Manual() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->activate(9.00)->execute(); + $this->assertNotNull($response); + $this->assertEquals('0', $response->responseCode); + } + + // BALANCE INQUIRY + + public function testRetail099BalanceInquiryGift1Swipe() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->balanceInquiry()->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + $this->assertEquals(10.00, $response->balanceAmount); + } + + public function testRetail100BalanceInquiryGift2Manual() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->balanceInquiry()->execute(); + $this->assertNotNull($response); + $this->assertEquals('0', $response->responseCode); + $this->assertEquals(10.00, $response->balanceAmount); + } + + // REPLACE / TRANSFER + + public function testRetail101ReplaceGift1Swipe() + { + $oldCard = TestCards::giftCard1Swipe(); + $newCard = TestCards::giftCard2Manual(); + + $response = $oldCard->replaceWith($newCard)->execute(); + $this->assertNotNull($response); + $this->assertEquals('0', $response->responseCode); + } + + public function testRetail102ReplaceGift2Manual() + { + $newCard = TestCards::giftCard1Swipe(); + $oldCard = TestCards::giftCard2Manual(); + + $response = $oldCard->replaceWith($newCard)->execute(); + $this->assertNotNull($response); + $this->assertEquals('0', $response->responseCode); + } + + // SALE / REDEEM + + public function testRetail103SaleGift1Swipe() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->charge(1.00) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('0', $response->responseCode); + } + + public function testRetail104SaleGift2Manual() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->charge(2.00) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('0', $response->responseCode); + } + + public function testRetail105SaleGift1VoidSwipe() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->charge(3.00) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('0', $response->responseCode); + + // test case 107 + $voidResponse = $response->void()->execute(); + $this->assertNotNull($voidResponse); + $this->assertEquals('0', $voidResponse->responseCode); + } + + public function testRetail106SaleGift2ReversalManual() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->charge(4.00) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('0', $response->responseCode); + + //test case 108 + $voidResponse = $response->reverse(4.00)->execute(); + $this->assertNotNull($voidResponse); + $this->assertEquals('0', $voidResponse->responseCode); + } + + // VOID + + public function testRetail107VoidGift() + { + // see test case 105 + } + + // REVERSAL + + public function testRetail108ReversalGift() + { + // see test case 106 + } + + // DEACTIVATE + + public function testRetail109DeactivateGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->deactivate()->execute(); + $this->assertNotNull($response); + $this->assertEquals('0', $response->responseCode); + } + + // RECEIPTS MESSAGING + + public function testRetail110ReceiptsMessaging() + { + // PRINT AND SCAN RECEIPT FOR TEST 107 + } + + /* + REWARDS + BALANCE INQUIRY + */ + + public function testRetail111BalanceInquiryRewards1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->balanceInquiry()->execute(); + $this->assertNotNull($response); + $this->assertEquals('0', $response->responseCode); + $this->assertEquals(0, $response->pointsBalanceAmount); + } + + public function testRetail112BalanceInquiryRewards2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->balanceInquiry()->execute(); + $this->assertNotNull($response); + $this->assertEquals('0', $response->responseCode); + $this->assertEquals(0, $response->pointsBalanceAmount); + } + + // ALIAS + + public function testRetail113CreateAliasGift1() + { + $card = GiftCard::create('9725550100'); + $this->assertNotNull($card); + } + + public function testRetail114CreateAliasGift2() + { + $card = GiftCard::create('9725550100'); + $this->assertNotNull($card); + } + + public function testRetail115AddAliasGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->addAlias('2145550199')->execute(); + $this->assertNotNull($response); + $this->assertEquals('0', $response->responseCode); + } + + public function testRetail116AddAliasGift2() + { + $card = TestCards::giftCard2Manual(); + + $response = $card->addAlias('2145550199')->execute(); + $this->assertNotNull($response); + $this->assertEquals('0', $response->responseCode); + } + + public function testRetail117DeleteAliasGift1() + { + $card = TestCards::giftCard1Swipe(); + + $response = $card->removeAlias('2145550199')->execute(); + $this->assertNotNull($response); + $this->assertEquals('0', $response->responseCode); + } + + public function testRetail999CloseBatch() + { + try { + $response = BatchService::closeBatch(); + $this->assertNotNull($response); + // error_log(sprintf('Batch ID: %s', $response->Id)); + // error_log(sprintf('Sequence Number: %s', $response->SequenceNumber)); + } catch (Exception $exec) { + if (false === strpos($e->getMessage(), static::BATCH_NOT_OPEN) + && false === strpos($e->getMessage(), static::NO_TRANS_IN_BATCH) + ) { + $this->fail($e->getMessage()); + } + } + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/CreditTest.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/CreditTest.php new file mode 100644 index 0000000..01539b1 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/CreditTest.php @@ -0,0 +1,270 @@ +card = new CreditCardData(); + $this->card->number = '4111111111111111'; + $this->card->expMonth = 12; + $this->card->expYear = 2025; + $this->card->cvn = '123'; + $this->card->cardHolderName = 'Joe Smith'; + + + $this->track = new CreditTrackData(); + $this->track->value = ';'; + $this->track->encryptionData = new EncryptionData(); + $this->track->encryptionData->version = '01'; + + ServicesContainer::configure($this->getConfig()); + } + + public function testCreditAuthorization() + { + $authorization = $this->card->authorize(14) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($authorization); + $this->assertEquals('00', $authorization->responseCode); + + $capture = $authorization->capture(16) + ->withGratuity(2) + ->execute(); + $this->assertNotNull($capture); + $this->assertEquals('00', $capture->responseCode); + } + + public function testCreditServiceAuth() + { + $service = new CreditService( + $this->getConfig() + ); + + $authorization = $service->authorize(15) + ->withCurrency('USD') + ->withPaymentMethod($this->card) + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($authorization); + $this->assertEquals('00', $authorization->responseCode); + + $capture = $service->capture($authorization->transactionReference->transactionId) + ->withAmount(17) + ->withGratuity(2) + ->execute(); + $this->assertNotNull($capture); + $this->assertEquals('00', $capture->responseCode); + } + + public function testCreditSale() + { + $response = $this->card->charge(15) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testCreditOfflineAuth() + { + $response = $this->card->authorize(16) + ->withCurrency('USD') + ->withOfflineAuthCode('12345') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testCreditOfflineSale() + { + $response = $this->card->charge(16) + ->withCurrency('USD') + ->withOfflineAuthCode('12345') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testCreditRefund() + { + $response = $this->card->refund(16) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testCreditReverse() + { + $response = $this->card->reverse(15) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testCreditVerify() + { + $response = $this->card->verify() + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testCreditSwipeAuthorization() + { + $authorization = $this->track->authorize(14) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($authorization); + $this->assertEquals('00', $authorization->responseCode); + + $capture = $authorization->capture(16) + ->withGratuity(2) + ->execute(); + $this->assertNotNull($capture); + $this->assertEquals('00', $capture->responseCode); + } + + public function testCreditServiceSwipeAuth() + { + $service = new CreditService( + $this->getConfig() + ); + + $authorization = $service->authorize(15) + ->withCurrency('USD') + ->withPaymentMethod($this->track) + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($authorization); + $this->assertEquals('00', $authorization->responseCode); + + $capture = $service->capture($authorization->transactionReference->transactionId) + ->withAmount(17) + ->withGratuity(2) + ->execute(); + $this->assertNotNull($capture); + $this->assertEquals('00', $capture->responseCode); + } + + public function testCreditSwipeSale() + { + $response = $this->track->charge(15) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testCreditSwipeOfflineAuth() + { + $response = $this->track->authorize(16) + ->withCurrency('USD') + ->withOfflineAuthCode('12345') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testCreditSwipeOfflineSale() + { + $response = $this->track->charge(16) + ->withCurrency('USD') + ->withOfflineAuthCode('12345') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testCreditSwipeAddValue() + { + $this->markTestSkipped('GSB not configured'); + + $response = $this->track->addValue(16) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testCreditSwipeBalanceInquiry() + { + $response = $this->track->balanceInquiry() + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testCreditSwipeRefund() + { + $response = $this->track->refund(16) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testCreditSwipeReverse() + { + $response = $this->track->reverse(15) + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testCreditSwipeVerify() + { + $response = $this->track->verify() + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + protected function getConfig() + { + $config = new ServicesConfig(); + $config->secretApiKey = 'skapi_cert_MTeSAQAfG1UA9qQDrzl-kz4toXvARyieptFwSKP24w'; + $config->serviceUrl = ($this->enableCryptoUrl) ? + 'https://cert.api2-c.heartlandportico.com/': + 'https://cert.api2.heartlandportico.com'; + return $config; + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/DebitTest.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/DebitTest.php new file mode 100644 index 0000000..21e57e4 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/DebitTest.php @@ -0,0 +1,73 @@ +track = TestCards::asDebit(TestCards::visaSwipeEncrypted(), '32539F50C245A6A93D123412324000AA'); + + ServicesContainer::configure($this->getConfig()); + } + + public function testDebitSale() + { + $response = $this->track->charge(17.01) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testDebitAddValue() + { + $this->markTestSkipped('GSB not configured'); + + $response = $this->track->addValue(15.01) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testDebitRefund() + { + $response = $this->track->refund(16.01) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testDebitReverse() + { + $response = $this->track->reverse(17.01) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + protected function getConfig() + { + $config = new ServicesConfig(); + $config->secretApiKey = 'skapi_cert_MaePAQBr-1QAqjfckFC8FTbRTT120bVQUlfVOjgCBw'; + $config->serviceUrl = ($this->enableCryptoUrl) ? + 'https://cert.api2-c.heartlandportico.com/': + 'https://cert.api2.heartlandportico.com'; + return $config; + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/EbtTest.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/EbtTest.php new file mode 100644 index 0000000..902e79c --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/EbtTest.php @@ -0,0 +1,90 @@ +card = TestCards::asEBTManual(TestCards::visaManual(), '32539F50C245A6A93D123412324000AA'); + $this->track = TestCards::asEBTTrack(TestCards::visaSwipeEncrypted(), '32539F50C245A6A93D123412324000AA'); + + ServicesContainer::configure($this->getConfig()); + } + + public function testEbtBalanceInquiry() + { + $response = $this->card->balanceInquiry() + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testEbtSale() + { + $response = $this->card->charge(10) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testEbtRefund() + { + $response = $this->card->refund(10) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testEbtSwipeBalanceInquiry() + { + $response = $this->track->balanceInquiry() + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testEbtSwipeSale() + { + $response = $this->track->charge(10) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testEbtSwipeRefund() + { + $response = $this->track->refund(10) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + protected function getConfig() + { + $config = new ServicesConfig(); + $config->secretApiKey = 'skapi_cert_MaePAQBr-1QAqjfckFC8FTbRTT120bVQUlfVOjgCBw'; + $config->serviceUrl = ($this->enableCryptoUrl) ? + 'https://cert.api2-c.heartlandportico.com/': + 'https://cert.api2.heartlandportico.com'; + return $config; + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/GiftTest.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/GiftTest.php new file mode 100644 index 0000000..715f04e --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/GiftTest.php @@ -0,0 +1,119 @@ +card = new GiftCard(); + $this->card->number = '5022440000000000007'; + + $this->track = new GiftCard(); + $this->track->trackData = '%B5022440000000000098^^391200081613?;5022440000000000098=391200081613?'; + + ServicesContainer::configure($this->getConfig()); + } + + public function testGiftCreate() + { + $newCard = GiftCard::create('2145550199'); + $this->assertNotNull($newCard); + $this->assertNotNull($newCard->number); + $this->assertNotNull($newCard->alias); + $this->assertNotNull($newCard->pin); + } + + public function testGiftAddAlias() + { + $response = $this->card->addAlias('2145550199') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testGiftAddValue() + { + $response = $this->card->addValue(10) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testGiftBalanceInquiry() + { + $response = $this->card->balanceInquiry() + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testGiftSale() + { + $response = $this->card->charge(10) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testGiftDeactivate() + { + $response = $this->card->deactivate() + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testGiftRemoveAlias() + { + $response = $this->card->removeAlias('2145550199') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testGiftReplace() + { + $response = $this->card->replaceWith($this->track) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testGiftReverse() + { + $response = $this->card->reverse(10) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testGiftRewards() + { + $response = $this->card->rewards(10) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + protected function getConfig() + { + $config = new ServicesConfig(); + $config->secretApiKey = 'skapi_cert_MaePAQBr-1QAqjfckFC8FTbRTT120bVQUlfVOjgCBw'; + $config->serviceUrl = ($this->enableCryptoUrl) ? + 'https://cert.api2-c.heartlandportico.com/': + 'https://cert.api2.heartlandportico.com'; + return $config; + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/PorticoReportingTests.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/PorticoReportingTests.php new file mode 100644 index 0000000..b83adf7 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/PorticoReportingTests.php @@ -0,0 +1,296 @@ +card = new CreditCardData(); + $this->card->number = '4111111111111111'; + $this->card->expMonth = 12; + $this->card->expYear = 2025; + $this->card->cvn = '123'; + $this->card->cardHolderName = 'Joe Smith'; + + + $this->reportingService = new ReportingService(); + $this->searchCriteria = new SearchCriteriaBuilder(); + + ServicesContainer::configure($this->getConfig()); + } + + protected function getConfig() + { + $config = new ServicesConfig(); + $config->secretApiKey = 'skapi_cert_MaePAQBr-1QAqjfckFC8FTbRTT120bVQUlfVOjgCBw'; + $config->serviceUrl = ($this->enableCryptoUrl) ? + 'https://cert.api2-c.heartlandportico.com/': + 'https://cert.api2.heartlandportico.com'; + return $config; + } + + public function testReportActivity() + { + date_default_timezone_set("UTC"); + $dateFormat = 'Y-m-d\TH:i:s.00\Z'; + $dateMinus15days = new DateTime(); + $dateMinus15days->sub(new DateInterval('P15D')); + $dateMinus10Utc = gmdate($dateFormat, $dateMinus15days->Format('U')); + $nowUtc = gmdate($dateFormat); + + $response = $this->reportingService->activity() + ->withStartDate($dateMinus10Utc) + ->withEndDate($nowUtc) + ->execute(); + $this->assertNotNull($response); + $this->assertTrue(count($response) > 0); + } + + public function testReportActivityByDays() + { + date_default_timezone_set("UTC"); + $dateFormat = 'Y-m-d\TH:i:s.00\Z'; + $dateMinus5days = new DateTime(); + $dateMinus5days->sub(new DateInterval('P5D')); + $dateMinus10Utc = gmdate($dateFormat, $dateMinus5days->Format('U')); + $nowUtc = gmdate($dateFormat); + + $response = $this->reportingService->activity() + ->withStartDate($dateMinus10Utc) + ->withEndDate($nowUtc) + ->execute(); + $this->assertNotNull($response); + $this->assertTrue(count($response) > 0); + } + + public function testReportTransactionDetail() + { + $response = $this->reportingService->transactionDetail("1088532284")->execute(); + $this->assertNotNull($response); + } + + public function testInvoiceNumber() + { + $address = new Address(); + $address->postalCode = "12345"; + + $authResponse = $this->card->charge(10) + ->withCurrency("USD") + ->withAddress($address) + ->withInvoiceNumber('123456') + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($authResponse); + $this->assertEquals('00', $authResponse->responseCode); + $this->assertNotNull($authResponse->transactionId); + + $report = ReportingService::transactionDetail($authResponse->transactionId) + ->execute(); + + $this->assertNotNull($report); + $this->assertEquals('123456', $report->invoiceNumber); + } + + public function testReportCardHolderName() + { + $gateway_response = $this->card->charge(10) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + + $response = $this->reportingService->transactionDetail($gateway_response->transactionId)->execute(); + + $this->assertEquals('Joe', $response->cardHolderFirstName); + $this->assertEquals('Smith', $response->cardHolderLastName); + } + + public function testReportFindTransactionWithTransactionId() + { + $gateway_response = $this->card->charge(10) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + + $response = $this->reportingService->findTransactions($gateway_response->transactionId)->execute(); + $this->assertNotNull($response); + } + + public function testReportFindTransactionNoCriteria() + { + $response = $this->reportingService->findTransactions()->execute(); + $this->assertNotNull($response); + } + + public function testReportFindTransactionWithCriteria() + { + date_default_timezone_set("UTC"); + $dateFormat = 'Y-m-d\TH:i:s.00\Z'; + $dateMinus10days = new DateTime(); + $dateMinus10days->sub(new DateInterval('P5D')); + $dateMinus5Utc = gmdate($dateFormat, $dateMinus10days->Format('U')); + $nowUtc = gmdate($dateFormat); + + $response = $this->reportingService->findTransactions() + ->withTimeZoneConversion(TimeZoneConversion::MERCHANT) + ->where('startDate', $dateMinus5Utc) + ->and('endDate', $nowUtc) + ->execute(); + + $this->assertNotNull($response); + $this->assertTrue(count($response) > 0); + } + + public function testCreditAuthWithConvenienceAmount() + { + $authorization = $this->card->authorize(14) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->withConvenienceAmount(2) + ->execute(); + + $this->assertNotNull($authorization); + $this->assertEquals('00', $authorization->responseCode); + + $report = $this->reportingService->transactionDetail($authorization->transactionId)->execute(); + $this->assertNotNull($report); + $this->assertEquals('2', $report->convenienceAmount); + } + + public function testCreditAuthWithShippingAmount() + { + $authorization = $this->card->authorize(14) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->withShippingAmount(2) + ->execute(); + + $this->assertNotNull($authorization); + $this->assertEquals('00', $authorization->responseCode); + + $report = $this->reportingService->transactionDetail($authorization->transactionId)->execute(); + $this->assertNotNull($report); + $this->assertEquals('2', $report->shippingAmount); + } + + public function testCreditSaleWithConvenienceAmount() + { + $response = $this->card->charge(15) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->withConvenienceAmount(2) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + $report = $this->reportingService->transactionDetail($response->transactionId)->execute(); + $this->assertNotNull($report); + $this->assertEquals('2', $report->convenienceAmount); + } + + public function testCreditSaleWithShippingAmount() + { + $response = $this->card->charge(15) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->withShippingAmount(2) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + $report = $this->reportingService->transactionDetail($response->transactionId)->execute(); + $this->assertNotNull($report); + $this->assertEquals('2', $report->shippingAmount); + } + + public function testCreditOfflineAuthWithConvenienceAmount() + { + $response = $this->card->authorize(16) + ->withCurrency('USD') + ->withOfflineAuthCode('12345') + ->withAllowDuplicates(true) + ->withConvenienceAmount(2) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + $report = $this->reportingService->transactionDetail($response->transactionId)->execute(); + $this->assertNotNull($report); + $this->assertEquals('2', $report->convenienceAmount); + } + + public function testCreditOfflineAuthWithShippingAmount() + { + $response = $this->card->authorize(16) + ->withCurrency('USD') + ->withOfflineAuthCode('12345') + ->withAllowDuplicates(true) + ->withShippingAmount(2) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + $report = $this->reportingService->transactionDetail($response->transactionId)->execute(); + $this->assertNotNull($report); + $this->assertEquals('2', $report->shippingAmount); + } + + public function testCreditOfflineSaleWithConvenienceAmount() + { + $response = $this->card->charge(17) + ->withCurrency('USD') + ->withOfflineAuthCode('12345') + ->withAllowDuplicates(true) + ->WithConvenienceAmount(2) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + $report = $this->reportingService->transactionDetail($response->transactionId)->execute(); + $this->assertNotNull($report); + $this->assertEquals('2', $report->convenienceAmount); + } + + public function testCreditOfflineSaleWithShippingAmount() + { + $response = $this->card->charge(17) + ->withCurrency('USD') + ->withOfflineAuthCode('12345') + ->withAllowDuplicates(true) + ->withShippingAmount(2) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + + $report = $this->reportingService->transactionDetail($response->transactionId)->execute(); + $this->assertNotNull($report); + $this->assertEquals('2', $report->shippingAmount); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/PorticoTokenManagementTest.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/PorticoTokenManagementTest.php new file mode 100644 index 0000000..4ccfc30 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/PorticoTokenManagementTest.php @@ -0,0 +1,72 @@ +getConfig()); + + try { + $card = new CreditCardData(); + $card->number = '4111111111111111'; + $card->expMonth = 12; + $card->expYear = 2025; + $card->cvn = '123'; + + $this->token = $card->tokenize()->execute()->token; + $this->assertTrue(!empty($this->token), 'TOKEN COULD NOT BE GENERATED.'); + } catch (ApiException $exc) { + $this->fail($exc->message); + } + + } + + protected function getConfig() + { + $config = new ServicesConfig(); + $config->secretApiKey = 'skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A'; + $config->serviceUrl = 'https://cert.api2.heartlandportico.com'; + return $config; + } + + public function testUpdateToken() + { + $token = new CreditCardData(); + $token->token = $this->token; + $token->expMonth = 12; + $token->expYear = 2025; + + $this->assertTrue($token->updateTokenExpiry()); + + // should succeed + $response = $token->verify()->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testDeleteToken() + { + $token = new CreditCardData(); + $token->token = $this->token; + + $this->assertTrue($token->deleteToken()); + + // should fail + try { + $response = $token->verify()->execute(); + } catch (GatewayException $exc) { + $this->assertEquals('27', $exc->responseCode); + } + } +} \ No newline at end of file diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/AcsResponse.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/AcsResponse.php new file mode 100644 index 0000000..131078e --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/AcsResponse.php @@ -0,0 +1,44 @@ +authResponse; + } + + /** + * @return void + */ + public function setAuthResponse($authResponse){ + $this->authResponse = $authResponse; + } + + /** + * @return string + */ + public function getMerchantData(){ + return $this->merchantData; + } + + /** + * @return void + */ + public function setMerchantData($merchantData){ + $this->merchantData = $merchantData; + } +} \ No newline at end of file diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/ApiTestCase.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/ApiTestCase.php new file mode 100644 index 0000000..a1f6a04 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/ApiTestCase.php @@ -0,0 +1,999 @@ +merchantId = 'heartlandgpsandbox'; + $config->accountId = 'api'; + $config->sharedSecret = 'secret'; + $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; + + ServicesContainer::configure($config); + + // create the card object + $card = new CreditCardData(); + $card->number = '4263970000005262'; + $card->expMonth = 12; + $card->expYear = 2025; + $card->cvn = '131'; + $card->cardHolderName = 'James Mason'; + + try { + // process an auto-settle authorization + $response = $card->charge(15) + ->withCurrency("EUR") + ->execute(); + + $responseCode = $response->responseCode; // 00 == Success + $message = $response->responseMessage; // [ test system ] AUTHORISED + // get the details to save to the DB for future Transaction Management requests + $orderId = $response->orderId; + $authCode = $response->authorizationCode; + $paymentsReference = $response->transactionId; + // TODO: update your application and display transaction outcome to the customer + + $this->assertNotEquals(null, $response); + $this->assertEquals("00", $responseCode); + } catch (ApiException $e) { + // TODO: add your error handling here + } + } + + /* 02. Process Payment Refund */ + + public function testprocessPaymentRefund() + { + $config = new ServicesConfig(); + $config->merchantId = 'heartlandgpsandbox'; + $config->accountId = 'api'; + $config->sharedSecret = 'secret'; + $config->refundPassword = 'refund'; + $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; + + ServicesContainer::configure($config); + + // create the card object + $card = new CreditCardData(); + $card->number = '4263970000005262'; + $card->expMonth = 12; + $card->expYear = 2025; + $card->cvn = '131'; + $card->cardHolderName = 'James Mason'; + + // process a refund to the card + $response = $card->refund(16) + ->withCurrency("EUR") + ->execute(); + + // get the response details to update the DB + $responseCode = $response->responseCode; // 00 == Success + $message = $response->responseMessage; // [ test system ] AUTHORISED + + $this->assertNotEquals(null, $response); + $this->assertEquals("00", $responseCode); + } + + /* 03. Process Payment OTB */ + + public function testprocessPaymentOtb() + { + $config = new ServicesConfig(); + $config->merchantId = 'heartlandgpsandbox'; + $config->accountId = 'api'; + $config->sharedSecret = 'secret'; + $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; + + ServicesContainer::configure($config); + + // create the card object + $card = new CreditCardData(); + $card->number = '4263970000005262'; + $card->expMonth = 12; + $card->expYear = 2025; + $card->cvn = '131'; + $card->cardHolderName = 'James Mason'; + + try { + // check that a card is valid and active without charging an amount + $response = $card->verify() + ->execute(); + + // get the response details to update the DB + $responseCode = $response->responseCode; // 00 == Success + $message = $response->responseMessage; // [ test system ] AUTHORISED + // TODO: save the card to Card Stroage + + $this->assertNotEquals(null, $response); + $this->assertEquals("00", $responseCode); + } catch (ApiException $e) { + // TODO: Add your error handling here + } + } + + /* 04. ThreeD Secure Verify Enrolled */ + + public function testthreeDSecureVerifyEnrolled() + { + // will update later + } + + /* 05. ThreeD Secure Verify Sig */ + + public function testthreeDSecureVerifySig() + { + // will update later + } + + /* 06.ThreeD Secure Auth */ + + public function testthreeDSecureAuth() + { + $config = new ServicesConfig(); + $config->merchantId = 'heartlandgpsandbox'; + $config->accountId = 'api'; + $config->sharedSecret = 'secret'; + $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; + + ServicesContainer::configure($config); + + // create the card object + $card = new CreditCardData(); + $card->number = '4263970000005262'; + $card->expMonth = 12; + $card->expYear = 2025; + $card->cvn = '131'; + $card->cardHolderName = 'James Mason'; + + // supply the details from the 3D Secure verify-signature response + $threeDSecureInfo = new EcommerceInfo(); + $threeDSecureInfo->cavv = "AAACBllleHchZTBWIGV4AAAAAAA="; + $threeDSecureInfo->xid = "crqAeMwkEL9r4POdxpByWJ1/wYg="; + $threeDSecureInfo->eci = "5"; + + try { + // create the authorization with 3D Secure information + $response = $card->charge(15) + ->withEcommerceInfo($threeDSecureInfo) + ->withCurrency("EUR") + ->execute(); + + $this->assertNotEquals(null, $response); + $this->assertEquals("00", $response->responseCode); + } catch (ApiException $e) { + // TODO: Add your error handling here + } + } + + /* 07. Process Payment Apple Pay */ + + public function testprocessPaymentApplePay() + { + // will update later + } + + /* 19. Transaction Management Delayed Auth */ + + public function testtransactionManagementDelayedAuth() + { + $config = new ServicesConfig(); + $config->merchantId = 'heartlandgpsandbox'; + $config->accountId = 'api'; + $config->sharedSecret = 'secret'; + $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; + + ServicesContainer::configure($config); + + // create the card object + $card = new CreditCardData(); + $card->number = '4263970000005262'; + $card->expMonth = 12; + $card->expYear = 2025; + $card->cvn = '131'; + $card->cardHolderName = 'James Mason'; + + try { + // create the delayed settle authorization + $response = $card->authorize(19.99) + ->withCurrency("EUR") + ->execute(); + + $responseCode = $response->responseCode; // 00 == Success + $message = $response->responseMessage; // [ test system ] AUTHORISED + // get the reponse details to save to the DB for future transaction management requests + $orderId = $response->orderId; + $authCode = $response->authorizationCode; + $paymentsReference = $response->transactionId; // pasref + + $this->assertNotEquals(null, $response); + $this->assertEquals("00", $responseCode); + } catch (ApiException $e) { + // TODO: Add your error handling here + } + } + + /* 20. Transaction Management Settle */ + + public function testtransactionManagementSettle() + { + $config = new ServicesConfig(); + $config->merchantId = 'heartlandgpsandbox'; + $config->accountId = 'api'; + $config->sharedSecret = 'secret'; + $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; + + ServicesContainer::configure($config); + + // a settle request requires the original order id + $orderId = "QAhN4YFrJEWP6Vc-N68u-w"; + // and the payments reference (pasref) from the authorization response + $paymentsReference = "15113583374071921"; + // create the settle transaction object + $settle = Transaction::fromId($paymentsReference, $orderId); + + try { + // send the settle request, we must specify the amount and currency + $response = $settle->capture(1) + ->withCurrency("EUR") + ->execute(); + + $responseCode = $response->responseCode; // 00 == Success + $message = $response->responseMessage; // [ test system ] AUTHORISED + + $this->assertNotEquals(null, $response); + $this->assertEquals("00", $responseCode); + } catch (ApiException $e) { + // TODO: Add your error handling here + } + } + + /* 21. Transaction Management Rebate */ + + public function testTransactionManagementRebate() + { + $config = new ServicesConfig(); + $config->merchantId = 'heartlandgpsandbox'; + $config->accountId = 'api'; + $config->sharedSecret = 'secret'; + $config->rebatePassword = 'rebate'; + $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; + + ServicesContainer::configure($config); + + // create the card object + $card = new CreditCardData(); + $card->number = '4263970000005262'; + $card->expMonth = 12; + $card->expYear = 2025; + $card->cvn = '131'; + $card->cardHolderName = 'James Mason'; + + $response = $card->charge(19.99) + ->withCurrency("EUR") + ->execute(); + + $this->assertNotNull($response); + + $responseCode = $response->responseCode; // 00 == Success + $message = $response->responseMessage; // [ test system ] AUTHORISED + // get the reponse details to save to the DB for future transaction management requests + $orderId = $response->orderId; + $authCode = $response->authorizationCode; + $paymentsReference = $response->transactionId; // pasref + + // create the rebate transaction object + $transaction = Transaction::fromId($paymentsReference, $orderId); + $transaction->authorizationCode = $authCode; + + // send the settle request, we must specify the amount and currency + $response = $transaction->refund(19.99) + ->withCurrency("EUR") + ->execute(); + + $responseCode = $response->responseCode; // 00 == Success + $message = $response->responseMessage; // [ test system ] AUTHORISED + + $this->assertNotEquals(null, $response); + $this->assertEquals("00", $responseCode); + } + + /* 22. Transaction Management Void */ + + public function testtransactionManagementVoid() + { + $config = new ServicesConfig(); + $config->merchantId = 'heartlandgpsandbox'; + $config->accountId = 'api'; + $config->sharedSecret = 'secret'; + $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; + + ServicesContainer::configure($config); + + // a void request requires the original order id + $orderId = "xd4JTHE0ZEqudur_q1pB1w"; + // and the payments reference (pasref) from the transaction response + $paymentsReference = "15113573969816936"; + // create the void transaction object + $transaction = Transaction::fromId($paymentsReference, $orderId); + + try { + // send the void request + $response = $transaction->void() + ->execute(); + + $responseCode = $response->responseCode; // 00 == Success + $message = $response->responseMessage; // [ test system ] AUTHORISED + + $this->assertNotEquals(null, $response); + $this->assertEquals("00", $responseCode); + } catch (ApiException $e) { + // TODO: Add your error handling here + } + } + + /* 23. Fraud Management Data Submission */ + + public function testfraudManagementDataSubmission() + { + $config = new ServicesConfig(); + $config->merchantId = 'heartlandgpsandbox'; + $config->accountId = 'api'; + $config->sharedSecret = 'secret'; + $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; + + ServicesContainer::configure($config); + + // create the card object + $card = new CreditCardData(); + $card->number = '4263970000005262'; + $card->expMonth = 12; + $card->expYear = 2025; + $card->cvn = '131'; + $card->cardHolderName = 'James Mason'; + + // supply the customer's billing country and post code for avs checks + $billingAddress = new Address(); + $billingAddress->postalCode = "50001|Flat 123"; + $billingAddress->country = "US"; + + // supply the customer's shipping country and post code + $shippingAddress = new Address(); + $shippingAddress->postalCode = "654|123"; + $shippingAddress->country = "GB"; + + // create the delayed settle authorization + $response = $card->charge(10) + ->withCurrency("EUR") + ->withAddress($billingAddress, AddressType::BILLING) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withProductId("SID9838383") // prodid + ->withClientTransactionId("Car Part HV") // varref + ->withCustomerId("E8953893489") // custnum + ->withCustomerIpAddress("123.123.123.123") + ->withFraudFilter(FraudFilterMode::PASSIVE) + ->execute(); + + $responseCode = $response->responseCode; // 00 == Success + $message = $response->responseMessage; // [ test system ] AUTHORISED + // get the reponse details to save to the DB for future transaction management requests + $orderId = $response->orderId; + $authCode = $response->authorizationCode; + $paymentsReference = $response->transactionId; // pasref + + $this->assertNotNull($response); + $this->assertEquals("00", $responseCode); + $this->assertNotNull($response->fraudFilterResponse); + } + + /* 24. Fraud Management Hold */ + + public function testfraudManagementHold() + { + $config = new ServicesConfig(); + $config->merchantId = 'heartlandgpsandbox'; + $config->accountId = 'api'; + $config->sharedSecret = 'secret'; + $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; + + ServicesContainer::configure($config); + + // a hold request requires the original order id + $card = new CreditCardData(); + $card->number = '4263970000005262'; + $card->expMonth = 12; + $card->expYear = 2025; + $card->cvn = '131'; + $card->cardHolderName = 'James Mason'; + + $response = $card->authorize(19.99) + ->withCurrency("EUR") + ->execute(); + + $responseCode = $response->responseCode; // 00 == Success + $message = $response->responseMessage; // [ test system ] AUTHORISED + // get the reponse details to save to the DB for future transaction management requests + $orderId = $response->orderId; + $authCode = $response->authorizationCode; + $paymentsReference = $response->transactionId; // pasref + + $this->assertNotEquals(null, $response); + $this->assertEquals("00", $responseCode); + + // create the hold transaction object + $transaction = Transaction::fromId($paymentsReference, $orderId); + + // send the hold request, we can choose to specify a reason why we're holding it + $response = $transaction->hold() + ->withReasonCode(ReasonCode::FRAUD) + ->execute(); + + $responseCode = $response->responseCode; // 00 == Success + $message = $response->responseMessage; // [ test system ] AUTHORISED + + $this->assertNotEquals(null, $response); + $this->assertEquals("00", $responseCode); + } + + /* 25. Fraud Management Release */ + + public function testfraudManagementRelease() + { + $config = new ServicesConfig(); + $config->merchantId = 'heartlandgpsandbox'; + $config->accountId = 'api'; + $config->sharedSecret = 'secret'; + $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; + + ServicesContainer::configure($config); + + // a hold request requires the original order id + $card = new CreditCardData(); + $card->number = '4263970000005262'; + $card->expMonth = 12; + $card->expYear = 2025; + $card->cvn = '131'; + $card->cardHolderName = 'James Mason'; + + $response = $card->authorize(19.99) + ->withCurrency("EUR") + ->execute(); + + $responseCode = $response->responseCode; // 00 == Success + $message = $response->responseMessage; // [ test system ] AUTHORISED + // get the reponse details to save to the DB for future transaction management requests + $orderId = $response->orderId; + $authCode = $response->authorizationCode; + $paymentsReference = $response->transactionId; // pasref + + $this->assertNotEquals(null, $response); + $this->assertEquals("00", $responseCode); + + // create the hold transaction object + $transaction = Transaction::fromId($paymentsReference, $orderId); + + // send the hold request, we can choose to specify a reason why we're holding it + $response = $transaction->hold() + ->withReasonCode(ReasonCode::FRAUD) + ->execute(); + + $responseCode = $response->responseCode; // 00 == Success + $message = $response->responseMessage; // [ test system ] AUTHORISED + + $this->assertNotEquals(null, $response); + $this->assertEquals("00", $responseCode); + + // send the release request, we can choose to specify a reason why we're releasing it + $response = $transaction->release() + ->withReasonCode(ReasonCode::FALSE_POSITIVE) + ->execute(); + + $responseCode = $response->responseCode; // 00 == Success + $message = $response->responseMessage; // [ test system ] AUTHORISED + + $this->assertNotEquals(null, $response); + $this->assertEquals("00", $responseCode); + } + + /* 26. Dcc Rate Lookup */ + + public function testdccRateLookup() + { + // will update later + } + + /* 27. Dcc Present Choice */ + + public function testdccPresentChoice() + { + // will update later + } + + /* 28. Dcc Auth Data Submission */ + + public function testdccAuthDataSubmission() + { + // will update later + } + + /* 29. Google pay */ + + public function testauthMobileGooglePay() + { + try { + $config = new ServicesConfig(); + $config->merchantId = 'heartlandgpsandbox'; + $config->accountId = 'apitest'; + $config->sharedSecret = 'secret'; + $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; + + ServicesContainer::configure($config); + + // create the card object + $card = new CreditCardData(); + $card->token = '{"signature":"MEUCIQDapDDJyf9lH3ztEWksgAjNe...AXjW+ZM+Ut2BWoTExppDDPc1a9Z7U\u003d","protocolVersion":"ECv1","signedMessage":"{\"encryptedMessage\":\"VkqwkFuMdXp...TZQxVMnkTeJjwyc4\\u003d\",\"ephemeralPublicKey\":\"BMglUoKZWxgB...YCiBNkLaMTD9G4sec\\u003d\",\"tag\":\"4VYypqW2Q5FN7UP87QNDGsLgc48vAe5+AcjR+BxQ2Zo\\u003d\"}"}'; + $card->mobileType = EncyptedMobileType::GOOGLE_PAY; + + // process an auto-settle authorization + $response = $card->charge(15) + ->withCurrency("EUR") + ->withModifier(TransactionModifier::ENCRYPTED_MOBILE) + ->execute(); + + $responseCode = $response->responseCode; // 00 == Success + $message = $response->responseMessage; // [ test system ] AUTHORISED + // get the details to save to the DB for future Transaction Management requests + $orderId = $response->orderId; + $authCode = $response->authorizationCode; + $paymentsReference = $response->transactionId; + // TODO: update your application and display transaction outcome to the customer + + $this->assertNotEquals(null, $response); + $this->assertEquals("00", $responseCode); + } catch (GatewayException $exc) { + if ($exc->responseCode != '509') { + throw $exc; + } + } + } + + /* 30. Apple pay */ + + public function testauthMobileApplePay() + { + try { + $config = new ServicesConfig(); + $config->merchantId = 'heartlandgpsandbox'; + $config->accountId = 'apitest'; + $config->sharedSecret = 'secret'; + $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; + + ServicesContainer::configure($config); + + // create the card object + $card = new CreditCardData(); + $card->token = '{"version":"EC_v1","data":"dvMNzlcy6WNB","header":{"ephemeralPublicKey":"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWdNhNAHy9kO2Kol33kIh7k6wh6E","transactionId":"fd88874954acdb299c285f95a3202ad1f330d3fd4ebc22a864398684198644c3","publicKeyHash":"h7WnNVz2gmpTSkHqETOWsskFPLSj31e3sPTS2cBxgrk"}}'; + $card->mobileType = EncyptedMobileType::APPLE_PAY; + + // process an auto-settle authorization + $response = $card->charge() + ->withModifier(TransactionModifier::ENCRYPTED_MOBILE) + ->execute(); + + $responseCode = $response->responseCode; // 00 == Success + $message = $response->responseMessage; // [ test system ] AUTHORISED + // get the details to save to the DB for future Transaction Management requests + $orderId = $response->orderId; + $authCode = $response->authorizationCode; + $paymentsReference = $response->transactionId; + // TODO: update your application and display transaction outcome to the customer + + $this->assertNotEquals(null, $response); + $this->assertEquals("00", $responseCode); + } catch (GatewayException $exc) { + if ($exc->responseCode != '509' && $exc->responseCode != '515') { + throw $exc; + } + } + } + + /* 31. Mobile payment without Token value */ + + /** + * @expectedException \GlobalPayments\Api\Entities\Exceptions\BuilderException + * @expectedExceptionMessage token cannot be null for this transaction type + */ + public function testauthMobileWithoutToken() + { + $config = new ServicesConfig(); + $config->merchantId = 'heartlandgpsandbox'; + $config->accountId = 'apitest'; + $config->sharedSecret = 'secret'; + $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; + + ServicesContainer::configure($config); + + // create the card object + $card = new CreditCardData(); + $card->mobileType = EncyptedMobileType::GOOGLE_PAY; + + $response = $card->charge(15) + ->withCurrency("EUR") + ->withModifier(TransactionModifier::ENCRYPTED_MOBILE) + ->execute(); + } + + /* 32. Mobile payment without Mobile Type */ + + /** + * @expectedException \GlobalPayments\Api\Entities\Exceptions\BuilderException + * @expectedExceptionMessage mobileType cannot be null for this transaction type + */ + public function testauthMobileWithoutType() + { + $config = new ServicesConfig(); + $config->merchantId = 'heartlandgpsandbox'; + $config->accountId = 'apitest'; + $config->sharedSecret = 'secret'; + $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; + + ServicesContainer::configure($config); + + // create the card object + $card = new CreditCardData(); + $card->token = '{"version":"EC_v1","data":"dvMNzlcy6WNB","header":{"ephemeralPublicKey":"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWdNhNAHy9kO2Kol33kIh7k6wh6E","transactionId":"fd88874954acdb299c285f95a3202ad1f330d3fd4ebc22a864398684198644c3","publicKeyHash":"h7WnNVz2gmpTSkHqETOWsskFPLSj31e3sPTS2cBxgrk"}}'; + + $response = $card->charge(15) + ->withCurrency("EUR") + ->withModifier(TransactionModifier::ENCRYPTED_MOBILE) + ->execute(); + } + + /* 33. Google payment without amount */ + + /** + * @expectedException \GlobalPayments\Api\Entities\Exceptions\BuilderException + * @expectedExceptionMessage Amount and Currency cannot be null for google payment + */ + public function testauthMobileWithoutAmount() + { + $config = new ServicesConfig(); + $config->merchantId = 'heartlandgpsandbox'; + $config->accountId = 'apitest'; + $config->sharedSecret = 'secret'; + $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; + + ServicesContainer::configure($config); + + // create the card object + $card = new CreditCardData(); + $card->token = '{"version":"EC_v1","data":"dvMNzlcy6WNB","header":{"ephemeralPublicKey":"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWdNhNAHy9kO2Kol33kIh7k6wh6E","transactionId":"fd88874954acdb299c285f95a3202ad1f330d3fd4ebc22a864398684198644c3","publicKeyHash":"h7WnNVz2gmpTSkHqETOWsskFPLSj31e3sPTS2cBxgrk"}}'; + $card->mobileType = EncyptedMobileType::GOOGLE_PAY; + + $response = $card->charge() + ->withCurrency("EUR") + ->withModifier(TransactionModifier::ENCRYPTED_MOBILE) + ->execute(); + } + + /* 34. Google payment without Currency */ + + /** + * @expectedException \GlobalPayments\Api\Entities\Exceptions\BuilderException + * @expectedExceptionMessage Amount and Currency cannot be null for google payment + */ + public function testauthMobileWithoutCurrency() + { + $config = new ServicesConfig(); + $config->merchantId = 'heartlandgpsandbox'; + $config->accountId = 'apitest'; + $config->sharedSecret = 'secret'; + $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; + + ServicesContainer::configure($config); + + // create the card object + $card = new CreditCardData(); + $card->token = '{"version":"EC_v1","data":"dvMNzlcy6WNB","header":{"ephemeralPublicKey":"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWdNhNAHy9kO2Kol33kIh7k6wh6E","transactionId":"fd88874954acdb299c285f95a3202ad1f330d3fd4ebc22a864398684198644c3","publicKeyHash":"h7WnNVz2gmpTSkHqETOWsskFPLSj31e3sPTS2cBxgrk"}}'; + $card->mobileType = EncyptedMobileType::GOOGLE_PAY; + + $response = $card->charge(12) + ->withModifier(TransactionModifier::ENCRYPTED_MOBILE) + ->execute(); + } + + public function testfraudManagementAVSMatch() + { + $config = new ServicesConfig(); + $config->merchantId = 'heartlandgpsandbox'; + $config->accountId = 'api'; + $config->sharedSecret = 'secret'; + $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; + + ServicesContainer::configure($config); + + // create the card object + $card = new CreditCardData(); + $card->number = '4263970000005262'; + $card->expMonth = 12; + $card->expYear = 2025; + $card->cvn = '131'; + $card->cardHolderName = 'James Mason'; + + // supply the customer's billing country and post code for avs checks + $billingAddress = new Address(); + $billingAddress->postalCode = "50001|Flat 123"; + $billingAddress->country = "US"; + + // create the delayed settle authorization + $response = $card->charge(10) + ->withCurrency("EUR") + ->withAddress($billingAddress, AddressType::BILLING) + ->withVerifyAddress(true) + ->execute(); + + $responseCode = $response->responseCode; // 00 == Success + $message = $response->responseMessage; // [ test system ] AUTHORISED + // get the reponse details to save to the DB for future transaction management requests + $orderId = $response->orderId; + $authCode = $response->authorizationCode; + $paymentsReference = $response->transactionId; // pasref + + $this->assertNotNull($response); + $this->assertEquals("00", $responseCode); + $this->assertEquals("M", $response->avsResponseCode); + $this->assertEquals("M", $response->avsAddressResponse); + } + + public function testfraudManagementOffMode() + { + $config = new ServicesConfig(); + $config->merchantId = 'heartlandgpsandbox'; + $config->accountId = 'api'; + $config->sharedSecret = 'secret'; + $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; + + ServicesContainer::configure($config); + + // create the card object + $card = new CreditCardData(); + $card->number = '4263970000005262'; + $card->expMonth = 12; + $card->expYear = 2025; + $card->cvn = '131'; + $card->cardHolderName = 'James Mason'; + + // supply the customer's billing country and post code for avs checks + $billingAddress = new Address(); + $billingAddress->postalCode = "50001|Flat 123"; + $billingAddress->country = "US"; + + // supply the customer's shipping country and post code + $shippingAddress = new Address(); + $shippingAddress->postalCode = "654|123"; + $shippingAddress->country = "GB"; + + // create the delayed settle authorization + $response = $card->charge(10) + ->withCurrency("EUR") + ->withAddress($billingAddress, AddressType::BILLING) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withProductId("SID9838383") // prodid + ->withClientTransactionId("Car Part HV") // varref + ->withCustomerId("E8953893489") // custnum + ->withCustomerIpAddress("123.123.123.123") + ->withFraudFilter(FraudFilterMode::OFF) + ->execute(); + + $responseCode = $response->responseCode; // 00 == Success + $message = $response->responseMessage; // [ test system ] AUTHORISED + // get the reponse details to save to the DB for future transaction management requests + $orderId = $response->orderId; + $authCode = $response->authorizationCode; + $paymentsReference = $response->transactionId; // pasref + + $this->assertNotNull($response); + $this->assertEquals("00", $responseCode); + $this->assertNull($response->fraudFilterResponse); + } + + /* 35. Fraud Management Decision Manager */ + + public function testfraudManagementDecisionManager() + { + $config = new ServicesConfig(); + $config->merchantId = 'heartlandgpsandbox'; + $config->accountId = 'api'; + $config->sharedSecret = 'secret'; + $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; + + ServicesContainer::configure($config); + + // create the card object + $card = new CreditCardData(); + $card->number = '4263970000005262'; + $card->expMonth = 12; + $card->expYear = 2025; + $card->cvn = '131'; + $card->cardHolderName = 'James Mason'; + + // supply the customer's billing data for avs checks + $billingAddress = new Address(); + $billingAddress->streetAddress1 = "Flat 123"; + $billingAddress->streetAddress2 = "House 456"; + $billingAddress->streetAddress3 = "Cul-De-Sac"; + $billingAddress->city = "Halifax"; + $billingAddress->province = "West Yorkshire"; + $billingAddress->state = "Yorkshire and the Humber"; + $billingAddress->postalCode = "E77 4QJ"; + $billingAddress->country = "GB"; + + // supply the customer's shipping data + $shippingAddress = new Address(); + $shippingAddress->streetAddress1 = "House 456"; + $shippingAddress->streetAddress2 = "987 The Street"; + $shippingAddress->streetAddress3 = "Basement Flat"; + $shippingAddress->city = "Chicago"; + $shippingAddress->province = "Illinois"; + $shippingAddress->state = "Mid West"; + $shippingAddress->postalCode = "50001"; + $shippingAddress->country = "US"; + + // supply the customer's data + $customer = new Customer(); + $customer->id = "e193c21a-ce64-4820-b5b6-8f46715de931"; + $customer->firstName = "James"; + $customer->lastName = "Mason"; + $customer->dateOfBirth = "01011980"; + $customer->customerPassword = "VerySecurePassword"; + $customer->email = "text@example.com"; + $customer->domainName = "example.com"; + $customer->homePhone = "+35312345678"; + $customer->deviceFingerPrint = "devicefingerprint"; + + // supply the decisionManager data + $decisionManager = new DecisionManager(); + $decisionManager->billToHostName = "example.com"; + $decisionManager->billToHttpBrowserCookiesAccepted = true; + $decisionManager->billToHttpBrowserEmail = "jamesmason@example.com"; + $decisionManager->billToHttpBrowserType = "Mozilla"; + $decisionManager->billToIpNetworkAddress = "123.123.123.123"; + $decisionManager->businessRulessCoreThresHold = "40"; + $decisionManager->billToPersonalId = "741258963"; + $decisionManager->decisionManagerProfile = "DemoProfile"; + $decisionManager->invoiceHeaderTenderType = "consumer"; + $decisionManager->itemHostHedge = Risk::HIGH; + $decisionManager->itemNonsensicalHedge = Risk::HIGH; + $decisionManager->itemObscenitiesHedge = Risk::HIGH; + $decisionManager->itemPhoneHedge = Risk::HIGH; + $decisionManager->itemTimeHedge = Risk::HIGH; + $decisionManager->itemVelocityHedge = Risk::HIGH; + $decisionManager->invoiceHeaderIsGift = true; + $decisionManager->invoiceHeaderReturnsAccepted = true; + + $products = []; + $products[] = array( + 'product_id' => 'SKU251584', + 'productname' => 'Magazine Subscription', + 'quantity' => '12', + 'unitprice' => '1200', + 'gift' => 'true', + 'type' => 'subscription', + 'risk' => 'Low' + ); + $products[] = array( + 'product_id' => 'SKU8884784', + 'productname' => 'Charger', + 'quantity' => '10', + 'unitprice' => '1200', + 'gift' => 'false', + 'type' => 'subscription', + 'risk' => 'High' + ); + + $custom = []; + $custom[] = array( + 'field01' => 'fieldValue01', + 'field02' => 'fieldValue02', + 'field03' => 'fieldValue03', + 'field04' => 'fieldValue04' + ); + + $response = $card->charge(199.99) + ->withCurrency("EUR") + ->withAddress($billingAddress, AddressType::BILLING) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDecisionManager($decisionManager) + ->withCustomerData($customer) + ->withProductData($products) + ->withCustomData($custom) + ->execute(); + + $responseCode = $response->responseCode; // 00 == Success + $message = $response->responseMessage; // [ test system ] AUTHORISED + + $this->assertNotNull($response); + $this->assertEquals("00", $responseCode); + } + + public function testAuthorisationWithoutAccountId() { + $config = new ServicesConfig(); + $config->merchantId = 'heartlandgpsandbox'; + $config->sharedSecret = 'secret'; + $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; + + ServicesContainer::configure($config); + + // create the card object + $card = new CreditCardData(); + $card->number = '4263970000005262'; + $card->expMonth = 12; + $card->expYear = 2025; + $card->cvn = '131'; + $card->cardHolderName = 'James Mason'; + + // process an auto-settle authorization + $response = $card->charge(15) + ->withCurrency("EUR") + ->execute(); + + $this->assertNotEquals(null, $response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRefundWithoutAccountId() + { + $config = new ServicesConfig(); + $config->merchantId = 'heartlandgpsandbox'; + $config->sharedSecret = 'secret'; + $config->refundPassword = 'refund'; + $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; + + ServicesContainer::configure($config); + + // create the card object + $card = new CreditCardData(); + $card->number = '4263970000005262'; + $card->expMonth = 12; + $card->expYear = 2025; + $card->cvn = '131'; + $card->cardHolderName = 'James Mason'; + + // process a refund to the card + $response = $card->refund(16) + ->withCurrency("EUR") + ->execute(); + + $this->assertNotEquals(null, $response); + $this->assertEquals("00", $response->responseCode); + } + +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/Certifications/SdkTest.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/Certifications/SdkTest.php new file mode 100644 index 0000000..4fe5a53 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/Certifications/SdkTest.php @@ -0,0 +1,18930 @@ +merchantId = "heartlandgpsandbox"; + $config->accountId = "api"; + $config->sharedSecret = "secret"; + $config->refundPassword = "refund"; + $config->rebatePassword = "rebate"; + $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; + $config->timeout = 20000; + return $config; + } + + public function getBaseCardData() + { + $card = new CreditCardData(); + $card->number = "4263970000005262"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + $card->cardHolderName = "James Mason"; + return $card; + } + + public function testAuth006a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Auth-006a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth006b() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Auth-006b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth006c() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Auth-006c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth006d() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Auth-006d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth006e() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Auth-006e") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth006f() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Auth-006f") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth006g() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Auth-006g") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth006h() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Auth-006h") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth006i() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Auth-006i") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth006j() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Auth-006j") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth006k() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Auth-006k") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth007a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Auth-007a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth007b() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Auth-007b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth007c() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Auth-007c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth007d() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Auth-007d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth007e() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Auth-007e") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth008a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Auth-008a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth008b() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Auth-008b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth008c() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Auth-008c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth008d() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Auth-008d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth008e() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Auth-008e") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth009a() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Auth-009a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testAuth009b() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "E"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Auth-009b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testAuth009c() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOMMERCE"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Auth-009c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth009d() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Auth-009d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth010a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Auth-010a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth010b() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Auth-010b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth010c() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Auth-010c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth010d() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Auth-010d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth010e() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Auth-010e") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth011a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Auth-011a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth011b() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Auth-011b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth011c() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Auth-011c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testAuth011d() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge() + ->withCurrency("EUR") + ->withDescription("JAVA-Auth-011d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth012a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Auth-012a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testAuth012b() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EURO") + ->withDescription("JAVA-Auth-012b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testAuth012c() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("�UR") + ->withDescription("JAVA-Auth-012c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testAuth012d() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withDescription("JAVA-Auth-012d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth013a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Auth-013a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testAuth013b1() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "424242000000000000000"; + $card->expMonth = 12; + $card->expYear = 2020; + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Auth-013b1") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testAuth013b2() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "42424242424"; + $card->expMonth = 12; + $card->expYear = 2020; + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Auth-013b2") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testAuth013c() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4263970000005262#"; + $card->expMonth = 12; + $card->expYear = 2020; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Auth-013c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth014a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Auth-014a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testAuth014b() + { + $this->markTestSkipped('Exception not thrown'); + + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Auth-014b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testAuth014c() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + $card->cardHolderName = "3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep"; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Auth-014c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth014d() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + $card->cardHolderName = "James~Mason"; + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Auth-014d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth015a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Auth-015a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth015b() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Auth-015b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testAuth015c() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 20; + $card->expYear = 2012; + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Auth-015c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testAuth015d() + { + $this->markTestSkipped('Exception not thrown'); + + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Auth-015d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth016a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Auth-016a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth016b() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Auth-016b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth016c() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Auth-016c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth017a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Auth-017a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth018a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Auth-018a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth019a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Auth-019a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testAuth019b1() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "1234"; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Auth-019b1") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth019b2() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Auth-019b2") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testAuth019c() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "12345"; + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Auth-019c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth019d() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "374101000000608"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "1234"; + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Auth-019d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth020a1() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Auth-020a1") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth020a2() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = ""; + $card->cvnPresenceIndicator = CvnPresenceIndicator::ILLEGIBLE; + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Auth-020a2") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth020a3() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = ""; + $card->cvnPresenceIndicator = CvnPresenceIndicator::NOT_ON_CARD; + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Auth-020a3") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth020a4() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = ""; + $card->cvnPresenceIndicator = CvnPresenceIndicator::NOT_REQUESTED; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Auth-020a4") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testAuth020b() + { + $this->markTestSkipped('Exception not thrown'); + + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvnPresenceIndicator = 5; + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Auth-020b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth020c() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvnPresenceIndicator = 0; + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Auth-020c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth021a1() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Auth-021a1") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth021a2() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->authorize(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Auth-021a2") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth021a3() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->authorize(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Auth-021a3") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth021b() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->authorize(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Auth-021b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth021c() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->authorize(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Auth-021c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth022a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Auth-022a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth022b() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Auth-022b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth022c() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Auth-022c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth022d() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Auth-022d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth022e() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Auth-022e") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth023a1() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Auth-023a1") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth023a2() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Auth-023a2") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth023b1() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Auth-023b1") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth023c() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Auth-023c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth024a1() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Auth-024a1") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth024a2() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Auth-024a2") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth024a3() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Auth-024a3") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth024b() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Auth-024b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth024c() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Auth-024c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth025() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Auth-025") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth026a1() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Auth-026a1") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth026a2() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth026b() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth026c1() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIep3uviSnW9XEB3a4wpIW9XEB3a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth026c2() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Auth-026c2") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth027a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withCustomerId("123456") + ->withDescription("JAVA-Auth-027a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth028a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("123456") + ->withDescription("JAVA-Auth-028a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth028b() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Auth-028b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testAuth028c() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withCustomerId("3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep33a4wpQQQQQQQQQ1") + ->withDescription("JAVA-Auth-028c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testAuth028d() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("123456~") + ->withDescription("JAVA-Auth-028d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth029a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withProductId("123456") + ->withDescription("JAVA-Auth-029a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth029b() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Auth-029b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testAuth029c() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withProductId("3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep33a4wpQQQQQQQQQ1") + ->withDescription("JAVA-Auth-029c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testAuth029d() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withProductId("123456~") + ->withDescription("JAVA-Auth-029d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth030a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withClientTransactionId("123456") + ->withDescription("JAVA-Auth-030a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth030b() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Auth-030b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testAuth030c() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withClientTransactionId("3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep33a4wpQQQQQQQQQ1") + ->withDescription("JAVA-Auth-030c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testAuth030d() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withClientTransactionId("123456~") + ->withDescription("JAVA-Auth-030d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth031a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerIpAddress("123.123.123.123") + ->withDescription("JAVA-Auth-031a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth031b() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Auth-031b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testAuth031c1() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withCustomerIpAddress("1234.123.123.123") + ->withDescription("JAVA-Auth-031c1") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testAuth031c2() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerIpAddress("123~.123.123.123") + ->withDescription("JAVA-Auth-031c2") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth032a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "E77 4QJ"; + $billingAddress->country = "United Kingdom"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "Z76 PO9"; + $shippingAddress->country = "France"; + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Auth-032a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth033a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "774|10"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "769|52"; + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Auth-033a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth033b1() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "774|10"; + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withAddress($billingAddress) + ->withDescription("JAVA-Auth-033b1") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth033b2() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "769|52"; + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Auth-033b2") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testAuth033c1() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwep4wpIwep3u111"; + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withAddress($billingAddress) + ->withDescription("JAVA-Auth-033c1") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testAuth033c2() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwep4wpIwep3u111"; + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Auth-033c2") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth034a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Auth-034a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth034b1() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->country = "GB"; + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Auth-034b1") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth034b2() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->country = "GB"; + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withAddress($billingAddress) + ->withDescription("JAVA-Auth-034b2") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testAuth034c1() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->country = "3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwep4wpIwep3u111"; + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withAddress($billingAddress) + ->withDescription("JAVA-Auth-034c1") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testAuth034c2() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->country = "3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwep4wpIwep3u111"; + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Auth-034c2") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth035a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Auth-035a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth035b() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Auth-035b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testAuth055a() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "774|10"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "769|52"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withCustomerId("12345") + ->withProductId("654321") + ->withClientTransactionId("987654") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Auth-055a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testValidation002a() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-002a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testValidation002b() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-002b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testValidation002c1() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-002c1") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testValidation002c2() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-002c2") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testValidation002d() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->number = "V002625938386848"; + $card->expMonth = 12; + $card->expYear = 2020; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-002d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testValidation002e() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-002e") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testValidation002f() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->number = " 4002 6259 3838 6848"; + $card->expMonth = 12; + $card->expYear = 2020; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-002f") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testValidation002g() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-002g") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testValidation002h() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->number = ""; + $card->expMonth = 12; + $card->expYear = 2020; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-002h") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testValidation003a() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-003a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testValidation003b() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-003b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testValidation003c() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 20; + $card->expYear = 2012; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-003c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testValidation003d() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2015; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-003d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testValidation003e() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 11; + $card->expYear = 5; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-003e") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testValidation003f() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-003f") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testValidation003g() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 20; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-003g") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testValidation003h() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-003h") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testValidation003i() + { + $this->markTestSkipped('Exception not thrown'); + + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-003i") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testValidation004a() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-004a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testValidation004b() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "1234"; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-004b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testValidation004c() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "12345"; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-004c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testValidation004d() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->number = "374101000000608"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "1234"; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-004d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testValidation004e() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->number = "374101000000608"; + $card->expMonth = 12; + $card->expYear = 2020; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-004e") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testValidation004f() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvnPresenceIndicator = 0; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-004f") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testValidation004g() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvnPresenceIndicator = CvnPresenceIndicator::ILLEGIBLE; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-004g") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testValidation004h() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvnPresenceIndicator = CvnPresenceIndicator::NOT_ON_CARD; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-004h") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testValidation004i() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvnPresenceIndicator = CvnPresenceIndicator::NOT_REQUESTED; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-004i") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testValidation005a() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2015; + $card->cvn = "1234"; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-005a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testValidation005b() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-005b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testValidation005c() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "1234"; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-005c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testValidation005d() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2015; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-005d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testValidation005e() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2015; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-005e") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testValidation005f() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2015; + $card->cvn = "1234"; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-005f") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testValidation005g() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2015; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-005g") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testValidation005h() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "1234"; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-005h") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testValidation006a() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-006a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testValidation006b() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-006b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testValidation006c() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 11; + $card->expYear = 2015; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-006c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testValidation006d() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 11; + $card->expYear = 5; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-006d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testValidation006e() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "1234"; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-006e") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testValidation007a() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->number = "5425230000004415"; + $card->expMonth = 12; + $card->expYear = 2020; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-007a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testValidation007b() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->number = "5425230000004415"; + $card->expMonth = 12; + $card->expYear = 2020; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-007b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testValidation007d() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->number = "5425230000004415"; + $card->expMonth = 11; + $card->expYear = 2015; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-007d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testValidation007e() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->number = "5425230000004415"; + $card->expMonth = 11; + $card->expYear = 5; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-007e") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testValidation007f() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->number = "5425230000004415"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "1234"; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-007f") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testValidation008b() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->number = "374101000000608"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "1234"; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-008b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testValidation008c() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->number = "374101000000608"; + $card->expMonth = 11; + $card->expYear = 2015; + $card->cvn = "1234"; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-008c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testValidation008d() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->number = "374101000000608"; + $card->expMonth = 11; + $card->expYear = 5; + $card->cvn = "1234"; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-008d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testValidation009b() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->number = "30384800000000"; + $card->expMonth = 12; + $card->expYear = 2020; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-009b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testValidation009c() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->number = "30450100000000"; + $card->expMonth = 11; + $card->expYear = 2015; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-009c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testValidation009d() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "779|102"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "658|325"; + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->number = "30450100000000"; + $card->expMonth = 11; + $card->expYear = 5; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Validation-009d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testAVS001a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->StreetAddress1 = "Flat 123 House 456"; + $billingAddress->postalCode = "E77 4QJ"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "1"; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-AVS-001a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testAVS001b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->StreetAddress1 = "Flat #123 House No. 456"; + $billingAddress->postalCode = "E77 #4QJ"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "2"; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-AVS-001b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testAVS001c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->StreetAddress1 = "# Flat #123 House No. #456"; + $billingAddress->postalCode = "# E77 @~4 Q # J"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "3"; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-AVS-001c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testAVS001d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "4"; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-AVS-001d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testAVS001e() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->StreetAddress1 = "Lorem ipsum dolor sit 1amet; consectetur adipiscing elit. Aenean ali2quam tellus in elit hendrerit; non 3porttE77 4QJitor lorem venenatis. Pellentesque dictum eu nunc ac fringilla. In vitae quam eu odio sollicitudin rhoncus. Praesent ullamcorper eros vitae consequat tempus. In gravida viverra iaculis. Morbi dignissim orci et ipsum accumsan"; + $billingAddress->postalCode = "Lorem ipsum dolo1r sit amet; consectetur adipiscing elit. Aenean aliquam tellus in elit hendrerit; non porttE77 4QJitor lorem venenatis. Pellentesque dictum eu2 nunc ac fringilla. In vitae quam eu 3odio sollicitudin rhoncus. Praesent ullamcorper eros vitae consequat tempus. In gravida viverra iaculis. Morbi dignissim orci et ipsum accumsan"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "5"; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-AVS-001e") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testAVS001f() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->StreetAddress1 = "ABCDEFGHIJ"; + $billingAddress->postalCode = "ABCDEFGHIJ"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "6"; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-AVS-001f") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testAVS001g() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->StreetAddress1 = "Lorem ipsum dolor sit amet; consectetur adipiscing elit. Aenean aliquam tellus in elit hendrerit; non porttE77 4QJitor lorem venenatis. Pellentesque dictum eu nunc ac fringilla. In vitae quam eu odio sollicitudin rhoncus. Praesent ullamcorper eros vitae consequat tempus. In gravida viverra iaculis. Morbi dignissim orci et ipsum accumsan"; + $billingAddress->postalCode = "Lorem ipsum dolor sit amet; consectetur adipiscing elit. Aenean aliquam tellus in elit hendrerit; non porttE77 4QJitor lorem venenatis. Pellentesque dictum eu nunc ac fringilla. In vitae quam eu odio sollicitudin rhoncus. Praesent ullamcorper eros vitae consequat tempus. In gravida viverra iaculis. Morbi dignissim orci et ipsum accumsan"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "7"; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-AVS-001g") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testAVS003a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->StreetAddress1 = "Flat 123 House 456"; + $billingAddress->postalCode = "E77 4QJ"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "8"; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-AVS-003a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testAVS003b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->StreetAddress1 = "Flat 123 House 456"; + $billingAddress->postalCode = "E77 4QJ"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "9"; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-AVS-003b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testAVS003c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->StreetAddress1 = "Flat 123 House 456"; + $billingAddress->postalCode = "E77 4QJ"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "10"; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-AVS-003c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testAVS003d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->StreetAddress1 = "Flat 123 House 456"; + $billingAddress->postalCode = "E77 4QJ"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "11"; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-AVS-003d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testAVS003e() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->StreetAddress1 = "Flat 123 House 456"; + $billingAddress->postalCode = "E77 4QJ"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "12"; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-AVS-003e") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testAVS003f() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->StreetAddress1 = "Flat 123 House 456"; + $billingAddress->postalCode = "E77 4QJ"; + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "13"; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-AVS-003f") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testAVS003g() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "14"; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-AVS-003e") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testAVS003h() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "15"; + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("100") + ->withProductId("999") + ->withClientTransactionId("test") + ->withCustomerIpAddress("123.123.123.123") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-AVS-003f") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettleSample() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle006a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle006b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle006c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle006d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle006e() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle006f() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle006g() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle006h() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle006i() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle006k() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle007a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle007b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle007c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle007d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle007e() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle008a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle008b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle008c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle008d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle008e() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle009a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle009b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testSettle009c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOm"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testSettle009d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECO#"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle010c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle010d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle010e() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle011a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle011b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle011c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle011d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle012a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle012b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1.005) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1.005) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testSettle012c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture() + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testSettle012d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture() + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle012e() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1000) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1000) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testSettle012f() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture() + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle013a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testSettle013b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EURO") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EURO") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testSettle013c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EU#") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EU#") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle013d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle015a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle014a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle014b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle014c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle014d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle016a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle016b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle016c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-SettleAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle016d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle###") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testSettle017a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Settle") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testSettle017b() + { + $config = $this->getBaseConfig(); + $config->sharedSecret = 'secreto'; + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->authorize(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->capture(1) + ->withCurrency("EUR") + ->withDescription("SDK-JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testVoidSample() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("JAVA-Void") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testVoid006a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("JAVA-Void") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testVoid006b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("JAVA-Void") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testVoid006c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("JAVA-Void") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testVoid006d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("JAVA-Void") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testVoid006e() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("JAVA-Void") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testVoid006f() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("JAVA-Void") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testVoid006g() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("JAVA-Void") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testVoid006h() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("JAVA-Void") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testVoid006i() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("JAVA-Void") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testVoid006k() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("JAVA-Void") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testVoid007a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("JAVA-Void") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testVoid007b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("JAVA-Void") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testVoid007c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("JAVA-Void") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testVoid007d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("JAVA-Void") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testVoid007e() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("JAVA-Void") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testVoid008a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("JAVA-Void") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testVoid008b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("JAVA-Void") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testVoid008c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("JAVA-Void") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testVoid008d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("JAVA-Void") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testVoid009e() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "EC"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("JAVA-Void") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testVoid009a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("JAVA-Void") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testVoid009b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("JAVA-Void") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testVoid009c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOm"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("JAVA-Void") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testVoid009d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECO#"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("JAVA-Void") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testVoid010c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("JAVA-Void") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testVoid010d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("JAVA-Void") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testVoid010e() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("JAVA-Void") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testVoid011a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("JAVA-Void") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testVoid011b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("JAVA-Void") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testVoid011c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("JAVA-Void") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testVoid011d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("JAVA-Void") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testVoid012a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("JAVA-Void") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testVoid012b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("JAVA-Void") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testVoid012c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("JAVA-Void") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testVoid012d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("JAVA-Void") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testVoid013a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("JAVA-Void") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testVoid014a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("JAVA-Void") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testVoid014b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("JAVA-Void") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testVoid014c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("akshdfgakjdshfgjdshgfkjdsahgfjshagdfjshdagfkjdshgfjshdgfjdshgfkjhdsagfjdsgfdskjgfdsjkhgfdsjhgfkdsjgfkjdshgfkjdsahgfjdskhgfjhdsgfjkhsdgfjkhsdgfjhsdgfjhsdgfkjhgsadjfhgsakjdhgfsajdhgfkjsadgfjhsadgfjkhdsgafjhdsgfjhdsgfjhdsgfkjhdgsafjkhgsfjhsdagfkjsgdafjhsgdfjhgdskjfgdsjfhgjdskhgfjhdsgfjhdsgfkjhgdsfkjhgsdkjfgsdkjhgfkjsahgdfkjgdsajfhgdsjkgfjdshgfjkdsagfjkhdsgfjsdhgfjkdshgfkjhgdsfkjhgdskjfgdskjgfkjdsahgfjhgdsakjfgdsafjhgdsjkhgfkjdshgfakjadshgfjhdsagfjhgdsfjhgsdakjfgdsakjhgfjsdhgfjhdsgfjhdsgfkjgdsajkfhgjdshgfjdsahgfjkhdsagfjhdsgfjkgdsfjhdsgfjhgdsjfhgdsjhfgjdshgfkjdsgfkjsadgfjkgdsfkjhgdsajfkhgdsjkgfkjdsagfkjgdsakjfhgdsfjkhgdsafkjgsadkjgfdkjsahgfkjsagfkjdshgfkjshdgfjgdsfkjgsadkjhgfdsjhgfkjdsagfjhdsgfjhgdsakjfgdsakjhgfjsdahgfjkgdsfjhgdsajkhfgjhdsagfkjhsgdakjf") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testVoid014d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("SDK#####") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testVoid015a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("JAVA-Void") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testVoid015b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->void() + ->withDescription("JAVA-Void") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRebateSample() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRebate006a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRebate006b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRebate006c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRebate006d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRebate006e() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRebate006f() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRebate006g() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRebate006h() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRebate007a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRebate007b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRebate007c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRebate007d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRebate007e() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRebate008a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRebate008b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRebate008c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRebate008d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRebate008e() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRebate009a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testRebate009b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "EC"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testRebate009c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOm"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testRebate009d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECO#"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRebate010c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRebate010d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRebate010e() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRebate011a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testRebate011b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EURO") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EURO") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testRebate011c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EU##") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EU##") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testRebate011d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRebate012a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRebate012b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1.005) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1.005) + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testRebate012c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund() + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testRebate012d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund() + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRebate012e() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100000) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(100000) + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testRebate012f() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund() + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRebate013a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRebate013b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRebate013c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRebate013d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRebate014a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRebate014b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRebate014c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRebate014d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRebate015a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRebate016a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRebate016b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRebate016c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->withDescription("akshdfgakjdshfgjdshgfkjdsahgfjshagdfjshdagfkjdshgfjshdgfjdshgfkjhdsagfjdsgfdskjgfdsjkhgfdsjhgfkdsjgfkjdshgfkjdsahgfjdskhgfjhdsgfjkhsdgfjkhsdgfjhsdgfjhsdgfkjhgsadjfhgsakjdhgfsajdhgfkjsadgfjhsadgfjkhdsgafjhdsgfjhdsgfjhdsgfkjhdgsafjkhgsfjhsdagfkjsgdafjhsgdfjhgdskjfgdsjfhgjdskhgfjhdsgfjhdsgfkjhgdsfkjhgsdkjfgsdkjhgfkjsahgdfkjgdsajfhgdsjkgfjdshgfjkdsagfjkhdsgfjsdhgfjkdshgfkjhgdsfkjhgdskjfgdskjgfkjdsahgfjhgdsakjfgdsafjhgdsjkhgfkjdshgfakjadshgfjhdsagfjhgdsfjhgsdakjfgdsakjhgfjsdhgfjhdsgfjhdsgfkjgdsajkfhgjdshgfjdsahgfjkhdsagfjhdsgfjkgdsfjhdsgfjhgdsjfhgdsjhfgjdshgfkjdsgfkjsadgfjkgdsfkjhgdsajfkhgdsjkgfkjdsagfkjgdsakjfhgdsfjkhgdsafkjgsadkjgfdkjsahgfkjsagfkjdshgfkjshdgfjgdsfkjgsadkjhgfdsjhgfkjdsagfjhdsgfjhgdsakjfgdsakjhgfjsdahgfjkgdsfjhgdsajkhfgjhdsagfkjhsgdakjf") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRebate016d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->withDescription("SDK#####") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRebate017a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testRebate017b() + { + $config = $this->getBaseConfig(); + $config->sharedSecret = 'secreto'; + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(1) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Rebate") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTBSample() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB006a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB006b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB006c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB006d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB006e() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB006f() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB006g() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB006h() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB006i() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB006k() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->charge(1) + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB006l() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB007a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB007b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB007c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB007d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB007e() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB008a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB008b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB008c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB008d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB008e() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB009a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB009b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "EC"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB009c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB009d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB010c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB010d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB010e() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB012a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB012b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB012c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB012d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB012e() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB013a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB013b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testOTB013c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermeloooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB013d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB014a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB014b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testOTB014c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 18; + $card->expYear = 2012; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testOTB014d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = null; + $card->expYear = null; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB015a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB015b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB015c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB016a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB017a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testOTB017b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cvn = "1234"; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testOTB017c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cvn = "1.23457E+18"; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB017d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "374101000000608"; + $card->expMonth = 12; + $card->expYear = 2019; + $card->cvn = "1234"; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testOTB017f() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cvn = "7"; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testOTB017g() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cvn = "7"; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testOTB018a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testOTB018b() + { + $config = $this->getBaseConfig(); + $config->sharedSecret = 'secreto'; + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-OTB") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCreditSample() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit006a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit006b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit006c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit006d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit006e() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit006f() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit006g() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit006h() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit007a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit007b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit007c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit007d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit007e() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit008a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit008b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit008c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit008d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit008e() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit009a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit009b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "EC"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit009c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit009d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit010c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit010d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit010e() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit011a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit012a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit012b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit012c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit013a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit013b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testCredit013c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit014a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit014b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 1813; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit014c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 18; + $card->expYear = 2012; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit014d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = null; + $card->expYear = null; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit015a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit015b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit015c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit016a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit017a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit017b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testCredit017c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cvn = "123456789"; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit017d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "374101000000608"; + $card->expMonth = 12; + $card->expYear = 2018; + $card->cvn = "1234"; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testCredit017f() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4242424242424240"; + $card->expMonth = 12; + $card->expYear = 2018; + $card->cvn = "7"; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testCredit017g() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cvn = "12#"; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit018a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit018b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit018c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit018d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit019a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit019b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit019c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit020a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testCredit020b() + { + $config = $this->getBaseConfig(); + $config->sharedSecret = 'secreto'; + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit021a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit021b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1.005) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testCredit021c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund() + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testCredit021d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund() + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit021e() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(100000) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testCredit021f() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund() + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testCredit022a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EUR") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testCredit022b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EURO") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testCredit022c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withCurrency("EU#") + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testCredit022d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2018; + $card->cardHolderName = "Peter Watermelon"; + + // request + $response = $card->refund(1) + ->withDescription("JAVA-Credit") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testHoldSample() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::FRAUD) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testHold006a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::FRAUD) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testHold006b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::FRAUD) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testHold006c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::FRAUD) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testHold006d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::FRAUD) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testHold006e() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::FRAUD) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testHold006f() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::FRAUD) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testHold006g() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::FRAUD) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testHold006h() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::FRAUD) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testHold006i() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::FRAUD) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testHold006k() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::FRAUD) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testHold006l() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::FRAUD) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testHold007a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::FRAUD) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testHold007b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::FRAUD) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testHold007c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::FRAUD) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testHold007d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + ServicesContainer::configure($config); + + $saleResponse = Transaction::fromId(null); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::FRAUD) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testHold007e() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + ServicesContainer::configure($config); + + $saleResponse = Transaction::fromId(null); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::FRAUD) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testHold008a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::FRAUD) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testHold008b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::FRAUD) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testHold008c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + ServicesContainer::configure($config); + + $saleResponse = Transaction::fromId(null); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::FRAUD) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testHold008d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + ServicesContainer::configure($config); + + $saleResponse = Transaction::fromId(null); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::FRAUD) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testHold008e() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + ServicesContainer::configure($config); + + $saleResponse = Transaction::fromId(null); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::FRAUD) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testHold009c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::FRAUD) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testHold009d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + $saleResponse = Transaction::fromId(null); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::FRAUD) + ->withDescription("SDK-JAVA-Query") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testHold009e() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + $saleResponse = Transaction::fromId(null); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::FRAUD) + ->withDescription("SDK-JAVA-Query") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testHold010a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::FRAUD) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testHold010b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::FRAUD) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testHold010c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + $saleResponse = Transaction::fromId(null); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::FRAUD) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testHold010d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::FRAUD) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testHold011a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::FRAUD) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testHold011b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->hold() + ->withReasonCode(null) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testHold011c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->hold() + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testHold011d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->hold() + ->withReasonCode(null) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testHold012a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::FRAUD) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testHold012b() + { + $config = $this->getBaseConfig(); + $config->sharedSecret = 'secreto'; + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::FRAUD) + ->withDescription("SDK-JAVA-Query") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testHold013a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::FRAUD) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testHold013b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "EC"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::FRAUD) + ->withDescription("SDK-JAVA-Query") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testHold013c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOOOOOOOOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::FRAUD) + ->withDescription("SDK-JAVA-Query") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testReleaseSample() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // hold it first + $holdResponse = $saleResponse->hold() + ->withReasonCode(ReasonCode::OUT_OF_STOCK) + ->execute(); + $this->assertNotNull($holdResponse); + $this->assertEquals("00", $holdResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->release() + ->withReasonCode(ReasonCode::IN_STOCK) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRelease006a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // hold it first + $holdResponse = $saleResponse->hold() + ->withReasonCode(ReasonCode::OUT_OF_STOCK) + ->execute(); + $this->assertNotNull($holdResponse); + $this->assertEquals("00", $holdResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->release() + ->withReasonCode(ReasonCode::IN_STOCK) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRelease006b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // hold it first + $holdResponse = $saleResponse->hold() + ->withReasonCode(ReasonCode::OUT_OF_STOCK) + ->execute(); + $this->assertNotNull($holdResponse); + $this->assertEquals("00", $holdResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->release() + ->withReasonCode(ReasonCode::IN_STOCK) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRelease006c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // hold it first + $holdResponse = $saleResponse->hold() + ->withReasonCode(ReasonCode::OUT_OF_STOCK) + ->execute(); + $this->assertNotNull($holdResponse); + $this->assertEquals("00", $holdResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->release() + ->withReasonCode(ReasonCode::IN_STOCK) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRelease006d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // hold it first + $holdResponse = $saleResponse->hold() + ->withReasonCode(ReasonCode::OUT_OF_STOCK) + ->execute(); + $this->assertNotNull($holdResponse); + $this->assertEquals("00", $holdResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->release() + ->withReasonCode(ReasonCode::IN_STOCK) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRelease006e() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // hold it first + $holdResponse = $saleResponse->hold() + ->withReasonCode(ReasonCode::OUT_OF_STOCK) + ->execute(); + $this->assertNotNull($holdResponse); + $this->assertEquals("00", $holdResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->release() + ->withReasonCode(ReasonCode::IN_STOCK) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRelease006f() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // hold it first + $holdResponse = $saleResponse->hold() + ->withReasonCode(ReasonCode::OUT_OF_STOCK) + ->execute(); + $this->assertNotNull($holdResponse); + $this->assertEquals("00", $holdResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->release() + ->withReasonCode(ReasonCode::IN_STOCK) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRelease006g() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // hold it first + $holdResponse = $saleResponse->hold() + ->withReasonCode(ReasonCode::OUT_OF_STOCK) + ->execute(); + $this->assertNotNull($holdResponse); + $this->assertEquals("00", $holdResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->release() + ->withReasonCode(ReasonCode::IN_STOCK) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRelease006h() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // hold it first + $holdResponse = $saleResponse->hold() + ->withReasonCode(ReasonCode::OUT_OF_STOCK) + ->execute(); + $this->assertNotNull($holdResponse); + $this->assertEquals("00", $holdResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->release() + ->withReasonCode(ReasonCode::IN_STOCK) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRelease006i() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // hold it first + $holdResponse = $saleResponse->hold() + ->withReasonCode(ReasonCode::OUT_OF_STOCK) + ->execute(); + $this->assertNotNull($holdResponse); + $this->assertEquals("00", $holdResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->release() + ->withReasonCode(ReasonCode::IN_STOCK) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRelease006k() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // hold it first + $holdResponse = $saleResponse->hold() + ->withReasonCode(ReasonCode::OUT_OF_STOCK) + ->execute(); + $this->assertNotNull($holdResponse); + $this->assertEquals("00", $holdResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->release() + ->withReasonCode(ReasonCode::IN_STOCK) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRelease006l() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // hold it first + $holdResponse = $saleResponse->hold() + ->withReasonCode(ReasonCode::OUT_OF_STOCK) + ->execute(); + $this->assertNotNull($holdResponse); + $this->assertEquals("00", $holdResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->release() + ->withReasonCode(ReasonCode::IN_STOCK) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRelease007a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // hold it first + $holdResponse = $saleResponse->hold() + ->withReasonCode(ReasonCode::OUT_OF_STOCK) + ->execute(); + $this->assertNotNull($holdResponse); + $this->assertEquals("00", $holdResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->release() + ->withReasonCode(ReasonCode::IN_STOCK) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRelease007b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // hold it first + $holdResponse = $saleResponse->hold() + ->withReasonCode(ReasonCode::OUT_OF_STOCK) + ->execute(); + $this->assertNotNull($holdResponse); + $this->assertEquals("00", $holdResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->release() + ->withReasonCode(ReasonCode::IN_STOCK) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRelease007c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // hold it first + $holdResponse = $saleResponse->hold() + ->withReasonCode(ReasonCode::OUT_OF_STOCK) + ->execute(); + $this->assertNotNull($holdResponse); + $this->assertEquals("00", $holdResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->release() + ->withReasonCode(ReasonCode::IN_STOCK) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testRelease007d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + ServicesContainer::configure($config); + + $saleResponse = Transaction::fromId(null); + + // request + $response = $saleResponse->release() + ->withReasonCode(ReasonCode::IN_STOCK) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testRelease007e() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + ServicesContainer::configure($config); + + $saleResponse = Transaction::fromId(null); + + // request + $response = $saleResponse->release() + ->withReasonCode(ReasonCode::IN_STOCK) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testRelease008c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + ServicesContainer::configure($config); + + $saleResponse = Transaction::fromId(null); + + // request + $response = $saleResponse->release() + ->withReasonCode(ReasonCode::IN_STOCK) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testRelease008d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + ServicesContainer::configure($config); + + $saleResponse = Transaction::fromId(null); + + // request + $response = $saleResponse->release() + ->withReasonCode(ReasonCode::IN_STOCK) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testRelease008e() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + ServicesContainer::configure($config); + + $saleResponse = Transaction::fromId(null); + + // request + $response = $saleResponse->release() + ->withReasonCode(ReasonCode::IN_STOCK) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testRelease009d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + $saleResponse = Transaction::fromId(null); + + // request + $response = $saleResponse->release() + ->withReasonCode(ReasonCode::IN_STOCK) + ->withDescription("JAVA-Query") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testRelease009e() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + $saleResponse = Transaction::fromId(null); + + // request + $response = $saleResponse->release() + ->withReasonCode(ReasonCode::IN_STOCK) + ->withDescription("JAVA-Query") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRelease010a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::OTHER) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRelease010b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::FRAUD) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testRelease010c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + $saleResponse = Transaction::fromId(null); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::FRAUD) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRelease010d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::OTHER) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRelease011a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::OTHER) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRelease011b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->hold() + ->withReasonCode(null) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRelease011c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->hold() + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRelease011d() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->hold() + ->withReasonCode(null) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRelease012a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::OTHER) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testRelease012b() + { + $config = $this->getBaseConfig(); + $config->sharedSecret = 'secreto'; + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::OTHER) + ->withDescription("JAVA-Query") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testRelease013a() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::OTHER) + ->withDescription("JAVA-Hold") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testRelease013b() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "EC"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::OTHER) + ->withDescription("JAVA-Query") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testRelease013c() + { + $config = $this->getBaseConfig(); + $config->timeout = 5000; + $config->channel = "ECOOOOOOOOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $saleResponse->hold() + ->withReasonCode(ReasonCode::OTHER) + ->withDescription("JAVA-Query") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual006a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Manual-006a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual006b() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Manual-006b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual006c() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("USD") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Manual-006c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual006d() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Manual-006d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual006e() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Manual-006e") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual006f() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("USD") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Manual-006f") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual006g() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Manual-006g") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual006h() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Manual-006h") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual006i() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("USD") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Manual-006i") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual006j() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Manual-006j") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual006k() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Manual-006k") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual007a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Manual-007a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual007b() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Manual-007b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual007c() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("USD") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Manual-007c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual007d() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Manual-007d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual007e() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Manual-007e") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual008a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("USD") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Manual-008a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual008b() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Manual-008b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual008c() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Manual-008c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual008d() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("USD") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Manual-008d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual008e() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Manual-008e") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual009a() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOM"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Manual-009a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testManual009b() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "E"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("USD") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Manual-009b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testManual009c() + { + $config = $this->getBaseConfig(); + $config->timeout = 20000; + $config->channel = "ECOMMERCE"; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Manual-009c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual009d() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Manual-009d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual010a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("USD") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Manual-010a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual010b() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Manual-010b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual010c() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Manual-010c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual010d() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("USD") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Manual-010d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual010e() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Manual-010e") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual011a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Manual-011a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual011b() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("USD") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Manual-011b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual011c() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Manual-011c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testManual011d() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(10) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge() + ->withCurrency("EUR") + ->withDescription("JAVA-Manual-011d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual012a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("USD") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Manual-012a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testManual012b() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("EURO") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EURO") + ->withDescription("JAVA-Manual-012b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testManual012c() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("�UR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("�UR") + ->withDescription("JAVA-Manual-012c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testManual012d() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // request + $response = $card->charge(100.01) + ->withDescription("JAVA-Manual-012d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual013a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Manual-013a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual013b1() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Manual-013b1") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual013b2() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("USD") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Manual-013b2") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual013c() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Manual-013c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual014a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Manual-014a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual014b() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("USD") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Manual-014b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testManual014c() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + $card->cardHolderName = "3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep"; + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Manual-014c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual014d() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + $card->cardHolderName = "James~Mason"; + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Manual-014d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual015a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("USD") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Manual-015a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual015b() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Manual-015b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testManual015c() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 20; + $card->expYear = 2012; + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Manual-015c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testManual015d() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = null; + $card->expYear = null; + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("USD") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Manual-015d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual016a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Manual-016a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual016b() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Manual-016b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual016c() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("USD") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Manual-016c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual017a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Manual-017a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual018a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Manual-018a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual019a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("USD") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Manual-019a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testManual019b1() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "1234"; + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->ResponseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Manual-019b1") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->ResponseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testManual019b2() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "374101000000608"; + $card->expMonth = 12; + $card->expYear = 2020; + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->ResponseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Manual-019b2") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->ResponseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testManual019c() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "12345"; + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->ResponseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Manual-019c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->ResponseCode); + } + + public function testManual019d() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "374101000000608"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "1234"; + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("USD") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Manual-019d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual020a1() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Manual-020a1") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual020a2() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = ""; + $card->cvnPresenceIndicator = CvnPresenceIndicator::ILLEGIBLE; + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Manual-020a2") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual020a3() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = ""; + $card->cvnPresenceIndicator = CvnPresenceIndicator::NOT_ON_CARD; + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("USD") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Manual-020a3") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual020a4() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = ""; + $card->cvnPresenceIndicator = CvnPresenceIndicator::NOT_REQUESTED; + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Manual-020a4") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual020b() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvnPresenceIndicator = 5; + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Manual-020b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual020c() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = 0; + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("USD") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Manual-020c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual021a1() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Manual-021a1") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual021a2() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->Authorize(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Manual-021a2") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual021a3() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("USD") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->Authorize(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Manual-021a3") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual021b() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->Authorize(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Manual-021b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual021c() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("USD") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->Authorize(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Manual-021c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual022a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Manual-022a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual022b() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Manual-022b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual022c() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Manual-022c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual022d() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Manual-022d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual022e() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Manual-022e") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual023a1() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Manual-023a1") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual023a2() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("USD") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Manual-023a2") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual023b1() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Manual-023b1") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual023c() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Manual-023c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual024a1() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Manual-024a1") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual024a2() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("USD") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Manual-024a2") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual024a3() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Manual-024a3") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual024b() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Manual-024b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual024c() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("USD") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Manual-024c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual025() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Manual-025") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual026a1() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Manual-026a1") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual026a2() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual026b() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("USD") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual026c1() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIep3uviSnW9XEB3a4wpIW9XEB3a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual026c2() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Manual-026c2") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual027a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("USD") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withCustomerId("123456") + ->withDescription("JAVA-Manual-027a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual028a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("123456") + ->withDescription("JAVA-Manual-028a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual028b() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Manual-028b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testManual028c() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("USD") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withCustomerId("3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep33a4wpQQQQQQQQQ1") + ->withDescription("JAVA-Manual-028c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testManual028d() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerId("123456~") + ->withDescription("JAVA-Manual-028d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual029a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withProductId("123456") + ->withDescription("JAVA-Manual-029a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual029b() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("USD") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withDescription("JAVA-Manual-029b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testManual029c() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withProductId("3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep33a4wpQQQQQQQQQ1") + ->withDescription("JAVA-Manual-029c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testManual029d() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withProductId("123456~") + ->withDescription("JAVA-Manual-029d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual030a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("USD") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withClientTransactionId("123456") + ->withDescription("JAVA-Manual-030a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual030b() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Manual-030b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testManual030c() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withClientTransactionId("3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep33a4wpQQQQQQQQQ1") + ->withDescription("JAVA-Manual-030c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testManual030d() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("USD") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withClientTransactionId("123456~") + ->withDescription("JAVA-Manual-030d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual031a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerIpAddress("123.123.123.123") + ->withDescription("JAVA-Manual-031a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual031b() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Manual-031b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual031c1() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("USD") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withCustomerIpAddress("1234.123.123.123") + ->withDescription("JAVA-Manual-031c1") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual031c2() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withCustomerIpAddress("123~.123.123.123") + ->withDescription("JAVA-Manual-031c2") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual032a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "E77 4QJ"; + $billingAddress->country = "United Kingdom"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "Z76 PO9"; + $shippingAddress->country = "France"; + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Manual-032a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual033a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "774|10"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "769|52"; + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("USD") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Manual-033a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual033b1() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "774|10"; + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("USD") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withAddress($billingAddress) + ->withDescription("JAVA-Manual-033b1") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual033b2() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "769|52"; + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("USD") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Manual-033b2") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual033c1() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwep4wpIwep3u111"; + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("USD") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withAddress($billingAddress) + ->withDescription("JAVA-Manual-033c1") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual033c2() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwep4wpIwep3u111"; + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Manual-033c2") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual034a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->country = "GB"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->country = "FR"; + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withAddress($billingAddress) + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Manual-034a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual034b1() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->country = "GB"; + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("USD") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Manual-034b1") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual034b2() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->country = "GB"; + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withAddress($billingAddress) + ->withDescription("JAVA-Manual-034b2") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual034c1() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // billing address + $billingAddress = new Address(); + $billingAddress->country = "3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwep4wpIwep3u111"; + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withAddress($billingAddress) + ->withDescription("JAVA-Manual-034c1") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual034c2() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->country = "3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwep4wpIwep3u111"; + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("USD") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("USD") + ->withAddress($shippingAddress, AddressType::SHIPPING) + ->withDescription("JAVA-Manual-034c2") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual035a() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("GBP") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("GBP") + ->withDescription("JAVA-Manual-035a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testManual035b() + { + $config = $this->getBaseConfig(); + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + + // build transaction + $saleResponse = $card->charge(100.01) + ->withCurrency("EUR") + ->execute(); + $this->assertNotNull($saleResponse); + $this->assertEquals("00", $saleResponse->responseCode); + $this->tearDown(); + + // request + $response = $card->charge(100.01) + ->withCurrency("EUR") + ->withDescription("JAVA-Manual-035a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled014a() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001038443335"; + $card->expMonth = 10; + $card->expYear = 2025; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-014a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled014b() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001038488884"; + $card->expMonth = 10; + $card->expYear = 2025; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-014b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled014c() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001036298889"; + $card->expMonth = 10; + $card->expYear = 2025; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-014c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled014d() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001036853337"; + $card->expMonth = 10; + $card->expYear = 2025; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-014d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled014e() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 10; + $card->expYear = 2025; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-014e") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled014f() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037167778"; + $card->expMonth = 10; + $card->expYear = 2025; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-014f") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled014g() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 10; + $card->expYear = 2025; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-014g") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled014h() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037484447"; + $card->expMonth = 10; + $card->expYear = 2025; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-014h") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled014i() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037490006"; + $card->expMonth = 10; + $card->expYear = 2025; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-014i") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testverifyenrolled015a() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "5100000000000198�"; + $card->expMonth = 10; + $card->expYear = 2025; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-015a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled015b() + { + $this->markTestSkipped(); + + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "5100000000000149"; + $card->expMonth = 10; + $card->expYear = 2025; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-015b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled015c() + { + $this->markTestSkipped(); + + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "5100000000000172"; + $card->expMonth = 10; + $card->expYear = 2025; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-015c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled015d() + { + $this->markTestSkipped(); + + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "5100000000000297"; + $card->expMonth = 10; + $card->expYear = 2025; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-015d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled015e() + { + $this->markTestSkipped(); + + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "5100000000000131"; + $card->expMonth = 10; + $card->expYear = 2025; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-015e") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled015f() + { + $this->markTestSkipped(); + + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "5100000000000206"; + $card->expMonth = 10; + $card->expYear = 2025; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-015f") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled015g() + { + $this->markTestSkipped(); + + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "5100000000000131"; + $card->expMonth = 10; + $card->expYear = 2025; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-015g") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled015h() + { + $this->markTestSkipped(); + + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "5100000000000214"; + $card->expMonth = 10; + $card->expYear = 2025; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-015h") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled015i() + { + $this->markTestSkipped(); + + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "5100000000000164"; + $card->expMonth = 10; + $card->expYear = 2025; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-015i") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testverifyenrolled016a() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "370537726695896�"; + $card->expMonth = 10; + $card->expYear = 2025; + $card->cvn = "1234"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-016a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled016b() + { + $this->markTestSkipped(); + + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "344598846104303"; + $card->expMonth = 10; + $card->expYear = 2025; + $card->cvn = "1234"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-016b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled016c() + { + $this->markTestSkipped(); + + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "342911579886552"; + $card->expMonth = 10; + $card->expYear = 2025; + $card->cvn = "1234"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-016c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled016d() + { + $this->markTestSkipped(); + + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "377775599797356"; + $card->expMonth = 10; + $card->expYear = 2025; + $card->cvn = "1234"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-016d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled016e() + { + $this->markTestSkipped(); + + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "371810438025523"; + $card->expMonth = 10; + $card->expYear = 2025; + $card->cvn = "1234"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-016e") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled016f() + { + $this->markTestSkipped(); + + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "374973180958759"; + $card->expMonth = 10; + $card->expYear = 2025; + $card->cvn = "1234"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-016f") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled016g() + { + $this->markTestSkipped(); + + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "371810438025523"; + $card->expMonth = 10; + $card->expYear = 2025; + $card->cvn = "1234"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-016g") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled016h() + { + $this->markTestSkipped(); + + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "376515222233960"; + $card->expMonth = 10; + $card->expYear = 2025; + $card->cvn = "1234"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-016h") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled016i() + { + $this->markTestSkipped(); + + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "372749236937027"; + $card->expMonth = 10; + $card->expYear = 2025; + $card->cvn = "1234"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-016i") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled017a() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("GBP") + ->withDescription("JAVA-verifyenrolled-017a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled017b() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-017b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled017c() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("USD") + ->withDescription("JAVA-verifyenrolled-017c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled017d() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("GBP") + ->withDescription("JAVA-verifyenrolled-017d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled017e() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-017e") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled017f() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("USD") + ->withDescription("JAVA-verifyenrolled-017f") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled017g() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("GBP") + ->withDescription("JAVA-verifyenrolled-017g") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled017h() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-017h") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled017i() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("USD") + ->withDescription("JAVA-verifyenrolled-017i") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled017j() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("GBP") + ->withDescription("JAVA-verifyenrolled-017j") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled017k() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-017k") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled018a() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("GBP") + ->withDescription("JAVA-verifyenrolled-018a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled018b() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-018b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled018c() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("USD") + ->withDescription("JAVA-verifyenrolled-018c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled018d() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("GBP") + ->withDescription("JAVA-verifyenrolled-018d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled018e() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-018e") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled019a() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("USD") + ->withDescription("JAVA-verifyenrolled-019a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled019b() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("GBP") + ->withDescription("JAVA-verifyenrolled-019b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled019c() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-019c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled019d() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("USD") + ->withDescription("JAVA-verifyenrolled-019d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled019e() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("GBP") + ->withDescription("JAVA-verifyenrolled-019e") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled020b() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("GBP") + ->withDescription("JAVA-verifyenrolled-020b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled020c() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-020c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled020d() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("USD") + ->withDescription("JAVA-verifyenrolled-020d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled020e() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("GBP") + ->withDescription("JAVA-verifyenrolled-020e") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled021a() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-021a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled021b() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("USD") + ->withDescription("JAVA-verifyenrolled-021b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled021c() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("GBP") + ->withDescription("JAVA-verifyenrolled-021c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled021d() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-021d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled022a() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("USD") + ->withDescription("JAVA-verifyenrolled-022a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled022b() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EURO") + ->withDescription("JAVA-verifyenrolled-022b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled022c() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("�UR") + ->withDescription("JAVA-verifyenrolled-022c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled022d() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withDescription("JAVA-verifyenrolled-022d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled023a() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("GBP") + ->withDescription("JAVA-verifyenrolled-023a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled023b1() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-023b1") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testverifyenrolled023b2() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "42424242424"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("USD") + ->withDescription("JAVA-verifyenrolled-023b2") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testverifyenrolled023c() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4263970000005262#"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("GBP") + ->withDescription("JAVA-verifyenrolled-023c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled024a() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->CvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-024a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testverifyenrolled024b() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("USD") + ->withDescription("JAVA-verifyenrolled-024b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testverifyenrolled024c() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + $card->cardHolderName = "3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep"; + + // request + $response = $card->verify() + ->withCurrency("GBP") + ->withDescription("JAVA-verifyenrolled-024c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled024d() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + $card->cardHolderName = "James~Mason"; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-024d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled025a() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("USD") + ->withDescription("JAVA-verifyenrolled-025a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled025b() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("GBP") + ->withDescription("JAVA-verifyenrolled-025b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testverifyenrolled025c() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 20; + $card->expYear = 2012; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-025c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testverifyenrolled025d() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("USD") + ->withDescription("JAVA-verifyenrolled-025d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled026a() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("GBP") + ->withDescription("JAVA-verifyenrolled-026a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled026b() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-026b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled026c() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("USD") + ->withDescription("JAVA-verifyenrolled-026c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled027a() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("GBP") + ->withDescription("JAVA-verifyenrolled-027a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled028a() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-028a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled029a() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("USD") + ->withDescription("JAVA-verifyenrolled-029a") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testverifyenrolled029b1() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "1234"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("GBP") + ->withDescription("JAVA-verifyenrolled-029b1") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testverifyenrolled029b2() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "371810438025523"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("GBP") + ->withDescription("JAVA-verifyenrolled-029b2") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testverifyenrolled029c() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "12345"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-029c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled029d() + { + $this->markTestSkipped(); + + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "371810438025523"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "1234"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("USD") + ->withDescription("JAVA-verifyenrolled-029d") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled030a1() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; + + // request + $response = $card->verify() + ->withCurrency("GBP") + ->withDescription("JAVA-verifyenrolled-030a1") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled030a2() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = ""; + $card->cvnPresenceIndicator = CvnPresenceIndicator::ILLEGIBLE; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-030a2") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled030a3() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = ""; + $card->cvnPresenceIndicator = CvnPresenceIndicator::NOT_ON_CARD; + + // request + $response = $card->verify() + ->withCurrency("USD") + ->withDescription("JAVA-verifyenrolled-030a3") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled030a4() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = ""; + $card->cvnPresenceIndicator = CvnPresenceIndicator::NOT_REQUESTED; + + // request + $response = $card->verify() + ->withCurrency("GBP") + ->withDescription("JAVA-verifyenrolled-030a4") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testverifyenrolled030b() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = 5; + + // request + $response = $card->verify() + ->withCurrency("EUR") + ->withDescription("JAVA-verifyenrolled-030b") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + public function testverifyenrolled030c() + { + $config = $this->getBaseConfig(); + $config->timeout = 60000; + ServicesContainer::configure($config); + + // create card + $card = $this->getBaseCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 12; + $card->expYear = 2020; + $card->cvn = "123"; + $card->cvnPresenceIndicator = 0; + + // request + $response = $card->verify() + ->withCurrency("USD") + ->withDescription("JAVA-verifyenrolled-030c") + ->execute(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/CreditTest.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/CreditTest.php new file mode 100644 index 0000000..4102ced --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/CreditTest.php @@ -0,0 +1,285 @@ +number = '4111111111111111'; + $card->expMonth = 12; + $card->expYear = 2025; + $card->cvn = '123'; + $card->cardHolderName = 'Joe Smith'; + $this->card = $card; + + ServicesContainer::configure($this->getConfig()); + } + + public function testCreditAuthorization() + { + $authorization = $this->card->authorize(14) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($authorization); + $this->assertEquals('00', $authorization->responseCode); + + $capture = $authorization->capture(16) + ->withGratuity(2) + ->execute(); + $this->assertNotNull($capture); + $this->assertEquals('00', $capture->responseCode); + } + + public function testCreditServiceAuth() + { + $service = new CreditService( + $this->getConfig() + ); + + $authorization = $service->authorize(15) + ->withCurrency('USD') + ->withPaymentMethod($this->card) + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($authorization); + $this->assertEquals('00', $authorization->responseCode); + + $capture = $service->capture($authorization->transactionReference) + ->withAmount(17) + ->withGratuity(2) + ->execute(); + $this->assertNotNull($capture); + $this->assertEquals('00', $capture->responseCode); + } + + public function testCreditSale() + { + $response = $this->card->charge(15) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testCreditRefund() + { + $response = $this->card->refund(16) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testCreditRebate() + { + $response = $this->card->charge(17) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode, $response->responseMessage); + + $rebate = $response->refund(17) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($rebate); + $this->assertEquals('00', $rebate->responseCode, $rebate->responseMessage); + } + + public function testCreditVoid() + { + $response = $this->card->charge(15) + ->withCurrency('USD') + ->withAllowDuplicates(true) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode, $response->responseMessage); + + $voidResponse = $response->void()->execute(); + $this->assertNotNull($voidResponse); + $this->assertEquals('00', $voidResponse->responseCode, $voidResponse->responseMessage); + } + + public function testCreditVerify() + { + $response = $this->card->verify() + ->withAllowDuplicates(true) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + protected function getConfig() + { + $config = new ServicesConfig(); + $config->merchantId = 'heartlandgpsandbox'; + $config->accountId = 'api'; + $config->sharedSecret = 'secret'; + $config->rebatePassword = 'rebate'; + $config->refundPassword = 'refund'; + $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; + return $config; + } + + protected function dccSetup() + { + $config = new ServicesConfig(); + $config->merchantId = "heartlandgpsandbox"; + $config->accountId = "apidcc"; + $config->refundPassword = "refund"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; + + ServicesContainer::configure($config); + } + + public function testCreditGetDccInfo() + { + $this->dccSetup(); + + $this->card->number = '4002933640008365'; + $orderId = GenerationUtils::generateOrderId(); + + $dccDetails = $this->card->getDccRate(DccRateType::SALE, 10, 'USD', DccProcessor::FEXCO, $orderId); + + $this->assertNotNull($dccDetails); + $this->assertEquals('00', $dccDetails->responseCode, $dccDetails->responseMessage); + $this->assertNotNull($dccDetails->dccResponseResult); + } + + public function testCreditDccRateAuthorize() + { + $this->dccSetup(); + + $this->card->number = '4006097467207025'; + $orderId = GenerationUtils::generateOrderId(); + + $dccDetails = $this->card->getDccRate(DccRateType::SALE, 1001, 'EUR', DccProcessor::FEXCO, $orderId); + + $this->assertNotNull($dccDetails); + $this->assertEquals('00', $dccDetails->responseCode, $dccDetails->responseMessage); + $this->assertNotNull($dccDetails->dccResponseResult); + + //set Currency conversion rates + $dccValues = new DccRateData(); + $dccValues->orderId = $dccDetails->transactionReference->orderId; + $dccValues->dccProcessor = DccProcessor::FEXCO; + $dccValues->dccType = 1; + $dccValues->dccRateType = DccRateType::SALE; + $dccValues->currency = $dccDetails->dccResponseResult->cardHolderCurrency; + $dccValues->dccRate = $dccDetails->dccResponseResult->cardHolderRate; + $dccValues->amount = $dccDetails->dccResponseResult->cardHolderAmount; + + $response = $this->card->authorize(1001) + ->withCurrency('EUR') + ->withAllowDuplicates(true) + ->withDccRateData($dccValues) + ->withOrderId($orderId) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode, $response->responseMessage); + } + + public function testCreditDccRateCharge() + { + $this->dccSetup(); + + $this->card->number = '4006097467207025'; + $orderId = GenerationUtils::generateOrderId(); + + $dccDetails = $this->card->getDccRate(DccRateType::SALE, 1001, 'EUR', DccProcessor::FEXCO, $orderId); + + $this->assertNotNull($dccDetails); + $this->assertEquals('00', $dccDetails->responseCode, $dccDetails->responseMessage); + $this->assertNotNull($dccDetails->dccResponseResult); + + //set Currency conversion rates + $dccValues = new DccRateData(); + $dccValues->orderId = $dccDetails->transactionReference->orderId; + $dccValues->dccProcessor = DccProcessor::FEXCO; + $dccValues->dccType = 1; + $dccValues->dccRateType = DccRateType::SALE; + $dccValues->currency = $dccDetails->dccResponseResult->cardHolderCurrency; + $dccValues->dccRate = $dccDetails->dccResponseResult->cardHolderRate; + $dccValues->amount = $dccDetails->dccResponseResult->cardHolderAmount; + + $response = $this->card->charge(1001) + ->withCurrency('EUR') + ->withAllowDuplicates(true) + ->withDccRateData($dccValues) + ->withOrderId($orderId) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode, $response->responseMessage); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + * @expectedExceptionMessage Unexpected Gateway Response: 105 - Cannot find DCC information for that card + */ + public function testCreditDccInfoNotFound() + { + $this->dccSetup(); + + $this->card->number = '4002933640008365'; + $orderId = GenerationUtils::generateOrderId(); + + $dccDetails = $this->card->getDccRate(DccRateType::SALE, 10, 'EUR', DccProcessor::FEXCO, $orderId); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + * @expectedExceptionMessage Unexpected Gateway Response: 508 - Incorrect DCC information - doesn't correspond to dccrate request + */ + public function testCreditDccInfoMismatch() + { + $this->dccSetup(); + + $this->card->number = '4006097467207025'; + $orderId = GenerationUtils::generateOrderId(); + + $dccDetails = $this->card->getDccRate(DccRateType::SALE, 1001, 'EUR', DccProcessor::FEXCO, $orderId); + + $this->assertNotNull($dccDetails); + $this->assertEquals('00', $dccDetails->responseCode, $dccDetails->responseMessage); + $this->assertNotNull($dccDetails->dccResponseResult); + + $dccValues = new DccRateData(); + $dccValues->orderId = $dccDetails->transactionReference->orderId; + $dccValues->dccProcessor = DccProcessor::FEXCO; + $dccValues->dccType = 1; + $dccValues->dccRateType = DccRateType::SALE; + $dccValues->currency = $dccDetails->dccResponseResult->cardHolderCurrency; + $dccValues->dccRate = $dccDetails->dccResponseResult->cardHolderRate; + $dccValues->amount = $dccDetails->dccResponseResult->cardHolderAmount; + + $response = $this->card->authorize(100) + ->withCurrency('EUR') + ->withAllowDuplicates(true) + ->withDccRateData($dccValues) + ->withOrderId($orderId) + ->execute(); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/Hpp/RealexHppClient.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/Hpp/RealexHppClient.php new file mode 100644 index 0000000..dc7bfd1 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/Hpp/RealexHppClient.php @@ -0,0 +1,249 @@ +sharedSecret = $sharedSecret; + } + + public function sendRequest($jsonData, $hppVersion = '') + { + $this->paymentData = GenerationUtils::decodeJson($jsonData, true, $hppVersion); + + $timestamp = $this->getValue('TIMESTAMP'); + $merchantId = $this->getValue('MERCHANT_ID'); + $account = $this->getValue('ACCOUNT'); + $orderId = $this->getValue('ORDER_ID'); + $amount = $this->getValue('AMOUNT'); + $currency = $this->getValue('CURRENCY'); + $autoSettle = $this->getValue('AUTO_SETTLE_FLAG'); + $requestHash = $this->getValue('SHA1HASH'); + $shippingCode = $this->getValue('SHIPPING_CODE'); + $shippingCountry = $this->getValue('SHIPPING_CO'); + $billingCode = $this->getValue('BILLING_CODE'); + $billingCountry = $this->getValue('BILLING_CO'); + + $config = new ServicesConfig(); + $config->merchantId = $merchantId; + $config->accountId = $account; + $config->sharedSecret = $this->sharedSecret; + $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; + $config->hostedPaymentConfig = new HostedPaymentConfig(); + $config->hostedPaymentConfig->language = "GB"; + $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; + $config->hostedPaymentConfig->version = $hppVersion; + + ServicesContainer::configure($config); + + // create the card object + $card = new CreditCardData(); + $card->number = '4006097467207025'; + $card->expMonth = 12; + $card->expYear = 2025; + $card->cvn = '131'; + $card->cardHolderName = 'James Mason'; + + // // check hash + $hashParam = [ + $timestamp, + $merchantId, + $orderId, + $amount, + $currency + ]; + + //for stored card + + if (!empty($this->paymentData['OFFER_SAVE_CARD'])) { + $hashParam[] = (!empty($this->paymentData['PAYER_REF'])) ? + $this->paymentData['PAYER_REF'] : null; + $hashParam[] = (!empty($this->paymentData['PMT_REF'])) ? + $this->paymentData['PMT_REF'] : null; + } + + $newHash = GenerationUtils::generateHash( + $this->sharedSecret, + implode('.', $hashParam) + ); + if ($newHash != $requestHash) { + throw new ApiException("Incorrect hash. Please check your code and the Developers Documentation."); + } + + // build request + if ($amount == null) { + $validate = $this->getValue("VALIDATE_CARD_ONLY"); + if ($validate) { + $gatewayRequest = $card->verify(); + } else { + $gatewayRequest = $card->verify()->WithRequestMultiUseToken(true); + } + } else { + $amount = $amount / 100; + if ($autoSettle) { + $gatewayRequest = $card->charge($amount); + } else { + $gatewayRequest = $card->authorize($amount); + } + } + + try { + $gatewayRequest + ->WithCurrency($currency) + ->WithOrderId($orderId) + ->withTimeStamp($timestamp); + + $this->addAddressDetails($gatewayRequest, $billingCode, $billingCountry, AddressType::BILLING); + $this->addAddressDetails($gatewayRequest, $shippingCode, $shippingCountry, AddressType::SHIPPING); + + //handle DCC + $this->addDCCInfo($gatewayRequest, $orderId); + + //handle fraud management + $this->addFraudManagementInfo($gatewayRequest, $orderId); + + $gatewayResponse = $gatewayRequest->execute(); + + if ($gatewayResponse->responseCode === '00') { + return $this->convertResponse($gatewayResponse); + } + } catch (ApiException $exc) { + throw $exc; + } + return null; + } + + public function getValue($value) + { + if (isset($this->paymentData[$value])) { + return $this->paymentData[$value]; + } + return null; + } + + public function addDCCInfo($gatewayRequest, $orderId) + { + if (!empty($this->paymentData['DCC_ENABLE'])) { + $dccInfo = $this->getValue('DCC_INFO'); + + $dccValues = new DccRateData(); + $dccValues->orderId = $orderId; + $dccValues->dccProcessor = $dccInfo['CCP']; + $dccValues->dccType = $dccInfo['TYPE']; + $dccValues->dccRateType = $dccInfo['RATE_TYPE']; + $dccValues->currency = $dccInfo['CURRENCY']; + $dccValues->dccRate = $dccInfo['RATE']; + $dccValues->amount = $dccInfo['AMOUNT']; + + $gatewayRequest + ->withDccRateData($dccValues); + } + } + + public function addFraudManagementInfo($gatewayRequest, $orderId) + { + if (!empty($this->paymentData['HPP_FRAUD_FILTER_MODE'])) { + $tssInfo = $this->getValue('TSS_INFO'); + + $this->addAddressDetails( + $gatewayRequest, + $tssInfo['BILLING_ADDRESS']['CODE'], + $tssInfo['BILLING_ADDRESS']['COUNTRY'], + AddressType::BILLING + ); + + $this->addAddressDetails( + $gatewayRequest, + $tssInfo['SHIPPING_ADDRESS']['CODE'], + $tssInfo['SHIPPING_ADDRESS']['COUNTRY'], + AddressType::SHIPPING + ); + + $gatewayRequest + ->withProductId($tssInfo['PRODID']) // prodid + ->withClientTransactionId($tssInfo['VARREF']) // varref + ->withCustomerId($tssInfo['CUSTNUM']) // custnum + ->withCustomerIpAddress($tssInfo['CUSTIPADDRESS']) + ->withFraudFilter($this->paymentData['HPP_FRAUD_FILTER_MODE']); + } + } + + public function addAddressDetails($gatewayRequest, $code, $country, $addressType = AddressType::BILLING) + { + if ($code != null || $country != null) { + $address = new Address(); + $address->postalCode = $code; + $address->country = $country; + + $gatewayRequest + ->WithAddress($address, $addressType); + } + } + + public function convertResponse($gatewayResponse) + { + $merchantId = $this->paymentData['MERCHANT_ID']; + $account = $this->paymentData['ACCOUNT']; + + $newHash = GenerationUtils::generateHash( + $this->sharedSecret, + implode('.', [ + $gatewayResponse->timestamp, + $merchantId, + $gatewayResponse->transactionReference->orderId, + $gatewayResponse->responseCode, + $gatewayResponse->responseMessage, + $gatewayResponse->transactionReference->transactionId, + $gatewayResponse->transactionReference->authCode + ]) + ); + + // begin building response + $response = [ + 'MERCHANT_ID' => $merchantId, + 'ACCOUNT' => $this->getValue('ACCOUNT'), + 'ORDER_ID' => $gatewayResponse->transactionReference->orderId, + 'TIMESTAMP' => $gatewayResponse->timestamp, + 'RESULT' => $gatewayResponse->responseCode, + 'PASREF' => $gatewayResponse->transactionReference->transactionId, + 'AUTHCODE' => $gatewayResponse->transactionReference->authCode, + 'AVSPOSTCODERESULT' => $gatewayResponse->avsResponseCode, + 'CVNRESULT' => $gatewayResponse->cvnResponseCode, + 'HPP_LANG' => $this->getValue('HPP_LANG'), + 'SHIPPING_CODE' => $this->getValue('SHIPPING_CODE'), + 'SHIPPING_CO' => $this->getValue('SHIPPING_CO'), + 'BILLING_CODE' => $this->getValue('BILLING_CODE'), + 'BILLING_CO' => $this->getValue('BILLING_CO'), + 'ECI' => $this->getValue('ECI'), + 'CAVV' => $this->getValue('CAVV'), + 'XID' => $this->getValue('XID'), + 'MERCHANT_RESPONSE_URL' => $this->getValue('MERCHANT_RESPONSE_URL'), + 'CARD_PAYMENT_BUTTON' => $this->getValue('CARD_PAYMENT_BUTTON'), + 'MESSAGE' => $gatewayResponse->responseMessage, + 'AMOUNT' => $this->getValue('AMOUNT'), + 'SHA1HASH' => $newHash, + 'DCC_INFO_REQUST' => $this->getValue('DCC_INFO'), + 'DCC_INFO_RESPONSE' => $gatewayResponse->dccResponseResult, + 'HPP_FRAUD_FILTER_MODE' => $this->getValue('HPP_FRAUD_FILTER_MODE'), + 'TSS_INFO' => $this->getValue('TSS_INFO') + ]; + + return json_encode($response); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/HppTest.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/HppTest.php new file mode 100644 index 0000000..66dace3 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/HppTest.php @@ -0,0 +1,654 @@ +merchantId = "heartlandgpsandbox"; + $config->accountId = "hpp"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; + $config->hostedPaymentConfig = new HostedPaymentConfig(); + $config->hostedPaymentConfig->language = "GB"; + $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; + + return new HostedService($config); + } + + public function testCreditAuth() + { + $config = new ServicesConfig(); + $config->merchantId = "heartlandgpsandbox"; + $config->accountId = "hpp"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; + $config->hostedPaymentConfig = new HostedPaymentConfig(); + $config->hostedPaymentConfig->language = "GB"; + $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; + + $client = new RealexHppClient("secret"); + + $address = new Address(); + $address->postalCode = "123|56"; + $address->country = "IRELAND"; + + //run test cases for different version + foreach ($this->hppVersionList as $hppVersion) { + $config->hostedPaymentConfig->version = $hppVersion; + $service = new HostedService($config); + + $json = $service->authorize(1) + ->withCurrency("EUR") + ->withCustomerId("123456") + ->withAddress($address) + ->serialize(); + + $this->assertNotNull($json); + + $response = $client->sendRequest($json, $hppVersion); + $this->assertNotNull($response); + + $parsedResponse = $service->parseResponse($response); + $this->assertEquals("00", $parsedResponse->responseCode); + } + } + + public function testCreditSale() + { + $config = new ServicesConfig(); + $config->merchantId = "heartlandgpsandbox"; + $config->accountId = "hpp"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; + $config->hostedPaymentConfig = new HostedPaymentConfig(); + $config->hostedPaymentConfig->language = "GB"; + $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; + + $client = new RealexHppClient("secret"); + + $address = new Address(); + $address->postalCode = "123|56"; + $address->country = "IRELAND"; + + //run test cases for different version + foreach ($this->hppVersionList as $hppVersion) { + $config->hostedPaymentConfig->version = $hppVersion; + $service = new HostedService($config); + + $json = $service->charge(1) + ->withCurrency("EUR") + ->withCustomerId("123456") + ->withAddress($address) + ->serialize(); + $this->assertNotNull($json); + + $response = $client->sendRequest($json, $hppVersion); + $this->assertNotNull($response); + + $parsedResponse = $service->parseResponse($response); + + $this->assertNotNull($parsedResponse); + $this->assertEquals("00", $parsedResponse->responseCode); + } + } + + /* 03. ProcessPaymentOtbRequest */ + + public function testCreditVerify() + { + $config = new ServicesConfig(); + $config->merchantId = "heartlandgpsandbox"; + $config->accountId = "hpp"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; + $config->hostedPaymentConfig = new HostedPaymentConfig(); + $config->hostedPaymentConfig->language = "GB"; + $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; + + $client = new RealexHppClient("secret"); + + $address = new Address(); + $address->postalCode = "123|56"; + $address->country = "IRELAND"; + + //run test cases for different version + foreach ($this->hppVersionList as $hppVersion) { + $config->hostedPaymentConfig->version = $hppVersion; + $service = new HostedService($config); + + $json = $service->verify() + ->withCurrency("EUR") + ->withCustomerId("123456") + ->withAddress($address) + ->serialize(); + $this->assertNotNull($json); + + $response = $client->sendRequest($json, $hppVersion); + $this->assertNotNull($response); + + $parsedResponse = $service->parseResponse($response); + $this->assertNotNull($parsedResponse); + $this->assertEquals("00", $parsedResponse->responseCode); + } + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testAuthNoAmount() + { + $service = $this->basicSetup(); + $service->authorize(null)->withCurrency("USD")->serialize(); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testAuthNoCurrency() + { + $service = $this->basicSetup(); + $service->authorize(10)->serialize(); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testSaleNoAmount() + { + $service = $this->basicSetup(); + $service->charge(null)->withCurrency("USD")->serialize(); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testSaleNoCurrency() + { + $service = $this->basicSetup(); + $service->charge(10)->serialize(); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testVerifyNoCurrency() + { + $service = $this->basicSetup(); + $service->verify()->serialize(); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testVerifyWithAmount() + { + $service = $this->basicSetup(); + $service->verify()->withAmount(10)->serialize(); + } + + /* 05. CardStorageCreatePayerStoreCardRequest */ + + public function testCardStorageCreatePayer() + { + $config = new ServicesConfig(); + $config->merchantId = "heartlandgpsandbox"; + $config->accountId = "3dsecure"; + $config->refundPassword = "refund"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; + $config->hostedPaymentConfig = new HostedPaymentConfig(); + $config->hostedPaymentConfig->language = "GB"; + $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; + + $client = new RealexHppClient("secret"); + + // data to be passed to the HPP along with transaction level settings + $hostedPaymentData = new HostedPaymentData(); + $hostedPaymentData->offerToSaveCard = "1"; // display the save card tick box + $hostedPaymentData->customerExists = "0"; // new customer + //run test cases for different version + foreach ($this->hppVersionList as $hppVersion) { + $config->hostedPaymentConfig->version = $hppVersion; + $service = new HostedService($config); + + $json = $service->charge(15) + ->withCurrency("EUR") + ->withHostedPaymentData($hostedPaymentData) + ->serialize(); + + $this->assertNotNull($json); + + $response = $client->sendRequest($json, $hppVersion); + $this->assertNotNull($response); + + $parsedResponse = $service->parseResponse($response); + $this->assertNotNull($parsedResponse); + $this->assertEquals("00", $parsedResponse->responseCode); + } + } + + /* 07. CardStorageDisplayStoredCardsRequest */ + + public function testCardStorageDisplayStoredCard() + { + $config = new ServicesConfig(); + $config->merchantId = "heartlandgpsandbox"; + $config->accountId = "3dsecure"; + $config->refundPassword = "refund"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; + $config->hostedPaymentConfig = new HostedPaymentConfig(); + $config->hostedPaymentConfig->language = "GB"; + $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; + + $client = new RealexHppClient("secret"); + + // data to be passed to the HPP along with transaction level settings + $hostedPaymentData = new HostedPaymentData(); + $hostedPaymentData->offerToSaveCard = "1"; + $hostedPaymentData->customerExists = "1"; + $hostedPaymentData->customerKey = "5e7e9152-2d53-466d-91bc-6d12ebc56b79"; + + //run test cases for different version + foreach ($this->hppVersionList as $hppVersion) { + $config->hostedPaymentConfig->version = $hppVersion; + $service = new HostedService($config); + + $json = $service->charge(15) + ->withCurrency("EUR") + ->withHostedPaymentData($hostedPaymentData) + ->serialize(); + + $this->assertNotNull($json); + + $response = $client->sendRequest($json, $hppVersion); + $this->assertNotNull($response); + + $parsedResponse = $service->parseResponse($response); + $this->assertNotNull($parsedResponse); + $this->assertEquals("00", $parsedResponse->responseCode); + } + } + + /* 09. ContinuousAuthorityRequest */ + + public function testContinuousAuthorityRequest() + { + $config = new ServicesConfig(); + $config->merchantId = "heartlandgpsandbox"; + $config->accountId = "3dsecure"; + $config->refundPassword = "refund"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; + $config->hostedPaymentConfig = new HostedPaymentConfig(); + $config->hostedPaymentConfig->language = "GB"; + $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; + + $client = new RealexHppClient("secret"); + + //run test cases for different version + foreach ($this->hppVersionList as $hppVersion) { + $config->hostedPaymentConfig->version = $hppVersion; + $service = new HostedService($config); + + $json = $service->charge(15) + ->withCurrency("EUR") + ->withRecurringInfo(RecurringType::FIXED, RecurringSequence::FIRST) + ->serialize(); + + $this->assertNotNull($json); + + $response = $client->sendRequest($json, $hppVersion); + $this->assertNotNull($response); + + $parsedResponse = $service->parseResponse($response); + $this->assertNotNull($parsedResponse); + $this->assertEquals("00", $parsedResponse->responseCode); + } + } + + /* 13. DynamicCurrencyConversionRequest */ + + public function testEnableDynamicCurrencyConversionRequest() + { + //set config for DCC + $config = new ServicesConfig(); + $config->merchantId = "MerchantId"; + $config->accountId = "internet"; + $config->refundPassword = "refund"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; + + $config->hostedPaymentConfig = new HostedPaymentConfig(); + $config->hostedPaymentConfig->language = "GB"; + $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; + $config->hostedPaymentConfig->version = HppVersion::VERSION_2; + $config->hostedPaymentConfig->directCurrencyConversionEnabled = "1"; + + $service = new HostedService($config); + $client = new RealexHppClient("secret"); + + //serialize the request + $json = $service->Charge(19) + ->withCurrency("EUR") + ->withTimestamp("20170725154824") + ->withOrderId('GTI5Yxb0SumL_TkDMCAxQA') + ->serialize(); + + $this->assertNotNull($json); + $this->assertEquals($json, '{"MERCHANT_ID":"MerchantId","ACCOUNT":"internet","ORDER_ID":"GTI5Yxb0SumL_TkDMCAxQA","AMOUNT":"1900","CURRENCY":"EUR","TIMESTAMP":"20170725154824","AUTO_SETTLE_FLAG":"1","DCC_ENABLE":"1","HPP_LANG":"GB","MERCHANT_RESPONSE_URL":"http:\/\/requestb.in\/10q2bjb1","HPP_VERSION":"2","SHA1HASH":"448d742db89b05ce97152beb55157c904f3839cc"}'); + } + + public function testDisableDynamicCurrencyConversionRequest() + { + //set config for DCC + $config = new ServicesConfig(); + $config->merchantId = "MerchantId"; + $config->accountId = "internet"; + $config->refundPassword = "refund"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; + + $config->hostedPaymentConfig = new HostedPaymentConfig(); + $config->hostedPaymentConfig->language = "GB"; + $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; + $config->hostedPaymentConfig->version = HppVersion::VERSION_2; + $config->hostedPaymentConfig->directCurrencyConversionEnabled = "0"; + + $service = new HostedService($config); + $client = new RealexHppClient("secret"); + + //serialize the request + $json = $service->Charge(19) + ->withCurrency("EUR") + ->withTimestamp("20170725154824") + ->withOrderId('GTI5Yxb0SumL_TkDMCAxQA') + ->serialize(); + + $this->assertNotNull($json); + $this->assertEquals($json, '{"MERCHANT_ID":"MerchantId","ACCOUNT":"internet","ORDER_ID":"GTI5Yxb0SumL_TkDMCAxQA","AMOUNT":"1900","CURRENCY":"EUR","TIMESTAMP":"20170725154824","AUTO_SETTLE_FLAG":"1","DCC_ENABLE":"0","HPP_LANG":"GB","MERCHANT_RESPONSE_URL":"http:\/\/requestb.in\/10q2bjb1","HPP_VERSION":"2","SHA1HASH":"448d742db89b05ce97152beb55157c904f3839cc"}'); + } + + /* 11. FraudManagementRequest */ + + public function testFraudManagementRequest() + { + $config = new ServicesConfig(); + $config->merchantId = "heartlandgpsandbox"; + $config->accountId = "3dsecure"; + $config->refundPassword = "refund"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; + $config->hostedPaymentConfig = new HostedPaymentConfig(); + $config->hostedPaymentConfig->language = "GB"; + $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; + $config->hostedPaymentConfig->version = 2; + $config->hostedPaymentConfig->FraudFilterMode = FraudFilterMode::PASSIVE; + + $service = new HostedService($config); + $client = new RealexHppClient("secret"); + + // billing address + $billingAddress = new Address(); + $billingAddress->postalCode = "50001|Flat 123"; + $billingAddress->country = "US"; + + // shipping address + $shippingAddress = new Address(); + $shippingAddress->postalCode = "654|123"; + $shippingAddress->country = "GB"; + + // data to be passed to the HPP along with transaction level settings + $hostedPaymentData = new HostedPaymentData(); + $hostedPaymentData->customerNumber = "E8953893489"; // display the save card tick box + $hostedPaymentData->productId = "SID9838383"; // new customer + + //serialize the request + $json = $service->charge(19) + ->withCurrency("EUR") + ->withAddress($billingAddress, AddressType::BILLING) + ->withAddress($shippingAddress, AddressType::SHIPPING) + //->withProductId("SID9838383") // prodid + ->withClientTransactionId("Car Part HV") // varref + //->withCustomerId("E8953893489") // custnum + ->withCustomerIpAddress("123.123.123.123") + //->withFraudFilter(FraudFilterMode::PASSIVE) + ->withHostedPaymentData($hostedPaymentData) + ->serialize(); + + $this->assertNotNull($json); + + //make API call + $response = $client->sendRequest($json, $config->hostedPaymentConfig->version); + $this->assertNotNull($response); + + $parsedResponse = $service->parseResponse($response); + $this->assertNotNull($parsedResponse); + $this->assertEquals("00", $parsedResponse->responseCode); + } + + /* Serialize methods Test case */ + + public function testBasicAuthHppVersion1() + { + $config = new ServicesConfig(); + $config->merchantId = "MerchantId"; + $config->accountId = "internet"; + $config->refundPassword = "refund"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://pay.sandbox.realexpayments.com/pay"; + $config->hostedPaymentConfig = new HostedPaymentConfig(); + $config->hostedPaymentConfig->language = "GB"; + $config->hostedPaymentConfig->responseUrl = "https://www.example.com/response"; + $config->hostedPaymentConfig->version = HppVersion::VERSION_1; + + $service = new HostedService($config); + $client = new RealexHppClient("secret"); + + $json = $service->authorize(19.99) + ->withCurrency("EUR") + ->withTimeStamp("20170725154824") + ->WithOrderId("GTI5Yxb0SumL_TkDMCAxQA") + ->serialize(); + + $expectedJson = '{"MERCHANT_ID":"TWVyY2hhbnRJZA==","ACCOUNT":"aW50ZXJuZXQ=","ORDER_ID":"R1RJNVl4YjBTdW1MX1RrRE1DQXhRQQ==","AMOUNT":"MTk5OQ==","CURRENCY":"RVVS","TIMESTAMP":"MjAxNzA3MjUxNTQ4MjQ=","AUTO_SETTLE_FLAG":"MA==","HPP_LANG":"R0I=","MERCHANT_RESPONSE_URL":"aHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vcmVzcG9uc2U=","HPP_VERSION":"MQ==","SHA1HASH":"MDYxNjA5Zjg1YThlMDE5MWRjN2Y0ODdmODI3OGU3MTg5OGEyZWUyZA=="}'; + $this->assertEquals($json, $expectedJson); + } + + public function testBasicAuthHppVersion2() + { + $config = new ServicesConfig(); + $config->merchantId = "MerchantId"; + $config->accountId = "internet"; + $config->refundPassword = "refund"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://pay.sandbox.realexpayments.com/pay"; + $config->hostedPaymentConfig = new HostedPaymentConfig(); + $config->hostedPaymentConfig->language = "GB"; + $config->hostedPaymentConfig->responseUrl = "https://www.example.com/response"; + $config->hostedPaymentConfig->version = HppVersion::VERSION_2; + + $service = new HostedService($config); + $client = new RealexHppClient("secret"); + + $json = $service->authorize(19.99) + ->withCurrency("EUR") + ->withTimeStamp("20170725154824") + ->WithOrderId("GTI5Yxb0SumL_TkDMCAxQA") + ->serialize(); + + $expectedJson = '{"MERCHANT_ID":"MerchantId","ACCOUNT":"internet","ORDER_ID":"GTI5Yxb0SumL_TkDMCAxQA","AMOUNT":"1999","CURRENCY":"EUR","TIMESTAMP":"20170725154824","AUTO_SETTLE_FLAG":"0","HPP_LANG":"GB","MERCHANT_RESPONSE_URL":"https:\/\/www.example.com\/response","HPP_VERSION":"2","SHA1HASH":"061609f85a8e0191dc7f487f8278e71898a2ee2d"}'; + $this->assertEquals($json, $expectedJson); + } + + public function testBasicSale() + { + $config = new ServicesConfig(); + $config->merchantId = "MerchantId"; + $config->accountId = "internet"; + $config->refundPassword = "refund"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://pay.sandbox.realexpayments.com/pay"; + $config->hostedPaymentConfig = new HostedPaymentConfig(); + $config->hostedPaymentConfig->language = "GB"; + $config->hostedPaymentConfig->responseUrl = "https://www.example.com/response"; + $config->hostedPaymentConfig->version = HppVersion::VERSION_2; + + $service = new HostedService($config); + $client = new RealexHppClient("secret"); + + $json = $service->charge(19.99) + ->withCurrency("EUR") + ->withTimeStamp("20170725154824") + ->WithOrderId("GTI5Yxb0SumL_TkDMCAxQA") + ->serialize(); + + $expectedJson = '{"MERCHANT_ID":"MerchantId","ACCOUNT":"internet","ORDER_ID":"GTI5Yxb0SumL_TkDMCAxQA","AMOUNT":"1999","CURRENCY":"EUR","TIMESTAMP":"20170725154824","AUTO_SETTLE_FLAG":"1","HPP_LANG":"GB","MERCHANT_RESPONSE_URL":"https:\/\/www.example.com\/response","HPP_VERSION":"2","SHA1HASH":"061609f85a8e0191dc7f487f8278e71898a2ee2d"}'; + $this->assertEquals($json, $expectedJson); + } + + public function testBasicHostedPaymentDataHppVersion1() + { + $config = new ServicesConfig(); + $config->merchantId = "MerchantId"; + $config->accountId = "internet"; + $config->refundPassword = "refund"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://pay.sandbox.realexpayments.com/pay"; + $config->hostedPaymentConfig = new HostedPaymentConfig(); + $config->hostedPaymentConfig->language = "GB"; + $config->hostedPaymentConfig->responseUrl = "https://www.example.com/response"; + $config->hostedPaymentConfig->version = HppVersion::VERSION_1; + + $service = new HostedService($config); + $client = new RealexHppClient("secret"); + + $hostedPaymentData = new HostedPaymentData(); + $hostedPaymentData->offerToSaveCard = "1"; // display the save card tick box + $hostedPaymentData->customerExists = "0"; // new customer + $hostedPaymentData->customerNumber = 'a028774f-beff-47bc-bd6e-ed7e04f5d758a028774f-btefa'; + $hostedPaymentData->productId = 'a0b38df5-b23c-4d82-88fe-2e9c47438972-b23c-4d82-88f'; + + $json = $service->charge(19.99) + ->withCurrency("EUR") + ->withTimeStamp("20170725154824") + ->WithOrderId("GTI5Yxb0SumL_TkDMCAxQA") + ->WithHostedPaymentData($hostedPaymentData) + ->WithDescription("Mobile Channel") + ->WithClientTransactionId("My Legal Entity") + ->serialize(); + + $expectedJson = '{"MERCHANT_ID":"TWVyY2hhbnRJZA==","ACCOUNT":"aW50ZXJuZXQ=","ORDER_ID":"R1RJNVl4YjBTdW1MX1RrRE1DQXhRQQ==","AMOUNT":"MTk5OQ==","CURRENCY":"RVVS","TIMESTAMP":"MjAxNzA3MjUxNTQ4MjQ=","AUTO_SETTLE_FLAG":"MQ==","COMMENT1":"TW9iaWxlIENoYW5uZWw=","CUST_NUM":"YTAyODc3NGYtYmVmZi00N2JjLWJkNmUtZWQ3ZTA0ZjVkNzU4YTAyODc3NGYtYnRlZmE=","OFFER_SAVE_CARD":"MQ==","PAYER_EXIST":"MA==","PROD_ID":"YTBiMzhkZjUtYjIzYy00ZDgyLTg4ZmUtMmU5YzQ3NDM4OTcyLWIyM2MtNGQ4Mi04OGY=","VAR_REF":"TXkgTGVnYWwgRW50aXR5","HPP_LANG":"R0I=","MERCHANT_RESPONSE_URL":"aHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vcmVzcG9uc2U=","HPP_VERSION":"MQ==","SHA1HASH":"NzExNmM0OTgyNjM2N2M2NTEzZWZkYzBjYzgxZTI0M2I4MDk1ZDc4Zg=="}'; + $this->assertEquals($json, $expectedJson); + } + + public function testBasicHostedPaymentDataHppVersion2() + { + $config = new ServicesConfig(); + $config->merchantId = "MerchantId"; + $config->accountId = "internet"; + $config->refundPassword = "refund"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://pay.sandbox.realexpayments.com/pay"; + $config->hostedPaymentConfig = new HostedPaymentConfig(); + $config->hostedPaymentConfig->language = "GB"; + $config->hostedPaymentConfig->responseUrl = "https://www.example.com/response"; + $config->hostedPaymentConfig->version = HppVersion::VERSION_2; + + $service = new HostedService($config); + $client = new RealexHppClient("secret"); + + $hostedPaymentData = new HostedPaymentData(); + $hostedPaymentData->offerToSaveCard = "1"; // display the save card tick box + $hostedPaymentData->customerExists = "0"; // new customer + $hostedPaymentData->customerNumber = 'a028774f-beff-47bc-bd6e-ed7e04f5d758a028774f-btefa'; + $hostedPaymentData->productId = 'a0b38df5-b23c-4d82-88fe-2e9c47438972-b23c-4d82-88f'; + + $json = $service->charge(19.99) + ->withCurrency("EUR") + ->withTimeStamp("20170725154824") + ->WithOrderId("GTI5Yxb0SumL_TkDMCAxQA") + ->WithHostedPaymentData($hostedPaymentData) + ->WithDescription("Mobile Channel") + ->WithClientTransactionId("My Legal Entity") + ->serialize(); + + $expectedJson = '{"MERCHANT_ID":"MerchantId","ACCOUNT":"internet","ORDER_ID":"GTI5Yxb0SumL_TkDMCAxQA","AMOUNT":"1999","CURRENCY":"EUR","TIMESTAMP":"20170725154824","AUTO_SETTLE_FLAG":"1","COMMENT1":"Mobile Channel","CUST_NUM":"a028774f-beff-47bc-bd6e-ed7e04f5d758a028774f-btefa","OFFER_SAVE_CARD":"1","PAYER_EXIST":"0","PROD_ID":"a0b38df5-b23c-4d82-88fe-2e9c47438972-b23c-4d82-88f","VAR_REF":"My Legal Entity","HPP_LANG":"GB","MERCHANT_RESPONSE_URL":"https:\/\/www.example.com\/response","HPP_VERSION":"2","SHA1HASH":"7116c49826367c6513efdc0cc81e243b8095d78f"}'; + $this->assertEquals($json, $expectedJson); + } + + public function testParseResponse() + { + $config = new ServicesConfig(); + $config->merchantId = "heartlandgpsandbox"; + $config->accountId = "hpp"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; + $config->hostedPaymentConfig = new HostedPaymentConfig(); + $config->hostedPaymentConfig->language = "GB"; + $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; + + $client = new RealexHppClient("secret"); + + $address = new Address(); + $address->postalCode = "123|56"; + $address->country = "IRELAND"; + + //run test cases for different version + foreach ($this->hppVersionList as $hppVersion) { + $config->hostedPaymentConfig->version = $hppVersion; + $service = new HostedService($config); + + $json = $service->authorize(1) + ->withCurrency("EUR") + ->withCustomerId("123456") + ->withAddress($address) + ->serialize(); + + $this->assertNotNull($json); + + $response = $client->sendRequest($json, $hppVersion); + $this->assertNotNull($response); + + // Base64 encode values + $iterator = new \RecursiveIteratorIterator(new \RecursiveArrayIterator(json_decode($response, true))); + foreach ($iterator as $key => $value) { + $iterator->getInnerIterator()->offsetSet($key, base64_encode($value)); + } + + $response = json_encode($iterator->getArrayCopy()); + + $parsedResponse = $service->parseResponse($response, true); + $this->assertEquals("00", $parsedResponse->responseCode); + } + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/HppTestCase.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/HppTestCase.php new file mode 100644 index 0000000..936d6e5 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/HppTestCase.php @@ -0,0 +1,247 @@ +merchantId = "heartlandgpsandbox"; + $config->accountId = "hpp"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; + + $config->hostedPaymentConfig = new HostedPaymentConfig(); + $config->hostedPaymentConfig->language = "GB"; + $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; + return $config; + } + + public function setup() + { + $this->service = new HostedService($this->config()); + } + + /* 10. ThreedSecureResponse */ + + public function testThreedSecureResponse() + { + $config = new ServicesConfig(); + $config->merchantId = 'heartlandgpsandbox'; + $config->accountId = 'hpp'; + $config->sharedSecret = 'secret'; + $config->serviceUrl = 'https://pay.sandbox.realexpayments.com/pay'; + + $service = new HostedService( + $config + ); + + //response + // TODO: grab the response JSON from the client-side for example: + $responseJson = '{"MERCHANT_ID":"heartlandgpsandbox","ACCOUNT":"hpp","ORDER_ID":"OTA4NUEzOEEtMkE3RjU2RQ","TIMESTAMP":"20180724124150","RESULT":"00","PASREF":"15324325098818233","AUTHCODE":"12345","AVSPOSTCODERESULT":"U","CVNRESULT":"U","HPP_LANG":"GB","SHIPPING_CODE":null,"SHIPPING_CO":null,"BILLING_CODE":"123|56","BILLING_CO":"IRELAND","ECI":null,"CAVV":null,"XID":null,"MERCHANT_RESPONSE_URL":"http:\/\/requestb.in\/10q2bjb1","CARD_PAYMENT_BUTTON":null,"MESSAGE":"[ test system ] Authorised","AMOUNT":null,"SHA1HASH":"d1ff806b449b86375dbda74e2611760c348fcdeb","DCC_INFO_REQUST":null,"DCC_INFO_RESPONSE":null,"HPP_FRAUD_FILTER_MODE":null,"TSS_INFO":null}'; + + $parsedResponse = $service->parseResponse($responseJson); + $responseCode = $parsedResponse->responseCode; // 00 + $responseMessage = $parsedResponse->responseMessage; // [ test system ] Authorised + $responseValues = $parsedResponse->responseValues; // get values accessible by key + + $eci = $responseValues["ECI"]; // 5 - fully authenticated + $cavv = $responseValues["CAVV"]; // AAACBUGDZYYYIgGFGYNlAAAAAAA= + $xid = $responseValues["XID"]; // vJ9NXpFueXsAqeb4iAbJJbe+66s= + // TODO: update your application and display transaction outcome to the customer + + $this->assertNotEquals(null, $parsedResponse); + $this->assertEquals("00", $responseCode); + } + + /* 02. ProcessPaymentConsumeHppResponse */ + + public function testprocessPaymentConsumeResponse() + { + $config = new ServicesConfig(); + $config->merchantId = 'heartlandgpsandbox'; + $config->accountId = 'hpp'; + $config->sharedSecret = 'secret'; + $config->serviceUrl = 'https://pay.sandbox.realexpayments.com/pay'; + + $service = new HostedService($config); + + $responseJson = '{"MERCHANT_ID":"heartlandgpsandbox","ACCOUNT":"hpp","ORDER_ID":"NjMwNkMxMTAtMTA5RUNDRQ","TIMESTAMP":"20180720104340","RESULT":"00","PASREF":"15320798200414985","AUTHCODE":"12345","AVSPOSTCODERESULT":"U","CVNRESULT":"U","HPP_LANG":"GB","SHIPPING_CODE":null,"SHIPPING_CO":null,"BILLING_CODE":"123|56","BILLING_CO":"IRELAND","ECI":null,"CAVV":null,"XID":null,"MERCHANT_RESPONSE_URL":"http:\/\/requestb.in\/10q2bjb1","CARD_PAYMENT_BUTTON":null,"MESSAGE":"[ test system ] Authorised","AMOUNT":"100","SHA1HASH":"32628cf3f887ab9f4f1c547a10ac365c2168f0e2","DCC_INFO":null,"HPP_FRAUD_FILTER_MODE":null,"TSS_INFO":null}'; + + // create the response object from the response JSON + $parsedResponse = $service->parseResponse($responseJson); + + $orderId = $parsedResponse->orderId; // GTI5Yxb0SumL_TkDMCAxQA + $responseCode = $parsedResponse->responseCode; // 00 + $responseMessage = $parsedResponse->responseMessage; // [ test system ] Authorised + $responseValues = $parsedResponse->responseValues; // get values accessible by key + //$fraudFilterResult = $responseValues["HPP_FRAUDFILTER_RESULT"]; // PASS + + $this->assertNotEquals(null, $parsedResponse); + $this->assertEquals("00", $responseCode); + } + + /* 06. CardStorageCreatePayerStoreCardResponse */ + + public function testCardStorageCreatePayerStoreCardResponse() + { + $config = new ServicesConfig(); + $config->merchantId = 'heartlandgpsandbox'; + $config->accountId = 'hpp'; + $config->sharedSecret = 'secret'; + $config->serviceUrl = 'https://pay.sandbox.realexpayments.com/pay'; + + $service = new HostedService( + $config + ); + + // TODO: grab the response JSON from the client-side for example: + //sample response JSON: + $responseJson = '{"MERCHANT_ID":"heartlandgpsandbox","ACCOUNT":"3dsecure","ORDER_ID":"NTgxMkMzODUtNTEwMkNCMw","TIMESTAMP":"20180723110112","RESULT":"00","PASREF":"15323400720177562","AUTHCODE":"12345","AVSPOSTCODERESULT":"U","CVNRESULT":"U","HPP_LANG":"GB","SHIPPING_CODE":null,"SHIPPING_CO":null,"BILLING_CODE":null,"BILLING_CO":null,"ECI":null,"CAVV":null,"XID":null,"MERCHANT_RESPONSE_URL":"http:\/\/requestb.in\/10q2bjb1","CARD_PAYMENT_BUTTON":null,"MESSAGE":"[ test system ] Authorised","AMOUNT":"1500","SHA1HASH":"4c7a635401c57371a0931bb3a21a849181cc963d","DCC_INFO":null,"HPP_FRAUD_FILTER_MODE":null,"TSS_INFO":null}'; + + $parsedResponse = $service->parseResponse($responseJson); + $responseCode = $parsedResponse->responseCode; // 00 + $responseMessage = $parsedResponse->responseMessage; // [ test system ] Authorised + $responseValues = $parsedResponse->responseValues; // get values accessible by key + /* + // Payer Setup Details + $payerSetupResult = $responseValues["PAYER_SETUP"]; // 00 + $payerSetupMessage = $responseValues["PAYER_SETUP_MSG"]; // Successful + $payerReference = $responseValues["SAVED_PAYER_REF"]; // 5e7e9152-2d53-466d-91bc-6d12ebc56b79 + // Card Setup Details + $cardSetupResult = $responseValues["PMT_SETUP"]; // 00 + $cardSetupMessage = $responseValues["PMT_SETUP_MSG"]; // Successful + $cardReference = $responseValues["SAVED_PMT_REF"]; // ca68dcac-9af2-4d65-b06c-eb54667dcd4a + // Card Details Stored + $cardType = $responseValues["SAVED_PMT_TYPE"]; // MC + $cardDigits = $responseValues["SAVED_PMT_DIGITS"]; // 542523xxxx4415 + $cardExpiry = $responseValues["SAVED_PMT_EXPDATE"]; // 1025 + $cardName = $responseValues["SAVED_PMT_NAME"]; // James Mason + */ + // TODO: update your application and display transaction outcome to the customer + + $this->assertNotEquals(null, $parsedResponse); + $this->assertEquals("00", $responseCode); + } + + /* 08. CardStorageDisplayStoredCardsResponse */ + + public function testCardStorageDisplayStoredCardsResponse() + { + $config = new ServicesConfig(); + $config->merchantId = 'heartlandgpsandbox'; + $config->accountId = 'hpp'; + $config->sharedSecret = 'secret'; + $config->serviceUrl = 'https://pay.sandbox.realexpayments.com/pay'; + + $service = new HostedService( + $config + ); + + // TODO: grab the response JSON from the client-side for example: + //sample response JSON: + $responseJson = array("MERCHANT_ID" => "MerchantId", "ACCOUNT" => "internet", "ORDER_ID" => "GTI5Yxb0SumL_TkDMCAxQA", "AMOUNT" => "1999", "TIMESTAMP" => "20170725154824", "SHA1HASH" => "843680654f377bfa845387fdbace35acc9d95778", "RESULT" => "00", "AUTHCODE" => "12345", "CARD_PAYMENT_BUTTON" => "Place Order", "AVSADDRESSRESULT" => "M", "AVSPOSTCODERESULT" => "M", "BATCHID" => "445196", "MESSAGE" => "[ test system ] Authorised", "PASREF" => "15011597872195765", "CVNRESULT" => "M", "HPP_FRAUDFILTER_RESULT" => "PASS", "HPP_CHOSEN_PMT_REF" => "099efeb4-eda2-4fd7-a04d-29647bb6c51d", "HPP_EDITED_PMT_REF" => "037bd26a-c76b-4ee4-8063-376d8858f23d", "HPP_DELETED_PMT_REF" => "3db4c72c-cd95-4743-8070-f17e2b56b642"); + + $parsedResponse = $service->parseResponse(json_encode($responseJson)); + $responseCode = $parsedResponse->responseCode; // 00 + $responseMessage = $parsedResponse->responseMessage; // [ test system ] Authorised + $responseValues = $parsedResponse->responseValues; // get values accessible by key + // card used to complete payment, edited or deleted + $chosenCard = $responseValues["HPP_CHOSEN_PMT_REF"]; // 099efeb4-eda2-4fd7-a04d-29647bb6c51d + $editedCard = $responseValues["HPP_EDITED_PMT_REF"]; // 037bd26a-c76b-4ee4-8063-376d8858f23d + $deletedCard = $responseValues["HPP_DELETED_PMT_REF"]; // 3db4c72c-cd95-4743-8070-f17e2b56b642 + // TODO: update your application and display transaction outcome to the customer + + $this->assertNotEquals(null, $parsedResponse); + $this->assertEquals("00", $responseCode); + } + + /* 12. FraudManagementResponse */ + + public function testFraudManagementResponse() + { + $config = new ServicesConfig(); + $config->merchantId = 'heartlandgpsandbox'; + $config->accountId = 'hpp'; + $config->sharedSecret = 'secret'; + $config->serviceUrl = 'https://pay.sandbox.realexpayments.com/pay'; + + $service = new HostedService( + $config + ); + + // TODO: grab the response JSON from the client-side for example: + //sample response JSON: + $responseJson = array("MERCHANT_ID" => "MerchantId", "ACCOUNT" => "internet", "ORDER_ID" => "GTI5Yxb0SumL_TkDMCAxQA", "AMOUNT" => "1999", "TIMESTAMP" => "20170725154824", "SHA1HASH" => "843680654f377bfa845387fdbace35acc9d95778", "RESULT" => "00", "AUTHCODE" => "12345", "CARD_PAYMENT_BUTTON" => "Place Order", "AVSADDRESSRESULT" => "M", "AVSPOSTCODERESULT" => "M", "BATCHID" => "445196", "MESSAGE" => "[ test system ] Authorised", "PASREF" => "15011597872195765", "CVNRESULT" => "M", "HPP_FRAUDFILTER_RESULT" => "HOLD", "HPP_FRAUDFILTER_RULE_56257838-4590-4227-b946-11e061fb15fe" => "HOLD", "HPP_FRAUDFILTER_RULE_cf609cf9-9e5a-4700-ac69-8aa09c119305" => "PASS"); + ; + + $parsedResponse = $service->parseResponse(json_encode($responseJson)); + $responseCode = $parsedResponse->responseCode; // 00 + $responseValues = $parsedResponse->responseValues; // get values accessible by key + + $fraudFilterResult = $responseValues["HPP_FRAUDFILTER_RESULT"]; // HOLD + $cardRuleResult = $responseValues["HPP_FRAUDFILTER_RULE_56257838-4590-4227-b946-11e061fb15fe"]; // HOLD + $ipRuleResult = $responseValues["HPP_FRAUDFILTER_RULE_cf609cf9-9e5a-4700-ac69-8aa09c119305"]; // PASS + // TODO: update your application and display transaction outcome to the customer + + $this->assertNotEquals(null, $parsedResponse); + $this->assertEquals("00", $responseCode); + } + + /* 14. DynamicCurrencyConversionResponse */ + + public function testDynamicCurrencyConversionResponse() + { + $config = new ServicesConfig(); + $config->merchantId = 'heartlandgpsandbox'; + $config->accountId = 'hpp'; + $config->sharedSecret = 'secret'; + $config->serviceUrl = 'https://pay.sandbox.realexpayments.com/pay'; + + $service = new HostedService( + $config + ); + + // TODO: grab the response JSON from the client-side for example: + //sample response JSON: + $responseJson = '{"MERCHANT_ID":"heartlandgpsandbox","ACCOUNT":"apidcc","ORDER_ID":"NTQyQzgxREMtMzVFQzlDNw","TIMESTAMP":"20180724095953","RESULT":"00","PASREF":"15324227932436743","AUTHCODE":"12345","AVSPOSTCODERESULT":"U","CVNRESULT":"U","HPP_LANG":"GB","SHIPPING_CODE":null,"SHIPPING_CO":null,"BILLING_CODE":null,"BILLING_CO":null,"ECI":null,"CAVV":null,"XID":null,"MERCHANT_RESPONSE_URL":"http:\/\/requestb.in\/10q2bjb1","CARD_PAYMENT_BUTTON":null,"MESSAGE":"[ test system ] Authorised","AMOUNT":"100100","SHA1HASH":"320c7ddc49d292f5900c676168d5cc1f2a55306c","DCC_INFO_REQUST":{"CCP":"Fexco","TYPE":1,"RATE":"1.7203","RATE_TYPE":"S","AMOUNT":"172202","CURRENCY":"AUD"},"DCC_INFO_RESPONSE":{"cardHolderCurrency":"AUD","cardHolderAmount":"172202","cardHolderRate":"1.7203","merchantCurrency":"EUR","merchantAmount":"100100","marginRatePercentage":"","exchangeRateSourceName":"","commissionPercentage":"","exchangeRateSourceTimestamp":""},"HPP_FRAUD_FILTER_MODE":null,"TSS_INFO":null}'; + $parsedResponse = $service->parseResponse($responseJson); + + $responseCode = $parsedResponse->responseCode; // 00 + $responseValues = $parsedResponse->responseValues; // get values accessible by key + + $conversionProcessor = $responseValues['DCC_INFO_REQUST']["CCP"]; // fexco + $conversionRate = $responseValues['DCC_INFO_REQUST']["RATE"]; // 1.7203 + $merchantAmount = $responseValues['DCC_INFO_RESPONSE']["merchantAmount"]; // 1999 + $cardholderAmount = $responseValues['DCC_INFO_RESPONSE']["cardHolderAmount"]; // 3439 + $merchantCurrency = $responseValues['DCC_INFO_RESPONSE']["merchantCurrency"]; // EUR + $cardholderCurrency = $responseValues['DCC_INFO_RESPONSE']["cardHolderCurrency"]; // AUD + $marginPercentage = $responseValues['DCC_INFO_RESPONSE']["marginRatePercentage"]; // 3.75 + $exchangeSource = $responseValues['DCC_INFO_RESPONSE']["exchangeRateSourceName"]; // REUTERS WHOLESALE INTERBANK + $commissionPercentage = $responseValues['DCC_INFO_RESPONSE']["commissionPercentage"]; // 0 + $exchangeTimestamp = $responseValues['DCC_INFO_RESPONSE']["exchangeRateSourceTimestamp"]; // 20170518162700 + // TODO: update your application and display transaction outcome to the customer + $this->assertNotEquals(null, $parsedResponse); + $this->assertEquals("00", $responseCode); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/Realex3dSecureTests.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/Realex3dSecureTests.php new file mode 100644 index 0000000..104641d --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/Realex3dSecureTests.php @@ -0,0 +1,500 @@ +getConfig()); + } + + protected function getConfig() + { + $config = new ServicesConfig(); + $config->merchantId = 'heartlandgpsandbox'; + $config->accountId = '3dsecure'; + $config->sharedSecret = 'secret'; + $config->rebatePassword = 'rebate'; + $config->refundPassword = 'refund'; + $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; + return $config; + } + + public function testAcsClient() + { + $authClient = new ThreeDSecureAcsClient('https://pit.3dsecure.net/VbVTestSuiteService/pit1/acsService/paReq?summary=MTNmMzI4NzgtNTdmZi00OWEzLWJhZTAtYzFhNzAxMDJkMGNi'); + $this->assertNotNull($authClient->authenticate('eJxlUsFSwjAQvfsVTO82TSm0MNs4FVBwRkUF8ZomK1Rpimkr6NebYBEdc8jsy27evrwNnO3ydesddZkVKnao6zktVKKQmVrGznx2cRo5Z+wEZiuNOHxAUWtkcI1lyZfYymTs+KIjZYRt30tl0H2WPRpFIuQyDULsdTvoMJgm9/jGoOnCTBPXB3KAhk2LFVcVAy7ezic3LAgD2ouANBBy1JMh6zULyDcGxXNkK+S6WnMll5vS7GmxA7JPgChqVekPFgUekAOAWq/Zqqo2ZZ+Q7Xbr/r/visKtX4HYSiBHcdPaRqVh3mWSJcM7Nb7t0O1iGs6n7cXnI025N7hSk1EMxFaA5BUy36MhpX7Y8r1+J+hTI39/Djy3kqwZRl4DYGN7JE3GJn4fgDFfm+EcnnRAgLtNodBUGFd/YiBHwYOx9VZUxrVxdjEb1aPXy5f5k27Tmzo/v75N4ti6vS+wbJlxikb0m84CIJaCNIMkzfxN9OdffAF4VML9')); + } + + public function testMerchantDataEnumerator() + { + $keys = ['Key1', 'Key2', 'Key3']; + $values = ['Value1', 'Value2', 'Value3']; + + $merchantData = new MerchantDataCollection(); + for ($i=0; $i<3; $i++) { + $merchantData->add($keys[$i], $values[$i]); + } + + $this->assertEquals(3, $merchantData->count()); + + foreach ($merchantData->getKeys() as $key) { + $this->assertTrue(in_array($key, $keys)); + $this->assertTrue(in_array($merchantData->get($key), $values)); + } + } + + public function testMerchantDataWithHiddenValues() + { + $card = new CreditCardData(); + $card->number = 4012001037141112; + $card->expMonth = 12; + $card->expYear = 2025; + $card->cardHolderName = 'James Mason'; + + $enrolled = $card->verifyEnrolled(100, 'USD'); + $this->assertNotNull($enrolled); + if ($enrolled) { + $merchantData = $card->threeDSecure->getMerchantData(); + + $this->assertNotNull($merchantData); + $this->assertEquals(0, $merchantData->count()); + + $this->assertNull($merchantData->get('amount')); + $this->assertNull($merchantData->get('currency')); + $this->assertNull($merchantData->get('orderId')); + + for ($i=0; $i<3; $i++) { + $merchantData->add('Key'.$i, 'Value'.$i); + + $this->assertNotNull($merchantData->get('Key'.$i)); + $this->assertEquals('Value'.$i, $merchantData->get('Key'.$i)); + } + + $this->assertEquals(3, $merchantData->count()); + } + } + + public function testMerchantDataEncryptAndDecrypt() + { + $merchantData = new MerchantDataCollection(); + $merchantData->add('customerId', '12345'); + $merchantData->add('invoiceNumber', '54321'); + + $encoder = function ($input) { + $encoded = sprintf('%s.%s', $input, 'secret'); + return base64_encode($encoded); + }; + + $encrypted = $merchantData->toString($encoder); + + $decoder = function ($input) { + $decoded = explode('.', (string)base64_decode($input)); + $this->assertEquals('secret', $decoded[1]); + return $decoded[0]; + }; + + $decrypted = $merchantData->parse($encrypted, $decoder); + + $this->assertNotNull($decrypted); + $this->assertNotNull($decrypted->get('customerId')); + $this->assertEquals('12345', $decrypted->get('customerId')); + $this->assertNotNull($decrypted->get('invoiceNumber')); + $this->assertEquals('54321', $decrypted->get('invoiceNumber')); + } + + public function testMerchantDataMultiKey() + { + $this->expectExceptionMessage('Cannot access private property GlobalPayments\Api\Entities\MerchantDataCollection::$collection'); + + $mcd = new MerchantDataCollection(); + array_push($mcd->collection, array('amount'=>'10')); + array_push($mcd->collection, array('amount'=>'10')); + } + + public function testFullCycleWithMerchantData() + { + $card = new CreditCardData(); + $card->number = 4012001037141112; + $card->expMonth = 12; + $card->expYear = 2025; + $card->cardHolderName = 'John Smith'; + + $enrolled = $card->verifyEnrolled(1, 'USD'); + if ($enrolled) { + $secureEcom = $card->threeDSecure; + if (!empty($secureEcom)) { + $merchantData = new MerchantDataCollection(); + $merchantData->add('client_txn_id', '123456'); + + $authClient = new ThreeDSecureAcsClient($secureEcom->issuerAcsUrl); + $authResponse = $authClient->authenticate($secureEcom->payerAuthenticationRequest, (string)$secureEcom->getMerchantData()->toString()); + + $payerAuthenticationResponse = $authResponse->getAuthResponse(); + $md = MerchantDataCollection::parse($authResponse->getMerchantData()); + + if ($card->verifySignature($payerAuthenticationResponse, $md)) { + $response = $card->charge(1) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } else { + $this->fail('Signature verification failed.'); + } + } else { + $this->fail('Secure3Data was null.'); + } + } else { + $this->fail('Card not enrolled.'); + } + } + + public function testFullCycleWithNoMerchantData() + { + $card = new CreditCardData(); + $card->number = 4012001037141112; + $card->expMonth = 12; + $card->expYear = 2025; + $card->cardHolderName = 'James Mason'; + + $amount = 100; + $currency = 'USD'; + $orderId = GenerationUtils::generateOrderId(); + + $enrolled = $card->verifyEnrolled($amount, $currency, $orderId); + + if ($enrolled) { + $secureEcom = $card->threeDSecure; + + if ($secureEcom != null) { + $authClient = new ThreeDSecureAcsClient($secureEcom->issuerAcsUrl); + $authResponse = $authClient->authenticate($secureEcom->payerAuthenticationRequest, (string)$secureEcom->getMerchantData()->toString()); + + $payerAuthenticationResponse = $authResponse->getAuthResponse(); + + if ($card->verifySignature($payerAuthenticationResponse, null, $amount, $currency, $orderId)) { + $response = $card->charge($amount) + ->withCurrency($currency) + ->withOrderId($orderId) + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } else { + $this->fail('Signature verification failed.'); + } + } else { + $this->fail('Secure3Data was null.'); + } + } else { + $this->fail('Card not enrolled.'); + } + } + + public function testVerifyEnrolledTrue() + { + $card = new CreditCardData(); + $card->number = 4012001037141112; + $card->expMonth = 12; + $card->expYear = 2025; + $card->cardHolderName = 'John Smith'; + + $enrolled = $card->verifyEnrolled(1, 'USD'); + $this->assertTrue($enrolled); + $this->assertNotNull($card->threeDSecure); + $this->assertNotNull($card->threeDSecure->payerAuthenticationRequest); + $this->assertNotNull($card->threeDSecure->issuerAcsUrl); + $this->assertNotNull($card->threeDSecure->xid); + } + + public function testVerifyEnrolledFalse() + { + $card = new CreditCardData(); + $card->number = 4012001038443335; + $card->expMonth = 12; + $card->expYear = 2025; + $card->cardHolderName = 'John Smith'; + + $enrolled = $card->verifyEnrolled(1, 'USD'); + $this->assertFalse($enrolled); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testVerifySignatureBadOrderId() + { + $card = new CreditCardData(); + $card->verifySignature('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', null, 1, 'USD', 'orderId'); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testVerifySignatureNoPaymentResponse() + { + $card = new CreditCardData(); + $card->verifySignature(null); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testVerifySignatureNoAmount() + { + $card = new CreditCardData(); + $card->verifySignature('paymentResponse', null, null, 'USD', 'orderId'); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testVerifySignatureNoCurrency() + { + $card = new CreditCardData(); + $card->verifySignature('paymentResponse', null, 10, null, 'orderId'); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + */ + public function testVerifySignatureNoOrderId() + { + $card = new CreditCardData(); + $card->verifySignature('paymentResponse', null, 10, 'USD', null); + } + + public function testAuthorize3dSecure() + { + $secureEcom = new ThreeDSecure(); + $secureEcom->cavv = 'AAACBllleHchZTBWIGV4AAAAAAA='; + $secureEcom->xid = 'crqAeMwkEL9r4POdxpByWJ1/wYg='; + $secureEcom->eci = '5'; + + $card = new CreditCardData(); + $card->number = 4012001037141112; + $card->expMonth = 12; + $card->expYear = 2025; + $card->cardHolderName = 'Philip Marlowe'; + $card->threeDSecure = $secureEcom; + + $response = $card->charge(10) + ->withCurrency('EUR') + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testCardHolderNotEnrolled() + { + $card = new CreditCardData(); + $card->number = 4012001038443335; + $card->expMonth = 12; + $card->expYear = 2025; + $card->cardHolderName = 'John Smith'; + + $enrolled = $card->verifyEnrolled(10, 'USD'); + $this->assertFalse($enrolled); + $this->assertNotNull($card->threeDSecure); + $this->assertEquals('6', $card->threeDSecure->eci); + + // .net test does not have amount or currency but validation would not allow this + $response = $card->charge(10) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testUnableToVerifyEnrollment() + { + $card = new CreditCardData(); + $card->number = 4012001038488884; + $card->expMonth = 12; + $card->expYear = 2025; + $card->cardHolderName = 'John Smith'; + + $enrolled = $card->verifyEnrolled(10, 'USD'); + $this->assertFalse($enrolled); + $this->assertNotNull($card->threeDSecure); + $this->assertEquals('7', $card->threeDSecure->eci); + + $response = $card->charge(10) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testInvalidResponseFromEnrollmentServer() + { + $card = new CreditCardData(); + $card->number = 4012001036298889; + $card->expMonth = 12; + $card->expYear = 2025; + $card->cardHolderName = 'John Smith'; + + $card->verifyEnrolled(10, 'USD'); + } + + public function testCardHolderIsEnrolledACSAuthFailed() + { + $card = new CreditCardData(); + $card->number = 4012001036853337; + $card->expMonth = 12; + $card->expYear = 2025; + $card->cardHolderName = 'John Smith'; + + $enrolled = $card->verifyEnrolled(10, 'USD'); + $this->assertTrue($enrolled); + + $secureEcom = $card->threeDSecure; + $authClient = new ThreeDSecureAcsClient($secureEcom->issuerAcsUrl); + $authResponse = $authClient->authenticate($secureEcom->payerAuthenticationRequest, $secureEcom->getMerchantData()->toString()); + + // $payerAuthenticationResponse = $authResponse->parse(); + $payerAuthenticationResponse = $authResponse->getAuthResponse(); + $md = MerchantDataCollection::parse($authResponse->getMerchantData()); + + $verified = $card->verifySignature($payerAuthenticationResponse, $md); + $this->assertFalse($verified); + $this->assertNotNull($card->threeDSecure); + $this->assertEquals(7, $card->threeDSecure->eci); + + $response = $card->charge(10) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testCardHolderIsEnrolledACSAcknowledged() + { + $card = new CreditCardData(); + $card->number = 4012001037167778; + $card->expMonth = 12; + $card->expYear = 2025; + $card->cardHolderName = 'John Smith'; + + $enrolled = $card->verifyEnrolled(10, 'USD'); + $this->assertTrue($enrolled); + + $secureEcom = $card->threeDSecure; + $authClient = new ThreeDSecureAcsClient($secureEcom->issuerAcsUrl); + $authResponse = $authClient->authenticate($secureEcom->payerAuthenticationRequest, $secureEcom->getMerchantData()->toString()); + + // $payerAuthenticationResponse = $authResponse->parse(); + $payerAuthenticationResponse = $authResponse->getAuthResponse(); + $md = MerchantDataCollection::parse($authResponse->getMerchantData()); + + $verified = $card->verifySignature($payerAuthenticationResponse, $md); + $this->assertTrue($verified); + $this->assertEquals('A', $card->threeDSecure->status); + + $response = $card->charge(10) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testCardHolderIsEnrolledACSFailed() + { + $card = new CreditCardData(); + $card->number = 4012001037461114; + $card->expMonth = 12; + $card->expYear = 2025; + $card->cardHolderName = 'John Smith'; + + $enrolled = $card->verifyEnrolled(10, 'USD'); + $this->assertTrue($enrolled); + + $secureEcom = $card->threeDSecure; + $authClient = new ThreeDSecureAcsClient($secureEcom->issuerAcsUrl); + $authResponse = $authClient->authenticate($secureEcom->payerAuthenticationRequest, $secureEcom->getMerchantData()->toString()); + + // $payerAuthenticationResponse = $authResponse->parse(); + $payerAuthenticationResponse = $authResponse->getAuthResponse(); + $md = MerchantDataCollection::parse($authResponse->getMerchantData()); + + $verified = $card->verifySignature($payerAuthenticationResponse, $md); + $this->assertFalse($verified); + $this->assertEquals('N', $card->threeDSecure->status); + $this->assertEquals(7, $card->threeDSecure->eci); + + $response = $card->charge(10) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + public function testCardHolderIsEnrolledACSUnavailable() + { + $card = new CreditCardData(); + $card->number = 4012001037484447; + $card->expMonth = 12; + $card->expYear = 2025; + $card->cardHolderName = 'John Smith'; + + $enrolled = $card->verifyEnrolled(10, 'USD'); + $this->assertTrue($enrolled); + + $secureEcom = $card->threeDSecure; + $authClient = new ThreeDSecureAcsClient($secureEcom->issuerAcsUrl); + $authResponse = $authClient->authenticate($secureEcom->payerAuthenticationRequest, $secureEcom->getMerchantData()->toString()); + + $payerAuthenticationResponse = $authResponse->getAuthResponse(); + $md = MerchantDataCollection::parse($authResponse->getMerchantData()); + + $verified = $card->verifySignature($payerAuthenticationResponse, $md); + $this->assertFalse($verified); + $this->assertEquals('U', $card->threeDSecure->status); + $this->assertEquals(7, $card->threeDSecure->eci); + + $response = $card->charge(10) + ->withCurrency('USD') + ->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + public function testCardHolderIsEnrolledACSInvalid() + { + $card = new CreditCardData(); + $card->number = 4012001037490006; + $card->expMonth = 12; + $card->expYear = 2025; + $card->cardHolderName = 'John Smith'; + + $enrolled = $card->verifyEnrolled(10, 'USD'); + $this->assertTrue($enrolled); + + $secureEcom = $card->threeDSecure; + $authClient = new ThreeDSecureAcsClient($secureEcom->issuerAcsUrl); + $authResponse = $authClient->authenticate($secureEcom->payerAuthenticationRequest, $secureEcom->getMerchantData()->toString()); + + $payerAuthenticationResponse = $authResponse->getAuthResponse(); + $md = MerchantDataCollection::parse($authResponse->getMerchantData()); + + $card->verifySignature($payerAuthenticationResponse, $md); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/RealexApmTest.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/RealexApmTest.php new file mode 100644 index 0000000..f696c6b --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/RealexApmTest.php @@ -0,0 +1,185 @@ +merchantId = "heartlandgpsandbox"; + $config->accountId = "hpp"; + $config->rebatePassword = 'refund'; + $config->refundPassword = 'refund'; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; + return $config; + } + + public function setup() { + ServicesContainer::configure($this->config()); + } + + public function testApmForCharge() { + $paymentMethod = new AlternativePaymentMethod(AlternativePaymentType::SOFORTUBERWEISUNG); + + $paymentMethod->returnUrl = 'https://www.example.com/returnUrl'; + $paymentMethod->statusUpdateUrl = 'https://www.example.com/statusUrl'; + $paymentMethod->descriptor = 'Test Transaction'; + $paymentMethod->country = 'DE'; + $paymentMethod->accountHolderName = 'James Mason'; + + $response = $paymentMethod->charge(10) + ->withCurrency("EUR") + ->withDescription('New APM') + ->execute(); + + $responseCode = $response->responseCode; // 00 == Success + $message = $response->responseMessage; // [ test system ] AUTHORISED + // get the reponse details to save to the DB for future transaction management requests + $orderId = $response->orderId; + $authCode = $response->authorizationCode; + $paymentsReference = $response->transactionId; // pasref + $apmResponse = $response->alternativePaymentResponse; + + $this->assertNotNull($response); + $this->assertEquals("01", $response->responseCode); + $this->assertNotNull($response->alternativePaymentResponse); + } + + /** + * @expectedException \GlobalPayments\Api\Entities\Exceptions\BuilderException + * @expectedExceptionMessage amount cannot be null for this transaction type + */ + public function testApmWithoutAmount() { + $paymentMethod = new AlternativePaymentMethod(AlternativePaymentType::SOFORTUBERWEISUNG); + + $paymentMethod->returnUrl = 'https://www.example.com/returnUrl'; + $paymentMethod->statusUpdateUrl = 'https://www.example.com/statusUrl'; + $paymentMethod->descriptor = 'Test Transaction'; + $paymentMethod->country = 'DE'; + $paymentMethod->accountHolderName = 'James Mason'; + + $response = $paymentMethod->charge() + ->withCurrency("EUR") + ->withDescription('New APM') + ->execute(); + } + + /** + * @expectedException \GlobalPayments\Api\Entities\Exceptions\BuilderException + * @expectedExceptionMessage currency cannot be null for this transaction type + */ + public function testApmWithoutCurrency() { + $paymentMethod = new AlternativePaymentMethod(AlternativePaymentType::SOFORTUBERWEISUNG); + + $paymentMethod->returnUrl = 'https://www.example.com/returnUrl'; + $paymentMethod->statusUpdateUrl = 'https://www.example.com/statusUrl'; + $paymentMethod->descriptor = 'Test Transaction'; + $paymentMethod->country = 'DE'; + $paymentMethod->accountHolderName = 'James Mason'; + + $response = $paymentMethod->charge(10) + ->withDescription('New APM') + ->execute(); + } + + /** + * @expectedException \GlobalPayments\Api\Entities\Exceptions\BuilderException + * @expectedExceptionMessage returnUrl cannot be null for this transaction type + */ + public function testApmWithoutReturnUrl() { + $paymentMethod = new AlternativePaymentMethod(AlternativePaymentType::SOFORTUBERWEISUNG); + + $paymentMethod->statusUpdateUrl = 'https://www.example.com/statusUrl'; + $paymentMethod->descriptor = 'Test Transaction'; + $paymentMethod->country = 'DE'; + $paymentMethod->accountHolderName = 'James Mason'; + + $response = $paymentMethod->charge(1001) + ->withCurrency("EUR") + ->withDescription('New APM') + ->execute(); + } + + /** + * @expectedException \GlobalPayments\Api\Entities\Exceptions\BuilderException + * @expectedExceptionMessage statusUpdateUrl cannot be null for this transaction type + */ + public function testApmWithoutstatusUpdateUrl() { + $paymentMethod = new AlternativePaymentMethod(AlternativePaymentType::SOFORTUBERWEISUNG); + + $paymentMethod->returnUrl = 'https://www.example.com/returnUrl'; + $paymentMethod->descriptor = 'Test Transaction'; + $paymentMethod->country = 'DE'; + $paymentMethod->accountHolderName = 'James Mason'; + + $response = $paymentMethod->charge(1001) + ->withCurrency("EUR") + ->withDescription('New APM') + ->execute(); + } + + /** + * @expectedException \GlobalPayments\Api\Entities\Exceptions\GatewayException + * @expectedExceptionMessage FAILED + */ + public function testAPMRefundPendingTransaction() { + $paymentMethod = new AlternativePaymentMethod(AlternativePaymentType::TEST_PAY); + + $paymentMethod->returnUrl = 'https://www.example.com/returnUrl'; + $paymentMethod->statusUpdateUrl = 'https://www.example.com/statusUrl'; + $paymentMethod->descriptor = 'Test Transaction'; + $paymentMethod->country = 'DE'; + $paymentMethod->accountHolderName = 'James Mason'; + + $response = $paymentMethod->charge(10) + ->withCurrency("EUR") + ->withDescription('New APM') + ->execute(); + + $this->assertNotEquals(null, $response); + $this->assertEquals("01", $response->responseCode); + + // send the settle request, we must specify the amount and currency + $response = $response->refund(10) + ->withCurrency("EUR") + ->withAlternativePaymentType(AlternativePaymentType::TEST_PAY) + ->execute(); + } + + public function testApmForRefund() { + // a settle request requires the original order id + $orderId = "20180912050207-5b989dcfc9433"; + // and the payments reference (pasref) from the authorization response + $paymentsReference = "15367285279651634"; + // and the auth code transaction response + $authCode = "12345"; + + // create the rebate transaction object + $transaction = Transaction::fromId($paymentsReference, $orderId); + $transaction->authorizationCode = $authCode; + + // send the settle request, we must specify the amount and currency + $response = $transaction->refund(10) + ->withCurrency("EUR") + ->withAlternativePaymentType(AlternativePaymentType::TEST_PAY) + ->execute(); + + $responseCode = $response->responseCode; // 00 == Success + $message = $response->responseMessage; // [ test system ] AUTHORISED + + $this->assertNotEquals(null, $response); + $this->assertEquals("00", $responseCode); + } + +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/RecurringTest.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/RecurringTest.php new file mode 100644 index 0000000..52e06fc --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/RecurringTest.php @@ -0,0 +1,390 @@ +format("Ymd")); + } + + public function getPaymentId($type) + { + return sprintf("%s-Realex-%s", (new \DateTime())->format("Ymd"), $type); + } + + protected function config() + { + $config = new ServicesConfig(); + $config->merchantId = "heartlandgpsandbox"; + $config->accountId = "3dsecure"; + $config->refundPassword = "refund"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; + return $config; + } + + protected function dccSetup() + { + $config = new ServicesConfig(); + $config->merchantId = "heartlandgpsandbox"; + $config->accountId = "apidcc"; + $config->refundPassword = "refund"; + $config->sharedSecret = "secret"; + $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; + + ServicesContainer::configure($config); + } + + public function setup() + { + ServicesContainer::configure($this->config()); + + $this->newCustomer = new Customer(); + $this->newCustomer->key = $this->getCustomerId(); + $this->newCustomer->title = "Mr."; + $this->newCustomer->firstName = "James"; + $this->newCustomer->lastName = "Mason"; + $this->newCustomer->company = "Realex Payments"; + $this->newCustomer->address = new Address(); + $this->newCustomer->address->streetAddress1 = "Flat 123"; + $this->newCustomer->address->streetAddress2 = "House 456"; + $this->newCustomer->address->streetAddress3 = "The Cul-De-Sac"; + $this->newCustomer->address->city = "Halifax"; + $this->newCustomer->address->province = "West Yorkshire"; + $this->newCustomer->address->pstalCode = "W6 9HR"; + $this->newCustomer->address->country = "United Kingdom"; + $this->newCustomer->homePhone = "+35312345678"; + $this->newCustomer->workPhone = "+3531987654321"; + $this->newCustomer->fax = "+124546871258"; + $this->newCustomer->mobilePhone = "+25544778544"; + $this->newCustomer->email = "text@example.com"; + $this->newCustomer->comments = "Campaign Ref E7373G"; + } + + /* 08. Card Storage Create Payer */ + /* Request Type: payer-new */ + + public function testcardStorageCreatePayer() + { + try { + $response = $this->newCustomer->Create(); + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } catch (GatewayException $exc) { + if ($exc->responseCode != '501' && $exc->responseCode != '520') { + throw $exc; + } + } + } + + /* 09. Card Storage Store Card */ + /* Request Type: card-new */ + + public function testcardStorageStoreCard() + { + $card = new CreditCardData(); + $card->number = "4012001037141112"; + $card->expMonth = 10; + $card->expYear = 2025; + $card->cvn = '123'; + $card->cardHolderName = 'James Mason'; + + try { + $paymentMethod = $this->newCustomer + ->addPaymentMethod($this->getPaymentId("Credit"), $card) + ->create(); + $this->assertNotNull($paymentMethod); + } catch (GatewayException $exc) { + if ($exc->responseCode != '501' && $exc->responseCode != '520') { + throw $exc; + } + } + } + + /* 10. Card Storage Charge Card */ + /* Request Type: receipt-in */ + + public function testcardStorageChargeCard() + { + $paymentMethod = new RecurringPaymentMethod($this->getCustomerId(), $this->getPaymentId("Credit")); + $response = $paymentMethod->charge(10) + ->withCurrency("EUR") + ->withCvn("123") + ->execute(); + + $responseCode = $response->responseCode; // 00 == Success + $message = $response->responseMessage; // [ test system ] AUTHORISED + // get the reponse details to save to the DB for future transaction management requests + $orderId = $response->orderId; + $authCode = $response->authorizationCode; + $paymentsReference = $response->transactionId; // pasref + + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /* 11. CardStorage ThreeDSecure Verify Enrolled */ + /* Request Type: realvault-3ds-verifyenrolled */ + + public function testcardStorageThreeDSecureVerifyEnrolled() + { + $paymentMethod = new RecurringPaymentMethod($this->getCustomerId(), $this->getPaymentId("Credit")); + + $response = $paymentMethod->verify() + ->withAmount(10) + ->withCurrency('USD') + ->withModifier(TransactionModifier::SECURE3D) + ->execute(); + + // get the response details to update the DB + $responseCode = $response->responseCode; // 00 == Success + $message = $response->responseMessage; // [ test system ] AUTHORISED + + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /* 12. CardStorage Dcc Rate Lookup */ + /* Request Type: realvault-dccrate */ + + public function testcardStorageDccRateLookup() + { + $this->dccSetup(); + + $orderId = GenerationUtils::generateOrderId(); + $paymentMethod = new RecurringPaymentMethod($this->getCustomerId(), $this->getPaymentId("Credit")); + $dccDetails = $paymentMethod->getDccRate(DccRateType::SALE, 1001, 'EUR', DccProcessor::FEXCO, $orderId); + + $this->assertNotNull($dccDetails); + $this->assertEquals('00', $dccDetails->responseCode, $dccDetails->responseMessage); + $this->assertNotNull($dccDetails->dccResponseResult); + } + + /* 14. CardStorage UpdatePayer */ + /* Request Type: payer-edit */ + + public function testcardStorageUpdatePayer() + { + $customer = new Customer(); + $customer->key = $this->getCustomerId(); + $customer->firstName = "Perry"; + + $response = $customer->saveChanges(); + + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /* 15. CardStorage Continuous Authority First */ + /* Request Type: auth */ + + public function testContinuousAuthorityFirst() + { + // create the card object + $card = new CreditCardData(); + $card->number = '5425230000004415'; + $card->expMonth = 12; + $card->expYear = 2025; + $card->cvn = '131'; + $card->cardHolderName = 'James Mason'; + + + // process an auto-settle authorization + $response = $card->charge(15) + ->withCurrency("EUR") + ->withRecurringInfo(RecurringType::VARIABLE, RecurringSequence::FIRST) + ->execute(); + + $responseCode = $response->responseCode; // 00 == Success + $message = $response->responseMessage; // [ test system ] AUTHORISED + // get the details to save to the DB for future Transaction Management requests + $orderId = $response->orderId; + $authCode = $response->authorizationCode; + $paymentsReference = $response->transactionId; + + $this->assertNotEquals(null, $response); + $this->assertEquals("00", $responseCode); + } + + /* 15. CardStorage Continuous Authority Subsequent */ + /* Request Type: receipt-in */ + + public function testContinuousAuthoritySubsequent() + { + // create the payment method object + $paymentMethod = new RecurringPaymentMethod($this->getCustomerId(), $this->getPaymentId("Credit")); + + // charge the stored card/payment method + $response = $paymentMethod->charge(15) + ->withCurrency("EUR") + ->withCvn("123") + ->withRecurringInfo(RecurringType::VARIABLE, RecurringSequence::SUBSEQUENT) + ->execute(); + + $responseCode = $response->responseCode; // 00 == Success + + $this->assertNotEquals(null, $response); + $this->assertEquals("00", $responseCode); + } + + /* 15. CardStorage Continuous Authority Last */ + /* Request Type: receipt-in */ + + public function testContinuousAuthorityLast() + { + // create the payment method object + $paymentMethod = new RecurringPaymentMethod($this->getCustomerId(), $this->getPaymentId("Credit")); + + // charge the stored card/payment method + $response = $paymentMethod->charge(15) + ->withCurrency("EUR") + ->withCvn("123") + ->withRecurringInfo(RecurringType::VARIABLE, RecurringSequence::LAST) + ->execute(); + + $responseCode = $response->responseCode; // 00 == Success + + $this->assertNotEquals(null, $response); + $this->assertEquals("00", $responseCode); + } + + /* 16. Card Storage Refund */ + /* Request Type: payment-out */ + + public function testcardStorageRefund() + { + // create the payment method object + $paymentMethod = new RecurringPaymentMethod($this->getCustomerId(), $this->getPaymentId("Credit")); + + // charge the stored card/payment method + $response = $paymentMethod->refund(10) + ->withCurrency("EUR") + ->execute(); + + $responseCode = $response->responseCode; // 00 == Success + $message = $response->responseMessage; // [ test system ] AUTHORISED + + $this->assertNotEquals(null, $response); + $this->assertEquals("00", $responseCode); + } + + /* 17. Card Storage UpdateCard */ + /* Request Type: card-update-card */ + + public function testcardStorageUpdateCard() + { + $paymentMethod = new RecurringPaymentMethod($this->getCustomerId(), $this->getPaymentId("Credit")); + + $paymentMethod->paymentMethod = new CreditCardData(); + $paymentMethod->paymentMethod->number = "5425230000004415"; + $paymentMethod->paymentMethod->expMonth = 10; + $paymentMethod->paymentMethod->expYear = 2020; + $paymentMethod->paymentMethod->cardHolderName = "Philip Marlowe"; + + $response = $paymentMethod->SaveChanges(); + + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /* 18. Card Storage Verify Card */ + /* Request Type: receipt-in-otb */ + + public function testcardStorageVerifyCard() + { + $paymentMethod = new RecurringPaymentMethod($this->getCustomerId(), $this->getPaymentId("Credit")); + + // verify the stored card/payment method is valid and active + $response = $paymentMethod->verify() + ->withCvn("123") + ->execute(); + + // get the response details to update the DB + $responseCode = $response->responseCode; // 00 == Success + $message = $response->responseMessage; // [ test system ] AUTHORISED + + $this->assertNotEquals(null, $response); + $this->assertEquals("00", $responseCode); + } + + /* 13. CardStorage DeleteCard */ + /* Request Type: card-cancel-card */ + + public function testcardStorageDeleteCard() + { + $paymentMethod = new RecurringPaymentMethod($this->getCustomerId(), $this->getPaymentId("Credit")); + + // delete the stored card/payment method + // WARNING! This can't be undone + $response = $paymentMethod->Delete(); + + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } + + /* Request Type: receipt-in */ + + public function testcardStorageChargeCardDCC() + { + $this->dccSetup(); + $this->testcardStorageCreatePayer(); + $this->testcardStorageStoreCard(); + + $paymentMethod = new RecurringPaymentMethod($this->getCustomerId(), $this->getPaymentId("Credit")); + + $orderId = GenerationUtils::generateOrderId(); + $dccDetails = $paymentMethod->getDccRate(DccRateType::SALE, 1001, 'EUR', DccProcessor::FEXCO, $orderId); + + $this->assertNotNull($dccDetails); + $this->assertEquals('00', $dccDetails->responseCode, $dccDetails->responseMessage); + $this->assertNotNull($dccDetails->dccResponseResult); + + $dccValues = new DccRateData(); + $dccValues->orderId = $dccDetails->transactionReference->orderId; + $dccValues->dccProcessor = DccProcessor::FEXCO; + $dccValues->dccType = 1; + $dccValues->dccRateType = DccRateType::SALE; + $dccValues->currency = $dccDetails->dccResponseResult->cardHolderCurrency; + $dccValues->dccRate = $dccDetails->dccResponseResult->cardHolderRate; + $dccValues->amount = $dccDetails->dccResponseResult->cardHolderAmount; + + $response = $paymentMethod->charge(1001) + ->withCurrency("EUR") + ->withCvn("123") + ->withDccRateData($dccValues) + ->withOrderId($orderId) + ->execute(); + + $responseCode = $response->responseCode; // 00 == Success + $message = $response->responseMessage; // [ test system ] AUTHORISED + // get the reponse details to save to the DB for future transaction management requests + $orderId = $response->orderId; + $authCode = $response->authorizationCode; + $paymentsReference = $response->transactionId; // pasref + + $this->assertNotNull($response); + $this->assertEquals("00", $response->responseCode); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/Secure3dServiceTests.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/Secure3dServiceTests.php new file mode 100644 index 0000000..421a27c --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/Secure3dServiceTests.php @@ -0,0 +1,772 @@ +getConfig()); + + // create card data + $this->card = new CreditCardData(); + $this->card->number = 4263970000005262; + $this->card->expMonth = 12; + $this->card->expYear = 2025; + $this->card->cardHolderName = 'John Smith'; + + // stored card + $this->stored = new RecurringPaymentMethod('20190809-Realex', '20190809-Realex-Credit'); + + // shipping address + $this->shippingAddress = new Address(); + $this->shippingAddress->streetAddress1 = 'Apartment 852'; + $this->shippingAddress->streetAddress2 = 'Complex 741'; + $this->shippingAddress->streetAddress3 = 'no'; + $this->shippingAddress->city = 'Chicago'; + $this->shippingAddress->postalCode = '5001'; + $this->shippingAddress->state = 'IL'; + $this->shippingAddress->countryCode = '840'; + + // billing address + $this->billingAddress = new Address(); + $this->billingAddress->streetAddress1 = 'Flat 456'; + $this->billingAddress->streetAddress2 = 'House 789'; + $this->billingAddress->streetAddress3 = 'no'; + $this->billingAddress->city = 'Halifax'; + $this->billingAddress->postalCode = 'W5 9HR'; + $this->billingAddress->countryCode = '826'; + + // browser data + $this->browserData = new BrowserData(); + $this->browserData->acceptHeader = 'text/html,application/xhtml+xml,application/xml;q=9,image/webp,img/apng,*/*;q=0.8'; + $this->browserData->colorDepth = ColorDepth::TWENTY_FOUR_BITS; + $this->browserData->ipAddress = '123.123.123.123'; + $this->browserData->javaEnabled = true; + $this->browserData->language = 'en'; + $this->browserData->screenHeight = 1080; + $this->browserData->screenWidth = 1920; + $this->browserData->challengWindowSize = ChallengeWindowSize::WINDOWED_600X400; + $this->browserData->timeZone = '0'; + $this->browserData->userAgent = 'Mozilla/5.0 (Windows NT 6.1; Win64, x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'; + + } + + protected function getConfig() + { + $config = new ServicesConfig(); + $config->merchantId = 'myMerchantId'; + $config->accountId = 'ecom3ds'; + $config->sharedSecret = 'secret'; + $config->methodNotificationUrl = 'https://www.example.com/methodNotificationUrl'; + $config->challengeNotificationUrl = 'https://www.example.com/challengeNotificationUrl'; + $config->secure3dVersion = Secure3dVersion::ANY; + $config->merchantContactUrl = 'https://www.example.com'; + return $config; + } + + public function testFullCycle_v1() + { + $card = new CreditCardData(); + $card->number = 4012001037141112; + $card->expMonth = 12; + $card->expYear = 2025; + $card->cardHolderName = 'John Smith'; + + $secureEcom = Secure3dService::checkEnrollment($card) + ->withAmount(10.01) + ->withCurrency('USD') + ->execute(Secure3dVersion::ONE); + $this->assertEquals(Secure3dVersion::ONE, $secureEcom->getVersion()); + + if ($secureEcom->enrolled) { + // authenticate + $authClient = new ThreeDSecureAcsClient($secureEcom->issuerAcsUrl); + $authResponse = $authClient->authenticate($secureEcom->payerAuthenticationRequest, $secureEcom->getMerchantData()->toString()); + + $payerAuthenticationResponse = $authResponse->getAuthResponse(); + $md = MerchantDataCollection::parse($authResponse->getMerchantData()); + + $secureEcom = Secure3dService::getAuthenticationData() + ->withPayerAuthenticationResponse($payerAuthenticationResponse) + ->withMerchantData($md) + ->execute(); + $card->threeDSecure = $secureEcom; + + if ($secureEcom->status == 'Y') { + $response = $card->charge()->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } else { + $this->fail('Signature verification failed.'); + } + } else { + $this->fail('Card not enrolled.'); + } + } + + public function testFullCycle_v2() + { + $secureEcom = Secure3dService::checkEnrollment($this->card) + ->execute(Secure3dVersion::TWO); + $this->assertNotNull($secureEcom); + $this->assertNotNull($secureEcom->serverTransactionId); + + if ($secureEcom->enrolled) { + $this->assertEquals(Secure3dVersion::TWO, $secureEcom->getVersion()); + + // initiate authentication + $initAuth = Secure3dService::initiateAuthentication($this->card, $secureEcom) + ->withAmount(10.01) + ->withCurrency('USD') + ->withOrderCreateDate(date('Y-m-d H:i:s')) + ->withAddress($this->billingAddress, AddressType::BILLING) + ->withAddress($this->shippingAddress, AddressType::SHIPPING) + ->withBrowserData($this->browserData) + ->withMethodUrlCompletion(MethodUrlCompletion::NO) + ->execute(); + $this->assertNotNull($initAuth); + + // get authentication data + $secureEcom = Secure3dService::getAuthenticationData() + ->withServerTransactionId($initAuth->serverTransactionId) + ->execute(); + $this->card->threeDSecure = $secureEcom; + + if ($secureEcom->status == 'AUTHENTICATION_SUCCESSFUL') { + $response = $this->card->charge(10.01) + ->withCurrency('USD') + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } else { + $this->fail('Signature verification failed.'); + } + } else { + $this->fail('Card not enrolled'); + } + } + + public function testFullCycle_Any() + { + $secureEcom = Secure3dService::checkEnrollment($this->card) + ->withAmount(1.00) + ->withCurrency('USD') + ->execute(Secure3dVersion::ANY); + $this->assertNotNull($secureEcom); + + if ($secureEcom->enrolled) { + if ($secureEcom->getVersion() === Secure3dVersion::TWO) { + $this->assertEquals(Secure3dVersion::TWO, $secureEcom->getVersion()); + + // initiate authentication + $initAuth = Secure3dService::initiateAuthentication($this->card, $secureEcom) + ->withAmount(10.01) + ->withCurrency('USD') + ->withOrderCreateDate(date('Y-m-d H:i:s')) + ->withAddress($this->billingAddress, AddressType::BILLING) + ->withAddress($this->shippingAddress, AddressType::SHIPPING) + ->withBrowserData($this->browserData) + ->withMethodUrlCompletion(MethodUrlCompletion::NO) + ->execute(); + $this->assertNotNull($initAuth); + + // get authentication data + $secureEcom = Secure3dService::getAuthenticationData() + ->withServerTransactionId($initAuth->serverTransactionId) + ->execute(); + $this->card->threeDSecure = $secureEcom; + + if ($secureEcom->status == 'AUTHENTICATION_SUCCESSFUL') { + $response = $this->card->charge(10.01) + ->withCurrency('USD') + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } else { + $this->fail('Signature verification failed.'); + } + } else { + // authenticate + $authClient = new ThreeDSecureAcsClient($secureEcom->issuerAcsUrl); + $authResponse = $authClient->authenticate($secureEcom->payerAuthenticationRequest, $secureEcom->getMerchantData()->toString()); + + $payerAuthenticationResponse = $authResponse->getAuthResponse(); + $md = MerchantDataCollection::parse($authResponse->getMerchantData()); + + $secureEcom = Secure3dService::getAuthenticationData() + ->withPayerAuthenticationResponse($payerAuthenticationResponse) + ->withMerchantData($md) + ->execute(); + $this->card->threeDSecure = $secureEcom; + + if ($secureEcom->status == 'Y') { + $response = $this->card->charge()->execute(); + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } else { + $this->fail('Signature verification failed.'); + } + } + } else { + $this->fail('Card not enrolled'); + } + + } + + public function testFullCycle_v2_StoredCard() + { + $secureEcom = Secure3dService::checkEnrollment($this->stored) + ->execute(Secure3dVersion::TWO); + $this->assertNotNull($secureEcom); + $this->assertNotNull($secureEcom->serverTransactionId); + + if ($secureEcom->enrolled) { + $this->assertEquals(Secure3dVersion::TWO, $secureEcom->getVersion()); + + // initiate authentication + $initAuth = Secure3dService::initiateAuthentication($this->stored, $secureEcom) + ->withAmount(10.01) + ->withCurrency('USD') + ->withOrderCreateDate(date('Y-m-d H:i:s')) + ->withAddress($this->billingAddress, AddressType::BILLING) + ->withAddress($this->shippingAddress, AddressType::SHIPPING) + ->withBrowserData($this->browserData) + ->withMethodUrlCompletion(MethodUrlCompletion::NO) + ->execute(); + $this->assertNotNull($initAuth); + + // get authentication data + $secureEcom = Secure3dService::getAuthenticationData() + ->withServerTransactionId($initAuth->serverTransactionId) + ->execute(); + $this->stored->threeDSecure = $secureEcom; + + if ($secureEcom->status == 'AUTHENTICATION_SUCCESSFUL') { + $response = $this->stored->charge(10.01) + ->withCurrency('USD') + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } else { + $this->fail('Signature verification failed.'); + } + + } else { + $this->fail('Card not enrolled'); + } + } + + public function testFullCycle_v2_OTB() + { + $secureEcom = Secure3dService::checkEnrollment($this->card) + ->execute(Secure3dVersion::TWO); + $this->assertNotNull($secureEcom); + $this->assertNotNull($secureEcom->serverTransactionId); + + if ($secureEcom->enrolled) { + $this->assertEquals(Secure3dVersion::TWO, $secureEcom->getVersion()); + + // initiate authentication + $initAuth = Secure3dService::initiateAuthentication($this->card, $secureEcom) + ->withAmount(10.01) + ->withCurrency('USD') + ->withOrderCreateDate(date('Y-m-d H:i:s')) + ->withAddress($this->billingAddress, AddressType::BILLING) + ->withAddress($this->shippingAddress, AddressType::SHIPPING) + ->withBrowserData($this->browserData) + ->withMethodUrlCompletion(MethodUrlCompletion::NO) + ->execute(); + $this->assertNotNull($initAuth); + + // get authentication data + $secureEcom = Secure3dService::getAuthenticationData() + ->withServerTransactionId($initAuth->serverTransactionId) + ->execute(); + $this->card->threeDSecure = $secureEcom; + + if ($secureEcom->status == 'AUTHENTICATION_SUCCESSFUL') { + $response = $this->card->verify() + ->withCurrency('USD') + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } else { + $this->fail('Signature verification failed.'); + } + + } else { + $this->fail('Card not enrolled'); + } + } + + public function testFullCycle_v2_OTB_StoredCard() + { + $secureEcom = Secure3dService::checkEnrollment($this->stored) + ->execute(Secure3dVersion::TWO); + $this->assertNotNull($secureEcom); + $this->assertNotNull($secureEcom->serverTransactionId); + + if ($secureEcom->enrolled) { + $this->assertEquals(Secure3dVersion::TWO, $secureEcom->getVersion()); + + // initiate authentication + $initAuth = Secure3dService::initiateAuthentication($this->stored, $secureEcom) + ->withAmount(10.01) + ->withCurrency('USD') + ->withOrderCreateDate(date('Y-m-d H:i:s')) + ->withAddress($this->billingAddress, AddressType::BILLING) + ->withAddress($this->shippingAddress, AddressType::SHIPPING) + ->withBrowserData($this->browserData) + ->withMethodUrlCompletion(MethodUrlCompletion::NO) + ->execute(); + $this->assertNotNull($initAuth); + + // get authentication data + $secureEcom = Secure3dService::getAuthenticationData() + ->withServerTransactionId($initAuth->serverTransactionId) + ->execute(); + $this->stored->threeDSecure = $secureEcom; + + if ($secureEcom->status == 'AUTHENTICATION_SUCCESSFUL') { + $response = $this->stored->verify() + ->withCurrency('USD') + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } else { + $this->fail('Signature verification failed.'); + } + + } else { + $this->fail('Card not enrolled'); + } + } + + public function testOptionalRequestLevelFields() + { + $secureEcom = Secure3dService::checkEnrollment($this->card) + ->execute(Secure3dVersion::TWO); + $this->assertNotNull($secureEcom); + + if ($secureEcom->enrolled) { + $this->assertEquals(Secure3dVersion::TWO, $secureEcom->getVersion()); + + // initiate authentication + $initAuth = Secure3dService::initiateAuthentication($this->card, $secureEcom) + ->withAmount(10.01) + ->withCurrency('USD') + ->withOrderCreateDate(date('Y-m-d H:i:s')) + ->withAddress($this->billingAddress, AddressType::BILLING) + ->withAddress($this->shippingAddress, AddressType::SHIPPING) + ->withBrowserData($this->browserData) + ->withMethodUrlCompletion(MethodUrlCompletion::NO) + + // optionals + ->withMerchantInitiatedRequestType(AuthenticationRequestType::RECURRING_TRANSACTION) + + ->execute(); + $this->assertNotNull($initAuth); + + // get authentication data + $secureEcom = Secure3dService::getAuthenticationData() + ->withServerTransactionId($initAuth->serverTransactionId) + ->execute(); + $this->card->threeDSecure = $secureEcom; + + if ($secureEcom->status == 'AUTHENTICATION_SUCCESSFUL') { + $response = $this->card->charge(10.01) + ->withCurrency('USD') + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } else { + $this->fail('Signature verification failed.'); + } + } else { + $this->fail('Card not enrolled'); + } + } + + public function testOptionalOrderLevelFields() + { + $secureEcom = Secure3dService::checkEnrollment($this->card) + ->execute(Secure3dVersion::TWO); + $this->assertNotNull($secureEcom); + + if ($secureEcom->enrolled) { + $this->assertEquals(Secure3dVersion::TWO, $secureEcom->getVersion()); + + // initiate authentication + $initAuth = Secure3dService::initiateAuthentication($this->card, $secureEcom) + ->withAmount(250.00) + ->withCurrency('USD') + ->withOrderCreateDate(date('Y-m-d H:i:s')) + ->withAddress($this->billingAddress, AddressType::BILLING) + ->withAddress($this->shippingAddress, AddressType::SHIPPING) + ->withBrowserData($this->browserData) + ->withMethodUrlCompletion(MethodUrlCompletion::NO) + + // optionals + ->withGiftCardCurrency('USD') + ->withGiftCardAmount(250.00) + ->withDeliveryEmail('james.mason@example.com') + ->withDeliveryTimeFrame(DeliveryTimeFrame::ELECTRONIC_DELIVERY) + ->withShippingMethod(ShippingMethod::VERIFIED_ADDRESS) + ->withShippingNameMatchesCardHolderName(true) + ->withPreOrderIndicator(PreOrderIndicator::FUTURE_AVAILABILITY) + // TODO + // This value passed for date, but doesn't seem right + // This line bugged in Java SDK + ->withPreOrderAvailabilityDate('20190418') + ->withReorderIndicator(ReorderIndicator::REORDER) + ->withOrderTransactionType(OrderTransactionType::GOODS_SERVICE_PURCHASE) + + ->execute(); + $this->assertNotNull($initAuth); + + // get authentication data + $secureEcom = Secure3dService::getAuthenticationData() + ->withServerTransactionId($initAuth->serverTransactionId) + ->execute(); + $this->card->threeDSecure = $secureEcom; + + if ($secureEcom->status == 'AUTHENTICATION_SUCCESSFUL') { + $response = $this->card->charge(10.01) + ->withCurrency('USD') + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } else { + $this->fail('Signature verification failed.'); + } + } else { + $this->fail('Card not enrolled'); + } + } + + public function testOptionalPayerLevelFields() + { + $secureEcom = Secure3dService::checkEnrollment($this->card) + ->execute(Secure3dVersion::TWO); + $this->assertNotNull($secureEcom); + + if ($secureEcom->enrolled) { + $this->assertEquals(Secure3dVersion::TWO, $secureEcom->getVersion()); + + // initiate authentication + $initAuth = Secure3dService::initiateAuthentication($this->card, $secureEcom) + ->withAmount(250.00) + ->withCurrency('USD') + ->withOrderCreateDate(date('Y-m-d H:i:s')) + ->withAddress($this->billingAddress, AddressType::BILLING) + ->withAddress($this->shippingAddress, AddressType::SHIPPING) + ->withBrowserData($this->browserData) + ->withMethodUrlCompletion(MethodUrlCompletion::NO) + + // optionals + ->withCustomerAccountId('6dcb24f5-74a0-4da3-98da-4f0aa0e88db3') + ->withAccountAgeIndicator(AgeIndicator::LESS_THAN_THIRTY_DAYS) + ->withAccountCreateDate('20190110') + ->withAccountChangeDate('20190128') + ->withAccountChangeIndicator(AgeIndicator::THIS_TRANSACTION) + ->withPasswordChangeDate('20190115') + ->withPasswordChangeIndicator(AgeIndicator::LESS_THAN_THIRTY_DAYS) + ->withHomeNumber('44', '123456798') + ->withWorkNumber('44', '1801555888') + ->withPaymentAccountCreateDate('20190101') + ->withPaymentAccountAgeIndicator(AgeIndicator::LESS_THAN_THIRTY_DAYS) + ->withPreviousSuspiciousActivity(false) + ->withNumberOfPurchasesInLastSixMonths(3) + ->withNumberOfTransactionsInLast24Hours(1) + ->withNumberOfTransactionsInLastYear(5) + ->withNumberOfAddCardAttemptsInLast24Hours(1) + ->withShippingAddressCreateDate('20190128') + ->withShippingAddressUsageIndicator(AgeIndicator::THIS_TRANSACTION) + + ->execute(); + $this->assertNotNull($initAuth); + + // get authentication data + $secureEcom = Secure3dService::getAuthenticationData() + ->withServerTransactionId($initAuth->serverTransactionId) + ->execute(); + $this->card->threeDSecure = $secureEcom; + + if ($secureEcom->status == 'AUTHENTICATION_SUCCESSFUL') { + $response = $this->card->charge(10.01) + ->withCurrency('USD') + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } else { + $this->fail('Signature verification failed.'); + } + } else { + $this->fail('Card not enrolled'); + } + } + + public function testOptionalPriorAuthenticationData() + { + $secureEcom = Secure3dService::checkEnrollment($this->card) + ->execute(Secure3dVersion::TWO); + $this->assertNotNull($secureEcom); + + if ($secureEcom->enrolled) { + $this->assertEquals(Secure3dVersion::TWO, $secureEcom->getVersion()); + + // initiate authentication + $initAuth = Secure3dService::initiateAuthentication($this->card, $secureEcom) + ->withAmount(250.00) + ->withCurrency('USD') + ->withOrderCreateDate(date('Y-m-d H:i:s')) + ->withAddress($this->billingAddress, AddressType::BILLING) + ->withAddress($this->shippingAddress, AddressType::SHIPPING) + ->withBrowserData($this->browserData) + ->withMethodUrlCompletion(MethodUrlCompletion::NO) + + // optionals + ->withPriorAuthenticationMethod(PriorAuthenticationMethod::FRICTIONLESS_AUTHENTICATION) + ->withPriorAuthenticationTransactionId('26c3f619-39a4-4040-bf1f-6fd433e6d615') + ->withPriorAuthenticationTimestamp((new \DateTime('2019-01-10T12:57:33.333Z'))->format(\DateTime::RFC3339_EXTENDED)) + + ->execute(); + $this->assertNotNull($initAuth); + + // get authentication data + $secureEcom = Secure3dService::getAuthenticationData() + ->withServerTransactionId($initAuth->serverTransactionId) + ->execute(); + $this->card->threeDSecure = $secureEcom; + + if ($secureEcom->status == 'AUTHENTICATION_SUCCESSFUL') { + $response = $this->card->charge(10.01) + ->withCurrency('USD') + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } else { + $this->fail('Signature verification failed.'); + } + } else { + $this->fail('Card not enrolled'); + } + } + + public function testOptionalRecurringData() + { + $secureEcom = Secure3dService::checkEnrollment($this->card) + ->execute(Secure3dVersion::TWO); + $this->assertNotNull($secureEcom); + + if ($secureEcom->enrolled) { + $this->assertEquals(Secure3dVersion::TWO, $secureEcom->getVersion()); + + // initiate authentication + $initAuth = Secure3dService::initiateAuthentication($this->card, $secureEcom) + ->withAmount(250.00) + ->withCurrency('USD') + ->withOrderCreateDate(date('Y-m-d H:i:s')) + ->withAddress($this->billingAddress, AddressType::BILLING) + ->withAddress($this->shippingAddress, AddressType::SHIPPING) + ->withBrowserData($this->browserData) + ->withMethodUrlCompletion(MethodUrlCompletion::NO) + + // optionals + ->withMaxNumberOfInstallments(5) + ->withRecurringAuthorizationFrequency(25) + ->withRecurringAuthorizationExpiryDate('20190825') + + ->execute(); + $this->assertNotNull($initAuth); + + // get authentication data + $secureEcom = Secure3dService::getAuthenticationData() + ->withServerTransactionId($initAuth->serverTransactionId) + ->execute(); + $this->card->threeDSecure = $secureEcom; + + if ($secureEcom->status == 'AUTHENTICATION_SUCCESSFUL') { + $response = $this->card->charge(10.01) + ->withCurrency('USD') + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } else { + $this->fail('Signature verification failed.'); + } + } else { + $this->fail('Card not enrolled'); + } + } + + public function testOptionalPayerLoginData() + { + $secureEcom = Secure3dService::checkEnrollment($this->card) + ->execute(Secure3dVersion::TWO); + $this->assertNotNull($secureEcom); + + if ($secureEcom->enrolled) { + $this->assertEquals(Secure3dVersion::TWO, $secureEcom->getVersion()); + + // initiate authentication + $initAuth = Secure3dService::initiateAuthentication($this->card, $secureEcom) + ->withAmount(250.00) + ->withCurrency('USD') + ->withOrderCreateDate(date('Y-m-d H:i:s')) + ->withAddress($this->billingAddress, AddressType::BILLING) + ->withAddress($this->shippingAddress, AddressType::SHIPPING) + ->withBrowserData($this->browserData) + ->withMethodUrlCompletion(MethodUrlCompletion::NO) + + // optionals + ->withCustomerAuthenticationData('string') + ->withCustomerAuthenticationTimestamp((new \DateTime('2019-01-10T12:57:33.333Z'))->format(\DateTime::RFC3339_EXTENDED)) + ->withCustomerAuthenticationMethod(CustomerAuthenticationMethod::MERCHANT_SYSTEM) + + ->execute(); + $this->assertNotNull($initAuth); + + // get authentication data + $secureEcom = Secure3dService::getAuthenticationData() + ->withServerTransactionId($initAuth->serverTransactionId) + ->execute(); + $this->card->threeDSecure = $secureEcom; + + if ($secureEcom->status == 'AUTHENTICATION_SUCCESSFUL') { + $response = $this->card->charge(10.01) + ->withCurrency('USD') + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } else { + $this->fail('Signature verification failed.'); + } + } else { + $this->fail('Card not enrolled'); + } + } + + public function testOptionalMobileFields() + { + $secureEcom = Secure3dService::checkEnrollment($this->card) + ->execute(Secure3dVersion::TWO); + $this->assertNotNull($secureEcom); + + if ($secureEcom->enrolled) { + $this->assertEquals(Secure3dVersion::TWO, $secureEcom->getVersion()); + + // initiate authentication + $initAuth = Secure3dService::initiateAuthentication($this->card, $secureEcom) + ->withAmount(250.00) + ->withCurrency('USD') + ->withOrderCreateDate(date('Y-m-d H:i:s')) + ->withAddress($this->billingAddress, AddressType::BILLING) + ->withAddress($this->shippingAddress, AddressType::SHIPPING) + ->withBrowserData($this->browserData) + ->withMethodUrlCompletion(MethodUrlCompletion::NO) + + // optionals + ->withApplicationId('f283b3ec-27da-42a1-acea-f3f70e75bbdc') + ->withSdkInterface(SdkInterface::BOTH) + ->withSdkUiTypes([SdkUiType::TEXT, SdkUiType::SINGLE_SELECT, SdkUiType::MULTI_SELECT, SdkUiType::OOB, SdkUiType::HTML_OTHER]) + ->withReferenceNumber('3DS_LOA_SDK_PPFU_020100_00007') + ->withSdkTransactionId('b2385523-a66c-4907-ac3c-91848e8c0067') + ->withEncodedData('ew0KCSJEViI6ICIxLjAiLA0KCSJERCI6IHsNCgkJIkMwMDEiOiAiQW5kcm9pZCIsDQoJCSJDMDAyIjogIkhUQyBPbmVfTTgiLA0KCQkiQzAwNCI6ICI1LjAuMSIsDQoJCSJDMDA1IjogImVuX1VTIiwNCgkJIkMwMDYiOiAiRWFzdGVybiBTdGFuZGFyZCBUaW1lIiwNCgkJIkMwMDciOiAiMDY3OTc5MDMtZmI2MS00MWVkLTk0YzItNGQyYjc0ZTI3ZDE4IiwNCgkJIkMwMDkiOiAiSm9obidzIEFuZHJvaWQgRGV2aWNlIg0KCX0sDQoJIkRQTkEiOiB7DQoJCSJDMDEwIjogIlJFMDEiLA0KCQkiQzAxMSI6ICJSRTAzIg0KCX0sDQoJIlNXIjogWyJTVzAxIiwgIlNXMDQiXQ0KfQ0K') + + ->execute(); + $this->assertNotNull($initAuth); + + // get authentication data + $secureEcom = Secure3dService::getAuthenticationData() + ->withServerTransactionId($initAuth->serverTransactionId) + ->execute(); + $this->card->threeDSecure = $secureEcom; + + if ($secureEcom->status == 'AUTHENTICATION_SUCCESSFUL') { + $response = $this->card->charge(10.01) + ->withCurrency('USD') + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('00', $response->responseCode); + } else { + $this->fail('Signature verification failed.'); + } + } else { + $this->fail('Card not enrolled'); + } + } + + public function testCheckVersion_Not_Enrolled() + { + $card = new CreditCardData(); + $card->number = 4012001037141112; + $card->expMonth = 12; + $card->expYear = 2025; + $secureEcom = Secure3dService::checkEnrollment($card) + ->execute(Secure3dVersion::ANY); + $this->assertNotNull($secureEcom); + $this->assertFalse((bool)$secureEcom->enrolled); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + */ + // public function testCheckVersion_Not_ISecure3d() + // { + // $secureEcom = Secure3dService::checkEnrollment(new DebitTrackData) + // ->execute(Secure3dVersion::ANY); + // $this->assertNotNull($secureEcom); + // } +} \ No newline at end of file diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/ThreeDSecureAcsClient.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/ThreeDSecureAcsClient.php new file mode 100644 index 0000000..543dc23 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/ThreeDSecureAcsClient.php @@ -0,0 +1,116 @@ +serviceUrl = $url; + } + + /** + * @return AcsResponse + */ + public function authenticate($payerAuthRequest, $merchantData = '') + { + $kvps = []; + array_push($kvps, array('key'=>'PaReq', 'value'=>$payerAuthRequest)); + array_push($kvps, array('key'=>'TermUrl', 'value'=>'https://www.mywebsite.com/process3dSecure')); + array_push($kvps, array('key'=>'MD', 'value'=>$merchantData)); + + $rawResponse = ''; + try { + $postData = $this->buildData($kvps); + + $request = curl_init(); + + curl_setopt_array($request, array( + CURLOPT_URL => $this->serviceUrl, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_ENCODING => "", + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 30, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_CUSTOMREQUEST => "POST", + CURLOPT_POSTFIELDS => $postData, + CURLOPT_HTTPHEADER => array( + "Content-Type: application/x-www-form-urlencoded; charset=UTF-8", + "cache-control: no-cache" + ), + )); + + $rawResponse = curl_exec($request); + $curlInfo = curl_getinfo($request); + $err = curl_error($request); + + curl_close($request); + + if ($curlInfo['http_code'] != 200) { + throw new ApiException(sprintf('Acs request failed with response code: %s', $curlInfo['http_code'])); + } + } catch (Exception $exc) { + throw new ApiException($exc); + } + + $rValue = new AcsResponse(); + $rValue->setAuthResponse($this->getInputValue($rawResponse, 'PaRes')); + $rValue->setMerchantData($this->getInputValue($rawResponse, 'MD')); + + return $rValue; + } + + /** + * @return string + */ + private function buildData($kvps) + { + $result = ''; + $first = true; + foreach ($kvps as $kvp) { + if ($first) { + $first = false; + } else { + $result .= '&'; + } + + $result .= urlencode($kvp['key']); + $result .= '='; + $result .= urlencode($kvp['value']); + } + + return $result; + } + + /** + * @return string + */ + private function getInputValue($raw, $inputValue) + { + if ($raw == null) { + return null; + } + + $searchString = sprintf('NAME="%s" VALUE="', $inputValue); + + $index = strpos($raw, $searchString); + + if ($index > -1) { + $index = $index + strlen($searchString); + + $length = strpos(substr($raw, $index), '"'); + + return substr($raw, $index, $length); + } + return null; + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/HpaAdminTests.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/HpaAdminTests.php new file mode 100644 index 0000000..8e67c8a --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/HpaAdminTests.php @@ -0,0 +1,361 @@ +device = DeviceService::create($this->getConfig()); + } + + public function tearDown() + { + sleep(3); + $this->device->reset(); + } + + protected function getConfig() + { + $config = new ConnectionConfig(); + $config->ipAddress = '10.138.141.5'; + $config->port = '12345'; + $config->deviceType = DeviceType::HPA_ISC250; + $config->connectionMode = ConnectionModes::TCP_IP; + $config->timeout = 300; + $config->requestIdProvider = new RequestIdProvider(); + + return $config; + } + + public function testCancel() + { + $response = $this->device->cancel(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + $this->assertEquals('Reset', $response->response); + } + + public function testIntialize() + { + $this->device->closeLane(); + $response = $this->device->initialize(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + $this->assertNotNull($response->responseData['initializeResponse']); + + $deviceInformation = $response->responseData['initializeResponse']; + $this->assertEquals('HeartSIP', $deviceInformation['application']); + } + + public function testOpenLane() + { + $response = $this->device->openLane(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + } + + public function testCloseLane() + { + $response = $this->device->closeLane(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + } + + public function testReset() + { + $response = $this->device->reset(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + $this->assertEquals('Reset', $response->response); + } + + public function testReboot() + { + $this->markTestSkipped('Reboot skipped'); + + $response = $this->device->reboot(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + $this->assertEquals('Reboot', $response->response); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException + * @expectedExceptionMessage Unexpected Gateway Response: 1502 - CANNOT PROCESS IN LANE OPEN STATE + */ + public function testLaneOpenIntialize() + { + //open the lane + $response = $this->device->openLane(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + + $response = $this->device->initialize(); + } + + public function testEod() + { + $this->device->reset(); + $this->device->closeLane(); + + $response = $this->device->eod(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + + $this->assertNotNull($response->reversal); + $this->assertNotNull($response->emvOfflineDecline); + $this->assertNotNull($response->transactionCertificate); + $this->assertNotNull($response->attachment); + $this->assertNotNull($response->sendSAF); + $this->assertNotNull($response->batchClose); + $this->assertNotNull($response->heartBeat); + $this->assertNotNull($response->eMVPDL); + + $this->assertNotNull($response->responseData); + $this->assertNotNull($response->responseData['getBatchReport']['batchSummary']); + $this->assertNotNull($response->responseData['getBatchReport']['batchReport']); + $this->assertNotNull($response->responseData['getBatchReport']['batchDetail']); + } + + public function testStartDownload() + { + $this->markTestSkipped('StartDownload skipped'); + + $deviceSettings = new DeviceSettings(); + $deviceSettings->terminalId = 'EB25033M'; + $deviceSettings->applicationId = 'PI8HD33M'; + $deviceSettings->downloadType = DownloadType::FULL; + $deviceSettings->downloadTime = DownloadTime::NOW; + $deviceSettings->hudsUrl = DownloadEnvironment::DEVELOPMENT; + $deviceSettings->hudsPort = 8001; + + $response = $this->device->startDownload($deviceSettings); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + } + + public function testPartialStartDownload() + { + $this->markTestSkipped('StartDownload skipped'); + + $deviceSettings = new DeviceSettings(); + $deviceSettings->terminalId = 'EB25033M'; + $deviceSettings->applicationId = 'PI8HD33M'; + $deviceSettings->downloadType = DownloadType::PARTIAL; + $deviceSettings->downloadTime = DownloadTime::NOW; + $deviceSettings->hudsUrl = DownloadEnvironment::DEVELOPMENT; + $deviceSettings->hudsPort = 8001; + + $response = $this->device->startDownload($deviceSettings); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + } + + public function testEndOfDayStartDownload() + { + $this->markTestSkipped('StartDownload skipped'); + + $deviceSettings = new DeviceSettings(); + $deviceSettings->terminalId = 'EB25033M'; + $deviceSettings->applicationId = 'PI8HD33M'; + $deviceSettings->downloadType = DownloadType::FULL; + $deviceSettings->downloadTime = DownloadTime::EOD; + $deviceSettings->hudsUrl = DownloadEnvironment::DEVELOPMENT; + $deviceSettings->hudsPort = 8001; + + $response = $this->device->startDownload($deviceSettings); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + } + + public function testCustomStartDownload() + { + $this->markTestSkipped('StartDownload skipped'); + + $deviceSettings = new DeviceSettings(); + $deviceSettings->terminalId = 'EB25033M'; + $deviceSettings->applicationId = 'PI8HD33M'; + $deviceSettings->downloadType = DownloadType::FULL; + $deviceSettings->downloadTime = date('YmdHis'); + $deviceSettings->hudsUrl = DownloadEnvironment::DEVELOPMENT; + $deviceSettings->hudsPort = 8001; + + $response = $this->device->startDownload($deviceSettings); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + } + + public function testLineItem() + { + $lineItemDetails = new LineItem(); + $lineItemDetails->leftText = 'Green Beans, canned'; + $lineItemDetails->rightText = '$0.59'; + $lineItemDetails->runningLeftText = 'TOTAL'; + $lineItemDetails->runningRightText = '$1.19'; + + $this->device->openLane(); + $response = $this->device->lineItem($lineItemDetails); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + * @expectedExceptionMessage Line item left text cannot be null + */ + public function testLineItemLeftext() + { + $lineItemDetails = new LineItem(); + $response = $this->device->lineItem($lineItemDetails); + } + + public function testEnableSafMode() + { + $response = $this->device->setSafMode(1); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + } + + public function testDisableSafMode() + { + $response = $this->device->setSafMode(3); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + } + + public function testSendSaf() + { + $response = $this->device->sendSaf(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + + $this->assertNotNull($response->responseData); + $this->assertNotNull($response->responseData['sendSAF']); + $this->assertNotNull($response->responseData['sendSAF']['approvedSafSummary']); + $this->assertNotNull($response->responseData['sendSAF']['pendingSafSummary']); + $this->assertNotNull($response->responseData['sendSAF']['declinedSafSummary']); + $this->assertNotNull($response->responseData['sendSAF']['offlineApprovedSafSummary']); + $this->assertNotNull($response->responseData['sendSAF']['partiallyApprovedSafSummary']); + $this->assertNotNull($response->responseData['sendSAF']['approvedSafVoidSummary']); + } + + /* + * Note: This sample banner will take 25 minutes to upload. + * Timeout should be handled accordingly + */ + public function testSendFileBanner() + { + $sendFileInfo = new SendFileData(); + $sendFileInfo->imageLocation = dirname(__FILE__) . '/sampleimages/hpa_banner_iSC250_60_480.jpg'; + $sendFileInfo->imageType = HpaSendFileType::BANNER; + + $response = $this->device->sendFile($sendFileInfo); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + } + + /* + * Note: This sample logo will take 20 minutes to upload. + * Timeout should be handled accordingly + */ + public function testSendFileIdleLogo() + { + $sendFileInfo = new SendFileData(); + $sendFileInfo->imageLocation = dirname(__FILE__) . '/sampleimages/hpa_logo_iSC250_272_480.jpg'; + $sendFileInfo->imageType = HpaSendFileType::IDLELOGO; + + $response = $this->device->sendFile($sendFileInfo); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + * @expectedExceptionMessage Input error: Image location / type missing + */ + public function testFileInputError() + { + $sendFileInfo = new SendFileData(); + $this->device->sendFile($sendFileInfo); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + * @expectedExceptionMessage Incorrect file height and width + */ + public function testIncorrectFileSize() + { + $sendFileInfo = new SendFileData(); + $sendFileInfo->imageLocation = dirname(__FILE__) . '/sampleimages/image_500_500.jpg'; + $sendFileInfo->imageType = HpaSendFileType::BANNER; + + $this->device->sendFile($sendFileInfo); + } + + public function testGetDiagnosticReport() + { + $response = $this->device->getDiagnosticReport(30); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + + $this->assertNotNull($response->responseData); + $this->assertNotNull($response->responseData['getDiagnosticReport']); + } + + public function testPromptForSignature() + { + $this->device->openLane(); + $response = $this->device->promptForSignature(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + $this->assertNotNull($response->signatureData); + } + + public function testGetLastResponse() + { + $this->device->openLane(); + $response = $this->device->getLastResponse(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + $this->assertNotNull($response->lastResponse); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/HpaCreditTests.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/HpaCreditTests.php new file mode 100644 index 0000000..4c83cee --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/HpaCreditTests.php @@ -0,0 +1,225 @@ +device = DeviceService::create($this->getConfig()); + + //open lane for credit transactions + $this->device->openLane(); + } + + public function tearDown() + { + $this->waitAndReset(); + } + + protected function getConfig() + { + $config = new ConnectionConfig(); + $config->ipAddress = '10.138.141.20'; + $config->port = '12345'; + $config->deviceType = DeviceType::HPA_ISC250; + $config->connectionMode = ConnectionModes::TCP_IP; + $config->timeout = 180; + $config->requestIdProvider = new RequestIdProvider(); + + return $config; + } + + public function waitAndReset() + { + sleep(3); + $this->device->reset(); + } + + public function testCreditSale() + { + $response = $this->device->creditSale(10) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + $this->assertNotNull($response->transactionId); + } + + public function testCreditAuth() + { + $response = $this->device->creditAuth(10) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + $this->assertNotNull($response->transactionId); + } + + public function testCreditCapture() + { + $authResponse = $this->device->creditAuth(15) + ->execute(); + + $this->assertNotNull($authResponse); + $this->assertEquals('0', $authResponse->resultCode); + $this->assertNotNull($authResponse->transactionId); + + $this->waitAndReset(); + + $response = $this->device->creditCapture(15) + ->withTransactionId($authResponse->transactionId) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + } + + public function testCreditVoid() + { + $saleResponse = $this->device->creditSale(10) + ->execute(); + + $this->assertNotNull($saleResponse); + $this->assertEquals('0', $saleResponse->resultCode); + $this->assertNotNull($saleResponse->transactionId); + + $this->waitAndReset(); + + $response = $this->device->creditVoid() + ->withTransactionId($saleResponse->transactionId) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + } + + public function testCreditRefundByCard() + { + $response = $this->device->creditRefund(15) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + } + + public function testCreditVerify() + { + $response = $this->device->creditVerify() + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + * @expectedExceptionMessage amount cannot be null for this transaction type + */ + public function testSaleWithoutAmount() + { + $response = $this->device->creditSale() + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + * @expectedExceptionMessage amount cannot be null for this transaction type + */ + public function testAuthWithoutAmount() + { + $response = $this->device->creditAuth() + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + * @expectedExceptionMessage amount cannot be null for this transaction type + */ + public function testCaptureWithoutAmount() + { + $response = $this->device->creditCapture() + ->withTransactionId(1234) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + * @expectedExceptionMessage amount cannot be null for this transaction type + */ + public function testRefundWithoutAmount() + { + $response = $this->device->creditRefund() + ->withTransactionId(1234) + ->execute(); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + * @expectedExceptionMessage transactionId cannot be null for this transaction type + */ + public function testCaptureWithoutTransactionId() + { + $response = $this->device->creditCapture(10) + ->execute(); + } + + public function testSaleStartCard() + { + $response = $this->device->startCard(PaymentMethodType::CREDIT); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + + $response = $this->device->creditSale(15) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + $this->assertNotNull($response->transactionId); + } + + public function testLostTransaction() + { + $requestIdProvider = new RequestIdProvider(); + $requestId = $requestIdProvider->getRequestId(); + + $response = $this->device->creditSale(10) + ->withRequestId($requestId) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + + $this->waitAndReset(); + + $lostResponse = $this->device->creditSale(10) + ->withRequestId($requestId) + ->execute(); + + $this->assertNotNull($lostResponse); + $this->assertEquals('0', $lostResponse->resultCode); + $this->assertEquals($requestId, $lostResponse->requestId); + $this->assertEquals('1', $lostResponse->isStoredResponse); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/HpaDebitTests.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/HpaDebitTests.php new file mode 100644 index 0000000..f76dffb --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/HpaDebitTests.php @@ -0,0 +1,119 @@ +device = DeviceService::create($this->getConfig()); + + //open lane for Debit transactions + $this->device->openLane(); + } + + public function tearDown() + { + $this->waitAndReset(); + } + + protected function getConfig() + { + $config = new ConnectionConfig(); + $config->ipAddress = '10.138.141.7'; + $config->port = '12345'; + $config->deviceType = DeviceType::HPA_ISC250; + $config->connectionMode = ConnectionModes::TCP_IP; + $config->timeout = 60; + $config->requestIdProvider = new RequestIdProvider(); + + return $config; + } + + public function waitAndReset() + { + sleep(3); + $this->device->reset(); + } + + public function testDebitSale() + { + $response = $this->device->debitSale(10) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + $this->assertNotNull($response->transactionId); + } + + public function testDebitRefund() + { + $saleResponse = $this->device->debitSale(15) + ->execute(); + + $this->assertNotNull($saleResponse); + $this->assertEquals('0', $saleResponse->resultCode); + $this->assertNotNull($saleResponse->transactionId); + + $this->waitAndReset(); + + $response = $this->device->debitRefund(15) + ->withTransactionId($saleResponse->transactionId) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + * @expectedExceptionMessage amount cannot be null for this transaction type + */ + public function testSaleWithoutAmount() + { + $response = $this->device->debitSale() + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + * @expectedExceptionMessage amount cannot be null for this transaction type + */ + public function testRefundWithoutAmount() + { + $response = $this->device->debitRefund() + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + } + + public function testSaleStartCard() + { + $response = $this->device->startCard(PaymentMethodType::DEBIT); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + + $response = $this->device->debitSale(15) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + $this->assertNotNull($response->transactionId); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/HpaEbtTests.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/HpaEbtTests.php new file mode 100644 index 0000000..e850538 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/HpaEbtTests.php @@ -0,0 +1,102 @@ +device = DeviceService::create($this->getConfig()); + + //open lane for EBT transactions + $this->device->openLane(); + } + + public function tearDown() + { + $this->waitAndReset(); + } + + protected function getConfig() + { + $config = new ConnectionConfig(); + $config->ipAddress = '10.138.141.7'; + $config->port = '12345'; + $config->deviceType = DeviceType::HPA_ISC250; + $config->connectionMode = ConnectionModes::TCP_IP; + $config->timeout = 180; + $config->requestIdProvider = new RequestIdProvider(); + + return $config; + } + + public function waitAndReset() + { + sleep(3); + $this->device->reset(); + } + + public function testEbtBalance() + { + $response = $this->device->ebtBalance() + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + } + + public function testEbtPurchase() + { + $saleResponse = $this->device->ebtPurchase(10) + ->execute(); + + $this->assertNotNull($saleResponse); + $this->assertEquals('0', $saleResponse->resultCode); + $this->assertNotNull($saleResponse->transactionId); + } + + public function testEbtRefund() + { + $saleResponse = $this->device->ebtPurchase(15) + ->execute(); + + $this->assertNotNull($saleResponse); + $this->assertEquals('0', $saleResponse->resultCode); + $this->assertNotNull($saleResponse->transactionId); + + $this->waitAndReset(); + + $response = $this->device->ebtRefund(15) + ->withTransactionId($saleResponse->transactionId) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + } + + public function testSaleStartCard() + { + $response = $this->device->startCard(PaymentMethodType::EBT); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + + $response = $this->device->ebtPurchase(15) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + $this->assertNotNull($response->transactionId); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/HpaGiftTests.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/HpaGiftTests.php new file mode 100644 index 0000000..ea81039 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/HpaGiftTests.php @@ -0,0 +1,150 @@ +device = DeviceService::create($this->getConfig()); + + //open lane for EBT transactions + $this->device->openLane(); + } + + public function tearDown() + { + $this->waitAndReset(); + } + + protected function getConfig() + { + $config = new ConnectionConfig(); + $config->ipAddress = '10.138.141.7'; + $config->port = '12345'; + $config->deviceType = DeviceType::HPA_ISC250; + $config->connectionMode = ConnectionModes::TCP_IP; + $config->timeout = 180; + $config->requestIdProvider = new RequestIdProvider(); + + return $config; + } + + public function waitAndReset() + { + sleep(3); + $this->device->reset(); + } + + public function testGiftSale() + { + $response = $this->device->giftSale(100) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + } + + public function testLoyaltySale() + { + $response = $this->device->giftSale(100) + ->withCurrency(CurrencyType::POINTS) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + } + + public function testGiftAddValue() + { + $response = $this->device->giftAddValue(100) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + } + + public function testLoyaltyAddValue() + { + $response = $this->device->giftAddValue(100) + ->withCurrency(CurrencyType::POINTS) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + } + + public function testGiftVoid() + { + $responseSale = $this->device->giftSale(100) + ->execute(); + + $this->assertNotNull($responseSale); + $this->assertEquals('0', $responseSale->resultCode); + + $this->waitAndReset(); + + $response = $this->device->giftVoid() + ->withTransactionId($responseSale->transactionId) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + } + + public function testGiftBalance() + { + $response = $this->device->giftBalance() + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + } + + public function testLoyaltyBalance() + { + $response = $this->device->giftBalance() + ->withCurrency(CurrencyType::POINTS) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + } + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException + * @expectedExceptionMessage amount cannot be null for this transaction type + */ + public function testAddValueWithoutAmount() + { + $this->device->giftAddValue() + ->execute(); + } + + public function testSaleStartCard() + { + $response = $this->device->startCard(PaymentMethodType::GIFT); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + + $response = $this->device->giftSale(100) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + $this->assertNotNull($response->transactionId); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/sampleimages/hpa_banner_iSC250_60_480.jpg b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/sampleimages/hpa_banner_iSC250_60_480.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2e87b19de0cf4a20a1ccb54e84c92aa5fd3ca1dd GIT binary patch literal 13453 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 literal 0 HcmV?d00001 diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/sampleimages/hpa_logo_iSC250_272_480.jpg b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/sampleimages/hpa_logo_iSC250_272_480.jpg new file mode 100644 index 0000000000000000000000000000000000000000..339091a48e667506f32ca57e635ad82efab91337 GIT binary patch literal 10913 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 M{J--7rqika2BfU)G5`Po literal 0 HcmV?d00001 diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/sampleimages/image_500_500.jpg b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/sampleimages/image_500_500.jpg new file mode 100644 index 0000000000000000000000000000000000000000..db5f5a3eae3e1e6e97e9898e2d63dc473e7f24e2 GIT binary patch literal 15070 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 = DeviceService::create($this->getConfig()); + + //open lane for credit transactions + $this->device->openLane(); + } + + protected function getConfig() + { + $config = new ConnectionConfig(); + $config->ipAddress = '10.138.141.5'; + $config->port = '12345'; + $config->deviceType = DeviceType::HPA_ISC250; + $config->connectionMode = ConnectionModes::TCP_IP; + $config->timeout = 300; + $config->requestIdProvider = new RequestIdProvider(); + + return $config; + } + + public function tearDown() + { + sleep(3); + $this->device->reset(); + } + + private function printReceipt($response) + { + $receipt = "x_trans_type=" . $response->response; + $receipt .= "&x_application_label=" . $response->emvApplicationName; + $receipt .= "&x_masked_card=" . $response->maskedCardNumber; + $receipt .= "&x_application_id=" . $response->emvApplicationId; + $receipt .= "&x_cryptogram_type=" . $response->emvCryptogramType; + $receipt .= "&x_application_cryptogram=" . $response->emvCryptogram; + $receipt .= "&x_expiration_date=" . $response->expirationDate; + $receipt .= "&x_entry_method=" . $response->entryMethod; + $receipt .= "&x_approval=" . $response->approvalCode; + $receipt .= "&x_transaction_amount=" . $response->transactionAmount; + $receipt .= "&x_amount_due=" . $response->balanceAmountDue; + $receipt .= "&x_customer_verification_method=" . $response->emvCardHolderVerificationMethod; + $receipt .= "&x_response_text=" . $response->responseText; + $receipt .= "&x_signature_status=" . $response->signatureStatus; + print($receipt); + } + + /* + TEST CASE #1 – Contact Chip and Signature – Offline + Objective Process a contact transaction where the CVM’s supported are offline chip and signature + Test Card Card #1 - MasterCard EMV + Procedure Perform a complete transaction without error.. + Enter transaction amount $23.00. + */ + + public function testCase01() + { + $response = $this->device->creditSale(23) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + + print("Response: " . print_r($response, true)); + print("Gateway Txn ID: " . $response->transactionId); + + $this->printReceipt($response); + } + + /* + TEST CASE #2 - EMV Receipts + Objective 1. Verify receipt image conforms to EMV Receipt Requirements. + 2. Verify that signature capture functionality works. + Test Card Any card brand – Visa, MC, Discover, AMEX. + Procedure Run an EMV insert sale using any card brand. + The device should get an Approval. + Cardholder is prompted to sign on the device. + */ + + public function testCase02() + { + // print receipt for TestCase01 + $this->testCase01(); + } + + /* + TEST CASE #3 - Approved Sale with Offline PIN + Objective Process an EMV contact sale with offline PIN. + Test Card Card #1 - MasterCard EMV + Procedure Insert the card in the chip reader and follow the instructions on the device. + Enter transaction amount $25.00. + When prompted for PIN, enter 4315. + If no PIN prompt, device could be in QPS mode with limit above transaction amount. + */ + + public function testCase03() + { + $response = $this->device->creditSale(25) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + + print("Response: " . print_r($response, true)); + print("Gateway Txn ID: " . $response->transactionId); + + $this->printReceipt($response); + } + + /* + TEST CASE #4 - Manually Entered Sale with AVS & CVV2/CID (If AVS is supported) + Objective Process a keyed sale, with PAN & exp date, along with Address Verification + and Card Security Code to confirm the application can support any or all of these. + Test Card Card #5 – MSD only MasterCard + Procedure 1. Select sale function and manually key Test Card #5 for the amount of $90.08. + a. Enter PAN & expiration date. + b. Enter 321 for Card Security Code (CVV2, CID), if supporting this feature. + Enter 76321 for AVS, if supporting this feature. + */ + + public function testCase04() + { + $response = $this->device->creditSale(90.08) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + + $this->assertEquals("Zip and address match.", $response->avsResponseText); + $this->assertEquals("Not Processed.", $response->cvvResponseText); + + print("Response: " . print_r($response, true)); + print("Gateway Txn ID: " . $response->transactionId); + + $this->printReceipt($response); + } + + /* + TEST CASE #5 - Partial Approval + Objective 1. Ensure application can handle non-EMV swiped transactions. + 2. Validate partial approval support. + Test Card Card #4 – MSD only Visa + Procedure Run a credit sale and follow the instructions on the device to complete the transaction. + Enter transaction amount $155.00 to receive a partial approval. + Transaction is partially approved online with an amount due remaining. + */ + + public function testCase05() + { + $response = $this->device->creditSale(155) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals("10", $response->responseCode); + $this->assertEquals(55, $response->balanceAmountDue); + + print("Response: " . print_r($response, true)); + print("Gateway Txn ID: " . $response->transactionId); + + $this->printReceipt($response); + } + + /* + TEST CASE #6 - Online Void + Objective Process an online void. + Test Card Card #3 – EMV Visa w/ Signature CVM + Procedure Enter the Transaction ID to void. + Pass Criteria Transaction has been voided. + */ + + public function testCase06() + { + $response = $this->device->creditSale(10) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + + $this->device->reset(); + + $voidResponse = $this->device->creditVoid() + ->withTransactionId($response->transactionId) + ->execute(); + + $this->assertNotNull($voidResponse); + $this->assertEquals("00", $voidResponse->responseCode); + + print("Response: " . print_r($voidResponse, true)); + print("Gateway Txn ID: " . $voidResponse->transactionId); + } + + /* + TEST CASE #7 - Debit Sale (with Cash Back) & Debit Void + Objective Confirm support of PIN debit sale, cash back, and debit void. + Test Card Confirm support of PIN debit sale, cash back, and debit void. + Procedure Debit Sale with Cash Back: + Run a debit sale for $10.00 and follow the instructions on the device to complete the transaction. + When prompted for Cash Back, enter $5.00 for the cash back amount. + When prompted for PIN, enter 1234. + Transaction is approved online. + + Void: + Enter the Transaction ID to void. + Transaction has been voided. + + Pass Criteria The transaction is approved online. + The transaction has been voided. + */ + + /** + * @expectedException GlobalPayments\Api\Entities\Exceptions\UnsupportedTransactionException + */ + public function testCase07() + { + $response = $this->device->debitSale(10) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + + print("Response: " . print_r($response, true)); + print("Gateway Txn ID: " . $response->transactionId); + + $voidResponse = $this->device->debitVoid() + ->withTransactionId($response->transactionId) + ->execute(); + } + + /* + TEST CASE #8 – Process Lane Open on SIP + Objective Display line items on the SIP. + Test Card NA + Procedure Start the process to open a lane on the POS. + */ + + public function testCase08() + { + $response = $this->device->openLane(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + } + + /* + TEST CASE #9 – Credit Return + Objective Confirm support of a Return transaction for credit. + Test Card Card #4 – MSD only Visa + Procedure 1. Select return function for the amount of $9.00 + 2. Swipe or Key Test card #4 through the MSR + 3. Select credit on the device + */ + + public function testCase09() + { + $response = $this->device->creditRefund(9) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + + print("Response: " . print_r($response, true)); + print("Gateway Txn ID: " . $response->transactionId); + } + + /* + TEST CASE #10 – HMS Gift + Objective Transactions: Gift Balance Inquiry, Gift Load, Gift Sale/Redeem, Gift Replace + Test Card Gift Card (Card Present/Card Swipe) + Procedure Test System is a Stateless Environment, the responses are Static. + 1. Gift Balance Inquiry (GiftCardBalance): + a. Should respond with a BalanceAmt of $10 + 2. Gift Load (GiftCardAddValue): + a. Initiate a Sale and swipe + b. Enter $8.00 as the amount + 3. Gift Sale/Redeem (GiftCardSale): + a. Initiate a Sale and swipe + b. Enter $1.00 as the amount + 4. Gift Card Replace (GiftCardReplace) + a. Initiate a Gift Card Replace + b. Swipe Card #1 – (Acct #: 5022440000000000098) + c. Manually enter Card #2 – (Acct #: “5022440000000000007”) + */ + public function testCase10a() + { + $response = $this->device->giftBalance() + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + $this->assertEquals('10', $response->availableBalance); + + print("Response: " . print_r($response, true)); + print("Gateway Txn ID: " . $response->transactionId); + } + + public function testCase10b() + { + $response = $this->device->giftAddValue(8) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + + print("Response: " . print_r($response, true)); + print("Gateway Txn ID: " . $response->transactionId); + } + + public function testCase10c() + { + $response = $this->device->giftSale(1) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + + print("Response: " . print_r($response, true)); + print("Gateway Txn ID: " . $response->transactionId); + } + + /* + TEST CASE #11 – EBT Food Stamp + Objective Transactions: Food Stamp Purchase, Food Stamp Return and Food Stamp Balance Inquiry + Test Card Card #4 – MSD only Visa + Procedure Test System is a Stateless Environment, the responses are Static. + 5. Food Stamp Purchase (EBTFSPurchase): + c. Initiate an EBT sale transaction and swipe Test Card #4 + d. Select EBT Food Stamp if prompted. + e. Enter $101.01 as the amount + 6. Food Stamp Return (EBTFSReturn): + b. Intitiate an EBT return and manually enter Test Card #4 + c. Select EBT Food Stamp if prompted + d. Enter $104.01 as the amount + 7. Food Stamp Balance Inquiry (EBTBalanceInquiry): + c. Initiate an EBT blance inquiry transaction and swipe Test Card #4 Settle all transactions. + */ + + public function testCase11a() + { + $response = $this->device->ebtPurchase(101.01) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + + print("Response: " . print_r($response, true)); + print("Gateway Txn ID: " . $response->transactionId); + } + + public function testCase11b() + { + $response = $this->device->ebtRefund(104.01) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + + print("Response: " . print_r($response, true)); + print("Gateway Txn ID: " . $response->transactionId); + } + + public function testCase11c() + { + $response = $this->device->ebtBalance() + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + + print("Response: " . print_r($response, true)); + print("Gateway Txn ID: " . $response->transactionId); + } + + /* + TEST CASE #12 – EBT Cash Benefits + Objective Transactions: EBT Cash Benefits with Cash Back, EBT Cash Benefits Balance Inquiry +and EBT Cash Benefits Withdraw + Test Card Card #4 – MSD only Visa + Procedure + 1. EBT Cash Benefits w Cash Back (EBTCashBackPurchase): + a. Initiate an EBT sale transaction and swipe Test Card #4 + b. Select EBT Cash Benefits if prompted + c. Enter $101.01 as the amount + d. Enter $5.00 as the cash back amount + e. The settlement amount is $106.01 + 2. EBT Cash Benefits Balance Inquiry (EBTBalanceInquiry): + a. Initiate an EBT cash benefit balance inquiry transaction and swipe Test Card #4 + 3. EBT Cash Benefits Withdraw (EBTCashBenefitWithdrawal): + a. Initiate an EBT cash benefits withdraw transaction and manually +enter Test Card #4. + b. Select EBT Cash Benefits Withdraw if prompted + c. Enter $111.01 as the amount + d. The settlement amount is $111.01 + e. Settle all transactions + */ + + public function testCase12a() + { + $response = $this->device->ebtPurchase(101.01) + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + + print("Response: " . print_r($response, true)); + print("Gateway Txn ID: " . $response->transactionId); + } + + public function testCase12b() + { + $response = $this->device->ebtBalance() + ->execute(); + + $this->assertNotNull($response); + $this->assertEquals('0', $response->resultCode); + + print("Response: " . print_r($response, true)); + print("Gateway Txn ID: " . $response->transactionId); + } + + /* + TEST CASE #13 – Batch Close + (Mandatory if Conditional Test Cases are ran) + Objective Close the batch, ensuring all approved transactions (offline or online) are settled. + Integrators are automatically provided accounts with auto-close enabled, so if manual batch transmission + will not be performed in the production environment then it does not need to be tested. + Test Card N/A + Procedure Initiate a Batch Close command + Pass Criteria Batch submission must be successful. + Batch Sequence #: + References  HPA Specifications. + */ + public function testCase13() + { + $this->device->closeLane(); + $this->device->reset(); + + $response = $this->device->batchClose(); + $this->assertNotNull($response); + + $this->assertEquals('0', $response->resultCode); + + print("Response: " . print_r($response, true)); + print("Gateway Txn ID: " . $response->transactionId); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/RequestIdProvider.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/RequestIdProvider.php new file mode 100644 index 0000000..552b8ed --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/RequestIdProvider.php @@ -0,0 +1,14 @@ +number = '4111111111111111'; + $card->expMonth = 12; + $card->expYear = 2025; + $card->cvn = '123'; + $card->cardHolderName = 'Joe Smith'; + $this->card = $card; + + ServicesContainer::configure($this->getConfig()); + } + + /** + * @expectedException \GlobalPayments\Api\Entities\Exceptions\BuilderException + * @expectedExceptionMessage amount cannot be null for this transaction type. + */ + public function testCreditAuthNoAmount() + { + $this->card->authorize() + ->execute(); + } + + /** + * @expectedException \GlobalPayments\Api\Entities\Exceptions\BuilderException + * @expectedExceptionMessage currency cannot be null + */ + public function testCreditAuthNoCurrency() + { + $this->card->authorize(14) + ->execute(); + } + + /** + * @expectedException \GlobalPayments\Api\Entities\Exceptions\BuilderException + * @expectedExceptionMessage paymentMethod cannot be null + */ + public function testCreditAuthNoPaymentMethod() + { + $this->card->authorize(14) + ->withCurrency('USD') + ->withPaymentMethod(null) + ->execute(); + } + + /** + * @expectedException \GlobalPayments\Api\Entities\Exceptions\BuilderException + * @expectedExceptionMessage amount cannot be null + */ + public function testCreditSaleNoAmount() + { + $this->card->charge() + ->execute(); + } + + /** + * @expectedException \GlobalPayments\Api\Entities\Exceptions\BuilderException + * @expectedExceptionMessage currency cannot be null + */ + public function testCreditSaleNoCurrency() + { + $this->card->charge(14) + ->execute(); + } + + /** + * @expectedException \GlobalPayments\Api\Entities\Exceptions\BuilderException + * @expectedExceptionMessage paymentMethod cannot be null + */ + public function testCreditSaleNoPaymentMethod() + { + $this->card->charge(14) + ->withCurrency('USD') + ->withPaymentMethod(null) + ->execute(); + } + + protected function getConfig() + { + $config = new ServicesConfig(); + $config->secretApiKey = 'skapi_cert_MTeSAQAfG1UA9qQDrzl-kz4toXvARyieptFwSKP24w'; + $config->serviceUrl = ($this->enableCryptoUrl) ? + 'https://cert.api2-c.heartlandportico.com/': + 'https://cert.api2.heartlandportico.com'; + return $config; + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Unit/Gateways/RealexConnector/CreditTest.php b/classes/includes/vendor/globalpayments/php-sdk/test/Unit/Gateways/RealexConnector/CreditTest.php new file mode 100644 index 0000000..3530166 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/test/Unit/Gateways/RealexConnector/CreditTest.php @@ -0,0 +1,47 @@ +number = '4111111111111111'; + $card->expMonth = 12; + $card->expYear = 2025; + $card->cvn = '123'; + $card->cardHolderName = 'Joe Smith'; + $this->card = $card; + + ServicesContainer::configure($this->getConfig()); + } + + /** + * @expectedException \GlobalPayments\Api\Entities\Exceptions\UnsupportedTransactionException + * @expectedExceptionMessage selected gateway does not support this transaction type + */ + public function testCreditReverse() + { + $this->card->reverse(15) + ->withAllowDuplicates(true) + ->execute(); + } + + protected function getConfig() + { + $config = new ServicesConfig(); + $config->merchantId = 'realexsandbox'; + $config->accountId = 'internet'; + $config->sharedSecret = 'Po8lRRT67a'; + $config->serviceUrl = 'https://test.realexpayments.com/epage-remote.cgi'; + return $config; + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/setup.php b/classes/includes/vendor/globalpayments/php-sdk/test/setup.php new file mode 100644 index 0000000..fd349ea --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/test/setup.php @@ -0,0 +1,3 @@ + Date: Thu, 31 Oct 2019 06:25:27 -0500 Subject: [PATCH 2/8] Updated the code for check payments --- classes/class-gf-securesubmit.php | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/classes/class-gf-securesubmit.php b/classes/class-gf-securesubmit.php index 708cf5b..3102095 100755 --- a/classes/class-gf-securesubmit.php +++ b/classes/class-gf-securesubmit.php @@ -12,10 +12,13 @@ use GlobalPayments\Api\Entities\TransactionSummary; use GlobalPayments\Api\Entities\Enums\AccountType; use GlobalPayments\Api\Entities\Enums\CheckType; +use GlobalPayments\Api\Entities\Enums\EntryMethod; use GlobalPayments\Api\Entities\Enums\SecCode; +use GlobalPayments\Api\PaymentMethods\ECheck; use GlobalPayments\Api\Entities\EcommerceInfo; + if (!class_exists('GF_Field_HPSach')) { include_once 'class-gf-field-hpsach.php'; } @@ -1159,20 +1162,18 @@ private function authorizeACH($feed, $submission_data, $form, $entry) /** @var HpsCheck $check */ /** @var string $note displayed message for consumer */ - $check = new HpsCheck(); + $check = new ECheck(); $check->accountNumber = $submission_data['ach_number']; // from form $account_number_field_input $check->routingNumber = $submission_data['ach_route']; // from form $routing_number_field_input - - $check->checkHolder = $this->buildCheckHolder($feed, $submission_data, $entry);//$account_name_field_input - $check->secCode = HpsSECCode::WEB; - $check->dataEntryMode = HpsDataEntryMode::MANUAL; + $check->checkHolderName = htmlspecialchars(rgar($submission_data, 'ach_check_holder')); //$account_name_field_input + $check->secCode = SecCode::WEB; + $check->entryMode = EntryMethod::MANUAL; //HpsCheckType::BUSINESS; // drop down choice PERSONAL or BUSINESS $check_type_input $check->checkType = $submission_data['ach_check_type']; //HpsAccountType::CHECKING; // drop down choice CHECKING or SAVINGS $account_type_input $check->accountType = $submission_data['ach_account_type']; $config = $this->getHpsServicesConfig($this->getSecretApiKey($feed)); - - $service = new HpsFluentCheckService($config); + $address = $this->buildAddress($feed, $submission_data, $entry); /** * if fraud_velocity_attempts is less than the $HeartlandHPS_FailCount then we know @@ -1185,9 +1186,10 @@ private function authorizeACH($feed, $submission_data, $form, $entry) //throw new HpsException(wp_sprintf('%s %s', $fraud_message, $issuerResponse)); } - $response = $service->sale($submission_data['payment_amount']) - ->withCheck($check)/**@throws HpsCheckException on error */ - ->execute(); + $response = $check->charge($submission_data['payment_amount']) + ->withCurrency('USD') + ->withAddress($address) + ->execute(); do_action('heartland_gravityforms_transaction_success', $form, $entry, $response, null); $type = 'Payment'; @@ -1684,9 +1686,9 @@ private function buildCardHolder($feed, $submission_data, $entry) */ private function buildCheckHolder($feed, $submission_data, $entry) { - $checkHolder = new HpsCheckHolder(); + $checkHolder = new ECheck(); $checkHolder->address = $this->buildAddress($feed, $submission_data, $entry); - $checkHolder->checkName = htmlspecialchars(rgar($submission_data, 'ach_check_holder')); //'check holder'; + $checkHolder->checkHolderName = htmlspecialchars(rgar($submission_data, 'ach_check_holder')); //'check holder'; $firstName = ''; $lastName = ''; From 73edbc6218b48b762a428d9930b978a0fdd7ffd6 Mon Sep 17 00:00:00 2001 From: Kumar Date: Thu, 14 Nov 2019 21:57:24 -0600 Subject: [PATCH 3/8] Updated code as per review --- classes/class-gf-securesubmit.php | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/classes/class-gf-securesubmit.php b/classes/class-gf-securesubmit.php index 3102095..27a4990 100755 --- a/classes/class-gf-securesubmit.php +++ b/classes/class-gf-securesubmit.php @@ -1426,7 +1426,6 @@ private function authorizeCC($feed, $submission_data, $form, $entry) try { $config = $this->getHpsServicesConfig($this->getSecretApiKey($feed)); - $cardHolder = $this->buildCardHolder($feed, $submission_data, $entry); $address = $this->buildAddress($feed, $submission_data, $entry); @@ -1440,7 +1439,10 @@ private function authorizeCC($feed, $submission_data, $form, $entry) return $this->authorization_error(wp_sprintf('%s %s', $fraud_message, $issuerResponse)); //throw new HpsException(wp_sprintf('%s %s', $fraud_message, $issuerResponse)); } - + $tokenValue = $this->getSecureSubmitJsResponse(); + $cardHolder->token = ($tokenValue != null + ? $tokenValue->token_value + : ''); /** * CardHolder Authentication (3D Secure) * @@ -1485,11 +1487,6 @@ private function authorizeCC($feed, $submission_data, $form, $entry) $secureEcommerce->xid = $xid; } - $cpcReq = false; - if ($this->getAllowLevelII()) { - $cpcReq = true; - } - $currency = GFCommon::get_currency(); $transaction = null; if ($isAuth) { @@ -1522,10 +1519,9 @@ private function authorizeCC($feed, $submission_data, $form, $entry) $amount_formatted, $transaction->transactionId ); - if ($cpcReq - && ($transaction->commercialIndicator == 'B' + if ($transaction->commercialIndicator == 'B' || $transaction->commercialIndicator == 'R' - || $transaction->commercialIndicator == 'S') + || $transaction->commercialIndicator == 'S' ) { $CardHolderPONbr = $this->getLevelIICustomerPO($feed); @@ -1670,10 +1666,6 @@ private function buildCardHolder($feed, $submission_data, $entry) $cardHolder = new CreditCardData(); $cardHolder->firstName = $firstName; $cardHolder->lastName = $lastName; - $response = $this->getSecureSubmitJsResponse(); - $cardHolder->token = ($response != null - ? $response->token_value - : ''); return $cardHolder; } From 9c6727fb2b2280137834bb78fe7e86660c86d456 Mon Sep 17 00:00:00 2001 From: Kumar Date: Thu, 9 Apr 2020 19:50:45 -0400 Subject: [PATCH 4/8] updated changes as per review comments --- classes/class-gf-securesubmit.php | 55 ++++++++++++++++++------------- 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/classes/class-gf-securesubmit.php b/classes/class-gf-securesubmit.php index 27a4990..1cbc7ec 100755 --- a/classes/class-gf-securesubmit.php +++ b/classes/class-gf-securesubmit.php @@ -666,7 +666,6 @@ public function feed_settings_fields() $default_settings = $this->add_field_after('recurringAmount', $public_api_key_field, $default_settings); $default_settings = $this->add_field_after('recurringAmount', $secret_api_key_field, $default_settings); } - if ($this->getAllowLevelII() == 'yes') { $tax_type_field = array( 'name' => 'mappedFields', @@ -1165,7 +1164,8 @@ private function authorizeACH($feed, $submission_data, $form, $entry) $check = new ECheck(); $check->accountNumber = $submission_data['ach_number']; // from form $account_number_field_input $check->routingNumber = $submission_data['ach_route']; // from form $routing_number_field_input - $check->checkHolderName = htmlspecialchars(rgar($submission_data, 'ach_check_holder')); //$account_name_field_input + + $check->checkHolder = $this->checkHolderData($feed, $submission_data, $entry); $check->secCode = SecCode::WEB; $check->entryMode = EntryMethod::MANUAL; //HpsCheckType::BUSINESS; // drop down choice PERSONAL or BUSINESS $check_type_input @@ -1426,7 +1426,7 @@ private function authorizeCC($feed, $submission_data, $form, $entry) try { $config = $this->getHpsServicesConfig($this->getSecretApiKey($feed)); - $cardHolder = $this->buildCardHolder($feed, $submission_data, $entry); + $cardHolder = $this->cardHolderData($feed, $submission_data, $entry); $address = $this->buildAddress($feed, $submission_data, $entry); /** @@ -1447,7 +1447,7 @@ private function authorizeCC($feed, $submission_data, $form, $entry) * CardHolder Authentication (3D Secure) * */ - $secureEcommerce = null; + $secureEcommerce = ''; if ($this->getEnable3DSecure() === 'yes' && false !== ($data = json_decode(stripslashes($submission_data['securesubmit_cca_data']))) && isset($data) && isset($data->ActionCode) @@ -1486,21 +1486,35 @@ private function authorizeCC($feed, $submission_data, $form, $entry) $secureEcommerce->eci = $eciFlag; $secureEcommerce->xid = $xid; } + + + $cpcReq = false; + if ($this->getAllowLevelII() === 'yes') { + $cpcReq = true; + } $currency = GFCommon::get_currency(); $transaction = null; if ($isAuth) { - $transaction = $cardHolder->authorize($submission_data['payment_amount']) + $auth_transaction = $cardHolder->authorize($submission_data['payment_amount']) ->withCurrency($currency) ->withAddress($address) ->withAllowDuplicates(true) - ->execute(); + ->withCommercialRequest($cpcReq); + if($secureEcommerce){ + $transaction = $auth_transaction->withEcommerceInfo($secureEcommerce); + } + $transaction = $auth_transaction->execute(); } else { - $transaction = $cardHolder->charge($submission_data['payment_amount']) + $capt_transaction = $cardHolder->charge($submission_data['payment_amount']) ->withCurrency($currency) ->withAddress($address) ->withAllowDuplicates(true) - ->execute(); + ->withCommercialRequest($cpcReq); + if($secureEcommerce){ + $transaction = $capt_transaction->withEcommerceInfo($secureEcommerce); + } + $transaction = $capt_transaction->execute(); } do_action('heartland_gravityforms_transaction_success', $form, $entry, $transaction, $response); self::get_instance()->transaction_response = $transaction; @@ -1519,7 +1533,7 @@ private function authorizeCC($feed, $submission_data, $form, $entry) $amount_formatted, $transaction->transactionId ); - if ($transaction->commercialIndicator == 'B' + if ($cpcReq && $transaction->commercialIndicator == 'B' || $transaction->commercialIndicator == 'R' || $transaction->commercialIndicator == 'S' ) { @@ -1646,8 +1660,9 @@ protected function sendEmail($form, $entry, $transaction, $cardHolder = null) * * @return HpsCardHolder|HpsAddress */ - private function buildCardHolder($feed, $submission_data, $entry) + private function cardHolderData($feed, $submission_data, $entry) { + $cardHolder = new CreditCardData(); $firstName = ''; $lastName = ''; if ('' === rgar($submission_data, 'card_name')) { @@ -1662,8 +1677,6 @@ private function buildCardHolder($feed, $submission_data, $entry) } catch (Exception $ex) { $firstName = rgar($submission_data, 'card_name'); } - - $cardHolder = new CreditCardData(); $cardHolder->firstName = $firstName; $cardHolder->lastName = $lastName; return $cardHolder; @@ -1676,11 +1689,10 @@ private function buildCardHolder($feed, $submission_data, $entry) * * @return HpsCheckHolder|HpsAddress */ - private function buildCheckHolder($feed, $submission_data, $entry) + private function checkHolderData($feed, $submission_data, $entry) { $checkHolder = new ECheck(); - $checkHolder->address = $this->buildAddress($feed, $submission_data, $entry); - $checkHolder->checkHolderName = htmlspecialchars(rgar($submission_data, 'ach_check_holder')); //'check holder'; + $checkHolder->checkName = htmlspecialchars(rgar($submission_data, 'ach_check_holder')); //'check holder'; $firstName = ''; $lastName = ''; @@ -2405,7 +2417,7 @@ private function processRecurring($payment_amount, $feed, $payPlanPaymentMethod, * * @used-by GFSecureSubmit::subscribe() * @uses GFAddOn::log_debug() - * @uses \GFSecureSubmit::buildCardHolder + * @uses \GFSecureSubmit::CardHolderData * @uses \GFSecureSubmit::getIdentifier * * @param array $feed The feed currently being processed. @@ -2419,7 +2431,7 @@ private function processRecurring($payment_amount, $feed, $payPlanPaymentMethod, */ private function create_customer($feed, $submission_data, $entry) { - $acctHolder = $this->buildCardHolder($feed, $submission_data, $entry); + $acctHolder = $this->cardHolderData($feed, $submission_data, $entry); $meta = $this->get_address_card_field($feed); //'United States' 'Canada' @@ -2656,13 +2668,12 @@ private function getHpsServicesConfig($key) { static $config = null; if (empty($config)) { - /*$config = new HpsServicesConfig(); - $config->secretApiKey = $key; - $config->developerId = '002914'; - $config->versionNumber = '1916';*/ $config = new ServicesConfig(); $config->secretApiKey = $key; - $config->serviceUrl = "https://cert.api2.heartlandportico.com"; + $env = $config->environment; + $config->serviceUrl = ($env != "TEST")? + 'https://api2.heartlandportico.com': + 'https://cert.api2.heartlandportico.com'; $service = ServicesContainer::configure($config); } From 75ffcf860d9e60ff1cc610537ec06cb42d910069 Mon Sep 17 00:00:00 2001 From: SenthilKumar Date: Mon, 5 Jul 2021 15:20:31 +0530 Subject: [PATCH 5/8] vendor folder deleted --- classes/includes/vendor/autoload.php | 7 - .../includes/vendor/composer/ClassLoader.php | 445 - classes/includes/vendor/composer/LICENSE | 21 - .../vendor/composer/autoload_classmap.php | 9 - .../vendor/composer/autoload_namespaces.php | 9 - .../vendor/composer/autoload_psr4.php | 10 - .../vendor/composer/autoload_real.php | 52 - .../vendor/composer/autoload_static.php | 31 - .../includes/vendor/composer/installed.json | 49 - .../vendor/globalpayments/php-sdk/.gitignore | 9 - .../vendor/globalpayments/php-sdk/.travis.yml | 25 - .../vendor/globalpayments/php-sdk/LICENSE.md | 264 - .../vendor/globalpayments/php-sdk/README.md | 136 - .../globalpayments/php-sdk/composer.json | 44 - .../globalpayments/php-sdk/composer.lock | 4199 ---- .../globalpayments/php-sdk/docker-compose.yml | 27 - .../globalpayments/php-sdk/docs-config.php | 17 - .../examples/consumer-authentication/JWT.php | 64 - .../consumer-authentication/cruise.php | 341 - .../php-sdk/examples/echeck/index.html | 144 - .../php-sdk/examples/echeck/process.php | 50 - .../end-to-end/assets/heartland-styles.css | 167 - .../examples/end-to-end/assets/images/cvv.png | Bin 17130 -> 0 bytes .../end-to-end/assets/images/cvv1.png | Bin 21113 -> 0 bytes .../end-to-end/assets/images/cvv2.png | Bin 26322 -> 0 bytes .../end-to-end/assets/images/ss-cvv@2x.png | Bin 23730 -> 0 bytes .../assets/images/ss-inputcard-blank@2x.png | Bin 2166 -> 0 bytes .../assets/images/ss-saved-amex@2x.png | Bin 17012 -> 0 bytes .../assets/images/ss-saved-discover@2x.png | Bin 23467 -> 0 bytes .../assets/images/ss-saved-jcb@2x.png | Bin 33220 -> 0 bytes .../assets/images/ss-saved-mastercard.png | Bin 45026 -> 0 bytes .../assets/images/ss-saved-mastercard@2x.png | Bin 30646 -> 0 bytes .../assets/images/ss-saved-visa@2x.png | Bin 10480 -> 0 bytes .../assets/images/ss-savedcards-amex@2x.png | Bin 47321 -> 0 bytes .../end-to-end/assets/images/ss-shield-ie.png | Bin 31456 -> 0 bytes .../end-to-end/assets/images/ss-shield@1x.png | Bin 36611 -> 0 bytes .../end-to-end/assets/images/ss-shield@2x.png | Bin 59755 -> 0 bytes .../php-sdk/examples/end-to-end/charge.php | 64 - .../php-sdk/examples/end-to-end/index.html | 373 - .../php-sdk/examples/gift/charge.php | 33 - .../php-sdk/examples/gift/index.php | 18 - .../iframe-pay-invoice/assets/main.js | 206 - .../examples/iframe-pay-invoice/charge.php | 66 - .../examples/iframe-pay-invoice/index.html | 168 - .../iframe-recurring-signup/assets/main.js | 207 - .../iframe-recurring-signup/charge.php | 119 - .../iframe-recurring-signup/index.html | 165 - .../examples/manual-tokenize/assets/main.js | 206 - .../examples/manual-tokenize/charge.php | 66 - .../examples/manual-tokenize/index.html | 166 - .../examples/pay-invoice/assets/main.js | 206 - .../php-sdk/examples/pay-invoice/charge.php | 74 - .../php-sdk/examples/pay-invoice/index.html | 169 - .../point-of-sale/e3-swipe/assets/apples.png | Bin 56960 -> 0 bytes .../point-of-sale/e3-swipe/assets/bananas.png | Bin 38289 -> 0 bytes .../point-of-sale/e3-swipe/assets/oranges.png | Bin 82861 -> 0 bytes .../e3-swipe/assets/secure.submit-1.1.0.js | 266 - .../point-of-sale/e3-swipe/charge.php | 75 - .../point-of-sale/e3-swipe/index.html | 130 - .../examples/recurring-signup-ach/charge.php | 125 - .../examples/recurring-signup-ach/index.html | 168 - .../vendor/globalpayments/php-sdk/phpcs.xml | 5 - .../globalpayments/php-sdk/phpunit.xml.dist | 48 - .../vendor/globalpayments/php-sdk/sami.phar | Bin 2461851 -> 0 bytes .../src/Builders/AuthorizationBuilder.php | 1117 - .../php-sdk/src/Builders/BaseBuilder.php | 94 - .../Builders/BaseBuilder/ValidationClause.php | 277 - .../Builders/BaseBuilder/ValidationTarget.php | 103 - .../src/Builders/BaseBuilder/Validations.php | 46 - .../src/Builders/ManagementBuilder.php | 383 - .../php-sdk/src/Builders/RecurringBuilder.php | 92 - .../php-sdk/src/Builders/ReportBuilder.php | 44 - .../php-sdk/src/Builders/Secure3dBuilder.php | 1228 - .../src/Builders/TransactionBuilder.php | 99 - .../src/Builders/TransactionReportBuilder.php | 148 - .../php-sdk/src/Entities/Address.php | 96 - .../Entities/AlternativePaymentResponse.php | 53 - .../php-sdk/src/Entities/BatchSummary.php | 37 - .../php-sdk/src/Entities/BrowserData.php | 32 - .../php-sdk/src/Entities/Customer.php | 156 - .../php-sdk/src/Entities/DccRateData.php | 59 - .../src/Entities/DccResponseResult.php | 72 - .../php-sdk/src/Entities/DecisionManager.php | 96 - .../php-sdk/src/Entities/EcommerceInfo.php | 55 - .../php-sdk/src/Entities/EncryptionData.php | 70 - .../php-sdk/src/Entities/Enum.php | 36 - .../src/Entities/Enums/AccountType.php | 11 - .../src/Entities/Enums/AddressType.php | 11 - .../src/Entities/Enums/AgeIndicator.php | 15 - .../src/Entities/Enums/AliasAction.php | 12 - .../Entities/Enums/AlternativePaymentType.php | 144 - .../Enums/AuthenticationRequestType.php | 15 - .../Entities/Enums/AuthenticationSource.php | 12 - .../Enums/ChallengeRequestIndicator.php | 13 - .../Entities/Enums/ChallengeWindowSize.php | 14 - .../php-sdk/src/Entities/Enums/CheckType.php | 12 - .../php-sdk/src/Entities/Enums/ColorDepth.php | 18 - .../Enums/CustomerAuthenticationMethod.php | 15 - .../Entities/Enums/CvnPresenceIndicator.php | 13 - .../src/Entities/Enums/DccProcessor.php | 11 - .../src/Entities/Enums/DccRateType.php | 11 - .../src/Entities/Enums/DeliveryTimeFrame.php | 13 - .../src/Entities/Enums/EcommerceChannel.php | 21 - .../src/Entities/Enums/EncyptedMobileType.php | 11 - .../src/Entities/Enums/EntryMethod.php | 12 - .../src/Entities/Enums/Environment.php | 11 - .../src/Entities/Enums/ExceptionCodes.php | 55 - .../src/Entities/Enums/FraudFilterMode.php | 12 - .../src/Entities/Enums/GiftEntryMethod.php | 12 - .../php-sdk/src/Entities/Enums/HppVersion.php | 11 - .../src/Entities/Enums/InquiryType.php | 13 - .../src/Entities/Enums/MessageCategory.php | 11 - .../src/Entities/Enums/MessageVersion.php | 10 - .../Entities/Enums/MethodUrlCompletion.php | 12 - .../Entities/Enums/OrderTransactionType.php | 14 - .../src/Entities/Enums/PaymentMethodType.php | 18 - .../src/Entities/Enums/PaymentSchedule.php | 12 - .../src/Entities/Enums/PreOrderIndicator.php | 11 - .../Enums/PriorAuthenticationMethod.php | 13 - .../php-sdk/src/Entities/Enums/ReasonCode.php | 44 - .../src/Entities/Enums/RecurringSequence.php | 12 - .../src/Entities/Enums/RecurringType.php | 11 - .../src/Entities/Enums/ReorderIndicator.php | 11 - .../php-sdk/src/Entities/Enums/ReportType.php | 12 - .../php-sdk/src/Entities/Enums/Risk.php | 11 - .../src/Entities/Enums/ScheduleFrequency.php | 17 - .../src/Entities/Enums/SdkInterface.php | 12 - .../php-sdk/src/Entities/Enums/SdkUiType.php | 14 - .../php-sdk/src/Entities/Enums/SecCode.php | 15 - .../src/Entities/Enums/Secure3dVersion.php | 13 - .../src/Entities/Enums/ServiceEndpoints.php | 19 - .../src/Entities/Enums/ShippingMethod.php | 16 - .../Enums/StoredCredentialInitiator.php | 12 - .../Enums/StoredCredentialSequence.php | 11 - .../Entities/Enums/StoredCredentialType.php | 12 - .../php-sdk/src/Entities/Enums/TaxType.php | 12 - .../src/Entities/Enums/TimeZoneConversion.php | 12 - .../Entities/Enums/TransactionModifier.php | 23 - .../src/Entities/Enums/TransactionType.php | 41 - .../src/Entities/Exceptions/ApiException.php | 20 - .../Entities/Exceptions/ArgumentException.php | 18 - .../Entities/Exceptions/BuilderException.php | 18 - .../Exceptions/ConfigurationException.php | 18 - .../Entities/Exceptions/GatewayException.php | 39 - .../Exceptions/NotImplementedException.php | 16 - .../UnsupportedTransactionException.php | 16 - .../src/Entities/FraudManagementResponse.php | 30 - .../src/Entities/HostedPaymentData.php | 99 - .../php-sdk/src/Entities/IRecurringEntity.php | 54 - .../src/Entities/MerchantDataCollection.php | 190 - .../php-sdk/src/Entities/MerchantKVP.php | 69 - .../php-sdk/src/Entities/RecurringEntity.php | 110 - .../src/Entities/Reporting/AltPaymentData.php | 38 - .../Reporting/AltPaymentProcessorInfo.php | 20 - .../src/Entities/Reporting/CheckData.php | 35 - .../src/Entities/Reporting/LodgingData.php | 30 - .../src/Entities/Reporting/SearchCriteria.php | 44 - .../Reporting/SearchCriteriaBuilder.php | 236 - .../Entities/Reporting/TransactionSummary.php | 386 - .../php-sdk/src/Entities/Schedule.php | 436 - .../php-sdk/src/Entities/StoredCredential.php | 19 - .../php-sdk/src/Entities/ThreeDSecure.php | 364 - .../php-sdk/src/Entities/Transaction.php | 461 - .../src/Entities/TransactionSummary.php | 142 - .../php-sdk/src/Gateways/Gateway.php | 135 - .../php-sdk/src/Gateways/GatewayResponse.php | 16 - .../php-sdk/src/Gateways/Gp3DSProvider.php | 427 - .../php-sdk/src/Gateways/IPaymentGateway.php | 32 - .../src/Gateways/IRecurringService.php | 10 - .../src/Gateways/ISecure3dProvider.php | 20 - .../php-sdk/src/Gateways/PayPlanConnector.php | 670 - .../php-sdk/src/Gateways/PorticoConnector.php | 1878 -- .../php-sdk/src/Gateways/RealexConnector.php | 1413 -- .../php-sdk/src/Gateways/RestGateway.php | 46 - .../php-sdk/src/Gateways/XmlGateway.php | 35 - .../php-sdk/src/HostedPaymentConfig.php | 149 - .../AlternativePaymentMethod.php | 109 - .../php-sdk/src/PaymentMethods/Cash.php | 25 - .../php-sdk/src/PaymentMethods/Credit.php | 224 - .../src/PaymentMethods/CreditCardData.php | 219 - .../src/PaymentMethods/CreditTrackData.php | 11 - .../php-sdk/src/PaymentMethods/Debit.php | 80 - .../src/PaymentMethods/DebitTrackData.php | 11 - .../php-sdk/src/PaymentMethods/EBT.php | 95 - .../src/PaymentMethods/EBTCardData.php | 91 - .../src/PaymentMethods/EBTTrackData.php | 13 - .../php-sdk/src/PaymentMethods/ECheck.php | 46 - .../php-sdk/src/PaymentMethods/GiftCard.php | 256 - .../PaymentMethods/Interfaces/IAuthable.php | 8 - .../Interfaces/IBalanceable.php | 8 - .../PaymentMethods/Interfaces/ICardData.php | 7 - .../PaymentMethods/Interfaces/IChargable.php | 8 - .../PaymentMethods/Interfaces/IEditable.php | 8 - .../Interfaces/IEncryptable.php | 7 - .../Interfaces/IPaymentMethod.php | 7 - .../Interfaces/IPinProtected.php | 7 - .../PaymentMethods/Interfaces/IPrePayable.php | 8 - .../PaymentMethods/Interfaces/IRefundable.php | 8 - .../PaymentMethods/Interfaces/IReversable.php | 8 - .../PaymentMethods/Interfaces/ISecure3d.php | 10 - .../Interfaces/ITokenizable.php | 10 - .../PaymentMethods/Interfaces/ITrackData.php | 7 - .../PaymentMethods/Interfaces/IVerifyable.php | 8 - .../PaymentMethods/Interfaces/IVoidable.php | 7 - .../PaymentMethods/RecurringPaymentMethod.php | 268 - .../PaymentMethods/TransactionReference.php | 33 - .../php-sdk/src/Services/BatchService.php | 16 - .../php-sdk/src/Services/CreditService.php | 149 - .../php-sdk/src/Services/DeviceService.php | 23 - .../php-sdk/src/Services/HostedService.php | 143 - .../php-sdk/src/Services/RecurringService.php | 43 - .../php-sdk/src/Services/ReportingService.php | 31 - .../php-sdk/src/Services/Secure3dService.php | 35 - .../php-sdk/src/ServicesConfig.php | 141 - .../php-sdk/src/ServicesContainer.php | 207 - .../Builders/TerminalAuthBuilder.php | 184 - .../Terminals/Builders/TerminalBuilder.php | 38 - .../Builders/TerminalManageBuilder.php | 96 - .../src/Terminals/ConnectionConfig.php | 52 - .../src/Terminals/ConnectionContainer.php | 62 - .../src/Terminals/DeviceController.php | 17 - .../Enums/ApplicationCryptogramType.php | 11 - .../php-sdk/src/Terminals/Enums/BaudRate.php | 13 - .../src/Terminals/Enums/ConnectionModes.php | 13 - .../src/Terminals/Enums/ControlCodes.php | 24 - .../src/Terminals/Enums/CurrencyType.php | 14 - .../php-sdk/src/Terminals/Enums/DataBits.php | 11 - .../src/Terminals/Enums/DeviceSettings.php | 15 - .../src/Terminals/Enums/DeviceType.php | 12 - .../Terminals/Enums/DownloadEnvironment.php | 11 - .../src/Terminals/Enums/DownloadTime.php | 21 - .../src/Terminals/Enums/DownloadType.php | 11 - .../php-sdk/src/Terminals/Enums/StopBits.php | 11 - .../HPA/Entities/Enums/HpaMessageFormat.php | 11 - .../HPA/Entities/Enums/HpaMessageId.php | 34 - .../HPA/Entities/Enums/HpaSendFileType.php | 29 - .../Terminals/HPA/Entities/HpaResponse.php | 152 - .../src/Terminals/HPA/Entities/LineItem.php | 29 - .../Terminals/HPA/Entities/SendFileData.php | 17 - .../src/Terminals/HPA/HpaController.php | 274 - .../src/Terminals/HPA/HpaInterface.php | 428 - .../src/Terminals/HPA/HpaTcpInterface.php | 367 - .../HPA/Requests/HpaSendFileRequest.php | 65 - .../Responses/HpaDiagnosticReportResponse.php | 135 - .../HPA/Responses/HpaEodResponse.php | 174 - .../HPA/Responses/HpaSendSafResponse.php | 160 - .../Interfaces/IDeviceCommInterface.php | 14 - .../Terminals/Interfaces/IDeviceInterface.php | 85 - .../Interfaces/IDeviceResponseHandler.php | 8 - .../Interfaces/IRequestIdProvider.php | 15 - .../php-sdk/src/Terminals/TerminalUtils.php | 52 - .../php-sdk/src/Utils/GenerationUtils.php | 159 - .../php-sdk/test/Data/TestCards.php | 271 - .../php-sdk/test/Data/TestChecks.php | 37 - .../Gateways/PorticoConnector/AchTest.php | 65 - .../Certifications/CheckTest.php | 481 - .../Certifications/EcommerceCheckTest.php | 108 - .../Certifications/EcommerceTest.php | 1668 -- .../Certifications/MotoCheckTest.php | 108 - .../Certifications/MotoTest.php | 1697 -- .../Certifications/RecurringTest.php | 560 - .../Certifications/RetailTest.php | 1982 -- .../Gateways/PorticoConnector/CreditTest.php | 270 - .../Gateways/PorticoConnector/DebitTest.php | 73 - .../Gateways/PorticoConnector/EbtTest.php | 90 - .../Gateways/PorticoConnector/GiftTest.php | 119 - .../PorticoReportingTests.php | 296 - .../PorticoTokenManagementTest.php | 72 - .../Gateways/RealexConnector/AcsResponse.php | 44 - .../Gateways/RealexConnector/ApiTestCase.php | 999 - .../Certifications/SdkTest.php | 18930 ---------------- .../Gateways/RealexConnector/CreditTest.php | 285 - .../RealexConnector/Hpp/RealexHppClient.php | 249 - .../Gateways/RealexConnector/HppTest.php | 654 - .../Gateways/RealexConnector/HppTestCase.php | 247 - .../RealexConnector/Realex3dSecureTests.php | 500 - .../RealexConnector/RealexApmTest.php | 185 - .../RealexConnector/RecurringTest.php | 390 - .../RealexConnector/Secure3dServiceTests.php | 772 - .../RealexConnector/ThreeDSecureAcsClient.php | 116 - .../Gateways/Terminals/HPA/HpaAdminTests.php | 361 - .../Gateways/Terminals/HPA/HpaCreditTests.php | 225 - .../Gateways/Terminals/HPA/HpaDebitTests.php | 119 - .../Gateways/Terminals/HPA/HpaEbtTests.php | 102 - .../Gateways/Terminals/HPA/HpaGiftTests.php | 150 - .../sampleimages/hpa_banner_iSC250_60_480.jpg | Bin 13453 -> 0 bytes .../sampleimages/hpa_logo_iSC250_272_480.jpg | Bin 10913 -> 0 bytes .../HPA/sampleimages/image_500_500.jpg | Bin 15070 -> 0 bytes .../HPA/vrf/HpaVerificationTests.php | 456 - .../Gateways/Terminals/RequestIdProvider.php | 14 - .../AuthorizationBuilder/ValidationTest.php | 101 - .../Gateways/RealexConnector/CreditTest.php | 47 - .../globalpayments/php-sdk/test/setup.php | 3 - 293 files changed, 60369 deletions(-) delete mode 100644 classes/includes/vendor/autoload.php delete mode 100644 classes/includes/vendor/composer/ClassLoader.php delete mode 100644 classes/includes/vendor/composer/LICENSE delete mode 100644 classes/includes/vendor/composer/autoload_classmap.php delete mode 100644 classes/includes/vendor/composer/autoload_namespaces.php delete mode 100644 classes/includes/vendor/composer/autoload_psr4.php delete mode 100644 classes/includes/vendor/composer/autoload_real.php delete mode 100644 classes/includes/vendor/composer/autoload_static.php delete mode 100644 classes/includes/vendor/composer/installed.json delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/.gitignore delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/.travis.yml delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/LICENSE.md delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/README.md delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/composer.json delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/composer.lock delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/docker-compose.yml delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/docs-config.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/consumer-authentication/JWT.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/consumer-authentication/cruise.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/echeck/index.html delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/echeck/process.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/heartland-styles.css delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/cvv.png delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/cvv1.png delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/cvv2.png delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-cvv@2x.png delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-inputcard-blank@2x.png delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-saved-amex@2x.png delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-saved-discover@2x.png delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-saved-jcb@2x.png delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-saved-mastercard.png delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-saved-mastercard@2x.png delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-saved-visa@2x.png delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-savedcards-amex@2x.png delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-shield-ie.png delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-shield@1x.png delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-shield@2x.png delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/charge.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/index.html delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/gift/charge.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/gift/index.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/iframe-pay-invoice/assets/main.js delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/iframe-pay-invoice/charge.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/iframe-pay-invoice/index.html delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/iframe-recurring-signup/assets/main.js delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/iframe-recurring-signup/charge.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/iframe-recurring-signup/index.html delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/manual-tokenize/assets/main.js delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/manual-tokenize/charge.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/manual-tokenize/index.html delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/pay-invoice/assets/main.js delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/pay-invoice/charge.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/pay-invoice/index.html delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/point-of-sale/e3-swipe/assets/apples.png delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/point-of-sale/e3-swipe/assets/bananas.png delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/point-of-sale/e3-swipe/assets/oranges.png delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/point-of-sale/e3-swipe/assets/secure.submit-1.1.0.js delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/point-of-sale/e3-swipe/charge.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/point-of-sale/e3-swipe/index.html delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/recurring-signup-ach/charge.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/examples/recurring-signup-ach/index.html delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/phpcs.xml delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/phpunit.xml.dist delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/sami.phar delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Builders/AuthorizationBuilder.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Builders/BaseBuilder.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Builders/BaseBuilder/ValidationClause.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Builders/BaseBuilder/ValidationTarget.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Builders/BaseBuilder/Validations.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Builders/ManagementBuilder.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Builders/RecurringBuilder.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Builders/ReportBuilder.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Builders/Secure3dBuilder.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Builders/TransactionBuilder.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Builders/TransactionReportBuilder.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Address.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/AlternativePaymentResponse.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/BatchSummary.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/BrowserData.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Customer.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/DccRateData.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/DccResponseResult.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/DecisionManager.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/EcommerceInfo.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/EncryptionData.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enum.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/AccountType.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/AddressType.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/AgeIndicator.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/AliasAction.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/AlternativePaymentType.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/AuthenticationRequestType.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/AuthenticationSource.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/ChallengeRequestIndicator.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/ChallengeWindowSize.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/CheckType.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/ColorDepth.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/CustomerAuthenticationMethod.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/CvnPresenceIndicator.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/DccProcessor.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/DccRateType.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/DeliveryTimeFrame.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/EcommerceChannel.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/EncyptedMobileType.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/EntryMethod.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/Environment.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/ExceptionCodes.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/FraudFilterMode.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/GiftEntryMethod.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/HppVersion.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/InquiryType.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/MessageCategory.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/MessageVersion.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/MethodUrlCompletion.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/OrderTransactionType.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/PaymentMethodType.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/PaymentSchedule.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/PreOrderIndicator.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/PriorAuthenticationMethod.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/ReasonCode.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/RecurringSequence.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/RecurringType.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/ReorderIndicator.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/ReportType.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/Risk.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/ScheduleFrequency.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/SdkInterface.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/SdkUiType.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/SecCode.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/Secure3dVersion.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/ServiceEndpoints.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/ShippingMethod.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/StoredCredentialInitiator.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/StoredCredentialSequence.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/StoredCredentialType.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/TaxType.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/TimeZoneConversion.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/TransactionModifier.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/TransactionType.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Exceptions/ApiException.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Exceptions/ArgumentException.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Exceptions/BuilderException.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Exceptions/ConfigurationException.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Exceptions/GatewayException.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Exceptions/NotImplementedException.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Exceptions/UnsupportedTransactionException.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/FraudManagementResponse.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/HostedPaymentData.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/IRecurringEntity.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/MerchantDataCollection.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/MerchantKVP.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/RecurringEntity.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Reporting/AltPaymentData.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Reporting/AltPaymentProcessorInfo.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Reporting/CheckData.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Reporting/LodgingData.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Reporting/SearchCriteria.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Reporting/SearchCriteriaBuilder.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Reporting/TransactionSummary.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Schedule.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/StoredCredential.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/ThreeDSecure.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/Transaction.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Entities/TransactionSummary.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Gateways/Gateway.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Gateways/GatewayResponse.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Gateways/Gp3DSProvider.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Gateways/IPaymentGateway.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Gateways/IRecurringService.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Gateways/ISecure3dProvider.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Gateways/PayPlanConnector.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Gateways/PorticoConnector.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Gateways/RealexConnector.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Gateways/RestGateway.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Gateways/XmlGateway.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/HostedPaymentConfig.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/AlternativePaymentMethod.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Cash.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Credit.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/CreditCardData.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/CreditTrackData.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Debit.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/DebitTrackData.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/EBT.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/EBTCardData.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/EBTTrackData.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/ECheck.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/GiftCard.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Interfaces/IAuthable.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Interfaces/IBalanceable.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Interfaces/ICardData.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Interfaces/IChargable.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Interfaces/IEditable.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Interfaces/IEncryptable.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Interfaces/IPaymentMethod.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Interfaces/IPinProtected.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Interfaces/IPrePayable.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Interfaces/IRefundable.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Interfaces/IReversable.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Interfaces/ISecure3d.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Interfaces/ITokenizable.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Interfaces/ITrackData.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Interfaces/IVerifyable.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Interfaces/IVoidable.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/RecurringPaymentMethod.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/TransactionReference.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Services/BatchService.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Services/CreditService.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Services/DeviceService.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Services/HostedService.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Services/RecurringService.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Services/ReportingService.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Services/Secure3dService.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/ServicesConfig.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/ServicesContainer.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Builders/TerminalAuthBuilder.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Builders/TerminalBuilder.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Builders/TerminalManageBuilder.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/ConnectionConfig.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/ConnectionContainer.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/DeviceController.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Enums/ApplicationCryptogramType.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Enums/BaudRate.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Enums/ConnectionModes.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Enums/ControlCodes.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Enums/CurrencyType.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Enums/DataBits.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Enums/DeviceSettings.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Enums/DeviceType.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Enums/DownloadEnvironment.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Enums/DownloadTime.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Enums/DownloadType.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Enums/StopBits.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Entities/Enums/HpaMessageFormat.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Entities/Enums/HpaMessageId.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Entities/Enums/HpaSendFileType.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Entities/HpaResponse.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Entities/LineItem.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Entities/SendFileData.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/HpaController.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/HpaInterface.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/HpaTcpInterface.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Requests/HpaSendFileRequest.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Responses/HpaDiagnosticReportResponse.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Responses/HpaEodResponse.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Responses/HpaSendSafResponse.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Interfaces/IDeviceCommInterface.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Interfaces/IDeviceInterface.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Interfaces/IDeviceResponseHandler.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Interfaces/IRequestIdProvider.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Terminals/TerminalUtils.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/src/Utils/GenerationUtils.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Data/TestCards.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Data/TestChecks.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/AchTest.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/CheckTest.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/EcommerceCheckTest.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/EcommerceTest.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/MotoCheckTest.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/MotoTest.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/RecurringTest.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/RetailTest.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/CreditTest.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/DebitTest.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/EbtTest.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/GiftTest.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/PorticoReportingTests.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/PorticoTokenManagementTest.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/AcsResponse.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/ApiTestCase.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/Certifications/SdkTest.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/CreditTest.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/Hpp/RealexHppClient.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/HppTest.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/HppTestCase.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/Realex3dSecureTests.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/RealexApmTest.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/RecurringTest.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/Secure3dServiceTests.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/ThreeDSecureAcsClient.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/HpaAdminTests.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/HpaCreditTests.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/HpaDebitTests.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/HpaEbtTests.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/HpaGiftTests.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/sampleimages/hpa_banner_iSC250_60_480.jpg delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/sampleimages/hpa_logo_iSC250_272_480.jpg delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/sampleimages/image_500_500.jpg delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/vrf/HpaVerificationTests.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/RequestIdProvider.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Unit/Builders/AuthorizationBuilder/ValidationTest.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/Unit/Gateways/RealexConnector/CreditTest.php delete mode 100644 classes/includes/vendor/globalpayments/php-sdk/test/setup.php diff --git a/classes/includes/vendor/autoload.php b/classes/includes/vendor/autoload.php deleted file mode 100644 index cea4692..0000000 --- a/classes/includes/vendor/autoload.php +++ /dev/null @@ -1,7 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer\Autoload; - -/** - * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. - * - * $loader = new \Composer\Autoload\ClassLoader(); - * - * // register classes with namespaces - * $loader->add('Symfony\Component', __DIR__.'/component'); - * $loader->add('Symfony', __DIR__.'/framework'); - * - * // activate the autoloader - * $loader->register(); - * - * // to enable searching the include path (eg. for PEAR packages) - * $loader->setUseIncludePath(true); - * - * In this example, if you try to use a class in the Symfony\Component - * namespace or one of its children (Symfony\Component\Console for instance), - * the autoloader will first look for the class under the component/ - * directory, and it will then fallback to the framework/ directory if not - * found before giving up. - * - * This class is loosely based on the Symfony UniversalClassLoader. - * - * @author Fabien Potencier - * @author Jordi Boggiano - * @see http://www.php-fig.org/psr/psr-0/ - * @see http://www.php-fig.org/psr/psr-4/ - */ -class ClassLoader -{ - // PSR-4 - private $prefixLengthsPsr4 = array(); - private $prefixDirsPsr4 = array(); - private $fallbackDirsPsr4 = array(); - - // PSR-0 - private $prefixesPsr0 = array(); - private $fallbackDirsPsr0 = array(); - - private $useIncludePath = false; - private $classMap = array(); - private $classMapAuthoritative = false; - private $missingClasses = array(); - private $apcuPrefix; - - public function getPrefixes() - { - if (!empty($this->prefixesPsr0)) { - return call_user_func_array('array_merge', $this->prefixesPsr0); - } - - return array(); - } - - public function getPrefixesPsr4() - { - return $this->prefixDirsPsr4; - } - - public function getFallbackDirs() - { - return $this->fallbackDirsPsr0; - } - - public function getFallbackDirsPsr4() - { - return $this->fallbackDirsPsr4; - } - - public function getClassMap() - { - return $this->classMap; - } - - /** - * @param array $classMap Class to filename map - */ - public function addClassMap(array $classMap) - { - if ($this->classMap) { - $this->classMap = array_merge($this->classMap, $classMap); - } else { - $this->classMap = $classMap; - } - } - - /** - * Registers a set of PSR-0 directories for a given prefix, either - * appending or prepending to the ones previously set for this prefix. - * - * @param string $prefix The prefix - * @param array|string $paths The PSR-0 root directories - * @param bool $prepend Whether to prepend the directories - */ - public function add($prefix, $paths, $prepend = false) - { - if (!$prefix) { - if ($prepend) { - $this->fallbackDirsPsr0 = array_merge( - (array) $paths, - $this->fallbackDirsPsr0 - ); - } else { - $this->fallbackDirsPsr0 = array_merge( - $this->fallbackDirsPsr0, - (array) $paths - ); - } - - return; - } - - $first = $prefix[0]; - if (!isset($this->prefixesPsr0[$first][$prefix])) { - $this->prefixesPsr0[$first][$prefix] = (array) $paths; - - return; - } - if ($prepend) { - $this->prefixesPsr0[$first][$prefix] = array_merge( - (array) $paths, - $this->prefixesPsr0[$first][$prefix] - ); - } else { - $this->prefixesPsr0[$first][$prefix] = array_merge( - $this->prefixesPsr0[$first][$prefix], - (array) $paths - ); - } - } - - /** - * Registers a set of PSR-4 directories for a given namespace, either - * appending or prepending to the ones previously set for this namespace. - * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param array|string $paths The PSR-4 base directories - * @param bool $prepend Whether to prepend the directories - * - * @throws \InvalidArgumentException - */ - public function addPsr4($prefix, $paths, $prepend = false) - { - if (!$prefix) { - // Register directories for the root namespace. - if ($prepend) { - $this->fallbackDirsPsr4 = array_merge( - (array) $paths, - $this->fallbackDirsPsr4 - ); - } else { - $this->fallbackDirsPsr4 = array_merge( - $this->fallbackDirsPsr4, - (array) $paths - ); - } - } elseif (!isset($this->prefixDirsPsr4[$prefix])) { - // Register directories for a new namespace. - $length = strlen($prefix); - if ('\\' !== $prefix[$length - 1]) { - throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); - } - $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = (array) $paths; - } elseif ($prepend) { - // Prepend directories for an already registered namespace. - $this->prefixDirsPsr4[$prefix] = array_merge( - (array) $paths, - $this->prefixDirsPsr4[$prefix] - ); - } else { - // Append directories for an already registered namespace. - $this->prefixDirsPsr4[$prefix] = array_merge( - $this->prefixDirsPsr4[$prefix], - (array) $paths - ); - } - } - - /** - * Registers a set of PSR-0 directories for a given prefix, - * replacing any others previously set for this prefix. - * - * @param string $prefix The prefix - * @param array|string $paths The PSR-0 base directories - */ - public function set($prefix, $paths) - { - if (!$prefix) { - $this->fallbackDirsPsr0 = (array) $paths; - } else { - $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; - } - } - - /** - * Registers a set of PSR-4 directories for a given namespace, - * replacing any others previously set for this namespace. - * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param array|string $paths The PSR-4 base directories - * - * @throws \InvalidArgumentException - */ - public function setPsr4($prefix, $paths) - { - if (!$prefix) { - $this->fallbackDirsPsr4 = (array) $paths; - } else { - $length = strlen($prefix); - if ('\\' !== $prefix[$length - 1]) { - throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); - } - $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = (array) $paths; - } - } - - /** - * Turns on searching the include path for class files. - * - * @param bool $useIncludePath - */ - public function setUseIncludePath($useIncludePath) - { - $this->useIncludePath = $useIncludePath; - } - - /** - * Can be used to check if the autoloader uses the include path to check - * for classes. - * - * @return bool - */ - public function getUseIncludePath() - { - return $this->useIncludePath; - } - - /** - * Turns off searching the prefix and fallback directories for classes - * that have not been registered with the class map. - * - * @param bool $classMapAuthoritative - */ - public function setClassMapAuthoritative($classMapAuthoritative) - { - $this->classMapAuthoritative = $classMapAuthoritative; - } - - /** - * Should class lookup fail if not found in the current class map? - * - * @return bool - */ - public function isClassMapAuthoritative() - { - return $this->classMapAuthoritative; - } - - /** - * APCu prefix to use to cache found/not-found classes, if the extension is enabled. - * - * @param string|null $apcuPrefix - */ - public function setApcuPrefix($apcuPrefix) - { - $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; - } - - /** - * The APCu prefix in use, or null if APCu caching is not enabled. - * - * @return string|null - */ - public function getApcuPrefix() - { - return $this->apcuPrefix; - } - - /** - * Registers this instance as an autoloader. - * - * @param bool $prepend Whether to prepend the autoloader or not - */ - public function register($prepend = false) - { - spl_autoload_register(array($this, 'loadClass'), true, $prepend); - } - - /** - * Unregisters this instance as an autoloader. - */ - public function unregister() - { - spl_autoload_unregister(array($this, 'loadClass')); - } - - /** - * Loads the given class or interface. - * - * @param string $class The name of the class - * @return bool|null True if loaded, null otherwise - */ - public function loadClass($class) - { - if ($file = $this->findFile($class)) { - includeFile($file); - - return true; - } - } - - /** - * Finds the path to the file where the class is defined. - * - * @param string $class The name of the class - * - * @return string|false The path if found, false otherwise - */ - public function findFile($class) - { - // class map lookup - if (isset($this->classMap[$class])) { - return $this->classMap[$class]; - } - if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { - return false; - } - if (null !== $this->apcuPrefix) { - $file = apcu_fetch($this->apcuPrefix.$class, $hit); - if ($hit) { - return $file; - } - } - - $file = $this->findFileWithExtension($class, '.php'); - - // Search for Hack files if we are running on HHVM - if (false === $file && defined('HHVM_VERSION')) { - $file = $this->findFileWithExtension($class, '.hh'); - } - - if (null !== $this->apcuPrefix) { - apcu_add($this->apcuPrefix.$class, $file); - } - - if (false === $file) { - // Remember that this class does not exist. - $this->missingClasses[$class] = true; - } - - return $file; - } - - private function findFileWithExtension($class, $ext) - { - // PSR-4 lookup - $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; - - $first = $class[0]; - if (isset($this->prefixLengthsPsr4[$first])) { - $subPath = $class; - while (false !== $lastPos = strrpos($subPath, '\\')) { - $subPath = substr($subPath, 0, $lastPos); - $search = $subPath . '\\'; - if (isset($this->prefixDirsPsr4[$search])) { - $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); - foreach ($this->prefixDirsPsr4[$search] as $dir) { - if (file_exists($file = $dir . $pathEnd)) { - return $file; - } - } - } - } - } - - // PSR-4 fallback dirs - foreach ($this->fallbackDirsPsr4 as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { - return $file; - } - } - - // PSR-0 lookup - if (false !== $pos = strrpos($class, '\\')) { - // namespaced class name - $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) - . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); - } else { - // PEAR-like class name - $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; - } - - if (isset($this->prefixesPsr0[$first])) { - foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { - if (0 === strpos($class, $prefix)) { - foreach ($dirs as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { - return $file; - } - } - } - } - } - - // PSR-0 fallback dirs - foreach ($this->fallbackDirsPsr0 as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { - return $file; - } - } - - // PSR-0 include paths. - if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { - return $file; - } - - return false; - } -} - -/** - * Scope isolated include. - * - * Prevents access to $this/self from included files. - */ -function includeFile($file) -{ - include $file; -} diff --git a/classes/includes/vendor/composer/LICENSE b/classes/includes/vendor/composer/LICENSE deleted file mode 100644 index f27399a..0000000 --- a/classes/includes/vendor/composer/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ - -Copyright (c) Nils Adermann, Jordi Boggiano - -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/classes/includes/vendor/composer/autoload_classmap.php b/classes/includes/vendor/composer/autoload_classmap.php deleted file mode 100644 index 7a91153..0000000 --- a/classes/includes/vendor/composer/autoload_classmap.php +++ /dev/null @@ -1,9 +0,0 @@ - array($vendorDir . '/globalpayments/php-sdk/src'), -); diff --git a/classes/includes/vendor/composer/autoload_real.php b/classes/includes/vendor/composer/autoload_real.php deleted file mode 100644 index 8c3f11c..0000000 --- a/classes/includes/vendor/composer/autoload_real.php +++ /dev/null @@ -1,52 +0,0 @@ -= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); - if ($useStaticLoader) { - require_once __DIR__ . '/autoload_static.php'; - - call_user_func(\Composer\Autoload\ComposerStaticInita72bf99c073d7f73aa177c21b69d17ba::getInitializer($loader)); - } else { - $map = require __DIR__ . '/autoload_namespaces.php'; - foreach ($map as $namespace => $path) { - $loader->set($namespace, $path); - } - - $map = require __DIR__ . '/autoload_psr4.php'; - foreach ($map as $namespace => $path) { - $loader->setPsr4($namespace, $path); - } - - $classMap = require __DIR__ . '/autoload_classmap.php'; - if ($classMap) { - $loader->addClassMap($classMap); - } - } - - $loader->register(true); - - return $loader; - } -} diff --git a/classes/includes/vendor/composer/autoload_static.php b/classes/includes/vendor/composer/autoload_static.php deleted file mode 100644 index fc7ae04..0000000 --- a/classes/includes/vendor/composer/autoload_static.php +++ /dev/null @@ -1,31 +0,0 @@ - - array ( - 'GlobalPayments\\Api\\' => 19, - ), - ); - - public static $prefixDirsPsr4 = array ( - 'GlobalPayments\\Api\\' => - array ( - 0 => __DIR__ . '/..' . '/globalpayments/php-sdk/src', - ), - ); - - public static function getInitializer(ClassLoader $loader) - { - return \Closure::bind(function () use ($loader) { - $loader->prefixLengthsPsr4 = ComposerStaticInita72bf99c073d7f73aa177c21b69d17ba::$prefixLengthsPsr4; - $loader->prefixDirsPsr4 = ComposerStaticInita72bf99c073d7f73aa177c21b69d17ba::$prefixDirsPsr4; - - }, null, ClassLoader::class); - } -} diff --git a/classes/includes/vendor/composer/installed.json b/classes/includes/vendor/composer/installed.json deleted file mode 100644 index dfb2237..0000000 --- a/classes/includes/vendor/composer/installed.json +++ /dev/null @@ -1,49 +0,0 @@ -[ - { - "name": "globalpayments/php-sdk", - "version": "1.3.3", - "version_normalized": "1.3.3.0", - "source": { - "type": "git", - "url": "https://github.com/globalpayments/php-sdk.git", - "reference": "1fd0393b3fc231fcff2977a152b7a7b9e0c1d57f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/globalpayments/php-sdk/zipball/1fd0393b3fc231fcff2977a152b7a7b9e0c1d57f", - "reference": "1fd0393b3fc231fcff2977a152b7a7b9e0c1d57f", - "shasum": "" - }, - "require": { - "ext-curl": "*", - "ext-dom": "*", - "ext-openssl": "*", - "php": ">= 5.5.9" - }, - "require-dev": { - "brianium/paratest": "dev-master", - "phpstan/phpstan-shim": "^0.8.4", - "phpunit/phpunit": "~5.0", - "squizlabs/php_codesniffer": "2.*" - }, - "time": "2019-10-03T15:15:47+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "GlobalPayments\\Api\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "GPL-2.0-or-later" - ], - "authors": [ - { - "name": "Heartland Payment Systems" - } - ], - "description": "PHP SDK for processing payments with Global Payments, including Heartland Payment Systems and Realex Payments", - "homepage": "https://developer.heartlandpaymentsystems.com/documentation" - } -] diff --git a/classes/includes/vendor/globalpayments/php-sdk/.gitignore b/classes/includes/vendor/globalpayments/php-sdk/.gitignore deleted file mode 100644 index caae86d..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -composer.phar -/vendor/ - -# Commit your application's lock file http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file -# You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file -# composer.lock -composer -/docs/ -/docs-cache/ diff --git a/classes/includes/vendor/globalpayments/php-sdk/.travis.yml b/classes/includes/vendor/globalpayments/php-sdk/.travis.yml deleted file mode 100644 index fc15400..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/.travis.yml +++ /dev/null @@ -1,25 +0,0 @@ -language: php - -sudo: false -branches: - only: - - master - -php: - - '7.0' - -install: - - composer install - -script: - # Build docs - - composer docs - -deploy: - local-dir: docs - provider: pages - skip-cleanup: true - github-token: $GITHUB_TOKEN # Set in the settings page of your repository, as a secure variable - keep-history: true - on: - branch: master diff --git a/classes/includes/vendor/globalpayments/php-sdk/LICENSE.md b/classes/includes/vendor/globalpayments/php-sdk/LICENSE.md deleted file mode 100644 index 0671f06..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/LICENSE.md +++ /dev/null @@ -1,264 +0,0 @@ -The GNU General Public License, Version 2, June 1991 (GPLv2) -============================================================ - -> Copyright (C) 1989, 1991 Free Software Foundation, Inc. -> 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - -Everyone is permitted to copy and distribute verbatim copies of this license -document, but changing it is not allowed. - - -Preamble --------- - -The licenses for most software are designed to take away your freedom to share -and change it. By contrast, the GNU General Public License is intended to -guarantee your freedom to share and change free software--to make sure the -software is free for all its users. This General Public License applies to most -of the Free Software Foundation's software and to any other program whose -authors commit to using it. (Some other Free Software Foundation software is -covered by the GNU Library General Public License instead.) You can apply it to -your programs, too. - -When we speak of free software, we are referring to freedom, not price. Our -General Public Licenses are designed to make sure that you have the freedom to -distribute copies of free software (and charge for this service if you wish), -that you receive source code or can get it if you want it, that you can change -the software or use pieces of it in new free programs; and that you know you can -do these things. - -To protect your rights, we need to make restrictions that forbid anyone to deny -you these rights or to ask you to surrender the rights. These restrictions -translate to certain responsibilities for you if you distribute copies of the -software, or if you modify it. - -For example, if you distribute copies of such a program, whether gratis or for a -fee, you must give the recipients all the rights that you have. You must make -sure that they, too, receive or can get the source code. And you must show them -these terms so they know their rights. - -We protect your rights with two steps: (1) copyright the software, and (2) offer -you this license which gives you legal permission to copy, distribute and/or -modify the software. - -Also, for each author's protection and ours, we want to make certain that -everyone understands that there is no warranty for this free software. If the -software is modified by someone else and passed on, we want its recipients to -know that what they have is not the original, so that any problems introduced by -others will not reflect on the original authors' reputations. - -Finally, any free program is threatened constantly by software patents. We wish -to avoid the danger that redistributors of a free program will individually -obtain patent licenses, in effect making the program proprietary. To prevent -this, we have made it clear that any patent must be licensed for everyone's free -use or not licensed at all. - -The precise terms and conditions for copying, distribution and modification -follow. - - -Terms And Conditions For Copying, Distribution And Modification ---------------------------------------------------------------- - -**0.** This License applies to any program or other work which contains a notice -placed by the copyright holder saying it may be distributed under the terms of -this General Public License. The "Program", below, refers to any such program or -work, and a "work based on the Program" means either the Program or any -derivative work under copyright law: that is to say, a work containing the -Program or a portion of it, either verbatim or with modifications and/or -translated into another language. (Hereinafter, translation is included without -limitation in the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not covered by -this License; they are outside its scope. The act of running the Program is not -restricted, and the output from the Program is covered only if its contents -constitute a work based on the Program (independent of having been made by -running the Program). Whether that is true depends on what the Program does. - -**1.** You may copy and distribute verbatim copies of the Program's source code -as you receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice and -disclaimer of warranty; keep intact all the notices that refer to this License -and to the absence of any warranty; and give any other recipients of the Program -a copy of this License along with the Program. - -You may charge a fee for the physical act of transferring a copy, and you may at -your option offer warranty protection in exchange for a fee. - -**2.** You may modify your copy or copies of the Program or any portion of it, -thus forming a work based on the Program, and copy and distribute such -modifications or work under the terms of Section 1 above, provided that you also -meet all of these conditions: - -* **a)** You must cause the modified files to carry prominent notices stating - that you changed the files and the date of any change. - -* **b)** You must cause any work that you distribute or publish, that in whole - or in part contains or is derived from the Program or any part thereof, to - be licensed as a whole at no charge to all third parties under the terms of - this License. - -* **c)** If the modified program normally reads commands interactively when - run, you must cause it, when started running for such interactive use in the - most ordinary way, to print or display an announcement including an - appropriate copyright notice and a notice that there is no warranty (or - else, saying that you provide a warranty) and that users may redistribute - the program under these conditions, and telling the user how to view a copy - of this License. (Exception: if the Program itself is interactive but does - not normally print such an announcement, your work based on the Program is - not required to print an announcement.) - -These requirements apply to the modified work as a whole. If identifiable -sections of that work are not derived from the Program, and can be reasonably -considered independent and separate works in themselves, then this License, and -its terms, do not apply to those sections when you distribute them as separate -works. But when you distribute the same sections as part of a whole which is a -work based on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the entire whole, -and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest your -rights to work written entirely by you; rather, the intent is to exercise the -right to control the distribution of derivative or collective works based on the -Program. - -In addition, mere aggregation of another work not based on the Program with the -Program (or with a work based on the Program) on a volume of a storage or -distribution medium does not bring the other work under the scope of this -License. - -**3.** You may copy and distribute the Program (or a work based on it, under -Section 2) in object code or executable form under the terms of Sections 1 and 2 -above provided that you also do one of the following: - -* **a)** Accompany it with the complete corresponding machine-readable source - code, which must be distributed under the terms of Sections 1 and 2 above on - a medium customarily used for software interchange; or, - -* **b)** Accompany it with a written offer, valid for at least three years, to - give any third party, for a charge no more than your cost of physically - performing source distribution, a complete machine-readable copy of the - corresponding source code, to be distributed under the terms of Sections 1 - and 2 above on a medium customarily used for software interchange; or, - -* **c)** Accompany it with the information you received as to the offer to - distribute corresponding source code. (This alternative is allowed only for - noncommercial distribution and only if you received the program in object - code or executable form with such an offer, in accord with Subsection b - above.) - -The source code for a work means the preferred form of the work for making -modifications to it. For an executable work, complete source code means all the -source code for all modules it contains, plus any associated interface -definition files, plus the scripts used to control compilation and installation -of the executable. However, as a special exception, the source code distributed -need not include anything that is normally distributed (in either source or -binary form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component itself -accompanies the executable. - -If distribution of executable or object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the source code -from the same place counts as distribution of the source code, even though third -parties are not compelled to copy the source along with the object code. - -**4.** You may not copy, modify, sublicense, or distribute the Program except as -expressly provided under this License. Any attempt otherwise to copy, modify, -sublicense or distribute the Program is void, and will automatically terminate -your rights under this License. However, parties who have received copies, or -rights, from you under this License will not have their licenses terminated so -long as such parties remain in full compliance. - -**5.** You are not required to accept this License, since you have not signed -it. However, nothing else grants you permission to modify or distribute the -Program or its derivative works. These actions are prohibited by law if you do -not accept this License. Therefore, by modifying or distributing the Program (or -any work based on the Program), you indicate your acceptance of this License to -do so, and all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - -**6.** Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the original -licensor to copy, distribute or modify the Program subject to these terms and -conditions. You may not impose any further restrictions on the recipients' -exercise of the rights granted herein. You are not responsible for enforcing -compliance by third parties to this License. - -**7.** If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), conditions -are imposed on you (whether by court order, agreement or otherwise) that -contradict the conditions of this License, they do not excuse you from the -conditions of this License. If you cannot distribute so as to satisfy -simultaneously your obligations under this License and any other pertinent -obligations, then as a consequence you may not distribute the Program at all. -For example, if a patent license would not permit royalty-free redistribution of -the Program by all those who receive copies directly or indirectly through you, -then the only way you could satisfy both it and this License would be to refrain -entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply and the -section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any patents or -other property right claims or to contest validity of any such claims; this -section has the sole purpose of protecting the integrity of the free software -distribution system, which is implemented by public license practices. Many -people have made generous contributions to the wide range of software -distributed through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing to -distribute software through any other system and a licensee cannot impose that -choice. - -This section is intended to make thoroughly clear what is believed to be a -consequence of the rest of this License. - -**8.** If the distribution and/or use of the Program is restricted in certain -countries either by patents or by copyrighted interfaces, the original copyright -holder who places the Program under this License may add an explicit -geographical distribution limitation excluding those countries, so that -distribution is permitted only in or among countries not thus excluded. In such -case, this License incorporates the limitation as if written in the body of this -License. - -**9.** The Free Software Foundation may publish revised and/or new versions of -the General Public License from time to time. Such new versions will be similar -in spirit to the present version, but may differ in detail to address new -problems or concerns. - -Each version is given a distinguishing version number. If the Program specifies -a version number of this License which applies to it and "any later version", -you have the option of following the terms and conditions either of that version -or of any later version published by the Free Software Foundation. If the -Program does not specify a version number of this License, you may choose any -version ever published by the Free Software Foundation. - -**10.** If you wish to incorporate parts of the Program into other free programs -whose distribution conditions are different, write to the author to ask for -permission. For software which is copyrighted by the Free Software Foundation, -write to the Free Software Foundation; we sometimes make exceptions for this. -Our decision will be guided by the two goals of preserving the free status of -all derivatives of our free software and of promoting the sharing and reuse of -software generally. - - -No Warranty ------------ - -**11.** BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR -THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE -STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM -"AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - -**12.** IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR -INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA -BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER -OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. diff --git a/classes/includes/vendor/globalpayments/php-sdk/README.md b/classes/includes/vendor/globalpayments/php-sdk/README.md deleted file mode 100644 index 3653399..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/README.md +++ /dev/null @@ -1,136 +0,0 @@ - - Global Payments logo - - -# Heartland & Global Payments PHP SDK - -This SDK makes it easy to integrate your PHP application with our Card Not Present and Card Present APIs. - -## Solutions - -### General / Omnichannel - -* API Payment Processing -* Apple Pay & Google Pay -* Secure Card Storage & Customer Management -* Subscriptions / Recurring Billing Solutions -* Credit, Debit, Gift & Loyalty, and eCheck/ACH - -### Card Not Present (Ecommerce & MOTO) Specific - -* Minimize PCI compliance requirements with Hosted Payment Solutions -* 140+ Authorization Currencies & 16 Settlement Currencies -* 150+ Local Payment Methods Worldwide -* Account Updater -* Inbuilt Fraud Prevention Rules -* 3D Secure, AVS and CVV Checks -* 260+ Global Enterprise Fraud Rules - -### Card Present (Terminal & POS) Specific - -* Secure End-To-End Encryption - -## Requirements - -- PHP 5.5.9+ -- OpenSSL 1.0.1+ -- PHP Curl extension -- PHP DOM extension -- PHP OpenSSL extension - -## Installation - -Installing the SDK into your solution is usually be done by either using Composer/Packagist, or by adding the project to your solution and referencing it directly. - -To install via [Composer/Packagist](https://packagist.org/packages/globalpayments/php-sdk): - -``` -composer require globalpayments/php-sdk -``` - -To install via a direct download: - -Download and unzip or, using Git, [clone the repository](https://github.com/globalpayments/php-sdk) from GitHub. See more on [how to clone repositories](https://help.github.com/articles/cloning-a-repository/). - -``` -git clone https://github.com/globalpayments/php-sdk -``` - -## Documentation and Examples - -You can find the latest SDK documentation along with code examples and test cards on the [Global Payments](https://developer.realexpayments.com) and [Heartland](https://developer.heartlandpaymentsystems.com/documentation) Developer Hubs. - -In addition you can find working examples in the our example code repository. - -*Quick Tip*: The included [test suite](https://github.com/globalpayments/php-sdk/tree/master/test) can be a great source of code samples for using the SDK! - -#### Process a Payment Example - -```csharp -$card = new CreditCardData(); -$card->number = "4111111111111111"; -$card->expMonth = "12"; -$card->expYear = "2025"; -$card->cvn = "123"; - -try { - $response = $card->charge(129.99) - ->withCurrency("EUR") - ->execute(); - - $result = $response->responseCode; // 00 == Success - $message = $response->responseMessage; // [ test system ] AUTHORISED -} catch (ApiException $e) { - // handle errors -} -``` - -#### Test Card Data - -Name | Number | Exp Month | Exp Year | CVN ------------ | ---------------- | --------- | -------- | ---- -Visa | 4263970000005262 | 12 | 2025 | 123 -MasterCard | 2223000010005780 | 12 | 2019 | 900 -MasterCard | 5425230000004415 | 12 | 2025 | 123 -Discover | 6011000000000087 | 12 | 2025 | 123 -Amex | 374101000000608 | 12 | 2025 | 1234 -JCB | 3566000000000000 | 12 | 2025 | 123 -Diners Club | 36256000000725 | 12 | 2025 | 123 - -#### Testing Exceptions - -During your integration you will want to test for specific issuer responses such as 'Card Declined'. Because our sandbox environments do not actually reach out to issuing banks for authorizations, there are specific transaction amounts and/or card numbers that will trigger gateway and issuing bank responses. Please contact your support representative for a complete listing of values used to simulate transaction AVS/CVV results, declines, errors, and other responses that can be caught in your code. Example error handling code: - -```php -try { - $response = $card->charge(129.99) - ->withCurrency("EUR") - ->execute(); -} catch (BuilderException $e) { - // handle builder errors -} catch (ConfigurationException $e) { - // handle errors related to your services configuration -} catch (GatewayException $e) { - // handle gateway errors/exceptions -} catch (UnsupportedTransactionException $e) { - // handle errors when the configured gateway doesn't support - // desired transaction -} catch (ApiException $e) { - // handle all other errors -} -``` - -## Contributing - -All our code is open sourced and we encourage fellow developers to contribute and help improve it! - -1. Fork it -2. Create your feature branch (`git checkout -b my-new-feature`) -3. Ensure SDK tests are passing -4. Commit your changes (`git commit -am 'Add some feature'`) -5. Push to the branch (`git push origin my-new-feature`) -6. Create new Pull Request - -## License - -This project is licensed under the GNU General Public License v2.0. Please see [LICENSE.md](LICENSE.md) located at the project's root for more details. diff --git a/classes/includes/vendor/globalpayments/php-sdk/composer.json b/classes/includes/vendor/globalpayments/php-sdk/composer.json deleted file mode 100644 index ae26fd4..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/composer.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "globalpayments/php-sdk", - "description": "PHP SDK for processing payments with Global Payments, including Heartland Payment Systems and Realex Payments", - "keywords": [ - ], - "homepage": "https://developer.heartlandpaymentsystems.com/documentation", - "license": "GPL-2.0-or-later", - "authors": [ - { - "name": "Heartland Payment Systems" - } - ], - "require": { - "php": ">= 5.5.9", - "ext-curl": "*", - "ext-dom": "*", - "ext-openssl": "*" - }, - "require-dev": { - "phpunit/phpunit": "~5.0", - "brianium/paratest": "dev-master", - "squizlabs/php_codesniffer": "2.*", - "phpstan/phpstan-shim": "^0.8.4" - }, - "autoload": { - "psr-4": { - "GlobalPayments\\Api\\": "src/" - } - }, - "autoload-dev": { - "psr-4": { - "GlobalPayments\\Api\\Tests\\": "test/" - } - }, - "scripts": { - "docs": "@php sami.phar update docs-config.php", - "pretest": "@composer test:lint", - "test": "@composer pretest && paratest --coverage-html=coverage.html --colors -f --stop-on-failure", - "test:lint": "phpcs" - }, - "config": { - "process-timeout":0 - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/composer.lock b/classes/includes/vendor/globalpayments/php-sdk/composer.lock deleted file mode 100644 index 0260065..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/composer.lock +++ /dev/null @@ -1,4199 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", - "This file is @generated automatically" - ], - "content-hash": "5400d26ad80e42feba9aa303ed2a3d0c", - "packages": [], - "packages-dev": [ - { - "name": "brianium/habitat", - "version": "v1.0.0", - "source": { - "type": "git", - "url": "https://github.com/brianium/habitat.git", - "reference": "d0979e3bb379cbc78ecb42b3ac171bc2b7e06d96" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/brianium/habitat/zipball/d0979e3bb379cbc78ecb42b3ac171bc2b7e06d96", - "reference": "d0979e3bb379cbc78ecb42b3ac171bc2b7e06d96", - "shasum": "" - }, - "require-dev": { - "monolog/monolog": ">=1.5.0", - "phpunit/phpunit": ">=3.7.21" - }, - "type": "library", - "autoload": { - "psr-0": { - "Habitat": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Brian", - "email": "scaturrob@gmail.com", - "homepage": "http://brianscaturro.com", - "role": "Lead" - } - ], - "description": "A dependable php environment", - "time": "2013-06-08T04:42:29+00:00" - }, - { - "name": "brianium/paratest", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/brianium/paratest.git", - "reference": "b4c5be606a03af51c313c12018a5e80d0ab9b94b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/brianium/paratest/zipball/b4c5be606a03af51c313c12018a5e80d0ab9b94b", - "reference": "b4c5be606a03af51c313c12018a5e80d0ab9b94b", - "shasum": "" - }, - "require": { - "brianium/habitat": "1.0.0", - "composer/semver": "~1.2", - "ext-pcre": "*", - "ext-reflection": "*", - "ext-simplexml": "*", - "php": ">=5.5.11", - "phpunit/php-timer": ">=1.0.4", - "phpunit/phpunit": "~5.0", - "symfony/console": "~2.3|~3.0", - "symfony/process": "~2.3|~3.0" - }, - "bin": [ - "bin/paratest" - ], - "type": "library", - "autoload": { - "psr-0": { - "ParaTest": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Brian Scaturro", - "email": "scaturrob@gmail.com", - "homepage": "http://brianscaturro.com", - "role": "Lead" - } - ], - "description": "Parallel testing for PHP", - "homepage": "https://github.com/brianium/paratest", - "keywords": [ - "concurrent", - "parallel", - "phpunit", - "testing" - ], - "time": "2017-06-07T20:20:03+00:00" - }, - { - "name": "cilex/cilex", - "version": "1.1.0", - "source": { - "type": "git", - "url": "https://github.com/Cilex/Cilex.git", - "reference": "7acd965a609a56d0345e8b6071c261fbdb926cb5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Cilex/Cilex/zipball/7acd965a609a56d0345e8b6071c261fbdb926cb5", - "reference": "7acd965a609a56d0345e8b6071c261fbdb926cb5", - "shasum": "" - }, - "require": { - "cilex/console-service-provider": "1.*", - "php": ">=5.3.3", - "pimple/pimple": "~1.0", - "symfony/finder": "~2.1", - "symfony/process": "~2.1" - }, - "require-dev": { - "phpunit/phpunit": "3.7.*", - "symfony/validator": "~2.1" - }, - "suggest": { - "monolog/monolog": ">=1.0.0", - "symfony/validator": ">=1.0.0", - "symfony/yaml": ">=1.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "psr-0": { - "Cilex": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "mike.vanriel@naenius.com" - } - ], - "description": "The PHP micro-framework for Command line tools based on the Symfony2 Components", - "homepage": "http://cilex.github.com", - "keywords": [ - "cli", - "microframework" - ], - "time": "2014-03-29T14:03:13+00:00" - }, - { - "name": "cilex/console-service-provider", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/Cilex/console-service-provider.git", - "reference": "25ee3d1875243d38e1a3448ff94bdf944f70d24e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Cilex/console-service-provider/zipball/25ee3d1875243d38e1a3448ff94bdf944f70d24e", - "reference": "25ee3d1875243d38e1a3448ff94bdf944f70d24e", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "pimple/pimple": "1.*@dev", - "symfony/console": "~2.1" - }, - "require-dev": { - "cilex/cilex": "1.*@dev", - "silex/silex": "1.*@dev" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "psr-0": { - "Cilex\\Provider\\Console": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Beau Simensen", - "email": "beau@dflydev.com", - "homepage": "http://beausimensen.com" - }, - { - "name": "Mike van Riel", - "email": "mike.vanriel@naenius.com" - } - ], - "description": "Console Service Provider", - "keywords": [ - "cilex", - "console", - "pimple", - "service-provider", - "silex" - ], - "time": "2012-12-19T10:50:58+00:00" - }, - { - "name": "composer/semver", - "version": "1.4.2", - "source": { - "type": "git", - "url": "https://github.com/composer/semver.git", - "reference": "c7cb9a2095a074d131b65a8a0cd294479d785573" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/c7cb9a2095a074d131b65a8a0cd294479d785573", - "reference": "c7cb9a2095a074d131b65a8a0cd294479d785573", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.5 || ^5.0.5", - "phpunit/phpunit-mock-objects": "2.3.0 || ^3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Semver\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" - } - ], - "description": "Semver library that offers utilities, version constraint parsing and validation.", - "keywords": [ - "semantic", - "semver", - "validation", - "versioning" - ], - "time": "2016-08-30T16:08:34+00:00" - }, - { - "name": "container-interop/container-interop", - "version": "1.2.0", - "source": { - "type": "git", - "url": "https://github.com/container-interop/container-interop.git", - "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/container-interop/container-interop/zipball/79cbf1341c22ec75643d841642dd5d6acd83bdb8", - "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8", - "shasum": "" - }, - "require": { - "psr/container": "^1.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Interop\\Container\\": "src/Interop/Container/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Promoting the interoperability of container objects (DIC, SL, etc.)", - "homepage": "https://github.com/container-interop/container-interop", - "time": "2017-02-14T19:40:03+00:00" - }, - { - "name": "doctrine/annotations", - "version": "v1.4.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/annotations.git", - "reference": "54cacc9b81758b14e3ce750f205a393d52339e97" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/54cacc9b81758b14e3ce750f205a393d52339e97", - "reference": "54cacc9b81758b14e3ce750f205a393d52339e97", - "shasum": "" - }, - "require": { - "doctrine/lexer": "1.*", - "php": "^5.6 || ^7.0" - }, - "require-dev": { - "doctrine/cache": "1.*", - "phpunit/phpunit": "^5.7" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "Docblock Annotations Parser", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "annotations", - "docblock", - "parser" - ], - "time": "2017-02-24T16:22:25+00:00" - }, - { - "name": "doctrine/instantiator", - "version": "1.0.5", - "source": { - "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", - "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", - "shasum": "" - }, - "require": { - "php": ">=5.3,<8.0-DEV" - }, - "require-dev": { - "athletic/athletic": "~0.1.8", - "ext-pdo": "*", - "ext-phar": "*", - "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "~2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.com/" - } - ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://github.com/doctrine/instantiator", - "keywords": [ - "constructor", - "instantiate" - ], - "time": "2015-06-14T21:17:01+00:00" - }, - { - "name": "doctrine/lexer", - "version": "v1.0.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c", - "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-0": { - "Doctrine\\Common\\Lexer\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "lexer", - "parser" - ], - "time": "2014-09-09T13:34:57+00:00" - }, - { - "name": "erusev/parsedown", - "version": "1.6.2", - "source": { - "type": "git", - "url": "https://github.com/erusev/parsedown.git", - "reference": "1bf24f7334fe16c88bf9d467863309ceaf285b01" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/erusev/parsedown/zipball/1bf24f7334fe16c88bf9d467863309ceaf285b01", - "reference": "1bf24f7334fe16c88bf9d467863309ceaf285b01", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "autoload": { - "psr-0": { - "Parsedown": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Emanuil Rusev", - "email": "hello@erusev.com", - "homepage": "http://erusev.com" - } - ], - "description": "Parser for Markdown.", - "homepage": "http://parsedown.org", - "keywords": [ - "markdown", - "parser" - ], - "time": "2017-03-29T16:04:15+00:00" - }, - { - "name": "herrera-io/json", - "version": "1.0.3", - "source": { - "type": "git", - "url": "https://github.com/kherge-php/json.git", - "reference": "60c696c9370a1e5136816ca557c17f82a6fa83f1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/kherge-php/json/zipball/60c696c9370a1e5136816ca557c17f82a6fa83f1", - "reference": "60c696c9370a1e5136816ca557c17f82a6fa83f1", - "shasum": "" - }, - "require": { - "ext-json": "*", - "justinrainbow/json-schema": ">=1.0,<2.0-dev", - "php": ">=5.3.3", - "seld/jsonlint": ">=1.0,<2.0-dev" - }, - "require-dev": { - "herrera-io/phpunit-test-case": "1.*", - "mikey179/vfsstream": "1.1.0", - "phpunit/phpunit": "3.7.*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "files": [ - "src/lib/json_version.php" - ], - "psr-0": { - "Herrera\\Json": "src/lib" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Kevin Herrera", - "email": "kevin@herrera.io", - "homepage": "http://kevin.herrera.io" - } - ], - "description": "A library for simplifying JSON linting and validation.", - "homepage": "http://herrera-io.github.com/php-json", - "keywords": [ - "json", - "lint", - "schema", - "validate" - ], - "abandoned": "kherge/json", - "time": "2013-10-30T16:51:34+00:00" - }, - { - "name": "herrera-io/phar-update", - "version": "1.0.3", - "source": { - "type": "git", - "url": "https://github.com/kherge-abandoned/php-phar-update.git", - "reference": "00a79e1d5b8cf3c080a2e3becf1ddf7a7fea025b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/kherge-abandoned/php-phar-update/zipball/00a79e1d5b8cf3c080a2e3becf1ddf7a7fea025b", - "reference": "00a79e1d5b8cf3c080a2e3becf1ddf7a7fea025b", - "shasum": "" - }, - "require": { - "herrera-io/json": "1.*", - "kherge/version": "1.*", - "php": ">=5.3.3" - }, - "require-dev": { - "herrera-io/phpunit-test-case": "1.*", - "mikey179/vfsstream": "1.1.0", - "phpunit/phpunit": "3.7.*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "files": [ - "src/lib/constants.php" - ], - "psr-0": { - "Herrera\\Phar\\Update": "src/lib" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Kevin Herrera", - "email": "kevin@herrera.io", - "homepage": "http://kevin.herrera.io" - } - ], - "description": "A library for self-updating Phars.", - "homepage": "http://herrera-io.github.com/php-phar-update", - "keywords": [ - "phar", - "update" - ], - "abandoned": true, - "time": "2013-10-30T17:23:01+00:00" - }, - { - "name": "jms/metadata", - "version": "1.6.0", - "source": { - "type": "git", - "url": "https://github.com/schmittjoh/metadata.git", - "reference": "6a06970a10e0a532fb52d3959547123b84a3b3ab" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/metadata/zipball/6a06970a10e0a532fb52d3959547123b84a3b3ab", - "reference": "6a06970a10e0a532fb52d3959547123b84a3b3ab", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "doctrine/cache": "~1.0", - "symfony/cache": "~3.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.5.x-dev" - } - }, - "autoload": { - "psr-0": { - "Metadata\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "Class/method/property metadata management in PHP", - "keywords": [ - "annotations", - "metadata", - "xml", - "yaml" - ], - "time": "2016-12-05T10:18:33+00:00" - }, - { - "name": "jms/parser-lib", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/schmittjoh/parser-lib.git", - "reference": "c509473bc1b4866415627af0e1c6cc8ac97fa51d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/parser-lib/zipball/c509473bc1b4866415627af0e1c6cc8ac97fa51d", - "reference": "c509473bc1b4866415627af0e1c6cc8ac97fa51d", - "shasum": "" - }, - "require": { - "phpoption/phpoption": ">=0.9,<2.0-dev" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "psr-0": { - "JMS\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache2" - ], - "description": "A library for easily creating recursive-descent parsers.", - "time": "2012-11-18T18:08:43+00:00" - }, - { - "name": "jms/serializer", - "version": "1.7.1", - "source": { - "type": "git", - "url": "https://github.com/schmittjoh/serializer.git", - "reference": "4fad8bbbe76e05de3b79ffa3db027058ed3813ff" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/4fad8bbbe76e05de3b79ffa3db027058ed3813ff", - "reference": "4fad8bbbe76e05de3b79ffa3db027058ed3813ff", - "shasum": "" - }, - "require": { - "doctrine/annotations": "^1.0", - "doctrine/instantiator": "^1.0.3", - "jms/metadata": "~1.1", - "jms/parser-lib": "1.*", - "php": ">=5.5.0", - "phpcollection/phpcollection": "~0.1", - "phpoption/phpoption": "^1.1" - }, - "conflict": { - "jms/serializer-bundle": "<1.2.1", - "twig/twig": "<1.12" - }, - "require-dev": { - "doctrine/orm": "~2.1", - "doctrine/phpcr-odm": "^1.3|^2.0", - "ext-pdo_sqlite": "*", - "jackalope/jackalope-doctrine-dbal": "^1.1.5", - "phpunit/phpunit": "^4.8|^5.0", - "propel/propel1": "~1.7", - "symfony/expression-language": "^2.6|^3.0", - "symfony/filesystem": "^2.1", - "symfony/form": "~2.1|^3.0", - "symfony/translation": "^2.1|^3.0", - "symfony/validator": "^2.2|^3.0", - "symfony/yaml": "^2.1|^3.0", - "twig/twig": "~1.12|~2.0" - }, - "suggest": { - "doctrine/cache": "Required if you like to use cache functionality.", - "doctrine/collections": "Required if you like to use doctrine collection types as ArrayCollection.", - "symfony/yaml": "Required if you'd like to serialize data to YAML format." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.8-dev" - } - }, - "autoload": { - "psr-0": { - "JMS\\Serializer": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "Library for (de-)serializing data of any complexity; supports XML, JSON, and YAML.", - "homepage": "http://jmsyst.com/libs/serializer", - "keywords": [ - "deserialization", - "jaxb", - "json", - "serialization", - "xml" - ], - "time": "2017-05-15T08:35:42+00:00" - }, - { - "name": "justinrainbow/json-schema", - "version": "1.6.1", - "source": { - "type": "git", - "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "cc84765fb7317f6b07bd8ac78364747f95b86341" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/cc84765fb7317f6b07bd8ac78364747f95b86341", - "reference": "cc84765fb7317f6b07bd8ac78364747f95b86341", - "shasum": "" - }, - "require": { - "php": ">=5.3.29" - }, - "require-dev": { - "json-schema/json-schema-test-suite": "1.1.0", - "phpdocumentor/phpdocumentor": "~2", - "phpunit/phpunit": "~3.7" - }, - "bin": [ - "bin/validate-json" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.6.x-dev" - } - }, - "autoload": { - "psr-4": { - "JsonSchema\\": "src/JsonSchema/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Bruno Prieto Reis", - "email": "bruno.p.reis@gmail.com" - }, - { - "name": "Justin Rainbow", - "email": "justin.rainbow@gmail.com" - }, - { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch" - }, - { - "name": "Robert Schönthal", - "email": "seroscho@googlemail.com" - } - ], - "description": "A library to validate a json schema.", - "homepage": "https://github.com/justinrainbow/json-schema", - "keywords": [ - "json", - "schema" - ], - "time": "2016-01-25T15:43:01+00:00" - }, - { - "name": "kherge/version", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/kherge-abandoned/Version.git", - "reference": "f07cf83f8ce533be8f93d2893d96d674bbeb7e30" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/kherge-abandoned/Version/zipball/f07cf83f8ce533be8f93d2893d96d674bbeb7e30", - "reference": "f07cf83f8ce533be8f93d2893d96d674bbeb7e30", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "psr-0": { - "KevinGH\\Version": "src/lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Kevin Herrera", - "email": "me@kevingh.com" - } - ], - "description": "A parsing and comparison library for semantic versioning.", - "homepage": "http://github.com/kherge/Version", - "abandoned": true, - "time": "2012-08-16T17:13:03+00:00" - }, - { - "name": "monolog/monolog", - "version": "1.22.1", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/monolog.git", - "reference": "1e044bc4b34e91743943479f1be7a1d5eb93add0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/1e044bc4b34e91743943479f1be7a1d5eb93add0", - "reference": "1e044bc4b34e91743943479f1be7a1d5eb93add0", - "shasum": "" - }, - "require": { - "php": ">=5.3.0", - "psr/log": "~1.0" - }, - "provide": { - "psr/log-implementation": "1.0.0" - }, - "require-dev": { - "aws/aws-sdk-php": "^2.4.9 || ^3.0", - "doctrine/couchdb": "~1.0@dev", - "graylog2/gelf-php": "~1.0", - "jakub-onderka/php-parallel-lint": "0.9", - "php-amqplib/php-amqplib": "~2.4", - "php-console/php-console": "^3.1.3", - "phpunit/phpunit": "~4.5", - "phpunit/phpunit-mock-objects": "2.3.0", - "ruflin/elastica": ">=0.90 <3.0", - "sentry/sentry": "^0.13", - "swiftmailer/swiftmailer": "~5.3" - }, - "suggest": { - "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", - "doctrine/couchdb": "Allow sending log messages to a CouchDB server", - "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", - "ext-mongo": "Allow sending log messages to a MongoDB server", - "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", - "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver", - "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", - "php-console/php-console": "Allow sending log messages to Google Chrome", - "rollbar/rollbar": "Allow sending log messages to Rollbar", - "ruflin/elastica": "Allow sending log messages to an Elastic Search server", - "sentry/sentry": "Allow sending log messages to a Sentry server" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Monolog\\": "src/Monolog" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "Sends your logs to files, sockets, inboxes, databases and various web services", - "homepage": "http://github.com/Seldaek/monolog", - "keywords": [ - "log", - "logging", - "psr-3" - ], - "time": "2017-03-13T07:08:03+00:00" - }, - { - "name": "myclabs/deep-copy", - "version": "1.6.1", - "source": { - "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "8e6e04167378abf1ddb4d3522d8755c5fd90d102" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/8e6e04167378abf1ddb4d3522d8755c5fd90d102", - "reference": "8e6e04167378abf1ddb4d3522d8755c5fd90d102", - "shasum": "" - }, - "require": { - "php": ">=5.4.0" - }, - "require-dev": { - "doctrine/collections": "1.*", - "phpunit/phpunit": "~4.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Create deep copies (clones) of your objects", - "homepage": "https://github.com/myclabs/DeepCopy", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" - ], - "time": "2017-04-12T18:52:22+00:00" - }, - { - "name": "nikic/php-parser", - "version": "v1.4.1", - "source": { - "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "f78af2c9c86107aa1a34cd1dbb5bbe9eeb0d9f51" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f78af2c9c86107aa1a34cd1dbb5bbe9eeb0d9f51", - "reference": "f78af2c9c86107aa1a34cd1dbb5bbe9eeb0d9f51", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": ">=5.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4-dev" - } - }, - "autoload": { - "files": [ - "lib/bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Nikita Popov" - } - ], - "description": "A PHP parser written in PHP", - "keywords": [ - "parser", - "php" - ], - "time": "2015-09-19T14:15:08+00:00" - }, - { - "name": "phpcollection/phpcollection", - "version": "0.5.0", - "source": { - "type": "git", - "url": "https://github.com/schmittjoh/php-collection.git", - "reference": "f2bcff45c0da7c27991bbc1f90f47c4b7fb434a6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-collection/zipball/f2bcff45c0da7c27991bbc1f90f47c4b7fb434a6", - "reference": "f2bcff45c0da7c27991bbc1f90f47c4b7fb434a6", - "shasum": "" - }, - "require": { - "phpoption/phpoption": "1.*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.4-dev" - } - }, - "autoload": { - "psr-0": { - "PhpCollection": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache2" - ], - "authors": [ - { - "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "General-Purpose Collection Library for PHP", - "keywords": [ - "collection", - "list", - "map", - "sequence", - "set" - ], - "time": "2015-05-17T12:39:23+00:00" - }, - { - "name": "phpdocumentor/fileset", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/Fileset.git", - "reference": "bfa78d8fa9763dfce6d0e5d3730c1d8ab25d34b0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/Fileset/zipball/bfa78d8fa9763dfce6d0e5d3730c1d8ab25d34b0", - "reference": "bfa78d8fa9763dfce6d0e5d3730c1d8ab25d34b0", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "symfony/finder": "~2.1" - }, - "require-dev": { - "phpunit/phpunit": "~3.7" - }, - "type": "library", - "autoload": { - "psr-0": { - "phpDocumentor": [ - "src/", - "tests/unit/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Fileset component for collecting a set of files given directories and file paths", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "files", - "fileset", - "phpdoc" - ], - "time": "2013-08-06T21:07:42+00:00" - }, - { - "name": "phpdocumentor/graphviz", - "version": "1.0.4", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/GraphViz.git", - "reference": "a906a90a9f230535f25ea31caf81b2323956283f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/GraphViz/zipball/a906a90a9f230535f25ea31caf81b2323956283f", - "reference": "a906a90a9f230535f25ea31caf81b2323956283f", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.0" - }, - "type": "library", - "autoload": { - "psr-0": { - "phpDocumentor": [ - "src/", - "tests/unit" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "mike.vanriel@naenius.com" - } - ], - "time": "2016-02-02T13:00:08+00:00" - }, - { - "name": "phpdocumentor/phpdocumentor", - "version": "v2.9.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/phpDocumentor2.git", - "reference": "be607da0eef9b9249c43c5b4820d25d631c73667" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/phpDocumentor2/zipball/be607da0eef9b9249c43c5b4820d25d631c73667", - "reference": "be607da0eef9b9249c43c5b4820d25d631c73667", - "shasum": "" - }, - "require": { - "cilex/cilex": "~1.0", - "erusev/parsedown": "~1.0", - "herrera-io/phar-update": "1.0.3", - "jms/serializer": ">=0.12", - "monolog/monolog": "~1.6", - "php": ">=5.3.3", - "phpdocumentor/fileset": "~1.0", - "phpdocumentor/graphviz": "~1.0", - "phpdocumentor/reflection": "^3.0", - "phpdocumentor/reflection-docblock": "~2.0", - "symfony/config": "~2.3", - "symfony/console": "~2.3", - "symfony/event-dispatcher": "~2.1", - "symfony/process": "~2.0", - "symfony/stopwatch": "~2.3", - "symfony/validator": "~2.2", - "twig/twig": "~1.3", - "zendframework/zend-cache": "~2.1", - "zendframework/zend-config": "~2.1", - "zendframework/zend-filter": "~2.1", - "zendframework/zend-i18n": "~2.1", - "zendframework/zend-serializer": "~2.1", - "zendframework/zend-servicemanager": "~2.1", - "zendframework/zend-stdlib": "~2.1", - "zetacomponents/document": ">=1.3.1" - }, - "require-dev": { - "behat/behat": "~3.0", - "mikey179/vfsstream": "~1.2", - "mockery/mockery": "~0.9@dev", - "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "~1.4", - "symfony/expression-language": "~2.4" - }, - "suggest": { - "ext-twig": "Enabling the twig extension improves the generation of twig based templates.", - "ext-xslcache": "Enabling the XSLCache extension improves the generation of xml based templates." - }, - "bin": [ - "bin/phpdoc.php", - "bin/phpdoc" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-develop": "2.9-dev" - } - }, - "autoload": { - "psr-0": { - "phpDocumentor": [ - "src/", - "tests/unit/" - ], - "Cilex\\Provider": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Documentation Generator for PHP", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "api", - "application", - "dga", - "documentation", - "phpdoc" - ], - "time": "2016-05-22T09:50:56+00:00" - }, - { - "name": "phpdocumentor/reflection", - "version": "3.0.1", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/Reflection.git", - "reference": "793bfd92d9a0fc96ae9608fb3e947c3f59fb3a0d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/Reflection/zipball/793bfd92d9a0fc96ae9608fb3e947c3f59fb3a0d", - "reference": "793bfd92d9a0fc96ae9608fb3e947c3f59fb3a0d", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^1.0", - "php": ">=5.3.3", - "phpdocumentor/reflection-docblock": "~2.0", - "psr/log": "~1.0" - }, - "require-dev": { - "behat/behat": "~2.4", - "mockery/mockery": "~0.8", - "phpunit/phpunit": "~4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-0": { - "phpDocumentor": [ - "src/", - "tests/unit/", - "tests/mocks/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Reflection library to do Static Analysis for PHP Projects", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "time": "2016-05-21T08:42:32+00:00" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "2.0.5", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "e6a969a640b00d8daa3c66518b0405fb41ae0c4b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/e6a969a640b00d8daa3c66518b0405fb41ae0c4b", - "reference": "e6a969a640b00d8daa3c66518b0405fb41ae0c4b", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.0" - }, - "suggest": { - "dflydev/markdown": "~1.0", - "erusev/parsedown": "~1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-0": { - "phpDocumentor": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "mike.vanriel@naenius.com" - } - ], - "time": "2016-01-25T08:17:30+00:00" - }, - { - "name": "phpoption/phpoption", - "version": "1.5.0", - "source": { - "type": "git", - "url": "https://github.com/schmittjoh/php-option.git", - "reference": "94e644f7d2051a5f0fcf77d81605f152eecff0ed" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/94e644f7d2051a5f0fcf77d81605f152eecff0ed", - "reference": "94e644f7d2051a5f0fcf77d81605f152eecff0ed", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": "4.7.*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3-dev" - } - }, - "autoload": { - "psr-0": { - "PhpOption\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache2" - ], - "authors": [ - { - "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "Option Type for PHP", - "keywords": [ - "language", - "option", - "php", - "type" - ], - "time": "2015-07-25T16:39:46+00:00" - }, - { - "name": "phpspec/prophecy", - "version": "v1.7.0", - "source": { - "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "93d39f1f7f9326d746203c7c056f300f7f126073" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/93d39f1f7f9326d746203c7c056f300f7f126073", - "reference": "93d39f1f7f9326d746203c7c056f300f7f126073", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.0.2", - "php": "^5.3|^7.0", - "phpdocumentor/reflection-docblock": "^2.0|^3.0.2", - "sebastian/comparator": "^1.1|^2.0", - "sebastian/recursion-context": "^1.0|^2.0|^3.0" - }, - "require-dev": { - "phpspec/phpspec": "^2.5|^3.2", - "phpunit/phpunit": "^4.8 || ^5.6.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.6.x-dev" - } - }, - "autoload": { - "psr-0": { - "Prophecy\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ], - "time": "2017-03-02T20:05:34+00:00" - }, - { - "name": "phpstan/phpstan-shim", - "version": "0.8.4", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpstan-shim.git", - "reference": "0f18bcb91b7ee29571fab315d334752b123dc003" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-shim/zipball/0f18bcb91b7ee29571fab315d334752b123dc003", - "reference": "0f18bcb91b7ee29571fab315d334752b123dc003", - "shasum": "" - }, - "require": { - "php": "~7.0" - }, - "provide": { - "phpstan/phpstan": "0.8" - }, - "bin": [ - "phpstan.phar" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.8-dev" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "PHPStan Phar distribution", - "time": "2017-08-25T08:33:08+00:00" - }, - { - "name": "phpunit/php-code-coverage", - "version": "4.0.8", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ef7b2f56815df854e66ceaee8ebe9393ae36a40d", - "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-xmlwriter": "*", - "php": "^5.6 || ^7.0", - "phpunit/php-file-iterator": "^1.3", - "phpunit/php-text-template": "^1.2", - "phpunit/php-token-stream": "^1.4.2 || ^2.0", - "sebastian/code-unit-reverse-lookup": "^1.0", - "sebastian/environment": "^1.3.2 || ^2.0", - "sebastian/version": "^1.0 || ^2.0" - }, - "require-dev": { - "ext-xdebug": "^2.1.4", - "phpunit/phpunit": "^5.7" - }, - "suggest": { - "ext-xdebug": "^2.5.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "time": "2017-04-02T07:44:40+00:00" - }, - { - "name": "phpunit/php-file-iterator", - "version": "1.4.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3cc8f69b3028d0f96a9078e6295d86e9bf019be5", - "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "time": "2016-10-03T07:40:28+00:00" - }, - { - "name": "phpunit/php-text-template", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], - "time": "2015-06-21T13:50:34+00:00" - }, - { - "name": "phpunit/php-timer", - "version": "1.0.9", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", - "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", - "shasum": "" - }, - "require": { - "php": "^5.3.3 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], - "time": "2017-02-26T11:10:40+00:00" - }, - { - "name": "phpunit/php-token-stream", - "version": "1.4.11", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "e03f8f67534427a787e21a385a67ec3ca6978ea7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/e03f8f67534427a787e21a385a67ec3ca6978ea7", - "reference": "e03f8f67534427a787e21a385a67ec3ca6978ea7", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Wrapper around PHP's tokenizer extension.", - "homepage": "https://github.com/sebastianbergmann/php-token-stream/", - "keywords": [ - "tokenizer" - ], - "time": "2017-02-27T10:12:30+00:00" - }, - { - "name": "phpunit/phpunit", - "version": "5.7.20", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "3cb94a5f8c07a03c8b7527ed7468a2926203f58b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3cb94a5f8c07a03c8b7527ed7468a2926203f58b", - "reference": "3cb94a5f8c07a03c8b7527ed7468a2926203f58b", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "myclabs/deep-copy": "~1.3", - "php": "^5.6 || ^7.0", - "phpspec/prophecy": "^1.6.2", - "phpunit/php-code-coverage": "^4.0.4", - "phpunit/php-file-iterator": "~1.4", - "phpunit/php-text-template": "~1.2", - "phpunit/php-timer": "^1.0.6", - "phpunit/phpunit-mock-objects": "^3.2", - "sebastian/comparator": "^1.2.4", - "sebastian/diff": "^1.4.3", - "sebastian/environment": "^1.3.4 || ^2.0", - "sebastian/exporter": "~2.0", - "sebastian/global-state": "^1.1", - "sebastian/object-enumerator": "~2.0", - "sebastian/resource-operations": "~1.0", - "sebastian/version": "~1.0.3|~2.0", - "symfony/yaml": "~2.1|~3.0" - }, - "conflict": { - "phpdocumentor/reflection-docblock": "3.0.2" - }, - "require-dev": { - "ext-pdo": "*" - }, - "suggest": { - "ext-xdebug": "*", - "phpunit/php-invoker": "~1.1" - }, - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.7.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], - "time": "2017-05-22T07:42:55+00:00" - }, - { - "name": "phpunit/phpunit-mock-objects", - "version": "3.4.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", - "reference": "3ab72b65b39b491e0c011e2e09bb2206c2aa8e24" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/3ab72b65b39b491e0c011e2e09bb2206c2aa8e24", - "reference": "3ab72b65b39b491e0c011e2e09bb2206c2aa8e24", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.0.2", - "php": "^5.6 || ^7.0", - "phpunit/php-text-template": "^1.2", - "sebastian/exporter": "^1.2 || ^2.0" - }, - "conflict": { - "phpunit/phpunit": "<5.4.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.4" - }, - "suggest": { - "ext-soap": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.2.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "Mock Object library for PHPUnit", - "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", - "keywords": [ - "mock", - "xunit" - ], - "time": "2016-12-08T20:27:08+00:00" - }, - { - "name": "pimple/pimple", - "version": "v1.1.1", - "source": { - "type": "git", - "url": "https://github.com/silexphp/Pimple.git", - "reference": "2019c145fe393923f3441b23f29bbdfaa5c58c4d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/silexphp/Pimple/zipball/2019c145fe393923f3441b23f29bbdfaa5c58c4d", - "reference": "2019c145fe393923f3441b23f29bbdfaa5c58c4d", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-0": { - "Pimple": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "Pimple is a simple Dependency Injection Container for PHP 5.3", - "homepage": "http://pimple.sensiolabs.org", - "keywords": [ - "container", - "dependency injection" - ], - "time": "2013-11-22T08:30:29+00:00" - }, - { - "name": "psr/container", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], - "time": "2017-02-14T16:28:37+00:00" - }, - { - "name": "psr/log", - "version": "1.0.2", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", - "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "Psr/Log/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "time": "2016-10-10T12:19:37+00:00" - }, - { - "name": "sebastian/code-unit-reverse-lookup", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", - "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7 || ^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "time": "2017-03-04T06:30:41+00:00" - }, - { - "name": "sebastian/comparator", - "version": "1.2.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", - "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "sebastian/diff": "~1.2", - "sebastian/exporter": "~1.2 || ~2.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "http://www.github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], - "time": "2017-01-29T09:50:25+00:00" - }, - { - "name": "sebastian/diff", - "version": "1.4.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4", - "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4", - "shasum": "" - }, - "require": { - "php": "^5.3.3 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff" - ], - "time": "2017-05-22T07:24:03+00:00" - }, - { - "name": "sebastian/environment", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5795ffe5dc5b02460c3e34222fee8cbe245d8fac", - "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], - "time": "2016-11-26T07:53:53+00:00" - }, - { - "name": "sebastian/exporter", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4", - "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "sebastian/recursion-context": "~2.0" - }, - "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "~4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], - "time": "2016-11-19T08:54:04+00:00" - }, - { - "name": "sebastian/global-state", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4", - "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.2" - }, - "suggest": { - "ext-uopz": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], - "time": "2015-10-12T03:26:01+00:00" - }, - { - "name": "sebastian/object-enumerator", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1311872ac850040a79c3c058bea3e22d0f09cbb7", - "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7", - "shasum": "" - }, - "require": { - "php": ">=5.6", - "sebastian/recursion-context": "~2.0" - }, - "require-dev": { - "phpunit/phpunit": "~5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Traverses array structures and object graphs to enumerate all referenced objects", - "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "time": "2017-02-18T15:18:39+00:00" - }, - { - "name": "sebastian/recursion-context", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/2c3ba150cbec723aa057506e73a8d33bdb286c9a", - "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2016-11-19T07:33:16+00:00" - }, - { - "name": "sebastian/resource-operations", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", - "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", - "shasum": "" - }, - "require": { - "php": ">=5.6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides a list of PHP built-in functions that operate on resources", - "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "time": "2015-07-28T20:34:47+00:00" - }, - { - "name": "sebastian/version", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "time": "2016-10-03T07:35:21+00:00" - }, - { - "name": "seld/jsonlint", - "version": "1.6.0", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "791f8c594f300d246cdf01c6b3e1e19611e301d8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/791f8c594f300d246cdf01c6b3e1e19611e301d8", - "reference": "791f8c594f300d246cdf01c6b3e1e19611e301d8", - "shasum": "" - }, - "require": { - "php": "^5.3 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.5" - }, - "bin": [ - "bin/jsonlint" - ], - "type": "library", - "autoload": { - "psr-4": { - "Seld\\JsonLint\\": "src/Seld/JsonLint/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "JSON Linter", - "keywords": [ - "json", - "linter", - "parser", - "validator" - ], - "time": "2017-03-06T16:42:24+00:00" - }, - { - "name": "squizlabs/php_codesniffer", - "version": "2.9.1", - "source": { - "type": "git", - "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "dcbed1074f8244661eecddfc2a675430d8d33f62" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/dcbed1074f8244661eecddfc2a675430d8d33f62", - "reference": "dcbed1074f8244661eecddfc2a675430d8d33f62", - "shasum": "" - }, - "require": { - "ext-simplexml": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": ">=5.1.2" - }, - "require-dev": { - "phpunit/phpunit": "~4.0" - }, - "bin": [ - "scripts/phpcs", - "scripts/phpcbf" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, - "autoload": { - "classmap": [ - "CodeSniffer.php", - "CodeSniffer/CLI.php", - "CodeSniffer/Exception.php", - "CodeSniffer/File.php", - "CodeSniffer/Fixer.php", - "CodeSniffer/Report.php", - "CodeSniffer/Reporting.php", - "CodeSniffer/Sniff.php", - "CodeSniffer/Tokens.php", - "CodeSniffer/Reports/", - "CodeSniffer/Tokenizers/", - "CodeSniffer/DocGenerators/", - "CodeSniffer/Standards/AbstractPatternSniff.php", - "CodeSniffer/Standards/AbstractScopeSniff.php", - "CodeSniffer/Standards/AbstractVariableSniff.php", - "CodeSniffer/Standards/IncorrectPatternException.php", - "CodeSniffer/Standards/Generic/Sniffs/", - "CodeSniffer/Standards/MySource/Sniffs/", - "CodeSniffer/Standards/PEAR/Sniffs/", - "CodeSniffer/Standards/PSR1/Sniffs/", - "CodeSniffer/Standards/PSR2/Sniffs/", - "CodeSniffer/Standards/Squiz/Sniffs/", - "CodeSniffer/Standards/Zend/Sniffs/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Greg Sherwood", - "role": "lead" - } - ], - "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", - "homepage": "http://www.squizlabs.com/php-codesniffer", - "keywords": [ - "phpcs", - "standards" - ], - "time": "2017-05-22T02:43:20+00:00" - }, - { - "name": "symfony/config", - "version": "v2.8.22", - "source": { - "type": "git", - "url": "https://github.com/symfony/config.git", - "reference": "0b8541d18507d10204a08384640ff6df3c739ebe" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/0b8541d18507d10204a08384640ff6df3c739ebe", - "reference": "0b8541d18507d10204a08384640ff6df3c739ebe", - "shasum": "" - }, - "require": { - "php": ">=5.3.9", - "symfony/filesystem": "~2.3|~3.0.0" - }, - "require-dev": { - "symfony/yaml": "~2.7|~3.0.0" - }, - "suggest": { - "symfony/yaml": "To use the yaml reference dumper" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.8-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Config\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Config Component", - "homepage": "https://symfony.com", - "time": "2017-04-12T14:07:15+00:00" - }, - { - "name": "symfony/console", - "version": "v2.8.22", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "3ef6ef64abecd566d551d9e7f6393ac6e93b2462" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/3ef6ef64abecd566d551d9e7f6393ac6e93b2462", - "reference": "3ef6ef64abecd566d551d9e7f6393ac6e93b2462", - "shasum": "" - }, - "require": { - "php": ">=5.3.9", - "symfony/debug": "^2.7.2|~3.0.0", - "symfony/polyfill-mbstring": "~1.0" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/event-dispatcher": "~2.1|~3.0.0", - "symfony/process": "~2.1|~3.0.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/process": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.8-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Console Component", - "homepage": "https://symfony.com", - "time": "2017-06-02T14:36:56+00:00" - }, - { - "name": "symfony/debug", - "version": "v3.0.9", - "source": { - "type": "git", - "url": "https://github.com/symfony/debug.git", - "reference": "697c527acd9ea1b2d3efac34d9806bf255278b0a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/697c527acd9ea1b2d3efac34d9806bf255278b0a", - "reference": "697c527acd9ea1b2d3efac34d9806bf255278b0a", - "shasum": "" - }, - "require": { - "php": ">=5.5.9", - "psr/log": "~1.0" - }, - "conflict": { - "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" - }, - "require-dev": { - "symfony/class-loader": "~2.8|~3.0", - "symfony/http-kernel": "~2.8|~3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Debug\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Debug Component", - "homepage": "https://symfony.com", - "time": "2016-07-30T07:22:48+00:00" - }, - { - "name": "symfony/event-dispatcher", - "version": "v2.8.22", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "1377400fd641d7d1935981546aaef780ecd5bf6d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/1377400fd641d7d1935981546aaef780ecd5bf6d", - "reference": "1377400fd641d7d1935981546aaef780ecd5bf6d", - "shasum": "" - }, - "require": { - "php": ">=5.3.9" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/config": "^2.0.5|~3.0.0", - "symfony/dependency-injection": "~2.6|~3.0.0", - "symfony/expression-language": "~2.6|~3.0.0", - "symfony/stopwatch": "~2.3|~3.0.0" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.8-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\EventDispatcher\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony EventDispatcher Component", - "homepage": "https://symfony.com", - "time": "2017-06-02T07:47:27+00:00" - }, - { - "name": "symfony/filesystem", - "version": "v3.0.9", - "source": { - "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "b2da5009d9bacbd91d83486aa1f44c793a8c380d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/b2da5009d9bacbd91d83486aa1f44c793a8c380d", - "reference": "b2da5009d9bacbd91d83486aa1f44c793a8c380d", - "shasum": "" - }, - "require": { - "php": ">=5.5.9" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Filesystem\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Filesystem Component", - "homepage": "https://symfony.com", - "time": "2016-07-20T05:43:46+00:00" - }, - { - "name": "symfony/finder", - "version": "v2.8.22", - "source": { - "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "4f4e84811004e065a3bb5ceeb1d9aa592630f9ad" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/4f4e84811004e065a3bb5ceeb1d9aa592630f9ad", - "reference": "4f4e84811004e065a3bb5ceeb1d9aa592630f9ad", - "shasum": "" - }, - "require": { - "php": ">=5.3.9" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.8-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Finder\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Finder Component", - "homepage": "https://symfony.com", - "time": "2017-06-01T20:52:29+00:00" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.4.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "f29dca382a6485c3cbe6379f0c61230167681937" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/f29dca382a6485c3cbe6379f0c61230167681937", - "reference": "f29dca382a6485c3cbe6379f0c61230167681937", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "time": "2017-06-09T14:24:12+00:00" - }, - { - "name": "symfony/process", - "version": "v2.8.22", - "source": { - "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "d54232f5682fda2f8bbebff7c81b864646867ab9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/d54232f5682fda2f8bbebff7c81b864646867ab9", - "reference": "d54232f5682fda2f8bbebff7c81b864646867ab9", - "shasum": "" - }, - "require": { - "php": ">=5.3.9" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.8-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Process\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Process Component", - "homepage": "https://symfony.com", - "time": "2017-05-08T01:19:21+00:00" - }, - { - "name": "symfony/stopwatch", - "version": "v2.8.22", - "source": { - "type": "git", - "url": "https://github.com/symfony/stopwatch.git", - "reference": "e02577b841394a78306d7b547701bb7bb705bad5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/e02577b841394a78306d7b547701bb7bb705bad5", - "reference": "e02577b841394a78306d7b547701bb7bb705bad5", - "shasum": "" - }, - "require": { - "php": ">=5.3.9" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.8-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Stopwatch\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Stopwatch Component", - "homepage": "https://symfony.com", - "time": "2017-04-12T14:07:15+00:00" - }, - { - "name": "symfony/translation", - "version": "v3.0.9", - "source": { - "type": "git", - "url": "https://github.com/symfony/translation.git", - "reference": "eee6c664853fd0576f21ae25725cfffeafe83f26" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/eee6c664853fd0576f21ae25725cfffeafe83f26", - "reference": "eee6c664853fd0576f21ae25725cfffeafe83f26", - "shasum": "" - }, - "require": { - "php": ">=5.5.9", - "symfony/polyfill-mbstring": "~1.0" - }, - "conflict": { - "symfony/config": "<2.8" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/config": "~2.8|~3.0", - "symfony/intl": "~2.8|~3.0", - "symfony/yaml": "~2.8|~3.0" - }, - "suggest": { - "psr/log": "To use logging capability in translator", - "symfony/config": "", - "symfony/yaml": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Translation\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Translation Component", - "homepage": "https://symfony.com", - "time": "2016-07-30T07:22:48+00:00" - }, - { - "name": "symfony/validator", - "version": "v2.8.22", - "source": { - "type": "git", - "url": "https://github.com/symfony/validator.git", - "reference": "9f323f762ad21bfb9df7c1afacbdd8addf0f8c50" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/9f323f762ad21bfb9df7c1afacbdd8addf0f8c50", - "reference": "9f323f762ad21bfb9df7c1afacbdd8addf0f8c50", - "shasum": "" - }, - "require": { - "php": ">=5.3.9", - "symfony/polyfill-mbstring": "~1.0", - "symfony/translation": "~2.4|~3.0.0" - }, - "require-dev": { - "doctrine/annotations": "~1.0", - "doctrine/cache": "~1.0", - "egulias/email-validator": "^1.2.1", - "symfony/config": "~2.2|~3.0.0", - "symfony/expression-language": "~2.4|~3.0.0", - "symfony/http-foundation": "~2.3|~3.0.0", - "symfony/intl": "~2.7.25|^2.8.18|~3.2.5", - "symfony/property-access": "~2.3|~3.0.0", - "symfony/yaml": "^2.0.5|~3.0.0" - }, - "suggest": { - "doctrine/annotations": "For using the annotation mapping. You will also need doctrine/cache.", - "doctrine/cache": "For using the default cached annotation reader and metadata cache.", - "egulias/email-validator": "Strict (RFC compliant) email validation", - "symfony/config": "", - "symfony/expression-language": "For using the 2.4 Expression validator", - "symfony/http-foundation": "", - "symfony/intl": "", - "symfony/property-access": "For using the 2.4 Validator API", - "symfony/yaml": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.8-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Validator\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Validator Component", - "homepage": "https://symfony.com", - "time": "2017-06-02T14:36:56+00:00" - }, - { - "name": "symfony/yaml", - "version": "v3.3.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "9752a30000a8ca9f4b34b5227d15d0101b96b063" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/9752a30000a8ca9f4b34b5227d15d0101b96b063", - "reference": "9752a30000a8ca9f4b34b5227d15d0101b96b063", - "shasum": "" - }, - "require": { - "php": ">=5.5.9" - }, - "require-dev": { - "symfony/console": "~2.8|~3.0" - }, - "suggest": { - "symfony/console": "For validating YAML files using the lint command" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.3-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Yaml\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Yaml Component", - "homepage": "https://symfony.com", - "time": "2017-06-02T22:05:06+00:00" - }, - { - "name": "twig/twig", - "version": "v1.34.3", - "source": { - "type": "git", - "url": "https://github.com/twigphp/Twig.git", - "reference": "451c6f4197e113e24c1c85bc3fc8c2d77adeff2e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/451c6f4197e113e24c1c85bc3fc8c2d77adeff2e", - "reference": "451c6f4197e113e24c1c85bc3fc8c2d77adeff2e", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "psr/container": "^1.0", - "symfony/debug": "~2.7", - "symfony/phpunit-bridge": "~3.3@dev" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.34-dev" - } - }, - "autoload": { - "psr-0": { - "Twig_": "lib/" - }, - "psr-4": { - "Twig\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" - }, - { - "name": "Armin Ronacher", - "email": "armin.ronacher@active-4.com", - "role": "Project Founder" - }, - { - "name": "Twig Team", - "homepage": "http://twig.sensiolabs.org/contributors", - "role": "Contributors" - } - ], - "description": "Twig, the flexible, fast, and secure template language for PHP", - "homepage": "http://twig.sensiolabs.org", - "keywords": [ - "templating" - ], - "time": "2017-06-07T18:45:17+00:00" - }, - { - "name": "zendframework/zend-cache", - "version": "2.7.2", - "source": { - "type": "git", - "url": "https://github.com/zendframework/zend-cache.git", - "reference": "c98331b96d3b9d9b24cf32d02660602edb34d039" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-cache/zipball/c98331b96d3b9d9b24cf32d02660602edb34d039", - "reference": "c98331b96d3b9d9b24cf32d02660602edb34d039", - "shasum": "" - }, - "require": { - "php": "^5.5 || ^7.0", - "zendframework/zend-eventmanager": "^2.6.2 || ^3.0", - "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3", - "zendframework/zend-stdlib": "^2.7 || ^3.0" - }, - "require-dev": { - "phpbench/phpbench": "^0.10.0", - "phpunit/phpunit": "^4.8", - "zendframework/zend-coding-standard": "~1.0.0", - "zendframework/zend-serializer": "^2.6", - "zendframework/zend-session": "^2.6.2" - }, - "suggest": { - "ext-apc": "APC or compatible extension, to use the APC storage adapter", - "ext-apcu": "APCU >= 5.1.0, to use the APCu storage adapter", - "ext-dba": "DBA, to use the DBA storage adapter", - "ext-memcache": "Memcache >= 2.0.0 to use the Memcache storage adapter", - "ext-memcached": "Memcached >= 1.0.0 to use the Memcached storage adapter", - "ext-mongo": "Mongo, to use MongoDb storage adapter", - "ext-redis": "Redis, to use Redis storage adapter", - "ext-wincache": "WinCache, to use the WinCache storage adapter", - "ext-xcache": "XCache, to use the XCache storage adapter", - "mongofill/mongofill": "Alternative to ext-mongo - a pure PHP implementation designed as a drop in replacement", - "zendframework/zend-serializer": "Zend\\Serializer component", - "zendframework/zend-session": "Zend\\Session component" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev", - "dev-develop": "2.8-dev" - }, - "zf": { - "component": "Zend\\Cache", - "config-provider": "Zend\\Cache\\ConfigProvider" - } - }, - "autoload": { - "psr-4": { - "Zend\\Cache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "provides a generic way to cache any data", - "homepage": "https://github.com/zendframework/zend-cache", - "keywords": [ - "cache", - "zf2" - ], - "time": "2016-12-16T11:35:47+00:00" - }, - { - "name": "zendframework/zend-config", - "version": "2.6.0", - "source": { - "type": "git", - "url": "https://github.com/zendframework/zend-config.git", - "reference": "2920e877a9f6dca9fa8f6bd3b1ffc2e19bb1e30d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-config/zipball/2920e877a9f6dca9fa8f6bd3b1ffc2e19bb1e30d", - "reference": "2920e877a9f6dca9fa8f6bd3b1ffc2e19bb1e30d", - "shasum": "" - }, - "require": { - "php": "^5.5 || ^7.0", - "zendframework/zend-stdlib": "^2.7 || ^3.0" - }, - "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "zendframework/zend-filter": "^2.6", - "zendframework/zend-i18n": "^2.5", - "zendframework/zend-json": "^2.6.1", - "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3" - }, - "suggest": { - "zendframework/zend-filter": "Zend\\Filter component", - "zendframework/zend-i18n": "Zend\\I18n component", - "zendframework/zend-json": "Zend\\Json to use the Json reader or writer classes", - "zendframework/zend-servicemanager": "Zend\\ServiceManager for use with the Config Factory to retrieve reader and writer instances" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.6-dev", - "dev-develop": "2.7-dev" - } - }, - "autoload": { - "psr-4": { - "Zend\\Config\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "provides a nested object property based user interface for accessing this configuration data within application code", - "homepage": "https://github.com/zendframework/zend-config", - "keywords": [ - "config", - "zf2" - ], - "time": "2016-02-04T23:01:10+00:00" - }, - { - "name": "zendframework/zend-eventmanager", - "version": "3.1.0", - "source": { - "type": "git", - "url": "https://github.com/zendframework/zend-eventmanager.git", - "reference": "c3bce7b7d47c54040b9ae51bc55491c72513b75d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-eventmanager/zipball/c3bce7b7d47c54040b9ae51bc55491c72513b75d", - "reference": "c3bce7b7d47c54040b9ae51bc55491c72513b75d", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "require-dev": { - "athletic/athletic": "^0.1", - "container-interop/container-interop": "^1.1.0", - "phpunit/phpunit": "^5.6", - "zendframework/zend-coding-standard": "~1.0.0", - "zendframework/zend-stdlib": "^2.7.3 || ^3.0" - }, - "suggest": { - "container-interop/container-interop": "^1.1.0, to use the lazy listeners feature", - "zendframework/zend-stdlib": "^2.7.3 || ^3.0, to use the FilterChain feature" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1-dev", - "dev-develop": "3.2-dev" - } - }, - "autoload": { - "psr-4": { - "Zend\\EventManager\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Trigger and listen to events within a PHP application", - "homepage": "https://github.com/zendframework/zend-eventmanager", - "keywords": [ - "event", - "eventmanager", - "events", - "zf2" - ], - "time": "2016-12-19T21:47:12+00:00" - }, - { - "name": "zendframework/zend-filter", - "version": "2.7.2", - "source": { - "type": "git", - "url": "https://github.com/zendframework/zend-filter.git", - "reference": "b8d0ff872f126631bf63a932e33aa2d22d467175" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-filter/zipball/b8d0ff872f126631bf63a932e33aa2d22d467175", - "reference": "b8d0ff872f126631bf63a932e33aa2d22d467175", - "shasum": "" - }, - "require": { - "php": "^5.5 || ^7.0", - "zendframework/zend-stdlib": "^2.7 || ^3.0" - }, - "require-dev": { - "pear/archive_tar": "^1.4", - "phpunit/phpunit": "^6.0.10 || ^5.7.17", - "zendframework/zend-coding-standard": "~1.0.0", - "zendframework/zend-crypt": "^2.6 || ^3.0", - "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3", - "zendframework/zend-uri": "^2.5" - }, - "suggest": { - "zendframework/zend-crypt": "Zend\\Crypt component, for encryption filters", - "zendframework/zend-i18n": "Zend\\I18n component for filters depending on i18n functionality", - "zendframework/zend-servicemanager": "Zend\\ServiceManager component, for using the filter chain functionality", - "zendframework/zend-uri": "Zend\\Uri component, for the UriNormalize filter" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev", - "dev-develop": "2.8-dev" - }, - "zf": { - "component": "Zend\\Filter", - "config-provider": "Zend\\Filter\\ConfigProvider" - } - }, - "autoload": { - "psr-4": { - "Zend\\Filter\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "provides a set of commonly needed data filters", - "homepage": "https://github.com/zendframework/zend-filter", - "keywords": [ - "filter", - "zf2" - ], - "time": "2017-05-17T20:56:17+00:00" - }, - { - "name": "zendframework/zend-hydrator", - "version": "1.1.0", - "source": { - "type": "git", - "url": "https://github.com/zendframework/zend-hydrator.git", - "reference": "22652e1661a5a10b3f564cf7824a2206cf5a4a65" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-hydrator/zipball/22652e1661a5a10b3f564cf7824a2206cf5a4a65", - "reference": "22652e1661a5a10b3f564cf7824a2206cf5a4a65", - "shasum": "" - }, - "require": { - "php": "^5.5 || ^7.0", - "zendframework/zend-stdlib": "^2.7 || ^3.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "^2.0@dev", - "zendframework/zend-eventmanager": "^2.6.2 || ^3.0", - "zendframework/zend-filter": "^2.6", - "zendframework/zend-inputfilter": "^2.6", - "zendframework/zend-serializer": "^2.6.1", - "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3" - }, - "suggest": { - "zendframework/zend-eventmanager": "^2.6.2 || ^3.0, to support aggregate hydrator usage", - "zendframework/zend-filter": "^2.6, to support naming strategy hydrator usage", - "zendframework/zend-serializer": "^2.6.1, to use the SerializableStrategy", - "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3, to support hydrator plugin manager usage" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-release-1.0": "1.0-dev", - "dev-release-1.1": "1.1-dev", - "dev-master": "2.0-dev", - "dev-develop": "2.1-dev" - } - }, - "autoload": { - "psr-4": { - "Zend\\Hydrator\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "homepage": "https://github.com/zendframework/zend-hydrator", - "keywords": [ - "hydrator", - "zf2" - ], - "time": "2016-02-18T22:38:26+00:00" - }, - { - "name": "zendframework/zend-i18n", - "version": "2.7.4", - "source": { - "type": "git", - "url": "https://github.com/zendframework/zend-i18n.git", - "reference": "d3431e29cc00c2a1c6704e601d4371dbf24f6a31" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-i18n/zipball/d3431e29cc00c2a1c6704e601d4371dbf24f6a31", - "reference": "d3431e29cc00c2a1c6704e601d4371dbf24f6a31", - "shasum": "" - }, - "require": { - "php": "^7.0 || ^5.6", - "zendframework/zend-stdlib": "^2.7 || ^3.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0.8 || ^5.7.15", - "zendframework/zend-cache": "^2.6.1", - "zendframework/zend-coding-standard": "~1.0.0", - "zendframework/zend-config": "^2.6", - "zendframework/zend-eventmanager": "^2.6.2 || ^3.0", - "zendframework/zend-filter": "^2.6.1", - "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3", - "zendframework/zend-validator": "^2.6", - "zendframework/zend-view": "^2.6.3" - }, - "suggest": { - "ext-intl": "Required for most features of Zend\\I18n; included in default builds of PHP", - "zendframework/zend-cache": "Zend\\Cache component", - "zendframework/zend-config": "Zend\\Config component", - "zendframework/zend-eventmanager": "You should install this package to use the events in the translator", - "zendframework/zend-filter": "You should install this package to use the provided filters", - "zendframework/zend-i18n-resources": "Translation resources", - "zendframework/zend-servicemanager": "Zend\\ServiceManager component", - "zendframework/zend-validator": "You should install this package to use the provided validators", - "zendframework/zend-view": "You should install this package to use the provided view helpers" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev", - "dev-develop": "2.8-dev" - }, - "zf": { - "component": "Zend\\I18n", - "config-provider": "Zend\\I18n\\ConfigProvider" - } - }, - "autoload": { - "psr-4": { - "Zend\\I18n\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "homepage": "https://github.com/zendframework/zend-i18n", - "keywords": [ - "i18n", - "zf2" - ], - "time": "2017-05-17T17:00:12+00:00" - }, - { - "name": "zendframework/zend-json", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/zendframework/zend-json.git", - "reference": "f42a1588e75c2a3e338cd94c37906231e616daab" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-json/zipball/f42a1588e75c2a3e338cd94c37906231e616daab", - "reference": "f42a1588e75c2a3e338cd94c37906231e616daab", - "shasum": "" - }, - "require": { - "php": "^5.5 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "^2.3", - "zendframework/zend-stdlib": "^2.7 || ^3.0" - }, - "suggest": { - "zendframework/zend-json-server": "For implementing JSON-RPC servers", - "zendframework/zend-xml2json": "For converting XML documents to JSON" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev", - "dev-develop": "3.1-dev" - } - }, - "autoload": { - "psr-4": { - "Zend\\Json\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "provides convenience methods for serializing native PHP to JSON and decoding JSON to native PHP", - "homepage": "https://github.com/zendframework/zend-json", - "keywords": [ - "json", - "zf2" - ], - "time": "2016-04-01T02:34:00+00:00" - }, - { - "name": "zendframework/zend-serializer", - "version": "2.8.0", - "source": { - "type": "git", - "url": "https://github.com/zendframework/zend-serializer.git", - "reference": "ff74ea020f5f90866eb28365327e9bc765a61a6e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-serializer/zipball/ff74ea020f5f90866eb28365327e9bc765a61a6e", - "reference": "ff74ea020f5f90866eb28365327e9bc765a61a6e", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0", - "zendframework/zend-json": "^2.5 || ^3.0", - "zendframework/zend-stdlib": "^2.7 || ^3.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.5", - "squizlabs/php_codesniffer": "^2.3.1", - "zendframework/zend-math": "^2.6", - "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3" - }, - "suggest": { - "zendframework/zend-math": "(^2.6 || ^3.0) To support Python Pickle serialization", - "zendframework/zend-servicemanager": "(^2.7.5 || ^3.0.3) To support plugin manager support" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.8-dev", - "dev-develop": "2.9-dev" - }, - "zf": { - "component": "Zend\\Serializer", - "config-provider": "Zend\\Serializer\\ConfigProvider" - } - }, - "autoload": { - "psr-4": { - "Zend\\Serializer\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "provides an adapter based interface to simply generate storable representation of PHP types by different facilities, and recover", - "homepage": "https://github.com/zendframework/zend-serializer", - "keywords": [ - "serializer", - "zf2" - ], - "time": "2016-06-21T17:01:55+00:00" - }, - { - "name": "zendframework/zend-servicemanager", - "version": "2.7.8", - "source": { - "type": "git", - "url": "https://github.com/zendframework/zend-servicemanager.git", - "reference": "2ae3b6e4978ec2e9ff52352e661946714ed989f9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-servicemanager/zipball/2ae3b6e4978ec2e9ff52352e661946714ed989f9", - "reference": "2ae3b6e4978ec2e9ff52352e661946714ed989f9", - "shasum": "" - }, - "require": { - "container-interop/container-interop": "~1.0", - "php": "^5.5 || ^7.0" - }, - "require-dev": { - "athletic/athletic": "dev-master", - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "zendframework/zend-di": "~2.5", - "zendframework/zend-mvc": "~2.5" - }, - "suggest": { - "ocramius/proxy-manager": "ProxyManager 0.5.* to handle lazy initialization of services", - "zendframework/zend-di": "Zend\\Di component" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev", - "dev-develop": "3.0-dev" - } - }, - "autoload": { - "psr-4": { - "Zend\\ServiceManager\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "homepage": "https://github.com/zendframework/zend-servicemanager", - "keywords": [ - "servicemanager", - "zf2" - ], - "time": "2016-12-19T19:14:29+00:00" - }, - { - "name": "zendframework/zend-stdlib", - "version": "2.7.7", - "source": { - "type": "git", - "url": "https://github.com/zendframework/zend-stdlib.git", - "reference": "0e44eb46788f65e09e077eb7f44d2659143bcc1f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-stdlib/zipball/0e44eb46788f65e09e077eb7f44d2659143bcc1f", - "reference": "0e44eb46788f65e09e077eb7f44d2659143bcc1f", - "shasum": "" - }, - "require": { - "php": "^5.5 || ^7.0", - "zendframework/zend-hydrator": "~1.1" - }, - "require-dev": { - "athletic/athletic": "~0.1", - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "zendframework/zend-config": "~2.5", - "zendframework/zend-eventmanager": "~2.5", - "zendframework/zend-filter": "~2.5", - "zendframework/zend-inputfilter": "~2.5", - "zendframework/zend-serializer": "~2.5", - "zendframework/zend-servicemanager": "~2.5" - }, - "suggest": { - "zendframework/zend-eventmanager": "To support aggregate hydrator usage", - "zendframework/zend-filter": "To support naming strategy hydrator usage", - "zendframework/zend-serializer": "Zend\\Serializer component", - "zendframework/zend-servicemanager": "To support hydrator plugin manager usage" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-release-2.7": "2.7-dev", - "dev-master": "3.0-dev", - "dev-develop": "3.1-dev" - } - }, - "autoload": { - "psr-4": { - "Zend\\Stdlib\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "homepage": "https://github.com/zendframework/zend-stdlib", - "keywords": [ - "stdlib", - "zf2" - ], - "time": "2016-04-12T21:17:31+00:00" - }, - { - "name": "zetacomponents/base", - "version": "1.9", - "source": { - "type": "git", - "url": "https://github.com/zetacomponents/Base.git", - "reference": "f20df24e8de3e48b6b69b2503f917e457281e687" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zetacomponents/Base/zipball/f20df24e8de3e48b6b69b2503f917e457281e687", - "reference": "f20df24e8de3e48b6b69b2503f917e457281e687", - "shasum": "" - }, - "require-dev": { - "zetacomponents/unit-test": "*" - }, - "type": "library", - "autoload": { - "classmap": [ - "src" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Sergey Alexeev" - }, - { - "name": "Sebastian Bergmann" - }, - { - "name": "Jan Borsodi" - }, - { - "name": "Raymond Bosman" - }, - { - "name": "Frederik Holljen" - }, - { - "name": "Kore Nordmann" - }, - { - "name": "Derick Rethans" - }, - { - "name": "Vadym Savchuk" - }, - { - "name": "Tobias Schlitt" - }, - { - "name": "Alexandru Stanoi" - } - ], - "description": "The Base package provides the basic infrastructure that all packages rely on. Therefore every component relies on this package.", - "homepage": "https://github.com/zetacomponents", - "time": "2014-09-19T03:28:34+00:00" - }, - { - "name": "zetacomponents/document", - "version": "1.3.1", - "source": { - "type": "git", - "url": "https://github.com/zetacomponents/Document.git", - "reference": "688abfde573cf3fe0730f82538fbd7aa9fc95bc8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/zetacomponents/Document/zipball/688abfde573cf3fe0730f82538fbd7aa9fc95bc8", - "reference": "688abfde573cf3fe0730f82538fbd7aa9fc95bc8", - "shasum": "" - }, - "require": { - "zetacomponents/base": "*" - }, - "require-dev": { - "zetacomponents/unit-test": "dev-master" - }, - "type": "library", - "autoload": { - "classmap": [ - "src" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Sebastian Bergmann" - }, - { - "name": "Kore Nordmann" - }, - { - "name": "Derick Rethans" - }, - { - "name": "Tobias Schlitt" - }, - { - "name": "Alexandru Stanoi" - } - ], - "description": "The Document components provides a general conversion framework for different semantic document markup languages like XHTML, Docbook, RST and similar.", - "homepage": "https://github.com/zetacomponents", - "time": "2013-12-19T11:40:00+00:00" - } - ], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": { - "brianium/paratest": 20 - }, - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": ">= 5.5.9", - "ext-curl": "*", - "ext-dom": "*", - "ext-openssl": "*" - }, - "platform-dev": [] -} \ No newline at end of file diff --git a/classes/includes/vendor/globalpayments/php-sdk/docker-compose.yml b/classes/includes/vendor/globalpayments/php-sdk/docker-compose.yml deleted file mode 100644 index edb9600..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/docker-compose.yml +++ /dev/null @@ -1,27 +0,0 @@ -version: "2.1" -services: - php: - image: php:${PHP_VERSION}-alpine - volumes: - - .:/src - working_dir: /src - environment: - COMPOSER_ALLOW_SUPERUSER: 1 - - setup: - extends: - service: php - command: > - sh -c "php --version && - php -r \"copy('https://getcomposer.org/installer', 'composer-setup.php');\" && - php -r \"if (hash_file('SHA384', 'composer-setup.php') === '55d6ead61b29c7bdee5cccfb50076874187bd9f21f65d8991d46ec5cc90518f447387fb9f76ebae1fbbacf329e583e30') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;\" && - php composer-setup.php --filename=composer && - php -r \"unlink('composer-setup.php');\" && - php composer install" - - test: - extends: - service: php - command: php composer test - - diff --git a/classes/includes/vendor/globalpayments/php-sdk/docs-config.php b/classes/includes/vendor/globalpayments/php-sdk/docs-config.php deleted file mode 100644 index 893d0ba..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/docs-config.php +++ /dev/null @@ -1,17 +0,0 @@ -files() - ->name('*.php') - ->in($dir = __DIR__ . '/src'); - -return new Sami($iterator, [ - 'title' => 'GlobalPayments\Api', - 'build_dir' => dirname($dir) . '/docs', - 'cache_dir' => dirname($dir) . '/docs-cache', - 'remote_repository' => new GitHubRemoteRepository('globalpayments/php-sdk', dirname($dir)), -]); diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/consumer-authentication/JWT.php b/classes/includes/vendor/globalpayments/php-sdk/examples/consumer-authentication/JWT.php deleted file mode 100644 index 16f16ff..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/examples/consumer-authentication/JWT.php +++ /dev/null @@ -1,64 +0,0 @@ - - * @license Custom https://github.com/hps/heartland-php/blob/master/LICENSE.txt - * @link https://developer.heartlandpaymentsystems.com - */ - -class JWT -{ - /** - * Encodes a JWT with a `$key` and a `$payload` - * - * @param string $key key used to sign the JWT - * @param mixed $payload payload to be included - * - * @return string - */ - public static function encode($key = '', $payload = array()) - { - $header = array('typ' => 'JWT', 'alg' => 'HS256'); - - $parts = array( - self::urlsafeBase64Encode(json_encode($header)), - self::urlsafeBase64Encode(json_encode($payload)), - ); - $signingData = implode('.', $parts); - $signature = self::sign($key, $signingData); - $parts[] = self::urlsafeBase64Encode($signature); - - return implode('.', $parts); - } - - /** - * Creates a url-safe base64 encoded AnyValuesToken - * - * @param string $data data to be encoded - * - * @return string - */ - public static function urlsafeBase64Encode($data) - { - return str_replace('=', '', strtr(base64_encode($data), '+/', '-_')); - } - - /** - * Signs a set of `$signingData` with a given `$key` - * - * @param string $key key used to sign the JWT - * @param string $signingData data to be signed - * - * @return string - */ - public static function sign($key, $signingData) - { - return hash_hmac('sha256', $signingData, $key, true); - } -}; diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/consumer-authentication/cruise.php b/classes/includes/vendor/globalpayments/php-sdk/examples/consumer-authentication/cruise.php deleted file mode 100644 index 625ff58..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/examples/consumer-authentication/cruise.php +++ /dev/null @@ -1,341 +0,0 @@ -'; - print_r($_GET); - print ''; - - $config = new ServicesConfig(); - $config->secretApiKey = 'skapi_cert_MT2PAQB-9VQA5Z1mOXQbzZcH6O5PpdhjWtFhMBoL4A'; - $config->serviceUrl = 'https://cert.api2.heartlandportico.com'; - - ServicesContainer::configure($config); - - $card = new CreditCardData(); - $card->token = $_GET['heartlandToken']; - - $secureEcommerce = new EcommerceInfo(); - $secureEcommerce->paymentDataSource = $_GET['cardType']; - $secureEcommerce->cavv = $_GET['cavv']; - $secureEcommerce->eci = substr($_GET['eciflag'], 1); - $secureEcommerce->xid = $_GET['xid']; - - $response = $card->charge(15) - ->withCurrency('USD') - ->withEcommerceInfo($secureEcommerce) - ->execute(); - - print '
    ';
    -    print_r($response);
    -    print '
    '; -} else { - $orderNumber = str_shuffle('abcdefghijklmnopqrstuvwxyz'); - //$apiIdentifier = 'Merchant-uatmerchant-Key'; - //$orgUnitId = '55ef3e43f723aa431c9969ae'; - //$apiKey = 'ac848959-f878-4f62-a0a2-4b2a648446c3'; - $apiIdentifier = '579bc985da529378f0ec7d0e'; - $orgUnitId = '5799c3c433fadd4cf427d01a'; - $apiKey = 'a32ed153-3759-4302-a314-546811590b43'; - - $data = array( - 'jti' => str_shuffle('abcdefghijklmnopqrstuvwxyz'), - 'iat' => time(), - 'iss' => $apiIdentifier, - 'OrgUnitId' => $orgUnitId, - 'Payload' => array( - 'OrderDetails' => array( - 'OrderNumber' => $orderNumber, - 'Amount' => '1500', - 'CurrencyCode' => '840', - ), - ), - ); - $jwt = JWT::encode($apiKey, $data); - ?> -
    -
    -
    -
    -
    -
    - - - - - - - - - -
    -
    - -
    - - - - - - - - HPS e-check example - - - -

    HPS e-check example

    -
    -

    Billing Information

    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    - -

    Payment Information

    -
    - -
    - -
    -
    - -

    Check Information

    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    - - -
    - - diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/echeck/process.php b/classes/includes/vendor/globalpayments/php-sdk/examples/echeck/process.php deleted file mode 100644 index 7e646ad..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/examples/echeck/process.php +++ /dev/null @@ -1,50 +0,0 @@ -secretApiKey = 'skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A'; -$config->serviceUrl = 'https://cert.api2.heartlandportico.com'; -$config->versionNumber = '0000'; -$config->developerId = '000000'; - -ServicesContainer::configure($config); - -$address = new Address(); -$address->address = $_POST['holder_address_address']; -$address->city = $_POST['holder_address_city']; -$address->state = $_POST['holder_address_state']; -$address->zip = $_POST['holder_address_zip']; - -$eCheck = new ECheck(); -$eCheck->accountNumber = $_POST['check_accountnumber']; -$eCheck->routingNumber = $_POST['check_routingnumber']; -$eCheck->checkType = $_POST['check_type']; -$eCheck->secCode = SecCode::WEB; -$eCheck->accountType = $_POST['account_type']; -$eCheck->entryMode = EntryMethod::MANUAL; -$eCheck->checkHolderName = 'John Doe'; - -try { - $response = $eCheck->charge($_POST['payment_amount']) - ->withCurrency('USD') - ->withAddress($address) - ->execute(); - - printf('Success! Transaction ID: %s', $response->transactionId); -} catch (Exception $e) { - printf('Error running check sale: %s', $e->getMessage()); - printf('
    %s
    ', print_r($e, true)); -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/heartland-styles.css b/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/heartland-styles.css deleted file mode 100644 index 63bdcb4..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/heartland-styles.css +++ /dev/null @@ -1,167 +0,0 @@ -body { - font-family: sans-serif; -} - -iframe { - width:100%; - float: left; -} -.form-group { - height: 40px; -} -h2 { - margin: 7px 0; -} -#ss-card, -#ss-date, -#ss-cvv { - height: 85px; -} -#ss-card { - margin-bottom: 55px; - display: block; -} -#ss-date { - float: left; - display: block; -} -#ss-cvv.form-group { - float: right; -} -.iframeholder { - width:100%; -} -.ie8 form .iframeholder { - padding: 10px; -} -.iframeholder::after { - content: ''; - display: block; - width: 100%; - height: 0px; - clear: both; - position: relative; -} -.ie8 form .form-group { - margin-bottom: 5px; -} -textarea { - padding: 10px; - font-family: sans-serif; -} -label[for=iframesCardNumber], -label[for=iframesCardExpiration], -label[for=iframesCardCvv] { - text-transform: uppercase; - font-weight: 500; - font-size: 13px; - color: #555; - line-height: 1.5; -} -.ie8 form label { - padding-left: 10px; - margin: 0px; -} -#heartland-frame-cardExpiration, -#heartland-frame-cardCvv, -#heartland-frame-cardNumber, -.ie8 #heartland-frame-cardExpiration, -.ie8 #heartland-frame-cardCvv, -.ie8 #heartland-frame-cardNumber { - width: 100%; -} -iframe { - margin: 0; - padding: 0; - border: none; - width: value; - height: value; -} -#ss-banner { - background: transparent url(images/ss-shield@2x.png) no-repeat left center; - height: 40px; - background-size: 280px 34px; - margin-bottom: 7px; -} -.ie8 #ss-banner { - background: transparent url(images/ss-shield-ie.png) no-repeat left center; -} -.btn-primary { - display: block; - border-radius: 0px; - font-size: 18px; - float: right; - background-color: #36b46e; - border: 1px solid #2a8d56; - margin-bottom: 10px; - height: 50px; - color: #ffffff; - width: 100%; -} -.btn-primary:hover, -.btn-primary:focus { - color: #fff; - background-color: #2a8d56; -} -.ie8 .btn-primary { - width: 15%; -} -.red { - color: #ce2027; - margin-left: 2px; - font-size: 17px; -} -.container { - margin: 5px; -} -#ss-date.form-group, -#ss-cvv.form-group { - width: 100%; -} -@media screen and (min-width: 767px) { - #heartland-frame-cardNumber { - width: 100%; - } -} -@media screen and (min-width: 696px) { - #ss-date.form-group, - #ss-cvv.form-group { - width: 48%; - } -} -@media screen and (min-width: 636px) { - #ss-card { - margin-bottom: 40px; - } -} -@media screen and (min-width: 450px) { - .btn-primary, - .ie8 .btn-primary { - width: 10em; - } - .container { - margin: 20px; - } -} - -#ss-banner { - background: transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-shield@2x.png?raw=true) no-repeat left center; - height: 40px; - background-size: 280px 34px; - margin-bottom: 7px; -} - -user agent stylesheet -div { - display: block; -} - -.form-row { - margin-top: 10px; -} - -.form-wrapper { - display: block; - width: 300px; - margin: 10px auto; -} \ No newline at end of file diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/cvv.png b/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/cvv.png deleted file mode 100644 index 4d97b60689ca3bc2cc74c2a3cc18d85ab96fc734..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17130 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 E0HHLTJpcdz diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/cvv1.png b/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/cvv1.png deleted file mode 100644 index 1877174cc7607b1eacdf88a199da45e070bc3c7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21113 zcmeI4cT`hZx4acDLK z1q1~I3kpaVlr9b(=_R4VyTJmJaq{N9?|bY06V`Iw?6c3_=bYc!d*73@Rtz|$t+ss& z&lUgxwyU31)&qbIC;(v7`f(H3!gI>E4t#93J8A3)0B|AtKQ`AiMP~qzp%G7?p`6ju zl*N&4;TSv_OMtuD+JU_RKwi<+4ui8MPz13A3nEDYI#yT$6(r&nphgl}qFQ!J1WV#c zcL##LyY^|EyERS*4^>2Ok$05^9oP~m7(rKC8u6ChVD?pFa z2NXP`bxKf)>_8BdfJ?$~qDXN;DH%9YLQ+ab>Zl+Jlo6uR2$U#HR7O@pOjZ;n_~j3Z z-U5D-cfgy=>M5&!84i>bpq3Phoh$<3;^G2#5rdN*ED%T;85x8q3V}kwz#cG1HxdQo z3L`lReRlHIk21j#=RmZh5XmG#x?c>I>_kz3Lg@p2`}?vkTf1)qksQCU11Tb0F?I+f zTomy=BRuY#jh&N&&Fa+fI0V6lU`rrT96>weckS#f$rQ4qCHZfL{HFfffx$h|()u>` zcjs$s``w`(DJsq&f-gwFYw38}&5nT3BRG2`XK*P(-&;L}Xuh^NfAU1v{O#Nc zuEf7Fqia5!t%kzq9g+vvDy!r`z);8zr^#d+^yer$^%bF@lG18a2_DkI;D{tT*TeD% zMx(VIU-L&$#!v`oFd`*kqT(==W5D<1G3wgv^gq!6c<5%~4pqn5Z-g_jQQxxcSRaCy9<=yt=K6V=$Um zYnwj7{?Dyn6*k1x8fAxZa3s((PyzZi1-})wZ#9cgyCA%M95)VemU zZ?*|8?enKZc7Xfy6AmKD%1&_4iI3$>tOnj054g1sEa!EcZYA{j(wC z0P+a>`@n|yf3Ovf80UX)BmP-l{qHv7yEW?nb0gLw8E1(hSrG7O#MdDH+VIcz?(>fR zIlI1Q>|e7{p8krG1v43pD$HsIA>|Q&Xltm0 z{~O!&dPdtdQv(u_f<}EAj-h#-75z>6xyb8-hdu&YQbIyZLLR}`%xH0n=t{6Tqf7*= zu_L{zNJxT1tr{_EzH4c`W+^5HzF5{Q*J-|3e%`Ki2ej2p{M-s2|G<+c;@i>lFG>2X zn*Ap~tS#w3>6O73YY+w?%taP1=6o2mEL;pgn2Ri2%=s{AS-2R0Fc(?4nDb%KvT!i~ zVJ@<8G3UdeW#M7~!dztGV$O#_%fiI~gt^GV#hed=mW7J}2y>Bzi#Z<#EejU|5auEa z7jr%gS{5z_Ak0M;F6Mj~v@BcK_1pttZ0RS%YHM3W$;B!e` z`S@wq*5M8h%5`eu?1T>dhhOH{j%GE9-an^-NxA+<#=1mKWvDPSn8M_feRC=^FBz@$lIUwyTifX1|lru&@@zozTN! zv0)X2$s*H!*I)1_&5M&Ns^n_rr{vx4oIU~o4!XtQR4;D>e8Sj(pHN>Pz==)3v2x(+ z<45jQ348$i*#SZPw+CoQm%zs{sl&NHD1g6Le0AObP_RD+f_!xq2>VwrM3)zG@6DUa zXp@kR-ZZ_#_v#e>K&42WNmnja7TIuYPfcq<=7f4;jgz9{!P8f&gvih{5o+ri5N5iv<> zxUBgC+E-?{!RKOE*%HkBa*#jUv8o@rA?yG){Z>nh%Zz_41TuC12k^(jdYJ<9I_0^c zF>ftpxTE)Zu$}y^8loFl$x$=)_ALiQ>?o9fHxl@zyv|al=w!`Kl)z&+-|!Bfp4ga5 zHGuY3FL&QKDRuz`Y&MJvR4Xpfi;BYG{wMqdX`7VL7IfVBkdh<(4$ zv;XnfhGWXP!-ykzhw`d%_yM4qNXfK~RCh10a!A_fWq!4EC*jVL$4MKWnU0tlnwqvXW#RSm%d6~Ge(>3$RpBdg7!UX) zcx7r@m229AZSCHfn&-+hGHxH*UKYaULs8AjxV={hKYv4SMhh4asEt+M7K2E)bS z-R>C;daNB=k<=`oRuC>Q+dz-L`TT${QTOL?TNia};YK%Di(0@#KcC?R|)pxCr z(m4SSQJdxmv!(WBn`4XbT8*^2F29Oy*Jr!Hxr18SB+r+Lug(8U@_ikD&7Piv{~`Mafkmf}MBe5t%1(w7hJmnHFw~2R zJ(q04*#L*AKjHkJPv>h9Z~=<|&=XhWS5WSa)2ig~Ui7M5;pKr!p3W~k_sLf(dm;GB zHvgi~Ae$AJmz@66sr|^epZ%D3RMRQ0xyV}8 z)0shyfkPgMv)O;>P{Zf-y-MK|5sLU@J^RFDu_ugEU+e6a1czF_`EgDKHjzCX`h*uA zd)qpwF-B!pgy6Y=Y4}5{)X$lN-a``+TEdTW7 z3Yb1H$7>oK<6)L+>ehrEu1@+SxwR|;l; z)cWyKg@?WG%VeqK$+D=@6`6%VUDx);Lwiw0otf2n7F@6MxNfxFDzD@<+|41s81Xc- zwopQ%{;{ozVWx$#o7;^raI*p$rdu^8`lpIN4Ek_OQ!|wBH-r>uJ#_k`-7;o|ax3rc zZtcAgC2}z?6d92kW>2#Q3VJJ^(B_B4iWfgRYWpvhc$;-W4<`4f-R{cC@@My^7;Tds ziK$Y0n0@fW%3Mc4N!Dg=Ae%Jw;z@mxf%dy4scyeF)InWUcYPdc{jGa zHwU*;m>E!nQQ=;S_q%eDEBIa%h_F0rpHqA?=0gLwO4V|H$6j{fB&&L7Fk(k=dHc(inea@*6Hk)>wF5^qxh&%zUrmCJCUENvn)G8xLPY+CNGN&rO&wh zz+h+fJ5g_YXi_a-i`4NyCf}P#ObnSVq4pp?EM2xGmn<0?7MHzSnGkqrUM)bIo#Q3X z8Y(LgyppBf7Z()es2?B9-bu4xuBy5i;nBl2l}vIx-|kj6 zqI*uhd3CWD_=6)w-kO@1=%cOq7o8HHh;X$yJdWK(YH|HP*uV3n={k#2PVv&oQjOk@5{RH1|!9JRdOiy1aiF^ zZpo3OdXbiC!6WEmA`LcDTo#D9A7mVTzGc+IbA>}u99(lKe_YvnF4>ER50cO5w&tIW zFZ-}P!PBZI6gKF(skV5xIxbLi10R~CdDJYA5~^6&GCn_)mA^1sU&bHW9V(aC(fKnM zXNY4hS}a7`^IRL*ByFQ!}ujxiW2mt&USH)yg3Uc+d89j?vocp9`s# zHf0qZRpl2)Eic{8QcvqBJ(2co-%Hk#6zv4*-$!Z#FD_M*o@fi-py;(FfXCA+BD%pz1R)ej?T_;m$42(CpEuAuhvo0X@GD4%zP@YJ za78oDMI=_u{OZBb(eVzA;CtQz6Py)u+&LuCLna#W{VUDtL7lKA`TtEWy% zG`cL}#qvt!v&BPSJWP>W^wg&o2F%AoP}7gko3Y1_jCoe zE{}pov%CRtkzN=0*+Z61rUst7^}Hi%SJeh5dJQ52lg_q|9y@LJboyaZ4L;CiG-o1{lNro+n2eJ-jc68csZqT(Mce7 zW=f$r;^WxzXzAYevK_u;I@!MPV7J{t@>OA%wZre-e%=3jC8l>)KTrMwg#y)+_cSTC50>7E;QczxPlHyc?E9uqLCU8Uy|B^XBSf6>L!hVH&dBA{ zw(P{!*i0}fX&S}b%yhbxV8G~$QA_R%=NUeyQFq|p5u-8MO}mvP>eF-xc?IU)y*) zE`;gz*-qJNup)Z!%UM}frEv6z%MO!wO-=oRABf`c9ZZUAwdULcfmvjAP(K=wpBmuk zv*?fxEfSZzC)s3!3O!n#GB@(+Sb1GF=N38Y>q{@R4;*+!$5XE~b%;;ywY<9}zq;Jv z)Ue;nmf;=Q>Jf%nVbhsOZa!qM!pq;+&L*r8_5o%kxo1;5zif4UmXJR>g zgUL;$32nt~H2cBQ&8uF6L9b%y5kj1lVXWGozWT@JN@Y63LVjDh2ZEaJy??Y&eGrPR z8F8V^-W+eg+TR_fn}U7cYm~Y)Po-|RU*2dI0KOfrmh~foK;Nler(zU5oZHI4Ak=Au zXwpgG_%{lz92_C=n3>tq6Bc|c6Lq#2i(-|32?+aLE$TKdS^0TK}Q!c=b zC(R&`iE>0=+R|||17q$$F2q%T&K-Qz#IX;1z&L;0=H%wN{9<;J+oDvcB&LZr(;}Vw zn7;nh7O2=oz4jWb&b+*Fe`qy4TjJG5O3v5)Q7r1aOSP2EMbU=;d`wv% zFFe3jWBJz0${<%-{sc)&OPtge75OA8GP=J7s+2XqQmfEryF$C4Ur;>bX}_s|Z>;0c zOc$67_(h3ZTJijW7jsf;6^L=*=JmVn4jFM3Zb*L zZ|!`729Nd`hxrr_kAxHSAGM{>{H%`}ZsIY5g;q-~N{{q{#WjR2O&>g~Qw%1!2RqRn zr;T?x<(m>7%095Is7^Aot$fdFH7 zTt@g8XKU~@bkhW1;Co?c7vgo&O0VWZRjw7dutzJ-#~VAR;;U|yf=ADbX3NpaS+U^B zX=u}R?SSX~31Rhw_#@U`9a-o2w(GP-xeo-cvGV1ud2eSRgWZE3c59A-fU~xePV^GTDmP)a36JdC0}S)bA;Q_ znS!sa6kw!b4RU0ayTxd*&V;6aaw+74dD{*=>VNg@ zjz!wjbJtF!*M)Kc9m{wyAL(a*U5_QIv71BZ6Q$w2fm#3jIh;naUE{x6wq}$3BZBf| zw~1WENL}neBf*d`4UQe_crk51zoged@*@@xnuK z^0G9!!JZ(R@9}b=PGgJTwov+U|M;yNykNN~^-%Q6HKHjFZl#~@pG7F{p+|6uN8uAN zd^$O_o;T)TKQ`th4?c><4!t#d_1?nl(~NEdEpIYZKma__e+mJ=W0%hfr%gm8;}=s8 zJ$cXzYinCs@U`^pjkG+Mv%mjkI(XDSB;QpBR$a-fXqvr=DLB<71*hI7XO3+Uk>H#9?F zPKVul4}RYQ_D4w6?v(@ZcyI>*hj+63Q{ZfZM)!B3KJ5e?>ie=M9ribHz+5_i@L8Vl zjC~w-SOj6lB{N>^3JegoUJiQm1F&BRe@%uD7&xE<7UiZbvFN)QMV`l%ZJZT1`m`_m zDt3keKId)VA_(tO<VBlY#XjnuL!&n@<-7~BGUWRLgNBt5C|+5@y!RYWFw zy1day(+jxK{O0P_UWk420vyvtXYKB>2APF65mnv>^p!W8H^>P_*>{V4w^lmZRAIlL?+?W3F6e z!wvj|JaMo;cXV3(0Q5#K58xkDT&bZ!1h4&EMWHp1b^<+*r{-Uxk>1sNV#Uu^Qc>V& zA>b9NFtyA-;DO3PoQTMgUxl#8m4otlfF6HgA*?xEKv=aLFJ#nO-61OKv@cI9H)0Hdt@Em9N@qwUZc*WD|9pqsjfZ`q;Og4 zDD>c2ZUFTF4SoM;IsXXMFfuY4k$)7tfg2F!`-$`44(RXR3JPMDU4Tu_u)?vh{hIXu P98z6HTRHQ@h2Q=Q+UTrq diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/cvv2.png b/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/cvv2.png deleted file mode 100644 index 445fbed132e6883099621c0f6ce7b0819a7775a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26322 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⋛@?w#X*OvKouYkP93fiytiRY6aty9Gs5rRjE`J7I3KD$kP6hi|I5J+j} zCg9n`LcWUQPmhZVD+(uL^(^H>gLpc|Wnw6FKp;DXMd)~a_y~^u8xRP=@`KhUdK$md z+V0G|Atv}JkhjW3iDNE%;(LR06*+!t;1wFxY*;`DB5->1<>+Atcq>R9+?#uh0y*e^ zm-g_Xa;3hATb7vUEs;=%TpUzTdj&qw0Uh}N0$94Afq{W6rSNqWP&Z*L^c_PVinh-PscpU$96GT`F1q%#EuEj| zO>~7YxVZtyFm23%U36@($#=DxtP4-vNJf*%6my>)QhQNFMicprvx>21kE=Cyi?hj(D4-o`q^J+?{NtQox1MfM798#L>d!f9hut+UZomH)gM_8cq4U-PZJ^r w-X8*+`JX+a1@7p-d~W+UC9>06*8{Nj;|NCnwaIg@z(^ocVsfI{!jHWE4`CUAng9R* diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-cvv@2x.png b/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-cvv@2x.png deleted file mode 100644 index 7959068ab8bb4358c3cc7d6bb32c8b51645d5bd9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23730 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 Ri}kDG2HQ+@Z)!Uq{C~kepho}z diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-inputcard-blank@2x.png b/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-inputcard-blank@2x.png deleted file mode 100644 index 4050c006ec57472947d3863b0f08173c248201d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2166 zcmV-+2#NQJP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 YZFVdQ&MBb@09^obF#rGn diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-saved-discover@2x.png b/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-saved-discover@2x.png deleted file mode 100644 index 30007be3647fd45d6e2e82c4427e0b5e62347174..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23467 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 <@?~%RH$@O*e0{*{DC@ z_TUqH@U{u`Aw!3IW$5nXL4wOB`=v?vE!YPI8`_~J5$Ue)p}YC%5>viroHwz5Esu9k zYPkOW8TWD9E_Q_)A9|2#a>^Ey1K3CQ`D zt#}NWeHKsiqu|XoClaK(kr^f#Ww*D#yvSwsq8NYJEqXJTG}DWWPCld8CEHo5t?b=6 z`6o9#ClI}*)rR5_pnLdgZ2@++ku<$|XJ+YWfu|dG(e|l7eTZNT)ep*QWm01w!@Pbj zZb@2$!QE8aHq9%2ey8r0s88rZoPpuCmd^~xbYrMfAg5WajkaC!42mD9x^>j@r1H;z z=kA3&cZ0|V!{Z*uzXL6?98@aYf9}M%^USvAM!EYF3+|0^6l|!ak2M+e!&mzHOvMQuOU-N-GezqgasaJ zmmCUuZ}@#2)v;pdWam`x!o&>Z3x;YZ5*SCuc1+fC4Ht7%Zt?;*SxRRHNRYb<33cc4 z&ppW@#8eY8HG}GbcNS;k5GDlHQ&;l(4tXBbV<)qb9K*HZF_3)OOWtA4o$U2BhI?P> zLg@^J?Pd1Ymv})BSv#Ya;g9#(thlzwNQX478eCtozranw_+yyGa?gWc%Q^~;zbm})*46Dr8McH#3!SnVw2}UN?pQN_Fda1 zG%=PQ!x>tXFRh>hO#NC0WbmifT(Jir2Nx^OVCxvoFDe4Qb&+AAlIsR~zJ~$azPjgc zvDm3T_~i7umJ(zk$h0z^YMyN!OLvNv_RJd88v^CvOlhXPziqQ;(^T#j6C+5I5m_|x zyx`iy_Lsf;u%OP8DpI&C-}*-6Q^)br4y)DbVoEE$F0!fp#HG>8mZ;5xSFw@j@T3-P zI2#|Lo<@X|@d&KYkbWV9DERt<4+LjwSqKWWv7M9fy&oyJ5twIuN9Ax6Zz<$0Kk5Pe z!rMKVj21j0IjP7|QpVziwN-o+VED_UM?a8;Beg4haI^5+Qb+r0Q>spu~?0H3@+bVOntnZ#x$crv0rty**AB-8* zL|+bV*H_$q`chVkwX*e19n|s)#Ia3RqhIrlW7x<*7X_Ixb0PY&J$+^oJs)u;ESwvr z`fZ~)C~f|>(lmH3i8u}rR`m44Ia5xc=|dfEW@zJen@5Nwk7swVu!YjK4j65R-?x^| zbAPOvt;3!~lV9~b%dLwcH=10iG~VIyg@tN;HQ1oao<-d1)|L4ovEu+d$iYbLw#jII z5~NN=M%tmQs=jvgt=1CSFjcTTN=N4~;z2$Nl1(Jlxo-fP)JFj;BN<

    O&vGzr^e- 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 U!n^on;N~X=Pgg&ebxsLQ05Uf6U;qFB diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-saved-mastercard.png b/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-saved-mastercard.png deleted file mode 100644 index c6ef7fa4cf4e068f0a87447b5a827e35c5f7e78c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45026 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 diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-saved-mastercard@2x.png b/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-saved-mastercard@2x.png deleted file mode 100644 index 2795df60dc7a3bd140678401beba074649ebae42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30646 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 diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-saved-visa@2x.png b/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-saved-visa@2x.png deleted file mode 100644 index 2b5babd19fc35664fe34630fb691df2ecaa2d8af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10480 zcmbt)g;!Kx)b^dBJEawnk#3NXE@9|U8fgUSMyVmCV~`F338e(-9zbG1MnRe(r5mI} zzWIIYUEd$@erK(7_qw^yId|{p+4osDR##hW0N0p9uq^=a6$F4CD*$+w1pu@jd2M>q zm=m}*8mh_|i)mL%?V%V$;Gt&X4FE)x|8>y#LdY!uaK3;lE4&Dp+s}WSVm=vs*uCWK ze(}Rm6~7Lucq2=R4+$$V!EWkVU#Lsm=N%Y`HE~^yR9~O0>{xqpX8u+nom}4P2+Z!s zLP{DoQ)WZs`;#St9KT3G4ICj)Ny!q{l+=bI$U>l>*H_>v5lPHobv2 zVK@>hG0y7GZ%n5{RWd~Qbzw$uc=~X*?H^e)SxMIlL^Dsg)-q##5R`|@A_IFS1#;PX zC9)CtLzQgm?zm1-ZX|mPd_xrzuXmfp9h`u@2C=|fZdP|3<^CmuZ>4Om^6ioaW|l@c z)pFb9Y50XG-v{UO2zFrDgaKXQNwIcj?FS!us}&}1(HU$OshjY?(92;Wqce>!G#1|+ zvhzAgYx!W=kaBt5){;o9EwsP}f9vMRyjaMYhuqRgE!;Sae&?NXhsv)j;$OUj@d}#n z`-ax;BmhTh*d(P9T`?)5^Nyl}ywvEuf|~-AUh|AQg4FqJB&|kLghb&nvO2v9lKRDS z{h^cO(~)gP(Xl~dLXwJV&v&Mbz|LB&xyML^;5|1i=RrVE+`Qql*1+!vCLABkO7rol zXv#`zs!vq|A-5+&ffDZt~tNa&p~wvx@V4fjnke=2iak1!y8QzO_c2ire-vKSY~^ zj`jpPo!V1cf{!f#_wsOj5^Hhbanl7w`J0l~&kjXMlQ3kc1k@DS!Tf;X;4pZh)sY=m z_|5_7BvSYWnE&u83(Q<*(h6);be9-u|7&AXz z;d0;e?guUJ+nmWZcfQJ8V#D0QmoBf1{&7gsZtUzPvlK?WC<4U~donQY{V?4nHrNm* ze?3@E?f7B#ymz`OKft%=+x&AnTU0DF1TeXX_I+l|H5&fFUz2DTo&UIo&e1F*6~I34 z+uAqv8a2MPuGahyKZ}R~sDN z*YQ7+RMe*ZA3vmtvo&zXhY8k@qlWK%d{P<;hzu8AW>$=Z)_i{TvXDiHcD;}Jv}?U8 z7wi~hZb4}U-XjEmXaw^b`%Tla-Q=_IHjoCj=_=qlifa~?T{%|pcSl->`1YgNYP4;l zMch`&WyTAI9SPBWr@59(H(QKE!s4?3UZUIn8Av!7eEzx%9`^Oe_V^&O(B+{xe)37t zI(ChQU1QX8Gij=N_wTPSR&dzZ@SjJbxSdGn# z<7J@3wxz0ht9Rz@A7usR;?;68a=(;wbpcTyI*x!u_2_yfwq+YBhp;q1A(xf9aEheioOywqDDy1L zFDNm`-LMtSW010oPtlSgT$x;K-gtExY-*JCoN8K$;KMB5^sjO}b04I|m+;0>Yy+Wi z7%W}iABf78DrjxW86tW zFkk3zTbGpBq{nDc+^g1E+A1j4HF;#J=NZ)jXCz*e^nIc%p{@Rvh?+P>9T8J_L!kYM zMd#rfQI-v{Lw_iCWZ?p+{ouej)b{22{^-2F zIv$ZGq7=H5K@|Eh%Qkm-F+o3V`3HSJms7ehi$wW!iS0t?A&zwjZ=#e8Qjo8wjBbKS zT%X4qbsy5{C|7LLq5c*>WdhZl>9A|IJc3plYCGUn2gnzGu z+;G++$f2qNUU8q7n7{cQq#}LztaOb>-;7{^>`p~&3CXD9Vim@+1Sg-me_nsYsZ@pl zeYyZsb^7S1#n7c6^se0E-=2Myi>F=6N%T?TuzUOHcY1pL@oGDV#F~JA(qwvcxc8T8 zY~hDL7j>K7d-g(L<^4zjgu26K#@W)IL6QqMT=NmZ-fQgMaJ1In%*C^5Z~p6^mLkVp zoRI@T65m@17}tYxGHgiaKB2iY(KczAYGpc^OOudTPX{C>lo@gz1dUrDvaGv5>$EL_9@ye(TA@_(i0FYR zte6*5QO=sD{M+a3NkZhRLY%kRLalhTyf+8sxSe%QWpN$hy8RbW5aiW|mY4i9tjAX7 zw$JtM%xSZYokzdeZIzJ&c71#(T>EsV7j2BL?VHPZ0zvqKR>QOO78l7}?G>5DlPH|m z1F8nuG9dIHGcj|cri*<4F+LKn^A2Sas;!4vCq#5qZOsW|L{G(3hv@?8HBUd`WTO8e zZta`-Eo*Pjzdss!v&L54F#c_LpDm_VuZXpM|7th6^ml7Babx!zgJBlIR{D~M;&j5K z50okp3#}AVpf0_dP0d_<5YxeuAHm%Dj|e1fSrp#PYgTb*q)eJ-ikV7V7PK5sZ-~co~?9U9u243PxeAPf!hKXJ z5L6of>o57pc?{cb+cB!nv*oaqhG~yML|k)S`!N6cs@HC>eS)uF)Phft&xrTZR@H~^ zbRq@p+41QE2e4S~oRlV+K;QO}S_7AT|XAh zMvbC3=YIbzj9xDYIL^2a(#HN~x!43BeC*zvBAbN!qoVvvTs~ZX^R8hn%ixFUxLJhu zdB(@pyAi?6&s<Jl#vNc6(ehRyX%NwuyBrsy+1Z>0wuM^Rbzp+vy)W zt&q616l~~-CL;7zz;RAx+J<*r8T}twDofd=58eSFf`DgnD-1b zjQ(5x%_E!AS2`@(7@!pie7zdgS-;WMyzzq?_+fc1LsfFZvmRiWH!`go=u&i0_r~i- z_ocSdABTt6yWcD>JrYEb#*o1^jLXpVyEov|(cLsbzSRPOlZHJ^UeCIW}>cj-P#*OK{lb27Er74iey zt&+P+N82&EKB7UkwkTbx1_8)VxEcz5sO2Ta{WQK1@b2(O)Xxr?Kx{x_B?!dxCpwS- z&zxGe!S~N}<*{ISk=L3w_H{Z^#DjUyQoh`vf<-k|q zGFV>KnNRhx)gIx9$II56cq8;IuqMYAv9lpQJoouv>DBBhp1qvg>s`MT2}27yn07oZ z@10w>R2QP?f}&#VH?jS-M$sn4}XI8%+RS0S#Gi zjxf6I`7`ZdV0|ZKJ9}4LzGdL~mq}DkD9%KB&>IDSiNxSiZPrit4Y5*)nrA)F>qQNm zR#omM|CA+2wozrKV$4`?o|jNYl0n~*E84pU7k7;I$&197Pel7>t(?f`uId8Ym@aTV z$k;0ux0&dY%B?*Mbn8NV7<1-&>3C}G@6KrYEl4aKJM2bZ!v6IV)PbN+z~2NzQ8>*W zfnN(x%pZL$@5!pDRtgi&wR3sX)89P0*ZDrhr#6E|7()hnGA*&*2`kx`K*0l{AVS{X z?8o?p6@H8LWMJ-+}f7PPslNdQx`#s zDkE*X9s17RU`o*_)H<)NN{se&Uk)$zPolYW`tD}W;6sNr7yRMNZZkto2MpDcOzMPd zMw$bCTSb{6!NErGQ)2H=)+eud$_811@xAEELn^GXmQ_^r+mVAkqmJI#mfo$mb=F0L z1dDqC8@Yq?JcqqJkUY47H?ffK*zmj#a{x4Aq_&_--{`Pu%{zb*u@*wB2ud^)z`bCW=+K#pn>yT>r6zx4A@9~I4;?eBb_nsC!pU*8NU z`cG?lPDM~Ih^aF(TW|1pRu+^U;UN0kd*1^J%c>v@i^WE|}ZC8%tr?uksd-)>gIP!rmf2>DfxanGRO+WT3O72UonYe#V4;3y7|uG>;JoRyP*5nWL$FfyIDZ&1S&_ zS#Zt(wu68qPOImeOrlrZch^2?`KMo%|-1hbg1v*M^o=L?$mrt~;V z+MBvOMq#v@ch;8=jK4JJKg}JorJZ!a_6(r;_4}zk#kiMS4uNKn6=V2AAM1}SOtht{ zzo;EZ8&4Q)Q+FBe`y%klZ-aj};%K-rGt-6iJ}a#(=-29b{$|Pwh&S&q!ceHH| zzO{3(4vkhiShAxfpZm$e_Umb7Olh}=%)JgJA4_eDE{)Z7?zcrK&B@!-`QeZ%{Q+FT zT$3LELXL4tnc=l^PLBZC7&exOWD{N)({~xOg3dA>pNy((wVe8EMt1sS7Cp*CKfUXp zi*sXM(!fxh#!3s=C&u@c#5AcyY_?mzUVyBhg#U2%e4kIQN#D1fNV_C6SF-rfJsj=EWo$Ekt{caY-q6*v_93tL;e)*-!DV;4 zoKiJG3U(Z`&w;%(JCt`b>STX2Ly~I>B@-+V1laB76S_?o+$|HF!b>Dpx@_OD_aii9 zu(t{@CB=F6;)ND0o7l&`_`I&ixuK{2F8#@8sWwK$F8Rib51ECmn-c50>r9xspROIn z@(h^${#u%hy<9nrWH%X@QJyW0Z8KO=gY|~G1Rp2AF}sUyB}YUZv&pft*pR0uhShRP z!`aCQjkojKBiC?%>-j%EsqbDTC662%LB!lmLR~**t+Z-{ydYCHqJJbMqqnT{*;jZc zw3eiC>A}vDsP#pjy4X9Vo>r?S?-j|jZMJzr3W3b<={^?m?O$DzjrU1|EFS9A0rP*S z{YJa(M)^qJ(bUOh4Ur?HMBQBB-*kq#i~%wrfOOJgCM?oF-(@yyeSi0>9R6}@6z$iy zFMc`c?wCu8$OuN6Jazzbo_mFtPyjo6(pMbd6ueo2Ek0ux@n`{}cLe=u5$Eo~=h1QP zti832k!FYAIm3q)_5xa?9tpg1c6ALVc{)Bdm673t z3!?{Uz*%fgxG*R%0Q!u@0$2cxY^_8HcfbX&R%M(Yeq&~8dV=LtSzhq&O-bXqIrI;- ztU`tdDKk1cI*+HneBn7(nd|h)&AZ#h=4Nqd_XI;cB-sHNg zUDLs$Lu47%UF*%qy*AO6oae(&Q;~Lt>TQFjQkBsz26^6_#S;1<%g`!BVq&5sAdvp= zuI1AwTSAxyCxta!m?2|6V#`C;S@JLXVh+Bv#h(Rn!@c=QcVFJJf%I+_?jdoC1)16)$dBb;KpH zQuMa_0H)<*JYN(`G+t7|4#5HK12$#wj?YtVP!#-hCDLh0d;q<4)8_5Q4r5WEXea;8 zXfK@I3LK=K?kgC+N(q{#tFNC58pzVn%VVD$-iFYgvMq5HEfJ!XY;A38>gtXOfF zqKFQ^gTL9Ko2s#J&hxfZzMtYAkQC=gLrw^HO4}0~hXp#ixbTXKiOKS9Z(!k(-ad|d z4AHew@-kFaRfQLj14k1EI+M_ACb)^N7ZCF6rnrO)7#OtYM|Q{CnefP)na$GyOQ{pj zjQ5S7M=!wN=|yo4tdCdw1E1KFGRr0$92`K@rKu2+CF^F+ znT3vU_1>?bs@>q!H3+p5_B}%qyh$fN*ilLK6&Bpf~yy2N&67!{a_rDn5)gJgnz1YdTQ_*Pd}+dt%( zbvb7OG=K*6wuCi0_)|&Us>Y8B$F^JIknOzOyR|f(lW`4!>Ms|}ZqdqN5iB#Cd4Z$| zLR;cu&fb;2_d@SZ9ZU4TEUHUukDo%;;kR^@T}<#~a6se5SyPjkdQL`dLa+k)={5*6 z6$4bO17tV2T4;lG6Fthu$2Tb*;^^cw8&Qlr*v!^+5ROBo%#gLe*JKx=L2!U3I7SUf zp@IXvyovhnarLKkMIeOeiHV7Pq@5V`ydrP)hUeN4MFPW9LSJ9sPW!Csv9Z)QE-qDD z>1OSIt_=N);<10$IFWccxw$u-2_+(MeqG3Z`o!daxj+b?H}aR-JV-KFTx@7+I#3*o z%*W0?d>V^XYO{kNRg?K zS=cKin#g-`QOci8qgu5d9B4hxp4dJyrB+$!6i{d2**=Z5H@4LbU48!Maqj4p)TZoX zE;r9>rZ}Q`iEIb>-i4w^3!N|y`xP#1R3=p8nXIqGyHn0$&T#L+`6FrgOFoK$tc?;S zIoJ*K5ubmbq<>S1a=bk76~4#sEu(xg=1d4%Vvc05j`Ma4E17&iGd!4jDgq_L;{0C1 z$mX=DJ0hbS{S7aKOr_bI`Q1AksEo|<+sP00ot?qq-UnU~T?V)r$j;Q%bog8l&R#^9 zLj4}6w!X2kQAZN;Nxf-BIC5$(_uK5AWpiU=A|sleA3o}kD75hhDEpqpw}e~U)PRu9 zDcp*hb!p;PXfqf{;quVXhzF#VPUKr}rc9Y+gIZL>1~YA_xIII9WB7p695q0^iBcQOdk|;_M1TUkvz2;q;o10^Ynx+e$3K=jw;z5dZtwm|{^277j z-5MGiV%C1DO|98+3eh0aIp;nf4%-RS+SkvPpi*S3EZUm}eP}ND{jr8J)($fo=v6k= zRUleED6Rid1U)d6Mhn}7X6#ewh<=6Um|5F*Ga5#$146mlo#%_LqSGc)durX7?ix z2|9fo{yM$!z)peljsUm^iZ!m-3DugmSMTcTN&=T9ERO;mXh_ zR-B|oPfnis!$X7+=aM9dk60~oX~>|@841~%>?$WC@Csa1+TP(OMxju8K-t-_RAWOuE2+jw9fqnatlyWCL7?Qx;Vdz} zDNYgb_VVU4 z*RBj}%&!=bl}|9joai(?-0khom+~$+q)uq#H$g`nyrBz2&9A?9+^BWM1#F~gG6c%( zVdm1@)U=@|y7YZcE15~sYo#XwPZfZbqyn-ZOGx4S1hQ}n&SDyo1AzzPp(y4PXc z`RNX?n?e^-ajZHELeq({(B~KpvDL zOz?TBGI8ShpkUf~}7#oitOONg%+mUpU&$w|kSm9aNAG<0Au z>wwG^PHxmTj&~wT9zaG8oSfa=-91pj&-L@JM&Y;3nAiG^xmm~o4{1yA-9(z)U`bb) z_doDHm4&$yz@w+;=sCH~;CwRDGI z0`RIFPvlp8h`z$3nhGV2^Bb+0&r|P_dKx8USWK=zrG3&NG4Bu?>W<;A zRNY7}fMKvsqecSE?oytH~u`OJ-Ss1}UqQySyPdf;M=2?pQD z;(Ixii-<6CHF51XK#4Pv!ela6k_FjUu+_AoGOfZRIuh|tND>Grm3kZ`riOgo*FrJ ztd{;0|MS>=U!0J@N9bBbuQwPdY9q3rp_}?`lpthQ)#%PP+fm72rpBJ6AUL4uff`jy znULJ{!{A!Gu>Fsu;;k?ju^YNLsf6itn*ypdq#Z-PxA+sy#bBEu2TTNKp5j2{e%k1! z`s4^Xu&PtIGE+z2TowjHKBkJY;AEWsWq3%E2Gv#*#FJ(JQpHgX`D+fX2L&aq4Y-KS zld|wQd2^wfcrir=7`6oRh$ty}|Bb0`%HiEV!2$EVymrWnbOd^dAL*@ zX^Il(^S35&HgzejjAFXaAGWH#jZ<$EY@&~CE%LpYYpjpOs7o}M5AouxS5r|yz@f%d&` zV8Bi|n;y=uleJKM33?K{@+3}SAGbd_UdZY7e_Z2swlfLs6?`9MZDi%VZwNeu2vnTm zWQrLqPESnuK%5@gYUYiB8nsIhgi7)47xQH1eDFI0-^(w)_1W$&VN@?#vB-lIhSFsJJvKM@&O>5uOIf?0y0_?Zo=lNM zPS{|Tl{ye1j3a-|fz_Vf?-Pa>>K{HO?Ej>VC-vBw8TlSS{~jMd(agRP(L?v-MNR|K z^Og!#jqQ5G17D|JK_mxF=c#@wLU$n#Q$AcKY+^(uP7iWyRrPios(jz*VvRF7?*2x@ zUP)STi=g$%XMN&G?*j@r9;oVr4?)~u#d-7KHuy*yHmHYA?Px76E!Fwq5f~UK1FNiR zjP0<5Oj}#^h}|R#xj)-nmA#yW{7h{iL99b8Gex=bwWn{T9!2zU=`CZbsv1ppZ=yJv z=Xo;X*hfhvjdeH|{onwgA8Wrt>j(@z%y^|P`IZbE0KsIO>4{o?{HjjEsN%82Kc^?E zNPOx~`(SGSXKNbX-deOd@Q{F<)%gx&N5VG+E}ra z0l@JfcYLrx-M7tNuvI*aE2p1qr55~Bn8E)42{c#o$M+zJ3BiqBx31WKKOaI>w3TZV Ht-}8gC*9C5 diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-savedcards-amex@2x.png b/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-savedcards-amex@2x.png deleted file mode 100644 index 82c542be1bf6e71241d5fa98c64259b03067ff75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47321 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 CGd&dm diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-shield-ie.png b/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-shield-ie.png deleted file mode 100644 index c4583f434eefdeee5910fc13667277e9a8a23879..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31456 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 z 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 diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-shield@1x.png b/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-shield@1x.png deleted file mode 100644 index 900656c067600cf8e3b2d5132b4094afc266cd17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36611 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 diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-shield@2x.png b/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/assets/images/ss-shield@2x.png deleted file mode 100644 index e8a7fa57aa745ec09702d6ca5764531026dce5da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59755 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 Cq_?yH diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/charge.php b/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/charge.php deleted file mode 100644 index 842dd5b..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/charge.php +++ /dev/null @@ -1,64 +0,0 @@ -secretApiKey = 'skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A'; -$config->serviceUrl = 'https://cert.api2.heartlandportico.com'; - -ServicesContainer::configure($config); - -$card = new CreditCardData(); -$card->token = $_GET['token_value']; - -$address = new Address(); -$address->streetAddress1 = $_GET["Address"]; -$address->city = $_GET["City"]; -$address->state = $_GET["State"]; -$address->postalCode = preg_replace('/[^0-9]/', '', $_GET["Zip"]); -$address->country = "United States"; - -try { - $response = $card->charge(15) - ->withCurrency('USD') - ->withAddress($address) - ->withAllowDuplicates(true) - ->execute(); - - $body = '

    Success!

    '; - $body .= '

    Thank you, ' . $_GET['FirstName'] . ', for your order of $15.

    '; - - echo "Transaction Success your transaction Id is: " . $response->transactionId; - - // i'm running windows, so i had to update this: - //ini_set("SMTP", "my-mail-server"); - - sendEmail($_GET['EMAIL'], 'donotreply@e-hps.com', 'Successful Charge!', $body, true); -} catch (Exception $e) { - echo 'Failure: ' . $e->getMessage(); - exit; -} - -function sendEmail($to, $from, $subject, $body, $isHtml) { - $message = ''; - $message .= $body; - $message .= ''; - - $headers = "From: $from\r\n"; - $headers .= "Reply-To: $from\r\n"; - - if ($isHtml) { - $headers .= "MIME-Version: 1.0\r\n"; - $headers .= "Content-type: text/html; charset=ISO-8859-1\r\n"; - } - - mail($to, $subject, $message, $headers); -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/index.html b/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/index.html deleted file mode 100644 index 2ac5165..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/examples/end-to-end/index.html +++ /dev/null @@ -1,373 +0,0 @@ - - - - - - - - - - - - - - Simple Payment Form Demo - - - - - - - -
    -
    -

    PHP SecureSubmit Example

    -
    - -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    - - -

    Card Information

    -
    -
    - -
    - -
    - -
    -
    - -
    - -
    -
    - -
    - -
    -
    - -
    -
    - -
    - -
    - - - - -
    -
    - - - - diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/gift/charge.php b/classes/includes/vendor/globalpayments/php-sdk/examples/gift/charge.php deleted file mode 100644 index de9ed97..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/examples/gift/charge.php +++ /dev/null @@ -1,33 +0,0 @@ -secretApiKey = 'skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A'; -$config->serviceUrl = 'https://cert.api2.heartlandportico.com'; - -ServicesContainer::configure($config); - -try { - $card = new GiftCard(); - $card->number = $_GET["card-number"]; - - $response = $card->charge(1) - ->withCurrency('USD') - ->execute(); - - //echo $response->responseCode; - echo "Transaction success transaction Id: " . $response->transactionId; -} catch (Exception $e) { - echo $e->getMessage(); -} - - diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/gift/index.php b/classes/includes/vendor/globalpayments/php-sdk/examples/gift/index.php deleted file mode 100644 index 26d75e9..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/examples/gift/index.php +++ /dev/null @@ -1,18 +0,0 @@ - - - - - GiftCard Example - - -
    - Card Number:
    - -

    - -
    - - \ No newline at end of file diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/iframe-pay-invoice/assets/main.js b/classes/includes/vendor/globalpayments/php-sdk/examples/iframe-pay-invoice/assets/main.js deleted file mode 100644 index c3857aa..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/examples/iframe-pay-invoice/assets/main.js +++ /dev/null @@ -1,206 +0,0 @@ -(function (document, Heartland) { - // Create a new `HPS` object with the necessary configuration - var hps = new Heartland.HPS({ - publicKey: 'pkapi_cert_P6dRqs1LzfWJ6HgGVZ', - type: 'iframe', - // Configure the iframe fields to tell the library where - // the iframe should be inserted into the DOM and some - // basic options - fields: { - cardNumber: { - target: 'iframesCardNumber', - placeholder: '•••• •••• •••• ••••' - }, - cardExpiration: { - target: 'iframesCardExpiration', - placeholder: 'MM / YYYY' - }, - cardCvv: { - target: 'iframesCardCvv', - placeholder: 'CVV' - }, - submit: { - target: 'iframesSubmit' - } - }, - // Collection of CSS to inject into the iframes. - // These properties can match the site's styles - // to create a seamless experience. - style: { - 'input': { - 'background': '#fff', - 'border': '1px solid', - 'border-color': '#bbb3b9 #c7c1c6 #c7c1c6', - 'box-sizing': 'border-box', - 'font-family': 'serif', - 'font-size': '16px', - 'line-height': '1', - 'margin': '0 .5em 0 0', - 'max-width': '100%', - 'outline': '0', - 'padding': '0.5278em', - 'vertical-align': 'baseline', - 'height': '50px', - 'width': '100% !important' - }, - '#heartland-field': { - 'font-family': 'sans-serif', - 'box-sizing': 'border-box', - 'display': 'block', - 'height': '50px', - 'padding': '6px 12px', - 'font-size': '14px', - 'line-height': '1.42857143', - 'color': '#555', - 'background-color': '#fff', - 'border': '1px solid #ccc', - 'border-radius': '0px', - '-webkit-box-shadow': 'inset 0 1px 1px rgba(0,0,0,.075)', - 'box-shadow': 'inset 0 1px 1px rgba(0,0,0,.075)', - '-webkit-transition': 'border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s', - '-o-transition': 'border-color ease-in-out .15s,box-shadow ease-in-out .15s', - 'transition': 'border-color ease-in-out .15s,box-shadow ease-in-out .15s', - 'width': '100%' - }, - '#heartland-field[name=submit]': { - 'background-color': '#36b46e', - 'font-family': 'sans-serif', - 'text-transform': 'uppercase', - 'color': '#ffffff', - 'border': '0px solid transparent' - }, - '#heartland-field[name=submit]:focus': { - 'color': '#ffffff', - 'background-color': '#258851', - 'outline': 'none' - }, - '#heartland-field[name=submit]:hover': { - 'background-color': '#258851' - }, - '#heartland-field-wrapper #heartland-field:focus': { - 'border': '1px solid #3989e3', - 'outline': 'none', - 'box-shadow': 'none', - 'height': '50px' - }, - 'heartland-field-wrapper #heartland-field': { - 'height': '50px' - }, - 'input[type=submit]': { - 'box-sizing': 'border-box', - 'display': 'inline-block', - 'padding': '6px 12px', - 'margin-bottom': '0', - 'font-size': '14px', - 'font-weight': '400', - 'line-height': '1.42857143', - 'text-align': 'center', - 'white-space': 'nowrap', - 'vertical-align': 'middle', - '-ms-touch-action': 'manipulation', - 'touch-action': 'manipulation', - 'cursor': 'pointer', - '-webkit-user-select': 'none', - '-moz-user-select': 'none', - '-ms-user-select': 'none', - 'user-select': 'none', - 'background-image': 'none', - 'border': '1px solid transparent', - 'border-radius': '4px', - 'color': '#fff', - 'background-color': '#337ab7', - 'border-color': '#2e6da4' - }, - '#heartland-field[placeholder]': { - 'letter-spacing': '3px' - }, - '#heartland-field[name=cardCvv]': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/cvv1.png?raw=true) no-repeat right', - 'background-size': '63px 40px', - }, - 'input#heartland-field[name=cardNumber]': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-inputcard-blank@2x.png?raw=true) no-repeat right', - 'background-size': '55px 35px'}, - '#heartland-field.invalid.card-type-visa': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-visa@2x.png?raw=true) no-repeat right', - 'background-size': '83px 88px', - 'background-position-y': '-44px' - }, - '#heartland-field.valid.card-type-visa': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-visa@2x.png?raw=true) no-repeat right top', - 'background-size': '82px 86px' - }, - '#heartland-field.invalid.card-type-discover': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-discover@2x.png?raw=true) no-repeat right', - 'background-size': '85px 90px', - 'background-position-y': '-44px' - }, - '#heartland-field.valid.card-type-discover': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-discover@2x.png?raw=true) no-repeat right', - 'background-size': '85px 90px', - 'background-position-y': '1px' - }, - '#heartland-field.invalid.card-type-amex': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-savedcards-amex@2x.png?raw=true) no-repeat right', - 'background-size': '50px 90px', - 'background-position-y': '-44px' - }, - '#heartland-field.valid.card-type-amex': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-savedcards-amex@2x.png?raw=true) no-repeat right top', - 'background-size': '50px 90px' - }, - '#heartland-field.invalid.card-type-mastercard': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-mastercard.png?raw=true) no-repeat right', - 'background-size': '62px 105px', - 'background-position-y': '-52px' - }, - '#heartland-field.valid.card-type-mastercard': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-mastercard.png?raw=true) no-repeat right', - 'background-size': '62px 105px', - 'background-position-y': '-1px' - }, - '#heartland-field.invalid.card-type-jcb': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-jcb@2x.png?raw=true) no-repeat right', - 'background-size': '55px 94px', - 'background-position-y': '-44px' - }, - '#heartland-field.valid.card-type-jcb': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-jcb@2x.png?raw=true) no-repeat right top', - 'background-size': '55px 94px', - 'background-position-y': '2px' - }, - 'input#heartland-field[name=cardNumber]::-ms-clear': { - 'display': 'none' - } - }, - // Callback when a token is received from the service - onTokenSuccess: function (resp) { - document.querySelector("input[name=token_value]").value = resp.token_value; - Heartland.Events.removeHandler(document.getElementById('payment_form'), 'submit'); - document.getElementById('payment_form').submit(); - }, - // Callback when an error is received from the service - onTokenError: function (resp) { - alert('There was an error: ' + resp.error.message); - }, - // Callback when an event is fired within an iFrame - onEvent: function (ev) { - console.log(ev); - } - }); - - // Attach a handler to interrupt the form submission - Heartland.Events.addHandler(document.getElementById('iframes'), 'submit', function (e) { - // Prevent the form from continuing to the `action` address - e.preventDefault(); - // Tell the iframes to tokenize the data - hps.Messages.post( - { - accumulateData: true, - action: 'tokenize', - message: 'pkapi_cert_jKc1FtuyAydZhZfbB3' - }, - 'cardNumber' - ); - }); -}(document, Heartland)); \ No newline at end of file diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/iframe-pay-invoice/charge.php b/classes/includes/vendor/globalpayments/php-sdk/examples/iframe-pay-invoice/charge.php deleted file mode 100644 index a75b2a3..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/examples/iframe-pay-invoice/charge.php +++ /dev/null @@ -1,66 +0,0 @@ -secretApiKey = 'skapi_cert_MYl2AQAowiQAbLp5JesGKh7QFkcizOP2jcX9BrEMqQ'; -$config->serviceUrl = 'https://cert.api2.heartlandportico.com'; - -ServicesContainer::configure($config); - -$card = new CreditCardData(); -$card->token = $_GET['token_value']; - -$address = new Address(); -$address->streetAddress1 = $_GET["Address"]; -$address->city = $_GET["City"]; -$address->state = $_GET["State"]; -$address->postalCode = preg_replace('/[^0-9]/', '', $_GET["Zip"]); -$address->country = "United States"; - - -try { - $response = $card->charge(15) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber($_GET["invoice_number"]) - ->execute(); - - $body = '

    Success!

    '; - $body .= '

    Thank you, ' . $_GET['FirstName'] . ', for your order of $' . $_GET["payment_amount"] . '.

    '; - - echo "Transaction Success!
    Transaction Id: " . $response->transactionId; - echo "
    Invoice Number: " . $_GET["invoice_number"]; - - // i'm running windows, so i had to update this: - //ini_set("SMTP", "my-mail-server"); - - sendEmail($_GET['EMAIL'], 'donotreply@e-hps.com', 'Successful Charge!', $body, true); -} catch (Exception $e) { - echo 'Failure: ' . $e->getMessage(); - exit; -} - -function sendEmail($to, $from, $subject, $body, $isHtml) { - $message = ''; - $message .= $body; - $message .= ''; - - $headers = "From: $from\r\n"; - $headers .= "Reply-To: $from\r\n"; - - if ($isHtml) { - $headers .= "MIME-Version: 1.0\r\n"; - $headers .= "Content-type: text/html; charset=ISO-8859-1\r\n"; - } - - mail($to, $subject, $message, $headers); -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/iframe-pay-invoice/index.html b/classes/includes/vendor/globalpayments/php-sdk/examples/iframe-pay-invoice/index.html deleted file mode 100644 index 21aaa8f..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/examples/iframe-pay-invoice/index.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - - Simple Payment Form Demo - - - -
    -

    PHP SecureSubmit Example

    -
    -

    Billing Information

    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    - -

    Payment Information

    -
    - -
    - -
    -
    -
    - -
    - -
    -
    - -

    Card Information

    -
    -
    -
    - -
    - -
    -
    - -
    - -
    -
    - -
    - -
    -
    - -
    -
    -
    -
    - - -
    - - -
    -
    -
    - - - - - - diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/iframe-recurring-signup/assets/main.js b/classes/includes/vendor/globalpayments/php-sdk/examples/iframe-recurring-signup/assets/main.js deleted file mode 100644 index 3930174..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/examples/iframe-recurring-signup/assets/main.js +++ /dev/null @@ -1,207 +0,0 @@ -(function (document, Heartland) { - // Create a new `HPS` object with the necessary configuration - var hps = new Heartland.HPS({ - publicKey: 'pkapi_cert_jKc1FtuyAydZhZfbB3', - type: 'iframe', - // Configure the iframe fields to tell the library where - // the iframe should be inserted into the DOM and some - // basic options - fields: { - cardNumber: { - target: 'iframesCardNumber', - placeholder: '•••• •••• •••• ••••' - }, - cardExpiration: { - target: 'iframesCardExpiration', - placeholder: 'MM / YYYY' - }, - cardCvv: { - target: 'iframesCardCvv', - placeholder: 'CVV' - }, - submit: { - target: 'iframesSubmit' - } - }, - // Collection of CSS to inject into the iframes. - // These properties can match the site's styles - // to create a seamless experience. - style: { - 'input': { - 'background': '#fff', - 'border': '1px solid', - 'border-color': '#bbb3b9 #c7c1c6 #c7c1c6', - 'box-sizing': 'border-box', - 'font-family': 'serif', - 'font-size': '16px', - 'line-height': '1', - 'margin': '0 .5em 0 0', - 'max-width': '100%', - 'outline': '0', - 'padding': '0.5278em', - 'vertical-align': 'baseline', - 'height': '50px', - 'width': '100% !important' - }, - '#heartland-field': { - 'font-family': 'sans-serif', - 'box-sizing': 'border-box', - 'display': 'block', - 'height': '50px', - 'padding': '6px 12px', - 'font-size': '14px', - 'line-height': '1.42857143', - 'color': '#555', - 'background-color': '#fff', - 'border': '1px solid #ccc', - 'border-radius': '0px', - '-webkit-box-shadow': 'inset 0 1px 1px rgba(0,0,0,.075)', - 'box-shadow': 'inset 0 1px 1px rgba(0,0,0,.075)', - '-webkit-transition': 'border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s', - '-o-transition': 'border-color ease-in-out .15s,box-shadow ease-in-out .15s', - 'transition': 'border-color ease-in-out .15s,box-shadow ease-in-out .15s', - 'width': '100%' - }, - '#heartland-field[name=submit]': { - 'background-color': '#36b46e', - 'font-family': 'sans-serif', - 'text-transform': 'uppercase', - 'color': '#ffffff', - 'border': '0px solid transparent' - }, - '#heartland-field[name=submit]:focus': { - 'color': '#ffffff', - 'background-color': '#258851', - 'outline': 'none' - }, - '#heartland-field[name=submit]:hover': { - 'background-color': '#258851' - }, - '#heartland-field-wrapper #heartland-field:focus': { - 'border': '1px solid #3989e3', - 'outline': 'none', - 'box-shadow': 'none', - 'height': '50px' - }, - 'heartland-field-wrapper #heartland-field': { - 'height': '50px' - }, - 'input[type=submit]': { - 'box-sizing': 'border-box', - 'display': 'inline-block', - 'padding': '6px 12px', - 'margin-bottom': '0', - 'font-size': '14px', - 'font-weight': '400', - 'line-height': '1.42857143', - 'text-align': 'center', - 'white-space': 'nowrap', - 'vertical-align': 'middle', - '-ms-touch-action': 'manipulation', - 'touch-action': 'manipulation', - 'cursor': 'pointer', - '-webkit-user-select': 'none', - '-moz-user-select': 'none', - '-ms-user-select': 'none', - 'user-select': 'none', - 'background-image': 'none', - 'border': '1px solid transparent', - 'border-radius': '4px', - 'color': '#fff', - 'background-color': '#337ab7', - 'border-color': '#2e6da4' - }, - '#heartland-field[placeholder]': { - 'letter-spacing': '3px' - }, - '#heartland-field[name=cardCvv]': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/cvv1.png?raw=true) no-repeat right', - 'background-size': '63px 40px', - }, - 'input#heartland-field[name=cardNumber]': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-inputcard-blank@2x.png?raw=true) no-repeat right', - 'background-size': '55px 35px'}, - '#heartland-field.invalid.card-type-visa': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-visa@2x.png?raw=true) no-repeat right', - 'background-size': '83px 88px', - 'background-position-y': '-44px' - }, - '#heartland-field.valid.card-type-visa': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-visa@2x.png?raw=true) no-repeat right top', - 'background-size': '82px 86px' - }, - '#heartland-field.invalid.card-type-discover': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-discover@2x.png?raw=true) no-repeat right', - 'background-size': '85px 90px', - 'background-position-y': '-44px' - }, - '#heartland-field.valid.card-type-discover': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-discover@2x.png?raw=true) no-repeat right', - 'background-size': '85px 90px', - 'background-position-y': '1px' - }, - '#heartland-field.invalid.card-type-amex': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-savedcards-amex@2x.png?raw=true) no-repeat right', - 'background-size': '50px 90px', - 'background-position-y': '-44px' - }, - '#heartland-field.valid.card-type-amex': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-savedcards-amex@2x.png?raw=true) no-repeat right top', - 'background-size': '50px 90px' - }, - '#heartland-field.invalid.card-type-mastercard': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-mastercard.png?raw=true) no-repeat right', - 'background-size': '62px 105px', - 'background-position-y': '-52px' - }, - '#heartland-field.valid.card-type-mastercard': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-mastercard.png?raw=true) no-repeat right', - 'background-size': '62px 105px', - 'background-position-y': '-1px' - }, - '#heartland-field.invalid.card-type-jcb': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-jcb@2x.png?raw=true) no-repeat right', - 'background-size': '55px 94px', - 'background-position-y': '-44px' - }, - '#heartland-field.valid.card-type-jcb': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-jcb@2x.png?raw=true) no-repeat right top', - 'background-size': '55px 94px', - 'background-position-y': '2px' - }, - 'input#heartland-field[name=cardNumber]::-ms-clear': { - 'display': 'none' - } - }, - // Callback when a token is received from the service - onTokenSuccess: function (resp) { - document.querySelector("input[name=token_value]").value = resp.token_value; - document.querySelector("input[name=card_last_four]").value = resp.last_four; - Heartland.Events.removeHandler(document.getElementById('payment_form'), 'submit'); - document.getElementById('payment_form').submit(); - }, - // Callback when an error is received from the service - onTokenError: function (resp) { - alert('There was an error: ' + resp.error.message); - }, - // Callback when an event is fired within an iFrame - onEvent: function (ev) { - console.log(ev); - } - }); - - // Attach a handler to interrupt the form submission - Heartland.Events.addHandler(document.getElementById('iframes'), 'submit', function (e) { - // Prevent the form from continuing to the `action` address - e.preventDefault(); - // Tell the iframes to tokenize the data - hps.Messages.post( - { - accumulateData: true, - action: 'tokenize', - message: 'pkapi_cert_jKc1FtuyAydZhZfbB3' - }, - 'cardNumber' - ); - }); -}(document, Heartland)); \ No newline at end of file diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/iframe-recurring-signup/charge.php b/classes/includes/vendor/globalpayments/php-sdk/examples/iframe-recurring-signup/charge.php deleted file mode 100644 index 6c0ffe6..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/examples/iframe-recurring-signup/charge.php +++ /dev/null @@ -1,119 +0,0 @@ -secretApiKey = 'skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A'; -$config->serviceUrl = 'https://cert.api2.heartlandportico.com'; - -ServicesContainer::configure($config); - -$_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING); -$_GET = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING); - -function SendEmail($to, $from, $subject, $body, $isHtml) { - $message = ''; - $message .= $body; - $message .= ''; - - $headers = "From: $from\r\n"; - $headers .= "Reply-To: $from\r\n"; - - if ($isHtml) { - $headers .= "MIME-Version: 1.0\r\n"; - $headers .= "Content-type: text/html; charset=ISO-8859-1\r\n"; - } - - mail($to, $subject, $message, $headers); -} - -function getIdentifier($id) { - $identifierBase = '%s-%s' . substr(str_shuffle('abcdefghijklmnopqrstuvwxyz'), 0, 10); - return sprintf($identifierBase, date('Ymd'), $id); -} - -function createCustomer() { - $customer = new Customer(); - $customer->id = getIdentifier('Person'); - $customer->firstName = $_GET["FirstName"]; - $customer->lastName = $_GET["LastName"]; - $customer->status = 'Active'; - $customer->email = $_GET['Email']; - $customer->address = new Address(); - $customer->address->streetAddress1 = $_GET["Address"]; - $customer->address->city = $_GET["City"]; - $customer->address->province = $_GET["State"]; - $customer->address->postalCode = $_GET["Zip"]; - $customer->address->country = 'USA'; - $customer->workPhone = $_GET["PhoneNumber"]; - - $newCustomer = $customer->create(); - - return $newCustomer; -} - -function createPaymentMethod($customer) { - $card = new CreditCardData(); - $card->token = $_GET['token_value']; - - $paymentMethod = $customer->addPaymentMethod( - getIdentifier('CreditV'), $card - )->create(); - - return $paymentMethod; -} - -function createSchedule($customerKey, $paymentMethodKey, $amount) { - $schedule = new Schedule(); - - $schedule->id = getIdentifier('CreditV'); - $schedule->customerKey = $customerKey; - $schedule->paymentKey = $paymentMethodKey; - $schedule->amount = $amount; - $schedule->currency = 'USD'; - $schedule->startDate = date('mdY', strtotime("last day of next month")); - $schedule->paymentSchedule = PaymentSchedule::LAST_DAY_OF_THE_MONTH; //or PaymentSchedule::FIRST_DAY_OF_THE_MONTH - $schedule->frequency = ScheduleFrequency::MONTHLY; //'Monthly', 'Bi-Monthly', 'Quarterly', 'Semi-Annually' - //$schedule->duration = HpsPayPlanScheduleDuration::ONGOING; - $schedule->reprocessingCount = 1; - $schedule->emailReceipt = 'Never'; - $schedule->status = 'Active'; - $schedule->reprocessingCount = 1; - - $response = $schedule->create(); - - return $response; -} - -try { - $customer = createCustomer(); - $paymentMethod = createPaymentMethod($customer); - $schedule = createSchedule($customer->key, $paymentMethod->key, $_GET['payment_amount']); - - echo 'Your payment scheduled successfully
    '; - printf('Customer Key: %s
    ', $customer->key); - printf('Payment Method Key: %s
    ', $paymentMethod->key); - printf('Schedule Key: %s
    ', $schedule->key); -} catch (Exception $e) { - die($e->getMessage()); -} - - -$body = '

    Success!

    '; -$body .= '

    Thank you, ' . $_GET['FirstName'] . ', for your subscription.'; - - - -// i'm running windows, so i had to update this: -//ini_set("SMTP", "my-mail-server"); - -//SendEmail($_GET['Email'], 'donotreply@e-hps.com', 'Successful Charge!', $body, true); diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/iframe-recurring-signup/index.html b/classes/includes/vendor/globalpayments/php-sdk/examples/iframe-recurring-signup/index.html deleted file mode 100644 index dbc41bb..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/examples/iframe-recurring-signup/index.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - - Simple Recurring Payment Signup Form Demo - - - -

    -

    PHP SecureSubmit Example

    -
    -

    Billing Information

    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    - -

    Subscription Information

    -
    - -
    - -
    -
    - -

    Card Information

    -
    -
    -
    - -
    - -
    -
    - -
    - -
    -
    - -
    - -
    -
    - -
    -
    -
    -
    - -
    - - -
    -
    -
    - - - - - - diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/manual-tokenize/assets/main.js b/classes/includes/vendor/globalpayments/php-sdk/examples/manual-tokenize/assets/main.js deleted file mode 100644 index b5a5bda..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/examples/manual-tokenize/assets/main.js +++ /dev/null @@ -1,206 +0,0 @@ -(function (document, Heartland) { - // Create a new `HPS` object with the necessary configuration - var hps = new Heartland.HPS({ - publicKey: 'pkapi_cert_jKc1FtuyAydZhZfbB3', - type: 'iframe', - // Configure the iframe fields to tell the library where - // the iframe should be inserted into the DOM and some - // basic options - fields: { - cardNumber: { - target: 'iframesCardNumber', - placeholder: '•••• •••• •••• ••••' - }, - cardExpiration: { - target: 'iframesCardExpiration', - placeholder: 'MM / YYYY' - }, - cardCvv: { - target: 'iframesCardCvv', - placeholder: 'CVV' - }, - submit: { - target: 'iframesSubmit' - } - }, - // Collection of CSS to inject into the iframes. - // These properties can match the site's styles - // to create a seamless experience. - style: { - 'input': { - 'background': '#fff', - 'border': '1px solid', - 'border-color': '#bbb3b9 #c7c1c6 #c7c1c6', - 'box-sizing': 'border-box', - 'font-family': 'serif', - 'font-size': '16px', - 'line-height': '1', - 'margin': '0 .5em 0 0', - 'max-width': '100%', - 'outline': '0', - 'padding': '0.5278em', - 'vertical-align': 'baseline', - 'height': '50px', - 'width': '100% !important' - }, - '#heartland-field': { - 'font-family': 'sans-serif', - 'box-sizing': 'border-box', - 'display': 'block', - 'height': '50px', - 'padding': '6px 12px', - 'font-size': '14px', - 'line-height': '1.42857143', - 'color': '#555', - 'background-color': '#fff', - 'border': '1px solid #ccc', - 'border-radius': '0px', - '-webkit-box-shadow': 'inset 0 1px 1px rgba(0,0,0,.075)', - 'box-shadow': 'inset 0 1px 1px rgba(0,0,0,.075)', - '-webkit-transition': 'border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s', - '-o-transition': 'border-color ease-in-out .15s,box-shadow ease-in-out .15s', - 'transition': 'border-color ease-in-out .15s,box-shadow ease-in-out .15s', - 'width': '100%' - }, - '#heartland-field[name=submit]': { - 'background-color': '#36b46e', - 'font-family': 'sans-serif', - 'text-transform': 'uppercase', - 'color': '#ffffff', - 'border': '0px solid transparent' - }, - '#heartland-field[name=submit]:focus': { - 'color': '#ffffff', - 'background-color': '#258851', - 'outline': 'none' - }, - '#heartland-field[name=submit]:hover': { - 'background-color': '#258851' - }, - '#heartland-field-wrapper #heartland-field:focus': { - 'border': '1px solid #3989e3', - 'outline': 'none', - 'box-shadow': 'none', - 'height': '50px' - }, - 'heartland-field-wrapper #heartland-field': { - 'height': '50px' - }, - 'input[type=submit]': { - 'box-sizing': 'border-box', - 'display': 'inline-block', - 'padding': '6px 12px', - 'margin-bottom': '0', - 'font-size': '14px', - 'font-weight': '400', - 'line-height': '1.42857143', - 'text-align': 'center', - 'white-space': 'nowrap', - 'vertical-align': 'middle', - '-ms-touch-action': 'manipulation', - 'touch-action': 'manipulation', - 'cursor': 'pointer', - '-webkit-user-select': 'none', - '-moz-user-select': 'none', - '-ms-user-select': 'none', - 'user-select': 'none', - 'background-image': 'none', - 'border': '1px solid transparent', - 'border-radius': '4px', - 'color': '#fff', - 'background-color': '#337ab7', - 'border-color': '#2e6da4' - }, - '#heartland-field[placeholder]': { - 'letter-spacing': '3px' - }, - '#heartland-field[name=cardCvv]': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/cvv1.png?raw=true) no-repeat right', - 'background-size': '63px 40px', - }, - 'input#heartland-field[name=cardNumber]': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-inputcard-blank@2x.png?raw=true) no-repeat right', - 'background-size': '55px 35px'}, - '#heartland-field.invalid.card-type-visa': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-visa@2x.png?raw=true) no-repeat right', - 'background-size': '83px 88px', - 'background-position-y': '-44px' - }, - '#heartland-field.valid.card-type-visa': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-visa@2x.png?raw=true) no-repeat right top', - 'background-size': '82px 86px' - }, - '#heartland-field.invalid.card-type-discover': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-discover@2x.png?raw=true) no-repeat right', - 'background-size': '85px 90px', - 'background-position-y': '-44px' - }, - '#heartland-field.valid.card-type-discover': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-discover@2x.png?raw=true) no-repeat right', - 'background-size': '85px 90px', - 'background-position-y': '1px' - }, - '#heartland-field.invalid.card-type-amex': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-savedcards-amex@2x.png?raw=true) no-repeat right', - 'background-size': '50px 90px', - 'background-position-y': '-44px' - }, - '#heartland-field.valid.card-type-amex': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-savedcards-amex@2x.png?raw=true) no-repeat right top', - 'background-size': '50px 90px' - }, - '#heartland-field.invalid.card-type-mastercard': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-mastercard.png?raw=true) no-repeat right', - 'background-size': '62px 105px', - 'background-position-y': '-52px' - }, - '#heartland-field.valid.card-type-mastercard': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-mastercard.png?raw=true) no-repeat right', - 'background-size': '62px 105px', - 'background-position-y': '-1px' - }, - '#heartland-field.invalid.card-type-jcb': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-jcb@2x.png?raw=true) no-repeat right', - 'background-size': '55px 94px', - 'background-position-y': '-44px' - }, - '#heartland-field.valid.card-type-jcb': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-jcb@2x.png?raw=true) no-repeat right top', - 'background-size': '55px 94px', - 'background-position-y': '2px' - }, - 'input#heartland-field[name=cardNumber]::-ms-clear': { - 'display': 'none' - } - }, - // Callback when a token is received from the service - onTokenSuccess: function (resp) { - document.querySelector("input[name=token_value]").value = resp.token_value; - Heartland.Events.removeHandler(document.getElementById('payment_form'), 'submit'); - document.getElementById('payment_form').submit(); - }, - // Callback when an error is received from the service - onTokenError: function (resp) { - alert('There was an error: ' + resp.error.message); - }, - // Callback when an event is fired within an iFrame - onEvent: function (ev) { - console.log(ev); - } - }); - - // Attach a handler to interrupt the form submission - Heartland.Events.addHandler(document.getElementById('iframes'), 'submit', function (e) { - // Prevent the form from continuing to the `action` address - e.preventDefault(); - // Tell the iframes to tokenize the data - hps.Messages.post( - { - accumulateData: true, - action: 'tokenize', - message: 'pkapi_cert_jKc1FtuyAydZhZfbB3' - }, - 'cardNumber' - ); - }); -}(document, Heartland)); \ No newline at end of file diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/manual-tokenize/charge.php b/classes/includes/vendor/globalpayments/php-sdk/examples/manual-tokenize/charge.php deleted file mode 100644 index 35e5e6d..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/examples/manual-tokenize/charge.php +++ /dev/null @@ -1,66 +0,0 @@ -secretApiKey = 'skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A'; -$config->serviceUrl = 'https://cert.api2.heartlandportico.com'; - -ServicesContainer::configure($config); - -$card = new CreditCardData(); -$card->token = $_GET['token_value']; - -$address = new Address(); -$address->streetAddress1 = $_GET["Address"]; -$address->city = $_GET["City"]; -$address->state = $_GET["State"]; -$address->postalCode = preg_replace('/[^0-9]/', '', $_GET["Zip"]); -$address->country = "United States"; - -try { - $response = $card->charge(15) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber($_GET["invoice_number"]) - ->withAllowDuplicates(true) - ->execute(); - - $body = '

    Success!

    '; - $body .= '

    Thank you, ' . $_GET['FirstName'] . ', for your order of $' . $_GET["payment_amount"] . '.

    '; - - echo "Transaction Id: " . $response->transactionId; - echo "
    Invoice Number: " . $_GET["invoice_number"]; - - // i'm running windows, so i had to update this: - //ini_set("SMTP", "my-mail-server"); - - sendEmail($_GET['EMAIL'], 'donotreply@e-hps.com', 'Successful Charge!', $body, true); -} catch (Exception $e) { - echo 'Failure: ' . $e->getMessage(); - exit; -} - -function sendEmail($to, $from, $subject, $body, $isHtml) { - $message = ''; - $message .= $body; - $message .= ''; - - $headers = "From: $from\r\n"; - $headers .= "Reply-To: $from\r\n"; - - if ($isHtml) { - $headers .= "MIME-Version: 1.0\r\n"; - $headers .= "Content-type: text/html; charset=ISO-8859-1\r\n"; - } - - mail($to, $subject, $message, $headers); -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/manual-tokenize/index.html b/classes/includes/vendor/globalpayments/php-sdk/examples/manual-tokenize/index.html deleted file mode 100644 index 469bc62..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/examples/manual-tokenize/index.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - - Simple Payment Form Demo - - - - - - -
    -

    PHP SecureSubmit Example

    -
    -

    Billing Information

    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    - -

    Payment Information

    -
    - -
    - -
    -
    -
    - -
    - -
    -
    - -

    Card Information

    -
    -
    -
    - -
    - -
    -
    - -
    - -
    -
    - -
    - -
    -
    - -
    -
    -
    -
    - -
    - -
    -
    - - - - diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/pay-invoice/assets/main.js b/classes/includes/vendor/globalpayments/php-sdk/examples/pay-invoice/assets/main.js deleted file mode 100644 index c3857aa..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/examples/pay-invoice/assets/main.js +++ /dev/null @@ -1,206 +0,0 @@ -(function (document, Heartland) { - // Create a new `HPS` object with the necessary configuration - var hps = new Heartland.HPS({ - publicKey: 'pkapi_cert_P6dRqs1LzfWJ6HgGVZ', - type: 'iframe', - // Configure the iframe fields to tell the library where - // the iframe should be inserted into the DOM and some - // basic options - fields: { - cardNumber: { - target: 'iframesCardNumber', - placeholder: '•••• •••• •••• ••••' - }, - cardExpiration: { - target: 'iframesCardExpiration', - placeholder: 'MM / YYYY' - }, - cardCvv: { - target: 'iframesCardCvv', - placeholder: 'CVV' - }, - submit: { - target: 'iframesSubmit' - } - }, - // Collection of CSS to inject into the iframes. - // These properties can match the site's styles - // to create a seamless experience. - style: { - 'input': { - 'background': '#fff', - 'border': '1px solid', - 'border-color': '#bbb3b9 #c7c1c6 #c7c1c6', - 'box-sizing': 'border-box', - 'font-family': 'serif', - 'font-size': '16px', - 'line-height': '1', - 'margin': '0 .5em 0 0', - 'max-width': '100%', - 'outline': '0', - 'padding': '0.5278em', - 'vertical-align': 'baseline', - 'height': '50px', - 'width': '100% !important' - }, - '#heartland-field': { - 'font-family': 'sans-serif', - 'box-sizing': 'border-box', - 'display': 'block', - 'height': '50px', - 'padding': '6px 12px', - 'font-size': '14px', - 'line-height': '1.42857143', - 'color': '#555', - 'background-color': '#fff', - 'border': '1px solid #ccc', - 'border-radius': '0px', - '-webkit-box-shadow': 'inset 0 1px 1px rgba(0,0,0,.075)', - 'box-shadow': 'inset 0 1px 1px rgba(0,0,0,.075)', - '-webkit-transition': 'border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s', - '-o-transition': 'border-color ease-in-out .15s,box-shadow ease-in-out .15s', - 'transition': 'border-color ease-in-out .15s,box-shadow ease-in-out .15s', - 'width': '100%' - }, - '#heartland-field[name=submit]': { - 'background-color': '#36b46e', - 'font-family': 'sans-serif', - 'text-transform': 'uppercase', - 'color': '#ffffff', - 'border': '0px solid transparent' - }, - '#heartland-field[name=submit]:focus': { - 'color': '#ffffff', - 'background-color': '#258851', - 'outline': 'none' - }, - '#heartland-field[name=submit]:hover': { - 'background-color': '#258851' - }, - '#heartland-field-wrapper #heartland-field:focus': { - 'border': '1px solid #3989e3', - 'outline': 'none', - 'box-shadow': 'none', - 'height': '50px' - }, - 'heartland-field-wrapper #heartland-field': { - 'height': '50px' - }, - 'input[type=submit]': { - 'box-sizing': 'border-box', - 'display': 'inline-block', - 'padding': '6px 12px', - 'margin-bottom': '0', - 'font-size': '14px', - 'font-weight': '400', - 'line-height': '1.42857143', - 'text-align': 'center', - 'white-space': 'nowrap', - 'vertical-align': 'middle', - '-ms-touch-action': 'manipulation', - 'touch-action': 'manipulation', - 'cursor': 'pointer', - '-webkit-user-select': 'none', - '-moz-user-select': 'none', - '-ms-user-select': 'none', - 'user-select': 'none', - 'background-image': 'none', - 'border': '1px solid transparent', - 'border-radius': '4px', - 'color': '#fff', - 'background-color': '#337ab7', - 'border-color': '#2e6da4' - }, - '#heartland-field[placeholder]': { - 'letter-spacing': '3px' - }, - '#heartland-field[name=cardCvv]': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/cvv1.png?raw=true) no-repeat right', - 'background-size': '63px 40px', - }, - 'input#heartland-field[name=cardNumber]': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-inputcard-blank@2x.png?raw=true) no-repeat right', - 'background-size': '55px 35px'}, - '#heartland-field.invalid.card-type-visa': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-visa@2x.png?raw=true) no-repeat right', - 'background-size': '83px 88px', - 'background-position-y': '-44px' - }, - '#heartland-field.valid.card-type-visa': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-visa@2x.png?raw=true) no-repeat right top', - 'background-size': '82px 86px' - }, - '#heartland-field.invalid.card-type-discover': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-discover@2x.png?raw=true) no-repeat right', - 'background-size': '85px 90px', - 'background-position-y': '-44px' - }, - '#heartland-field.valid.card-type-discover': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-discover@2x.png?raw=true) no-repeat right', - 'background-size': '85px 90px', - 'background-position-y': '1px' - }, - '#heartland-field.invalid.card-type-amex': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-savedcards-amex@2x.png?raw=true) no-repeat right', - 'background-size': '50px 90px', - 'background-position-y': '-44px' - }, - '#heartland-field.valid.card-type-amex': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-savedcards-amex@2x.png?raw=true) no-repeat right top', - 'background-size': '50px 90px' - }, - '#heartland-field.invalid.card-type-mastercard': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-mastercard.png?raw=true) no-repeat right', - 'background-size': '62px 105px', - 'background-position-y': '-52px' - }, - '#heartland-field.valid.card-type-mastercard': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-mastercard.png?raw=true) no-repeat right', - 'background-size': '62px 105px', - 'background-position-y': '-1px' - }, - '#heartland-field.invalid.card-type-jcb': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-jcb@2x.png?raw=true) no-repeat right', - 'background-size': '55px 94px', - 'background-position-y': '-44px' - }, - '#heartland-field.valid.card-type-jcb': { - 'background': 'transparent url(https://github.com/hps/heartland-php/blob/master/examples/end-to-end/assets/images/ss-saved-jcb@2x.png?raw=true) no-repeat right top', - 'background-size': '55px 94px', - 'background-position-y': '2px' - }, - 'input#heartland-field[name=cardNumber]::-ms-clear': { - 'display': 'none' - } - }, - // Callback when a token is received from the service - onTokenSuccess: function (resp) { - document.querySelector("input[name=token_value]").value = resp.token_value; - Heartland.Events.removeHandler(document.getElementById('payment_form'), 'submit'); - document.getElementById('payment_form').submit(); - }, - // Callback when an error is received from the service - onTokenError: function (resp) { - alert('There was an error: ' + resp.error.message); - }, - // Callback when an event is fired within an iFrame - onEvent: function (ev) { - console.log(ev); - } - }); - - // Attach a handler to interrupt the form submission - Heartland.Events.addHandler(document.getElementById('iframes'), 'submit', function (e) { - // Prevent the form from continuing to the `action` address - e.preventDefault(); - // Tell the iframes to tokenize the data - hps.Messages.post( - { - accumulateData: true, - action: 'tokenize', - message: 'pkapi_cert_jKc1FtuyAydZhZfbB3' - }, - 'cardNumber' - ); - }); -}(document, Heartland)); \ No newline at end of file diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/pay-invoice/charge.php b/classes/includes/vendor/globalpayments/php-sdk/examples/pay-invoice/charge.php deleted file mode 100644 index add3c51..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/examples/pay-invoice/charge.php +++ /dev/null @@ -1,74 +0,0 @@ -secretApiKey = 'skapi_cert_MYl2AQAowiQAbLp5JesGKh7QFkcizOP2jcX9BrEMqQ'; -$config->serviceUrl = 'https://cert.api2.heartlandportico.com'; - -ServicesContainer::configure($config); - -$card = new CreditCardData(); -$card->token = $_GET['token_value']; - -$address = new Address(); -$address->streetAddress1 = $_GET["Address"]; -$address->city = $_GET["City"]; -$address->state = $_GET["State"]; -$address->postalCode = preg_replace('/[^0-9]/', '', $_GET["Zip"]); -$address->country = "United States"; - -/* - $validCardHolder = new HpsCardHolder(); - $validCardHolder->firstName = $_GET["FirstName"]; - $validCardHolder->lastName = $_GET["LastName"]; - $validCardHolder->address = $address; - $validCardHolder->phoneNumber = preg_replace('/[^0-9]/', '', $_GET["PhoneNumber"]); - */ - -try { - $response = $card->charge(15) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber($_GET["invoice_number"]) - ->withAllowDuplicates(true) - ->execute(); - - $body = '

    Success!

    '; - $body .= '

    Thank you, ' . $_GET['FirstName'] . ', for your order of $' . $_GET["payment_amount"] . '.

    '; - - echo "Transaction Id: " . $response->transactionId; - echo "
    Invoice Number: " . $_GET["invoice_number"]; - - // i'm running windows, so i had to update this: - //ini_set("SMTP", "my-mail-server"); - - sendEmail($_GET['EMAIL'], 'donotreply@e-hps.com', 'Successful Charge!', $body, true); -} catch (Exception $e) { - echo 'Failure: ' . $e->getMessage(); - exit; -} - -function sendEmail($to, $from, $subject, $body, $isHtml) { - $message = ''; - $message .= $body; - $message .= ''; - - $headers = "From: $from\r\n"; - $headers .= "Reply-To: $from\r\n"; - - if ($isHtml) { - $headers .= "MIME-Version: 1.0\r\n"; - $headers .= "Content-type: text/html; charset=ISO-8859-1\r\n"; - } - - mail($to, $subject, $message, $headers); -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/pay-invoice/index.html b/classes/includes/vendor/globalpayments/php-sdk/examples/pay-invoice/index.html deleted file mode 100644 index 4bfe929..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/examples/pay-invoice/index.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - Simple Payment Form Demo - - - - - -
    -

    PHP SecureSubmit Example

    -
    -

    Billing Information

    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    - -

    Payment Information

    -
    - -
    - -
    -
    -
    - -
    - -
    -
    - -

    Card Information

    -
    -
    - -
    - -
    - -
    -
    - -
    - -
    -
    - -
    - -
    -
    - -
    -
    - -
    - -
    - -
    - -
    -
    - - - - - diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/point-of-sale/e3-swipe/assets/apples.png b/classes/includes/vendor/globalpayments/php-sdk/examples/point-of-sale/e3-swipe/assets/apples.png deleted file mode 100644 index f0542ab87010c4d58386856c5f4a80b4df4e21f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56960 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%0Dk@L*Ma+;Is~IdB0%*j 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
    BH8YF6Th4cXMbc#_DnMH z4%6~0Z)p44!{p`%l;x9Sw?o&3m^nA^I}tG3>PYgkOMUhlgZvd`{AZCYbTE(zPy#&f zoQ2@x1+wTCZMb~t_X*Ia!F>r$9b3}3qMEzZt|m%IIA^F>m`}~KlwcNBhI-_ zAifaoRC9jiZ1rus*HKFj(?Kjf%}mxFj6NQcjvjRU4_Y=iHi%W+vZq3`505=jdr~4V zgLa@!56ROfRfWRstO91O&?*zrMo6^WE{=mGn|86RfGDh|?5Dx?r>p^7pe|801aWxS z4f*@mNQ~j1mk+wu0y7+$iBwhu#VC9BKRll-g|w|erC;a_m_dF@8)E(5eUj|#fnH_N z!U+rfWb18KG%GsA zQoClR68cM`?bOCg-JRc8Q&zW$hBetiIeq$tBnOhjr7s-(@UfZag3{pBa`ADkeB0qd zn`#Yr!FSc9N^G0x!0FPA=~B|EnSn=%^4=hw5k{sE7e*i9u%`B}Px6e8Yc_ui;&(L6 zScC3M$6{6`d^T64x*nfFW-nKp#-Q!a7u}7a*8a&jR?ug55B6#tH3G^FeeC`@ccfc+ z;IpRT7f7GY%{@(6(LXY+TPL*W**W_Um>*@3N5O+$PcuvtRrieRQMF3C3vRVR&x^1^ zLcoxKN9{Var{5KtZ9$Wu=fBzOZ}<{_$NF+fz2_p(zgm-4#`VQV`dUsfTha3pP&%MD z%|2ejEk5Q=`d|7HXH}m$G-}>9_Gj&PXh4oyAj^L$m$MGS_4j+p4|>V%A7^Yj_E?AA z02d}~d-gaFyg30i*uA*nTO^^d83OU0PiHj&7@`Q0hSGnY<_L`y2hsCjXp~lI9P1+${rpK3H;}i>Gc5phMaAH)T9)E`%v=J7pUTMY|BgQOJ?xMSconC0_hA_^LhyT zqt8I_@2`!(MyN$ceWBi#)Y%ZipF+qIi>wp>lLn6v$J9KX0~lX6?kXCOEKA-7vcWN; z`?&mm_m1h_&hHx`ch=*1U{8*eso&1b_bf^HRXZVE{Ca9&PwJQNeMCG@@YNg#y~*Q~ z5~%b1$9JFSw3p{7S-et?vPs-Z5D^DY)_dq@M{LheI3$c7@&aLzjJmGhsEX$qgbil( zVtO{3eR<xQ}=V!KV8&issO~fF)(HvTsywl&WeL*dv0Q?wQ#} z%oPn~Ku)$qbak`X;e$Yh3~58IDOXY>I2G^!?|p=!Lj$;mV0J^OJy57_lIki)j?t$~ za`rz8hr!+djK##n6d8fl<KZq-XWwYv`(=)8^@S-t#_g8&zR~AwS zY+-@Oyj)bvnz&v+s+?=rvhEVaxA4;voegfm$H_zhJPafY+()wYmxR=@Y(?mxCH5Hw zp|o#^n(yTC6W@*GQYh zTl@F?e8s#TWN4{=X3(?`UE=KBxl;%|Q#;0c-ZMkR6lk2z5m@aN3OGw&qMYC!Vz z#{Ap!4uMo@$l)8QuFK(Csit>V$+Kr!i8#+1FDzy#^IW~r_;^UY)~))tl9UbMq&^X9 znn-5C7N#xMRz3? z&UL+-=ke1HEZnE(rIBwB5n*Q*Q(~JB8KPDE@>D6@T57(h`LI>p!sC|s*RRZ+g!Lv- zjyI4dI?5&`HQkIEJEAmJh73rvLNCqek;0xW|C_ft#mdh%KvpW^|LOW2vk4>Y@b% zZI&4dpMCV9A_b#M{B^RcS+AB&*dj7 ziC!B2JPB(8+Bn)?%}cBRSI`d&PU23&yfl0i{&lzgXfFvcUzstTlBhp9fbP>7{PWcR g|6l*_$^g=^>)BnHn;-@>*=J_R&x152uj=P<= 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 diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/point-of-sale/e3-swipe/assets/secure.submit-1.1.0.js b/classes/includes/vendor/globalpayments/php-sdk/examples/point-of-sale/e3-swipe/assets/secure.submit-1.1.0.js deleted file mode 100644 index de741e2..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/examples/point-of-sale/e3-swipe/assets/secure.submit-1.1.0.js +++ /dev/null @@ -1,266 +0,0 @@ -/*global $, jQuery*/ -var hps = (function ($) { - "use strict"; - - var HPS; - - HPS = { - - Tag: "SecureSubmit", - - Urls: { - CERT: "https://cert.api2.heartlandportico.com/Hps.Exchange.PosGateway.Hpf.v1/api/token", - PROD: "https://api2.heartlandportico.com/SecureSubmit.v1/api/token" - }, - - tokenize: function (options) { - var gateway_url, params, env; - - // add additional service parameters - params = $.param({ - "api_key": options.data.public_key, - "object": "token", - "token_type": "supt", - "_method": "post", - "card[number]": $.trim(options.data.number), - "card[cvc]": $.trim(options.data.cvc), - "card[exp_month]": $.trim(options.data.exp_month), - "card[exp_year]": $.trim(options.data.exp_year) - }); - - env = options.data.public_key.split("_")[1]; - - if (env === "cert") { - gateway_url = HPS.Urls.CERT; - } else { - gateway_url = HPS.Urls.PROD; - } - - // request token - $.ajax({ - cache: false, - url: gateway_url, - data: params, - dataType: "jsonp", - success: function (response) { - - // Request failed, handle error - if (typeof response.error === 'object') { - // call error handler if provided and valid - if (typeof options.error === 'function') { - options.error(response.error); - } else { - // handle exception - HPS.error(response.error.message); - } - } else if (typeof options.success === 'function') { - options.success(response); - } - } - }); - }, - - tokenize_swipe: function (options) { - var gateway_url, params, env; - - params = $.param({ - "api_key": options.data.public_key, - "object": "token", - "token_type": "supt", - "_method": "post", - "card[track_method]": "swipe", - "card[track]": $.trim(options.data.track) - }); - - env = options.data.public_key.split("_")[1]; - - if (env === "cert") { - gateway_url = HPS.Urls.CERT; - } else { - gateway_url = HPS.Urls.PROD; - } - - // request token - $.ajax({ - cache: false, - url: gateway_url, - data: params, - dataType: "jsonp", - success: function (response) { - - // Request failed, handle error - if (typeof response.error === 'object') { - // call error handler if provided and valid - if (typeof options.error === 'function') { - options.error(response.error); - } else { - // handle exception - HPS.error(response.error.message); - } - } else if (typeof options.success === 'function') { - options.success(response); - } - } - }); - }, - - trim: function (string) { - - if (string !== undefined && typeof string === "string") { - - string = string.toString().replace(/^\s\s*/, '').replace(/\s\s*$/, ''); - } - - return string; - }, - - empty: function (val) { - return val === undefined || val.length === 0; - }, - - error: function (message) { - $.error([HPS.Tag, ": ", message].join("")); - }, - - configureElement: function (options) { - - // set plugin data - $(this).data(HPS.Tag, { - public_key: options.public_key, - success: options.success, - error: options.error - }); - - // add event handler for form submission - $(this).submit(function (e) { - - var theForm, data, i, cardType; - - // stop form from submitting - e.preventDefault(); - - // remove name attributes from sensitive fields - $("#card_number").removeAttr("name"); - $("#card_cvc").removeAttr("name"); - $("#exp_month").removeAttr("name"); - $("#exp_year").removeAttr("name"); - - theForm = $(this); - - // get data from storage - data = theForm.data(HPS.Tag); - - // validate form - jQuery validate plugin - if (typeof theForm.validate === 'function') { - theForm.validate(); - // validation failed - if (!theForm.valid()) { - return; - } - } - - HPS.tokenize({ - data: { - public_key: data.public_key, - number: $.trim($("#card_number").val()), - cvc: $.trim($("#card_cvc").val()), - exp_month: $.trim($("#exp_month").val()), - exp_year: $.trim($("#exp_year").val()) - }, - success: function (response) { - // create field and append to form - $("").attr({ - type: "hidden", - id: "token_value", - name: "token_value", - value: jresponse.token_value - }).appendTo(theForm); - - var re = { - visa: /^4[0-9]{12}(?:[0-9]{3})?$/, - mastercard: /^5[1-5][0-9]{14}$/, - amex: /^3[47][0-9]{13}$/, - diners: /^3(?:0[0-5]|[68][0-9])[0-9]{11}$/, - discover: /^6(?:011|5[0-9]{2})[0-9]{12}$/, - jcb: /^(?:2131|1800|35\d{3})\d{11}$/ - }; - - if (re.visa.test($.trim($("#card_number").val()))) { - cardType = 'visa'; - } else if (re.mastercard.test($.trim($("#card_number").val()))) { - cardType = 'mastercard'; - } else if (re.amex.test($.trim($("#card_number").val()))) { - cardType = 'amex'; - } else if (re.diners.test($.trim($("#card_number").val()))) { - cardType = 'diners'; - } else if (re.discover.test($.trim($("#card_number").val()))) { - cardType = 'discover'; - } else if (re.jcb.test($.trim($("#card_number").val()))) { - cardType = 'jcb'; - } - - $("").attr({ - type: "hidden", - id: "card_type", - name: "card_type", - value: cardType - }).appendTo(theForm); - - $("").attr({ - type: "hidden", - id: "exp_month", - name: "exp_month", - value: $.trim($("#exp_month").val()) - }).appendTo(theForm); - - $("").attr({ - type: "hidden", - id: "exp_year", - name: "exp_year", - value: $.trim($("#exp_year").val()) - }).appendTo(theForm); - - $("").attr({ - type: "hidden", - id: "last_four", - name: "last_four", - value: $("#card_number").val().slice(-4) - }).appendTo(theForm); - - // success handler provided - if (typeof data.success === 'function') { - // call the handler with payload - if (data.success(response) === false) { - return; // stop processing - } - } - - theForm.unbind('submit'); // unbind event handler - theForm.submit(); // submit the form - }, - error: function (response) { - if (typeof data.error === 'function') { - data.error(response); - } - } - }); - - }); - } - }; - - $.fn.SecureSubmit = function (options) { - - return this.each(function () { - if (!$(this).is("form") || typeof options !== 'object' || HPS.hasData($(this))) { - - return; - } - - HPS.configureElement.apply(this, [options]); - }); - }; - - return HPS; -}(jQuery)); - diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/point-of-sale/e3-swipe/charge.php b/classes/includes/vendor/globalpayments/php-sdk/examples/point-of-sale/e3-swipe/charge.php deleted file mode 100644 index 3072fc9..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/examples/point-of-sale/e3-swipe/charge.php +++ /dev/null @@ -1,75 +0,0 @@ -secretApiKey = 'skapi_cert_MYl2AQAowiQAbLp5JesGKh7QFkcizOP2jcX9BrEMqQ'; -$config->serviceUrl = 'https://cert.api2.heartlandportico.com'; - -ServicesContainer::configure($config); - -$card = new CreditCardData(); -$card->token = $_GET['securesubmit_token']; - -try { - $response = $card->charge(28.97) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - - $body = '

    Success!

    '; - $body .= '

    Thank you, for your order of $15.

    '; - - echo "Transaction Success your transaction Id is: " . $response->transactionId; -} catch (Exception $e) { - echo 'Failure: ' . $e->getMessage(); - exit; -} -?> - - - - - - - - - Simple Payment Form Demo - - - - - - - - -
    -
    -
    -
    -

     Thank you for your order.

    -

    Order Id: transactionId ?>

    -

    - Your order has been processed and a reciept has been emailed to the account we have on file. -

    -
    -
    - -

    What just happened?

    -
      -
    •  The encrypted card data was collected from the reader.

    • -
    •  The encrypted data was sent directly to Heartland for tokenization.

    • -
    •  The corresponding token was added to the form as a hidden input.

    • -
    •  The form was submitted and the token was charged.

    • -
    -

    An encrypted card was sent over an SSL, encrypted connection where it was tokenized. This token was then submitted to the merchant and charged. Yes please.

    -
    - - diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/point-of-sale/e3-swipe/index.html b/classes/includes/vendor/globalpayments/php-sdk/examples/point-of-sale/e3-swipe/index.html deleted file mode 100644 index f501dc9..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/examples/point-of-sale/e3-swipe/index.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - - Simple Payment Form Demo - - - - - - - - -
    -

    PHP POS SecureSubmit Example

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     SKUItemQuantityPrice
    BA0001Very Tasty Banana Bundle - 2$4.99
    OR1021High Vitamin C, Certified Organic, Sun-Grown Oranges - 5$12.99
    AP1973Certified Organic Granny Smith Green Apples - 10$10.99
     Total:$28.97
     
    - - - -
    - - - diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/recurring-signup-ach/charge.php b/classes/includes/vendor/globalpayments/php-sdk/examples/recurring-signup-ach/charge.php deleted file mode 100644 index e76855e..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/examples/recurring-signup-ach/charge.php +++ /dev/null @@ -1,125 +0,0 @@ -'; - $message .= $body; - $message .= ''; - - $headers = "From: $from\r\n"; - $headers .= "Reply-To: $from\r\n"; - - if ($isHtml) { - $headers .= "MIME-Version: 1.0\r\n"; - $headers .= "Content-type: text/html; charset=ISO-8859-1\r\n"; - } - - mail($to, $subject, $message, $headers); -} - -function getIdentifier($id) { - $identifierBase = '%s-%s' . substr(str_shuffle('abcdefghijklmnopqrstuvwxyz'), 0, 10); - return sprintf($identifierBase, date('Ymd'), $id); -} - -function createCustomer() { - $customer = new Customer(); - $customer->id = getIdentifier('Person'); - $customer->firstName = $_GET["FirstName"]; - $customer->lastName = $_GET["LastName"]; - $customer->status = 'Active'; - $customer->email = $_GET['Email']; - $customer->address = new Address(); - $customer->address->streetAddress1 = $_GET["Address"]; - $customer->address->city = $_GET["City"]; - $customer->address->province = $_GET["State"]; - $customer->address->postalCode = $_GET["Zip"]; - $customer->address->country = 'USA'; - $customer->workPhone = $_GET["PhoneNumber"]; - $customer->key = $customer->id; - - $newCustomer = $customer->create(); - - return $newCustomer; -} - -function createPaymentMethod($customer) { - $check = new ECheck(); - $check->accountType = $_GET['account_type']; - $check->checkType = $_GET['check_type']; - $check->secCode = SecCode::WEB; - $check->routingNumber = $_GET['RoutingNumber']; - $check->accountNumber = $_GET['AccountNumber']; - - $paymentMethod = $customer->addPaymentMethod( - getIdentifier('CreditV'), $check - )->create(); - - return $paymentMethod; -} - -function createSchedule($customerKey, $paymentMethodKey, $amount) { - $schedule = new Schedule(); - - $schedule->id = getIdentifier('CreditV'); - $schedule->customerKey = $customerKey; - $schedule->paymentKey = $paymentMethodKey; - $schedule->amount = $amount; - $schedule->currency = 'USD'; - $schedule->startDate = date('mdY', strtotime("last day of next month")); - $schedule->paymentSchedule = PaymentSchedule::LAST_DAY_OF_THE_MONTH; //or PaymentSchedule::FIRST_DAY_OF_THE_MONTH - $schedule->frequency = ScheduleFrequency::MONTHLY; //'Monthly', 'Bi-Monthly', 'Quarterly', 'Semi-Annually' - //$schedule->duration = HpsPayPlanScheduleDuration::ONGOING; - $schedule->reprocessingCount = 1; - $schedule->emailReceipt = 'Never'; - $schedule->status = 'Active'; - - $response = $schedule->create(); - - return $response; -} - -$config = new ServicesConfig(); -$config->secretApiKey = 'skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A'; -$config->serviceUrl = 'https://cert.api2.heartlandportico.com'; - -ServicesContainer::configure($config); - -$_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING); -$_GET = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING); - -try { - $customer = createCustomer(); - $paymentMethod = createPaymentMethod($customer); - $schedule = createSchedule($customer->key, $paymentMethod->key, $_GET['payment_amount']); - - echo 'Your ACH payment scheduled successfully
    '; - printf('Customer Key: %s
    ', $customer->key); - printf('Payment Method Key: %s
    ', $paymentMethod->key); - printf('Schedule Key: %s
    ', $schedule->key); -} catch (Exception $e) { - die($e->getMessage()); -} - - -$body = '

    Success!

    '; -$body .= '

    Thank you, ' . $_GET['FirstName'] . ', for your subscription.'; - - -// i'm running windows, so i had to update this: -//ini_set("SMTP", "my-mail-server"); - -//SendEmail($_GET['Email'], 'donotreply@e-hps.com', 'Successful Charge!', $body, true); diff --git a/classes/includes/vendor/globalpayments/php-sdk/examples/recurring-signup-ach/index.html b/classes/includes/vendor/globalpayments/php-sdk/examples/recurring-signup-ach/index.html deleted file mode 100644 index 6a5257b..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/examples/recurring-signup-ach/index.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - - Simple Recurring Payment Signup Form Demo - - - -

    -

    PHP SecureSubmit Example

    -
    -

    Billing Information

    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    - -

    Subscription Information

    -
    - -
    - -
    -
    - -

    ACH Information

    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    - -
    - -
    -
    -
    - - diff --git a/classes/includes/vendor/globalpayments/php-sdk/phpcs.xml b/classes/includes/vendor/globalpayments/php-sdk/phpcs.xml deleted file mode 100644 index b72a034..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/phpcs.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - ./src - - diff --git a/classes/includes/vendor/globalpayments/php-sdk/phpunit.xml.dist b/classes/includes/vendor/globalpayments/php-sdk/phpunit.xml.dist deleted file mode 100644 index 1993192..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/phpunit.xml.dist +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - ./test/ - - - ./test/Unit/ - - - ./test/Integration/ - - - ./test/Integration/Gateways/PorticoConnector/Certifications/ - ./test/Integration/Gateways/RealexConnector/Certifications/ - - - ./test/Integration/Gateways/PorticoConnector/ - - - ./test/Integration/Gateways/RealexConnector/ - - - - - - - ./src/ - - ./test/ - - - - - diff --git a/classes/includes/vendor/globalpayments/php-sdk/sami.phar b/classes/includes/vendor/globalpayments/php-sdk/sami.phar deleted file mode 100644 index c341b0430a00e0315438085d93c73c01410a1ed6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2461851 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

    X~E;9!Q2^$~@Dor2{AVw4AWvnIMy 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�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
      ZBrpS6;%x?+uxEPJ-9ewi( zo8l0Z5(&Z#nlc@IS`I#VDc2bw^D4Q40u}6VeHKB%3mND5FU5Vk@8?Z`{!S9&C^BKU^xyvm=xpDumRV#+*}L0H`OpvYoUI}EPc);b-Z@iGtsCeu@) zWA2+_f(3W{yabUK1USGc*n7RNv(~IJ{E=3edm(=fo+{>u!s@1fi(RIzQ__ee5mM%y z7PQTULQS6uVgX)51`2_EJ*vNu1R6exW?E|^X(f<-!h{6XnJR6kwc4u~orr?WGHGjb z1*E*T%(!Sn-e8{%W-(*xv~HfcLY_4EACdzR-ZyktM6&RBw7eSUQsr0GmwOL#Q>dGFBb9RJ-t`Jza@WD@z z=xj0_y^fQZmk@%56mvsQ8A(ly4}1Tm?OxEfqRFT#W)2ZYEVAxkyoxzMmZS8^X1&NB z+gcLqbmpvp3YXqE4YOn)xpZwRa-8dbV>*`OfYmcCj`v0Q4A4cpOtjAJvZ8B&F&@X2 zQ&Hyf*|B6+_4(XCluqkvwqy@|qY~MuaZ#=S-g9$BctJ}nvN8ErAc2XRPu1p3eL2C& zH=n65C*!k|{~jztyv}72!}k(A0`MI?5(EJq1isw%JV0g)oY>kQ^uPP=`$v95u3jvA zRWFu>5A7x0Ndv2PQRYI!@6KFJ>@Q^2?Y+7X78Q3j9K=YrBkna_N`s)f+Qye~u5dBT zbNH10W+G)TAy|AjYq|lak);1MDD%*Fb@!NFLd7E%3KCN!9zW4}z1>4BoA%%8azYjf z-b8NFhW7&#s+`ju-Ml!0`N}<8p$FlL#axC@F~#d!L`NCrIMF#IZfsvVQ>{r4nJG)MC%Ptm^ zoyIcKsxPf=ror|83za<|t5aw80195#8qtbPp$__BH~{d)7^g}&D6>^2oC(%f9n%Mx zQZYgKBW{@T_<8rIr1F(yV6EnEi24bVyCSPD{7=Ha`&P>nbxBe%s4%oV9J`{6s*M#P z&P;Ee4yuwt7RBiSS%5fW!m_o(_3H2VVsy;tfNXo>x@=%%uQHgdm^=Skd5q{N>TEx8 zk+N)}YcY)HG7+H`HNZw>4rd`3%D&+n!4<768IbUW1-6)N0Xh*@_Q`m{YgyWTl%S?L zFSKCH$yriLEN5z6nN1K;uwb}^VN01W5*?C8;WWmG-2U|TXV>T2CVF-(dHuM32gz_c zgvYbTKK1r7fAKT{?GY%>DdQr&$?)%ISU2zEgyrZpNc(c=5y7v9yqWi{gaYp!j(8NT zztp=w?!6tK^cT3jMMIzz zReV;~f~>3ZES4iI2|oaqWiNDQnl{I)LxRWYRbm);od(m zWMx9LBkm96S+&r-3Ss+ibsV;nq(A9BEF-kvOpEDS2YS z9uHf=TIv^Ez)S%z*_1#X+hcbUAlm?2zNL?qWa+mwD$PSkiDQ{VCYfG5bc(s6vUkQd zl3{0QNjOG<2o^q$8^fbrwnb>8qmx5QZDFrn9)R7M!oEqY3~Ga$1vMYqiLpC59Uu}0 zOM||q5^T1Fvuid?(fShUv8;(?Jbn-L?RIdTQPRY{ULSoyQK+8uSPAP>Q~uUsaHh43 z7`W^@Np#V63D6_kdT9+5Pv$ZT!e&Rdlk|vF#w>OfzbciiLVcM3*!mljjUULqTcTbIU_E0IU(7dE@+ri=PORi>Sd(I&j%DN;R zz4jaKv2~#SR~hWwB=h%3}~r#;b#BG&p&Yvl%^uVHAE3WB<yl5coKFkb!C(|?;uVZ~*teAw|RB^l-O&9NyC&HnvNFcsi)p2kdU2PMl=$2eO ziJ{VSjAe7f6bp-ehFH{X78D}yyUIFelQAs{ULwo!RLx}q?@9hI8tBqgZk)>ljzBbG zz!1#M)$i6GtzEw&lR7Mny305#Z~}cG z(M4bygqPzE99sLl`~y*Mh(S5x%Ky~}F-nuYS8su(yQ#4Wuqp3Xj`zRw_Zp`JC!Cs# zNnR@`i2)#@Zbb?JdHRy+fzTssRHy#Y$pcOsL~;hEfl9(RnvcMa`)5iCol`Vuzzh}^ zD4ryc2V}&*V(f^tJiOoRC~-|gURQkF$4I3Nhe zu|B6$4%ar2O8Oe?w z^FB875Kw`LXvvCNfE(g#!i zj}^$5UhxJz-N@Yuue)R-@85j>^X}q*-dgUP-Y{(GFKalDT!&r4qYfS;6TSY@5znc!zZhM z*;)H5k2NF?xCf`?vc7u!jUH!l(3#XB%~Vz{;(;`DB$ z`puCA9svQa1?@Lgg0N+J!l~e|gDmKr6dN7;9;O$uy#IqfFURbE#eeSd%FF&&@-K*r z?^o|YK9o`(R}$m?fYJVnCEQ3m{~?mC1X2XqAVq|yKQU9qsOe8hPyarPB1~2U!HR!L zhAFZY?Y#;~>i~%L9%cl()n86Sk4gxzDTeV&FL$R=kOM3-(V0adepMIzs-s*3;#VCI zLFfue#&(o#XSN;t4lAo!;=Rtr``B1sg{h|V5!N3P;qFh7G0z`?`W+LmuxfmygcI}3 zxBvF@_VlB{ojbo>z4P1iukQYI=iYC-2XL_dHXY$y!f!8z^a}oVhJ#0k*YB|?a^qgd z--UmZ1kZ#E-JPe@PV0y{`1Jnxc)Nev!Eciipmb5orSh9i$BNj)jIr2jS9K(1!##k=SY3Jm(sMAh|>UzL2DrxTFFJs0YOtm`76 zL}sSoE@)@yDDpAAfRs5gy$lU+EG*Jb=r9$n9JaoUhFWjLz}0!fFvdeZ>)m4dRl(JmZAvo>Wo<;r`SB+mQ(R~6Xfv!fToNtz@7l4+x} zS;m|bc~BdaVuL)11qFr{};$;@61QI3?8Q}zP$1R@f5$f z3i)MJ7y0C~s>o4Yf`>I~I7cmTa82>;TMck8TfsFUzU+or1Lg#AL#J&5wM@N=v|X}9 zgwUmCUsxGx>FHF{w>Uy>OI;W;@KyR;}VcB*Brvkd?59h5*TsL-) zUk)!>oe?JQP#>Iec(y;h@7~eNVS!ph^95fX0R0e`tG$Wvw0EGvCgKw5XHG-sYEA#@ zjKi&+u$A%@JlkGj|hmniUb;_8b|_Lb^Y7NPd3(ezF*zMmhr>2P1ql} z9;tYTBZcwq6EJ%C)BGfRw)`WR=*Ln&A;d})##w~NoiB$v(5)2@gmc@0N+3}CE2bD| ze{(SAE!Er}<$GJq2cA=nIISO#ULp@J{aeroQ5OEQ_9kdnw!ax!m_qwovMIut+Fyc# ztFzvpV3V@5CcT#JFSTdSjv1LqM#F4lK_ftP7IwH?t@L_t3RvhxhGlKE6M(HSbYsgY_)@om@o%=1B`vsCZ zm+fVC%P18flzfL^BIngzRY`pxnIJ_ zKrAJvnNHXpyL~M)0&IGTI%>Xki*ASUD7ea@Swj6^BBcDEnrCQ|4YpTtvls5$L0pG^ z$)}3iZ2sm#3`yYMyrpTHD`~R=LrHI&K_F z8*ENG?W3;Bhx_6YZBlQJzOJmUu5E6v-QU?-Kc~}eQ(v)I#b)EncR^zHyOqb^&WA%A zBYpGs(RhD!0MEqb>G0^u{q+ay^Wo5tfV!TU$Xi_H`(9}6k z9QC)DSx=tOoQE~9u^w$5a9x|f!zK!wq>OasaG^~I26>bLW^L(1Ng5Hu$-O9Kvt_&^ zW(GY73bb-8FJ=M2+2*1~_>=V2!$KCBl-iNgAT94kP)ginp4L9;`l6K|aZ2(C{x59l z;A{w%o6H9YR=VE94mGYjz_uB_9}RJ<3ii)*pTkmXF=T{c;@EOh=ZfE^LVR(PCN}vl ziEqA&<81?68m}MUcPE!erf>)t9W0u)ah?EIF#!2Q$UH4qB4Ez>0b=p4^*sE=4Ge-K z(u{Ij%1JMvN4OIg^U=p6LBj##x%nr1#C4PpW11Nl5@z+iECOXnlU>zCj9sWZu_1?#HW)~ZQ2&KVZ;T(0VdWH+7fs8{)e$+Fu}Ma$IP=mo0GV;69e|mkD7BfBn8i8PHjxBlmjNb4quI5Y+exry zO=U#84z#s5sTbaW|IHzFm%;$#2lccw!I*aus|Xd5SnjJ{HnC=QQzl}|j#G|S%mDP& z`AX$t#tHOP&uod>r0KdY+R*_NNJ7O7yf{gvlUfLJhs$uik;%uR9z!(rCikDu7-D(J5QfY!&%Wvo^S4-s!VF3uGsSB6;^}w; z`D=bfCO}jG4H3LE+B;j@OTyXP+-#yrLb9xl`7C76j&|`oDS>>e*5`M zTVTUbq2F05>0!GloX*@KMGO&=z9G+t1xqaiV&n#qaE)H`c;S+rE(8!^8^vr1s15Gj zdH(bE(ofgTx(a}3EJd3Wa^%}^AbHU^yC67ZBxFP?QHMq$7IL1?e-EnP*Q?*ZRlh&3 ze*awkUP!;oUS8YYCKA`cpt0uaf7Dev4J}e-Y;U97GR8;gTJj9uKmYmWPg0`4^pVDJ z4w2zW=yh+-22k#t1|+eEdI1vt|Ckdz${}oXfbk_(SEF|%kz{o-rj^;7!2dIW=Lyxs z+$CuP9M*Mx)In2ZrDju$iwQ*4)Qw9tg*s^JH*#&lnJK-U!-%FZqfgWlZwxF-V_y2} zjNb(ys^{;5!KqK}(t{`$(}`Th&gC`JEOM7bOpm4h&p0&sIJ7+O0;{D#AAxKQ#Ci3kEpy2Oqb$QePxq-0HtG;he9 z3Mk+s$Wv?dqUo7eEmynWI!_?<{p0~`Sn?_EJkP+Bd%gcGM zLNDek`Rb6!F76jU(d!Kf4Vm@e^Z;bFS&)94VCnzKIjV1|%hlI6Bh#e+r-l69} zJSHF&becCMlrc^V)=TFEoR2S~r(;Zk`(j!)#M`>eQ4p! z460~-8?kT}u&r$U%ex(aefof&=H3IbZ65$ATPHX($tS=Mky- zNOz%{?%RwE;%e33amff0+zCZ+dVyyk)M>{SS`m2voF^P)3`Cbs%UWR$4vOWjm})N4 zW^zt=G+f5|-<*|Vc?)_o;l3|%@iSjVL-d(I$PkITP)jsGxzQk(0zWbzm)zcI9xhdM z0sdZZ@isJKv`6{!9+=ZrmQDpaGmnq6#jjr7F3W!GX50-a=bd_QYD~v_wi~5m)Qiy6 z#u(-Su%~Y-I$O)HSbJg7cjJ@7r^YqI5GrFKQsBOjh$qJQLYq{EDcy&WRl78 z<<$1?U>zN+4D?U9l9tn*6!*v%-{#+#~NI>oOcch<)B5{lt|W~)6mG^BchoL z8Yc=aFQ(X#_qAwIC9JjtJIA$r!-pRH^#~hbqm#qoQ-tB8H0H9a zN${F{>N%V({lsjysU}ApH|PvJnf5?r&vbb_e#G;>_9m0O-e0xeyBClmm-7)*$qQ9_ zwHU|^J7Cc|nAo&4I*_#zGzui84-OHy-nNn%uCc~+x$ClT%BVk_Y{M;}UP}a@k`5jQ zDD6GG?!^{(IB+51IhmRwR@}RMOYMTc^Z_CDSZ)R2shS#0O7=bk(#(}EJ-RM75??j9 ziQW%W)dWctZquLSa9bMYga`fK7wy^m<>g}7-Ur2vL$2(;z+mDI$zD)4n}b179%IR# z``m0O@X3%_UnB5~tFiCbHa6FvJlU#pXjHSRaW)t^G_s+VpZuYsdP(> zCYSNv47fsvOK2bVxr^^FuUH=M^d`T2@d;8thPV+UYm_g%2&FIrs%04(7uir&${GmE z9}+{YV3%!dO!M2oUz@G<7Vpx=Aqm9~Cw;C<;B>8cw(94JCa|zWd6cD!g$Y@=ysEHC zgT=e^G?!M=LbJR_GBC|yyWAdD_?285RLtA0OoEXce4M5!mi0+dpd%4?niVOvNnXh3 zQ?0J%^@~a4X7wQg)7GTco9PW`w451uRi zXCGPY?7@H!aHUH;c+LkuWe+s-64S78Cm{BOB)mYxdWLd(YquY0ciEfl6|*k{>-fM> z&^6e}M=Qiv%do`+#UM!6zq)tw>cnf}uSCF{?CuSFn{ST}#>a0Zw-MFmMZ<#qRb}iAO7SM?h%cl;vgz?9@*NhyPnMEG!@Jx6S<&$nJ zt}K@k6kpF92N0nKoK3F(F81;oZU{d)9U;pSh2?ZwW$HL5J46;M>}poorrVqe_DSJz z4U3GUIE>_Z~ zX5~UFK`-)790`xa-!^=~j3Sb$f<$C!Eaivp3TVIFS(o$KJH`o$h|OZHH<+#IXc!|o z=x@RA7uSO0ti$13NZS*+KucMYVKO$|DALI0T-4e&Y`c3T?hCO*Z(RvVdIu- z2vb9-bue2%>bgh=xE|b)M8b$1t}I!(vQH_xjHd(*``%gr9cD6knj$Xsu&UowkX+QO zyW6js$v`zgBUY%h$Aq(xRqmz2g})gLZX${f&1^EeU(*K)Y0kx!+$8Q&-VS(Q%URnr zloGjA*b2pKg4e!QOW>AyT-_QhN&SM0uoHxgs4PgZ%)lKhl`7Gnm)tB2Z`o+bxHDC*X! z^{26@)qV)c)Ua+@^wS*xPeJtt`=4|o+@koXUa6hqks*2EYsPZk9++t>!IHhrA5H=)L4bH&>1QqgUOQ3PySHK>Kz8B$mnu}5?>?X z-!Ue!&+i18h++MIFy@W~L=?(P%4!^l+ucDh0q&^Krx;uwLmdi~c%&RD^`G~r!{IMf z#k^{zySr#78NQuF$-DKh3X!SPkx&Nkqoz$qz;)O)4{GmM7%6!iN9Hn6;0?~oEsU_v zlb0!${TWmm7seRbQ;_gq9VA2kD?Q$zO1X96W3MiC2ICS>w?st7kkV9&v5sr$8y932 z{z7KchV4Nf55oq;Ot9G(b0sag9HVz-vz%9|TmePsgG=EE>Bi{6F^?UyJfQ%n5?Q$X zInVv$IrhuS^2MQi6!^3*kRO=Gd*nSV0Tid%QQ&j1ez33mH#5tbk?KA>(Cu0{7A%~f zcnm)dEd++nC&u+w(0Y_Y6C7AI`(F5AQ=26n#nAq6f?IMHY?+REv}RE}B?{|j$wiLDM9y#VuL%RUnw-@xZ~AX;tN z2V4Y;q?Wag&N!+*t#rSNCSaAY|Na1qRLpuY(zp)Q!CKMCxgIX1)KReqGe@MH3-8kW zYTdj&nAvL-CwG`l(6s16z!)p95l z-TCj}yI5e*U$bP?&|3$3otXi= z(R*=*q!dteFL4q2F&xa&Zto4$)ifG%|EW$O%)7X5gDMiMlB2l5K*2Bdm#%FeZy&Gy zibNlDpe*-3m<~ReUgyIf#uK@%D4cG5dF=)wg0*omN>>#qQrOZ|E#DEUd1cyPY)N=P zRm+-%xu|gnkc*iAwz7(*M^i*Z;MTbNqbW5z!Z?&xGXfh&WA$wu3_=m|;lbvtZ9nI2Meh9vG! zaZ^V*gX(D)Dw{MXtS#*jCyz1VB^jw92S?LyhX@1OJxop1PPU91vO?CSXgWo(yfci`OAe|G%K@%YVgu+1shA9>dHuj!pMf@j`4VTOyY8=k7fX&O$dZfkuS zigvs4=65j{Kr;O(I%~h;gpQ=h)X;)ly-&{$aEox35WT-N{M9ml?`p>Hy`z1`Uo1gg zdg||{F@QTSHVu?+VsNKPL1*&AA5lX1ci~b&w>B`44OL;n)h)1EAZgf=zD|$`u7-BN z*haat5aP`^3V3j9AY8Xlzmr`k+U#tPTQZ~L5myC+K0Wq3yvY@2fL;W+pqZ)Yc>+Mc z@AK)()^};c6!)KZ0Knn{kg^tY|7r%Aj@1)1!TG4$E?>iefU1%w_LZu8LQ;~jCt_`XT^wA^&?QA!7m@k)F_Q;oHytu{7sU;~G2eatF zEx2l6*-mj1R@@GpI{Yuzlr};1`9)kRCK@4vX4^|)3pHe-OD|s@!l>QU{jyA0#s*C8 ztPj&?e7tsaa>_$?dOKvi7##yz@DlhS-f&vuh3+}D$q$1$@PqcacCTn96He)cmr0_j z7E5wBGm@JSF_$$dxIrI-O>`O(j5wiHOOK{ZyzI7qQjWEjN!k$>6e3Y{zYs!Q6T~bp z3#rvEGVYd!MUvQnKEr)-)8%FH6(W*no%jxRb{?&5efQ-4&JJX%;_5xE`zdXTiEb?z z!DHX2jpnI?&{-yl{A>v8OJj9QnC+z_Qi)X#u*a5X?=V;L&imx__F^dBj)sT(lCp-L z9m{k950d6BaOT>Xz8W1wl0&DBj-D6Iq9cNz*=&*)UXlU>-}zFT=P&j?L~(k|>kaZYhKW&U>JZnXiyV<0X#aPuRf;?5GQQ>hpF~M>7t=y-tPG%V^NkOS014&U2 ze(sdWW@KHHk^vDmbz>UwqZl<|s|A5u7J2azuJWYLro51L;2`I3BNdCHgrv@t!$ELS z>-)Sqw}Rw3GQ+^YiUYDeOig(~b;I09rtl$@;a1om^uPP=`$v8@Lv0Y79D`7GIK1)A z`s0<2A63;d+CqO{UlPzdPvx54^o|@7x1RFx=E~Fc2*cewbL4dmbDFT}O( zzrdX^qKsURC5ZVJZ+e=cAmR)_K)W1wH4sd7unihUEcn6_vqwg8^9&oPNsr&8rGbP z8!>6flI|eC^qlrAAj(QcdAFVw6+1$hk_VJKL3p*SP+!E;3@%Hx6#d0Tq5-PJCad#< zEOSX2a*%X78nmi^pG@TRnalMATd90GY4WZ{2kEDV$J19Qrut&}X1_tc_|%ln<@1Z)+PWQ2hmkd56!T=Yb9^z6k%0)3?VZakl z=4XT8EKL;2S2bKQ{#KhB(5;=iZ_J1_Bgi!=NVG>jzJj~W5rC*v>XVW{z-2?Lql+(< z2k$pqCVAe-|hgjHr3oN&X){_^Pp~ z>khFDzrlJ=(8BGdaI4bCEl_ zYqD>0$M%>pX<~mDg2RjxOFM1>R{;zB7qB{QT4nzKnn zun(YOCoc#*(A6m}Zy~c2JsMT{s#pnW%Ld=`7=hV6jl82UtQ3(8n zH}NZ%J$i?Tt?n{Ajh?8lW5kh$15C>lhHvnHPAm?2$+el!;EnnoPxnX1ETi);l$zm3U2ZiJy{i zj6Kmuh^gM-%P-ko-ZQz&en2e2-!F*6(Ip3zR=<1p_%Az~>;GfTF!8CvI!+6_k^l#G zx{1Q_q=U8PUFXlP-sVlT(ocXv+0W5?cK%>EMz$mAp0I)tBpa-`RC?m?@FV58fsBc* zh3vZV;AG31OA>}E>}tUVt*E5zSJH=&m&w7N`qqk*D|JO8ggFjK9%sy+Jx^ly>cX2e zdu)=n^Vz#uprVzqsP>Sg-cuTaxrwNo{fRF@@!MZ~`e(#}>!-GQAOr7XeZyrXu2`bG zsCTKpUHS z)X@vpXqY8Od*c#o{%xTt=rG&dw*XVU3@j@_IUnrI?If z%V}2ZG1QN$PNTuPzlDu%KtXhag>NRa7AjELg3oGUi2T~NK+gGCG0RE>u2!Ogo|UZL zunR5m8zy_iOl)>>ABj&VXV6<2*4aRlYwJoiZ`;Df4b%!Nk@b{LswT;;^zb7I`~L9t zO}?Oaa!+=w3z2$7^-7xpm4Nd?Y6yt zLmbX~-@wF1lmge-dwF>@eR}%VCY)~!wRazwrA7g&`AZvYubmUGA}Bip7fJh5h1ov( zCb2N?MVp;f=9FK6XDlCUAE<5`WcFAs9yG%X33j=vF9>96FO#67;v!BWJwL> z63aM5*I|<#AZMF%A$_41V=Q@-=aXk!J5M*(R@a$^srOOu_SzTFkZS$W5kMXesYu0EQ;)n(oCd+w#5M#i%iHwI=Ou!4}xPdvRJ1C6hw^id>Vk3Nm9u` z5w2cOAy*}2BwGN5?oN{}G>I7e#2QXC8h!r)r94}ApC2lK9=b;V0q(}}o9R>HKZjDM zG%j6pq3`+XJFHAQ3y>dpf4CFbtt)_qLf-W}W(b)$H?wy|MP$#~INW850*u`nCX zHxVj;n0r3J)f;2~cB{ZAy!yO_rY<&$URhtG`}p13?I-{;++d8)!s*e;>Z_snpUs`a zNB2jRxy}6qR0v-f#mSjP`(Y@i<6}5aG2M40l6VJq8Dr=sgY4KLNRF5z7^Tfv@SppQ=v27QEAZ%+?) zP7px2^TDl8{<`$R6b6EInYJJP&zLMUOX)%$EYjMGYPqVrA-1)_c03Y+M^LeHWgMEC zLw2aB|LY5no4UFnA!HE}pE|8grV){Vh%`LbsBiYjXu-}wZ}vEVJJ?9gQ6VC5=3t$I z9?&fsBZ9uo*g6POt;oL8c!CWNNr=KbT@iSJ>%wpwY>&nsBZSAes1oZJ*-;yRg$e~j<_nOEvkkm~<`^VYH(D{L&1O}C zi@`{EZXsr!sO-e_2I=_OX}xm#zk#)A)Kk?5Ff#HYGMFsny+v;ZOw5LHbEijfKnUdVJ8ACM_fcP+q~iLLNm)t;`X)6{is6p z3IvnIC=%sTHa6_GdClgoEgNtfte|EFLYt-OctdsCV*YvtsXBOg;rcvGQXHU~A3_}q zdtOahIH*%G9JTY+318xT#q)&<#?n3(dt`>pc>&MrK9(g#uMay12CzO7d%V|&A;f?J zeYUx^vh{3pXJc*U{*Ra%eafh}QN!Ni&&Jl;eZH574D7r)Oe?Xqw($sog;ogRI=IRP z&QO+%hVHLF1_a#j=q>AFC>>+N@<_4f6$4jb*)hvXQ@a4h5=-d&bu_*67}==5dH7`Y zFYAxLMH{!jgu2gO|7C6M=?;4Tl#4GIYUNwGR#|EDS=%ec>Cbo-q9P(vvRHB6RguDG zY}w+nh1qX-tQ7G|u;bFxH~ZNygaKv0WHp!l7Roa;D0{|b4~`JRuH|INURVfG_GFX} zjb%?Qz$kk%#BtO;@n{E@=!--HZQ{Q4vqDNmkrU<3b)=@6AVD#rvoersdHWeuj6h8s zY%8KnRs#>fxY>i@F@*Zw(5451j&P1+^kQ^4l6ZcN&ktm*@aE{HByB57XD|)t>xsKjlUr zJhhzI;mR#8a{EvIf>W5c<*S{5)VLQs{Y0KV8cnHSaB_3{YIt~veSf4FLGT0$T)F+p z7g7egY0Qu&n>7evIpzva1I1vkqu`&UAjVcsYxC{F`0N-V0eJUk2eNxO+D9!M+x9?H zwsNI+`;&i{A~5}4o*`uR%I!}Tdy(!8o{?wTjsG}feFP)ypB0+Zjxm}@BC2fzS?d-1l%P?aMoU?X8Fi8LEbhJQZ;_Y-z>jGX~ve5T}I9w;(RJWe+W$gvOz!4Bi29%M^zaBXyaO)&giNq%m9^PYe_ zQXRtC>g&ino4kbh>u~|o+kK4`44O8GS%MIWD0Am?9hcRo&*ac;PcDZ>zxCWT`|`OC z4CNPkh{SR&MRb-l2AA56)MrXv(D3zWa(ae2$j9LA{O1Hso*+lUzOeM?I=Gm1u)>8@ z0?3L0DKNn2I!sT;dUI-Th(r?X5nnm=5tsB9_gHf`QL-+$jO5?i2~c=wO`g#Tz*_UX z0C2GYAk?`H$)zcf#Yo`6dGX*}!e8~}jIT%fR0TWqkg4NphPO=)-@9y5;}a=+ctba4 zPk_0>-Il#qJUd45TQI^~#FR>GuSCUxl$`V)-D``oj2P%sX(4$L36UqEsEEXiqq|!q zNuH0Cq~s<~98>roYme{mY<)+&7N-p!tl_{5{ChJGVPva$9U1IBv9G~^r1KD_yX(VR8 za}lh&Was0iR9ZkV9Z4ZrJ*Th6`z}&AJ#Wd84a2{nzc}6#>NcR2|3RbEbOPtwr|z;! zW1!#akA9hvBmVE;P7zcpf5)47&=IUffI6gOpy@Vn>ZTp>wXw(hq6BJp?9on zG2Pzf7G||qf*Zk7&?O2pEsEsK9g8aRG|SJDv8;HN#ubj( zC^VC0&-*Xlp6o(q$wG#Clv&cs%n-iiM5=O@i0-|X1HJ~sT&!oADcI$bMII-EEe?C= z-3azP?QDcrPex?Gsl`GV9{W98JIkbmI=00#X43fJKpBaIBoTS~i6JU2xdsr4(jRQD zZDAMf`iCF(c@h=Y6V@Vl@Fko*wX2j6=_tiXA~@z%Y2uj-SC)TDPe2)?+oAI6#MZTi zU+yftzGmmq6;pB+rl;&OU?2_u7yx)v?5x_X9wnJ~&X85C*hdPK-p%iq5rK1aP5!;# zySduCHo(a*>*7*g1){2jKqor6WqmFwa%c}@gH5Q0k%3SY(!pR2Pje2{PrEH>*`@y7 zc}~9BW-{E**-R2p*XXh1jPS^p*&Lr)K^>C<45jWFc)Mkw1h|b+W$QGCqE!*(6S-+{ z5F;GL%jC=RPq}+*b_T5o?)PC+4;|&D0m(6kQZaJ>6crO5Of5?&1kc-nP)4%QN3eY#EcXoJdD3dNQdeNta2sb^<=zWth%es_z zJI7oUpAD3;DT?x&tRf)z6X{@$WfbRPMFWNk?iLF!-odoScg&P{VjRSQF%Ha5rxgGz zh2GSe>7?P|?%6RGDZ6qY*1BO<`A*D6WS#g;B9 z+KtuPY+)e5T!%lc1ze@@{tTDIR$_W9+n_V{eDSX07Pb^w!)-GwBb2FZv$~IBOwY8; ztaEe>!CUZD*>-&jBGWI2lqL_JJzm}7rI$Oz!HTzzgz#?D=HXc8qR-Gb!C!@6*$FY_ z`B<|gBeB|ggN+C?M50~X#1h{Y&(~^KmW7aJG&8}on&RrecDs644hqVGMZ9fZcbW7v z6G2gmR>GX@wh6I<(b!I_%CMk}Ll?}J#aubZ@Mtn%Iu=q=GXfc7UeIh7QX?E!*%xAR z)+uiZ2C|}@njTr|)yV~Ax|nKWSZu@XTetMYqYS=v!LZGCOK=^BIQifM{wdRMZ3XF! zL}8Q@SAWQN*ZnejDdF_vF+*iH9-8-2gYoXO2Vd!g!@=O`2-d%8 zI0~F3ij1IXBd|oFUWk}*z}}08*IC!Fo`-vU$PDn@RgA2Pzyao}HSID|kF{hfGR^ zHftYW%K$|5aOeRiFl;8@!4XWgaV2OXkBWfbPp<7FB|I1qoi553K^A!hIoFLg>IxB9 z(I|`^@z%l&wa5y)hOI?dm>F}oEfvZ$oa(<6M*bzNu=3qsHA1>MD|n+`fzrbG;ilU!yrcJ-Qzuo z%~FPGo(Q;^hQGAEn9a~2D#E#3)Ja((sG-!Rtg?Z*pvo%1)yx+!=IH!699SaEk3KBpKWJmjXxQ$laHCDdXLFI(E?F`n>eUoRNYT<_ zO*$lujy-+bUgG+;nrCLs3wlt=e+@^7J%ZTBa@a_I$G+X67OypAu`d z^(_1{=Q^h^ArIc)00f#P{cB0-46V^_m*nR;*g@gf+)!f!W? zuL29f6ZX|iWSZ!B$8iKUaVSEa2tqWTQMlI z@G&yRIWcf-$>45<bxO;{x8*!2)9vGBtC4d`!b|#UfhLux+lb{bdL7hqP@q zjfmmuPBd++Y558OE1RvL6~nOheQGwX5cDRuyx&8Y)E2+do7E*L)72$?X*`pB6&ae1 ze$``ynZK$#%?~j|GX2Ye&i0{ajWvAJIh=g^Ive*47|qx0XT_DNsTPD|gR3ESLqzy6 zw$v`JI%+^DPVzXEc2gZ)c1&D0WnDE?*i9WEzsI3br?cy}(y#k~cJn^uZBtTY{yY_! z6l8`2<^ZOn?-!Iyt9plmZN%Wck257+%Y~F`79@63A%nOd zwSyuf0|dOp+4J@%mX>zP*6}{I-c)=bL!*738pwnlesOXOprUIDZcSX^wT8IY#NnXTUb`&oCpWz7AgY~dCdErupX0>12DDVpOrYz!Gh$+C6$Z{@HqP|+4>62 z)3P(R%Rq9EAO&Iag@j)Y!IuocWZqqw$2t~x|9s(>;aiDR!X5`UNUvKd>0mwxsmCpJ z(sK??O4%XS#K5FhU7y+_KPO>=(mGe!&uR8Hv;kq{?uk+j*b<5&(^gKk8j$*TJY;76 zyN!I51mT%vdZM>Cw6K)LzNOl&Wb*pPR30z~f*G;w2{}C=cA(d6K={4$oNWuzGXiGM z>Bw65d0x&2K_Z*HGaAa|t(BTv)TREyvCwq-c6Ye7c;4dax7;75`Pu%Ja<@nI5+7Lp|zHR)}!%tZQ2~Dx%9zZ(ScS$=~|eS zyK1E<371FZfv{N5BygpL%2E}@>LzotSN+LXjg|PKo3v{a<4xhK8)P$ELs8aw zO)=VT*&?j<>=1j}Vg)8b=;JidJ)}m`f@q2ZKFd09R>LGr?mTB#g_!2&g-m0ZSxH) zYM)b%iX7)ChM^E#kjl*qManSRnIX&BfR=R2*fbadWY9E+JhN?i4pUUMIq=dn@c7|_)y~ZRK+>h zTUpE*k6T9Ba*Aefp7*mY1*da_qeSGiIBPse>|$ZmI-=T-()F8pfXs|*w|X+Y)qeJ; zvv;ZIRm=3->#AAxZ$=TJJGtlGhXg8nh9PRu6Y^D*)J~aST{b7RW>rySbT;tr5*CqHD;@Pn-|EX)YRO zO2+Q>;}Z?DhOW`m%N^drdOv^D&WIRJq>k}ZhYXNW?Cx%-6Ba#lM=E+dIAC@ctk%r{ zHB;x-lE*NpXI1&tysWyHh4$khp4aYug#c6VU7}7`dboicP_;(wA|F4PDi{0Ua2v*b zbUJzs_arX4c!^XUIB+89!o73!VmR@Iw_8ln1)oQekI4C4{BCAC_>g1tWeUnVF^sNq zE=v_!F|#si%81|hN`I+|%Lno93E4jyZ!GH!qyEY*If=0uj{cKHUg2!}G5 z!{KniGSSi2Bt$ea@%SN~TbMOvCoL$fs3<-HdRMDe zYjyd`Ch+sZ;7Y65WQQ7r?(X8L-8ll?xqR~`(=y#W+Wl3tbS?Ln2Dfj0@)<8}z#r2DD}X1Y4%>2*hx$5!Ay6u&cns^}F_&BWWQ6w~j4ofI<|o;h&Xh?D1;Bknu9w z&Ebx?2n$4jEEKI2C)ixYi~S@)SvdLy*oFbD4LM1cP3Ot@O{!gJx!Q-kYQb&OAupd( zN?}V4r-$*cS;v0-s?uV~fT9pN&yT=VcIk4w)7|MWzcA6-%?G`kTfLi4*YEc}*zbLE z_ru%R8{-Lau3UAQhcBEmtJwYn+lavO-pUqXhNyF zic5AhOqXAG*i+4twP2v*G4C?r!SxnkT9%VfH$vm2r4Vir1Ns54EKGc@plQ&sDNjnGnT2|HIV1)hJRXULVV<6q|D|L$Rz*=xJ#oDDoXXA|OYA58zo zVRsskqAdd*c5o$k^hmr_4#80h;8|*@F6jzHj2h}769jd+(8ozum|ch?N(%N{)Tyzh7-`#IV!*2KAy=I zb^NOKcH_D2tj2F&kuf`9mOnOa2&!xWXGE2>qkHzQMV4+M#pXdvhwnH)9gk}9nm38lV`Ly zNNuPb({6YpJ{x-QCZ?io=sxErdH_q(M5IxUesmyUi+xLaL%9guGx#wODFndE@Ho7^ zUAAHJ>N8t!bPdg~OkSQbeblr;z6_PFk#Qa0=xNOhXy`qJX*B7V82MecGqa7)+4O58 zAa*kcaz_u;qDEPyMT$gOFy)ePh`haE19WA#Y?u0AMb58murj$3xfV?^;+0@&iNe74 zog>(!HO8a}T?C}~8XEVH%lXqv~2$THEI&Yw3GhFAd^jFN9lI2E%CpE=`MV|@0< zS+8cyTq*2Ok<5^p__)0nrbuqCQJZ9o2u+u(R#OUAEC;+ak@Aeq=Q%`3@xJDr42~hO zjhxzyB-+Gu$(j+GFX-$26*FVN#yo4k@b@!p%;JX$g$RtqM0mL~J;C)6xEgqH?fOlw zW_=p!k#XFw`t8o<(}(L@xLsst?a@<&T>sX~p59-3xc+Eob>->SvyC;)*ND4|V&A%d z%{t=`8#ppC;Py5XE+&73`mM24Ji`fAX8Xrok}wJZ7jx?abxAOW6xqj-gg&}UP(Ocg zt-s`#&T9=^Xtj779-3=Ee-N#RFItH0NioYhsGvNKHYFn@iv9oWeSJe)$Cda0d2k+qKir{``LDWoGW&dnJM0Zn{s?T?6;d zojG&f=ggTi#Bso-g@h|W5IEUZt8VHS(plaZ-~!lu8UR#=a+>Gwh17HLgR^~bUvjSX zO*V677^9Z$MDbzB_r#F+6H;VL9|LuKT-f2zHwmL^t#5*AZ8fcyX?4gj5!||lkSA$N zfYC)ZaH-`|NX;#Lq7CKh30{tZs~}99mcWrzlvqeqoUL(<087eDt#W2VU`pK;w4y7O**#zNm17pdKW3=xt~S&;r5mp$NujLQkCPe}&z z_+BF!-0sCd%aK)a!CvAR<>_&!h6GNO_F37ofajnga}LU76xsti+Y)Z=G$cDw)`s>rkvuIlWTmV9_XwO)Prp6kGY3An7qY&Y^L%@-8h1vur1Jj z)*X#|;m@fbNmG=EvH#Sz;%u59FTJP`Sx`-mzfZ4mp%em5mAzAUX-Q$sJlKFlN)9+>z9 zB`_<;h)v2v*gG;m=7>=)Jw#jJp)-c^l;^f z-rqBp@8R&fv0iHOcoV|`a5@y@%?<4cDyoY^YKDDkEL@4Uz3V-w+~9j*nees9p}t#N z`(b0}c?;LM{pa)T{ni$o23C1g;IJ=AR>ODA$s5%3)MujB|7ak`qwx$!AwLvNdlkFDpg= z@ZY%R+CN?(A@3{*<6{Xjfg}@qezwT2&{`@gZ=3|wbycQqeb13nz1ZiWcN*|iyPECh z3QW?cAmZUxOf=Vi#r>$@e>T=-old0qLB{T}afOEDmkIzDcjF&=qnE=m1RMH>Uf8Vw z5?v8}f{ph6fS)Me6t?vR zynBB-uFVB#9D3HbLFDp)QltdT_fr*mTMP$9ueW{^h%5wAhCg^uG%eIIQQ@%8s~;(4 z%9NgQ1Z`bonU^GgkD2TO1WJgYc>g}@Wvm<6APQk59P$=jV?AR|RLkV~3GP(`pkY30`Iqi2uZtaL33U0ABS48w zP-uKf+5|@eYqiAvRa}Vykeh4-M(AS!MV`n?6;Cd37f$!Ar>%M-Ku`4%I5eI5>@K-r zt3iQtUn?7o~c5$L(ElE*?2P%kj%@U9v6Dw%ZOt+-W9nMS33P8!L%@ny+?2=4pI=Uzq zqAF0a#|!=5fR)xht4Zw3PiN!A|+#2z|Q5+N#s$>~xPi$H8I!(k}2xWh_Y2t|akQ>kX_s_x2m#+}A%p1eDl$fZhjLU&kcE7-2Fl zVJPEIc>>8fkpj%JAd|dU>3*y=!ypyTb0w%psN#vlVCxQf> zDJnsfgUfSvL}gQM8-Nl^5p_y1WMNoeMwa_1*lLmS{=g5R6GE{`Ev|IOxZ97Z{bq{Z zV$B2#rfVm0N64uC!4+ZzkTRWvpxflGWSOHgW=PSiy|kjOI8#X+O*(~wLP&z!9*p~1 zVSX(J9NT*%L`zTU-Ym&0(2ALu(v7M3ZrBV!}E5z2mFV80q;=d;ht#P<%ga+HzJlWgX+51!H;K!#s+q>T%+_|^Vu7zi9ZKt*IL+hZkx4ZKr zFWSWUGLexOm{t4*Y&aku_eiGBFkgC%ZN`^Sm!VhwuHHwHOYC8a>S`LsxI|gZz(d}9 zk$#l1R6j&2N&s5D^KyUnSc*{0jh^x+z(oewOzdRs1&7yAM)iw)zqb&SN?HT?U$_oVdqD(um24E_()Dhq1Y6QR{b0-))D8095Nbf6 z<8Qsu&=-T|DyQGbqB)raRHjZcyRK3aF+w}+=U-hA{y!oHeugtQdXc7{)@iPEI!{}N z-|cO2)7Ec+VL_xGcEVT`n#s=CLTE5#&nuEYUs)9|<293#rR>ec5OqH35Pq@pUem0z_$`Ix+DOz(%Nw>H``8HFd;A}*&BOVzCDVfQ!D%ghAwGto?R^1n+OOfm;!eP< zY&ly-UXWt0rzRt&U_k|7Nu{eP%B`-W%%nN@egiJ$!S|%%kMOr#Vqlk0>I352$A(8^ zsedcmA_Z$}McGg`NXgnCZ+zDszXI6)MSsi(CQlU3=r_uU)s=*V%S`mZ2CEI6&`ntE z>GPe#?G9{x3;*CC*2Yff@y_1n_u-lcwud+ZN06XU`3Mgs5|W-I)x5fUjoWS9W}eO7 zmrhvZ^M8%^Xag+}5?*|^kHTyfKd5~~izZrNrMV^-S}xOj<&m6-fI_}Nd+@$JY7Zo5 z0Ba2vRN{F+oUND+R1u^SQ>a6dXhKH1*eUsJq2NL`EdXlzm6m;(MN zPVfTy}7 z-GH6j_)mY{<`4X{aGS$JNceNrem=CHpWDwb?B{Ro=a=^LcOW9a`^x_Qz5VRk&zJV| z*nXba&z}7})$dnr{8bx&)y7}7@mFp9RU3cR#$UDZS8e=N8-LZtU$ya9ZTwXmf7Qlc zwec0@3KM_t8axs4`Y!za``eJlYMfIHZ2_DiyYS}%Nbx`^0kr!s5B-JY3t1gj3gszb2q z5Ud&mZ&rWj{d{FZtp47A0eIv#A9D5BU-0CUj2&JXG`squqd#`^$1~BtCST_EIY@yTjm$>b)f#J3# zE_TDKkX({)OoHP-#*m2o_eMOl$~D8jxoB&D?VG_ge3*3ewYy1$!4ptIg9wX*6<)88eJv}+&L(fw#JVp;S z&B3<#0&=0_Xc9Ak=SX=tInqoPbj1xd``F37n!Tg)rqc7>?ajTdmhH{S z$~x^#sDd@N?nq7n3t3U;)Kz-iJnurKHtF5uY1U+y2DnO6?gG9;GppVDw<0CdClFlS z69~#yH%ep;cEXjn+K}7^1}joZdy!);Jvrj|u?!nPsm`k9>M-j5>tvROX|}fz+6;gB zq!9){8P2iAFd$kIYPDtNe?H$sP_=V#hz-kcAqdT-M{Bp2j{b6+>yH)_3Or& z6NVC1sk|0q%xR}VuU3TIzu?C=#RY=9jSI-q#}B=y;CG(v?RTDTJiB2G{`1NheANJI zS;U-IU`jS860B2$a0?^G`co#2+=g}<)3FuZf-lVLl$@2sUeXA-0$RU~lU#Ld9p~Dx zsz2klx{rg7tp7GprQAnZgI0C3xwng|rO1m(I#|%fFHnY1{)NX9U?J!g_{lztM2Fyv z-H6L34;$!BYs2&heUfIWdGQi!Z3Hq_gj(2v9HHppiB;ygc-dm=4qju-i0Qx%Vpr)Y(u(N;+%=Hj6DKUcI1 znc0BJ=oice06{uj|LcX9*a-f~Ga%p9bqgDZvYWme;>KuZuOUUU8df`9=J9q>I(`Dd zB9{zI-EQ9I&I2YuCpn)6*A@~#lCT!UFeXw3Cosp&iDNxOwCGKZ*;N;X(b8p-#*Eud8% zQf4!aN&p*WMeSC8#2)wQbP_RA^E3I78FF6r{=NgJ~8I+SG z1L=82*STw=a+6KiIV=!#U6jqj;v*GJ9tdCx1esoLG!928xfD(h1T8VlEydwzW4&32 zMN=KjVhUbH=ka)^2#As87`$3@31ufwB3n188xOvNsW8@N$}>O+<= zliO0D!IVJr7PbTL>*uK2h(mk*?s@-j0s5eD5=u!21o#Du%v|<{MH_~6~KT6HxlqZj18I!OK=!p zzv>Ny5omx@($^MHcFd-f28q=6Sm-=ZRjq8Cr@l|-Clr>@jnse?CJ0{_xQX(jXKS-Y ze1TQ2^rYzqRbAS#P^Za~@x$nJ+zhU!`dWcm%aLy*O6o&YL^(*-~t3b!GpUoxYt00rpt;V|qp zfhx}W5E28zA8`!SIxxtZw{B?(Y19qiBhiUrU1^PGQ$YPm7Z-MNO-wqfMZluNK!DU) zWYp3o71;51vw7RzD_{4=k5Qy@^!A{T_7d7-vM=R55cv`ZY`**=q^T>DSZ9`Uu(syA zesK>n`j6l!gEKUrzG+$4dE6x{bS~3QcUj;4<>hQ;Bi@%T&oVoMXiVqlx z?|N_cQ7rt8T*@)CHBA8`I2V`YZ|Wx-ClI&!zFr7!vs2SpUu1n4F$}~aD_vMMiBK&G@^9j5| zcMUTC)G0X0{AUfL>3Y-FaL6=5r4UCS84SOl^v?Si(9u{fgW7d_wWtxCQAaRmg* zpim)hqExzWB~(fn5p${N1G`oI#$CL!3L?h(z)i9Q_skaLL`+`X{Y0`7wISvyFL7}g zYZ>i5d2-M?3`hP7{J5*_~ij z%+N>C1yB%W8=7TLYA_JcI-7J)yXRaPNbT1@H~*-6 zk)~}}v;|Ik^RJap-&a0e&!5i8c|5_2Gvmnr0XMeE2mjeHerBmQ`kXlopc-U zz_1EaG5EUi7IhT{Jxm+xHLZii^m2VGbJqDW(531tn>5NzsnZ=EZ)>y6$T|H@s=-DD?iE0)52PU? z2(HC(AI5XZq_AD$V=FJy>=eltdstrg&bC65Anc7f-NqpxlPl>6b5$RS`&iKjATMa^ zFfq)@Jxd)i0f8dDMWe;QI!OADjp872zPVOJaIg~@?r6752zadb5?QUNrr3aiUI+1&L zqrWxqo52#+2uOrirv(^{j)f1eE>PxS5#{Rgb3uQ8y0)e`aj&ODRr~%Pgt+-4xeYS9 zY<1Cja}3JMU~Z>I(D7G{9e@vbPnUv-5plTRTsEtIfw!0}c1Wsb;S^}T!@68%xzd#N zo-0Xw4O&O`1U5pcjM|fQRyAXxA!{(>VXYD(V?d;qm${z;ovTcXUp|gP3+(OAfcxe6 zS+}YZdO9ZHyvXiNDkot*B;|R~Iz|`b07> zs0U1!;bJ!lO}e2KT2$$|hOB5SS-*rS5x$X!A&A6u-UWZ@&;`E}dk!%vWkY zAJYly;&8}0j#%O>=!E_bJ-E~1IWw?vBLa#U4%{>1LCokHE%jG=E69%Kk%W8v=ZOEj z;6Ly9&o5HCXUd7rhw((`Oz)}2XM!R=!3h}P*+LF})V|tMMAT)QspzLlBL*uGs26;# zey&9H1PuAq>8NU4@3R;DyWa2{?sZJ+A4^Bc2o#*ztt*s<<+0cX;|AhtpY*Jf7HDF* zbz&t^+l+a=CAdZo$MNWsxr_O^nB{u*#9PHI9C0uC+AwQ5tZ&w1(|()RHAa~ z$B1Uk93$%G>MVnQ3wQCX;XhNjGsjAdtcX7?XzDG{H~V;QmvK+o>#B3Q^5wa%2BX)N z_?)m;%6gKuX~7;ml<=X)e&F9~7dt!)rLIIc7^QFA=g=zv+|}@bo1dxUOq&$l>qT{+ zON~FVET$k(SIl)nu|Es#@{kEX)m3pYS@w;+czTW(vk+q}i0;79_?2o3anXEF9X^=heNVeJ6Ffxz zExjdN_%)tLj7R69Gk4!JfIdFbp{00oSiXvPMoyNxb+Q$$VXlPu?j;+>^o>9Kd-hbv zb?2Gg7a9mRg&jDxpE|Y>X-Zpnu~1kL$+N~73_a4>ZQgCtPtBh$S3bo_ii)9oTq;aO37sE`hm|MP^FvYZ_fQwqU*bu|w<=J=7LbdhjPVMyKGF}QLA97Z~lX-}SjN*SCqLE=G zA$N^(k?@&3jOQH4V0?=x6^>@$o-%n)6P6nZT<(ytw|8S7C}wKSLeR_HlJHMeHQO@Q z#uwEr4HVf4;5QJE!mv;@Tx#j=$MEX>L<|B76zOV)o9bL&qv{Z_v(osEr4zXkf*qi< z;RLnnxEsQX(z*?irfGXl^X*vZ2lJGEM~@goP%UQsQ_%W#>dZ4%5~XIhw&#TT$~9ve z({-(}KxaO-VXXycQP{a;9VkT-$3TaHSI~>VFU)CB9 z5tKF0D*%*9N&A*7zZJSEV|?D!Vh>6NFPdJt!*K7>1^U0vmQw40E~- zP9hQI0&h?rH6cKwm0ytu*n{3l*ZUntLU|A%GG~sp!1NWlTmjX@RH~)7P&w{!`)Mnl zJb~>C1tp|@rDqDe62ch=-a6xt{|jrErRMWPWJH1&uw;^Z^!OC=b%LN@$2NO9yj|>X zcrIsA(6;&|5-zPfC`^8$VmiTIIPQ^%)35(J0Dv*v^OR=KTNm9pWWFUC&!wfTIF0Ta8KdyV+GBtyz|61W?SvVLuEN3VgE8#vWLi>_jvs%hy3d0*GSz;;d zfYd+E8{0;Pd{GyJsZL`BL)j1o+}uwq>u^Du7{KOzoIHN>;P=b;=cN7SA?jkiIX!(L zYF8Ke0*7;X@yv0^q<{g~gmgQC0O|N_WSqiLXHa@emw1CYhk^8_k9~4%n5$n zm4BDz-;=w1fq$3pJR%Tw2f%o}!NYnoe%RAqM8zhUG60O7ey7GFtXTJ4_lNdQdG0^G zi;DYT$%**nGZdI+B^iFO`x0F)uU5Y#dVqv59AbCX9gcruJ)dN^s=ApRmN`UGRzG5HW~Dltvw%Zdm8yOP1?p&!amFjen9O%EwE zKqsjM;yN`>eB%WB@jOS35Exc`>M=e)e6swNZQz(Ls#4zNSEjndew4Rhsq8B~9wFBb z*>krQIMi}ZcT)<%`hgi+Hb}O=M11O$BByN~R%*<`o!v5|F7e2A|IGRVf>p0CAj^}m z0|^aIw;k8um<_=LTum^1y@%=suX!;Ep4--sr(r5OSb_a;xQj1oSM{PY(OmkvKi-U1 zw{>wjd8G@iu967CIu9z`dDI?%w)lw@`7DhJNTj8fgcsyGu@HJ}+8#9{ zUWiyK6{lm%E;l5WG&qj%v?q%;Kb(FO-9zjq$H<$x~p{ zE9t~ZdJNwZR~F4p8L&G=wRQ0lp%3|19Y)!I2D&6amR#=M1Gz0DQDkJ$X`w_Xk_j8_ z>pW~rWw*AbWo@(L0PjJ@cJp@oUHj<8%4d&2&-U691cRRo-b!*&!e$`u0@)qedoMX7 z(k^SN3HpYm{@9h(wrB+GOle-8evL|cv;r#;ry0WHi$rN?S8~CJXb%t3I3NX_Nlu%v z)8b8u3Q`HURV1tK^as|2H=i1eFMu_9>daH3U2~|V7cC=tF0pQ02qAZu+K(4r;WlC1 zG6S|0wWuspR)5#zhoknpIr(9Vo}~7$P&O?$sDY%FIC-!qr`~KpwkVDP}@z2M4Y8VM^GPZLWhu?;uxc)>z6;vsS6@bzKhCyU=jy)Ww#nfxrwp3h52n zYR0{{Ps(pviYC{DVkxVQDby>_34ZY&WW)nIXi&hoXda}v*4|jThzq_D4|pa;QpMqz zI%i0_!8%hmE#&yKDhZuQ+&jeIBFW^4<~QHiwiBL;*rfh} zCfSs|Dt*rHGd*h}DyFbtFmm+-c>>zsKp)3{|SGqWPZ=?~Oo)bf!@k9^{=(&AMVtMthi(?i=$@gId=ng@;W z+ld|xgl{Cg%C!jwwq?8AstgB-^-w<0pTy>voxu;YvapVMjE9DsU*KN4vY*;yAc{x>3n@@YAGcYfD z8OQx5GOupR1gh1qh7veL<>kN<2m$ybF>YioA}1g1&@@U62ssxC~WJ zik{g2#zKX}5+*hMT;*@mKlA%381*!tchwR zUHl7O;#2WjPw-3Ag}+7^#QPK{)5))jzq!2ZIg%>3X#f>{)<e>H1j#UK;Q(h{}glIzv66;y}^>BSo)(2Jsz6T2Q(a4v~? zQX>dgog--hcQm&4_xJXZODk8m1DQ=JyNTk;jc1$tt%f}2bq?uCQ0d|E#^(2jxbE(I zT=)2N`>@>69;BSA*Q7}p0%Js#$8 zzU-YL?2qiTZn_nRhS=k{9HJyyGH^%&j0AZ;@M5gO;B1Vjd9B3jhk@Oz<402?0=9c= ztKy_|^89>BzD_sQtzN3vh))ZqGOVB#1}yMNM>gGn!5Z1)sMMa?7Mv=%o?cp2ZZ(SQ z8G5eOs~P)#dEEkN!A0TCH2ey~=@5cuOK-E=G}(Yj?6QA}9CrRK%{;HAm~NrF0hR#* zioC^jA+C=kSEM?(Lp6N)9hT;ChT5n;4TjMU>OhSrl5*ng$44yqqFE|@NeqX*!;0(@ z-6e@%%dAytd-WcskuJr_DuCt9TOgo3H7I23Y_%R;#LBI{!>_)S873oyh zQM%hW6%tdzzM`*62~d#`dQ-MVDM?aAf+~Rpno=h-Cl*+lOZ(`Z#BI&^aesUur?aYp z3yfHaGA2k4eO1N+)x3t_7bAQU!>AgZ^Qbj>@L3{nT#kmQU4HRl@#DDqim*W?B#2c7 zXcj}yLx8JA$0}<~p)PMxkCPS>u_NIPKgUubImss&-4_U^kd#55*?oOGk~b36X5f)j zV1VnzDnVh&L!32QrQvZDiDcdgo`yqP0=hkaCqdV_LBgVFd-6Q+S`1O$fY;1K*9fqH zY;gTUg*IH7ND`!c87#^a#sI-)X95`)Mifo&&?1NPphwx8jsaE=a_?h43D8~FaV7S= zlWcB8FQtYW1=p;)4W&Y)srt2u&`d#NCp_7W1*OZoEC_!SaoB`4}mswg}<`q>#VrxW)>5QutQS@696A%*v*5l4B`+gqN6{A>yQz;{+>*HAjc1pAA#%d;I zf=lTJ<)3M0gJ16@g)Li@43Id9CI2vYhv1whe1!l(awq}Dwjx^;uIegrW9tgb!-Usm zbWZw+nwIOI@ew@llKR_y$!&7$Ow$k0m;6@)e9=@-o4_|Wh7=Wkt^;WeyrqbHF5xaaZ=b8P>>fB!NM)M6CdX zO|AWznHkb`%*#l)X;xU(7rII~0#&GP!>LGYPqHv^(fwb%LU3{z376Qg`skFyMk`G{ z>Fg*d1>H2GR@&GfF-VS0HQdN1v2txEo;FY{AF;)n zEPF9SwQ#cFlWyZs=sM?)#qf5ex$+r`w?HD|OCmz^N0eq&5kk>!Q+2 zxpG=57bZka62O2ha8%x8r$f+x@`EL5c~A2YMTDU`n#vg=_KJWFa?$PPXrYv_DW_hyvdMUTmK63CEb0XQ7*X<0&YQ-jwf%=d5_2OtKkI?7l_iq z-$}>iUbz$zm)m zRvm`2cAun(Znq$+!ejXPO5>{dJD46X_2Y~n;fTXj2n05BzuL1 zaAT+8!K5QV0mhg532uuJVxc7g3vh%24cF~b_{%Pe9F3&BJGeuxwYmS7#=B2Xep$kS zUsdPHAhe67ofjO1K=o23THe10$Mw!S0uD8U3*dmY>^k~cjxN{E1$cddRffaz-y*23QTrN z1)AapVA+x{upXQZ^#_WhiAx9lln%I((iT@-)B|AY?kRW~S|U9wClLt{j^q^Ks~_9& zUg&nd!L=2u zF-0@Qdk1%^-{A@-x82c5-IA7c2Gm*PRBZFOxp1y1=d`|93A8-xBMJHlR0$s_gE-+b@ zy^9#|G&8I7an})TY(emMU&60J@jxR%ITJ!ckP%N6ZvJucj6H_8<*c}jSvj`b?GX-H z;(mzsi1)hZ=k9@Av5;ahV?Qt^XQ87ePF8=)Q#(g%jTcAlllIDsyDOiy2XYcvRER|Y zmKleW?x2}$f{qIKMDhmI!I)fegPy*2&4*iRBmD5FJ-BoCld%VRs>Tq(H2D9Z@lbXy zN95wb>LhlgU8r?JL`Y_Wlt}fLDO`#y&P0X=h6-RSiHgtACZ9@sng5g7{F>)NqWCnk zDYRGQe>^o`poQ8o6E*!fvTcPF`C;Iy{D2QNAht}bb-beqaUXpSBQm>FGb3Uq)Uk_R zw;^VlO>r5SW>gp-EL#;E2KSF=r(MVj%q-eRwm}CHCaR*SW_(1|=!pR%ikNG^L@$<4 z>zf=WZD2!|ajt(VmpzV=WY4^bKrFGC(Vapp^zR-hpB@(fdo0V403@LNvhdHXIR*u) zWyiwBc$gp`N+~fd0nkD%v1hHV&gOR;NXA7{FEmrLjsKRsYTCx~lNawE{__6Hs;J4| zU;Og^dHVNPzr0_$!-=a@+RZi%hyJU&BOxnn-qlOo zz|#ncdOpxr#Wj9mAQTZkKWAz&CL6xA?S#b3GrsaJH@#+}wd7(9942p_J$iNlWy#lT$@et0n}oL5QTMlI%0IsZ0_DBebCIl1AW zTX_Dv@cd=r`B&ljBz->d$E+BW^dFu#2Wj(xH*fx&K7R8!JU=Zw-we-3>GM%|+)E$7 zS&jYhZW<#F7IQw=+sV`0;pzS4>HYAu-A*3k5AS0ak3&6KU~=676V(%`QKKMjVj2MxX4GnOuu;_i~Cr))2J0fyF9 zP)+SmN73Rjbq*cF2f)0n$r_&`9E6&p{4dc1L?~KQ7`?f+&)PhAv-zNbHPdlpeZBGJ zofUp3eakbXE57;sNz%(Ihmmnh{j_2~xIH54h@GRVvGkU`O2%-$P#~Tp9e!2O;p)Sh z9_JhEpKaOHtnq{ZNT}v)>-p1X9X%%it&TF1`gm5^zdy)zhGG!YDs<@Li((hq5rjW9 zzVi1na&6f^0`sLe)geM@>OV9-=VgjAdIEoE?wH7|DV1UVnh`N$1Zap5+zW`K+Hm*3T+r}WQ{qvlW&$)frszGf>N$!% zoGs4v` zMZL^;~lh75hzdzDKB0Jkz9K(*h}P zZ}DO%cv;GEVBUe_5tT;Jblzz_AtaK9?;pm-o7I+DU zMH|{}q3YUNq6fkUkyYDO%wE+^#V5*Up;MJx3`>@(>LNA}jt?K20JkBkb)Tk9w){?yv|9!%PN-Ru6u z5R&p|YmOa1lT={B&gRVK<|F`EZ}9U{^Wev)Pxf|y>}<7AcVctn5CtL*aCOGcv(~=u z5U`&b8m+BG;wWtF8#_YbE_n_nSvlA&N1RvFQ~hBIj)aCaBMwRTN2|-f*Sljr(_A}+ z9yT4hc(CX)hc(`?5e;ks0hpjPLIYrM(cM0vKWfs2CJwLhmic3r@46aHkVAs}zk3U) zv3!9#+;A<6kI#E&-Q%~#XG4^r7!@DIUZq1jy_$BLJ=cD-hthHJ8MSXR6B86nH3&2I zgWg^;PxWGaM&}Q+!;f=pms5j#p>5&5-=tkZTRW$wMDb@dMP!4eQb<4v%0Wr?R^TGY zqc8;D$d1%>4vIp|Z8{}(*zjmW+0Y&BJfHN>JE@LXTYDwSLY~bvcNI#OOrZ>%^j=<_ zb-aj5Z%JH1AX)E%gF;avkb{^CcT6V1F#H-Av4qc6p6KisxL#Tu@dEG{M@=zQJRJcM zSZd;Ii`9vH+QUU#C!jE=tY4(<*}P~k%WYs|9XGW2B;7*8f+==HBl$>ILk3CtwZkb4 zAb()W9qgo>uxY)NF2^D+u=* zMb@Sxw6=yWzvW$oK&oI2qN#u(>qHn-x1j?DtTUfIReX3C6d5dHkuO{alW(b*gN>VYOjHAx?@j}>fcphALyd;iqyRTK(5_XzI%-|8SWCJws|&h_ zk_z#OydwgRN>vk7O3r%2r^JH#1wnzAj2rl*nV2`MazsWmc&84d{%O&F6^06N_zDje z7|`Sv0;%s`b;l?kF&x>&?xurzDrf|M6(6|nhEof10E0u$gmTgb4fp`(8Jl0Me*O9H znmoby#phpt{(z3UEt#-Iy!!a)9lR9u`pd;TcJzxpdvF1H1E~Vg+NNq`jA`BR^RM|4 z`d7EVGk$e7Il)e8$Dx%Ql!`7nr1B|T)_a+NU`AyYz(YrY%vGFHOx5~ur^(Msx+h$r zaFvLYtI>b}OPbP5p2U3!qYmSKRHn6zCY&~hjtJ^MQf*%Rl1<7Wi_$6MjNJzfn;>wh zdH7wcA=Td+-)-z}?I6?UyN!be@@{s&ZEf9xFo^BbTtZ?AXu7y8vR)S*A}cgFj*BmY zDno=|u^axv_h7sbEHFt-TnUI?G@bY(7;N(h??_ld?F_~f6eN=^shZkpd&H^v>9}C6 zkp2d9H|AxkcQE(Nv=!O0JX(Y}u@;uJiiux!$8e?!TFv|5^%}q{wOc?>%KD+5AOO~a zOD3iQ654E*mZ645fCnc6@h{{a16cDw4iNPXB5fEGmm~;e-eCa@#|dk%sl}GT#aMA@ zQo&4@PTSljyb_jcGAzRJGf%rP%MD%^0@RAfSB%7|S@unA9gEki*Hcm&w zi^k$AI|)7+6JW`Z{y&0o%gST;JPMc*?q#bvVuUBE2|HF`_-4) z9BZ1+pSE|m_WpFx`JtsXE1z!s$KF0pST|QH-)`?tdHeYJ_RbdF{TM}oj+W@h#_qv3 zQUP=|(8MnSufN?yNb2H>ZLGl?gl;d2ZIEa1)KV$U^ymduCkU+^ZtXokgy9D599bTC zY$77tf73z0YBG7NP5ziZTGEdV^*4*K=^}1xFs|9Rc{M~77%J2v6!HF04@jL1#)nwI z$2JSi4a|PMv4t4X1|k|y{~Z2&`e*#Tdl3HKJ;2`wd$B!!$CGD=`=JSb$CJ(7ji;^f zO#Z^t4g41#@((^Ef7sw(;_rj~AHoCtjwibtY5(#Uo*w@BFto$(c=Fx$?vuUnO#ZsZ zc&7eW69?o@7BSg7`HqNF2d=RwSY+tbd@0AOz7S!r=@6w_kADJ=NANKD6+_I>ED}vY z@BzqWx1vwdzN6?g+Ecm^*5SwMfTTSfh2iun2OknX(*!F|*=m%?O{#xuIuJvE0Pb)k z9v=sUv&TP=n(U*gr$S_i1afsTZE3Ty`y+@UaS)3n6<~HYr05{Pw6*@A%c(! zLlp2M@Z>ZN=6im+sW_7iWi&cWdTQ6-b7Z-VPQfg`#5S?sL6_p(GRM8UY2pEVvHzEE zyC)~y`@Y=3PXr6*L3H(p9IX;B!o>WBA}C&k&QM&M@P(m8?q;;#$zfvZsI1DE6RRBn zFSh7kG8E@lQ1u9hCy?5us=({^`tz6d{ic+N2%U=v1TCtm`Du`S=d=6AFmN>$QY<^? z68nUufDz|_xe;=HQ;eh^ax@TwR@OAqoFZ-?Ma>X6^%^o?k1}>&l;}#Nq17~eL3v9C zoFYErD;hd+CU$?MLhW8nUdav(!z%LN)1)($`rtz4E zc>bML5%vt4|NB`L(Ko$uZbj^3sVz)~Efbd{_m8WR9csT*@%F`7gE~UmB7#qW|Hq8t zj-O6}1`(>Q?Jkh~9^5=CI;ys+SylCubkk0K$e5qvdhp_n&F-HKK+%tDN55mrJQM#d z{XmpJpkC-$e2j?Qnf>PNr*wOsAZ@OG3m+6ac1jd@O{o#MIvPVH2W8d}PYUL+o!i4I zrkOb?ManIqjlf627JhiL5AzLB)rLo0d%Pj&VmN4T@WyjV`WYv`?@O$HgbPabKaF4< zyuIM%LZZ=jm_9e?jT$K1f!ln?aSQdy2!i!`IQpsc7zg&)*xN#!@|4xH^WjV6+P!T_ zI%-lC#~Wh*pet9%FXOCCeE3rztK*X=ytF-dYvJwd?)X3(;AJrB;WZ8zPkGyWbBX)o zdM8OxFveY=wn8^&U8bDO(GX!xDgTphB`9KTxf=wjgJb&xEdH;KCmz+X{5hahZ-9?8 zq7*E??n-ei^H+o4i3p{nE5^?ltkr-9u1Bw=VK<+Pc zf;9QVG9ZG5VD{bexQ8sCN&n{_Hk%yoLi8bPRrK59)Dn0&Da|Pinayi!(Fu{9LZob8 zyxnASghmH#Q3r8MAiCCATN=olV4+;Zx3nF~p zB1%1cSc%1YqGxl3+i;Lw*|yLQgPhx*6|NL=7AS#+!ABG7s)H+Bbh;GsL83AXFLAL8 z+lctdZ@Z8t&_y3hLIIyh+AycMylUJPX&q_CUU_svKjwFWK%cPbKIGS_l!_h>q3i4E za;yPFO-QirgE|uNj)udHMHGmgp)`wC zXFU0T*g7~oPzN@{4h(}}NB9Q&C5#DslQ@K?%p|OaF(Ge?S8HA{93x!0(#IWg6~%6Kmt8{@OD zi$&mcm6^1c@@}yPTvU{?OEy_v7eJBpDy9I#kqea^_(KjHc9DXK3%sUrzkhVAz(E2| z!url?Y@LFN7&P#S;Usl9WO!>r2xlIKmNbk*v@9fI@zZ1&m}5>LCUg}Q7qG$2m`lhKfRP6txnPkv>B>bKb@|KiKw$T>_=SEW$|V0YNvLPmm6uy{r~1P7Qw*dteX68253 zy(VqBbQIde??D10EGd+u>g`CsX4;q}bW+No6eW6-qb?Y_=~#38EI-T)v_#Uc!CrzK z6+%EYUA%MLkyZtPSNjE=ejKsS$3w@7b|@a06a7J)78TA-)I!CuBx*OV#A+}l2WZLh zPle3U0*{ySK4+nBEVsoZLm~-8d}IiE#R>?bA5^(8C!yHyjdAPho}BGmy0g3vsgxxS zj4$5a)6`VYi;j-e2F6AT@o?~@3rEjBY5w((6~q1&m94|_6pBzUbj5mc_!^!k&ZhC+ zNtL|w-p{>rNp5){T0_WGF-w(@=G1BO+gs77gruXgF^T;7(GjvYIDc!t1vycs`qw{- zBsCPG6gw#8JwX1)&%H)9A`{G*KU0Bj8sL--aod3~S}nGq+|;3}TH>O!at5awGx-WG zd?Bq;$X2Pd5MLmAr)#WCu}_&LIk`4b&u%rqgiiZ!FooMye7V*hG#a-#dw>PT7mhxV z(qT{au7@YX5f0IysI>I6lGIMchXhqjZ50g|f}j3XRp5b1%b}io(6ZBo4%Tokp{AT( zjhOQ-VjXR0YK*F;LUz)LR)LJS!L_kwHEhIKtgGJtiw3D^Y1GL1e4`q=hN-E{kV#e> zC5I{zM35P|A7Dbs7pytDWUKcZ9z(*K;8o;}Dx$-}d;ah%Ucd5cE~t>sY=JN}(>)$z zEFD>qWXVSJc{p>HCVV0>62}mD-T-cCJ@2XqYwfOo@Ditb-%OrwW0v?&?H9wbI73wq zr)txVy$9m)AI`;0BuE+3*&4Wo8gbJ7s{vxNQhd_z$MYd#oAiy%31v|9mh_`0&UoWG zPZ)Sk`9r3{=(0tE+QoCG?W*WgI{64-?fhetS`;V~BUkXWe|9yJn6^bxv7zk~mat9u z3)8na_L%umz7VQ@FBbt-zXIn)T~^&hSccT7LWTs3jAHQe5cKjRb;ao<^Qb1*O+x%r z2$uxG^XRoWNg>73qcxj*PoM1_wDvpOy9b9GJ3E?DSqv70qZUQh4)H0q&z^-t|cBo>cMOUg9d`9d(P@=!4GR70Q`isQ;)j;_c}mfRX5 z$Bk#>QF~_yUFiSe7AhXR!tL)|D>OFjPqe{_E-4V-V$G{xlTLC-=2n(T zA0?!KQI{4aCYfsMS{pZ8(1oE=i7N=(hq7%!!v5`8iBsu@ASK|x9V=L*@Lw)D^UH7@ zzx~^>s^PG(^2%}kk5M%0QSBn`x}$45chibXzQk&Ns0L(LD4A35??@#)s9Z)XY+=g9 zY3jRtoxhajVNlZnhrwS=KW2cb9DRxrbiSAUasY}0(!LVT>4D|8LM0)cASyH3kEM0q z*91du|&2p^Zmw2(m6cMFTY z^8l|+fV!%|Zlg4T5p+<{xqbDP>y!bA_UDsI+6rq!|@J zZlys^fKc!V7HGUNIC-ie5wwSVSbWeX2|Dd$(GMQz(6<#Y5j88JBe=Fm>%$gfz{We$ z=ND88Sco0ja;ZFmML){Di?=&R&u(a|!1s4m(7PWz#}Kw|D+6y4j56@z9M92nSo)Rw z4grdC@8&bl(Z8=B%iX)JEcdQ4O;G6qYUMa>0Qs!t*v6q{aP5I+_CuFwLMSO zSBI}g!`I`zfyEC*CR9~IlR&|9u~^c8nZCgyT*4EoC7?5#PliKFSjL|LOW-r~cRC!dyzGvCX>@-9EGp5N$^?kk%G79g zBxy($8DJXc%G-~W=N)~|Xb*;13ME&unKN=}ZY>V$aZYtw~Y*hqz z?P7g>B-@lQ{$_VT5kPIujlo-CUgdu?Akh*xSrA@0l=)LA_`t1v`J2DsZ|o<4^_7Py zb9jUpjr`35pi((p|62JiKL>eHRyJCSrWh`(g~-R;VGEo91J=ymwYRWMdWZ}_yh0Ml z@Cr%n(%&hn;|-RYm#;3@?%!t(*U?)l0*IAXq$n$qNR8&^sQb6KZa*6*-ANbUCa(N6 zDph>@F~!kzRfxEL-+K%4J?@1Ed!s!bWD)*TN5dSrD0&5_Hn?}ri_Lv(T%#V3xffCV zdR~@L5ZoLNFL4Hgb5qT{yzUl!3A^#f-7D5`2w<_)l&QXAKT`1!eo6m0v|Va4M+JRX z3&es)Wg9u93n9eYsDgl{NR004anI@3VU4V7jKGO--*Q6|HG&9Fvi1q92Kgl{9kk2C z*Zng&S+$EoW5;Wr9nz+sA8;VpX}{#wmOf0 zJZx>UdiVD34;wq%xYr5Ar6JusI1!Gso#3p)F?b1Q{=&1N6cuHab^e$0O?p~wF?iP%}HBrd=iUAuj)jR34#>jfB^M z_{XnMsM3h~;L9(0SKi;RF1q8NBsd^L>KVYPLL6`2c6s@Y-DET6GvSDZhRn*U;k#4b z99|xavaux*Bnx&G%vyeKuzO~FAf@Zr&}H}X7-#t|E_tqxsM8Mfr_R120VSj^1|#GnFKLx^jbo(Xf7bW{z=1Mz zgKZ?tDTwMAQtBE(1aXLTD5C{nVfksit3rhInD?hjVP$2-K9nMN$-ztMO$*Oy&oqrU z#efeYm?#mdX2v?~lHI&bCorFLaLR6fI=;VqdYIXO6kR|q*s2>hrBNXPb6~V4T+?p3xyB>@*c_Gh3wwl=g8#T-h@vo zK1cOC&Hg3x=*)!&ba2qQavTCs-I)O*+!zn#QnK}2u1zYSnS*H*i=PCa2Qy}z8iH|gDgzfR0D0_A&WHElv!Nh_Kr08l;jAzm zw)nH-{+51}cZv{~%sq5zCny|xAvZlAj2h9c0iEQTa)tJkG`kaLn8=9;k)vt~^XI|| zM&5Fbn(J(5MpG#CL*UY%!+oV5#i{pOVIROXc!CNQdl#JB_wP5(seSF@xw<|z+?0x+ z=xp5frD7yBwDN-(DlMFjbwK)=T7ihp%r-#eaXXTSi}ht}9Blkip-+M$$L$%( zu``<~LTED-2FC}DN^N6^TS-Oa^a0W%eMpd>w2HV66W|2sg}#>8!z*Ei8pWsfgWA5w zdh@G^zE4dHurE!rLDHVfuGN^m^8Xq@V+aw+yK+w>X6%+?0n-5Vp zhF4G&UUas3m7H91?{B2`xK|?Q%kY9_$CDRurnIm9)=q2VpjGv%_2*5Pq!Kq-m^S$vwY!GrdIVq`i9=c@dOOhXCNkh!w3o0sX*|| zkH><4=rwv*9Uw7`k4s6;82golT=HCUiN-hpeo#R0NP|l|avrT_M%twMrNuwKgQEjV z&h=j|E2YJa0u$n@OgrXjIjC=swuE(6qK?2g`XLfoq&+oW{zajL=Yl1C(`1VQ#_p7{ zpqkp}hfkKj;_eukq2sjBN)y^boOh=KTPi6#sEeeulxE&JnYA}Q?xHR@$85fuT%7YG z;nz}2oT21Iz1oG*;K(> za&)0Cfj*HFiq@_q5$HUAP=%s6Mif(g6#cva6W{xMU-0Z{ItN@`Og9fVA6B=IGbzeZ z)#OX`i7uC-E-c&=r4)+$FvFGCr4CI31631({m9I+lqJLEa;< zU+z)&6cQn?0Z$FbMcGc<2*`b0N^txRWI5KUd$RAbAgHAgQt!8+#YkF!3CGl>9ApUy#1 z+S55@1{IR36T2}juQk>O(YI=(B7U;TIg-@&<}40Db){yGfgvMtOBdZ|h>F*r$hSCW zZHN;?l@6E>7j>vK4j$d;;IESoDaFbb(FXxSYbt8eg2!u>H%W6>GQ9 zx{Jn^V2E=LJ~QtOHH(}nzxUnaJ1a(Qvqk1k7Wv-&uf!K#$retsjkK~99Sj8uAs`9= zbg+pmPl81VGtH-oEkwASJ~;^jh14QUQlmo1H4AGyn*cpF_XqWB%-1`^@~G-;bUro| zEu8+au|93^X`_a2s)o(SB-{qC$*gSam-yS~_NP&oH|3DQol4wu72QCIpZ<07S#XN7 zo;C0S&z9XPy=|w5J^zEh! zpD{V6>s`>EAgiz{+aqt3LOch&qFs6j4=*(ztwZ-1_`-&=;T|@h(sjl1I&NQ|Sk_1N zp3?GqCHs&+u_7TGgzqw)o-?~9jyOf}l?5C`gOjr8GgzFCS@F0OzG3)^$%tIi8^B^Y zcjQS2OVR#7E66M@1W~t_8>12QqAFk2FpRbbn2|IpcX2XjF0e?#4Ol9Z&5iI7M(s8U z7+4`P?=kj5cq5ivCn4DZp%xfl$eJ=_(&_Qlh&5$|+CfQrn7Y?2eEKlb4=F+-k1 z+3Xbghf~I0HturmpZ0qQAU3`sI`E|yk`w_?@B)q-SBz4Ev7{<3*yWI_Y{e_8;Pxf7 z8mkH*?qV!Ss7U1lK8-tm+C~bEQ~LwG*Rm~b# zuubHZP-tOk+hhOw5l`b2k#Msy{F}UPfzqfm^6n@_vlV{14^#SLsze#5zh-HUBT4;ZV1OiL6UKcl^!r8{px@p^xQ8k1igI0T{kk-yz zzgS+EpR(i5@#^NiX(=rVssBZyB03#J$6W9mTK9xCW79XgLN-i~SV+f~rq^h#Y4K zAe#$nPLfcx@Ms!gi~CAixlxJj15#%5L4lL&&Z+8?bco79f^#jQW9NlJL3W#fEX=U` zSG6?Do5--yiBWY?M1*9CC?4Fa5p${6x9Ub4m9jQbH{b7d;|E3R<^b?Zdq!9w4wbrN zU&o2cBYGknSM&sxLBslz>~Y0ZwecxzHmJwrn;r>|1YS(!KRi3=v7~RhTY_WUwx@zY zO}?%bD~B=)%oOe`4xNgZYTbs10!8t=2!?s7Vr!-`ZsFW`-qtrXe-?4#knx6-s3!9~G?h{+fpFw5LUHKLaJn zH*?{;*uHK~h>|0_Tc@MHH&|O3&!)j|UwO+E@;c`CPq-Fg*8$<;!58HVG%Yl*1m5qH zdX6wGmPc~y7{K1dYWrmuhlY{Ic+O-A7-ajcc1E+hiaq2rt&j_ad@d4&rm@?+Lkc-g zKq!Iu8-p3RBL*0(R2<%3Tg84WjU4-%3s7sAc30b>h0kV_n4MZ<>9}I*PwW(o@u&R- z4z=H=p&@)5TNmN4_AcUQ^Kz=gD9h|>Rb6H<`{?6vYu?%Q_|?9iixC_^eg_d?KeZ%SMt9l)G=-&6VG%<2 zC%Q9P;$KBj1+vo6L@f!O&~PxeVm=MG#`tG|ajX|P_>EGsd}18d02Uuect%kZ0v+PH znX6Y!{UX3Nkt`|fNTw-9O7I3`%f4d#KmmtkZLGv(h=TfyjHdf>r(7hbVHj<{`8qPe5T8m01?ODAv*kAC!a4;yq{94?+q z_VX`h4Dc9%?`w`w`b38C#6?&7jS3$hxHm#4`@`V65DH!6feYCi@Pl7Bd+)`<6LS5ET-a*wX#C;9V*_PvE$z7pQa^y? z_yrbF9$D1cVrx{UoVoP}W(&C+w=9HQ+TGSD9fc8*9{bqZ`u9n<_C}T+yBLX9(-=Zw zAm%W9+K!J(?TGfQ9Uqw$wl0;dY~}>E7Y-+X8Z!L$OZx_!w=pO$%?nSIha(4wGBWjc zg<5F7S;8}QMVKNh5iacOu#`MtFvwJtQLqV@V?=$D^9_V^Kd@v)5@8%w)Ze}WU636`9b(2rQn)S z+!2bMa)z&3en3B&Ri3G#;fNa13NwQ)ha}&LMl;liCk-Eb~9KO;5TaFz44#cXc^|rjuw>WVa zOCPajQ)0)$;>nJ#8ttUhR8aWR8QMa*anz+jeHk9Q?1U#vQpU0Kcw_T>9HByeq3v&R z{HoR2*#GvR@xGD2eYU^%!#0W!?LGdF*5)D55Em|?OIfeTaGa^~94rHfN)V2`h}#QU ztLG0(zLP6OF6^5cuC`e={dS#jM{CxTNf{TC$ywU7m^*s z2eOF=Py2Gn?57mNV2ZSNV1tv5E>V;(5wC=)(I*(H2(E^it^ZxIJrc|)0cCp1T4GLl zPZgXnb=q7p(0`E{G6KFvAAAI0zG_klADajV^i<46WZ^nPM71vijYr2aRRc;!IFRk` z;P-Ie5*XG`gV7%yS6TenKl?@Z(kO9|Gh#Y6V#=cFmUUVJaJu?jYJEHfZNGPVj)F>}CbeBAC>45kx9yne+Y zP`j9O)ctoH_mc$?VqesMu?O8vg`W*xNWas-$mI~_bYf#;Lb9+VtZLtf{F_d>eseV# zzv`d58nLXMdkNSry3qv8U$LE*)YINg$6=Mah1U^Y5Jp?`siR73r#RN=^Q zP&c4l_D06jH%bgSSgvyEU%lh;({Q_aqVQZ72=V0nj5=6i}BJ1!JcgOjp8djW?;c2oJCx$e)G`<)%ll8~6j$v6oFz`EoB#RccKB6oPG#fA6%h? zviPPjWYpLukElKa2Gx!0E;sQI(87`Rs8KM(Xy&D@usDAc6@n`4pbu-YL*6Gn!Z-4t8-#i4i+&K;Tjp2b*h6;aO72>!_@b6_Y!pknNUY_@l<1#Z< zH6k7gu%}c`DP(G-)E#1yXBUgwx)NMlVOM?UQT<={Gg8=xl-lUn|f< zE|xy-p=O0R=vto&HK-+ZRuvE2w`ZgN1w!LAu8R|fiB4e z4kY=NH_#8j`kaCYcC$ZjptQPW)Rkb9(TgaPK6i(x95Y6~j`P0U;xIz5F=~shuiNd+ zKF$9aUgE^NZe_fkR$Hsm4?Z@bWDHtdQN&nW9n#AJ}ZW;zQD_iQ+x zoc7-&omWu5MD@VO;s@C42@^SVJx@)uw)X7#?&jfhDQDa{{P9@}%Yh{=E}G6umr7+V zF#`vjY${=**kUhWWvtR>fpZ6zzln@!7MJgxG{AD$MnWMr=q6Q94HS_Eu5obZ_wm9~vuoGy&Iie}Z6_RNHKaC zWkh-`PF%StQI{DpX*gy>pN{wW)bYZKLWsn+;iLuAnZw4u}lXv@>9YT4m!Iz`1rTXzGWiu|K~)$bq>P&?=U6RTxFx>_TCiN}Y|8 zP6+ml3PIczU)c-!XDiSeISG!?KLV;bTqy&q$}g;t_3PQ8F>cY&Op@Ti9lpJ!^@SU8 zjOr@7&_7hIySwqUCF*u2Ks1i+Ep;Z!^I6$V2;NN&U9+j7QD5;-c4O3K3vnVMc%*6FG zSZcb387t5=3gp@v3Wz>#?O%gCeXg_h^StoY!gg@DkNe6EwvtqB?;f`HpY83aH*;{f zv47~(F!ZIy0e%S1QAIPtRZs1}1(m3*0rPX#x!^fdHQ75n__(&V-}<)o=MDwDfcr=f z`J^}2WuX0m>k)KwA}Ei9mqJi7;lAiZxsI4gg==w$AtJ8Vu4@6r`PM*4SUt@)99X#d zLT6zS1@cUH#d!WEU;7yv*l1LGlt*Z&+f)><)Hje7L1(vjhJC(8Y$naq8vZs~i-(0Y zF+cSTa717Qj|iJpK2qAY!r;Qlq)e;} z;NUam;6`bM|5MP}KC_ZvQ?b@LGXJ+iKWs1sv8W!RI9z9pclBd@hl*xZL)?J&f*(ze z#!=9p89fRNkgE3yypls)HgtC0XT6VzR&!ShoZ(ui@KBxS8?g&WRS`gdyk+ZK;e#pe zT3L6~TN~?9?x1ff^riDyAO?a-Y}v*?D3G!U%G*ko0~I&EG8i15qrX%O(G(Gt6uV`@JI zU@Ou>tD!O`STGNmQDaz#fD3Htrj^xAf{>*v(uvX!bA+H?q(KhpPpIczRB%=W3hr6p zsEC4#E9}0YyqcEffYE&U76<21BjBPdfg>wf?L%Dy+Jr*`4ovpcu<4mtB}F0h+yc+& zE|EoR1G46u>5F2BOeZ`?aEuIH&#Sp{`bV+qJAq!xX8+4ED(-!CyO7=v;M_AG`IJ!= z0cyDa0ZeL;PGeFYiShr@(wTQ~Ewcv4cfQX;2*kW)^}B*_XRu5=pM1C_`*vpV54X?z{22uoLSZE-{Y(k7~AQv+hKBI(n_$4nmw zFVhK8y8`hB^9dVI7d0#JmfM5#;h?d!Cbw_coghWOvK7!L+ok3lAmO9s3SLARlLd9e zmA$4?=f%~@z6Z*EyqagjW4cbSbG4z{Ggntv24v9Es?gZ<_p-40%yy(eI5O0Hf6Z=@Du=9* zgydm?Qg%{ZzY@hL zT%wY!iXP(%p`Q*WJc6Ge$t?#Qnmho_%0stx)Z4s}W84P`x{a6Yh};S1`(^(GNfmO$ z7R@E9eEqP3fSpcCH_M)hak1WGT7N;bTtRmdCXw%`lM7{j%5lDJ3Sf4sj2rS3VK?kWIQH zDbbOBUSb#H7B)q#LEI8E3!8^HdVO1lxE=F}Cf%QaKi0uRN5YSdC7#h%RuMM-KpvTe zDnSTBhdmfH}+oA>_o~GqJS}@9z_bU?5#3n+ZUI^5qzbCw-+yQ^H|gK zQDAw~97xxv=%ZFH^L4U`UkpZ6D`<^QkQay@Rolg7;y`?dLS(dZq5iZtc{Mztj%G3> zW_;A7wQ0VNj?4*lDQinufX1qs|FpKvyAdhVX~fD4I!!6o(3U9e(8(G0U2-uIGy z7898i1(~U{h<JGeV0mYuLTyZn?VzKMB5+uu?7DG^-e3hN~8qW()7%&(S*W7qWdhq?~(# zg}pQ$wz<(x8p^f1*i1un$PGzmZ5T5y5~QmS>nn-ttof>`^|W>P-QJeyr!*q@VM+kZ z?#|^@?*@LV?gvq1SQ|wbfWh1jhM2m~wQgA@PCX^PbT*9UGYt{$auh$UlvGd=F;u@T zSG4XqiK0b!VsI11L%EnZ>UN!)4XF@NJ?;WX1F%B0)!Du zNSPfkOCVAKNzhLComNVfj!x)W>OU}JoyOYV-%t|`g^oRzG4jo+*eoV04CY)okHmTI znD?U_1f0)Y3V?Mca>CHIx=2|^scW1p_|ys)VCFthw#Ab#a)JJ8sA09VFXF`6Jjmoc z*su^esyq+Qq~JuYYvOVtXC!AKA#^tt4^=i@mdMl%YSEiQCJJ~3(jyb*r1N_4pep%O zCdZR#JSc`GxHS(xfw1`OnNI-*qofj10jzHJ6aVK2W6rMV{l89J<#_W{lp#9 z+F1sdTLqre$tMMmg4lFvuk)E|!W?v%63bPUw<<9(_Yae{d5`q;_e~lz^f&} zAx2YOri%$QOKG=}d*@(K5}0yc!XHY(5D>PIlwistqhFDA$gXZd zEBLxXH!VRSBl?Zpj|uN5z@Ww^wtaxxMjOaveZ>s|CfqaL2ch(gdup~DZRjG7?pE#= zR`3(thr|i%F3$C)pu1%`;J5@GaH4QZzM%^$ilvQcCm_nQMDCQqgI>5N8b`zNjgrJ7y?n~+kkDTf?s~^Xh&M8-XghXt76=PLVq&nFx)oi%6==dkMEC~S>fSCd9 zu%y{Qr4dPAwhS=DpD4-|OnYpHCK^i!-{V479JJ*Qp`$hK8hQ`NhQoydH^b-k7`9qu zi7pB1Nj^4dAc8Dx0XY`D*HOxNbBbg-?t_zjEqTQwM4R2mwE{;58LP zad6(*cRr=BC#dR`zMY%WOqfjDd(f|-(oA`aMXa`iIP!cp;3ibU%VOpf@)=eQZr%uz zS+Iw-zTOmEloj|MFIV*N_*m{+QGb&tpJEirJ^tl@ks8$@2@dx7&h9|A=Go$K3&g5(+1zRK^0dA;U9_o`9_8 zVh&|z*q)w=xFI;&h1l6tD->(=*PJNxt#?pgG_GPW~FF%Ftka^6!M-RNtxob~2m zD&;#B$;4w%yHXbT2xsqZIP1Jl6$EzN+btcr4#rpW7L#*d1)QdVJj<0IvUE&Te}~yo zZdtvN__2w4rBgkYx?_`B?-fv+vYVkY=+TA(7+g@@i620fa2Q>9iis#Ca8@mX_)Uyw zc$M}TEhu_a&hZ?3))~&K#atPmk?EdEK?NpS3b8lb`SmT9qP!G?BbBSI4<%i|C_@U@ z(Ccoj9a+6{KqcsGO)Cw0SG{;*Hxd>lC5)U-eDRbl4xx(J=g%)yZ;03C5R}Lj$ESP2 z)NrUg4#}S=W{5!QJe+?MxPw`z)=VQRH8TO(7k!B>f>U=uJ4fk#ylJv34>8LV_w*9eT=`selBy zBTPT^My&E;c{E|vLS@5opS4DQ)|OU2acWmIa|sSG;6|(zWLT)Gp}5j`jsvGUIV{I| zT`i^PP!~JlAS}d2M7mU9r0ld0yrQa+m@)V%c1=RfM&YeuS+~X`RJia*iqay(nc>J2 z$rt{JB_4_=jXFJ6YFcstP-wdI`~XK3w_4BkTbmn)tt}Po5P$TEMwT*G^+6@MQEUVkhsfCv=LcY9n`Q z{Y??L*y1CI+w{(&u*G&CBx-ft{2vmuIK^Dd7LZbtRS~ZXFjg$MMD6NgY3`g0Iq*E- zj?b+4uO!MLQAn4iGne0v+olnmx-C_Lv?kXy1Kd= z0@|zs5h0xY;(%a`z>{&CRB1!k)=9O^xB#V*C~Im zcEgn}e_99gxOOv6Ql~K$8*zrtV8ZiXGq@=os|81 zz5l-2`*ZJ`+Y|cxK0fLljXuojPz=>H5KAk^ z^j7u-y0X5q8FxKx&Bpo-dIqp}16~JP*t-CJZTMI*5a+@U@O}mqdME&yS9S*^08OjP zDp3cO%$MZafEh2X3p9D%W;ZSE+!VYti?dA#gf<-AjYCWr*07Yo84*)BVJ(7cPN;`wCqwyhsPofTECfr-`4O$2647l)&SJj&-Z52cdZ`}NOdj4 zIXFe?^<%kKrlrKa<1^&hXsds>9b~x^p|#?FAV`BBl^ZHF(Ws;c@YkoPJ`tG95 zE0Ap2e0$iQjuh=c%*HsSbr{EI&)#{hiZb0Wwl9du-g@=(q6YRL0q36@1heVc3B7hY zCHjPNwaGi19or2qp*&vcoh}Y#t&8O97gkIkYsC>T0N3S0yF%zi=&bRf1y1bC;Q|65 zk~|GzVxTF9^1Qf&IfOkw-bEUkkFPGN55$9yXQ6p{x+vJPaU7bIr;9d8e4g?iZZ<0q zLwTxAD2l$5-ubsy;Nyw}jRWE8}RTFtwOl#1YvO{pGqw`mlbrWZYU-d3>($^}9getcfqB4$VJPr$K&k48w84!1};sqO(GGtMeyv@kZk zhAIFN9#?_E86Z(}p{rJ6Y;lA|LS%tKpSQUHDta;^%d8?_Sbez9+S!P;)#(vU$#XXP z7?mq+LOddJ-~#PJ6iNe?w&x7F7*Q6U6XpXnfcllDEeh|P?LN}jy@aF`!EEmQ(6+UD zgqtJglUKM(>=lb!LHgIVLHbWLh)Ng1 z(vm6r{n{{Hc;>$NqJxHRtwGKEe?1$?y7m0{xpG;sAb$4}!1?1PVdeoGninISJC_8> z*SLKEdf|e=T-GcZG?y_`mjx21>Js4L=>n{45|g&jXzMT*i21(wb0&hVe>*1UH)~)7s}KZ-UksK{I$-(T z8nECH(!~I|eo25}?RP;yE(?--$J6QT!r**-NqBiUmA$p|^Re7s*(OtN-XN`9q;b1- z^XKZ|lP*HPCD1Qh3)?#E3C}*BkHqADTdoSf{IX+KaWVA@OALBY_NF6j#Oprq`nY#! zxN>Hgg$M9p$JHa6k!cZbRq?>u5lAMYJDtuYnS%$u@RW!yy!A|`Ui5Rt9@2QnU0yJ< zdx)#tQ6@z0SwRW)@E{jC?upaD-dFEqPhF{BwsCP}04Q9Z@S}l+K5hxZ@V5@%@_e40OY@^3d-_TaaY-BBKD)Q``+iTN)2w^}B^+@-;ASJO z2%6U##n_pi-N*igCeD+c&_VzD;LAT=`OEg;%PU*k*U!L`4liN@yC6V}!+0b&*BQc) zD|2f?gGn1mpu`2>40)Rfq!GRVvQ;2bgn`&?lO38=5N1_xoVBd13DH!ux!IlWgFe&G zDt*W7vvy$mbb_?RuMynCBnaYo)O{%AF_2CR1{1zj$~Np>Mf%$ca}_e788Oq!X)KDl z(Z~{GI6Qj*TPq7{1(^)}$>>kssVxW9LLf1)K_L~MC7!jfM=9^3>w6OQNV1F|NML0u zm{`yQEg2tZ9X?0EBTjPp(+$N7C%LnQbiO(Iojcls2Y6;PAtIKgh9okCoA6{kMhO)0 zZGtI`sn(9jKL1ZH1Etw4@MzgAN#V(OCQ*Q_4xBHAPy)>{C=bOJz<2Iw$2i2sXehQR z1n7|3-wMDH4?43=;cbBF_CSr2^hy&wL!fY0pA5C`*9gY!6+Dp0iN&2e_0U?9J--J* zB~P_c2;00yw3!UWW(JolAkfxYAiNb2LisirGI^B&6K7BQW7>S2_cf)(S8Uq`pJG(m z_NpePQq2@5D31zWPtFkW3|#k6-L295K*GF0M+4Qd+bK24VGd zEy-JAK);LrTP@1tp3T`kotex&0)~II1|BM9s@LV!Bgn z$HUl69&f-R$+^Uv+8tFmSIpE!u#%a?b~6DFIr!&2tE9=!+n zugGA9)t-%h4BcvfDSRy)uWJPf3S~O1*-eZX ze{MOf@~%s|vJUWEk*@qg0Hfs;2QJ?@^3|oQz?iZ1kJH)rx`CkL758)$@-<3RN?N_q z54n*fStR9akemun6i9-DCBweeI_z5=!@eaG{!0#fK8Epq1QgZB4S+H-0xCuyG$c5u zh?1IeikI-&R_09+!~1uyhHe=f zghp6VsThU9DTlHPo+AmEcAGaix3+sbMw$`P0I*pub$oS*4J%M3d-2)DIRKBCik;x5EQGNRw%FfQ&7$9BqIZPT}5-&*>ay6VjMGeG080*ky}bGfAG92pWfL;%LC%8jO)xw)6sJC4(^i zwL=(@j?GfeNLd6$j5)Q!=^VR(E&Oh?plHY>fDvQ>MH;Ri&=AEB%61hjDC}S+*TIc) z_p3@+ivi#Aqg4&Jwk9*gVVP-vpu59l?A?DTt%E;yeWqJTtd&H+~qC&$Y@5BQkjiu8pFU(G{S(aCp zxK7LGGoH_Nei*A&?x-Hh>bh6!^NM@au}_Z$7(tx^=kz*jK6)mD+SeshrUZ`DW@bJIkbaW>&gmc zM$~;1ZWzY|JWYZk;8&A;&THe1<^}&=p93w`$)To4`fD3 zZ4gM>BoRXR%GPWR5;n?{DTq0d6pd@O=L3v0nlu;eOTm=TkKr=DNUX`6u(A`1tukHl z46?xwtcBn3!f`+G?D7k*Y&||YTj1JQrsu)CT<|BKxHi^yvnk@v?ZeUR`?J#oc~(%y zMm$r`XttpM9Aad4zTMGr4nBYr?eH> z3Eu=C;hdTu1OIP{Z#~oya=sk$`cX*ZKD=z`t3Egw3>-tWy3;5L`wg7dG!CkU`;i?g zcA|IR3Rt&E1#-DP7Q74G`L@N^bKH|R868XOwy1@rQozwxkUbD$I|w)EfAh_E4~O6F zKRvkr_>rNstu6*45_`};TfAmm2*NGwAfp9}*oz=~I6+HW+vwjvc)aub-~aXxJ2%rd z@wR-K7X59tZ1Q$v8JLLT+I#Z*-~BFY=&Ogto9vM_Zr=KB2Iqg=e{}cpe;n*o-WTsS z`gs{^?N$mv(pvT&HIwI!{+}M-|NYL>w5GoKwtSV8+30_D|LX)pz5XA5dn1I-Jrl{33{~t&NqKL*gHt89ei{D-m~Gq-%nol`Ul1HA3jSO-statySMZ2Phu-Q zzDZxmTnhnY5C>Yx-ag#jd;0j{?xWaV2#8Y|gDvtwD=9vAkq8S5Bx}OBB-|*4_8&ci zWB&28{e#}$dwe+f_N#+u_n&?HY@eE1gQ3)PSfzJx|6(e+IYK1WwnBoisS*n3_y{xD zQkBc40v-kH3RZ6{T!OnI(#)U*&U_Fn7_cTPA-N$aAts6IRV`zmr8Xm;Z85NmSIdYu z5r3(*;Dl5A<~A`wJ_F?J&<=XYRM6p?EQd6h(Dm$23m=|N15=L%s9&M2uGbTqp z5w3Q}jqg-Oj0*t1Z|->z2K|qo|7EoEKf62sbz|obS6^HkzWnHbkOgA`F+F;$gD?s< zsHfsu12dr*h3XdOAz34sD&>&=ix=+<&qHXYrw<%mI9rv%T2D5dXQr=pmbxsj!r?iYFcl6_8Xej{lA{!2wp4@*8fwLaN43*JpGdc=PPmzR!tEJ=jCdRvm=GZJjYT9UO!p9M4Qkt{AZ?Vtnkr$tD;^1^h-+zE{<94*=M2hz0fy@VL?u9)$CYu=paBsDW)yvZa@a5@p8 z%jCO9a_ew_-^{+Jvu$#8pk9T^m>UJbl?!5XXRb!v*y@=Q6$ejE3p;GRUK9&?bCLsRoj2{D+F zV!|nG<{YIj}iH)V{$@VOV z3o99CD2iEI_L+9!!r10$z=(vq!l z$Du~9cxw<>;pa84t5~npMF`2Qo4@(j-~9fw-~9#|VnWU2r_V>u8sn4s84`Iyj`^`U zAawlKuyu{!nb?TsY-hs+1nVSXgKbEMnHY(Bmz<#ga&Vga^uC8K;wA-Uk1ST4>JSe@ zdU7liMJ+ok@mL>+6m_Teh*u`nlJkF#OCJROR>mPabU29UdqGjO=$2ACnrCf@6(}l* z%lotZd9Bn6j$y7mkOOvJkqB81QN?bH0gHp8)gQfudt9+g{}5WAYA;@6 z&IIYNrtfiSYO>L>H9E$Q{?Uhn^5f^&UeI?aPDHD1mv$)@YXdNkr;Ni0MHDrn;wJO7 zNAC)-ai>M3!P^mH`*5p+T+&t^lC#Rb4-x?_g+xilw+bOQERTN}KeGvj_OV|$B!|1(kMw%l*@QjJi8kB- zA(4-&5P7@W@WFJ1a=@0`4OjB1_t#s=7>M5Hh-D(fxQ-@rBsUwF8C`lIUn7<1UoO*nXPJHD?(VGt%!U28&nqB@2W7NHE;~dv& zBID%@q<$7!^-3t491^ku*ZQ|_!(HWNQq|_~Vz(-iTsPE#q*d>GhN0PC1l~rkIk*K< zMfVLQXSHtbGuy!&Io9z9s|}Av5Cyij2 zpj!Z&h(m?$@a@^j_a$^xTr5n@5a(M!ro574-~(eNv0Szo)62fpbXSqf*yfw2rC3*t z4ir+rcJji{r3v-uTg&zeH561`xB3X|tL13q`s8@PQ&FKO`@J1D-<<6fx?BVp!R7QO z@rhy4)*=w(wX!cpCTxtJmGtq0^J0r<#vJN7h$Ms$MRUw$sasm z8@RbuGQBd*CrZku58sPnae!6j;bQOY7zgzeL&Dv9he%Dp=FJeJ&rLR`itZlnKl|qK zUFlIn&Ipwdom9M!VW1H(p5EWeVHMFh`sz!#H%@SMv<9=_@Bm*MDJ5Y>E;~R@?hesc z&oz*V{k@b9bna8n03Co-VWX7UsD-OKylbK}6v?pN1z#J{spaQn5W(_o_ zP{(&8GhNhXQuqU`-Dndc@GCl#TS@WX%;@d7pXf2mrKG3G^D~K0+T8AxNfi1-@`TjH^j& zt7Qxw^F1KlZTC3ix;XWvPnf%92wJgm+~Dj@_q5Z{Lvqy5#u4RKj+=`O7-Mu@WguMs zxZC=;!0@}>$IcGevWJ_-^sADTnkWAd0`znaSbZYWoP)MnDy)5pdUBR`ob4RXYeKMQk3Z}(}-D5gKu?wrSK~s|UoEQYTZDZpW zImJy~*!eVGo4Q);$|6XImM22PSjP-|OL3640QVF#J78DIq~qrs8sTp50oB&=;X^It zcI@!o=ybr_nHE!V>vFRwDc`Vp<1UYt(%@_ESzA4^a-`mKdn0#KYH@&IpNrRx zFfpfBR#xV`{|4cI4CU4umSBZGRtfTuP;~tS%?Wgx=ZxM3wC+btwfn2R&lC&Rw}18e z{2C3V{$!1wk%dtga4jA4IJpfW0n0ni51aRyOn22G!<*RM^YS4Jlb%>YI$WIvAA{Fe#Y)>kE0MS60e8JJ&%;=l#!RZ+UZm+VXOMl80#3g@Mv70n#hDP zd~<8QiRH@-X4SZdbpt=UIFYY|ZDw`>GqWfju5V7};U@^*eoLwdMHC9*)GLk^NFtcG z*hlKwMU=K|!P-h??&in0(0yW5s$6B*NnsfMW2u~nBDk9hM-fNCMTf)&_DYz%0G=N@ zI7}5l`Dn4hwQJX+^F*Ybx!=DU9cd4HAiJtdn)Jw(KPY|8g)(_Au9Q z;#WQz^brSy&TuY$Ll7XGBocaZGLf5rt;Dq{_Agm!h&9ac2#xpEx3jz$+iq=LqV>ky z8-c8sEl+PS`y##@TpeS2>-6m@E12-+F=tNq5T?yFpdwn5#wPtk!}zS~HeM`?*tp@a-B9U-BH zBWKEF6G%eO%>q?tTAN(OW*5PR9(Y5G+>OWxUdN$f$-ibY1Nx#fFB*jz;fEvbjoo36n~ZK_BsWbP@@N z;BS0 zkb`BY(*Xzf=8V_A=oAD^a)wcb zzveC#8f_GEWrq#k_2=f=d8NnYKP;mY|Z?f4MY_gy5k_9GS@gi_K#F zlKH*0;EVMOv@AYh`1SGh)#!MB-+i^j7ynfdY(?u*Mr%Q!dP8ML_fIAZ%cI=rtl1qD zua~YX0KXJmXs8@D_JBsmW)F(8{aGSNP2~bLaC%@*a3#!)4i}Rjut$-o z%1#7HPu~8}elVki^q8Q_8rCEn_PL5Ggk&SsWbJluyxh4nIyy241_6T4^#;4)*~$Fv zLO>We;9&=~3e52s3zAiUu~v5OXbljrNbq5;Q+yQj1eyEbE3ge?RhtHuIwZ1J zaGxZNi#$0$kr|d|!<5?my+>vdOYzuFc|uAHz`N*G?35nU&N!Bi+Q0?H|RYvRQ@qf%X5 z-`)VYdh~{IIM4|Ywergs*lbmNQHtsWVY=EfG;3GpQeUZE;;;>{rh^2)nRnzI@N_lT z1qS3_V{70-fOI$50*XddKeMbFyU8|1*W74eM;b?ws*r5DYUs)GcnG<>0g4?71+*0Y zW)^no0FW6ssl+RDG%w6XOl*+zZV_i@NBpW}3V{<=@8KKoHs*4!`f-81#givk_=Cvn z1rSV>eQEF=EQ))6-?x|~{siu^_dYG=a8}0gkGOBge@ZOlBXQ`cZ#a5lA57m&4uk7% z5WKLVGYvAqsT_@rM%MB-@R*Kg<0Em0R=TiNu<@%GXaNVv31G_XSHzFQk|~(7`D$h2 zP*=c;LHX^{r;a_Hao|pVoCkB-$uhi^%@pQ}TLxYi+8v8BycD*{)EGFO$7 zyhw}}qkQ7eX2E$uO>BFr_5$#dMr$y7Th;0SGV#4AkjaY#NF>+-^Ht|KWlmg5B?V=o zpN-xOY&T{(hoG=UV6`$w*>pa~OTgefYXenGbQp9tDQWxFCWuUkA;Ti08xeRvU(|6% zdG%brpMxhPbaDwtu>xAl|1$A3EluM7F z+2=tF(D3G~{uP00(&Fg}jE%nJUqwwMasZQ#Wm;RoTmW?x41%51@^ywYX}oc$vk>+;XjdiG zR6?cQMEM8usMf2fQDX0eQ%wiii}daz6E zWar{+S3b(4%rFk!%%5wT6)ldP10-~T+7~S%eAb)CSPi%}*c}hxgzSh%Rq14yqp@>R`0M zG2zq*`0qJ(>BlFBJlmz7QpQ`mpF1{cCP)d@1p696kf!b0NJ+vjW}|ng$!%>$%Y#JD zNb{tk8+I&2Hjh$C6nWeIQ0Z6cBZl9VWKfwc9-X6aQ~@!VGlB$} zISwgJW@5QPUygN|DZ5_DJo5%Iw9Gp1sAh0}sjRWx!|u02m<~ZCMDsNoi&VtcIaGLg za*9tIYNz##HkARLK7-wn^p-I`h|JF(qzKA9S&<+(nB^;rZ{;X0k5BkwTg^?mkV^yr z&K`u`<~@mA^7Z+v@%RKnIMAT1(o>nhxm!;rwfP8Ef)ke(Ku9@sJ|OcRq;T2X$8ouk z%BH%?HJCs*vea7jr|4TKlw^XSb>{?~#oT%4nhm!}l7&>h+%bbec9nc6xa7^fK2;om z5WT3%N>M&dnUwGok+AQSZgywEK;EZH*mmXUUEASVXy9{p-=NL_!E@R2R(+Xsd09m8 zQ%b#1NQB-gPHT*3xZVyj$G-?>!Uu+FB9k^&Vo0P73*i$k!3Nhp`EnaSB-0`jb3u?< z4SfBmFR3qh3KKF?MSyIv^$-DDY#pX!-IA1BM{bRwfLbk0g4*+aphUF`ILiZt2!ux9_^R zSojua{jtay2X=PA2JB4F*849J!>Sk@Dlcs}Jb1|}zffj~H_Rl4{4QOCb@o|Df{V1! zw$CRkr0!~xLWg6XOEmyXrwdbEfL?{3q0wOC=7Y|ybDIDbe z{~pmG;I1MVq+pv^kdJ|z1Sw>uHlZNJmx+Y5!*d9P45TIEAS=6~Fi4z2DiM+wi4|zx zjdPk4{b({#FyL4u79l-rlW30C&oZk{`P&3kYA_^lBYlr?Kxn-B<}c0;qnLuB9v5@7A@pb%TJLfNW7 z^rL;CCryk`L}n_yNiEr$j{5ssT=#@K6c*#7??$-Tt+EdarG5K$ib>oQe1@G8lVI_J z=hr<$6Bk^l&|DR|jc?@~ot`1eUc&~AgH*odXzG@Ty^SsUT*<__HD;fylu2&HZiulV ze&u^W^==~qmoE(|=jiQK&(&HY4ya(wm5d)5gl=C|$4L%ETagv6)Q6V5-FJ#br3|0S zA_Q&OvPhxwm|>yHqyzI3iE*KAR##-KmMz$&=XPr+{hY!b&2O>NDh3*~Q{r(C&Zi5b z>MUzlU}^*5tK7GLc`!6K4Ja`!+RxVy;x|dB9qZWUe1UP*O>Un|20K5KSnLbjU5s+7 zeewN{$~T$6%6r$Ul}|Z>D+P+trzIMTLWm#DGpDIo!($trCT>3AlLTV{moC4|P*HyB zM!$-r&_YlOsdmBqZ1A+X-NF|@6_F7ZI%2=-TqI+#$*Dzp06n&fQd({A!l!Ytt(~}w z28zpRz>Czwail9NvZON#6Nn<|h%}On#aNzy5@{*tf%tA&!%47`wQt6ZIRLJhann%U ziBS{ghhViT2p+ahDseb%>Qo%DN!ieWCl$!q&!W4<2wO7V+~^g2x}6;7&AF`^(xT_= z5q57Iww%J8^1`O2MlKfCNT^sCBbKAt9XcJxNYZ|bIU;FfLPs!2ut`M!L#uI;-6j_* z@{*IpmPy{<=6mK*LgoNR#P&7lspR&#_yNrzh3Rd&$gU;j%_1UxZpj9R1*FG{IWb)( zhH!-V7LGtmh9ShE5i?0z;4^AcF)Vex(VatjgCQUw8-kb zt)fuY7_Md^2k?K@&`I62)QC7l{ZD5fY^%{?TSDd~3!Kcp1~!E3bpZ~q5e!{Ma7f2@ASPkQd!6FY;3aU+AxPu-M0!f^3?X)?&;Xbo{ImZVB#XpORK5ZiaHtO zMv6e}XayZro=T&7(tm~*s6Srb7VHfF>j*#rs9PRKN__ z4fu$8x-(ohU_v;F8w;clcPeW^zPnX~WJ}BW}wNzky=zSdv5kYUh-*FOc*& zL_8TCO%BWVa~z46cXT)4YCRs2#H(;&O8O1kBEzv<(onob@Fos}NyWv7^c!7fy116N zdN`CSJ-rV=ZNEM`KN_P8+$95)gP#{#EMj*$ze}WFSsiMf|Z#jBXEm*}8ho`!#T%_Y=G@RY+47Bc#J^3q(5v z;!Ol`ct<)457ov1Rcwq+!SqQ-2({;9}PtNEXb>|_poFN$$}MP?-Rzf+Z^z>DfM{Teo=Dt6C5 z^+!Xut*k#1~W_$X}(!aF8EYkt|?}e04lM z{Qd#P!c{6W6ZHCyHD}*R{rwf+0*-v zzQ+5{^7r>2J==f!uXIN(A^KU}WPxrsx|Igv0-G}>l-M{`^FZvz6z%7hBFW$d? z{nFmx>fhw$C)ane#8z;ug>N5zwNHr92FkwtbnxZv7uWRX_Lq&~0nq;S&B61(e6;xj z|6YE=O89pzzS;g{d-Lxv`Y7`P9*ew;zd@N7{p-72^`{`+{XawPW_Wl1!TpB<+hzlj zSnA2{(`Pz>6dniZ?;j1myz=62+uJE@X{S%VeYE%NTgPyJu>Jhy-+ub?_O+{jr#GTp z&!v7XjTnv#6nKMAepqQOk8*&R#nDA>F5T!X zgaE{iKFho!jbJDz1a1BLi}@%0Ygk{r8Cq~>in*RH;=83s#Wsn`lO;{sh`-B$cbqN4#qvwIPS#$fv3HjB) zWs0Yx(PCuyg;THtyOD5S!Xe#2Z3Fp^+P|;Ss@K_87%yW83<8O06;=^N~hU2JK&8n?wvnOD4)YDXFFtf5c9$ zq7aP?G|>2vDdS{iLOSz@O*kP|8(%;=u;BeQVcbzAn8D@9?kZ+ zGFK%+j5Kp0>OBzQI+2NxxL;&jfxp^iEu6)%uhv-Y{lCWmHxKUOsiw zifCP{>B#ERZryn+Q-|ZP>etI}4NAPAYDH2pyFFY#uUYs!d@C#gr z%|Cpw+Oi+7_lN;1Z%IsJv;||)Ua4`6S1=Uq70{vG$<^4Z3JF7OM~M-I!urRmitWtG zG6JWR_!7h#z33kbk5fN|i# zPBmaV33ll4@x6No`_FI<(vxT3KHZPQ^o|)x<5kc<=oYukc&{+fvE1nW(R%>)=zwLS z#yPgb58sB8GWM`9Rify&qaUL1E>tIX1YaS-Fw%4ZQ!&9a$YjsWLKqZ!I0LypPFt-6LLDlrsni){`MKyb`})KpSN%CKfX77_U9*@ z6%DVn+jEpGooZxb@fZnW7!<_FO3blRHm-Fyi}rMS>T?#V;c`CSo|qhvmLsqSA8=9X z`*;HO+mplN=^W?RJ(j_Gp|z>q1Oiju1+?%8n3Eu!zLwDejpNZfheXM=TH64%(>Cei`htho#=jsZB@bd)v!Ms1wa5(X`W#e&Q>m1>={ge z`O@(VDv-fCLg}pHZwTJ=Pd|0QY+(!svvZmkgk2pO&49p&xQ|g(UJVry!1F+d8OE^e z+E@9z$9949s^jU~>)FTMEu`K_18h$2UF{T-E@Zmt_RGp?P0 z6zqo!EqeJXk0q1tHLUzQBnjV>xz)C8fH*~Flf-^8(}kq-uX9XT6;w=`$TaIFY<}d1 z;*FQ74B6B5XCgh?+i+8gEhwu*mEok4sSBwfwr5>eT$P)o8VnHGDaDj%7sZSX5Ul%j z^rMS)#7cx46;^_aGN%9Y0EU)NrXX0mz)wNH$;}7@JtU2B7e z;>zSk>D{8PRpM63O7W5DLHnA~OlIf?qN!^XD8e-WM(H)dHDE=x)nvG-Y6x-4t-3lZ zPHx(en-qIqqNrm=Cv*SN-C`=cX&ZV~=b3`0AR5s9{(F!(Zsy}ACFhc!@-qGz#l#-D zC{92Imx~e7%CCcu6m3D@C&Gejl~1|oaBiW6jt61j^Gd5!ld2->-3jbyhV3~GCS_?c zfh7lULnts-Q^hs|HUmS`#4;t?^n{0RiPa@qnVgj%tK^^HRyn6kt+UVLC;Lx#pFMtR z_LKA3SnyygvMK^rF#9Cxf9|zs~Hiii3Wxy%U{&gWe zIeYg?Zq^>WMnonrnRWHbphHgdA>)CEN0T=bnE(D!GJ$Ma9;1CdaxY@dARS~=TzN} z!p}FtN=*qer-Vf6rZP(12?5`iAf;@Rj=lk`Rk7STJ)9#}@$DGwboL4_qAa-D!);lJ zWKI^WD{yJcNaD_)><^xANEO!WZ$^FzJeEvb)0S2YtSouX!BK~AN7(zuuG=N?76`Fs z`-P>E*?(6O)Efpe(>LrcwW;rlS1-E>r2^{sO1b$Y`OsvK1a(m(lIfbPyP3QcC7>|5~i3YjcXGhJ3a{Sf0~6 zZcT+HRl_si>09U)E*0lO3mJq3{)%J}wj9C$a*jnE%827Kt%x-FD1a=-2R-M6kBF4g^oiRfL#;J}$xZosxK}_xA0e zkrd0UMf~EVs9aNhm z*2R1TNre6Ccz8e5mIK-T#0ZovwEt%Dmh9oz?y0L`bbR`D6uWqC1-ZdyyD&^=D$3X5 z$-G$)L>PSe#q$?9R`qflQGU^B+Febi6gy6#RMWWxpCB+4LVoUQu`hpxO zA@$01r)n{#q@8(Tw-`qCdWNe`IUPStre|~gP#orWARA)P zdL`H$XI-!n*vOHthnk1Gv)SlFuRPkUA4PqqW(NFJ&dbM^fwG3&+ z`%-dgUTu(JBOYXy)2XN*Q~&GnNRpIa^sY4O9pG*W7E!jXI-C^OF&4mwBuipXgl*{~ zWp%*zEW>~?T+kH?wp#@y3}9TTTOG7q7>@IkQUVihO=mmAWrLV`DuE{Y_IQ8$pT-|z zbH6f%Os|y#sKP&)-@}H|+elK#!c21dm51P0!?lQsHuwSp#P!BJqyg|s zP>Df=93$~Tkv?ce0n(_+d5NmlKQmRE{!UguNZ9p2Iv)5p&VGe{V?i! z){>4#HKFz!v{O4eDm}w`Y7;!;_lILWsGp)V4qc^=cCPu2^fwV8glmJ|xsx$EKjU!1 zVsdhZV;=x%G5dg5#{8j93t*^$dwnGYO%Dr5aFZeo;s1jC2)N>BEGFGU?AVUpAbq{f z!G$H`$MYZ?A?9MI-1TG5h+vPvLdpujD%qA4F7T2I21;?3;mgE8CKdB3PUXF$Q75Nb zPP$xu8pDiaP!Z89^aaX^LS)4X;@GR=1vJqV^C{*N)?a;qSK3Fo8l4s}0rYiA6a(`l zhsHzK`q(kPw)MY`blWu9uRKdtu>N0~s1_BT9!eCIGDNzM@%#g>C4BeuYj8WH_Hg(9 zBRP0?@ML#SPTvi&9!B<_p_~_+AvZkpit-M(#oKHVa2mfIHg$ifH>Q#hE=@IATwu(m z)5R0Ct*eTLb(x+}D`DWu)M}$`x}uV0K=MVCQiwAqyp@Dthd&-6bKC9M%=Wdr_n+?X zA?V`I!-IYJWEp>{E5{v>8_5r{!zTN|>*^miy2D%E>{DyG`j5sD(U zwJ%ay5b^$nq8VlFU#Ytw%B(cadO7rlu65rupJ*bgX7Y0^wuX`F2=o2YUC)hgz+ABQ zI)QrR&}5lkr0y{F07(z3mUV>X0I>wL0ZLI@;Vc`dS@NDnS9=j8%TJ(4hhf+k^=G!8 z6i^+n_y~moW>j<94((9>O6Cv7xsTPt=O~WWM`qK0Q8Lj3d}W0)(HOq8&J4%k>XnUB~dz1l#1H*}}Qfuo;s@uwMy<1|V;c z%B^=a9owZ)@8QMh4Hzm9;|(}8R3_bY&Y0Mt7Qd`j5$lGmV^XON{qXLb!r>l~kj~vd zr=V>L_#W7)V%v!XJnS9|7SE+k!a9wQx}e}|Oq~aYst`FlnZKR9Zg1D9#+j}ZD=q6C z$Vef!$R1dABhR#Y#LU?Ny=8*5bjxsme<;?ahVh#aX9Oa}a|%;K?V(y>*{%o-eaECv z+Z)W;72_wTsy7rxP7dFNGc3;11{VIHCE;Kjo^LsG0_>}>kgr5+Vww)3Z0*8faP$$U zC)3$Gxz3SVA|jQ5X6r5yYL(@duW@`D5=E_}Z%*1(O$?_Zpd^N>xeBmtoSap=`>U;a zU=0z1Tf87F7c#+O3TJR?utCQ143Vzh#G<)egqaLa@hM<7Fdp?riguCp3M0AI(K0%o zn@gc~0!p0(&iBoR1posK8)g$6_8#Z-pj*PkgeYQA;QTFiX83|cZI=*1{M!UW8lCU>!?~Ot0Jv0LBof@Cx*%Lhxt7UbIG( zE*qni4Jp3mwD~Mf=D4l0ru0P;vvfqRiwJD&=*3TO6S^6aG1N@e?{Rv(zl1a0Zbsw& zv%RiM7#&wiw}j2>3oPA5Ih+DG)`IP7SkC9!XgsWYl&dgzY|(*gl-$;{>M*dTgpayN=O*=-CPf*)P~+pViV zNp=oqZH4Mc?-auuN#?4X2_{v`GZ_VEf`2XlDfvr|_cm83i9{kM8Q?BE>;J~Bb=9Ks zPRUuxOO|;Ef@ZTC4Q<+%`7?;qm3)s6N5|l&cbL$?y~&L8olUz2_2D3EZ}Zl%lv1DK2xc@uY!ws0$Yf;79#+sM z0L270DbXO4iZlk5aAqPq=ZM~Xabt5Sru(~*f!I5|cCytZ8yV5}+4CgpYJ07-T!v=N~m5YbA<%0QoWR9Z$X=_dZO|;JN)kNkfk$ zHk+NEdf0oOPjGx6XnH+)gBxLwdcI_uV7)X*1&v}x>~Zko+ounP2YcV_KiuEmAkJGHY>>s{8TZ3=J6vs$u(Jay4*yCU zuw_92Rtx_sRSJteE#0(=t7c}bQZ}C%(H!%#l;{sfv+vJNQ$OM!gLprM>1fR(6n>Pr-fnhAO6&$S0z$qEt!W&!)I-9(L4<~=E(PNy~ zP!i{(IjbfeL}Eq~B&nA;Oeb8l2*fP=$E2xJ!RprDM<~*dmfrxcAWpW>KYqFAHcDr0 zlhRqGK7yzC$_>dY@|0fVK?@>R?#nM(_;xO88-69R+!ydcX{aA!^Vyqfcs$Vc zp!AGgOd^FFl@LXY1;oOb2r#vlUCl*Wm9r=mghqTU%t_JNfr?au&gNt*K7|5GBdqAu zVl{Q9IANarolZ}&cBc0`%I3`mHg(6U=QI^HN(wOw|_IV4wvb`*(fy^lwWfu0_vqvx6w zmbn$Q`%@8atVbdLLyVFj4Kp65hMAgcd;6y80l-8;g zhj7kQt~iD3_Vi%}&0)VN<^!fOrjR)xFF9g%?s!|VHoL5-5YULb{~j=wG*KqjhqFz+ z@+0*7Y=opYfG$^D&R7+hi$H>1m+0mni`9j8xrq|)uvg32z)1*JuvlpxW2!VyEB4Cj zjpwqr2%`*K8~Ra^TDbTzT|FX5J|^KEC1ctmD#u?OsQIdVxD6EsOD4df=!8&Ji37AY z@Mg_XBub$wG0w(}zAl>OB*QTs-Q5is)v&0{38tKwXv}uz#v-?cctam zq1rd5#!b6aAaEODmr=gqV=BJtFaR+wmmWcVM7r^+TwxOr_?u`D|4Kp_U*JWH4^%40Lxhzr2OU9?f?lUU|#44l_f2XRo}1&75<$g5?YT>e8@*Sjii+K2BA=EJdl?^yfe&dr(aB7fs%Dx-O2$ zjh#E#UB5eib@t}I+yo^CG~WI=L#p7gDZN>emYm8Remoz%&^0p8#t2pPUTn#?WEF%= zq|BYDwjX9Gs)oJ{4~JTMn}0*0ZS)IoGRO@w0Bf%>-FUxzzEKDsA*<~J*!=0miL|VY zx&}2o9lwVChJ{O$EYh`UnEc0Qi_^13>QO0imU56tpJFy4l$KLUr$0|kQSCBl-8G_uZ`WedFdvC{w-ye)|kaV)BHxv8; zXUI`_PcMH>+(CQ`BR0({F9q#V1HA8)%E~fZN!!jw@{TQMFYbA}l+1?rq%zf7@`y!~ zG9BNsE&r|%Cm%z*ULw5U04f^b{E}y3aKM8JUygv}+c1gDNEEXv8`i@zwr}<1r(**r zS-Fy-Z-5%RTM zZ3PMLcCD`~A_$$Z%!`#!me;tF*HtRPfJjB1irzl`3&co&d*=?9egi=Sw-$jni~(P_ z`DygyV3SNm>FHG?a$9O!f%XO*we0|eSxXzq;MkOidV3WFyF+ zk!t~Xg4%01AkAtKuUG8et#daVuwHFDpge-T4%Eqfuz7>Lq7p>}b5xaYdBnKkedze! zXZ$KOJh{x;uT3jh0oHPUoWmy@`ak~wL(NolAPg?c&`E;5vH;=&SJQcbM>=_%kH|1En`^2bmY!cnZ%vo`x@sRud^e*4TwD*7jC4cP0IM!IjgF}Mg{Ej;#q!>q z${#1XC56@ED+^;!m5JSB+X*5SNr9;0{O?@(Y>b$B4JpHVr5uSw(4_F%N~pcQ9jQmE z3j};8&ZUIR=@RliQW?Q&OPqKuyLm9$=zA-cblc6H9tlZG&)^hZT2Pw%m~ouH{*F$l zCnFgAIM%||!6|;ze5X#9hv$8md;OOUGoy{MVqk~n!;HI3Y}#5AYa^Lt^@YLcfMt^Q z+ENYyBt|RBIoy}gHJp!lg+{`vqLgS&%y1b==(D9)#Hd=uhi}hLzIPhtQU{CDTRBp- z5!v3-S=$igigQq~gH&i6sbf%H;))MuD8c&2H!uVic~ioUZGe458`C*dSAv*K($t#N z;MqswWTG9}eU5JgRwWh^kiqJ)))9J<@>Sp==(>RyGHKH*0#Wb{k$$ONbc>v$CXrYf z_{(e9iOL})U=n(QgqEJwMz$bMlVmawB><)Mh5B^&tiZEZ-INScUDbMD zNr%T#u+qXx9Sp8mUUO23A}-d@gdoR2nOQfK`W#*8#3n9Vg{Kb3lmJ|H$URCF_sxRJ z^9cBoPKwSU<@vhep6U|IFc{vPP#-lVd?K5NEI|Q%fvNEEVQvun^nUStU7h-}RgJBn zz=oQ`sB@H+0j8!}pns^1@oV^{lNYneo40tgL+D>0;>l^u5v6nB-3XXrX zW!kqn1iWZH(2@b)sIu^!NH~DzF#!1Hzr71Jep31kK6>iFfekqJ;TB3XMM_Ew9k+2k zX}|QscM!gk!*KVgX1qtc$H=Ba8A|~|9alb%9}^RwwsGnT@FFI@%ZU0};Qg0>IX}Q( zO%^{+=HuO81?~%j{do4vWBczHhWbC@OZ&x%$c?*`AAWgw zakiqW;g^ezeJr~E16kG13A4$s&UG}k2F$9U3&isKZZy-iE|i35w$2hRCQXfmh$b9S zWDK#acR!Y$3u;>QCkmuP&E%Rav?pt(TAQkTOWUhkcjc`Pa8WT7InOP8d~0joLm0H)zrG)#)JzmrZd=B*vqx;O>Zi&2EK*gR@aR8%be@;ON*~@ z+7DZSzx;IHIrnTE$oszzncg`+nchD+Cz_qA+U#MNpMl8SE{7@hW{9*ix<|9_Lcn~Q z9r9Mh77hSGN z&4>f|mH6+<`S}k(|DsCe%Ksm<3U)TJUDHA+D=^}(;wWhI6f7s~Cx~tN73{lD&d-WZ zM<;KV_^8#TS8>&yN2ko#-%@o_D2L_Rq|`q@hlPaW_2*qQ9q>w-e|ie?HT^H`lq5ON-!=Xo=ujO9C58Xyl}?Z9kbLe`cuN z8yzEMg}p?eS|5A)a!f!-!y}|yd$O@<2i{8c+=_=RVPU%rg!Ht6>~O}oGR%j=wBmSh zP6UU2y~Ytk8gx5bC&5ocMp`QI;xXVXpCLHR0ML^b z+PPDSp=#fEbh1qx2&PaaO5IR~P!peibu9;PLwDgKj4CMJ0K9tQg6QA5qetHjTlCo} zq72zGDZ8^bXN(+yxOVzM!N$IyGGdt?rruD?ym7ihAMRgSYM)SmWavZ_viZ*WTXXtJ z$8=G@qV!Y(XpS^@XEt_LR@ta0Q+H|;%481|n~h%|ODWcJVnUMWDaw2F*(HLQ4ADv1}OLlISpV2tAm9w}re%de_x%V-IG5Ljg97$Yxqu$@=1KCCaZuxi z#|E-$WT>G{Z4<(_7{xmqQh#{9W|eJ@U7o*m!~&{4ry~zcfgFfuo+`Y;b5I~@T&}i=RGG6T(^are7oD}-E)ilctH@iEY7nZH3BFlaOVV;O1TBdCURr*noV1pRt?69iF269*|aD>{%)sX=L zKSMz6WItWd>57$wpl#jG^MBGGNi?~x3LVm(D$aZpx2Pv(d^nT(Dm zhjEy>U%e=G+ zpoWzP#|kt#*Wnj4AukXih{|!V@i`Me3HHG<5m}yS%o!>ARruze9+27%xJ`@e)xM+S z`d6R{la!@5^=VB;Kq1$7EfY=3u^Tt}Gty?kf{ofccUT_Ki@evkdBn(i;{f_vaxQRi^&+4!>61SfqxaCHu^bK zXzv)gguyD1HAokT$aXMN1dWMXH}UOo1VPlBV8>_Pdp9~gMImH?9i70+2N_a$A^&MF zcvpUWJ2`yosdJA=sqc`Mtmm1PB`9BdaRLgw8+lZvdL1K;+|@!VFrM4+gR?w0c?a8E z?^sLf@n$Y#7~qbVpL;g3bQJusbPzZIgK{o*MR`_uc{0B{emy!nUVO)6 zWV=6%ChD0`UERQv;ClJV%%;qd@XNHT0SIb`iL4{CYqcix$8sg&=vbHa90$Cu3tT%I zF(SaeLX_C|-kfNeLbxiOkeDg(gX3Zq&h86#gsGhDg5a5r|9XZCY*NPFOcL42psF&* z4fjNK5bTj_!a(hysaBNlGHIBSX~1Z-&?1V&M3b{qICv)_!j->UX!xj;-UL8=(0;DV zYNwc9sm9gzK_K8-PxR_xE06{0qDJ`ul9cbLt97hW%7D)^I6sjatntE zPo_VfJaL19^C-DcS|=#XmrqV4@`lTY>m1SKm2P6S&o`Veh_qE`eWU-a!dYU>^WB~Qdim+L{(U~$`Jb2D z%vR4YczAL2(mvrW24>Y>ytp}h@!}TC`A?2o`c@urw{tKJ65m*$I_?FS?TXroumSw$ zv`y|(S>~yY2QuZ1u^~VqR-hv7(LmjTV-`>)(4dqkqu>?N1v?kf>LXABvAdlT%HrJQ zH513nB{;V(&~NZht>ec!SAT(0b)_iNq1&((w`WqAk|K(on#(UK+;ClWfohYI5SD5& zmAoJU>=|at+UDQ;6O{Rb+)E=WO?{K;`_y_!3>DTF_;CDP4m!j-AiT7aS`a#x(|QwlYG_Ij$w@p```xAu=J_^R(r0iLt54%DMhHQ7rX-56W$h9#|!zp_&VTHnBJMvJqV;a7li8LmUd?v`3`Pm7JMD4Clr15P1G z1J%>XJ1D{)R|4p%b+Cs$7+ew}q}c5FvE`)?4Pi0FQYNT%$8FFb!fp2hE;katzLyPj z5&DI0N=s%SyZ72_C;N?hkxF)7kC#G=aodrcf=>OQQY^!J1hBdRMOpYjwUk|#bIVjt zV_Mlf8q(R8*}sgrBv1}%g0Z|apI*w!<|N&-tWJ?Ygm(hxCK?=!t)C#aHM@UVRo{eHN@PT3FVPNQ!ct=FaclxwoU}AuM8PT!aFh98`fjWu;2D zAXdE_UTVBjrO(nz9(b}Yp~!-5X*kdzph z(isr9HdAQ^yG~3E_h50X%2ZeZz*MgDN=Sdw!wx6YXVL^oii&pE2%&&B{6H2gh!ASi zCCnv8x`qM@43?x+87b`%8BT2Ft>409n8?Uz3V;f@^ROGO3xFTZ5?xRzI1I&r@ztD2 z2x%?Bs&SJJW%uI_`9N#mvs9$)32=IZK%NRrj2w)`3K=+g8L^TeejGLcp`tu5)?Cb> zU9AJFkz4Z_i~y;l8DE=}O+eT)?Fo$Hmg-^7xa{`ciA$f__NuP_ikc*IiF<18Gu`A$ zdX0+<>C=a6(-xWy^C-mBlxP-;+srq=AG6EpTn}yC(9O15_8*3Elgkxb{e=oL_G5*A zTZ@4>)Faool>%pybt?W8a&n-Rj$*cB6k62PniAF{a8?VWa($=prbe!84Uy3kGeWWg z$q{!#y0rAyDi+jJ$UtMtz_z?n&+wf@ft{A40pfnJ;bJ)Cc=#3=%4*Xc+ln$uA6}k| zF3p7&Feo>#hbKV_$2qt`{hsxZ4n0m-*Gy4%32r(@ik936L@F!{8^bUnz%PNib6~-- z?mc;JRnHa6%@CQXtc;@4Ky_j5hWWXUS(azA3X54mGEz#48>*`1JI*n=!QL$|R#5Yz zK9*?gB}zKbPMhj2BKo0^Aa;$4i-`NErO%IdD#T1bC(2lqCKXU{VXmN!!{W$Pt*e7V ziK1KK1y$Nr4H@*YH7Tpz)itu!x|mMR8(C8;hssU8>^hjJckGHZ3F;Dfr+1-$Xu=-! z;y3J4=o-e@attdfDMh7c(pMiF@Nb6R@!U10T@^4gp&|4o{xO+;xR1O!}?iO|90 zrY|~Kd{tW@5#6pwY8nlS)lr|wgsgJlc4{xp#Y?IND&ull1Z<2vQ6ZO_@u3$J8Q!T; zNc6LX-o(2^VL5-E*!ptZCzRH1RRCDT^vzVNoHZmzjKK2WZr8bK#O9! z3~?3L0&>DY$Qe8^3^?)xk%*)PmV^E%vb_UTU@zUUC>W_S4l_mElb>oN$uytxVWqlV zbSP*KrtoUot`Vn5@H?vpbjX?*PS7nbOzut3X6fzmD~uV8&YI8OPG*cUOq*f0qJZCY z@P)dfuwWZV-w)%(8_^cghH#c2(z$(m_tBq+d%F)F=ylGu_C+mtqxUR9XWByqEF4n` zR3E2Z5aPKxDQRsmwK}?SV2&e;?_NF!z7kWvMBKnA+c9rGL6Z=70VZOsz4LZ|h~h{Z zR3Zd~y^$@6ElKEoR41XwOvi|Ym>LiN{p*NnOlNYO1jbU zkE0KP;b9{%aM%g?JpLjV@bH^14|I3u>JD;2+3%`IGVDZeEIqNbYfXBzruS7LAMkDd zsy{8s>%GeP2k%;@hATfGcs_2;`K#_tjjc%vcJf8nRsyGVDNFdNx%uh%5Z96;PC6PX z8~q{gcNTiX6+x~OU5vB+0aDbV7-T*jSys}YnvcgSrJ5gsPWe@en*J&4A=Y)yg1h^fFwskm@Z0&j&jxYNX*}K5Vbrz&qeT z16C*@)fi10w>_&kEauLZOvNSMekp4;2%H3@bg9;PV8DP zA4~7cFLlQuA5^n3z2<0@CdG5MO4oYzdf54DP*xboI(-Ab6;eb~z7L+wC6~I2q&1)( z_&UCaSeL)`VvLAbxN_mpFdjtpd9>`;masH~qPWTT+6$;x)pN-{n6D!vBLzWGta-LS z@BOq5iRzj%WG54&v((iIzhT*IF%*Vz?IB~f&}lAI>5!IQHFzk#J`%~$@*{Mw#(95GrO ztQ{^ z02Ft1*re6UC!ScS1|GPRTrr}#a^obZ6QtM&H;LI5MPPeX9nv@V(WxD&p$^+i_dXs` zGcxuha8*`+RU5o1tyc;_$fFjZ2v(|93tMo}?e>@>HUMS|g|@xGj-}lb*{N7+!xl5! zZZ^_awBkN{v?0rMHxSPh;L)s%_Mf&d<82tTjuw#>du9Vf#m&WHt2I&0N&~f4u>$cn z&$nX9XB3r^p~Pmo|In=y1Sgt)iOrg;u?#?Q5I2ZzDckB}vxPx~<+wT8*;3u=A6dT|T!KDbg*kTBbHN zArj-BlVePiID?bWo0_~5t3LXgu`|p^rekI#ED?h+1Pg%#DmhCdUI`bt&0b& zKQ*A2J6kKwD`mt zXMdc|zMt#ymbonaak|AkS#lmXEOnawwk+%jX<)h9CW|ia8j18;h%_*By7D)UP_)pX ztMf%=7b`HK3gv*-M}V4l<1&zGDch$EsR-(1G10JT2Vz3<%w(|+T1P+S`w?N9D&4e- z0x0^u^T*?PIEsHPIud&jtex(QrmW>b!` zzyx|hMsHSh3PwJ&YHG_~z>I_4)8!N1e9f^9wm*Myvf1MOGi}{KO6~qoqQv7zaK+sz zH)jgqQxsKg@7;LYG&9dUgPt*SacvmqeL)-v@Nl_nbGDmt2 zH2a#(N*@!Tm1HLR>|37&iqcU_M2E#JLYn!kmlyDtvPRpVp0_gB^j@2Q+M)U*h_idAF6JaQHIyboW6~-8Q!Bf5z6@P1>^h2CrmLg zM8?J+#XY?@pKUXUfz+euzC%TS?m(=xNdG zrMw4#ue(?2uw^zmY_(cMc7<}iUf+;NJ0?Yz41egB*R1FZR&&A zW4mROJU`ODbH1={$>rGNDu1YuvtuTd?!y zo2}%NzG^!*;Iesg0^V(Z-oLg}ByUK##)QQRB4N#PF(u82`jc1*=FTE##5D<96}yn0x$~}pE{$swl~Y;K$dwK_ zP&dJVnF~zJMEtg73Wb8up~J|);=A`pD=iP7e$l(dF^i0tAa|+6w1>XItxY26$IVq3 z5-`JRF=)!Tka7~+C<~Ib)eft{fQ>tCTa)vfAeF|TJ{Uz&u8~Ufun<~JG;I2~n`V5+ z=uGBn_bEnd9jNAP<+IXHbpPGybXJKGTjD(njFow5=%Y!PF8hXk<#xX7aCx&$94!+0}Y4w!oIhc zTH9=8GngBzMls(%IXpf?%umC~-IKToxgjv>lgDzUX1F-)=inASPXxj-*Pp~|m^lJY z(lh-JHD5bQnL(I&B&~9YkVxEwIa@XKT8IKkm0NfzRsnL+S)_=F#TpB%I&~iHa|FW5 zgICk(@iy)#zzdqS8mM7+NMt3lQC>ciS9!d_rODE$0JY60w7{J#e=B9YDl}EI5G`Lv z4&dRhcc+u%@r;X}@L&wFbH_r$5sS#rp#^84T|bB1*^apnFEYBCzQLs$3tX+C$1?Od z)r08>H=bg_MboInLRc+azur@9_H5!2mV~26a7|j3T5m5-rzTFY4-}ZW2Ss*lA+8Lre+rmbAuOLKlri1|WHUv$_{>A<`tQydMg*XfQ=8&VQ%(JrNx z^>B1Jn>JMo)CLBDSiJ9cpYA^W`e68I_u)QG1$2ZhoH^3}bZ*c!1M%rTODwP?(zV_A z3J${=iY(g|nV6;K_KJ2-$O&%tA>KAW zo^SfyJ;=&!VT|Dtpao(ZeP)syMsPdk4|c;yxQPPRqNUhmbYl~KAn61^*FI7Ccx|z- zoZ-wOagkKn@lqxzw$nhi-W=`#O3^zHR_)JqZYdRgT}E!0oN{|j=4FT*M&%TNxXN=^ z4zUO^A|@|-!v+S(y1vkiSP-u`GE}2zc1KsSGEFK7ow6@MAP9rE@>C_q)^G^-C5v7| z_HFW5x%K9?-AdQHfWp!@Yc(-dZQf-uECcK+7l zXlf_~4HjK+7~u;O)RMj7-56WKUms6jA%miAGMAbeEk;prL7dxCUXffqMNNv&<|GbX zH}Qzr3}2Ntn;h);6P7}g1)5}S0Jm_&xbGNNtPRkk*&D%Vd10s7fL>E=jUv-mNVGMY zVRH_jWV^+tuxb=`>YKP3qHt%;+2QX&A47%I#caQ0paQxFD{6udUTO{#6-t@6jD=W- zhojl|XQ%K(q6VGhI@gUP9|8UfYJTb=e9pw!^lYC<@ZyXNB)U;*9=y=| z-$iQbZ=`-vuv8Zrh#P$cOkWz18+}`kD4olP{e7HZ-pj;G-MH^(a~hY1kD#$a9u=8;b#n4G^(9w9MF4&58fR?>%+FGVYQC0RQ-N)l9Ui)MG!6)H6|^$oj%iu#hUglxri zQEt#Evhwx5OS-g0%=K`N5!wrW6Ih{ZjX7aFA#|i}GZ|NEk;X#K z2wCde>|ij$nI3zy+}pTkr<>Y=NcmDU9{ruIAg86tr6?=Ys)KiQu~QWZ8M#-OD6Kq*>P+sWnWDb7JvJq5&IQW7?M3g; zpHc8jELca2cgL^J-rPTVJzdhRDhbS-B&qLcP{{J$bc%iRtjSIWia1}9gMw$l36c}8 zW($Q4uad$HQgsy^;N^*YM_#mXEB=q8X#`H}GFUYrIHG}eG;UOF*w3ZwPy3|#Xm+OA zS879wd2jGe!0-c*C0fONN09DI>f2I zPvqLbPkQ`gSZ!kE+Gg*Q>zTdYSDTU-jTx&8dTOWlRl&H(^JBxNm z=v1Es?GuKp^qgOIq<#5%P3$eQb*uU;_}5l(zFg8CAiO+2gv8?v&35Igyl(lX_w`vz z=MpQJ;M{?ujm3%gG>`$@e=xaXyAok<8=fLjiF5)jv3)ca1AGzcaK<)x=l4&S+>)wltg1}hLul+3sc25>?ibaK%3vXK5 z!jdUfvs>qV$R~AzNFq6Y$po?(6VgCa*f$F2`=k-enL^D;N8qoHJd%?ScT+eAjuam> zQz1SJwv5Fwg%MNA<>AUzpRniQ>$@Q9z1T!BAiGa-)(xn*N)Wu5x{PsG{1In;ghaTQ zBqYFa-%MR;C2pHA;$*NxH4ib-$xFf9SF*4cZ-+|liQxd^CZWrc#^BN%FXlLU4j6f= zMrc!lD>EU~q&k@f%l{YV!oYh@ePZ?swvs&+fsd@EUcP*@i0^^8P1|GWo3_@v%d z7-s`N{c93t2FxYWxrbu}?u+bS?IRbBu?S?ESR=v2!5ma(ICx`S%R<_xRSE?i#vgd} zhRuJ9+pZP@m#5o~B?g1Zk>lOn$_A7=i>2;r(C2**yrwvb5+xKEHNkO&wje|_5wN|nwy)zAw zBOtXE&G!(d4F^MFzm=t>A=`ZkYudt1`}%0=O%)4O3zLCLDdv9rT=sG9qixt7#fsZ^ z8bC%ebNacufL~?V9_FvbJT=qpB9^aDU~b^XK!cRB%d$|mPsH~?nW|m__1-0Liy09^ zZ-PI;rpe{030s{qZl>rjQ&kPI)>1JMNuOQ&@)%)nDU2T)&?C9|Re#Mc58{E0{b9v{iN zN+nKu&QT!d$Kh8z^h^e(j!M>3Mdi3wxe-?0%WDal5~3?M66r)e``%x^ou%qefibd+ zw!BuM-OgV=+O%zHnsR1xf@3h;u@QW*czyWK;I<^b51G($I6tKqOInu!C(fgz(PG3X z3k-Ul_P^pHB}?Fz)y@b)y&D^^u%!N;usif(UCE(TbRK=WHFK(DrEH-n21L_48w#l;-CN=_`=hSGx+Gu48iH)i_ZlvYsl2&m*up{O z#o6p6hBRpPJW+Cnip1&23yLRm!40ki__E>?-UDmm69_58UBENxGlUy4(-Pqe)nuQP^7XWHjus(FV+hk z&M$V#0jH*h$V|Lj!J{QgJYdWbY?qc`SVHlRf;RV8*l&scrw7wFlf(V@hvU=5WO_2_ z%eptjBF`CksJRjmdI&iwX&K?wfMTK>Nkn2x6lfzV3 zZRgJTghq$eTPdn66*n!b-q2AC*ek+@72JBjbB7ZP|;> zI}y8qAO1!!JZG)=M%nloUqnBu;vun>MD@r0%rRM0E_r{cu zD+;4B!|5(7E(AV>c?3nD4jaxn4<;mZGy;y#`05-|i=IArFp#Qe0 zagEhJf5^CmK)92@ok`%bR<3nC+9U!r632x|%xu^$8guk(B!Cf_yd-5^gvzuL(&0JD zOhlGSG{=ptk2cFmYi^9^cCn8#t}=c5E%>)qJqn=i-A1rlC%K01RoyX$(??{4DBCz4 z%CH&Ne?Vs#?uM%*BVD2t6IDppV^i(*#nHyLVUQqEW+mv`C`(+IBA56psJUO>W?xI> z2-LEEHXB{mRI^pGIW*vx= z9*j-KKL1R{l9_B_J2ehT1wEeUk6`xDFpVM-MDg8d#`jp~M%fuGj^K6M61N*T6?UaI z)bO(vmP86bPG)YXdE*-BmE^blcuttr37>TrLJ_=)&FEtjTFUQQ?PF|4RHry20pGx4 zirZPo2>D|2GlXyP=D&AmI2{eg+o%WRyyy*nz(4wfK z5z2q1NJ!V&O4TPnOlH#)=7+)Qy^|k2jAN_Wq33H%OgQ?Js0`nDRC7&f zT)C;zZSjhnZ>(3FJ^NHf1v;}VLE7%wVybu$Nu@9)#Htcjxh=PrWc^NWj56htek7=* zql-+p=vbbMNGiRc^m6r~UE5MUSYys$jhsln7gwaFz(jV-$Fk+1SdV>itNP1{;E@}C$|DW$YNr6%G*L3 z%(oVEWf5D})+($K?2_h?+eo$8P8%2a48*D%j-7Iy2uB#3i+42{n6N}&!;@DCJosoz_6Gl;F>}F58Quv|=KDH}%r8~@v z7p4;2l41iF(o`5~9oX(-vr}Zih;X}Z(4dqJr88I9!P2X-L_~Chr+QnjC&#egI@GBI zZJdc z)X5h@kGaf(`;mNKQc`tuyRX`UNN1~{2IkG*?r(YaoI zjPS*GlmA)1VwD)i-sAs|y>DG_^ElG{ud9GH)Bs9M$+DBo3~kFxQxJp*ahAAM=5D8q*rFJElq3!o}mJbk%`^3NOPdz-)SKizqDu+7iEfe_Ge$v6}; zMfNwhwzl{8QQ==v!C7{VPdQ{e*8Gb;8&|I|@p)tG%>Nc`b=P8LK(PMEjS@J%_=rd^ z`7ZA^CBG5TVEHZsf{2H|SQ5!lm>{9?EzVyAMs$zwjG=f($D5X%G6ti%JGdLEdjVbx zSuT0GR+`FV-Enrgrd8T8IR{Qj(rtMXn_?=?0llIRX1AFXWhEzCg6pkfs;!t zVBbZs_d8;DNyX|2iR~@By08($7VsKv^~#}Uy>iIJN=<@ea3$mNY7X5=U6k6Q-k{F< zf_ayjVMpOuk2Jp?))yc>L5Z>xJ#1ZsQz6DLH6w`BURN#h*6l_~yo5}onz*2%Rn8)3 zx5ktkV&m3k3>ic?k)w|Qlyr;lHO1&G-S{H`z}e^|96*Ss!x~~Ipl^E}(|J}kL5b|q z!b5BFAz>hOLEWt9;zlhQr;hmYxxiLqq!+X>$wu<9lcpM1T<4oq zn<9u&CB@+U?cn{a4^tV|=W$$0CJ1pd_6*j>!DQ=d%JgIA!@hGvV8cekV5xx$8mbT$ zOc`NS+0}TdZ33|ISAw!3qmt;QKQV|%ThY~5~hq;sGNW2Bae5a9^EmNH%Ch72M4uQLrSGMdT6sPVvB?|=G z>|>|xlO*P;@U(|yt-Si|P1!0+TETmA1fv6vf&CRGKw%^7Q4=<4Pv!V3eMp%!e`S+4 zT&;136LfOJ8oX@S$374Jt3~yD0eIdNlFo0{9}=ZHsh)qAdeLai?Xpf|NOVVrCMvABrn{Q(?#YdyDOh0 zGyD&RyAYBB(2X4NVJ$t{%^Y*|dWlOelEaI*HSoVhVV4_cAcEj)+#^?n87=IJ!C2@3 z=~eAr<33AtEdpXO*|P&b&gqpj)3A}mP$=n{R28ZoULE~3ltUgdCG_X3E{qif1ZwO7 zfFs>0PP04qK{0A zh2S7!UJl+@z~n+iF2UYE+hmEJ3i^Udlx0)Q%{c^ql}Iiw0bAG!p#)pXuy=$q8Ycp} zAQQHtSxPwVPs0JoEjb>XG?e_x$<3S~ALXbuv7KBW5|3#bZ&^WN8u}etaY&1Q=9(5~ z(>(h~1L;2XBhCcKIv&wJ8{iQz!58_0?4}YO{sw)|SFxvsE{>v|ty-EJ$qpDG(Q903m{^Z0R}({1J7pty zWMnV}1#%cr=mx_vt97N4VwK~WsE+4$tj&oCDsD&+&Rpq{jES>Cd5=fVX&F6;p@Se< zNC!fr98gp<{U{y9O{pM$srl*~gf^lzHU}#bXe}s!lqj|vF|sttXx|0#)v1PVOZsv0 z!mS?#OV5Y%v&r!mPS6Ni*vJbI35LitAovmx3c0tWw(`ey$@-mcZ|FoQ7oc+GQpVu6 zKxWdijJau)X48R&gK|(?Q~+@VzzO5IPh& z(KsD~vZz`6i;m)!82pt~5(}b6N8?S6Y6LdRNKV{;NW(!@nr0;?IC%2)%g0~_WgTb0 zeHA37$}obDSp||?u}!1)#ix^gbIy_V3@S(6tfK@3lFRONav}8sJbo}ZMJgXiggm;P z&?WJQp=K7<-dYI|IzV*Fg;AHvm!}f5(*(z`Qb4rSbDlwa(>`uK86#L_I!?-DLW#yu zd6@&hQj6<>ij|#32j=JaA@_(>Yxt39S0ce_qDbshV zy4f>d>iDqGRaUze7za)D;c*nA+w$8*7R$fGO$WcgzajsX{t!7@5`?YjvV&Bvb|fyq zn{?C+ZphRZbzt?LLz;&Qn>!fdm}B%RwO(03;LUJwkvO3APIOXmhLk~gwK!Eub}1t* z;!@IZP8~hz;860Vmj(L-DJj(Cl1TyfJIOEHBgPe<;qm_ai^IuzIx>RJn8P|w)}Na4 zwVY|FhIO#?vX{7UR1pCrN+*Gge#|DX!u+Fo*<&N)?GWG5S9=9JV&+x;RBk)=y0f#v z=fC|OeqN17e;gh6F6R9yFpl@t^nBRQ8tb+VsD+Gx!mJ0ApN3=HS^zoW^^1N&9@pN+e0>Sf=2UJ9b%LeU-$t1jp zTo_nVx~8o8(JnaJi5e}I5-}y_lfKJO>0=;TnHdtyx0e@ zD?}`NM%Z4UstSmdFjieTLViaPJ5_7%TMR_>bWXXatb?W;6wh!XDMPu7%u;A>OAe*#ji%hCp~8$njMGZB^kzA z%id3e>DF{hs|HfSqr^a8ZKGa>7D+X1CXQh+aIVszG=~f*@gy!VC@13#kg-eN4ONKqEJTP*f`k!kAwcf zA9lAlKqzY72&s=Y#tKHt{qKw!ooUR8$EDPFTxk=pBSc0^2Q z77N%X(|L!d-h74#xh=R0mbl$WXeDY`uRaIB+A2~-Kd9!QIY-wg?K)#0Q3&FmNOTUs zE<~#%35%4KA4wpFU0ay`oVnV-u%Bgj7BbfDfua4Ri~Oo96?C_rb0d zVDbs7t^k*YVKuFYp*$GWKVVAaMclW%dv7MmM0oVu7^k+VR>QwwDkMe`q>G=)k842$ zU`nqZlOp)ha1R}DiSNQ%9Ztjk)3xE?@)G%yo@3)QI333Kh&nx;7_PS>&&6cMf5}a- zS0#Ol&o(@|G#(D79nztLbRo)b3XO=C1Dc(YP(rDAq`;%BrHKA%Jb60~SS~o)$a!-# z(-=Vv$o|#oDZs{|A@?3l$*9^1K>^`9QZU%zhJc_}9?Z>zTzL5+!0DIip+p)kVpWK7 zsx*qu(9)!(FGD@_iL5O8mFv*tzjVM=;?mr1`fMx~FwchXaNz@#7txGl1$bxexN~(0 zM&rvT=Kdsn4 zzpW+mTl&2pFKd;+;cjoydBavp`l$nWH9JfC&;wjX+9-?0=DNY9>ZtaEa1!ap&Kjeq z!KIRrU%I3F8{KdR4N{hKa)dWJN+I$tsy*PiHUT9`Nz#{MF$)pnUQE)vOa;#iTJPNH zxS1=KAD-CGjCNCYNDJjrfIF!W@&1(m6`8dODLSW?fQVw3@=B z*`A)5M{h?1TJz^ts0V?GjlhUj0RKrKkl!=qBKf;YJ0M8fLvThG%C0eLKTPy0XJrlk zk!`Z?=3*F>ZNg}y=(Cy%n*9*3$&S2TA6#9aps#|)*4w6Gt*bKuCN!~wy9a?1y&;Yp zR|EQ|xd_N@a#>J}IN`VL;MPzoS(OBph06f?{gw2Mf240Zb9C3y>b=CniJU&!;98$=d+1qRhlWH@HnxupJEcV5LQ-NK#Au@Em zWo}C}Ku@+YR@1zYeg@%O)+wD@VL3)gs{YVB5Qa3ls`s`0{iIJ;en1If>~|JkG7DWU z7*^C;yc_00C{-AXly(|R&fSj4blGwOYnPK*FJ6DrbY~sB$rw{?zGx`||ny zFFT`oNYSXNx{k&EC#V%|yxPVJ3uDQydgUqD-49+wM)KMDtb_Y?vk~})jHR3N*@MoL z(Q)Vfy%N{x;dVDmE4-ZetbIAeHmVMtsfg zbb_&l)BcmI3uI)2`G`}dlhKqXwWTmVMisR-LM!_N0#N%A;aJAln~-I5tKaKhK#}$C zlfc#zf3Y1jK~jAS?!;q==7sgKrIf|=b?0Jqgy`fEjsfiw0zJJD&tHA@75tCLUwJ-U z2Wc(_^NmiJC_p+KBD{SzUq41ud5UGW(Rs_o*SWm70$u-z2LtBoGRj8h&pI3y(j9aP z11b_*CN8hliP?iE(8Y9~3F!#RgReVx|13t)UmrgFvweNlJ(_pl{1qK*?N{Bm#qW!& z{5zmR0g{snvpMHt0Qubz{6u`fq^T-1r;Q#{~fCM?e^2D$O_yZl!y(jg5P=9y}?+7e!05iWZ4;IQ)D8Tw_p9 zJ>eXiPjv0vn|=NDV>$i}7!V-oJh@!Vd{Qs3rsi3BQzzx{wc+t8G>RzMm9R`yn)Rr` z|LnlRc#;C;md>xg?jWm#km!{R^+wr-A5L&Z2g#a@Sc0=BSIB7y{|*jSf7N;Pnf%A4 zmUT?7V*9M+bG-I4egA{_$r>$$5gSc*@tk4NED}8#F_`doxB_^G;Sp{$fcg37s*^wq zz%3Ub(g|ndqYfc$RB8Zf*C$Bbn+VVEaSSL4eGvSgK-u9aFP6Z#;3 ziv{N9#bUrph=a|ccG54%-S<*1E*ID`ehiu>cmYxyWkni8PxD>ewb|$pM_s4*8KMQ$ z{&SqbuL|xp3s4gpRQMmIki-u6lKC_9v< z*a{{$6#{^8t?{9h;U!bd`Wb3cvA{=orx*{Sfp6oBwkbfCfxoA)g>!ZzaMUZ0!ubj5!mKc^zKq?958;YX|1MV7>#-o>nkI1A6|ni;BD&zXd4i99Uc-p>Qkm+nsJCfCUe` z2WIt05yGkO<^`1ZO#T{e0sEr|# ze)PKoFh>ZRoRpF@*Sx(GWDDD7`oyJ7hTInC5JMcF?>^f+*rxsva1sxi3n%yrRi&hr zYA{2#VtKXA3o$JaH$gf|2da%iSw5>&TJWjWWk7HM1tGaz$XQiSZZvv9jDc$siecI1 zOwzE1J1z4`wf^;}B*Bp>_7jDr0vaC!f}8>%rBX=%MkezXxLWXhN2s|HDkVtb9|M)o zH@Eg){*6#sy-!$N+D>Hz6rIVjU~PPi`$ZTMal4I7NsI1ICl7OlHS2mE=k4c1KBG13 z?7++&;5n|%(^I@miO{uAJNrYt7I!}S6CYT|{BSUbVAs8uFApFlyZjeh87&m1XQ@Ov zg<_Xj{4%%AefTKU?Cq16BR1b7j&e-b*Zy)cz&|6VeG$B7b1UC zl<912HLTEuhyXd2%Ob@Lc<1UWDiN4vD}RY&HDOxsP~*Prm-LR4&Za{W&_$;Ouq_@M z#j6uiB_K9I%&O5Mt*X8no(}WB@(3MR%TA^un^xfBd0abO`n779hlWJ}Ks+0~ zkWP9kIJel(OxZsq?!JJ&Br_zRY<>quccpp9% zf}_6a#$^dH1u|hD3l-nilj{s>HPg|aRl_G^mlWfNPGB4;EEJp@D zdf!QWV-gTiua;VJK{z9OCv7D_ndU*VQZ)!FAD)XyuY54J8x1Spo|=Zjr^c=_bzX^u zj+BxSGN4(_c0XVaUk$?c3I=I=g$Qwbod9{PlI)yvKvTGbQpoX%Uc6SouxWAJ)!Ec} z8{kM!nf;FTot04j zO=XC5QH1S9oj6BDK0t5>q_~lsfBCSSNa9OFJ)r>DiI}H@?vs!cmVy^;Gis1SYnPl# zffzT5Xd%ighS{SedqB?!t%(Z&2*<=f#3Tq7p|$A?T~Au z0(dQKgbCFW$#*r=eYTHC6`LfeX9v?0f)C6KPO2ZsGm|)jGbKfdLWTQ=xKt+v7yyZ%3ohd*QAkylWLK)Q>c^pGwPLCMg`-^ zLp~Z+chhZR6sQ?p4W#!gQPwLvNmJVTH=}Ng1zmVHOKGb1b7mM9zT4GRSH-GbDsI}^ zI3^3OR8E%}SA49^-Gb~3OeIL*4$hZlgP>(?{?)dQTo&hDS?M)9JHUO!+~v!XwoagD zM@W8(j7D&l=oB>L6&i%C%n@R8l7sfKxNpPP%fb8%=$8LVNs#V7aFs-!kY{u79h+g{ zcM;DB$*0SmHBcrsgMH2VEYxAGrnQz{s-_owI9uqgvOCn-RCE}cyuetMCOUMz$u8zm zX`)zZIT$Dx&*TahShjdq`rW)Z9LPyod~Bzx(PMB3B{+a|Pw4B~7L7G!x1iNXnRdA&QQm$ zT#~=MnH6PG8Oc{f5ofg}-lVOv=1a-PE+kRPq_T*&E6>my-(hU>qJRK?;A|Vc%_sYK z&~J?VUO=&*H!FjK#T@<0YQnqHPasvLz zhuAZ%(UV&qEt3$r=`hK^m63Ke!G>)f!FgnMHw)vHcO62{X{gh4{Asx$%`(1f32CA& zk0;;7tQ;`v1PI@^ZgUn_62wZ7LSP77p zWo@fbA_A>KI4oh`F?3RTG-+>rM&y@_gSZ_gQeyO3x}1XjpK@K<*3#SW3TiZJ$Ks}P zKrCqu-YSu#=uuWUcV^U5f#TVz#B5j2%RV3}(fVTpAR8LGO*kJKP>1te;y_?{V?!BL zl1nOKBiSJhbV4{6wlyR$XuTVbiFH=&Fk}bOxAW>~aUMX7&waOsWL4NQFa;ihFgi%7 z&0i*O(mR#s6juLWEO`Ic2GMp9(v zHR5>OU?%->!6#tqPpY(-_uR6ZYQnG%kb#${ebN=l7+L7qf8ST*vzX#fXl{js7tER3+kC>EPS@q;pN8yF(*Ype@2Dk2k|Q_IXF zYggs5W8fJA9D3`I0CXmdL7GGy`*Z@5Z8nhxYRO1i+{QBA9K)}h>Y`vi-nCq75FnO-isK*tpIZbs^o-LKn0qVM5fFRICGq1&U@X-XGh=cyc z5DA7ngkRT3WR6k*uPh9|rMfU53b5zM5ovck8LB^J_zvMnLF{4FAn}~uY6u3z`5m|7 zGxe()oQX&*HJ;K-^@BjCsSAUG3%bXoq@p5Mc$34vL}bwbaGPp`2WJQGEB(3-ir9qJ zU`ibwL0R>W5D~>94E%||M$7_gKgoxxWR-{d0tMu#i8`@Soa%}) zY>atZcQ!fydFT=>X%HAP^ii@b6=LYp##!7dGar6GW%}-EYcHW|5wikqE4l;~#Ih^f zs8Vmkb`UCj6EE0h8*Q68>)hv6j-WNF#sk9-d<@nI@E<)P$*8awAsw(Wf53 zN|>*-^z1o}yl>>K(NRfVe1iR!Dd2>5fvL}?legSo8&7{|zl*eGMOd}cOk@pR!M0tt z-^w^Zs>&kVbaxr$#>(W0nk#|0kZ~sD6Lj9vT6Sx#x-9=+-vhKD2lO!e-wnd($E-P! zoSv(41f@#l6sL03;Tp=c23RSaYKVt7{Bn&4TTuTih1OCZvfb$R5u-8|NfDGM7+amo z#?3x3%l&VWnk{gcF!E)SuajK)d3V&;+~$S#qGC=4D5qHpsJ#CI=HQH~^^ESz&fDz8 ze2}(Dw6#uV(;TvHdaX8Ky=^vJV~UFDZ@F>wty!H^N$GOsg^k*^RZXP6(X=01SgoA(^ z!_Z8Qc#-)1oHjvHG!btRLrm?z682OC$_@o`-unR-b+=(M+&Zfwm!RN-bP-$-Nk^g6 z@UiGE-Q@M|bP*niR12fQ@#si$AjyssSNxc10>%-}y`{J-76B75^kZ6iya+bK%e;5G z$4Iy{Ji?9mLx{cTR%?%PSc)xhm*>FW z#vf*8yUkH=%B7=`FE?y!p)NOTO^hvUS!~$msGlIbCzlAZWaB+RY&wodbdICc6(s{} zgVUS~{A!MD^=bI-@g(V$Kz(4(j`M~U!3jJ=evYH}$$%d?7cEezEA|>+exwW4$qE7=PcrT_*#WDmeZ&`M-gD` zKG23T2y!izeG9ILZosF`dhWK738vZ~kSow+6IfqA*xo-_Uw=LORqw&CzPZnTzu8z{ z-+KAt$*9{(pR+tHbd+m84mfCM!vk~00VmS+t1sm3 z>mUkZFTZ6kCKgbtl2iZJT&>!{Z;(`43lRK910fs-e|*fYuPaW0Xrgj=dkeIC@T-S> z`}}W+K|2MA^Y6pV!SZl$g|(cop6+}HW)W6NCSg^+e!c!$=E#5lvUWe4nGxsH&hFm! zcm4hCgZ|6CC)<0023Q~Q0Ci`KHy1|7o72-PW=9I!pClRr9H-}h7CbEtc-V(k*+A-zafVU_Ug5Bko?YP{%ty zv$APgKIlVu_J11T(1MvBTr>$=kTG~Tfv114ee!4DHI%ErDbxU+jLv8g^<0objF#6l zx+)eqHU>GtBRnRcip|myBQ>)v4p?z?G}kQ@c7(cFBEIo@fQ#E#pTEJyD?xz?$ci5Ex(E<#2Zz-ezY+VPkwZeT{y>>L?f*Qw}vq@oA? zA>nTad7#@}m<#Ej;`YNxT+UP?3RJ5K0@vjH-39#Z;m@s6$J=sdY(OgTEkcuKTM~c9 zeT;+W7SDO@qPqcBPnJW;t9SxWqWUz!Y}3WD#XOUU{2kBXjk7fc{YdYX*%j#A-WhkU zaPvG8UN=vnqQo;QD{+Ox`8l4S^zLp=E-tYFIu0RRGkv1(WFVzr`y={e?j3JvT4>2J zPhk|agjhU%djvaZWD&@8=y9;&(b=SP*X5rjXGDKr>KBt@o@?EH$_7N`@cLtUe0%gK z#<5|U$zD%wf!_T}7^3W}ExRr>S|%yB|9B;b-;NkiO0g2<1H?!VZ&|~Tp`D5)FLIQs zF?xXPc89AJeGA)Xi0zUnFYzllO28my9MZAu+u&g9XWK%t=WSz1Tfg^>nD$<$H0_1> zLzue_(>_p1O%ufB(JG4ekPDO9E8pQgqBUcN4F1LgHmN?5fPUpQ?i+y;GmxV(#?pol zF!AMso~=vMuXqh6_$~ za-%4EWm4HFZe>|Q`ixlYaEyuN{o+^Xkb=1hp{mr@K1IXuE6xX`cU3tFib-r>d+ z?>>Ckk>Wo~Dc@hD*x-dYvIg{9|HtjUeYnH=J5M@~zwZ1CpV^~cFl;8OIh>ZiVk9v{ z5n{xczK#l&W8fbu75higR_Vn;KCzqPMJw$~(qm*LfO2W)b!>%{=7z3>HM&$#;!lL= zn2rvw<{|hR1P9=OA&SFJY&NQ*Q)C(RZFyDoVDi&&41Ng5nAn8VZ5n=S8sG4f=o?Q! z6yN}cHs0v$AN*l=8=`F;FD7c?!S;U~cqtOlYM~_e?e8CK?uBom!H=7J`Ipc0R@*P0 zcz<8`7q&^tf8*sZHlJ^M<==+FAD(}^z30Wh^Wy!3y`2}|dGWt^@yp%qz0HG{q5i-6 zhut4uY#sctN!O`2`Zxb3X`^>v;$;DT&F2}AkXK5;e*|3Uf2F?3&V()Nr_jiFc|1wN zU-%uQ$g^KdZI&8ojdzriEO(k#bV>!OlTSc|Rk@FZ9j@r42-4p_@@Yws1pk#h z0ZIFeS6mW-kr8!4y8}$3(vGuS(CSBVL^OvJkiA_BYH8TA|AaH}3pkjaP4G&0Vie8Z zj-cOR2e3LtyX+d2NG@qM@YVxlH=1?52oledf+Y2W5K0<^vTBP`LM08$Pu2Fh6iZs? zAF6G202c^J+x$bdZ7Kf`uSBQP#Cg|Yme7=#KtQ6M+gFqH_&Z}lzL3*%K zxkn|-D>Hj+EyB{2#RbDlY+31UV*`6w7N-l{L{fd7Z;wym)Zh^_*D*x(Y75&WZ`!eK5eAelohMrb_o6n&QGxbX+(s5A+JrLty-L=ZGrO$ZEkN{=rGnKF*UUh znvdRF%N*)k4jrSviD!+sXGa4FD>*;%BtXeDxH&0&FfyXTrvh(nPLv3A(X5p+b@GX^ z1pfmFI~-gPXf^H>boKqoC-M4-D?+QnXGj|~6^8lhPV7sXBxiV|9Q+$S4sZ}AzL8|S zZG7OV4^E2&#dJZ+=lFrZ5SCBqs0FF9;TnvOh7eu?4}Cakpyd{KWP`Dsg4GTb`up$4 z^T9jZCCA-m;+(gVF-^$9)AxFEAs5Sy`#nZRZr(aJV0ms`O%a2QcW4vT(wGzcRotlR zY*vGpnCD!iTG;;f@R%kxo$4QTBH@Ke@lG$oJt)eDzMAyJ>5t&j&f10A*cl%Wk4DEs zi8S8k%W2`%J3zn6n668Ln?wi^IhhZ)VLHGGfx|z_lK3NR+L6amUTv-HxN;bi*`v8L zxk)}PFcziOXVQlHz2S3JF{J;ya48E~|9)1n?-CY~HmFSH zW!vTGqAMgsem6o^{h~GI2H9Pv`w#=8)5Y1PWC|FZLkNLuC1ZeO`M|*mc?9Pp5AK3Z zsI~*QBqBpFtWGrr*iQ;{GsvURWEI|Uo#uiO+8`Mf1L$0m2n1pNtWLHrYy~o_fvp3| zg95piSF^Kc69ixHAHi;**sD~KG4|&JzxRP!>NNH_kD)YBk;>}Zkr<*Q zWI1QarYnR;Oy#biCbW91 zhFGW>o=k2_Er6aMWKETF1^RH`?7r3PjXEu#Oc=LvIR($eWvxP)MdJ8#)hi6zuxR~j zqL_~-G$iW^c_F&Dv70+?#W*fX9GzcPpIldyDcZV;#bGO|X=x=Gggmx{4Ap8Yt!4C~ z;Sh4)h{19|;ADJGGir1?##46BaVi7Dm5~yulJFQ)J-0PD4rnm3;>qBr;jSdv@}jU9 zr65xp$<`M(W4{lyz~1fmDH2NZf|{ZUw9d6m^a93J0kUQ-7IYm%70K5D^aV^1(N{XL z6|ffc96-=UC5V)8w7F|Yq@O#g(b1Uslx0xMR05Z~2lq4yR(g9twJNQW=YX4?B=C1_ zE85aYO1Onx<~zl9sHn8=tX)iwuaH6@XKU<~fXo^6gQ_$S4Hnj4w4<>kWKGWJ`9eZe zA+ipgXh5yN`RiXQw9@qkz=o7FZh|84L*SRGTuc4hMkLTzx3%os`xHj3r?Qw!N`PF2e z{p(r0x8-8X#X%x4Rs#t0?h`WIN%M+c#ao6S^30@VeZRvQ=Mzh=yX0 zVCR)IFe_7h z$Loo<2$USftc^}E7{w!ns%^F$jEciAwcv-cV zk0yA~8H-r?^ggn$J(4-$CcuG|39R~63_flTdY^G7X_Z!et-LH&Ky1*uGYws4TMo4` zIi&bW7r-Schx1A+L6$UWg{`dP8=?SRq)M0u*NyL+bzc=No&+;pUcBILPbJPOGZhLX zAgwr3iop+qq6V66VS z0-7MiIp7-TOYnhTkbU@H6=3*-o#7v@82qD{#viNbDm5ESKqS5@bERZ)d8#So)LJ99 zRZu`AV;^{efDCn!H$0GG3@r84hX|e0%z)1U5h_39Jh>Bs!rLekP5yl`N8R~jN#4k; zH~_)_a&jUL`D3Yr?K^b_Fw?rU79L|~yl;I>dAaNqouY!xyXRmdUi@q6sLs7hw~ssz zyvwfdcHBXMyHT>)#o;?LFdqX#>~&d%=ko}jRvwm3CFdXm=Zha~d2&Se`u=OePlK zr8pQRk%Z1+c)b7q;&6h@B5sq=(3NIDrpyni6#V!-h#F3macRL`G7C`9C1PTgm5jBx zcqyAtVWCH1=j685vl^YU8Vhp39>)5)rW^7$)_SxC8qqp{i8ix% zR;dJQ3-tOdmxaOxbLI!g-WWfX-adFB!M2^ZP!}*{exgkd1&#CuJn-Q=%`A~Kpu1!! z#P7+!qZ9mvdUwG<_`5To-~q`ATrX^RmnCwV#VZ6;q(tou<{kp5fmyZ_hp2Kcf@OcR zkUpv)?_?ELtZ#M^S(m8@_-sfW%JG|TX?3x#zTHfAw4glXH;0ygg%uWVZDqAwf2c(r zgCynY7{I!@?WP**wxs=sTW_k3U8QnsSsopUk%W~BMcJ?+wyVCTrkT*_G?g-S6ONWb zp}{E8m&2QO-H^d$2ZQ6|(uSD(og_ejIhPwRT9YD>Th>r+Rk4T4OjuN!L0H2p*c&6Y zn-?;mSRD1sBpw=eTMYQ2+UHh6!K$7+i-8MKdmzM!DWTh<&8|VEaLdNcO-<^uX*m!z zIiJbnrfHL`F>Zdckhf@^$d=YcdS%xT77Zk%c40diZ&OhNX`2g;vC|D$34^LxDwTjW zF8ymC&(IxUV5J>37jcv$3-_9Yh>?OfLlavXG}cL+=K`!XWr*>cYO07La8Najan-HF zNTW6vE0-m%f##sJ_qn6ZYX`&B?C1tXbbCKzvv}{ zk^+;9;^+D?67yi_#& zheV4AO(?)C{Z`CYt-jQ7Sm>wN$6H~ClXtgeJ**}}d{L}I=bN|_Dy#B(yrpm0exhSn z51-5!q5lA@$xdlRfXFEg98vrvvOs)w)lLo|)_FQ`#4Gpx*`=gS4&JQIkVL3^JeUul z=)_x*9{8|-90buBSREjNa?yRH?n|oRyQZ$N@Ac?NWTT$E#YUHEUrxC0&Xiy7B2~C# zP5rPFE;)m$8hgftX zE%8XmCpWm{(*{s=mi~O1Wn6|SeH|=N=)-G*C6T~-JP|?HsHN*jC0W@P2E+a1>^}7J z*ElAVz!*`~nnrx#vim(x+OBvr2FnRa{NGQm^h)>H;AeF@&3LdqmQ)Y)Z$+D%&(045 zif6J6eF9JwH*`9MTY!;9YEf6_Ye7HPn4ss^6(^d`)=tr7zIYv-VcP3To!gnw^-M&I z6{@h*Lhtp5svBtgx(pm5$jT@I5h#3yf0ery7$#Nw;e#aMP|o#Mvr53p%Qifee~YCb zRUvlvw{`_$(Z;9rASK)RkLN?*_ZjA!hr+16HYhEOv;_-D|FAR`epNWfumlT6eMIzQ>x-LR=`3 z83Gb|#q9&V$vo5erMn1af@K$yEL~h7TV#@6Q`*ZKi+lOuz98lLJ;qc~R~{0^@%`!6^%joMP4xAf=$&)2<* zyBsXKNG2>)E5Bzj(=A!mEA4b^?$(OG^OHc96%!Ykcq z%_{{JKg|u?Y9v&y7_Z5>ReOrP1`QZYX&6%Gl)3fxNw;RMUjp1WIVqB)#JQGw|W_lPPIP zE?l@0nv0%!T#_VH6L!(P0x=C}j9o$lZ~6_gO}og{UVFUkj%U!S_EtTAFU|?&i3z;! z!F)r?nF>R_o92alpI~hgf`Rl^r2g!D#2hE-K%aI#3qu>mLrfUZrhQb~SvTHDAr`hO z$wE0K$!^62vUJ`l5U+my>%6x&OCw;r3qnO0S(bI5civg=JbEKX#?K@nU8t>8)`^(7 zS=x_~yLHxx)>s4U;(09IIe>!=VdVHb;XJXD761!CMT6A35hUe+DymhY=n^l9VG=$| z=WOr*M1MdhT^d{psIdqYcs;_*TRrJekm&7gX}a-oSE!h`P3 z5~|BW(M(F>N8w3|9)8IG>O6j;#a{$gv;hqwW(eCeUPD#g>3|A7B$>_(wTJ8B`Ne zTagpow}}c`h_pq@o_EuW`@IZgwDFH?&4B9bVZeE{lH+pM^C1xC=B4b8AaA z^r-KgR2OXPI!l&ozS>k)7f4#TVk2S7bvc?Lk9I93I9YAh9D|xy_)#9JNcq?Ear;>1 zNNBm`$sz7wE+Yx$&(sbxM-B>O8gXgBz<8w<^Pqv9w`KTdV1}6#Bd?Z6fL{ocWPlxaPDP2vR)B4hG@wxJ3F9wAOY3(3;s+Z3hcK_UcAP*D$@oK_H zD*!I!;M!lilpY1mZE|rFDEL3H7%Ko1W)bFSA%2Fg7Hsvr9j@OQZUp!K0y-#5V@pqJ z0T#qhe>j~^ru{QG!_V<@NeJG7SOT*H?H4oToWhQ=)BESOv>!j4+wT9ck0&OcY~%H$ zt<8h&C$c<3Ci|?72Dzd~;Y{Ks9{f4Ld6+x&x4bGWP8sNNP~CJl7%1cjN{d89$Xi#T zEe#BR$4@y_=B%->U@Ufir(*|cGceS!z)DKN6bG#fEQvE~BW>73JI(xGF1ccJVcH;F z=*V(Vyt|B@1d^s~Y=p|3c5}Jn-e%fQ51Vitp4?}&mNb{|#l)t=KVIQc>;428`#Syp zlbyYOzXM(VkWUXGxOe)H*;M(CBA%`toIkicyM%+mnVzrwuo5%Hvd(b2gGcF)hljs; z^yv6s{_Tsye>-{f`SEYR_}y=YpB){4adt zVuEBp-(Q?e#_tK&Ep3sTsi^|^u%qJ!oRVBm)1rzh!Q#8a~4Va>2hK)qxjFphP_n8^5oG^(>@ueeD1K9HSk*9;rq^4N1!7}@%ZWBa0KIf z7b1LoG#XC7B8$tH7LQq-51r|pA6rSjGrqic;{EC7^08N%ck5mw$E0Z%C4!Wl9h``v{; zIFi72uvGE^oVEGvhwc80moK)VYM-(eo?4vXf$77m(fP4v%9jF}ykIc;V$=tY52U-_rvqc-dA6J1uO3kUH@N=#wU}< z_sADmC1?`P6`4%oGEKjx8%WaQ37Cd}I$MB*Ue zus51_jz=?z2j+E+I|yc(%2N@8bD0qj*$3yRlPO@nxPL<^I{_d;Sp(Xib?r9co#4w9 zY0UY==CEVcu(d;O^OMo=7|_ZGXTcA_Bw)1uzrMizV2S|+mOKEqa=SG?EfDOc;k)4x zA1%w5H0&`h^iMm*8uZsQ#Y)qMG}j-$1%8L;<6ifx!_%*i-VerKo}7M-i&^vG;|`gW zWH27>eD&}#Jz%bCO{NNy`^Itx$^5G8O#Mc{Z|(~I3&^odL;RN)WU$s?r?`;HB$*;2 z5kFq*CZbHoNjjrxGLRF_(Gg>A7*zB9!SiPwnxwOpq=NSOON%fa^#($$72Ll+S+)q& zzf+O6CycyYsOi-HpOb2t;rw4-s$I#h%H>ri)yzJF@*l%wq3}zDlDD{tgcEIvzF?v? z`dvw!Ei}cD8N{tZ{7KUV3VBE&I=vc?$@VN07(zw8U<;cDTN8d&u>A9bJAZRCM3{2< zl2vMcj3o=3=Jj(uRY*43!Xnexh_D#X1`=DHepItQDcKV)8ctt78J(OY<=o5K&(@9G zmRkD0(ewSf6)$To)}e0u{9?{Enj~8|@piNVnGEw`JH`4iPpRMH7}s(%6+B@zVI3sj{rh zZj@(bxPpF?c|4Oo@Box^Nm~_hkhFaii#{7o4S0Y~-%9{CYz=&8qFZJ&)oYt$XNkBy z4kcaf#COMDzOk{l{ojAs+1q}C-SGh=hL5Fh!O?lVV7#`?IAc0|BZLuo-Yy)a^?grX zjO-gTY|dqCjzDwuLpBj2E&*gD`O}TIOX~C$Du88lgB7N!q+od<3LatSjycrTJIr=T zspp6#ro@mHzD8x9EJW@WKbW4p##-x-N3+dC_#d(H!;|+2kkO&^2sR80QXjoN?%`D6 zArh}>v7p9I>HF+4Ya7E5AuDiBIXZTNZ@)Vls^21oVN^k@(CMKNT;dskL2ICN8aal?tpyyh3V?+63 z>)Gc1{)Qzr0Ig5?v=#ah>pIaqB#;M4S4XbKEkG;# z=Cf+)bpQ7|2V39w?Q|pb>#7b?Gn+v^Ub4tM=}ow{WkA^C+lMpw=#2H#XT1w-8W8=b zJ1=(jzu$fmph@kSSK(OCMleuC24}FQQehhzP?frY7!8Q4knQ0`S)2j4f+l9zwP8}` z{!pNH_g;Rtw;dVKE?t7+k)xft;CpZ7M};Ob4nD#W z6adq-m0V(~qwe6076+@B!@<1Q{U=yqCkQEuEjkZ7k3RdX^Q+MC{+$QGD!|){_wJ#I zch7H0Z%C`>%@F#twBM>^Pg%%kR9Uc?j#v<893Z3}nvgQXShTJuxhpR!h=06y_w{FA zeDUh@&AVb=T9wGIcIU2Wn(N@!z8!ma?skI5Jsc68^y`;quUfE>8?J z2G1n0m<=y@IClTO9d4A|ni&U?#LJezKPbg@rPI4nrFoO$epE-!&~w0R@&M${ryXGf zhOF`kFp4L8+Oct%pRPK}$i(S^1rztS6eGG}X)HXIF6k!VnrqP4iLXUHv5ae`(>X?j zgCWK7mi_x^6M@)mOuHiQ1M9}p+-jymrny;x9y~-W3e0Qf46q#hsZC3P1l!rN5oGoQ zvl7T+s|YQXNsf=MFIurf0NzGNOz}b*Nh2KeX|IjL!HtcVKOF4-aM0h|{Cz6qoJii> zV&E$_ceZZHBy@DaSi%2(OtvW5AugyD*g_70@sPq*wbfcs!c?JsTo{SE8nhsy3HcQ=L9-_-whf zk+JJSDvLpRE%H`K^x-6QBEMLT$W=yhHjqB5Y#@_u&|enu^$Fj`1n|R3-UW8sM*Y@0 zv>xP!vM@=bT7x@2ZL5-Xxq-|3a0!ECd6ZOx@?(3|6&(Ld+&y%sLA~ZWP zR{WZFDBsgwrG3)1R7m>gbFy0pGOBs#I>}cA3%|sEar4_}!R-$qwiv&~0Hn@SxCG7v zJk;y*pIN4`^D&S3+C~gh1csVX&59v3$7nAK{6iSfXVoW)zh2;t@ny;Dae&R!uy#h-a^ zw$ZsK7tQg%a<%8)F$T}>ktkcd(th92M`!$>f4~-?Wn!2CyEbMwFR7)Oxdz+r;Dq+w zaEhq|A2{JT_`~jYUtB>z%%d;U(&yU;-@ioMc<1x1n3);(cQ?tooiD%uC4JyemqF^@ zH+k+M(BMvYHXKZk&ZL1{qgI~4jUPPObu!6|$Zk;?U#fdI?2}y5iAWA{Q(_d#ps%vA z-e}Of3Ne7ZFL3Nj)U_sBlm0Lyjxd0-R|=0dQy|sJDhLcX0hQv=V#3z}#%_(lj6pLC z&>~oF1aR~#X&N`a*6HEEuIHMl|bN1``Sz?k{B2*8%RC6FEG%y4%1;p^G2A3{ONgU{AX z5W9j}fv6Mwb4#jd_<<3H#Y< z12hvRq?}3H=EpA+krKX&Rj>UB*Q%I6fb@@A*z-}0xDB|HsxmWc7eWLAm=)MmG8rt& zq=gE^4n*)&6|s1@Tu_RLTzJ4!DOm~~EG4{JEt?5cr5=90e|i4$kdkR12*;ac^m^Ol z1KO)&wLd!>oiK@$?n2~%QF9Bz$0&DJIJ$flfdCGG7ZsZoc{50FSX$dx)*wjo-hI7R z>7Bny`k^U`@1b)t5ET1p%w+r6Ye!);g1VnFXMo@#LK0};(kWCVsp*q3#T~#46+RR~ zYEqFycRHYwP#6>W#HTl!J;e(hTX+`>Q|$cZFL)ixPzkTdCjm=YHPELzWpZ$U+b8x( zEaKsKGMaF?17uFx_@s*`ZIKGBnxT9RZ)rz1GLs|%rEAC78Sz})FeghZYwTavA4?Tu zFTq7JiV#|ly~D^d0q17iWth)_MsIIeH=`*qy%w(|x?XRQ&wo_7GdU&?ykwsPgC(&` zd&3jn+=L5JtH$3!0`82@h6ph~o*boPb(kDMqWx!`v^)#~*;ZO$iaV(t$8j}JS?G8I z^EJqI#EDjPIL#XIa71OU{!3-i=c3}nvP{;zeo>oB#6-qCkx#T=Z-~*be0_ur`BViawyT5Uz$8>^K%$fu#Ki6Zh8baU-6w^hTE9NL zVxkzlL7b#Rj-%gIG6;JH2;@tXO_D|n!07(@zm39L{VTR8Ut|9o3_|Q6E_f_Y`?tX( zBFR2Uzdpfo*Q;#Qjdm7SZ=G;qGSSFn(mwQE3+5WSgHil!GCo~|^7y?(dHB*q zdHBSQZ7P`ZHIQH=Y``fT;=)Yk2IfmEmCz*Ln(&lu>p*3j374jSC+Z}a*irT)CYS6O z3+kFFh^MroI(S4YbhMjP4gEsu$wf$E%Hg$}Sr0K(P2Hnl|;?H}jcRu)l&@_*wNCj_HHT+fC+G?GV)0@K1s+8E1}sS^K{!tjR9!8m3huQFnn5DBGaQ2r%=gd4>=htMkFMm80Y z!V0Y{&`dbgO>8ofh$M;@n%j)*0w&D`0VKsG9xGyrdTxH!C(Rm+ZvCP!Zq}a{LS2Kz zoOXaBn(~@m3X`)Q#1KkM4*`+P5z)jOscG$KXS7sS6OFJ3Le*?PrLq36^<f+IgF$BosvECTA`NeVL(f56~EG34Y$1?2?SdHC$C6P3}2 z?Q$b3o7>l5ZvafV?pD|eU%<1shvOFU>b-xB7=1Xjj^;d%Og~^6YIgiM8ossEO35yK z71JY8v1`+2_vOYp^(MAK)oFB;xbVs`xa!L?Quq2>cAjnV5<`?DWxu-b8lK|_?q{iL zwu_WM?j(w<;;!kDop20xbh*D=7PyN2oPVF z!Hf^}pDjK0s~fyqWT(j6^-A!XA_jE+KCP!3Lb=nwOK0XGT7@^Ga`B@{%ykh*W)p&R z*O?{UXC-72`}1bJ<{KJxWVE9jnMfFw&Qz#4Sm5?mvgoGbFSg39uCzP)1HC;Jrtg7M zTYT3@5Ula6h45$sa};{fvIsj%!H6q(jB95M!2nnN9tJEp#B{3V1I+=4rsv!(U?ZCn zOtCNM_x{B8CdtQFkIdKYWk5QWyF(DU4#MBi05qXlU7dwW4HciZ{#>-Xmq^t_zk4~y zk(z3sSAhSl06wb900%okHNktLvUUSWeY9JYAgR!Z2yCh@Bqy;mg4^+}a*``4S_5$R z?9zmlgchj$iG_UhI~<9XAGIOPq0j)msz};GL;Vh>1b+P>?NT&!b~)0IlBQW{5Fa-X zNS{W4WSat;;8TQ{BvXMU><4{Iq*rP(%WL311N#vA5w+-@0uS8k;vQokI;+=xhooj# zrw=X$@A_jr5{&qpzC>MMH-!lO&puP;EJZIoURx?+(}Yzva6nK+mkW##RhTlTH_!6p zIgChW>xX#RB>lFPHYa4BB2QSv(&FV%Na`l}?032iyhQbDe&eB(*a5TH1G)iQiD`M8 z7|UhV#TC?cvI5I3%QZA^T&fDjjxSxZcyT^DIN~)-k=?zz1gEg6w=!G0gw*$R?G1xO z^FQLeqoNR2`v<_b%8>)SNvYUQ4VqiQKd5HgTUXaNq{qq~IazpUUKn%QHh3CDAZ(QH@K(ewDfBH?s>IUZL={@vexGkBQ>2tH=Chuv>-1V)^8Im0zLC z(GSjxBC{ubv^9B&952(*j?Q&Ce$b5xe_;`iX<*1F7==4qlL zp=lVCmXt)>>h-h1pWYWnUQ&^9Y{S>`zrkX(&yD;%PZ<_Eg(BxaK@RT9rU^JtWS3;4 z&ZHUAKuXf{tk8EWNlUl-*?(z(rtZg(DI7U`IfVc`AKu3APdjmw7q?l0hXdbZ)c08q zDfvxh8PbU&{l$*WpcjV5qI7oWkizQxBNXfWSne~m`eBwbh{IE5BWc+PWTbN=rtApM z(;%tQCAvf^3t(Y*NqOwk>1X%Nyp&V0&5(d1cM26)*$Ran9_JKqPoXZIFu-7YS3gN(Pc~rNM!a2oUIh-c2=9}69`!Tx4EpY_DU%0bTt zGkSk#XM;z!xzuyh6z=uMsP#Q6_N2Oa-PltIk91_<`A6=bVCxKfF?gJ#1M?gSBRcUN zT}mn4nBps)T_lV=4;!e(X_0b$Z2zWxy43)zQSwt9SLj~%FFf~<%Z?29E4mDDPeol>b{m6+7kNWA z;<5(KQz^_6nW+9Sf*1;L3L&}%49_b-NvkDAV9W?48MAsj4 zJpupgk7>;Hy1$YP{P;P-<>Jr-mXbp_f{OdAyj0BL5Upz>Iix{CPFJSUWAHbxW0C8V z`$?_Is3iAT=q$c{iN`d+wG%j~#M;D@9RnoQqV@|TKCnxn5k%K>v=OhZ+jsSh5X%=+ zvn_K_ZHd}W^t+HY{sy{)5hMe|5HA8ij=h`b>KS-P_n9h2Sgq`46oBj#VmRjW_t=k8 zB4%IQj7ju25hXW+vWmz7hU|IR5F|AP%B+O!kQGqSW(CrQ{VcQ%6ng<}a`6qIf7FrI+PXfDOG#(uXHbW#g3~))?cJK7lIN7RW(u_>j&hGQiKi z;uODu!zxpWs$7f(&{;G%`Y_@En_|83-#{_eA)%BBt)_B3io>?dJ{V`FUn-C!x;c(+ z1JPCpgBwIyS##_H2Vr$oMg~`WPrIjyIh|j<$x|St(nRr8Y2te(5S(NLrsZ8S#g?U^ zm=T1i!E9DkVDcwrw&B!!D>}1!$tLs^DEWed$Z1Dtmy}lmLJzv<({gJ zhq>64l;Ma2o1dCurf-5TbZXkto$ znsP46S2(}{nn!)u;24C4GL(UGojC|DmTzWxlQ8YkTshVCDJ6Fmh7oGLvgHBF5gpElnus_tsrbiq@7UMDOYY zI07?1G#<0T1FPkWF@DX>B4;I46a+sA;+)2z-|OymAxn3K>KX@_?kST=>r5_6`jaTA=#H;ICt0bZ!tE}A6AvxUWOqt4Yf@g(vc1Y zpj<8>u#~;0Bb9+%j$=XIzMtCp(^_)l%7;r&DWXF#>)@Fk@TKh&LpQ4nE_BBePJ7CU z;j0{)1)>T)RSpQhc?I*Yxm-_XT(T+Txir#~F0!LFLMa|!R1fzUd1mldVh_GNd0kO8 zLpazBj-UX8^9xrM)SAZgdxG8B6$6)h7`ZR8`(;v}OrCJ7emDake%;Vr}I(a**!(ct@qrVGrViENl z&I$p2vch?dmJC31r-cQS4pY5SEBm@N-c`sBt)qG1_0%*#JvR!vuioe_QDqqECk=YdbY!uC*H^SMoW6)QA!e8jNA` zdm4tM`&jrP_hf6sI^yF9P~V~}Bp}vSL3n|Mcqvu}4YDAd+~PqerTR;cju%*Hs$!4S zwt`&}d#r5w)Js8Y#n&kTgfjyFO9e~oU4Dea0vu0d>?wLb8`I7mL#@ORW4C%z669QU z1Y@A2Z}-ANODb>>b>S4H0b#c4@?OHHRr--7PmJV!NbxG|! z_#>fe7}5Lct)T+8Lp)~rv=g@`QaT21+}Me7GT8CxBg`95zv5tv`Je;?$}^B+>I$JO zRGvW_!Q@Lkhi(l5>8-MCv*K5JsQ^SdL66aeI*n2UjfP1*9=vHNTi#aR*WOzy*#KXI{=ONlWx$6O3vExV@0ONEqzG>3LRsN^ePEG={|@kdd3D134f;0HKIBU#7B z4qU!Xz{y0~TvkErnoKKw%e%-8@o>mebk|Ts;O)VM>RS0zP%VEk#hO9A%S!y60xp%* zCI{s9E0s4|#%3k-R(Xz{9H%HhLp_~RfED7 z*|Yubl27w+mg|qbcVQNI)c_<{Oae1NX6gQ1@FS56!mUXNSW;UZIm^0lNi=)z2uQ8m-@L?FmK((u6=@XvhHNe~f#GB8b$p~KQH@bznC`lh^z*k&05*tJR+BSL9kDy*UIIu#;t6;IB89!in=)%1V8W4zWh zfG6!f{*y7n`hw8e^|fFOL%y|IA6KoYAmDmQL_(rN+7(Mue>KgLGzdy06Y`AaI(Aet@Yf`wPX)%=_{U=D?Yph71K%yy-x>{zFo&ak0DQ-U|N@~Zk((Hzpi z=(^JL+Qep4JqVizoL;nm^0ML#HT_a@7?qT|{(K21Pl~y-fyFM$Lcf!J9O*B_;>uy)}#6Q5J=zlC;zjGcm z=mM5MSCCWEabodmI|}Dkptg8u1ed?MNaWXIuwY3dhDqd#{3&3`U+BdIi*%EnBXDPg zc0sb(uYg7_(2r|0IEXruPI`4w;H{;_YN8-(5*EGBQg(=;l%fE}-9l#Ga!M&GfnGFf zqwErcLKRw+`<}KTWbA4wLte(kH4MBtc6c>MfbRKwgy^E$37&r9J2FcK4;5r;L^#$& z6un_8L5)fY!}egpw9ZJJdJ@~leJfGpRv6;AMsJXRh-N)4rSO}%c)hZXpNAhGoY~vw z5dj^@ZV3?38z`e$=j{|>Ch+r~O|H&?5p8jwi7%6}@JmKAJ}HbA-`A@#D)&0nwDhpjmLPMV#riK-X$KbU2a*rfn;#)lj;%-W<00e|^=V9l zB=V;l%}xaAMrZ&9Q)b)ByAmHiq0_|)CC5v38yiTLaCUis4dM4hnO>zxSF4uD7}}Cs zNJ-0W0TM{Vhu2QFPG8@zqhD1I#+rp1YvaW5OR z#S3tT#-m^q?N-82lPZF6Mgpm;&+gd^1Prc}KQteg;_7Y*n!Oe~PK)2u0 zlJ%F~@rtq*2*RO^p1m9GP$Z+^va%|sSUa40$0ATZ@`z3x9W;-+d99G~Ta}9kGTMXg z#s*yoqID=Il>LgpMj+ixDvawmG3wJtSZ#zIpf-~Kji9?r7+pCBu@5m%V!3^SN3)Y0R=AgleM#3-!Ay4a2l@ za(u<@1doy^phi`(6}dFA<^^D`*`U15RN^9GW>ZWsNl9zJWggsJhgJ}s9-m00S-oUp zZ?eh`dQvw|5mf_0-B`IkFAFQx?!*SpEqEYjU%oyFl^#+kR`^(8n_eA3rinIV2XfZ6 zv604e$VY^MJ<6yQ4mp`hM+BuZrblLodrO6s@rnQ>qCFOv$T9Z!(aSEYO9AU=-$^Dc zOeOarqvjn}$HelBW5&E2oO5yy_SxigbQBylz3yg}itevOeiS?eIXGUY<>l91OQ8eU zp4n=-t+~ej+NK(6guEcX$V5fU-Ub^1Y1&uY1XZ7((c<{%6vRom&D%-b@yV`3$$yC?F zN>T6IM@Io@3+c|mka`yh-iMO^M2{|RhumfNbtMB*q!kSTfa&8e+~}rm+uVPA7)S=u z%nCx(*SE0VDjioBA7IeYKMo&ceYY|}sC6MnI=>A0cRV5rSu_04Uxemi;E#jyvinx7 zD~rf!BtjW}k*WKTA4B43JeLTw)+qPXYK* z$S&aq;^C2PV6tnn_R=!$?!rM;aIDD=R=uo1lHL&O!`q2;`HkBN^bkb*f@fKNx+!OT z5+5PXjBwV+eXl^a{y3Bo|8)Jv-JR?|{Sx&pd2&<(L}%q@*j8hcfQ?uwsY`@{_~el zcAjqU^`CF<|GW4{lj?s##yNO$Ha4Wv4r=ZG@a?mmEt!H%FLsV8h951H+?6TF(zIDt z`&YQ@pLp&d%OQ+aS0m!aP&QmN-rmcD?X81tymSwbZm%3Ne7(-7qo0vbap9OdKW-ju zw~VOYRv&L)T+a)J+dtSm*x9O%W}j9cEZarbDY*IV{=wen)6cYUf}9qyo?_BC&4gHe32Gzx-zWrcJW(dj6Q?}y7? z<%@ls8q)TeG&98XPwZXWd z-&V%8kfbKhCx^=w(pxh-22UyES95dq5`6}58vbIRG!*~voo=(@GEwKXB;&!14Odg5s~fZfM0h0$~cEY-XLK@M$j9c z&#A`-OOlrqXyvSMI;U+`I-B#VJcc8=xb_7buad(@9^!dL(lx2XpWX6%(NW}&v?946 z=}4F){T?_WsT9hxA%mT6fJeSb`-`lRbQlY>9+h*_ddf=ZFA=LYT*6EG&SfYN$?Aw( zW+ZHE#1mU?4(+5icBb6qjHumG4&BlYao0_S#BTA+kg*6tE!puo5J{2kdXkbrv}_Y- zmpQJxwbKzFbpPptA_bf#L6v1IHOPPk`!rkbVQ%D=@T007{#HB9aP!8m&wzvmy_FF5 zK#q#73@mvkO@+Fo;d5~~SBy_*oyvGbyEfB*BKLWWSE8AZp@t@%Dc4 zkc~DSdQ%-~=uefL6)jPq8OPsHHwD=Q^j||gg=Q;hsHFB%C6&}|(^E;6HVu?i2}_y` zX7WCiiONVS8{(6yP95r@q~bz_<-4NT;5LQ49f2lGYMG1|t2Gnd0RdU5%{40vdQ?{% zc&@SG>i1W1byfzI3V zaDla-_@m>t%n}V~B@{bh4OX=3hiGwelBIlO2879m%4h&t8_EAB;zrLu67Z!D0^i;l zK)0QF)BaEqQ`P!_!J6H0L;v@0HpHz}vPEX$2X4KMk?LlJqCEYkCAYKT#m+&ZbifkV zu_>(8Y9>XfyxgJ)Ra*^;tj5BvuTKrWgO<&2tPzAyVoroIwLHSWi3Bhk#px%8N2sS{ zN;))3a$D>BN{8SUjgC?TR4opPs_ksyc;&m7dw=N5lRkj-(U*6MFFP*|w)dWHZs8cF z^LgVdPB3l>J)QX(_DG|n#;4;ElORvVhwuM1oK6~_kIpBvtEtAV8;GaFu|6Y{4$FGO zmViqR=g6#HG+?lJr8uNy!bKFs zGB?}h6=svG=~0fW$wgkJ92eKJ%OZdxH%E9)y7+c%`K(W-gHvXrY580fv!e>^obxfi z!M9qpI68yF3HRrwpy{CaHki++MbYqlSb>Jgri+SpZL=ul;uwujCPguBzR37zgYhvK zrT9uJb5$0_QdVzqK7o*FG=Ky<8J%9?r9n`*=F{KTgj@~QfxJJ$^KM{SM%MFMLlY2XX%*W==kG2D^Ru+<#2H9 z#x&oWYpbIkp4J*5(g24i9#fLSG8#injE)D>Q_0X?t#dvcpW?;XTJy=(e1cUlJ{?v+ zPp^ROi~2WdddQogvuayB;5NlWb#JR5+lNGd3))=)3wkA04qfYg509>AwJ&&-OuKHc;!g^;*9e^~uL>x`kG-{PUQTKmD}CEoU~eZhhljq#!OZ8|)~BOHssX{|B5xSYRV*mOP}RtFWs zXL85`hLq}3ys*R88nerDkhCda{h_*AuWT@TkLMXds|Dl;kKNU3ot{q)Yvl${bB_3c z0WUdr_2cmbaZc}X82i)kxKw9o`^T%{RVIp22J7U{XRBA)6@zg@s~8C`-p6*ONSPpV=92c=C}(T-3+=c?waBgW5Zcd^tp#lWruEv{An8jRHX=is5Oe=gN8tlp`pV&b{}`A?8U)hhiy_A33+7&a0ZVm{RP*0d9Tr%}{b5uJVtD={rZ z2rO^8z)UXBK zLiy)iVoy4raVsOrIvt)J(l#l#Pb?>3V@Qy){wXvKqz+!%s8pC;P9`TuXTzhP@_Dku zDy{gT4YET};-|Kc)2s90Aq?W4Q_E4Wz4mOv^-K50FoDrlBylpT*)Ck$cMhuUwQX3&|p+D&RElMB-EUUo*s0 zxAYcln;I@)s-l_ACk0s&n3OQU@9-1LY7L;}CWn9l2uu5+j=XAE8@ZyWPRXi_ju(B^ z%rZm^G}Hx_zii~HElj#*+cWxe(ufAgUD`$BJqoe#d>1P_*W$KT_Rm>qaL;9>CdqN> zF8G`RW{hz@DKJJ5c}|KpH*Oi9J$ypz42@&-o5&Sc~+1%l#DT-S^`lC zkxP4xxtsj`oCrN)>e&9*9m}BL9_m=53R8N;JEFfhnG50UwR6t!an%U)U+yFj2-nQo zab`wul~MJRIB60dflL~JIQC**r6I=Rl26&tnyQGXGy(relW@~KX~3}-HQX!2Ob;)m z<$@rc+l@PC^DbJSOGCt6_ns4j@p*fG6 zu#k}JA4kKtI@}M_b6@0ThgdQ(khl`vj@j>eAa{dGIW*5A}KO~RP7n_i#<2V8oI4E#vGsfeXHc^RRUH}@SI`z zQSIzHxd?2L0A-dj0QW({nVn6^uY*`QTOKE)d{TS;bG|xf+e>vV;)%l+~^SS#K3juJRNtj%W;>iUa)^Xm_g|bZr1q z{V9tAD7l`peJ)Ed<+32cRz^bu3T;_P#1*?M7D@f8A#Fwj+)0#3K_8yhqSk7YfPsCA zTsh8xVHF~?tN$%FPxw{sIcLnqLWzB43NEpQgqC3pOE~KQ2xG>N`pUYl2pA)pt^*L5 z-VPPjKqbE>X$Q+i8fx1LMSQ@Hk4s<^(9@f)v6&_d_9g;q*@vw4K0-WB;R?w*A%hk!;TEkfAT8k(?M`YE*Z-HjcW-ViIqpRN z*QbEGHQU`90uAs@P-;?j&3+7WwoPEs&bV zE~f#Z6({|6GfwhSSddi#3ITl@d{}iX-$9Z{=5!0%(jOAfpC! zlK1YXY9@k#6v8^j(Enf~u)n9@vay1DQNP2a!#dqgBw(n&xvjAfNZA3C& zRsiiB&)~~zZLl!-izE-0cHQlnTWT51CbRAH80I?8i#Rs6$opib(%RsO?P71X)?5*< zY1NZ^BVoBa^@P>9u=&{43vQ;?gRgLWM&ZAB`$2y>)wWNh-1fVOD9`E`)QK3rkb z6k8yoGSOJP^6+*D`L$QSae-&St{C(Wydri6LK;UT!Dv-wI~N+ia{0o{#KcJSoTb=3 zNZKmGGxB+i4R`AdGPN#){rK1Ut zg8s&5F%VxMUr-eGR()ys2moC1=h4iU&sXX)q&!UEQkdwOk)Yv~YOx2=Pbd^s^=0yf z@Y}>PNo*0n0z^hzUt7MQC~nnpv5q`h_6gnIg#(DmC&HF*(6=P_gcQ?;9vaaVN4*6B z@c89RC9{R%Bh+C-r;gk}JbL?9X~2q!`eb0$`x_Pk)+3Yr6{q0;qbxJRaRWwbW+uC= zsiyMZ;T92B+3E_BLTgU+%~rCNC<-y(R&&npX{MCu(9J2rr-@Zuv ztx!tHNI3MEIQ{WHt5ASY$N_60x*_1R+#t+Ddn{;R|)(6ZvGSdP^dUx zeMN&yr7i!aF2hB}7b!=?3Xf(qYMBD*OkD&~pn&G-T*+3DewI!Jp#L@HEq#-uFMW2d zAPc|liCV>;fp%7oUY2nbbc8#cu_&bHbayyisixWN9oqfQP-ZzXd#A0U5VnIBk6WdB z7r%E9?u=Gase<5>^Ij4ZC<^2(hJq{-i{Te<=KD4URj39x+Ww5X0 zG50MElLJ8@m7-4TM~zwGpb^X>MCo)g!Zu5rdeFWg^*oY{yqQ=+fvW#Zi$q($gHQ?< zDY7b?5Lc0qnaHV>DTRt?D?Vq_Hd?0(g~~A8SUG(QNBJM>lM4!e6g>y^+P`m;dXK1n zWjaFD`-psn2jcHvzxv1K2cLc&MnZbU_nK~nJBGz^l0>ED zHO@Iyj&$xkY=jL3fEH z@V*e!-ky>3-6Mi`Tp^^y4?!MWydtKOP>XpLD9`y1Dbdaz$Dpdu{+|sl6fbY!3T&5v z_x(aBYKv&#_>+eA66EU`EqvG9E+$jHX808@Pt$NP#Jq$yDhLvP!rLGtEJIn8VW1q5 zq2!PVnu$qq!AbG90rGuNXnNk18>&Kk%nH?X3DA9t7KrfwX}_AM^XUNAv}<=y+YNq)7#tGBDWDZY7b(+i{E@LOVW zD)~Voc;hn%Kl3dBno#kWMUqiXq$^(ZGe&u{#zNRc=HQpT7cU=J4g~brf8a^l;|nhl zf_$oFicJ1xzW&$yi~lMD!L{_O`-=fwR!bTexLEb+#i5*j_40SG2Cp%0VW}7<%jVxd z1&@C>c^Z%74h2!_R2Q6DOq5fFbw}Y9&gkBty^8G>`A43y@>TlR^j-7U^PY=1wy%)m05KoP@!C>xf5xeup#@t2O4AR^~N5 z;}B599eNj|CF>FEHlY6TK3q9%UUMtZ^zSeuSwmV$TkQU&e!DSU0BA=X{@7o(tMFQr zLOvanZFN{%QNYB$w4Y&-B>F)sP=#n|N35(xg}Q~=H9`s~mxrGd+aelaCpx`a{a)^- zVEWzrAOEBGnw|*i@fBU02Z8qn!wXeKgUz#4*5=V4iHFK*5vDIwKx`$ z@mLqxTAh{FP|0E&6C&h~!9b~>llh2&_I_GcqW`HbOE=Z>-Z=S1ee|5+uHe~~OS}P) zusMQbbW6227L}!pMpYjoWOtiwn+c7!45Hd*OHoN`JSj`>|K>vTb`_LdPITn77Z-)- z)RRQVXN2?zS^0sMto6EBa;Ko=&#=x6RC=Tzi&R$ zJ^;@_jM=QEp)z)!+Mq?&hyiY~YS}zg^T5*!ndVl#Z~pAk4Wxs(@-Z1|%{r2gH*VZ* ztrPt`E+0i<*>=;?Y=Oj>Y7c2ZT!yH@lWIh@@?JpO2yBje<%Tcq8m=!P&o2`g~a-O@_uaMs59#?mp z?;_|c-dFY9{<8wj{t$Ek?l;?U^<`>s1-BWQ63r@OdCe|^uv;}%(6x%5vR2*L?^<>5 zdSdlt(=OFC*_c+hFRHFO`0a*0R2!Pz4p$tnWq3?YDEM>JrSKv4t1`0t3E|HuHxD&R ziL}h2X{Q3lt|p+AZG55yzxW3vLBJJ9`%fUOr>}Gdf5r{={&Iy)C6EFIte$!!zft0w zB%CApM7hIAv9U_%^j5sjhCTwNo8uFa=u^502N3$kjTh#I7&`uBK!eAX2TVi6}1{$vw!5)Uo*F{ zkP%wIcGWNWK;1RomV2ydoWdpuimiiDe*k~|+(j!9+iO*f6*S-?%ccm+gbYH(Jkb3z zi-SH;pQ?N|_443SXJpi zA+Rq_alad&jH+U=(t8@LIbJ;Lx0sViI>%}+p zUr)X7kmQl5>g;ROhd(;W2+oL8wfEow?BX%qg9C z3IEM+B`@i(G%sn00e`*1=EBYT^7SjRpch}PUi6TmZ`DI|GWLn#M+db1N*b*WIOqva z7p3Fcs>nPzybwMax>)9b;PASy)|$ASFoP1ojmJ|Y^`gg9`|pUl*RQT8H}gy6WEyasIXt{~HYMy3Q0{HbSq64vn zPvpHdjbNT0%i;QdweDSEQQVvKUJ&jVJt*$oN0x{|t5nn%m^f03^nFFBC^|!194u@) z%c3m7M)zJ1ewSJKGmo4dk-877AkI{~YQp0C^$s7mn%7_z38EBdhm7S&_cW!weoC*2 zJlpt1gh;e0{$SI?gpRLuk=NA4R!Ww0W?%<;%eS%H4o7KHaPcM>7JkwTbXk|UL83(R zL4=X6ZhgX;mJa-mQWAGt9cAl8R|zVx5)<@S$-tuILwp?xWWBM z0_~j1ee)M|>bu|E{4l>;-dw}rF+$?Yo)|4g9vb&)w80l(!(aICJ=vvg?&umRH|_^h zREOa+8n`u?H3$y=tZc9XLQ2p~s(y^rqbN*Kv`|~5N}=ak6giJl@;p(rl|89B9=PYJ z^vvRB!v1u7c7`b!?dQkMX^Ki|?exj8lpSbddmqDps|{Edj;I$G$goQkBefE~z%NXR zC%kQ(F;+4@kZ|di7yjqhGQEcA<9%fP{`w7$QAn5+Y#OS4G^WqYQ-MEZ)Ab!Y19%5Th;zFt-5V8pZX8clBI{1{VBa zLC^=@%fJuvq&$mY5h!gWK}P$#CFOUe83?aL)>o_7Y#ZO*-^`IoS*IT)>!c>azW;^C zxz}`2$!}SZUpKu$QNr248fo4k(JC}g)1R(M(epp^2phR>fKJ^}N2!!5LgG$U0==$Q zr@BOnI|%uT_8z)0G60<`)X*hEdmt!3mEggiXBwmiaW3HeWui>0*Xg_jN&g#(l#?3K z_x0c1@d-$nZ6mmffN_lBf=hh3gODMkJMEqc(Q-fnb!yo&qhxQ%H5#1{Ik>6-6v5VU4xdp#Zh$KyZ!<`2LA&7Z#ewzuo8gr>7iolWYZk|%f~l|=et&p3C* zNs1XXD~fsx;uHxwoOa?noIC}$C}!E`Z>z*~d5ep|E%2zrtZe^uKVQs#jlqD14#Fy0 z1|7gGc0IpAJmbDi<7jK6rU$t-Z>I-8`vI@{Q1acl5|j5!99wm9#tu#$nGo70DSxil&&32`ZW`ltVXV|}(Jjp0SWz}VT3mUS- zA~HPMb$=25ENFiq;?MUN;Wu{qLLI&&E1UEkR%zCg*24ynWcTiB*x6}XJ0xT8svVZT zInAHa+yXOfr=aZHRdAWI+eTPW`r6POT6shB4fFB^%jmKV7DUS~)cNgh6k0Kz!F(2L zV8Y1~xXIx2dG58lK`;{0SN;ii4WF+GAl-Lv2WI9oNrr*sD?J0mBNL1JS@WIjZhXh@ zG(bk_y>v(S?=6iMn%o{4hFwe`5Nwo_2Qs7}3>8fEM(Xr3El)rqQ~4$_jAbX^;Sv*o>hXB*C!$0iyf6c?}&M58>K?M0ej)h&&?55c^H>n5cw# zR$L2(wcc-jM2H#1|6w9Kxt@O`b66Z8`~|DQP)PgESPOn7;e)urK*8qRR*urG-|m*n zHMAD5nuP@ccD7%?8Voq}S*p{dgG1?P3GB5ZpCO_T043wc_B5hAk@sOJdlD zLYkmRpLswb&RxduB2B<{B}{4&S=x*&TE1T`?_hV#XyT$RZ21H0A9_(xn_tte-ybup zcl(31)yObrD#DN8<`bh4FngdUGWurB^jA)4u*`GrLZ^-zxMl7;L@NI~!v9`F*#*SK}JqVqa|VmV^m z#KddW(0#*K7|GR9-Zaf@B>~$0-P9iCUs+8qWvQ*OS8F=Br72sj+11S)4t(8e8EX7z zEu!j9=S#iC#udFEwpD)>_H{guw2?aR`}*pimv=OikyFd3u>iYk6%GVK*nM{r!Fu~d z8Eip-IPgvi#3()=3D9*mr%ocw<~}1CGG{Alg6wv}UYd>V7d1Y}dvbAs`6;=gmfBNM zF6@F`1(}LnuhJ}8-L9L>lH2A9sSM89p&CtMVFgT+9EH$@SZpu+h`nz98Xcg` zo#LRT&DovK|MzZ=2_;W5y&rp1y(7p>!anJM9Z45~!Ax63y1k80M;J}JWs_37b zl;s0Wm`Qy)I>oYOib4uUCtGl>#4Rk(l=hbb^&K{&9lXGF@!ZU@)iEpZs$mB1rgYEM z4nw)Adj>}xwBL>mU0sYe-|8eU-JZ}Ju2*a`7{AWwF~h|j>g58D>%mCFQ8g_DWy;@? zB#2i^ocM$6o9&3Z?3P7X4)OOCz{DV@rD&<5B#DW zUX+$x4}AMq5Yf_rIzl(8?Xa5R`DW6FCVnC*O+Yw1>hErsx7b&q*2EtwO|}8}>KDY> z9$s@^G{2-ctao3me({#Ry`$v|Q;z@TzLp(omY12i5v|MES)4&s~lS zKu?8m@%5{h|MrX9ci*gj{*ng5S1BUlP99+{j47ggB zSe!q;rtBhg;R;@rxXpwxso=rCy&gOq4fh`Z;mtRz!O!1blRgMIelQRcVTvs=60#Nj zEFBFCT-tN8Xj+**y!htk#a{2lH+L_zD}?y=JIa_5Xj0QQcZTl=;)D+^(PNsgcZt*#pEMi@_Z}*GoX#K7rieY34}5) z_Fi01rgzJg7GU*&l|E9eQPho0XK<(};J8?fXd5;-eEHR4AyWmE|L@+zLl5SJC@5^~ zJU&wMH#33vbuX5)kAhTV1?dD407Q&H-{K`)yC+H|J^bevv-uB_RqU59sJxGdu|eI7 zcU;O4SEF}d$;Q$z-r~1Zdy9JS5L1BvfV{Lzuh~C94L~h(%aQx`=Rf@k7Ulnh?LIJk za@+giU~n)P^9ijE6^{C^5T3fcrgw;|J$O4cn798hpZ#)raWpwSoE{#Y zHKzx|{pr#10RrH;lN5;BqrKc&Z@q+zr@sgE!Ym>oXFbax@t)$5U582tsRx6L^-X`) zTu$&1`5ym)oewz5kMhUro}a~)Kjt@=OZoL-a(9Dn${(}I&HLu=fu^qg)zt)B1><3_ zKf3*~H|*WLznHup?(x6D{+sjuhvov$3->RUKN{>D;#dRJRoFi|+Oz*34n{|B_N16V z5{$!>qc`WD5Z9w;$9RIp?+=Z1Qn`|RQ|2V!h)2l>WmWP`IF^1A5ey1#Cf~HpCh8MbmCal`?yIL7?{{d_k5_5b=U@e^lqGM5-&6A?q(@)FL- z7>2XIJG@Z_(%{>F`HIl;e=tYDkd+h&H&O5}TKO*sY5yg5YIkoH8Ep`qGs8qfCj7qZ zGN6y;fBHYdqugO|=rjAqFJ~9@?>zNy;;o4G40<}9Cb~bqqAM%vDaFXgmrHniuVLDf zbk|eH39GOJ#~u|{nWFa2LVb8a!!zWCzNJ`k2ZdRc(EPQ1{dOz5bE{JK>FWwew^beP zpI%HSY*_oV2#W1nhfBYoIxHipNWjee_}jUi9WrbMtANHSmOG#f*mj}mb((s6NDvpJexoE}Zt zYz{|f$A_bx&1QQH&odioN6kiP-PLSrq<#vs5!?l{5mNugW^>S-ULMFKr*CsnXEye! zW;W7?&1PeGyxHity4e`=#B53gr)HygJI%&W*Ug5ejyv1T#dJ7pWT=@;E@rzAHAh=x zc&5#8J2uoXtvlOHh15@CGmN`nGy6>H-`HmMPbY`dGZ|`lt>z4d|E^h!P`}w)7>PF( z`cStMLz~!1i^$YS2xF&(7}C0h=vr!5Be@(-W`|-V&BfWl=y>OWWqSBv6up}sliA?o%Ujg z%l3kVx!1U&R?y59fkoq~4 zMw%@sjr3wGr4i7_!Oi4{3vBP}cIwU(WIYDBJf(j-iyGU>>|Qohf1aGthzePn*;UA! zi2NK9Mw|FgLBi67f`oT>M(q;<88PYT;eItfy#4W+$Cs^BwS0Wr;V86-E7#thX)~1i z-2j20H{|_N4NqZYD*kS=tKQ2Qi42XH;WoSPo@|fddD<`S*wDzd?rH#Akoq}nK$$0xTxzIjl5fquB*9*_FH+KR_W*rAFol4KUKOGQ~e z=^72QIltMl&GLJT#f74&McHhR;d#a>?Wl47|9d6%_&As>a8Y;bq5f$xfG|^y0c>v) zl_S%t;e_3&v^#d5y6ZG#c6m9R$pA7vZEzyE^8m6vhUe+1w4*vIwC*~9Y(eVh7(k@i z!T=(@C=4KJJlDnk>|!!9LDON{&Qd;WW|t>CO}IG2PQmW+ezUDHJX6Ztj!Ic*-C4?; zN&PHR=4K00mR@X>^4Vm1*&wEfy;EP0e|8o0<@EBjIbcEK$K`Z)L2r-Yd4iU9RM0}} zu7ciz)XyPkX|^C}>BUAtUmi6lXNZCkK|k$;?s9+DXz)jKLMzFg-S+kvo+)RhROKwR z?kwlco&79w=4K0WmR@X>^K3dfnVdWhDAJhH9`0((%?14vTb6^IU4yi@$M8HEOFL%E zOzW;P-h$N6A!BK_AmebXlLc}|arUw6zN<+6e13Q`nw;%yw%cQPo=DRb0n@sxNVg#M zbBI)$Er|4hd(k%ARHRRxNc*VH!?W4p;m)Gn9>eoQEA6PY;=&ea-Bq+(koq}9E6o-} zE4|n#+NVsNU6AC#=wdiK+Fh9LRLI-~2TI~(ox7@j9t zX-A#$lxf{nvRjb)IV3C17M!v4VxwgF5_~h;ehPJXG;7}P$$i@NI1U$Xd;3RU;Hn^9 zQj)aBuRz6Z!e2%Ky5wKMv?YKwNG`{>SX#p%VYl z5tE0Tk>Qqi2bgcOPw5Ob;%d*);=kJoM5Ht+m1BnVwx%A+yp%cXxeFQF_26Ou}o$?VEsDvFcaN zZzng+Vwd37^xUFmAar!ds4XPzo&HHFIFN&3dxx(V)&CyEnhY?XLz%;FN9#U&C5Y8T zthZ60DPnKJe-AmG^*@J*>;8&4-u71}V!h$`OcA@Ix7n~co9=!QYkLgO8LR9nk>|=c9=c5rn}f^UryTBtaRY{D%GaMTN=rM-cXMYy zi+pP*jM9s`e06{1nIiVbZIjFW>F$f_?J+!0#L|wPM=-6sig*iBKZl5=*@6jQaxdy4 zmVJ`vO4uE=T_7*a6C}JfhG$Bc+ffNOOzX}P-c0IekuWz~kg)WkB;gOuVzKM2S#BRa z>+q1Le%oMpo+yP}_B4lF2rVnd zrjM{%h}#$z5l_)&yJLF%dtSr;th|QcG#+NZyPhnNc5yIWttf>gZWrUR`Xf2H*40oCcD~0BFE|EmJ;sM&-=S(?-EHa zkvvSYZSGz1w%p$JWPY~VH^BOh1mkBeqJU!#xH z$E%Tkgh0pp&GorSX>fefT=#~L`1^Y|UW}3SZFsI>%){aEaRnt)eOVEX)8QA7csBga5t_eB1PbvQB%RYU=4Qu5H*tGiLJxgj# z&n3Nip!{=q1?9t7#PTS*Wy&~09}kDfEO&MH(7#^(RZ?@#|B9`pF(;&l8NdMs^=4<- zF0OpG&ORbLa3o}Mzg|90mr(uhFJ@57W^XmQR%WTmT`zBzoCtoe7k-|zM488+`tjl( zEV$X5-{8%qz2)s%tONQAi-79=h%|%EI)! zSyL%XvZRbu8pvZHX*dY^dQBM$U&!|t-wJj55m8IcI{OA$UeEC{Y#dJTY{vxWF4JZ# zNY0VcA8-GRZMq#;TRZW0o*)WcKGbNLefNwZ8{tI={v9 zTciuaNABN)*I{v*QlNdrlQGlpp$u6!>GHzT_0p+JFl6Xhrhl%eTp=S)X}Ce+0VF5> z7Twah6!*2ix}D$jz1CFW;c}4w(ZN5cBD3atL9ZaJ>6Po5lOO5e<-A$US{-|~VI@2_ z8e)ItOCNrJ+AK<4u2z{f(J10SgeK@rv^vxhj^^y4#Vua zNm4_v?xt@s)p$!IG|xGH{#GyRU}N`Y{qXa>pN}sZc#j4@CYR7LKd!hzu=i8R0*==c z-ALoVnr5?INYZ5zjtA)|k~vDT+T&zzGA0Lzu~b}MREaSs%_a}LoX_M)cQ_r)rGbk9+mtSCH_#PgRreEX956k)N5gEHDvoKL% zUD7P)avJ)$hO@*dTdPlH@kSQS2%Rh*Z}+bD_pS~emUp*Tm`sij&T(^V`2jy3rNE)( zPAgS9^uz;8ntfb)%zEi7P#%&;z8g$203xY3r9Zj9eMhOS^_v+9<`kCX7898S>tb?& z(=4$Wo?WSh(}ZWxZD|P}2JOMrq!JRNJC(P_^DYVZrEyAgexiwqO8@Y3-r&L?9^R!{1U+8aV6?(~dDf?!tu%eW6Ae2M@?nX@ z2oan7xeJ2z+Sgy--8Z`vfhp(9$gb}KyOdjwK0v<0k!ApXXitM_std86+fpW3pr}lF zT~?8#OcQyIFEbRGIOgQ*9blrstza9r1JIr zrr5;(Xg`6QE|&MR0>0znD1mEmL4N^NEr6a3&k|7R^K`x_0$wJ7@9E`;He55z+P=o? z3ezH7+83GL6af#ChT-(@)8Z2q1pnV*bXZ4c|R42ftR?mpNixjZ&y`F zNTo8r!9=!*Fck{zdiAICJM60!p;O`L26n*?4pQl09*cE*QH}?xfH=0O!l#2&Nc4

      p$*j|ECC;3JTYPYLJJir0@V#3EyEVC3+^R2$o6+Z~qh}beKwrz-WK4h%uECF9C~i zseq<qoXUpx zocr{INr{f5R6+ub*PQ72krM7yQUcEJLlvP@VF@&C?$0laWBE}kwAxU4l!}a=&BlIe zwTG$X6uM4xD#6Riv?1@`=k5JsCsRq@&ZldfGL#^XQz>3gZu_L>WlkSwf{{a!f=G^2 zk*u*NQfxex1+tx#!BP?6>8VOzQW@|LWwF_m`?dMXamsaiK^%7%r{5zgq-bZyDbp{p zH0XpsNm<{8`Xn_UIrnMLJ5N&i+)gm_EHU6D6%V}|R0K=KgJo>3>nEv%xa(cusi2s% zUEry_8hWz6NN*}I$o~hN4^@ruB$bzeSFP|gl@~4O`ZSX)k#d>}jF)D0;8bifgRVoT z!dre{hfL-7ANLKs92in1I+Y?tx7A@Y5l-G&HbgAERsw03I6$+wGBZG)z^UwwG>Z z#Vv?Yw&y~L7;!LMz?tm=;7kKS1SP{9jZziIi*7ef888)*`O2bxkFp&B1FmTJXp{;J zTiG9)3Kglm;BIbl()S+6U&Xzh(I}PKB__!9+FMP;qg2Bcyrw+aR)Lz2g;f;glDaCb zakadg{}nU*;)cX1-$Iy`rXHhg2jK!1541&{-%llp&Hs{f811LVHl=8hOT>$;i&~s* zCU6S)Rllqq*-nDO)|4aLOu(56!u&b>q@eiwsQ?+cG6f&)r-sL{6@pW-F=UP0Y)?Uk zt$z2=G0L_Vl1er5vweo7PPrS|mP1mb+MU!i-!GOIMfqo241F z6ZmQysYt92ote)Ono``t8)cgf?Ml_wGI7ED5T4T%g?5zMR`Vln9hL!8=~{qAzveBD zQaK0svOmgp9u~{@<^hb$)PWjo=QrgYmzug1%?p=`&2aNEVCt*n}iV- zx6?)^spzH%e{Jqcn~c8LwyCIwDNs{_YrI%+Xo%@>`f z-g3SCP@y%I8RbhZ&IL|WX{~0}eb3QpDypk4&{R$c&*a#oG6kuiR{WkgcCGFjJFWM} zzoXOC(gb|ATwD}oo9#&m^ih9Ql32DSA+X04*i>W!ds2Z-MK)dDe&k6u?*$hLNo9xV z4;&#&IAOg`Dn|}O;IX7~J~+yD9Hc_^IB|5AN@a+;D~^m&+eC{ zFp6e>h|Qy)hhWKaoa(NDt&goZ!6e>K!ml-;5iPdjOI=ZspvQQ{LBgpK03Kps*4XU7 z!deO!0IuNB=%MzpzcKShE;Dc#jD}Rb_}6Cf0}dbXR`(y8`{u=7_lI=C_kc#uUwqU0 z4VM$NWx3#e&Zk{20+Pe)>}9cuzT~b|_9w@OXUDB7E@)EW?M4Fy8R@l!bNfaQyHKEO z&m=C<+K3;;h6c&PAn6DfQMltif^4&xe#B}c8qxL~;E-uM`WlxqC`buK2x42^BK&Rs zLxadVd#CLkO5C5liG09_2F*tpF$Yn<8&HOpjuNgFq7mg%Ng5Yv7ezRnSI8mHNx6&U zPKRc?Kc?sIiP}J62-fXToT9dz3uYh4h+ske+Alot!{hUub}`4e+|e8CuX+uZkKh4K z9?y}FXamHC;$mpqCN|01JmV5lEz#8toX+8D5j`R>-X~+$zxA33e^MR{t=k%AXR+H& z1LauV^_Mq`k1;53a)H24tV<|f6>&opmZxXG^ix_HQ+gc)*6Kxp^ANBt7f#N3&5H^0 z`t@*+E&C-Y`<6H#>wR zR=}%~gy!yD9qwHn?Oh%34e)7zsNBKT0sj9G|9^!4KTcvu&4sX2(ZIr^;V|=NBXwiu zT&_kv-bY7^_T#{Q9NLc~`*Ey4Ku`E(^*~$rW;H=)_-1ucbr71gUkBmaVfb|vejVE{ zYFDd(9r0(V4(7zK0RdR0Uy~61V%ViR&Xbc9T*CsBSr){5X8pkitse2UrN|un6}U@e zYwshw?3eFd=&0{!=rVX6_+US!Z#;M&AHf1iO;~|QTUd#XJ@rItW|KmF6rTNZQZ#vj zqtXrHt#-((T-FUN(V!|CRYoMseW2?!y^t|J~Qo zDSaiwIr3i_mP|~|NoF53g54^+#={B;fI%&Kc)T7CcG=x~3k)j6ZBI;Dfr$?){j>QYHo@$hK> z7%$1Qi1pmh+C7~d&kioEt`?@%kB^T=pkF_a&Gh1k5w=sKDs__DU+^WuXrpTmFU~HY6MUOTwqtD0 zin}X(V;3(_=|C{1YqxNAZgOToa72DucE8wLF3c0sw9T&A1$gq8_lq6_(tqRkk}Bc9 zt)8}z`4$JN-rw*o=vknTkCbQzgZL!5AT3vk_=8-**Z`~jlE{fZ7BbqDRK|;dVOfye z=+KFyR6{Lup?aW4cxIs&rQQ<*A7|^m*(|x8Itr^v6pAPJ*98GB^FwLay{pw4CuWO& zJdW)VGVD#P$HXz47axNL%qp>2CZE|Wh`VQ(9;cu>DQ18$Q^s-Y{B|{8otK<-)_h9$ z=#+ZzZ`tkfHTl_OJ?Y~N8LI-^=GRN}dMo&-- zAb5s62TXVzE8-B~uHM;NfW~prZ<~snzQ<8_bTS~J>)MaC5Py61kBED>V{G$dQ{rmA zn7O-tQ29#1(ifP(gDE)7nrgv)k%^Z3pmPFSyK#xkK6n~~d;i(|A8t3<%^=1)eA1-u zqxs%&%Z2YkK)&(z>YM%H=&<+AaQLg?E4VTWF6SGNSmt97VC64G4sLO}DTWn{ne}r# z@|LH*KxHBTsZbJm4Mi!Ox|hhng*VD((e9TcDuXF>M&`fWND}^)a3qX$ocEL@Fc{cx z_?qdfB8QD^xvv@};PGki1*AljP~C;XLzFNm$z3QsNbD5rPLK8I)g#vNbU2V13y)G_ zwf<(E-$Qc_w>!DR?;Bhy+57$SW-?vweT9vvC9Hby#aFm|J#X%?h4|scUdZ~ui6Tr{ z$MpOg?fyjnK|V=G>gmb;(P2~CFg&~5zdSUZjr%>1$Um_i>hipbwzhY zDwnJ+Z&2lRNKh6sC2s&Fl6#))q2mQ7qG8s!k*-7!4eh>B9_lGaN9x?nkDsxNc0Qcf zvrz^k>ULQb&Od-Za^ZR`*RHXlCLd`jqTdL}q*&SW4xkpvhjC1oV+ph`}C_ zS^zO#xKSUr@Wk7?{VSQD@P}lolz8mu#5>lzu`OK(AMxBFJSZ9_K4)jJGc1tv3TG#k z3L_kY6l;vIilX^RMAg4s+|R=t=Gna+AXe906%Si|=8I141U-Ku5*Ga*SN+jmkAJSN z!_Vtk__=r=egbws!rD*3+E2jRPrx2TSo;ZB`w3Y43E0C3Yd-;NKLKk$0eci-?I&RE zCt&R-V2>lL{RFK21g!l8>`8>RpMbTWfVH21J&myT6R`FZu=W$MXA#zZ0@i*4)_wwZ zguUP(4Eqh}@EzdcH^F=1*>8fk-vn>J3Et#G!nWT8Z@&qCKkg@oR7}^f1-H??mEq+I zhW4!){47WxUkkFs*8=D9wZu1kPW$WDCQ;+}A9VX3X({5@k$ycJ4UXkMC$4m;rKbl2 zcx3)hEIrdg+C8*xpX#^c;{v)9Ej&6cU^})#N8OQrJ1h}*sD%e5+77f3Pgn%n0s~64 z86Qfd@q8H?qW;zMPl`rbRAi!n3>BovNd`Gn2+vL~IMsq8PZ{DwA&QJ;h+~6r+~tBJ zEhw^>Ar2Ly$Y+K)PzcX#E(k0uahxHHb5*t*-}s!yw2Xoi$z<8r(|jk$SV~4xQV|E$ z9STH68h|(xfK(Xxek$K9vH-w|08~T)fMW&7sXmhL6+xilp#W6m0DuDlNX3Bf#;CFs z0HFLT3jyWItwaWL@=Q|jJ1B`T3}lpm6s2OI!vwS_9tAy1AibOv;4}d!3QQqS63C+D z6f&IW$QFeYp#mHwsEV>w$ioD(C{%?EM_}Bjm#zY2A}EPjAyY||@u>f;>>>*E~?TjL$R)yF#&R>wP(iDwSZ zJNVa7WL~?-M5%3lyKTaTr8VAJL4CY4i28VE5Uugf3hLvXLDa`PgJ_L+RuEX$GC_kd z&b3U>0E};SLJgB5P-i5l=@y;Of@y@tLg&>HVhU>-Dcwq6(pl6u*qkr-&|XN$(7pq241QnqQli;$bfy9iks z?;^ma@h(Dc8t)=xWxR_3nFvZ^HvT4qY{}>pFqOmbv9N&>_d^zaT0QEb6+dmj!%rLV z@Y4o7{ImfNKW)InPaE*?(*`{Jv;hx4!+=M>U3-NAk064-4?4;9sskRkprviiLuqTk z!?*f?hr;@Rhr-r?hi~-(4~6vs4~4A(58naVSu`+JF~|%x$-AIe?hsE^?9^ zXbpH)w?5z*M18o&i(`JOjuFJo{c9@C=}~z_aq!fQJHep_#Y! z&c#4B4R{V)>S&9`qF5^fUc|L&z>AQZ2D}Ja8So;&rU5TPZW{0+WM#mM0GS9%?#)Ee zJ>W%@sT_&}p4-n~^l6V&M?Czr5f49Y#KTV;@$l0|Jp8l~4?k_h!%rLW@Y6;-{0t)= z{dVmYMm&ND4nHU**Q<_r+(LE4LuqTo!?*f~hr;@Zhr-r~hi~-}4~6v+4~4A}58na< zS}K9U>WGK3+K3m5%x||xyZ~aJyKTe<(i-uspg!UmM190Fh}MW_1@#fnAnGHYL9|9Z zE2xin24S3Qjd%uNe2XIWuGY2DEmagsQk$?vAc@#Q>YlDVyJ(W$d2rS8A3BHA|kt5gu7OV zlcrw#9^@C)q`!v3dLKgp9Tt_%m&T7VvOZZ@pyLhX!jHmif@3r(j=S{F!0zsr11C4M z9N;#$9B##NXi(%qcsZcdJ;UHkB6J{@1u6<< z?Y_l&?XJbLfYYS>Eb1c_rW0aBdh3O5*@!A2z8jBdkgS!s@eR^_b5QN;ArsGbg0}*K2%ol*6%U7KbKJK>+^# z`bH70XBnP72EsED+4mjrBmP?Z<`iT$nBZ+Sz9TEXD~d8NiGs{af>5sVl7OvM60o&O z6q}-Y7v9wfvM7`&wn9mc%{04>Etcfiitl-d+*R39WdY4fiCh>lACp5_*Snw+M3ET? z*2mBkIw2U|DR8;H3{$C7@;qfpOZ1vddqkcM@}eNwc9Bz*yq43HyeJ^NYPDt3)hdxc zfiqUc7nytuwOR!D6<#z^@<0|%y zpJy+r4c&Aq=}huH$agkKzB_G6zB^S(z6U&4MLhg5G9zjTA@Sc$n)!Fr4f!6WZ;FwB zPw^BP$Io+@M;uVZ6n6=l^nqIKf^h(`lbMjEKJp$!ab*w*mQq*bLGh9f=>4>k8stSm zg0n$hL8e&OnvXUU<*&r)%I+K++mB~s1wyO#@ z{Tx{n^+izm5|eJb#I(gq+RD-{$*~m~%8!NDU5a4cq$!)Blntr~VUkwS6Tw$e6W>@_ zOXQ(*>r~9_@?e(>`#+9pyYbwGG!F;E(HC~kEy*r>$oAKJ9d{y5j!!tCUnbxVZL)8{ zNk??4&T;pl(U1DvEOHaA`r)fwETvCG60Sm0S{u0vfrmbH?O$00MH=3TvD@yCwvYQ4 zIk5@|#@Y6Vsgg^96M&-Pn=o2UzFS8d=l}}Mh2?AkQ)sRWC^R=K-{Yr+NxLs$xvL97 z%Cb`7O#t;w@|z#kZn~PGD_6VL4E@`=X5{g%Z3b#*yVeZUCN*uf%`uw0a@yTz-9kix z^ecbgb&HCD@?9%BHb0Tn*;7gN6^+Ldhrbn*l~=BHsQ5P8ti0O2VyVTtaXb4dwP;&H z0OP~~*tHHX@7le*A-0a?NqKXf_!4e$4efPZ+f0!g%g%x4c&sgV*^^&Ir~FQS6WFfI zVP6Kx;Ur6&rgKt443p1faMa-6qr5C?Bqf;u;^@N{8Pk1mx}Th1Z7e>6{Hb&C`RAVX z9qT>+jdSYa0w*@KR2sOTihJ%R96mW9K74bQFtPA@Hofr%G{zj3SJFph_kZ7lIFAy2 zluUSEU*9j*^V>!9?Vf(18|vRyU$K^UB|BZxH|=ksB=-8VCACAQHN2>vaw8nS&~`Uw zDE{&*-3#_w8t)_93C+W#3Cx^tuF?NlMz zh2l9LS)lYhd@Yv~qdChdUU4m5>$SVXRG0qWr)?YzPmU<-TI-^59oSM3^0Am?!;`&h zun&gsQ{wdoqodVcNLm=1X#r))^EM#tLbN?u9avI*P+j&!jb9!gPcEA?%e#o=E5?_I zcHF^vW;{~f;U5muL?(FLWUn_mL8#3B0itN|DEhXd*%DjUtubdH#d9Om=8B)Ycu?0( zXO>HP5*<&LjwFDQM>E*jw|j|MevS9JXOxKW+dUieB4{rG zebAgHH_J5=T~g*M-}lJjxtahjAzXc^J&w+o&Sg=nw$)GJbd%uTR^TBIQ7Kw(nD_9CxYVl-H_m8 zvd9XNE@6EI8omD`-<6CW(hjz(;8t;Qr_f-zEN{6Cr6h#Hloq-L-tMykFW%Q_$;v9U zWKbzBi}wjFhw$ULk8`wA(50kos@Qpy#{IV1yRfH)%|-2w`1M zO6?=`FYu;>CBj9{g=C^Sv*WJyxwra-Ms=D!eS@P$ru55P4qt{=O=?s}vQ2RfC8kAP z80wQL=VmTvQ4W$uH<^iQYRe+;l^X3vjkee+h46g~^GIeFW!^{(Nd+4HV`55C3>5&a zJ}^&QsU6D;4!NW~8^9u61qZIOS6;-XgXmi&h1L=UFAgI{gYmpQk|-g8g4}fTf+`tW zu~cqUs2eB|;b*KkyT|Kl(Tl>%x_-i%xqv4+;Eqz{05kNm#}Qf!%W+l# z8dIEG#h=+&ZOKr`n<>UI<(10Q$Gr)-54mRvbOaWS?HX%ZPK6kt&ERTl5d?45* zi}I=`iHm4Vl(k}13H{r3zLNycP#$9g`$BiZmkyjYhJqXU>UJCM2t%(XtNvxv%xG#D z2P7NH9|yiXB+&(%)O{|a9-YknN>pQn=tS$Ohd(`+PP z&2k~}PxHA;F4%J&>ibCbc7um9IFVD3;FrQ6UF=2%NOP<=+8qCG2{5Q~HzKm0uwbU& z9ub=s^HeaI%^R}f@88OVq zyT-$~Q!4X~mCCag&CTo1nIx!9x!~ROL%I|_VE7#upg8T>b?Gk#5#-`2DlU;Fi|&)? z+M|Ur?X0{!KDihjpYF6pkyp;>7Qe%D{65m!EpKeut9&dnx4n9_=oF_CsgH=3Wjmry zu6okjR{Ky;Q2S8k)INMOl@i?!pS>n#MOGtGd#%`3dn>S7UahUnH&!aQy4qr@_L?7= z)jp8#l`K*Us<)&We-c$rLz~mXQ<`mVzww+`PN=RbxAHJmZu{6) zZjA*Yu@-Da*Ra*QarL!>MoF*PKWlA-I8oYd0yNb(YbMgQ_a1MRc50! zPv04#t%hwj?WxV^aC(!I!J!dbwe67fbaL!w7rI)ro>ze{);C?CiJyqfsrTnyqJetJ zRnl=K;!T{cZ86#L@>cy<=bU0y_ndRJrKw>fYxgE?hEZ%-=N7h3lP!vjTTFPek;z|Z z7qg6$h4=OP<86cM3fe>LuZJrOwsbVxE4G>#ej=pc4<2}dXxq^)&Ag0ON}m62)D(*R zcvUF2nmS;a2FMaMw{2r5m0~wZ`RNJq%HY3SGs%{A83pq`*@I_3R&%(vQ`IJZETKY9 zc>5A>;15cR_kc#K);#|&&-MC+vXToB7w9A}CLyY#z(GXQ&7Dd?bXWG8D zLzD6`HJMU-JHNDJ7tW>!$4BS-sy#n&{#wuGe|ZdQ3tiNJkubHE?LRb(Q|HSGf`Gz? zN9`d^Ow1|VL?SxIFA-|O9ku!v4DC=l4z;pb|GD_HcV^1H$8Zh1?OhU3ii z{rg2jlDFF3WH-n3FQa@iqkk#!c7M-d-hqaqq9qNa>R`lgRttk4p{*?7``fdOi;P>a@Au;9@d+-g*7<4V#%P!X|PZ6fMM@sydg zNFkGI0a=0P5#J4t=+|8~QeifWDv$5&Z^pSM&uG0ewlP5xC)!bdIJMr$^y^ z6h(13oiv9!%qteJK=#QAT|aq28I)(Of!VjZ-791_@rQ?Jv%~OekNLeb>`Ed!h(!5m zXy~we>yXX!#DMi{RFbOQD`ZkFC|-f*5#??yXwg?&%(Kx7{3F zOouai-pNnw505WSXA`j-LgBTK|8}ybzrAp{-1CwF>_gqk39OscgVDus7GitU#PO`^ zgJZE##o{%?J~`>>CodC&^3pIc`&Ktuh3qE2nVy}DE;Hh1N2hqv zI3?cNBaPUdh7R*JWTw$#koq;MN7aZGGN~5yt-$k$a)UK1;sT0@zAZn8UJ7f5V(8l_ z0{Vh3MD$v?0et~QK%bati{Vzfp#cM9i&i9|g~Z%jEm-M>7V1X7t>tBQZ`JB{FIV-u zEoXLyce`7bb9iuhphL62?=RY^U!26{ix-l@cym)A`&74h0qiDwdUi0}&zBLC>HgV1 zy`2r?{saVcSiANmHFo(JRl92I0_d3;RLz@dj&FmZ3wRqr#NCouq;Zdw;rBcM0?b!y{i-wJ)*wzo8|%(Sgm-Lw(U`n_3* zuFMO^U+Iw$!Z)b2>2@sJ07l~G(PVv_-9e5h+l-zw<-CtbK*Dt<} z(0e{^14&n!dg;YI@+#c;%4y`x1g{6%)!2CFm$gvtLTe#keeRLYB7;qT+1~)sU5u~; zw2RQ9&@^u4VqLtL+^*v5%zW(k!+bTrm@nw&E)wY=dus%w`YD$kF#lXMkL$aD*u!g{ znB|8@&JNlQBU%y~MmC>9gp6J>7>4JMLu#N8&Bgcgwc{9e$}v;9qb@b`_gCw^UL-u_ zZ6{>paVMC$Ne4c==Nq~=O6A}? zt}(|92|oHwlR^ybUPcJM;s6`6*>Y@#`gMx>p^KQDP1sg?dIQEj_n5r&Eo{afDtd^= zaNgTikyxf@!7}Q^Lw^Tw-Q3(q49Ptkaw6vvh!t+y;M?%rY=P}2J{ah7rHqd0-imo> za-qgBPO41VJQj1Ln3e=qf(KDLeYsyn;U6yeg-GyW3c9ZqPyT#{tC-xueN96ZI8uQ( z^9tc6F5p4#QBV*|7VD5*|LBA>qj2-_>0*96wlE~Lm-HF#2?iUD(;A<#L@bY(IS@~yT&STGGe|NMbgfV7@@_GIH_05LiJIa) z_y+QH0slQlc+*wsaxb~}cpDLOz@wAV;la5bN+7zzKOcXyq{rh+RM?~_#6AT2ROL%S zG1kofG5t%pFTK9hgu5wLom;+}>}Bi-1!ZbtG0%!@#zyK}q|Ty4_kVcc)qx9i08%@#e?ze{d_k5_5b=UC3yJ@vPP^Z zAaC&d`SfnNT3)UP@5!cdckgv`!>KTOzwBL37OUpXc{_IKageR!*%_L5+KSsNQmpgD?|Bj~jy9tzWtUU<`v zxKZsI^C0$#Nf9kz?8>4?<3tI(ra7`Q)sf-eMce)@U-ul$-Oy7nO)yNq7((Mp`4dY+;Qx z`b^PiPa`QpniEjgP{P=ArvgcVV}TnFRH!X?#1oSioS%dQo-lb|=2l|6V?26{DPe^z zIAqMh7e^7}z&6_kG_(}T@X#lRs6uyG1hsE1Rs+Pr$qENos8%bbaiB-q<4+UCy z{pp&czZs*=L3HFNfl}^Y;yqt1;q3yIxNN-9QdgF{`dPJ6N>P`TmZm@*IEIWNb(#HS z)N|I67Krk0C}wGA6HWJ4Ox!^{Pcw)*CYM?jv=LDiJRk2;WU^Pu?tDW(y734r95x#Z zXeLSHCwj;Ew!Kuj*_56we4aUkg1gIbIWN-koQ9<}deC-As!eReEiYdh0jff9<7~T! zMoIyrBc?@YG62@RU&@hBHm(%WcCnk))p22iviYH>CA!uyoiXqe$g4FhwWTIKa(y-` zo+zk)zhABAIK!C*Um-Vpor93wZJa(}(*hi#wWDgPZL*J74Yo9qYtd_Bz|16j&Zi~P zX`Ps|m$o&GG(5#aQn($%D9(mgQYDUB4b8y{i1*oAZujN$f}? zqOdwlcP-+R#AOkt-GwaxiyiUXzopb>u}!{itCwu| zXfu%$&3a0RdjB^kCfW|vXlo}z^9U>Kae3%+X#cm6)5^5wLGm6LStfhgDD*Yxj5^^= z!T~Dv&_Y7;DF?}$

      - /// Indicates fraud. - /// - const FRAUD = 'FRAUD'; - - /// - /// Indicates a false positive. - /// - const FALSE_POSITIVE = 'FALSEPOSITIVE'; - - /// - /// Indicates desired good is out of stock. - /// - const OUT_OF_STOCK = 'OUTOFSTOCK'; - - /// - /// Indicates desired good is in of stock. - /// - const IN_STOCK = 'INSTOCK'; - - /// - /// Indicates another reason. - /// - const OTHER = 'OTHER'; - - /// - /// Indicates reason was not given. - /// - const NOT_GIVEN = 'NOTGIVEN'; -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/RecurringSequence.php b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/RecurringSequence.php deleted file mode 100644 index 83397af..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/RecurringSequence.php +++ /dev/null @@ -1,12 +0,0 @@ -responseCode = $responseCode; - $this->responseMessage = $responseMessage; - - parent::__construct($message, $innerException); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Exceptions/NotImplementedException.php b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Exceptions/NotImplementedException.php deleted file mode 100644 index a0d673e..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Exceptions/NotImplementedException.php +++ /dev/null @@ -1,16 +0,0 @@ - - */ - public $supplementaryData; - - /** - * Instantiates a new `HostedPaymentData` object. - * - * @return - */ - public function __construct() - { - $this->supplementaryData = []; - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/IRecurringEntity.php b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/IRecurringEntity.php deleted file mode 100644 index 8f9cbd9..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/IRecurringEntity.php +++ /dev/null @@ -1,54 +0,0 @@ - - */ - public static function findAll(); - - /** - * The current record should be updated. - * - * Any modified properties will be persisted with the gateway. - * - * @throws ApiException Thrown when the record cannot be updated. - * @return - */ - public function saveChanges(); -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/MerchantDataCollection.php b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/MerchantDataCollection.php deleted file mode 100644 index 3f53e53..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/MerchantDataCollection.php +++ /dev/null @@ -1,190 +0,0 @@ - - */ - private $collection; - - /** - * @return string - */ - public function get($key) - { - foreach ($this->collection as $kvp) { - if ($kvp->getKey() == $key && $kvp->isVisible()) { - return $kvp->getValue(); - } - } - return null; - } - - /** - * @return array - */ - public function getKeys() - { - $keys = []; - foreach ($this->collection as $kvp) { - if ($kvp->isVisible()) { - array_push($keys, $kvp->getKey()); - } - } - return $keys; - } - - /** - * @return int - */ - public function count() - { - $count = 0; - foreach ($this->collection as $kvp) { - if ($kvp->isVisible()) { - $count++; - } - } - return $count; - } - - /** - * @return int - */ - private function indexOf($key) - { - for ($i=0; $icollection); $i++) { - if ($this->collection[$i]->getKey() == $key) { - return $i; - } - } - return -1; - } - - /** - * @return array - */ - public function getHiddenValues() - { - $list = []; - foreach ($this->collection as $kvp) { - if (!$kvp->isVisible()) { - array_push($list, $kvp); - } - } - return $list; - } - - public function __construct() - { - $this->collection = []; - } - - /** - * @return void - */ - public function add($key, $value, $visible = true) - { - if ($this->hasKey($key)) { - if ($visible) { - throw new ApiException(sprintf('Key %s already exists in the collection.', $key)); - } else { - unset($this->collection[$this->indexOf($key)]); - $this->collection = array_values($this->collection); - } - } - - $kvp = new MerchantKVP(); - $kvp->setKey($key); - $kvp->setValue($value); - $kvp->setVisible($visible); - - array_push($this->collection, $kvp); - } - - /** - * @return string - */ - public function getValue($key, $converter = null) - { - foreach ($this->collection as $kvp) { - if ($kvp->getKey() == $key) { - if ($converter != null) { - return $converter($kvp->getValue()); - } else { - return $kvp->getValue(); - } - } - } - return null; - } - - /** - * @return bool - */ - public function hasKey($key) - { - return $this->getValue($key) != null; - } - - /** - * @return void - */ - public function mergeHidden($oldCollection) - { - foreach ($oldCollection->getHiddenValues() as $kvp) { - if (!$this->hasKey($kvp->getKey())) { - array_push($this->collection, $kvp); - } - } - } - - /** - * @return MerchantDataCollection - */ - public static function parse($kvpString, $decoder = null) - { - $collection = new MerchantDataCollection(); - - $decryptedKvp = (string)base64_decode($kvpString); - if ($decoder != null) { - $decryptedKvp = $decoder($decryptedKvp); - } - - $merchantData = explode('|', $decryptedKvp); - foreach ($merchantData as $kvp) { - $data = explode(':', $kvp); - $collection->add($data[0], $data[1], (bool)$data[2]); - } - - return $collection; - } - - /** - * @return string - */ - public function toString($encoder = null) - { - $sb = ''; - - foreach ($this->collection as $kvp) { - $sb .= sprintf('%s:%s:%s|', $kvp->getKey(), $kvp->getValue(), $kvp->isVisible()); - } - - $pos = strrpos($sb, '|'); - $sb = substr($sb, 0, $pos) . substr($sb, $pos+1); - - try { - $formatted = (string)$sb; - if ($encoder != null) { - $formatted = $encoder($formatted); - } - - return (string)base64_encode($formatted); - } catch (UnsupportedEncodingException $e) { - return null; - } - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/MerchantKVP.php b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/MerchantKVP.php deleted file mode 100644 index cf43e59..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/MerchantKVP.php +++ /dev/null @@ -1,69 +0,0 @@ -key; - } - - /** - * @return void - */ - public function setKey($key) - { - $this->key = $key; - } - - /** - * @return string - */ - public function getValue() - { - return $this->value; - } - - /** - * @return void - */ - public function setValue($value) - { - $this->value = $value; - } - - /** - * @return bool - */ - public function isVisible() - { - return $this->visible; - } - - /** - * @return void - */ - public function setVisible($visible) - { - $this->visible = $visible; - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/RecurringEntity.php b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/RecurringEntity.php deleted file mode 100644 index d11dd02..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/RecurringEntity.php +++ /dev/null @@ -1,110 +0,0 @@ - - */ -abstract class RecurringEntity implements IRecurringEntity -{ - /** - * All resource should be supplied a merchant-/application-defined ID. - * - * @var string - */ - public $id; - - /** - * All resources should be supplied a gateway-defined ID. - * - * @var string - */ - public $key; - - /** - * {@inheritDoc} - */ - public function create() - { - return RecurringService::create($this); - } - - /** - * {@inheritDoc} - */ - public function delete($force = false) - { - try { - return RecurringService::delete($this, $force); - } catch (ApiException $exc) { - throw new ApiException('Failed to delete record, see inner exception for more details', $exc); - } - } - - /** - * {@inheritDoc} - */ - public static function find($id) - { - $client = ServicesContainer::instance()->getRecurringClient(); - if (!$client->supportsRetrieval) { - throw new UnsupportedTransactionException(); - } - - $identifier = static::getIdentifierName(); - $response = RecurringService::search(static::class) - ->addSearchCriteria($identifier, $id) - ->execute(); - $entity = isset($response[0]) ? $response[0] : null; - - if ($entity !== null) { - return RecurringService::get($entity); - } - - return null; - } - - /** - * {@inheritDoc} - */ - public static function findAll() - { - $client = ServicesContainer::instance()->getRecurringClient(); - if (!$client->supportsRetrieval) { - throw new UnsupportedTransactionException(); - } - - return RecurringService::search(static::class)->execute(); - } - - /** - * {@inheritDoc} - */ - public function saveChanges() - { - try { - return RecurringService::edit($this); - } catch (ApiException $exc) { - throw new ApiException('Update failed, see inner exception for more details', $exc); - } - } - - protected static function getIdentifierName() - { - if (static::class === Customer::class) { - return 'customerIdentifier'; - } elseif (static::class === RecurringPaymentMethod::class) { - return 'paymentMethodIdentifier'; - } elseif (static::class === Schedule::class) { - return 'scheduleIdentifier'; - } - return ''; - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Reporting/AltPaymentData.php b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Reporting/AltPaymentData.php deleted file mode 100644 index 1c7587e..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Reporting/AltPaymentData.php +++ /dev/null @@ -1,38 +0,0 @@ - - */ - public $cardTypes; - - /** - * @var string - */ - public $checkFirstName; - - /** - * @var string - */ - public $checkLastName; - - /** - * @var string - */ - public $checkName; - - /** - * @var string - */ - public $checkNumber; - - /** - * @var string - */ - public $clerkId; - - /** - * @var string - */ - public $clientTransactionId; - - /** - * @var string - */ - public $customerId; - - /** - * @var string - */ - public $displayName; - - /** - * @var DateTime - */ - public $endDate; - - /** - * @var string - */ - public $giftCurrency; - - /** - * @var string - */ - public $giftMaskedAlias; - - /** - * @var bool - */ - public $fullyCaptured; - - /** - * @var string - */ - public $invoiceNumber; - - /** - * @var string - */ - public $issuerResult; - - /** - * @var string - */ - public $issuerTransactionId; - - /** - * @var bool - */ - public $oneTime; - - /** - * @var string - */ - public $paymentMethodKey; - - /** - * @var IEnumerable - */ - public $paymentTypes; - - /** - * @var string - */ - public $referenceNumber; - - /** - * @var IEnumerable - */ - public $transactionType; - - /** - * @var decimal - */ - public $settlementAmount; - - /** - * @var string - */ - public $scheduleId; - - /** - * @var string - */ - public $siteTrace; - - /** - * @var DateTime - */ - public $startDate; - - /** - * @var string - */ - public $uniqueDeviceId; - - /** - * @var string - */ - public $username; - - public function __construct(TransactionReportBuilder $reportBuilder = null) - { - $this->reportBuilder = $reportBuilder; - } - - public function and($criteria, $value) - { - if (property_exists($this, $criteria)) { - $this->{$criteria} = $value; - } - return $this; - } - - public function execute($configName = "default") - { - if (($this->reportBuilder) === null) { - throw new ArgumentException( - sprintf( - 'ReportBuilder is null', - $this->reportBuilder, - static::class - ) - ); - } - return $this->reportBuilder->execute($configName); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Reporting/TransactionSummary.php b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Reporting/TransactionSummary.php deleted file mode 100644 index 4b85dc9..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Reporting/TransactionSummary.php +++ /dev/null @@ -1,386 +0,0 @@ -customerKey = $customerKey; - $this->paymentKey = $paymentKey; - } - - /** - * The total amount for the schedule (`Schedule::$amount` + `Schedule::$taxAmount`). - * - * @return float|string|null - */ - public function getTotalAmount() - { - return $this->amount + $this->taxAmount; - } - - /** - * Sets the schedule's amount. - * - * @param float|string $value The amount - * - * @return Schedule - */ - public function withAmount($value) - { - $this->amount = $value; - return $this; - } - - /** - * Sets the schedule's currency. - * - * @param string $value The currency - * - * @return Schedule - */ - public function withCurrency($value) - { - $this->currency = $value; - return $this; - } - - /** - * Sets the schedule's customer. - * - * @param string $value The customer's key - * - * @return Schedule - */ - public function withCustomerKey($value) - { - $this->customerKey = $value; - return $this; - } - - /** - * Sets the schedule's description. - * - * @param string $value The description - * - * @return Schedule - */ - public function withDescription($value) - { - $this->description = $value; - return $this; - } - - /** - * Sets the schedule's device ID. - * - * @param integer $value The device ID - * - * @return Schedule - */ - public function withDeviceId($value) - { - $this->deviceId = $value; - return $this; - } - - /** - * Sets whether the schedule should send email notifications. - * - * @param boolean $value The email notification flag - * - * @return Schedule - */ - public function withEmailNotification($value) - { - $this->emailNotification = $value; - return $this; - } - - /** - * Sets when the schedule should email receipts. - * - * @param EmailReceipt $value When the schedule should email receipts - * - * @return Schedule - */ - public function withEmailReceipt($value) - { - $this->emailReceipt = $value; - return $this; - } - - /** - * Sets the schedule's end date. - * - * @param DateTime $value The end date - * - * @return Schedule - */ - public function withEndDate($value) - { - $this->endDate = $value; - return $this; - } - - /** - * Sets the schedule's frequency. - * - * @param string $value The frequency - * - * @return Schedule - */ - public function withFrequency($value) - { - $this->frequency = $value; - return $this; - } - - /** - * Sets the schedule's invoice number. - * - * @param string $value The invoice number - * - * @return Schedule - */ - public function withInvoiceNumber($value) - { - $this->invoiceNumber = $value; - return $this; - } - - /** - * Sets the schedule's name. - * - * @param string $value The name - * - * @return Schedule - */ - public function withName($value) - { - $this->name = $value; - return $this; - } - - /** - * Sets the schedule's number of payments. - * - * @param integer $value The number of payments - * - * @return Schedule - */ - public function withNumberOfPayments($value) - { - $this->numberOfPayments = $value; - return $this; - } - - /** - * Sets the schedule's purchase order (PO) number. - * - * @param string $value The purchase order (PO) number - * - * @return Schedule - */ - public function withPoNumber($value) - { - $this->poNumber = $value; - return $this; - } - - /** - * Sets the schedule's payment method. - * - * @param string $value The payment method's key - * - * @return Schedule - */ - public function withPaymentKey($value) - { - $this->paymentKey = $value; - return $this; - } - - /** - * Sets the schedule's recurring schedule. - * - * @param PaymentSchedule $value The recurring schedule - * - * @return Schedule - */ - public function withPaymentSchedule($value) - { - $this->paymentSchedule = $value; - return $this; - } - - /** - * Sets the schedule's reprocessing count. - * - * @param integer $value The reprocessing count - * - * @return Schedule - */ - public function withReprocessingCount($value) - { - $this->reprocessingCount = $value; - return $this; - } - - /** - * Sets the schedule's start date. - * - * @param DateTime $value The start date - * - * @return Schedule - */ - public function withStartDate($value) - { - $this->startDate = $value; - return $this; - } - - /** - * Sets the schedule's status. - * - * @param string $value The new status - * - * @return Schedule - */ - public function withStatus($value) - { - $this->status = $value; - return $this; - } - - /** - * Sets the schedule's tax amount. - * - * @param float|string $value The tax amount - * - * @return Schedule - */ - public function withTaxAmount($value) - { - $this->taxAmount = $value; - return $this; - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/StoredCredential.php b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/StoredCredential.php deleted file mode 100644 index 20133f0..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/StoredCredential.php +++ /dev/null @@ -1,19 +0,0 @@ -amount; - } - - /** - * @return void - */ - public function setAmount($value) - { - $this->amount = $value; - $this->getMerchantData()->add('amount', $this->amount, false); - } - - /** - * Consumer authentication (3DSecure) verification value - * - * @var string - */ - public $cavv; - - /** - * @var bool - */ - public $challengeMandated; - - /** - * @var string - */ - public $criticalityIndicator; - - /** - * @var string - */ - private $currency; - - /** - * @return string - */ - public function getCurrency() - { - return $this->currency; - } - - /** - * @return string - */ - public function setCurrency($value) - { - $this->currency = $value; - $this->merchantData->add('currency', $this->currency, false); - } - - /** - * @var string - */ - public $directoryServerTransactionId; - - /** - * @var string - */ - public $directoryServerEndVersion; - - /** - * @var string - */ - public $directoryServerStartVersion; - - /** - * Consumer authentication (3DSecure) electronic commerce indicator - * - * @var int - */ - public $eci; - - /** - * The enrollment status - * - * @var string - */ - public $enrolled; - - /** - * The URL of the Issuing Bank's ACS - * - * @var string - */ - public $issuerAcsUrl; - - /** - * A KVP collection of merchant supplied data - * - * @var MerchantDataCollection - */ - private $merchantData; - - /** - * @return MerchantDataCollection - */ - public function getMerchantData() - { - if (empty($this->merchantData)) { - $this->merchantData = new MerchantDataCollection(); - } - return $this->merchantData; - } - - /** - * @return void - */ - public function setMerchantData($merchantData) - { - if (!empty($this->merchantData)) { - $merchantData->mergeHidden($this->merchantData); - } - - $this->merchantData = $merchantData; - if ($this->merchantData->hasKey('amount')) { - $this->amount = $this->merchantData->getValue('amount'); - } - if ($this->merchantData->hasKey('currency')) { - $this->currency = $this->merchantData->getValue('currency'); - } - if ($this->merchantData->hasKey('orderId')) { - $this->orderId = $this->merchantData->getValue('orderId'); - } - if ($this->merchantData->hasKey('version')) { - $this->version = $this->merchantData->getValue('version'); - } - } - - /** - * @var string - */ - public $messageCategory; - - /** - * @var string - */ - public $messageExtensionId; - - /** - * @var string - */ - public $messageExtensionName; - - /** - * @var string - */ - public $messageVersion; - - /** - * The order ID used for the initial transaction - * - * @var string - */ - private $orderId; - - /** - * @return string - */ - public function getOrderId() - { - return $this->orderId; - } - - /** - * @return void - */ - public function setOrderId($value) - { - $this->orderId = $value; - $this->merchantData->add('orderId', $this->orderId, false); - } - - /** - * The Payer Authentication Request returned by the Enrollment Server. - * Must be sent to the Issuing Bank's ACS (Access Control Server) URL. - * - * @var string - */ - public $payerAuthenticationRequest; - - /** - * Consumer authentication (3DSecure) source - * - * @var string - */ - public $paymentDataSource; - - /** - * Consumer authentication (3DSecure) type. - * Default value is "3DSecure" - * - * @var string - */ - public $paymentDataType; - - /** - * @var string - */ - public $sdkInterface; - - /** - * @var enum - */ - public $sdkUiType; - - /** - * @var string - */ - public $serverTransactionId; - - /** - * @var string - */ - public $status; - - /** - * @var string - */ - public $statusReason; - - /** @var Secure3dVersion */ - private $version; - - /** @return Secure3dVersion */ - public function getVersion() - { - return $this->version; - } - - /** @return void */ - public function setVersion($version) - { - $this->version = $version; - $this->merchantData->add('version', $version, false); - } - - /** - * Consumer authentication (3DSecure) transaction ID - * - * @var string - */ - public $xid; - - public function __construct() - { - $this->paymentDataType = '3DSecure'; - if (empty($this->merchantData)) { - $this->merchantData = new MerchantDataCollection(); - } - } - - /** - * @return void - */ - public function merge(ThreeDSecure $secureEcom) - { - if (!empty($secureEcom)) { - $this->acsTransactionId = $this->mergeValue($this->acsTransactionId, $secureEcom->acsTransactionId); - $this->acsEndVersion = $this->mergeValue($this->acsEndVersion, $secureEcom->acsEndVersion); - $this->acsStartVersion = $this->mergeValue($this->acsStartVersion, $secureEcom->acsStartVersion); - $this->algorithm = $this->mergeValue($this->algorithm, $secureEcom->algorithm); - $this->amount = $this->mergeValue($this->amount, $secureEcom->amount); - $this->authenticationSource = $this->mergeValue($this->authenticationSource, $secureEcom->authenticationSource); - $this->authenticationType = $this->mergeValue($this->authenticationType, $secureEcom->authenticationType); - $this->authenticationValue = $this->mergeValue($this->authenticationValue, $secureEcom->authenticationValue); - $this->cardHolderResponseInfo = $this->mergeValue($this->cardHolderResponseInfo, $secureEcom->cardHolderResponseInfo); - $this->cavv = $this->mergeValue($this->cavv, $secureEcom->cavv); - $this->challengeMandated = $this->mergeValue($this->challengeMandated, $secureEcom->challengeMandated); - $this->criticalityIndicator = $this->mergeValue($this->criticalityIndicator, $secureEcom->criticalityIndicator); - $this->currency = $this->mergeValue($this->currency, $secureEcom->currency); - $this->directoryServerTransactionId = $this->mergeValue($this->directoryServerTransactionId, $secureEcom->directoryServerTransactionId); - $this->directoryServerEndVersion = $this->mergeValue($this->directoryServerEndVersion, $secureEcom->directoryServerEndVersion); - $this->directoryServerStartVersion = $this->mergeValue($this->directoryServerStartVersion, $secureEcom->directoryServerStartVersion); - $this->eci = $this->mergeValue($this->eci, $secureEcom->eci); - $this->enrolled = $this->mergeValue($this->enrolled, $secureEcom->enrolled); - $this->issuerAcsUrl = $this->mergeValue($this->issuerAcsUrl, $secureEcom->issuerAcsUrl); - $this->messageCategory = $this->mergeValue($this->messageCategory, $secureEcom->messageCategory); - $this->messageExtensionId = $this->mergeValue($this->messageExtensionId, $secureEcom->messageExtensionId); - $this->messageExtensionName = $this->mergeValue($this->messageExtensionName, $secureEcom->messageExtensionName); - $this->messageVersion = $this->mergeValue($this->messageVersion, $secureEcom->messageVersion); - $this->orderId = $this->mergeValue($this->orderId, $secureEcom->orderId); - $this->payerAuthenticationRequest = $this->mergeValue($this->payerAuthenticationRequest, $secureEcom->payerAuthenticationRequest); - $this->paymentDataSource = $this->mergeValue($this->paymentDataSource, $secureEcom->paymentDataSource); - $this->paymentDataType = $this->mergeValue($this->paymentDataType, $secureEcom->paymentDataType); - $this->sdkInterface = $this->mergeValue($this->sdkInterface, $secureEcom->sdkInterface); - $this->sdkUiType = $this->mergeValue($this->sdkUiType, $secureEcom->sdkUiType); - $this->serverTransactionId = $this->mergeValue($this->serverTransactionId, $secureEcom->serverTransactionId); - $this->status = $this->mergeValue($this->status, $secureEcom->status); - $this->statusReason = $this->mergeValue($this->statusReason, $secureEcom->statusReason); - $this->version = $this->mergeValue($this->version, $secureEcom->version); - $this->xid = $this->mergeValue($this->xid, $secureEcom->xid); - } - } - - /** - * @return mixed - */ - public function mergeValue($currentValue, $mergeValue) - { - if ($mergeValue == null) { - return $currentValue; - } - return $mergeValue; - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Transaction.php b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Transaction.php deleted file mode 100644 index ffae75b..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Transaction.php +++ /dev/null @@ -1,461 +0,0 @@ -transactionReference = new TransactionReference(); - $txn->transactionReference->transactionId = $transactionId; - $txn->transactionReference->paymentMethodType = $paymentMethodType; - $txn->transactionReference->orderId = $orderId; - return $txn; - } - - /** - * Creates an additional authorization against the original transaction. - * - * @param string|float $amount The additional amount to authorize - * - * @return AuthorizationBuilder - */ - public function additionalAuth($amount = null) - { - return (new AuthorizationBuilder(TransactionType::AUTH)) - ->withPaymentMethod($this->transactionReference) - ->withAmount($amount); - } - - /** - * Captures the original transaction. - * - * @param string|float $amount The amount to capture - * - * @return ManagementBuilder - */ - public function capture($amount = null) - { - return (new ManagementBuilder(TransactionType::CAPTURE)) - ->withPaymentMethod($this->transactionReference) - ->withAmount($amount); - } - - /** - * Edits the original transaction. - * - * @return ManagementBuilder - */ - public function edit() - { - $builder = (new ManagementBuilder(TransactionType::EDIT)) - ->withPaymentMethod($this->transactionReference); - - if ($this->commercialIndicator !== null) { - $builder = $builder->withModifier(TransactionModifier::LEVEL_II); - } - - return $builder; - } - - /** - * Places the original transaction on hold. - * - * @return ManagementBuilder - */ - public function hold() - { - return (new ManagementBuilder(TransactionType::HOLD)) - ->withPaymentMethod($this->transactionReference); - } - - /** - * Refunds/returns the original transaction. - * - * @param string|float $amount The amount to refund/return - * - * @return ManagementBuilder - */ - public function refund($amount = null) - { - return (new ManagementBuilder(TransactionType::REFUND)) - ->withPaymentMethod($this->transactionReference) - ->withAmount($amount); - } - - /** - * Releases the original transaction from a hold. - * - * @return ManagementBuilder - */ - public function release() - { - return (new ManagementBuilder(TransactionType::RELEASE)) - ->withPaymentMethod($this->transactionReference); - } - - /** - * Reverses the original transaction. - * - * @param string|float $amount The original authorization amount - * - * @return ManagementBuilder - */ - public function reverse($amount = null) - { - return (new ManagementBuilder(TransactionType::REVERSAL)) - ->withPaymentMethod($this->transactionReference) - ->withAmount($amount); - } - - /** - * Voids the original transaction. - * - * @return ManagementBuilder - */ - public function void() - { - return (new ManagementBuilder(TransactionType::VOID)) - ->withPaymentMethod($this->transactionReference); - } - - public function __get($name) - { - switch ($name) { - case 'authorizationCode': - if ($this->transactionReference !== null) { - return $this->transactionReference->authCode; - } - return null; - case 'clientTransactionId': - if ($this->transactionReference !== null) { - return $this->transactionReference->clientTransactionId; - } - return null; - case 'orderId': - if ($this->transactionReference !== null) { - return $this->transactionReference->orderId; - } - return null; - case 'paymentMethodType': - if ($this->transactionReference !== null) { - return $this->transactionReference->paymentMethodType; - } - return PaymentMethodType::CREDIT; - case 'transactionId': - if ($this->transactionReference !== null) { - return $this->transactionReference->transactionId; - } - return null; - default: - break; - } - - if (property_exists($this, $name)) { - return $this->{$name}; - } - - throw new ArgumentException(sprintf('Property `%s` does not exist on Transaction', $name)); - } - - public function __isset($name) - { - return in_array($name, [ - 'transactionId', - 'orderId', - 'authorizationId', - 'paymentMethodType', - 'clientTransactionId', - ]) || isset($this->{$name}); - } - - public function __set($name, $value) - { - switch ($name) { - case 'authorizationCode': - if (!$this->transactionReference instanceof TransactionReference) { - $this->transactionReference = new TransactionReference(); - } - $this->transactionReference->authCode = $value; - return; - case 'clientTransactionId': - if (!$this->transactionReference instanceof TransactionReference) { - $this->transactionReference = new TransactionReference(); - } - $this->transactionReference->clientTransactionId = $value; - return; - case 'orderId': - if (!$this->transactionReference instanceof TransactionReference) { - $this->transactionReference = new TransactionReference(); - } - $this->transactionReference->orderId = $value; - return; - case 'paymentMethodType': - if (!$this->transactionReference instanceof TransactionReference) { - $this->transactionReference = new TransactionReference(); - } - $this->transactionReference->paymentMethodType = $value; - return; - case 'transactionId': - if (!$this->transactionReference instanceof TransactionReference) { - $this->transactionReference = new TransactionReference(); - } - $this->transactionReference->transactionId = $value; - return; - default: - break; - } - - if (property_exists($this, $name)) { - return $this->{$name} = $value; - } - - throw new ArgumentException(sprintf('Property `%s` does not exist on Transaction', $name)); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/TransactionSummary.php b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/TransactionSummary.php deleted file mode 100644 index fca931c..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/TransactionSummary.php +++ /dev/null @@ -1,142 +0,0 @@ - - */ - public $headers; - - /** - * @var integer|string - */ - public $timeout; - - /** - * @var string - */ - public $serviceUrl; - - /** - * @var array - */ - public $curlOptions; - - /** - * @param string $contentType - * - * @return - */ - public function __construct($contentType) - { - $this->headers = []; - $this->contentType = $contentType; - } - - /** - * @return array - */ - protected function getHttpOptions() - { - return []; - } - - /** - * Uses cURL to communicate with the gateway service - * - * @param string $verb - * @param string $endpoint - * @param string|null $data - * @param array|null $queryStringParams - * - * @throws \Exception - * @return GatewayResponse - */ - protected function sendRequest( - $verb, - $endpoint, - $data = null, - array $queryStringParams = null, - $headers = [] - ) { - try { - $queryString = $this->buildQueryString($queryStringParams); - $request = curl_init($this->serviceUrl . $endpoint . $queryString); - - $this->headers = array_merge($this->headers, $headers, [ - 'Content-Type' => sprintf('%s', $this->contentType), - 'Content-Length' => $data === null ? 0 : strlen($data), - ]); - - $headers = []; - foreach ($this->headers as $key => $value) { - $headers[] = $key . ': '. $value; - } - - curl_setopt($request, CURLOPT_CONNECTTIMEOUT, $this->timeout); - curl_setopt($request, CURLOPT_TIMEOUT, $this->timeout); - curl_setopt($request, CURLOPT_RETURNTRANSFER, true); - curl_setopt($request, CURLOPT_SSL_VERIFYPEER, false); //true,); - curl_setopt($request, CURLOPT_SSL_VERIFYHOST, false); //2,); - curl_setopt($request, CURLOPT_CUSTOMREQUEST, strtoupper($verb)); - curl_setopt($request, CURLOPT_POSTFIELDS, $data); - curl_setopt($request, CURLOPT_HTTPHEADER, $headers); - curl_setopt($request, CURLOPT_PROTOCOLS, CURLPROTO_HTTPS); - curl_setopt($request, CURLOPT_VERBOSE, false); - curl_setopt($request, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2); - - if ($this->curlOptions != null && !empty($this->curlOptions)) { - curl_setopt_array($request, $this->curlOptions); - } - - $curlResponse = curl_exec($request); - $curlInfo = curl_getinfo($request); - $curlError = curl_errno($request); - - $response = new GatewayResponse(); - $response->statusCode = $curlInfo['http_code']; - $response->rawResponse = $curlResponse; - return $response; - } catch (\Exception $e) { - throw new \Exception( - "Error occurred while communicating with gateway.", - $e->getCode(), - $e - ); - } - } - - /** - * @param array|null $queryStringParams - * - * @return string - */ - private function buildQueryString(array $queryStringParams = null) - { - if ($queryStringParams === null) { - return ''; - } - - $query = []; - - foreach ($queryStringParams as $key => $value) { - $query[] = sprintf('%s=%s', $key, $value); - } - - return sprintf('?%s', implode('&', $query)); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Gateways/GatewayResponse.php b/classes/includes/vendor/globalpayments/php-sdk/src/Gateways/GatewayResponse.php deleted file mode 100644 index f573a66..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Gateways/GatewayResponse.php +++ /dev/null @@ -1,16 +0,0 @@ -version; - } - - /** @return void */ - public function setAccountId($accountId) - { - $this->accountId = $accountId; - } - /** @return void */ - public function setMerchantId($merchantId) - { - $this->merchantId = $merchantId; - } - /** @return void */ - public function setSharedSecret($sharedSecret) - { - $this->sharedSecret = $sharedSecret; - } - /** @return void */ - public function setChallengeNotificationUrl($challengeNotificationUrl) - { - $this->challengeNotificationUrl = $challengeNotificationUrl; - } - /** @return void */ - public function setMerchantContactUrl($merchantContactUrl) - { - $this->merchantContactUrl = $merchantContactUrl; - } - /** @return void */ - public function setMethodNotificationUrl($methodNotificationUrl) - { - $this->methodNotificationUrl = $methodNotificationUrl; - } - - protected function maybeSetKey(array $arr, $key, $value = null) - { - if (!is_null($value)) { - $arr[$key] = $value; - } - return $arr; - } - - /** - * @throws ApiException - * @return Transaction */ - public function processSecure3d(Secure3dBuilder $builder) - { - $transType = $builder->getTransactionType(); - $timestamp = date("Y-m-d\TH:i:s.u"); - $paymentMethod = $builder->getPaymentMethod(); - $secure3d = $paymentMethod; - - $request = []; - if ($transType === TransactionType::VERIFY_ENROLLED) { - $request = $this->maybeSetKey($request, 'request_timestamp', $timestamp); - $request = $this->maybeSetKey($request, 'merchant_id', $this->merchantId); - $request = $this->maybeSetKey($request, 'account_id', $this->accountId); - $request = $this->maybeSetKey($request, 'method_notification_url', $this->methodNotificationUrl); - - $hashValue = ''; - if ($paymentMethod instanceof CreditCardData) { - $cardData = $paymentMethod; - $request = $this->maybeSetKey($request, 'number', $cardData->number); - $request = $this->maybeSetKey($request, 'scheme', $this->mapCardScheme(strtoupper($cardData->getCardType()))); - $hashValue = $cardData->number; - } elseif ($paymentMethod instanceof RecurringPaymentMethod) { - $storedCard = $paymentMethod; - $request = $this->maybeSetKey($request, 'payer_reference', $storedCard->customerKey); - $request = $this->maybeSetKey($request, 'payment_method_reference', $storedCard->key); - $hashValue = $storedCard->customerKey; - } - - $hash = GenerationUtils::generateHash($this->sharedSecret, implode('.', [$timestamp, $this->merchantId, $hashValue])); - $headers['Authorization'] = sprintf('securehash %s', $hash); - - $rawResponse = $this->doTransaction('POST', 'protocol-versions', json_encode($request), null, $headers); - return $this->mapResponse($rawResponse); - } elseif ($transType === TransactionType::VERIFY_SIGNATURE) { - $hash = GenerationUtils::generateHash($this->sharedSecret, implode('.', [$timestamp, $this->merchantId, $builder->getServerTransactionId()])); - $headers['Authorization'] = sprintf('securehash %s', $hash); - - $queryValues = []; - $queryValues['merchant_id'] = $this->merchantId; - $queryValues['request_timestamp'] = $timestamp; - $rawResponse = $this->doTransaction('GET', sprintf('authentications/%s', $builder->getServerTransactionId()), null, $queryValues, $headers); - return $this->mapResponse($rawResponse); - } elseif ($transType === TransactionType::INITIATE_AUTHENTICATION) { - $orderId = $builder->getOrderId(); - if (empty($orderId)) { - $orderId = GenerationUtils::generateOrderId(); - } - - $secureEcom = $secure3d->threeDSecure; - - $request = $this->maybeSetKey($request, 'request_timestamp', $timestamp); - $request = $this->maybeSetKey($request, 'authentication_source', $builder->getAuthenticationSource()); - $request = $this->maybeSetKey($request, 'authentication_request_type', $builder->getAuthenticationRequestType()); - $request = $this->maybeSetKey($request, 'message_category', $builder->getMessageCategory()); - $request = $this->maybeSetKey($request, 'message_version', '2.1.0'); - $request = $this->maybeSetKey($request, 'server_trans_id', $secureEcom->serverTransactionId); - $request = $this->maybeSetKey($request, 'merchant_id', $this->merchantId); - $request = $this->maybeSetKey($request, 'account_id', $this->accountId); - $request = $this->maybeSetKey($request, 'challenge_notification_url', $this->challengeNotificationUrl); - $request = $this->maybeSetKey($request, 'method_url_completion', $builder->getMethodUrlCompletion()); - $request = $this->maybeSetKey($request, 'merchant_contact_url', $this->merchantContactUrl); - $request = $this->maybeSetKey($request, 'merchant_initiated_request_type', $builder->getMerchantInitiatedRequestType()); - - // card details - $hashValue = ''; - $request['card_detail'] = []; - if ($paymentMethod instanceof CreditCardData) { - $cardData = $paymentMethod; - $hashValue = $cardData->number; - - $request['card_detail'] = $this->maybeSetKey($request['card_detail'], 'number', $cardData->number); - $request['card_detail'] = $this->maybeSetKey($request['card_detail'], 'scheme', strtoupper($cardData->getCardType())); - $request['card_detail'] = $this->maybeSetKey($request['card_detail'], 'expiry_month', $cardData->expMonth); - $request['card_detail'] = $this->maybeSetKey($request['card_detail'], 'expiry_year', substr($cardData->expYear, 2)); - $request['card_detail'] = $this->maybeSetKey($request['card_detail'], 'full_name', $cardData->cardHolderName); - - if (!empty($cardData->cardHolderName)) { - $names = explode(' ', $cardData->cardHolderName); - if (count($names) >= 1) { - $request['card_detail'] = $this->maybeSetKey($request['card_detail'], 'first_name', $names[0]); - } - if (count($names) >= 2) { - $request['card_detail'] = $this->maybeSetKey($request['card_detail'], 'last_name', $names[1]); - } - } - } elseif ($paymentMethod instanceof RecurringPaymentMethod) { - $storedCard = $paymentMethod; - $hashValue = $storedCard->customerKey; - - $request['card_detail'] = $this->maybeSetKey($request['card_detail'], 'payer_reference', $storedCard->customerKey); - $request['card_detail'] = $this->maybeSetKey($request['card_detail'], 'payment_method_reference', $storedCard->key); - } - - // order details - $request['order'] = []; - $request['order'] = $this->maybeSetKey($request['order'], 'amount', preg_replace('/[^0-9]/', '', sprintf('%01.2f', $builder->getAmount()))); - $request['order'] = $this->maybeSetKey($request['order'], 'currency', $builder->getCurrency()); - $request['order'] = $this->maybeSetKey($request['order'], 'id', $orderId); - $request['order'] = $this->maybeSetKey($request['order'], 'address_match_indicator', ($builder->isAddressMatchIndicator() ? true : false)); - $request['order'] = $this->maybeSetKey($request['order'], 'date_time_created', (new \DateTime($builder->getOrderCreateDate()))->format(\DateTime::RFC3339_EXTENDED)); - $request['order'] = $this->maybeSetKey($request['order'], 'gift_card_count', $builder->getGiftCardCount()); - $request['order'] = $this->maybeSetKey($request['order'], 'gift_card_currency', $builder->getGiftCardCurrency()); - $request['order'] = $this->maybeSetKey($request['order'], 'gift_card_amount', preg_replace('/[^0-9]/', '', sprintf('%01.2f', $builder->getGiftCardAmount()))); - $request['order'] = $this->maybeSetKey($request['order'], 'delivery_email', $builder->getDeliveryEmail()); - $request['order'] = $this->maybeSetKey($request['order'], 'delivery_timeframe', $builder->getDeliveryTimeframe()); - $request['order'] = $this->maybeSetKey($request['order'], 'shipping_method', $builder->getShippingMethod()); - $request['order'] = $this->maybeSetKey($request['order'], 'shipping_name_matches_cardholder_name', $builder->getShippingNameMatchesCardHolderName()); - $request['order'] = $this->maybeSetKey($request['order'], 'preorder_indicator', $builder->getPreOrderIndicator()); - $request['order'] = $this->maybeSetKey($request['order'], 'reorder_indicator', $builder->getReorderIndicator()); - $request['order'] = $this->maybeSetKey($request['order'], 'transaction_type', $builder->getOrderTransactionType()); - $request['order'] = $this->maybeSetKey($request['order'], 'preorder_availability_date', null !== $builder->getPreOrderAvailabilityDate() ? date('Y-m-d', $builder->getPreOrderAvailabilityDate()) : null); - - // shipping address - $shippingAddress = $builder->getShippingAddress(); - if (!empty($shippingAddress)) { - $request['order']['shipping_address'] = []; - $request['order']['shipping_address'] = $this->maybeSetKey($request['order']['shipping_address'], 'line1', $shippingAddress->streetAddress1); - $request['order']['shipping_address'] = $this->maybeSetKey($request['order']['shipping_address'], 'line2', $shippingAddress->streetAddress2); - $request['order']['shipping_address'] = $this->maybeSetKey($request['order']['shipping_address'], 'line3', $shippingAddress->streetAddress3); - $request['order']['shipping_address'] = $this->maybeSetKey($request['order']['shipping_address'], 'city', $shippingAddress->city); - $request['order']['shipping_address'] = $this->maybeSetKey($request['order']['shipping_address'], 'postal_code', $shippingAddress->postalCode); - $request['order']['shipping_address'] = $this->maybeSetKey($request['order']['shipping_address'], 'state', $shippingAddress->state); - $request['order']['shipping_address'] = $this->maybeSetKey($request['order']['shipping_address'], 'country', $shippingAddress->countryCode); - } - - // payer - $request['payer'] = []; - $request['payer'] = $this->maybeSetKey($request['payer'], 'email', $builder->getCustomerEmail() ?? null); - $request['payer'] = $this->maybeSetKey($request['payer'], 'id', $builder->getCustomerAccountId()); - $request['payer'] = $this->maybeSetKey($request['payer'], 'account_age', $builder->getAccountAgeIndicator()); - $request['payer'] = $this->maybeSetKey($request['payer'], 'account_creation_date', null !== $builder->getAccountCreateDate() ? date('Y-m-d', strtotime($builder->getAccountCreateDate())) : null); - $request['payer'] = $this->maybeSetKey($request['payer'], 'account_change_indicator', $builder->getAccountChangeIndicator()); - $request['payer'] = $this->maybeSetKey($request['payer'], 'account_change_date', null !== $builder->getAccountChangeDate() ? date('Y-m-d', strtotime($builder->getAccountChangeDate())) : null); - $request['payer'] = $this->maybeSetKey($request['payer'], 'account_password_change_indicator', $builder->getPasswordChangeIndicator()); - $request['payer'] = $this->maybeSetKey($request['payer'], 'account_password_change_date', null !== $builder->getPasswordChangeDate() ? date('Y-m-d', strtotime($builder->getPasswordChangeDate())) : null); - $request['payer'] = $this->maybeSetKey($request['payer'], 'payment_account_age_indicator', $builder->getAccountAgeIndicator()); - $request['payer'] = $this->maybeSetKey($request['payer'], 'payment_account_creation_date', null !== $builder->getAccountCreateDate() ? date('Y-m-d', strtotime($builder->getAccountCreateDate())) : null); - $request['payer'] = $this->maybeSetKey($request['payer'], 'purchase_count_last_6months', $builder->getNumberOfPurchasesInLastSixMonths()); - $request['payer'] = $this->maybeSetKey($request['payer'], 'transaction_count_last_24hours', $builder->getNumberOfTransactionsInLast24Hours()); - $request['payer'] = $this->maybeSetKey($request['payer'], 'transaction_count_last_year', $builder->getNumberOfTransactionsInLastYear()); - $request['payer'] = $this->maybeSetKey($request['payer'], 'provision_attempt_count_last_24hours', $builder->getNumberOfAddCardAttemptsInLast24Hours()); - $request['payer'] = $this->maybeSetKey($request['payer'], 'shipping_address_creation_indicator', $builder->getShippingAddressUsageIndicator()); - $request['payer'] = $this->maybeSetKey($request['payer'], 'shipping_address_creation_date', null !== $builder->getShippingAddressCreateDate() ? date('Y-m-d', strtotime($builder->getShippingAddressCreateDate())) : null); - - // suspicious activity - if ($builder->getPreviousSuspiciousActivity() != null) { - $request['payer'] = $this->maybeSetKey($request['payer'], 'suspicious_account_activity', $builder->getPreviousSuspiciousActivity() ? 'SUSPICIOUS_ACTIVITY' : 'NO_SUSPICIOUS_ACTIVITY'); - } - - // home phone - if (!empty($builder->getHomeNumber())) { - $request['payer']['home_phone'] = []; - $request['payer']['home_phone'] = $this->maybeSetKey($request['payer']['home_phone'], 'country_code', $builder->getHomeCountryCode()); - $request['payer']['home_phone'] = $this->maybeSetKey($request['payer']['home_phone'], 'subscriber_number', $builder->getHomeNumber()); - } - - // work phone - if (!empty($builder->getWorkNumber())) { - $request['payer']['work_phone'] = []; - $request['payer']['work_phone'] = $this->maybeSetKey($request['payer']['work_phone'], 'country_code', $builder->getWorkCountryCode()); - $request['payer']['work_phone'] = $this->maybeSetKey($request['payer']['work_phone'], 'subscriber_number', $builder->getWorkNumber()); - } - - // payer login data - if ($builder->hasPayerLoginData()) { - $request['payer_login_data'] = []; - $request['payer_login_data'] = $this->maybeSetKey($request['payer_login_data'], 'authentication_data', $builder->getCustomerAuthenticationData()); - $request['payer_login_data'] = $this->maybeSetKey($request['payer_login_data'], 'authentication_timestamp', $builder->getCustomerAuthenticationTimestamp()); - $request['payer_login_data'] = $this->maybeSetKey($request['payer_login_data'], 'authentication_type', $builder->getCustomerAuthenticationMethod()); - } - - // prior authentication data - if ($builder->hasPriorAuthenticationData()) { - $request['payer_prior_three_ds_authentication_data'] = []; - $request['payer_prior_three_ds_authentication_data'] = $this->maybeSetKey($request['payer_prior_three_ds_authentication_data'], 'authentication_method', $builder->getPriorAuthenticationMethod()); - $request['payer_prior_three_ds_authentication_data'] = $this->maybeSetKey($request['payer_prior_three_ds_authentication_data'], 'acs_transaction_id', $builder->getPriorAuthenticationTransactionId()); - $request['payer_prior_three_ds_authentication_data'] = $this->maybeSetKey($request['payer_prior_three_ds_authentication_data'], 'authentication_timestamp', date('Y-m-d\TH:i:s.u\Z', strtotime($builder->getPriorAuthenticationTimestamp()))); - $request['payer_prior_three_ds_authentication_data'] = $this->maybeSetKey($request['payer_prior_three_ds_authentication_data'], 'authentication_data', $builder->getPriorAuthenticationData()); - } - - // recurring authorization data - if ($builder->hasRecurringAuthData()) { - $request['recurring_authorization_data'] = []; - $request['recurring_authorization_data'] = $this->maybeSetKey($request['recurring_authorization_data'], 'max_number_of_installments', $builder->getMaxNumberOfInstallments()); - $request['recurring_authorization_data'] = $this->maybeSetKey($request['recurring_authorization_data'], 'frequency', $builder->getRecurringAuthorizationFrequency()); - $request['recurring_authorization_data'] = $this->maybeSetKey($request['recurring_authorization_data'], 'expiry_date', date('Y-m-d\TH:i:s.u\Z', strtotime($builder->getRecurringAuthorizationExpiryDate()))); - } - - // billing details - $billingAddress = $builder->getBillingAddress(); - if (!empty($billingAddress)) { - $request['payer']['billing_address'] = []; - $request['payer']['billing_address'] = $this->maybeSetKey($request['payer']['billing_address'], 'line1', $billingAddress->streetAddress1); - $request['payer']['billing_address'] = $this->maybeSetKey($request['payer']['billing_address'], 'line2', $billingAddress->streetAddress2); - $request['payer']['billing_address'] = $this->maybeSetKey($request['payer']['billing_address'], 'line3', $billingAddress->streetAddress3); - $request['payer']['billing_address'] = $this->maybeSetKey($request['payer']['billing_address'], 'city', $billingAddress->city); - $request['payer']['billing_address'] = $this->maybeSetKey($request['payer']['billing_address'], 'postal_code', $billingAddress->postalCode); - $request['payer']['billing_address'] = $this->maybeSetKey($request['payer']['billing_address'], 'state', $billingAddress->state); - $request['payer']['billing_address'] = $this->maybeSetKey($request['payer']['billing_address'], 'country', $billingAddress->countryCode); - } - - // mobile phone - if (!empty($builder->getMobileNumber())) { - $request['payer']['mobile_phone'] = []; - $request['payer']['mobile_phone'] = $this->maybeSetKey($request['payer']['mobile_phone'], 'country_code', $builder->getMobileCountryCode()); - $request['payer']['mobile_phone'] = $this->maybeSetKey($request['payer']['mobile_phone'], 'subscriber_number', $builder->getMobileNumber()); - } - - // browser_data - $browserData = $builder->getBrowserData(); - if (!empty($browserData)) { - $request['browser_data'] = []; - $request['browser_data'] = $this->maybeSetKey($request['browser_data'], 'accept_header', $browserData->acceptHeader); - $request['browser_data'] = $this->maybeSetKey($request['browser_data'], 'color_depth', $browserData->colorDepth); - $request['browser_data'] = $this->maybeSetKey($request['browser_data'], 'ip', $browserData->ipAddress); - $request['browser_data'] = $this->maybeSetKey($request['browser_data'], 'java_enabled', $browserData->javaEnabled); - $request['browser_data'] = $this->maybeSetKey($request['browser_data'], 'javascript_enabled', $browserData->javaScriptEnabled); - $request['browser_data'] = $this->maybeSetKey($request['browser_data'], 'language', $browserData->language); - $request['browser_data'] = $this->maybeSetKey($request['browser_data'], 'screen_height', $browserData->screenHeight); - $request['browser_data'] = $this->maybeSetKey($request['browser_data'], 'screen_width', $browserData->screenWidth); - $request['browser_data'] = $this->maybeSetKey($request['browser_data'], 'challenge_window_size', $browserData->challengWindowSize); - $request['browser_data'] = $this->maybeSetKey($request['browser_data'], 'timezone', $browserData->timeZone); - $request['browser_data'] = $this->maybeSetKey($request['browser_data'], 'user_agent', $browserData->userAgent); - } - - // mobile fields - if ($builder->hasMobileFields()) { - $request['sdk_information'] = []; - $request['sdk_information'] = $this->maybeSetKey($request['sdk_information'], 'application_id', $builder->getApplicationId()); - $request['sdk_information'] = $this->maybeSetKey($request['sdk_information'], 'ephemeral_public_key', $builder->getEphemeralPublicKey()); - $request['sdk_information'] = $this->maybeSetKey($request['sdk_information'], 'maximum_timeout', $builder->getMaximumTimeout()); - $request['sdk_information'] = $this->maybeSetKey($request['sdk_information'], 'reference_number', $builder->getReferenceNumber()); - $request['sdk_information'] = $this->maybeSetKey($request['sdk_information'], 'sdk_trans_id', $builder->getSdkTransactionId()); - $request['sdk_information'] = $this->maybeSetKey($request['sdk_information'], 'encoded_data', $builder->getEncodedData()); - } - - // device render options - if ($builder->getSdkInterface() != null || $builder->getSdkUiTypes() != null) { - $request['sdk_information']['device_render_options'] = []; - $request['sdk_information']['device_render_options'] = $this->maybeSetKey($request['sdk_information']['device_render_options'], 'sdk_interface', $builder->getSdkInterface()); - $request['sdk_information']['device_render_options'] = $this->maybeSetKey($request['sdk_information']['device_render_options'], 'sdk_ui_type', $builder->getSdkUiTypes()); - } - - $hash = GenerationUtils::generateHash($this->sharedSecret, implode('.', [$timestamp, $this->merchantId, $hashValue, $secureEcom->serverTransactionId])); - $headers['Authorization'] = sprintf('securehash %s', $hash); - $rawResponse = $this->doTransaction('POST', 'authentications', json_encode($request, JSON_UNESCAPED_SLASHES), null, $headers); - return $this->mapResponse($rawResponse); - } - - throw new ApiException(sprintf('Unknown transaction type %s.', $transType)); - } - - /** @return Transaction */ - private function mapResponse($rawResponse) - { - $doc = json_decode($rawResponse, true); - $secureEcom = new ThreeDSecure(); - - // check enrolled - $secureEcom->serverTransactionId = $doc['server_trans_id'] ?? null; - if (array_key_exists('enrolled', $doc)) { - $secureEcom->enrolled = (bool)$doc['enrolled']; - } - $secureEcom->issuerAcsUrl = ($doc['method_url'] ?? null) . ($doc['challenge_request_url'] ?? null); - - // get authentication data - $secureEcom->acsTransactionId = $doc['acs_trans_id'] ?? null; - $secureEcom->directoryServerTransactionId = $doc['ds_trans_id'] ?? null; - $secureEcom->authenticationType = $doc['authentication_type'] ?? null; - $secureEcom->authenticationValue = $doc['authentication_value'] ?? null; - $secureEcom->eci = $doc['eci'] ?? null; - $secureEcom->status = $doc['status'] ?? null; - $secureEcom->statusReason = $doc['status_reason'] ?? null; - $secureEcom->authenticationSource = $doc['authentication_source'] ?? null; - $secureEcom->messageCategory = $doc['message_category'] ?? null; - $secureEcom->messageVersion = $doc['message_version'] ?? null; - - // challenge mandated - if (array_key_exists('challenge_mandated', $doc)) { - $secureEcom->challengeMandated = (bool)$doc['challenge_mandated']; - } - - // initiate authentication - $secureEcom->cardHolderResponseInfo = $doc['cardHolder_response_info'] ?? null; - - // device_render_options - if (array_key_exists('device_render_options', $doc)) { - $renderOptions = $doc['device_render_options']; - $secureEcom->sdkInterface = $renderOptions['sdk_interface'] ?? null; - $secureEcom->sdkUiType = $renderOptions['sdk_ui_type'] ?? null; - } - - // message_extension - if (array_key_exists('message_extension', $doc)) { - $secureEcom->criticalityIndicator = $doc['message_extension']['criticality_indicator'] ?? null; - $secureEcom->messageExtensionId = $doc['message_extension']['id'] ?? null; - $secureEcom->messageExtensionName = $doc['message_extension']['name'] ?? null; - } - - // versions - $secureEcom->directoryServerEndVersion = $doc['ds_protocol_version_end'] ?? null; - $secureEcom->directoryServerStartVersion = $doc['ds_protocol_version_start'] ?? null; - $secureEcom->acsEndVersion = $doc['acs_protocol_version_end'] ?? null; - $secureEcom->acsStartVersion = $doc['acs_protocol_version_start'] ?? null; - - // payer authentication request - if (array_key_exists('method_data', $doc)) { - $methodData = $doc['method_data']; - $secureEcom->payerAuthenticationRequest = $methodData['encoded_method_data'] ?? null; - } elseif (array_key_exists('encoded_creq', $doc)) { - $secureEcom->payerAuthenticationRequest = $doc['encoded_creq'] ?? null; - } - - $response = new Transaction(); - $response->threeDSecure = $secureEcom; - return $response; - } - - private function mapCardScheme($cardType) - { - if ($cardType == "MC") { - return "MASTERCARD"; - } elseif ($cardType == "DINERSCLUB") { - return "DINERS"; - } else { - return $cardType; - } - } - - /** - * @throws GatewayException - * @return string */ - private function handleResponse(GatewayResponse $response) - { - if ($response->statusCode != 200 && $response->statusCode != 204) { - $parsed = json_decode($response->rawResponse, true); - if (array_key_exists('error', $parsed)) { - $error = $parsed['error']; - throw new GatewayException(sprintf("Status code: %s - %s", $response->statusCode, $error)); - } - throw new GatewayException(sprintf("Status code: %s - %s", $response->statusCode, $error)); - } - return $response->rawResponse; - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Gateways/IPaymentGateway.php b/classes/includes/vendor/globalpayments/php-sdk/src/Gateways/IPaymentGateway.php deleted file mode 100644 index e3a6a86..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Gateways/IPaymentGateway.php +++ /dev/null @@ -1,32 +0,0 @@ -apiKey; - default: - break; - } - - if (property_exists($this, $name)) { - return $this->{$name}; - } - - throw new ArgumentException(sprintf('Property `%s` does not exist on PayPlanConnector', $name)); - } - - public function __isset($name) - { - return in_array($name, [ - 'secretApiKey', - ]) || isset($this->{$name}); - } - - public function __set($name, $value) - { - switch ($name) { - case 'secretApiKey': - $this->apiKey = $value; - $auth = sprintf('Basic %s', base64_encode($value)); - $this->headers['Authorization'] = $auth; - return; - default: - break; - } - - if (property_exists($this, $name)) { - return $this->{$name} = $value; - } - - throw new ArgumentException(sprintf('Property `%s` does not exist on PayPlanConnector', $name)); - } - - public function processRecurring(RecurringBuilder $builder) - { - $request = []; - - if ($builder->transactionType === TransactionType::CREATE - || $builder->transactionType === TransactionType::EDIT - ) { - if ($builder->entity instanceof Customer) { - $request = $this->buildCustomer($request, $builder->entity); - } - - if ($builder->entity instanceof RecurringPaymentMethod) { - $request = $this->buildPaymentMethod($request, $builder->entity, $builder->transactionType); - } - - if ($builder->entity instanceof Schedule) { - $request = $this->buildSchedule($request, $builder->entity, $builder->transactionType); - } - } - - if ($builder->transactionType === TransactionType::SEARCH) { - foreach ($builder->searchCriteria as $key => $value) { - $request[$key] = $value; - } - } - - foreach ($request as $key => $value) { - if ($value !== 0 && empty($value)) { - unset($request[$key]); - } - } - - $response = $this->doTransaction( - $this->mapMethod($builder->transactionType), - $this->mapUrl($builder), - $request === [] ? '{}' : json_encode($request) - ); - return $this->mapResponse($builder, $response); - } - - #region Mappers - protected function mapResponse($builder, $rawResponse) - { - // this is for DELETE which returns nothing - if (empty($rawResponse)) { - return null; - } - - // else do the whole shebang - $response = json_decode($rawResponse); - - if ($builder->entity instanceof Customer - && $builder->transactionType === TransactionType::SEARCH - ) { - $customers = []; - foreach ($response->results as $customer) { - $customers[] = $this->hydrateCustomer($customer); - } - return $customers; - } - - if ($builder->entity instanceof Customer) { - return $this->hydrateCustomer($response); - } - - if ($builder->entity instanceof RecurringPaymentMethod - && $builder->transactionType === TransactionType::SEARCH - ) { - $methods = []; - foreach ($response->results as $method) { - $methods[] = $this->hydratePaymentMethod($method); - } - return $methods; - } - - if ($builder->entity instanceof RecurringPaymentMethod) { - return $this->hydratePaymentMethod($response); - } - - if ($builder->entity instanceof Schedule - && $builder->transactionType === TransactionType::SEARCH - ) { - $schedules = []; - foreach ($response->results as $schedule) { - $schedules[] = $this->hydrateSchedule($schedule); - } - return $schedules; - } - - if ($builder->entity instanceof Schedule) { - return $this->hydrateSchedule($response); - } - - return $response; - } - - protected function mapMethod($type) - { - switch ($type) { - case TransactionType::CREATE: - case TransactionType::SEARCH: - return 'POST'; - case TransactionType::EDIT: - return 'PUT'; - case TransactionType::DELETE: - return 'DELETE'; - default: - return 'GET'; - } - } - - protected function mapUrl(RecurringBuilder $builder) - { - $suffix = ''; - if ($builder->transactionType === TransactionType::FETCH - || $builder->transactionType === TransactionType::DELETE - || $builder->transactionType === TransactionType::EDIT - ) { - $suffix = '/' . $builder->entity->key; - } - - if ($builder->entity instanceof Customer) { - return sprintf( - '%s%s', - $builder->transactionType === TransactionType::SEARCH ? 'searchCustomers' : 'customers', - $suffix - ); - } - - if ($builder->entity instanceof RecurringPaymentMethod) { - $paymentMethod = ''; - if ($builder->transactionType === TransactionType::CREATE) { - $paymentMethod = $builder->entity->paymentMethod instanceof Credit ? 'CreditCard' : 'ACH'; - } elseif ($builder->transactionType === TransactionType::EDIT) { - $paymentMethod = str_replace($builder->entity->paymentType, ' ', ''); - } - return sprintf( - '%s%s%s', - $builder->transactionType === TransactionType::SEARCH ? 'searchPaymentMethods' : 'paymentMethods', - $paymentMethod, - $suffix - ); - } - - if ($builder->entity instanceof Schedule) { - return sprintf( - '%s%s', - $builder->transactionType === TransactionType::SEARCH ? 'searchSchedules' : 'schedules', - $suffix - ); - } - - throw new UnsupportedTransactionException(); - } - #endregion - - #region Build Entities - protected function buildCustomer($request, Customer $customer = null) - { - if ($customer === null) { - return $request; - } - - $request['customerIdentifier'] = $customer->id; - $request['firstName'] = $customer->firstName; - $request['lastName'] = $customer->lastName; - $request['company'] = $customer->company; - $request['customerStatus'] = $customer->status; - $request['primaryEmail'] = $customer->email; - $request['phoneDay'] = $customer->homePhone; - $request['phoneEvening'] = $customer->workPhone; - $request['phoneMobile'] = $customer->mobilePhone; - $request['fax'] = $customer->fax; - $request['title'] = $customer->title; - $request['department'] = $customer->department; - $request = $this->buildAddress($request, $customer->address); - - return $request; - } - - protected function buildPaymentMethod($request, RecurringPaymentMethod $payment, $type) - { - if ($payment === null) { - return $request; - } - - $request['preferredPayment'] = $payment->preferredPayment; - $request['paymentMethodIdentifier'] = $payment->id; - $request['customerKey'] = $payment->customerKey; - $request['nameOnAccount'] = $payment->nameOnAccount; - $request = $this->buildAddress($request, $payment->address); - - if ($type === TransactionType::CREATE) { - $tokenValue; - list($hasToken, $tokenValue) = $this->hasToken($payment->paymentMethod); - $paymentInfo = null; - $paymentInfoKey = null; - if ($payment->paymentMethod instanceof ICardData) { - $method = $payment->paymentMethod; - $paymentInfoKey = $hasToken ? 'alternateIdentity' : 'card'; - $paymentInfo = [ - $hasToken ? 'token' : 'number' => $hasToken ? $tokenValue : $method->number, - 'expMon' => $method->expMonth, - 'expYear' => $method->expYear, - ]; - - if ($hasToken) { - $paymentInfo['type'] = 'SINGLEUSETOKEN'; - } - - $request['cardVerificationValue'] = $method->cvn; - } elseif ($payment->paymentMethod instanceof ITrackData) { - $method = $payment->paymentMethod; - $paymentInfoKey = 'track'; - $paymentInfo = [ - 'data' => $method->value, - 'dataEntryMode' => strtoupper($method->entryMethod), - ]; - } - - if ($payment->paymentMethod instanceof ECheck) { - $check = $payment->paymentMethod; - $request['achType'] = $this->mapAccountType($check->accountType); - $request['accountType'] = $this->mapCheckType($check->checkType); - $request['telephoneIndicator'] = - $check->secCode === SecCode::CCD || $check->secCode == SecCode::PPD - ? false - : true; - $request['routingNumber'] = $check->routingNumber; - $request['accountNumber'] = $check->accountNumber; - $request['accountHolderYob'] = $check->birthYear; - $request['driversLicenseState'] = $check->driversLicenseState; - $request['driversLicenseNumber'] = $check->driversLicenseNumber; - $request['socialSecurityNumberLast4'] = $check->ssnLast4; - unset($request['country']); - } - - if ($payment->paymentMethod instanceof IEncryptable) { - $enc = $payment->paymentMethod->encryptionData; - if ($enc != null) { - $paymentInfo['trackNumber'] = $enc->trackNumber; - $paymentInfo['key'] = $enc->ktb; - $paymentInfo['encryptionType'] = 'E3'; - } - } - } else { // EDIT FIELDS - unset($request['customerKey']); - $request['paymentStatus'] = $payment->status; - $request['cpcTaxType'] = $payment->taxType; - $request['expirationDate'] = $payment->expirationDate; - } - - if ($paymentInfo !== null) { - $request[$paymentInfoKey] = $paymentInfo; - } - - return $request; - } - - protected function mapAccountType($type) - { - switch ($type) { - case AccountType::CHECKING: - return 'Checking'; - case AccountType::SAVINGS: - return 'Savings'; - } - } - - protected function mapCheckType($type) - { - switch ($type) { - case CheckType::PERSONAL: - return 'Personal'; - case CheckType::BUSINESS: - return 'Business'; - } - } - - protected function buildSchedule($request, Schedule $schedule, $type) - { - $mapDuration = function () use ($schedule) { - if ($schedule->numberOfPayments !== null) { - return 'Limited Number'; - } - - if ($schedule->endDate !== null) { - return 'End Date'; - } - - return 'Ongoing'; - }; - - $mapProcessingDate = function () use ($schedule) { - $frequencies = [ 'Monthly', 'Bi-Monthly', 'Quarterly', 'Semi-Annually' ]; - if (in_array($schedule->frequency, $frequencies)) { - switch ($schedule->paymentSchedule) { - case PaymentSchedule::FIRST_DAY_OF_THE_MONTH: - return 'First'; - case PaymentSchedule::LAST_DAY_OF_THE_MONTH: - return 'Last'; - default: - $day = $schedule->startDate->format('d'); - return $day > 28 ? 'Last' : $day; - } - } - - if ($schedule->frequency == 'Semi-Monthly') { - return $schedule->paymentSchedule === PaymentSchedule::LAST_DAY_OF_THE_MONTH - ? 'Last' - : 'First'; - } - - return null; - }; - - if ($schedule === null) { - return $request; - } - - $request['scheduleIdentifier'] = $schedule->id; - $request['scheduleName'] = $schedule->name; - $request['scheduleStatus'] = $schedule->status; - $request['paymentMethodKey'] = $schedule->paymentKey; - - $request = $this->buildAmount($request, 'subtotalAmount', $schedule->amount, $schedule->currency, $type); - $request = $this->buildAmount($request, 'taxAmount', $schedule->taxAmount, $schedule->currency, $type); - - $request['deviceId'] = $schedule->deviceId; - $request['processingDateInfo'] = $mapProcessingDate(); - $request = $this->buildDate($request, 'endDate', $schedule->endDate, ($type === TransactionType::EDIT)); - $request['reprocessingCount'] = $schedule->reprocessingCount ?: 3; - $request['emailReceipt'] = $schedule->emailReceipt; - $request['emailAdvanceNotice'] = $schedule->emailNotification ? 'Yes' : 'No'; - // debt repay ind - $request['invoiceNbr'] = $schedule->invoiceNumber; - $request['poNumber'] = $schedule->poNumber; - $request['description'] = $schedule->description; - $request['numberOfPayments'] = $schedule->numberOfPayments; - - if ($type === TransactionType::CREATE) { - $request['customerKey'] = $schedule->customerKey; - $request = $this->buildDate($request, 'startDate', $schedule->startDate); - $request['frequency'] = $schedule->frequency; - $request['duration'] = $mapDuration(); - } else { // Edit Fields - if (!$schedule->hasStarted) { - $request = $this->buildDate($request, 'startDate', $schedule->startDate); - $request['frequency'] = $schedule->frequency; - $request['duration'] = $mapDuration(); - } else { - $request = $this->buildDate($request, 'cancellationDate', $schedule->cancellationDate); - $request = $this->buildDate($request, 'nextProcressingDate', $schedule->nextProcessingDate); - } - } - - return $request; - } - - protected function buildDate($request, $name, \DateTime $date = null, $force = false) - { - if ($date !== null || $force) { - $value = $date !== null ? $date->format('mdY') : null; - $request[$name] = $value; - } - return $request; - } - - protected function buildAmount($request, $name, $amount, $currency, $type) - { - if ($amount !== null) { - $node = [ - 'value' => $amount * 100, - ]; - - if ($type === TransactionType::CREATE) { - $node['currency'] = $currency; - } - - $request[$name] = $node; - } - return $request; - } - - protected function buildAddress($request, Address $address) - { - if ($address !== null) { - $request['addressLine1'] = $address->streetAddress1; - $request['addressLine2'] = $address->streetAddress2; - $request['city'] = $address->city; - $request['country'] = $address->country; - $request['stateProvince'] = $address->province; - $request['zipPostalCode'] = $address->postalCode; - } - return $request; - } - #endregion - - #region Hydrate Entities - protected function hydrateCustomer($response) - { - $customer = new Customer(); - $customer->key = isset($response->customerKey) ? $response->customerKey : null; - $customer->id = isset($response->customerIdentifier) ? $response->customerIdentifier : null; - $customer->firstName = isset($response->firstName) ? $response->firstName : null; - $customer->lastName = isset($response->lastName) ? $response->lastName : null; - $customer->company = isset($response->company) ? $response->company : null; - $customer->status = isset($response->customerStatus) ? $response->customerStatus : null; - $customer->title = isset($response->title) ? $response->title : null; - $customer->department = isset($response->department) ? $response->department : null; - $customer->email = isset($response->primaryEmail) ? $response->primaryEmail : null; - $customer->homePhone = isset($response->phoneDay) ? $response->phoneDay : null; - $customer->workPhone = isset($response->phoneEvening) ? $response->phoneEvening : null; - $customer->mobilePhone = isset($response->phoneMobile) ? $response->phoneMobile : null; - $customer->fax = isset($response->fax) ? $response->fax : null; - $customer->address = new Address(); - $customer->address->streetAddress1 = isset($response->addressLine1) ? $response->addressLine1 : null; - $customer->address->streetAddress2 = isset($response->addressLine2) ? $response->addressLine2 : null; - $customer->address->city = isset($response->city) ? $response->city : null; - $customer->address->province = isset($response->stateProvince) ? $response->stateProvince : null; - $customer->address->postalCode = isset($response->zipPostalCode) ? $response->zipPostalCode : null; - $customer->address->country = isset($response->country) ? $response->country : null; - return $customer; - } - - protected function hydratePaymentMethod($response) - { - $paymentMethod = new RecurringPaymentMethod(); - $paymentMethod->key = isset($response->paymentMethodKey) ? $response->paymentMethodKey : null; - $paymentMethod->paymentType = isset($response->paymentMethodType) ? $response->paymentMethodType : null; - $paymentMethod->preferredPayment = isset($response->preferredPayment) ? $response->preferredPayment : null; - $paymentMethod->status = isset($response->paymentStatus) ? $response->paymentStatus : null; - $paymentMethod->id = isset($response->paymentMethodIdentifier) ? $response->paymentMethodIdentifier : null; - $paymentMethod->customerKey = isset($response->customerKey) ? $response->customerKey : null; - $paymentMethod->nameOnAccount = isset($response->nameOnAccount) ? $response->nameOnAccount : null; - $paymentMethod->commercialIndicator = isset($response->cpcInd) ? $response->cpcInd : null; - $paymentMethod->taxType = isset($response->cpcTaxType) ? $response->cpcTaxType : null; - $paymentMethod->expirationDate = isset($response->expirationDate) ? $response->expirationDate : null; - $paymentMethod->address = new Address(); - $paymentMethod->address->streetAddress1 = isset($response->addressLine1) ? $response->addressLine1 : null; - $paymentMethod->address->streetAddress2 = isset($response->addressLine2) ? $response->addressLine2 : null; - $paymentMethod->address->city = isset($response->city) ? $response->city : null; - $paymentMethod->address->state = isset($response->stateProvince) ? $response->stateProvince : null; - $paymentMethod->address->postalCode= isset($response->zipPostalCode) ? $response->zipPostalCode : null; - $paymentMethod->address->country = isset($response->country) ? $response->country : null; - return $paymentMethod; - } - - protected function hydrateSchedule($response) - { - $schedule = new Schedule(); - $schedule->key = isset($response->scheduleKey) ? $response->scheduleKey : null; - $schedule->id = isset($response->scheduleIdentifier) ? $response->scheduleIdentifier : null; - $schedule->customerKey = isset($response->customerKey) ? $response->customerKey : null; - $schedule->name = isset($response->scheduleName) ? $response->scheduleName : null; - $schedule->status = isset($response->scheduleStatus) ? $response->scheduleStatus : null; - $schedule->paymentKey = isset($response->paymentMethodKey) ? $response->paymentMethodKey : null; - if (isset($response->subtotalAmount)) { - $subtotal = $response->subtotalAmount; - $schedule->amount = $subtotal->value; - $schedule->currency = $subtotal->currency; - } - if (isset($response->taxAmount)) { - $taxAmount = $response->taxAmount; - $schedule->taxAmount = $taxAmount->value; - } - $schedule->deviceId = isset($response->deviceId) ? $response->deviceId : null; - $schedule->startDate = $response->startDate; - $schedule->paymentSchedule = isset($response->processingDateInfo) ? $response->processingDateInfo : null; - switch ($schedule->paymentSchedule) { - case 'Last': - $schedule->paymentSchedule = PaymentSchedule::LAST_DAY_OF_THE_MONTH; - break; - case 'First': - $schedule->paymentSchedule = PaymentSchedule::FIRST_DAY_OF_THE_MONTH; - break; - default: - $schedule->paymentSchedule = PaymentSchedule::DYNAMIC; - break; - } - $schedule->frequency = isset($response->frequency) ? $response->frequency : null; - $schedule->endDate = isset($response->endDate) ? $response->endDate : null; - $schedule->reprocessingCount = isset($response->reprocessingCount) ? $response->reprocessingCount : null; - $schedule->emailReceipt = isset($response->emailReceipt) ? $response->emailReceipt : null; - $schedule->emailNotification = isset($response->emailAdvanceNotice) ? $response->emailAdvanceNotice : null; - if ($schedule->emailNotification === null - || $schedule->emailNotification === 'No' - ) { - $schedule->emailNotification = false; - } else { - $schedule->emailNotification = true; - } - // dept repay indicator - $schedule->invoiceNumber = isset($response->invoiceNbr) ? $response->invoiceNbr : null; - $schedule->poNumber = isset($response->poNumber) ? $response->poNumber : null; - $schedule->description = isset($response->Description) ? $response->Description : null; - // statusSetDate - $schedule->nextProcessingDate = isset($response->nextProcessingDate) - ? \DateTime::createFromFormat('dmY', $response->nextProcessingDate) - : null; - // previousProcessingDate - // approvedTransactionCount - // failureCount - // totalApprovedAmountToDate - // numberOfPaymentsRemaining - $schedule->cancellationDate = isset($response->cancellationDate) ? $response->cancellationDate : null; - // creationDate - // lastChangeDate - $schedule->hasStarted = isset($response->scheduleStarted) ? $response->scheduleStarted : null; - return $schedule; - } - #endregion - - #region Validations - - /** - * Tests the payment method for a token value - * - * @param IPaymentMethod $paymentMethod The payment method - * - * @return [bool, string|null] - */ - protected function hasToken(IPaymentMethod $paymentMethod) - { - $tokenValue = null; - - if (!empty($paymentMethod->token)) { - $tokenValue = $paymentMethod->token; - return [true, $tokenValue]; - } - - return [false, $tokenValue]; - } - - #endregion -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Gateways/PorticoConnector.php b/classes/includes/vendor/globalpayments/php-sdk/src/Gateways/PorticoConnector.php deleted file mode 100644 index e075a22..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Gateways/PorticoConnector.php +++ /dev/null @@ -1,1878 +0,0 @@ -createElement($this->mapRequestType($builder)); - $block1 = $xml->createElement('Block1'); - - if ($builder->paymentMethod->paymentMethodType !== PaymentMethodType::GIFT - && $builder->paymentMethod->paymentMethodType !== PaymentMethodType::ACH - && ($builder->transactionType === TransactionType::AUTH - || $builder->transactionType === TransactionType::SALE) - ) { - if ($builder->paymentMethod->paymentMethodType !== PaymentMethodType::RECURRING - || $builder->paymentMethod->paymentType !== 'ACH' - ) { - $block1->appendChild( - $xml->createElement( - 'AllowDup', - ($builder->allowDuplicates ? 'Y' : 'N') - ) - ); - } - - if ($builder->transactionModifier === TransactionModifier::NONE - && $builder->paymentMethod->paymentMethodType !== PaymentMethodType::EBT - && $builder->paymentMethod->paymentMethodType !== PaymentMethodType::RECURRING - ) { - $block1->appendChild( - $xml->createElement( - 'AllowPartialAuth', - ($builder->allowPartialAuth ? 'Y' : 'N') - ) - ); - } - } - - if ($builder->amount !== null) { - $block1->appendChild($xml->createElement('Amt', $builder->amount)); - } - - if ($builder->gratuity !== null) { - $block1->appendChild( - $xml->createElement('GratuityAmtInfo', $builder->gratuity) - ); - } - - if ($builder->convenienceAmount !== null) { - $block1->appendChild($xml->createElement('ConvenienceAmtInfo', $builder->convenienceAmount)); - } - - if ($builder->shippingAmount !== null) { - $block1->appendChild($xml->createElement('ShippingAmtInfo', $builder->shippingAmount)); - } - - if ($builder->cashBackAmount !== null) { - $block1->appendChild( - $xml->createElement( - $builder->paymentMethod->paymentMethodType === PaymentMethodType::DEBIT - ? 'CashbackAmtInfo' - : 'CashBackAmount', - $builder->cashBackAmount - ) - ); - } - - if ($builder->offlineAuthCode !== null) { - $block1->appendChild( - $xml->createElement('OfflineAuthCode', $builder->offlineAuthCode) - ); - } - - if ($builder->transactionType === TransactionType::ALIAS) { - $block1->appendChild($xml->createElement('Action', AliasAction::validate($builder->aliasAction))); - $block1->appendChild($xml->createElement('Alias', $builder->alias)); - } - - $isCheck = ($builder->paymentMethod->paymentMethodType === PaymentMethodType::ACH) - || ($builder->paymentMethod instanceof RecurringPaymentMethod - && $builder->paymentMethod->paymentType === 'ACH'); - - $propertyName = $isCheck ? 'checkHolderName' : 'cardHolderName'; - if ($isCheck - || $builder->billingAddress !== null - || isset($builder->paymentMethod->{$propertyName}) - ) { - if ($builder->transactionType !== TransactionType::REVERSAL) { - $address = $this->hydrateHolder($xml, $builder, $isCheck); - } - if (!empty($address)) { - $block1->appendChild($address); - } - } - list($hasToken, $tokenValue) = $this->hasToken($builder->paymentMethod); - - $cardData = $xml->createElement( - $builder->transactionType === TransactionType::REPLACE ? 'OldCardData' : 'CardData' - ); - if ($builder->paymentMethod instanceof ICardData) { - $cardData->appendChild( - $this->hydrateManualEntry( - $xml, - $builder, - $hasToken, - $tokenValue - ) - ); - } elseif ($builder->paymentMethod instanceof ITrackData) { - $trackData = $this->hydrateTrackData( - $xml, - $builder, - $hasToken, - $tokenValue - ); - - if ($builder->paymentMethod->paymentMethodType === PaymentMethodType::DEBIT) { - $block1->appendChild($trackData); - } else { - $cardData->appendChild($trackData); - } - } elseif ($builder->paymentMethod instanceof GiftCard) { - if ($builder->currency !== null) { - $block1->appendChild($xml->createElement('Currency', strtoupper($builder->currency))); - } - - if ($builder->transactionType === TransactionType::REPLACE) { - $newCard = $xml->createElement('NewCardData'); - $newCard->appendChild( - $xml->createElement( - $builder->replacementCard->valueType, - $builder->replacementCard->value - ) - ); - - if ($builder->replacementCard->pin !== null) { - $newCard->appendChild( - $xml->createElement( - 'PIN', - $builder->replacementCard->pin - ) - ); - } - $block1->appendChild($newCard); - } - - if ($builder->paymentMethod->value !== null) { - $cardData->appendChild( - $xml->createElement( - $builder->paymentMethod->valueType, - $builder->paymentMethod->value - ) - ); - } - - if ($builder->paymentMethod->pin !== null) { - $cardData->appendChild( - $xml->createElement( - 'PIN', - $builder->paymentMethod->pin - ) - ); - } - } elseif ($builder->paymentMethod instanceof ECheck) { - $block1->appendChild($xml->createElement('CheckAction', 'SALE')); - - if (empty($builder->paymentMethod->token)) { - $accountInfo = $xml->createElement('AccountInfo'); - $accountInfo->appendChild($xml->createElement('RoutingNumber', $builder->paymentMethod->routingNumber)); - $accountInfo->appendChild($xml->createElement('AccountNumber', $builder->paymentMethod->accountNumber)); - $accountInfo->appendChild($xml->createElement('CheckNumber', $builder->paymentMethod->checkNumber)); - $accountInfo->appendChild($xml->createElement('MICRData', $builder->paymentMethod->micrNumber)); - $accountInfo->appendChild( - $xml->createElement( - 'AccountType', - $this->hydrateAccountType($builder->paymentMethod->accountType) - ) - ); - $block1->appendChild($accountInfo); - } else { - $block1->appendChild($xml->createElement('TokenValue', $builder->paymentMethod->token)); - } - - $block1->appendChild( - $xml->createElement( - 'DataEntryMode', - strtoupper($this->hydrateEntryMethod($builder->paymentMethod->entryMode)) - ) - ); - $block1->appendChild( - $xml->createElement( - 'CheckType', - $this->hydrateCheckType($builder->paymentMethod->checkType) - ) - ); - $block1->appendChild($xml->createElement('SECCode', $builder->paymentMethod->secCode)); - - $verify = $xml->createElement('VerifyInfo'); - $verify->appendChild( - $xml->createElement( - 'CheckVerify', - ($builder->paymentMethod->checkVerify ? 'Y' : 'N') - ) - ); - $verify->appendChild( - $xml->createElement( - 'ACHVerify', - ($builder->paymentMethod->achVerify ? 'Y' : 'N') - ) - ); - $block1->appendChild($verify); - } - - if ($builder->paymentMethod instanceof TransactionReference) { - $block1->appendChild($xml->createElement('GatewayTxnId', $builder->paymentMethod->transactionId)); - $block1->appendChild($xml->createElement('ClientTxnId', $builder->paymentMethod->clientTransactionId)); - } - - if ($builder->paymentMethod instanceof RecurringPaymentMethod) { - $method = $builder->paymentMethod; - - if ($method->paymentType === 'ACH') { - $block1->appendChild($xml->createElement('CheckAction', 'SALE')); - } - - $block1->appendChild($xml->createElement('PaymentMethodKey', $method->key)); - - if ($method->paymentMethod !== null && $method->paymentMethod instanceof CreditCardData) { - $data = $xml->createElement('PaymentMethodKeyData'); - - if ($method->paymentMethod->expMonth !== null) { - $data->appendChild($xml->createElement('ExpMonth', $method->paymentMethod->expMonth)); - } - - if ($method->paymentMethod->expYear !== null) { - $data->appendChild($xml->createElement('ExpYear', $method->paymentMethod->expYear)); - } - - if ($method->paymentMethod->cvn !== null) { - $data->appendChild($xml->createElement('CVV2', $method->paymentMethod->cvn)); - } - - $block1->appendChild($data); - } - - $data = $xml->createElement('RecurringData'); - if ($builder->scheduleId !== null) { - $data->appendChild($xml->createElement('ScheduleID', $builder->scheduleId)); - } - $data->appendChild($xml->createElement('OneTime', $builder->oneTimePayment ? 'Y' : 'N')); - $block1->appendChild($data); - } - - if ($builder->paymentMethod instanceof IPinProtected - && $builder->transactionType !== TransactionType::REVERSAL - ) { - $block1->appendChild($xml->createElement('PinBlock', $builder->paymentMethod->pinBlock)); - } - - if ($builder->paymentMethod instanceof IEncryptable - && isset($builder->paymentMethod->encryptionData) - && null !== $builder->paymentMethod->encryptionData - ) { - $enc = $this->hydrateEncryptionData($xml, $builder); - - if ($builder->paymentMethod->paymentMethodType === PaymentMethodType::DEBIT) { - $block1->appendChild($enc); - } else { - $cardData->appendChild($enc); - } - } - - if ($builder->paymentMethod instanceof ITokenizable) { - $cardData->appendChild( - $xml->createElement( - 'TokenRequest', - $builder->requestMultiUseToken ? 'Y' : 'N' - ) - ); - } - - if ($cardData->childNodes->length > 0 && $builder->aliasAction !== AliasAction::CREATE) { - $block1->appendChild($cardData); - } - - if ($builder->paymentMethod instanceof IBalanceable && $builder->balanceInquiryType !== null) { - $block1->appendChild($xml->createElement('BalanceInquiryType', $builder->balanceInquiryType)); - } - - if ($builder->level2Request === true) { - $block1->appendChild($xml->createElement('CPCReq', 'Y')); - } - - if ($builder->customerId !== null - || $builder->description !== null - || $builder->invoiceNumber !== null - ) { - $block1->appendChild($this->hydrateAdditionalTxnFields($xml, $builder)); - } - - if ($builder->ecommerceInfo !== null) { - $block1->appendChild($xml->createElement('Ecommerce', $builder->ecommerceInfo->channel)); - - if (!empty($builder->invoiceNumber) || !empty($builder->ecommerceInfo->shipMonth)) { - $direct = $xml->createElement('DirectMktData'); - if (!empty($builder->invoiceNumber)) { - $direct->appendChild($xml->createElement('DirectMktInvoiceNbr', $builder->invoiceNumber)); - } - if (!empty($builder->ecommerceInfo->shipDay)) { - $direct->appendChild($xml->createElement('DirectMktShipDay', $builder->ecommerceInfo->shipDay)); - } - if (!empty($builder->ecommerceInfo->shipMonth)) { - $direct->appendChild($xml->createElement('DirectMktShipMonth', $builder->ecommerceInfo->shipMonth)); - } - } - if (!empty($builder->paymentMethod->threeDSecure)) { - $secure = $xml->createElement('SecureECommerce'); - if (!empty($builder->paymentMethod->threeDSecure->paymentDataSource)) { - $direct->appendChild( - $xml->createElement( - 'PaymentDataSource', - $builder->paymentMethod->threeDSecure->paymentDataSource - ) - ); - } - if (!empty($builder->paymentMethod->threeDSecure->paymentDataType)) { - $direct->appendChild( - $xml->createElement( - 'TypeOfPaymentData', - $builder->paymentMethod->threeDSecure->paymentDataType - ) - ); - } - if (!empty($builder->paymentMethod->threeDSecure->cavv)) { - $direct->appendChild($xml->createElement('PaymentData', $builder->paymentMethod->threeDSecure->cavv)); - } - if (!empty($builder->paymentMethod->threeDSecure->eci)) { - $direct->appendChild($xml->createElement('ECommerceIndicator', $builder->paymentMethod->threeDSecure->eci)); - } - if (!empty($builder->paymentMethod->threeDSecure->xid)) { - $direct->appendChild($xml->createElement('XID', $builder->paymentMethod->threeDSecure->xid)); - } - } - } - - if ($builder->dynamicDescriptor !== null) { - $block1->appendChild( - $xml->createElement('TxnDescriptor', $builder->dynamicDescriptor) - ); - } - - $transaction->appendChild($block1); - - $response = $this->doTransaction($this->buildEnvelope($xml, $transaction)); - return $this->mapResponse($response, $builder, $this->buildEnvelope($xml, $transaction)); - } - - public function serializeRequest(AuthorizationBuilder $builder) - { - throw new UnsupportedTransactionException('Portico does not support hosted payments.'); - } - - /** - * {@inheritdoc} - * - * @param ManagementBuilder $builder The transaction's builder - * - * @return Transaction - */ - public function manageTransaction(ManagementBuilder $builder) - { - $xml = new DOMDocument('1.0', 'utf-8'); - - // build request - $transaction = $xml->createElement($this->mapRequestType($builder)); - - if ($builder->transactionType !== TransactionType::BATCH_CLOSE) { - $root = null; - if ($builder->transactionType === TransactionType::REVERSAL - || $builder->transactionType === TransactionType::REFUND - || $builder->paymentMethod->paymentMethodType === PaymentMethodType::GIFT - || $builder->paymentMethod->paymentMethodType === PaymentMethodType::ACH - ) { - $root = $xml->createElement('Block1'); - } else { - $root = $transaction; - } - - // Transaction ID - if ($builder->paymentMethod !== null && !empty($builder->paymentMethod->transactionId)) { - $root->appendChild( - $xml->createElement('GatewayTxnId', $builder->paymentMethod->transactionId) - ); - } - - // Level II Data - if ($builder->transactionType === TransactionType::EDIT - && $builder->transactionModifier === TransactionModifier::LEVEL_II - ) { - $cpc = $xml->createElement('CPCData'); - - if ($builder->poNumber !== null) { - $cpc->appendChild( - $xml->createElement('CardHolderPONbr', $builder->poNumber) - ); - } - - if ($builder->taxType !== null) { - $cpc->appendChild( - $xml->createElement( - 'TaxType', - TaxType::validate($builder->taxType) - ) - ); - } - - if ($builder->taxAmount !== null) { - $cpc->appendChild($xml->createElement('TaxAmt', $builder->taxAmount)); - } - - $root->appendChild($cpc); - } else { - // amount - if ($builder->amount !== null) { - $root->appendChild($xml->createElement('Amt', $builder->amount)); - } - - // auth amount - if ($builder->authAmount !== null) { - $root->appendChild($xml->createElement('AuthAmt', $builder->authAmount)); - } - - // gratuity - if ($builder->gratuity !== null) { - $root->appendChild( - $xml->createElement('GratuityAmtInfo', $builder->gratuity) - ); - } - } - - // Additional Txn Fields - // TODO - - // Token Management - if ($builder->transactionType === TransactionType::TOKEN_UPDATE - || $builder->transactionType === TransactionType::TOKEN_DELETE - ) { - $token = $builder->paymentMethod; - - // Set the token value - $root->appendChild($xml->createElement('TokenValue', $token->token)); - - $tokenActions = $root->appendChild($xml->createElement('TokenActions')); - if ($builder->transactionType === TransactionType::TOKEN_UPDATE) { - $setElement = $tokenActions->appendChild($xml->createElement('Set')); - - $expMonth = $setElement->appendChild($xml->createElement('Attribute')); - $expMonth->appendChild($xml->createElement('Name', 'expmonth')); - $expMonth->appendChild($xml->createElement('Value', $token->expMonth)); - - $expYear = $setElement->appendChild($xml->createElement('Attribute')); - $expYear->appendChild($xml->createElement('Name', 'expyear')); - $expYear->appendChild($xml->createElement('Value', $token->expYear)); - } else { - $tokenActions->appendChild($xml->createElement('Delete')); - } - } - - if ($builder->transactionType === TransactionType::REVERSAL - || $builder->transactionType === TransactionType::REFUND - || $builder->paymentMethod->paymentMethodType === PaymentMethodType::GIFT - || $builder->paymentMethod->paymentMethodType === PaymentMethodType::ACH - ) { - $transaction->appendChild($root); - } - } - - $response = $this->doTransaction($this->buildEnvelope($xml, $transaction)); - return $this->mapResponse($response, $builder, $this->buildEnvelope($xml, $transaction)); - } - - public function processReport(ReportBuilder $builder) - { - $xml = new DOMDocument('1.0', 'utf-8'); - - $transaction = $xml->createElement($this->mapReportType($builder)); - $transaction->appendChild($xml->createElement('TzConversion', $builder->timeZoneConversion)); - - if ($builder instanceof TransactionReportBuilder) { - /* if ($builder->deviceId !== null) { - $transaction->appendChild($xml->createElement('DeviceId', $builder->deviceId)); - } - - if ($builder->startDate !== null) { - $transaction->appendChild($xml->createElement('RptStartUtcDT', $builder->startDate->format())); - } - - if ($builder->endDate !== null) { - $transaction->appendChild($xml->createElement('RptEndUtcDT', $builder->endDate->format())); - } */ - - if ($builder->transactionId !== null) { - $transaction->appendChild($xml->createElement('TxnId', $builder->transactionId)); - } else { - $criteria = $transaction->appendChild($xml->createElement('Criteria')); - - if ($builder->searchBuilder->startDate !== null) { - $criteria->appendChild($xml->createElement( - 'StartUtcDT', - $builder->searchBuilder->startDate - )); - } - if ($builder->searchBuilder->endDate !== null) { - $criteria->appendChild($xml->createElement( - 'EndUtcDT', - $builder->searchBuilder->endDate - )); - } - if ($builder->searchBuilder->authCode !== null) { - $criteria->appendChild($xml->createElement( - 'AuthCode', - $builder->searchBuilder->authCode - )); - } - if ($builder->searchBuilder->cardHolderLastName !== null) { - $criteria->appendChild($xml->createElement( - 'CardHolderLastName', - $builder->searchBuilder->cardHolderLastName - )); - } - if ($builder->searchBuilder->cardHolderFirstName !== null) { - $criteria->appendChild($xml->createElement( - 'CardHolderFirstName', - $builder->searchBuilder->cardHolderFirstName - )); - } - if ($builder->searchBuilder->cardNumberFirstSix !== null) { - $criteria->appendChild($xml->createElement( - 'CardNbrFirstSix', - $builder->searchBuilder->cardNumberFirstSix - )); - } - if ($builder->searchBuilder->cardNumberLastFour !== null) { - $criteria->appendChild($xml->createElement( - 'CardNbrLastFour', - $builder->searchBuilder->cardNumberLastFour - )); - } - if ($builder->searchBuilder->invoiceNumber !== null) { - $criteria->appendChild($xml->createElement( - 'InvoiceNbr', - $builder->searchBuilder->invoiceNumber - )); - } - if ($builder->searchBuilder->cardHolderPoNumber !== null) { - $criteria->appendChild($xml->createElement( - 'CardHolderPONbr', - $builder->searchBuilder->cardHolderPoNumber - )); - } - if ($builder->searchBuilder->customerId !== null) { - $criteria->appendChild($xml->createElement( - 'CustomerID', - $builder->searchBuilder->customerId - )); - } - if ($builder->searchBuilder->issuerResult !== null) { - $criteria->appendChild($xml->createElement( - 'IssuerResult', - $builder->searchBuilder->issuerResult - )); - } - if ($builder->searchBuilder->settlementAmount !== null) { - $criteria->appendChild($xml->createElement( - 'SettlementAmt', - $builder->searchBuilder->settlementAmount - )); - } - if ($builder->searchBuilder->issuerTransactionId !== null) { - $criteria->appendChild($xml->createElement( - 'IssTxnId', - $builder->searchBuilder->issuerTransactionId - )); - } - if ($builder->searchBuilder->referenceNumber !== null) { - $criteria->appendChild($xml->createElement( - 'RefNbr', - $builder->searchBuilder->referenceNumber - )); - } - if ($builder->searchBuilder->username !== null) { - $criteria->appendChild($xml->createElement( - 'UserName', - $builder->searchBuilder->username - )); - } - if ($builder->searchBuilder->clerkId !== null) { - $criteria->appendChild($xml->createElement( - 'ClerkID', - $builder->searchBuilder->clerkId - )); - } - if ($builder->searchBuilder->batchSequenceNumber !== null) { - $criteria->appendChild($xml->createElement( - 'BatchSeqNbr', - $builder->searchBuilder->batchSequenceNumber - )); - } - if ($builder->searchBuilder->batchId !== null) { - $criteria->appendChild($xml->createElement( - 'BatchId', - $builder->searchBuilder->batchId - )); - } - if ($builder->searchBuilder->siteTrace !== null) { - $criteria->appendChild($xml->createElement( - 'SiteTrace', - $builder->searchBuilder->siteTrace - )); - } - if ($builder->searchBuilder->displayName !== null) { - $criteria->appendChild($xml->createElement( - 'DisplayName', - $builder->searchBuilder->displayName - )); - } - if ($builder->searchBuilder->clientTransactionId !== null) { - $criteria->appendChild($xml->createElement( - 'ClientTxnId', - $builder->searchBuilder->clientTransactionId - )); - } - if ($builder->searchBuilder->uniqueDeviceId !== null) { - $criteria->appendChild($xml->createElement( - 'UniqueDeviceId', - $builder->searchBuilder->uniqueDeviceId - )); - } - if ($builder->searchBuilder->accountNumberLastFour !== null) { - $criteria->appendChild($xml->createElement( - 'AcctNbrLastFour', - $builder->searchBuilder->accountNumberLastFour - )); - } - if ($builder->searchBuilder->bankRoutingNumber !== null) { - $criteria->appendChild($xml->createElement( - 'BankRountingNbr', - $builder->searchBuilder->bankRoutingNumber - )); - } - if ($builder->searchBuilder->checkNumber !== null) { - $criteria->appendChild($xml->createElement( - 'CheckNbr', - $builder->searchBuilder->checkNumber - )); - } - if ($builder->searchBuilder->checkFirstName !== null) { - $criteria->appendChild($xml->createElement( - 'CheckFirstName', - $builder->searchBuilder->checkFirstName - )); - } - if ($builder->searchBuilder->checkLastName !== null) { - $criteria->appendChild($xml->createElement( - 'CheckLastName', - $builder->searchBuilder->checkLastName - )); - } - if ($builder->searchBuilder->checkName !== null) { - $criteria->appendChild($xml->createElement( - 'CheckName', - $builder->searchBuilder->checkName - )); - } - if ($builder->searchBuilder->giftCurrency !== null) { - $criteria->appendChild($xml->createElement( - 'GiftCurrency', - $builder->searchBuilder->giftCurrency - )); - } - if ($builder->searchBuilder->giftMaskedAlias !== null) { - $criteria->appendChild($xml->createElement( - 'GiftMaskedAlias', - $builder->searchBuilder->giftMaskedAlias - )); - } - if ($builder->searchBuilder->oneTime !== null) { - $criteria->appendChild($xml->createElement( - 'OneTime', - $builder->searchBuilder->oneTime - )); - } - if ($builder->searchBuilder->paymentMethodKey !== null) { - $criteria->appendChild($xml->createElement( - 'PaymentMethodKey', - $builder->searchBuilder->paymentMethodKey - )); - } - if ($builder->searchBuilder->scheduleId !== null) { - $criteria->appendChild($xml->createElement( - 'ScheduleID', - $builder->searchBuilder->scheduleId - )); - } - if ($builder->searchBuilder->buyerEmailAddress !== null) { - $criteria->appendChild($xml->createElement( - 'BuyerEmailAddress', - $builder->searchBuilder->buyerEmailAddress - )); - } - if ($builder->searchBuilder->altPaymentStatus !== null) { - $criteria->appendChild($xml->createElement( - 'AltPaymentStatus', - $builder->searchBuilder->altPaymentStatus - )); - } - if ($builder->searchBuilder->fullyCaptured !== null) { - $criteria->appendChild($xml->createElement( - 'FullyCapturedInd', - $builder->searchBuilder->fullyCaptured - )); - } - } - } - $response = $this->doTransaction($this->buildEnvelope($xml, $transaction)); - return $this->mapReportResponse($response, $builder); - } - - /** - * Wraps a transaction with a SOAP envelope - * - * @param DOMDocument $xml The current DOMDocument object - * @param DOMElement $transaction The current transaction to wrap - * - * @return DOMElement - */ - protected function buildEnvelope(DOMDocument $xml, DOMElement $transaction) - { - $soapEnvelope = $xml->createElement('soapenv:Envelope'); - $soapEnvelope->setAttribute( - 'xmlns:soapenv', - 'http://schemas.xmlsoap.org/soap/envelope/' - ); - $soapEnvelope->setAttribute('xmlns', static::XML_NAMESPACE); - - $soapBody = $xml->createElement('soapenv:Body'); - $request = $xml->createElement('PosRequest'); - - $version = $xml->createElement('Ver1.0'); - $header = $xml->createElement('Header'); - - if (!empty($this->secretApiKey)) { - $header->appendChild( - $xml->createElement('SecretAPIKey', trim($this->secretApiKey)) - ); - } - if (!empty($this->siteId)) { - $header->appendChild( - $xml->createElement('SiteId', $this->siteId) - ); - } - if (!empty($this->deviceId)) { - $header->appendChild( - $xml->createElement('DeviceId', $this->deviceId) - ); - } - if (!empty($this->licenseId)) { - $header->appendChild( - $xml->createElement('LicenseId', $this->licenseId) - ); - } - if (!empty($this->username)) { - $header->appendChild( - $xml->createElement('UserName', $this->username) - ); - } - if (!empty($this->password)) { - $header->appendChild( - $xml->createElement('Password', $this->password) - ); - } - if (!empty($this->developerId)) { - $header->appendChild( - $xml->createElement('DeveloperID', $this->developerId) - ); - } - if (!empty($this->versionNumber)) { - $header->appendChild( - $xml->createElement('VersionNbr', $this->versionNumber) - ); - } - - $version->appendChild($header); - $transactionElement = $xml->createElement('Transaction'); - $transactionElement->appendChild($xml->importNode($transaction, true)); - $version->appendChild($transactionElement); - - $request->appendChild($version); - $soapBody->appendChild($request); - $soapEnvelope->appendChild($soapBody); - $xml->appendChild($soapEnvelope); - - return $xml->saveXML(); - } - - /** - * Deserializes the gateway's XML response - * - * @param string $rawResponse The XML response - * @param BaseBuilder $builder The original transaction builder - * - * @throws Exception - * @return Transaction - */ - protected function mapResponse($rawResponse, BaseBuilder $builder, $request) - { - $result = new Transaction(); - - // TODO: handle non-200 responses - - $root = $this->xml2object($rawResponse)->{'Ver1.0'}; - $acceptedCodes = ['00', '0', '85', '10']; - - $gatewayRspCode = $this->normalizeResponse((string)$root->Header->GatewayRspCode); - $gatewayRspText = (string)$root->Header->GatewayRspMsg; - - if (!in_array($gatewayRspCode, $acceptedCodes)) { - throw new GatewayException( - sprintf( - 'Unexpected Gateway Response: %s - %s. ', - $gatewayRspCode, - $gatewayRspText - ), - $gatewayRspCode, - $gatewayRspText - ); - } - - $item = $root->Transaction->{$this->mapRequestType($builder)}; - - $result->responseCode = isset($item) && isset($item->RspCode) - ? $this->normalizeResponse((string)$item->RspCode) - : $gatewayRspCode; - $result->responseMessage = isset($item) && isset($item->RspText) - ? (string)$item->RspText - : $gatewayRspText; - - if (isset($item) && isset($item->AuthAmt)) { - $result->authorizedAmount = (string)$item->AuthAmt; - } - - if (isset($item) && isset($item->AvailableBalance)) { - $result->availableBalance = (string)$item->AvailableBalance; - } - - if (isset($item) && isset($item->AVSRsltCode)) { - $result->avsResponseCode = (string)$item->AVSRsltCode; - } - - if (isset($item) && isset($item->AVSRsltText)) { - $result->avsResponseMessage = (string)$item->AVSRsltText; - } - - if (isset($item) && isset($item->BalanceAmt)) { - $result->balanceAmount = (string)$item->BalanceAmt; - } - - if (isset($item) && isset($item->CardType)) { - $result->cardType = (string)$item->CardType; - } - - if (isset($item) && isset($item->CardLast4)) { - $result->cardLast4 = (string)$item->TokenPANLast4; - } - - if (isset($item) && isset($item->CAVVResultCode)) { - $result->cavvResponseCode = (string)$item->CAVVResultCode; - } - - if (isset($item) && isset($item->CPCInd)) { - $result->commercialIndicator = (string)$item->CPCInd; - } - - if (isset($item) && isset($item->CVVRsltCode)) { - $result->cvnResponseCode = (string)$item->CVVRsltCode; - } - - if (isset($item) && isset($item->CVVRsltText)) { - $result->cvnResponseMessage = (string)$item->CVVRsltText; - } - - if (isset($item) && isset($item->EMVIssuerResp)) { - $result->emvIssuerResponse = (string)$item->EMVIssuerResp; - } - - if (isset($item) && isset($item->PointsBalanceAmt)) { - $result->pointsBalanceAmount = (string)$item->PointsBalanceAmt; - } - - if (isset($item) && isset($item->RecurringDataCode)) { - $result->recurringDataCode = (string)$item->RecurringDataCode; - } - - if (isset($item) && isset($item->RefNbr)) { - $result->referenceNumber = (string)$item->RefNbr; - } - - if (isset($item) && isset($item->TxnDescriptor)) { - $result->transactionDescriptor = (string)$item->TxnDescriptor; - } - - if ($builder->paymentMethod !== null) { - $result->transactionReference = new TransactionReference(); - $result->transactionReference->transactionId = (string)$root->Header->GatewayTxnId; - $result->transactionReference->paymentMethodType = $builder->paymentMethod->paymentMethodType; - - if (isset($item) && isset($item->AuthCode)) { - $result->transactionReference->authCode = (string)$item->AuthCode; - } - } - - if (isset($item) && isset($item->CardData)) { - $result->giftCard = new GiftCard(); - $result->giftCard->number = (string)$item->CardData->CardNbr; - $result->giftCard->alias = (string)$item->CardData->Alias; - $result->giftCard->pin = (string)$item->CardData->PIN; - } - - if (isset($root->Header->TokenData) && isset($root->Header->TokenData->TokenValue)) { - $result->token = (string)$root->Header->TokenData->TokenValue; - } - - if (isset($item) && isset($item->BatchId)) { - $result->batchSummary = new BatchSummary(); - $result->batchSummary->id = (string)$item->BatchId; - $result->batchSummary->transactionCount = (string)$item->TxnCnt; - $result->batchSummary->totalAmount = (string)$item->TotalAmt; - $result->batchSummary->sequenceNumber = (string)$item->BatchSeqNbr; - } - - return $result; - } - - protected function mapReportResponse($rawResponse, ReportBuilder $builder) - { - $root = $this->xml2object($rawResponse)->{'Ver1.0'}; - $doc = $root->Transaction->{$this->mapReportType($builder)}; - - if ((($builder->reportType === ReportType::ACTIVITY) - || ($builder->reportType === ReportType::FIND_TRANSACTIONS)) - && isset($doc->Transactions)) { - $response = []; - foreach ($doc->Transactions as $item) { - $response[] = $this->hydrateTransactionSummary($item); - } - return $response; - } - - if ($builder->reportType === ReportType::TRANSACTION_DETAIL) { - return $this->hydrateTransactionSummary($doc->Transactions); - } - - return null; - } - - protected function hydrateTransactionSummary($item) - { - $summary = new TransactionSummary(); - - if (isset($item) && isset($item->AcctDataSrc)) { - $summary->accountDataSource = (string)$item->AcctDataSrc; - } - - if (isset($item) && isset($item->Amt)) { - $summary->amount = (string)$item->Amt; - } - - if (isset($item) && isset($item->AuthAmt)) { - $summary->authorizatedAmount = (string)$item->AuthAmt; - } - - if (isset($item) && isset($item->AuthCode)) { - $summary->authCode = (string)$item->AuthCode; - } - - if (isset($item) && isset($item->BatchCloseDT)) { - $summary->batchCloseDate = (string)$item->BatchCloseDT; - } - - if (isset($item) && isset($item->BatchSeqNbr)) { - $summary->batchSequenceNumber = (string)$item->BatchSeqNbr; - } - - if (isset($item) && isset($item->CardHolderData)) { - if (isset($item->CardHolderData->CardHolderFirstName)) { - $summary->cardHolderFirstName = $item->CardHolderData->CardHolderFirstName; - } - if (isset($item->CardHolderData->CardHolderLastName)) { - $summary->cardHolderLastName = $item->CardHolderData->CardHolderLastName; - } - } - - if (isset($item) && isset($item->CardSwiped)) { - $summary->cardSwiped = (string)$item->CardSwiped; - } - - if (isset($item) && isset($item->CardType)) { - $summary->cardType = (string)$item->CardType; - } - - if (isset($item) && isset($item->ClerkId)) { - $summary->clerkId = (string)$item->ClerkId; - } - - if (isset($item) && isset($item->ClientTxnId)) { - $summary->clientTransactionId = (string)$item->ClientTxnId; - } - - if (isset($item) && isset($item->ConvenienceAmtInfo)) { - $summary->convenienceAmount = (string)$item->ConvenienceAmtInfo; - } - - if (isset($item) && isset($item->DeviceId)) { - $summary->deviceId = (string)$item->DeviceId; - } - - if (isset($item) && isset($item->GratuityAmtInfo)) { - $summary->gratuityAmount = (string)$item->GratuityAmtInfo; - } - - if (isset($item) && (isset($item->RspCode) || isset($item->IssuerRspCode))) { - $summary->issuerResponseCode = - isset($item->RspCode) - ? (string)$item->RspCode - : (string)$item->IssuerRspCode; - } - - if (isset($item) && (isset($item->RspText) || isset($item->IssuerRspText))) { - $summary->issuerResponseMessage = - isset($item->RspText) - ? (string)$item->RspText - : (string)$item->IssuerRspText; - } - - if (isset($item) && isset($item->IssTxnId)) { - $summary->issuerTransactionId = (string)$item->IssTxnId; - } - - if (isset($item) && isset($item->MaskedCardNbr)) { - $summary->maskedCardNumber = (string)$item->MaskedCardNbr; - } - - if (isset($item) && isset($item->OriginalGatewayTxnId)) { - $summary->originalTransactionId = (string)$item->OriginalGatewayTxnId; - } - - if (isset($item) && isset($item->GatewayRspCode)) { - $summary->gatewayResponseCode = $this->normalizeResponse((string)$item->GatewayRspCode); - } - - if (isset($item) && isset($item->GatewayResponseMsg)) { - $summary->gatewayResponseMessage = (string)$item->GatewayResponseMsg; - } - - if (isset($item) && isset($item->PaymentType)) { - $summary->paymentType = (string)$item->PaymentType; - } - - if (isset($item) && isset($item->CardHolderPONbr)) { - $summary->poNumber = (string)$item->CardHolderPONbr; - } - - if (isset($item) && isset($item->RefNbr)) { - $summary->referenceNumber = (string)$item->RefNbr; - } - - if (isset($item) && isset($item->RspDT)) { - $summary->responseDate = (string)$item->RspDT; - } - - if (isset($item) && isset($item->ServiceName)) { - $summary->serviceName = (string)$item->ServiceName; - } - - if (isset($item) && isset($item->SettlementAmt)) { - $summary->settlementAmount = (string)$item->SettlementAmt; - } - - if (isset($item) && isset($item->ShippingAmtInfo)) { - $summary->shippingAmount = (string)$item->ShippingAmtInfo; - } - - if (isset($item) && isset($item->SiteTrace)) { - $summary->siteTrace = (string)$item->SiteTrace; - } - - if (isset($item) && (isset($item->TxnStatus) || isset($item->Status))) { - $summary->status = isset($item->TxnStatus) ? (string)$item->TxnStatus : (string)$item->Status; - } - - if (isset($item) && (isset($item->TaxAmtInfo) || isset($item->TaxAmt))) { - $summary->taxAmount = isset($item->TaxAmtInfo) ? (string)$item->TaxAmtInfo : (string)$item->TaxAmt; - } - - if (isset($item) && isset($item->TaxType)) { - $summary->taxType = (string)$item->TaxType; - } - - if (isset($item) && (isset($item->TxnUtcDT) || isset($item->ReqUtcDT))) { - $summary->transactionDate = isset($item->TxnUtcDT) ? (string)$item->TxnUtcDT : (string)$item->ReqUtcDT; - } - - if (isset($item) && isset($item->GatewayTxnId)) { - $summary->transactionId = (string)$item->GatewayTxnId; - } - - if (isset($item) && isset($item->TxnStatus)) { - $summary->transactionStatus = (string)$item->TxnStatus; - } - - if (isset($item) && isset($item->UserName)) { - $summary->userName = (string)$item->UserName; - } - - if (isset($item) && isset($item->AdditionalTxnFields)) { - if (isset($item->AdditionalTxnFields->Description)) { - $summary->description = (string)$item->AdditionalTxnFields->Description; - } - - if (isset($item->AdditionalTxnFields->InvoiceNbr)) { - $summary->invoiceNumber = (string)$item->AdditionalTxnFields->InvoiceNbr; - } - - if (isset($item->AdditionalTxnFields->CustomerID)) { - $summary->customerId = (string)$item->AdditionalTxnFields->CustomerID; - } - } - - if (isset($item) && isset($item->UniqueDeviceId)) { - $summary->uniqueDeviceId = (string)$item->UniqueDeviceId; - } - - if (isset($item) && isset($item->AdditionalTxnFields->TxnDescriptor)) { - $summary->transactionDescriptor = (string)$item->AdditionalTxnFields->TxnDescriptor; - } - - if (isset($item) && isset($item->GiftCurrency)) { - $summary->giftCurrency = (string)$item->GiftCurrency; - } - - if (isset($item) && isset($item->GiftMaskedAlias)) { - $summary->maskedAlias = (string)$item->GiftMaskedAlias; - } - - if (isset($item) && isset($item->PaymentMethodKey)) { - $summary->paymentMethodKey = (string)$item->PaymentMethodKey; - } - - if (isset($item) && isset($item->ScheduleID)) { - $summary->scheduleId = (string)$item->ScheduleID; - } - - if (isset($item) && isset($item->OneTime)) { - $summary->oneTimePayment = (string)$item->OneTime; - } - - if (isset($item) && isset($item->RecurringDataCode)) { - $summary->recurringDataCode = (string)$item->RecurringDataCode; - } - - if (isset($item) && isset($item->SurchargeAmtInfo)) { - $summary->surchargeAmount = (string)$item->SurchargeAmtInfo; - } - - if (isset($item) && isset($item->FraudInfoRule)) { - $summary->fraudRuleInfo = (string)$item->UserNFraudInfoRuleame; - } - - if (isset($item) && isset($item->RepeatCount)) { - $summary->repeatCount = (string)$item->RepeatCount; - } - - if (isset($item) && isset($item->EMVChipCondition)) { - $summary->emvChipCondition = (string)$item->EMVChipCondition; - } - - if (isset($item) && isset($item->HasEMVTag)) { - $summary->hasEmvTags = (string)$item->HasEMVTag; - } - - if (isset($item) && isset($item->HasEcomPaymentData)) { - $summary->hasEcomPaymentData = (string)$item->HasEcomPaymentData; - } - - if (isset($item) && isset($item->CAVVResultCode)) { - $summary->cavvResponseCode = (string)$item->CAVVResultCode; - } - - if (isset($item) && isset($item->TokenPANLast4)) { - $summary->tokenPanLastFour = (string)$item->TokenPANLast4; - } - - if (isset($item) && isset($item->Company)) { - $summary->companyName = (string)$item->Company; - } - - if (isset($item) && isset($item->CustomerFirstname)) { - $summary->customerFirstName = (string)$item->CustomerFirstname; - } - - if (isset($item) && isset($item->CustomerLastName)) { - $summary->customerLastName = (string)$item->CustomerLastName; - } - - if (isset($item) && isset($item->DebtRepaymentIndicator)) { - $summary->debtRepaymentIndicator = (string)$item->DebtRepaymentIndicator; - } - - if (isset($item) && isset($item->CaptureAmtInfo)) { - $summary->captureAmount = (string)$item->CaptureAmtInfo; - } - - if (isset($item) && isset($item->FullyCapturedInd)) { - $summary->fullyCaptured = (string)$item->FullyCapturedInd; - } - - // lodging data - if (isset($item) && isset($item->LodgingData)) { - $summary->lodgingData = new LodgingData(); - $summary->lodgingData->prestigiousPropertyLimit = (string)$item->LodgingData->PrestigiousPropertyLimit; - $summary->lodgingData->noShow = (string)$item->LodgingData->NoShow; - $summary->lodgingData->advancedDepositType = (string)$item->LodgingData->AdvancedDepositType; - $summary->lodgingData->lodgingDataEdit = (string)$item->LodgingData->LodgingDataEdit; - $summary->lodgingData->preferredCustomer = (string)$item->LodgingData->PreferredCustomer; - } - - // check data - if (isset($item) && isset($item->CheckData)) { - $summary->checkData = new CheckData(); - $summary->checkData->accountInfo = $item->CheckData->AccountInfo; - $summary->checkData->consumerInfo = $item->CheckData->ConsumerInfo; - $summary->checkData->dataEntryMode = (string)$item->CheckData->DataEntryMode; - $summary->checkData->checkType = (string)$item->CheckData->CheckType; - $summary->checkData->secCode = (string)$item->CheckData->SECCode; - $summary->checkData->checkAction = (string)$item->CheckData->CheckAction; - } - - // alt payment data - if (isset($item) && isset($item->AltPaymentData)) { - $summary->altPaymentData = new AltPaymentData(); - $summary->altPaymentData->buyerEmailAddress = (string)$item->AltPaymentData->BuyerEmailAddress; - $summary->altPaymentData->stateDate = (string)$item->AltPaymentData->StatusDT; - $summary->altPaymentData->status = (string)$item->AltPaymentData->Status; - $summary->altPaymentData->statusMessage = (string)$item->AltPaymentData->StatusMsg; - - $summary->altPaymentData->processorResponseInfo = new AltPaymentProcessorInfo(); - foreach ($summary->altPaymentData->processorResponseInfo as $info) { - $pri = new AltPaymentProcessorInfo(); - $pri->code = (string)$info->Code; - $pri->message = (string)$info->Message; - $pri->type = (string)$info->Type; - $summary->altPaymentData->processorResponseInfo->add($pri); - } - } - - return $summary; - } - - /** - * Maps a transaction builder to a Portico request type - * - * @param BaseBuilder $builder Transaction builder - * - * @return string - */ - protected function mapRequestType(BaseBuilder $builder) - { - switch ($builder->transactionType) { - case TransactionType::BATCH_CLOSE: - return 'BatchClose'; - case TransactionType::DECLINE: - if ($builder->paymentMethod->paymentMethodType === PaymentMethodType::GIFT) { - return 'GiftCardDeactivate'; - } elseif ($builder->transactionModifier === TransactionModifier::CHIP_DECLINE) { - return 'ChipCardDecline'; - } elseif ($builder->transactionModifier === TransactionModifier::FRAUD_DECLINE) { - return 'OverrideFraudDecline'; - } - throw new NotImplementedException(); - case TransactionType::VERIFY: - if ($builder->transactionModifier === TransactionModifier::ENCRYPTED_MOBILE) { - throw new UnsupportedTransactionException('Transaction not supported for this payment method.'); - } - return 'CreditAccountVerify'; - case TransactionType::CAPTURE: - return 'CreditAddToBatch'; - case TransactionType::AUTH: - if ($builder->paymentMethod->paymentMethodType === PaymentMethodType::CREDIT) { - if ($builder->transactionModifier === TransactionModifier::ADDITIONAL) { - return 'CreditAdditionalAuth'; - } elseif ($builder->transactionModifier === TransactionModifier::INCREMENTAL) { - return 'CreditIncrementalAuth'; - } elseif ($builder->transactionModifier === TransactionModifier::OFFLINE) { - return 'CreditOfflineAuth'; - } elseif ($builder->transactionModifier == TransactionModifier::RECURRING) { - return 'RecurringBillingAuth'; - } elseif ($builder->transactionModifier === TransactionModifier::ENCRYPTED_MOBILE) { - throw new UnsupportedTransactionException('Transaction not supported for this payment method.'); - } - - return 'CreditAuth'; - } elseif ($builder->paymentMethod->paymentMethodType === PaymentMethodType::RECURRING) { - return 'RecurringBillingAuth'; - } - throw new UnsupportedTransactionException('Transaction not supported for this payment method.'); - case TransactionType::SALE: - if ($builder->paymentMethod->paymentMethodType === PaymentMethodType::CREDIT) { - if ($builder->transactionModifier === TransactionModifier::OFFLINE) { - return 'CreditOfflineSale'; - } elseif ($builder->transactionModifier === TransactionModifier::ENCRYPTED_MOBILE) { - throw new UnsupportedTransactionException('Transaction not supported for this payment method.'); - } elseif ($builder->transactionModifier == TransactionModifier::RECURRING) { - return 'RecurringBilling'; - } else { - return 'CreditSale'; - } - } elseif ($builder->paymentMethod->paymentMethodType == PaymentMethodType::RECURRING) { - if ($builder->paymentMethod->paymentType == 'ACH') { - return 'CheckSale'; - } - return 'RecurringBilling'; - } elseif ($builder->paymentMethod->paymentMethodType === PaymentMethodType::DEBIT) { - return 'DebitSale'; - } elseif ($builder->paymentMethod->paymentMethodType === PaymentMethodType::CASH) { - return 'CashSale'; - } elseif ($builder->paymentMethod->paymentMethodType === PaymentMethodType::ACH) { - return 'CheckSale'; - } elseif ($builder->paymentMethod->paymentMethodType === PaymentMethodType::EBT) { - if ($builder->transactionModifier === TransactionModifier::CASH_BACK) { - return 'EBTCashBackPurchase'; - } elseif ($builder->transactionModifier === TransactionModifier::VOUCHER) { - return 'EBTVoucherPurchase'; - } else { - return 'EBTFSPurchase'; - } - } elseif ($builder->paymentMethod->paymentMethodType === PaymentMethodType::GIFT) { - return 'GiftCardSale'; - } - throw new UnsupportedTransactionException('Transaction not supported for this payment method.'); - case TransactionType::REFUND: - if ($builder->paymentMethod->paymentMethodType === PaymentMethodType::CREDIT) { - return 'CreditReturn'; - } elseif ($builder->paymentMethod->paymentMethodType === PaymentMethodType::DEBIT) { - return 'DebitReturn'; - } elseif ($builder->paymentMethod->paymentMethodType === PaymentMethodType::CASH) { - return 'CashReturn'; - } elseif ($builder->paymentMethod->paymentMethodType === PaymentMethodType::EBT) { - return 'EBTFSReturn'; - } - throw new UnsupportedTransactionException('Transaction not supported for this payment method.'); - case TransactionType::REVERSAL: - if ($builder->paymentMethod->paymentMethodType === PaymentMethodType::CREDIT) { - return 'CreditReversal'; - } elseif ($builder->paymentMethod->paymentMethodType === PaymentMethodType::DEBIT) { - return 'DebitReversal'; - } elseif ($builder->paymentMethod->paymentMethodType === PaymentMethodType::GIFT) { - return 'GiftCardReversal'; - } - throw new UnsupportedTransactionException('Transaction not supported for this payment method.'); - case TransactionType::EDIT: - if ($builder->transactionModifier === TransactionModifier::LEVEL_II) { - return 'CreditCPCEdit'; - } else { - return 'CreditTxnEdit'; - } - break; - case TransactionType::VOID: - if ($builder->paymentMethod->paymentMethodType === PaymentMethodType::CREDIT) { - return 'CreditVoid'; - } elseif ($builder->paymentMethod->paymentMethodType === PaymentMethodType::ACH) { - return 'CheckVoid'; - } elseif ($builder->paymentMethod->paymentMethodType === PaymentMethodType::GIFT) { - return 'GiftCardVoid'; - } - throw new UnsupportedTransactionException('Transaction not supported for this payment method.'); - case TransactionType::ADD_VALUE: - if ($builder->paymentMethod->paymentMethodType === PaymentMethodType::CREDIT) { - return 'PrePaidAddValue'; - } elseif ($builder->paymentMethod->paymentMethodType === PaymentMethodType::DEBIT) { - return 'DebitAddValue'; - } elseif ($builder->paymentMethod->paymentMethodType === PaymentMethodType::GIFT) { - return 'GiftCardAddValue'; - } - throw new UnsupportedTransactionException('Transaction not supported for this payment method.'); - case TransactionType::BALANCE: - if ($builder->paymentMethod->paymentMethodType === PaymentMethodType::CREDIT) { - return 'PrePaidBalanceInquiry'; - } elseif ($builder->paymentMethod->paymentMethodType === PaymentMethodType::EBT) { - return 'EBTBalanceInquiry'; - } elseif ($builder->paymentMethod->paymentMethodType === PaymentMethodType::GIFT) { - return 'GiftCardBalance'; - } - throw new UnsupportedTransactionException('Transaction not supported for this payment method.'); - case TransactionType::ACTIVATE: - return 'GiftCardActivate'; - case TransactionType::ALIAS: - return 'GiftCardAlias'; - case TransactionType::REPLACE: - return 'GiftCardReplace'; - case TransactionType::REWARD: - return 'GiftCardReward'; - case TransactionType::TOKEN_DELETE: - case TransactionType::TOKEN_UPDATE: - return 'ManageTokens'; - default: - break; - } - - throw new UnsupportedTransactionException('Unknown transaction'); - } - - protected function mapReportType(ReportBuilder $builder) - { - switch ($builder->reportType) { - case ReportType::ACTIVITY: - case ReportType::TRANSACTION_DETAIL: - case ReportType::FIND_TRANSACTIONS: - return 'FindTransactions'; - default: - throw new UnsupportedTransactionException(); - } - } - - /** - * Converts a XML string to a simple object for use, - * removing extra nodes that are not necessary for - * handling the response - * - * @param string $xml Response XML from the gateway - * - * @return \SimpleXMLElement - */ - protected function xml2object($xml) - { - $envelope = simplexml_load_string( - $xml, - 'SimpleXMLElement', - 0, - 'http://schemas.xmlsoap.org/soap/envelope/' - ); - - foreach ($envelope->Body as $response) { - $children = $response->children(static::XML_NAMESPACE); - foreach ($children as $item) { - return $item; - } - } - - throw new Exception('XML from gateway could not be parsed'); - } - - /** - * Tests the payment method for a token value - * - * @param IPaymentMethod $paymentMethod The payment method - * - * @return [bool, string|null] - */ - protected function hasToken(IPaymentMethod $paymentMethod) - { - $tokenValue = null; - - if ($paymentMethod instanceof ITokenizable && !empty($paymentMethod->token)) { - $tokenValue = $paymentMethod->token; - return [true, $tokenValue]; - } - - return [false, $tokenValue]; - } - - /** - * Normalizes response code for success responses - * - * @param string $input Original response code - * - * @return string - */ - protected function normalizeResponse($input) - { - if (in_array($input, ['0', '85'])) { - $input = '00'; - } - - return $input; - } - - /** - * Serializes builder information into XML - * - * @param DOMDocument $xml XML instance - * @param BaseBuilder $builder Request builder - * @param bool $isCheck If payment method is ACH - * - * @return DOMElement - */ - protected function hydrateHolder(DOMDocument $xml, BaseBuilder $builder, $isCheck = false) - { - $holder = $xml->createElement($isCheck ? 'ConsumerInfo' : 'CardHolderData'); - - if ($isCheck && $builder->paymentMethod instanceof RecurringPaymentMethod) { - return null; - } - - if ($builder->billingAddress !== null) { - $holder->appendChild( - $xml->createElement($isCheck ? 'Address1' : 'CardHolderAddr', $builder->billingAddress->streetAddress1) - ); - $holder->appendChild( - $xml->createElement($isCheck ? 'City' : 'CardHolderCity', $builder->billingAddress->city) - ); - $holder->appendChild( - $xml->createElement($isCheck ? 'State' : 'CardHolderState', $builder->billingAddress->getProvince()) - ); - $holder->appendChild( - $xml->createElement($isCheck ? 'Zip' : 'CardHolderZip', $builder->billingAddress->postalCode) - ); - } - - $propertyName = $isCheck ? 'checkHolderName' : 'cardHolderName'; - if (!empty($builder->paymentMethod->{$propertyName})) { - $names = explode(' ', $builder->paymentMethod->{$propertyName}, 2); - $holder->appendChild( - $xml->createElement($isCheck ? 'FirstName' : 'CardHolderFirstName', $names[0]) - ); - - if (isset($names[1])) { - $holder->appendChild( - $xml->createElement($isCheck ? 'LastName' : 'CardHolderLastName', $names[1]) - ); - } - } - - if ($isCheck) { - if ($builder->paymentMethod->checkHolderName !== null) { - $holder->appendChild($xml->createElement('CheckName', $builder->paymentMethod->checkHolderName)); - } - - if ($builder->paymentMethod->phoneNumber !== null) { - $holder->appendChild($xml->createElement('PhoneNumber', $builder->paymentMethod->phoneNumber)); - } - - if ($builder->paymentMethod->driversLicenseNumber !== null) { - $holder->appendChild($xml->createElement('DLNumber', $builder->paymentMethod->driversLicenseNumber)); - } - - if ($builder->paymentMethod->driversLicenseState !== null) { - $holder->appendChild($xml->createElement('DLState', $builder->paymentMethod->driversLicenseState)); - } - - if ($builder->paymentMethod->ssnLast4 !== null - || $builder->paymentMethod->birthYear !== null - ) { - $identity = $xml->createElement('IdentityInfo'); - $identity->appendChild($xml->createElement('SSNL4', $builder->paymentMethod->ssnLast4)); - $identity->appendChild($xml->createElement('DOBYear', $builder->paymentMethod->birthYear)); - $holder->appendChild($identity); - } - } - - return $holder; - } - - protected function hydrateAccountType($type) - { - switch ($type) { - case AccountType::CHECKING: - return 'CHECKING'; - case AccountType::SAVINGS: - return 'SAVINGS'; - } - } - - /** - * Serializes builder information into XML - * - * @param DOMDocument $xml XML instance - * @param BaseBuilder $builder Request builder - * - * @return DOMElement - */ - protected function hydrateAdditionalTxnFields(DOMDocument $xml, BaseBuilder $builder) - { - $additionalTxnFields = $xml->createElement('AdditionalTxnFields'); - - if ($builder->description !== null && $builder->description !== '') { - $additionalTxnFields->appendChild( - $xml->createElement('Description', $builder->description) - ); - } - - if ($builder->invoiceNumber !== null && $builder->invoiceNumber !== '') { - $additionalTxnFields->appendChild( - $xml->createElement('InvoiceNbr', $builder->invoiceNumber) - ); - } - - if ($builder->customerId !== null && $builder->customerId !== '') { - $additionalTxnFields->appendChild( - $xml->createElement('CustomerID', $builder->customerId) - ); - } - - return $additionalTxnFields; - } - - protected function hydrateCheckType($type) - { - switch ($type) { - case CheckType::PERSONAL: - return 'PERSONAL'; - case CheckType::BUSINESS: - return 'BUSINESS'; - case CheckType::PAYROLL: - return 'PAYROLL'; - } - } - - /** - * Serializes builder information into XML - * - * @param DOMDocument $xml XML instance - * @param BaseBuilder $builder Request builder - * - * @return DOMElement - */ - protected function hydrateEncryptionData(DOMDocument $xml, BaseBuilder $builder) - { - $enc = $xml->createElement('EncryptionData'); - - if ($builder->paymentMethod->encryptionData->version !== null) { - $enc->appendChild($xml->createElement('Version', $builder->paymentMethod->encryptionData->version)); - } - - if ($builder->paymentMethod->encryptionData->trackNumber !== null) { - $enc->appendChild($xml->createElement('TrackNumber', $builder->paymentMethod->encryptionData->trackNumber)); - } - - if ($builder->paymentMethod->encryptionData->ktb !== null) { - $enc->appendChild($xml->createElement('KTB', $builder->paymentMethod->encryptionData->ktb)); - } - - if ($builder->paymentMethod->encryptionData->ksn !== null) { - $enc->appendChild($xml->createElement('KSN', $builder->paymentMethod->encryptionData->ksn)); - } - - return $enc; - } - - protected function hydrateEntryMethod($method) - { - switch ($method) { - case EntryMethod::MANUAL: - return 'Manual'; - case EntryMethod::SWIPE: - return 'Swipe'; - case EntryMethod::PROXIMITY: - return 'Proximity'; - } - } - - /** - * Serializes builder information into XML - * - * @param DOMDocument $xml XML instance - * @param BaseBuilder $builder Request builder - * @param bool $hasToken If request builder is using token data - * @param string $tokenValue Token if `$hasToken` is `true` - * - * @return DOMElement - */ - protected function hydrateManualEntry(DOMDocument $xml, BaseBuilder $builder, $hasToken = false, $tokenValue = null) - { - if ($hasToken) { - $me = $xml->createElement('TokenData'); - } else { - $me = $xml->createElement('ManualEntry'); - } - - if ($hasToken || isset($builder->paymentMethod->number)) { - $me->appendChild( - $xml->createElement( - $hasToken ? 'TokenValue' : 'CardNbr', - $hasToken ? $tokenValue : $builder->paymentMethod->number - ) - ); - } - - if (isset($builder->paymentMethod->expMonth)) { - $me->appendChild($xml->createElement('ExpMonth', $builder->paymentMethod->expMonth)); - } - - if (isset($builder->paymentMethod->expYear)) { - $me->appendChild($xml->createElement('ExpYear', $builder->paymentMethod->expYear)); - } - - if (isset($builder->paymentMethod->cvn)) { - $me->appendChild($xml->createElement('CVV2', $builder->paymentMethod->cvn)); - } - - $me->appendChild( - $xml->createElement('CardPresent', ($builder->paymentMethod->cardPresent ? 'Y' : 'N')) - ); - - $me->appendChild( - $xml->createElement('ReaderPresent', ($builder->paymentMethod->readerPresent ? 'Y' : 'N')) - ); - - return $me; - } - - /** - * Serializes builder information into XML - * - * @param DOMDocument $xml XML instance - * @param BaseBuilder $builder Request builder - * @param bool $hasToken If request builder is using token data - * @param string $tokenValue Token if `$hasToken` is `true` - * - * @return DOMElement - */ - protected function hydrateTrackData(DOMDocument $xml, BaseBuilder $builder, $hasToken = false, $tokenValue = null) - { - $trackData = $xml->createElement($hasToken ? 'TokenValue' : 'TrackData'); - - if ($hasToken) { - $trackData->appendChild($xml->createElement('TokenValue', $tokenValue)); - return $trackData; - } - - $trackData->appendChild($xml->createTextNode($builder->paymentMethod->value)); - if ($builder->paymentMethod->paymentMethodType !== PaymentMethodType::DEBIT) { - $trackData->setAttribute( - 'method', - $builder->paymentMethod->entryMethod === EntryMethod::SWIPE - ? 'swipe' - : 'proximity' - ); - } - - return $trackData; - } - - public function supportsHostedPayments() - { - return $this->supportsHostedPayments; - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Gateways/RealexConnector.php b/classes/includes/vendor/globalpayments/php-sdk/src/Gateways/RealexConnector.php deleted file mode 100644 index 47b30f4..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Gateways/RealexConnector.php +++ /dev/null @@ -1,1413 +0,0 @@ -transactionModifier) && - $builder->transactionModifier === TransactionModifier::ENCRYPTED_MOBILE && - $builder->paymentMethod->mobileType === EncyptedMobileType::GOOGLE_PAY && - (empty($builder->amount) || empty($builder->currency)) - ) { - throw new BuilderException("Amount and Currency cannot be null for google payment"); - } - - $xml = new DOMDocument(); - $timestamp = isset($builder->timestamp) ? $builder->timestamp : GenerationUtils::generateTimestamp(); - $orderId = isset($builder->orderId) ? $builder->orderId : GenerationUtils::generateOrderId(); - $transactionType = $this->mapAuthRequestType($builder); - - // Build Request - $request = $xml->createElement("request"); - $request->setAttribute("timestamp", $timestamp); - $request->setAttribute("type", $transactionType); - - $request->appendChild($xml->createElement("merchantid", $this->merchantId)); - - if ($this->accountId !== null) { - $request->appendChild($xml->createElement("account", $this->accountId)); - } - if ($this->channel !== null) { - $request->appendChild($xml->createElement("channel", $this->channel)); - } - - $request->appendChild($xml->createElement("orderid", $orderId)); - - if (isset($builder->amount)) { - $amount = $xml->createElement("amount", preg_replace('/[^0-9]/', '', sprintf('%01.2f', $builder->amount))); - $amount->setAttribute("currency", $builder->currency); - $request->appendChild($amount); - } - - // This needs to be figured out based on txn type and set to 0, 1 or MULTI - if ($builder->transactionType === TransactionType::SALE || $builder->transactionType == TransactionType::AUTH) { - $autoSettle = $builder->transactionType === TransactionType::SALE ? "1" : "0"; - $element = $xml->createElement("autosettle"); - $element->setAttribute("flag", $autoSettle); - $request->appendChild($element); - } - - // For Fraud Decision Manager - if (!empty($builder->customerData)) { - $customerValue = $builder->customerData; - $customer = $xml->createElement("customer"); - $customer->appendChild($xml->createElement("customerid", $customerValue->id)); - $customer->appendChild($xml->createElement("firstname", $customerValue->firstName)); - $customer->appendChild($xml->createElement("lastname", $customerValue->lastName)); - $customer->appendChild($xml->createElement("dateofbirth", $customerValue->dateOfBirth)); - $customer->appendChild($xml->createElement("customerpassword", $customerValue->customerPassword)); - $customer->appendChild($xml->createElement("email", $customerValue->email)); - $customer->appendChild($xml->createElement("domainname", $customerValue->domainName)); - $customer->appendChild($xml->createElement("devicefingerprint", $customerValue->deviceFingerPrint)); - $customer->appendChild($xml->createElement("phonenumber", $customerValue->homePhone)); - $request->appendChild($customer); - } - - if (!empty($builder->productData)) { - $prod = []; - $productValues = $builder->productData; - $products = $xml->createElement("products"); - - foreach ($productValues as $prod) { - $product = $xml->createElement("product"); - $product->appendChild($xml->createElement('product_id', $prod['product_id'])); - $product->appendChild($xml->createElement('productname', $prod['productname'])); - $product->appendChild($xml->createElement('quantity', $prod['quantity'])); - $product->appendChild($xml->createElement('unitprice', $prod['unitprice'])); - $product->appendChild($xml->createElement('gift', $prod['gift'])); - $product->appendChild($xml->createElement('type', $prod['type'])); - $product->appendChild($xml->createElement('risk', $prod['risk'])); - $product->appendChild($products); - $request->appendChild($product); - } - } - - if ($builder->decisionManager !== null) { - $dmValues = $builder->decisionManager; - $fraud = $xml->createElement("fraud"); - $dm = $fraud->appendChild($xml->createElement('dm')); - $dm->appendChild($xml->createElement('billtohostname', $dmValues->billToHostName)); - $dm->appendChild($xml->createElement( - 'billtohttpbrowsercookiesaccepted', - ($dmValues->billToHttpBrowserCookiesAccepted) != true ? 'false' : 'true' - )); - $dm->appendChild($xml->createElement('billtohttpbrowseremail', $dmValues->billToHttpBrowserEmail)); - $dm->appendChild($xml->createElement('billtohttpbrowsertype', $dmValues->billToHttpBrowserType)); - $dm->appendChild($xml->createElement('billtoipnetworkaddress', $dmValues->billToIpNetworkAddress)); - $dm->appendChild($xml->createElement( - 'businessrulesscorethreshold', - $dmValues->businessRulessCoreThresHold - )); - $dm->appendChild($xml->createElement('billtopersonalid', $dmValues->billToPersonalId)); - $dm->appendChild($xml->createElement('invoiceheadertendertype', $dmValues->invoiceHeaderTenderType)); - $dm->appendChild($xml->createElement( - 'invoiceheaderisgift', - ($dmValues->invoiceHeaderIsGift) != true ? 'false' : 'true' - )); - $dm->appendChild($xml->createElement('decisionmanagerprofile', $dmValues->decisionManagerProfile)); - $dm->appendChild($xml->createElement( - 'invoiceheaderreturnsaccepted', - ($dmValues->invoiceHeaderReturnsAccepted) != true ? 'false' : 'true' - )); - $dm->appendChild($xml->createElement('itemhosthedge', $dmValues->itemHostHedge)); - $dm->appendChild($xml->createElement('itemnonsensicalhedge', $dmValues->itemNonsensicalHedge)); - $dm->appendChild($xml->createElement('itemobscenitieshedge', $dmValues->itemObscenitiesHedge)); - $dm->appendChild($xml->createElement('itemphonehedge', $dmValues->itemPhoneHedge)); - $dm->appendChild($xml->createElement('itemtimehedge', $dmValues->itemTimeHedge)); - $dm->appendChild($xml->createElement('itemvelocityhedge', $dmValues->itemVelocityHedge)); - $request->appendChild($dm); - } - - if (!empty($builder->customData)) { - $cust = []; - $customValues = $builder->customData; - $custom = $xml->createElement("custom"); - - foreach ($customValues as $cust) { - $custom->appendChild($xml->createElement('field01', $cust['field01'])); - $custom->appendChild($xml->createElement('field02', $cust['field02'])); - $custom->appendChild($xml->createElement('field03', $cust['field03'])); - $custom->appendChild($xml->createElement('field04', $cust['field04'])); - $request->appendChild($custom); - } - } - - // For DCC rate lookup - if ($builder->transactionType === TransactionType::DCC_RATE_LOOKUP) { - $dccinfo = $xml->createElement("dccinfo"); - $dccinfo->appendChild($xml->createElement("ccp", $builder->dccProcessor)); - $dccinfo->appendChild($xml->createElement("type", $builder->dccType)); - $dccinfo->appendChild($xml->createElement("ratetype", $builder->dccRateType)); - $request->appendChild($dccinfo); - } - - // For DCC charge/auth - if (!empty($builder->dccRateData)) { - $dccinfo = $xml->createElement("dccinfo"); - - $amount = $xml->createElement("amount", preg_replace('/[^0-9]/', '', $builder->dccRateData->amount)); - $amount->setAttribute("currency", $builder->dccRateData->currency); - - $dccinfo->appendChild($amount); - $dccinfo->appendChild($xml->createElement("ccp", $builder->dccRateData->dccProcessor)); - $dccinfo->appendChild($xml->createElement("type", $builder->dccRateData->dccType)); - $dccinfo->appendChild($xml->createElement("rate", $builder->dccRateData->dccRate)); - $dccinfo->appendChild($xml->createElement("ratetype", $builder->dccRateData->dccRateType)); - $request->appendChild($dccinfo); - } - - // Hydrate the payment data fields - if ($builder->paymentMethod instanceof CreditCardData) { - $card = $builder->paymentMethod; - - if ($builder->transactionModifier === TransactionModifier::ENCRYPTED_MOBILE) { - $request->appendChild($xml->createElement("token", $card->token)); - $request->appendChild($xml->createElement("mobile", $card->mobileType)); - } else { - $cardElement = $xml->createElement("card"); - $cardElement->appendChild($xml->createElement("number", $card->number)); - $cardElement->appendChild($xml->createElement("expdate", $card->getShortExpiry())); - $cardElement->appendChild($xml->createElement("chname", $card->cardHolderName)); - $cardElement->appendChild($xml->createElement("type", strtoupper($card->getCardType()))); - - if ($card->cvn !== null) { - //if cvn number is not empty indicator should be PRESENT - $cvnPresenceIndicator = (!empty($card->cvn)) ? - CvnPresenceIndicator::PRESENT: - $card->cvnPresenceIndicator; - - $cvnElement = $xml->createElement("cvn"); - $cvnElement->appendChild($xml->createElement("number", $card->cvn)); - $cvnElement->appendChild($xml->createElement("presind", $cvnPresenceIndicator)); - $cardElement->appendChild($cvnElement); - } - $request->appendChild($cardElement); - } - // issueno - $hash = ''; - if ($builder->transactionType === TransactionType::VERIFY) { - $hash = GenerationUtils::generateHash( - $this->sharedSecret, - implode('.', [ - $timestamp, - $this->merchantId, - $orderId, - $card->number - ]) - ); - } else { - $requestValues = $this->getShal1RequestValues($timestamp, $orderId, $builder, $card); - - $hash = GenerationUtils::generateHash( - $this->sharedSecret, - implode('.', $requestValues) - ); - } - - $request->appendChild($xml->createElement("sha1hash", $hash)); - } - if ($builder->paymentMethod instanceof RecurringPaymentMethod) { - $recurring = $builder->paymentMethod; - $request->appendChild($xml->createElement("payerref", $recurring->customerKey)); - $request->appendChild($xml->createElement( - "paymentmethod", - isset($recurring->key) ? $recurring->key : $recurring->id - )); - - if ($builder->cvn !== null && $builder->cvn !== '') { - $paymentData = $xml->createElement("paymentdata"); - $cvn = $xml->createElement("cvn"); - $cvn->appendChild($xml->createElement("number", $builder->cvn)); - $paymentData->appendChild($cvn); - $request->appendChild($paymentData); - } - - $hash = ''; - if ($builder->transactionType === TransactionType::VERIFY) { - if (!empty($builder->transactionModifier) && - $builder->transactionModifier === TransactionModifier::SECURE3D) { - $hash = GenerationUtils::generateHash( - $this->sharedSecret, - implode('.', [ - $timestamp, - $this->merchantId, - $orderId, - preg_replace('/[^0-9]/', '', sprintf('%01.2f', $builder->amount)), - $builder->currency, - $recurring->customerKey, - ]) - ); - } else { - $hash = GenerationUtils::generateHash( - $this->sharedSecret, - implode('.', [ - $timestamp, - $this->merchantId, - $orderId, - $recurring->customerKey, - ]) - ); - } - } else { - $hash = GenerationUtils::generateHash( - $this->sharedSecret, - implode('.', [ - $timestamp, - $this->merchantId, - $orderId, - preg_replace('/[^0-9]/', '', sprintf('%01.2f', $builder->amount)), - $builder->currency, - $recurring->customerKey, - ]) - ); - } - $request->appendChild($xml->createElement("sha1hash", $hash)); - } else { - // TODO: Token Processing - //$request->appendChild($xml->createElement("sha1hash", GenerateHash(order, token)); - } - - // refund hash - if ($builder->transactionType === TransactionType::REFUND) { - $request->appendChild($xml->createElement( - "refundhash", - GenerationUtils::generateHash($this->refundPassword) ?: '' - )); - } - - - - if ($builder->paymentMethod instanceof AlternativePaymentMethod) { - $this->buildAlternativePaymentMethod($builder, $request, $xml); - } - - // comment ...TODO: needs to be multiple - if ($builder->description != null) { - $comments = $xml->createElement("comments"); - $comment = $xml->createElement("comment", $builder->description); - $comment->setAttribute("id", "1"); - $comments->appendChild($comment); - - $request->appendChild($comments); - } - - if ($builder->paymentMethod instanceof AlternativePaymentMethod) { - $hash = GenerationUtils::generateHash( - $this->sharedSecret, - implode('.', [ - $timestamp, - $this->merchantId, - $orderId, - preg_replace('/[^0-9]/', '', sprintf('%01.2f', $builder->amount)), - $builder->currency, - $builder->paymentMethod->alternativePaymentMethodType, - ]) - ); - $request->appendChild($xml->createElement("sha1hash", $hash)); - } - - if ($builder->recurringType !== null || $builder->recurringSequence !== null) { - $recurring = $xml->createElement("recurring"); - $recurring->setAttribute("type", strtolower($builder->recurringType)); - $recurring->setAttribute("sequence", strtolower($builder->recurringSequence)); - $request->appendChild($recurring); - } - - // fraud filter - $this->buildFraudFilter($builder, $xml, $request); - - // tssinfo - - // stored credential - if ($builder->storedCredential != null) { - $storedCredential = $xml->createElement("storedcredential"); - $storedCredential->appendChild($xml->createElement("type", $builder->storedCredential->type)); - $storedCredential->appendChild($xml->createElement("initiator", $builder->storedCredential->initiator)); - $storedCredential->appendChild($xml->createElement("sequence", $builder->storedCredential->sequence)); - $storedCredential->appendChild($xml->createElement("srd", $builder->storedCredential->schemeId)); - $request->appendChild($storedCredential); - } - - // mpi - $secureEcom = $builder->paymentMethod->threeDSecure; - if (!empty($secureEcom)) { - $mpi = $xml->createElement("mpi"); - $mpi->appendChild($xml->createElement("eci", $secureEcom->eci)); - $mpi->appendChild($xml->createElement("cavv", $secureEcom->cavv)); - $mpi->appendChild($xml->createElement("xid", $secureEcom->xid)); - - if ($secureEcom->directoryServerTransactionId != null || $secureEcom->authenticationValue != null || $secureEcom->messageVersion != null) { - $mpi->appendChild($xml->createElement("ds_trans_id", $secureEcom->directoryServerTransactionId)); - $mpi->appendChild($xml->createElement("authentication_value", $secureEcom->authenticationValue)); - $mpi->appendChild($xml->createElement("message_version", $secureEcom->messageVersion)); - } - $request->appendChild($mpi); - } - - $acceptedResponseCodes = $this->mapAcceptedCodes($transactionType); - $response = $this->doTransaction($xml->saveXML($request)); - return $this->mapResponse($response, $acceptedResponseCodes); - } - - /** - * @return Transaction - */ - public function processSecure3d(Secure3dBuilder $builder) - { - $transType = $builder->getTransactionType(); - - if ($transType === TransactionType::VERIFY_ENROLLED) { - $authBuilder = (new AuthorizationBuilder($transType, $builder->getPaymentMethod())) - ->withAmount($builder->getAmount()) - ->withCurrency($builder->getCurrency()) - ->withOrderId($builder->getOrderId()); - - return $this->processAuthorization($authBuilder); - } elseif ($transType === TransactionType::VERIFY_SIGNATURE) { - // Get our three d secure object - $secureEcom = $builder->getThreeDSecure(); - - // Create our transaction reference - $reference = new TransactionReference(); - $reference->orderId = $secureEcom->getOrderId(); - - $managementBuilder = (new ManagementBuilder($transType)) - ->withAmount($secureEcom->getAmount()) - ->withCurrency($secureEcom->getCurrency()) - ->withPayerAuthenticationResponse($builder->getPayerAuthenticationResponse()) - ->withPaymentMethod($reference); - return $this->manageTransaction($managementBuilder); - } - throw new UnsupportedTransactionException(sprintf("Unknown transaction type %s", $transType)); - } - - public function serializeRequest(AuthorizationBuilder $builder) - { - // check for hpp config - if ($this->hostedPaymentConfig === null) { - throw new ApiException("Hosted configuration missing, Please check you configuration."); - } - - // check for right transaction types - if ($builder->transactionType !== TransactionType::SALE - && $builder->transactionType !== TransactionType::AUTH - && $builder->transactionType !== TransactionType::VERIFY - ) { - throw new UnsupportedTransactionException("Only Charge and Authorize are supported through HPP."); - } - - $orderId = isset($builder->orderId) ? $builder->orderId : GenerationUtils::generateOrderId(); - $timestamp = isset($builder->timestamp) ? $builder->timestamp : GenerationUtils::generateTimestamp(); - - $this->setSerializeData('MERCHANT_ID', $this->merchantId); - $this->setSerializeData('ACCOUNT', $this->accountId); - $this->setSerializeData('CHANNEL', $this->channel); - $this->setSerializeData('ORDER_ID', $orderId); - if ($builder->amount !== null) { - $this->setSerializeData('AMOUNT', preg_replace('/[^0-9]/', '', sprintf('%01.2f', $builder->amount))); - } - $this->setSerializeData('CURRENCY', $builder->currency); - $this->setSerializeData('TIMESTAMP', $timestamp); - $this->setSerializeData( - 'AUTO_SETTLE_FLAG', - ($builder->transactionType == TransactionType::SALE) ? "1" : "0" - ); - $this->setSerializeData('COMMENT1', $builder->description); - - if (isset($this->hostedPaymentConfig->requestTransactionStabilityScore)) { - $this->serializeData["RETURN_TSS"] = - $this->hostedPaymentConfig->requestTransactionStabilityScore ? "1" : "0"; - } - if (isset($this->hostedPaymentConfig->directCurrencyConversionEnabled)) { - $this->serializeData["DCC_ENABLE"] = - $this->hostedPaymentConfig->directCurrencyConversionEnabled ? "1" : "0"; - } - if (!empty($builder->hostedPaymentData)) { - $this->setSerializeData('CUST_NUM', $builder->hostedPaymentData->customerNumber); - - if (!empty($this->hostedPaymentConfig->displaySavedCards) && - !empty($builder->hostedPaymentData->customerKey)) { - $this->setSerializeData('HPP_SELECT_STORED_CARD', $builder->hostedPaymentData->customerKey); - } - - if (isset($builder->hostedPaymentData->offerToSaveCard)) { - $this->setSerializeData( - 'OFFER_SAVE_CARD', - $builder->hostedPaymentData->offerToSaveCard ? "1" : "0" - ); - } - if (isset($builder->hostedPaymentData->customerExists)) { - $this->setSerializeData( - 'PAYER_EXIST', - $builder->hostedPaymentData->customerExists ? "1" : "0" - ); - } - if (isset($builder->hostedPaymentData->customerKey)) { - $this->setSerializeData('PAYER_REF', $builder->hostedPaymentData->customerKey); - } - if (isset($builder->hostedPaymentData->paymentKey)) { - $this->setSerializeData('PMT_REF', $builder->hostedPaymentData->paymentKey); - } - if (isset($builder->hostedPaymentData->productId)) { - $this->setSerializeData('PROD_ID', $builder->hostedPaymentData->productId); - } - } elseif (isset($builder->customerId)) { - $this->setSerializeData('CUST_NUM', $builder->customerId); - } - if (!empty($builder->shippingAddress)) { - // Fraud values - $this->setSerializeData('SHIPPING_CODE', $builder->shippingAddress->postalCode); - $this->setSerializeData('SHIPPING_CO', $builder->shippingAddress->country); - - // 3DS 2.0 values - $this->setSerializeData('HPP_SHIPPING_STREET1', $builder->shippingAddress->streetAddress1); - $this->setSerializeData('HPP_SHIPPING_STREET2', $builder->shippingAddress->streetAddress2); - $this->setSerializeData('HPP_SHIPPING_STREET3', $builder->shippingAddress->streetAddress3); - $this->setSerializeData('HPP_SHIPPING_CITY', $builder->shippingAddress->city); - $this->setSerializeData('HPP_SHIPPING_STATE', $builder->shippingAddress->state); - $this->setSerializeData('HPP_SHIPPING_POSTALCODE', $builder->shippingAddress->postalCode); - $this->setSerializeData('HPP_SHIPPING_COUNTRY', $builder->shippingAddress->country); - } - if (!empty($builder->billingAddress)) { - // Fraud values - $this->setSerializeData('BILLING_CODE', $builder->billingAddress->postalCode); - $this->setSerializeData('BILLING_CO', $builder->billingAddress->country); - - // 3DS 2.0 values - $this->setSerializeData('HPP_BILLING_STREET1', $builder->billingAddress->streetAddress1); - $this->setSerializeData('HPP_BILLING_STREET2', $builder->billingAddress->streetAddress2); - $this->setSerializeData('HPP_BILLING_STREET3', $builder->billingAddress->streetAddress3); - $this->setSerializeData('HPP_BILLING_CITY', $builder->billingAddress->city); - $this->setSerializeData('HPP_BILLING_STATE', $builder->billingAddress->state); - $this->setSerializeData('HPP_BILLING_POSTALCODE', $builder->billingAddress->postalCode); - $this->setSerializeData('HPP_BILLING_COUNTRY', $builder->billingAddress->country); - } - - $this->setSerializeData('VAR_REF', $builder->clientTransactionId); - $this->setSerializeData('HPP_LANG', $this->hostedPaymentConfig->language); - $this->setSerializeData('MERCHANT_RESPONSE_URL', $this->hostedPaymentConfig->responseUrl); - $this->setSerializeData('CARD_PAYMENT_BUTTON', $this->hostedPaymentConfig->paymentButtonText); - if (!empty($builder->hostedPaymentData)) { - $this->setSerializeData('HPP_CUSTOMER_EMAIL', $builder->hostedPaymentData->customerEmail); - $this->setSerializeData('HPP_CUSTOMER_PHONENUMBER_MOBILE', $builder->hostedPaymentData->customerPhoneMobile); - $this->setSerializeData('HPP_CHALLENGE_REQUEST_INDICATOR', $builder->hostedPaymentData->challengeRequest); - if (isset($builder->hostedPaymentData->addressesMatch)) { - $this->setSerializeData('HPP_ADDRESS_MATCH_INDICATOR', $builder->hostedPaymentData->addressesMatch ? 'TRUE' : 'FALSE'); - } - } - if (isset($this->hostedPaymentConfig->cardStorageEnabled)) { - $this->setSerializeData('CARD_STORAGE_ENABLE', $this->hostedPaymentConfig->cardStorageEnabled ? '1' : '0'); - } - if ($builder->transactionType === TransactionType::VERIFY) { - $this->setSerializeData( - 'VALIDATE_CARD_ONLY', - $builder->transactionType === TransactionType::VERIFY ? '1' : '0' - ); - } - if (!empty($this->hostedPaymentConfig->FraudFilterMode)) { - $this->setSerializeData('HPP_FRAUD_FILTER_MODE', $this->hostedPaymentConfig->FraudFilterMode); - } - - if ($builder->recurringType !== null || $builder->recurringSequence !== null) { - $this->setSerializeData('RECURRING_TYPE', strtolower($builder->recurringType)); - $this->setSerializeData('RECURRING_SEQUENCE', strtolower($builder->recurringSequence)); - } - if (isset($this->hostedPaymentConfig->version)) { - $this->setSerializeData('HPP_VERSION', $this->hostedPaymentConfig->version); - } - - $toHash = [ - $timestamp, - $this->merchantId, - $orderId, - ($builder->amount !== null) ? preg_replace('/[^0-9]/', '', sprintf('%01.2f', $builder->amount)) : null, - $builder->currency, - ]; - - if ($this->hostedPaymentConfig->cardStorageEnabled - || ($builder->hostedPaymentData != null - && $builder->hostedPaymentData->offerToSaveCard) - || $this->hostedPaymentConfig->displaySavedCards - ) { - $toHash[] = ($builder->hostedPaymentData->customerKey !== null) ? - $builder->hostedPaymentData->customerKey : - null; - $toHash[] = ($builder->hostedPaymentData->paymentKey !== null) ? - $builder->hostedPaymentData->paymentKey : - null; - } - - if ($this->hostedPaymentConfig->fraudFilterMode !== FraudFilterMode::NONE) { - $toHash[] = $this->hostedPaymentConfig->fraudFilterMode; - } - - $this->serializeData["SHA1HASH"] = GenerationUtils::generateHash($this->sharedSecret, implode('.', $toHash)); - return GenerationUtils::convertArrayToJson($this->serializeData, $this->hostedPaymentConfig->version); - } - - /** - * {@inheritdoc} - * - * @param ManagementBuilder $builder The transaction's builder - * - * @return Transaction - */ - public function manageTransaction(ManagementBuilder $builder) - { - $xml = new DOMDocument(); - $timestamp = GenerationUtils::generateTimestamp(); - $orderId = $builder->orderId ?: GenerationUtils::generateOrderId(); - $transactionType = $this->mapManageRequestType($builder); - // Build Request - $request = $xml->createElement("request"); - $request->setAttribute("timestamp", $timestamp); - $request->setAttribute("type", $transactionType); - - $request->appendChild($xml->createElement("merchantid", $this->merchantId)); - - if ($this->accountId !== null) { - $request->appendChild($xml->createElement("account", $this->accountId)); - } - if (is_null($builder->alternativePaymentType)) { - $request->appendChild($xml->createElement("channel", $this->channel)); - } - - if ($builder->amount !== null) { - $amount = $xml->createElement("amount", preg_replace('/[^0-9]/', '', sprintf('%01.2f', $builder->amount))); - $amount->setAttribute("currency", $builder->currency); - $request->appendChild($amount); - } elseif ($builder->transactionType === TransactionType::CAPTURE) { - throw new BuilderException("Amount cannot be null for capture."); - } - - $request->appendChild($xml->createElement("orderid", $orderId)); - $request->appendChild($xml->createElement("pasref", $builder->transactionId)); - - // rebate hash - if ($builder->transactionType === TransactionType::REFUND && - is_null($builder->alternativePaymentType)) { - $request->appendChild($xml->createElement("authcode", $builder->paymentMethod->authCode)); - } - - // reason code - if ($builder->reasonCode !== null) { - $request->appendChild($xml->createElement("reasoncode", $builder->reasonCode)); - } - - if ($builder->alternativePaymentType !== null) { - $request->appendChild($xml->createElement("paymentmethod", $builder->alternativePaymentType)); - } - - if ($builder->transactionType === TransactionType::VERIFY_SIGNATURE) { - $request->appendChild($xml->createElement("pares", $builder->payerAuthenticationResponse)); - } - - // comments needs to be multiple - if ($builder->description !== null) { - $comments = $xml->createElement("comments"); - $comment = $xml->createElement("comment", $builder->description); - $comment->setAttribute("id", "1"); - $comments->appendChild($comment); - $request->appendChild($comments); - } - - $toHash = [ - $timestamp, - $this->merchantId, - $orderId, - ($builder->amount !== null ? preg_replace('/[^0-9]/', '', sprintf('%01.2f', $builder->amount)) : ''), - ($builder->currency !== null ? $builder->currency : ''), - ($builder->alternativePaymentType !== null ? $builder->alternativePaymentType : '') - ]; - - $request->appendChild( - $xml->createElement( - "sha1hash", - GenerationUtils::generateHash($this->sharedSecret, implode('.', $toHash)) - ) - ); - - // rebate hash - if ($builder->transactionType === TransactionType::REFUND) { - $request->appendChild( - $xml->createElement( - "refundhash", - GenerationUtils::generateHash(isset($this->rebatePassword) ? $this->rebatePassword : '') - ) - ); - } - - $response = $this->doTransaction($xml->saveXML($request)); - return $this->mapResponse($response, $this->mapAcceptedCodes($transactionType)); - } - - public function processReport(ReportBuilder $builder) - { - throw new UnsupportedTransactionException( - 'Reporting functionality is not supported through this gateway.' - ); - } - - public function processRecurring(RecurringBuilder $builder) - { - $xml = new DOMDocument(); - $timestamp = GenerationUtils::generateTimestamp(); - $orderId = $builder->orderId ? $builder->orderId : GenerationUtils::generateOrderId(); - - // Build Request - $request = $xml->createElement("request"); - $request->setAttribute("timestamp", $timestamp); - $request->setAttribute("type", $this->mapRecurringRequestType($builder)); - - $request->appendChild($xml->createElement("merchantid", $this->merchantId)); - - if ($this->accountId !== null) { - $request->appendChild($xml->createElement("account", $this->accountId)); - } - $request->appendChild($xml->createElement("channel", $this->channel)); - $request->appendChild($xml->createElement("orderid", $orderId)); - - if ($builder->transactionType == TransactionType::CREATE || - $builder->transactionType == TransactionType::EDIT) { - if ($builder->entity instanceof Customer) { - $hash = GenerationUtils::generateHash( - $this->sharedSecret, - implode('.', [ - $timestamp, - $this->merchantId, - $orderId, - '', - '', - $builder->entity->key - ]) - ); - - $request->appendChild($this->buildCustomer($xml, $builder)); - } elseif ($builder->entity instanceof RecurringPaymentMethod) { - $payment = $builder->entity; - $paymentKey = (!empty($payment->key)) ? $payment->key : $payment->id; - - if ($builder->transactionType == TransactionType::CREATE) { - $hash = GenerationUtils::generateHash( - $this->sharedSecret, - implode('.', [ - $timestamp, - $this->merchantId, - $orderId, - '', - '', - $payment->customerKey, - $payment->paymentMethod->cardHolderName, - $payment->paymentMethod->number - ]) - ); - } else { - $hash = GenerationUtils::generateHash( - $this->sharedSecret, - implode('.', [ - $timestamp, - $this->merchantId, - $payment->customerKey, - $paymentKey, - $payment->paymentMethod->getShortExpiry(), - $payment->paymentMethod->number - ]) - ); - } - $request->appendChild($this->buildCardElement($xml, $payment, $paymentKey)); - $request->appendChild($xml->createElement("defaultcard", 1)); - } - - //set hash value - $request->appendChild($xml->createElement("sha1hash", $hash)); - } elseif ($builder->transactionType == TransactionType::DELETE) { - if ($builder->entity instanceof RecurringPaymentMethod) { - $payment = $builder->entity; - $paymentKey = (!empty($payment->key)) ? $payment->key : $payment->id; - $cardElement = $xml->createElement("card"); - $cardElement->appendChild($xml->createElement("ref", $paymentKey)); - $cardElement->appendChild($xml->createElement("payerref", $payment->customerKey)); - $request->appendChild($cardElement); - - $hash = GenerationUtils::generateHash( - $this->sharedSecret, - implode('.', [ - $timestamp, - $this->merchantId, - $payment->customerKey, - $paymentKey - ]) - ); - $request->appendChild($xml->createElement("sha1hash", $hash)); - } - } - - $response = $this->doTransaction($xml->saveXML($request)); - return $this->mapResponse($response); - } - - private function buildCustomer($xml, $builder) - { - $customer = $builder->entity; - $type = 'Retail'; - if ($builder->transactionType === TransactionType::EDIT) { - $type = 'Subscriber'; - } - $payer = $xml->createElement("payer"); - $payer->setAttribute("ref", (!empty($customer->key)) ? $customer->key : - GenerationUtils::generateRecurringKey()); - $payer->setAttribute("type", $type); - - $payer->appendChild($xml->createElement("title", $customer->title)); - $payer->appendChild($xml->createElement("firstname", $customer->firstName)); - $payer->appendChild($xml->createElement("surname", $customer->lastName)); - $payer->appendChild($xml->createElement("company", $customer->company)); - - - if ($customer->address != null) { - $address = $xml->createElement("address"); - $address->appendChild($xml->createElement("line1", $customer->address->streetAddress1)); - $address->appendChild($xml->createElement("line2", $customer->address->streetAddress2)); - $address->appendChild($xml->createElement("line3", $customer->address->streetAddress3)); - $address->appendChild($xml->createElement("city", $customer->address->city)); - $address->appendChild($xml->createElement("county", $customer->address->getProvince())); - $address->appendChild($xml->createElement("postcode", $customer->address->postalCode)); - - $country = $xml->createElement("country", $customer->address->country); - if (!empty($customer->address->countryCode)) { - $country->setAttribute("code", $customer->address->countryCode); - } - $address->appendChild($country); - - $payer->appendChild($address); - } - - $phonenumbers = $xml->createElement("phonenumbers"); - $phonenumbers->appendChild($xml->createElement("home", $customer->homePhone)); - $phonenumbers->appendChild($xml->createElement("work", $customer->workPhone)); - $phonenumbers->appendChild($xml->createElement("fax", $customer->fax)); - $phonenumbers->appendChild($xml->createElement("mobile", $customer->mobilePhone)); - - $payer->appendChild($phonenumbers); - $payer->appendChild($xml->createElement("email", $customer->email)); - - return $payer; - } - - private function buildCardElement($xml, $payment, $paymentKey = '') - { - $card = $payment->paymentMethod; - $cardElement = $xml->createElement("card"); - $cardElement->appendChild($xml->createElement("ref", $paymentKey)); - $cardElement->appendChild($xml->createElement("payerref", $payment->customerKey)); - $cardElement->appendChild($xml->createElement("number", $card->number)); - $cardElement->appendChild($xml->createElement("expdate", $card->getShortExpiry())); - $cardElement->appendChild($xml->createElement("chname", $card->cardHolderName)); - $cardElement->appendChild($xml->createElement("type", strtoupper($card->getCardType()))); - - return $cardElement; - } - - /** - * Deserializes the gateway's XML response - * - * @param string $rawResponse The XML response - * - * @return Transaction - */ - protected function mapResponse($rawResponse, array $acceptedCodes = null) - { - $result = new Transaction(); - - $root = $this->xml2object($rawResponse); - - $this->checkResponse($root, $acceptedCodes); - - $result->responseCode = (string)$root->result; - $result->responseMessage = (string)$root->message; - $result->cvnResponseCode = (string)$root->cvnresult; - $result->avsResponseCode = (string)$root->avspostcoderesponse; - $result->avsAddressResponse = (string)$root->avsaddressresponse; - $result->transactionReference = new TransactionReference(); - $result->transactionReference->paymentMethodType = PaymentMethodType::CREDIT; - $result->transactionReference->transactionId = (string)$root->pasref; - $result->transactionReference->authCode = (string)$root->authcode; - $result->transactionReference->orderId = (string)$root->orderid; - $result->timestamp = (!empty($root->attributes()->timestamp)) ? - (string) $root->attributes()->timestamp : - ''; - - // 3d secure enrolled - if (!empty($root->enrolled)) { - $result->threeDSecure = new ThreeDSecure(); - $result->threeDSecure->enrolled = (string)$root->enrolled; - $result->threeDSecure->xid = (string)$root->xid; - $result->threeDSecure->issuerAcsUrl = (string)$root->url; - $result->threeDSecure->payerAuthenticationRequest = (string)$root->pareq; - } - - // 3d secure signature - if (!empty($root->threedsecure)) { - $secureEcom = new ThreeDSecure(); - $secureEcom->status = (string)$root->threedsecure->status; - $secureEcom->eci = (string)$root->threedsecure->eci; - $secureEcom->cavv = (string)$root->threedsecure->cavv; - $secureEcom->xid = (string)$root->threedsecure->xid; - $secureEcom->algorithm = (int)$root->threedsecure->algorithm; - $result->threeDSecure = $secureEcom; - } - - // stored credential - $result->schemeId = (string)$root->srd; - - // dccinfo - if (!empty($root->dccinfo)) { - $result->dccResponseResult = new DccResponseResult(); - - $result->dccResponseResult->cardHolderCurrency = (string)$root->dccinfo->cardholdercurrency; - $result->dccResponseResult->cardHolderAmount = (string)$root->dccinfo->cardholderamount; - $result->dccResponseResult->cardHolderRate = (string)$root->dccinfo->cardholderrate; - $result->dccResponseResult->merchantCurrency = (string)$root->dccinfo->merchantcurrency; - $result->dccResponseResult->merchantAmount = (string)$root->dccinfo->merchantamount; - $result->dccResponseResult->marginRatePercentage = (string)$root->dccinfo->marginratepercentage; - $result->dccResponseResult->exchangeRateSourceName = (string)$root->dccinfo->exchangeratesourcename; - $result->dccResponseResult->commissionPercentage = (string)$root->dccinfo->commissionpercentage; - $result->dccResponseResult->exchangeRateSourceTimestamp = (string) - $root->dccinfo->exchangeratesourcetimestamp; - } - - // fraud filter - if (!empty($root->fraudresponse)) { - $fraudResponse = $root->fraudresponse; - $result->fraudFilterResponse = new FraudManagementResponse(); - - foreach ($fraudResponse->attributes() as $attrName => $attrValue) { - $result->fraudFilterResponse->fraudResponseMode = (!empty($attrValue)) ? (string) $attrValue : ''; - } - - $result->fraudFilterResponse->fraudResponseResult = (!empty($fraudResponse->result)) ? - (string) $fraudResponse->result : ''; - - if (!empty($fraudResponse->rules)) { - foreach ($fraudResponse->rules->rule as $rule) { - $ruleDetails = [ - 'id' => (string) $rule->attributes()->id, - 'name' => (string) $rule->attributes()->name, - 'action' => (string) $rule->action - ]; - $result->fraudFilterResponse->fraudResponseRules[] = $ruleDetails; - } - } - } - - // alternativePaymentResponse - if (!empty($root->paymentmethoddetails)) { - $result->alternativePaymentResponse = new AlternativePaymentResponse(); - - $result->alternativePaymentResponse->paymentMethod = (string) - $root->paymentmethoddetails->paymentmethod; - $result->alternativePaymentResponse->bankAccount = (string) - $root->paymentmethoddetails->bankaccount; - $result->alternativePaymentResponse->accountHolderName = (string) - $root->paymentmethoddetails->accountholdername; - $result->alternativePaymentResponse->country = (string) - $root->paymentmethoddetails->country; - $result->alternativePaymentResponse->redirectUrl = (string) - $root->paymentmethoddetails->redirecturl; - $result->alternativePaymentResponse->paymentPurpose = (string) - $root->paymentmethoddetails->paymentpurpose; - } - - return $result; - } - - protected function checkResponse($root, array $acceptedCodes = null) - { - if ($acceptedCodes === null) { - $acceptedCodes = [ "00" ]; - } - - $responseCode = (string)$root->result; - $responseMessage = (string)$root->message; - - if (!in_array($responseCode, $acceptedCodes)) { - throw new GatewayException( - sprintf('Unexpected Gateway Response: %s - %s', $responseCode, $responseMessage), - $responseCode, - $responseMessage - ); - } - } - - /** - * Generates a request hash from the request data - * - * @param string $timestamp Request timestamp - * @param string $orderId Request order ID - * @param string $amount Request amount - * @param string $currency Request currency - * @param string $paymentData Request payment data - * @param bool $verify Is request a verify transaction - * - * @return string - */ - protected function generateHash( - $timestamp, - $orderId, - $amount, - $currency, - $paymentData = null, - $verify = false - ) { - $data = [ - $timestamp, - $this->merchantId, - $orderId, - ]; - - if (false === $verify) { - $data[] = $amount; - $data[] = $currency; - } - - $data[] = $paymentData; - - return GenerationUtils::generateHash( - $this->sharedSecret, - implode('.', $data) - ); - } - - /** - * Maps a transaction builder to a Realex request type - * - * @param AuthorizationBuilder $builder Transaction builder - * - * @return string - */ - protected function mapAuthRequestType(AuthorizationBuilder $builder) - { - switch ($builder->transactionType) { - case TransactionType::SALE: - case TransactionType::AUTH: - if ($builder->paymentMethod->paymentMethodType == PaymentMethodType::CREDIT) { - if ($builder->transactionModifier === TransactionModifier::OFFLINE) { - return 'offline'; - } elseif ($builder->transactionModifier === TransactionModifier::ENCRYPTED_MOBILE) { - return 'auth-mobile'; - } - } elseif ($builder->paymentMethod->paymentMethodType == PaymentMethodType::RECURRING) { - return (!empty($builder->recurringSequence) && - $builder->recurringSequence == RecurringSequence::FIRST) ? - 'auth' : - 'receipt-in'; - } elseif ($builder->paymentMethod->paymentMethodType == PaymentMethodType::APM) { - return "payment-set"; - } - return 'auth'; - case TransactionType::CAPTURE: - return 'settle'; - case TransactionType::VERIFY: - if ($builder->paymentMethod->paymentMethodType == PaymentMethodType::RECURRING) { - if (!empty($builder->transactionModifier) && - $builder->transactionModifier === TransactionModifier::SECURE3D) { - return 'realvault-3ds-verifyenrolled'; - } - return 'receipt-in-otb'; - } - return 'otb'; - case TransactionType::REFUND: - if ($builder->paymentMethod->paymentMethodType == PaymentMethodType::CREDIT) { - return 'credit'; - } - return 'payment-out'; - case TransactionType::DCC_RATE_LOOKUP: - if ($builder->paymentMethod->paymentMethodType == PaymentMethodType::CREDIT) { - return "dccrate"; - } - return "realvault-dccrate"; - - case TransactionType::REVERSAL: - // TODO: should be customer type - throw new UnsupportedTransactionException( - 'The selected gateway does not support this transaction type.' - ); - case TransactionType::VERIFY_ENROLLED: - return '3ds-verifyenrolled'; - default: - return 'unknown'; - } - } - - /** - * Maps a transaction builder to a Realex request type - * - * @param ManagementBuilder $builder Transaction builder - * - * @return string - */ - protected function mapManageRequestType(ManagementBuilder $builder) - { - switch ($builder->transactionType) { - case TransactionType::CAPTURE: - return 'settle'; - case TransactionType::HOLD: - return 'hold'; - case TransactionType::REFUND: - if ($builder->alternativePaymentType !== null) { - return 'payment-credit'; - } - return 'rebate'; - case TransactionType::RELEASE: - return 'release'; - case TransactionType::VOID: - case TransactionType::REVERSAL: - return 'void'; - case TransactionType::VERIFY_SIGNATURE: - return '3ds-verifysig'; - default: - return 'unknown'; - } - } - - /** - * Maps a transaction builder to a Realex request type - * - * @param RecurringBuilder $builder Transaction builder - * - * @return string - */ - private function mapRecurringRequestType(RecurringBuilder $builder) - { - $entity = $builder->entity; - - switch ($builder->transactionType) { - case TransactionType::CREATE: - if ($entity instanceof Customer) { - return "payer-new"; - } elseif ($entity instanceof RecurringPaymentMethod) { - return "card-new"; - } - throw new UnsupportedTransactionException( - 'The selected gateway does not support this transaction type.' - ); - case TransactionType::EDIT: - if ($entity instanceof Customer) { - return "payer-edit"; - } elseif ($entity instanceof RecurringPaymentMethod) { - return "card-update-card"; - } - throw new UnsupportedTransactionException(); - case TransactionType::DELETE: - if ($entity instanceof RecurringPaymentMethod) { - return "card-cancel-card"; - } - throw new UnsupportedTransactionException( - 'The selected gateway does not support this transaction type.' - ); - default: - throw new UnsupportedTransactionException( - 'The selected gateway does not support this transaction type.' - ); - } - } - - /** - * Converts a XML string to a simple object for use, - * removing extra nodes that are not necessary for - * handling the response - * - * @param string $xml Response XML from the gateway - * - * @return SimpleXMLElement - */ - protected function xml2object($xml) - { - $envelope = simplexml_load_string( - $xml, - 'SimpleXMLElement' - ); - - return $envelope; - } - - /** - * Return the request values for Shal hash generation based on transaction type - * EncyptedMobileType::GOOGLE_PAY requires amount and currency with token - * EncyptedMobileType::APPLE_PAY doesn't requires amount and currency. token contains those values - * - * @param string $timestamp current timestamp - * @param int $orderId current order id - * @param object $builder auth builder object - * @param object $card - * - * @return array - */ - private function getShal1RequestValues($timestamp, $orderId, $builder, $card) - { - $requestValues = [ - $timestamp, - $this->merchantId, - $orderId, - preg_replace('/[^0-9]/', '', sprintf('%01.2f', $builder->amount)), - $builder->currency, - $card->number - ]; - - if (($builder->transactionModifier === TransactionModifier::ENCRYPTED_MOBILE)) { - switch ($card->mobileType) { - case EncyptedMobileType::GOOGLE_PAY: - $requestValues = [ - $timestamp, - $this->merchantId, - $orderId, - preg_replace('/[^0-9]/', '', sprintf('%01.2f', $builder->amount)), - $builder->currency, - $card->token - ]; - break; - - case EncyptedMobileType::APPLE_PAY: - $requestValues = [ - $timestamp, - $this->merchantId, - $orderId, - '', - '', - $card->token - ]; - break; - } - } - return $requestValues; - } - - public function buildFraudFilter($builder, $xml, $request) - { - // tssinfo fraudfilter - // fraudfilter - if (!empty($builder->fraudFilter)) { - $fraudFilter = $xml->createElement("fraudfilter"); - $fraudFilter->setAttribute("mode", $builder->fraudFilter); - $request->appendChild($fraudFilter); - } - if ($builder->customerId !== null || $builder->productId !== null || - $builder->clientTransactionId !== null || $builder->verifyAddress !== false - ) { - $tssInfo = $xml->createElement("tssinfo"); - - if (!empty($builder->customerId)) { - $tssInfo->appendChild($xml->createElement("custnum", $builder->customerId)); - } - - if (!empty($builder->productId)) { - $tssInfo->appendChild($xml->createElement("prodid", $builder->productId)); - } - - if (!empty($builder->clientTransactionId)) { - $tssInfo->appendChild($xml->createElement("varref", $builder->clientTransactionId)); - } - - if (!empty($builder->customerIpAddress)) { - $tssInfo->appendChild($xml->createElement("custipaddress", $builder->customerIpAddress)); - } - - if (!empty($builder->billingAddress)) { - $billingAddress = $xml->createElement("address"); - $billingAddress->setAttribute("type", 'billing'); - $billingAddress->appendChild($xml->createElement("code", $builder->billingAddress->postalCode)); - $billingAddress->appendChild($xml->createElement("country", $builder->billingAddress->country)); - $tssInfo->appendChild($billingAddress); - } - - if (!empty($builder->shippingAddress)) { - $shippingAddress = $xml->createElement("address"); - $shippingAddress->setAttribute("type", 'shipping'); - $shippingAddress->appendChild($xml->createElement("code", $builder->shippingAddress->postalCode)); - $shippingAddress->appendChild($xml->createElement("country", $builder->shippingAddress->country)); - $tssInfo->appendChild($shippingAddress); - } - if (!empty($tssInfo->childNodes->length)) { - $request->appendChild($tssInfo); - } - } - return; - } - - public function supportsHostedPayments() - { - return $this->supportsHostedPayments; - } - - - public function buildAlternativePaymentMethod($builder, $request, $xml) - { - $request->appendChild($xml->createElement( - "paymentmethod", - $builder->paymentMethod->alternativePaymentMethodType - )); - - $paymentMethodDetails = $xml->createElement("paymentmethoddetails"); - $paymentMethodDetails->appendChild( - $xml->createElement("returnurl", $builder->paymentMethod->returnUrl) - ); - $paymentMethodDetails->appendChild( - $xml->createElement("statusupdateurl", $builder->paymentMethod->statusUpdateUrl) - ); - - if (!empty($builder->paymentMethod->descriptor)) { - $paymentMethodDetails->appendChild( - $xml->createElement("descriptor", $builder->paymentMethod->descriptor) - ); - } - - $paymentMethodDetails->appendChild($xml->createElement("country", $builder->paymentMethod->country)); - $paymentMethodDetails->appendChild($xml->createElement( - "accountholdername", - $builder->paymentMethod->accountHolderName - )); - - $request->appendChild($paymentMethodDetails); - - return; - } - - private function mapAcceptedCodes($paymentMethodType) - { - switch ($paymentMethodType) { - case "3ds-verifysig": - case "3ds-verifyenrolled": - return ["00", "110"]; - case PaymentMethodType::APM: - return ["01"]; - default: - return ["00"]; - } - } - - private function setSerializeData($key, $value = null) - { - if ($value !== null) { - $this->serializeData[$key] = $value; - } - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Gateways/RestGateway.php b/classes/includes/vendor/globalpayments/php-sdk/src/Gateways/RestGateway.php deleted file mode 100644 index 58852cc..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Gateways/RestGateway.php +++ /dev/null @@ -1,46 +0,0 @@ -|null $queryStringParams - * - * @throws GatewayException - * @return string - */ - protected function doTransaction( - $verb, - $endpoint, - $data = null, - array $queryStringParams = null, - $headers = [] - ) { - $response = $this->sendRequest($verb, $endpoint, $data, $queryStringParams, $headers); - - if (!in_array($response->statusCode, [200, 204])) { - $parsed = json_decode($response->rawResponse); - $error = isset($parsed->error) ? $parsed->error : $parsed; - throw new GatewayException( - sprintf( - 'Status Code: %s - %s', - $response->statusCode, - isset($error->error_description) ? $error->error_description : (isset($error->message) ? $error->message : (string) $error) - ) - ); - } - - return $response->rawResponse; - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Gateways/XmlGateway.php b/classes/includes/vendor/globalpayments/php-sdk/src/Gateways/XmlGateway.php deleted file mode 100644 index ceffdd2..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Gateways/XmlGateway.php +++ /dev/null @@ -1,35 +0,0 @@ -sendRequest('POST', '', $request); - - if (200 !== $response->statusCode) { - throw new GatewayException( - sprintf( - 'Unexpected HTTP status code [%s]', - $response->statusCode - ) - ); - } - - return $response->rawResponse; - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/HostedPaymentConfig.php b/classes/includes/vendor/globalpayments/php-sdk/src/HostedPaymentConfig.php deleted file mode 100644 index 4a939af..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/HostedPaymentConfig.php +++ /dev/null @@ -1,149 +0,0 @@ -cardStorageEnabled = $cardStorageEnabled; - } - - public function isDynamicCurrencyConversionEnabled() - { - return $dynamicCurrencyConversionEnabled; - } - - public function setDynamicCurrencyConversionEnabled($directCurrencyConversionEnabled) - { - $this->dynamicCurrencyConversionEnabled = $directCurrencyConversionEnabled; - } - - public function isDisplaySavedCards() - { - return $displaySavedCards; - } - - public function setDisplaySavedCards($displaySavedCards) - { - $this->displaySavedCards = $displaySavedCards; - } - - public function getFraudFilterMode() - { - return $fraudFilterMode; - } - - public function setFraudFilterMode($fraudFilterMode) - { - $this->fraudFilterMode = $fraudFilterMode; - } - - public function getLanguage() - { - return $language; - } - - public function setLanguage($language) - { - $this->language = $language; - } - - public function getPaymentButtonText() - { - return $paymentButtonText; - } - - public function setPaymentButtonText($paymentButtonText) - { - $this->paymentButtonText = $paymentButtonText; - } - - public function getPostDimensions() - { - return $postDimensions; - } - - public function setPostDimensions($postDimensions) - { - $this->postDimensions = $postDimensions; - } - - public function getPostResponse() - { - return $postResponse; - } - - public function setPostResponse($postResponse) - { - $this->postResponse = $postResponse; - } - - public function getResponseUrl() - { - return $responseUrl; - } - - public function setResponseUrl($responseUrl) - { - $this->responseUrl = $responseUrl; - } - - public function isRequestTransactionStabilityScore() - { - return $requestTransactionStabilityScore; - } - - public function setRequestTransactionStabilityScore($requestTransactionStabilityScore) - { - $this->requestTransactionStabilityScore = $requestTransactionStabilityScore; - } - - public function getVersion() - { - return $version; - } - - public function setVersion($version) - { - $this->version = $version; - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/AlternativePaymentMethod.php b/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/AlternativePaymentMethod.php deleted file mode 100644 index be67ccb..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/AlternativePaymentMethod.php +++ /dev/null @@ -1,109 +0,0 @@ -alternativePaymentMethodType = $alternativePaymentMethodType; - } - - /** - * This is a mandatory request used to initiate an APM transaction, - * the payment-set is used to advise the payment scheme of the details of a new transaction and - * to retrieve the necessary information required to facilitate authentication - * - * @param string|float $amount Amount to authorize - * - * @return AuthorizationBuilder - */ - public function charge($amount = null) - { - return (new AuthorizationBuilder(TransactionType::SALE, $this)) - ->withModifier(TransactionModifier::ALTERNATIVE_PAYMENT_METHOD) - ->withAmount($amount); - } - - public function addValue($amount = null) - { - throw new NotImplementedException(); - } - - public function refund($amount = null) - { - throw new NotImplementedException(); - } - - public function reverse($amount = null) - { - throw new NotImplementedException(); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Cash.php b/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Cash.php deleted file mode 100644 index da21145..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Cash.php +++ /dev/null @@ -1,25 +0,0 @@ -withAmount($amount != null ? $amount : ($this->threeDSecure != null ? $this->threeDSecure->getAmount() : null)) - ->withCurrency($this->threeDSecure != null ? $this->threeDSecure->getCurrency() : null) - ->withOrderId($this->threeDSecure != null ? $this->threeDSecure->getOrderId() : null) - ->withAmountEstimated($isEstimated); - } - - /** - * Authorizes the payment method and captures the entire authorized amount - * - * @param string|float $amount Amount to authorize - * - * @return AuthorizationBuilder - */ - public function charge($amount = null) - { - return (new AuthorizationBuilder(TransactionType::SALE, $this)) - ->withAmount($amount != null ? $amount : ($this->threeDSecure != null ? $this->threeDSecure->getAmount() : null)) - ->withCurrency($this->threeDSecure != null ? $this->threeDSecure->getCurrency() : null) - ->withOrderId($this->threeDSecure != null ? $this->threeDSecure->getOrderId() : null); - } - - /** - * Adds value to the payment method - * - * @param string|float $amount Amount to add - * - * @return AuthorizationBuilder - */ - public function addValue($amount = null) - { - return (new AuthorizationBuilder(TransactionType::ADD_VALUE, $this)) - ->withAmount($amount); - } - - /** - * Inquires the balance of the payment method - * - * @param InquiryType $inquiry Type of inquiry - * - * @return AuthorizationBuilder - */ - public function balanceInquiry($inquiry = null) - { - return (new AuthorizationBuilder(TransactionType::BALANCE, $this)) - ->withBalanceInquiryType($inquiry); - } - - /** - * Refunds the payment method - * - * @param string|float $amount Amount to refund - * - * @return AuthorizationBuilder - */ - public function refund($amount = null) - { - return (new AuthorizationBuilder(TransactionType::REFUND, $this)) - ->withAmount($amount); - } - - /** - * Reverses the payment method - * - * @param string|float $amount Amount to reverse - * - * @return AuthorizationBuilder - */ - public function reverse($amount = null) - { - return (new AuthorizationBuilder(TransactionType::REVERSAL, $this)) - ->withAmount($amount); - } - - /** - * Verifies the payment method - * - * @return AuthorizationBuilder - */ - public function verify() - { - return new AuthorizationBuilder(TransactionType::VERIFY, $this); - } - - /** - * Tokenizes the payment method - * - * @return AuthorizationBuilder - */ - public function tokenize() - { - return $this->verify() - ->withRequestMultiUseToken(true); - } - - /** - * Updates the token expiry date with the values proced to the card object - * - * @return bool value indicating success/failure - */ - public function updateTokenExpiry() - { - if (empty($this->token)) { - throw new BuilderException('Token cannot be null'); - } - - try { - (new ManagementBuilder(TransactionType::TOKEN_UPDATE)) - ->withPaymentMethod($this) - ->execute(); - return true; - } catch (ApiException $exc) { - return false; - } - } - - /** - * Deletes the token associated with the current card object - * - * @return bool value indicating success/failure - */ - public function deleteToken() { - if (empty($this->token)) { - throw new BuilderException('Token cannot be null'); - } - - try { - (new ManagementBuilder(TransactionType::TOKEN_DELETE)) - ->withPaymentMethod($this) - ->execute(); - return true; - } catch (ApiException $exc) { - return false; - } - } - - public function getDccRate($dccRateType, $amount, $currency, $ccp, $orderId) - { - return (new AuthorizationBuilder(TransactionType::DCC_RATE_LOOKUP, $this)) - ->withAmount($amount) - ->withCurrency($currency) - ->withDccRateType($dccRateType) - ->withDccProcessor($ccp) - ->withDccType("1") - ->withOrderId($orderId) - ->execute(); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/CreditCardData.php b/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/CreditCardData.php deleted file mode 100644 index 5d709a1..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/CreditCardData.php +++ /dev/null @@ -1,219 +0,0 @@ - '/^4/', - 'MC' => '/^(5[1-5]|2[2-7])/', - 'Amex' => '/^3[47]/', - 'DinersClub' => '/^3[0689]/', - 'EnRoute' => '/^2(014|149)/', - 'Discover' => '/^6([045]|22)/', - 'Jcb' => '/^35/', - ]; - - /** - * Instantiates a new credit card - * - * @return - */ - public function __construct() - { - $this->cardPresent = false; - $this->readerPresent = false; - $this->cvnPresenceIndicator = CvnPresenceIndicator::NOT_REQUESTED; - } - - /** - * @return string - */ - public function getShortExpiry() - { - if ($this->expMonth != null && $this->expYear != null) { - return sprintf( - '%s%s', - str_pad($this->expMonth, 2, '0', STR_PAD_LEFT), - substr(str_pad($this->expYear, 4, '0', STR_PAD_LEFT), 2, 2) - ); - } - return null; - } - - /** - * Gets a card's type based on the BIN - * - * @return string - */ - public function getCardType() - { - $number = str_replace( - [' ', '-'], - '', - $this->number - ); - - foreach (static::$cardTypes as $type => $regex) { - if (1 === preg_match($regex, $this->number)) { - return $type; - } - } - - return 'Unknown'; - } - - /** - * Verify whether the cardholder is enrolled in 3DS - * - * @return bool - */ - public function verifyEnrolled($amount, $currency, $orderId = null) - { - $response = (new AuthorizationBuilder(TransactionType::VERIFY_ENROLLED, $this)) - ->withAmount($amount) - ->withCurrency($currency) - ->withOrderId($orderId) - ->execute(); - - if (!empty($response->threeDSecure)) { - $secureEcom = $response->threeDSecure; - $secureEcom->setAmount($amount); - $secureEcom->setCurrency($currency); - $secureEcom->setOrderId($response->orderId); - $this->threeDSecure = $secureEcom; - - if (in_array($this->threeDSecure->enrolled, array('N', 'U'))) { - $this->threeDSecure->xid = null; - if ($this->threeDSecure->enrolled == 'N') { - $this->threeDSecure->eci = $this->cardType == 'MC' ? 1 : 6; - } elseif ($this->threeDSecure->enrolled == 'U') { - $this->threeDSecure->eci = $this->cardType == 'MC' ? 0 : 7; - } - } - - return $this->threeDSecure->enrolled == 'Y'; - } - return false; - } - - /** - * @return bool - */ - public function verifySignature($authorizationResponse, $merchantData = null, $amount = null, $currency = null, $orderId = null) - { - if (empty($this->threeDSecure)) { - $this->threeDSecure = new ThreeDSecure(); - } - - if ($merchantData != null) { - $this->threeDSecure->setMerchantData($merchantData); - } - - if ($amount != null) { - $this->threeDSecure->setAmount($amount); - } - - if ($currency != null) { - $this->threeDSecure->setCurrency($currency); - } - - if ($orderId != null) { - $this->threeDSecure->setOrderId($orderId); - } - - $txnReference = new TransactionReference(); - $txnReference->orderId = $this->threeDSecure->getOrderId(); - - $response = (new ManagementBuilder(TransactionType::VERIFY_SIGNATURE)) - ->withAmount($this->threeDSecure->getAmount()) - ->withCurrency($this->threeDSecure->getCurrency()) - ->withPayerAuthenticationResponse($authorizationResponse) - ->withPaymentMethod($txnReference) - ->execute(); - - $this->threeDSecure->status = $response->threeDSecure->status; - $this->threeDSecure->cavv = $response->threeDSecure->cavv; - $this->threeDSecure->algorithm = $response->threeDSecure->algorithm; - $this->threeDSecure->xid = $response->threeDSecure->xid; - - if (in_array($this->threeDSecure->status, array('A', 'Y')) && $response->responseCode == '00') { - $this->threeDSecure->eci = $response->threeDSecure->eci; - return true; - } else { - $this->threeDSecure->eci = $this->cardType == 'MC' ? 0 : 7; - return false; - } - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/CreditTrackData.php b/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/CreditTrackData.php deleted file mode 100644 index f15eb35..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/CreditTrackData.php +++ /dev/null @@ -1,11 +0,0 @@ -withAmount($amount); - } - - /** - * Authorizes the payment method and captures the entire authorized amount - * - * @param string|float $amount Amount to authorize - * - * @return AuthorizationBuilder - */ - public function charge($amount = null) - { - return (new AuthorizationBuilder(TransactionType::SALE, $this)) - ->withAmount($amount); - } - - /** - * Refunds the payment method - * - * @param string|float $amount Amount to refund - * - * @return AuthorizationBuilder - */ - public function refund($amount = null) - { - return (new AuthorizationBuilder(TransactionType::REFUND, $this)) - ->withAmount($amount); - } - - /** - * Reverses the payment method - * - * @param string|float $amount Amount to reverse - * - * @return AuthorizationBuilder - */ - public function reverse($amount = null) - { - return (new AuthorizationBuilder(TransactionType::REVERSAL, $this)) - ->withAmount($amount); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/DebitTrackData.php b/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/DebitTrackData.php deleted file mode 100644 index 553a705..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/DebitTrackData.php +++ /dev/null @@ -1,11 +0,0 @@ -withBalanceInquiryType($inquiry) - ->withAmount(0); - } - - /** - * Authorizes the payment method and captures the entire authorized amount - * - * @param string|float $amount Amount to authorize - * - * @return AuthorizationBuilder - */ - public function charge($amount = null) - { - return (new AuthorizationBuilder(TransactionType::SALE, $this)) - ->withAmount($amount); - } - - /** - * Refunds the payment method - * - * @param string|float $amount Amount to refund - * - * @return AuthorizationBuilder - */ - public function refund($amount = null) - { - return (new AuthorizationBuilder(TransactionType::REFUND, $this)) - ->withAmount($amount); - } - - /** - * Reverses the payment method - * - * @param string|float $amount Amount to reverse - * - * @return AuthorizationBuilder - */ - public function reverse($amount = null) - { - throw new NotImplementedException(); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/EBTCardData.php b/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/EBTCardData.php deleted file mode 100644 index 3d486ac..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/EBTCardData.php +++ /dev/null @@ -1,91 +0,0 @@ -cardPresent = false; - $this->readerPresent = false; - $this->cvnPresenceIndicator = CvnPresenceIndicator::NOT_REQUESTED; - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/EBTTrackData.php b/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/EBTTrackData.php deleted file mode 100644 index 266c753..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/EBTTrackData.php +++ /dev/null @@ -1,13 +0,0 @@ -withAmount($amount); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/GiftCard.php b/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/GiftCard.php deleted file mode 100644 index 9ac78f2..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/GiftCard.php +++ /dev/null @@ -1,256 +0,0 @@ -withAlias(AliasAction::ADD, $alias); - } - - /** - * Activates the payment method with the given amount - * - * @param string|float $amount Amount to add - * - * @return AuthorizationBuilder - */ - public function activate($amount = null) - { - return (new AuthorizationBuilder(TransactionType::ACTIVATE, $this)) - ->withAmount($amount); - } - - /** - * Adds value to the payment method - * - * @param string|float $amount Amount to add - * - * @return AuthorizationBuilder - */ - public function addValue($amount = null) - { - return (new AuthorizationBuilder(TransactionType::ADD_VALUE, $this)) - ->withAmount($amount); - } - - /** - * Inquires the balance of the payment method - * - * @param InquiryType $inquiry Type of inquiry - * - * @return AuthorizationBuilder - */ - public function balanceInquiry($inquiry = null) - { - return (new AuthorizationBuilder(TransactionType::BALANCE, $this)) - ->withBalanceInquiryType($inquiry); - } - - /** - * Authorizes the payment method and captures the entire authorized amount - * - * @param string|float $amount Amount to authorize - * - * @return AuthorizationBuilder - */ - public function charge($amount = null) - { - return (new AuthorizationBuilder(TransactionType::SALE, $this)) - ->withAmount($amount); - } - - /** - * Deactivates the payment method - * - * @return AuthorizationBuilder - */ - public function deactivate() - { - return new AuthorizationBuilder(TransactionType::DECLINE, $this); - } - - /** - * Removes an alias to the payment method - * - * @param string $alias Alias to remove - * - * @return AuthorizationBuilder - */ - public function removeAlias($alias = null) - { - return (new AuthorizationBuilder(TransactionType::ALIAS, $this)) - ->withAlias(AliasAction::DELETE, $alias); - } - - /** - * Replaces the payment method with the given one - * - * @param GiftCard $newCard Replacement gift card - * - * @return AuthorizationBuilder - */ - public function replaceWith($newCard = null) - { - return (new AuthorizationBuilder(TransactionType::REPLACE, $this)) - ->withReplacementCard($newCard); - } - - /** - * Reverses the payment method - * - * @param string|float $amount Amount to reverse - * - * @return AuthorizationBuilder - */ - public function reverse($amount = null) - { - return (new AuthorizationBuilder(TransactionType::REVERSAL, $this)) - ->withAmount($amount); - } - - /** - * Rewards the payment method - * - * @param string|float $amount Amount to reward - * - * @return AuthorizationBuilder - */ - public function rewards($amount = null) - { - return (new AuthorizationBuilder(TransactionType::REWARD, $this)) - ->withAmount($amount); - } - - /** - * Creates a new payment method - * - * @param string $alias Alias to use - * - * @return GiftCard - */ - public static function create($alias = null) - { - $card = new static(); - - $response = (new AuthorizationBuilder(TransactionType::ALIAS, $card)) - ->withAlias(AliasAction::CREATE, $alias) - ->execute(); - - if ($response->responseCode === '00') { - return $response->giftCard; - } - - throw new ApiException($response->responseMessage); - } - - public function __get($name) - { - if (!in_array($name, static::$valueTypes)) { - throw new ArgumentException(sprintf('Property `%s` does not exist on GiftCard', $name)); - } - - return $this->value; - } - - public function __isset($name) - { - return in_array($name, static::$valueTypes) || isset($this->{$name}); - } - - public function __set($name, $value) - { - if (!in_array($name, static::$valueTypes)) { - throw new ArgumentException(sprintf('Property `%s` does not exist on GiftCard', $name)); - } - - $this->value = $value; - switch ($name) { - case 'alias': - $this->valueType = 'Alias'; - return; - case 'number': - $this->valueType = 'CardNbr'; - return; - case 'token': - $this->valueType = 'TokenValue'; - return; - case 'trackData': - $this->valueType = 'TrackData'; - return; - } - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Interfaces/IAuthable.php b/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Interfaces/IAuthable.php deleted file mode 100644 index e6dfb46..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/Interfaces/IAuthable.php +++ /dev/null @@ -1,8 +0,0 @@ -paymentMethod = $customerIdOrPaymentMethod; - return; - } - - $this->customerKey = $customerIdOrPaymentMethod; - $this->key = $paymentId; - $this->paymentType = "Credit Card"; // set default - } - - /** - * Creates an authorization against the payment method. - * - * @param float|string|null $amount The amount of the transaction - * - * @return AuthorizationBuilder - */ - public function authorize($amount = null) - { - return (new AuthorizationBuilder(TransactionType::AUTH, $this)) - ->withAmount($amount) - ->withOneTimePayment(true); - } - - /** - * Creates a charge (sale) against the payment method. - * - * @param float|string|null $amount The amount of the transaction - * - * @return AuthorizationBuilder - */ - public function charge($amount = null) - { - return (new AuthorizationBuilder(TransactionType::SALE, $this)) - ->withAmount($amount) - ->withOneTimePayment(true); - } - - /** - * Refunds the payment method. - * - * @param float|string|null $amount The amount of the transaction - * - * @return AuthorizationBuilder - */ - public function refund($amount = null) - { - return (new AuthorizationBuilder(TransactionType::REFUND, $this)) - ->withAmount($amount); - } - - /** - * Verifies the payment method with the issuer. - * - * @return AuthorizationBuilder - */ - public function verify() - { - return new AuthorizationBuilder(TransactionType::VERIFY, $this); - } - - /** - * Creates a recurring schedule using the payment method. - * - * @param string $scheduleId The schedule's identifier - * - * @return Schedule - */ - public function addSchedule($scheduleId) - { - $schedule = new Schedule($this->customerKey, $this->key); - $schedule->id = $scheduleId; - return $schedule; - } - - public function __get($name) - { - switch ($name) { - case 'paymentMethod': - return $this->paymentMethod; - case 'cardHolderName': - return $this->nameOnAccount; - case 'checkHolderName': - return $this->nameOnAccount; - default: - break; - } - - if (property_exists($this, $name)) { - return $this->{$name}; - } - - if ($this->paymentMethod && property_exists($this->paymentMethod, $name)) { - return $this->paymentMethod->{$name}; - } - - throw new ArgumentException(sprintf('Property `%s` does not exist on RecurringPaymentMethod', $name)); - } - - public function __isset($name) - { - return in_array($name, [ - 'paymentMethod', - 'cardHolderName', - 'checkHolderName', - ]) - || isset($this->{$name}) - || ($this->paymentMethod && isset($this->paymentMethod->{$name})); - } - - public function __set($name, $value) - { - switch ($name) { - case 'paymentMethod': - $client = ServicesContainer::instance()->getRecurringClient(); - if (!$client->supportsUpdatePaymentDetails) { - throw new UnsupportedTransactionException(); - } - - $this->paymentMethod = $value; - return; - default: - break; - } - - if (property_exists($this, $name)) { - return $this->{$name} = $value; - } - - throw new ArgumentException(sprintf('Property `%s` does not exist on Transaction', $name)); - } - - public function getDccRate($dccRateType, $amount, $currency, $ccp, $orderId) - { - return (new AuthorizationBuilder(TransactionType::DCC_RATE_LOOKUP, $this)) - ->withAmount($amount) - ->withCurrency($currency) - ->withDccRateType($dccRateType) - ->withDccProcessor($ccp) - ->withDccType("1") - ->withOrderId($orderId) - ->execute(); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/TransactionReference.php b/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/TransactionReference.php deleted file mode 100644 index 8160201..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/PaymentMethods/TransactionReference.php +++ /dev/null @@ -1,33 +0,0 @@ -execute(); - return new BatchSummary(); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Services/CreditService.php b/classes/includes/vendor/globalpayments/php-sdk/src/Services/CreditService.php deleted file mode 100644 index a3fcf1a..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Services/CreditService.php +++ /dev/null @@ -1,149 +0,0 @@ -withAmount($amount); - } - - /** - * Creates a manage transaction builder with type `TransactionType::CAPTURE` - * - * @param string|float|TransactionReference $transaction Transaction reference of an authorization - * - * @return ManagementBuilder - */ - public function capture($transaction = null) - { - if (!($transaction instanceof TransactionReference)) { - $transactionReference = new TransactionReference(); - $transactionReference->transactionId = $transaction; - $transactionReference->paymentMethodType = PaymentMethodType::CREDIT; - $transaction = $transactionReference; - } - - return (new ManagementBuilder(TransactionType::CAPTURE)) - ->withPaymentMethod($transaction); - } - - /** - * Authorizes the payment method and captures the entire authorized amount - * - * @param string|float $amount Amount to authorize - * - * @return AuthorizationBuilder - */ - public function charge($amount = null) - { - return (new AuthorizationBuilder(TransactionType::SALE, $this)) - ->withAmount($amount); - } - - public function edit($transaction = null) - { - if (!($transaction instanceof TransactionReference)) { - $transactionReference = new TransactionReference(); - $transactionReference->transactionId = $transaction; - $transactionReference->paymentMethodType = PaymentMethodType::CREDIT; - $transaction = $transactionReference; - } - - return (new ManagementBuilder(TransactionType::EDIT)) - ->withPaymentMethod($transaction); - } - - public function editLevelII($transaction = null) - { - if (!($transaction instanceof TransactionReference)) { - $transactionReference = new TransactionReference(); - $transactionReference->transactionId = $transaction; - $transactionReference->paymentMethodType = PaymentMethodType::CREDIT; - $transaction = $transactionReference; - } - - return (new ManagementBuilder(TransactionType::EDIT)) - ->withModifier(TransactionModifier::LEVEL_II) - ->withPaymentMethod($transaction); - } - - /** - * Refunds the payment method - * - * @param string|float $amount Amount to refund - * - * @return AuthorizationBuilder - */ - public function refund($amount = null) - { - return (new AuthorizationBuilder(TransactionType::REFUND, $this)) - ->withAmount($amount); - } - - /** - * Reverses the payment method - * - * @param string|float $amount Amount to reverse - * - * @return AuthorizationBuilder - */ - public function reverse($amount = null) - { - return (new AuthorizationBuilder(TransactionType::REVERSAL, $this)) - ->withAmount($amount); - } - - /** - * Verifies the payment method - * - * @return AuthorizationBuilder - */ - public function verify() - { - return new AuthorizationBuilder(TransactionType::VERIFY, $this); - } - - public function void($transaction = null) - { - if (!($transaction instanceof TransactionReference)) { - $transactionReference = new TransactionReference(); - $transactionReference->transactionId = $transaction; - $transactionReference->paymentMethodType = PaymentMethodType::CREDIT; - $transaction = $transactionReference; - } - - return (new ManagementBuilder(TransactionType::VOID)) - ->withPaymentMethod($transaction); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Services/DeviceService.php b/classes/includes/vendor/globalpayments/php-sdk/src/Services/DeviceService.php deleted file mode 100644 index a675e58..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Services/DeviceService.php +++ /dev/null @@ -1,23 +0,0 @@ -device; - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Services/HostedService.php b/classes/includes/vendor/globalpayments/php-sdk/src/Services/HostedService.php deleted file mode 100644 index d3210d3..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Services/HostedService.php +++ /dev/null @@ -1,143 +0,0 @@ -sharedSecret = $config->sharedSecret; - } - - /** - * Creates an authorization builder with type - * `TransactionType::CREDIT_AUTH` - * - * @param string|float $amount Amount to authorize - * - * @return AuthorizationBuilder - */ - public function authorize($amount = null) - { - return (new AuthorizationBuilder(TransactionType::AUTH)) - ->withAmount($amount); - } - - /** - * Authorizes the payment method and captures the entire authorized amount - * - * @param string|float $amount Amount to authorize - * - * @return AuthorizationBuilder - */ - public function charge($amount = null) - { - return (new AuthorizationBuilder(TransactionType::SALE)) - ->withAmount($amount); - } - - /** - * Verifies the payment method - * - * @return AuthorizationBuilder - */ - public function verify($amount = null) - { - return (new AuthorizationBuilder(TransactionType::VERIFY)) - ->withAmount($amount); - } - - public function void($transaction = null) - { - if (!($transaction instanceof TransactionReference)) { - $transactionReference = new TransactionReference(); - $transactionReference->transactionId = $transaction; - $transactionReference->paymentMethodType = PaymentMethodType::CREDIT; - $transaction = $transactionReference; - } - - return (new ManagementBuilder(TransactionType::VOID)) - ->withPaymentMethod($transaction); - } - - public function parseResponse($response, $encoded = false) - { - $response = json_decode($response, true); - - if ($encoded) { - $iterator = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($response)); - foreach ($iterator as $key => $value) { - $iterator->getInnerIterator()->offsetSet($key, base64_decode($value)); - } - - $response = $iterator->getArrayCopy(); - } - - $timestamp = $response["TIMESTAMP"]; - $merchantId = $response["MERCHANT_ID"]; - $orderId = $response["ORDER_ID"]; - $result = $response["RESULT"]; - $message = $response["MESSAGE"]; - $transactionId = $response["PASREF"]; - $authCode = $response["AUTHCODE"]; - $sha1Hash = $response["SHA1HASH"]; - $hash = GenerationUtils::generateHash($this->sharedSecret, implode('.', [ - $timestamp, - $merchantId, - $orderId, - $result, - $message, - $transactionId, - $authCode - ])); - - if ($hash != $sha1Hash) { - throw new ApiException("Incorrect hash. Please check your code and the Developers Documentation."); - } - - $ref = new TransactionReference(); - $ref->authCode = $authCode; - $ref->orderId = $orderId; - $ref->paymentMethodType = PaymentMethodType::CREDIT; - $ref->transactionId = $transactionId; - - $trans = new Transaction(); - $trans->authorizedAmount = $response["AMOUNT"]; - $trans->cvnResponseCode = $response["CVNRESULT"]; - $trans->responseCode = $result; - $trans->responseMessage = $message; - $trans->avsResponseCode = $response["AVSPOSTCODERESULT"]; - $trans->transactionReference = $ref; - - $trans->responseValues = $response; - - return $trans; - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Services/RecurringService.php b/classes/includes/vendor/globalpayments/php-sdk/src/Services/RecurringService.php deleted file mode 100644 index f28d281..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Services/RecurringService.php +++ /dev/null @@ -1,43 +0,0 @@ -execute(); - return $response; - } - - public static function delete(RecurringEntity $entity, $force = false) - { - $response = (new RecurringBuilder(TransactionType::DELETE, $entity)) - ->execute(); - return $response; - } - - public static function edit(RecurringEntity $entity) - { - $response = (new RecurringBuilder(TransactionType::EDIT, $entity)) - ->execute(); - return $response; - } - - public static function get($entity) - { - $response = (new RecurringBuilder(TransactionType::FETCH, $entity)) - ->execute(); - return $response; - } - - public static function search($entityType) - { - return new RecurringBuilder(TransactionType::SEARCH, new $entityType()); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Services/ReportingService.php b/classes/includes/vendor/globalpayments/php-sdk/src/Services/ReportingService.php deleted file mode 100644 index eea10a7..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Services/ReportingService.php +++ /dev/null @@ -1,31 +0,0 @@ -withTransactionId($transactionId); - return $response; - } - - public static function activity() - { - $response = (new TransactionReportBuilder(ReportType::ACTIVITY)); - return $response; - } - - public static function transactionDetail($transactionId) - { - $response = (new TransactionReportBuilder(ReportType::TRANSACTION_DETAIL)) - ->withTransactionId($transactionId); - return $response; - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Services/Secure3dService.php b/classes/includes/vendor/globalpayments/php-sdk/src/Services/Secure3dService.php deleted file mode 100644 index 8f08848..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Services/Secure3dService.php +++ /dev/null @@ -1,35 +0,0 @@ -withPaymentMethod($paymentMethod); - } - - /** @return Secure3dBuilder */ - public static function initiateAuthentication(IPaymentMethod $paymentMethod, ThreeDSecure $secureEcom) - { - $paymentMethod->threeDSecure = $secureEcom; - - return (new Secure3dBuilder(TransactionType::INITIATE_AUTHENTICATION)) - ->withPaymentMethod($paymentMethod); - } - - /** @return Secure3dBuilder */ - public static function getAuthenticationData() - { - return new Secure3dBuilder(TransactionType::VERIFY_SIGNATURE); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/ServicesConfig.php b/classes/includes/vendor/globalpayments/php-sdk/src/ServicesConfig.php deleted file mode 100644 index 32248ae..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/ServicesConfig.php +++ /dev/null @@ -1,141 +0,0 @@ -timeout = 65000; - $this->environment = Environment::TEST; - } - - public function validate() - { - // Portico API key - if (!empty($this->secretApiKey) - && ( - !empty($this->siteId) - || !empty($this->licenseId) - || !empty($this->deviceId) - || !empty($this->username) - || !empty($this->password) - ) - ) { - throw new ConfigurationException( - "Configuration contains both secret API key and legacy credentials. These are mutually exclusive." - ); - } - - // Portico legacy - if (( - !empty($this->siteId) - || !empty($this->licenseId) - || !empty($this->deviceId) - || !empty($this->username) - || !empty($this->password) - ) - && ( - empty($this->siteId) - || empty($this->licenseId) - || empty($this->deviceId) - || empty($this->username) - || empty($this->password) - ) - ) { - throw new ConfigurationException( - "Site, License, Device, Username, and Password should all have values for this configuration." - ); - } - - // Realex - if ((empty($this->secretApiKey) - && ( - empty($this->siteId) - && empty($this->licenseId) - && empty($this->deviceId) - && empty($this->username) - && empty($this->password) - )) - && empty($this->merchantId) - ) { - throw new ConfigurationException( - "MerchantId should not be empty for this configuration." - ); - } - - // Service URL - if (empty($this->serviceUrl) && $this->secure3dVersion == null) { - throw new ConfigurationException( - "Service URL could not be determined from the credentials provided. Please specify an endpoint." - ); - } - - // secure 3d - if ($this->secure3dVersion != null) { - if ($this->secure3dVersion === Secure3dVersion::TWO || $this->secure3dVersion === Secure3dVersion::ANY) { - if (empty($this->challengeNotificationUrl)) { - throw new ConfigurationException("The challenge notification URL is required for 3DS v2 processing."); - } - - if (empty($this->methodNotificationUrl)) { - throw new ConfigurationException("The method notification URL is required for 3DS v2 processing."); - } - } - } - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/ServicesContainer.php b/classes/includes/vendor/globalpayments/php-sdk/src/ServicesContainer.php deleted file mode 100644 index c36c702..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/ServicesContainer.php +++ /dev/null @@ -1,207 +0,0 @@ -secure3dProviders[$version])) { - return $this->secure3dProviders[$version]; - } elseif ($version == Secure3dVersion::ANY) { - $provider = $this->secure3dProviders[Secure3dVersion::TWO]; - if ($provider == null) { - $provider = $this->secure3dProviders[Secure3dVersion::ONE]; - } - return $provider; - } - return null; - } - - /** @return void */ - private function setSecure3dProvider($version, ISecure3dProvider $provider) - { - $this->secure3dProviders[$version] = $provider; - } - - /** - * ServicesContainer constructor. - * - * @param IGateway $gateway - * - * @return - */ - public function __construct(IPaymentGateway $gateway, IRecurringService $recurring = null) - { - $this->gateway = $gateway; - $this->recurring = $recurring; - } - - /** - * Gets the current `ServicesContainer` instance - * - * @return ServicesContainer - */ - public static function instance() - { - if (static::$instance == null) { - static::$instance = new static(null); - } - return static::$instance; - } - - /** - * Configures the `ServicesContainer` singleton - * - * @param ServicesConfig $config - * - * @return void - */ - public static function configure(ServicesConfig $config) - { - $config->validate(); - - $gateway = null; - if (!empty($config->merchantId)) { - if (empty($config->serviceUrl)) { - if ($config->environment === Environment::TEST) { - $config->serviceUrl = ServiceEndpoints::GLOBAL_ECOM_TEST; - } else { - $config->serviceUrl = ServiceEndpoints::GLOBAL_ECOM_PRODUCTION; - } - } - - $gateway = new RealexConnector(); - $gateway->accountId = $config->accountId; - $gateway->channel = $config->channel; - $gateway->merchantId = $config->merchantId; - $gateway->rebatePassword = $config->rebatePassword; - $gateway->refundPassword = $config->refundPassword; - $gateway->sharedSecret = $config->sharedSecret; - $gateway->timeout = $config->timeout; - $gateway->serviceUrl = $config->serviceUrl; - $gateway->hostedPaymentConfig = $config->hostedPaymentConfig; - $gateway->curlOptions = $config->curlOptions; - static::$instance = new static($gateway, $gateway); - // set default - if ($config->secure3dVersion == null) { - $config->secure3dVersion = Secure3dVersion::ONE; - } - - // secure 3d v1 - if ($config->secure3dVersion === Secure3dVersion::ONE || $config->secure3dVersion === Secure3dVersion::ANY) { - static::$instance->setSecure3dProvider(Secure3dVersion::ONE, $gateway); - } - - // secure 3d v2 - if ($config->secure3dVersion === Secure3dVersion::TWO || $config->secure3dVersion === Secure3dVersion::ANY) { - $secure3d2 = new Gp3DSProvider(); - $secure3d2->setMerchantId($config->merchantId); - $secure3d2->setAccountId($config->accountId); - $secure3d2->setSharedSecret($config->sharedSecret); - $secure3d2->serviceUrl = $config->environment == Environment::TEST ? ServiceEndpoints::THREE_DS_AUTH_TEST : ServiceEndpoints::THREE_DS_AUTH_PRODUCTION; - $secure3d2->setMerchantContactUrl($config->merchantContactUrl); - $secure3d2->setMethodNotificationUrl($config->methodNotificationUrl); - $secure3d2->setChallengeNotificationUrl($config->challengeNotificationUrl); - $secure3d2->timeout = $config->timeout; - - static::$instance->setSecure3dProvider(Secure3dVersion::TWO, $secure3d2); - } - } else { - if (empty($config->serviceUrl) && !empty($config->secretApiKey)) { - $env = explode('_', $config->secretApiKey)[1]; - if ($env == "prod") { - $config->serviceUrl = ServiceEndpoints::PORTICO_PRODUCTION; - } else { - $config->serviceUrl = ServiceEndpoints::PORTICO_TEST; - } - } - - $gateway = new PorticoConnector(); - $gateway->siteId = $config->siteId; - $gateway->licenseId = $config->licenseId; - $gateway->deviceId = $config->deviceId; - $gateway->username = $config->username; - $gateway->password = $config->password; - $gateway->secretApiKey = $config->secretApiKey; - $gateway->developerId = $config->developerId; - $gateway->versionNumber = $config->versionNumber; - $gateway->timeout = $config->timeout; - $gateway->serviceUrl = $config->serviceUrl . '/Hps.Exchange.PosGateway/PosGatewayService.asmx'; - $gateway->curlOptions = $config->curlOptions; - - $payplanEndPoint = (strpos(strtolower($config->serviceUrl), 'cert.') > 0) ? - '/Portico.PayPlan.v2/': - '/PayPlan.v2/'; - - $recurring = new PayPlanConnector(); - $recurring->siteId = $config->siteId; - $recurring->licenseId = $config->licenseId; - $recurring->deviceId = $config->deviceId; - $recurring->username = $config->username; - $recurring->password = $config->password; - $recurring->secretApiKey = $config->secretApiKey; - $recurring->developerId = $config->developerId; - $recurring->versionNumber = $config->versionNumber; - $recurring->timeout = $config->timeout; - $recurring->serviceUrl = $config->serviceUrl . $payplanEndPoint; - $recurring->curlOptions = $config->curlOptions; - - static::$instance = new static($gateway, $recurring); - } - } - - /** - * Gets the configured gateway connector - * - * @return IPaymentGateway - */ - public function getClient() - { - return $this->gateway; - } - - /** - * Gets the configured recurring gateway connector - * - * @return IRecurringService - */ - public function getRecurringClient() - { - return $this->recurring; - } - - /** - * @return ISecure3dProvider - */ - public function getSecure3d($version) - { - $provider = $this->getSecure3dProvider($version); - if ($provider != null) { - return $provider; - } - throw new ConfigurationException(sprintf("Secure 3d is not configured for version %s", $version)); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Builders/TerminalAuthBuilder.php b/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Builders/TerminalAuthBuilder.php deleted file mode 100644 index 3f537bd..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Builders/TerminalAuthBuilder.php +++ /dev/null @@ -1,184 +0,0 @@ -transactionType = $transactionType; - $this->paymentMethodType = $paymentMethodType; - } - - /** - * {@inheritdoc} - * - * @return Transaction - */ - public function execute() - { - parent::execute(); - return ConnectionContainer::instance() - ->processTransaction($this); - } - - public function withAddress($address) - { - $this->address = $address; - return $this; - } - - public function withAllowDuplicates($allowDuplicates) - { - $this->allowDuplicates = $allowDuplicates; - return $this; - } - - public function withAmount($amount) - { - $this->amount = $amount; - return $this; - } - - public function withCashBack($amount) - { - $this->cashBackAmount = $amount; - return $this; - } - - public function withCurrency($value) - { - $this->currency = $value; - return $this; - } - - public function withCustomerCode($customerCode) - { - $this->customerCode = $customerCode; - return $this; - } - - public function withGratuity($gratuity) - { - $this->gratuity = $gratuity; - return $this; - } - - public function withInvoiceNumber($invoiceNumber) - { - $this->invoiceNumber = $invoiceNumber; - return $this; - } - - public function withPaymentMethod($method) - { - $this->paymentMethod = $method; - return $this; - } - - public function withPoNumber($poNumber) - { - $this->poNumber = $poNumber; - return $this; - } - - public function withRequestMultiUseToken($requestMultiUseToken) - { - $this->requestMultiUseToken = $requestMultiUseToken; - return $this; - } - - public function withSignatureCapture($signatureCapture) - { - $this->signatureCapture = $signatureCapture; - return $this; - } - - public function withTaxAmount($taxAmount) - { - $this->taxAmount = $taxAmount; - return $this; - } - - public function withToken($value) - { - if ($this->paymentMethod == null || !($this->paymentMethod instanceof CreditCardData)) { - $this->paymentMethod = new CreditCardData(); - $this->paymentMethod->token = value; - } - return $this; - } - - /** - * Previous request's transaction ID - * - * @param string $transactionId Transaction ID - * - * @return AuthorizationBuilder - */ - public function withTransactionId($transactionId) - { - $this->transactionId = $transactionId; - return $this; - } - - protected function setupValidations() - { - $this->validations->of( - TransactionType::AUTH | - TransactionType::SALE | TransactionType::REFUND - ) - ->with(TransactionModifier::NONE) - ->check('amount')->isNotNull(); - - $this->validations->of( - TransactionType::REFUND - ) - ->check('amount')->isNotNull(); - - $this->validations->of( - TransactionType::REFUND - ) - ->with(PaymentMethodType::CREDIT) - ->check('transactionId')->isNotNull() - ->check('authCode')->isNotNull(); - - $this->validations->of( - TransactionType::ADD_VALUE - ) - ->check('amount')->isNotNull(); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Builders/TerminalBuilder.php b/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Builders/TerminalBuilder.php deleted file mode 100644 index d17d8c4..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Builders/TerminalBuilder.php +++ /dev/null @@ -1,38 +0,0 @@ -paymentMethodType = $paymentMethodType; - parent::__construct($type); - } - - public function withRequestId($requestId) - { - $this->requestId = $requestId; - return $this; - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Builders/TerminalManageBuilder.php b/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Builders/TerminalManageBuilder.php deleted file mode 100644 index 55bfdc0..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Builders/TerminalManageBuilder.php +++ /dev/null @@ -1,96 +0,0 @@ -transactionType = $transactionType; - $this->paymentMethodType = $paymentMethodType; - } - - /** - * {@inheritdoc} - * - * @return Transaction - */ - public function execute() - { - parent::execute(); - return ConnectionContainer::instance() - ->manageTransaction($this); - } - - public function withAmount($amount) - { - $this->amount = $amount; - return $this; - } - - public function withCurrency($value) - { - $this->currency = $value; - return $this; - } - - public function withGratuity($gratuity) - { - $this->gratuity = $gratuity; - return $this; - } - - public function withPaymentMethod($method) - { - $this->paymentMethod = $method; - return $this; - } - - /** - * Previous request's transaction ID - * - * @param string $transactionId Transaction ID - * - * @return AuthorizationBuilder - */ - public function withTransactionId($transactionId) - { - $this->transactionId = $transactionId; - return $this; - } - - protected function setupValidations() - { - $this->validations->of( - TransactionType::CAPTURE - ) - ->with(TransactionModifier::NONE) - ->check('amount')->isNotNull() - ->check('transactionId')->isNotNull(); - - $this->validations->of( - TransactionType::VOID - ) - ->with(TransactionModifier::NONE) - ->check('transactionId')->isNotNull(); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/ConnectionConfig.php b/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/ConnectionConfig.php deleted file mode 100644 index 02c9aa0..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/ConnectionConfig.php +++ /dev/null @@ -1,52 +0,0 @@ -connectionMode == ConnectionModes::HTTP || - $this->connectionMode == ConnectionModes::TCP_IP) { - if (empty($this->ipAddress)) { - throw new ConfigurationException( - "IpAddress is required for TCP or HTTP communication modes." - ); - } - } - - if (empty($this->port)) { - throw new ConfigurationException( - "Port is required for TCP or HTTP communication modes." - ); - } - - if ($this->deviceType == DeviceType::HPA_ISC250 && - empty($this->requestIdProvider) - ) { - throw new ConfigurationException( - "Request id is mandatory for this transaction. IRequestIdProvider is not implemented" - ); - } - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/ConnectionContainer.php b/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/ConnectionContainer.php deleted file mode 100644 index d608d57..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/ConnectionContainer.php +++ /dev/null @@ -1,62 +0,0 @@ -deviceController = $deviceController; - } - - /** - * Gets the current `ConnectionContainer` instance - * - * @return ConnectionContainer - */ - public static function instance() - { - if (static::$instance == null) { - static::$instance = new static(null); - } - return static::$instance; - } - - /** - * Configures the `ConnectionContainer` singleton - * - * @param ServicesConfig $config - * - * @return void - */ - public static function configure(ConnectionConfig $config) - { - $config->validate(); - - $deviceController = null; - - switch ($config->deviceType) { - case DeviceType::HPA_ISC250: - static::$instance = new HpaController($config); - break; - } - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/DeviceController.php b/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/DeviceController.php deleted file mode 100644 index c38c275..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/DeviceController.php +++ /dev/null @@ -1,17 +0,0 @@ -device = new HpaInterface($this); - $this->requestIdProvider = $config->requestIdProvider; - $this->deviceConfig = $config; - - switch ($config->connectionMode) { - case ConnectionModes::TCP_IP: - $this->deviceInterface = new HpaTcpInterface($config); - break; - } - } - - public function manageTransaction($builder) - { - $this->builderData = $builder; - $xml = new \DOMDocument(); - $transactionType = $this->manageTransactionType($builder->transactionType); - // Build Request - $request = $xml->createElement("SIP"); - $request->appendChild($xml->createElement("Version", '1.0')); - $request->appendChild($xml->createElement("ECRId", '1004')); - $request->appendChild($xml->createElement("Request", $transactionType)); - $request->appendChild($xml->createElement("RequestId", "%s")); - $request->appendChild($xml->createElement("TransactionId", $builder->transactionId)); - - $totalAmount = TerminalUtils::formatAmount($builder->amount); - $gratuity = TerminalUtils::formatAmount($builder->gratuity); - if ($builder->gratuity !== null) { - $request->appendChild($xml->createElement("TipAmount", $gratuity)); - $totalAmount += $gratuity; - } else { - $request->appendChild($xml->createElement("TipAmount", 0)); - } - - $request->appendChild($xml->createElement("TotalAmount", $totalAmount)); - - $response = $this->send($xml->saveXML($request)); - return $response; - } - - public function processTransaction($builder) - { - $this->builderData = $builder; - $xml = new \DOMDocument('1.0', 'utf-8'); - $transactionType = $this->manageTransactionType($builder->transactionType); - $cardGroup = $this->manageCardGroup($builder->paymentMethodType); - - $amount = TerminalUtils::formatAmount($builder->amount); - $gratuity = TerminalUtils::formatAmount($builder->gratuity); - $taxAmount = TerminalUtils::formatAmount($builder->taxAmount); - - // Build Request - $request = $xml->createElement("SIP"); - $request->appendChild($xml->createElement("Version", '1.0')); - $request->appendChild($xml->createElement("ECRId", '1004')); - $request->appendChild($xml->createElement("Request", $transactionType)); - $request->appendChild($xml->createElement("RequestId", "%s")); - $request->appendChild($xml->createElement("CardGroup", $cardGroup)); - $request->appendChild($xml->createElement("ConfirmAmount", '0')); - $request->appendChild($xml->createElement("BaseAmount", $amount)); - - if ($builder->gratuity !== null) { - $request->appendChild($xml->createElement("TipAmount", $gratuity)); - } else { - $request->appendChild($xml->createElement("TipAmount", 0)); - } - - if ($builder->taxAmount !== null) { - $request->appendChild($xml->createElement("TaxAmount", $taxAmount)); - } else { - $request->appendChild($xml->createElement("TaxAmount", 0)); - } - - if ($builder->paymentMethodType == PaymentMethodType::EBT) { - $request->appendChild($xml->createElement("EBTAmount", $amount)); - } - - $request->appendChild($xml->createElement("TotalAmount", $amount)); - - $response = $this->send($xml->saveXML($request)); - return $response; - } - - /* - * Send control message to device - * - * @param string $message control message to device - * - * @return HpaResponse parsed device response - */ - - public function send($message, $requestType = null) - { - if (strpos($message, "%s") !== false) { - $requestId = (!empty($this->builderData->requestId)) ? - $this->builderData->requestId : - $this->requestIdProvider->getRequestId(); - $message = sprintf($message, $requestId); - } - //send messaege to gateway - $this->deviceInterface->send(trim($message), $requestType); - - //check response code - $acceptedCodes = ["0"]; - $this->checkResponse($this->deviceInterface->deviceResponse, $acceptedCodes); - return $this->deviceInterface->deviceResponse; - } - - /* - * Check the device response code - * - * @param HpaResponse $gatewayResponse parsed response from device - * @param array $acceptedCodes list of success response codes - * - * @return raise GatewayException incase of different unexpected code - */ - - public function checkResponse($gatewayResponse, $acceptedCodes) - { - if ($acceptedCodes === null) { - $acceptedCodes = ["00"]; - } - - if (!empty($gatewayResponse->resultText) || !empty($gatewayResponse->gatewayResponseMessage)) { - $responseCode = (string) $gatewayResponse->resultCode; - $responseMessage = (string) $gatewayResponse->resultText; - $responseText = (string) $gatewayResponse->gatewayResponseMessage; - - if (!in_array($responseCode, $acceptedCodes)) { - throw new GatewayException( - sprintf( - 'Unexpected Gateway Response: %s - %s : %s', - $responseCode, - $responseMessage, - $responseText - ), - $responseCode, - $responseMessage - ); - } - } else { - throw new GatewayException('Invalid Gateway Response'); - } - } - - /* - * Return message id based on the transaction type - * - * @param $transactionType|TransactionType - * $return HPA message id or UnsupportedTransactionException incase of unknown transaction type - */ - - private function manageTransactionType($transactionType) - { - switch ($transactionType) { - case TransactionType::SALE: - return HpaMessageId::CREDIT_SALE; - case TransactionType::AUTH: - return HpaMessageId::CREDIT_AUTH; - case TransactionType::CAPTURE: - return HpaMessageId::CAPTURE; - case TransactionType::VERIFY: - return HpaMessageId::CARD_VERIFY; - case TransactionType::VOID: - return HpaMessageId::CREDIT_VOID; - case TransactionType::REFUND: - return HpaMessageId::CREDIT_REFUND; - case TransactionType::BALANCE: - return HpaMessageId::BALANCE; - case TransactionType::ADD_VALUE: - return HpaMessageId::ADD_VALUE; - default: - throw new UnsupportedTransactionException( - 'The selected gateway does not support this transaction type.' - ); - } - } - - public function manageCardGroup($paymentMethodType) - { - $cardGroup = $paymentMethodType; - if ($paymentMethodType == PaymentMethodType::CREDIT) { - $cardGroup = 'Credit'; - } elseif ($paymentMethodType == PaymentMethodType::DEBIT) { - $cardGroup = 'Debit'; - } elseif ($paymentMethodType == PaymentMethodType::EBT) { - $cardGroup = 'EBT'; - } elseif ($paymentMethodType == PaymentMethodType::GIFT) { - $cardGroup = 'GIFT'; - } - return $cardGroup; - } - - public function sendFile($sendFileData) - { - $sendFile = new HpaSendFileRequest($this->deviceConfig); - $sendFile->validate($sendFileData); - - $fileInfo = $sendFile->getFileInformation($sendFileData); - - $initialMessage = "" - . "1.0" - . "1004" - . "SendFile" - . "%s" - . "".$sendFileData->imageType."" - . "".$fileInfo['fileSize']."" - . "1" - . ""; - - $initialFileResponse = $this->send($initialMessage, HpaMessageId::SEND_FILE); - - if (!empty($initialFileResponse) && $initialFileResponse->resultCode == 0) { - $splitedImageData = str_split($fileInfo['fileData'], $initialFileResponse->maxDataSize); - $totalMessages = sizeof($splitedImageData); - - for ($i = 0; $i < $totalMessages; $i++) { - $isMultiple = ( ($i+1) != $totalMessages) ? 1 : 0; - $subsequentMessage = "" - . "1.0" - . "1004" - . "SendFile" - . "%s" - . "" . $splitedImageData[$i] . "" - . "" . $isMultiple . "" - . ""; - - $fileResponse = $this->send($subsequentMessage, HpaMessageId::SEND_FILE); - } - return $fileResponse; - } - } - - public function __destruct() - { - $this->device->reset(); - $this->device->closeLane(); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/HpaInterface.php b/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/HpaInterface.php deleted file mode 100644 index ed2dfaa..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/HpaInterface.php +++ /dev/null @@ -1,428 +0,0 @@ -hpaController = $deviceController; - } - - #region Admin Messages - - /* - * GetAppInfoReport - Admin mode message - Get HeartSIP Application Information Report - */ - - public function initialize() - { - return $this->hpaController->send( - "" - . "1.0" - . "1004" - . "GetAppInfoReport" - . "%s" - . "", - HpaMessageId::GET_INFO_REPORT - ); - } - - /* - * LaneOpen - Admin mode message - Go to Lane Open State - */ - - public function openLane() - { - return $this->hpaController->send( - "" - . "1.0" - . "1004" - . "LaneOpen" - . "%s" - . "" - ); - } - - /* - * LaneClose - Admin mode message - Go to Lane Close State - */ - - public function closeLane() - { - return $this->hpaController->send( - "" - . "1.0" - . "1004" - . "LaneClose" - . "%s" - . "" - ); - } - - /* - * Reset - Admin mode message - Transition SIP to idle state - */ - - public function cancel() - { - return $this->reset(); - } - - /* - * Reboot - Admin mode message - Reboot the SIP device - */ - - public function reboot() - { - return $this->hpaController->send( - "" - . "1.0" - . "1004" - . "Reboot" - . "%s" - . "" - ); - } - - /* - * Reset - Admin mode message - Transition SIP to idle state - */ - - public function reset() - { - return $this->hpaController->send( - "" - . "1.0" - . "1004" - . "Reset" - . "%s" - . "" - ); - } - - public function lineItem($lineItemDetails) - { - if (empty($lineItemDetails->leftText)) { - throw new BuilderException("Line item left text cannot be null"); - } - $message = "" - . "1.0" - . "1004" - . "LineItem" - . "%s" - ."{$lineItemDetails->leftText}"; - - if (!empty($lineItemDetails->rightText)) { - $message .= sprintf("%s", $lineItemDetails->rightText); - } - if (!empty($lineItemDetails->runningLeftText)) { - $message .= sprintf( - "%s", - $lineItemDetails->runningLeftText - ); - } - if (!empty($lineItemDetails->runningRightText)) { - $message .= sprintf( - "%s", - $lineItemDetails->runningRightText - ); - } - - $message .= ""; - return $this->hpaController->send($message); - } - - /* - * StartCard - Admin mode message - Initiate card acquisition prior to a financial transaction. - * The intent is to perform card acquisition while the clerk is ringing up the items - */ - - public function startCard($paymentMethodType = null) - { - $message = "" - . "1.0" - . "1004" - . "StartCard" - . "%s"; - - if ($paymentMethodType !== null) { - $cardGroup = $this->hpaController->manageCardGroup($paymentMethodType); - $message .= "$cardGroup"; - } - - $message .= ""; - - return $this->hpaController->send($message); - } - - #endregion - - #credit - - public function batchClose() - { - return $this->hpaController->send( - "" - . "1.0" - . "1004" - . "EOD" - . "%s" - . "", - HpaMessageId::EOD - ); - } - - public function eod() - { - return $this->batchClose(); - } - - public function creditAuth($amount = null) - { - return (new TerminalAuthBuilder(TransactionType::AUTH, PaymentMethodType::CREDIT)) - ->withAmount($amount); - } - - public function creditCapture($amount = null) - { - return (new TerminalManageBuilder(TransactionType::CAPTURE, PaymentMethodType::CREDIT)) - ->withAmount($amount); - } - - public function creditRefund($amount = null) - { - return (new TerminalAuthBuilder(TransactionType::REFUND, PaymentMethodType::CREDIT)) - ->withAmount($amount); - } - - public function creditSale($amount = null) - { - return (new TerminalAuthBuilder(TransactionType::SALE, PaymentMethodType::CREDIT)) - ->withAmount($amount); - } - - public function creditVerify() - { - return (new TerminalAuthBuilder(TransactionType::VERIFY, PaymentMethodType::CREDIT)); - } - - public function creditVoid() - { - return (new TerminalManageBuilder(TransactionType::VOID, PaymentMethodType::CREDIT)); - } - - #end credit - - public function debitSale($amount = null) - { - return (new TerminalAuthBuilder(TransactionType::SALE, PaymentMethodType::DEBIT)) - ->withAmount($amount); - } - - public function debitRefund($amount = null) - { - return (new TerminalAuthBuilder(TransactionType::REFUND, PaymentMethodType::DEBIT)) - ->withAmount($amount); - } - - public function debitVoid() - { - throw new UnsupportedTransactionException( - 'The selected gateway does not support this transaction type.' - ); - } - - public function disableHostResponseBeep() - { - } - - public function getSignatureFile() - { - } - - public function ebtBalance() - { - return (new TerminalAuthBuilder(TransactionType::BALANCE, PaymentMethodType::EBT)); - } - - public function ebtPurchase($amount = null) - { - return (new TerminalAuthBuilder(TransactionType::SALE, PaymentMethodType::EBT)) - ->withAmount($amount); - } - - public function ebtRefund($amount = null) - { - return (new TerminalAuthBuilder(TransactionType::REFUND, PaymentMethodType::EBT)) - ->withAmount($amount); - } - - public function ebtWithdrawl($amount = null) - { - throw new UnsupportedTransactionException( - 'The selected gateway does not support this transaction type.' - ); - } - - public function startDownload($deviceSettings) - { - $startDownloadRequest = sprintf( - "" - . "1.0" - . "1004" - . "Download" - . "%s" - . "%s" - . "%s" - . "%s" - . "%s" - . "%s" - . "%s", - "%s", - $deviceSettings->hudsUrl, - $deviceSettings->hudsPort, - $deviceSettings->terminalId, - $deviceSettings->applicationId, - $deviceSettings->downloadType, - $deviceSettings->downloadTime - ); - - $startDownloadRequest .= ""; - return $this->hpaController->send($startDownloadRequest); - } - - #Gift Region - public function giftAddValue($amount = null) - { - return (new TerminalAuthBuilder(TransactionType::ADD_VALUE, PaymentMethodType::GIFT)) - ->withAmount($amount) - ->withCurrency(CurrencyType::CURRENCY); - } - - public function giftBalance() - { - return (new TerminalAuthBuilder(TransactionType::BALANCE, PaymentMethodType::GIFT)) - ->withCurrency(CurrencyType::CURRENCY); - } - - public function giftSale($amount = null) - { - return (new TerminalAuthBuilder(TransactionType::SALE, PaymentMethodType::GIFT)) - ->withAmount($amount) - ->withCurrency(CurrencyType::CURRENCY); - } - - public function giftVoid() - { - return (new TerminalManageBuilder(TransactionType::VOID, PaymentMethodType::GIFT)); - } - - public function setSafMode($parameterValue) - { - return $this->hpaController->send( - sprintf( - "" - . "1.0" - . "1004" - . "SetParameter" - . "%s" - . "1" - . "STORMD" - . "%s" - . "", - '%s', - $parameterValue - ) - ); - } - - public function sendSaf() - { - return $this->hpaController->send( - "" - . "1.0" - . "1004" - . "SendSAF" - . "%s" - . "", - HpaMessageId::SENDSAF - ); - } - - public function sendFile($sendFileData) - { - return $this->hpaController->sendFile($sendFileData); - } - - public function getDiagnosticReport($totalFields) - { - return $this->hpaController->send( - sprintf( - "" - . "1.0" - . "1004" - . "GetDiagnosticReport" - . "%s" - . "%s" - . "", - '%s', - $totalFields - ), - HpaMessageId::GET_DIAGNOSTIC_REPORT - ); - } - - public function promptForSignature() - { - return $this->hpaController->send( - sprintf( - "" - . "1.0" - . "1004" - . "SignatureForm" - . "%s" - . "PLEASE SIGN BELOW" - . "", - '%s' - ), - HpaMessageId::SIGNATURE_FORM - ); - } - - public function getLastResponse() - { - return $this->hpaController->send( - sprintf( - "" - . "1.0" - . "1004" - . "GetLastResponse" - . "%s" - . "", - '%s' - ), - HpaMessageId::GET_LAST_RESPONSE - ); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/HpaTcpInterface.php b/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/HpaTcpInterface.php deleted file mode 100644 index 8a033af..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/HpaTcpInterface.php +++ /dev/null @@ -1,367 +0,0 @@ -deviceDetails = $config; - ob_implicit_flush(true); - } - - /* - * Create socket connection with device - * Throws GatewayException incase of connection error - */ - public function connect() - { - if ($this->tcpConnection !== null) { - return; - } - - $errno = ''; - $errstr = ''; - - // open socket - try { - $this->tcpConnection = pfsockopen( - 'tcp://' . $this->deviceDetails->ipAddress, - $this->deviceDetails->port, - $errno, - $errstr, - $this->deviceDetails->timeout - ); - } catch (\Exception $e) { - throw new GatewayException( - sprintf('Device connection error: %s - %s', $errno, $errstr), - $errno, - $errstr - ); - } - } - - /* - * Close TCP socket connection with device - */ - public function disconnect() - { - // close socket - if ($this->tcpConnection !== null) { - fclose($this->tcpConnection); - } - } - - /* - * Send request message to device using socket connection - * @param string $message XML request string - */ - public function send($message, $requestType = null) - { - $this->connect(); - $this->requestType = $requestType; - $out = ''; - - if ($this->tcpConnection !== null) { - try { - $length = TerminalUtils::findLength($message); - - if (false === ($bytes_written = fwrite($this->tcpConnection, $length.$message))) { - throw new GatewayException('Device error: failed to write to socket'); - } else { - //set time out for read and write - stream_set_timeout($this->tcpConnection, $this->deviceDetails->timeout); - - $multipleMessage = true; - do { - // read from socket - $part = fgets($this->tcpConnection); - $out .= $part; - - //break the loop when there is no multiple message - if ($part == "0\n") { - $multipleMessage = false; - } elseif ($part == "\n" && $multipleMessage === false) { - break; - } - } while ($part !== false && !feof($this->tcpConnection)); - } - if (!empty($out)) { - $this->filterResponseMessage($out); - } - } catch (\Exception $e) { - throw new GatewayException( - 'Device error: ' . $e->getMessage(), - null, - $e->getMessage() - ); - } - } - return; - } - - /* - * Filter the device response. remove control characters - * Convert multiple string message as array using keyword - * - * @param XML|String $gatewayResponse XML response from device - */ - private function filterResponseMessage($gatewayResponse) - { - //remove non printable characters - $gatewayResponse = preg_replace('/[\x00-\x09\x0B\x0C\x0E-\x1F\x7F\;]/', '', trim($gatewayResponse)); - - if ($this->requestType == HpaMessageId::EOD) { - //process eod reponse by HpaEodResponse handler - $responseHandler = new HpaEodResponse(); - $this->deviceResponse = $responseHandler->mapResponse($gatewayResponse); - } elseif ($this->requestType == HpaMessageId::SENDSAF) { - //process eod reponse by HpaSendSafResponse handler - $responseHandler = new HpaSendSafResponse(); - $this->deviceResponse = $responseHandler->mapResponse($gatewayResponse); - } elseif ($this->requestType == HpaMessageId::GET_DIAGNOSTIC_REPORT) { - //process Diagnostic Report Response - $responseHandler = new HpaDiagnosticReportResponse(); - $this->deviceResponse = $responseHandler->mapResponse($gatewayResponse); - } elseif ($this->requestType == HpaMessageId::GET_LAST_RESPONSE) { - //process get last response report - $this->deviceResponse = new HpaResponse(); - $this->parseResponse($gatewayResponse); - } elseif ($this->requestType == HpaMessageId::GET_INFO_REPORT) { - $messageList = explode('', $gatewayResponse); - $this->deviceResponse = new HpaResponse(); - - if (!empty($messageList)) { - foreach ($messageList as $message) { - if (!empty($message)) { - //process individual response - if (strpos($message, '') !== false && !strpos($message, '')) { - $message .= ''; - $this->parseResponse($message); - } - } - } - } - } else { - $this->deviceResponse = new HpaResponse(); - $this->parseResponse($gatewayResponse); - } - return; - } - - /* - * Parse device response - * - * @param XML|String $gatewayResponse XML response from device - */ - - public function parseResponse($gatewayResponse) - { - $responseData = TerminalUtils::xmlParse($gatewayResponse); - - if (!empty($responseData)) { - $this->setBasicResponse($responseData); - - //process the records - if (!empty($responseData['Record'])) { - if ($this->deviceResponse->response == 'GetAppInfoReport') { - $this->parseResponseRecord($responseData['Record'], 'initializeResponse'); - } - } - } - return; - } - - /* - * Parse request specific responses - * - * @param XML $gatewayRecord - * @param string $recordType array key to identify the record type - */ - - private function parseResponseRecord($gatewayRecord, $recordType) - { - if (!empty($gatewayRecord['Field'])) { - if (isset($gatewayRecord['Field']['Key']) && isset($gatewayRecord['Field']['Value'])) { - $field = $gatewayRecord['Field']; - $key = $this->convertRecordKey($field['Key']); - $this->deviceResponse->responseData[$recordType]["$key"] = $field['Value']; - } else { - //incase of multi dimensional array - foreach ($gatewayRecord['Field'] as $field) { - if (isset($field['Key']) && isset($field['Value'])) { - $key = $this->convertRecordKey($field['Key']); - $this->deviceResponse->responseData[$recordType]["$key"] = $field['Value']; - } - } - } - } - } - - /* - * Set transaction based response in $deviceResponse - * - * @param array $response - */ - private function parseTransactionResponse($response) - { - $this->setValueInResponse('referenceNumber', $response, 'ReferenceNumber'); - $this->setValueInResponse('cardHolderName', $response, 'CardholderName'); - $this->setValueInResponse('entryMethod', $response, 'CardAcquisition'); - $this->setValueInResponse('approvalCode', $response, 'ApprovalCode'); - $this->setValueInResponse('transactionTime', $response, 'TransactionTime'); - $this->setValueInResponse('maskedCardNumber', $response, 'MaskedPAN'); - $this->setValueInResponse('cardType', $response, 'CardType'); - $this->setValueInResponse('signatureStatus', $response, 'SignatureLine'); - - if (isset($response['TipAdjustAllowed']) && !empty($response['TipAmount'])) { - $this->deviceResponse->tipAmount = TerminalUtils::reformatAmount( - $response['TipAmount'] - ); - } - - if (isset($response['AuthorizedAmount'])) { - $this->deviceResponse->transactionAmount = TerminalUtils::reformatAmount( - $response['AuthorizedAmount'] - ); - } - - //EBT response - $this->setValueInResponse('ebtType', $response, 'EBTType'); - $this->setValueInResponse('pinVerified', $response, 'PinVerified'); - } - - /* - * Set transaction based response in $deviceResponse - * - * @param string $propertyName $deviceResponse object property name - * @param array $response - * @param string $responseKey response key received from device - */ - private function setValueInResponse($propertyName, $response, $responseKey) - { - if (isset($response[$responseKey])) { - $this->deviceResponse->{$propertyName} = $response[$responseKey]; - } - } - - private function setBasicResponse($responseData) - { - $this->setValueInResponse('versionNumber', $responseData, 'Version'); - $this->setValueInResponse('ecrId', $responseData, 'ECRId'); - $this->setValueInResponse('sipId', $responseData, 'SIPId'); - $this->setValueInResponse('deviceId', $responseData, 'DeviceId'); - $this->setValueInResponse('response', $responseData, 'Response'); - $this->setValueInResponse('multipleMessage', $responseData, 'MultipleMessage'); - $this->setValueInResponse('resultCode', $responseData, 'Result'); - $this->setValueInResponse('transactionId', $responseData, 'ResponseId'); - $this->setValueInResponse('responseCode', $responseData, 'ResponseCode'); - $this->setValueInResponse('resultText', $responseData, 'ResultText'); - $this->setValueInResponse('requestId', $responseData, 'RequestId'); - $this->setValueInResponse('responseText', $responseData, 'ResponseText'); - $this->setValueInResponse('gatewayResponseMessage', $responseData, 'GatewayRspMsg'); - $this->setValueInResponse('isStoredResponse', $responseData, 'StoredResponse'); - $this->setValueInResponse('partialApproval', $responseData, 'PartialApproval'); - $this->setValueInResponse('avsResponseText', $responseData, 'AVSResultText'); - $this->setValueInResponse('avsResponseCode', $responseData, 'AVS'); - $this->setValueInResponse('cvvResponseCode', $responseData, 'CVV'); - $this->setValueInResponse('cvvResponseText', $responseData, 'CVVResultText'); - $this->setValueInResponse('signatureData', $responseData, 'AttachmentData'); - - if (isset($responseData['BalanceDueAmount'])) { - $this->deviceResponse->balanceAmountDue = TerminalUtils::reformatAmount( - $responseData['BalanceDueAmount'] - ); - } - - if (isset($responseData['AvailableBalance'])) { - $this->deviceResponse->availableBalance = TerminalUtils::reformatAmount( - $responseData['AvailableBalance'] - ); - } - - //set EMV tags - $this->setValueInResponse('emvApplicationId', $responseData, 'EMV_AID'); - $this->setValueInResponse('emvApplicationName', $responseData, 'EMV_ApplicationName'); - $this->setValueInResponse('emvTerminalVerificationResults', $responseData, 'EMV_TVR'); - $this->setValueInResponse('emvCardHolderVerificationMethod', $responseData, 'EMV_TSI'); - $this->setValueInResponse('emvCryptogramType', $responseData, 'EMV_CryptogramType'); - $this->setValueInResponse('emvCryptogram', $responseData, 'EMV_Cryptogram'); - - //send file response - $this->setValueInResponse('maxDataSize', $responseData, 'MaxDataSize'); - - //process transaction based response - $transactionRequests = [ - HpaMessageId::CREDIT_SALE, - HpaMessageId::CREDIT_REFUND, - HpaMessageId::CREDIT_VOID, - HpaMessageId::CARD_VERIFY, - HpaMessageId::CREDIT_AUTH, - HpaMessageId::CAPTURE - ]; - if (in_array($this->deviceResponse->response, $transactionRequests)) { - $this->parseTransactionResponse($responseData); - } - - if ($this->requestType == HpaMessageId::GET_LAST_RESPONSE && - !empty($responseData['LastResponse'])) { - foreach ($responseData['LastResponse'] as $responseKey => $responseValue) { - $key = ($responseKey == 'SIPId' || $responseKey == 'ECRId') ? - strtolower($responseKey) : lcfirst($responseKey); - $this->deviceResponse->lastResponse[$key] = $responseValue; - } - } - } - - private function convertRecordKey($key) - { - //convert "APPLICATION MODE" key as "applicationMode" - $key = strtolower($key); - $key = lcfirst(ucwords($key)); - $key = str_replace(' ', '', $key); - return $key; - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Requests/HpaSendFileRequest.php b/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Requests/HpaSendFileRequest.php deleted file mode 100644 index f92d8c2..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Requests/HpaSendFileRequest.php +++ /dev/null @@ -1,65 +0,0 @@ -deviceConfig = $deviceConfig; - } - - public function validate($sendFileInfo) - { - if (empty($sendFileInfo) || empty($sendFileInfo->imageLocation) || - empty($sendFileInfo->imageType)) { - throw new BuilderException("Input error: Image location / type missing"); - } - - //validate file height and width - list($width, $height) = getimagesize($sendFileInfo->imageLocation); - - //validate image size - if ($sendFileInfo->imageType == HpaSendFileType::BANNER) { - if ($this->deviceConfig->deviceType == DeviceType::HPA_ISC250 && - ($height > 60 || $width > 480)) { - throw new BuilderException("Incorrect file height and width"); - } elseif ($this->deviceConfig->deviceType == DeviceType::HPA_IPP350 && - ($height > 40 || $width > 320)) { - throw new BuilderException("Incorrect file height and width"); - } - } elseif ($sendFileInfo->imageType == HpaSendFileType::IDLELOGO) { - if ($this->deviceConfig->deviceType == DeviceType::HPA_ISC250 && - ($height > 272 || $width > 480)) { - throw new BuilderException("Incorrect file height and width"); - } elseif ($this->deviceConfig->deviceType == DeviceType::HPA_IPP350 && - ($height > 240 || $width > 320)) { - throw new BuilderException("Incorrect file height and width"); - } - } - } - - public function getFileInformation($sendFileInfo) - { - try { - //convert image to hexa decimal ASCII format - $hex = unpack("H*", file_get_contents($sendFileInfo->imageLocation)); - $hex = current($hex); - - $fileInfo['fileSize'] = filesize($sendFileInfo->imageLocation); - $fileInfo['fileData'] = $hex; - $fileInfo['fileDataSize'] = strlen($hex); - - return $fileInfo; - } catch (Exception $e) { - throw new BuilderException("Input error: " . $e->getMessage); - } - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Responses/HpaDiagnosticReportResponse.php b/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Responses/HpaDiagnosticReportResponse.php deleted file mode 100644 index 3be25c9..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Responses/HpaDiagnosticReportResponse.php +++ /dev/null @@ -1,135 +0,0 @@ -deviceResponse = new HpaResponse(); - - //incase of muliple message needs to be splitted - //convert the response as array using keyword - $messageList = explode('', $gatewayMultipleResponse); - - if (!empty($messageList)) { - foreach ($messageList as $message) { - if (!empty($message)) { - //process individual response - if (strpos($message, '') !== false && !strpos($message, '')) { - $message .= ''; - $this->parseReportResponse($message); - } - } - } - } - - return $this->deviceResponse; - } - - private function parseReportResponse($gatewayResponse) - { - $responseData = TerminalUtils::xmlParse($gatewayResponse); - - if (!empty($responseData)) { - $responseType = lcfirst($responseData['Response']); - - $this->setValue('versionNumber', $responseData, 'Version'); - $this->setValue('ecrId', $responseData, 'ECRId'); - $this->setValue('sipId', $responseData, 'SIPId'); - $this->setValue('deviceId', $responseData, 'DeviceId'); - $this->setValue('response', $responseData, 'Response'); - $this->setValue('multipleMessage', $responseData, 'MultipleMessage'); - $this->setValue('resultCode', $responseData, 'Result'); - $this->setValue('responseCode', $responseData, 'ResponseCode'); - $this->setValue('resultText', $responseData, 'ResultText'); - $this->setValue('requestId', $responseData, 'RequestId'); - - if (!empty($responseData['Record'])) { - //for GetDiagnosticReport - $this->parseResponseRecord($responseData['Record'], $responseType); - } - } - } - - private function parseResponseRecord($gatewayRecord, $recordType) - { - if (!empty($gatewayRecord['Field'])) { - $data = []; - if (isset($gatewayRecord['Field']['Key']) && isset($gatewayRecord['Field']['Value'])) { - $field = $gatewayRecord['Field']; - $key = $this->formatKey($field['Key']); - $data["$key"] = $field['Value']; - } else { - //incase of multi dimensional array - foreach ($gatewayRecord['Field'] as $field) { - if (isset($field['Key']) && isset($field['Value'])) { - $key = $this->formatKey($field['Key']); - - //convert the string as array when same key value pair repeated - if (isset($data[$key])) { - if (is_array($data[$key]) === false) { - //convert string to array and assign last string as first element of array - $prevValue = $data[$key]; - $data[$key] = [$prevValue]; - } - - $data[$key][] = $field['Value']; - } else { - $data[$key] = $field['Value']; - } - } - } - } - if ($recordType == 'getdiagnosticreport') { - $tableCategory = $this->formatTableCategory($gatewayRecord); - - $this->deviceResponse->responseData[$recordType] - [$tableCategory] [] = $data; - } elseif (!empty($this->deviceResponse->responseData[$recordType])) { - $this->deviceResponse->responseData[$recordType][] = $data; - } else { - $this->deviceResponse->responseData[$recordType] = $data; - } - } - } - - /* - * Set transaction based response in $deviceResponse - * - * @param string $propertyName $deviceResponse object property name - * @param array $response - * @param string $responseKey response key received from device - */ - - private function setValue($propertyName, $response, $responseKey) - { - if (isset($response[$responseKey])) { - $this->deviceResponse->{$propertyName} = $response[$responseKey]; - } - } - - private function formatKey($key) - { - //convert "APPLICATION MODE" key as "applicationMode" - $key = ucwords(strtolower($key)); - $key = str_replace(' ', '', $key); - return $key; - } - - private function formatTableCategory($gatewayRecord) - { - $tableCategory = (!empty($gatewayRecord['TableCategory'])) ? - lcfirst(ucwords(strtolower($gatewayRecord['TableCategory']))) : 'batchReport'; - - $tableCategory = str_replace(' ', '', $tableCategory); - - return $tableCategory; - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Responses/HpaEodResponse.php b/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Responses/HpaEodResponse.php deleted file mode 100644 index eedc9ad..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Responses/HpaEodResponse.php +++ /dev/null @@ -1,174 +0,0 @@ -deviceResponse = new HpaResponse(); - $this->deviceResponse->responseData = [ - 'getBatchReport' => [ - 'batchSummary' => [], - 'batchReport' => [], - 'visaCardSummary' => [], - 'mastercardCardSummary' => [], - 'americanExpressCardSummary' => [], - 'discoverCardSummary' => [], - 'paypalCardSummary' => [], - 'batchDetail' => [], - 'transactionDetails' => [] - ] - ]; - - //incase of muliple message needs to be splitted - //convert the response as array using keyword - $messageList = explode('', $gatewayMultipleResponse); - - if (!empty($messageList)) { - foreach ($messageList as $message) { - if (!empty($message)) { - //process individual response - if (strpos($message, '') !== false && !strpos($message, '')) { - $message .= ''; - $this->parseEODResponse($message); - } - } - } - } - - return $this->deviceResponse; - } - - private function parseEODResponse($gatewayResponse) - { - $responseData = TerminalUtils::xmlParse($gatewayResponse); - - if (!empty($responseData)) { - $responseType = lcfirst($responseData['Response']); - - if (!empty($responseData['Record'])) { - //for GetBatchReport - $this->parseResponseRecord($responseData['Record'], $responseType); - } elseif ($responseData['Response'] == 'EOD') { - //process main EOD response - $this->setValue('versionNumber', $responseData, 'Version'); - $this->setValue('ecrId', $responseData, 'ECRId'); - $this->setValue('sipId', $responseData, 'SIPId'); - $this->setValue('deviceId', $responseData, 'DeviceId'); - $this->setValue('response', $responseData, 'Response'); - $this->setValue('multipleMessage', $responseData, 'MultipleMessage'); - $this->setValue('resultCode', $responseData, 'Result'); - $this->setValue('transactionId', $responseData, 'ResponseId'); - $this->setValue('responseCode', $responseData, 'ResponseCode'); - $this->setValue('resultText', $responseData, 'ResultText'); - $this->setValue('requestId', $responseData, 'RequestId'); - - //EOD specific - $this->setValue('reversal', $responseData, 'Reversal'); - $this->setValue('emvOfflineDecline', $responseData, 'EMVOfflineDecline'); - $this->setValue('transactionCertificate', $responseData, 'TransactionCertificate'); - $this->setValue('attachment', $responseData, 'Attachment'); - $this->setValue('sendSAF', $responseData, 'SendSAF'); - $this->setValue('batchClose', $responseData, 'BatchClose'); - $this->setValue('heartBeat', $responseData, 'HeartBeat'); - $this->setValue('eMVPDL', $responseData, 'EMVPDL'); - } - } - } - - private function parseResponseRecord($gatewayRecord, $recordType) - { - if (!empty($gatewayRecord['Field'])) { - $data = []; - if (isset($gatewayRecord['Field']['Key']) && isset($gatewayRecord['Field']['Value'])) { - $field = $gatewayRecord['Field']; - $key = $this->formatKey($field['Key']); - $data["$key"] = $this->formatValue($key, $field['Value']); - } else { - //incase of multi dimensional array - foreach ($gatewayRecord['Field'] as $field) { - if (isset($field['Key']) && isset($field['Value'])) { - $key = $this->formatKey($field['Key']); - - //convert the string as array when same key value pair repeated - if (isset($data[$key])) { - if (is_array($data[$key]) === false) { - //convert string to array and assign last string as first element of array - $prevValue = $data[$key]; - $data[$key] = [$prevValue]; - } - - $data[$key][] = $this->formatValue($key, $field['Value']); - } else { - $data[$key] = $this->formatValue($key, $field['Value']); - } - } - } - } - if ($recordType == 'getBatchReport' || $recordType == 'sendSAF') { - $tableCategory = $this->formatTableCategory($gatewayRecord); - - $this->deviceResponse->responseData[$recordType] - [$tableCategory] [] = $data; - } elseif (!empty($this->deviceResponse->responseData[$recordType])) { - $this->deviceResponse->responseData[$recordType][] = $data; - } else { - $this->deviceResponse->responseData[$recordType] = $data; - } - } - } - - /* - * Set transaction based response in $deviceResponse - * - * @param string $propertyName $deviceResponse object property name - * @param array $response - * @param string $responseKey response key received from device - */ - - private function setValue($propertyName, $response, $responseKey) - { - if (isset($response[$responseKey])) { - $this->deviceResponse->{$propertyName} = $response[$responseKey]; - } - } - - private function formatKey($key) - { - //convert "APPLICATION MODE" key as "applicationMode" - $key = lcfirst(ucwords($key)); - $key = str_replace(' ', '', $key); - return $key; - } - - private function formatValue($key, $value) - { - if (!empty($value) && (stripos($key, 'amt') !== false || stripos($key, 'amount') !== false)) { - return TerminalUtils::reformatAmount($value); - } - return $value; - } - - private function formatTableCategory($gatewayRecord) - { - $tableCategory = (!empty($gatewayRecord['TableCategory'])) ? - lcfirst(ucwords(strtolower($gatewayRecord['TableCategory']))) : 'batchReport'; - $tableCategory = str_replace(' ', '', $tableCategory); - - $tableCategory = preg_match("/transaction[0-9]+Detail/", $tableCategory) ? - 'transactionDetails' : $tableCategory; - - //convert approvedSaf#1Record into approvedSafRecords - $tableCategory = preg_match("/\#[0-9]+Record/", $tableCategory) ? - preg_replace("/\#[0-9]+Record/", '', $tableCategory) . 'Records' : $tableCategory; - - return $tableCategory; - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Responses/HpaSendSafResponse.php b/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Responses/HpaSendSafResponse.php deleted file mode 100644 index 4711d92..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/HPA/Responses/HpaSendSafResponse.php +++ /dev/null @@ -1,160 +0,0 @@ -deviceResponse = new HpaResponse(); - $this->deviceResponse->responseData = [ - 'sendSAF' => [ - 'approvedSafSummary' => [], - 'pendingSafSummary' => [], - 'declinedSafSummary' => [], - 'offlineApprovedSafSummary' => [], - 'partiallyApprovedSafSummary' => [], - 'approvedSafVoidSummary' => [], - 'pendingSafVoidSummary' => [], - 'declinedSafVoidSummary' => [] - ] - ]; - - //incase of muliple message needs to be splitted - //convert the response as array using keyword - $messageList = explode('', $gatewayMultipleResponse); - - if (!empty($messageList)) { - foreach ($messageList as $message) { - if (!empty($message)) { - //process individual response - if (strpos($message, '') !== false && !strpos($message, '')) { - $message .= ''; - $this->parseSAFResponse($message); - } - } - } - } - - return $this->deviceResponse; - } - - private function parseSAFResponse($gatewayResponse) - { - $responseData = TerminalUtils::xmlParse($gatewayResponse); - - if (!empty($responseData)) { - $responseType = lcfirst($responseData['Response']); - - if (!empty($responseData['Record'])) { - //other than SendSAF - $this->parseResponseRecord($responseData['Record'], $responseType); - } - if ($responseData['Response'] == 'SendSAF') { - //process main SendSAF response - $this->setValue('versionNumber', $responseData, 'Version'); - $this->setValue('ecrId', $responseData, 'ECRId'); - $this->setValue('sipId', $responseData, 'SIPId'); - $this->setValue('deviceId', $responseData, 'DeviceId'); - $this->setValue('response', $responseData, 'Response'); - $this->setValue('multipleMessage', $responseData, 'MultipleMessage'); - $this->setValue('resultCode', $responseData, 'Result'); - $this->setValue('transactionId', $responseData, 'ResponseId'); - $this->setValue('responseCode', $responseData, 'ResponseCode'); - $this->setValue('resultText', $responseData, 'ResultText'); - } - } - } - - private function parseResponseRecord($gatewayRecord, $recordType) - { - if (!empty($gatewayRecord['Field'])) { - $data = []; - if (isset($gatewayRecord['Field']['Key']) && isset($gatewayRecord['Field']['Value'])) { - $field = $gatewayRecord['Field']; - $key = $this->formatKey($field['Key']); - $data["$key"] = $this->formatValue($key, $field['Value']); - } else { - //incase of multi dimensional array - foreach ($gatewayRecord['Field'] as $field) { - if (isset($field['Key']) && isset($field['Value'])) { - $key = $this->formatKey($field['Key']); - - //convert the string as array when same key value pair repeated - if (isset($data[$key])) { - if (is_array($data[$key]) === false) { - //convert string to array and assign last string as first element of array - $prevValue = $data[$key]; - $data[$key] = [$prevValue]; - } - - $data[$key][] = $this->formatValue($key, $field['Value']); - } else { - $data[$key] = $this->formatValue($key, $field['Value']); - } - } - } - } - if ($recordType == 'sendSAF') { - $tableCategory = $this->formatTableCategory($gatewayRecord); - - $this->deviceResponse->responseData[$recordType] - [$tableCategory] [] = $data; - } elseif (!empty($this->deviceResponse->responseData[$recordType])) { - $this->deviceResponse->responseData[$recordType][] = $data; - } else { - $this->deviceResponse->responseData[$recordType] = $data; - } - } - } - - /* - * Set transaction based response in $deviceResponse - * - * @param string $propertyName $deviceResponse object property name - * @param array $response - * @param string $responseKey response key received from device - */ - - private function setValue($propertyName, $response, $responseKey) - { - if (isset($response[$responseKey])) { - $this->deviceResponse->{$propertyName} = $response[$responseKey]; - } - } - - private function formatKey($key) - { - //convert "APPLICATION MODE" key as "applicationMode" - $key = lcfirst(ucwords($key)); - $key = str_replace(' ', '', $key); - return $key; - } - - private function formatValue($key, $value) - { - if (!empty($value) && (stripos($key, 'amt') !== false || stripos($key, 'amount') !== false)) { - return TerminalUtils::reformatAmount($value); - } - return $value; - } - - private function formatTableCategory($gatewayRecord) - { - $tableCategory = (!empty($gatewayRecord['TableCategory'])) ? - lcfirst(ucwords(strtolower($gatewayRecord['TableCategory']))) : 'overallReport'; - $tableCategory = str_replace(' ', '', $tableCategory); - - //convert approvedSaf#1Record into approvedSafRecords - $tableCategory = preg_match("/\#[0-9]+Record/", $tableCategory) ? - preg_replace("/\#[0-9]+Record/", '', $tableCategory) . 'Records' : $tableCategory; - - return $tableCategory; - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Interfaces/IDeviceCommInterface.php b/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Interfaces/IDeviceCommInterface.php deleted file mode 100644 index 0367698..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Terminals/Interfaces/IDeviceCommInterface.php +++ /dev/null @@ -1,14 +0,0 @@ -')); - $gatewayResponse = str_replace(['&', '''], ['&', "'"], $gatewayResponse); - - //convert xml to PHP array - $responseXml = simplexml_load_string($gatewayResponse); - $responseJson = json_encode($responseXml); - $responseData = json_decode($responseJson, true); - - return $responseData; - } - - public static function formatAmount($amount) - { - return preg_replace('/[^0-9]/', '', sprintf('%01.2f', $amount)); - } - - public static function reformatAmount($amount) - { - return $amount / 100; - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Utils/GenerationUtils.php b/classes/includes/vendor/globalpayments/php-sdk/src/Utils/GenerationUtils.php deleted file mode 100644 index 29e19cc..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Utils/GenerationUtils.php +++ /dev/null @@ -1,159 +0,0 @@ -format('YmdHis'); - } - - /** - * Order Id for a initial request should be unique per client ID. This method - * generates a unique order ID using the PHP GUID function and then converts - * it to base64 to shorten the length to 22 characters. Order Id for a subsequent - * request (void, rebate, settle etc.) should use the order Id of the initial - * request. - * - * The order ID uses the PHP GUID (globally unique identifier), so in theory, - * it may not be unique but the odds of this are extremely remote (see - * https://en.wikipedia.org/wiki/Globally_unique_identifier) - * - * @return string - */ - public static function generateOrderId() - { - $uuid = self::getGuid(); - $mostSignificantBits = substr($uuid, 0, 8); - $leastSignificantBits = substr($uuid, 23, 8); - - return substr( - base64_encode($mostSignificantBits . $leastSignificantBits), - 0, - 22 - ); - } - - public static function generateRecurringKey($key = null) - { - if ($key !== null) { - return $key; - } - - $uuid = self::getGuid(); - return strtolower($uuid); - } - - public static function getGuid() - { - if (function_exists('com_create_guid')) { - return trim(com_create_guid(), '{}'); - } - - $data = openssl_random_pseudo_bytes(16); - $data[6] = chr(ord($data[6]) & 0x0f | 0x40); // set version to 0100 - $data[8] = chr(ord($data[8]) & 0x3f | 0x80); // set bits 6-7 to 10 - return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4)); - } - - public static function convertArrayToJson($request, $hppVersion = '') - { - if ($hppVersion != HppVersion::VERSION_2) { - $request = array_map('base64_encode', $request); - } - return json_encode($request); - } - - public static function decodeJson($json, $returnArray = true, $hppVersion = '') - { - if ($hppVersion != HppVersion::VERSION_2) { - return array_map('base64_decode', json_decode($json, true)); - } - return json_decode($json, $returnArray); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Data/TestCards.php b/classes/includes/vendor/globalpayments/php-sdk/test/Data/TestCards.php deleted file mode 100644 index b132d9a..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/test/Data/TestCards.php +++ /dev/null @@ -1,271 +0,0 @@ -value = $card->value; - $data->encryptionData = $card->encryptionData; - $data->pinBlock = $pinBlock; - return $data; - } - - public static function asEBTTrack($card, $pinBlock) - { - $data = new EBTTrackData(); - $data->value = $card->value; - $data->entryMethod = $card->entryMethod; - $data->encryptionData = $card->encryptionData; - $data->pinBlock = $pinBlock; - return $data; - } - - public static function asEBTManual($card, $pinBlock) - { - $data = new EBTCardData(); - $data->number = $card->number; - $data->expMonth = $card->expMonth; - $data->expYear = $card->expYear; - $data->pinBlock = $pinBlock; - return $data; - } - - public static function visaManual($cardPresent = false, $readerPresent = false) - { - $data = new CreditCardData(); - $data->number = '4012002000060016'; - $data->expMonth = 12; - $data->expYear = 2025; - $data->cvn = '123'; - $data->cardPresent = $cardPresent; - $data->readerPresent = $readerPresent; - return $data; - } - - public static function visaSwipe($entryMethod = null) - { - if ($entryMethod === null) { - $entryMethod = EntryMethod::SWIPE; - } - - $data = new CreditTrackData(); - $data->value = '%B4012002000060016^VI TEST CREDIT^251210118039000000000396?;4012002000060016=25121011803939600000?'; - $data->entryMethod = $entryMethod; - return $data; - } - - public static function visaSwipeEncrypted($entryMethod = null) - { - if ($entryMethod === null) { - $entryMethod = EntryMethod::SWIPE; - } - - $encryptionData = new EncryptionData(); - $encryptionData->version = '01'; - - $data = new CreditTrackData(); - $data->value = ';'; - $data->entryMethod = $entryMethod; - $data->encryptionData = $encryptionData; - return $data; - } - - public static function masterCardManual($cardPresent = false, $readerPresent = false) - { - $data = new CreditCardData(); - $data->number = '5473500000000014'; - $data->expMonth = 12; - $data->expYear = 2025; - $data->cvn = '123'; - $data->cardPresent = $cardPresent; - $data->readerPresent = $readerPresent; - return $data; - } - - public static function masterCardSeries2Manual($cardPresent = false, $readerPresent = false) - { - $data = new CreditCardData(); - $data->number = '2223000010005780'; - $data->expMonth = 12; - $data->expYear = 2019; - $data->cvn = '123'; - $data->cardPresent = $cardPresent; - $data->readerPresent = $readerPresent; - return $data; - } - - public static function masterCardSwipe($entryMethod = null) - { - if ($entryMethod === null) { - $entryMethod = EntryMethod::SWIPE; - } - - $data = new CreditTrackData(); - $data->value = '%B5473500000000014^MC TEST CARD^251210199998888777766665555444433332?;5473500000000014=25121019999888877776?'; - $data->entryMethod = $entryMethod; - return $data; - } - - public static function masterCard24Swipe($entryMethod = null) - { - if ($entryMethod === null) { - $entryMethod = EntryMethod::SWIPE; - } - - $data = new CreditTrackData(); - $data->value = '%B2223000010005780^TEST CARD/EMV BIN-2^19121010000000009210?;2223000010005780=19121010000000009210?'; - $data->entryMethod = $entryMethod; - return $data; - } - - public static function masterCard25Swipe($entryMethod = null) - { - if ($entryMethod === null) { - $entryMethod = EntryMethod::SWIPE; - } - - $data = new CreditTrackData(); - $data->value = '%B2223000010005798^TEST CARD/EMV BIN-2^19121010000000003840?;2223000010005798=19121010000000003840?'; - $data->entryMethod = $entryMethod; - return $data; - } - - public static function masterCardSwipeEncrypted($entryMethod = null) - { - if ($entryMethod === null) { - $entryMethod = EntryMethod::SWIPE; - } - - $encryptionData = new EncryptionData(); - $encryptionData->version = '01'; - - $data = new CreditTrackData(); - $data->value = ''; - $data->entryMethod = $entryMethod; - $data->encryptionData = $encryptionData; - return $data; - } - - public static function discoverManual($cardPresent = false, $readerPresent = false) - { - $data = new CreditCardData(); - $data->number = '6011000990156527'; - $data->expMonth = 12; - $data->expYear = 2025; - $data->cvn = '123'; - $data->cardPresent = $cardPresent; - $data->readerPresent = $readerPresent; - return $data; - } - - public static function discoverSwipe($entryMethod = null) - { - if ($entryMethod === null) { - $entryMethod = EntryMethod::SWIPE; - } - - $data = new CreditTrackData(); - $data->value = '%B6011000990156527^DIS TEST CARD^25121011000062111401?;6011000990156527=25121011000062111401?'; - $data->entryMethod = $entryMethod; - return $data; - } - - public static function discoverSwipeEncrypted($entryMethod = null) - { - if ($entryMethod === null) { - $entryMethod = EntryMethod::SWIPE; - } - - $encryptionData = new EncryptionData(); - $encryptionData->version = '01'; - - $data = new CreditTrackData(); - $data->value = ''; - $data->entryMethod = $entryMethod; - $data->encryptionData = $encryptionData; - return $data; - } - - public static function amexManual($cardPresent = false, $readerPresent = false) - { - $data = new CreditCardData(); - $data->number = '372700699251018'; - $data->expMonth = 12; - $data->expYear = 2025; - $data->cvn = '1234'; - $data->cardPresent = $cardPresent; - $data->readerPresent = $readerPresent; - return $data; - } - - public static function amexSwipe($entryMethod = null) - { - if ($entryMethod === null) { - $entryMethod = EntryMethod::SWIPE; - } - - $data = new CreditTrackData(); - $data->value = '%B3727 006992 51018^AMEX TEST CARD^2512990502700?;372700699251018=2512990502700?'; - $data->entryMethod = $entryMethod; - return $data; - } - - public static function jcbManual($cardPresent = false, $readerPresent = false) - { - $data = new CreditCardData(); - $data->number = '3566007770007321'; - $data->expMonth = 12; - $data->expYear = 2025; - $data->cvn = '123'; - $data->cardPresent = $cardPresent; - $data->readerPresent = $readerPresent; - return $data; - } - - public static function jcbSwipe($entryMethod = null) - { - if ($entryMethod === null) { - $entryMethod = EntryMethod::SWIPE; - } - - $data = new CreditTrackData(); - $data->value = '%B3566007770007321^JCB TEST CARD^2512101100000000000000000064300000?;3566007770007321=25121011000000076435?'; - $data->entryMethod = $entryMethod; - return $data; - } - - public static function giftCard1Swipe() - { - $data = new GiftCard(); - $data->trackData = '%B5022440000000000098^^391200081613?;5022440000000000098=391200081613?'; - return $data; - } - - public static function giftCard2Manual() - { - $data = new GiftCard(); - $data->number = '5022440000000000007'; - return $data; - } - - public static function gsbManual() - { - $data = new CreditCardData(); - $data->number = '6277220572999800'; - $data->expMonth = '12'; - $data->expYear = '2049'; - return $data; - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Data/TestChecks.php b/classes/includes/vendor/globalpayments/php-sdk/test/Data/TestChecks.php deleted file mode 100644 index 70eadae..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/test/Data/TestChecks.php +++ /dev/null @@ -1,37 +0,0 @@ -accountNumber = '24413815'; - $check->routingNumber = '490000018'; - $check->checkType = $checkType; - $check->accountType = $accountType; - $check->secCode = $secCode; - $check->entryMode = EntryMethod::MANUAL; - $check->checkHolderName = 'John Doe'; - $check->driversLicenseNumber = '09876543210'; - $check->driversLicenseState = 'TX'; - $check->phoneNumber = '8003214567'; - $check->birthYear = '1997'; - $check->ssnLast4 = '4321'; - if (!empty($checkHolderName)) { - $check->checkHolderName = $checkHolderName; - } - return $check; - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/AchTest.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/AchTest.php deleted file mode 100644 index 61e4a85..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/AchTest.php +++ /dev/null @@ -1,65 +0,0 @@ -eCheck = new ECheck(); - $this->eCheck->accountNumber = '24413815'; - $this->eCheck->routingNumber = '490000018'; - $this->eCheck->checkType = CheckType::PERSONAL; - $this->eCheck->secCode = SecCode::PPD; - $this->eCheck->accountType = AccountType::CHECKING; - $this->eCheck->entryMode = EntryMethod::MANUAL; - $this->eCheck->checkHolderName = 'John Doe'; - $this->eCheck->driversLicenseNumber = '09876543210'; - $this->eCheck->driversLicenseState = 'TX'; - $this->eCheck->phoneNumber = '8003214567'; - $this->eCheck->birthYear = '1997'; - $this->eCheck->ssnLast4 = '4321'; - - $this->address = new Address(); - $this->address->streetAddress1 = '123 Main St.'; - $this->address->city = 'Downtown'; - $this->address->state = 'NJ'; - $this->address->postalCode = '12345'; - - ServicesContainer::configure($this->getConfig()); - } - - public function testCheckSale() - { - $response = $this->eCheck->charge(11) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - protected function getConfig() - { - $config = new ServicesConfig(); - $config->secretApiKey = 'skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A'; - $config->serviceUrl = ($this->enableCryptoUrl) ? - 'https://cert.api2-c.heartlandportico.com/': - 'https://cert.api2.heartlandportico.com'; - return $config; - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/CheckTest.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/CheckTest.php deleted file mode 100644 index 3077c4e..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/CheckTest.php +++ /dev/null @@ -1,481 +0,0 @@ -secretApiKey = 'skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A'; - $config->serviceUrl = ($this->enableCryptoUrl) ? - 'https://cert.api2-c.heartlandportico.com/': - 'https://cert.api2.heartlandportico.com'; - return $config; - } - - protected function setup() - { - ServicesContainer::configure($this->config()); - - $this->address = new Address(); - $this->address->streetAddress1 = '123 Main St.'; - $this->address->city = 'Downtown'; - $this->address->province = 'NJ'; - $this->address->postalCode = '12345'; - } - - /// ACH Debit - Consumer - - public function test001ConsumerPersonalChecking() - { - $check = TestChecks::certification( - SecCode::PPD, - CheckType::PERSONAL, - AccountType::CHECKING - ); - - $response = $check->charge(11.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - // test case 25 - $voidResponse = $response->void()->execute(); - $this->assertNotNull($voidResponse); - $this->assertEquals('00', $voidResponse->responseCode); - } - - public function test002ConsumerBusinessChecking() - { - $check = TestChecks::certification( - SecCode::PPD, - CheckType::BUSINESS, - AccountType::CHECKING - ); - - $response = $check->charge(12.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test003ConsumerPersonalSavings() - { - $check = TestChecks::certification( - SecCode::PPD, - CheckType::PERSONAL, - AccountType::SAVINGS - ); - - $response = $check->charge(13.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test004ConsumerBusinessSavings() - { - $check = TestChecks::certification( - SecCode::PPD, - CheckType::BUSINESS, - AccountType::SAVINGS - ); - - $response = $check->charge(14.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test005CorporatePersonalChecking() - { - $check = TestChecks::certification( - SecCode::CCD, - CheckType::PERSONAL, - AccountType::CHECKING, - "Heartland Pays" - ); - - $response = $check->charge(15.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - // test case 26 - $voidResponse = $response->void()->execute(); - $this->assertNotNull($voidResponse); - $this->assertEquals('00', $voidResponse->responseCode); - } - - public function test006CorporateBusinessChecking() - { - $check = TestChecks::certification( - SecCode::CCD, - CheckType::BUSINESS, - AccountType::CHECKING, - "Heartland Pays" - ); - - $response = $check->charge(16.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test007CorporatePersonalSavings() - { - $check = TestChecks::certification( - SecCode::CCD, - CheckType::PERSONAL, - AccountType::SAVINGS, - "Heartland Pays" - ); - - $response = $check->charge(17.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test008CorporateBusinessSavings() - { - $check = TestChecks::certification( - SecCode::CCD, - CheckType::BUSINESS, - AccountType::SAVINGS, - "Heartland Pays" - ); - - $response = $check->charge(18.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test009EgoldPersonalChecking() - { - $check = TestChecks::certification( - SecCode::POP, - CheckType::PERSONAL, - AccountType::CHECKING - ); - - $response = $check->charge(11.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test010EgoldBusinessChecking() - { - $check = TestChecks::certification( - SecCode::CCD, - CheckType::BUSINESS, - AccountType::CHECKING - ); - - $response = $check->charge(12.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test011EgoldPersonalSavings() - { - $check = TestChecks::certification( - SecCode::POP, - CheckType::PERSONAL, - AccountType::SAVINGS - ); - - $response = $check->charge(13.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test012EgoldBusinessSavings() - { - $check = TestChecks::certification( - SecCode::POP, - CheckType::BUSINESS, - AccountType::SAVINGS - ); - - $response = $check->charge(14.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test013EsilverPersonalChecking() - { - $check = TestChecks::certification( - SecCode::POP, - CheckType::PERSONAL, - AccountType::CHECKING - ); - - $response = $check->charge(15.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test014EsilverBusinessChecking() - { - $check = TestChecks::certification( - SecCode::CCD, - CheckType::BUSINESS, - AccountType::CHECKING - ); - - $response = $check->charge(16.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test015EsilverPersonalSavings() - { - $check = TestChecks::certification( - SecCode::POP, - CheckType::PERSONAL, - AccountType::SAVINGS - ); - - $response = $check->charge(17.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test016EsilverBusinessSavings() - { - $check = TestChecks::certification( - SecCode::POP, - CheckType::BUSINESS, - AccountType::SAVINGS - ); - - $response = $check->charge(18.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - * @expectedExceptionMessage Processor Configuration error - */ - public function test017EbronzePersonalChecking() - { - $check = TestChecks::certification( - SecCode::EBRONZE, - CheckType::PERSONAL, - AccountType::CHECKING - ); - - $response = $check->charge(19.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - * @expectedExceptionMessage Processor Configuration error - */ - public function test018EbronzeBusinessChecking() - { - $check = TestChecks::certification( - SecCode::EBRONZE, - CheckType::BUSINESS, - AccountType::CHECKING - ); - - $response = $check->charge(20.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - * @expectedExceptionMessage Processor Configuration error - */ - public function test019EbronzePersonalSavings() - { - $check = TestChecks::certification( - SecCode::EBRONZE, - CheckType::PERSONAL, - AccountType::SAVINGS - ); - - $response = $check->charge(21.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - * @expectedExceptionMessage Processor Configuration error - */ - public function test020EbronzeBusinessSavings() - { - $check = TestChecks::certification( - SecCode::EBRONZE, - CheckType::BUSINESS, - AccountType::SAVINGS - ); - - $response = $check->charge(22.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test021WebPersonalChecking() - { - $check = TestChecks::certification( - SecCode::WEB, - CheckType::PERSONAL, - AccountType::CHECKING - ); - - $response = $check->charge(23.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test022WebBusinessChecking() - { - $check = TestChecks::certification( - SecCode::WEB, - CheckType::BUSINESS, - AccountType::CHECKING - ); - - $response = $check->charge(24.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test023WebPersonalSavings() - { - $check = TestChecks::certification( - SecCode::WEB, - CheckType::PERSONAL, - AccountType::SAVINGS - ); - - $response = $check->charge(25.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test024WebBusinessSavings() - { - $check = TestChecks::certification( - SecCode::WEB, - CheckType::BUSINESS, - AccountType::SAVINGS - ); - - $response = $check->charge(5.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/EcommerceCheckTest.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/EcommerceCheckTest.php deleted file mode 100644 index 19e5d5a..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/EcommerceCheckTest.php +++ /dev/null @@ -1,108 +0,0 @@ -secretApiKey = 'skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A'; - $config->serviceUrl = ($this->enableCryptoUrl) ? - 'https://cert.api2-c.heartlandportico.com/': - 'https://cert.api2.heartlandportico.com'; - return $config; - } - - protected function setup() - { - ServicesContainer::configure($this->config()); - - $this->address = new Address(); - $this->address->streetAddress1 = '123 Main St.'; - $this->address->city = 'Downtown'; - $this->address->province = 'NJ'; - $this->address->postalCode = '12345'; - } - - public function test001ConsumerPersonalChecking() - { - $check = TestChecks::certification( - SecCode::WEB, - CheckType::PERSONAL, - AccountType::CHECKING - ); - - $response = $check->charge(19.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test002ConsumerBusinessChecking() - { - $check = TestChecks::certification( - SecCode::WEB, - CheckType::BUSINESS, - AccountType::CHECKING - ); - - $response = $check->charge(20.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test003ConsumerPersonalSavings() - { - $check = TestChecks::certification( - SecCode::WEB, - CheckType::PERSONAL, - AccountType::SAVINGS - ); - - $response = $check->charge(21.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test004ConsumerBusinessSavings() - { - $check = TestChecks::certification( - SecCode::WEB, - CheckType::BUSINESS, - AccountType::SAVINGS - ); - - $response = $check->charge(22.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/EcommerceTest.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/EcommerceTest.php deleted file mode 100644 index ec0d09a..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/EcommerceTest.php +++ /dev/null @@ -1,1668 +0,0 @@ -secretApiKey = 'skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A'; - $config->serviceUrl = ($this->enableCryptoUrl) ? - 'https://cert.api2-c.heartlandportico.com/': - 'https://cert.api2.heartlandportico.com'; - return $config; - } - - protected function setup() - { - ServicesContainer::configure($this->config()); - $this->publicKey = 'pkapi_cert_jKc1FtuyAydZhZfbB3'; - - $this->ecommerceInfo = new EcommerceInfo(); - $this->ecommerceInfo->channel = EcommerceChannel::ECOM; - } - - public function test000CloseBatch() - { - try { - $response = BatchService::closeBatch(); - $this->assertNotNull($response); - } catch (ApiException $e) { - if (false === strpos($e->getMessage(), static::BATCH_NOT_OPEN) - && false === strpos($e->getMessage(), static::NO_TRANS_IN_BATCH) - ) { - $this->fail($e->getMessage()); - } - } - } - - /// CARD VERIFY - - /// Account Verification - - public function test001VerifyVisa() - { - $card = TestCards::visaManual(); - - $response = $card->verify() - ->withRequestMultiUseToken($this->useTokens) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test002VerifyMasterCard() - { - $card = TestCards::masterCardManual(); - $response = $card->verify() - ->withRequestMultiUseToken($this->useTokens) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test003VerifyDiscover() - { - $address = new Address(); - $address->postalCode = '75024'; - - $card = TestCards::discoverManual(); - - $response = $card->verify() - ->withAddress($address) - ->withRequestMultiUseToken($this->useTokens) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// Address Verification - - public function test004VerifyAmex() - { - $address = new Address(); - $address->postalCode = '75024'; - - $card = TestCards::amexManual(); - - $response = $card->verify() - ->withAddress($address) - ->withRequestMultiUseToken($this->useTokens) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// Balance Inquiry (for Prepaid Card) - - public function test005BalanceInquiryVisa() - { - if (false === $this->usePrepaid) { - $this->markTestSkipped('GSB not configured'); - } - - $card = TestCards::visaManual(); - - $response = $card->balanceInquiry() - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// CREDIT SALE (For Multi-Use Token Only) - - public function test006ChargeVisaToken() - { - $address = new Address(); - $address->streetAddress1 = '6860 Dallas Pkwy'; - $address->postalCode = '75024'; - - $card = TestCards::visaManual(); - - $response = $card->charge() - ->withCurrency('USD') - ->withAmount(13.01) - ->withAddress($address) - ->withRequestMultiUseToken(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals(true, $response->token != null); - self::$visaToken = $response->token; - } - - public function test007ChargeMasterCardToken() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::masterCardManual(); - - $response = $card->charge() - ->withCurrency('USD') - ->withAmount(13.02) - ->withAddress($address) - ->withRequestMultiUseToken(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals(true, $response->token != null); - self::$mastercardToken = $response->token; - } - - public function test008ChargeDiscoverToken() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '750241234'; - - $card = TestCards::discoverManual(); - - $response = $card->charge() - ->withCurrency('USD') - ->withAmount(13.03) - ->withAddress($address) - ->withRequestMultiUseToken(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals(true, $response->token != null); - self::$discoverToken = $response->token; - } - - public function test009ChargeAmexToken() - { - $address = new Address(); - $address->streetAddress1 = '6860 Dallas Pkwy'; - $address->postalCode = '75024'; - - $card = TestCards::visaManual(); - - $response = $card->charge() - ->withCurrency('USD') - ->withAmount(13.04) - ->withAddress($address) - ->withRequestMultiUseToken(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals(true, $response->token != null); - self::$amexToken = $response->token; - } - - /// CREDIT SALE - - public function test010ChargeVisa() - { - $address = new Address(); - $address->streetAddress1 = '6860 Dallas Pkwy'; - $address->postalCode = '75024'; - - $card = TestCards::visaManual(); - if ($this->useTokens) { - $card = new CreditCardData(); - $card->token = self::$visaToken; - } - - $response = $card->charge() - ->withCurrency('USD') - ->withAmount(17.01) - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - - $voidResponse = $response->void() - ->execute(); - $this->assertEquals(true, $voidResponse != null); - $this->assertEquals('00', $voidResponse->responseCode); - } - - public function test011ChargeMastercard() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::masterCardManual(); - if ($this->useTokens) { - $card = new CreditCardData(); - $card->token = self::$mastercardToken; - } - - $response = $card->charge() - ->withCurrency('USD') - ->withAmount(17.02) - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test012ChargeDiscover() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '750241234'; - - $card = TestCards::discoverManual(); - if ($this->useTokens) { - $card = new CreditCardData(); - $card->token = self::$discoverToken; - } - - $response = $card->charge() - ->withCurrency('USD') - ->withAmount(17.03) - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test013ChargeAmex() - { - $address = new Address(); - $address->streetAddress1 = '6860 Dallas Pkwy'; - $address->postalCode = '75024'; - - $card = TestCards::amexManual(); - if ($this->useTokens) { - $card = new CreditCardData(); - $card->token = self::$amexToken; - } - - $response = $card->charge() - ->withCurrency('USD') - ->withAmount(17.04) - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test014ChargeJcb() - { - $address = new Address(); - $address->streetAddress1 = '6860 Dallas Pkwy'; - $address->postalCode = '75024'; - - $card = TestCards::jcbManual(); - - $response = $card->charge() - ->withCurrency('USD') - ->withAmount(17.04) - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test011bChargeMasterCard() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::masterCardSeries2Manual(); - - $response = $card->charge() - ->withCurrency('USD') - ->withAmount(17.02) - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// AUTHORIZATION - - public function test015AuthorizationVisa() - { - # Test 015a Authorization - $address = new Address(); - $address->streetAddress1 = '6860 Dallas Pkwy'; - $address->postalCode = '75024'; - - - $card = TestCards::visaManual(); - - $response = $card->authorize(17.06) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - - # test 015b Capture/AddToBatch - $capture = $response->capture() - ->execute(); - $this->assertEquals(true, $capture != null); - $this->assertEquals('00', $capture->responseCode); - } - - public function test016AuthorizationMastercard() - { - # Test 016a Authorization - $address = new Address(); - $address->streetAddress1 = '6860 Dallas Pkwy'; - $address->postalCode = '750241234'; - - $card = TestCards::masterCardManual(); - - $response = $card->authorize(17.07) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - - # test 016b Capture/AddToBatch - $capture = $response->capture() - ->execute(); - $this->assertEquals(true, $capture != null); - $this->assertEquals('00', $capture->responseCode); - } - - public function test017AuthorizationDiscover() - { - # Test 017a Authorization - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::discoverManual(); - - $response = $card->authorize(17.08) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - - # test 017b Capture/AddToBatch - # do not capture - } - - /// PARTIALLY - APPROVED SALE - - public function test018PartialApprovalVisa() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::visaManual(); - - $response = $card->charge(130) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withAllowPartialAuth(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('10', $response->responseCode); - $this->assertEquals(true, $response->authorizedAmount != null); - $this->assertEquals('110.00', $response->authorizedAmount); - } - - public function test019PartialApprovalDiscover() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::discoverManual(); - - $response = $card->charge(145) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withAllowPartialAuth(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('10', $response->responseCode); - $this->assertEquals(true, $response->authorizedAmount != null); - $this->assertEquals('65.00', $response->authorizedAmount); - } - - public function test020PartialApprovalMastercard() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::discoverManual(); - - $response = $card->charge(155) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withAllowPartialAuth(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('10', $response->responseCode); - $this->assertEquals(true, $response->authorizedAmount != null); - $this->assertEquals('100.00', $response->authorizedAmount); - - $voidResponse = $response->void() - ->execute(); - $this->assertEquals(true, $voidResponse != null); - $this->assertEquals('00', $voidResponse->responseCode); - } - - /// LEVEL II CORPORATE PURCHASE CARD - - public function test021LevelIIResponseB() - { - $address = new Address(); - $address->streetAddress1 = '6860 Dallas Pkwy'; - $address->postalCode = '750241234'; - - $card = TestCards::visaManual(); - - $response = $card->charge(112.34) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('B', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withPoNumber('9876543210') - ->withTaxType(TaxType::NOT_USED) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test022LevelIIResponseB() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '750241234'; - - $card = TestCards::visaManual(); - - $response = $card->charge(112.34) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('B', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withTaxType(TaxType::SALES_TAX) - ->withTaxAmount(1.00) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test023LevelIIResponseR() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::visaManual(); - - $response = $card->charge(123.45) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('R', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withTaxType(TaxType::TAX_EXEMPT) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test024LevelIIResponseS() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::visaManual(); - - $response = $card->charge(134.56) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('S', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withPoNumber('9876543210') - ->withTaxType(TaxType::SALES_TAX) - ->withTaxAmount(1.00) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test025LevelIIResponseS() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::masterCardManual(); - - $response = $card->charge(111.06) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('S', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withPoNumber('9876543210') - ->withTaxType(TaxType::NOT_USED) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test026LevelIIResponseS() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::masterCardManual(); - - $response = $card->charge(111.07) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('S', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withTaxType(TaxType::SALES_TAX) - ->withTaxAmount(1.00) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test027LevelIIResponseS() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::masterCardManual(); - - $response = $card->charge(111.08) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('S', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withPoNumber('9876543210') - ->withTaxType(TaxType::SALES_TAX) - ->withTaxAmount(1.00) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test028LevelIIResponseS() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::masterCardManual(); - - $response = $card->charge(111.09) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('S', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withPoNumber('9876543210') - ->withTaxType(TaxType::TAX_EXEMPT) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test029LevelIINoResponse() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::amexManual(); - - $response = $card->charge(111.10) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('0', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withPoNumber('9876543210') - ->withTaxType(TaxType::NOT_USED) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test030LevelIINoResponse() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '750241234'; - - $card = TestCards::amexManual(); - - $response = $card->charge(111.11) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('0', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withTaxType(TaxType::SALES_TAX) - ->withTaxAmount(1.00) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test031LevelIINoResponse() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::amexManual(); - - $response = $card->charge(111.12) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('0', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withPoNumber('9876543210') - ->withTaxType(TaxType::SALES_TAX) - ->withTaxAmount(1.00) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test032LevelIINoResponse() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::amexManual(); - - $response = $card->charge(111.13) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('0', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withPoNumber('9876543210') - ->withTaxType(TaxType::TAX_EXEMPT) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - /// PRIOR / VOICE AUTHORIZATION - - public function test033OfflineSale() - { - $card = TestCards::visaManual(); - - $response = $card->charge(17.10) - ->withCurrency('USD') - ->withModifier(TransactionModifier::OFFLINE) - ->withOfflineAuthCode('654321') - ->withInvoiceNumber('123456') - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test033OfflineAuthorization() - { - $card = TestCards::visaManual(); - - $response = $card->authorize(17.10) - ->withCurrency('USD') - ->withModifier(TransactionModifier::OFFLINE) - ->withOfflineAuthCode('654321') - ->withInvoiceNumber('123456') - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// RETURN - - public function test034OfflineCreditReturn() - { - $card = TestCards::masterCardManual(); - - $response = $card->refund(15.15) - ->withCurrency('USD') - ->withInvoiceNumber('123456') - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test034bOfflineCreditReturn() - { - $card = TestCards::masterCardManual(); - - $response = $card->refund(15.16) - ->withCurrency('USD') - ->withInvoiceNumber('123456') - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// ONLINE VOID / REVERSAL - - public function test035VoidTest10() - { - // see test 010 - } - - public function test036VoidTest20() - { - // see test 020 - } - - /// Time Out Reversal - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\UnsupportedTransactionException - */ - public function test036bTimeoutReversal() - { - $sale = TestCards::visaManual()->charge(911) - ->withCurrency('USD') - ->withClientTransactionId('987321654') - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $sale != null); - $this->assertEquals('91', $sale->responseCode); - - $response = Transaction::fromId(null, PaymentMethodType::CREDIT); - $response->clientTransactionId = '987321654'; - - $response->reverse(911)->execute(); - } - - /// One time bill payment - - public function test010ChargeVisaOneTime() - { - $address = new Address(); - $address->streetAddress1 = '6860 Dallas Pkwy'; - $address->postalCode = '75024'; - - $card = null; - if ($this->useTokens) { - $card = new CreditCardData(); - $card->token = static::$visaToken; - } else { - $card = TestCards::visaManual(); - } - - $response = $card->charge(13.11) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withOneTimePayment(true) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - - $void = $response->void()->execute(); - - $this->assertEquals(true, $void != null); - $this->assertEquals('00', $void->responseCode); - } - - public function test011ChargeMasterCardOneTime() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '750241234'; - - $card = null; - if ($this->useTokens) { - $card = new CreditCardData(); - $card->token = static::$mastercardToken; - } else { - $card = TestCards::masterCardManual(); - } - - $response = $card->charge(13.12) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withOneTimePayment(true) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test012ChargeDiscoverOneTime() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = null; - if ($this->useTokens) { - $card = new CreditCardData(); - $card->token = static::$discoverToken; - } else { - $card = TestCards::discoverManual(); - } - - $response = $card->charge(13.13) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withOneTimePayment(true) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test013ChargeAmexOneTime() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = null; - if ($this->useTokens) { - $card = new CreditCardData(); - $card->token = static::$amexToken; - } else { - $card = TestCards::amexManual(); - } - - $response = $card->charge(13.14) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withOneTimePayment(true) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test014ChargeJcbOneTime() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = new CreditCardData(); - $card->number = '3566007770007321'; - $card->expMonth = '12'; - $card->expYear = '2025'; - $card->cvn = '123'; - - $response = $card->charge(13.15) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withOneTimePayment(true) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// ADVANCED FRAUD SCREENING - - /** - * TODO: Change code assertions when AFS is enabled on account - */ - public function test037FraudPreventionSale() - { - $card = TestCards::visaManual(); - - $response = $card->charge(15000) - ->withCurrency('USD') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - // $this->assertEquals('FR', $response->responseCode); - } - - /** - * TODO: Change code assertions when AFS is enabled on account - */ - public function test038FraudPreventionReturn() - { - $card = TestCards::visaManual(); - - $response = $card->refund(15000) - ->withCurrency('USD') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - // $this->assertEquals('41', $response->responseCode); - } - - /// ONE CARD - GSB CARD FUNCTIONS - - /// BALANCE INQUIRY - - public function test037BalanceInquiryGsb() - { - if (false === $this->usePrepaid) { - $this->markTestSkipped('GSB not configured'); - } - - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::gsbManual(); - - $response = $card->balanceInquiry() - ->withAddress($address) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// ADD VALUE - - public function test038AddValueGsb() - { - if (false === $this->usePrepaid) { - $this->markTestSkipped('GSB not configured'); - } - - $card = new CreditTrackData(); - $card->value = '%B6277220572999800^ / ^49121010557010000016000000?F;6277220572999800=49121010557010000016?'; - - $response = $card->addValue(15.00) - ->withCurrency('USD') - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// SALE - - public function test039ChargeGsb() - { - if (false === $this->usePrepaid) { - $this->markTestSkipped('GSB not configured'); - } - - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::gsbManual(); - - $response = $card->charge(2.05) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber('123456') - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - - $voidResponse = $response->void() - ->execute(); - $this->assertEquals(true, $voidResponse != null); - $this->assertEquals('00', $voidResponse->responseCode); - } - - public function test040ChargeGsb() - { - if (false === $this->usePrepaid) { - $this->markTestSkipped('GSB not configured'); - } - - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::gsbManual(); - - $response = $card->charge(2.10) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber('123456') - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// ONLINE VOID / REVERSAL - - public function test041VoidGsb() - { - // see test 039 - } - - /// HMS GIFT - REWARDS - - /// ACTIVATE - - public function test042ActivateGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->activate(6.00) - ->withCurrency('USD') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test043ActivateGift2() - { - - $card = TestCards::giftCard2Manual(); - - $response = $card->activate(7.00) - ->withCurrency('USD') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// LOAD / ADD VALUE - - public function test044AddValueGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->addValue(8.00) - ->withCurrency('USD') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test045AddValueGift2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->addValue(9.00) - ->withCurrency('USD') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// BALANCE INQUIRY - - public function test046BalanceInquiryGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->balanceInquiry() - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('10.00', $response->balanceAmount); - } - - public function test047BalanceInquiryGift2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->balanceInquiry() - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('10.00', $response->balanceAmount); - } - - /// REPLACE / TRANSFER - - public function test048ReplaceGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->replaceWith(TestCards::giftCard2Manual()) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('10.00', $response->balanceAmount); - } - - public function test049ReplaceGift2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->replaceWith(TestCards::giftCard1Swipe()) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('10.00', $response->balanceAmount); - } - - /// SALE / REDEEM - - public function test050SaleGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->charge(1.00) - ->withCurrency('USD') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test051SaleGift2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->charge(2.00) - ->withCurrency('USD') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test052SaleGift1Void() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->charge(3.00) - ->withCurrency('USD') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - - $voidResponse = $response->void() - ->execute(); - $this->assertEquals(true, $voidResponse != null); - $this->assertEquals('00', $voidResponse->responseCode); - } - - public function test053SaleGift2Reversal() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->charge(4.00) - ->withCurrency('USD') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - - $reversalResponse = $response->reverse(4.00) - ->execute(); - $this->assertEquals(true, $reversalResponse != null); - $this->assertEquals('00', $reversalResponse->responseCode); - } - - /// VOID - - public function test054VoidGift() - { - // see test 052 - } - - /// REVERSAL - - public function test055ReversalGift() - { - // see test 053 - } - - public function test056ReversalGift2() - { - $card = TestCards::giftCard2Manual(); - - $reversalResponse = $card->reverse(2.00) - ->execute(); - $this->assertEquals(true, $reversalResponse != null); - $this->assertEquals('00', $reversalResponse->responseCode); - } - - /// DEACTIVATE - - public function test057DeactivateGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->deactivate() - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// RECEIPTS MESSAGING - - public function test058ReceiptsMessaging() - { - return; # print and scan receipt for test 51 - } - - /// REWARD - - /// BALANCE INQUIRY - - public function test059BalanceInquiryRewards1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->balanceInquiry() - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('0', $response->pointsBalanceAmount); - } - - public function test060BalanceInquiryRewards2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->balanceInquiry() - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('0', $response->pointsBalanceAmount); - } - - /// ALIAS - - public function test061CreateAliasGift1() - { - $response = GiftCard::create('9725550100'); - - $this->assertEquals(true, $response != null); - } - - public function test062CreateAliasGift2() - { - $response = GiftCard::create('9725550100'); - - $this->assertEquals(true, $response != null); - } - - public function test063AddAliasGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->addAlias('2145550199') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test064AddAliasGift2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->addAlias('2145550199') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test065DeleteAliasGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->removeAlias('2145550199') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// SALE / REDEEM - - public function test066RedeemPointsGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->charge(100) - ->withCurrency('POINTS') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test067RedeemPointsGift2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->charge(200) - ->withCurrency('POINTS') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test068RedeemPointsGift2() - { - $card = new GiftCard(); - $card->alias = '9725550100'; - - $response = $card->charge(300) - ->withCurrency('POINTS') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// REWARDS - - public function test069RewardsGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->rewards(10) - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test070RewardsGift2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->rewards(11) - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// REPLACE / TRANSFER - - public function test071ReplaceGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->replaceWith(TestCards::giftCard2Manual()) - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test072ReplaceGift2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->replaceWith(TestCards::giftCard1Swipe()) - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// DEACTIVATE - - public function test073DeactivateGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->deactivate() - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test074DeactivateGift2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->deactivate() - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// RECEIPTS MESSAGING - - public function test075ReceiptsMessaging() - { - return; # print and scan receipt for test 51 - } - - /// CLOSE BATCH - - public function test999CloseBatch() - { - try { - $response = BatchService::closeBatch(); - $this->assertNotNull($response); - // printf('batch id: %s', $response->id); - // printf('sequence number: %s', $response->sequenceNumber); - } catch (ApiException $e) { - if (false === strpos($e->getMessage(), static::BATCH_NOT_OPEN) - && false === strpos($e->getMessage(), static::NO_TRANS_IN_BATCH) - ) { - $this->fail($e->getMessage()); - } - } - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/MotoCheckTest.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/MotoCheckTest.php deleted file mode 100644 index 6400b5c..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/MotoCheckTest.php +++ /dev/null @@ -1,108 +0,0 @@ -secretApiKey = 'skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A'; - $config->serviceUrl = ($this->enableCryptoUrl) ? - 'https://cert.api2-c.heartlandportico.com/': - 'https://cert.api2.heartlandportico.com'; - return $config; - } - - protected function setup() - { - ServicesContainer::configure($this->config()); - - $this->address = new Address(); - $this->address->streetAddress1 = '123 Main St.'; - $this->address->city = 'Downtown'; - $this->address->province = 'NJ'; - $this->address->postalCode = '12345'; - } - - public function test001ConsumerPersonalChecking() - { - $check = TestChecks::certification( - SecCode::WEB, - CheckType::PERSONAL, - AccountType::CHECKING - ); - - $response = $check->charge(19.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test002ConsumerBusinessChecking() - { - $check = TestChecks::certification( - SecCode::WEB, - CheckType::BUSINESS, - AccountType::CHECKING - ); - - $response = $check->charge(20.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test003ConsumerPersonalSavings() - { - $check = TestChecks::certification( - SecCode::WEB, - CheckType::PERSONAL, - AccountType::SAVINGS - ); - - $response = $check->charge(21.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test004ConsumerBusinessSavings() - { - $check = TestChecks::certification( - SecCode::WEB, - CheckType::BUSINESS, - AccountType::SAVINGS - ); - - $response = $check->charge(22.00) - ->withCurrency('USD') - ->withAddress($this->address) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/MotoTest.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/MotoTest.php deleted file mode 100644 index 7c2d29e..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/MotoTest.php +++ /dev/null @@ -1,1697 +0,0 @@ -secretApiKey = 'skapi_cert_MRCQAQBC_VQACBE0rFaZlbDDPieMGP06JDAtjyS7NQ'; - $config->serviceUrl = ($this->enableCryptoUrl) ? - 'https://cert.api2-c.heartlandportico.com/': - 'https://cert.api2.heartlandportico.com'; - return $config; - } - - protected function setup() - { - ServicesContainer::configure($this->config()); - - $this->ecommerceInfo = new EcommerceInfo(); - $this->ecommerceInfo->channel = EcommerceChannel::MOTO; - } - - public function test000CloseBatch() - { - try { - $response = BatchService::closeBatch(); - $this->assertNotNull($response); - // print 'batch id: ' . $response->id . "\n"; - // print 'sequence number: ' . $response->sequenceNumber . "\n"; - } catch (ApiException $e) { - if (false === strpos($e->getMessage(), static::BATCH_NOT_OPEN) - && false === strpos($e->getMessage(), static::NO_TRANS_IN_BATCH) - ) { - $this->fail($e->getMessage()); - } - } - } - - public function test001VerifyVisa() - { - $card = new CreditCardData(); - $card->number = '4484958240202792'; - $card->expMonth = '12'; - $card->expYear = '2025'; - - $response = $card->verify() - ->withRequestMultiUseToken($this->useTokens) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test002VerifyMasterCard() - { - $card = new CreditCardData(); - $card->number = '5356083898949891'; - $card->expMonth = '12'; - $card->expYear = '2025'; - - $response = $card->verify() - ->withRequestMultiUseToken($this->useTokens) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test003VerifyDiscover() - { - $address = new Address(); - $address->postalCode = '75024'; - - $card = new CreditCardData(); - $card->number = '6223971100014620'; - $card->expMonth = '12'; - $card->expYear = '2025'; - - $response = $card->verify() - ->withAddress($address) - ->withRequestMultiUseToken($this->useTokens) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // StreetAddress verification - - public function test004VerifyAmex() - { - $address = new Address(); - $address->postalCode = '75024'; - - $card = new CreditCardData(); - $card->number = '345039962663847'; - $card->expMonth = '12'; - $card->expYear = '2025'; - - $response = $card->verify() - ->withAddress($address) - ->withRequestMultiUseToken($this->useTokens) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // Balance Inquiry (for prepaid card) - - public function test005BalanceInquiryVisa() - { - $card = new CreditCardData(); - $card->number = '4664383951958601'; - $card->expMonth = '12'; - $card->expYear = '2025'; - - $response = $card->balanceInquiry()->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode, $response->responseMessage); - } - - // CREDIT SALE (for multi-use token only) - - public function test006ChargeVisaToken() - { - $address = new Address(); - $address->streetAddress1 = '6860 Dallas Pkwy'; - $address->postalCode = '75024'; - - $card = new CreditCardData(); - $card->number = '4012002000060016'; - $card->expMonth = '12'; - $card->expYear = '2025'; - - $response = $card->charge(13.01) - ->withCurrency('USD') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAddress($address) - ->withRequestMultiUseToken(true) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - static::$visaToken = $response->token; - } - - public function test007ChargeMasterCardToken() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = new CreditCardData(); - $card->number = '5473500000000014'; - $card->expMonth = '12'; - $card->expYear = '2025'; - $card->cvn = '123'; - - $response = $card->charge(13.02) - ->withCurrency('USD') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAddress($address) - ->withRequestMultiUseToken(true) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - static::$mastercardToken = $response->token; - } - - public function test008ChargeDiscoverToken() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '750241234'; - - $card = new CreditCardData(); - $card->number = '6011000990156527'; - $card->expMonth = '12'; - $card->expYear = '2025'; - $card->cvn = '123'; - - $response = $card->charge(13.03) - ->withCurrency('USD') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAddress($address) - ->withRequestMultiUseToken(true) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - static::$discoverToken = $response->token; - } - - public function test009ChargeAmexToken() - { - $address = new Address(); - $address->streetAddress1 = '6860 Dallas Pkwy'; - $address->postalCode = '75024'; - - $card = new CreditCardData(); - $card->number = '372700699251018'; - $card->expMonth = '12'; - $card->expYear = '2025'; - $card->cvn = '1234'; - - $response = $card->charge(13.04) - ->withCurrency('USD') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAddress($address) - ->withRequestMultiUseToken(true) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - static::$amexToken = $response->token; - } - - // CREDIT SALE - - public function test010ChargeVisa() - { - $address = new Address(); - $address->streetAddress1 = '6860 Dallas Pkwy'; - $address->postalCode = '75024'; - - $card = null; - if ($this->useTokens) { - $card = new CreditCardData(); - $card->token = static::$visaToken; - } else { - $card = TestCards::visaManual(); - } - - $response = $card->charge(17.01) - ->withCurrency('USD') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - // test case 35 - $void = $response->void()->execute(); - - $this->assertNotNull($void); - $this->assertEquals('00', $void->responseCode); - } - - public function test011ChargeMasterCard() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = null; - if ($this->useTokens) { - $card = new CreditCardData(); - $card->token = static::$mastercardToken; - } else { - $card = TestCards::masterCardManual(); - } - - $response = $card->charge(17.02) - ->withCurrency('USD') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test012ChargeDiscover() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '750241234'; - - $card = null; - if ($this->useTokens) { - $card = new CreditCardData(); - $card->token = static::$discoverToken; - } else { - $card = TestCards::discoverManual(); - } - - $response = $card->charge(17.03) - ->withCurrency('USD') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test013ChargeAmex() - { - $address = new Address(); - $address->streetAddress1 = '6860 Dallas Pkwy'; - $address->postalCode = '75024'; - - $card = null; - if ($this->useTokens) { - $card = new CreditCardData(); - $card->token = static::$amexToken; - } else { - $card = TestCards::amexManual(); - } - - $response = $card->charge(17.04) - ->withCurrency('USD') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test014ChargeJcb() - { - $address = new Address(); - $address->streetAddress1 = '6860 Dallas Pkwy'; - $address->postalCode = '750241234'; - - $card = new CreditCardData(); - $card->number = '3566007770007321'; - $card->expMonth = '12'; - $card->expYear = '2025'; - $card->cvn = '123'; - - $response = $card->charge(17.05) - ->withCurrency('USD') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test011bChargeMasterCard() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::masterCardSeries2Manual(); - - $response = $card->charge(17.02) - ->withCurrency('USD') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // AUTHORIZATION - - - public function test015AuthorizationVisa() - { - $address = new Address(); - $address->streetAddress1 = '6860 Dallas Pkwy'; - $address->postalCode = '75024'; - - $card = TestCards::visaManual(); - - $response = $card->authorize(17.06) - ->withCurrency('USD') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - // test case 15b - $capture = $response->capture()->execute(); - - $this->assertNotNull($capture); - $this->assertEquals('00', $capture->responseCode); - } - - public function test016AuthorizationMasterCard() - { - $address = new Address(); - $address->streetAddress1 = '6860 Dallas Pkwy'; - $address->postalCode = '750241234'; - - $card = TestCards::masterCardManual(); - - $response = $card->authorize(17.07) - ->withCurrency('USD') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - // test case 16b - $capture = $response->capture()->execute(); - - $this->assertNotNull($capture); - $this->assertEquals('00', $capture->responseCode); - } - - public function test017AuthorizationDiscover() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::discoverManual(); - - $response = $card->authorize(17.08) - ->withCurrency('USD') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test016bAuthorizationMasterCard() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::masterCardSeries2Manual(); - - $response = $card->authorize(17.02) - ->withCurrency('USD') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // PARTIALLY APPROVED SALE - - public function test018PartialApprovalVisa() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::visaManual(); - - $response = $card->charge(130) - ->withCurrency('USD') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withAllowPartialAuth(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('10', $response->responseCode); - $this->assertEquals('110.00', $response->authorizedAmount); - } - - public function test019PartialApprovalDiscover() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::discoverManual(); - - $response = $card->charge(145) - ->withCurrency('USD') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withAllowPartialAuth(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('10', $response->responseCode); - $this->assertEquals('65.00', $response->authorizedAmount); - } - - public function test020PartialApprovalMasterCard() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::visaManual(); - - $response = $card->charge(155) - ->withCurrency('USD') - ->withEcommerceInfo($this->ecommerceInfo) - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withAllowPartialAuth(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('10', $response->responseCode); - $this->assertEquals('100.00', $response->authorizedAmount); - - // test case 36 - $void = $response->void()->execute(); - - $this->assertNotNull($void); - $this->assertEquals('00', $void->responseCode); - } - /// LEVEL II CORPORATE PURCHASE CARD - - public function test021LevelIIResponseB() - { - $address = new Address(); - $address->streetAddress1 = '6860 Dallas Pkwy'; - $address->postalCode = '750241234'; - - $card = TestCards::visaManual(); - - $response = $card->charge(112.34) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('B', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withPoNumber('9876543210') - ->withTaxType(TaxType::NOT_USED) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test022LevelIIResponseB() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '750241234'; - - $card = TestCards::visaManual(); - - $response = $card->charge(112.34) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('B', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withTaxType(TaxType::SALES_TAX) - ->withTaxAmount(1.00) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test023LevelIIResponseR() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::visaManual(); - - $response = $card->charge(123.45) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('R', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withTaxType(TaxType::TAX_EXEMPT) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test024LevelIIResponseS() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::visaManual(); - - $response = $card->charge(134.56) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('S', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withPoNumber('9876543210') - ->withTaxType(TaxType::SALES_TAX) - ->withTaxAmount(1.00) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test025LevelIIResponseS() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::masterCardManual(); - - $response = $card->charge(111.06) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('S', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withPoNumber('9876543210') - ->withTaxType(TaxType::NOT_USED) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test026LevelIIResponseS() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::masterCardManual(); - - $response = $card->charge(111.07) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('S', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withTaxType(TaxType::SALES_TAX) - ->withTaxAmount(1.00) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test027LevelIIResponseS() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::masterCardManual(); - - $response = $card->charge(111.08) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('S', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withPoNumber('9876543210') - ->withTaxType(TaxType::SALES_TAX) - ->withTaxAmount(1.00) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test028LevelIIResponseS() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::masterCardManual(); - - $response = $card->charge(111.09) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('S', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withPoNumber('9876543210') - ->withTaxType(TaxType::TAX_EXEMPT) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test029LevelIINoResponse() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::amexManual(); - - $response = $card->charge(111.10) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('0', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withPoNumber('9876543210') - ->withTaxType(TaxType::NOT_USED) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test030LevelIINoResponse() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '750241234'; - - $card = TestCards::amexManual(); - - $response = $card->charge(111.11) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('0', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withTaxType(TaxType::SALES_TAX) - ->withTaxAmount(1.00) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test031LevelIINoResponse() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::amexManual(); - - $response = $card->charge(111.12) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('0', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withPoNumber('9876543210') - ->withTaxType(TaxType::SALES_TAX) - ->withTaxAmount(1.00) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function test032LevelIINoResponse() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::amexManual(); - - $response = $card->charge(111.13) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('0', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withPoNumber('9876543210') - ->withTaxType(TaxType::TAX_EXEMPT) - ->execute(); - - $this->assertEquals(true, $cpcResponse != null); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - /// PRIOR / VOICE AUTHORIZATION - - public function test033OfflineSale() - { - $card = TestCards::visaManual(); - - $response = $card->charge(17.10) - ->withCurrency('USD') - ->withModifier(TransactionModifier::OFFLINE) - ->withOfflineAuthCode('654321') - ->withInvoiceNumber('123456') - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test033OfflineAuthorization() - { - $card = TestCards::visaManual(); - - $response = $card->authorize(17.10) - ->withCurrency('USD') - ->withModifier(TransactionModifier::OFFLINE) - ->withOfflineAuthCode('654321') - ->withInvoiceNumber('123456') - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// RETURN - - public function test034OfflineCreditReturn() - { - $card = TestCards::masterCardManual(); - - $response = $card->refund(15.15) - ->withCurrency('USD') - ->withInvoiceNumber('123456') - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test034bOfflineCreditReturn() - { - $card = TestCards::masterCardManual(); - - $response = $card->refund(15.16) - ->withCurrency('USD') - ->withInvoiceNumber('123456') - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// ONLINE VOID / REVERSAL - - public function test035VoidTest10() - { - // see test 010 - } - - public function test036VoidTest20() - { - // see test 020 - } - - /// Time Out Reversal - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\UnsupportedTransactionException - */ - public function test036bTimeoutReversal() - { - $sale = TestCards::visaManual()->charge(911) - ->withCurrency('USD') - ->withClientTransactionId('987321654') - ->withEcommerceInfo($this->ecommerceInfo) - ->execute(); - - $this->assertEquals(true, $sale != null); - $this->assertEquals('91', $sale->responseCode); - - $response = Transaction::fromId(null, PaymentMethodType::CREDIT); - $response->clientTransactionId = '987321654'; - - $response->reverse(911)->execute(); - } - - /// One time bill payment - - public function test010ChargeVisaOneTime() - { - $address = new Address(); - $address->streetAddress1 = '6860 Dallas Pkwy'; - $address->postalCode = '75024'; - - $card = null; - if ($this->useTokens) { - $card = new CreditCardData(); - $card->token = static::$visaToken; - } else { - $card = TestCards::visaManual(); - } - - $response = $card->charge(13.11) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withOneTimePayment(true) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - - $void = $response->void()->execute(); - - $this->assertEquals(true, $void != null); - $this->assertEquals('00', $void->responseCode); - } - - public function test011ChargeMasterCardOneTime() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '750241234'; - - $card = null; - if ($this->useTokens) { - $card = new CreditCardData(); - $card->token = static::$mastercardToken; - } else { - $card = TestCards::masterCardManual(); - } - - $response = $card->charge(13.12) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withOneTimePayment(true) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test012ChargeDiscoverOneTime() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = null; - if ($this->useTokens) { - $card = new CreditCardData(); - $card->token = static::$discoverToken; - } else { - $card = TestCards::discoverManual(); - } - - $response = $card->charge(13.13) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withOneTimePayment(true) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test013ChargeAmexOneTime() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = null; - if ($this->useTokens) { - $card = new CreditCardData(); - $card->token = static::$amexToken; - } else { - $card = TestCards::amexManual(); - } - - $response = $card->charge(13.14) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withOneTimePayment(true) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test014ChargeJcbOneTime() - { - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = new CreditCardData(); - $card->number = '3566007770007321'; - $card->expMonth = '12'; - $card->expYear = '2025'; - $card->cvn = '123'; - - $response = $card->charge(13.15) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withOneTimePayment(true) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// ADVANCED FRAUD SCREENING - - /** - * TODO: Change code assertions when AFS is enabled on account - */ - public function test037FraudPreventionSale() - { - $card = TestCards::visaManual(); - - $response = $card->charge(15000) - ->withCurrency('USD') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - // $this->assertEquals('FR', $response->responseCode); - } - - /** - * TODO: Change code assertions when AFS is enabled on account - */ - public function test038FraudPreventionReturn() - { - $card = TestCards::visaManual(); - - $response = $card->refund(15000) - ->withCurrency('USD') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - // $this->assertEquals('41', $response->responseCode); - } - - /// ONE CARD - GSB CARD FUNCTIONS - - /// BALANCE INQUIRY - - public function test037BalanceInquiryGsb() - { - if (false === $this->usePrepaid) { - $this->markTestSkipped('GSB not configured'); - } - - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::gsbManual(); - - $response = $card->balanceInquiry() - ->withAddress($address) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// ADD VALUE - - public function test038AddValueGsb() - { - if (false === $this->usePrepaid) { - $this->markTestSkipped('GSB not configured'); - } - - $card = new CreditTrackData(); - $card->value = '%B6277220572999800^ / ^49121010557010000016000000?F;6277220572999800=49121010557010000016?'; - - $response = $card->addValue(15.00) - ->withCurrency('USD') - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// SALE - - public function test039ChargeGsb() - { - if (false === $this->usePrepaid) { - $this->markTestSkipped('GSB not configured'); - } - - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::gsbManual(); - - $response = $card->charge(2.05) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber('123456') - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - - $voidResponse = $response->void() - ->execute(); - $this->assertEquals(true, $voidResponse != null); - $this->assertEquals('00', $voidResponse->responseCode); - } - - public function test040ChargeGsb() - { - if (false === $this->usePrepaid) { - $this->markTestSkipped('GSB not configured'); - } - - $address = new Address(); - $address->streetAddress1 = '6860'; - $address->postalCode = '75024'; - - $card = TestCards::gsbManual(); - - $response = $card->charge(2.10) - ->withCurrency('USD') - ->withAddress($address) - ->withInvoiceNumber('123456') - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// ONLINE VOID / REVERSAL - - public function test041VoidGsb() - { - // see test 039 - } - - /// HMS GIFT - REWARDS - - /// ACTIVATE - - public function test042ActivateGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->activate(6.00) - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test043ActivateGift2() - { - - $card = TestCards::giftCard2Manual(); - - $response = $card->activate(7.00) - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// LOAD / ADD VALUE - - public function test044AddValueGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->addValue(8.00) - ->withCurrency('USD') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test045AddValueGift2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->addValue(9.00) - ->withCurrency('USD') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// BALANCE INQUIRY - - public function test046BalanceInquiryGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->balanceInquiry() - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('10.00', $response->balanceAmount); - } - - public function test047BalanceInquiryGift2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->balanceInquiry() - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('10.00', $response->balanceAmount); - } - - /// REPLACE / TRANSFER - - public function test048ReplaceGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->replaceWith(TestCards::giftCard2Manual()) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('10.00', $response->balanceAmount); - } - - public function test049ReplaceGift2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->replaceWith(TestCards::giftCard1Swipe()) - ->execute(); - - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('10.00', $response->balanceAmount); - } - - /// SALE / REDEEM - - public function test050SaleGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->charge(1.00) - ->withCurrency('USD') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test051SaleGift2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->charge(2.00) - ->withCurrency('USD') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test052SaleGift1Void() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->charge(3.00) - ->withCurrency('USD') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - - $voidResponse = $response->void() - ->execute(); - $this->assertEquals(true, $voidResponse != null); - $this->assertEquals('00', $voidResponse->responseCode); - } - - public function test053SaleGift2Reversal() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->charge(4.00) - ->withCurrency('USD') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - - $reversalResponse = $response->reverse(4.00) - ->execute(); - $this->assertEquals(true, $reversalResponse != null); - $this->assertEquals('00', $reversalResponse->responseCode); - } - - /// VOID - - public function test054VoidGift() - { - // see test 052 - } - - /// REVERSAL - - public function test055ReversalGift() - { - // see test 053 - } - - public function test056ReversalGift2() - { - $card = TestCards::giftCard2Manual(); - - $reversalResponse = $card->reverse(2.00) - ->execute(); - $this->assertEquals(true, $reversalResponse != null); - $this->assertEquals('00', $reversalResponse->responseCode); - } - - /// DEACTIVATE - - public function test057DeactivateGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->deactivate() - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// RECEIPTS MESSAGING - - public function test058ReceiptsMessaging() - { - return; # print and scan receipt for test 51 - } - - /// REWARD - - /// BALANCE INQUIRY - - public function test059BalanceInquiryRewards1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->balanceInquiry() - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('0', $response->pointsBalanceAmount); - } - - public function test060BalanceInquiryRewards2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->balanceInquiry() - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('0', $response->pointsBalanceAmount); - } - - /// ALIAS - - public function test061CreateAliasGift1() - { - $response = GiftCard::create('9725550100'); - - $this->assertEquals(true, $response != null); - } - - public function test062CreateAliasGift2() - { - $response = GiftCard::create('9725550100'); - - $this->assertEquals(true, $response != null); - } - - public function test063AddAliasGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->addAlias('2145550199') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test064AddAliasGift2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->addAlias('2145550199') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test065DeleteAliasGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->removeAlias('2145550199') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// SALE / REDEEM - - public function test066RedeemPointsGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->charge(100) - ->withCurrency('POINTS') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test067RedeemPointsGift2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->charge(200) - ->withCurrency('POINTS') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test068RedeemPointsGift2() - { - $card = new GiftCard(); - $card->alias = '9725550100'; - - $response = $card->charge(300) - ->withCurrency('POINTS') - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// REWARDS - - public function test069RewardsGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->rewards(10) - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test070RewardsGift2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->rewards(11) - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// REPLACE / TRANSFER - - public function test071ReplaceGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->replaceWith(TestCards::giftCard2Manual()) - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test072ReplaceGift2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->replaceWith(TestCards::giftCard1Swipe()) - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// DEACTIVATE - - public function test073DeactivateGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->deactivate() - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - public function test074DeactivateGift2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->deactivate() - ->execute(); - $this->assertEquals(true, $response != null); - $this->assertEquals('00', $response->responseCode); - } - - /// RECEIPTS MESSAGING - - public function test075ReceiptsMessaging() - { - return; # print and scan receipt for test 51 - } - - /// CLOSE BATCH - - public function test999CloseBatch() - { - try { - $response = BatchService::closeBatch(); - $this->assertNotNull($response); - // printf('batch id: %s', $response->id); - // printf('sequence number: %s', $response->sequenceNumber); - } catch (ApiException $e) { - if (false === strpos($e->getMessage(), static::BATCH_NOT_OPEN) - || false === strpos($e->getMessage(), static::NO_TRANS_IN_BATCH) - ) { - $this->fail($e->getMessage()); - } - } - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/RecurringTest.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/RecurringTest.php deleted file mode 100644 index c09bd45..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/RecurringTest.php +++ /dev/null @@ -1,560 +0,0 @@ -identifierBase, $this->todayDate, $identifier); - } - - /** - * @return ServicesConfig - */ - private function config() - { - $config = new ServicesConfig(); - $config->secretApiKey = 'skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A'; - $config->serviceUrl = ($this->enableCryptoUrl) ? - 'https://cert.api2-c.heartlandportico.com/': - 'https://cert.api2.heartlandportico.com'; - return $config; - } - - protected function setup() - { - ServicesContainer::configure($this->config()); - - $this->todayDate = date('Ymd'); - $this->identifierBase = substr( - sprintf('%s-%%s', GenerationUtils::getGuid()), - 0, - 10 - ); - } - - public function test000CleanUp() - { - try { - $results = Schedule::findAll(); - foreach ($results as $schedule) { - $schedule->delete(true); - } - } catch (\Exception $e) { - } - - try { - $results = RecurringPaymentMethod::findAll(); - foreach ($results as $paymentMethod) { - $paymentMethod->delete(true); - } - } catch (\Exception $e) { - } - - try { - $results = Customer::findAll(); - foreach ($results as $customer) { - $customer->delete(true); - } - } catch (\Exception $e) { - } - } - - // CUSTOMER SETUP - - public function test001AddCustomerPerson() - { - $customer = new Customer(); - $customer->id = $this->getIdentifier('Person'); - $customer->firstName = 'John'; - $customer->lastName = 'Doe'; - $customer->status = 'Active'; - $customer->email = 'john.doe@example.com'; - $customer->address = new Address(); - $customer->address->streetAddress1 = '123 Main St.'; - $customer->address->city = 'Dallas'; - $customer->address->province = 'TX'; - $customer->address->postalCode = '75024'; - $customer->address->country = 'USA'; - $customer->workPhone = '5551112222'; - - $customer = $customer->create(); - - $this->assertNotNull($customer); - $this->assertNotNull($customer->key); - static::$customerPerson = $customer; - - $found = Customer::find($customer->id); - $this->assertNotNull($found); - } - - public function test002AddCustomerBusiness() - { - $customer = new Customer(); - $customer->id = $this->getIdentifier('Business'); - $customer->company = 'AcmeCo'; - $customer->status = 'Active'; - $customer->email = 'john.doe@example.com'; - $customer->address = new Address(); - $customer->address->streetAddress1 = '987 Elm St.'; - $customer->address->city = 'Princeton'; - $customer->address->province = 'NJ'; - $customer->address->postalCode = '12345'; - $customer->address->country = 'USA'; - $customer->workPhone = '5551112222'; - - $customer = $customer->create(); - - $this->assertNotNull($customer); - $this->assertNotNull($customer->key); - static::$customerBusiness = $customer; - } - - // PAYMENT METHOD SETUP - - public function test003AddPaymentCreditVisa() - { - if (static::$customerPerson === null) { - $this->markTestIncomplete(); - } - - $card = new CreditCardData(); - $card->number = '4012002000060016'; - $card->expMonth = '12'; - $card->expYear = '2025'; - - $paymentMethod = static::$customerPerson->addPaymentMethod( - $this->getIdentifier('CreditV'), - $card - )->create(); - - $this->assertNotNull($paymentMethod); - $this->assertNotNull($paymentMethod->key); - static::$paymentMethodVisa = $paymentMethod; - } - - public function test004AddPaymentCreditMasterCard() - { - if (static::$customerPerson === null) { - $this->markTestIncomplete(); - } - - $card = new CreditCardData(); - $card->number = '5473500000000014'; - $card->expMonth = '12'; - $card->expYear = '2025'; - - $paymentMethod = static::$customerPerson->addPaymentMethod( - $this->getIdentifier('CreditMC'), - $card - )->create(); - - $this->assertNotNull($paymentMethod); - $this->assertNotNull($paymentMethod->key); - static::$paymentMethodMasterCard = $paymentMethod; - } - - public function test005AddPaymentCheckPpd() - { - if (static::$customerPerson === null) { - $this->markTestIncomplete(); - } - - $check = new ECheck(); - $check->accountType = AccountType::CHECKING; - $check->checkType = CheckType::PERSONAL; - $check->secCode = SecCode::PPD; - $check->routingNumber = '122000030'; - $check->driversLicenseNumber = '7418529630'; - $check->driversLicenseState = 'TX'; - $check->accountNumber = '1357902468'; - $check->birthYear = 1989; - - $paymentMethod = static::$customerPerson->addPaymentMethod( - $this->getIdentifier('CheckPpd'), - $check - )->create(); - - $this->assertNotNull($paymentMethod); - $this->assertNotNull($paymentMethod->key); - static::$paymentMethodCheckPpd = $paymentMethod; - } - - public function test006AddPaymentCheckCcd() - { - if (static::$customerBusiness === null) { - $this->markTestIncomplete(); - } - - $check = new eCheck(); - $check->accountType = AccountType::CHECKING; - $check->checkType = CheckType::BUSINESS; - $check->secCode = SecCode::CCD; - $check->routingNumber = '122000030'; - $check->driversLicenseNumber = '7418529630'; - $check->driversLicenseState = 'TX'; - $check->accountNumber = '1357902468'; - $check->birthYear = 1989; - - $paymentMethod = static::$customerBusiness->addPaymentMethod( - $this->getIdentifier('CheckCcd'), - $check - )->create(); - - $this->assertNotNull($paymentMethod); - $this->assertNotNull($paymentMethod->key); - static::$paymentMethodCheckCcd = $paymentMethod; - } - - // PAYMENT SETUP - DECLINED - - /** - * expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function test007AddPaymentCheckPpd() - { - if (static::$customerPerson === null) { - $this->markTestIncomplete(); - } - - $check = new eCheck(); - $check->accountType = AccountType::CHECKING; - $check->checkType = CheckType::PERSONAL; - $check->secCode = SecCode::PPD; - $check->routingNumber = '122000030'; - $check->driversLicenseNumber = '7418529630'; - $check->driversLicenseState = 'TX'; - $check->accountNumber = '1357902468'; - $check->birthYear = 1989; - - static::$customerPerson->addPaymentMethod( - $this->getIdentifier('CheckPpd'), - $check - )->create(); - } - - // Recurring Billing using PayPlan - Managed Schedule - - public function test008AddScheduleCreditVisa() - { - if (static::$paymentMethodVisa === null) { - $this->markTestIncomplete(); - } - - $schedule = static::$paymentMethodVisa->addSchedule( - $this->getIdentifier('CreditV') - ) - ->withStatus('Active') - ->withAmount(30.02) - ->withCurrency('USD') - ->withStartDate(\DateTime::createFromFormat('Y-m-d', '2027-02-01')) - ->withFrequency(ScheduleFrequency::WEEKLY) - ->withEndDate(\DateTime::createFromFormat('Y-m-d', '2027-04-01')) - ->withReprocessingCount(2) - ->create(); - - $this->assertNotNull($schedule); - $this->assertNotNull($schedule->key); - static::$scheduleVisa = $schedule; - } - - public function test009AddScheduleCreditMasterCard() { - if (static::$paymentMethodMasterCard == null) { - $this->markTestIncomplete(); - } - - $schedule = static::$paymentMethodMasterCard->addSchedule( - $this->getIdentifier('CreditMC') - ) - ->withStatus('Active') - ->withAmount(30.02) - ->withCurrency('USD') - ->withStartDate(\DateTime::createFromFormat('Y-m-d', '2027-02-01')) - ->withFrequency(ScheduleFrequency::WEEKLY) - ->withEndDate(\DateTime::createFromFormat('Y-m-d', '2027-04-01')) - ->withReprocessingCount(2) - ->create(); - $this->assertNotNull($schedule); - $this->assertNotNull($schedule->key); - static::$scheduleMasterCard = $schedule; - } - - public function test010AddScheduleCheckPPD() { - if (static::$paymentMethodCheckPpd == null) { - $this->markTestIncomplete(); - } - - $schedule = static::$paymentMethodCheckPpd->addSchedule( - $this->getIdentifier('CheckPPD') - ) - ->withStatus('Active') - ->withAmount(30.03) - ->withCurrency('USD') - ->withStartDate(\DateTime::createFromFormat('Y-m-d', '2027-02-01')) - ->withFrequency(ScheduleFrequency::MONTHLY) - ->withReprocessingCount(1) - ->withNumberOfPayments(2) - ->create(); - $this->assertNotNull($schedule); - $this->assertNotNull($schedule->key); - static::$scheduleCheckPpd = $schedule; - } - - public function test011AddScheduleCheckCCD() { - if (static::$paymentMethodCheckCcd == null) { - $this->markTestIncomplete(); - } - - $schedule = static::$paymentMethodCheckCcd->addSchedule( - $this->getIdentifier('CheckCCD') - ) - ->withStatus('Active') - ->withAmount(30.04) - ->withCurrency('USD') - ->withStartDate(\DateTime::createFromFormat('Y-m-d', '2027-02-01')) - ->withFrequency(ScheduleFrequency::BI_WEEKLY) - ->withReprocessingCount(1) - ->create(); - $this->assertNotNull($schedule); - $this->assertNotNull($schedule->key); - static::$scheduleCheckCcd = $schedule; - } - - /** - * expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function test012AddScheduleCreditVisa() { - if (static::$paymentMethodVisa == null) { - $this->markTestIncomplete(); - } - - $schedule = static::$paymentMethodVisa->addSchedule( - $this->getIdentifier('CreditV') - ) - ->withStartDate(\DateTime::createFromFormat('Y-m-d', '2027-02-01')) - ->withAmount(30.01) - ->withCurrency('USD') - ->withFrequency(ScheduleFrequency::WEEKLY) - ->withReprocessingCount(1) - ->withStatus('Active') - ->create(); - } - - /** - * expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function test013AddScheduleCCheckPPD() { - if (static::$paymentMethodCheckPpd == null) { - $this->markTestIncomplete(); - } - - $schedule = static::$paymentMethodCheckPpd->addSchedule( - $this->getIdentifier('CheckPPD') - ) - ->withStatus('Active') - ->withAmount(30.03) - ->withCurrency('USD') - ->withStartDate(\DateTime::createFromFormat('Y-m-d', '2027-02-01')) - ->withFrequency(ScheduleFrequency::MONTHLY) - ->withReprocessingCount(1) - ->withNumberOfPayments(2) - ->create(); - } - - // Recurring Billing using PayPlan - Managed Schedule - - public function test014RecurringBillingVisa() { - if (static::$paymentMethodVisa == null || static::$scheduleVisa == null) { - $this->markTestIncomplete(); - } - - $response = static::$paymentMethodVisa->charge(20.01) - ->withCurrency('USD') - ->withScheduleId(static::$scheduleVisa->key) - ->withOneTimePayment(false) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test015RecurringBillingMasterCard() { - if (true || static::$paymentMethodMasterCard == null || static::$scheduleMasterCard == null) { - $this->markTestIncomplete(); - } - - $response = static::$paymentMethodMasterCard->charge(20.02) - ->withCurrency('USD') - ->withScheduleId(static::$scheduleVisa->key) - ->withOneTimePayment(false) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test016RecurringBillingCheckPPD() { - if (static::$paymentMethodCheckPpd == null || static::$scheduleCheckPpd == null) { - $this->markTestIncomplete(); - } - - $response = static::$paymentMethodCheckPpd->charge(20.03) - ->withCurrency('USD') - ->withScheduleId(static::$scheduleVisa->key) - ->withOneTimePayment(false) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test017RecurringBillingCheckCCD() { - if (static::$paymentMethodCheckCcd == null || static::$scheduleCheckCcd == null) { - $this->markTestIncomplete(); - } - - $response = static::$paymentMethodCheckCcd->charge(20.04) - ->withCurrency('USD') - ->withScheduleId(static::$scheduleVisa->key) - ->withOneTimePayment(false) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // One time bill payment - - public function test018RecurringBillingVisa() { - if (static::$paymentMethodVisa == null) { - $this->markTestIncomplete(); - } - - $response = static::$paymentMethodVisa->charge(20.06) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test019RecurringBillingMasterCard() { - if (static::$paymentMethodMasterCard == null) { - $this->markTestIncomplete(); - } - - $response = static::$paymentMethodMasterCard->charge(20.07) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test020RecurringBillingCheckPPD() { - if (static::$paymentMethodCheckPpd == null) { - $this->markTestIncomplete(); - } - - $response = static::$paymentMethodCheckPpd->charge(20.08) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function test021RecurringBillingCheckCCD() { - if (static::$paymentMethodCheckCcd == null) { - $this->markTestIncomplete(); - } - - $response = static::$paymentMethodCheckCcd->charge(20.09) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // Onetime bill payment - declined - - public function test022RecurringBillingVisa_Decline() { - if (static::$paymentMethodVisa == null) { - $this->markTestIncomplete(); - } - - $response = static::$paymentMethodVisa->charge(10.08) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('51', $response->responseCode); - } - - public function test023RecurringBillingCheckPPD_Decline() { - if (true || static::$paymentMethodCheckPpd == null) { - $this->markTestIncomplete(); - } - - $response = static::$paymentMethodCheckPpd->charge(25.02) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('1', $response->responseCode); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/RetailTest.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/RetailTest.php deleted file mode 100644 index bf52611..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/Certifications/RetailTest.php +++ /dev/null @@ -1,1982 +0,0 @@ -secretApiKey = 'skapi_cert_MaePAQBr-1QAqjfckFC8FTbRTT120bVQUlfVOjgCBw'; - $config->serviceUrl = ($this->enableCryptoUrl) ? - 'https://cert.api2-c.heartlandportico.com/': - 'https://cert.api2.heartlandportico.com'; - ServicesContainer::Configure($config); - } - - public function testRetail000CloseBatch() - { - try { - $response = BatchService::closeBatch(); - $this->assertNotNull($response); - // error_log(sprintf('Batch ID: %s', $response->Id)); - // error_log(sprintf('Sequence Number: %s', $response->sequenceNumber)); - } catch (ApiException $e) { - if (false === strpos($e->getMessage(), static::BATCH_NOT_OPEN) - && false === strpos($e->getMessage(), static::NO_TRANS_IN_BATCH) - ) { - $this->fail($e->getMessage()); - } - } - } - - /* - CREDIT CARD FUNCTIONS - CARD VERIFY - ACCOUNT VERIFICATION - */ - - public function testRetail001CardVerifyVisa() - { - $visaenc = TestCards::visaSwipeEncrypted(); - - $response = $visaenc->verify() - ->withAllowDuplicates(true) - ->withRequestMultiUseToken(static::$useTokens) - ->execute(); - $this->assertNotNull($response, '$response is null'); - $this->assertEquals('00', $response->responseCode, $response->responseMessage); - - if (static::$useTokens) { - $this->assertNotNull($response->token, 'token is null'); - - $token = new CreditCardData(); - $token->token = $response->token; - - $saleResponse = $token->charge(15.01) - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals('00', $saleResponse->responseCode); - } - } - - public function testRetail002CardVerifyMastercardSwipe() - { - $cardenc = TestCards::masterCardSwipeEncrypted(); - - $response = $cardenc->verify() - ->withAllowDuplicates(true) - ->withRequestMultiUseToken(static::$useTokens) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - if (static::$useTokens) { - $this->assertNotNull($response->token); - - $token = new CreditCardData(); - $token->token = $response->token; - - $saleResponse = $token->charge(15.02) - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals('00', $saleResponse->responseCode); - } - } - - public function testRetail003CardVerifyDiscover() - { - $discoverenc = TestCards::discoverSwipeEncrypted(); - - $response = $discoverenc->verify() - ->withAllowDuplicates(true) - ->withRequestMultiUseToken(static::$useTokens) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - if (static::$useTokens) { - $this->assertNotNull($response->token); - - $token = new CreditCardData(); - $token->token = $response->token; - - $saleResponse = $token->charge(15.03) - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals('00', $saleResponse->responseCode); - } - } - - // Address Verification - - public function testRetail004CardVerifyAmex() - { - $address = new Address(); - $address->postalCode = '75024'; - - $manualamex = TestCards::amexManual(false, true); - - $response = $manualamex->verify() - ->withAllowDuplicates(true) - ->withAddress($address) - ->withRequestMultiUseToken(static::$useTokens) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - if (static::$useTokens) { - $this->assertNotNull($response->token); - - $token = new CreditCardData(); - $token->token = $response->token; - - $saleResponse = $token->charge(15.04) - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals('00', $saleResponse->responseCode); - } - } - - // Balance Inquiry (for Prepaid) - - public function testRetail005BalanceInquiryVisa() - { - $visaenc = TestCards::visaSwipeEncrypted(); - - $response = $visaenc->balanceInquiry()->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // CREDIT SALE (For multi-use token only) - - public function testRetail006ChargeVisaSwipeToken() - { - $card = TestCards::visaSwipe(); - $response = $card->charge(15.01) - ->withCurrency('USD') - ->withRequestMultiUseToken(true) - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - static::$visatoken = $response->token; - } - - public function testRetail007ChargeMastercardSwipeToken() - { - $card = TestCards::masterCardSwipe(); - $response = $card->charge(15.02) - ->withCurrency('USD') - ->withRequestMultiUseToken(true) - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - static::$mastercardtoken = $response->token; - } - - public function testRetail008ChargeDiscoverSwipeToken() - { - $card = TestCards::discoverSwipe(); - $response = $card->charge(15.03) - ->withCurrency('USD') - ->withRequestMultiUseToken(true) - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - static::$discovertoken = $response->token; - } - - public function testRetail009ChargeAmexSwipeToken() - { - $card = TestCards::amexSwipe(); - $response = $card->charge(15.04) - ->withCurrency('USD') - ->withRequestMultiUseToken(true) - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - static::$amextoken = $response->token; - } - - /* - CREDIT SALE - SWIPED - */ - - public function testRetail010ChargeVisaSwipe() - { - $card = TestCards::visaSwipe(); - $response = $card->charge(15.01) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - // test 59 - $reverse = $response->reverse(15.01) - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($reverse); - $this->assertEquals('00', $reverse->responseCode); - } - - public function testRetail011ChargeMastercardSwipe() - { - $card = TestCards::masterCardSwipe(); - $response = $card->charge(15.02) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail012ChargeDiscoverSwipe() - { - $card = TestCards::discoverSwipe(); - $response = $card->charge(15.03) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail013ChargeAmexSwipe() - { - $card = TestCards::amexSwipe(); - $response = $card->charge(15.04) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail014ChargeJcbSwipe() - { - $card = TestCards::JcbSwipe(); - $response = $card->charge(15.05) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - // test case 58 - $refund = $response->refund(15.05) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($refund); - $this->assertEquals('00', $refund->responseCode); - } - - public function testRetail014aChargeRetailMastercard24() - { - $card = TestCards::masterCard24Swipe(); - $response = $card->charge(15.34) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail014bChargeRetailMastercard25() - { - $card = TestCards::masterCard25Swipe(); - $response = $card->charge(15.34) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail015ChargeVisaSwipe() - { - $card = TestCards::visaSwipe(); - $response = $card->charge(15.06) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - // test case 63 - $reversal = $response->reverse(15.06) - ->withAllowDuplicates(true) - ->withAuthAmount(5.06) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // Manually Entered - Card Present - - public function testRetail016ChargeVisaManualCardPresent() - { - $address = new Address(); - $address->postalCode = '750241234'; - $address->streetAddress1 = '6860 Dallas Pkwy'; - - $manualcard = TestCards::visaManual(true, true); - $response = $manualcard->charge(16.01) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail017ChargeMasterCardManualCardPresent() - { - $address = new Address(); - $address->postalCode = '75024'; - $address->streetAddress1 = '6860 Dallas Pkwy'; - - $manualcard = TestCards::masterCardManual(true, true); - $response = $manualcard->charge(16.02) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - // test case 60 - $reverse = $response->reverse(16.02) - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($reverse); - $this->assertEquals('00', $reverse->responseCode); - } - - public function testRetail018ChargeDiscoverManualCardPresent() - { - $address = new Address(); - $address->postalCode = '750241234'; - - $manualcard = TestCards::discoverManual(true, true); - $response = $manualcard->charge(16.03) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail019ChargeAmexManualCardPresent() - { - $address = new Address(); - $address->postalCode = '75024'; - $address->streetAddress1 = '6860'; - - $manualcard = TestCards::amexManual(true, true); - $response = $manualcard->charge(16.04) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail020ChargeJcbManualCardPresent() - { - $address = new Address(); - $address->postalCode = '75024'; - - $manualcard = TestCards::JcbManual(true, true); - $response = $manualcard->charge(16.05) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail021ChargeDiscoverManualCardPresent() - { - $address = new Address(); - $address->postalCode = '750241234'; - $address->streetAddress1 = '6860 Dallas Pkwy'; - - $manualcard = TestCards::discoverManual(true, true); - $response = $manualcard->charge(16.07) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - // test case 64 - $reversal = $response->reverse(16.07) - ->withAllowDuplicates(true) - ->withAuthAmount(6.07) - ->execute(); - $this->assertNotNull($reversal); - $this->assertEquals('00', $reversal->responseCode); - } - - // Manually Entered - Card Not Present - - public function testRetail022ChargeVisaManualCardNotPresent() - { - $address = new Address(); - $address->postalCode = '750241234'; - $address->streetAddress1 = '6860 Dallas Pkwy'; - - $manualcard = null; - if (static::$useTokens) { - $manualcard = new CreditCardData(); - $manualcard->token = static::$visatoken; - } else { - $manualcard = TestCards::visaManual(false, true); - } - - $response = $manualcard->charge(17.01) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail023ChargeMasterCardManualCardNotPresent() - { - $address = new Address(); - $address->postalCode = '75024'; - $address->streetAddress1 = '6860 Dallas Pkwy'; - - $manualcard = null; - if (static::$useTokens) { - $manualcard = new CreditCardData(); - $manualcard->token = static::$mastercardtoken; - } else { - $manualcard = TestCards::masterCardManual(false, true); - } - - $response = $manualcard->charge(17.02) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - // test case 61 - $reversal = $response->reverse(17.02) - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($reversal); - $this->assertEquals('00', $reversal->responseCode); - } - - public function testRetail024ChargeDiscoverManualCardNotPresent() - { - $address = new Address(); - $address->postalCode = '750241234'; - - $manualcard = null; - if (static::$useTokens) { - $manualcard = new CreditCardData(); - $manualcard->token = static::$discovertoken; - } else { - $manualcard = TestCards::discoverManual(false, true); - } - - $response = $manualcard->charge(17.03) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail025ChargeAmexManualCardNotPresent() - { - $address = new Address(); - $address->postalCode = '75024'; - $address->streetAddress1 = '6860'; - - $manualcard = null; - if (static::$useTokens) { - $manualcard = new CreditCardData(); - $manualcard->token = static::$amextoken; - } else { - $manualcard = TestCards::amexManual(false, true); - } - - $response = $manualcard->charge(17.04) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail026ChargeJcbManualCardNotPresent() - { - $address = new Address(); - $address->postalCode = '75024'; - - $manualcard = TestCards::JcbManual(false, true); - $response = $manualcard->charge(17.05) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // Contactless - - public function testRetail027ChargeVisaContactless() - { - $card = TestCards::visaSwipe(EntryMethod::PROXIMITY); - $response = $card->charge(18.01) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail028ChargeMastercardContactless() - { - $card = TestCards::masterCardSwipe(EntryMethod::PROXIMITY); - - $response = $card->charge(18.02) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail029ChargeDiscoverContactless() - { - $card = TestCards::discoverSwipe(EntryMethod::PROXIMITY); - - $response = $card->charge(18.03) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail030ChargeAmexContactless() - { - $card = TestCards::amexSwipe(EntryMethod::PROXIMITY); - - $response = $card->charge(18.04) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // AUTHORIZATION - - public function testRetail031AuthorizeVisaSwipe() - { - $card = TestCards::visaSwipe(); - - // 031a authorize - $response = $card->authorize(15.08) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - // 031b capture - $captureResponse = $response->capture()->execute(); - $this->assertNotNull($captureResponse); - $this->assertEquals('00', $captureResponse->responseCode); - } - - public function testRetail032AuthorizeVisaSwipeAdditionalAuth() - { - $card = TestCards::visaSwipe(); - - // 032a authorize - $response = $card->authorize(15.09) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - // 032b Additional Auth (restaurant only) - - // 032c Add to batch - $captureResponse = $response->capture()->execute(); - $this->assertNotNull($captureResponse); - $this->assertEquals('00', $captureResponse->responseCode); - } - - public function testRetail033AuthorizeMasterCardSwipe() - { - $card = TestCards::masterCardSwipe(); - - // 033a authorize - $response = $card->authorize(15.10) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - // 033b capture - $captureResponse = $response->capture()->execute(); - $this->assertNotNull($captureResponse); - $this->assertEquals('00', $captureResponse->responseCode); - } - - public function testRetail033aAuthorizeDiscoverSwipe() - { - $card = TestCards::discoverSwipe(); - - $response = $card->authorize(15.10) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // AUTHORIZATION - Manually Entered, Card Present - - public function testRetail034AuthorizeVisaManualCardPresent() - { - $address = new Address(); - $address->postalCode = '75024'; - $address->streetAddress1 = '6860 Dallas Pkwy'; - - $card = TestCards::visaManual(true, true); - - // 034a authorize - $response = $card->authorize(16.08) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - // 034b capture - $captureResponse = $response->capture()->execute(); - $this->assertNotNull($captureResponse); - $this->assertEquals('00', $captureResponse->responseCode); - } - - public function testRetail035AuthorizeVisaManualCardPresentAdditionalAuth() - { - $address = new Address(); - $address->postalCode = '75024'; - $address->streetAddress1 = '6860 Dallas Pkwy'; - - $card = TestCards::visaManual(true, true); - - // 035a authorize - $response = $card->authorize(16.09) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - // 035b Additional Auth (restaurant only) - - // 035c Add to batch - $captureResponse = $response->capture()->execute(); - $this->assertNotNull($captureResponse); - $this->assertEquals('00', $captureResponse->responseCode); - } - - public function testRetail036AuthorizeMasterCardManualCardPresent() - { - $address = new Address(); - $address->postalCode = '75024'; - $address->streetAddress1 = '6860 Dallas Pkwy'; - - $card = TestCards::masterCardManual(true, true); - - // 036a authorize - $response = $card->authorize(16.10) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - // 036b capture - $captureResponse = $response->capture()->execute(); - $this->assertNotNull($captureResponse); - $this->assertEquals('00', $captureResponse->responseCode); - } - - public function testRetail036aAuthorizeDiscoverManualCardPresent() - { - $address = new Address(); - $address->postalCode = '750241234'; - - $card = TestCards::discoverManual(true, true); - $response = $card->authorize(16.10) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // AUTHORIZATION - Manually Entered, Card Not Present - - public function testRetail037AuthorizeVisaManual() - { - $address = new Address(); - $address->postalCode = '750241234'; - $address->streetAddress1 = '6860 Dallas Pkwy'; - - $card = TestCards::visaManual(false, true); - - // 034a authorize - $response = $card->authorize(17.08) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - // 034b capture - $captureResponse = $response->capture()->execute(); - $this->assertNotNull($captureResponse); - $this->assertEquals('00', $captureResponse->responseCode); - } - - public function testRetail038AuthorizeMasterCardManual() - { - $address = new Address(); - $address->postalCode = '750241234'; - $address->streetAddress1 = '6860'; - - $card = TestCards::masterCardManual(false, true); - - // 036a authorize - $response = $card->authorize(17.09) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - // 036b capture - $captureResponse = $response->capture()->execute(); - $this->assertNotNull($captureResponse); - $this->assertEquals('00', $captureResponse->responseCode); - } - - public function testRetail038aAuthorizeDiscoverManual() - { - $address = new Address(); - $address->postalCode = '750241234'; - - $card = TestCards::discoverManual(false, true); - - $response = $card->authorize(17.10) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // PARTIALLY APPROVED SALE (Required) - - public function testRetail039ChargeDiscoverSwipePartialApproval() - { - $card = TestCards::discoverSwipe(); - - $response = $card->charge(40.00) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAllowPartialAuth(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('10', $response->responseCode); - $this->assertEquals(40.00, $response->authorizedAmount); - } - - public function testRetail040ChargeVisaSwipePartialApproval() - { - $card = TestCards::visaSwipe(); - $response = $card->charge(130.00) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAllowPartialAuth(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('10', $response->responseCode); - $this->assertEquals(110.00, $response->authorizedAmount); - } - - public function testRetail041ChargeDiscoverManualPartialApproval() - { - $address = new Address(); - $address->postalCode = '75024'; - $card = TestCards::discoverManual(true, true); - - $response = $card->charge(145.00) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAllowPartialAuth(true) - ->withAddress($address) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('10', $response->responseCode); - $this->assertEquals(65.00, $response->authorizedAmount); - } - - public function testRetail042ChargeMasterCardSwipePartialApproval() - { - $card = TestCards::masterCardSwipe(); - $response = $card->charge(155.00) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAllowPartialAuth(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('10', $response->responseCode); - $this->assertEquals(100.00, $response->authorizedAmount); - - // test case 62 - $reversal = $response->reverse(100.00) - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($reversal); - $this->assertEquals('00', $reversal->responseCode); - } - - /* - SALE WITH GRATUITY - Tip Edit (Tip at Settlement) - */ - - public function testRetail043ChargeVisaSwipeEditGratuity() - { - $card = TestCards::visaSwipe(); - $response = $card->charge(15.12) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - $editResponse = $response->edit() - ->withAllowDuplicates(true) - ->withAmount(18.12) - ->withGratuity(3.00) - ->execute(); - $this->assertNotNull($editResponse); - $this->assertEquals('00', $editResponse->responseCode); - } - - public function testRetail044ChargeMasterCardManualEditGratuity() - { - $address = new Address(); - $address->postalCode = '75024'; - - $card = TestCards::masterCardManual(true, true); - $response = $card->charge(15.13) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - $editResponse = $response->edit() - ->withAllowDuplicates(true) - ->withAmount(18.13) - ->withGratuity(3.00) - ->execute(); - $this->assertNotNull($editResponse); - $this->assertEquals('00', $editResponse->responseCode); - } - - // Tip on Purchase - - public function testRetail045ChargeVisaManualGratuity() - { - $address = new Address(); - $address->postalCode = '75024'; - - $card = TestCards::visaManual(true, true); - - $response = $card->charge(18.61) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->withGratuity(3.50) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail046ChargeMasterCardSwipeGratuity() - { - $card = TestCards::masterCardSwipe(); - - $response = $card->charge(18.62) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withGratuity(3.50) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - $editResponse = $response->edit() - ->withAllowDuplicates(true) - ->withAmount(18.12) - ->withGratuity(3.00) - ->execute(); - $this->assertNotNull($editResponse); - $this->assertEquals('00', $editResponse->responseCode); - } - - // LEVEL II CORPORATE PURCHASE CARD - - public function testRetail047LevelIIVisaSwipeResponseB() - { - $card = TestCards::visaSwipe(); - - $response = $card->charge(112.34) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withCommercialRequest(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('B', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withAllowDuplicates(true) - ->withTaxType(TaxType::SALES_TAX) - ->withTaxAmount(1) - ->execute(); - $this->assertNotNull($cpcResponse); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function testRetail047aLevelIIVisaSwipeResponseB() - { - $card = TestCards::visaSwipe(); - - $response = $card->charge(112.34) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withCommercialRequest(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('B', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withAllowDuplicates(true) - ->withTaxType(TaxType::NOT_USED) - ->execute(); - $this->assertNotNull($cpcResponse); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function testRetail048LevelIIVisaSwipeResponseR() - { - $card = TestCards::visaSwipe(); - - $response = $card->charge(123.45) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withCommercialRequest(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('R', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withAllowDuplicates(true) - ->withTaxType(TaxType::TAX_EXEMPT) - ->execute(); - $this->assertNotNull($cpcResponse); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function testRetail049LevelIIVisaManualResponseS() - { - $address = new Address(); - $address->postalCode = '75024'; - - $card = TestCards::visaManual(true, true); - - $response = $card->charge(134.56) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('S', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withAllowDuplicates(true) - ->withPoNumber('9876543210') - ->withTaxType(TaxType::SALES_TAX) - ->withTaxAmount(1) - ->execute(); - $this->assertNotNull($cpcResponse); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function testRetail050LevelIIMasterCardSwipeResponseS() - { - $card = TestCards::masterCardSwipe(); - - $response = $card->charge(111.06) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withCommercialRequest(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('S', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withAllowDuplicates(true) - ->withPoNumber('9876543210') - ->withTaxType(TaxType::NOT_USED) - ->execute(); - $this->assertNotNull($cpcResponse); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function testRetail051LevelIIMasterCardManualResponseS() - { - $address = new Address(); - $address->postalCode = '75024'; - - $card = TestCards::masterCardManual(true, true); - - $response = $card->charge(111.07) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('S', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withAllowDuplicates(true) - ->withPoNumber('9876543210') - ->withTaxType(TaxType::SALES_TAX) - ->withTaxAmount(1) - ->execute(); - $this->assertNotNull($cpcResponse); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function testRetail051aLevelIIMasterCardManualResponseS() - { - $address = new Address(); - $address->postalCode = '75024'; - - $card = TestCards::masterCardManual(true, true); - $response = $card->charge(111.08) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('S', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withAllowDuplicates(true) - ->withPoNumber('9876543210') - ->withTaxType(TaxType::SALES_TAX) - ->withTaxAmount(1) - ->execute(); - $this->assertNotNull($cpcResponse); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function testRetail052LevelIIMasterCardManualResponseS() - { - $address = new Address(); - $address->postalCode = '75024'; - - $card = TestCards::masterCardManual(true, true); - $response = $card->charge(111.09) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('S', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withAllowDuplicates(true) - ->withPoNumber('9876543210') - ->withTaxType(TaxType::TAX_EXEMPT) - ->execute(); - $this->assertNotNull($cpcResponse); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function testRetail053LevelIIAmexSwipeNoResponse() - { - $card = TestCards::amexSwipe(); - $response = $card->charge(111.10) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withCommercialRequest(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('0', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withAllowDuplicates(true) - ->withTaxType(TaxType::SALES_TAX) - ->withTaxAmount(1) - ->execute(); - $this->assertNotNull($cpcResponse); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function testRetail054LevelIIAmexManualNoResponse() - { - $address = new Address(); - $address->postalCode = '75024'; - - $card = TestCards::amexManual(true, true); - - $response = $card->charge(111.11) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('0', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withAllowDuplicates(true) - ->withPoNumber('9876543210') - ->withTaxType(TaxType::NOT_USED) - ->execute(); - $this->assertNotNull($cpcResponse); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function testRetail055LevelIIAmexManualNoResponse() - { - $address = new Address(); - $address->postalCode = '75024'; - - $card = TestCards::amexManual(true, true); - $response = $card->charge(111.12) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('0', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withAllowDuplicates(true) - ->withPoNumber('9876543210') - ->withTaxType(TaxType::NOT_USED) - ->execute(); - $this->assertNotNull($cpcResponse); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - public function testRetail055aLevelIIAmexManualNoResponse() - { - $address = new Address(); - $address->postalCode = '75024'; - - $card = TestCards::amexManual(true, true); - $response = $card->charge(111.13) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAddress($address) - ->withCommercialRequest(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals('0', $response->commercialIndicator); - - $cpcResponse = $response->edit() - ->withAllowDuplicates(true) - ->withPoNumber('9876543210') - ->withTaxType(TaxType::TAX_EXEMPT) - ->execute(); - $this->assertNotNull($cpcResponse); - $this->assertEquals('00', $cpcResponse->responseCode); - } - - // OFFLINE SALE / AUTHORIZATION - - public function testRetail056OfflineChargeVisaManual() - { - $card = TestCards::visaManual(false, true); - - $response = $card->charge(15.12) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withOfflineAuthCode('654321') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail056OfflineAuthVisaManual() - { - $card = TestCards::visaManual(false, true); - - $response = $card->authorize(15.11) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withOfflineAuthCode('654321') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // RETURN - - public function testRetail057ReturnMasterCard() - { - $card = TestCards::masterCardManual(false, true); - - $response = $card->refund(15.11) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail057aReturnMasterCardSwipe() - { - $card = TestCards::masterCardSwipe(); - $response = $card->refund(15.15) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail058ReturnJcbTransactionId() - { - // See test 14 - } - - // ONLINE VOID / REVERSAL (Required) - - public function testRetail059ReversalVisa() - { - // see test 10 - } - - public function testRetail060ReversalMasterCard() - { - // see test case 17 - } - - public function testRetail061ReversalMasterCard() - { - // see test case 23 - } - - public function testRetail062ReversalMasterCard() - { - // see test case 42 - } - - public function testRetail063ReversalVisaPartial() - { - // see test case 15 - } - - public function testRetail064ReversalDiscoverPartial() - { - // see test 21 - } - - // PIN DEBIT CARD FUNCTIONS - - public function testRetail065DebitSaleVisaSwipe() - { - $card = TestCards::asDebit(TestCards::visaSwipe(), '32539F50C245A6A93D123412324000AA'); - - $response = $card->charge(14.01) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail066DebitSaleMasterCardSwipe() - { - $card = TestCards::asDebit(TestCards::masterCardSwipe(), 'F505AD81659AA42A3D123412324000AB'); - - $response = $card->charge(14.02) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - // test case 71 - $reversal = $response->reverse(14.02) - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($reversal); - $this->assertEquals('00', $reversal->responseCode); - } - - public function testRetail067DebitSaleVisaSwipeCashBack() - { - $card = TestCards::asDebit(TestCards::visaSwipe(), '32539F50C245A6A93D123412324000AA'); - - $response = $card->charge(14.03) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withCashBack(5.00) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail067aDebitSaleMasterCard() - { - $card = TestCards::asDebit(TestCards::masterCardSwipe(), 'F505AD81659AA42A3D123412324000AB'); - - $response = $card->charge(14.04) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // PARTIALLY APPROVED PURCHASE - - public function testRetail068DebitSaleMasterCardPartialApproval() - { - $card = TestCards::asDebit(TestCards::masterCardSwipe(), 'F505AD81659AA42A3D123412324000AB'); - - $response = $card->charge(33.00) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAllowPartialAuth(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('10', $response->responseCode); - $this->assertEquals(22.00, $response->authorizedAmount); - } - - public function testRetail069DebitSaleVisaPartialApproval() - { - $this->markTestSkipped(); - - $card = TestCards::asDebit(TestCards::visaSwipe(), '32539F50C245A6A93D123412324000AA'); - - $response = $card->charge(44.00) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withAllowPartialAuth(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals(33.00, $response->authorizedAmount); - - // test case 72 - $reversal = $response->reverse(33.00) - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($reversal); - $this->assertEquals('00', $reversal->responseCode); - } - - // RETURN - - public function testRetail070DebitReturnVisaSwipe() - { - $card = TestCards::asDebit(TestCards::visaSwipe(), '32539F50C245A6A93D123412324000AA'); - - $response = $card->refund(14.07) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail070aDebitReturnVisaSwipe() - { - $card = TestCards::asDebit(TestCards::visaSwipe(), '32539F50C245A6A93D123412324000AA'); - - $response = $card->refund(14.08) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - $reversalResponse = $response->reverse(14.08) - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($reversalResponse); - $this->assertEquals('00', $reversalResponse->responseCode); - } - - // REVERSAL - - public function testRetail071DebitReversalMasterCard() - { - // see test case 66 - } - - public function testRetail072DebitReversalVisa() - { - // see test case 96 - } - - /* - EBT FUNCTIONS - Food Stamp Purchase - */ - - public function testRetail080EbtfsPurchaseVisaSwipe() - { - $card = TestCards::asEBTTrack(TestCards::visaSwipe(), '32539F50C245A6A93D123412324000AA'); - - $response = $card->charge(101.01) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail081EbtfsPurchaseVisaManual() - { - $card = TestCards::asEBTManual(TestCards::visaManual(false, true), '32539F50C245A6A93D123412324000AA'); - - $response = $card->charge(102.01) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // Food Stamp Electronic Voucher (Manual Entry Only) - - public function testRetail082EbtVoucherPurchaseVisa() - { - $card = TestCards::asEBTManual(TestCards::visaManual(false, true), '32539F50C245A6A93D123412324000AA'); - $card->SerialNumber = '123456789012345'; - $card->approvalCode = '123456'; - - $response = $card->charge(103.01) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // Food Stamp Balance Inquiry - - public function testRetail083EbtfsReturnVisaSwipe() - { - $card = TestCards::asEBTTrack(TestCards::visaSwipeEncrypted(), '32539F50C245A6A93D123412324000AA'); - - $response = $card->refund(104.01) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail084EbtfsReturnVisaManual() - { - $card = TestCards::asEBTManual(TestCards::visaManual(false, true), '32539F50C245A6A93D123412324000AA'); - - $response = $card->refund(105.01) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // Food Stamp Balance Inquiry - - public function testRetail085EbtBalanceInquiryVisaSwipe() - { - $card = TestCards::asEBTTrack(TestCards::visaSwipeEncrypted(), '32539F50C245A6A93D123412324000AA'); - - $response = $card->balanceInquiry()->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail086EbtBalanceInquiryVisaManual() - { - $card = TestCards::asEBTManual(TestCards::visaManual(true, true), '32539F50C245A6A93D123412324000AA'); - - $response = $card->balanceInquiry()->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - /* - $this->assertEquals('00', $response->responseCode); - EBT CASH BENEFITS - Cash Back Purchase - */ - - public function testRetail087EbtCashBackPurchaseVisaSwipe() - { - $card = TestCards::asEBTTrack(TestCards::visaSwipeEncrypted(), '32539F50C245A6A93D123412324000AA'); - - $response = $card->charge(106.01) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withCashBack(5.00) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail088EbtCashBackPurchaseVisaManual() - { - $card = TestCards::asEBTManual(TestCards::visaManual(false, true), '32539F50C245A6A93D123412324000AA'); - - $response = $card->charge(107.01) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withCashBack(5.00) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // No Cash Back Purchase - - public function testRetail089EbtCashBackPurchaseVisaSwipeNoCashBack() - { - $card = TestCards::asEBTTrack(TestCards::visaSwipeEncrypted(), '32539F50C245A6A93D123412324000AA'); - - $response = $card->charge(108.01) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withCashBack(0) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail090EbtCashBackPurchaseVisaManualNoCashBack() - { - $card = TestCards::asEBTManual(TestCards::visaManual(false, true), '32539F50C245A6A93D123412324000AA'); - - $response = $card->charge(109.01) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withCashBack(0) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // Cash Back Balance Inquiry - - public function testRetail091EbtBalanceInquiryVisaSwipeCash() - { - $card = TestCards::asEBTTrack(TestCards::visaSwipeEncrypted(), '32539F50C245A6A93D123412324000AA'); - - $response = $card->balanceInquiry(InquiryType::CASH)->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail092EbtBalanceInquiryVisaManualCash() - { - $card = TestCards::asEBTManual(TestCards::visaManual(true, true), '32539F50C245A6A93D123412324000AA'); - - $response = $card->balanceInquiry(InquiryType::CASH)->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - // Cash Benefits Withdrawal - - public function testRetail093EbtBenefitWithDrawalVisaSwipe() - { - $card = TestCards::asEBTTrack(TestCards::visaSwipeEncrypted(), '32539F50C245A6A93D123412324000AA'); - - $response = $card->charge(110.01) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testRetail094EbtBenefitWithDrawalVisaManual() - { - $card = TestCards::asEBTManual(TestCards::visaManual(false, true), '32539F50C245A6A93D123412324000AA'); - - $response = $card->charge(111.01) - ->withAllowDuplicates(true) - ->withCurrency('USD') - ->withCashBack(0) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - /* - HMS GIFT - REWARDS - GIFT - ACTIVATE - */ - - public function testRetail095ActivateGift1Swipe() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->activate(6.00)->execute(); - $this->assertNotNull($response); - $this->assertEquals('0', $response->responseCode); - } - - public function testRetail096ActivateGift2Manual() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->activate(7.00)->execute(); - $this->assertNotNull($response); - $this->assertEquals('0', $response->responseCode); - } - - // ADD VALUE - - public function testRetail097AddValueGift1Swipe() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->addValue(8.00) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('0', $response->responseCode); - } - - public function testRetail098AddValueGift2Manual() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->activate(9.00)->execute(); - $this->assertNotNull($response); - $this->assertEquals('0', $response->responseCode); - } - - // BALANCE INQUIRY - - public function testRetail099BalanceInquiryGift1Swipe() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->balanceInquiry()->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - $this->assertEquals(10.00, $response->balanceAmount); - } - - public function testRetail100BalanceInquiryGift2Manual() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->balanceInquiry()->execute(); - $this->assertNotNull($response); - $this->assertEquals('0', $response->responseCode); - $this->assertEquals(10.00, $response->balanceAmount); - } - - // REPLACE / TRANSFER - - public function testRetail101ReplaceGift1Swipe() - { - $oldCard = TestCards::giftCard1Swipe(); - $newCard = TestCards::giftCard2Manual(); - - $response = $oldCard->replaceWith($newCard)->execute(); - $this->assertNotNull($response); - $this->assertEquals('0', $response->responseCode); - } - - public function testRetail102ReplaceGift2Manual() - { - $newCard = TestCards::giftCard1Swipe(); - $oldCard = TestCards::giftCard2Manual(); - - $response = $oldCard->replaceWith($newCard)->execute(); - $this->assertNotNull($response); - $this->assertEquals('0', $response->responseCode); - } - - // SALE / REDEEM - - public function testRetail103SaleGift1Swipe() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->charge(1.00) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('0', $response->responseCode); - } - - public function testRetail104SaleGift2Manual() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->charge(2.00) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('0', $response->responseCode); - } - - public function testRetail105SaleGift1VoidSwipe() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->charge(3.00) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('0', $response->responseCode); - - // test case 107 - $voidResponse = $response->void()->execute(); - $this->assertNotNull($voidResponse); - $this->assertEquals('0', $voidResponse->responseCode); - } - - public function testRetail106SaleGift2ReversalManual() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->charge(4.00) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('0', $response->responseCode); - - //test case 108 - $voidResponse = $response->reverse(4.00)->execute(); - $this->assertNotNull($voidResponse); - $this->assertEquals('0', $voidResponse->responseCode); - } - - // VOID - - public function testRetail107VoidGift() - { - // see test case 105 - } - - // REVERSAL - - public function testRetail108ReversalGift() - { - // see test case 106 - } - - // DEACTIVATE - - public function testRetail109DeactivateGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->deactivate()->execute(); - $this->assertNotNull($response); - $this->assertEquals('0', $response->responseCode); - } - - // RECEIPTS MESSAGING - - public function testRetail110ReceiptsMessaging() - { - // PRINT AND SCAN RECEIPT FOR TEST 107 - } - - /* - REWARDS - BALANCE INQUIRY - */ - - public function testRetail111BalanceInquiryRewards1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->balanceInquiry()->execute(); - $this->assertNotNull($response); - $this->assertEquals('0', $response->responseCode); - $this->assertEquals(0, $response->pointsBalanceAmount); - } - - public function testRetail112BalanceInquiryRewards2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->balanceInquiry()->execute(); - $this->assertNotNull($response); - $this->assertEquals('0', $response->responseCode); - $this->assertEquals(0, $response->pointsBalanceAmount); - } - - // ALIAS - - public function testRetail113CreateAliasGift1() - { - $card = GiftCard::create('9725550100'); - $this->assertNotNull($card); - } - - public function testRetail114CreateAliasGift2() - { - $card = GiftCard::create('9725550100'); - $this->assertNotNull($card); - } - - public function testRetail115AddAliasGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->addAlias('2145550199')->execute(); - $this->assertNotNull($response); - $this->assertEquals('0', $response->responseCode); - } - - public function testRetail116AddAliasGift2() - { - $card = TestCards::giftCard2Manual(); - - $response = $card->addAlias('2145550199')->execute(); - $this->assertNotNull($response); - $this->assertEquals('0', $response->responseCode); - } - - public function testRetail117DeleteAliasGift1() - { - $card = TestCards::giftCard1Swipe(); - - $response = $card->removeAlias('2145550199')->execute(); - $this->assertNotNull($response); - $this->assertEquals('0', $response->responseCode); - } - - public function testRetail999CloseBatch() - { - try { - $response = BatchService::closeBatch(); - $this->assertNotNull($response); - // error_log(sprintf('Batch ID: %s', $response->Id)); - // error_log(sprintf('Sequence Number: %s', $response->SequenceNumber)); - } catch (Exception $exec) { - if (false === strpos($e->getMessage(), static::BATCH_NOT_OPEN) - && false === strpos($e->getMessage(), static::NO_TRANS_IN_BATCH) - ) { - $this->fail($e->getMessage()); - } - } - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/CreditTest.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/CreditTest.php deleted file mode 100644 index 01539b1..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/CreditTest.php +++ /dev/null @@ -1,270 +0,0 @@ -card = new CreditCardData(); - $this->card->number = '4111111111111111'; - $this->card->expMonth = 12; - $this->card->expYear = 2025; - $this->card->cvn = '123'; - $this->card->cardHolderName = 'Joe Smith'; - - - $this->track = new CreditTrackData(); - $this->track->value = ';'; - $this->track->encryptionData = new EncryptionData(); - $this->track->encryptionData->version = '01'; - - ServicesContainer::configure($this->getConfig()); - } - - public function testCreditAuthorization() - { - $authorization = $this->card->authorize(14) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($authorization); - $this->assertEquals('00', $authorization->responseCode); - - $capture = $authorization->capture(16) - ->withGratuity(2) - ->execute(); - $this->assertNotNull($capture); - $this->assertEquals('00', $capture->responseCode); - } - - public function testCreditServiceAuth() - { - $service = new CreditService( - $this->getConfig() - ); - - $authorization = $service->authorize(15) - ->withCurrency('USD') - ->withPaymentMethod($this->card) - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($authorization); - $this->assertEquals('00', $authorization->responseCode); - - $capture = $service->capture($authorization->transactionReference->transactionId) - ->withAmount(17) - ->withGratuity(2) - ->execute(); - $this->assertNotNull($capture); - $this->assertEquals('00', $capture->responseCode); - } - - public function testCreditSale() - { - $response = $this->card->charge(15) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testCreditOfflineAuth() - { - $response = $this->card->authorize(16) - ->withCurrency('USD') - ->withOfflineAuthCode('12345') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testCreditOfflineSale() - { - $response = $this->card->charge(16) - ->withCurrency('USD') - ->withOfflineAuthCode('12345') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testCreditRefund() - { - $response = $this->card->refund(16) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testCreditReverse() - { - $response = $this->card->reverse(15) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testCreditVerify() - { - $response = $this->card->verify() - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testCreditSwipeAuthorization() - { - $authorization = $this->track->authorize(14) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($authorization); - $this->assertEquals('00', $authorization->responseCode); - - $capture = $authorization->capture(16) - ->withGratuity(2) - ->execute(); - $this->assertNotNull($capture); - $this->assertEquals('00', $capture->responseCode); - } - - public function testCreditServiceSwipeAuth() - { - $service = new CreditService( - $this->getConfig() - ); - - $authorization = $service->authorize(15) - ->withCurrency('USD') - ->withPaymentMethod($this->track) - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($authorization); - $this->assertEquals('00', $authorization->responseCode); - - $capture = $service->capture($authorization->transactionReference->transactionId) - ->withAmount(17) - ->withGratuity(2) - ->execute(); - $this->assertNotNull($capture); - $this->assertEquals('00', $capture->responseCode); - } - - public function testCreditSwipeSale() - { - $response = $this->track->charge(15) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testCreditSwipeOfflineAuth() - { - $response = $this->track->authorize(16) - ->withCurrency('USD') - ->withOfflineAuthCode('12345') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testCreditSwipeOfflineSale() - { - $response = $this->track->charge(16) - ->withCurrency('USD') - ->withOfflineAuthCode('12345') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testCreditSwipeAddValue() - { - $this->markTestSkipped('GSB not configured'); - - $response = $this->track->addValue(16) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testCreditSwipeBalanceInquiry() - { - $response = $this->track->balanceInquiry() - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testCreditSwipeRefund() - { - $response = $this->track->refund(16) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testCreditSwipeReverse() - { - $response = $this->track->reverse(15) - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testCreditSwipeVerify() - { - $response = $this->track->verify() - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - protected function getConfig() - { - $config = new ServicesConfig(); - $config->secretApiKey = 'skapi_cert_MTeSAQAfG1UA9qQDrzl-kz4toXvARyieptFwSKP24w'; - $config->serviceUrl = ($this->enableCryptoUrl) ? - 'https://cert.api2-c.heartlandportico.com/': - 'https://cert.api2.heartlandportico.com'; - return $config; - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/DebitTest.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/DebitTest.php deleted file mode 100644 index 21e57e4..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/DebitTest.php +++ /dev/null @@ -1,73 +0,0 @@ -track = TestCards::asDebit(TestCards::visaSwipeEncrypted(), '32539F50C245A6A93D123412324000AA'); - - ServicesContainer::configure($this->getConfig()); - } - - public function testDebitSale() - { - $response = $this->track->charge(17.01) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testDebitAddValue() - { - $this->markTestSkipped('GSB not configured'); - - $response = $this->track->addValue(15.01) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testDebitRefund() - { - $response = $this->track->refund(16.01) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testDebitReverse() - { - $response = $this->track->reverse(17.01) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - protected function getConfig() - { - $config = new ServicesConfig(); - $config->secretApiKey = 'skapi_cert_MaePAQBr-1QAqjfckFC8FTbRTT120bVQUlfVOjgCBw'; - $config->serviceUrl = ($this->enableCryptoUrl) ? - 'https://cert.api2-c.heartlandportico.com/': - 'https://cert.api2.heartlandportico.com'; - return $config; - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/EbtTest.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/EbtTest.php deleted file mode 100644 index 902e79c..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/EbtTest.php +++ /dev/null @@ -1,90 +0,0 @@ -card = TestCards::asEBTManual(TestCards::visaManual(), '32539F50C245A6A93D123412324000AA'); - $this->track = TestCards::asEBTTrack(TestCards::visaSwipeEncrypted(), '32539F50C245A6A93D123412324000AA'); - - ServicesContainer::configure($this->getConfig()); - } - - public function testEbtBalanceInquiry() - { - $response = $this->card->balanceInquiry() - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testEbtSale() - { - $response = $this->card->charge(10) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testEbtRefund() - { - $response = $this->card->refund(10) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testEbtSwipeBalanceInquiry() - { - $response = $this->track->balanceInquiry() - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testEbtSwipeSale() - { - $response = $this->track->charge(10) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testEbtSwipeRefund() - { - $response = $this->track->refund(10) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - protected function getConfig() - { - $config = new ServicesConfig(); - $config->secretApiKey = 'skapi_cert_MaePAQBr-1QAqjfckFC8FTbRTT120bVQUlfVOjgCBw'; - $config->serviceUrl = ($this->enableCryptoUrl) ? - 'https://cert.api2-c.heartlandportico.com/': - 'https://cert.api2.heartlandportico.com'; - return $config; - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/GiftTest.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/GiftTest.php deleted file mode 100644 index 715f04e..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/GiftTest.php +++ /dev/null @@ -1,119 +0,0 @@ -card = new GiftCard(); - $this->card->number = '5022440000000000007'; - - $this->track = new GiftCard(); - $this->track->trackData = '%B5022440000000000098^^391200081613?;5022440000000000098=391200081613?'; - - ServicesContainer::configure($this->getConfig()); - } - - public function testGiftCreate() - { - $newCard = GiftCard::create('2145550199'); - $this->assertNotNull($newCard); - $this->assertNotNull($newCard->number); - $this->assertNotNull($newCard->alias); - $this->assertNotNull($newCard->pin); - } - - public function testGiftAddAlias() - { - $response = $this->card->addAlias('2145550199') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testGiftAddValue() - { - $response = $this->card->addValue(10) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testGiftBalanceInquiry() - { - $response = $this->card->balanceInquiry() - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testGiftSale() - { - $response = $this->card->charge(10) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testGiftDeactivate() - { - $response = $this->card->deactivate() - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testGiftRemoveAlias() - { - $response = $this->card->removeAlias('2145550199') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testGiftReplace() - { - $response = $this->card->replaceWith($this->track) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testGiftReverse() - { - $response = $this->card->reverse(10) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testGiftRewards() - { - $response = $this->card->rewards(10) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - protected function getConfig() - { - $config = new ServicesConfig(); - $config->secretApiKey = 'skapi_cert_MaePAQBr-1QAqjfckFC8FTbRTT120bVQUlfVOjgCBw'; - $config->serviceUrl = ($this->enableCryptoUrl) ? - 'https://cert.api2-c.heartlandportico.com/': - 'https://cert.api2.heartlandportico.com'; - return $config; - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/PorticoReportingTests.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/PorticoReportingTests.php deleted file mode 100644 index b83adf7..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/PorticoReportingTests.php +++ /dev/null @@ -1,296 +0,0 @@ -card = new CreditCardData(); - $this->card->number = '4111111111111111'; - $this->card->expMonth = 12; - $this->card->expYear = 2025; - $this->card->cvn = '123'; - $this->card->cardHolderName = 'Joe Smith'; - - - $this->reportingService = new ReportingService(); - $this->searchCriteria = new SearchCriteriaBuilder(); - - ServicesContainer::configure($this->getConfig()); - } - - protected function getConfig() - { - $config = new ServicesConfig(); - $config->secretApiKey = 'skapi_cert_MaePAQBr-1QAqjfckFC8FTbRTT120bVQUlfVOjgCBw'; - $config->serviceUrl = ($this->enableCryptoUrl) ? - 'https://cert.api2-c.heartlandportico.com/': - 'https://cert.api2.heartlandportico.com'; - return $config; - } - - public function testReportActivity() - { - date_default_timezone_set("UTC"); - $dateFormat = 'Y-m-d\TH:i:s.00\Z'; - $dateMinus15days = new DateTime(); - $dateMinus15days->sub(new DateInterval('P15D')); - $dateMinus10Utc = gmdate($dateFormat, $dateMinus15days->Format('U')); - $nowUtc = gmdate($dateFormat); - - $response = $this->reportingService->activity() - ->withStartDate($dateMinus10Utc) - ->withEndDate($nowUtc) - ->execute(); - $this->assertNotNull($response); - $this->assertTrue(count($response) > 0); - } - - public function testReportActivityByDays() - { - date_default_timezone_set("UTC"); - $dateFormat = 'Y-m-d\TH:i:s.00\Z'; - $dateMinus5days = new DateTime(); - $dateMinus5days->sub(new DateInterval('P5D')); - $dateMinus10Utc = gmdate($dateFormat, $dateMinus5days->Format('U')); - $nowUtc = gmdate($dateFormat); - - $response = $this->reportingService->activity() - ->withStartDate($dateMinus10Utc) - ->withEndDate($nowUtc) - ->execute(); - $this->assertNotNull($response); - $this->assertTrue(count($response) > 0); - } - - public function testReportTransactionDetail() - { - $response = $this->reportingService->transactionDetail("1088532284")->execute(); - $this->assertNotNull($response); - } - - public function testInvoiceNumber() - { - $address = new Address(); - $address->postalCode = "12345"; - - $authResponse = $this->card->charge(10) - ->withCurrency("USD") - ->withAddress($address) - ->withInvoiceNumber('123456') - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($authResponse); - $this->assertEquals('00', $authResponse->responseCode); - $this->assertNotNull($authResponse->transactionId); - - $report = ReportingService::transactionDetail($authResponse->transactionId) - ->execute(); - - $this->assertNotNull($report); - $this->assertEquals('123456', $report->invoiceNumber); - } - - public function testReportCardHolderName() - { - $gateway_response = $this->card->charge(10) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - - $response = $this->reportingService->transactionDetail($gateway_response->transactionId)->execute(); - - $this->assertEquals('Joe', $response->cardHolderFirstName); - $this->assertEquals('Smith', $response->cardHolderLastName); - } - - public function testReportFindTransactionWithTransactionId() - { - $gateway_response = $this->card->charge(10) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - - $response = $this->reportingService->findTransactions($gateway_response->transactionId)->execute(); - $this->assertNotNull($response); - } - - public function testReportFindTransactionNoCriteria() - { - $response = $this->reportingService->findTransactions()->execute(); - $this->assertNotNull($response); - } - - public function testReportFindTransactionWithCriteria() - { - date_default_timezone_set("UTC"); - $dateFormat = 'Y-m-d\TH:i:s.00\Z'; - $dateMinus10days = new DateTime(); - $dateMinus10days->sub(new DateInterval('P5D')); - $dateMinus5Utc = gmdate($dateFormat, $dateMinus10days->Format('U')); - $nowUtc = gmdate($dateFormat); - - $response = $this->reportingService->findTransactions() - ->withTimeZoneConversion(TimeZoneConversion::MERCHANT) - ->where('startDate', $dateMinus5Utc) - ->and('endDate', $nowUtc) - ->execute(); - - $this->assertNotNull($response); - $this->assertTrue(count($response) > 0); - } - - public function testCreditAuthWithConvenienceAmount() - { - $authorization = $this->card->authorize(14) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->withConvenienceAmount(2) - ->execute(); - - $this->assertNotNull($authorization); - $this->assertEquals('00', $authorization->responseCode); - - $report = $this->reportingService->transactionDetail($authorization->transactionId)->execute(); - $this->assertNotNull($report); - $this->assertEquals('2', $report->convenienceAmount); - } - - public function testCreditAuthWithShippingAmount() - { - $authorization = $this->card->authorize(14) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->withShippingAmount(2) - ->execute(); - - $this->assertNotNull($authorization); - $this->assertEquals('00', $authorization->responseCode); - - $report = $this->reportingService->transactionDetail($authorization->transactionId)->execute(); - $this->assertNotNull($report); - $this->assertEquals('2', $report->shippingAmount); - } - - public function testCreditSaleWithConvenienceAmount() - { - $response = $this->card->charge(15) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->withConvenienceAmount(2) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - $report = $this->reportingService->transactionDetail($response->transactionId)->execute(); - $this->assertNotNull($report); - $this->assertEquals('2', $report->convenienceAmount); - } - - public function testCreditSaleWithShippingAmount() - { - $response = $this->card->charge(15) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->withShippingAmount(2) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - $report = $this->reportingService->transactionDetail($response->transactionId)->execute(); - $this->assertNotNull($report); - $this->assertEquals('2', $report->shippingAmount); - } - - public function testCreditOfflineAuthWithConvenienceAmount() - { - $response = $this->card->authorize(16) - ->withCurrency('USD') - ->withOfflineAuthCode('12345') - ->withAllowDuplicates(true) - ->withConvenienceAmount(2) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - $report = $this->reportingService->transactionDetail($response->transactionId)->execute(); - $this->assertNotNull($report); - $this->assertEquals('2', $report->convenienceAmount); - } - - public function testCreditOfflineAuthWithShippingAmount() - { - $response = $this->card->authorize(16) - ->withCurrency('USD') - ->withOfflineAuthCode('12345') - ->withAllowDuplicates(true) - ->withShippingAmount(2) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - $report = $this->reportingService->transactionDetail($response->transactionId)->execute(); - $this->assertNotNull($report); - $this->assertEquals('2', $report->shippingAmount); - } - - public function testCreditOfflineSaleWithConvenienceAmount() - { - $response = $this->card->charge(17) - ->withCurrency('USD') - ->withOfflineAuthCode('12345') - ->withAllowDuplicates(true) - ->WithConvenienceAmount(2) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - $report = $this->reportingService->transactionDetail($response->transactionId)->execute(); - $this->assertNotNull($report); - $this->assertEquals('2', $report->convenienceAmount); - } - - public function testCreditOfflineSaleWithShippingAmount() - { - $response = $this->card->charge(17) - ->withCurrency('USD') - ->withOfflineAuthCode('12345') - ->withAllowDuplicates(true) - ->withShippingAmount(2) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - - $report = $this->reportingService->transactionDetail($response->transactionId)->execute(); - $this->assertNotNull($report); - $this->assertEquals('2', $report->shippingAmount); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/PorticoTokenManagementTest.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/PorticoTokenManagementTest.php deleted file mode 100644 index 4ccfc30..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/PorticoConnector/PorticoTokenManagementTest.php +++ /dev/null @@ -1,72 +0,0 @@ -getConfig()); - - try { - $card = new CreditCardData(); - $card->number = '4111111111111111'; - $card->expMonth = 12; - $card->expYear = 2025; - $card->cvn = '123'; - - $this->token = $card->tokenize()->execute()->token; - $this->assertTrue(!empty($this->token), 'TOKEN COULD NOT BE GENERATED.'); - } catch (ApiException $exc) { - $this->fail($exc->message); - } - - } - - protected function getConfig() - { - $config = new ServicesConfig(); - $config->secretApiKey = 'skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A'; - $config->serviceUrl = 'https://cert.api2.heartlandportico.com'; - return $config; - } - - public function testUpdateToken() - { - $token = new CreditCardData(); - $token->token = $this->token; - $token->expMonth = 12; - $token->expYear = 2025; - - $this->assertTrue($token->updateTokenExpiry()); - - // should succeed - $response = $token->verify()->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testDeleteToken() - { - $token = new CreditCardData(); - $token->token = $this->token; - - $this->assertTrue($token->deleteToken()); - - // should fail - try { - $response = $token->verify()->execute(); - } catch (GatewayException $exc) { - $this->assertEquals('27', $exc->responseCode); - } - } -} \ No newline at end of file diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/AcsResponse.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/AcsResponse.php deleted file mode 100644 index 131078e..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/AcsResponse.php +++ /dev/null @@ -1,44 +0,0 @@ -authResponse; - } - - /** - * @return void - */ - public function setAuthResponse($authResponse){ - $this->authResponse = $authResponse; - } - - /** - * @return string - */ - public function getMerchantData(){ - return $this->merchantData; - } - - /** - * @return void - */ - public function setMerchantData($merchantData){ - $this->merchantData = $merchantData; - } -} \ No newline at end of file diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/ApiTestCase.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/ApiTestCase.php deleted file mode 100644 index a1f6a04..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/ApiTestCase.php +++ /dev/null @@ -1,999 +0,0 @@ -merchantId = 'heartlandgpsandbox'; - $config->accountId = 'api'; - $config->sharedSecret = 'secret'; - $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; - - ServicesContainer::configure($config); - - // create the card object - $card = new CreditCardData(); - $card->number = '4263970000005262'; - $card->expMonth = 12; - $card->expYear = 2025; - $card->cvn = '131'; - $card->cardHolderName = 'James Mason'; - - try { - // process an auto-settle authorization - $response = $card->charge(15) - ->withCurrency("EUR") - ->execute(); - - $responseCode = $response->responseCode; // 00 == Success - $message = $response->responseMessage; // [ test system ] AUTHORISED - // get the details to save to the DB for future Transaction Management requests - $orderId = $response->orderId; - $authCode = $response->authorizationCode; - $paymentsReference = $response->transactionId; - // TODO: update your application and display transaction outcome to the customer - - $this->assertNotEquals(null, $response); - $this->assertEquals("00", $responseCode); - } catch (ApiException $e) { - // TODO: add your error handling here - } - } - - /* 02. Process Payment Refund */ - - public function testprocessPaymentRefund() - { - $config = new ServicesConfig(); - $config->merchantId = 'heartlandgpsandbox'; - $config->accountId = 'api'; - $config->sharedSecret = 'secret'; - $config->refundPassword = 'refund'; - $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; - - ServicesContainer::configure($config); - - // create the card object - $card = new CreditCardData(); - $card->number = '4263970000005262'; - $card->expMonth = 12; - $card->expYear = 2025; - $card->cvn = '131'; - $card->cardHolderName = 'James Mason'; - - // process a refund to the card - $response = $card->refund(16) - ->withCurrency("EUR") - ->execute(); - - // get the response details to update the DB - $responseCode = $response->responseCode; // 00 == Success - $message = $response->responseMessage; // [ test system ] AUTHORISED - - $this->assertNotEquals(null, $response); - $this->assertEquals("00", $responseCode); - } - - /* 03. Process Payment OTB */ - - public function testprocessPaymentOtb() - { - $config = new ServicesConfig(); - $config->merchantId = 'heartlandgpsandbox'; - $config->accountId = 'api'; - $config->sharedSecret = 'secret'; - $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; - - ServicesContainer::configure($config); - - // create the card object - $card = new CreditCardData(); - $card->number = '4263970000005262'; - $card->expMonth = 12; - $card->expYear = 2025; - $card->cvn = '131'; - $card->cardHolderName = 'James Mason'; - - try { - // check that a card is valid and active without charging an amount - $response = $card->verify() - ->execute(); - - // get the response details to update the DB - $responseCode = $response->responseCode; // 00 == Success - $message = $response->responseMessage; // [ test system ] AUTHORISED - // TODO: save the card to Card Stroage - - $this->assertNotEquals(null, $response); - $this->assertEquals("00", $responseCode); - } catch (ApiException $e) { - // TODO: Add your error handling here - } - } - - /* 04. ThreeD Secure Verify Enrolled */ - - public function testthreeDSecureVerifyEnrolled() - { - // will update later - } - - /* 05. ThreeD Secure Verify Sig */ - - public function testthreeDSecureVerifySig() - { - // will update later - } - - /* 06.ThreeD Secure Auth */ - - public function testthreeDSecureAuth() - { - $config = new ServicesConfig(); - $config->merchantId = 'heartlandgpsandbox'; - $config->accountId = 'api'; - $config->sharedSecret = 'secret'; - $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; - - ServicesContainer::configure($config); - - // create the card object - $card = new CreditCardData(); - $card->number = '4263970000005262'; - $card->expMonth = 12; - $card->expYear = 2025; - $card->cvn = '131'; - $card->cardHolderName = 'James Mason'; - - // supply the details from the 3D Secure verify-signature response - $threeDSecureInfo = new EcommerceInfo(); - $threeDSecureInfo->cavv = "AAACBllleHchZTBWIGV4AAAAAAA="; - $threeDSecureInfo->xid = "crqAeMwkEL9r4POdxpByWJ1/wYg="; - $threeDSecureInfo->eci = "5"; - - try { - // create the authorization with 3D Secure information - $response = $card->charge(15) - ->withEcommerceInfo($threeDSecureInfo) - ->withCurrency("EUR") - ->execute(); - - $this->assertNotEquals(null, $response); - $this->assertEquals("00", $response->responseCode); - } catch (ApiException $e) { - // TODO: Add your error handling here - } - } - - /* 07. Process Payment Apple Pay */ - - public function testprocessPaymentApplePay() - { - // will update later - } - - /* 19. Transaction Management Delayed Auth */ - - public function testtransactionManagementDelayedAuth() - { - $config = new ServicesConfig(); - $config->merchantId = 'heartlandgpsandbox'; - $config->accountId = 'api'; - $config->sharedSecret = 'secret'; - $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; - - ServicesContainer::configure($config); - - // create the card object - $card = new CreditCardData(); - $card->number = '4263970000005262'; - $card->expMonth = 12; - $card->expYear = 2025; - $card->cvn = '131'; - $card->cardHolderName = 'James Mason'; - - try { - // create the delayed settle authorization - $response = $card->authorize(19.99) - ->withCurrency("EUR") - ->execute(); - - $responseCode = $response->responseCode; // 00 == Success - $message = $response->responseMessage; // [ test system ] AUTHORISED - // get the reponse details to save to the DB for future transaction management requests - $orderId = $response->orderId; - $authCode = $response->authorizationCode; - $paymentsReference = $response->transactionId; // pasref - - $this->assertNotEquals(null, $response); - $this->assertEquals("00", $responseCode); - } catch (ApiException $e) { - // TODO: Add your error handling here - } - } - - /* 20. Transaction Management Settle */ - - public function testtransactionManagementSettle() - { - $config = new ServicesConfig(); - $config->merchantId = 'heartlandgpsandbox'; - $config->accountId = 'api'; - $config->sharedSecret = 'secret'; - $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; - - ServicesContainer::configure($config); - - // a settle request requires the original order id - $orderId = "QAhN4YFrJEWP6Vc-N68u-w"; - // and the payments reference (pasref) from the authorization response - $paymentsReference = "15113583374071921"; - // create the settle transaction object - $settle = Transaction::fromId($paymentsReference, $orderId); - - try { - // send the settle request, we must specify the amount and currency - $response = $settle->capture(1) - ->withCurrency("EUR") - ->execute(); - - $responseCode = $response->responseCode; // 00 == Success - $message = $response->responseMessage; // [ test system ] AUTHORISED - - $this->assertNotEquals(null, $response); - $this->assertEquals("00", $responseCode); - } catch (ApiException $e) { - // TODO: Add your error handling here - } - } - - /* 21. Transaction Management Rebate */ - - public function testTransactionManagementRebate() - { - $config = new ServicesConfig(); - $config->merchantId = 'heartlandgpsandbox'; - $config->accountId = 'api'; - $config->sharedSecret = 'secret'; - $config->rebatePassword = 'rebate'; - $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; - - ServicesContainer::configure($config); - - // create the card object - $card = new CreditCardData(); - $card->number = '4263970000005262'; - $card->expMonth = 12; - $card->expYear = 2025; - $card->cvn = '131'; - $card->cardHolderName = 'James Mason'; - - $response = $card->charge(19.99) - ->withCurrency("EUR") - ->execute(); - - $this->assertNotNull($response); - - $responseCode = $response->responseCode; // 00 == Success - $message = $response->responseMessage; // [ test system ] AUTHORISED - // get the reponse details to save to the DB for future transaction management requests - $orderId = $response->orderId; - $authCode = $response->authorizationCode; - $paymentsReference = $response->transactionId; // pasref - - // create the rebate transaction object - $transaction = Transaction::fromId($paymentsReference, $orderId); - $transaction->authorizationCode = $authCode; - - // send the settle request, we must specify the amount and currency - $response = $transaction->refund(19.99) - ->withCurrency("EUR") - ->execute(); - - $responseCode = $response->responseCode; // 00 == Success - $message = $response->responseMessage; // [ test system ] AUTHORISED - - $this->assertNotEquals(null, $response); - $this->assertEquals("00", $responseCode); - } - - /* 22. Transaction Management Void */ - - public function testtransactionManagementVoid() - { - $config = new ServicesConfig(); - $config->merchantId = 'heartlandgpsandbox'; - $config->accountId = 'api'; - $config->sharedSecret = 'secret'; - $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; - - ServicesContainer::configure($config); - - // a void request requires the original order id - $orderId = "xd4JTHE0ZEqudur_q1pB1w"; - // and the payments reference (pasref) from the transaction response - $paymentsReference = "15113573969816936"; - // create the void transaction object - $transaction = Transaction::fromId($paymentsReference, $orderId); - - try { - // send the void request - $response = $transaction->void() - ->execute(); - - $responseCode = $response->responseCode; // 00 == Success - $message = $response->responseMessage; // [ test system ] AUTHORISED - - $this->assertNotEquals(null, $response); - $this->assertEquals("00", $responseCode); - } catch (ApiException $e) { - // TODO: Add your error handling here - } - } - - /* 23. Fraud Management Data Submission */ - - public function testfraudManagementDataSubmission() - { - $config = new ServicesConfig(); - $config->merchantId = 'heartlandgpsandbox'; - $config->accountId = 'api'; - $config->sharedSecret = 'secret'; - $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; - - ServicesContainer::configure($config); - - // create the card object - $card = new CreditCardData(); - $card->number = '4263970000005262'; - $card->expMonth = 12; - $card->expYear = 2025; - $card->cvn = '131'; - $card->cardHolderName = 'James Mason'; - - // supply the customer's billing country and post code for avs checks - $billingAddress = new Address(); - $billingAddress->postalCode = "50001|Flat 123"; - $billingAddress->country = "US"; - - // supply the customer's shipping country and post code - $shippingAddress = new Address(); - $shippingAddress->postalCode = "654|123"; - $shippingAddress->country = "GB"; - - // create the delayed settle authorization - $response = $card->charge(10) - ->withCurrency("EUR") - ->withAddress($billingAddress, AddressType::BILLING) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withProductId("SID9838383") // prodid - ->withClientTransactionId("Car Part HV") // varref - ->withCustomerId("E8953893489") // custnum - ->withCustomerIpAddress("123.123.123.123") - ->withFraudFilter(FraudFilterMode::PASSIVE) - ->execute(); - - $responseCode = $response->responseCode; // 00 == Success - $message = $response->responseMessage; // [ test system ] AUTHORISED - // get the reponse details to save to the DB for future transaction management requests - $orderId = $response->orderId; - $authCode = $response->authorizationCode; - $paymentsReference = $response->transactionId; // pasref - - $this->assertNotNull($response); - $this->assertEquals("00", $responseCode); - $this->assertNotNull($response->fraudFilterResponse); - } - - /* 24. Fraud Management Hold */ - - public function testfraudManagementHold() - { - $config = new ServicesConfig(); - $config->merchantId = 'heartlandgpsandbox'; - $config->accountId = 'api'; - $config->sharedSecret = 'secret'; - $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; - - ServicesContainer::configure($config); - - // a hold request requires the original order id - $card = new CreditCardData(); - $card->number = '4263970000005262'; - $card->expMonth = 12; - $card->expYear = 2025; - $card->cvn = '131'; - $card->cardHolderName = 'James Mason'; - - $response = $card->authorize(19.99) - ->withCurrency("EUR") - ->execute(); - - $responseCode = $response->responseCode; // 00 == Success - $message = $response->responseMessage; // [ test system ] AUTHORISED - // get the reponse details to save to the DB for future transaction management requests - $orderId = $response->orderId; - $authCode = $response->authorizationCode; - $paymentsReference = $response->transactionId; // pasref - - $this->assertNotEquals(null, $response); - $this->assertEquals("00", $responseCode); - - // create the hold transaction object - $transaction = Transaction::fromId($paymentsReference, $orderId); - - // send the hold request, we can choose to specify a reason why we're holding it - $response = $transaction->hold() - ->withReasonCode(ReasonCode::FRAUD) - ->execute(); - - $responseCode = $response->responseCode; // 00 == Success - $message = $response->responseMessage; // [ test system ] AUTHORISED - - $this->assertNotEquals(null, $response); - $this->assertEquals("00", $responseCode); - } - - /* 25. Fraud Management Release */ - - public function testfraudManagementRelease() - { - $config = new ServicesConfig(); - $config->merchantId = 'heartlandgpsandbox'; - $config->accountId = 'api'; - $config->sharedSecret = 'secret'; - $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; - - ServicesContainer::configure($config); - - // a hold request requires the original order id - $card = new CreditCardData(); - $card->number = '4263970000005262'; - $card->expMonth = 12; - $card->expYear = 2025; - $card->cvn = '131'; - $card->cardHolderName = 'James Mason'; - - $response = $card->authorize(19.99) - ->withCurrency("EUR") - ->execute(); - - $responseCode = $response->responseCode; // 00 == Success - $message = $response->responseMessage; // [ test system ] AUTHORISED - // get the reponse details to save to the DB for future transaction management requests - $orderId = $response->orderId; - $authCode = $response->authorizationCode; - $paymentsReference = $response->transactionId; // pasref - - $this->assertNotEquals(null, $response); - $this->assertEquals("00", $responseCode); - - // create the hold transaction object - $transaction = Transaction::fromId($paymentsReference, $orderId); - - // send the hold request, we can choose to specify a reason why we're holding it - $response = $transaction->hold() - ->withReasonCode(ReasonCode::FRAUD) - ->execute(); - - $responseCode = $response->responseCode; // 00 == Success - $message = $response->responseMessage; // [ test system ] AUTHORISED - - $this->assertNotEquals(null, $response); - $this->assertEquals("00", $responseCode); - - // send the release request, we can choose to specify a reason why we're releasing it - $response = $transaction->release() - ->withReasonCode(ReasonCode::FALSE_POSITIVE) - ->execute(); - - $responseCode = $response->responseCode; // 00 == Success - $message = $response->responseMessage; // [ test system ] AUTHORISED - - $this->assertNotEquals(null, $response); - $this->assertEquals("00", $responseCode); - } - - /* 26. Dcc Rate Lookup */ - - public function testdccRateLookup() - { - // will update later - } - - /* 27. Dcc Present Choice */ - - public function testdccPresentChoice() - { - // will update later - } - - /* 28. Dcc Auth Data Submission */ - - public function testdccAuthDataSubmission() - { - // will update later - } - - /* 29. Google pay */ - - public function testauthMobileGooglePay() - { - try { - $config = new ServicesConfig(); - $config->merchantId = 'heartlandgpsandbox'; - $config->accountId = 'apitest'; - $config->sharedSecret = 'secret'; - $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; - - ServicesContainer::configure($config); - - // create the card object - $card = new CreditCardData(); - $card->token = '{"signature":"MEUCIQDapDDJyf9lH3ztEWksgAjNe...AXjW+ZM+Ut2BWoTExppDDPc1a9Z7U\u003d","protocolVersion":"ECv1","signedMessage":"{\"encryptedMessage\":\"VkqwkFuMdXp...TZQxVMnkTeJjwyc4\\u003d\",\"ephemeralPublicKey\":\"BMglUoKZWxgB...YCiBNkLaMTD9G4sec\\u003d\",\"tag\":\"4VYypqW2Q5FN7UP87QNDGsLgc48vAe5+AcjR+BxQ2Zo\\u003d\"}"}'; - $card->mobileType = EncyptedMobileType::GOOGLE_PAY; - - // process an auto-settle authorization - $response = $card->charge(15) - ->withCurrency("EUR") - ->withModifier(TransactionModifier::ENCRYPTED_MOBILE) - ->execute(); - - $responseCode = $response->responseCode; // 00 == Success - $message = $response->responseMessage; // [ test system ] AUTHORISED - // get the details to save to the DB for future Transaction Management requests - $orderId = $response->orderId; - $authCode = $response->authorizationCode; - $paymentsReference = $response->transactionId; - // TODO: update your application and display transaction outcome to the customer - - $this->assertNotEquals(null, $response); - $this->assertEquals("00", $responseCode); - } catch (GatewayException $exc) { - if ($exc->responseCode != '509') { - throw $exc; - } - } - } - - /* 30. Apple pay */ - - public function testauthMobileApplePay() - { - try { - $config = new ServicesConfig(); - $config->merchantId = 'heartlandgpsandbox'; - $config->accountId = 'apitest'; - $config->sharedSecret = 'secret'; - $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; - - ServicesContainer::configure($config); - - // create the card object - $card = new CreditCardData(); - $card->token = '{"version":"EC_v1","data":"dvMNzlcy6WNB","header":{"ephemeralPublicKey":"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWdNhNAHy9kO2Kol33kIh7k6wh6E","transactionId":"fd88874954acdb299c285f95a3202ad1f330d3fd4ebc22a864398684198644c3","publicKeyHash":"h7WnNVz2gmpTSkHqETOWsskFPLSj31e3sPTS2cBxgrk"}}'; - $card->mobileType = EncyptedMobileType::APPLE_PAY; - - // process an auto-settle authorization - $response = $card->charge() - ->withModifier(TransactionModifier::ENCRYPTED_MOBILE) - ->execute(); - - $responseCode = $response->responseCode; // 00 == Success - $message = $response->responseMessage; // [ test system ] AUTHORISED - // get the details to save to the DB for future Transaction Management requests - $orderId = $response->orderId; - $authCode = $response->authorizationCode; - $paymentsReference = $response->transactionId; - // TODO: update your application and display transaction outcome to the customer - - $this->assertNotEquals(null, $response); - $this->assertEquals("00", $responseCode); - } catch (GatewayException $exc) { - if ($exc->responseCode != '509' && $exc->responseCode != '515') { - throw $exc; - } - } - } - - /* 31. Mobile payment without Token value */ - - /** - * @expectedException \GlobalPayments\Api\Entities\Exceptions\BuilderException - * @expectedExceptionMessage token cannot be null for this transaction type - */ - public function testauthMobileWithoutToken() - { - $config = new ServicesConfig(); - $config->merchantId = 'heartlandgpsandbox'; - $config->accountId = 'apitest'; - $config->sharedSecret = 'secret'; - $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; - - ServicesContainer::configure($config); - - // create the card object - $card = new CreditCardData(); - $card->mobileType = EncyptedMobileType::GOOGLE_PAY; - - $response = $card->charge(15) - ->withCurrency("EUR") - ->withModifier(TransactionModifier::ENCRYPTED_MOBILE) - ->execute(); - } - - /* 32. Mobile payment without Mobile Type */ - - /** - * @expectedException \GlobalPayments\Api\Entities\Exceptions\BuilderException - * @expectedExceptionMessage mobileType cannot be null for this transaction type - */ - public function testauthMobileWithoutType() - { - $config = new ServicesConfig(); - $config->merchantId = 'heartlandgpsandbox'; - $config->accountId = 'apitest'; - $config->sharedSecret = 'secret'; - $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; - - ServicesContainer::configure($config); - - // create the card object - $card = new CreditCardData(); - $card->token = '{"version":"EC_v1","data":"dvMNzlcy6WNB","header":{"ephemeralPublicKey":"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWdNhNAHy9kO2Kol33kIh7k6wh6E","transactionId":"fd88874954acdb299c285f95a3202ad1f330d3fd4ebc22a864398684198644c3","publicKeyHash":"h7WnNVz2gmpTSkHqETOWsskFPLSj31e3sPTS2cBxgrk"}}'; - - $response = $card->charge(15) - ->withCurrency("EUR") - ->withModifier(TransactionModifier::ENCRYPTED_MOBILE) - ->execute(); - } - - /* 33. Google payment without amount */ - - /** - * @expectedException \GlobalPayments\Api\Entities\Exceptions\BuilderException - * @expectedExceptionMessage Amount and Currency cannot be null for google payment - */ - public function testauthMobileWithoutAmount() - { - $config = new ServicesConfig(); - $config->merchantId = 'heartlandgpsandbox'; - $config->accountId = 'apitest'; - $config->sharedSecret = 'secret'; - $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; - - ServicesContainer::configure($config); - - // create the card object - $card = new CreditCardData(); - $card->token = '{"version":"EC_v1","data":"dvMNzlcy6WNB","header":{"ephemeralPublicKey":"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWdNhNAHy9kO2Kol33kIh7k6wh6E","transactionId":"fd88874954acdb299c285f95a3202ad1f330d3fd4ebc22a864398684198644c3","publicKeyHash":"h7WnNVz2gmpTSkHqETOWsskFPLSj31e3sPTS2cBxgrk"}}'; - $card->mobileType = EncyptedMobileType::GOOGLE_PAY; - - $response = $card->charge() - ->withCurrency("EUR") - ->withModifier(TransactionModifier::ENCRYPTED_MOBILE) - ->execute(); - } - - /* 34. Google payment without Currency */ - - /** - * @expectedException \GlobalPayments\Api\Entities\Exceptions\BuilderException - * @expectedExceptionMessage Amount and Currency cannot be null for google payment - */ - public function testauthMobileWithoutCurrency() - { - $config = new ServicesConfig(); - $config->merchantId = 'heartlandgpsandbox'; - $config->accountId = 'apitest'; - $config->sharedSecret = 'secret'; - $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; - - ServicesContainer::configure($config); - - // create the card object - $card = new CreditCardData(); - $card->token = '{"version":"EC_v1","data":"dvMNzlcy6WNB","header":{"ephemeralPublicKey":"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWdNhNAHy9kO2Kol33kIh7k6wh6E","transactionId":"fd88874954acdb299c285f95a3202ad1f330d3fd4ebc22a864398684198644c3","publicKeyHash":"h7WnNVz2gmpTSkHqETOWsskFPLSj31e3sPTS2cBxgrk"}}'; - $card->mobileType = EncyptedMobileType::GOOGLE_PAY; - - $response = $card->charge(12) - ->withModifier(TransactionModifier::ENCRYPTED_MOBILE) - ->execute(); - } - - public function testfraudManagementAVSMatch() - { - $config = new ServicesConfig(); - $config->merchantId = 'heartlandgpsandbox'; - $config->accountId = 'api'; - $config->sharedSecret = 'secret'; - $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; - - ServicesContainer::configure($config); - - // create the card object - $card = new CreditCardData(); - $card->number = '4263970000005262'; - $card->expMonth = 12; - $card->expYear = 2025; - $card->cvn = '131'; - $card->cardHolderName = 'James Mason'; - - // supply the customer's billing country and post code for avs checks - $billingAddress = new Address(); - $billingAddress->postalCode = "50001|Flat 123"; - $billingAddress->country = "US"; - - // create the delayed settle authorization - $response = $card->charge(10) - ->withCurrency("EUR") - ->withAddress($billingAddress, AddressType::BILLING) - ->withVerifyAddress(true) - ->execute(); - - $responseCode = $response->responseCode; // 00 == Success - $message = $response->responseMessage; // [ test system ] AUTHORISED - // get the reponse details to save to the DB for future transaction management requests - $orderId = $response->orderId; - $authCode = $response->authorizationCode; - $paymentsReference = $response->transactionId; // pasref - - $this->assertNotNull($response); - $this->assertEquals("00", $responseCode); - $this->assertEquals("M", $response->avsResponseCode); - $this->assertEquals("M", $response->avsAddressResponse); - } - - public function testfraudManagementOffMode() - { - $config = new ServicesConfig(); - $config->merchantId = 'heartlandgpsandbox'; - $config->accountId = 'api'; - $config->sharedSecret = 'secret'; - $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; - - ServicesContainer::configure($config); - - // create the card object - $card = new CreditCardData(); - $card->number = '4263970000005262'; - $card->expMonth = 12; - $card->expYear = 2025; - $card->cvn = '131'; - $card->cardHolderName = 'James Mason'; - - // supply the customer's billing country and post code for avs checks - $billingAddress = new Address(); - $billingAddress->postalCode = "50001|Flat 123"; - $billingAddress->country = "US"; - - // supply the customer's shipping country and post code - $shippingAddress = new Address(); - $shippingAddress->postalCode = "654|123"; - $shippingAddress->country = "GB"; - - // create the delayed settle authorization - $response = $card->charge(10) - ->withCurrency("EUR") - ->withAddress($billingAddress, AddressType::BILLING) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withProductId("SID9838383") // prodid - ->withClientTransactionId("Car Part HV") // varref - ->withCustomerId("E8953893489") // custnum - ->withCustomerIpAddress("123.123.123.123") - ->withFraudFilter(FraudFilterMode::OFF) - ->execute(); - - $responseCode = $response->responseCode; // 00 == Success - $message = $response->responseMessage; // [ test system ] AUTHORISED - // get the reponse details to save to the DB for future transaction management requests - $orderId = $response->orderId; - $authCode = $response->authorizationCode; - $paymentsReference = $response->transactionId; // pasref - - $this->assertNotNull($response); - $this->assertEquals("00", $responseCode); - $this->assertNull($response->fraudFilterResponse); - } - - /* 35. Fraud Management Decision Manager */ - - public function testfraudManagementDecisionManager() - { - $config = new ServicesConfig(); - $config->merchantId = 'heartlandgpsandbox'; - $config->accountId = 'api'; - $config->sharedSecret = 'secret'; - $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; - - ServicesContainer::configure($config); - - // create the card object - $card = new CreditCardData(); - $card->number = '4263970000005262'; - $card->expMonth = 12; - $card->expYear = 2025; - $card->cvn = '131'; - $card->cardHolderName = 'James Mason'; - - // supply the customer's billing data for avs checks - $billingAddress = new Address(); - $billingAddress->streetAddress1 = "Flat 123"; - $billingAddress->streetAddress2 = "House 456"; - $billingAddress->streetAddress3 = "Cul-De-Sac"; - $billingAddress->city = "Halifax"; - $billingAddress->province = "West Yorkshire"; - $billingAddress->state = "Yorkshire and the Humber"; - $billingAddress->postalCode = "E77 4QJ"; - $billingAddress->country = "GB"; - - // supply the customer's shipping data - $shippingAddress = new Address(); - $shippingAddress->streetAddress1 = "House 456"; - $shippingAddress->streetAddress2 = "987 The Street"; - $shippingAddress->streetAddress3 = "Basement Flat"; - $shippingAddress->city = "Chicago"; - $shippingAddress->province = "Illinois"; - $shippingAddress->state = "Mid West"; - $shippingAddress->postalCode = "50001"; - $shippingAddress->country = "US"; - - // supply the customer's data - $customer = new Customer(); - $customer->id = "e193c21a-ce64-4820-b5b6-8f46715de931"; - $customer->firstName = "James"; - $customer->lastName = "Mason"; - $customer->dateOfBirth = "01011980"; - $customer->customerPassword = "VerySecurePassword"; - $customer->email = "text@example.com"; - $customer->domainName = "example.com"; - $customer->homePhone = "+35312345678"; - $customer->deviceFingerPrint = "devicefingerprint"; - - // supply the decisionManager data - $decisionManager = new DecisionManager(); - $decisionManager->billToHostName = "example.com"; - $decisionManager->billToHttpBrowserCookiesAccepted = true; - $decisionManager->billToHttpBrowserEmail = "jamesmason@example.com"; - $decisionManager->billToHttpBrowserType = "Mozilla"; - $decisionManager->billToIpNetworkAddress = "123.123.123.123"; - $decisionManager->businessRulessCoreThresHold = "40"; - $decisionManager->billToPersonalId = "741258963"; - $decisionManager->decisionManagerProfile = "DemoProfile"; - $decisionManager->invoiceHeaderTenderType = "consumer"; - $decisionManager->itemHostHedge = Risk::HIGH; - $decisionManager->itemNonsensicalHedge = Risk::HIGH; - $decisionManager->itemObscenitiesHedge = Risk::HIGH; - $decisionManager->itemPhoneHedge = Risk::HIGH; - $decisionManager->itemTimeHedge = Risk::HIGH; - $decisionManager->itemVelocityHedge = Risk::HIGH; - $decisionManager->invoiceHeaderIsGift = true; - $decisionManager->invoiceHeaderReturnsAccepted = true; - - $products = []; - $products[] = array( - 'product_id' => 'SKU251584', - 'productname' => 'Magazine Subscription', - 'quantity' => '12', - 'unitprice' => '1200', - 'gift' => 'true', - 'type' => 'subscription', - 'risk' => 'Low' - ); - $products[] = array( - 'product_id' => 'SKU8884784', - 'productname' => 'Charger', - 'quantity' => '10', - 'unitprice' => '1200', - 'gift' => 'false', - 'type' => 'subscription', - 'risk' => 'High' - ); - - $custom = []; - $custom[] = array( - 'field01' => 'fieldValue01', - 'field02' => 'fieldValue02', - 'field03' => 'fieldValue03', - 'field04' => 'fieldValue04' - ); - - $response = $card->charge(199.99) - ->withCurrency("EUR") - ->withAddress($billingAddress, AddressType::BILLING) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDecisionManager($decisionManager) - ->withCustomerData($customer) - ->withProductData($products) - ->withCustomData($custom) - ->execute(); - - $responseCode = $response->responseCode; // 00 == Success - $message = $response->responseMessage; // [ test system ] AUTHORISED - - $this->assertNotNull($response); - $this->assertEquals("00", $responseCode); - } - - public function testAuthorisationWithoutAccountId() { - $config = new ServicesConfig(); - $config->merchantId = 'heartlandgpsandbox'; - $config->sharedSecret = 'secret'; - $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; - - ServicesContainer::configure($config); - - // create the card object - $card = new CreditCardData(); - $card->number = '4263970000005262'; - $card->expMonth = 12; - $card->expYear = 2025; - $card->cvn = '131'; - $card->cardHolderName = 'James Mason'; - - // process an auto-settle authorization - $response = $card->charge(15) - ->withCurrency("EUR") - ->execute(); - - $this->assertNotEquals(null, $response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRefundWithoutAccountId() - { - $config = new ServicesConfig(); - $config->merchantId = 'heartlandgpsandbox'; - $config->sharedSecret = 'secret'; - $config->refundPassword = 'refund'; - $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; - - ServicesContainer::configure($config); - - // create the card object - $card = new CreditCardData(); - $card->number = '4263970000005262'; - $card->expMonth = 12; - $card->expYear = 2025; - $card->cvn = '131'; - $card->cardHolderName = 'James Mason'; - - // process a refund to the card - $response = $card->refund(16) - ->withCurrency("EUR") - ->execute(); - - $this->assertNotEquals(null, $response); - $this->assertEquals("00", $response->responseCode); - } - -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/Certifications/SdkTest.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/Certifications/SdkTest.php deleted file mode 100644 index 4fe5a53..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/Certifications/SdkTest.php +++ /dev/null @@ -1,18930 +0,0 @@ -merchantId = "heartlandgpsandbox"; - $config->accountId = "api"; - $config->sharedSecret = "secret"; - $config->refundPassword = "refund"; - $config->rebatePassword = "rebate"; - $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; - $config->timeout = 20000; - return $config; - } - - public function getBaseCardData() - { - $card = new CreditCardData(); - $card->number = "4263970000005262"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - $card->cardHolderName = "James Mason"; - return $card; - } - - public function testAuth006a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Auth-006a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth006b() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Auth-006b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth006c() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Auth-006c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth006d() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Auth-006d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth006e() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Auth-006e") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth006f() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Auth-006f") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth006g() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Auth-006g") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth006h() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Auth-006h") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth006i() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Auth-006i") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth006j() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Auth-006j") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth006k() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Auth-006k") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth007a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Auth-007a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth007b() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Auth-007b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth007c() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Auth-007c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth007d() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Auth-007d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth007e() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Auth-007e") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth008a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Auth-008a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth008b() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Auth-008b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth008c() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Auth-008c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth008d() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Auth-008d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth008e() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Auth-008e") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth009a() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Auth-009a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testAuth009b() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "E"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Auth-009b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testAuth009c() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOMMERCE"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Auth-009c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth009d() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Auth-009d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth010a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Auth-010a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth010b() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Auth-010b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth010c() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Auth-010c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth010d() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Auth-010d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth010e() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Auth-010e") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth011a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Auth-011a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth011b() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Auth-011b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth011c() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Auth-011c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testAuth011d() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge() - ->withCurrency("EUR") - ->withDescription("JAVA-Auth-011d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth012a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Auth-012a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testAuth012b() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EURO") - ->withDescription("JAVA-Auth-012b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testAuth012c() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("�UR") - ->withDescription("JAVA-Auth-012c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testAuth012d() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withDescription("JAVA-Auth-012d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth013a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Auth-013a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testAuth013b1() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "424242000000000000000"; - $card->expMonth = 12; - $card->expYear = 2020; - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Auth-013b1") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testAuth013b2() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "42424242424"; - $card->expMonth = 12; - $card->expYear = 2020; - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Auth-013b2") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testAuth013c() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4263970000005262#"; - $card->expMonth = 12; - $card->expYear = 2020; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Auth-013c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth014a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Auth-014a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testAuth014b() - { - $this->markTestSkipped('Exception not thrown'); - - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Auth-014b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testAuth014c() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - $card->cardHolderName = "3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep"; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Auth-014c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth014d() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - $card->cardHolderName = "James~Mason"; - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Auth-014d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth015a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Auth-015a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth015b() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Auth-015b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testAuth015c() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 20; - $card->expYear = 2012; - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Auth-015c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testAuth015d() - { - $this->markTestSkipped('Exception not thrown'); - - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Auth-015d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth016a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Auth-016a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth016b() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Auth-016b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth016c() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Auth-016c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth017a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Auth-017a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth018a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Auth-018a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth019a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Auth-019a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testAuth019b1() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "1234"; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Auth-019b1") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth019b2() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Auth-019b2") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testAuth019c() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "12345"; - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Auth-019c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth019d() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "374101000000608"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "1234"; - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Auth-019d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth020a1() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Auth-020a1") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth020a2() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = ""; - $card->cvnPresenceIndicator = CvnPresenceIndicator::ILLEGIBLE; - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Auth-020a2") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth020a3() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = ""; - $card->cvnPresenceIndicator = CvnPresenceIndicator::NOT_ON_CARD; - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Auth-020a3") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth020a4() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = ""; - $card->cvnPresenceIndicator = CvnPresenceIndicator::NOT_REQUESTED; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Auth-020a4") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testAuth020b() - { - $this->markTestSkipped('Exception not thrown'); - - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvnPresenceIndicator = 5; - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Auth-020b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth020c() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvnPresenceIndicator = 0; - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Auth-020c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth021a1() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Auth-021a1") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth021a2() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->authorize(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Auth-021a2") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth021a3() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->authorize(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Auth-021a3") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth021b() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->authorize(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Auth-021b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth021c() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->authorize(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Auth-021c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth022a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Auth-022a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth022b() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Auth-022b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth022c() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Auth-022c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth022d() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Auth-022d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth022e() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Auth-022e") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth023a1() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Auth-023a1") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth023a2() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Auth-023a2") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth023b1() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Auth-023b1") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth023c() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Auth-023c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth024a1() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Auth-024a1") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth024a2() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Auth-024a2") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth024a3() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Auth-024a3") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth024b() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Auth-024b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth024c() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Auth-024c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth025() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Auth-025") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth026a1() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Auth-026a1") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth026a2() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth026b() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth026c1() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIep3uviSnW9XEB3a4wpIW9XEB3a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth026c2() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Auth-026c2") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth027a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withCustomerId("123456") - ->withDescription("JAVA-Auth-027a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth028a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("123456") - ->withDescription("JAVA-Auth-028a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth028b() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Auth-028b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testAuth028c() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withCustomerId("3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep33a4wpQQQQQQQQQ1") - ->withDescription("JAVA-Auth-028c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testAuth028d() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("123456~") - ->withDescription("JAVA-Auth-028d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth029a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withProductId("123456") - ->withDescription("JAVA-Auth-029a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth029b() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Auth-029b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testAuth029c() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withProductId("3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep33a4wpQQQQQQQQQ1") - ->withDescription("JAVA-Auth-029c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testAuth029d() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withProductId("123456~") - ->withDescription("JAVA-Auth-029d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth030a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withClientTransactionId("123456") - ->withDescription("JAVA-Auth-030a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth030b() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Auth-030b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testAuth030c() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withClientTransactionId("3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep33a4wpQQQQQQQQQ1") - ->withDescription("JAVA-Auth-030c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testAuth030d() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withClientTransactionId("123456~") - ->withDescription("JAVA-Auth-030d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth031a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerIpAddress("123.123.123.123") - ->withDescription("JAVA-Auth-031a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth031b() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Auth-031b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testAuth031c1() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withCustomerIpAddress("1234.123.123.123") - ->withDescription("JAVA-Auth-031c1") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testAuth031c2() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerIpAddress("123~.123.123.123") - ->withDescription("JAVA-Auth-031c2") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth032a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "E77 4QJ"; - $billingAddress->country = "United Kingdom"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "Z76 PO9"; - $shippingAddress->country = "France"; - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Auth-032a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth033a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "774|10"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "769|52"; - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Auth-033a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth033b1() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "774|10"; - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withAddress($billingAddress) - ->withDescription("JAVA-Auth-033b1") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth033b2() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "769|52"; - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Auth-033b2") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testAuth033c1() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwep4wpIwep3u111"; - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withAddress($billingAddress) - ->withDescription("JAVA-Auth-033c1") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testAuth033c2() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwep4wpIwep3u111"; - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Auth-033c2") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth034a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Auth-034a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth034b1() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->country = "GB"; - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Auth-034b1") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth034b2() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->country = "GB"; - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withAddress($billingAddress) - ->withDescription("JAVA-Auth-034b2") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testAuth034c1() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->country = "3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwep4wpIwep3u111"; - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withAddress($billingAddress) - ->withDescription("JAVA-Auth-034c1") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testAuth034c2() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->country = "3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwep4wpIwep3u111"; - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Auth-034c2") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth035a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Auth-035a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth035b() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Auth-035b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testAuth055a() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "774|10"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "769|52"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withCustomerId("12345") - ->withProductId("654321") - ->withClientTransactionId("987654") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Auth-055a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testValidation002a() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-002a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testValidation002b() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-002b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testValidation002c1() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-002c1") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testValidation002c2() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-002c2") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testValidation002d() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->number = "V002625938386848"; - $card->expMonth = 12; - $card->expYear = 2020; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-002d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testValidation002e() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-002e") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testValidation002f() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->number = " 4002 6259 3838 6848"; - $card->expMonth = 12; - $card->expYear = 2020; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-002f") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testValidation002g() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-002g") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testValidation002h() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->number = ""; - $card->expMonth = 12; - $card->expYear = 2020; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-002h") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testValidation003a() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-003a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testValidation003b() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-003b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testValidation003c() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 20; - $card->expYear = 2012; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-003c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testValidation003d() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2015; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-003d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testValidation003e() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 11; - $card->expYear = 5; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-003e") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testValidation003f() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-003f") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testValidation003g() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 20; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-003g") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testValidation003h() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-003h") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testValidation003i() - { - $this->markTestSkipped('Exception not thrown'); - - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-003i") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testValidation004a() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-004a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testValidation004b() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "1234"; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-004b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testValidation004c() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "12345"; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-004c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testValidation004d() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->number = "374101000000608"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "1234"; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-004d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testValidation004e() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->number = "374101000000608"; - $card->expMonth = 12; - $card->expYear = 2020; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-004e") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testValidation004f() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvnPresenceIndicator = 0; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-004f") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testValidation004g() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvnPresenceIndicator = CvnPresenceIndicator::ILLEGIBLE; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-004g") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testValidation004h() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvnPresenceIndicator = CvnPresenceIndicator::NOT_ON_CARD; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-004h") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testValidation004i() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvnPresenceIndicator = CvnPresenceIndicator::NOT_REQUESTED; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-004i") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testValidation005a() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2015; - $card->cvn = "1234"; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-005a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testValidation005b() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-005b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testValidation005c() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "1234"; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-005c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testValidation005d() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2015; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-005d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testValidation005e() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2015; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-005e") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testValidation005f() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2015; - $card->cvn = "1234"; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-005f") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testValidation005g() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2015; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-005g") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testValidation005h() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "1234"; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-005h") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testValidation006a() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-006a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testValidation006b() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-006b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testValidation006c() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 11; - $card->expYear = 2015; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-006c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testValidation006d() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 11; - $card->expYear = 5; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-006d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testValidation006e() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "1234"; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-006e") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testValidation007a() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->number = "5425230000004415"; - $card->expMonth = 12; - $card->expYear = 2020; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-007a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testValidation007b() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->number = "5425230000004415"; - $card->expMonth = 12; - $card->expYear = 2020; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-007b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testValidation007d() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->number = "5425230000004415"; - $card->expMonth = 11; - $card->expYear = 2015; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-007d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testValidation007e() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->number = "5425230000004415"; - $card->expMonth = 11; - $card->expYear = 5; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-007e") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testValidation007f() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->number = "5425230000004415"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "1234"; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-007f") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testValidation008b() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->number = "374101000000608"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "1234"; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-008b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testValidation008c() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->number = "374101000000608"; - $card->expMonth = 11; - $card->expYear = 2015; - $card->cvn = "1234"; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-008c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testValidation008d() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->number = "374101000000608"; - $card->expMonth = 11; - $card->expYear = 5; - $card->cvn = "1234"; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-008d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testValidation009b() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->number = "30384800000000"; - $card->expMonth = 12; - $card->expYear = 2020; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-009b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testValidation009c() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->number = "30450100000000"; - $card->expMonth = 11; - $card->expYear = 2015; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-009c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testValidation009d() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "779|102"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "658|325"; - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->number = "30450100000000"; - $card->expMonth = 11; - $card->expYear = 5; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Validation-009d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testAVS001a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->StreetAddress1 = "Flat 123 House 456"; - $billingAddress->postalCode = "E77 4QJ"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "1"; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-AVS-001a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testAVS001b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->StreetAddress1 = "Flat #123 House No. 456"; - $billingAddress->postalCode = "E77 #4QJ"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "2"; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-AVS-001b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testAVS001c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->StreetAddress1 = "# Flat #123 House No. #456"; - $billingAddress->postalCode = "# E77 @~4 Q # J"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "3"; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-AVS-001c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testAVS001d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "4"; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-AVS-001d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testAVS001e() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->StreetAddress1 = "Lorem ipsum dolor sit 1amet; consectetur adipiscing elit. Aenean ali2quam tellus in elit hendrerit; non 3porttE77 4QJitor lorem venenatis. Pellentesque dictum eu nunc ac fringilla. In vitae quam eu odio sollicitudin rhoncus. Praesent ullamcorper eros vitae consequat tempus. In gravida viverra iaculis. Morbi dignissim orci et ipsum accumsan"; - $billingAddress->postalCode = "Lorem ipsum dolo1r sit amet; consectetur adipiscing elit. Aenean aliquam tellus in elit hendrerit; non porttE77 4QJitor lorem venenatis. Pellentesque dictum eu2 nunc ac fringilla. In vitae quam eu 3odio sollicitudin rhoncus. Praesent ullamcorper eros vitae consequat tempus. In gravida viverra iaculis. Morbi dignissim orci et ipsum accumsan"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "5"; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-AVS-001e") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testAVS001f() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->StreetAddress1 = "ABCDEFGHIJ"; - $billingAddress->postalCode = "ABCDEFGHIJ"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "6"; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-AVS-001f") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testAVS001g() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->StreetAddress1 = "Lorem ipsum dolor sit amet; consectetur adipiscing elit. Aenean aliquam tellus in elit hendrerit; non porttE77 4QJitor lorem venenatis. Pellentesque dictum eu nunc ac fringilla. In vitae quam eu odio sollicitudin rhoncus. Praesent ullamcorper eros vitae consequat tempus. In gravida viverra iaculis. Morbi dignissim orci et ipsum accumsan"; - $billingAddress->postalCode = "Lorem ipsum dolor sit amet; consectetur adipiscing elit. Aenean aliquam tellus in elit hendrerit; non porttE77 4QJitor lorem venenatis. Pellentesque dictum eu nunc ac fringilla. In vitae quam eu odio sollicitudin rhoncus. Praesent ullamcorper eros vitae consequat tempus. In gravida viverra iaculis. Morbi dignissim orci et ipsum accumsan"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "7"; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-AVS-001g") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testAVS003a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->StreetAddress1 = "Flat 123 House 456"; - $billingAddress->postalCode = "E77 4QJ"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "8"; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-AVS-003a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testAVS003b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->StreetAddress1 = "Flat 123 House 456"; - $billingAddress->postalCode = "E77 4QJ"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "9"; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-AVS-003b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testAVS003c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->StreetAddress1 = "Flat 123 House 456"; - $billingAddress->postalCode = "E77 4QJ"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "10"; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-AVS-003c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testAVS003d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->StreetAddress1 = "Flat 123 House 456"; - $billingAddress->postalCode = "E77 4QJ"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "11"; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-AVS-003d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testAVS003e() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->StreetAddress1 = "Flat 123 House 456"; - $billingAddress->postalCode = "E77 4QJ"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "12"; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-AVS-003e") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testAVS003f() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->StreetAddress1 = "Flat 123 House 456"; - $billingAddress->postalCode = "E77 4QJ"; - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "13"; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-AVS-003f") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testAVS003g() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "14"; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-AVS-003e") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testAVS003h() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "15"; - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("100") - ->withProductId("999") - ->withClientTransactionId("test") - ->withCustomerIpAddress("123.123.123.123") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-AVS-003f") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettleSample() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle006a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle006b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle006c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle006d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle006e() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle006f() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle006g() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle006h() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle006i() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle006k() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle007a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle007b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle007c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle007d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle007e() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle008a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle008b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle008c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle008d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle008e() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle009a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle009b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testSettle009c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOm"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testSettle009d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECO#"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle010c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle010d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle010e() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle011a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle011b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle011c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle011d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle012a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle012b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1.005) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1.005) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testSettle012c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture() - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testSettle012d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture() - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle012e() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1000) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1000) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testSettle012f() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture() - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle013a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testSettle013b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EURO") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EURO") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testSettle013c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EU#") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EU#") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle013d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle015a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle014a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle014b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle014c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle014d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle016a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle016b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle016c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-SettleAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle016d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle###") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testSettle017a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Settle") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testSettle017b() - { - $config = $this->getBaseConfig(); - $config->sharedSecret = 'secreto'; - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->authorize(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->capture(1) - ->withCurrency("EUR") - ->withDescription("SDK-JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testVoidSample() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("JAVA-Void") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testVoid006a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("JAVA-Void") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testVoid006b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("JAVA-Void") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testVoid006c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("JAVA-Void") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testVoid006d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("JAVA-Void") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testVoid006e() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("JAVA-Void") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testVoid006f() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("JAVA-Void") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testVoid006g() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("JAVA-Void") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testVoid006h() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("JAVA-Void") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testVoid006i() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("JAVA-Void") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testVoid006k() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("JAVA-Void") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testVoid007a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("JAVA-Void") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testVoid007b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("JAVA-Void") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testVoid007c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("JAVA-Void") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testVoid007d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("JAVA-Void") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testVoid007e() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("JAVA-Void") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testVoid008a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("JAVA-Void") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testVoid008b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("JAVA-Void") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testVoid008c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("JAVA-Void") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testVoid008d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("JAVA-Void") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testVoid009e() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "EC"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("JAVA-Void") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testVoid009a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("JAVA-Void") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testVoid009b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("JAVA-Void") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testVoid009c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOm"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("JAVA-Void") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testVoid009d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECO#"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("JAVA-Void") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testVoid010c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("JAVA-Void") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testVoid010d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("JAVA-Void") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testVoid010e() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("JAVA-Void") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testVoid011a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("JAVA-Void") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testVoid011b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("JAVA-Void") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testVoid011c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("JAVA-Void") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testVoid011d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("JAVA-Void") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testVoid012a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("JAVA-Void") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testVoid012b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("JAVA-Void") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testVoid012c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("JAVA-Void") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testVoid012d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("JAVA-Void") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testVoid013a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("JAVA-Void") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testVoid014a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("JAVA-Void") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testVoid014b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("JAVA-Void") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testVoid014c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("akshdfgakjdshfgjdshgfkjdsahgfjshagdfjshdagfkjdshgfjshdgfjdshgfkjhdsagfjdsgfdskjgfdsjkhgfdsjhgfkdsjgfkjdshgfkjdsahgfjdskhgfjhdsgfjkhsdgfjkhsdgfjhsdgfjhsdgfkjhgsadjfhgsakjdhgfsajdhgfkjsadgfjhsadgfjkhdsgafjhdsgfjhdsgfjhdsgfkjhdgsafjkhgsfjhsdagfkjsgdafjhsgdfjhgdskjfgdsjfhgjdskhgfjhdsgfjhdsgfkjhgdsfkjhgsdkjfgsdkjhgfkjsahgdfkjgdsajfhgdsjkgfjdshgfjkdsagfjkhdsgfjsdhgfjkdshgfkjhgdsfkjhgdskjfgdskjgfkjdsahgfjhgdsakjfgdsafjhgdsjkhgfkjdshgfakjadshgfjhdsagfjhgdsfjhgsdakjfgdsakjhgfjsdhgfjhdsgfjhdsgfkjgdsajkfhgjdshgfjdsahgfjkhdsagfjhdsgfjkgdsfjhdsgfjhgdsjfhgdsjhfgjdshgfkjdsgfkjsadgfjkgdsfkjhgdsajfkhgdsjkgfkjdsagfkjgdsakjfhgdsfjkhgdsafkjgsadkjgfdkjsahgfkjsagfkjdshgfkjshdgfjgdsfkjgsadkjhgfdsjhgfkjdsagfjhdsgfjhgdsakjfgdsakjhgfjsdahgfjkgdsfjhgdsajkhfgjhdsagfkjhsgdakjf") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testVoid014d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("SDK#####") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testVoid015a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("JAVA-Void") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testVoid015b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->void() - ->withDescription("JAVA-Void") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRebateSample() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRebate006a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRebate006b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRebate006c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRebate006d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRebate006e() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRebate006f() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRebate006g() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRebate006h() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRebate007a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRebate007b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRebate007c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRebate007d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRebate007e() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRebate008a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRebate008b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRebate008c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRebate008d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRebate008e() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRebate009a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testRebate009b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "EC"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testRebate009c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOm"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testRebate009d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECO#"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRebate010c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRebate010d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRebate010e() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRebate011a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testRebate011b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EURO") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EURO") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testRebate011c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EU##") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EU##") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testRebate011d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRebate012a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRebate012b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1.005) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1.005) - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testRebate012c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund() - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testRebate012d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund() - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRebate012e() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100000) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(100000) - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testRebate012f() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund() - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRebate013a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRebate013b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRebate013c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRebate013d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRebate014a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRebate014b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRebate014c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRebate014d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRebate015a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRebate016a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRebate016b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRebate016c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->withDescription("akshdfgakjdshfgjdshgfkjdsahgfjshagdfjshdagfkjdshgfjshdgfjdshgfkjhdsagfjdsgfdskjgfdsjkhgfdsjhgfkdsjgfkjdshgfkjdsahgfjdskhgfjhdsgfjkhsdgfjkhsdgfjhsdgfjhsdgfkjhgsadjfhgsakjdhgfsajdhgfkjsadgfjhsadgfjkhdsgafjhdsgfjhdsgfjhdsgfkjhdgsafjkhgsfjhsdagfkjsgdafjhsgdfjhgdskjfgdsjfhgjdskhgfjhdsgfjhdsgfkjhgdsfkjhgsdkjfgsdkjhgfkjsahgdfkjgdsajfhgdsjkgfjdshgfjkdsagfjkhdsgfjsdhgfjkdshgfkjhgdsfkjhgdskjfgdskjgfkjdsahgfjhgdsakjfgdsafjhgdsjkhgfkjdshgfakjadshgfjhdsagfjhgdsfjhgsdakjfgdsakjhgfjsdhgfjhdsgfjhdsgfkjgdsajkfhgjdshgfjdsahgfjkhdsagfjhdsgfjkgdsfjhdsgfjhgdsjfhgdsjhfgjdshgfkjdsgfkjsadgfjkgdsfkjhgdsajfkhgdsjkgfkjdsagfkjgdsakjfhgdsfjkhgdsafkjgsadkjgfdkjsahgfkjsagfkjdshgfkjshdgfjgdsfkjgsadkjhgfdsjhgfkjdsagfjhdsgfjhgdsakjfgdsakjhgfjsdahgfjkgdsfjhgdsajkhfgjhdsagfkjhsgdakjf") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRebate016d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->withDescription("SDK#####") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRebate017a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testRebate017b() - { - $config = $this->getBaseConfig(); - $config->sharedSecret = 'secreto'; - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(1) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Rebate") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTBSample() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB006a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB006b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB006c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB006d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB006e() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB006f() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB006g() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB006h() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB006i() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB006k() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->charge(1) - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB006l() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB007a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB007b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB007c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB007d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB007e() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB008a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB008b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB008c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB008d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB008e() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB009a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB009b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "EC"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB009c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB009d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB010c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB010d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB010e() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB012a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB012b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB012c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB012d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB012e() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB013a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB013b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testOTB013c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermeloooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB013d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB014a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB014b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testOTB014c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 18; - $card->expYear = 2012; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testOTB014d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = null; - $card->expYear = null; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB015a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB015b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB015c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB016a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB017a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testOTB017b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cvn = "1234"; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testOTB017c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cvn = "1.23457E+18"; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB017d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "374101000000608"; - $card->expMonth = 12; - $card->expYear = 2019; - $card->cvn = "1234"; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testOTB017f() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cvn = "7"; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testOTB017g() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cvn = "7"; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testOTB018a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testOTB018b() - { - $config = $this->getBaseConfig(); - $config->sharedSecret = 'secreto'; - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-OTB") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCreditSample() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit006a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit006b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit006c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit006d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit006e() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit006f() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit006g() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit006h() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit007a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit007b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit007c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit007d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit007e() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit008a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit008b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit008c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit008d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit008e() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit009a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit009b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "EC"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit009c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit009d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit010c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit010d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit010e() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit011a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit012a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit012b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit012c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit013a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit013b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testCredit013c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit014a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit014b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 1813; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit014c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 18; - $card->expYear = 2012; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit014d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = null; - $card->expYear = null; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit015a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit015b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit015c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit016a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit017a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit017b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testCredit017c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cvn = "123456789"; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit017d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "374101000000608"; - $card->expMonth = 12; - $card->expYear = 2018; - $card->cvn = "1234"; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testCredit017f() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4242424242424240"; - $card->expMonth = 12; - $card->expYear = 2018; - $card->cvn = "7"; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testCredit017g() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cvn = "12#"; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit018a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit018b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit018c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit018d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit019a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit019b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit019c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit020a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testCredit020b() - { - $config = $this->getBaseConfig(); - $config->sharedSecret = 'secreto'; - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit021a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit021b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1.005) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testCredit021c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund() - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testCredit021d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund() - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit021e() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(100000) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testCredit021f() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund() - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testCredit022a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EUR") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testCredit022b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EURO") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testCredit022c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withCurrency("EU#") - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testCredit022d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2018; - $card->cardHolderName = "Peter Watermelon"; - - // request - $response = $card->refund(1) - ->withDescription("JAVA-Credit") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testHoldSample() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::FRAUD) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testHold006a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::FRAUD) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testHold006b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::FRAUD) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testHold006c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::FRAUD) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testHold006d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::FRAUD) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testHold006e() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::FRAUD) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testHold006f() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::FRAUD) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testHold006g() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::FRAUD) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testHold006h() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::FRAUD) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testHold006i() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::FRAUD) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testHold006k() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::FRAUD) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testHold006l() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::FRAUD) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testHold007a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::FRAUD) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testHold007b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::FRAUD) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testHold007c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::FRAUD) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testHold007d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - ServicesContainer::configure($config); - - $saleResponse = Transaction::fromId(null); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::FRAUD) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testHold007e() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - ServicesContainer::configure($config); - - $saleResponse = Transaction::fromId(null); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::FRAUD) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testHold008a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::FRAUD) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testHold008b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::FRAUD) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testHold008c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - ServicesContainer::configure($config); - - $saleResponse = Transaction::fromId(null); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::FRAUD) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testHold008d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - ServicesContainer::configure($config); - - $saleResponse = Transaction::fromId(null); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::FRAUD) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testHold008e() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - ServicesContainer::configure($config); - - $saleResponse = Transaction::fromId(null); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::FRAUD) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testHold009c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::FRAUD) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testHold009d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - $saleResponse = Transaction::fromId(null); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::FRAUD) - ->withDescription("SDK-JAVA-Query") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testHold009e() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - $saleResponse = Transaction::fromId(null); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::FRAUD) - ->withDescription("SDK-JAVA-Query") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testHold010a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::FRAUD) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testHold010b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::FRAUD) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testHold010c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - $saleResponse = Transaction::fromId(null); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::FRAUD) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testHold010d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::FRAUD) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testHold011a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::FRAUD) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testHold011b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->hold() - ->withReasonCode(null) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testHold011c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->hold() - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testHold011d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->hold() - ->withReasonCode(null) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testHold012a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::FRAUD) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testHold012b() - { - $config = $this->getBaseConfig(); - $config->sharedSecret = 'secreto'; - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::FRAUD) - ->withDescription("SDK-JAVA-Query") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testHold013a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::FRAUD) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testHold013b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "EC"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::FRAUD) - ->withDescription("SDK-JAVA-Query") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testHold013c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOOOOOOOOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::FRAUD) - ->withDescription("SDK-JAVA-Query") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testReleaseSample() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // hold it first - $holdResponse = $saleResponse->hold() - ->withReasonCode(ReasonCode::OUT_OF_STOCK) - ->execute(); - $this->assertNotNull($holdResponse); - $this->assertEquals("00", $holdResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->release() - ->withReasonCode(ReasonCode::IN_STOCK) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRelease006a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // hold it first - $holdResponse = $saleResponse->hold() - ->withReasonCode(ReasonCode::OUT_OF_STOCK) - ->execute(); - $this->assertNotNull($holdResponse); - $this->assertEquals("00", $holdResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->release() - ->withReasonCode(ReasonCode::IN_STOCK) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRelease006b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // hold it first - $holdResponse = $saleResponse->hold() - ->withReasonCode(ReasonCode::OUT_OF_STOCK) - ->execute(); - $this->assertNotNull($holdResponse); - $this->assertEquals("00", $holdResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->release() - ->withReasonCode(ReasonCode::IN_STOCK) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRelease006c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // hold it first - $holdResponse = $saleResponse->hold() - ->withReasonCode(ReasonCode::OUT_OF_STOCK) - ->execute(); - $this->assertNotNull($holdResponse); - $this->assertEquals("00", $holdResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->release() - ->withReasonCode(ReasonCode::IN_STOCK) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRelease006d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // hold it first - $holdResponse = $saleResponse->hold() - ->withReasonCode(ReasonCode::OUT_OF_STOCK) - ->execute(); - $this->assertNotNull($holdResponse); - $this->assertEquals("00", $holdResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->release() - ->withReasonCode(ReasonCode::IN_STOCK) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRelease006e() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // hold it first - $holdResponse = $saleResponse->hold() - ->withReasonCode(ReasonCode::OUT_OF_STOCK) - ->execute(); - $this->assertNotNull($holdResponse); - $this->assertEquals("00", $holdResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->release() - ->withReasonCode(ReasonCode::IN_STOCK) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRelease006f() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // hold it first - $holdResponse = $saleResponse->hold() - ->withReasonCode(ReasonCode::OUT_OF_STOCK) - ->execute(); - $this->assertNotNull($holdResponse); - $this->assertEquals("00", $holdResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->release() - ->withReasonCode(ReasonCode::IN_STOCK) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRelease006g() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // hold it first - $holdResponse = $saleResponse->hold() - ->withReasonCode(ReasonCode::OUT_OF_STOCK) - ->execute(); - $this->assertNotNull($holdResponse); - $this->assertEquals("00", $holdResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->release() - ->withReasonCode(ReasonCode::IN_STOCK) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRelease006h() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // hold it first - $holdResponse = $saleResponse->hold() - ->withReasonCode(ReasonCode::OUT_OF_STOCK) - ->execute(); - $this->assertNotNull($holdResponse); - $this->assertEquals("00", $holdResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->release() - ->withReasonCode(ReasonCode::IN_STOCK) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRelease006i() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // hold it first - $holdResponse = $saleResponse->hold() - ->withReasonCode(ReasonCode::OUT_OF_STOCK) - ->execute(); - $this->assertNotNull($holdResponse); - $this->assertEquals("00", $holdResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->release() - ->withReasonCode(ReasonCode::IN_STOCK) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRelease006k() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // hold it first - $holdResponse = $saleResponse->hold() - ->withReasonCode(ReasonCode::OUT_OF_STOCK) - ->execute(); - $this->assertNotNull($holdResponse); - $this->assertEquals("00", $holdResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->release() - ->withReasonCode(ReasonCode::IN_STOCK) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRelease006l() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // hold it first - $holdResponse = $saleResponse->hold() - ->withReasonCode(ReasonCode::OUT_OF_STOCK) - ->execute(); - $this->assertNotNull($holdResponse); - $this->assertEquals("00", $holdResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->release() - ->withReasonCode(ReasonCode::IN_STOCK) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRelease007a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // hold it first - $holdResponse = $saleResponse->hold() - ->withReasonCode(ReasonCode::OUT_OF_STOCK) - ->execute(); - $this->assertNotNull($holdResponse); - $this->assertEquals("00", $holdResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->release() - ->withReasonCode(ReasonCode::IN_STOCK) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRelease007b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // hold it first - $holdResponse = $saleResponse->hold() - ->withReasonCode(ReasonCode::OUT_OF_STOCK) - ->execute(); - $this->assertNotNull($holdResponse); - $this->assertEquals("00", $holdResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->release() - ->withReasonCode(ReasonCode::IN_STOCK) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRelease007c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // hold it first - $holdResponse = $saleResponse->hold() - ->withReasonCode(ReasonCode::OUT_OF_STOCK) - ->execute(); - $this->assertNotNull($holdResponse); - $this->assertEquals("00", $holdResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->release() - ->withReasonCode(ReasonCode::IN_STOCK) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testRelease007d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - ServicesContainer::configure($config); - - $saleResponse = Transaction::fromId(null); - - // request - $response = $saleResponse->release() - ->withReasonCode(ReasonCode::IN_STOCK) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testRelease007e() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - ServicesContainer::configure($config); - - $saleResponse = Transaction::fromId(null); - - // request - $response = $saleResponse->release() - ->withReasonCode(ReasonCode::IN_STOCK) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testRelease008c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - ServicesContainer::configure($config); - - $saleResponse = Transaction::fromId(null); - - // request - $response = $saleResponse->release() - ->withReasonCode(ReasonCode::IN_STOCK) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testRelease008d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - ServicesContainer::configure($config); - - $saleResponse = Transaction::fromId(null); - - // request - $response = $saleResponse->release() - ->withReasonCode(ReasonCode::IN_STOCK) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testRelease008e() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - ServicesContainer::configure($config); - - $saleResponse = Transaction::fromId(null); - - // request - $response = $saleResponse->release() - ->withReasonCode(ReasonCode::IN_STOCK) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testRelease009d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - $saleResponse = Transaction::fromId(null); - - // request - $response = $saleResponse->release() - ->withReasonCode(ReasonCode::IN_STOCK) - ->withDescription("JAVA-Query") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testRelease009e() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - $saleResponse = Transaction::fromId(null); - - // request - $response = $saleResponse->release() - ->withReasonCode(ReasonCode::IN_STOCK) - ->withDescription("JAVA-Query") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRelease010a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::OTHER) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRelease010b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::FRAUD) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testRelease010c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - $saleResponse = Transaction::fromId(null); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::FRAUD) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRelease010d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::OTHER) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRelease011a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::OTHER) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRelease011b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->hold() - ->withReasonCode(null) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRelease011c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->hold() - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRelease011d() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->hold() - ->withReasonCode(null) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRelease012a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::OTHER) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testRelease012b() - { - $config = $this->getBaseConfig(); - $config->sharedSecret = 'secreto'; - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::OTHER) - ->withDescription("JAVA-Query") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testRelease013a() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::OTHER) - ->withDescription("JAVA-Hold") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testRelease013b() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "EC"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::OTHER) - ->withDescription("JAVA-Query") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testRelease013c() - { - $config = $this->getBaseConfig(); - $config->timeout = 5000; - $config->channel = "ECOOOOOOOOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $saleResponse->hold() - ->withReasonCode(ReasonCode::OTHER) - ->withDescription("JAVA-Query") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual006a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Manual-006a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual006b() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Manual-006b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual006c() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("USD") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Manual-006c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual006d() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Manual-006d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual006e() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Manual-006e") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual006f() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("USD") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Manual-006f") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual006g() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Manual-006g") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual006h() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Manual-006h") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual006i() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("USD") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Manual-006i") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual006j() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Manual-006j") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual006k() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Manual-006k") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual007a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Manual-007a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual007b() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Manual-007b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual007c() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("USD") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Manual-007c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual007d() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Manual-007d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual007e() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Manual-007e") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual008a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("USD") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Manual-008a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual008b() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Manual-008b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual008c() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Manual-008c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual008d() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("USD") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Manual-008d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual008e() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Manual-008e") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual009a() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOM"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Manual-009a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testManual009b() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "E"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("USD") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Manual-009b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testManual009c() - { - $config = $this->getBaseConfig(); - $config->timeout = 20000; - $config->channel = "ECOMMERCE"; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Manual-009c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual009d() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Manual-009d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual010a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("USD") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Manual-010a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual010b() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Manual-010b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual010c() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Manual-010c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual010d() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("USD") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Manual-010d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual010e() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Manual-010e") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual011a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Manual-011a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual011b() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("USD") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Manual-011b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual011c() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Manual-011c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testManual011d() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(10) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge() - ->withCurrency("EUR") - ->withDescription("JAVA-Manual-011d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual012a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("USD") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Manual-012a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testManual012b() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("EURO") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EURO") - ->withDescription("JAVA-Manual-012b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testManual012c() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("�UR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("�UR") - ->withDescription("JAVA-Manual-012c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testManual012d() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // request - $response = $card->charge(100.01) - ->withDescription("JAVA-Manual-012d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual013a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Manual-013a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual013b1() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Manual-013b1") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual013b2() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("USD") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Manual-013b2") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual013c() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Manual-013c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual014a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Manual-014a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual014b() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("USD") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Manual-014b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testManual014c() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - $card->cardHolderName = "3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep"; - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Manual-014c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual014d() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - $card->cardHolderName = "James~Mason"; - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Manual-014d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual015a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("USD") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Manual-015a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual015b() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Manual-015b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testManual015c() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 20; - $card->expYear = 2012; - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Manual-015c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testManual015d() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = null; - $card->expYear = null; - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("USD") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Manual-015d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual016a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Manual-016a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual016b() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Manual-016b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual016c() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("USD") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Manual-016c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual017a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Manual-017a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual018a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Manual-018a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual019a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("USD") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Manual-019a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testManual019b1() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "1234"; - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->ResponseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Manual-019b1") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->ResponseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testManual019b2() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "374101000000608"; - $card->expMonth = 12; - $card->expYear = 2020; - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->ResponseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Manual-019b2") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->ResponseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testManual019c() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "12345"; - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->ResponseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Manual-019c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->ResponseCode); - } - - public function testManual019d() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "374101000000608"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "1234"; - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("USD") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Manual-019d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual020a1() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Manual-020a1") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual020a2() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = ""; - $card->cvnPresenceIndicator = CvnPresenceIndicator::ILLEGIBLE; - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Manual-020a2") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual020a3() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = ""; - $card->cvnPresenceIndicator = CvnPresenceIndicator::NOT_ON_CARD; - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("USD") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Manual-020a3") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual020a4() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = ""; - $card->cvnPresenceIndicator = CvnPresenceIndicator::NOT_REQUESTED; - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Manual-020a4") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual020b() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvnPresenceIndicator = 5; - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Manual-020b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual020c() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = 0; - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("USD") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Manual-020c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual021a1() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Manual-021a1") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual021a2() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->Authorize(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Manual-021a2") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual021a3() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("USD") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->Authorize(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Manual-021a3") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual021b() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->Authorize(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Manual-021b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual021c() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("USD") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->Authorize(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Manual-021c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual022a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Manual-022a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual022b() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Manual-022b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual022c() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Manual-022c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual022d() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Manual-022d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual022e() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Manual-022e") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual023a1() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Manual-023a1") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual023a2() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("USD") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Manual-023a2") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual023b1() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Manual-023b1") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual023c() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Manual-023c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual024a1() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Manual-024a1") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual024a2() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("USD") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Manual-024a2") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual024a3() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Manual-024a3") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual024b() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Manual-024b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual024c() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("USD") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Manual-024c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual025() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Manual-025") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual026a1() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Manual-026a1") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual026a2() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual026b() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("USD") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual026c1() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIep3uviSnW9XEB3a4wpIW9XEB3a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual026c2() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Manual-026c2") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual027a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("USD") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withCustomerId("123456") - ->withDescription("JAVA-Manual-027a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual028a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("123456") - ->withDescription("JAVA-Manual-028a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual028b() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Manual-028b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testManual028c() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("USD") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withCustomerId("3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep33a4wpQQQQQQQQQ1") - ->withDescription("JAVA-Manual-028c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testManual028d() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerId("123456~") - ->withDescription("JAVA-Manual-028d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual029a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withProductId("123456") - ->withDescription("JAVA-Manual-029a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual029b() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("USD") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withDescription("JAVA-Manual-029b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testManual029c() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withProductId("3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep33a4wpQQQQQQQQQ1") - ->withDescription("JAVA-Manual-029c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testManual029d() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withProductId("123456~") - ->withDescription("JAVA-Manual-029d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual030a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("USD") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withClientTransactionId("123456") - ->withDescription("JAVA-Manual-030a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual030b() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Manual-030b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testManual030c() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withClientTransactionId("3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep33a4wpQQQQQQQQQ1") - ->withDescription("JAVA-Manual-030c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testManual030d() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("USD") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withClientTransactionId("123456~") - ->withDescription("JAVA-Manual-030d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual031a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerIpAddress("123.123.123.123") - ->withDescription("JAVA-Manual-031a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual031b() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Manual-031b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual031c1() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("USD") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withCustomerIpAddress("1234.123.123.123") - ->withDescription("JAVA-Manual-031c1") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual031c2() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withCustomerIpAddress("123~.123.123.123") - ->withDescription("JAVA-Manual-031c2") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual032a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "E77 4QJ"; - $billingAddress->country = "United Kingdom"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "Z76 PO9"; - $shippingAddress->country = "France"; - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Manual-032a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual033a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "774|10"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "769|52"; - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("USD") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Manual-033a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual033b1() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "774|10"; - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("USD") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withAddress($billingAddress) - ->withDescription("JAVA-Manual-033b1") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual033b2() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "769|52"; - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("USD") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Manual-033b2") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual033c1() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwep4wpIwep3u111"; - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("USD") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withAddress($billingAddress) - ->withDescription("JAVA-Manual-033c1") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual033c2() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwep4wpIwep3u111"; - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Manual-033c2") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual034a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->country = "GB"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->country = "FR"; - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withAddress($billingAddress) - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Manual-034a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual034b1() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->country = "GB"; - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("USD") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Manual-034b1") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual034b2() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->country = "GB"; - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withAddress($billingAddress) - ->withDescription("JAVA-Manual-034b2") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual034c1() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // billing address - $billingAddress = new Address(); - $billingAddress->country = "3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwep4wpIwep3u111"; - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withAddress($billingAddress) - ->withDescription("JAVA-Manual-034c1") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual034c2() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->country = "3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwep4wpIwep3u111"; - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("USD") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("USD") - ->withAddress($shippingAddress, AddressType::SHIPPING) - ->withDescription("JAVA-Manual-034c2") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual035a() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("GBP") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("GBP") - ->withDescription("JAVA-Manual-035a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testManual035b() - { - $config = $this->getBaseConfig(); - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - - // build transaction - $saleResponse = $card->charge(100.01) - ->withCurrency("EUR") - ->execute(); - $this->assertNotNull($saleResponse); - $this->assertEquals("00", $saleResponse->responseCode); - $this->tearDown(); - - // request - $response = $card->charge(100.01) - ->withCurrency("EUR") - ->withDescription("JAVA-Manual-035a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled014a() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001038443335"; - $card->expMonth = 10; - $card->expYear = 2025; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-014a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled014b() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001038488884"; - $card->expMonth = 10; - $card->expYear = 2025; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-014b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled014c() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001036298889"; - $card->expMonth = 10; - $card->expYear = 2025; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-014c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled014d() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001036853337"; - $card->expMonth = 10; - $card->expYear = 2025; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-014d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled014e() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 10; - $card->expYear = 2025; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-014e") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled014f() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037167778"; - $card->expMonth = 10; - $card->expYear = 2025; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-014f") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled014g() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 10; - $card->expYear = 2025; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-014g") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled014h() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037484447"; - $card->expMonth = 10; - $card->expYear = 2025; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-014h") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled014i() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037490006"; - $card->expMonth = 10; - $card->expYear = 2025; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-014i") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testverifyenrolled015a() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "5100000000000198�"; - $card->expMonth = 10; - $card->expYear = 2025; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-015a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled015b() - { - $this->markTestSkipped(); - - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "5100000000000149"; - $card->expMonth = 10; - $card->expYear = 2025; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-015b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled015c() - { - $this->markTestSkipped(); - - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "5100000000000172"; - $card->expMonth = 10; - $card->expYear = 2025; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-015c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled015d() - { - $this->markTestSkipped(); - - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "5100000000000297"; - $card->expMonth = 10; - $card->expYear = 2025; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-015d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled015e() - { - $this->markTestSkipped(); - - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "5100000000000131"; - $card->expMonth = 10; - $card->expYear = 2025; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-015e") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled015f() - { - $this->markTestSkipped(); - - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "5100000000000206"; - $card->expMonth = 10; - $card->expYear = 2025; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-015f") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled015g() - { - $this->markTestSkipped(); - - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "5100000000000131"; - $card->expMonth = 10; - $card->expYear = 2025; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-015g") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled015h() - { - $this->markTestSkipped(); - - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "5100000000000214"; - $card->expMonth = 10; - $card->expYear = 2025; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-015h") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled015i() - { - $this->markTestSkipped(); - - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "5100000000000164"; - $card->expMonth = 10; - $card->expYear = 2025; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-015i") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testverifyenrolled016a() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "370537726695896�"; - $card->expMonth = 10; - $card->expYear = 2025; - $card->cvn = "1234"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-016a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled016b() - { - $this->markTestSkipped(); - - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "344598846104303"; - $card->expMonth = 10; - $card->expYear = 2025; - $card->cvn = "1234"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-016b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled016c() - { - $this->markTestSkipped(); - - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "342911579886552"; - $card->expMonth = 10; - $card->expYear = 2025; - $card->cvn = "1234"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-016c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled016d() - { - $this->markTestSkipped(); - - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "377775599797356"; - $card->expMonth = 10; - $card->expYear = 2025; - $card->cvn = "1234"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-016d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled016e() - { - $this->markTestSkipped(); - - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "371810438025523"; - $card->expMonth = 10; - $card->expYear = 2025; - $card->cvn = "1234"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-016e") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled016f() - { - $this->markTestSkipped(); - - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "374973180958759"; - $card->expMonth = 10; - $card->expYear = 2025; - $card->cvn = "1234"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-016f") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled016g() - { - $this->markTestSkipped(); - - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "371810438025523"; - $card->expMonth = 10; - $card->expYear = 2025; - $card->cvn = "1234"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-016g") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled016h() - { - $this->markTestSkipped(); - - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "376515222233960"; - $card->expMonth = 10; - $card->expYear = 2025; - $card->cvn = "1234"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-016h") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled016i() - { - $this->markTestSkipped(); - - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "372749236937027"; - $card->expMonth = 10; - $card->expYear = 2025; - $card->cvn = "1234"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-016i") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled017a() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("GBP") - ->withDescription("JAVA-verifyenrolled-017a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled017b() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-017b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled017c() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("USD") - ->withDescription("JAVA-verifyenrolled-017c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled017d() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("GBP") - ->withDescription("JAVA-verifyenrolled-017d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled017e() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-017e") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled017f() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("USD") - ->withDescription("JAVA-verifyenrolled-017f") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled017g() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("GBP") - ->withDescription("JAVA-verifyenrolled-017g") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled017h() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-017h") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled017i() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("USD") - ->withDescription("JAVA-verifyenrolled-017i") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled017j() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("GBP") - ->withDescription("JAVA-verifyenrolled-017j") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled017k() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-017k") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled018a() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("GBP") - ->withDescription("JAVA-verifyenrolled-018a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled018b() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-018b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled018c() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("USD") - ->withDescription("JAVA-verifyenrolled-018c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled018d() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("GBP") - ->withDescription("JAVA-verifyenrolled-018d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled018e() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-018e") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled019a() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("USD") - ->withDescription("JAVA-verifyenrolled-019a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled019b() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("GBP") - ->withDescription("JAVA-verifyenrolled-019b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled019c() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-019c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled019d() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("USD") - ->withDescription("JAVA-verifyenrolled-019d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled019e() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("GBP") - ->withDescription("JAVA-verifyenrolled-019e") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled020b() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("GBP") - ->withDescription("JAVA-verifyenrolled-020b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled020c() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-020c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled020d() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("USD") - ->withDescription("JAVA-verifyenrolled-020d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled020e() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("GBP") - ->withDescription("JAVA-verifyenrolled-020e") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled021a() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-021a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled021b() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("USD") - ->withDescription("JAVA-verifyenrolled-021b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled021c() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("GBP") - ->withDescription("JAVA-verifyenrolled-021c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled021d() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-021d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled022a() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("USD") - ->withDescription("JAVA-verifyenrolled-022a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled022b() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EURO") - ->withDescription("JAVA-verifyenrolled-022b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled022c() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("�UR") - ->withDescription("JAVA-verifyenrolled-022c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled022d() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withDescription("JAVA-verifyenrolled-022d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled023a() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("GBP") - ->withDescription("JAVA-verifyenrolled-023a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled023b1() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-023b1") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testverifyenrolled023b2() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "42424242424"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("USD") - ->withDescription("JAVA-verifyenrolled-023b2") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testverifyenrolled023c() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4263970000005262#"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("GBP") - ->withDescription("JAVA-verifyenrolled-023c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled024a() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->CvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-024a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testverifyenrolled024b() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("USD") - ->withDescription("JAVA-verifyenrolled-024b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testverifyenrolled024c() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - $card->cardHolderName = "3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep3a4wpIwep3uviSnW9XEB3a4wpIwep3uviSnW9XEB3a4wpIwepeep"; - - // request - $response = $card->verify() - ->withCurrency("GBP") - ->withDescription("JAVA-verifyenrolled-024c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled024d() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - $card->cardHolderName = "James~Mason"; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-024d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled025a() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("USD") - ->withDescription("JAVA-verifyenrolled-025a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled025b() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("GBP") - ->withDescription("JAVA-verifyenrolled-025b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testverifyenrolled025c() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 20; - $card->expYear = 2012; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-025c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testverifyenrolled025d() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("USD") - ->withDescription("JAVA-verifyenrolled-025d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled026a() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("GBP") - ->withDescription("JAVA-verifyenrolled-026a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled026b() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-026b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled026c() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("USD") - ->withDescription("JAVA-verifyenrolled-026c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled027a() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("GBP") - ->withDescription("JAVA-verifyenrolled-027a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled028a() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-028a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled029a() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("USD") - ->withDescription("JAVA-verifyenrolled-029a") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testverifyenrolled029b1() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "1234"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("GBP") - ->withDescription("JAVA-verifyenrolled-029b1") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testverifyenrolled029b2() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "371810438025523"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("GBP") - ->withDescription("JAVA-verifyenrolled-029b2") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testverifyenrolled029c() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "12345"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-029c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled029d() - { - $this->markTestSkipped(); - - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "371810438025523"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "1234"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("USD") - ->withDescription("JAVA-verifyenrolled-029d") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled030a1() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = CvnPresenceIndicator::PRESENT; - - // request - $response = $card->verify() - ->withCurrency("GBP") - ->withDescription("JAVA-verifyenrolled-030a1") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled030a2() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = ""; - $card->cvnPresenceIndicator = CvnPresenceIndicator::ILLEGIBLE; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-030a2") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled030a3() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = ""; - $card->cvnPresenceIndicator = CvnPresenceIndicator::NOT_ON_CARD; - - // request - $response = $card->verify() - ->withCurrency("USD") - ->withDescription("JAVA-verifyenrolled-030a3") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled030a4() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = ""; - $card->cvnPresenceIndicator = CvnPresenceIndicator::NOT_REQUESTED; - - // request - $response = $card->verify() - ->withCurrency("GBP") - ->withDescription("JAVA-verifyenrolled-030a4") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testverifyenrolled030b() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = 5; - - // request - $response = $card->verify() - ->withCurrency("EUR") - ->withDescription("JAVA-verifyenrolled-030b") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - public function testverifyenrolled030c() - { - $config = $this->getBaseConfig(); - $config->timeout = 60000; - ServicesContainer::configure($config); - - // create card - $card = $this->getBaseCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 12; - $card->expYear = 2020; - $card->cvn = "123"; - $card->cvnPresenceIndicator = 0; - - // request - $response = $card->verify() - ->withCurrency("USD") - ->withDescription("JAVA-verifyenrolled-030c") - ->execute(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/CreditTest.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/CreditTest.php deleted file mode 100644 index 4102ced..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/CreditTest.php +++ /dev/null @@ -1,285 +0,0 @@ -number = '4111111111111111'; - $card->expMonth = 12; - $card->expYear = 2025; - $card->cvn = '123'; - $card->cardHolderName = 'Joe Smith'; - $this->card = $card; - - ServicesContainer::configure($this->getConfig()); - } - - public function testCreditAuthorization() - { - $authorization = $this->card->authorize(14) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($authorization); - $this->assertEquals('00', $authorization->responseCode); - - $capture = $authorization->capture(16) - ->withGratuity(2) - ->execute(); - $this->assertNotNull($capture); - $this->assertEquals('00', $capture->responseCode); - } - - public function testCreditServiceAuth() - { - $service = new CreditService( - $this->getConfig() - ); - - $authorization = $service->authorize(15) - ->withCurrency('USD') - ->withPaymentMethod($this->card) - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($authorization); - $this->assertEquals('00', $authorization->responseCode); - - $capture = $service->capture($authorization->transactionReference) - ->withAmount(17) - ->withGratuity(2) - ->execute(); - $this->assertNotNull($capture); - $this->assertEquals('00', $capture->responseCode); - } - - public function testCreditSale() - { - $response = $this->card->charge(15) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testCreditRefund() - { - $response = $this->card->refund(16) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testCreditRebate() - { - $response = $this->card->charge(17) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode, $response->responseMessage); - - $rebate = $response->refund(17) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($rebate); - $this->assertEquals('00', $rebate->responseCode, $rebate->responseMessage); - } - - public function testCreditVoid() - { - $response = $this->card->charge(15) - ->withCurrency('USD') - ->withAllowDuplicates(true) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode, $response->responseMessage); - - $voidResponse = $response->void()->execute(); - $this->assertNotNull($voidResponse); - $this->assertEquals('00', $voidResponse->responseCode, $voidResponse->responseMessage); - } - - public function testCreditVerify() - { - $response = $this->card->verify() - ->withAllowDuplicates(true) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - protected function getConfig() - { - $config = new ServicesConfig(); - $config->merchantId = 'heartlandgpsandbox'; - $config->accountId = 'api'; - $config->sharedSecret = 'secret'; - $config->rebatePassword = 'rebate'; - $config->refundPassword = 'refund'; - $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; - return $config; - } - - protected function dccSetup() - { - $config = new ServicesConfig(); - $config->merchantId = "heartlandgpsandbox"; - $config->accountId = "apidcc"; - $config->refundPassword = "refund"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; - - ServicesContainer::configure($config); - } - - public function testCreditGetDccInfo() - { - $this->dccSetup(); - - $this->card->number = '4002933640008365'; - $orderId = GenerationUtils::generateOrderId(); - - $dccDetails = $this->card->getDccRate(DccRateType::SALE, 10, 'USD', DccProcessor::FEXCO, $orderId); - - $this->assertNotNull($dccDetails); - $this->assertEquals('00', $dccDetails->responseCode, $dccDetails->responseMessage); - $this->assertNotNull($dccDetails->dccResponseResult); - } - - public function testCreditDccRateAuthorize() - { - $this->dccSetup(); - - $this->card->number = '4006097467207025'; - $orderId = GenerationUtils::generateOrderId(); - - $dccDetails = $this->card->getDccRate(DccRateType::SALE, 1001, 'EUR', DccProcessor::FEXCO, $orderId); - - $this->assertNotNull($dccDetails); - $this->assertEquals('00', $dccDetails->responseCode, $dccDetails->responseMessage); - $this->assertNotNull($dccDetails->dccResponseResult); - - //set Currency conversion rates - $dccValues = new DccRateData(); - $dccValues->orderId = $dccDetails->transactionReference->orderId; - $dccValues->dccProcessor = DccProcessor::FEXCO; - $dccValues->dccType = 1; - $dccValues->dccRateType = DccRateType::SALE; - $dccValues->currency = $dccDetails->dccResponseResult->cardHolderCurrency; - $dccValues->dccRate = $dccDetails->dccResponseResult->cardHolderRate; - $dccValues->amount = $dccDetails->dccResponseResult->cardHolderAmount; - - $response = $this->card->authorize(1001) - ->withCurrency('EUR') - ->withAllowDuplicates(true) - ->withDccRateData($dccValues) - ->withOrderId($orderId) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode, $response->responseMessage); - } - - public function testCreditDccRateCharge() - { - $this->dccSetup(); - - $this->card->number = '4006097467207025'; - $orderId = GenerationUtils::generateOrderId(); - - $dccDetails = $this->card->getDccRate(DccRateType::SALE, 1001, 'EUR', DccProcessor::FEXCO, $orderId); - - $this->assertNotNull($dccDetails); - $this->assertEquals('00', $dccDetails->responseCode, $dccDetails->responseMessage); - $this->assertNotNull($dccDetails->dccResponseResult); - - //set Currency conversion rates - $dccValues = new DccRateData(); - $dccValues->orderId = $dccDetails->transactionReference->orderId; - $dccValues->dccProcessor = DccProcessor::FEXCO; - $dccValues->dccType = 1; - $dccValues->dccRateType = DccRateType::SALE; - $dccValues->currency = $dccDetails->dccResponseResult->cardHolderCurrency; - $dccValues->dccRate = $dccDetails->dccResponseResult->cardHolderRate; - $dccValues->amount = $dccDetails->dccResponseResult->cardHolderAmount; - - $response = $this->card->charge(1001) - ->withCurrency('EUR') - ->withAllowDuplicates(true) - ->withDccRateData($dccValues) - ->withOrderId($orderId) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode, $response->responseMessage); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - * @expectedExceptionMessage Unexpected Gateway Response: 105 - Cannot find DCC information for that card - */ - public function testCreditDccInfoNotFound() - { - $this->dccSetup(); - - $this->card->number = '4002933640008365'; - $orderId = GenerationUtils::generateOrderId(); - - $dccDetails = $this->card->getDccRate(DccRateType::SALE, 10, 'EUR', DccProcessor::FEXCO, $orderId); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - * @expectedExceptionMessage Unexpected Gateway Response: 508 - Incorrect DCC information - doesn't correspond to dccrate request - */ - public function testCreditDccInfoMismatch() - { - $this->dccSetup(); - - $this->card->number = '4006097467207025'; - $orderId = GenerationUtils::generateOrderId(); - - $dccDetails = $this->card->getDccRate(DccRateType::SALE, 1001, 'EUR', DccProcessor::FEXCO, $orderId); - - $this->assertNotNull($dccDetails); - $this->assertEquals('00', $dccDetails->responseCode, $dccDetails->responseMessage); - $this->assertNotNull($dccDetails->dccResponseResult); - - $dccValues = new DccRateData(); - $dccValues->orderId = $dccDetails->transactionReference->orderId; - $dccValues->dccProcessor = DccProcessor::FEXCO; - $dccValues->dccType = 1; - $dccValues->dccRateType = DccRateType::SALE; - $dccValues->currency = $dccDetails->dccResponseResult->cardHolderCurrency; - $dccValues->dccRate = $dccDetails->dccResponseResult->cardHolderRate; - $dccValues->amount = $dccDetails->dccResponseResult->cardHolderAmount; - - $response = $this->card->authorize(100) - ->withCurrency('EUR') - ->withAllowDuplicates(true) - ->withDccRateData($dccValues) - ->withOrderId($orderId) - ->execute(); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/Hpp/RealexHppClient.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/Hpp/RealexHppClient.php deleted file mode 100644 index dc7bfd1..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/Hpp/RealexHppClient.php +++ /dev/null @@ -1,249 +0,0 @@ -sharedSecret = $sharedSecret; - } - - public function sendRequest($jsonData, $hppVersion = '') - { - $this->paymentData = GenerationUtils::decodeJson($jsonData, true, $hppVersion); - - $timestamp = $this->getValue('TIMESTAMP'); - $merchantId = $this->getValue('MERCHANT_ID'); - $account = $this->getValue('ACCOUNT'); - $orderId = $this->getValue('ORDER_ID'); - $amount = $this->getValue('AMOUNT'); - $currency = $this->getValue('CURRENCY'); - $autoSettle = $this->getValue('AUTO_SETTLE_FLAG'); - $requestHash = $this->getValue('SHA1HASH'); - $shippingCode = $this->getValue('SHIPPING_CODE'); - $shippingCountry = $this->getValue('SHIPPING_CO'); - $billingCode = $this->getValue('BILLING_CODE'); - $billingCountry = $this->getValue('BILLING_CO'); - - $config = new ServicesConfig(); - $config->merchantId = $merchantId; - $config->accountId = $account; - $config->sharedSecret = $this->sharedSecret; - $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; - $config->hostedPaymentConfig = new HostedPaymentConfig(); - $config->hostedPaymentConfig->language = "GB"; - $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; - $config->hostedPaymentConfig->version = $hppVersion; - - ServicesContainer::configure($config); - - // create the card object - $card = new CreditCardData(); - $card->number = '4006097467207025'; - $card->expMonth = 12; - $card->expYear = 2025; - $card->cvn = '131'; - $card->cardHolderName = 'James Mason'; - - // // check hash - $hashParam = [ - $timestamp, - $merchantId, - $orderId, - $amount, - $currency - ]; - - //for stored card - - if (!empty($this->paymentData['OFFER_SAVE_CARD'])) { - $hashParam[] = (!empty($this->paymentData['PAYER_REF'])) ? - $this->paymentData['PAYER_REF'] : null; - $hashParam[] = (!empty($this->paymentData['PMT_REF'])) ? - $this->paymentData['PMT_REF'] : null; - } - - $newHash = GenerationUtils::generateHash( - $this->sharedSecret, - implode('.', $hashParam) - ); - if ($newHash != $requestHash) { - throw new ApiException("Incorrect hash. Please check your code and the Developers Documentation."); - } - - // build request - if ($amount == null) { - $validate = $this->getValue("VALIDATE_CARD_ONLY"); - if ($validate) { - $gatewayRequest = $card->verify(); - } else { - $gatewayRequest = $card->verify()->WithRequestMultiUseToken(true); - } - } else { - $amount = $amount / 100; - if ($autoSettle) { - $gatewayRequest = $card->charge($amount); - } else { - $gatewayRequest = $card->authorize($amount); - } - } - - try { - $gatewayRequest - ->WithCurrency($currency) - ->WithOrderId($orderId) - ->withTimeStamp($timestamp); - - $this->addAddressDetails($gatewayRequest, $billingCode, $billingCountry, AddressType::BILLING); - $this->addAddressDetails($gatewayRequest, $shippingCode, $shippingCountry, AddressType::SHIPPING); - - //handle DCC - $this->addDCCInfo($gatewayRequest, $orderId); - - //handle fraud management - $this->addFraudManagementInfo($gatewayRequest, $orderId); - - $gatewayResponse = $gatewayRequest->execute(); - - if ($gatewayResponse->responseCode === '00') { - return $this->convertResponse($gatewayResponse); - } - } catch (ApiException $exc) { - throw $exc; - } - return null; - } - - public function getValue($value) - { - if (isset($this->paymentData[$value])) { - return $this->paymentData[$value]; - } - return null; - } - - public function addDCCInfo($gatewayRequest, $orderId) - { - if (!empty($this->paymentData['DCC_ENABLE'])) { - $dccInfo = $this->getValue('DCC_INFO'); - - $dccValues = new DccRateData(); - $dccValues->orderId = $orderId; - $dccValues->dccProcessor = $dccInfo['CCP']; - $dccValues->dccType = $dccInfo['TYPE']; - $dccValues->dccRateType = $dccInfo['RATE_TYPE']; - $dccValues->currency = $dccInfo['CURRENCY']; - $dccValues->dccRate = $dccInfo['RATE']; - $dccValues->amount = $dccInfo['AMOUNT']; - - $gatewayRequest - ->withDccRateData($dccValues); - } - } - - public function addFraudManagementInfo($gatewayRequest, $orderId) - { - if (!empty($this->paymentData['HPP_FRAUD_FILTER_MODE'])) { - $tssInfo = $this->getValue('TSS_INFO'); - - $this->addAddressDetails( - $gatewayRequest, - $tssInfo['BILLING_ADDRESS']['CODE'], - $tssInfo['BILLING_ADDRESS']['COUNTRY'], - AddressType::BILLING - ); - - $this->addAddressDetails( - $gatewayRequest, - $tssInfo['SHIPPING_ADDRESS']['CODE'], - $tssInfo['SHIPPING_ADDRESS']['COUNTRY'], - AddressType::SHIPPING - ); - - $gatewayRequest - ->withProductId($tssInfo['PRODID']) // prodid - ->withClientTransactionId($tssInfo['VARREF']) // varref - ->withCustomerId($tssInfo['CUSTNUM']) // custnum - ->withCustomerIpAddress($tssInfo['CUSTIPADDRESS']) - ->withFraudFilter($this->paymentData['HPP_FRAUD_FILTER_MODE']); - } - } - - public function addAddressDetails($gatewayRequest, $code, $country, $addressType = AddressType::BILLING) - { - if ($code != null || $country != null) { - $address = new Address(); - $address->postalCode = $code; - $address->country = $country; - - $gatewayRequest - ->WithAddress($address, $addressType); - } - } - - public function convertResponse($gatewayResponse) - { - $merchantId = $this->paymentData['MERCHANT_ID']; - $account = $this->paymentData['ACCOUNT']; - - $newHash = GenerationUtils::generateHash( - $this->sharedSecret, - implode('.', [ - $gatewayResponse->timestamp, - $merchantId, - $gatewayResponse->transactionReference->orderId, - $gatewayResponse->responseCode, - $gatewayResponse->responseMessage, - $gatewayResponse->transactionReference->transactionId, - $gatewayResponse->transactionReference->authCode - ]) - ); - - // begin building response - $response = [ - 'MERCHANT_ID' => $merchantId, - 'ACCOUNT' => $this->getValue('ACCOUNT'), - 'ORDER_ID' => $gatewayResponse->transactionReference->orderId, - 'TIMESTAMP' => $gatewayResponse->timestamp, - 'RESULT' => $gatewayResponse->responseCode, - 'PASREF' => $gatewayResponse->transactionReference->transactionId, - 'AUTHCODE' => $gatewayResponse->transactionReference->authCode, - 'AVSPOSTCODERESULT' => $gatewayResponse->avsResponseCode, - 'CVNRESULT' => $gatewayResponse->cvnResponseCode, - 'HPP_LANG' => $this->getValue('HPP_LANG'), - 'SHIPPING_CODE' => $this->getValue('SHIPPING_CODE'), - 'SHIPPING_CO' => $this->getValue('SHIPPING_CO'), - 'BILLING_CODE' => $this->getValue('BILLING_CODE'), - 'BILLING_CO' => $this->getValue('BILLING_CO'), - 'ECI' => $this->getValue('ECI'), - 'CAVV' => $this->getValue('CAVV'), - 'XID' => $this->getValue('XID'), - 'MERCHANT_RESPONSE_URL' => $this->getValue('MERCHANT_RESPONSE_URL'), - 'CARD_PAYMENT_BUTTON' => $this->getValue('CARD_PAYMENT_BUTTON'), - 'MESSAGE' => $gatewayResponse->responseMessage, - 'AMOUNT' => $this->getValue('AMOUNT'), - 'SHA1HASH' => $newHash, - 'DCC_INFO_REQUST' => $this->getValue('DCC_INFO'), - 'DCC_INFO_RESPONSE' => $gatewayResponse->dccResponseResult, - 'HPP_FRAUD_FILTER_MODE' => $this->getValue('HPP_FRAUD_FILTER_MODE'), - 'TSS_INFO' => $this->getValue('TSS_INFO') - ]; - - return json_encode($response); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/HppTest.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/HppTest.php deleted file mode 100644 index 66dace3..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/HppTest.php +++ /dev/null @@ -1,654 +0,0 @@ -merchantId = "heartlandgpsandbox"; - $config->accountId = "hpp"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; - $config->hostedPaymentConfig = new HostedPaymentConfig(); - $config->hostedPaymentConfig->language = "GB"; - $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; - - return new HostedService($config); - } - - public function testCreditAuth() - { - $config = new ServicesConfig(); - $config->merchantId = "heartlandgpsandbox"; - $config->accountId = "hpp"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; - $config->hostedPaymentConfig = new HostedPaymentConfig(); - $config->hostedPaymentConfig->language = "GB"; - $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; - - $client = new RealexHppClient("secret"); - - $address = new Address(); - $address->postalCode = "123|56"; - $address->country = "IRELAND"; - - //run test cases for different version - foreach ($this->hppVersionList as $hppVersion) { - $config->hostedPaymentConfig->version = $hppVersion; - $service = new HostedService($config); - - $json = $service->authorize(1) - ->withCurrency("EUR") - ->withCustomerId("123456") - ->withAddress($address) - ->serialize(); - - $this->assertNotNull($json); - - $response = $client->sendRequest($json, $hppVersion); - $this->assertNotNull($response); - - $parsedResponse = $service->parseResponse($response); - $this->assertEquals("00", $parsedResponse->responseCode); - } - } - - public function testCreditSale() - { - $config = new ServicesConfig(); - $config->merchantId = "heartlandgpsandbox"; - $config->accountId = "hpp"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; - $config->hostedPaymentConfig = new HostedPaymentConfig(); - $config->hostedPaymentConfig->language = "GB"; - $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; - - $client = new RealexHppClient("secret"); - - $address = new Address(); - $address->postalCode = "123|56"; - $address->country = "IRELAND"; - - //run test cases for different version - foreach ($this->hppVersionList as $hppVersion) { - $config->hostedPaymentConfig->version = $hppVersion; - $service = new HostedService($config); - - $json = $service->charge(1) - ->withCurrency("EUR") - ->withCustomerId("123456") - ->withAddress($address) - ->serialize(); - $this->assertNotNull($json); - - $response = $client->sendRequest($json, $hppVersion); - $this->assertNotNull($response); - - $parsedResponse = $service->parseResponse($response); - - $this->assertNotNull($parsedResponse); - $this->assertEquals("00", $parsedResponse->responseCode); - } - } - - /* 03. ProcessPaymentOtbRequest */ - - public function testCreditVerify() - { - $config = new ServicesConfig(); - $config->merchantId = "heartlandgpsandbox"; - $config->accountId = "hpp"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; - $config->hostedPaymentConfig = new HostedPaymentConfig(); - $config->hostedPaymentConfig->language = "GB"; - $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; - - $client = new RealexHppClient("secret"); - - $address = new Address(); - $address->postalCode = "123|56"; - $address->country = "IRELAND"; - - //run test cases for different version - foreach ($this->hppVersionList as $hppVersion) { - $config->hostedPaymentConfig->version = $hppVersion; - $service = new HostedService($config); - - $json = $service->verify() - ->withCurrency("EUR") - ->withCustomerId("123456") - ->withAddress($address) - ->serialize(); - $this->assertNotNull($json); - - $response = $client->sendRequest($json, $hppVersion); - $this->assertNotNull($response); - - $parsedResponse = $service->parseResponse($response); - $this->assertNotNull($parsedResponse); - $this->assertEquals("00", $parsedResponse->responseCode); - } - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testAuthNoAmount() - { - $service = $this->basicSetup(); - $service->authorize(null)->withCurrency("USD")->serialize(); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testAuthNoCurrency() - { - $service = $this->basicSetup(); - $service->authorize(10)->serialize(); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testSaleNoAmount() - { - $service = $this->basicSetup(); - $service->charge(null)->withCurrency("USD")->serialize(); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testSaleNoCurrency() - { - $service = $this->basicSetup(); - $service->charge(10)->serialize(); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testVerifyNoCurrency() - { - $service = $this->basicSetup(); - $service->verify()->serialize(); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testVerifyWithAmount() - { - $service = $this->basicSetup(); - $service->verify()->withAmount(10)->serialize(); - } - - /* 05. CardStorageCreatePayerStoreCardRequest */ - - public function testCardStorageCreatePayer() - { - $config = new ServicesConfig(); - $config->merchantId = "heartlandgpsandbox"; - $config->accountId = "3dsecure"; - $config->refundPassword = "refund"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; - $config->hostedPaymentConfig = new HostedPaymentConfig(); - $config->hostedPaymentConfig->language = "GB"; - $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; - - $client = new RealexHppClient("secret"); - - // data to be passed to the HPP along with transaction level settings - $hostedPaymentData = new HostedPaymentData(); - $hostedPaymentData->offerToSaveCard = "1"; // display the save card tick box - $hostedPaymentData->customerExists = "0"; // new customer - //run test cases for different version - foreach ($this->hppVersionList as $hppVersion) { - $config->hostedPaymentConfig->version = $hppVersion; - $service = new HostedService($config); - - $json = $service->charge(15) - ->withCurrency("EUR") - ->withHostedPaymentData($hostedPaymentData) - ->serialize(); - - $this->assertNotNull($json); - - $response = $client->sendRequest($json, $hppVersion); - $this->assertNotNull($response); - - $parsedResponse = $service->parseResponse($response); - $this->assertNotNull($parsedResponse); - $this->assertEquals("00", $parsedResponse->responseCode); - } - } - - /* 07. CardStorageDisplayStoredCardsRequest */ - - public function testCardStorageDisplayStoredCard() - { - $config = new ServicesConfig(); - $config->merchantId = "heartlandgpsandbox"; - $config->accountId = "3dsecure"; - $config->refundPassword = "refund"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; - $config->hostedPaymentConfig = new HostedPaymentConfig(); - $config->hostedPaymentConfig->language = "GB"; - $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; - - $client = new RealexHppClient("secret"); - - // data to be passed to the HPP along with transaction level settings - $hostedPaymentData = new HostedPaymentData(); - $hostedPaymentData->offerToSaveCard = "1"; - $hostedPaymentData->customerExists = "1"; - $hostedPaymentData->customerKey = "5e7e9152-2d53-466d-91bc-6d12ebc56b79"; - - //run test cases for different version - foreach ($this->hppVersionList as $hppVersion) { - $config->hostedPaymentConfig->version = $hppVersion; - $service = new HostedService($config); - - $json = $service->charge(15) - ->withCurrency("EUR") - ->withHostedPaymentData($hostedPaymentData) - ->serialize(); - - $this->assertNotNull($json); - - $response = $client->sendRequest($json, $hppVersion); - $this->assertNotNull($response); - - $parsedResponse = $service->parseResponse($response); - $this->assertNotNull($parsedResponse); - $this->assertEquals("00", $parsedResponse->responseCode); - } - } - - /* 09. ContinuousAuthorityRequest */ - - public function testContinuousAuthorityRequest() - { - $config = new ServicesConfig(); - $config->merchantId = "heartlandgpsandbox"; - $config->accountId = "3dsecure"; - $config->refundPassword = "refund"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; - $config->hostedPaymentConfig = new HostedPaymentConfig(); - $config->hostedPaymentConfig->language = "GB"; - $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; - - $client = new RealexHppClient("secret"); - - //run test cases for different version - foreach ($this->hppVersionList as $hppVersion) { - $config->hostedPaymentConfig->version = $hppVersion; - $service = new HostedService($config); - - $json = $service->charge(15) - ->withCurrency("EUR") - ->withRecurringInfo(RecurringType::FIXED, RecurringSequence::FIRST) - ->serialize(); - - $this->assertNotNull($json); - - $response = $client->sendRequest($json, $hppVersion); - $this->assertNotNull($response); - - $parsedResponse = $service->parseResponse($response); - $this->assertNotNull($parsedResponse); - $this->assertEquals("00", $parsedResponse->responseCode); - } - } - - /* 13. DynamicCurrencyConversionRequest */ - - public function testEnableDynamicCurrencyConversionRequest() - { - //set config for DCC - $config = new ServicesConfig(); - $config->merchantId = "MerchantId"; - $config->accountId = "internet"; - $config->refundPassword = "refund"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; - - $config->hostedPaymentConfig = new HostedPaymentConfig(); - $config->hostedPaymentConfig->language = "GB"; - $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; - $config->hostedPaymentConfig->version = HppVersion::VERSION_2; - $config->hostedPaymentConfig->directCurrencyConversionEnabled = "1"; - - $service = new HostedService($config); - $client = new RealexHppClient("secret"); - - //serialize the request - $json = $service->Charge(19) - ->withCurrency("EUR") - ->withTimestamp("20170725154824") - ->withOrderId('GTI5Yxb0SumL_TkDMCAxQA') - ->serialize(); - - $this->assertNotNull($json); - $this->assertEquals($json, '{"MERCHANT_ID":"MerchantId","ACCOUNT":"internet","ORDER_ID":"GTI5Yxb0SumL_TkDMCAxQA","AMOUNT":"1900","CURRENCY":"EUR","TIMESTAMP":"20170725154824","AUTO_SETTLE_FLAG":"1","DCC_ENABLE":"1","HPP_LANG":"GB","MERCHANT_RESPONSE_URL":"http:\/\/requestb.in\/10q2bjb1","HPP_VERSION":"2","SHA1HASH":"448d742db89b05ce97152beb55157c904f3839cc"}'); - } - - public function testDisableDynamicCurrencyConversionRequest() - { - //set config for DCC - $config = new ServicesConfig(); - $config->merchantId = "MerchantId"; - $config->accountId = "internet"; - $config->refundPassword = "refund"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; - - $config->hostedPaymentConfig = new HostedPaymentConfig(); - $config->hostedPaymentConfig->language = "GB"; - $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; - $config->hostedPaymentConfig->version = HppVersion::VERSION_2; - $config->hostedPaymentConfig->directCurrencyConversionEnabled = "0"; - - $service = new HostedService($config); - $client = new RealexHppClient("secret"); - - //serialize the request - $json = $service->Charge(19) - ->withCurrency("EUR") - ->withTimestamp("20170725154824") - ->withOrderId('GTI5Yxb0SumL_TkDMCAxQA') - ->serialize(); - - $this->assertNotNull($json); - $this->assertEquals($json, '{"MERCHANT_ID":"MerchantId","ACCOUNT":"internet","ORDER_ID":"GTI5Yxb0SumL_TkDMCAxQA","AMOUNT":"1900","CURRENCY":"EUR","TIMESTAMP":"20170725154824","AUTO_SETTLE_FLAG":"1","DCC_ENABLE":"0","HPP_LANG":"GB","MERCHANT_RESPONSE_URL":"http:\/\/requestb.in\/10q2bjb1","HPP_VERSION":"2","SHA1HASH":"448d742db89b05ce97152beb55157c904f3839cc"}'); - } - - /* 11. FraudManagementRequest */ - - public function testFraudManagementRequest() - { - $config = new ServicesConfig(); - $config->merchantId = "heartlandgpsandbox"; - $config->accountId = "3dsecure"; - $config->refundPassword = "refund"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; - $config->hostedPaymentConfig = new HostedPaymentConfig(); - $config->hostedPaymentConfig->language = "GB"; - $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; - $config->hostedPaymentConfig->version = 2; - $config->hostedPaymentConfig->FraudFilterMode = FraudFilterMode::PASSIVE; - - $service = new HostedService($config); - $client = new RealexHppClient("secret"); - - // billing address - $billingAddress = new Address(); - $billingAddress->postalCode = "50001|Flat 123"; - $billingAddress->country = "US"; - - // shipping address - $shippingAddress = new Address(); - $shippingAddress->postalCode = "654|123"; - $shippingAddress->country = "GB"; - - // data to be passed to the HPP along with transaction level settings - $hostedPaymentData = new HostedPaymentData(); - $hostedPaymentData->customerNumber = "E8953893489"; // display the save card tick box - $hostedPaymentData->productId = "SID9838383"; // new customer - - //serialize the request - $json = $service->charge(19) - ->withCurrency("EUR") - ->withAddress($billingAddress, AddressType::BILLING) - ->withAddress($shippingAddress, AddressType::SHIPPING) - //->withProductId("SID9838383") // prodid - ->withClientTransactionId("Car Part HV") // varref - //->withCustomerId("E8953893489") // custnum - ->withCustomerIpAddress("123.123.123.123") - //->withFraudFilter(FraudFilterMode::PASSIVE) - ->withHostedPaymentData($hostedPaymentData) - ->serialize(); - - $this->assertNotNull($json); - - //make API call - $response = $client->sendRequest($json, $config->hostedPaymentConfig->version); - $this->assertNotNull($response); - - $parsedResponse = $service->parseResponse($response); - $this->assertNotNull($parsedResponse); - $this->assertEquals("00", $parsedResponse->responseCode); - } - - /* Serialize methods Test case */ - - public function testBasicAuthHppVersion1() - { - $config = new ServicesConfig(); - $config->merchantId = "MerchantId"; - $config->accountId = "internet"; - $config->refundPassword = "refund"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://pay.sandbox.realexpayments.com/pay"; - $config->hostedPaymentConfig = new HostedPaymentConfig(); - $config->hostedPaymentConfig->language = "GB"; - $config->hostedPaymentConfig->responseUrl = "https://www.example.com/response"; - $config->hostedPaymentConfig->version = HppVersion::VERSION_1; - - $service = new HostedService($config); - $client = new RealexHppClient("secret"); - - $json = $service->authorize(19.99) - ->withCurrency("EUR") - ->withTimeStamp("20170725154824") - ->WithOrderId("GTI5Yxb0SumL_TkDMCAxQA") - ->serialize(); - - $expectedJson = '{"MERCHANT_ID":"TWVyY2hhbnRJZA==","ACCOUNT":"aW50ZXJuZXQ=","ORDER_ID":"R1RJNVl4YjBTdW1MX1RrRE1DQXhRQQ==","AMOUNT":"MTk5OQ==","CURRENCY":"RVVS","TIMESTAMP":"MjAxNzA3MjUxNTQ4MjQ=","AUTO_SETTLE_FLAG":"MA==","HPP_LANG":"R0I=","MERCHANT_RESPONSE_URL":"aHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vcmVzcG9uc2U=","HPP_VERSION":"MQ==","SHA1HASH":"MDYxNjA5Zjg1YThlMDE5MWRjN2Y0ODdmODI3OGU3MTg5OGEyZWUyZA=="}'; - $this->assertEquals($json, $expectedJson); - } - - public function testBasicAuthHppVersion2() - { - $config = new ServicesConfig(); - $config->merchantId = "MerchantId"; - $config->accountId = "internet"; - $config->refundPassword = "refund"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://pay.sandbox.realexpayments.com/pay"; - $config->hostedPaymentConfig = new HostedPaymentConfig(); - $config->hostedPaymentConfig->language = "GB"; - $config->hostedPaymentConfig->responseUrl = "https://www.example.com/response"; - $config->hostedPaymentConfig->version = HppVersion::VERSION_2; - - $service = new HostedService($config); - $client = new RealexHppClient("secret"); - - $json = $service->authorize(19.99) - ->withCurrency("EUR") - ->withTimeStamp("20170725154824") - ->WithOrderId("GTI5Yxb0SumL_TkDMCAxQA") - ->serialize(); - - $expectedJson = '{"MERCHANT_ID":"MerchantId","ACCOUNT":"internet","ORDER_ID":"GTI5Yxb0SumL_TkDMCAxQA","AMOUNT":"1999","CURRENCY":"EUR","TIMESTAMP":"20170725154824","AUTO_SETTLE_FLAG":"0","HPP_LANG":"GB","MERCHANT_RESPONSE_URL":"https:\/\/www.example.com\/response","HPP_VERSION":"2","SHA1HASH":"061609f85a8e0191dc7f487f8278e71898a2ee2d"}'; - $this->assertEquals($json, $expectedJson); - } - - public function testBasicSale() - { - $config = new ServicesConfig(); - $config->merchantId = "MerchantId"; - $config->accountId = "internet"; - $config->refundPassword = "refund"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://pay.sandbox.realexpayments.com/pay"; - $config->hostedPaymentConfig = new HostedPaymentConfig(); - $config->hostedPaymentConfig->language = "GB"; - $config->hostedPaymentConfig->responseUrl = "https://www.example.com/response"; - $config->hostedPaymentConfig->version = HppVersion::VERSION_2; - - $service = new HostedService($config); - $client = new RealexHppClient("secret"); - - $json = $service->charge(19.99) - ->withCurrency("EUR") - ->withTimeStamp("20170725154824") - ->WithOrderId("GTI5Yxb0SumL_TkDMCAxQA") - ->serialize(); - - $expectedJson = '{"MERCHANT_ID":"MerchantId","ACCOUNT":"internet","ORDER_ID":"GTI5Yxb0SumL_TkDMCAxQA","AMOUNT":"1999","CURRENCY":"EUR","TIMESTAMP":"20170725154824","AUTO_SETTLE_FLAG":"1","HPP_LANG":"GB","MERCHANT_RESPONSE_URL":"https:\/\/www.example.com\/response","HPP_VERSION":"2","SHA1HASH":"061609f85a8e0191dc7f487f8278e71898a2ee2d"}'; - $this->assertEquals($json, $expectedJson); - } - - public function testBasicHostedPaymentDataHppVersion1() - { - $config = new ServicesConfig(); - $config->merchantId = "MerchantId"; - $config->accountId = "internet"; - $config->refundPassword = "refund"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://pay.sandbox.realexpayments.com/pay"; - $config->hostedPaymentConfig = new HostedPaymentConfig(); - $config->hostedPaymentConfig->language = "GB"; - $config->hostedPaymentConfig->responseUrl = "https://www.example.com/response"; - $config->hostedPaymentConfig->version = HppVersion::VERSION_1; - - $service = new HostedService($config); - $client = new RealexHppClient("secret"); - - $hostedPaymentData = new HostedPaymentData(); - $hostedPaymentData->offerToSaveCard = "1"; // display the save card tick box - $hostedPaymentData->customerExists = "0"; // new customer - $hostedPaymentData->customerNumber = 'a028774f-beff-47bc-bd6e-ed7e04f5d758a028774f-btefa'; - $hostedPaymentData->productId = 'a0b38df5-b23c-4d82-88fe-2e9c47438972-b23c-4d82-88f'; - - $json = $service->charge(19.99) - ->withCurrency("EUR") - ->withTimeStamp("20170725154824") - ->WithOrderId("GTI5Yxb0SumL_TkDMCAxQA") - ->WithHostedPaymentData($hostedPaymentData) - ->WithDescription("Mobile Channel") - ->WithClientTransactionId("My Legal Entity") - ->serialize(); - - $expectedJson = '{"MERCHANT_ID":"TWVyY2hhbnRJZA==","ACCOUNT":"aW50ZXJuZXQ=","ORDER_ID":"R1RJNVl4YjBTdW1MX1RrRE1DQXhRQQ==","AMOUNT":"MTk5OQ==","CURRENCY":"RVVS","TIMESTAMP":"MjAxNzA3MjUxNTQ4MjQ=","AUTO_SETTLE_FLAG":"MQ==","COMMENT1":"TW9iaWxlIENoYW5uZWw=","CUST_NUM":"YTAyODc3NGYtYmVmZi00N2JjLWJkNmUtZWQ3ZTA0ZjVkNzU4YTAyODc3NGYtYnRlZmE=","OFFER_SAVE_CARD":"MQ==","PAYER_EXIST":"MA==","PROD_ID":"YTBiMzhkZjUtYjIzYy00ZDgyLTg4ZmUtMmU5YzQ3NDM4OTcyLWIyM2MtNGQ4Mi04OGY=","VAR_REF":"TXkgTGVnYWwgRW50aXR5","HPP_LANG":"R0I=","MERCHANT_RESPONSE_URL":"aHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vcmVzcG9uc2U=","HPP_VERSION":"MQ==","SHA1HASH":"NzExNmM0OTgyNjM2N2M2NTEzZWZkYzBjYzgxZTI0M2I4MDk1ZDc4Zg=="}'; - $this->assertEquals($json, $expectedJson); - } - - public function testBasicHostedPaymentDataHppVersion2() - { - $config = new ServicesConfig(); - $config->merchantId = "MerchantId"; - $config->accountId = "internet"; - $config->refundPassword = "refund"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://pay.sandbox.realexpayments.com/pay"; - $config->hostedPaymentConfig = new HostedPaymentConfig(); - $config->hostedPaymentConfig->language = "GB"; - $config->hostedPaymentConfig->responseUrl = "https://www.example.com/response"; - $config->hostedPaymentConfig->version = HppVersion::VERSION_2; - - $service = new HostedService($config); - $client = new RealexHppClient("secret"); - - $hostedPaymentData = new HostedPaymentData(); - $hostedPaymentData->offerToSaveCard = "1"; // display the save card tick box - $hostedPaymentData->customerExists = "0"; // new customer - $hostedPaymentData->customerNumber = 'a028774f-beff-47bc-bd6e-ed7e04f5d758a028774f-btefa'; - $hostedPaymentData->productId = 'a0b38df5-b23c-4d82-88fe-2e9c47438972-b23c-4d82-88f'; - - $json = $service->charge(19.99) - ->withCurrency("EUR") - ->withTimeStamp("20170725154824") - ->WithOrderId("GTI5Yxb0SumL_TkDMCAxQA") - ->WithHostedPaymentData($hostedPaymentData) - ->WithDescription("Mobile Channel") - ->WithClientTransactionId("My Legal Entity") - ->serialize(); - - $expectedJson = '{"MERCHANT_ID":"MerchantId","ACCOUNT":"internet","ORDER_ID":"GTI5Yxb0SumL_TkDMCAxQA","AMOUNT":"1999","CURRENCY":"EUR","TIMESTAMP":"20170725154824","AUTO_SETTLE_FLAG":"1","COMMENT1":"Mobile Channel","CUST_NUM":"a028774f-beff-47bc-bd6e-ed7e04f5d758a028774f-btefa","OFFER_SAVE_CARD":"1","PAYER_EXIST":"0","PROD_ID":"a0b38df5-b23c-4d82-88fe-2e9c47438972-b23c-4d82-88f","VAR_REF":"My Legal Entity","HPP_LANG":"GB","MERCHANT_RESPONSE_URL":"https:\/\/www.example.com\/response","HPP_VERSION":"2","SHA1HASH":"7116c49826367c6513efdc0cc81e243b8095d78f"}'; - $this->assertEquals($json, $expectedJson); - } - - public function testParseResponse() - { - $config = new ServicesConfig(); - $config->merchantId = "heartlandgpsandbox"; - $config->accountId = "hpp"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; - $config->hostedPaymentConfig = new HostedPaymentConfig(); - $config->hostedPaymentConfig->language = "GB"; - $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; - - $client = new RealexHppClient("secret"); - - $address = new Address(); - $address->postalCode = "123|56"; - $address->country = "IRELAND"; - - //run test cases for different version - foreach ($this->hppVersionList as $hppVersion) { - $config->hostedPaymentConfig->version = $hppVersion; - $service = new HostedService($config); - - $json = $service->authorize(1) - ->withCurrency("EUR") - ->withCustomerId("123456") - ->withAddress($address) - ->serialize(); - - $this->assertNotNull($json); - - $response = $client->sendRequest($json, $hppVersion); - $this->assertNotNull($response); - - // Base64 encode values - $iterator = new \RecursiveIteratorIterator(new \RecursiveArrayIterator(json_decode($response, true))); - foreach ($iterator as $key => $value) { - $iterator->getInnerIterator()->offsetSet($key, base64_encode($value)); - } - - $response = json_encode($iterator->getArrayCopy()); - - $parsedResponse = $service->parseResponse($response, true); - $this->assertEquals("00", $parsedResponse->responseCode); - } - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/HppTestCase.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/HppTestCase.php deleted file mode 100644 index 936d6e5..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/HppTestCase.php +++ /dev/null @@ -1,247 +0,0 @@ -merchantId = "heartlandgpsandbox"; - $config->accountId = "hpp"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; - - $config->hostedPaymentConfig = new HostedPaymentConfig(); - $config->hostedPaymentConfig->language = "GB"; - $config->hostedPaymentConfig->responseUrl = "http://requestb.in/10q2bjb1"; - return $config; - } - - public function setup() - { - $this->service = new HostedService($this->config()); - } - - /* 10. ThreedSecureResponse */ - - public function testThreedSecureResponse() - { - $config = new ServicesConfig(); - $config->merchantId = 'heartlandgpsandbox'; - $config->accountId = 'hpp'; - $config->sharedSecret = 'secret'; - $config->serviceUrl = 'https://pay.sandbox.realexpayments.com/pay'; - - $service = new HostedService( - $config - ); - - //response - // TODO: grab the response JSON from the client-side for example: - $responseJson = '{"MERCHANT_ID":"heartlandgpsandbox","ACCOUNT":"hpp","ORDER_ID":"OTA4NUEzOEEtMkE3RjU2RQ","TIMESTAMP":"20180724124150","RESULT":"00","PASREF":"15324325098818233","AUTHCODE":"12345","AVSPOSTCODERESULT":"U","CVNRESULT":"U","HPP_LANG":"GB","SHIPPING_CODE":null,"SHIPPING_CO":null,"BILLING_CODE":"123|56","BILLING_CO":"IRELAND","ECI":null,"CAVV":null,"XID":null,"MERCHANT_RESPONSE_URL":"http:\/\/requestb.in\/10q2bjb1","CARD_PAYMENT_BUTTON":null,"MESSAGE":"[ test system ] Authorised","AMOUNT":null,"SHA1HASH":"d1ff806b449b86375dbda74e2611760c348fcdeb","DCC_INFO_REQUST":null,"DCC_INFO_RESPONSE":null,"HPP_FRAUD_FILTER_MODE":null,"TSS_INFO":null}'; - - $parsedResponse = $service->parseResponse($responseJson); - $responseCode = $parsedResponse->responseCode; // 00 - $responseMessage = $parsedResponse->responseMessage; // [ test system ] Authorised - $responseValues = $parsedResponse->responseValues; // get values accessible by key - - $eci = $responseValues["ECI"]; // 5 - fully authenticated - $cavv = $responseValues["CAVV"]; // AAACBUGDZYYYIgGFGYNlAAAAAAA= - $xid = $responseValues["XID"]; // vJ9NXpFueXsAqeb4iAbJJbe+66s= - // TODO: update your application and display transaction outcome to the customer - - $this->assertNotEquals(null, $parsedResponse); - $this->assertEquals("00", $responseCode); - } - - /* 02. ProcessPaymentConsumeHppResponse */ - - public function testprocessPaymentConsumeResponse() - { - $config = new ServicesConfig(); - $config->merchantId = 'heartlandgpsandbox'; - $config->accountId = 'hpp'; - $config->sharedSecret = 'secret'; - $config->serviceUrl = 'https://pay.sandbox.realexpayments.com/pay'; - - $service = new HostedService($config); - - $responseJson = '{"MERCHANT_ID":"heartlandgpsandbox","ACCOUNT":"hpp","ORDER_ID":"NjMwNkMxMTAtMTA5RUNDRQ","TIMESTAMP":"20180720104340","RESULT":"00","PASREF":"15320798200414985","AUTHCODE":"12345","AVSPOSTCODERESULT":"U","CVNRESULT":"U","HPP_LANG":"GB","SHIPPING_CODE":null,"SHIPPING_CO":null,"BILLING_CODE":"123|56","BILLING_CO":"IRELAND","ECI":null,"CAVV":null,"XID":null,"MERCHANT_RESPONSE_URL":"http:\/\/requestb.in\/10q2bjb1","CARD_PAYMENT_BUTTON":null,"MESSAGE":"[ test system ] Authorised","AMOUNT":"100","SHA1HASH":"32628cf3f887ab9f4f1c547a10ac365c2168f0e2","DCC_INFO":null,"HPP_FRAUD_FILTER_MODE":null,"TSS_INFO":null}'; - - // create the response object from the response JSON - $parsedResponse = $service->parseResponse($responseJson); - - $orderId = $parsedResponse->orderId; // GTI5Yxb0SumL_TkDMCAxQA - $responseCode = $parsedResponse->responseCode; // 00 - $responseMessage = $parsedResponse->responseMessage; // [ test system ] Authorised - $responseValues = $parsedResponse->responseValues; // get values accessible by key - //$fraudFilterResult = $responseValues["HPP_FRAUDFILTER_RESULT"]; // PASS - - $this->assertNotEquals(null, $parsedResponse); - $this->assertEquals("00", $responseCode); - } - - /* 06. CardStorageCreatePayerStoreCardResponse */ - - public function testCardStorageCreatePayerStoreCardResponse() - { - $config = new ServicesConfig(); - $config->merchantId = 'heartlandgpsandbox'; - $config->accountId = 'hpp'; - $config->sharedSecret = 'secret'; - $config->serviceUrl = 'https://pay.sandbox.realexpayments.com/pay'; - - $service = new HostedService( - $config - ); - - // TODO: grab the response JSON from the client-side for example: - //sample response JSON: - $responseJson = '{"MERCHANT_ID":"heartlandgpsandbox","ACCOUNT":"3dsecure","ORDER_ID":"NTgxMkMzODUtNTEwMkNCMw","TIMESTAMP":"20180723110112","RESULT":"00","PASREF":"15323400720177562","AUTHCODE":"12345","AVSPOSTCODERESULT":"U","CVNRESULT":"U","HPP_LANG":"GB","SHIPPING_CODE":null,"SHIPPING_CO":null,"BILLING_CODE":null,"BILLING_CO":null,"ECI":null,"CAVV":null,"XID":null,"MERCHANT_RESPONSE_URL":"http:\/\/requestb.in\/10q2bjb1","CARD_PAYMENT_BUTTON":null,"MESSAGE":"[ test system ] Authorised","AMOUNT":"1500","SHA1HASH":"4c7a635401c57371a0931bb3a21a849181cc963d","DCC_INFO":null,"HPP_FRAUD_FILTER_MODE":null,"TSS_INFO":null}'; - - $parsedResponse = $service->parseResponse($responseJson); - $responseCode = $parsedResponse->responseCode; // 00 - $responseMessage = $parsedResponse->responseMessage; // [ test system ] Authorised - $responseValues = $parsedResponse->responseValues; // get values accessible by key - /* - // Payer Setup Details - $payerSetupResult = $responseValues["PAYER_SETUP"]; // 00 - $payerSetupMessage = $responseValues["PAYER_SETUP_MSG"]; // Successful - $payerReference = $responseValues["SAVED_PAYER_REF"]; // 5e7e9152-2d53-466d-91bc-6d12ebc56b79 - // Card Setup Details - $cardSetupResult = $responseValues["PMT_SETUP"]; // 00 - $cardSetupMessage = $responseValues["PMT_SETUP_MSG"]; // Successful - $cardReference = $responseValues["SAVED_PMT_REF"]; // ca68dcac-9af2-4d65-b06c-eb54667dcd4a - // Card Details Stored - $cardType = $responseValues["SAVED_PMT_TYPE"]; // MC - $cardDigits = $responseValues["SAVED_PMT_DIGITS"]; // 542523xxxx4415 - $cardExpiry = $responseValues["SAVED_PMT_EXPDATE"]; // 1025 - $cardName = $responseValues["SAVED_PMT_NAME"]; // James Mason - */ - // TODO: update your application and display transaction outcome to the customer - - $this->assertNotEquals(null, $parsedResponse); - $this->assertEquals("00", $responseCode); - } - - /* 08. CardStorageDisplayStoredCardsResponse */ - - public function testCardStorageDisplayStoredCardsResponse() - { - $config = new ServicesConfig(); - $config->merchantId = 'heartlandgpsandbox'; - $config->accountId = 'hpp'; - $config->sharedSecret = 'secret'; - $config->serviceUrl = 'https://pay.sandbox.realexpayments.com/pay'; - - $service = new HostedService( - $config - ); - - // TODO: grab the response JSON from the client-side for example: - //sample response JSON: - $responseJson = array("MERCHANT_ID" => "MerchantId", "ACCOUNT" => "internet", "ORDER_ID" => "GTI5Yxb0SumL_TkDMCAxQA", "AMOUNT" => "1999", "TIMESTAMP" => "20170725154824", "SHA1HASH" => "843680654f377bfa845387fdbace35acc9d95778", "RESULT" => "00", "AUTHCODE" => "12345", "CARD_PAYMENT_BUTTON" => "Place Order", "AVSADDRESSRESULT" => "M", "AVSPOSTCODERESULT" => "M", "BATCHID" => "445196", "MESSAGE" => "[ test system ] Authorised", "PASREF" => "15011597872195765", "CVNRESULT" => "M", "HPP_FRAUDFILTER_RESULT" => "PASS", "HPP_CHOSEN_PMT_REF" => "099efeb4-eda2-4fd7-a04d-29647bb6c51d", "HPP_EDITED_PMT_REF" => "037bd26a-c76b-4ee4-8063-376d8858f23d", "HPP_DELETED_PMT_REF" => "3db4c72c-cd95-4743-8070-f17e2b56b642"); - - $parsedResponse = $service->parseResponse(json_encode($responseJson)); - $responseCode = $parsedResponse->responseCode; // 00 - $responseMessage = $parsedResponse->responseMessage; // [ test system ] Authorised - $responseValues = $parsedResponse->responseValues; // get values accessible by key - // card used to complete payment, edited or deleted - $chosenCard = $responseValues["HPP_CHOSEN_PMT_REF"]; // 099efeb4-eda2-4fd7-a04d-29647bb6c51d - $editedCard = $responseValues["HPP_EDITED_PMT_REF"]; // 037bd26a-c76b-4ee4-8063-376d8858f23d - $deletedCard = $responseValues["HPP_DELETED_PMT_REF"]; // 3db4c72c-cd95-4743-8070-f17e2b56b642 - // TODO: update your application and display transaction outcome to the customer - - $this->assertNotEquals(null, $parsedResponse); - $this->assertEquals("00", $responseCode); - } - - /* 12. FraudManagementResponse */ - - public function testFraudManagementResponse() - { - $config = new ServicesConfig(); - $config->merchantId = 'heartlandgpsandbox'; - $config->accountId = 'hpp'; - $config->sharedSecret = 'secret'; - $config->serviceUrl = 'https://pay.sandbox.realexpayments.com/pay'; - - $service = new HostedService( - $config - ); - - // TODO: grab the response JSON from the client-side for example: - //sample response JSON: - $responseJson = array("MERCHANT_ID" => "MerchantId", "ACCOUNT" => "internet", "ORDER_ID" => "GTI5Yxb0SumL_TkDMCAxQA", "AMOUNT" => "1999", "TIMESTAMP" => "20170725154824", "SHA1HASH" => "843680654f377bfa845387fdbace35acc9d95778", "RESULT" => "00", "AUTHCODE" => "12345", "CARD_PAYMENT_BUTTON" => "Place Order", "AVSADDRESSRESULT" => "M", "AVSPOSTCODERESULT" => "M", "BATCHID" => "445196", "MESSAGE" => "[ test system ] Authorised", "PASREF" => "15011597872195765", "CVNRESULT" => "M", "HPP_FRAUDFILTER_RESULT" => "HOLD", "HPP_FRAUDFILTER_RULE_56257838-4590-4227-b946-11e061fb15fe" => "HOLD", "HPP_FRAUDFILTER_RULE_cf609cf9-9e5a-4700-ac69-8aa09c119305" => "PASS"); - ; - - $parsedResponse = $service->parseResponse(json_encode($responseJson)); - $responseCode = $parsedResponse->responseCode; // 00 - $responseValues = $parsedResponse->responseValues; // get values accessible by key - - $fraudFilterResult = $responseValues["HPP_FRAUDFILTER_RESULT"]; // HOLD - $cardRuleResult = $responseValues["HPP_FRAUDFILTER_RULE_56257838-4590-4227-b946-11e061fb15fe"]; // HOLD - $ipRuleResult = $responseValues["HPP_FRAUDFILTER_RULE_cf609cf9-9e5a-4700-ac69-8aa09c119305"]; // PASS - // TODO: update your application and display transaction outcome to the customer - - $this->assertNotEquals(null, $parsedResponse); - $this->assertEquals("00", $responseCode); - } - - /* 14. DynamicCurrencyConversionResponse */ - - public function testDynamicCurrencyConversionResponse() - { - $config = new ServicesConfig(); - $config->merchantId = 'heartlandgpsandbox'; - $config->accountId = 'hpp'; - $config->sharedSecret = 'secret'; - $config->serviceUrl = 'https://pay.sandbox.realexpayments.com/pay'; - - $service = new HostedService( - $config - ); - - // TODO: grab the response JSON from the client-side for example: - //sample response JSON: - $responseJson = '{"MERCHANT_ID":"heartlandgpsandbox","ACCOUNT":"apidcc","ORDER_ID":"NTQyQzgxREMtMzVFQzlDNw","TIMESTAMP":"20180724095953","RESULT":"00","PASREF":"15324227932436743","AUTHCODE":"12345","AVSPOSTCODERESULT":"U","CVNRESULT":"U","HPP_LANG":"GB","SHIPPING_CODE":null,"SHIPPING_CO":null,"BILLING_CODE":null,"BILLING_CO":null,"ECI":null,"CAVV":null,"XID":null,"MERCHANT_RESPONSE_URL":"http:\/\/requestb.in\/10q2bjb1","CARD_PAYMENT_BUTTON":null,"MESSAGE":"[ test system ] Authorised","AMOUNT":"100100","SHA1HASH":"320c7ddc49d292f5900c676168d5cc1f2a55306c","DCC_INFO_REQUST":{"CCP":"Fexco","TYPE":1,"RATE":"1.7203","RATE_TYPE":"S","AMOUNT":"172202","CURRENCY":"AUD"},"DCC_INFO_RESPONSE":{"cardHolderCurrency":"AUD","cardHolderAmount":"172202","cardHolderRate":"1.7203","merchantCurrency":"EUR","merchantAmount":"100100","marginRatePercentage":"","exchangeRateSourceName":"","commissionPercentage":"","exchangeRateSourceTimestamp":""},"HPP_FRAUD_FILTER_MODE":null,"TSS_INFO":null}'; - $parsedResponse = $service->parseResponse($responseJson); - - $responseCode = $parsedResponse->responseCode; // 00 - $responseValues = $parsedResponse->responseValues; // get values accessible by key - - $conversionProcessor = $responseValues['DCC_INFO_REQUST']["CCP"]; // fexco - $conversionRate = $responseValues['DCC_INFO_REQUST']["RATE"]; // 1.7203 - $merchantAmount = $responseValues['DCC_INFO_RESPONSE']["merchantAmount"]; // 1999 - $cardholderAmount = $responseValues['DCC_INFO_RESPONSE']["cardHolderAmount"]; // 3439 - $merchantCurrency = $responseValues['DCC_INFO_RESPONSE']["merchantCurrency"]; // EUR - $cardholderCurrency = $responseValues['DCC_INFO_RESPONSE']["cardHolderCurrency"]; // AUD - $marginPercentage = $responseValues['DCC_INFO_RESPONSE']["marginRatePercentage"]; // 3.75 - $exchangeSource = $responseValues['DCC_INFO_RESPONSE']["exchangeRateSourceName"]; // REUTERS WHOLESALE INTERBANK - $commissionPercentage = $responseValues['DCC_INFO_RESPONSE']["commissionPercentage"]; // 0 - $exchangeTimestamp = $responseValues['DCC_INFO_RESPONSE']["exchangeRateSourceTimestamp"]; // 20170518162700 - // TODO: update your application and display transaction outcome to the customer - $this->assertNotEquals(null, $parsedResponse); - $this->assertEquals("00", $responseCode); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/Realex3dSecureTests.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/Realex3dSecureTests.php deleted file mode 100644 index 104641d..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/Realex3dSecureTests.php +++ /dev/null @@ -1,500 +0,0 @@ -getConfig()); - } - - protected function getConfig() - { - $config = new ServicesConfig(); - $config->merchantId = 'heartlandgpsandbox'; - $config->accountId = '3dsecure'; - $config->sharedSecret = 'secret'; - $config->rebatePassword = 'rebate'; - $config->refundPassword = 'refund'; - $config->serviceUrl = 'https://api.sandbox.realexpayments.com/epage-remote.cgi'; - return $config; - } - - public function testAcsClient() - { - $authClient = new ThreeDSecureAcsClient('https://pit.3dsecure.net/VbVTestSuiteService/pit1/acsService/paReq?summary=MTNmMzI4NzgtNTdmZi00OWEzLWJhZTAtYzFhNzAxMDJkMGNi'); - $this->assertNotNull($authClient->authenticate('eJxlUsFSwjAQvfsVTO82TSm0MNs4FVBwRkUF8ZomK1Rpimkr6NebYBEdc8jsy27evrwNnO3ydesddZkVKnao6zktVKKQmVrGznx2cRo5Z+wEZiuNOHxAUWtkcI1lyZfYymTs+KIjZYRt30tl0H2WPRpFIuQyDULsdTvoMJgm9/jGoOnCTBPXB3KAhk2LFVcVAy7ezic3LAgD2ouANBBy1JMh6zULyDcGxXNkK+S6WnMll5vS7GmxA7JPgChqVekPFgUekAOAWq/Zqqo2ZZ+Q7Xbr/r/visKtX4HYSiBHcdPaRqVh3mWSJcM7Nb7t0O1iGs6n7cXnI025N7hSk1EMxFaA5BUy36MhpX7Y8r1+J+hTI39/Djy3kqwZRl4DYGN7JE3GJn4fgDFfm+EcnnRAgLtNodBUGFd/YiBHwYOx9VZUxrVxdjEb1aPXy5f5k27Tmzo/v75N4ti6vS+wbJlxikb0m84CIJaCNIMkzfxN9OdffAF4VML9')); - } - - public function testMerchantDataEnumerator() - { - $keys = ['Key1', 'Key2', 'Key3']; - $values = ['Value1', 'Value2', 'Value3']; - - $merchantData = new MerchantDataCollection(); - for ($i=0; $i<3; $i++) { - $merchantData->add($keys[$i], $values[$i]); - } - - $this->assertEquals(3, $merchantData->count()); - - foreach ($merchantData->getKeys() as $key) { - $this->assertTrue(in_array($key, $keys)); - $this->assertTrue(in_array($merchantData->get($key), $values)); - } - } - - public function testMerchantDataWithHiddenValues() - { - $card = new CreditCardData(); - $card->number = 4012001037141112; - $card->expMonth = 12; - $card->expYear = 2025; - $card->cardHolderName = 'James Mason'; - - $enrolled = $card->verifyEnrolled(100, 'USD'); - $this->assertNotNull($enrolled); - if ($enrolled) { - $merchantData = $card->threeDSecure->getMerchantData(); - - $this->assertNotNull($merchantData); - $this->assertEquals(0, $merchantData->count()); - - $this->assertNull($merchantData->get('amount')); - $this->assertNull($merchantData->get('currency')); - $this->assertNull($merchantData->get('orderId')); - - for ($i=0; $i<3; $i++) { - $merchantData->add('Key'.$i, 'Value'.$i); - - $this->assertNotNull($merchantData->get('Key'.$i)); - $this->assertEquals('Value'.$i, $merchantData->get('Key'.$i)); - } - - $this->assertEquals(3, $merchantData->count()); - } - } - - public function testMerchantDataEncryptAndDecrypt() - { - $merchantData = new MerchantDataCollection(); - $merchantData->add('customerId', '12345'); - $merchantData->add('invoiceNumber', '54321'); - - $encoder = function ($input) { - $encoded = sprintf('%s.%s', $input, 'secret'); - return base64_encode($encoded); - }; - - $encrypted = $merchantData->toString($encoder); - - $decoder = function ($input) { - $decoded = explode('.', (string)base64_decode($input)); - $this->assertEquals('secret', $decoded[1]); - return $decoded[0]; - }; - - $decrypted = $merchantData->parse($encrypted, $decoder); - - $this->assertNotNull($decrypted); - $this->assertNotNull($decrypted->get('customerId')); - $this->assertEquals('12345', $decrypted->get('customerId')); - $this->assertNotNull($decrypted->get('invoiceNumber')); - $this->assertEquals('54321', $decrypted->get('invoiceNumber')); - } - - public function testMerchantDataMultiKey() - { - $this->expectExceptionMessage('Cannot access private property GlobalPayments\Api\Entities\MerchantDataCollection::$collection'); - - $mcd = new MerchantDataCollection(); - array_push($mcd->collection, array('amount'=>'10')); - array_push($mcd->collection, array('amount'=>'10')); - } - - public function testFullCycleWithMerchantData() - { - $card = new CreditCardData(); - $card->number = 4012001037141112; - $card->expMonth = 12; - $card->expYear = 2025; - $card->cardHolderName = 'John Smith'; - - $enrolled = $card->verifyEnrolled(1, 'USD'); - if ($enrolled) { - $secureEcom = $card->threeDSecure; - if (!empty($secureEcom)) { - $merchantData = new MerchantDataCollection(); - $merchantData->add('client_txn_id', '123456'); - - $authClient = new ThreeDSecureAcsClient($secureEcom->issuerAcsUrl); - $authResponse = $authClient->authenticate($secureEcom->payerAuthenticationRequest, (string)$secureEcom->getMerchantData()->toString()); - - $payerAuthenticationResponse = $authResponse->getAuthResponse(); - $md = MerchantDataCollection::parse($authResponse->getMerchantData()); - - if ($card->verifySignature($payerAuthenticationResponse, $md)) { - $response = $card->charge(1) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } else { - $this->fail('Signature verification failed.'); - } - } else { - $this->fail('Secure3Data was null.'); - } - } else { - $this->fail('Card not enrolled.'); - } - } - - public function testFullCycleWithNoMerchantData() - { - $card = new CreditCardData(); - $card->number = 4012001037141112; - $card->expMonth = 12; - $card->expYear = 2025; - $card->cardHolderName = 'James Mason'; - - $amount = 100; - $currency = 'USD'; - $orderId = GenerationUtils::generateOrderId(); - - $enrolled = $card->verifyEnrolled($amount, $currency, $orderId); - - if ($enrolled) { - $secureEcom = $card->threeDSecure; - - if ($secureEcom != null) { - $authClient = new ThreeDSecureAcsClient($secureEcom->issuerAcsUrl); - $authResponse = $authClient->authenticate($secureEcom->payerAuthenticationRequest, (string)$secureEcom->getMerchantData()->toString()); - - $payerAuthenticationResponse = $authResponse->getAuthResponse(); - - if ($card->verifySignature($payerAuthenticationResponse, null, $amount, $currency, $orderId)) { - $response = $card->charge($amount) - ->withCurrency($currency) - ->withOrderId($orderId) - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } else { - $this->fail('Signature verification failed.'); - } - } else { - $this->fail('Secure3Data was null.'); - } - } else { - $this->fail('Card not enrolled.'); - } - } - - public function testVerifyEnrolledTrue() - { - $card = new CreditCardData(); - $card->number = 4012001037141112; - $card->expMonth = 12; - $card->expYear = 2025; - $card->cardHolderName = 'John Smith'; - - $enrolled = $card->verifyEnrolled(1, 'USD'); - $this->assertTrue($enrolled); - $this->assertNotNull($card->threeDSecure); - $this->assertNotNull($card->threeDSecure->payerAuthenticationRequest); - $this->assertNotNull($card->threeDSecure->issuerAcsUrl); - $this->assertNotNull($card->threeDSecure->xid); - } - - public function testVerifyEnrolledFalse() - { - $card = new CreditCardData(); - $card->number = 4012001038443335; - $card->expMonth = 12; - $card->expYear = 2025; - $card->cardHolderName = 'John Smith'; - - $enrolled = $card->verifyEnrolled(1, 'USD'); - $this->assertFalse($enrolled); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testVerifySignatureBadOrderId() - { - $card = new CreditCardData(); - $card->verifySignature('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', null, 1, 'USD', 'orderId'); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testVerifySignatureNoPaymentResponse() - { - $card = new CreditCardData(); - $card->verifySignature(null); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testVerifySignatureNoAmount() - { - $card = new CreditCardData(); - $card->verifySignature('paymentResponse', null, null, 'USD', 'orderId'); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testVerifySignatureNoCurrency() - { - $card = new CreditCardData(); - $card->verifySignature('paymentResponse', null, 10, null, 'orderId'); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - */ - public function testVerifySignatureNoOrderId() - { - $card = new CreditCardData(); - $card->verifySignature('paymentResponse', null, 10, 'USD', null); - } - - public function testAuthorize3dSecure() - { - $secureEcom = new ThreeDSecure(); - $secureEcom->cavv = 'AAACBllleHchZTBWIGV4AAAAAAA='; - $secureEcom->xid = 'crqAeMwkEL9r4POdxpByWJ1/wYg='; - $secureEcom->eci = '5'; - - $card = new CreditCardData(); - $card->number = 4012001037141112; - $card->expMonth = 12; - $card->expYear = 2025; - $card->cardHolderName = 'Philip Marlowe'; - $card->threeDSecure = $secureEcom; - - $response = $card->charge(10) - ->withCurrency('EUR') - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testCardHolderNotEnrolled() - { - $card = new CreditCardData(); - $card->number = 4012001038443335; - $card->expMonth = 12; - $card->expYear = 2025; - $card->cardHolderName = 'John Smith'; - - $enrolled = $card->verifyEnrolled(10, 'USD'); - $this->assertFalse($enrolled); - $this->assertNotNull($card->threeDSecure); - $this->assertEquals('6', $card->threeDSecure->eci); - - // .net test does not have amount or currency but validation would not allow this - $response = $card->charge(10) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testUnableToVerifyEnrollment() - { - $card = new CreditCardData(); - $card->number = 4012001038488884; - $card->expMonth = 12; - $card->expYear = 2025; - $card->cardHolderName = 'John Smith'; - - $enrolled = $card->verifyEnrolled(10, 'USD'); - $this->assertFalse($enrolled); - $this->assertNotNull($card->threeDSecure); - $this->assertEquals('7', $card->threeDSecure->eci); - - $response = $card->charge(10) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testInvalidResponseFromEnrollmentServer() - { - $card = new CreditCardData(); - $card->number = 4012001036298889; - $card->expMonth = 12; - $card->expYear = 2025; - $card->cardHolderName = 'John Smith'; - - $card->verifyEnrolled(10, 'USD'); - } - - public function testCardHolderIsEnrolledACSAuthFailed() - { - $card = new CreditCardData(); - $card->number = 4012001036853337; - $card->expMonth = 12; - $card->expYear = 2025; - $card->cardHolderName = 'John Smith'; - - $enrolled = $card->verifyEnrolled(10, 'USD'); - $this->assertTrue($enrolled); - - $secureEcom = $card->threeDSecure; - $authClient = new ThreeDSecureAcsClient($secureEcom->issuerAcsUrl); - $authResponse = $authClient->authenticate($secureEcom->payerAuthenticationRequest, $secureEcom->getMerchantData()->toString()); - - // $payerAuthenticationResponse = $authResponse->parse(); - $payerAuthenticationResponse = $authResponse->getAuthResponse(); - $md = MerchantDataCollection::parse($authResponse->getMerchantData()); - - $verified = $card->verifySignature($payerAuthenticationResponse, $md); - $this->assertFalse($verified); - $this->assertNotNull($card->threeDSecure); - $this->assertEquals(7, $card->threeDSecure->eci); - - $response = $card->charge(10) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testCardHolderIsEnrolledACSAcknowledged() - { - $card = new CreditCardData(); - $card->number = 4012001037167778; - $card->expMonth = 12; - $card->expYear = 2025; - $card->cardHolderName = 'John Smith'; - - $enrolled = $card->verifyEnrolled(10, 'USD'); - $this->assertTrue($enrolled); - - $secureEcom = $card->threeDSecure; - $authClient = new ThreeDSecureAcsClient($secureEcom->issuerAcsUrl); - $authResponse = $authClient->authenticate($secureEcom->payerAuthenticationRequest, $secureEcom->getMerchantData()->toString()); - - // $payerAuthenticationResponse = $authResponse->parse(); - $payerAuthenticationResponse = $authResponse->getAuthResponse(); - $md = MerchantDataCollection::parse($authResponse->getMerchantData()); - - $verified = $card->verifySignature($payerAuthenticationResponse, $md); - $this->assertTrue($verified); - $this->assertEquals('A', $card->threeDSecure->status); - - $response = $card->charge(10) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testCardHolderIsEnrolledACSFailed() - { - $card = new CreditCardData(); - $card->number = 4012001037461114; - $card->expMonth = 12; - $card->expYear = 2025; - $card->cardHolderName = 'John Smith'; - - $enrolled = $card->verifyEnrolled(10, 'USD'); - $this->assertTrue($enrolled); - - $secureEcom = $card->threeDSecure; - $authClient = new ThreeDSecureAcsClient($secureEcom->issuerAcsUrl); - $authResponse = $authClient->authenticate($secureEcom->payerAuthenticationRequest, $secureEcom->getMerchantData()->toString()); - - // $payerAuthenticationResponse = $authResponse->parse(); - $payerAuthenticationResponse = $authResponse->getAuthResponse(); - $md = MerchantDataCollection::parse($authResponse->getMerchantData()); - - $verified = $card->verifySignature($payerAuthenticationResponse, $md); - $this->assertFalse($verified); - $this->assertEquals('N', $card->threeDSecure->status); - $this->assertEquals(7, $card->threeDSecure->eci); - - $response = $card->charge(10) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - public function testCardHolderIsEnrolledACSUnavailable() - { - $card = new CreditCardData(); - $card->number = 4012001037484447; - $card->expMonth = 12; - $card->expYear = 2025; - $card->cardHolderName = 'John Smith'; - - $enrolled = $card->verifyEnrolled(10, 'USD'); - $this->assertTrue($enrolled); - - $secureEcom = $card->threeDSecure; - $authClient = new ThreeDSecureAcsClient($secureEcom->issuerAcsUrl); - $authResponse = $authClient->authenticate($secureEcom->payerAuthenticationRequest, $secureEcom->getMerchantData()->toString()); - - $payerAuthenticationResponse = $authResponse->getAuthResponse(); - $md = MerchantDataCollection::parse($authResponse->getMerchantData()); - - $verified = $card->verifySignature($payerAuthenticationResponse, $md); - $this->assertFalse($verified); - $this->assertEquals('U', $card->threeDSecure->status); - $this->assertEquals(7, $card->threeDSecure->eci); - - $response = $card->charge(10) - ->withCurrency('USD') - ->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - public function testCardHolderIsEnrolledACSInvalid() - { - $card = new CreditCardData(); - $card->number = 4012001037490006; - $card->expMonth = 12; - $card->expYear = 2025; - $card->cardHolderName = 'John Smith'; - - $enrolled = $card->verifyEnrolled(10, 'USD'); - $this->assertTrue($enrolled); - - $secureEcom = $card->threeDSecure; - $authClient = new ThreeDSecureAcsClient($secureEcom->issuerAcsUrl); - $authResponse = $authClient->authenticate($secureEcom->payerAuthenticationRequest, $secureEcom->getMerchantData()->toString()); - - $payerAuthenticationResponse = $authResponse->getAuthResponse(); - $md = MerchantDataCollection::parse($authResponse->getMerchantData()); - - $card->verifySignature($payerAuthenticationResponse, $md); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/RealexApmTest.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/RealexApmTest.php deleted file mode 100644 index f696c6b..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/RealexApmTest.php +++ /dev/null @@ -1,185 +0,0 @@ -merchantId = "heartlandgpsandbox"; - $config->accountId = "hpp"; - $config->rebatePassword = 'refund'; - $config->refundPassword = 'refund'; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; - return $config; - } - - public function setup() { - ServicesContainer::configure($this->config()); - } - - public function testApmForCharge() { - $paymentMethod = new AlternativePaymentMethod(AlternativePaymentType::SOFORTUBERWEISUNG); - - $paymentMethod->returnUrl = 'https://www.example.com/returnUrl'; - $paymentMethod->statusUpdateUrl = 'https://www.example.com/statusUrl'; - $paymentMethod->descriptor = 'Test Transaction'; - $paymentMethod->country = 'DE'; - $paymentMethod->accountHolderName = 'James Mason'; - - $response = $paymentMethod->charge(10) - ->withCurrency("EUR") - ->withDescription('New APM') - ->execute(); - - $responseCode = $response->responseCode; // 00 == Success - $message = $response->responseMessage; // [ test system ] AUTHORISED - // get the reponse details to save to the DB for future transaction management requests - $orderId = $response->orderId; - $authCode = $response->authorizationCode; - $paymentsReference = $response->transactionId; // pasref - $apmResponse = $response->alternativePaymentResponse; - - $this->assertNotNull($response); - $this->assertEquals("01", $response->responseCode); - $this->assertNotNull($response->alternativePaymentResponse); - } - - /** - * @expectedException \GlobalPayments\Api\Entities\Exceptions\BuilderException - * @expectedExceptionMessage amount cannot be null for this transaction type - */ - public function testApmWithoutAmount() { - $paymentMethod = new AlternativePaymentMethod(AlternativePaymentType::SOFORTUBERWEISUNG); - - $paymentMethod->returnUrl = 'https://www.example.com/returnUrl'; - $paymentMethod->statusUpdateUrl = 'https://www.example.com/statusUrl'; - $paymentMethod->descriptor = 'Test Transaction'; - $paymentMethod->country = 'DE'; - $paymentMethod->accountHolderName = 'James Mason'; - - $response = $paymentMethod->charge() - ->withCurrency("EUR") - ->withDescription('New APM') - ->execute(); - } - - /** - * @expectedException \GlobalPayments\Api\Entities\Exceptions\BuilderException - * @expectedExceptionMessage currency cannot be null for this transaction type - */ - public function testApmWithoutCurrency() { - $paymentMethod = new AlternativePaymentMethod(AlternativePaymentType::SOFORTUBERWEISUNG); - - $paymentMethod->returnUrl = 'https://www.example.com/returnUrl'; - $paymentMethod->statusUpdateUrl = 'https://www.example.com/statusUrl'; - $paymentMethod->descriptor = 'Test Transaction'; - $paymentMethod->country = 'DE'; - $paymentMethod->accountHolderName = 'James Mason'; - - $response = $paymentMethod->charge(10) - ->withDescription('New APM') - ->execute(); - } - - /** - * @expectedException \GlobalPayments\Api\Entities\Exceptions\BuilderException - * @expectedExceptionMessage returnUrl cannot be null for this transaction type - */ - public function testApmWithoutReturnUrl() { - $paymentMethod = new AlternativePaymentMethod(AlternativePaymentType::SOFORTUBERWEISUNG); - - $paymentMethod->statusUpdateUrl = 'https://www.example.com/statusUrl'; - $paymentMethod->descriptor = 'Test Transaction'; - $paymentMethod->country = 'DE'; - $paymentMethod->accountHolderName = 'James Mason'; - - $response = $paymentMethod->charge(1001) - ->withCurrency("EUR") - ->withDescription('New APM') - ->execute(); - } - - /** - * @expectedException \GlobalPayments\Api\Entities\Exceptions\BuilderException - * @expectedExceptionMessage statusUpdateUrl cannot be null for this transaction type - */ - public function testApmWithoutstatusUpdateUrl() { - $paymentMethod = new AlternativePaymentMethod(AlternativePaymentType::SOFORTUBERWEISUNG); - - $paymentMethod->returnUrl = 'https://www.example.com/returnUrl'; - $paymentMethod->descriptor = 'Test Transaction'; - $paymentMethod->country = 'DE'; - $paymentMethod->accountHolderName = 'James Mason'; - - $response = $paymentMethod->charge(1001) - ->withCurrency("EUR") - ->withDescription('New APM') - ->execute(); - } - - /** - * @expectedException \GlobalPayments\Api\Entities\Exceptions\GatewayException - * @expectedExceptionMessage FAILED - */ - public function testAPMRefundPendingTransaction() { - $paymentMethod = new AlternativePaymentMethod(AlternativePaymentType::TEST_PAY); - - $paymentMethod->returnUrl = 'https://www.example.com/returnUrl'; - $paymentMethod->statusUpdateUrl = 'https://www.example.com/statusUrl'; - $paymentMethod->descriptor = 'Test Transaction'; - $paymentMethod->country = 'DE'; - $paymentMethod->accountHolderName = 'James Mason'; - - $response = $paymentMethod->charge(10) - ->withCurrency("EUR") - ->withDescription('New APM') - ->execute(); - - $this->assertNotEquals(null, $response); - $this->assertEquals("01", $response->responseCode); - - // send the settle request, we must specify the amount and currency - $response = $response->refund(10) - ->withCurrency("EUR") - ->withAlternativePaymentType(AlternativePaymentType::TEST_PAY) - ->execute(); - } - - public function testApmForRefund() { - // a settle request requires the original order id - $orderId = "20180912050207-5b989dcfc9433"; - // and the payments reference (pasref) from the authorization response - $paymentsReference = "15367285279651634"; - // and the auth code transaction response - $authCode = "12345"; - - // create the rebate transaction object - $transaction = Transaction::fromId($paymentsReference, $orderId); - $transaction->authorizationCode = $authCode; - - // send the settle request, we must specify the amount and currency - $response = $transaction->refund(10) - ->withCurrency("EUR") - ->withAlternativePaymentType(AlternativePaymentType::TEST_PAY) - ->execute(); - - $responseCode = $response->responseCode; // 00 == Success - $message = $response->responseMessage; // [ test system ] AUTHORISED - - $this->assertNotEquals(null, $response); - $this->assertEquals("00", $responseCode); - } - -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/RecurringTest.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/RecurringTest.php deleted file mode 100644 index 52e06fc..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/RecurringTest.php +++ /dev/null @@ -1,390 +0,0 @@ -format("Ymd")); - } - - public function getPaymentId($type) - { - return sprintf("%s-Realex-%s", (new \DateTime())->format("Ymd"), $type); - } - - protected function config() - { - $config = new ServicesConfig(); - $config->merchantId = "heartlandgpsandbox"; - $config->accountId = "3dsecure"; - $config->refundPassword = "refund"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; - return $config; - } - - protected function dccSetup() - { - $config = new ServicesConfig(); - $config->merchantId = "heartlandgpsandbox"; - $config->accountId = "apidcc"; - $config->refundPassword = "refund"; - $config->sharedSecret = "secret"; - $config->serviceUrl = "https://api.sandbox.realexpayments.com/epage-remote.cgi"; - - ServicesContainer::configure($config); - } - - public function setup() - { - ServicesContainer::configure($this->config()); - - $this->newCustomer = new Customer(); - $this->newCustomer->key = $this->getCustomerId(); - $this->newCustomer->title = "Mr."; - $this->newCustomer->firstName = "James"; - $this->newCustomer->lastName = "Mason"; - $this->newCustomer->company = "Realex Payments"; - $this->newCustomer->address = new Address(); - $this->newCustomer->address->streetAddress1 = "Flat 123"; - $this->newCustomer->address->streetAddress2 = "House 456"; - $this->newCustomer->address->streetAddress3 = "The Cul-De-Sac"; - $this->newCustomer->address->city = "Halifax"; - $this->newCustomer->address->province = "West Yorkshire"; - $this->newCustomer->address->pstalCode = "W6 9HR"; - $this->newCustomer->address->country = "United Kingdom"; - $this->newCustomer->homePhone = "+35312345678"; - $this->newCustomer->workPhone = "+3531987654321"; - $this->newCustomer->fax = "+124546871258"; - $this->newCustomer->mobilePhone = "+25544778544"; - $this->newCustomer->email = "text@example.com"; - $this->newCustomer->comments = "Campaign Ref E7373G"; - } - - /* 08. Card Storage Create Payer */ - /* Request Type: payer-new */ - - public function testcardStorageCreatePayer() - { - try { - $response = $this->newCustomer->Create(); - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } catch (GatewayException $exc) { - if ($exc->responseCode != '501' && $exc->responseCode != '520') { - throw $exc; - } - } - } - - /* 09. Card Storage Store Card */ - /* Request Type: card-new */ - - public function testcardStorageStoreCard() - { - $card = new CreditCardData(); - $card->number = "4012001037141112"; - $card->expMonth = 10; - $card->expYear = 2025; - $card->cvn = '123'; - $card->cardHolderName = 'James Mason'; - - try { - $paymentMethod = $this->newCustomer - ->addPaymentMethod($this->getPaymentId("Credit"), $card) - ->create(); - $this->assertNotNull($paymentMethod); - } catch (GatewayException $exc) { - if ($exc->responseCode != '501' && $exc->responseCode != '520') { - throw $exc; - } - } - } - - /* 10. Card Storage Charge Card */ - /* Request Type: receipt-in */ - - public function testcardStorageChargeCard() - { - $paymentMethod = new RecurringPaymentMethod($this->getCustomerId(), $this->getPaymentId("Credit")); - $response = $paymentMethod->charge(10) - ->withCurrency("EUR") - ->withCvn("123") - ->execute(); - - $responseCode = $response->responseCode; // 00 == Success - $message = $response->responseMessage; // [ test system ] AUTHORISED - // get the reponse details to save to the DB for future transaction management requests - $orderId = $response->orderId; - $authCode = $response->authorizationCode; - $paymentsReference = $response->transactionId; // pasref - - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /* 11. CardStorage ThreeDSecure Verify Enrolled */ - /* Request Type: realvault-3ds-verifyenrolled */ - - public function testcardStorageThreeDSecureVerifyEnrolled() - { - $paymentMethod = new RecurringPaymentMethod($this->getCustomerId(), $this->getPaymentId("Credit")); - - $response = $paymentMethod->verify() - ->withAmount(10) - ->withCurrency('USD') - ->withModifier(TransactionModifier::SECURE3D) - ->execute(); - - // get the response details to update the DB - $responseCode = $response->responseCode; // 00 == Success - $message = $response->responseMessage; // [ test system ] AUTHORISED - - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /* 12. CardStorage Dcc Rate Lookup */ - /* Request Type: realvault-dccrate */ - - public function testcardStorageDccRateLookup() - { - $this->dccSetup(); - - $orderId = GenerationUtils::generateOrderId(); - $paymentMethod = new RecurringPaymentMethod($this->getCustomerId(), $this->getPaymentId("Credit")); - $dccDetails = $paymentMethod->getDccRate(DccRateType::SALE, 1001, 'EUR', DccProcessor::FEXCO, $orderId); - - $this->assertNotNull($dccDetails); - $this->assertEquals('00', $dccDetails->responseCode, $dccDetails->responseMessage); - $this->assertNotNull($dccDetails->dccResponseResult); - } - - /* 14. CardStorage UpdatePayer */ - /* Request Type: payer-edit */ - - public function testcardStorageUpdatePayer() - { - $customer = new Customer(); - $customer->key = $this->getCustomerId(); - $customer->firstName = "Perry"; - - $response = $customer->saveChanges(); - - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /* 15. CardStorage Continuous Authority First */ - /* Request Type: auth */ - - public function testContinuousAuthorityFirst() - { - // create the card object - $card = new CreditCardData(); - $card->number = '5425230000004415'; - $card->expMonth = 12; - $card->expYear = 2025; - $card->cvn = '131'; - $card->cardHolderName = 'James Mason'; - - - // process an auto-settle authorization - $response = $card->charge(15) - ->withCurrency("EUR") - ->withRecurringInfo(RecurringType::VARIABLE, RecurringSequence::FIRST) - ->execute(); - - $responseCode = $response->responseCode; // 00 == Success - $message = $response->responseMessage; // [ test system ] AUTHORISED - // get the details to save to the DB for future Transaction Management requests - $orderId = $response->orderId; - $authCode = $response->authorizationCode; - $paymentsReference = $response->transactionId; - - $this->assertNotEquals(null, $response); - $this->assertEquals("00", $responseCode); - } - - /* 15. CardStorage Continuous Authority Subsequent */ - /* Request Type: receipt-in */ - - public function testContinuousAuthoritySubsequent() - { - // create the payment method object - $paymentMethod = new RecurringPaymentMethod($this->getCustomerId(), $this->getPaymentId("Credit")); - - // charge the stored card/payment method - $response = $paymentMethod->charge(15) - ->withCurrency("EUR") - ->withCvn("123") - ->withRecurringInfo(RecurringType::VARIABLE, RecurringSequence::SUBSEQUENT) - ->execute(); - - $responseCode = $response->responseCode; // 00 == Success - - $this->assertNotEquals(null, $response); - $this->assertEquals("00", $responseCode); - } - - /* 15. CardStorage Continuous Authority Last */ - /* Request Type: receipt-in */ - - public function testContinuousAuthorityLast() - { - // create the payment method object - $paymentMethod = new RecurringPaymentMethod($this->getCustomerId(), $this->getPaymentId("Credit")); - - // charge the stored card/payment method - $response = $paymentMethod->charge(15) - ->withCurrency("EUR") - ->withCvn("123") - ->withRecurringInfo(RecurringType::VARIABLE, RecurringSequence::LAST) - ->execute(); - - $responseCode = $response->responseCode; // 00 == Success - - $this->assertNotEquals(null, $response); - $this->assertEquals("00", $responseCode); - } - - /* 16. Card Storage Refund */ - /* Request Type: payment-out */ - - public function testcardStorageRefund() - { - // create the payment method object - $paymentMethod = new RecurringPaymentMethod($this->getCustomerId(), $this->getPaymentId("Credit")); - - // charge the stored card/payment method - $response = $paymentMethod->refund(10) - ->withCurrency("EUR") - ->execute(); - - $responseCode = $response->responseCode; // 00 == Success - $message = $response->responseMessage; // [ test system ] AUTHORISED - - $this->assertNotEquals(null, $response); - $this->assertEquals("00", $responseCode); - } - - /* 17. Card Storage UpdateCard */ - /* Request Type: card-update-card */ - - public function testcardStorageUpdateCard() - { - $paymentMethod = new RecurringPaymentMethod($this->getCustomerId(), $this->getPaymentId("Credit")); - - $paymentMethod->paymentMethod = new CreditCardData(); - $paymentMethod->paymentMethod->number = "5425230000004415"; - $paymentMethod->paymentMethod->expMonth = 10; - $paymentMethod->paymentMethod->expYear = 2020; - $paymentMethod->paymentMethod->cardHolderName = "Philip Marlowe"; - - $response = $paymentMethod->SaveChanges(); - - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /* 18. Card Storage Verify Card */ - /* Request Type: receipt-in-otb */ - - public function testcardStorageVerifyCard() - { - $paymentMethod = new RecurringPaymentMethod($this->getCustomerId(), $this->getPaymentId("Credit")); - - // verify the stored card/payment method is valid and active - $response = $paymentMethod->verify() - ->withCvn("123") - ->execute(); - - // get the response details to update the DB - $responseCode = $response->responseCode; // 00 == Success - $message = $response->responseMessage; // [ test system ] AUTHORISED - - $this->assertNotEquals(null, $response); - $this->assertEquals("00", $responseCode); - } - - /* 13. CardStorage DeleteCard */ - /* Request Type: card-cancel-card */ - - public function testcardStorageDeleteCard() - { - $paymentMethod = new RecurringPaymentMethod($this->getCustomerId(), $this->getPaymentId("Credit")); - - // delete the stored card/payment method - // WARNING! This can't be undone - $response = $paymentMethod->Delete(); - - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } - - /* Request Type: receipt-in */ - - public function testcardStorageChargeCardDCC() - { - $this->dccSetup(); - $this->testcardStorageCreatePayer(); - $this->testcardStorageStoreCard(); - - $paymentMethod = new RecurringPaymentMethod($this->getCustomerId(), $this->getPaymentId("Credit")); - - $orderId = GenerationUtils::generateOrderId(); - $dccDetails = $paymentMethod->getDccRate(DccRateType::SALE, 1001, 'EUR', DccProcessor::FEXCO, $orderId); - - $this->assertNotNull($dccDetails); - $this->assertEquals('00', $dccDetails->responseCode, $dccDetails->responseMessage); - $this->assertNotNull($dccDetails->dccResponseResult); - - $dccValues = new DccRateData(); - $dccValues->orderId = $dccDetails->transactionReference->orderId; - $dccValues->dccProcessor = DccProcessor::FEXCO; - $dccValues->dccType = 1; - $dccValues->dccRateType = DccRateType::SALE; - $dccValues->currency = $dccDetails->dccResponseResult->cardHolderCurrency; - $dccValues->dccRate = $dccDetails->dccResponseResult->cardHolderRate; - $dccValues->amount = $dccDetails->dccResponseResult->cardHolderAmount; - - $response = $paymentMethod->charge(1001) - ->withCurrency("EUR") - ->withCvn("123") - ->withDccRateData($dccValues) - ->withOrderId($orderId) - ->execute(); - - $responseCode = $response->responseCode; // 00 == Success - $message = $response->responseMessage; // [ test system ] AUTHORISED - // get the reponse details to save to the DB for future transaction management requests - $orderId = $response->orderId; - $authCode = $response->authorizationCode; - $paymentsReference = $response->transactionId; // pasref - - $this->assertNotNull($response); - $this->assertEquals("00", $response->responseCode); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/Secure3dServiceTests.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/Secure3dServiceTests.php deleted file mode 100644 index 421a27c..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/Secure3dServiceTests.php +++ /dev/null @@ -1,772 +0,0 @@ -getConfig()); - - // create card data - $this->card = new CreditCardData(); - $this->card->number = 4263970000005262; - $this->card->expMonth = 12; - $this->card->expYear = 2025; - $this->card->cardHolderName = 'John Smith'; - - // stored card - $this->stored = new RecurringPaymentMethod('20190809-Realex', '20190809-Realex-Credit'); - - // shipping address - $this->shippingAddress = new Address(); - $this->shippingAddress->streetAddress1 = 'Apartment 852'; - $this->shippingAddress->streetAddress2 = 'Complex 741'; - $this->shippingAddress->streetAddress3 = 'no'; - $this->shippingAddress->city = 'Chicago'; - $this->shippingAddress->postalCode = '5001'; - $this->shippingAddress->state = 'IL'; - $this->shippingAddress->countryCode = '840'; - - // billing address - $this->billingAddress = new Address(); - $this->billingAddress->streetAddress1 = 'Flat 456'; - $this->billingAddress->streetAddress2 = 'House 789'; - $this->billingAddress->streetAddress3 = 'no'; - $this->billingAddress->city = 'Halifax'; - $this->billingAddress->postalCode = 'W5 9HR'; - $this->billingAddress->countryCode = '826'; - - // browser data - $this->browserData = new BrowserData(); - $this->browserData->acceptHeader = 'text/html,application/xhtml+xml,application/xml;q=9,image/webp,img/apng,*/*;q=0.8'; - $this->browserData->colorDepth = ColorDepth::TWENTY_FOUR_BITS; - $this->browserData->ipAddress = '123.123.123.123'; - $this->browserData->javaEnabled = true; - $this->browserData->language = 'en'; - $this->browserData->screenHeight = 1080; - $this->browserData->screenWidth = 1920; - $this->browserData->challengWindowSize = ChallengeWindowSize::WINDOWED_600X400; - $this->browserData->timeZone = '0'; - $this->browserData->userAgent = 'Mozilla/5.0 (Windows NT 6.1; Win64, x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'; - - } - - protected function getConfig() - { - $config = new ServicesConfig(); - $config->merchantId = 'myMerchantId'; - $config->accountId = 'ecom3ds'; - $config->sharedSecret = 'secret'; - $config->methodNotificationUrl = 'https://www.example.com/methodNotificationUrl'; - $config->challengeNotificationUrl = 'https://www.example.com/challengeNotificationUrl'; - $config->secure3dVersion = Secure3dVersion::ANY; - $config->merchantContactUrl = 'https://www.example.com'; - return $config; - } - - public function testFullCycle_v1() - { - $card = new CreditCardData(); - $card->number = 4012001037141112; - $card->expMonth = 12; - $card->expYear = 2025; - $card->cardHolderName = 'John Smith'; - - $secureEcom = Secure3dService::checkEnrollment($card) - ->withAmount(10.01) - ->withCurrency('USD') - ->execute(Secure3dVersion::ONE); - $this->assertEquals(Secure3dVersion::ONE, $secureEcom->getVersion()); - - if ($secureEcom->enrolled) { - // authenticate - $authClient = new ThreeDSecureAcsClient($secureEcom->issuerAcsUrl); - $authResponse = $authClient->authenticate($secureEcom->payerAuthenticationRequest, $secureEcom->getMerchantData()->toString()); - - $payerAuthenticationResponse = $authResponse->getAuthResponse(); - $md = MerchantDataCollection::parse($authResponse->getMerchantData()); - - $secureEcom = Secure3dService::getAuthenticationData() - ->withPayerAuthenticationResponse($payerAuthenticationResponse) - ->withMerchantData($md) - ->execute(); - $card->threeDSecure = $secureEcom; - - if ($secureEcom->status == 'Y') { - $response = $card->charge()->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } else { - $this->fail('Signature verification failed.'); - } - } else { - $this->fail('Card not enrolled.'); - } - } - - public function testFullCycle_v2() - { - $secureEcom = Secure3dService::checkEnrollment($this->card) - ->execute(Secure3dVersion::TWO); - $this->assertNotNull($secureEcom); - $this->assertNotNull($secureEcom->serverTransactionId); - - if ($secureEcom->enrolled) { - $this->assertEquals(Secure3dVersion::TWO, $secureEcom->getVersion()); - - // initiate authentication - $initAuth = Secure3dService::initiateAuthentication($this->card, $secureEcom) - ->withAmount(10.01) - ->withCurrency('USD') - ->withOrderCreateDate(date('Y-m-d H:i:s')) - ->withAddress($this->billingAddress, AddressType::BILLING) - ->withAddress($this->shippingAddress, AddressType::SHIPPING) - ->withBrowserData($this->browserData) - ->withMethodUrlCompletion(MethodUrlCompletion::NO) - ->execute(); - $this->assertNotNull($initAuth); - - // get authentication data - $secureEcom = Secure3dService::getAuthenticationData() - ->withServerTransactionId($initAuth->serverTransactionId) - ->execute(); - $this->card->threeDSecure = $secureEcom; - - if ($secureEcom->status == 'AUTHENTICATION_SUCCESSFUL') { - $response = $this->card->charge(10.01) - ->withCurrency('USD') - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } else { - $this->fail('Signature verification failed.'); - } - } else { - $this->fail('Card not enrolled'); - } - } - - public function testFullCycle_Any() - { - $secureEcom = Secure3dService::checkEnrollment($this->card) - ->withAmount(1.00) - ->withCurrency('USD') - ->execute(Secure3dVersion::ANY); - $this->assertNotNull($secureEcom); - - if ($secureEcom->enrolled) { - if ($secureEcom->getVersion() === Secure3dVersion::TWO) { - $this->assertEquals(Secure3dVersion::TWO, $secureEcom->getVersion()); - - // initiate authentication - $initAuth = Secure3dService::initiateAuthentication($this->card, $secureEcom) - ->withAmount(10.01) - ->withCurrency('USD') - ->withOrderCreateDate(date('Y-m-d H:i:s')) - ->withAddress($this->billingAddress, AddressType::BILLING) - ->withAddress($this->shippingAddress, AddressType::SHIPPING) - ->withBrowserData($this->browserData) - ->withMethodUrlCompletion(MethodUrlCompletion::NO) - ->execute(); - $this->assertNotNull($initAuth); - - // get authentication data - $secureEcom = Secure3dService::getAuthenticationData() - ->withServerTransactionId($initAuth->serverTransactionId) - ->execute(); - $this->card->threeDSecure = $secureEcom; - - if ($secureEcom->status == 'AUTHENTICATION_SUCCESSFUL') { - $response = $this->card->charge(10.01) - ->withCurrency('USD') - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } else { - $this->fail('Signature verification failed.'); - } - } else { - // authenticate - $authClient = new ThreeDSecureAcsClient($secureEcom->issuerAcsUrl); - $authResponse = $authClient->authenticate($secureEcom->payerAuthenticationRequest, $secureEcom->getMerchantData()->toString()); - - $payerAuthenticationResponse = $authResponse->getAuthResponse(); - $md = MerchantDataCollection::parse($authResponse->getMerchantData()); - - $secureEcom = Secure3dService::getAuthenticationData() - ->withPayerAuthenticationResponse($payerAuthenticationResponse) - ->withMerchantData($md) - ->execute(); - $this->card->threeDSecure = $secureEcom; - - if ($secureEcom->status == 'Y') { - $response = $this->card->charge()->execute(); - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } else { - $this->fail('Signature verification failed.'); - } - } - } else { - $this->fail('Card not enrolled'); - } - - } - - public function testFullCycle_v2_StoredCard() - { - $secureEcom = Secure3dService::checkEnrollment($this->stored) - ->execute(Secure3dVersion::TWO); - $this->assertNotNull($secureEcom); - $this->assertNotNull($secureEcom->serverTransactionId); - - if ($secureEcom->enrolled) { - $this->assertEquals(Secure3dVersion::TWO, $secureEcom->getVersion()); - - // initiate authentication - $initAuth = Secure3dService::initiateAuthentication($this->stored, $secureEcom) - ->withAmount(10.01) - ->withCurrency('USD') - ->withOrderCreateDate(date('Y-m-d H:i:s')) - ->withAddress($this->billingAddress, AddressType::BILLING) - ->withAddress($this->shippingAddress, AddressType::SHIPPING) - ->withBrowserData($this->browserData) - ->withMethodUrlCompletion(MethodUrlCompletion::NO) - ->execute(); - $this->assertNotNull($initAuth); - - // get authentication data - $secureEcom = Secure3dService::getAuthenticationData() - ->withServerTransactionId($initAuth->serverTransactionId) - ->execute(); - $this->stored->threeDSecure = $secureEcom; - - if ($secureEcom->status == 'AUTHENTICATION_SUCCESSFUL') { - $response = $this->stored->charge(10.01) - ->withCurrency('USD') - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } else { - $this->fail('Signature verification failed.'); - } - - } else { - $this->fail('Card not enrolled'); - } - } - - public function testFullCycle_v2_OTB() - { - $secureEcom = Secure3dService::checkEnrollment($this->card) - ->execute(Secure3dVersion::TWO); - $this->assertNotNull($secureEcom); - $this->assertNotNull($secureEcom->serverTransactionId); - - if ($secureEcom->enrolled) { - $this->assertEquals(Secure3dVersion::TWO, $secureEcom->getVersion()); - - // initiate authentication - $initAuth = Secure3dService::initiateAuthentication($this->card, $secureEcom) - ->withAmount(10.01) - ->withCurrency('USD') - ->withOrderCreateDate(date('Y-m-d H:i:s')) - ->withAddress($this->billingAddress, AddressType::BILLING) - ->withAddress($this->shippingAddress, AddressType::SHIPPING) - ->withBrowserData($this->browserData) - ->withMethodUrlCompletion(MethodUrlCompletion::NO) - ->execute(); - $this->assertNotNull($initAuth); - - // get authentication data - $secureEcom = Secure3dService::getAuthenticationData() - ->withServerTransactionId($initAuth->serverTransactionId) - ->execute(); - $this->card->threeDSecure = $secureEcom; - - if ($secureEcom->status == 'AUTHENTICATION_SUCCESSFUL') { - $response = $this->card->verify() - ->withCurrency('USD') - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } else { - $this->fail('Signature verification failed.'); - } - - } else { - $this->fail('Card not enrolled'); - } - } - - public function testFullCycle_v2_OTB_StoredCard() - { - $secureEcom = Secure3dService::checkEnrollment($this->stored) - ->execute(Secure3dVersion::TWO); - $this->assertNotNull($secureEcom); - $this->assertNotNull($secureEcom->serverTransactionId); - - if ($secureEcom->enrolled) { - $this->assertEquals(Secure3dVersion::TWO, $secureEcom->getVersion()); - - // initiate authentication - $initAuth = Secure3dService::initiateAuthentication($this->stored, $secureEcom) - ->withAmount(10.01) - ->withCurrency('USD') - ->withOrderCreateDate(date('Y-m-d H:i:s')) - ->withAddress($this->billingAddress, AddressType::BILLING) - ->withAddress($this->shippingAddress, AddressType::SHIPPING) - ->withBrowserData($this->browserData) - ->withMethodUrlCompletion(MethodUrlCompletion::NO) - ->execute(); - $this->assertNotNull($initAuth); - - // get authentication data - $secureEcom = Secure3dService::getAuthenticationData() - ->withServerTransactionId($initAuth->serverTransactionId) - ->execute(); - $this->stored->threeDSecure = $secureEcom; - - if ($secureEcom->status == 'AUTHENTICATION_SUCCESSFUL') { - $response = $this->stored->verify() - ->withCurrency('USD') - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } else { - $this->fail('Signature verification failed.'); - } - - } else { - $this->fail('Card not enrolled'); - } - } - - public function testOptionalRequestLevelFields() - { - $secureEcom = Secure3dService::checkEnrollment($this->card) - ->execute(Secure3dVersion::TWO); - $this->assertNotNull($secureEcom); - - if ($secureEcom->enrolled) { - $this->assertEquals(Secure3dVersion::TWO, $secureEcom->getVersion()); - - // initiate authentication - $initAuth = Secure3dService::initiateAuthentication($this->card, $secureEcom) - ->withAmount(10.01) - ->withCurrency('USD') - ->withOrderCreateDate(date('Y-m-d H:i:s')) - ->withAddress($this->billingAddress, AddressType::BILLING) - ->withAddress($this->shippingAddress, AddressType::SHIPPING) - ->withBrowserData($this->browserData) - ->withMethodUrlCompletion(MethodUrlCompletion::NO) - - // optionals - ->withMerchantInitiatedRequestType(AuthenticationRequestType::RECURRING_TRANSACTION) - - ->execute(); - $this->assertNotNull($initAuth); - - // get authentication data - $secureEcom = Secure3dService::getAuthenticationData() - ->withServerTransactionId($initAuth->serverTransactionId) - ->execute(); - $this->card->threeDSecure = $secureEcom; - - if ($secureEcom->status == 'AUTHENTICATION_SUCCESSFUL') { - $response = $this->card->charge(10.01) - ->withCurrency('USD') - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } else { - $this->fail('Signature verification failed.'); - } - } else { - $this->fail('Card not enrolled'); - } - } - - public function testOptionalOrderLevelFields() - { - $secureEcom = Secure3dService::checkEnrollment($this->card) - ->execute(Secure3dVersion::TWO); - $this->assertNotNull($secureEcom); - - if ($secureEcom->enrolled) { - $this->assertEquals(Secure3dVersion::TWO, $secureEcom->getVersion()); - - // initiate authentication - $initAuth = Secure3dService::initiateAuthentication($this->card, $secureEcom) - ->withAmount(250.00) - ->withCurrency('USD') - ->withOrderCreateDate(date('Y-m-d H:i:s')) - ->withAddress($this->billingAddress, AddressType::BILLING) - ->withAddress($this->shippingAddress, AddressType::SHIPPING) - ->withBrowserData($this->browserData) - ->withMethodUrlCompletion(MethodUrlCompletion::NO) - - // optionals - ->withGiftCardCurrency('USD') - ->withGiftCardAmount(250.00) - ->withDeliveryEmail('james.mason@example.com') - ->withDeliveryTimeFrame(DeliveryTimeFrame::ELECTRONIC_DELIVERY) - ->withShippingMethod(ShippingMethod::VERIFIED_ADDRESS) - ->withShippingNameMatchesCardHolderName(true) - ->withPreOrderIndicator(PreOrderIndicator::FUTURE_AVAILABILITY) - // TODO - // This value passed for date, but doesn't seem right - // This line bugged in Java SDK - ->withPreOrderAvailabilityDate('20190418') - ->withReorderIndicator(ReorderIndicator::REORDER) - ->withOrderTransactionType(OrderTransactionType::GOODS_SERVICE_PURCHASE) - - ->execute(); - $this->assertNotNull($initAuth); - - // get authentication data - $secureEcom = Secure3dService::getAuthenticationData() - ->withServerTransactionId($initAuth->serverTransactionId) - ->execute(); - $this->card->threeDSecure = $secureEcom; - - if ($secureEcom->status == 'AUTHENTICATION_SUCCESSFUL') { - $response = $this->card->charge(10.01) - ->withCurrency('USD') - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } else { - $this->fail('Signature verification failed.'); - } - } else { - $this->fail('Card not enrolled'); - } - } - - public function testOptionalPayerLevelFields() - { - $secureEcom = Secure3dService::checkEnrollment($this->card) - ->execute(Secure3dVersion::TWO); - $this->assertNotNull($secureEcom); - - if ($secureEcom->enrolled) { - $this->assertEquals(Secure3dVersion::TWO, $secureEcom->getVersion()); - - // initiate authentication - $initAuth = Secure3dService::initiateAuthentication($this->card, $secureEcom) - ->withAmount(250.00) - ->withCurrency('USD') - ->withOrderCreateDate(date('Y-m-d H:i:s')) - ->withAddress($this->billingAddress, AddressType::BILLING) - ->withAddress($this->shippingAddress, AddressType::SHIPPING) - ->withBrowserData($this->browserData) - ->withMethodUrlCompletion(MethodUrlCompletion::NO) - - // optionals - ->withCustomerAccountId('6dcb24f5-74a0-4da3-98da-4f0aa0e88db3') - ->withAccountAgeIndicator(AgeIndicator::LESS_THAN_THIRTY_DAYS) - ->withAccountCreateDate('20190110') - ->withAccountChangeDate('20190128') - ->withAccountChangeIndicator(AgeIndicator::THIS_TRANSACTION) - ->withPasswordChangeDate('20190115') - ->withPasswordChangeIndicator(AgeIndicator::LESS_THAN_THIRTY_DAYS) - ->withHomeNumber('44', '123456798') - ->withWorkNumber('44', '1801555888') - ->withPaymentAccountCreateDate('20190101') - ->withPaymentAccountAgeIndicator(AgeIndicator::LESS_THAN_THIRTY_DAYS) - ->withPreviousSuspiciousActivity(false) - ->withNumberOfPurchasesInLastSixMonths(3) - ->withNumberOfTransactionsInLast24Hours(1) - ->withNumberOfTransactionsInLastYear(5) - ->withNumberOfAddCardAttemptsInLast24Hours(1) - ->withShippingAddressCreateDate('20190128') - ->withShippingAddressUsageIndicator(AgeIndicator::THIS_TRANSACTION) - - ->execute(); - $this->assertNotNull($initAuth); - - // get authentication data - $secureEcom = Secure3dService::getAuthenticationData() - ->withServerTransactionId($initAuth->serverTransactionId) - ->execute(); - $this->card->threeDSecure = $secureEcom; - - if ($secureEcom->status == 'AUTHENTICATION_SUCCESSFUL') { - $response = $this->card->charge(10.01) - ->withCurrency('USD') - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } else { - $this->fail('Signature verification failed.'); - } - } else { - $this->fail('Card not enrolled'); - } - } - - public function testOptionalPriorAuthenticationData() - { - $secureEcom = Secure3dService::checkEnrollment($this->card) - ->execute(Secure3dVersion::TWO); - $this->assertNotNull($secureEcom); - - if ($secureEcom->enrolled) { - $this->assertEquals(Secure3dVersion::TWO, $secureEcom->getVersion()); - - // initiate authentication - $initAuth = Secure3dService::initiateAuthentication($this->card, $secureEcom) - ->withAmount(250.00) - ->withCurrency('USD') - ->withOrderCreateDate(date('Y-m-d H:i:s')) - ->withAddress($this->billingAddress, AddressType::BILLING) - ->withAddress($this->shippingAddress, AddressType::SHIPPING) - ->withBrowserData($this->browserData) - ->withMethodUrlCompletion(MethodUrlCompletion::NO) - - // optionals - ->withPriorAuthenticationMethod(PriorAuthenticationMethod::FRICTIONLESS_AUTHENTICATION) - ->withPriorAuthenticationTransactionId('26c3f619-39a4-4040-bf1f-6fd433e6d615') - ->withPriorAuthenticationTimestamp((new \DateTime('2019-01-10T12:57:33.333Z'))->format(\DateTime::RFC3339_EXTENDED)) - - ->execute(); - $this->assertNotNull($initAuth); - - // get authentication data - $secureEcom = Secure3dService::getAuthenticationData() - ->withServerTransactionId($initAuth->serverTransactionId) - ->execute(); - $this->card->threeDSecure = $secureEcom; - - if ($secureEcom->status == 'AUTHENTICATION_SUCCESSFUL') { - $response = $this->card->charge(10.01) - ->withCurrency('USD') - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } else { - $this->fail('Signature verification failed.'); - } - } else { - $this->fail('Card not enrolled'); - } - } - - public function testOptionalRecurringData() - { - $secureEcom = Secure3dService::checkEnrollment($this->card) - ->execute(Secure3dVersion::TWO); - $this->assertNotNull($secureEcom); - - if ($secureEcom->enrolled) { - $this->assertEquals(Secure3dVersion::TWO, $secureEcom->getVersion()); - - // initiate authentication - $initAuth = Secure3dService::initiateAuthentication($this->card, $secureEcom) - ->withAmount(250.00) - ->withCurrency('USD') - ->withOrderCreateDate(date('Y-m-d H:i:s')) - ->withAddress($this->billingAddress, AddressType::BILLING) - ->withAddress($this->shippingAddress, AddressType::SHIPPING) - ->withBrowserData($this->browserData) - ->withMethodUrlCompletion(MethodUrlCompletion::NO) - - // optionals - ->withMaxNumberOfInstallments(5) - ->withRecurringAuthorizationFrequency(25) - ->withRecurringAuthorizationExpiryDate('20190825') - - ->execute(); - $this->assertNotNull($initAuth); - - // get authentication data - $secureEcom = Secure3dService::getAuthenticationData() - ->withServerTransactionId($initAuth->serverTransactionId) - ->execute(); - $this->card->threeDSecure = $secureEcom; - - if ($secureEcom->status == 'AUTHENTICATION_SUCCESSFUL') { - $response = $this->card->charge(10.01) - ->withCurrency('USD') - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } else { - $this->fail('Signature verification failed.'); - } - } else { - $this->fail('Card not enrolled'); - } - } - - public function testOptionalPayerLoginData() - { - $secureEcom = Secure3dService::checkEnrollment($this->card) - ->execute(Secure3dVersion::TWO); - $this->assertNotNull($secureEcom); - - if ($secureEcom->enrolled) { - $this->assertEquals(Secure3dVersion::TWO, $secureEcom->getVersion()); - - // initiate authentication - $initAuth = Secure3dService::initiateAuthentication($this->card, $secureEcom) - ->withAmount(250.00) - ->withCurrency('USD') - ->withOrderCreateDate(date('Y-m-d H:i:s')) - ->withAddress($this->billingAddress, AddressType::BILLING) - ->withAddress($this->shippingAddress, AddressType::SHIPPING) - ->withBrowserData($this->browserData) - ->withMethodUrlCompletion(MethodUrlCompletion::NO) - - // optionals - ->withCustomerAuthenticationData('string') - ->withCustomerAuthenticationTimestamp((new \DateTime('2019-01-10T12:57:33.333Z'))->format(\DateTime::RFC3339_EXTENDED)) - ->withCustomerAuthenticationMethod(CustomerAuthenticationMethod::MERCHANT_SYSTEM) - - ->execute(); - $this->assertNotNull($initAuth); - - // get authentication data - $secureEcom = Secure3dService::getAuthenticationData() - ->withServerTransactionId($initAuth->serverTransactionId) - ->execute(); - $this->card->threeDSecure = $secureEcom; - - if ($secureEcom->status == 'AUTHENTICATION_SUCCESSFUL') { - $response = $this->card->charge(10.01) - ->withCurrency('USD') - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } else { - $this->fail('Signature verification failed.'); - } - } else { - $this->fail('Card not enrolled'); - } - } - - public function testOptionalMobileFields() - { - $secureEcom = Secure3dService::checkEnrollment($this->card) - ->execute(Secure3dVersion::TWO); - $this->assertNotNull($secureEcom); - - if ($secureEcom->enrolled) { - $this->assertEquals(Secure3dVersion::TWO, $secureEcom->getVersion()); - - // initiate authentication - $initAuth = Secure3dService::initiateAuthentication($this->card, $secureEcom) - ->withAmount(250.00) - ->withCurrency('USD') - ->withOrderCreateDate(date('Y-m-d H:i:s')) - ->withAddress($this->billingAddress, AddressType::BILLING) - ->withAddress($this->shippingAddress, AddressType::SHIPPING) - ->withBrowserData($this->browserData) - ->withMethodUrlCompletion(MethodUrlCompletion::NO) - - // optionals - ->withApplicationId('f283b3ec-27da-42a1-acea-f3f70e75bbdc') - ->withSdkInterface(SdkInterface::BOTH) - ->withSdkUiTypes([SdkUiType::TEXT, SdkUiType::SINGLE_SELECT, SdkUiType::MULTI_SELECT, SdkUiType::OOB, SdkUiType::HTML_OTHER]) - ->withReferenceNumber('3DS_LOA_SDK_PPFU_020100_00007') - ->withSdkTransactionId('b2385523-a66c-4907-ac3c-91848e8c0067') - ->withEncodedData('ew0KCSJEViI6ICIxLjAiLA0KCSJERCI6IHsNCgkJIkMwMDEiOiAiQW5kcm9pZCIsDQoJCSJDMDAyIjogIkhUQyBPbmVfTTgiLA0KCQkiQzAwNCI6ICI1LjAuMSIsDQoJCSJDMDA1IjogImVuX1VTIiwNCgkJIkMwMDYiOiAiRWFzdGVybiBTdGFuZGFyZCBUaW1lIiwNCgkJIkMwMDciOiAiMDY3OTc5MDMtZmI2MS00MWVkLTk0YzItNGQyYjc0ZTI3ZDE4IiwNCgkJIkMwMDkiOiAiSm9obidzIEFuZHJvaWQgRGV2aWNlIg0KCX0sDQoJIkRQTkEiOiB7DQoJCSJDMDEwIjogIlJFMDEiLA0KCQkiQzAxMSI6ICJSRTAzIg0KCX0sDQoJIlNXIjogWyJTVzAxIiwgIlNXMDQiXQ0KfQ0K') - - ->execute(); - $this->assertNotNull($initAuth); - - // get authentication data - $secureEcom = Secure3dService::getAuthenticationData() - ->withServerTransactionId($initAuth->serverTransactionId) - ->execute(); - $this->card->threeDSecure = $secureEcom; - - if ($secureEcom->status == 'AUTHENTICATION_SUCCESSFUL') { - $response = $this->card->charge(10.01) - ->withCurrency('USD') - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('00', $response->responseCode); - } else { - $this->fail('Signature verification failed.'); - } - } else { - $this->fail('Card not enrolled'); - } - } - - public function testCheckVersion_Not_Enrolled() - { - $card = new CreditCardData(); - $card->number = 4012001037141112; - $card->expMonth = 12; - $card->expYear = 2025; - $secureEcom = Secure3dService::checkEnrollment($card) - ->execute(Secure3dVersion::ANY); - $this->assertNotNull($secureEcom); - $this->assertFalse((bool)$secureEcom->enrolled); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - */ - // public function testCheckVersion_Not_ISecure3d() - // { - // $secureEcom = Secure3dService::checkEnrollment(new DebitTrackData) - // ->execute(Secure3dVersion::ANY); - // $this->assertNotNull($secureEcom); - // } -} \ No newline at end of file diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/ThreeDSecureAcsClient.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/ThreeDSecureAcsClient.php deleted file mode 100644 index 543dc23..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/RealexConnector/ThreeDSecureAcsClient.php +++ /dev/null @@ -1,116 +0,0 @@ -serviceUrl = $url; - } - - /** - * @return AcsResponse - */ - public function authenticate($payerAuthRequest, $merchantData = '') - { - $kvps = []; - array_push($kvps, array('key'=>'PaReq', 'value'=>$payerAuthRequest)); - array_push($kvps, array('key'=>'TermUrl', 'value'=>'https://www.mywebsite.com/process3dSecure')); - array_push($kvps, array('key'=>'MD', 'value'=>$merchantData)); - - $rawResponse = ''; - try { - $postData = $this->buildData($kvps); - - $request = curl_init(); - - curl_setopt_array($request, array( - CURLOPT_URL => $this->serviceUrl, - CURLOPT_RETURNTRANSFER => true, - CURLOPT_ENCODING => "", - CURLOPT_MAXREDIRS => 10, - CURLOPT_TIMEOUT => 30, - CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, - CURLOPT_CUSTOMREQUEST => "POST", - CURLOPT_POSTFIELDS => $postData, - CURLOPT_HTTPHEADER => array( - "Content-Type: application/x-www-form-urlencoded; charset=UTF-8", - "cache-control: no-cache" - ), - )); - - $rawResponse = curl_exec($request); - $curlInfo = curl_getinfo($request); - $err = curl_error($request); - - curl_close($request); - - if ($curlInfo['http_code'] != 200) { - throw new ApiException(sprintf('Acs request failed with response code: %s', $curlInfo['http_code'])); - } - } catch (Exception $exc) { - throw new ApiException($exc); - } - - $rValue = new AcsResponse(); - $rValue->setAuthResponse($this->getInputValue($rawResponse, 'PaRes')); - $rValue->setMerchantData($this->getInputValue($rawResponse, 'MD')); - - return $rValue; - } - - /** - * @return string - */ - private function buildData($kvps) - { - $result = ''; - $first = true; - foreach ($kvps as $kvp) { - if ($first) { - $first = false; - } else { - $result .= '&'; - } - - $result .= urlencode($kvp['key']); - $result .= '='; - $result .= urlencode($kvp['value']); - } - - return $result; - } - - /** - * @return string - */ - private function getInputValue($raw, $inputValue) - { - if ($raw == null) { - return null; - } - - $searchString = sprintf('NAME="%s" VALUE="', $inputValue); - - $index = strpos($raw, $searchString); - - if ($index > -1) { - $index = $index + strlen($searchString); - - $length = strpos(substr($raw, $index), '"'); - - return substr($raw, $index, $length); - } - return null; - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/HpaAdminTests.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/HpaAdminTests.php deleted file mode 100644 index 8e67c8a..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/HpaAdminTests.php +++ /dev/null @@ -1,361 +0,0 @@ -device = DeviceService::create($this->getConfig()); - } - - public function tearDown() - { - sleep(3); - $this->device->reset(); - } - - protected function getConfig() - { - $config = new ConnectionConfig(); - $config->ipAddress = '10.138.141.5'; - $config->port = '12345'; - $config->deviceType = DeviceType::HPA_ISC250; - $config->connectionMode = ConnectionModes::TCP_IP; - $config->timeout = 300; - $config->requestIdProvider = new RequestIdProvider(); - - return $config; - } - - public function testCancel() - { - $response = $this->device->cancel(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - $this->assertEquals('Reset', $response->response); - } - - public function testIntialize() - { - $this->device->closeLane(); - $response = $this->device->initialize(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - $this->assertNotNull($response->responseData['initializeResponse']); - - $deviceInformation = $response->responseData['initializeResponse']; - $this->assertEquals('HeartSIP', $deviceInformation['application']); - } - - public function testOpenLane() - { - $response = $this->device->openLane(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - } - - public function testCloseLane() - { - $response = $this->device->closeLane(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - } - - public function testReset() - { - $response = $this->device->reset(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - $this->assertEquals('Reset', $response->response); - } - - public function testReboot() - { - $this->markTestSkipped('Reboot skipped'); - - $response = $this->device->reboot(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - $this->assertEquals('Reboot', $response->response); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\GatewayException - * @expectedExceptionMessage Unexpected Gateway Response: 1502 - CANNOT PROCESS IN LANE OPEN STATE - */ - public function testLaneOpenIntialize() - { - //open the lane - $response = $this->device->openLane(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - - $response = $this->device->initialize(); - } - - public function testEod() - { - $this->device->reset(); - $this->device->closeLane(); - - $response = $this->device->eod(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - - $this->assertNotNull($response->reversal); - $this->assertNotNull($response->emvOfflineDecline); - $this->assertNotNull($response->transactionCertificate); - $this->assertNotNull($response->attachment); - $this->assertNotNull($response->sendSAF); - $this->assertNotNull($response->batchClose); - $this->assertNotNull($response->heartBeat); - $this->assertNotNull($response->eMVPDL); - - $this->assertNotNull($response->responseData); - $this->assertNotNull($response->responseData['getBatchReport']['batchSummary']); - $this->assertNotNull($response->responseData['getBatchReport']['batchReport']); - $this->assertNotNull($response->responseData['getBatchReport']['batchDetail']); - } - - public function testStartDownload() - { - $this->markTestSkipped('StartDownload skipped'); - - $deviceSettings = new DeviceSettings(); - $deviceSettings->terminalId = 'EB25033M'; - $deviceSettings->applicationId = 'PI8HD33M'; - $deviceSettings->downloadType = DownloadType::FULL; - $deviceSettings->downloadTime = DownloadTime::NOW; - $deviceSettings->hudsUrl = DownloadEnvironment::DEVELOPMENT; - $deviceSettings->hudsPort = 8001; - - $response = $this->device->startDownload($deviceSettings); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - } - - public function testPartialStartDownload() - { - $this->markTestSkipped('StartDownload skipped'); - - $deviceSettings = new DeviceSettings(); - $deviceSettings->terminalId = 'EB25033M'; - $deviceSettings->applicationId = 'PI8HD33M'; - $deviceSettings->downloadType = DownloadType::PARTIAL; - $deviceSettings->downloadTime = DownloadTime::NOW; - $deviceSettings->hudsUrl = DownloadEnvironment::DEVELOPMENT; - $deviceSettings->hudsPort = 8001; - - $response = $this->device->startDownload($deviceSettings); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - } - - public function testEndOfDayStartDownload() - { - $this->markTestSkipped('StartDownload skipped'); - - $deviceSettings = new DeviceSettings(); - $deviceSettings->terminalId = 'EB25033M'; - $deviceSettings->applicationId = 'PI8HD33M'; - $deviceSettings->downloadType = DownloadType::FULL; - $deviceSettings->downloadTime = DownloadTime::EOD; - $deviceSettings->hudsUrl = DownloadEnvironment::DEVELOPMENT; - $deviceSettings->hudsPort = 8001; - - $response = $this->device->startDownload($deviceSettings); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - } - - public function testCustomStartDownload() - { - $this->markTestSkipped('StartDownload skipped'); - - $deviceSettings = new DeviceSettings(); - $deviceSettings->terminalId = 'EB25033M'; - $deviceSettings->applicationId = 'PI8HD33M'; - $deviceSettings->downloadType = DownloadType::FULL; - $deviceSettings->downloadTime = date('YmdHis'); - $deviceSettings->hudsUrl = DownloadEnvironment::DEVELOPMENT; - $deviceSettings->hudsPort = 8001; - - $response = $this->device->startDownload($deviceSettings); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - } - - public function testLineItem() - { - $lineItemDetails = new LineItem(); - $lineItemDetails->leftText = 'Green Beans, canned'; - $lineItemDetails->rightText = '$0.59'; - $lineItemDetails->runningLeftText = 'TOTAL'; - $lineItemDetails->runningRightText = '$1.19'; - - $this->device->openLane(); - $response = $this->device->lineItem($lineItemDetails); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - * @expectedExceptionMessage Line item left text cannot be null - */ - public function testLineItemLeftext() - { - $lineItemDetails = new LineItem(); - $response = $this->device->lineItem($lineItemDetails); - } - - public function testEnableSafMode() - { - $response = $this->device->setSafMode(1); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - } - - public function testDisableSafMode() - { - $response = $this->device->setSafMode(3); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - } - - public function testSendSaf() - { - $response = $this->device->sendSaf(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - - $this->assertNotNull($response->responseData); - $this->assertNotNull($response->responseData['sendSAF']); - $this->assertNotNull($response->responseData['sendSAF']['approvedSafSummary']); - $this->assertNotNull($response->responseData['sendSAF']['pendingSafSummary']); - $this->assertNotNull($response->responseData['sendSAF']['declinedSafSummary']); - $this->assertNotNull($response->responseData['sendSAF']['offlineApprovedSafSummary']); - $this->assertNotNull($response->responseData['sendSAF']['partiallyApprovedSafSummary']); - $this->assertNotNull($response->responseData['sendSAF']['approvedSafVoidSummary']); - } - - /* - * Note: This sample banner will take 25 minutes to upload. - * Timeout should be handled accordingly - */ - public function testSendFileBanner() - { - $sendFileInfo = new SendFileData(); - $sendFileInfo->imageLocation = dirname(__FILE__) . '/sampleimages/hpa_banner_iSC250_60_480.jpg'; - $sendFileInfo->imageType = HpaSendFileType::BANNER; - - $response = $this->device->sendFile($sendFileInfo); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - } - - /* - * Note: This sample logo will take 20 minutes to upload. - * Timeout should be handled accordingly - */ - public function testSendFileIdleLogo() - { - $sendFileInfo = new SendFileData(); - $sendFileInfo->imageLocation = dirname(__FILE__) . '/sampleimages/hpa_logo_iSC250_272_480.jpg'; - $sendFileInfo->imageType = HpaSendFileType::IDLELOGO; - - $response = $this->device->sendFile($sendFileInfo); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - * @expectedExceptionMessage Input error: Image location / type missing - */ - public function testFileInputError() - { - $sendFileInfo = new SendFileData(); - $this->device->sendFile($sendFileInfo); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - * @expectedExceptionMessage Incorrect file height and width - */ - public function testIncorrectFileSize() - { - $sendFileInfo = new SendFileData(); - $sendFileInfo->imageLocation = dirname(__FILE__) . '/sampleimages/image_500_500.jpg'; - $sendFileInfo->imageType = HpaSendFileType::BANNER; - - $this->device->sendFile($sendFileInfo); - } - - public function testGetDiagnosticReport() - { - $response = $this->device->getDiagnosticReport(30); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - - $this->assertNotNull($response->responseData); - $this->assertNotNull($response->responseData['getDiagnosticReport']); - } - - public function testPromptForSignature() - { - $this->device->openLane(); - $response = $this->device->promptForSignature(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - $this->assertNotNull($response->signatureData); - } - - public function testGetLastResponse() - { - $this->device->openLane(); - $response = $this->device->getLastResponse(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - $this->assertNotNull($response->lastResponse); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/HpaCreditTests.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/HpaCreditTests.php deleted file mode 100644 index 4c83cee..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/HpaCreditTests.php +++ /dev/null @@ -1,225 +0,0 @@ -device = DeviceService::create($this->getConfig()); - - //open lane for credit transactions - $this->device->openLane(); - } - - public function tearDown() - { - $this->waitAndReset(); - } - - protected function getConfig() - { - $config = new ConnectionConfig(); - $config->ipAddress = '10.138.141.20'; - $config->port = '12345'; - $config->deviceType = DeviceType::HPA_ISC250; - $config->connectionMode = ConnectionModes::TCP_IP; - $config->timeout = 180; - $config->requestIdProvider = new RequestIdProvider(); - - return $config; - } - - public function waitAndReset() - { - sleep(3); - $this->device->reset(); - } - - public function testCreditSale() - { - $response = $this->device->creditSale(10) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - $this->assertNotNull($response->transactionId); - } - - public function testCreditAuth() - { - $response = $this->device->creditAuth(10) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - $this->assertNotNull($response->transactionId); - } - - public function testCreditCapture() - { - $authResponse = $this->device->creditAuth(15) - ->execute(); - - $this->assertNotNull($authResponse); - $this->assertEquals('0', $authResponse->resultCode); - $this->assertNotNull($authResponse->transactionId); - - $this->waitAndReset(); - - $response = $this->device->creditCapture(15) - ->withTransactionId($authResponse->transactionId) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - } - - public function testCreditVoid() - { - $saleResponse = $this->device->creditSale(10) - ->execute(); - - $this->assertNotNull($saleResponse); - $this->assertEquals('0', $saleResponse->resultCode); - $this->assertNotNull($saleResponse->transactionId); - - $this->waitAndReset(); - - $response = $this->device->creditVoid() - ->withTransactionId($saleResponse->transactionId) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - } - - public function testCreditRefundByCard() - { - $response = $this->device->creditRefund(15) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - } - - public function testCreditVerify() - { - $response = $this->device->creditVerify() - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - * @expectedExceptionMessage amount cannot be null for this transaction type - */ - public function testSaleWithoutAmount() - { - $response = $this->device->creditSale() - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - * @expectedExceptionMessage amount cannot be null for this transaction type - */ - public function testAuthWithoutAmount() - { - $response = $this->device->creditAuth() - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - * @expectedExceptionMessage amount cannot be null for this transaction type - */ - public function testCaptureWithoutAmount() - { - $response = $this->device->creditCapture() - ->withTransactionId(1234) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - * @expectedExceptionMessage amount cannot be null for this transaction type - */ - public function testRefundWithoutAmount() - { - $response = $this->device->creditRefund() - ->withTransactionId(1234) - ->execute(); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - * @expectedExceptionMessage transactionId cannot be null for this transaction type - */ - public function testCaptureWithoutTransactionId() - { - $response = $this->device->creditCapture(10) - ->execute(); - } - - public function testSaleStartCard() - { - $response = $this->device->startCard(PaymentMethodType::CREDIT); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - - $response = $this->device->creditSale(15) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - $this->assertNotNull($response->transactionId); - } - - public function testLostTransaction() - { - $requestIdProvider = new RequestIdProvider(); - $requestId = $requestIdProvider->getRequestId(); - - $response = $this->device->creditSale(10) - ->withRequestId($requestId) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - - $this->waitAndReset(); - - $lostResponse = $this->device->creditSale(10) - ->withRequestId($requestId) - ->execute(); - - $this->assertNotNull($lostResponse); - $this->assertEquals('0', $lostResponse->resultCode); - $this->assertEquals($requestId, $lostResponse->requestId); - $this->assertEquals('1', $lostResponse->isStoredResponse); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/HpaDebitTests.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/HpaDebitTests.php deleted file mode 100644 index f76dffb..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/HpaDebitTests.php +++ /dev/null @@ -1,119 +0,0 @@ -device = DeviceService::create($this->getConfig()); - - //open lane for Debit transactions - $this->device->openLane(); - } - - public function tearDown() - { - $this->waitAndReset(); - } - - protected function getConfig() - { - $config = new ConnectionConfig(); - $config->ipAddress = '10.138.141.7'; - $config->port = '12345'; - $config->deviceType = DeviceType::HPA_ISC250; - $config->connectionMode = ConnectionModes::TCP_IP; - $config->timeout = 60; - $config->requestIdProvider = new RequestIdProvider(); - - return $config; - } - - public function waitAndReset() - { - sleep(3); - $this->device->reset(); - } - - public function testDebitSale() - { - $response = $this->device->debitSale(10) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - $this->assertNotNull($response->transactionId); - } - - public function testDebitRefund() - { - $saleResponse = $this->device->debitSale(15) - ->execute(); - - $this->assertNotNull($saleResponse); - $this->assertEquals('0', $saleResponse->resultCode); - $this->assertNotNull($saleResponse->transactionId); - - $this->waitAndReset(); - - $response = $this->device->debitRefund(15) - ->withTransactionId($saleResponse->transactionId) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - * @expectedExceptionMessage amount cannot be null for this transaction type - */ - public function testSaleWithoutAmount() - { - $response = $this->device->debitSale() - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - * @expectedExceptionMessage amount cannot be null for this transaction type - */ - public function testRefundWithoutAmount() - { - $response = $this->device->debitRefund() - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - } - - public function testSaleStartCard() - { - $response = $this->device->startCard(PaymentMethodType::DEBIT); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - - $response = $this->device->debitSale(15) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - $this->assertNotNull($response->transactionId); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/HpaEbtTests.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/HpaEbtTests.php deleted file mode 100644 index e850538..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/HpaEbtTests.php +++ /dev/null @@ -1,102 +0,0 @@ -device = DeviceService::create($this->getConfig()); - - //open lane for EBT transactions - $this->device->openLane(); - } - - public function tearDown() - { - $this->waitAndReset(); - } - - protected function getConfig() - { - $config = new ConnectionConfig(); - $config->ipAddress = '10.138.141.7'; - $config->port = '12345'; - $config->deviceType = DeviceType::HPA_ISC250; - $config->connectionMode = ConnectionModes::TCP_IP; - $config->timeout = 180; - $config->requestIdProvider = new RequestIdProvider(); - - return $config; - } - - public function waitAndReset() - { - sleep(3); - $this->device->reset(); - } - - public function testEbtBalance() - { - $response = $this->device->ebtBalance() - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - } - - public function testEbtPurchase() - { - $saleResponse = $this->device->ebtPurchase(10) - ->execute(); - - $this->assertNotNull($saleResponse); - $this->assertEquals('0', $saleResponse->resultCode); - $this->assertNotNull($saleResponse->transactionId); - } - - public function testEbtRefund() - { - $saleResponse = $this->device->ebtPurchase(15) - ->execute(); - - $this->assertNotNull($saleResponse); - $this->assertEquals('0', $saleResponse->resultCode); - $this->assertNotNull($saleResponse->transactionId); - - $this->waitAndReset(); - - $response = $this->device->ebtRefund(15) - ->withTransactionId($saleResponse->transactionId) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - } - - public function testSaleStartCard() - { - $response = $this->device->startCard(PaymentMethodType::EBT); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - - $response = $this->device->ebtPurchase(15) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - $this->assertNotNull($response->transactionId); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/HpaGiftTests.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/HpaGiftTests.php deleted file mode 100644 index ea81039..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/HpaGiftTests.php +++ /dev/null @@ -1,150 +0,0 @@ -device = DeviceService::create($this->getConfig()); - - //open lane for EBT transactions - $this->device->openLane(); - } - - public function tearDown() - { - $this->waitAndReset(); - } - - protected function getConfig() - { - $config = new ConnectionConfig(); - $config->ipAddress = '10.138.141.7'; - $config->port = '12345'; - $config->deviceType = DeviceType::HPA_ISC250; - $config->connectionMode = ConnectionModes::TCP_IP; - $config->timeout = 180; - $config->requestIdProvider = new RequestIdProvider(); - - return $config; - } - - public function waitAndReset() - { - sleep(3); - $this->device->reset(); - } - - public function testGiftSale() - { - $response = $this->device->giftSale(100) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - } - - public function testLoyaltySale() - { - $response = $this->device->giftSale(100) - ->withCurrency(CurrencyType::POINTS) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - } - - public function testGiftAddValue() - { - $response = $this->device->giftAddValue(100) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - } - - public function testLoyaltyAddValue() - { - $response = $this->device->giftAddValue(100) - ->withCurrency(CurrencyType::POINTS) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - } - - public function testGiftVoid() - { - $responseSale = $this->device->giftSale(100) - ->execute(); - - $this->assertNotNull($responseSale); - $this->assertEquals('0', $responseSale->resultCode); - - $this->waitAndReset(); - - $response = $this->device->giftVoid() - ->withTransactionId($responseSale->transactionId) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - } - - public function testGiftBalance() - { - $response = $this->device->giftBalance() - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - } - - public function testLoyaltyBalance() - { - $response = $this->device->giftBalance() - ->withCurrency(CurrencyType::POINTS) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - } - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\BuilderException - * @expectedExceptionMessage amount cannot be null for this transaction type - */ - public function testAddValueWithoutAmount() - { - $this->device->giftAddValue() - ->execute(); - } - - public function testSaleStartCard() - { - $response = $this->device->startCard(PaymentMethodType::GIFT); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - - $response = $this->device->giftSale(100) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - $this->assertNotNull($response->transactionId); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/sampleimages/hpa_banner_iSC250_60_480.jpg b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/sampleimages/hpa_banner_iSC250_60_480.jpg deleted file mode 100644 index 2e87b19de0cf4a20a1ccb54e84c92aa5fd3ca1dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13453 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 diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/sampleimages/hpa_logo_iSC250_272_480.jpg b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/sampleimages/hpa_logo_iSC250_272_480.jpg deleted file mode 100644 index 339091a48e667506f32ca57e635ad82efab91337..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10913 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 M{J--7rqika2BfU)G5`Po diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/sampleimages/image_500_500.jpg b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/HPA/sampleimages/image_500_500.jpg deleted file mode 100644 index db5f5a3eae3e1e6e97e9898e2d63dc473e7f24e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15070 zcmeHt2T)T{yI_#s1?ep!MWl#y5F{!B0wU5oQHnGHL6LwVQBZmj6i^UCuL9DgM!JB~ zi}ZvlJ)wj^LbCCd-I?7tvv1qHd9(k?{U&$jo_p@s&Q}llHyH&uZ>VRW2cV*&0z9Pr z0OVPK4&WRW)!*x11~o19-$6%1LrqIhM^FD37#Nuu85o!t=;@hQnV6VaD1)Anjh&T+ z?eG2HMgG42_btlB!a&dPcgFwPAb$sNFi;&*9a2+W0-WQZqUN9?cL9I^02M6-+rJ3^ z%b+?(O+!mZL5Yc(GNJA~1$}Dja};E0X=o_3Ln+SzG#s>?q6)X@E|@-|zvR!Q_&OgMqJ4`AdHcThnJ6EKtl4e)D>xE6;(BLjq5shboKP_8W@^eSXx=z*xI?c zx;=LH@br52Jn%&jBse7e&D)5`sOXsF_a9PH(>{Jm&&|s(C@d;2DXp%lt*dYN*4Wh1 z+11_C`=hUabZmTLa_aZ=40>sKWp!=+&&DQp|KRWlcZ@$d{Yw`Wfcl@w`mdDzcXV-3 z=sHJ{0S*0Mx~R?tQGl9*hE`O8j`Nl&{UiSimlR(!aNSPIscL5wQ!>MFI|qy~@rWy< zC9r=<`zOl&eT0SmZ&CJN3Hxt!%>Y=asVKsu<^X^IXW4ivf+i6(OcKGX*;QfW!=Kbe zJulN(Y75t`Pgv7nVNBzcrep0}5jt?H<276*F|rT^F^OldpO68Ex2-Mcq+N1{XIfUJ z$4S&;zJm0Z>d;HR>~c zv0|}Huhik(q(KrDcCy*O)H{n7<6BcQ?{mQk>`_0(d%@>HS>rsjkQC)h0Qy@o+sftI ztYY^XYU{!T?Y(U#`5wKc@$ZVcR$8iVNl{l6m3gp>GD;6DNakTjr`IJ`dTdp-QrL^#m0pU6%IBrBnT zgmcqmz=l@fghj85AyV*&!kFTp6n+B!BcL7sDAxp?7->hB7Fe@m=bPc@t=cn}Gb(P? zzN^Tt(rVgsEyUsj^?RTC{|F}jhkM-^n5Z<2gt;>PP+m0&}e!M!6^SxA+es{$oOiiXV>7AZ# z$Xm!UkxR-Q$ACvu93#Pr3>bTUl<9bJW_xhETH2=HG_|B3ln&Acp(4Qzyxog4AY9Kx zExRy;V29O?Wq-4~msi_tbI0?#qit^AzFv{2tN#>Gp>ooFvko6k2GFgO0evT12%I<= zzTp-Rn{V(d4{nq*7-A|=3kqsH<&EQq3DS2x%Xw3n!)D{jl|1o6AFbahkH2EwTkekA z$1Fzpwn;%^Lg@~cZWO*(iIqU6NaStyG2ey=1S3C__L%!fz2icK)wK?R8Px3n8 zIIAb{!((Ci-K@u>i*`d2Wg4ZQcbb*PvEgzZ4>wU(oSz^4GEnPJZf@J1tu~Za+(|$b zh&+aOw3ZL`^hp&H$C?rqiq9D`elPBNgYdeg;Bu2;AKH7l2<%maMqcn-xHjt2HtP4~ zNQPf{*(laF)gv=$T8PfzJ10zeovw(FgcrKs3t z#Fo}kK?blNXg3RYsC;dtWjXyaCFi-{BlA2>WfoR7+hBfhmHjWr3eQ?xFjGW1b`JPM zc*hR`gQ{u2)eMszzsr4OfMsSIcwkC>Zvh#YhfYUkWWeC40#his&t6?i3}Jj85HrPV*Mm_q~BWB?GGA zl@xTELU2sjJ-if{_z~30PPjZn29Pp}zHC9+N3tT!Nd$eOKXC*4HQo8|qGqu@42DCpS10GKXg7J1ueCs7) z%ZbED@GB%6i3gImghNWEp@FQB@NT>O2P$JT9y8CUrWiR>tls4t{yeWFB^T%RYFCMZ zN+-)-Omh{m-eds7nGP8cH`Tj(5^*V>o9SuOp8F|q(!u|`2Ay}h5&y^K&=h^H#^CH) zd(9hx@=)dppQA;*RNCvkatYgVzqTu$Q`hcZHxS%XQ2csYLXWNd4Z_P>6S;i1aQt}F z!VRYj$HLEJLFFB^Ij%wtb{fE~geXCQaXHmmO?d|!!(?u$;FVB!`FQ|N}R!`rWs0ls`> zfFE!=cd9Gx-Ry6Cnf|xy)=_d7mz0|it9@&exu(_-b$T*-%DD6e?5L(yNH*V zif!S~!^7{_g?|^}e{VigWN%>~RUzxF#2EA%q3D=U4YED}YxGq{gHW@H(P`H~I}%vt z4uyW6#V#j4V@u0M@b$q}F>^8iy3iJSn_!(25$_-=tz2}~O$Co&?6Rz`kVb#e^M2ha zt#Yl#z*YjHDfc8zZ@#X^$(^4Jpw*%%XBqJpo(v$|^v+_(&_@N9(|=EA%RbfpARt@G zI*8Qrb@p7iO9ntT_g(b`-W9yyWERm{#D!2^jDS8rd#!zKwzI-ZMDbg7O$u8LTAoW8 zU6K7nfvEw|NAvc+neO*NMg9Qx8AP=;@jPi6ckL_(DuxC1g1K5Qm;HgUe@otnRLBba zG}Z{a6Qd(ronmEc>)OZP?;jqfWldsZ$H$}CV}X2af?G~3Sp5hs(_;O+1sktwPk|3= z<>&O3{d}uGPS+pE5_AGjs)nboUP_hZNR`f?Ne+=YB#;4RK>f~>G&UE13w3w-j-CpU z=ZiP=c@Wo)H)mQ87YKDeiG@g1J-DtY2FgyjLX^Nxbqw))I|)}|Ulb-6EFk2QkLzoG zw_xc}IKXmM49X0>3~z4Jum)+_XS+@L70kV;5&n|)(IUxz}dUGx1}N0~p)l=W{CLo1-Bcxr;O zH%WY=j`f-Sc#CLp>%`G^k9TaCih%|1vp!J^_H6D^c)L0hl?UP@@?s-V>m8X&-DTb= z4X8=chI}FXv7LsuckHUt<@AwHFh3QN&$Qq-v2#s8yxi3GNj|AR4M|NB`JN{cknV1oHwk5j&iOk-?@BMpFy2^3rsOI?G*dyD*qNHeilXI#BY)T=)LegElwO;Hx#O)&G=uL9bqnt@QSn z%~G#{xquXFe%l?l-^APoGT=i>FB#zG3g5t3|4}3I0!d6SmxjV%n&D_*XQ-VI^#cMY z7$0j>d(p8&vM*+oN9@=&n^Uv$SF{+D^;+dnEDVGyQ21AWc&b2n3U6m78W3z?6C%p^ zcVxf?WnthwtZ*0SS;F$YPb;-yG9C}5T{&NmUV8S5F0@SRQpKN%1YnSSr+HdD%iHPbL zm~+`v7Ny=FgVZdFS&D_o2igkob{&<<8Di+lVk6u9i8YA>w$AoQwpVv$o} ziMvpTs)ndU%+2pYNkS-26BSD2MLU8o$K>^p0bdu1Voku<7H0SoJL^^mw8<%{XtREF zel~ZFpXO;E57XBl)07e=Bg*;*yc*Z2yok9oG!t(0*ssP8pLo0Z&QQOI{Q!*%KI+0g zcdeV2itVs@z?qahugP%n}wXpUglk6;Rd#bZ2neW{Tn56Q~Gn^sAD3J z=2Ana{B-A%Zbi;=ynC03I+lAO(=FR+)3<^CRz2g3sWgQM$AY2L>rxlv2L|6y0=L^8$)A$Kp5Q%wKT{wr0>}KcwbKO1aY8u6Jyn*Y-n${adm2;}+r3R-68}2<* zl-#|`agA^8`>A^AQI$$gWWiO(3x2E54i*Ia0RS1iNk51+*x(P?cv)7T zxv-)C6F-E*p4C?(ePiV#7A{WZL;!gpa9xDn|r%0)DW&_;1@g)Ko1th%%2@_gvmVr&T zk<|j}&m-W0pM`VqoynOK;QbL@{>pq%=It1%zX@9U-?&eSl8in6@5)mHL*ZLD`t4opN{G9dgJ z8L)DuGDP5%M;=!9ApO`4_XB{(x|>5|T0WFgT`n9IxdK-QveOfNcq#nA*~q~Ui64-d z2iVXhAYQ7sJIcr9+qdxwEth9L-dt31qjx1Zx{B!~61V^wg9`ecizkL^kz~O3*ID?+ zi8m#j3d_`y-=;WGT0d+=E#`;ISc_31B=}bcv_b#>F{NpBESaBU}2i|X;zv_d98O8f@L>He{S$bJgky5465CY#Hiuy zu)N)F=~LDt&oj?&@lajWDn4@j!&++~IXSzo*%LEsfA&!QhRhN$5{|JB^(HYf60~5$ z>DVDqZJ)Z^jrQbfev!9!N=U{6JgZdR;xjd|50|iqzLV(E@ z%U`xM`xTT+9zJ5?td%y_3}{rYf6;91D6-xTsx#S9!U~d@Y6w<3?s+qtGj$auAvoB1 zOpBsV%*>oy%CyZJ&RXv^Bbj%+^b)23A>__$0v&{a<88uBAQQz#9(}`FD9zdF7cGPq zJ$%z8&i3LJo124+#`d=v%#KbHlkf9?yS&n{5kQ4vm-?a6!;X^4IQ2Q_j z{{7mXVT$rwmEj&`0@-C7eC4|NxwgX44htUP&7Pq-2I81*-FG;?A;zC16(Y7 z_b19Whw!SC(_&|_EpC^J55%z(KU}urwL7`@6L-87hbViG=PZ3Xn7TVn8kR?J0FDcs z4v<*CE#oAyugQRt%`Gy(_%t+x4|Mzo{u*`{FLLz-s)Z8l6!#-e1N4XBn1CVTXZ=nf zf!7y#m~TCg!03Ta^!z%Irw0@@9DDlfMPZ106WZtTL1s-~ zF@E7Q>MAxnuCCV?vMpT$-&M+S*{9IBCn`8bIbZPm`GPu#$knqLWP-Q%L=@pr<-e@E zaN2(pz;908BC;MiV^6ddje<(G=JdG?DtKP_;Vkv;9-7H?$J^?CF6o|4f8qDzES5VJ zz4ch#ArSIXKeD5-N8WzG$n&^hZC3}INMa1a2H^tFK3gxj$31sc>pTU1^5dvV#oC)j z4Wh*snZmeM;!1o5=BVG@xPY^!7*=)C1Q5rEStO;+TF-$n{`%cJYLrZ|YBCl@2Gre| z>5Wq%1m`ta3;wG6>gk#RoaYQ?-gOm;XcIb1DWo_DnxM1NJd(;pi{i>l;oEcUE8e+< z0+}r4MJ6W_$I}Q<3YHFZ9bIZegqrzr>+1Cnq*xaDIr>(vylfx}Dv<#a`pfiZVTYAx z!a=qaIsc%flW*`8COhv;kv_zXQ_Pwh#jF((A5zS=)q64^uVPDv#AXY^z5}zsw;h|v zfYBuT$`dX)_-8N&8SuX140O!61gtNZtt4L1!D%*}v^3OU??sM1MK(~A0k>67DW;N+ z46xS$5-+6byUw=x1X%?8pP`>xxRcJ6;hm8nGT?~`&96`jZT@E;h=#?#{0bJgt~O3dULM)A1&jqZ#HDLz_zVAPcy(x_Y&)Ymmy69$ zU3$uXuQ*j)tVZwqz5=+2vP;^@0D)mVMNCe-pi_H)`-dw9A1508`g>!0)a^dP*{hoZ zEfF_JX6DI60qxI~qFDDGdl&THtWF1#-rSJVG{w?KUOn0>zh_)8r;>cLK6OQh)SYAw*1sb}p!`^K+$a2_WjRm}jBC7(3=kwfnRwt?-_+XLy;>OU zi4F}itTGj7e5b3G`gLK)jTZRe>CLsaS48pCDcrBK$`*bCBk7m66uw}2tFIiYhJN`- zHrfyP>Df!Are4ZJ_0PzMvZ@uy4nzo zW=<4_czA^*&SY4PWv|^yx@Y=vjY0SnK5#{c#_hoYyxsj0I2K+H-&VqeotXKt<7<{e zhhmQSgy<6X2y9(*`pn_SNpb7a5OFp(IxTBlH)VUq;K9rK-Qbzdn^@lO!Y=J_jy5Wy zC^iRkoDf(RR^v2X8((xA_x0n4D0vYbX@gYS2dK>HZ1&+H{N?o>7x|rbf*^!`X>Nf( zgCY@3=0=g3@g*ZPbTa9a>)nHEcRP1=tqHO5_?`5kCD5$)6eXPwi-7o{XheXG&Es`L zG)|Dsb!*;7Vq-hmEeRto3O*7)lMUi_1z#Mhoairs`JoWQc*Aa zIig_;Ugrx@;_Q8k#u94?LBCeNskyN+V!6wpFt3K%kE>FUHz{EDk*;V`=3V;T-=9T# zT4e5>)j3a)0jT_@qU~cpbl>McNH!F9bt+01v%eHvM_*$^2@Ti%Efi0(+)dKlvDPbl zL~cJ4lfkkZo(hvjNjET~b`70y0S6-YaEpH~Ua)YvEbdM( zm(ty4gg;ZiVZ$8!t8EjOk|<>02C+N^LhvV;`gjzWsl!<_PtQluek0A2vv`3f&5_iH|&!;5rVW@;pftFeMYS%kiC9f@6 z`xT31z37i|m1%VVkOyfvdj$8&LY)tx6kzOGt*ekwn)clw44ifNw8{DQlN>f_q*8B2@PI=7n7N{Mc) zQ#&e{A*YrJfza!kHK-lcd8;Mn9}VgUd+rBGR;&GeY)hrK+*|Im@Jc6s|B%fq9<0df7JU|$PIZTWMkb}`B-0k{=wCJ4w;|V zR((F!sC`6NK&8&UB0ck*8`LtbzLNSr;<@Oy-@aVb$N0|rM`bv@T9J_Ds2#eOh#~gYw z%tF#NN-kc~sm|Gtn}%)#IV0(y!f5$;V8d~DB3^Q*ryPsyw&RUz(M8GGcd7CE+jKwk z&#%uCr#4&oskIfm`Pnck5p2w2}K?Mg|lk5BsQyEA4uS{Q$uzYxPy@i_vCP%R> z?}>NX8o_F$^NRov0jJMD;mZ?ydv*4)J8h%oSs94aW4peyJgCAK(iphb4cXx+-{T~U z;f**1vQ@?q&EaUHz3qADeedRIpXX)Io0#m>pSc(RlKiQuQdgb2|1$~&)Mrjn4$Te` zATEw+`C~P42)xF#;3f9h1x1V{@|8CIMw|3RojgnJ_0XQWik6w5G9^3=mJfSA9H>;k z7RrJe21HpNwq1kdEwg_|GD5=bGM0FwD~X|4B@{SHWvg7$cBB^03Mu3r^*JmU6J-#X z6jd$KQlI-J)eyZRFXjG_eV7c;5-_Q~syWq}rHSYUR;$I3E_QOB z0WmEW!-H)cNYcnlqq1g(bHV=n%bB{ZSyNFa-khb{$E@v8dVC}WZ5VKjcmcDwOy6yk zNZD3`SG7RiORO-#4_IXpAee>>@N}|IMMh|T&eSd7FqZa<9en$)x>w{T=0b zx01jNP`a~RmCEUZZaXi0XRnhaR_zs320auLFu&+k9a}c=1FE@X#Ne~?2_s-1<>T5C z9(y_CcNf`v=+XN9rb;N>ubGL(W z^ib8_weD^`9|@0znUH!IA6}ls*os}ePf^zJKW)+oG(0L7vxDr~3Vm#Z^U(TGd25hyP1Hc(GuMhy9ZGF@ zUhK}$MK^xuihTBW>xZ8&`_u+&v0Z;@tsKxK{dvRN)BDd*e)-Z1PptvwPy0QJoxMro znFYK}DYNsiI1;7LiN1kF#uC+vDCJR??xw=`?&{w1ta9C5Se+}EMI5um=?8>-99E{b zdx;#CB*u|oN?tjTC7rRvlRDXU317t*X+FBTWG}4XoUC4+5A2i)KG1wU7II~kHME)j zjdHW2V;w_ntM-lC_jVhNTx}C8!2Ii5){~$Qq?A|*l|jRpO?D`QBv32?I~@E3ANf^Y$9c$T28G!F?f8-^M#P9MMVn3<3N{EMzcpkeoM zn8%dJBggz~(UAlOA@`9MN_mB*0^gcX8dwmac(EK(-*7O)l=J)kAB4Kk0oSEZn{TAKjF&9Kyro9G;<(Vhp5DO) zBRJ#DQMf;TnxF$40&~_S;xGAqM=hcyx#)hZg}U^Gq7F9P-$&I3nPDE z+?Nr+Pk_X@dlJ|R-i`z^6HPH`IBl#|#?lZAa9iWgG&U$ zMuP)xE0!`lTRnMX40}#-+v?g>_*uuZCT(6Pd&uQ(^VvVzSH8B4SHP=^I6Q}Yuh+Cx zm_PB#2Da!MlA;!F^cIEa#~~ko*;;*C5@i!xdwBBuND;)P(D*`MD{)%ysh5H3{8G`& zjVY^{-$a>k5@Q{974D~uRU=B10hH|Kp?uftvW%VKV6ZD`@+c?8?#}CTf;$F3@5pdT~{)U+a?BZm90x)E?s^aD6-;XwrRrVq^5mz>I$P zX58{F8E{l=)8s1LO9*;UI_y-JvC&Oz=qe&YSvR~>bxQS^(`hSB(q_V?K0e|&Oe*eIilEVs z<)Dy!A#4y>!`^MeMB$q<8Q{gvvI%A(iP~-nthDhW48OkboC14}x3n551#?6l_nUIt zhK1J!s|!u-?2g)GwyY)P{LBOyTI`3Idd@HWQd>CXPQboY=+?8C=aYJQ_r8L4ZLkEt zRC%rM_0}WzRZ2Cp0i)Inq$i0%tunev4A`_cIpfOn3UaPf%9`aWS3kKm$%-lI<@86G z-CpPC-;_}!vGL;Bmxp2z!Z2Y+h|%{pRjgZiR`@gSt{KVjpb~xGHPrcp;huJzgqz}= zGDrT_-p^0XYT;^ziv(4m)oJ;B^U=b3Ov~*a_!sz=d`)6)LuaLYd*1@VdlO2HDZ&X% zf;>&|qC*id-Yo&Q^$4h&pSub!ldi^H?lX=T3!XD#NY&uda=s&}Xt*N2`bx`v{|b1? zdOH()pI{te!VlHPrc@A^Kl->KOj_NBq*z?}#h#pF+O^`l`0iHa#t+@z`O-9)P}R7+ zbJMr4HCdaBXBMM3%f;b(Vq%ytRkruM_P_NNaeHS~vfvA%21KO!VmQhSTUOP0t3PDU zS7eTj=}#-2jGbj8AHji8CVVJn@4;k?+LA$w?sA#tFE8ALtb3M^wvx0g$Kbi-_lmno zDQyqk+9{DA#ox9I$@wWS;w6VV2#&W0cRThMW^h+7HonbCz0vgchhWkxv5V9{{@ki8 zNK(a#X@B^GhatdTWAv$=?3Ux<^Y;7Ws3jyvRWQ!cM84bHDA^a{PZ#Py9Eg%yJSm3)MBwryjg`ow|>UyO53rQc5cA z%G$yZU?+mzSDOo}f)7F?ERVpRhdboMTr_Pm5G`=XZyMq> z(6o9_Xq2zr!8#un0KG-2ZDyUlZIgzLU4shaGclJRjL4C$LFutVO>429WxrOYH|r02 zqMtpn=VKvRh_P7Ovc%XLSOFy<2PDQs!XwykO0fa%wZ{*AFihgXyD#naEV4j?+Ovd4 zl`|hr_ILCQJhU4?-jn@8nGWrrS{wV!!)+x`M=gzg4~g@pxTDm7LO*cO%PAp<@v1{{olK= zVR)5GT|-0l!F{^EYssq`v%Qy9j_5zMAk{^GtH@FCW2)v!p29hT_1ZM&ic3NYc8YjmkHlz9Fd~Yd<-=(Eu#)T%RmAIf zvE@X8t)XWHn~J~6@D)CGGb=i!^S*+vk7PH5yk6W*$~$?5Rytj{WIB_Sh&rr$H>J7v3_}TlGgF^#30VCj|8AF%$w3i^~564gRMoCk%)VEOM)EY?WttorD}MGnH~3hqI@h|nwHKtzhQnE z(SUSEPA|5@tC1b7m%qaR!#+ec^bPhwRXeC+-=&VnpVm_ve*D}Xl1H&Yz+3hxU3ZgDhmx(rUs3VrytBrs1sN4nT3J!M?nMhe06EvT6Q&Vzu zGV)`Q5w0~3y!Q0`L+V%Rl_O+;s3$b#(kqY>lyXjhW{Pq`0Hcp9JbMqlg=$U&bfPOG zD4Qo24_=zhXj}-cHF_}%yFc*(TwD}>vQq}lVtz_UVS zWW=dSycQ5u0%i1rqazZGhJ=kJ`VAy&LY(i!bLnvE3cb`J4jSs6D>)O{PaAz3ZC(I? zHe<O9mU^BdqmWe~G_dV!7S6~~7t#NIunw}f zVvww njT6#VRU-zJa>>A^nT+cSAR@>N1C*1QX*ieby7lt9lz%DU2{}-e@aeeR>*8@USiYx^b;r zyy05%sN?1r9zA(v0Ha208!tnt&8?MNu0~gFN{wHq@Dnuq!G=Gu`mdfN_!m6JyiyH< zFGn8HPRKIXu-D9e3AiKv{URr)H9#maL;VL00O~?XNRdL?5}QvcMLBIjJe+jFNS^bL zVkhQTiz!QqYJ5R&2?KH9fUki!mkh8M`hho#|W7{q^ zMCOkRnqd=~%PKyF9G{<^Uv&K4S)j`Z8Ogs}`$Hn?M}PbW@H;0*1&6Jms<4}MyyI+1?vi>;PTcK- z`tyIT)kUjyX7a2rNmRzdevice = DeviceService::create($this->getConfig()); - - //open lane for credit transactions - $this->device->openLane(); - } - - protected function getConfig() - { - $config = new ConnectionConfig(); - $config->ipAddress = '10.138.141.5'; - $config->port = '12345'; - $config->deviceType = DeviceType::HPA_ISC250; - $config->connectionMode = ConnectionModes::TCP_IP; - $config->timeout = 300; - $config->requestIdProvider = new RequestIdProvider(); - - return $config; - } - - public function tearDown() - { - sleep(3); - $this->device->reset(); - } - - private function printReceipt($response) - { - $receipt = "x_trans_type=" . $response->response; - $receipt .= "&x_application_label=" . $response->emvApplicationName; - $receipt .= "&x_masked_card=" . $response->maskedCardNumber; - $receipt .= "&x_application_id=" . $response->emvApplicationId; - $receipt .= "&x_cryptogram_type=" . $response->emvCryptogramType; - $receipt .= "&x_application_cryptogram=" . $response->emvCryptogram; - $receipt .= "&x_expiration_date=" . $response->expirationDate; - $receipt .= "&x_entry_method=" . $response->entryMethod; - $receipt .= "&x_approval=" . $response->approvalCode; - $receipt .= "&x_transaction_amount=" . $response->transactionAmount; - $receipt .= "&x_amount_due=" . $response->balanceAmountDue; - $receipt .= "&x_customer_verification_method=" . $response->emvCardHolderVerificationMethod; - $receipt .= "&x_response_text=" . $response->responseText; - $receipt .= "&x_signature_status=" . $response->signatureStatus; - print($receipt); - } - - /* - TEST CASE #1 – Contact Chip and Signature – Offline - Objective Process a contact transaction where the CVM’s supported are offline chip and signature - Test Card Card #1 - MasterCard EMV - Procedure Perform a complete transaction without error.. - Enter transaction amount $23.00. - */ - - public function testCase01() - { - $response = $this->device->creditSale(23) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - - print("Response: " . print_r($response, true)); - print("Gateway Txn ID: " . $response->transactionId); - - $this->printReceipt($response); - } - - /* - TEST CASE #2 - EMV Receipts - Objective 1. Verify receipt image conforms to EMV Receipt Requirements. - 2. Verify that signature capture functionality works. - Test Card Any card brand – Visa, MC, Discover, AMEX. - Procedure Run an EMV insert sale using any card brand. - The device should get an Approval. - Cardholder is prompted to sign on the device. - */ - - public function testCase02() - { - // print receipt for TestCase01 - $this->testCase01(); - } - - /* - TEST CASE #3 - Approved Sale with Offline PIN - Objective Process an EMV contact sale with offline PIN. - Test Card Card #1 - MasterCard EMV - Procedure Insert the card in the chip reader and follow the instructions on the device. - Enter transaction amount $25.00. - When prompted for PIN, enter 4315. - If no PIN prompt, device could be in QPS mode with limit above transaction amount. - */ - - public function testCase03() - { - $response = $this->device->creditSale(25) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - - print("Response: " . print_r($response, true)); - print("Gateway Txn ID: " . $response->transactionId); - - $this->printReceipt($response); - } - - /* - TEST CASE #4 - Manually Entered Sale with AVS & CVV2/CID (If AVS is supported) - Objective Process a keyed sale, with PAN & exp date, along with Address Verification - and Card Security Code to confirm the application can support any or all of these. - Test Card Card #5 – MSD only MasterCard - Procedure 1. Select sale function and manually key Test Card #5 for the amount of $90.08. - a. Enter PAN & expiration date. - b. Enter 321 for Card Security Code (CVV2, CID), if supporting this feature. - Enter 76321 for AVS, if supporting this feature. - */ - - public function testCase04() - { - $response = $this->device->creditSale(90.08) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - - $this->assertEquals("Zip and address match.", $response->avsResponseText); - $this->assertEquals("Not Processed.", $response->cvvResponseText); - - print("Response: " . print_r($response, true)); - print("Gateway Txn ID: " . $response->transactionId); - - $this->printReceipt($response); - } - - /* - TEST CASE #5 - Partial Approval - Objective 1. Ensure application can handle non-EMV swiped transactions. - 2. Validate partial approval support. - Test Card Card #4 – MSD only Visa - Procedure Run a credit sale and follow the instructions on the device to complete the transaction. - Enter transaction amount $155.00 to receive a partial approval. - Transaction is partially approved online with an amount due remaining. - */ - - public function testCase05() - { - $response = $this->device->creditSale(155) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals("10", $response->responseCode); - $this->assertEquals(55, $response->balanceAmountDue); - - print("Response: " . print_r($response, true)); - print("Gateway Txn ID: " . $response->transactionId); - - $this->printReceipt($response); - } - - /* - TEST CASE #6 - Online Void - Objective Process an online void. - Test Card Card #3 – EMV Visa w/ Signature CVM - Procedure Enter the Transaction ID to void. - Pass Criteria Transaction has been voided. - */ - - public function testCase06() - { - $response = $this->device->creditSale(10) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - - $this->device->reset(); - - $voidResponse = $this->device->creditVoid() - ->withTransactionId($response->transactionId) - ->execute(); - - $this->assertNotNull($voidResponse); - $this->assertEquals("00", $voidResponse->responseCode); - - print("Response: " . print_r($voidResponse, true)); - print("Gateway Txn ID: " . $voidResponse->transactionId); - } - - /* - TEST CASE #7 - Debit Sale (with Cash Back) & Debit Void - Objective Confirm support of PIN debit sale, cash back, and debit void. - Test Card Confirm support of PIN debit sale, cash back, and debit void. - Procedure Debit Sale with Cash Back: - Run a debit sale for $10.00 and follow the instructions on the device to complete the transaction. - When prompted for Cash Back, enter $5.00 for the cash back amount. - When prompted for PIN, enter 1234. - Transaction is approved online. - - Void: - Enter the Transaction ID to void. - Transaction has been voided. - - Pass Criteria The transaction is approved online. - The transaction has been voided. - */ - - /** - * @expectedException GlobalPayments\Api\Entities\Exceptions\UnsupportedTransactionException - */ - public function testCase07() - { - $response = $this->device->debitSale(10) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - - print("Response: " . print_r($response, true)); - print("Gateway Txn ID: " . $response->transactionId); - - $voidResponse = $this->device->debitVoid() - ->withTransactionId($response->transactionId) - ->execute(); - } - - /* - TEST CASE #8 – Process Lane Open on SIP - Objective Display line items on the SIP. - Test Card NA - Procedure Start the process to open a lane on the POS. - */ - - public function testCase08() - { - $response = $this->device->openLane(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - } - - /* - TEST CASE #9 – Credit Return - Objective Confirm support of a Return transaction for credit. - Test Card Card #4 – MSD only Visa - Procedure 1. Select return function for the amount of $9.00 - 2. Swipe or Key Test card #4 through the MSR - 3. Select credit on the device - */ - - public function testCase09() - { - $response = $this->device->creditRefund(9) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - - print("Response: " . print_r($response, true)); - print("Gateway Txn ID: " . $response->transactionId); - } - - /* - TEST CASE #10 – HMS Gift - Objective Transactions: Gift Balance Inquiry, Gift Load, Gift Sale/Redeem, Gift Replace - Test Card Gift Card (Card Present/Card Swipe) - Procedure Test System is a Stateless Environment, the responses are Static. - 1. Gift Balance Inquiry (GiftCardBalance): - a. Should respond with a BalanceAmt of $10 - 2. Gift Load (GiftCardAddValue): - a. Initiate a Sale and swipe - b. Enter $8.00 as the amount - 3. Gift Sale/Redeem (GiftCardSale): - a. Initiate a Sale and swipe - b. Enter $1.00 as the amount - 4. Gift Card Replace (GiftCardReplace) - a. Initiate a Gift Card Replace - b. Swipe Card #1 – (Acct #: 5022440000000000098) - c. Manually enter Card #2 – (Acct #: “5022440000000000007”) - */ - public function testCase10a() - { - $response = $this->device->giftBalance() - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - $this->assertEquals('10', $response->availableBalance); - - print("Response: " . print_r($response, true)); - print("Gateway Txn ID: " . $response->transactionId); - } - - public function testCase10b() - { - $response = $this->device->giftAddValue(8) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - - print("Response: " . print_r($response, true)); - print("Gateway Txn ID: " . $response->transactionId); - } - - public function testCase10c() - { - $response = $this->device->giftSale(1) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - - print("Response: " . print_r($response, true)); - print("Gateway Txn ID: " . $response->transactionId); - } - - /* - TEST CASE #11 – EBT Food Stamp - Objective Transactions: Food Stamp Purchase, Food Stamp Return and Food Stamp Balance Inquiry - Test Card Card #4 – MSD only Visa - Procedure Test System is a Stateless Environment, the responses are Static. - 5. Food Stamp Purchase (EBTFSPurchase): - c. Initiate an EBT sale transaction and swipe Test Card #4 - d. Select EBT Food Stamp if prompted. - e. Enter $101.01 as the amount - 6. Food Stamp Return (EBTFSReturn): - b. Intitiate an EBT return and manually enter Test Card #4 - c. Select EBT Food Stamp if prompted - d. Enter $104.01 as the amount - 7. Food Stamp Balance Inquiry (EBTBalanceInquiry): - c. Initiate an EBT blance inquiry transaction and swipe Test Card #4 Settle all transactions. - */ - - public function testCase11a() - { - $response = $this->device->ebtPurchase(101.01) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - - print("Response: " . print_r($response, true)); - print("Gateway Txn ID: " . $response->transactionId); - } - - public function testCase11b() - { - $response = $this->device->ebtRefund(104.01) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - - print("Response: " . print_r($response, true)); - print("Gateway Txn ID: " . $response->transactionId); - } - - public function testCase11c() - { - $response = $this->device->ebtBalance() - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - - print("Response: " . print_r($response, true)); - print("Gateway Txn ID: " . $response->transactionId); - } - - /* - TEST CASE #12 – EBT Cash Benefits - Objective Transactions: EBT Cash Benefits with Cash Back, EBT Cash Benefits Balance Inquiry -and EBT Cash Benefits Withdraw - Test Card Card #4 – MSD only Visa - Procedure - 1. EBT Cash Benefits w Cash Back (EBTCashBackPurchase): - a. Initiate an EBT sale transaction and swipe Test Card #4 - b. Select EBT Cash Benefits if prompted - c. Enter $101.01 as the amount - d. Enter $5.00 as the cash back amount - e. The settlement amount is $106.01 - 2. EBT Cash Benefits Balance Inquiry (EBTBalanceInquiry): - a. Initiate an EBT cash benefit balance inquiry transaction and swipe Test Card #4 - 3. EBT Cash Benefits Withdraw (EBTCashBenefitWithdrawal): - a. Initiate an EBT cash benefits withdraw transaction and manually -enter Test Card #4. - b. Select EBT Cash Benefits Withdraw if prompted - c. Enter $111.01 as the amount - d. The settlement amount is $111.01 - e. Settle all transactions - */ - - public function testCase12a() - { - $response = $this->device->ebtPurchase(101.01) - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - - print("Response: " . print_r($response, true)); - print("Gateway Txn ID: " . $response->transactionId); - } - - public function testCase12b() - { - $response = $this->device->ebtBalance() - ->execute(); - - $this->assertNotNull($response); - $this->assertEquals('0', $response->resultCode); - - print("Response: " . print_r($response, true)); - print("Gateway Txn ID: " . $response->transactionId); - } - - /* - TEST CASE #13 – Batch Close - (Mandatory if Conditional Test Cases are ran) - Objective Close the batch, ensuring all approved transactions (offline or online) are settled. - Integrators are automatically provided accounts with auto-close enabled, so if manual batch transmission - will not be performed in the production environment then it does not need to be tested. - Test Card N/A - Procedure Initiate a Batch Close command - Pass Criteria Batch submission must be successful. - Batch Sequence #: - References  HPA Specifications. - */ - public function testCase13() - { - $this->device->closeLane(); - $this->device->reset(); - - $response = $this->device->batchClose(); - $this->assertNotNull($response); - - $this->assertEquals('0', $response->resultCode); - - print("Response: " . print_r($response, true)); - print("Gateway Txn ID: " . $response->transactionId); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/RequestIdProvider.php b/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/RequestIdProvider.php deleted file mode 100644 index 552b8ed..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/test/Integration/Gateways/Terminals/RequestIdProvider.php +++ /dev/null @@ -1,14 +0,0 @@ -number = '4111111111111111'; - $card->expMonth = 12; - $card->expYear = 2025; - $card->cvn = '123'; - $card->cardHolderName = 'Joe Smith'; - $this->card = $card; - - ServicesContainer::configure($this->getConfig()); - } - - /** - * @expectedException \GlobalPayments\Api\Entities\Exceptions\BuilderException - * @expectedExceptionMessage amount cannot be null for this transaction type. - */ - public function testCreditAuthNoAmount() - { - $this->card->authorize() - ->execute(); - } - - /** - * @expectedException \GlobalPayments\Api\Entities\Exceptions\BuilderException - * @expectedExceptionMessage currency cannot be null - */ - public function testCreditAuthNoCurrency() - { - $this->card->authorize(14) - ->execute(); - } - - /** - * @expectedException \GlobalPayments\Api\Entities\Exceptions\BuilderException - * @expectedExceptionMessage paymentMethod cannot be null - */ - public function testCreditAuthNoPaymentMethod() - { - $this->card->authorize(14) - ->withCurrency('USD') - ->withPaymentMethod(null) - ->execute(); - } - - /** - * @expectedException \GlobalPayments\Api\Entities\Exceptions\BuilderException - * @expectedExceptionMessage amount cannot be null - */ - public function testCreditSaleNoAmount() - { - $this->card->charge() - ->execute(); - } - - /** - * @expectedException \GlobalPayments\Api\Entities\Exceptions\BuilderException - * @expectedExceptionMessage currency cannot be null - */ - public function testCreditSaleNoCurrency() - { - $this->card->charge(14) - ->execute(); - } - - /** - * @expectedException \GlobalPayments\Api\Entities\Exceptions\BuilderException - * @expectedExceptionMessage paymentMethod cannot be null - */ - public function testCreditSaleNoPaymentMethod() - { - $this->card->charge(14) - ->withCurrency('USD') - ->withPaymentMethod(null) - ->execute(); - } - - protected function getConfig() - { - $config = new ServicesConfig(); - $config->secretApiKey = 'skapi_cert_MTeSAQAfG1UA9qQDrzl-kz4toXvARyieptFwSKP24w'; - $config->serviceUrl = ($this->enableCryptoUrl) ? - 'https://cert.api2-c.heartlandportico.com/': - 'https://cert.api2.heartlandportico.com'; - return $config; - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/Unit/Gateways/RealexConnector/CreditTest.php b/classes/includes/vendor/globalpayments/php-sdk/test/Unit/Gateways/RealexConnector/CreditTest.php deleted file mode 100644 index 3530166..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/test/Unit/Gateways/RealexConnector/CreditTest.php +++ /dev/null @@ -1,47 +0,0 @@ -number = '4111111111111111'; - $card->expMonth = 12; - $card->expYear = 2025; - $card->cvn = '123'; - $card->cardHolderName = 'Joe Smith'; - $this->card = $card; - - ServicesContainer::configure($this->getConfig()); - } - - /** - * @expectedException \GlobalPayments\Api\Entities\Exceptions\UnsupportedTransactionException - * @expectedExceptionMessage selected gateway does not support this transaction type - */ - public function testCreditReverse() - { - $this->card->reverse(15) - ->withAllowDuplicates(true) - ->execute(); - } - - protected function getConfig() - { - $config = new ServicesConfig(); - $config->merchantId = 'realexsandbox'; - $config->accountId = 'internet'; - $config->sharedSecret = 'Po8lRRT67a'; - $config->serviceUrl = 'https://test.realexpayments.com/epage-remote.cgi'; - return $config; - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/test/setup.php b/classes/includes/vendor/globalpayments/php-sdk/test/setup.php deleted file mode 100644 index fd349ea..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/test/setup.php +++ /dev/null @@ -1,3 +0,0 @@ - Date: Thu, 8 Jul 2021 19:00:08 +0530 Subject: [PATCH 6/8] changes for subscribe --- assets/js/securesubmit.js | 3 +- classes/class-gf-securesubmit.php | 322 ++++++++++++------------------ 2 files changed, 134 insertions(+), 191 deletions(-) diff --git a/assets/js/securesubmit.js b/assets/js/securesubmit.js index 529efd8..40240d3 100755 --- a/assets/js/securesubmit.js +++ b/assets/js/securesubmit.js @@ -39,7 +39,7 @@ // Initialize spinner if (!this.isAjax) { - gformInitSpinner(this.formId); + //gformInitSpinner(this.formId); } if (this.isSecure) { @@ -281,7 +281,6 @@ // Handles tokenization response this.secureSubmitResponseHandler = function (response) { - // Preevent any wierdness if ($('#securesubmit_response').length) { return false; diff --git a/classes/class-gf-securesubmit.php b/classes/class-gf-securesubmit.php index 1cbc7ec..9ab85b6 100755 --- a/classes/class-gf-securesubmit.php +++ b/classes/class-gf-securesubmit.php @@ -13,9 +13,15 @@ use GlobalPayments\Api\Entities\Enums\AccountType; use GlobalPayments\Api\Entities\Enums\CheckType; use GlobalPayments\Api\Entities\Enums\EntryMethod; +use GlobalPayments\Api\Entities\Enums\ExceptionCodes; +use GlobalPayments\Api\Entities\Enums\ScheduleFrequency; use GlobalPayments\Api\Entities\Enums\SecCode; use GlobalPayments\Api\PaymentMethods\ECheck; use GlobalPayments\Api\Entities\EcommerceInfo; +use GlobalPayments\Api\Services\ReportingService; +use GlobalPayments\Api\Entities\Exceptions\ApiException; +use GlobalPayments\Api\Entities\Exceptions\GatewayException; +use GlobalPayments\Api\Entities\Exceptions\ArgumentException; @@ -248,16 +254,14 @@ public function ajaxValidateSecretApiKey() $this->includeSecureSubmitSDK(); $config = $this->getHpsServicesConfig(rgpost('key')); - $service = new HpsCreditService($config); + $service = new ReportingService(); $is_valid = true; try { - $service->get('1'); - } catch (HpsAuthenticationException $e) { + $service->transactionDetail("1")->execute(); + } catch (ApiException $e) { $is_valid = false; - } catch (HpsException $e) { - // Transaction was authenticated, but failed for another reason } $response = $is_valid @@ -1079,7 +1083,7 @@ public function validation($validation_result) * ] */ public function authorize($feed, $submission_data, $form, $entry) - { + { $auth = array( 'is_authorized' => false, 'captured_payment' => array('is_success' => false), @@ -1088,6 +1092,7 @@ public function authorize($feed, $submission_data, $form, $entry) $submission_data = array_merge($submission_data, $this->get_submission_dataACH($feed, $form, $entry)); $isCCData = $this->getSecureSubmitJsResponse(); + if (empty($isCCData->token_value) && false !== $this->isACH && !empty($submission_data['ach_number'])) { $auth = $this->authorizeACH($feed, $submission_data, $form, $entry); @@ -1212,7 +1217,7 @@ private function authorizeACH($feed, $submission_data, $form, $entry) 'note' => $note, ), ); - } catch (HpsCheckException $e) { + } catch (GatewayException $e) { do_action('heartland_gravityforms_transaction_failure', $form, $entry, $e); $err = null; if (is_array($e->details)) { @@ -1247,7 +1252,7 @@ private function authorizeACH($feed, $submission_data, $form, $entry) $auth = $this->authorization_error($err); $auth['transaction_id'] = (string)$e->transactionId; - } catch (HpsException $e) { + } catch (Exception $e) { do_action('heartland_gravityforms_transaction_failure', $form, $entry, $e); // if advanced fraud is enabled, increment the error count if ($enable_fraud) { @@ -1428,7 +1433,7 @@ private function authorizeCC($feed, $submission_data, $form, $entry) $config = $this->getHpsServicesConfig($this->getSecretApiKey($feed)); $cardHolder = $this->cardHolderData($feed, $submission_data, $entry); $address = $this->buildAddress($feed, $submission_data, $entry); - + /** * if fraud_velocity_attempts is less than the $HeartlandHPS_FailCount then we know * far too many failures have been tried @@ -1516,7 +1521,7 @@ private function authorizeCC($feed, $submission_data, $form, $entry) } $transaction = $capt_transaction->execute(); } - do_action('heartland_gravityforms_transaction_success', $form, $entry, $transaction, $response); + do_action('heartland_gravityforms_transaction_success', $form, $entry, $transaction, null); self::get_instance()->transaction_response = $transaction; if ($this->getSendEmail() == 'yes') { @@ -1570,12 +1575,12 @@ private function authorizeCC($feed, $submission_data, $form, $entry) 'is_success' => true, 'transaction_id' => $transaction->transactionId, 'amount' => $submission_data['payment_amount'], - 'payment_method' => $response->card_type, + 'payment_method' => $transaction->cardType, 'securesubmit_payment_action' => $this->getAuthorizeOrCharge($feed), 'note' => $note, ), - ); - } catch (HpsException $e) { + ); + } catch (GatewayException $e) { do_action('heartland_gravityforms_transaction_failure', $form, $entry, $e); // if advanced fraud is enabled, increment the error count if ($enable_fraud) { @@ -1662,7 +1667,7 @@ protected function sendEmail($form, $entry, $transaction, $cardHolder = null) */ private function cardHolderData($feed, $submission_data, $entry) { - $cardHolder = new CreditCardData(); + $cardHolder = new \stdClass(); $firstName = ''; $lastName = ''; if ('' === rgar($submission_data, 'card_name')) { @@ -2182,6 +2187,7 @@ public function get_validation_result($validationResult, $authorizationResult) */ public function subscribe($feed, $submission_data, $form, $entry) { + /** @var array $subscribResult */ // Include HPS API library. $this->includeSecureSubmitSDK(); @@ -2201,11 +2207,31 @@ public function subscribe($feed, $submission_data, $form, $entry) return $this->authorization_error($userError . 'Currently ACH is not supported for subscriptions'); } - // Prepare payment amount and trial period data. - $payment_amount = HpsInputValidation::checkAmount(rgar($submission_data, 'payment_amount')); + //check amount + $payment_amount = rgar($submission_data, 'payment_amount'); + if ($payment_amount < 0 || $payment_amount === null) { + $this->log_debug(__METHOD__ . '(): Amount error: ' . $this->getSecureSubmitJsError()); + + return $this->authorization_error($userError . 'Invalid amount value.'); + } else { + $payment_amount = preg_replace('/[^0-9\.]/', '', $payment_amount); + $payment_amount = sprintf("%0.2f", round($payment_amount, 3)); + } + + //check setup fee + $setupFeePaymentAmount = rgar($submission_data, 'setup_fee'); + if ($setupFeePaymentAmount < 0 || $setupFeePaymentAmount === null) { + $this->log_debug(__METHOD__ . '(): Set up Fee error: ' . $this->getSecureSubmitJsError()); + + return $this->authorization_error($userError . 'Invalid Set up fee.'); + } else { + $setupFeePaymentAmount = preg_replace('/[^0-9\.]/', '', $setupFeePaymentAmount); + $setupFeePaymentAmount = sprintf("%0.2f", round($setupFeePaymentAmount, 3)); + } + + // Prepare payment amount and trial period data. $setupFeeEnabled = rgar($feed['meta'], 'setupFee_enabled'); $setupFeeField = rgar($feed['meta'], 'setupFee_product'); - $setupFeePaymentAmount = HpsInputValidation::checkAmount(rgar($submission_data, 'setup_fee')); $trialEnabled = rgars($feed, 'meta/trial_enabled'); $trial_period_days = $trialEnabled ? rgars($feed, 'meta/trial_product') : null; $currency = rgar($entry, 'currency'); @@ -2215,37 +2241,42 @@ public function subscribe($feed, $submission_data, $form, $entry) $planSchedule = null; try { - $payPlanService = $this->getPayPlanService($this->getSecretApiKey($feed)); + + $this->getHpsServicesConfig($this->getSecretApiKey($feed)); // while it could be ACH here for the Payplan Customer record it is the same difference // Prepare customer metadata. - $customer = $this->create_customer($feed, $submission_data, $entry); - $this->log_debug(__METHOD__ . '(): Create customer.'); - /** @var HpsPayPlanCustomer $payPlanCustomer */ - $payPlanCustomer = $payPlanService->addCustomer($customer); - - if (null === $payPlanCustomer->customerKey) { + $customer = $this->create_customer($feed, $submission_data, $entry); + $payPlanCustomer = $customer->create(); + + if (null === $payPlanCustomer->key) { $this->log_debug(__METHOD__ . '(): Could not create Pay Plan Customer'); return $this->authorization_error($userError); } $this->log_debug(__METHOD__ . '(): Create payment method.'); - $paymentMethod = $this->createPaymentMethod($payPlanCustomer); - /** @var HpsPayPlanPaymentMethod $payPlanPaymentMethod */ - $payPlanPaymentMethod = $payPlanService->addPaymentMethod($paymentMethod); - - if (null === $payPlanPaymentMethod->paymentMethodKey) { + + $card = new CreditCardData(); + $card->token = $this->getSecureSubmitJsResponse()->token_value; + + /** @var RecurringPaymentMethod $payPlanPaymentMethod */ + $payPlanPaymentMethod = $payPlanCustomer->addPaymentMethod( + $this->getIdentifier('Credit' . $card->token), + $card + )->create(); + + if (null === $payPlanPaymentMethod->key) { $this->log_debug(__METHOD__ . '(): Could not create Pay Plan payment method'); return $this->authorization_error($userError); } // Get HPS plan for feed. - $this->log_debug(__METHOD__ . '(): Create Schedule.'); + $this->log_debug(__METHOD__ . '(): Add Schedule.'); /** @var HpsPayPlanSchedule $plan */ - $plan = $this->create_plan( + $planSchedule = $this->create_plan( $payPlanPaymentMethod, $feed, $payment_amount, @@ -2253,14 +2284,8 @@ public function subscribe($feed, $submission_data, $form, $entry) $currency ); - // If error was returned when retrieving plan, return plan. - - /** @var HpsPayPlanSchedule $planSchedule */ - $this->log_debug(__METHOD__ . '(): Add Schedule.'); - $planSchedule = $payPlanService->addSchedule($plan); - // Create the plan unless there is no key. - if (null === $planSchedule->scheduleKey) { + if (null === $planSchedule->key) { $this->log_debug(__METHOD__ . '(): Could not create Pay Plan Schedule'); return $this->authorization_error($userError); @@ -2286,19 +2311,19 @@ public function subscribe($feed, $submission_data, $form, $entry) $subscribResult = array( 'is_success' => true, - 'subscription_id' => $planSchedule->scheduleKey, - 'customer_id' => $customer->customerKey, + 'subscription_id' => $planSchedule->key, + 'customer_id' => $customer->key, 'amount' => $payment_amount, ); // array } catch (Exception $e) { do_action('heartland_gravityforms_transaction_failure', $form, $entry, $e); - $this->rollbackPayPlanResources($payPlanService, $payPlanCustomer, $payPlanPaymentMethod, $planSchedule); + $this->rollbackPayPlanResources($payPlanCustomer, $payPlanPaymentMethod, $planSchedule); // Return authorization error. return $this->authorization_error($userError . $e->getMessage()); } if (!isset($subscribResult)) { - $this->rollbackPayPlanResources($payPlanService, $payPlanCustomer, $payPlanPaymentMethod, $planSchedule); + $this->rollbackPayPlanResources($payPlanCustomer, $payPlanPaymentMethod, $planSchedule); $this->log_debug(__METHOD__ . '(): Unknown error '); return $this->authorization_error($userError); } // if @@ -2360,22 +2385,18 @@ public function cancel($entry, $feed) } } - protected function rollbackPayPlanResources($service, $customer, $paymentMethod, $schedule) + protected function rollbackPayPlanResources($customer, $paymentMethod, $schedule) { - if ($service === null) { - return; - } - if ($schedule !== null) { - $service->deleteSchedule($schedule); + $schedule->delete(); } if ($paymentMethod !== null) { - $service->deletePaymentMethod($paymentMethod); + $paymentMethod->delete(); } if ($customer !== null) { - $service->deleteCustomer($customer); + $customer->delete(); } } @@ -2387,26 +2408,16 @@ protected function rollbackPayPlanResources($service, $customer, $paymentMethod, * @param $payPlanPaymentMethod * @param $planSchedule * - * @return array|\HpsBuilderAbstract|\HpsReportTransactionDetails|\HpsReportTransactionSummary|\HpsTransaction|mixed|null + * @return array|\Transaction|mixed|null */ private function processRecurring($payment_amount, $feed, $payPlanPaymentMethod, $planSchedule) { - static $creditService = null; - if (null === $creditService) { - $creditService = new HpsFluentCreditService($this->getHpsServicesConfig($this->getSecretApiKey($feed))); - } - - $details = new HpsTransactionDetails(); - $details->customerId = $payPlanPaymentMethod->customerIdentifier; - - return $creditService - ->recurring() - ->withAmount($payment_amount) - ->withPaymentMethodKey($payPlanPaymentMethod->paymentMethodKey) - ->withSchedule($planSchedule->scheduleKey) - ->withDetails($details) - ->execute(); + return $payPlanPaymentMethod->charge($payment_amount) + ->withCurrency(GFCommon::get_currency()) + ->withScheduleId($planSchedule->key) + ->withOneTimePayment(false) + ->execute(); } /** @@ -2424,7 +2435,7 @@ private function processRecurring($payment_amount, $feed, $payPlanPaymentMethod, * @param array $submission_data * @param array $entry The entry currently being processed. * - * @return \HpsPayPlanCustomer The HPS customer object. + * @return Customer The HPS customer object. * @internal param array $customer_meta The customer properties. * @internal param array $form The form which created the current entry. * @@ -2432,77 +2443,24 @@ private function processRecurring($payment_amount, $feed, $payPlanPaymentMethod, private function create_customer($feed, $submission_data, $entry) { $acctHolder = $this->cardHolderData($feed, $submission_data, $entry); - $meta = $this->get_address_card_field($feed); - //'United States' 'Canada' - - /** @noinspection PhpUndefinedFieldInspection */ - $acctHolder->address->country = $this->normalizeCountry($acctHolder->address->country, true); - - // Convert states names to abbreviations - $acctHolder->address->state = $this->normalizeState($acctHolder->address->state); - - // Log the customer to be created. - $this->log_debug(__METHOD__ . '(): Customer meta to be created => ' . print_r($acctHolder, 1)); - + $address = $this->buildAddress($feed, $submission_data, $entry); + /** @var string $modifier This value helps semi uniqely identify the customer */ $modifier = $this->getSecureSubmitJsResponse()->last_four . $this->getSecureSubmitJsResponse()->card_type; - - $customer = new HpsPayPlanCustomer(); - $customer->customerIdentifier = $this->getIdentifier($modifier . $acctHolder->firstName . $acctHolder->lastName); + + $customer = new Customer(); + $customer->id = $this->getIdentifier($modifier . $acctHolder->firstName . $acctHolder->lastName); $customer->firstName = $acctHolder->firstName; $customer->lastName = $acctHolder->lastName; - $customer->primaryEmail = rgar($submission_data, 'email'); - $customer->customerStatus = HpsPayPlanCustomerStatus::ACTIVE; - $customer->addressLine1 = $acctHolder->address->address; - $customer->city = $acctHolder->address->city; - $customer->stateProvince = $acctHolder->address->state; - $customer->zipPostalCode = $acctHolder->address->zip; - /** @noinspection PhpUndefinedFieldInspection */ - $customer->country = $acctHolder->address->country; - + $customer->status = 'Active'; + $customer->email = rgar($submission_data, 'email'); + $customer->address = $address; + + // Log the customer to be created. + $this->log_debug(__METHOD__ . '(): Customer meta to be created => ' . print_r($customer, 1)); + return $customer; - } - - /** - * Retrieve a specific customer from HPS. - * - * @since Unknown - * @access protected - * - * @used-by GFSecureSubmit::subscribe() - * @uses GFAddOn::log_debug() - * @uses HpsPayPlanService::getCustomer() - * @uses \GFSecureSubmit::getSecureSubmitJsResponse - * @uses \GFSecureSubmit::getIdentifier - * - * @param array $submission_data - * @param HpsPayPlanCustomer $customer - * - * @return bool|\HpsPayPlanPaymentMethod Contains customer data if available. Otherwise, false. - * - * @internal param \HpsPayPlanService $payPlanService - */ - private function createPaymentMethod($customer) - { - $paymentMethod = null; - $acct = $this->getSecureSubmitJsResponse()->token_value; - - if (!empty($acct)) { - $paymentMethod = new HpsPayPlanPaymentMethod(); - $paymentMethod->paymentMethodIdentifier = $this->getIdentifier('Credit' . $acct); - $paymentMethod->nameOnAccount = $customer->firstName . ' ' . $customer->lastName; - /** @noinspection PhpUndefinedFieldInspection */ - $paymentMethod->firstName = $customer->firstName; - $paymentMethod->lastName = $customer->lastName; - $paymentMethod->country = $customer->country; - $paymentMethod->zipPostalCode = $customer->zipPostalCode; - $paymentMethod->customerKey = $customer->customerKey; - $paymentMethod->paymentMethodType = HpsPayPlanPaymentMethodType::CREDIT_CARD; - $paymentMethod->paymentToken = $acct; - } - - return $paymentMethod; - } + } /** * Create and return a HPS plan with the specified properties. @@ -2520,7 +2478,7 @@ private function createPaymentMethod($customer) * @uses HpsPayPlanAmount * @uses GFAddOn::log_debug() * - * @param HpsPayPlanPaymentMethod $plan The plan ID. + * @param RecurringPaymentMethod $plan The plan ID. * @param array $feed The feed currently being processed. * @param float|int $payment_amount The recurring amount. * @param string $customerKey The Custyomer ID used by HPS. @@ -2533,41 +2491,27 @@ private function create_plan( $plan, $feed, $payment_amount, - $trial_period_days = 0 + $trial_period_days = 0, + $currency ) { - // Log the plan to be created. - $this->log_debug(__METHOD__ . '(): Plan to be created => ' . print_r(func_get_args(), 1)); - //(HpsPayPlanService $service, $customerKey, $paymentMethodKey, $amount) - $schedule = new HpsPayPlanSchedule(); - $schedule->scheduleIdentifier = $this->getIdentifier($feed['meta']['feedName'] . $plan->paymentMethodKey); - $schedule->customerKey = $plan->customerKey; - $schedule->scheduleStatus = HpsPayPlanScheduleStatus::ACTIVE; - $schedule->paymentMethodKey = $plan->paymentMethodKey; - $schedule->subtotalAmount = new HpsPayPlanAmount(HpsInputValidation::checkAmount($payment_amount) * 100); - $schedule->totalAmount = new HpsPayPlanAmount(HpsInputValidation::checkAmount($payment_amount)); - $schedule->frequency = $this->validPayPlanCycle($feed); - - /*Conditional; Required if Frequency is Monthly, Bi-Monthly, Quarterly, Semi-Annually, or Semi-Monthly.*/ - if (!in_array($schedule->frequency, array(HpsPayPlanScheduleFrequency::WEEKLY,HpsPayPlanScheduleFrequency::BIWEEKLY, HpsPayPlanScheduleFrequency::ANNUALLY))) { - $schedule->processingDateInfo = date("d", strtotime(date('d-m-Y'))); - } - - $schedule->startDate = $this->getStartDateInfo($schedule->frequency, $trial_period_days); - $numberOfPayments = $feed['meta']['recurringTimes'] === '0' - ? HpsPayPlanScheduleDuration::ONGOING - : HpsPayPlanScheduleDuration::LIMITED_NUMBER; - $schedule->duration = $numberOfPayments; - $schedule->reprocessingCount = 1; - - if ($numberOfPayments !== HpsPayPlanScheduleDuration::ONGOING) { - $schedule->numberOfPayments = intval($feed['meta']['recurringTimes']); - - if ($trial_period_days != null && $trial_period_days != 0) { - $schedule->numberOfPayments = $schedule->numberOfPayments - 1; - } - } + $subtotalAmount = $payment_amount * 100; + $totalAmount = $payment_amount; + $frequency = $this->validPayPlanCycle($feed); + $startDate = $this->getStartDateInfo($frequency, $trial_period_days); + $startDate = \DateTime::createFromFormat('Ymd', $startDate); + + $scheduleResponse = $plan->addSchedule( + $this->getIdentifier($feed['meta']['feedName'] . $plan->key) + ) + ->withStatus('Active') + ->withCurrency($currency) + ->withAmount($totalAmount) + ->withStartDate($startDate) + ->withFrequency($frequency) + ->withReprocessingCount(1) + ->create(); - return $schedule; + return $scheduleResponse; } /** Takes subscription billing cycle and returns a valid payplan cycle @@ -2579,21 +2523,21 @@ private function create_plan( * @param array $feed * * @return null|string - * @throws \HpsArgumentException + * @throws \ArgumentException */ private function validPayPlanCycle($feed) { $this->log_debug(__METHOD__ . '(): Plan to be created => ' . print_r($feed, 1)); $this->includeSecureSubmitSDK(); - $oClass = new ReflectionClass('HpsPayPlanScheduleFrequency'); + $oClass = new ReflectionClass('GlobalPayments\Api\Entities\Enums\ScheduleFrequency'); $array = $oClass->getConstants(); $cycle = rgar($array, $feed['meta']['billingCycle']); if (null == $cycle) { $this->log_debug(__METHOD__ . '(): Billing Cycle Error => ' . print_r($feed, 1)); - throw new HpsArgumentException( + throw new ArgumentException( 'Invalid period for subscription. Please check settings and try again', - HpsExceptionCodes::INVALID_CONFIGURATION + ExceptionCodes::INVALID_CONFIGURATION ); } $this->log_debug(__METHOD__ . '(): Billing Cycle Calculated => ' . $cycle); @@ -2606,40 +2550,40 @@ private function validPayPlanCycle($feed) * @param int $trial_period_days * * @return bool|string - * @throws \HpsArgumentException + * @throws \ArgumentException */ private function getStartDateInfo($frequency, $trial_period_days) { if ($trial_period_days*1 !== 0) { - $period = date('mdY', strtotime('+' . ($trial_period_days * 1) . ' days')); + $period = date('Ymd', strtotime('+' . ($trial_period_days * 1) . ' days')); } else { switch ($frequency) { - case HpsPayPlanScheduleFrequency::WEEKLY: - $period = date('mdY', strtotime('+1 week')); + case ScheduleFrequency::WEEKLY: + $period = date('Ymd', strtotime('+1 week')); break; - case HpsPayPlanScheduleFrequency::BIWEEKLY: + case ScheduleFrequency::BI_WEEKLY: $period = date('mdY', strtotime('+2 week')); break; - case HpsPayPlanScheduleFrequency::SEMIMONTHLY: + case ScheduleFrequency::SEMI_MONTHLY: $period = 'Last'; break; - case HpsPayPlanScheduleFrequency::MONTHLY: - $period = date('mdY', strtotime('+1 month')); + case ScheduleFrequency::MONTHLY: + $period = date('Ymd', strtotime('+1 month')); break; - case HpsPayPlanScheduleFrequency::QUARTERLY: - $period = date('mdY', strtotime('+3 month')); + case ScheduleFrequency::QUARTERLY: + $period = date('Ymd', strtotime('+3 month')); break; - case HpsPayPlanScheduleFrequency::SEMIANNUALLY: - $period = date('mdY', strtotime('+6 month')); + case ScheduleFrequency::SEMI_ANNUALLY: + $period = date('Ymd', strtotime('+6 month')); break; - case HpsPayPlanScheduleFrequency::ANNUALLY: - $period = date('mdY', strtotime('+1 year')); + case ScheduleFrequency::ANNUALLY: + $period = date('Ymd', strtotime('+1 year')); break; default: $this->log_debug(__METHOD__ . '(): Billing Cycle Error => ' . print_r($frequency, 1)); - throw new HpsArgumentException( + throw new ArgumentException( 'Invalid period for subscription. Please check settings and try again', - HpsExceptionCodes::INVALID_CONFIGURATION + ExceptionCodes::INVALID_CONFIGURATION ); } } @@ -2688,7 +2632,7 @@ private function getHpsServicesConfig($key) private function getPayPlanService($key) { static $service = null; - if (empty($service)) { + if (empty($service)) { $service = new HpsPayPlanService($this->getHpsServicesConfig($key)); } @@ -2704,7 +2648,7 @@ public function supported_billing_intervals() //authorize.net does not use years or weeks, override framework function $this->includeSecureSubmitSDK(); - $oClass = new ReflectionClass('HpsPayPlanScheduleFrequency'); + $oClass = new ReflectionClass('ScheduleFrequency'); $array = $oClass->getConstants(); $billing_cycles = array(); foreach ($array as $const => $value) { From 0769e400db9a323ed68455ad74cb30353e86207b Mon Sep 17 00:00:00 2001 From: SenthilKumar Date: Mon, 12 Jul 2021 13:43:33 +0530 Subject: [PATCH 7/8] changes for cancel subscription --- classes/class-gf-securesubmit.php | 58 +++++++++++-------------------- 1 file changed, 21 insertions(+), 37 deletions(-) diff --git a/classes/class-gf-securesubmit.php b/classes/class-gf-securesubmit.php index 9ab85b6..a81059e 100755 --- a/classes/class-gf-securesubmit.php +++ b/classes/class-gf-securesubmit.php @@ -5,10 +5,12 @@ use GlobalPayments\Api\PaymentMethods\CreditCardData; use GlobalPayments\Api\PaymentMethods\CreditTrackData; use GlobalPayments\Api\Services\CreditService; +use GlobalPayments\Api\Services\RecurringService; use GlobalPayments\Api\ServicesConfig; use GlobalPayments\Api\ServicesContainer; use GlobalPayments\Api\Entities\Address; use GlobalPayments\Api\Entities\Customer; +use GlobalPayments\Api\Entities\Schedule; use GlobalPayments\Api\Entities\TransactionSummary; use GlobalPayments\Api\Entities\Enums\AccountType; use GlobalPayments\Api\Entities\Enums\CheckType; @@ -1091,8 +1093,7 @@ public function authorize($feed, $submission_data, $form, $entry) $this->includeSecureSubmitSDK(); $submission_data = array_merge($submission_data, $this->get_submission_dataACH($feed, $form, $entry)); - $isCCData = $this->getSecureSubmitJsResponse(); - + $isCCData = $this->getSecureSubmitJsResponse(); if (empty($isCCData->token_value) && false !== $this->isACH && !empty($submission_data['ach_number'])) { $auth = $this->authorizeACH($feed, $submission_data, $form, $entry); @@ -1275,9 +1276,6 @@ private function authorizeACH($feed, $submission_data, $form, $entry) } } - $auth = $this->authorization_error($e->getMessage()); - } catch (Exception $e) { - do_action('heartland_gravityforms_transaction_failure', $form, $entry, $e); $auth = $this->authorization_error($e->getMessage()); } return $auth; @@ -2167,13 +2165,11 @@ public function get_validation_result($validationResult, $authorizationResult) * @uses GFSecureSubmit::getSecureSubmitJsError() * @uses GFPaymentAddOn::authorization_error() * @uses GFAddOn::log_debug() - * @uses HpsInputValidation::checkAmount * @uses \rgars - * @uses \GFSecureSubmit::getPayPlanService * @uses \GFSecureSubmit::create_customer - * @uses \HpsPayPlanService::addCustomer + * @uses \Customer::addCustomer * @uses \GFSecureSubmit::createPaymentMethod - * @uses \HpsPayPlanService::addPaymentMethod + * @uses \RecurringPaymentMethod::addPaymentMethod * @uses \GFSecureSubmit::create_plan * @uses \HpsPayPlanService::addSchedule * @uses \GFSecureSubmit::processRecurring @@ -2275,7 +2271,7 @@ public function subscribe($feed, $submission_data, $form, $entry) // Get HPS plan for feed. $this->log_debug(__METHOD__ . '(): Add Schedule.'); - /** @var HpsPayPlanSchedule $plan */ + /** @var \RecurringPaymentMethod $plan */ $planSchedule = $this->create_plan( $payPlanPaymentMethod, $feed, @@ -2374,13 +2370,20 @@ public function cancel($entry, $feed) try { $scheduleKey = gform_get_meta($entry['id'], 'hps_payplan_subscription_id'); - $service = $this->getPayPlanService($this->getSecretApiKey($feed)); - $subscription = $service->getSchedule($scheduleKey); + $this->getHpsServicesConfig($this->getSecretApiKey($feed)); + + $schedule = new Schedule(); + $schedule->key = $scheduleKey; + + $subscription = RecurringService::get($schedule); + // set schedule to inactive - $subscription->scheduleStatus = HpsPayPlanScheduleStatus::INACTIVE; - $service->editSchedule($subscription); + $subscription->status = 'Inactive'; + $subscription->endDate = null; + $subscription->saveChanges(); + return true; - } catch (HpsException $e) { + } catch (\Exception $e) { return false; } } @@ -2435,7 +2438,7 @@ private function processRecurring($payment_amount, $feed, $payPlanPaymentMethod, * @param array $submission_data * @param array $entry The entry currently being processed. * - * @return Customer The HPS customer object. + * @return Customer The Customer object. * @internal param array $customer_meta The customer properties. * @internal param array $form The form which created the current entry. * @@ -2470,12 +2473,9 @@ private function create_customer($feed, $submission_data, $entry) * * @used-by GFSecureSubmit::subscribe() * @uses \GFSecureSubmit::getIdentifier - * @uses \GFSecureSubmit::getPayPlanService * @uses \GFSecureSubmit::getSecretApiKey - * @uses HpsInputValidation::checkAmount * @uses \GFSecureSubmit::validPayPlanCycle - * @uses HpsPayPlanSchedule - * @uses HpsPayPlanAmount + * @uses Schedule * @uses GFAddOn::log_debug() * * @param RecurringPaymentMethod $plan The plan ID. @@ -2494,7 +2494,6 @@ private function create_plan( $trial_period_days = 0, $currency ) { - $subtotalAmount = $payment_amount * 100; $totalAmount = $payment_amount; $frequency = $this->validPayPlanCycle($feed); $startDate = $this->getStartDateInfo($frequency, $trial_period_days); @@ -2517,7 +2516,7 @@ private function create_plan( /** Takes subscription billing cycle and returns a valid payplan cycle * * @used-by \GFSecureSubmit::create_plan - * @uses HpsPayPlanScheduleFrequency + * @uses ScheduleFrequency * @uses GFAddOn::log_debug() * * @param array $feed @@ -2624,21 +2623,6 @@ private function getHpsServicesConfig($key) return $service; } - /** - * @param string $key - * - * @return \HpsPayPlanService|null - */ - private function getPayPlanService($key) - { - static $service = null; - if (empty($service)) { - $service = new HpsPayPlanService($this->getHpsServicesConfig($key)); - } - - return $service; - } - /** * @return array */ From 762f3dbd62ac3fbf9cf79aa6dd84a3166d8b86ec Mon Sep 17 00:00:00 2001 From: SenthilKumar Date: Mon, 12 Jul 2021 18:13:37 +0530 Subject: [PATCH 8/8] older sdk removed and cancel subscribe changes --- classes/class-gf-securesubmit.php | 18 +- classes/includes/Hps.php | 211 ------ .../HpsAltPaymentServiceInterface.php | 158 ---- .../src/Abstractions/HpsBuilderAbstract.php | 173 ----- .../src/Abstractions/HpsConfigInterface.php | 24 - .../HpsGatewayServiceAbstract.php | 155 ---- .../HpsGatewayServiceInterface.php | 23 - .../src/Abstractions/HpsLoggerInterface.php | 15 - .../HpsPayPlanResourceAbstract.php | 39 - .../HpsPayPlanResourceInterface.php | 10 - .../AltPayment/HpsAltPaymentAddToBatch.php | 8 - .../Entities/AltPayment/HpsAltPaymentAuth.php | 28 - .../AltPayment/HpsAltPaymentCapture.php | 28 - .../AltPayment/HpsAltPaymentCreateSession.php | 31 - .../AltPayment/HpsAltPaymentResponse.php | 45 -- .../AltPayment/HpsAltPaymentReturn.php | 8 - .../Entities/AltPayment/HpsAltPaymentSale.php | 28 - .../AltPayment/HpsAltPaymentSessionInfo.php | 72 -- .../Entities/AltPayment/HpsAltPaymentVoid.php | 8 - .../src/Entities/AltPayment/HpsBuyerData.php | 43 -- .../HpsCardinalMPIAddOrderNumberResponse.php | 18 - .../HpsCardinalMPIAuthenticateResponse.php | 112 --- .../HpsCardinalMPIAuthorizeResponse.php | 82 -- .../HpsCardinalMPIAuthresponseResponse.php | 18 - .../HpsCardinalMPICaptureResponse.php | 18 - .../HpsCardinalMPILookupResponse.php | 27 - .../HpsCardinalMPIPreapprovalResponse.php | 25 - .../HpsCardinalMPIRefundResponse.php | 18 - .../AltPayment/HpsCardinalMPIResponse.php | 55 -- .../AltPayment/HpsCardinalMPIVoidResponse.php | 18 - .../src/Entities/AltPayment/HpsLineItem.php | 14 - .../src/Entities/AltPayment/HpsOrderData.php | 38 - .../Entities/AltPayment/HpsPaymentData.php | 39 - .../Entities/AltPayment/HpsShippingInfo.php | 28 - .../src/Entities/Attachment/HpsAttachment.php | 117 --- .../includes/src/Entities/Batch/HpsBatch.php | 12 - .../includes/src/Entities/Check/HpsCheck.php | 48 -- .../src/Entities/Check/HpsCheckHolder.php | 14 - .../src/Entities/Check/HpsCheckResponse.php | 57 -- .../Check/HpsCheckResponseDetails.php | 13 - .../src/Entities/Credit/HpsAccountVerify.php | 8 - .../src/Entities/Credit/HpsAuthorization.php | 51 -- .../src/Entities/Credit/HpsCPCData.php | 37 - .../src/Entities/Credit/HpsCPCEdit.php | 22 - .../src/Entities/Credit/HpsCardHolder.php | 8 - .../src/Entities/Credit/HpsCharge.php | 8 - .../Entities/Credit/HpsChargeExceptions.php | 10 - .../src/Entities/Credit/HpsCreditCard.php | 34 - .../Credit/HpsManageTokensResponse.php | 22 - .../Credit/HpsOfflineAuthorization.php | 22 - .../Entities/Credit/HpsRecurringBilling.php | 8 - .../src/Entities/Credit/HpsRefund.php | 22 - .../Credit/HpsReportTransactionDetails.php | 84 --- .../Credit/HpsReportTransactionSummary.php | 81 -- .../src/Entities/Credit/HpsReversal.php | 33 - .../Entities/Credit/HpsSecureEcommerce.php | 13 - .../includes/src/Entities/Credit/HpsVoid.php | 22 - .../src/Entities/Debit/HpsDebitAddValue.php | 8 - .../src/Entities/Debit/HpsDebitReturn.php | 8 - .../src/Entities/Debit/HpsDebitReversal.php | 8 - .../src/Entities/Debit/HpsDebitSale.php | 8 - .../src/Entities/Fluent/HpsBuilderAction.php | 27 - .../Fluent/HpsUnknownPropertyException.php | 27 - .../src/Entities/Gift/HpsGiftCard.php | 23 - .../src/Entities/Gift/HpsGiftCardActivate.php | 56 -- .../src/Entities/Gift/HpsGiftCardAddValue.php | 8 - .../src/Entities/Gift/HpsGiftCardAlias.php | 32 - .../src/Entities/Gift/HpsGiftCardBalance.php | 8 - .../Entities/Gift/HpsGiftCardDeactivate.php | 8 - .../src/Entities/Gift/HpsGiftCardReplace.php | 8 - .../src/Entities/Gift/HpsGiftCardReversal.php | 8 - .../src/Entities/Gift/HpsGiftCardReward.php | 8 - .../src/Entities/Gift/HpsGiftCardSale.php | 27 - .../src/Entities/Gift/HpsGiftCardVoid.php | 8 - classes/includes/src/Entities/HpsAddress.php | 13 - classes/includes/src/Entities/HpsConsumer.php | 13 - .../src/Entities/HpsDirectMarketData.php | 32 - .../src/Entities/HpsEncryptionData.php | 34 - .../includes/src/Entities/HpsTokenData.php | 23 - .../includes/src/Entities/HpsTrackData.php | 16 - .../includes/src/Entities/HpsTransaction.php | 148 ---- .../src/Entities/HpsTransactionDetails.php | 12 - .../src/Entities/HpsTransactionHeader.php | 12 - .../src/Entities/HpsTransactionStatus.php | 40 - .../src/Entities/PayPlan/HpsPayPlanAmount.php | 23 - .../Entities/PayPlan/HpsPayPlanCustomer.php | 181 ----- .../PayPlan/HpsPayPlanPaymentMethod.php | 239 ------ .../Entities/PayPlan/HpsPayPlanSchedule.php | 220 ------ classes/includes/src/Entities/index.php | 1 - .../src/Infrastructure/Enums/HpsACHType.php | 8 - .../Infrastructure/Enums/HpsAccountType.php | 10 - .../Enums/HpsAttachmentType.php | 22 - .../src/Infrastructure/Enums/HpsCardBrand.php | 12 - .../Enums/HpsCentinelCheckoutType.php | 12 - .../src/Infrastructure/Enums/HpsCheckType.php | 10 - .../Infrastructure/Enums/HpsDataEntryMode.php | 10 - .../Enums/HpsExceptionCodes.php | 54 -- .../Enums/HpsGiftCardAliasAction.php | 11 - ...mChoiceTypePosResponseVer10Transaction.php | 67 -- .../Enums/HpsPayPlanAccountType.php | 10 - .../Enums/HpsPayPlanCustomerStatus.php | 10 - .../Enums/HpsPayPlanPaymentMethodStatus.php | 12 - .../Enums/HpsPayPlanPaymentMethodType.php | 10 - .../Enums/HpsPayPlanScheduleDuration.php | 11 - .../Enums/HpsPayPlanScheduleFrequency.php | 15 - .../Enums/HpsPayPlanScheduleStatus.php | 9 - .../src/Infrastructure/Enums/HpsSECCode.php | 14 - .../src/Infrastructure/Enums/HpsTaxType.php | 11 - .../Enums/HpsTrackDataMethod.php | 10 - .../Enums/HpsTransactionType.php | 19 - .../HpsApiConnectionException.php | 19 - .../Infrastructure/HpsArgumentException.php | 19 - .../HpsAuthenticationException.php | 19 - .../src/Infrastructure/HpsCheckException.php | 26 - .../src/Infrastructure/HpsConfiguration.php | 21 - .../src/Infrastructure/HpsCreditException.php | 33 - .../HpsCreditExceptionDetails.php | 10 - .../src/Infrastructure/HpsEmptyLogger.php | 18 - .../src/Infrastructure/HpsException.php | 34 - .../Infrastructure/HpsGatewayException.php | 37 - .../HpsGatewayExceptionDetails.php | 10 - .../HpsInvalidRequestException.php | 24 - .../includes/src/Infrastructure/HpsLogger.php | 42 -- .../src/Infrastructure/HpsProcessorError.php | 11 - .../Infrastructure/HpsProcessorException.php | 33 - .../HpsProcessorExceptionDetails.php | 10 - .../HpsGatewayResponseValidation.php | 123 --- .../Validation/HpsInputValidation.php | 197 ----- .../HpsIssuerResponseValidation.php | 158 ---- .../HpsProcessorResponseValidation.php | 64 -- classes/includes/src/Infrastructure/index.php | 1 - .../Check/HpsCheckServiceOverrideBuilder.php | 83 -- .../Check/HpsCheckServiceRecurringBuilder.php | 107 --- .../Check/HpsCheckServiceReturnBuilder.php | 83 -- .../Check/HpsCheckServiceSaleBuilder.php | 96 --- .../Check/HpsCheckServiceVoidBuilder.php | 81 -- .../HpsCreditServiceRecurringBuilder.php | 107 --- .../HpsCreditServiceAuthorizeBuilder.php | 271 ------- .../Credit/HpsCreditServiceCaptureBuilder.php | 95 --- .../Credit/HpsCreditServiceChargeBuilder.php | 264 ------- .../Credit/HpsCreditServiceCpcEditBuilder.php | 81 -- .../Credit/HpsCreditServiceEditBuilder.php | 88 --- .../Credit/HpsCreditServiceGetBuilder.php | 67 -- ...psCreditServiceListTransactionsBuilder.php | 94 --- .../HpsCreditServiceOfflineAuthBuilder.php | 227 ------ .../HpsCreditServiceOfflineChargeBuilder.php | 184 ----- ...HpsCreditServicePrepaidAddValueBuilder.php | 110 --- ...ditServicePrepaidBalanceInquiryBuilder.php | 103 --- .../HpsCreditServiceRecurringBuilder.php | 160 ---- .../Credit/HpsCreditServiceRefundBuilder.php | 171 ----- .../Credit/HpsCreditServiceReverseBuilder.php | 162 ---- ...ditServiceUpdateTokenExpirationBuilder.php | 100 --- .../Credit/HpsCreditServiceVerifyBuilder.php | 136 ---- .../Credit/HpsCreditServiceVoidBuilder.php | 67 -- .../Debit/HpsDebitServiceAddValueBuilder.php | 139 ---- .../Debit/HpsDebitServiceChargeBuilder.php | 149 ---- .../Debit/HpsDebitServiceReturnBuilder.php | 139 ---- .../Debit/HpsDebitServiceReverseBuilder.php | 116 --- .../HpsGiftCardServiceActivateBuilder.php | 127 ---- .../HpsGiftCardServiceAddValueBuilder.php | 127 ---- .../HpsGiftCardServiceAliasBuilder.php | 140 ---- .../HpsGiftCardServiceBalanceBuilder.php | 91 --- .../HpsGiftCardServiceDeactivateBuilder.php | 91 --- .../HpsGiftCardServiceReplaceBuilder.php | 78 -- .../HpsGiftCardServiceReverseBuilder.php | 102 --- .../HpsGiftCardServiceRewardBuilder.php | 124 --- .../HpsGiftCardServiceSaleBuilder.php | 157 ---- .../HpsGiftCardServiceVoidBuilder.php | 60 -- .../Fluent/Gateway/HpsFluentCheckService.php | 160 ---- .../Fluent/Gateway/HpsFluentCreditService.php | 365 --------- .../Fluent/Gateway/HpsFluentDebitService.php | 71 -- .../Gateway/HpsFluentGiftCardService.php | 186 ----- .../AltPayment/HpsAltPaymentService.php | 484 ------------ .../AltPayment/HpsMasterPassService.php | 622 --------------- .../Gateway/AltPayment/HpsPayPalService.php | 9 - .../Services/Gateway/HpsAttachmentService.php | 154 ---- .../src/Services/Gateway/HpsBatchService.php | 43 -- .../Gateway/HpsCentinelGatewayService.php | 70 -- .../src/Services/Gateway/HpsCheckService.php | 179 ----- .../src/Services/Gateway/HpsCreditService.php | 710 ------------------ .../src/Services/Gateway/HpsDebitService.php | 346 --------- .../Services/Gateway/HpsGiftCardService.php | 408 ---------- .../Services/Gateway/HpsPayPlanService.php | 178 ----- .../Gateway/HpsRestGatewayService.php | 165 ---- .../Gateway/HpsSoapGatewayService.php | 484 ------------ .../src/Services/Gateway/HpsTokenService.php | 97 --- .../PayPlan/HpsPayPlanCustomerService.php | 96 --- .../HpsPayPlanPaymentMethodService.php | 165 ---- .../PayPlan/HpsPayPlanScheduleService.php | 96 --- .../src/Services/HpsCentinelConfig.php | 41 - .../src/Services/HpsServicesConfig.php | 88 --- classes/includes/src/Services/index.php | 1 - classes/includes/src/index.php | 1 - 193 files changed, 10 insertions(+), 14710 deletions(-) delete mode 100644 classes/includes/Hps.php delete mode 100644 classes/includes/src/Abstractions/HpsAltPaymentServiceInterface.php delete mode 100644 classes/includes/src/Abstractions/HpsBuilderAbstract.php delete mode 100644 classes/includes/src/Abstractions/HpsConfigInterface.php delete mode 100644 classes/includes/src/Abstractions/HpsGatewayServiceAbstract.php delete mode 100644 classes/includes/src/Abstractions/HpsGatewayServiceInterface.php delete mode 100644 classes/includes/src/Abstractions/HpsLoggerInterface.php delete mode 100644 classes/includes/src/Abstractions/HpsPayPlanResourceAbstract.php delete mode 100644 classes/includes/src/Abstractions/HpsPayPlanResourceInterface.php delete mode 100644 classes/includes/src/Entities/AltPayment/HpsAltPaymentAddToBatch.php delete mode 100644 classes/includes/src/Entities/AltPayment/HpsAltPaymentAuth.php delete mode 100644 classes/includes/src/Entities/AltPayment/HpsAltPaymentCapture.php delete mode 100644 classes/includes/src/Entities/AltPayment/HpsAltPaymentCreateSession.php delete mode 100644 classes/includes/src/Entities/AltPayment/HpsAltPaymentResponse.php delete mode 100644 classes/includes/src/Entities/AltPayment/HpsAltPaymentReturn.php delete mode 100644 classes/includes/src/Entities/AltPayment/HpsAltPaymentSale.php delete mode 100644 classes/includes/src/Entities/AltPayment/HpsAltPaymentSessionInfo.php delete mode 100644 classes/includes/src/Entities/AltPayment/HpsAltPaymentVoid.php delete mode 100644 classes/includes/src/Entities/AltPayment/HpsBuyerData.php delete mode 100644 classes/includes/src/Entities/AltPayment/HpsCardinalMPIAddOrderNumberResponse.php delete mode 100644 classes/includes/src/Entities/AltPayment/HpsCardinalMPIAuthenticateResponse.php delete mode 100644 classes/includes/src/Entities/AltPayment/HpsCardinalMPIAuthorizeResponse.php delete mode 100644 classes/includes/src/Entities/AltPayment/HpsCardinalMPIAuthresponseResponse.php delete mode 100644 classes/includes/src/Entities/AltPayment/HpsCardinalMPICaptureResponse.php delete mode 100644 classes/includes/src/Entities/AltPayment/HpsCardinalMPILookupResponse.php delete mode 100644 classes/includes/src/Entities/AltPayment/HpsCardinalMPIPreapprovalResponse.php delete mode 100644 classes/includes/src/Entities/AltPayment/HpsCardinalMPIRefundResponse.php delete mode 100644 classes/includes/src/Entities/AltPayment/HpsCardinalMPIResponse.php delete mode 100644 classes/includes/src/Entities/AltPayment/HpsCardinalMPIVoidResponse.php delete mode 100644 classes/includes/src/Entities/AltPayment/HpsLineItem.php delete mode 100644 classes/includes/src/Entities/AltPayment/HpsOrderData.php delete mode 100644 classes/includes/src/Entities/AltPayment/HpsPaymentData.php delete mode 100644 classes/includes/src/Entities/AltPayment/HpsShippingInfo.php delete mode 100644 classes/includes/src/Entities/Attachment/HpsAttachment.php delete mode 100644 classes/includes/src/Entities/Batch/HpsBatch.php delete mode 100644 classes/includes/src/Entities/Check/HpsCheck.php delete mode 100644 classes/includes/src/Entities/Check/HpsCheckHolder.php delete mode 100644 classes/includes/src/Entities/Check/HpsCheckResponse.php delete mode 100644 classes/includes/src/Entities/Check/HpsCheckResponseDetails.php delete mode 100644 classes/includes/src/Entities/Credit/HpsAccountVerify.php delete mode 100644 classes/includes/src/Entities/Credit/HpsAuthorization.php delete mode 100644 classes/includes/src/Entities/Credit/HpsCPCData.php delete mode 100644 classes/includes/src/Entities/Credit/HpsCPCEdit.php delete mode 100644 classes/includes/src/Entities/Credit/HpsCardHolder.php delete mode 100644 classes/includes/src/Entities/Credit/HpsCharge.php delete mode 100644 classes/includes/src/Entities/Credit/HpsChargeExceptions.php delete mode 100644 classes/includes/src/Entities/Credit/HpsCreditCard.php delete mode 100644 classes/includes/src/Entities/Credit/HpsManageTokensResponse.php delete mode 100644 classes/includes/src/Entities/Credit/HpsOfflineAuthorization.php delete mode 100644 classes/includes/src/Entities/Credit/HpsRecurringBilling.php delete mode 100644 classes/includes/src/Entities/Credit/HpsRefund.php delete mode 100644 classes/includes/src/Entities/Credit/HpsReportTransactionDetails.php delete mode 100644 classes/includes/src/Entities/Credit/HpsReportTransactionSummary.php delete mode 100644 classes/includes/src/Entities/Credit/HpsReversal.php delete mode 100644 classes/includes/src/Entities/Credit/HpsSecureEcommerce.php delete mode 100644 classes/includes/src/Entities/Credit/HpsVoid.php delete mode 100644 classes/includes/src/Entities/Debit/HpsDebitAddValue.php delete mode 100644 classes/includes/src/Entities/Debit/HpsDebitReturn.php delete mode 100644 classes/includes/src/Entities/Debit/HpsDebitReversal.php delete mode 100644 classes/includes/src/Entities/Debit/HpsDebitSale.php delete mode 100644 classes/includes/src/Entities/Fluent/HpsBuilderAction.php delete mode 100644 classes/includes/src/Entities/Fluent/HpsUnknownPropertyException.php delete mode 100644 classes/includes/src/Entities/Gift/HpsGiftCard.php delete mode 100644 classes/includes/src/Entities/Gift/HpsGiftCardActivate.php delete mode 100644 classes/includes/src/Entities/Gift/HpsGiftCardAddValue.php delete mode 100644 classes/includes/src/Entities/Gift/HpsGiftCardAlias.php delete mode 100644 classes/includes/src/Entities/Gift/HpsGiftCardBalance.php delete mode 100644 classes/includes/src/Entities/Gift/HpsGiftCardDeactivate.php delete mode 100644 classes/includes/src/Entities/Gift/HpsGiftCardReplace.php delete mode 100644 classes/includes/src/Entities/Gift/HpsGiftCardReversal.php delete mode 100644 classes/includes/src/Entities/Gift/HpsGiftCardReward.php delete mode 100644 classes/includes/src/Entities/Gift/HpsGiftCardSale.php delete mode 100644 classes/includes/src/Entities/Gift/HpsGiftCardVoid.php delete mode 100644 classes/includes/src/Entities/HpsAddress.php delete mode 100644 classes/includes/src/Entities/HpsConsumer.php delete mode 100644 classes/includes/src/Entities/HpsDirectMarketData.php delete mode 100644 classes/includes/src/Entities/HpsEncryptionData.php delete mode 100644 classes/includes/src/Entities/HpsTokenData.php delete mode 100644 classes/includes/src/Entities/HpsTrackData.php delete mode 100644 classes/includes/src/Entities/HpsTransaction.php delete mode 100644 classes/includes/src/Entities/HpsTransactionDetails.php delete mode 100644 classes/includes/src/Entities/HpsTransactionHeader.php delete mode 100644 classes/includes/src/Entities/HpsTransactionStatus.php delete mode 100644 classes/includes/src/Entities/PayPlan/HpsPayPlanAmount.php delete mode 100644 classes/includes/src/Entities/PayPlan/HpsPayPlanCustomer.php delete mode 100644 classes/includes/src/Entities/PayPlan/HpsPayPlanPaymentMethod.php delete mode 100644 classes/includes/src/Entities/PayPlan/HpsPayPlanSchedule.php delete mode 100644 classes/includes/src/Entities/index.php delete mode 100644 classes/includes/src/Infrastructure/Enums/HpsACHType.php delete mode 100644 classes/includes/src/Infrastructure/Enums/HpsAccountType.php delete mode 100644 classes/includes/src/Infrastructure/Enums/HpsAttachmentType.php delete mode 100644 classes/includes/src/Infrastructure/Enums/HpsCardBrand.php delete mode 100644 classes/includes/src/Infrastructure/Enums/HpsCentinelCheckoutType.php delete mode 100644 classes/includes/src/Infrastructure/Enums/HpsCheckType.php delete mode 100644 classes/includes/src/Infrastructure/Enums/HpsDataEntryMode.php delete mode 100644 classes/includes/src/Infrastructure/Enums/HpsExceptionCodes.php delete mode 100644 classes/includes/src/Infrastructure/Enums/HpsGiftCardAliasAction.php delete mode 100644 classes/includes/src/Infrastructure/Enums/HpsItemChoiceTypePosResponseVer10Transaction.php delete mode 100644 classes/includes/src/Infrastructure/Enums/HpsPayPlanAccountType.php delete mode 100644 classes/includes/src/Infrastructure/Enums/HpsPayPlanCustomerStatus.php delete mode 100644 classes/includes/src/Infrastructure/Enums/HpsPayPlanPaymentMethodStatus.php delete mode 100644 classes/includes/src/Infrastructure/Enums/HpsPayPlanPaymentMethodType.php delete mode 100644 classes/includes/src/Infrastructure/Enums/HpsPayPlanScheduleDuration.php delete mode 100644 classes/includes/src/Infrastructure/Enums/HpsPayPlanScheduleFrequency.php delete mode 100644 classes/includes/src/Infrastructure/Enums/HpsPayPlanScheduleStatus.php delete mode 100644 classes/includes/src/Infrastructure/Enums/HpsSECCode.php delete mode 100644 classes/includes/src/Infrastructure/Enums/HpsTaxType.php delete mode 100644 classes/includes/src/Infrastructure/Enums/HpsTrackDataMethod.php delete mode 100644 classes/includes/src/Infrastructure/Enums/HpsTransactionType.php delete mode 100644 classes/includes/src/Infrastructure/HpsApiConnectionException.php delete mode 100644 classes/includes/src/Infrastructure/HpsArgumentException.php delete mode 100644 classes/includes/src/Infrastructure/HpsAuthenticationException.php delete mode 100644 classes/includes/src/Infrastructure/HpsCheckException.php delete mode 100644 classes/includes/src/Infrastructure/HpsConfiguration.php delete mode 100644 classes/includes/src/Infrastructure/HpsCreditException.php delete mode 100644 classes/includes/src/Infrastructure/HpsCreditExceptionDetails.php delete mode 100644 classes/includes/src/Infrastructure/HpsEmptyLogger.php delete mode 100644 classes/includes/src/Infrastructure/HpsException.php delete mode 100644 classes/includes/src/Infrastructure/HpsGatewayException.php delete mode 100644 classes/includes/src/Infrastructure/HpsGatewayExceptionDetails.php delete mode 100644 classes/includes/src/Infrastructure/HpsInvalidRequestException.php delete mode 100644 classes/includes/src/Infrastructure/HpsLogger.php delete mode 100644 classes/includes/src/Infrastructure/HpsProcessorError.php delete mode 100644 classes/includes/src/Infrastructure/HpsProcessorException.php delete mode 100644 classes/includes/src/Infrastructure/HpsProcessorExceptionDetails.php delete mode 100644 classes/includes/src/Infrastructure/Validation/HpsGatewayResponseValidation.php delete mode 100644 classes/includes/src/Infrastructure/Validation/HpsInputValidation.php delete mode 100644 classes/includes/src/Infrastructure/Validation/HpsIssuerResponseValidation.php delete mode 100644 classes/includes/src/Infrastructure/Validation/HpsProcessorResponseValidation.php delete mode 100644 classes/includes/src/Infrastructure/index.php delete mode 100644 classes/includes/src/Services/Fluent/Gateway/Check/HpsCheckServiceOverrideBuilder.php delete mode 100644 classes/includes/src/Services/Fluent/Gateway/Check/HpsCheckServiceRecurringBuilder.php delete mode 100644 classes/includes/src/Services/Fluent/Gateway/Check/HpsCheckServiceReturnBuilder.php delete mode 100644 classes/includes/src/Services/Fluent/Gateway/Check/HpsCheckServiceSaleBuilder.php delete mode 100644 classes/includes/src/Services/Fluent/Gateway/Check/HpsCheckServiceVoidBuilder.php delete mode 100644 classes/includes/src/Services/Fluent/Gateway/Check/HpsCreditServiceRecurringBuilder.php delete mode 100644 classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceAuthorizeBuilder.php delete mode 100644 classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceCaptureBuilder.php delete mode 100644 classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceChargeBuilder.php delete mode 100644 classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceCpcEditBuilder.php delete mode 100644 classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceEditBuilder.php delete mode 100644 classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceGetBuilder.php delete mode 100644 classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceListTransactionsBuilder.php delete mode 100644 classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceOfflineAuthBuilder.php delete mode 100644 classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceOfflineChargeBuilder.php delete mode 100644 classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServicePrepaidAddValueBuilder.php delete mode 100644 classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServicePrepaidBalanceInquiryBuilder.php delete mode 100644 classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceRecurringBuilder.php delete mode 100644 classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceRefundBuilder.php delete mode 100644 classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceReverseBuilder.php delete mode 100644 classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceUpdateTokenExpirationBuilder.php delete mode 100644 classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceVerifyBuilder.php delete mode 100644 classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceVoidBuilder.php delete mode 100644 classes/includes/src/Services/Fluent/Gateway/Debit/HpsDebitServiceAddValueBuilder.php delete mode 100644 classes/includes/src/Services/Fluent/Gateway/Debit/HpsDebitServiceChargeBuilder.php delete mode 100644 classes/includes/src/Services/Fluent/Gateway/Debit/HpsDebitServiceReturnBuilder.php delete mode 100644 classes/includes/src/Services/Fluent/Gateway/Debit/HpsDebitServiceReverseBuilder.php delete mode 100644 classes/includes/src/Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceActivateBuilder.php delete mode 100644 classes/includes/src/Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceAddValueBuilder.php delete mode 100644 classes/includes/src/Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceAliasBuilder.php delete mode 100644 classes/includes/src/Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceBalanceBuilder.php delete mode 100644 classes/includes/src/Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceDeactivateBuilder.php delete mode 100644 classes/includes/src/Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceReplaceBuilder.php delete mode 100644 classes/includes/src/Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceReverseBuilder.php delete mode 100644 classes/includes/src/Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceRewardBuilder.php delete mode 100644 classes/includes/src/Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceSaleBuilder.php delete mode 100644 classes/includes/src/Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceVoidBuilder.php delete mode 100644 classes/includes/src/Services/Fluent/Gateway/HpsFluentCheckService.php delete mode 100644 classes/includes/src/Services/Fluent/Gateway/HpsFluentCreditService.php delete mode 100644 classes/includes/src/Services/Fluent/Gateway/HpsFluentDebitService.php delete mode 100644 classes/includes/src/Services/Fluent/Gateway/HpsFluentGiftCardService.php delete mode 100644 classes/includes/src/Services/Gateway/AltPayment/HpsAltPaymentService.php delete mode 100644 classes/includes/src/Services/Gateway/AltPayment/HpsMasterPassService.php delete mode 100644 classes/includes/src/Services/Gateway/AltPayment/HpsPayPalService.php delete mode 100644 classes/includes/src/Services/Gateway/HpsAttachmentService.php delete mode 100644 classes/includes/src/Services/Gateway/HpsBatchService.php delete mode 100644 classes/includes/src/Services/Gateway/HpsCentinelGatewayService.php delete mode 100644 classes/includes/src/Services/Gateway/HpsCheckService.php delete mode 100644 classes/includes/src/Services/Gateway/HpsCreditService.php delete mode 100644 classes/includes/src/Services/Gateway/HpsDebitService.php delete mode 100644 classes/includes/src/Services/Gateway/HpsGiftCardService.php delete mode 100644 classes/includes/src/Services/Gateway/HpsPayPlanService.php delete mode 100644 classes/includes/src/Services/Gateway/HpsRestGatewayService.php delete mode 100644 classes/includes/src/Services/Gateway/HpsSoapGatewayService.php delete mode 100644 classes/includes/src/Services/Gateway/HpsTokenService.php delete mode 100644 classes/includes/src/Services/Gateway/PayPlan/HpsPayPlanCustomerService.php delete mode 100644 classes/includes/src/Services/Gateway/PayPlan/HpsPayPlanPaymentMethodService.php delete mode 100644 classes/includes/src/Services/Gateway/PayPlan/HpsPayPlanScheduleService.php delete mode 100644 classes/includes/src/Services/HpsCentinelConfig.php delete mode 100644 classes/includes/src/Services/HpsServicesConfig.php delete mode 100644 classes/includes/src/Services/index.php delete mode 100644 classes/includes/src/index.php diff --git a/classes/class-gf-securesubmit.php b/classes/class-gf-securesubmit.php index a81059e..0c34eff 100755 --- a/classes/class-gf-securesubmit.php +++ b/classes/class-gf-securesubmit.php @@ -1577,7 +1577,7 @@ private function authorizeCC($feed, $submission_data, $form, $entry) 'securesubmit_payment_action' => $this->getAuthorizeOrCharge($feed), 'note' => $note, ), - ); + ); } catch (GatewayException $e) { do_action('heartland_gravityforms_transaction_failure', $form, $entry, $e); // if advanced fraud is enabled, increment the error count @@ -1665,7 +1665,7 @@ protected function sendEmail($form, $entry, $transaction, $cardHolder = null) */ private function cardHolderData($feed, $submission_data, $entry) { - $cardHolder = new \stdClass(); + $cardHolder = new CreditCardData(); $firstName = ''; $lastName = ''; if ('' === rgar($submission_data, 'card_name')) { @@ -2231,7 +2231,7 @@ public function subscribe($feed, $submission_data, $form, $entry) $trialEnabled = rgars($feed, 'meta/trial_enabled'); $trial_period_days = $trialEnabled ? rgars($feed, 'meta/trial_product') : null; $currency = rgar($entry, 'currency'); - + $payPlanCustomer = null; $payPlanPaymentMethod = null; $planSchedule = null; @@ -2378,8 +2378,7 @@ public function cancel($entry, $feed) $subscription = RecurringService::get($schedule); // set schedule to inactive - $subscription->status = 'Inactive'; - $subscription->endDate = null; + $subscription->status = 'Inactive'; $subscription->saveChanges(); return true; @@ -2494,7 +2493,6 @@ private function create_plan( $trial_period_days = 0, $currency ) { - $totalAmount = $payment_amount; $frequency = $this->validPayPlanCycle($feed); $startDate = $this->getStartDateInfo($frequency, $trial_period_days); $startDate = \DateTime::createFromFormat('Ymd', $startDate); @@ -2504,7 +2502,7 @@ private function create_plan( ) ->withStatus('Active') ->withCurrency($currency) - ->withAmount($totalAmount) + ->withAmount($payment_amount) ->withStartDate($startDate) ->withFrequency($frequency) ->withReprocessingCount(1) @@ -2564,7 +2562,11 @@ private function getStartDateInfo($frequency, $trial_period_days) $period = date('mdY', strtotime('+2 week')); break; case ScheduleFrequency::SEMI_MONTHLY: - $period = 'Last'; + if (intval(date('d', strtotime('+15 day'))) < 15) { + $period = date('m15Y', strtotime('+15 day')); + } else { + $period = date('mtY', strtotime('+15 day')); + } break; case ScheduleFrequency::MONTHLY: $period = date('Ymd', strtotime('+1 month')); diff --git a/classes/includes/Hps.php b/classes/includes/Hps.php deleted file mode 100644 index 9be1e5f..0000000 --- a/classes/includes/Hps.php +++ /dev/null @@ -1,211 +0,0 @@ - - * @license https://github.com/hps/heartland-php/blob/master/LICENSE.txt Custom - * @link https://github.com/hps/heartland-php - */ - -/** - * AltPayment Service Interface - * - * @category PHP - * @package HPS - * @author Heartland Payment Systems - * @license https://github.com/hps/heartland-php/blob/master/LICENSE.txt Custom - * @link https://github.com/hps/heartland-php - */ -interface HpsAltPaymentServiceInterface -{ - /** - * Creates an authorization - * - * @param string $orderId order id from gateway - * @param mixed $amount amount to be authorized - * @param string $currency currency code - * @param HpsBuyerData $buyer buyer information - * @param HpsPaymentData $payment payment information - * @param HpsShippingInfo $shippingAddress shipping information - * @param array $lineItems line items from order - * @param HpsOrderData $orderData gateway/processor specific - * data - * - * @return object - */ - public function authorize( - $orderId, - $amount, - $currency, - HpsBuyerData $buyer = null, - HpsPaymentData $payment = null, - HpsShippingInfo $shippingAddress = null, - $lineItems = null, - HpsOrderData $orderData = null - ); - - /** - * Captures an authorization - * - * @param string $orderId order id from gateway - * @param mixed $amount amount to be authorized - * @param HpsOrderData $orderData gateway/processor specific data - * - * @return object - */ - public function capture( - $orderId, - $amount, - HpsOrderData $orderData = null - ); - - /** - * Creates a new AltPayment session - * - * @param mixed $amount amount to be authorized - * @param string $currency currency code - * @param HpsBuyerData $buyer buyer information - * @param HpsPaymentData $payment payment information - * @param HpsShippingInfo $shippingAddress shipping information - * @param array $lineItems line items from order - * @param HpsOrderData $orderData gateway/processor specific - * data - * - * @return object - */ - public function createSession( - $amount, - $currency, - HpsBuyerData $buyer = null, - HpsPaymentData $payment = null, - HpsShippingInfo $shippingAddress = null, - $lineItems = null, - HpsOrderData $orderData = null - ); - - /** - * Refunds a transaction - * - * @param string $orderId order id from gateway - * @param boolean $isPartial flag for partial refund - * @param string $partialAmount partial amount to be refunded - * @param HpsOrderData $orderData gateway/processor specific data - * - * @return object - */ - public function refund( - $orderId, - $isPartial = false, - $partialAmount = null, - HpsOrderData $orderData = null - ); - - /** - * Creates an authorization - * - * @param string $orderId order id from gateway - * @param mixed $amount amount to be authorized - * @param string $currency currency code - * @param HpsBuyerData $buyer buyer information - * @param HpsPaymentData $payment payment information - * @param HpsShippingInfo $shippingAddress shipping information - * @param array $lineItems line items from order - * @param HpsOrderData $orderData gateway/processor specific - * data - * - * @return object - */ - public function sale( - $orderId, - $amount, - $currency, - HpsBuyerData $buyer = null, - HpsPaymentData $payment = null, - HpsShippingInfo $shippingAddress = null, - $lineItems = null, - HpsOrderData $orderData = null - ); - - /** - * Voids a transaction - * - * @param string $orderId order id from gateway - * @param HpsOrderData $orderData gateway/processor specific data - * - * @return object - */ - public function void( - $orderId, - HpsOrderData $orderData = null - ); - - /** - * Gets information about a session - * - * @param string $orderId order id from gateway - * @param HpsOrderData $orderData gateway/processor specific data - * - * @return object - */ - public function sessionInfo( - $orderId, - HpsOrderData $orderData = null - ); -} diff --git a/classes/includes/src/Abstractions/HpsBuilderAbstract.php b/classes/includes/src/Abstractions/HpsBuilderAbstract.php deleted file mode 100644 index 7e2c74f..0000000 --- a/classes/includes/src/Abstractions/HpsBuilderAbstract.php +++ /dev/null @@ -1,173 +0,0 @@ -service = $service; - } - - /** - * @return HpsBuilderAbstract - */ - public function execute() - { - foreach ($this->builderActions as $action) { - call_user_func_array($action->action, $action->arguments); - } - $this->validate(); - $this->executed = true; - return $this; - } - /** - * @param $action - * - * @return \HpsBuilderAbstract - */ - public function addAction($action) - { - $this->builderActions[] = $action; - return $this; - } - - /** - * @throws HpsException - */ - public function checkStatus() - { - if (!$this->executed) { - throw new HpsException('Builder actions not executed'); - } - } - - /** - * Allows for automatic setter functions - * in child classes. - * - * @param string $name - * @param array $args - * - * @throws HpsUnknownPropertyException - * - * @return HpsBuilderAbstract - */ - public function __call($name, array $args) - { - switch (true) { - case substr($name, 0, 4) == 'with': - $property = substr($name, 4); - $property = strtolower(substr($property, 0, 1)) . substr($property, 1); - $this->setPropertyIfExists($property, $args[0]); - break; - default: - return false; - break; - } - return $this; - } - - /** - * @throws Exception - */ - protected function validate() - { - $actions = $this->compileActionCounts(); - foreach ($this->validations as $validation) { - $result = call_user_func_array($validation['callback'], array($actions)); - if (!$result) { - $class = $validation['exceptionType']; - throw new $class($validation['exceptionMessage'], 0); - } - } - } - - /** - * @return array - */ - protected function compileActionCounts() - { - $counts = array(); - - foreach ($this->builderActions as $action) { - $counts[$action->name] = isset($counts[$action->name]) ? $counts[$action->name]+1 : 1; - } - - return $counts; - } - - /** - * @param callable $callback - * @param string $exceptionType - * @param string $exceptionMessage - * - * @return HpsBuilderAbstract - */ - protected function addValidation($callback, $exceptionType, $exceptionMessage = '') - { - $this->validations[] = array( - 'callback' => $callback, - 'exceptionType' => $exceptionType, - 'exceptionMessage' => $exceptionMessage, - ); - return $this; - } - - /** - * Sets a property if it exists on the current object. - * - * @param string $property - * @param mixed $value - * - * @throws HpsUnknownPropertyException - * - * @return null - */ - private function setPropertyIfExists($property, $value) - { - if (property_exists($this, $property)) { - if ($value == null) { - return $this; - } - - $action = new HpsBuilderAction($property, array($this, 'setProperty')); - $action->arguments = array($property, $value); - $this->addAction($action); - } else { - throw new HpsUnknownPropertyException($this, $property); - } - return $this; - } - - /** - * Sets a property on the current object. - * - * @param string $property - * @param mixed $value - * - * @return null - */ - protected function setProperty($property, $value) - { - $this->{$property} = $value; - } -} diff --git a/classes/includes/src/Abstractions/HpsConfigInterface.php b/classes/includes/src/Abstractions/HpsConfigInterface.php deleted file mode 100644 index 8d7ff5d..0000000 --- a/classes/includes/src/Abstractions/HpsConfigInterface.php +++ /dev/null @@ -1,24 +0,0 @@ -_config = $config; - } - } - /** - * @return \HpsConfigInterface|null - */ - public function servicesConfig() - { - return $this->_config; - } - /** - * @param $value - */ - public function setServicesConfig($value) - { - $this->_config = $value; - } - /** - * @param $url - * @param $headers - * @param null $data - * @param string $httpVerb - * @param string $keyType - * @param null $options - * - * @return mixed - * @throws \HpsAuthenticationException - * @throws \HpsGatewayException - */ - protected function submitRequest($url, $headers, $data = null, $httpVerb = 'POST', $keyType = HpsServicesConfig::KEY_TYPE_SECRET, $options = null) - { - if ($this->_isConfigInvalid()) { - throw new HpsAuthenticationException( - HpsExceptionCodes::INVALID_CONFIGURATION, - "The HPS SDK has not been properly configured. " - ."Please make sure to initialize the config " - ."in a service constructor." - ); - } - - if (!$this->_config->validate($keyType) && ($this->_config->username == null && $this->_config->password == null)) { - $type = $this->_config->getKeyType($keyType); - $message = "The HPS SDK requires a valid {$keyType} API key to be used"; - if ($type == $keyType) { - $message .= "."; - } else { - $message .= ", but a(n) {$type} key is currently configured."; - } - throw new HpsAuthenticationException( - HpsExceptionCodes::INVALID_CONFIGURATION, - $message - ); - } - - $logger = HpsLogger::getInstance(); - - try { - $request = curl_init(); - curl_setopt($request, CURLOPT_URL, $url); - curl_setopt($request, CURLOPT_CONNECTTIMEOUT, 100); - curl_setopt($request, CURLOPT_TIMEOUT, 100); - curl_setopt($request, CURLOPT_RETURNTRANSFER, true); - curl_setopt($request, CURLOPT_SSL_VERIFYPEER, false); - curl_setopt($request, CURLOPT_SSL_VERIFYHOST, false); - if ($data != null) { - $logger->log('Request data', $data); - curl_setopt($request, CURLOPT_CUSTOMREQUEST, $httpVerb); - curl_setopt($request, CURLOPT_POSTFIELDS, $data); - } - $logger->log('Request headers', $headers); - curl_setopt($request, CURLOPT_HTTPHEADER, $headers); - curl_setopt($request, CURLOPT_PROTOCOLS, CURLPROTO_HTTPS); - - if ($this->_config->useProxy) { - curl_setopt($request, CURLOPT_PROXY, $this->_config->proxyOptions['proxy_host']); - curl_setopt($request, CURLOPT_PROXYPORT, $this->_config->proxyOptions['proxy_port']); - } - - if ( - $this->_config->curlOptions != null - && !empty($this->_config->curlOptions) - ) { - curl_setopt_array($request, $this->_config->curlOptions); - } - - $curlResponse = curl_exec($request); - $curlInfo = curl_getinfo($request); - $curlError = curl_errno($request); - - $logger->log('Response data', $curlResponse); - $logger->log('Curl info', $curlInfo); - $logger->log('Curl error', $curlError); - - if ($curlError == 28) { //CURLE_OPERATION_TIMEOUTED - throw new HpsException("gateway_time-out"); - } - - if ($curlError == 35) { //CURLE_SSL_CONNECT_ERROR - $err_msg = 'PHP-SDK cURL TLS 1.2 handshake failed. If you have any questions, please contact Specialty Products Team at 866.802.9753.'; - if ( extension_loaded('openssl') && OPENSSL_VERSION_NUMBER < self::MIN_OPENSSL_VER ) { // then you don't have openSSL 1.0.1c or greater - $err_msg .= 'Your current version of OpenSSL is ' . OPENSSL_VERSION_TEXT . 'You do not have the minimum version of OpenSSL 1.0.1c which is required for curl to use TLS 1.2 handshake.'; - } - throw new HpsGatewayException($curlError,$err_msg); - } - return $this->processResponse($curlResponse, $curlInfo, $curlError); - } catch (Exception $e) { - throw new HpsGatewayException( - $e->getCode() != null ? $e->getCode() : HpsExceptionCodes::UNKNOWN_GATEWAY_ERROR, - $e->getMessage() != null ? $e->getMessage() : 'Unable to process transaction', - null, - null, - $e - ); - } - } - /** - * @return bool - */ - protected function _isConfigInvalid() - { - if ($this->_config == null && ( - $this->_config->secretApiKey == null || - $this->_config->userName == null || - $this->_config->password == null || - $this->_config->licenseId == -1 || - $this->_config->deviceId == -1 || - $this->_config->siteId == -1) - ) { - return true; - } - return false; - } -} diff --git a/classes/includes/src/Abstractions/HpsGatewayServiceInterface.php b/classes/includes/src/Abstractions/HpsGatewayServiceInterface.php deleted file mode 100644 index aad3b3a..0000000 --- a/classes/includes/src/Abstractions/HpsGatewayServiceInterface.php +++ /dev/null @@ -1,23 +0,0 @@ -Transaction->$txnType; - - $auth = parent::fromDict($rsp, $txnType, $returnType); - - $auth->status = isset($authorize->Status) ? (string)$authorize->Status : null; - $auth->statusMessage = isset($authorize->StatusMessage) ? (string)$authorize->StatusMessage : null; - - return $auth; - } -} diff --git a/classes/includes/src/Entities/AltPayment/HpsAltPaymentCapture.php b/classes/includes/src/Entities/AltPayment/HpsAltPaymentCapture.php deleted file mode 100644 index ab04568..0000000 --- a/classes/includes/src/Entities/AltPayment/HpsAltPaymentCapture.php +++ /dev/null @@ -1,28 +0,0 @@ -Transaction->$txnType; - - $capture = parent::fromDict($rsp, $txnType, $returnType); - - $capture->status = isset($addToBatch->Status) ? (string)$addToBatch->Status : null; - $capture->statusMessage = isset($addToBatch->StatusMessage) ? (string)$addToBatch->StatusMessage : null; - - return $capture; - } -} diff --git a/classes/includes/src/Entities/AltPayment/HpsAltPaymentCreateSession.php b/classes/includes/src/Entities/AltPayment/HpsAltPaymentCreateSession.php deleted file mode 100644 index c5b1bd9..0000000 --- a/classes/includes/src/Entities/AltPayment/HpsAltPaymentCreateSession.php +++ /dev/null @@ -1,31 +0,0 @@ -Transaction->$txnType; - - $session = parent::fromDict($rsp, $txnType, $returnType); - if (isset($createSession->Session)) { - $pairs = self::nvpToArray($createSession->Session); - } - - $session->sessionId = isset($pairs['SessionId']) ? $pairs['SessionId'] : null; - $session->redirectUrl = isset($pairs['RedirectUrl']) ? $pairs['RedirectUrl'] : null; - - return $session; - } -} diff --git a/classes/includes/src/Entities/AltPayment/HpsAltPaymentResponse.php b/classes/includes/src/Entities/AltPayment/HpsAltPaymentResponse.php deleted file mode 100644 index fb26d9c..0000000 --- a/classes/includes/src/Entities/AltPayment/HpsAltPaymentResponse.php +++ /dev/null @@ -1,45 +0,0 @@ -Transaction->$txnType; - - $altPayment = parent::fromDict($rsp, $txnType, $returnType); - - if ($response->RspCode != 0) { - $error = self::nvpToArray($response->Processor->Response); - $altPayment->error = new HpsProcessorError(); - $altPayment->error->code = isset($error['Code']) ? $error['Code'] : null; - $altPayment->error->message = isset($error['Message']) ? $error['Message'] : null; - $altPayment->error->type = isset($error['Type']) ? $error['Type'] : null; - } - - return $altPayment; - } - /** - * @param $pairs - * - * @return array - */ - public static function nvpToArray($pairs) - { - $array = array(); - foreach ($pairs->NameValuePair as $pair) { - $array[(string)$pair->Name] = (string)$pair->Value; - } - return $array; - } -} diff --git a/classes/includes/src/Entities/AltPayment/HpsAltPaymentReturn.php b/classes/includes/src/Entities/AltPayment/HpsAltPaymentReturn.php deleted file mode 100644 index 0ceb506..0000000 --- a/classes/includes/src/Entities/AltPayment/HpsAltPaymentReturn.php +++ /dev/null @@ -1,8 +0,0 @@ -Transaction->$txnType; - - $sale = parent::fromDict($rsp, $txnType, $returnType); - - $sale->status = isset($charge->Status) ? (string)$charge->Status : null; - $sale->statusMessage = isset($charge->StatusMessage) ? (string)$charge->StatusMessage : null; - - return $sale; - } -} diff --git a/classes/includes/src/Entities/AltPayment/HpsAltPaymentSessionInfo.php b/classes/includes/src/Entities/AltPayment/HpsAltPaymentSessionInfo.php deleted file mode 100644 index 7ed8415..0000000 --- a/classes/includes/src/Entities/AltPayment/HpsAltPaymentSessionInfo.php +++ /dev/null @@ -1,72 +0,0 @@ -Transaction->$txnType; - $buyer = self::nvpToArray($sessionInfo->Buyer); - $payment = self::nvpToArray($sessionInfo->Payment); - $shipping = self::nvpToArray($sessionInfo->Shipping->Address); - $lineItems = self::nvpToArray($sessionInfo->LineItem->Detail); - - $session = parent::fromDict($rsp, $txnType, $returnType); - $session->status = isset($sessionInfo->Status) ? (string)$sessionInfo->Status : null; - - $session->buyer = new HpsBuyerData(); - $session->buyer->emailAddress = isset($buyer['EmailAddress']) ? $buyer['EmailAddress'] : null; - $session->buyer->payerId = isset($buyer['BuyerId']) ? $buyer['BuyerId'] : null; - $session->buyer->status = isset($buyer['Status']) ? $buyer['Status'] : null; - $session->buyer->countryCode = isset($buyer['CountryCode']) ? $buyer['CountryCode'] : null; - $session->buyer->firstName = isset($buyer['FirstName']) ? $buyer['FirstName'] : null; - $session->buyer->lastName = isset($buyer['LastName']) ? $buyer['LastName'] : null; - - $session->shipping = new HpsShippingInfo(); - $session->shipping->name = isset($shipping['ShipName']) ? $shipping['ShipName'] : null; - $session->shipping->address = new HpsAddress(); - $session->shipping->address->address = isset($shipping['ShipAddress']) ? $shipping['ShipAddress'] : null; - $session->shipping->address->city = isset($shipping['ShipCity']) ? $shipping['ShipCity'] : null; - $session->shipping->address->state = isset($shipping['ShipState']) ? $shipping['ShipState'] : null; - $session->shipping->address->zip = isset($shipping['ShipZip']) ? $shipping['ShipZip'] : null; - $session->shipping->address->country = isset($shipping['ShipCountryCode']) ? $shipping['ShipCountryCode'] : null; - - $session->payment = new HpsPaymentData(); - $session->payment->subtotal = isset($payment['ItemAmount']) ? $payment['ItemAmount'] : null; - $session->payment->shippingAmount = isset($payment['ShippingAmount']) ? $payment['ShippingAmount'] : null; - $session->payment->taxAmount = isset($payment['TaxAmount']) ? $payment['TaxAmount'] : null; - - $session->lineItems = array(); - $lineItem = new HpsLineitem(); - $lineItem->name = isset($lineItems['Name']) ? $lineItems['Name'] : null; - $lineItem->amount = isset($lineItems['Amount']) ? $lineItems['Amount'] : null; - $lineItem->number = isset($lineItems['Number']) ? $lineItems['Number'] : null; - $lineItem->quantity = isset($lineItems['Quantity']) ? $lineItems['Quantity'] : null; - $lineItem->taxAmount = isset($lineItems['TaxAmount']) ? $lineItems['TaxAmount'] : null; - - return $session; - } -} diff --git a/classes/includes/src/Entities/AltPayment/HpsAltPaymentVoid.php b/classes/includes/src/Entities/AltPayment/HpsAltPaymentVoid.php deleted file mode 100644 index e111583..0000000 --- a/classes/includes/src/Entities/AltPayment/HpsAltPaymentVoid.php +++ /dev/null @@ -1,8 +0,0 @@ -authenticateMethod = self::readDataKey($data, 'AuthenticateMethod'); - $response->authorizationCode = self::readDataKey($data, 'AuthorizationCode'); - $response->cardBin = self::readDataKey($data, 'CardBin'); - $response->cardEnrollmentMethod = self::readDataKey($data, 'CardEnrollmentMethod'); - $response->cardExpMonth = self::readDataKey($data, 'CardExpMonth'); - $response->cardExpYear = self::readDataKey($data, 'CardExpYear'); - $response->cardLastFour = self::readDataKey($data, 'CardLastFour'); - $response->cardType = self::readDataKey($data, 'CardType'); - $response->cardTypeName = self::readDataKey($data, 'CardTypeName'); - $response->longAccessToken = self::readDataKey($data, 'LongAccessToken'); - $response->mastercardAssignedId = self::readDataKey($data, 'MasterCardAssignedId'); - $response->nameOnCard = self::readDataKey($data, 'NameOnCard'); - $response->paResStatus = self::readDataKey($data, 'PaResStatus'); - $response->payPassWalletIndicator = self::readDataKey($data, 'PayPassWalletIndicator'); - $response->paymentProcessorOrderNumber = self::readDataKey($data, 'PaymentProcessorOrderNumber'); - $response->processorBillingAddress1 = self::readDataKey($data, 'ProcessorBillingAddress1'); - $response->processorBillingAddress2 = self::readDataKey($data, 'ProcessorBillingAddress2'); - $response->processorBillingCity = self::readDataKey($data, 'ProcessorBillingCity'); - $response->processorBillingCountryCode = self::readDataKey($data, 'ProcessorBillingCountryCode'); - $response->processorBillingFirstName = self::readDataKey($data, 'ProcessorBillingFirstName'); - $response->processorBillingLastName = self::readDataKey($data, 'ProcessorBillingLastName'); - $response->processorBillingMiddleName = self::readDataKey($data, 'ProcessorBillingMiddleName'); - $response->processorBillingPhone = self::readDataKey($data, 'ProcessorBillingPhone'); - $response->processorBillingPostalCode = self::readDataKey($data, 'ProcessorBillingPostalCode'); - $response->processorBillingState = self::readDataKey($data, 'ProcessorBillingState'); - $response->processorCavv = self::readDataKey($data, 'ProcessorCavv'); - $response->processorEciFlag = self::readDataKey($data, 'ProcessorEciFlag'); - $response->processorEmail = self::readDataKey($data, 'ProcessorEmail'); - $response->processorPayresStatus = self::readDataKey($data, 'ProcessorPayresStatus'); - $response->processorShippingAddress1 = self::readDataKey($data, 'ProcessorShippingAddress1'); - $response->processorShippingAddress2 = self::readDataKey($data, 'ProcessorShippingAddress2'); - $response->processorShippingCity = self::readDataKey($data, 'ProcessorShippingCity'); - $response->processorShippingCountryCode = self::readDataKey($data, 'ProcessorShippingCountryCode'); - $response->processorShippingFullName = self::readDataKey($data, 'ProcessorShippingFullName'); - $response->processorShippingPhone = self::readDataKey($data, 'ProcessorShippingPhone'); - $response->processorShippingPostalCode = self::readDataKey($data, 'ProcessorShippingPostalCode'); - $response->processorShippingState = self::readDataKey($data, 'ProcessorShippingState'); - $response->processorSignatureVerification = self::readDataKey($data, 'ProcessorSignatureVerification'); - $response->processorXid = self::readDataKey($data, 'ProcessorXid'); - $response->rewardExpMonth = self::readDataKey($data, 'RewardExpMonth'); - $response->rewardExpYear = self::readDataKey($data, 'RewardExpYear'); - $response->rewardId = self::readDataKey($data, 'RewardId'); - $response->rewardName = self::readDataKey($data, 'RewardName'); - $response->rewardNumber = self::readDataKey($data, 'RewardNumber'); - $response->scEnrollmentStatus = self::readDataKey($data, 'ScEnrollmentStatus'); - $response->signatureVerification = self::readDataKey($data, 'SignatureVerification'); - return $response; - } -} \ No newline at end of file diff --git a/classes/includes/src/Entities/AltPayment/HpsCardinalMPIAuthorizeResponse.php b/classes/includes/src/Entities/AltPayment/HpsCardinalMPIAuthorizeResponse.php deleted file mode 100644 index e99f987..0000000 --- a/classes/includes/src/Entities/AltPayment/HpsCardinalMPIAuthorizeResponse.php +++ /dev/null @@ -1,82 +0,0 @@ -authorizationCode = self::readDataKey($data, 'AuthorizationCode'); - $response->avsResult = self::readDataKey($data, 'AvsResult'); - $response->cardBin = self::readDataKey($data, 'CardBin'); - $response->cardExpMonth = self::readDataKey($data, 'CardExpMonth'); - $response->cardExpYear = self::readDataKey($data, 'CardExpYear'); - $response->cardLastFour = self::readDataKey($data, 'CardLastFour'); - $response->cardType = self::readDataKey($data, 'CardType'); - $response->longAccessToken = self::readDataKey($data, 'LongAccessToken'); - $response->nameOnCard = self::readDataKey($data, 'NameOnCard'); - $response->processorBillingAddress1 = self::readDataKey($data, 'ProcessorBillingAddress1'); - $response->processorBillingAddress2 = self::readDataKey($data, 'ProcessorBillingAddress2'); - $response->processorBillingCity = self::readDataKey($data, 'ProcessorBillingCity'); - $response->processorBillingCountryCode = self::readDataKey($data, 'ProcessorBillingCountryCode'); - $response->processorBillingFirstName = self::readDataKey($data, 'ProcessorBillingFirstName'); - $response->processorBillingLastName = self::readDataKey($data, 'ProcessorBillingLastName'); - $response->processorBillingMiddleName = self::readDataKey($data, 'ProcessorBillingMiddleName'); - $response->processorBillingPhone = self::readDataKey($data, 'ProcessorBillingPhone'); - $response->processorBillingPostalCode = self::readDataKey($data, 'ProcessorBillingPostalCode'); - $response->processorBillingState = self::readDataKey($data, 'ProcessorBillingState'); - $response->processorCavv = self::readDataKey($data, 'ProcessorCavv'); - $response->processorEciFlag = self::readDataKey($data, 'ProcessorEciFlag'); - $response->processorEmail = self::readDataKey($data, 'ProcessorEmail'); - $response->processorPayresStatus = self::readDataKey($data, 'ProcessorPayresStatus'); - $response->processorShippingAddress1 = self::readDataKey($data, 'ProcessorShippingAddress1'); - $response->processorShippingAddress2 = self::readDataKey($data, 'ProcessorShippingAddress2'); - $response->processorShippingCity = self::readDataKey($data, 'ProcessorShippingCity'); - $response->processorShippingCountryCode = self::readDataKey($data, 'ProcessorShippingCountryCode'); - $response->processorShippingFullName = self::readDataKey($data, 'ProcessorShippingFullName'); - $response->processorShippingPhone = self::readDataKey($data, 'ProcessorShippingPhone'); - $response->processorShippingPostalCode = self::readDataKey($data, 'ProcessorShippingPostalCode'); - $response->processorShippingState = self::readDataKey($data, 'ProcessorShippingState'); - return $response; - } -} \ No newline at end of file diff --git a/classes/includes/src/Entities/AltPayment/HpsCardinalMPIAuthresponseResponse.php b/classes/includes/src/Entities/AltPayment/HpsCardinalMPIAuthresponseResponse.php deleted file mode 100644 index 1d519ab..0000000 --- a/classes/includes/src/Entities/AltPayment/HpsCardinalMPIAuthresponseResponse.php +++ /dev/null @@ -1,18 +0,0 @@ -acsUrl = self::readDataKey($data, 'ACSUrl'); - $response->enrolled = self::readDataKey($data, 'Enrolled'); - $response->payload = self::readDataKey($data, 'Payload'); - $response->processorTransactionIdPairing = self::readDataKey($data, 'ProcessorTransactionIdPairing'); - return $response; - } -} \ No newline at end of file diff --git a/classes/includes/src/Entities/AltPayment/HpsCardinalMPIPreapprovalResponse.php b/classes/includes/src/Entities/AltPayment/HpsCardinalMPIPreapprovalResponse.php deleted file mode 100644 index 86a4fc0..0000000 --- a/classes/includes/src/Entities/AltPayment/HpsCardinalMPIPreapprovalResponse.php +++ /dev/null @@ -1,25 +0,0 @@ -longAccessToken = self::readDataKey($data, 'LongAccessToken'); - $response->preCheckoutData = isset($data->PrecheckoutData) ? simplexml_load_string($data->PrecheckoutData)->PrecheckoutData : null; - $response->preCheckoutTransactionId = self::readDataKey($data, 'PrecheckoutTransactionId'); - return $response; - } -} \ No newline at end of file diff --git a/classes/includes/src/Entities/AltPayment/HpsCardinalMPIRefundResponse.php b/classes/includes/src/Entities/AltPayment/HpsCardinalMPIRefundResponse.php deleted file mode 100644 index 5b51803..0000000 --- a/classes/includes/src/Entities/AltPayment/HpsCardinalMPIRefundResponse.php +++ /dev/null @@ -1,18 +0,0 @@ -errorDescription = self::readDataKey($data, 'ErrorDesc'); - $response->errorNumber = self::readDataKey($data, 'ErrorNo'); - $response->merchantData = self::readDataKey($data, 'MerchantData'); - $response->merchantReferenceNumber = self::readDataKey($data, 'MerchantReferenceNumber'); - $response->orderId = self::readDataKey($data, 'OrderId'); - $response->orderNumber = self::readDataKey($data, 'OrderNumber'); - $response->processorOrderNumber = self::readDataKey($data, 'ProcessorOrderNumber'); - $response->processorStatusCode = self::readDataKey($data, 'ProcessorStatusCode'); - $response->processorTransactionId = self::readDataKey($data, 'ProcessorTransactionId'); - $response->reasonCode = self::readDataKey($data, 'ReasonCode'); - $response->reasonDescription = self::readDataKey($data, 'ReasonDesc'); - $response->statusCode = self::readDataKey($data, 'StatusCode'); - $response->transactionId = self::readDataKey($data, 'TransactionId'); - return $response; - } - /** - * @param $data - * @param $key - * - * @return null|string - */ - public static function readDataKey($data, $key) - { - return isset($data->{$key}) ? (string)$data->{$key} : null; - } -} \ No newline at end of file diff --git a/classes/includes/src/Entities/AltPayment/HpsCardinalMPIVoidResponse.php b/classes/includes/src/Entities/AltPayment/HpsCardinalMPIVoidResponse.php deleted file mode 100644 index 18a8d66..0000000 --- a/classes/includes/src/Entities/AltPayment/HpsCardinalMPIVoidResponse.php +++ /dev/null @@ -1,18 +0,0 @@ - - * @license https://github.com/hps/heartland-php/blob/master/LICENSE.txt Custom - * @link https://github.com/hps/heartland-php - */ - -/** - * Order Data - * - * @category PHP - * @package HPS - * @author Heartland Payment Systems - * @license https://github.com/hps/heartland-php/blob/master/LICENSE.txt Custom - * @link https://github.com/hps/heartland-php - */ -class HpsOrderData -{ - public $transactionStatus = null; - public $currencyCode = null; - public $orderId = null; - public $orderNumber = null; - public $transactionMode = 'S'; - public $ipAddress = null; - public $browserHeader = null; - public $userAgent = null; - public $originUrl = null; - public $termUrl = null; - public $checkoutType = null; - public $pairingToken = null; - public $pairingVerifier = null; -} \ No newline at end of file diff --git a/classes/includes/src/Entities/AltPayment/HpsPaymentData.php b/classes/includes/src/Entities/AltPayment/HpsPaymentData.php deleted file mode 100644 index 249a821..0000000 --- a/classes/includes/src/Entities/AltPayment/HpsPaymentData.php +++ /dev/null @@ -1,39 +0,0 @@ - - * @license https://github.com/hps/heartland-php/blob/master/LICENSE.txt Custom - * @link https://github.com/hps/heartland-php - */ - -/** - * Order Data - * - * @category PHP - * @package HPS - * @author Heartland Payment Systems - * @license https://github.com/hps/heartland-php/blob/master/LICENSE.txt Custom - * @link https://github.com/hps/heartland-php - */ -class HpsPaymentData -{ - /** @var double|null */ - public $subtotal = null; - - /** @var double|null */ - public $shippingAmount = null; - - /** @var double|null */ - public $taxAmount = null; - - /** @var string|null */ - public $paymentType = null; - - /** @var string|null */ - public $invoiceNumber = null; -} diff --git a/classes/includes/src/Entities/AltPayment/HpsShippingInfo.php b/classes/includes/src/Entities/AltPayment/HpsShippingInfo.php deleted file mode 100644 index d5da7e3..0000000 --- a/classes/includes/src/Entities/AltPayment/HpsShippingInfo.php +++ /dev/null @@ -1,28 +0,0 @@ -Transaction->$txnType->Details; - $transaction = parent::fromDict($rsp, $txnType, $returnType); - foreach (get_object_vars($attResponse) as $key => $prop) { - if (property_exists($transaction, lcfirst($key))) { - $transaction->__set(lcfirst($key), $prop); - } - } - return $transaction; - } - - /** - * @param string $name - * @param float|string|int $value Never a Bool - * @throws HpsArgumentException - */ - public function __set($name, $value) - { - if (!$value instanceof stdClass) { - if (!property_exists(__CLASS__, $name)) { - $value = null; - } - switch ($name) { - case 'height': - case 'width': - case 'attachmentDataId': - $validator = FILTER_SANITIZE_NUMBER_INT; - break; - default: - $validator = FILTER_SANITIZE_STRING; - } - $value = filter_var($value, $validator); - - if ($name === 'attachmentFormat' && preg_match(HpsAttachmentType::VALID_ATTACHMENT_FORMAT, $value) !== 1) { - throw new \HpsArgumentException('attachmentFormat not a valid enum', 1); - } - - if ($value === false) { - throw new \HpsArgumentException('invalid parameter for {' . __CLASS__ . '}', 1); - } // - $this->{$name} = $value; - } - - } - - /** - * @param string $name - * @return float|string|int null - */ - public function __get($name) - { - $value = null; - if (property_exists(__CLASS__, $name)) { - $value = $this->{$name}; - } - return $value; - } -} \ No newline at end of file diff --git a/classes/includes/src/Entities/Batch/HpsBatch.php b/classes/includes/src/Entities/Batch/HpsBatch.php deleted file mode 100644 index a2e49ba..0000000 --- a/classes/includes/src/Entities/Batch/HpsBatch.php +++ /dev/null @@ -1,12 +0,0 @@ -NOTE: If processing with Colonnade, Account Type must be specified. - * - * @var null - */ - public $accountType = null; - - /** - * Data Entry Mode indicating whether the check data was manually entered or obtained from a check reader. - * Default value is HpsDataEntryMode::MANUAL. - * - * @var string|null - */ - public $dataEntryMode = HpsDataEntryMode::MANUAL; - - /** - * Indicates Check Verify. Requires processor setup to utilise. Contact your HPS representative for more information - * on the GETI eBronze program. - * - * @var null - */ - public $checkVerify = null; - - /** - * NACHA Standard Entry Class Code. - * - * NOTE: If processing with Colonnade, SECCode is required for CHeck Sale transactions. - * - * @var null - */ - public $secCode = null; -} diff --git a/classes/includes/src/Entities/Check/HpsCheckHolder.php b/classes/includes/src/Entities/Check/HpsCheckHolder.php deleted file mode 100644 index e22de59..0000000 --- a/classes/includes/src/Entities/Check/HpsCheckHolder.php +++ /dev/null @@ -1,14 +0,0 @@ -Transaction->$txnType; - - $sale = parent::fromDict($rsp, $txnType, $returnType); - $sale->responseCode = (isset($response->RspCode) ? (string)$response->RspCode : null); - $sale->responseText = (isset($response->RspMessage) ? (string)$response->RspMessage : null); - $sale->authorizationCode = (isset($response->AuthCode) ? (string)$response->AuthCode : null); - - if ($response->CheckRspInfo) { - $sale->details = array(); - - $checkInfo = $response->CheckRspInfo; - if (count($checkInfo) > 1) { - foreach ($checkInfo as $details) { - $sale->details[] = self::_hydrateRspDetails($details); - } - } else { - $sale->details = self::_hydrateRspDetails($checkInfo); - } - } - - return $sale; - } - /** - * @param $checkInfo - * - * @return \HpsCheckResponseDetails - */ - private static function _hydrateRspDetails($checkInfo) - { - $details = new HpsCheckResponseDetails(); - $details->messageType = (isset($checkInfo->Type) ? (string)$checkInfo->Type : null); - $details->code = (isset($checkInfo->Code) ? (string)$checkInfo->Code : null); - $details->message = (isset($checkInfo->Message) ? (string)$checkInfo->Message : null); - $details->fieldNumber = (isset($checkInfo->FieldNumber) ? (string)$checkInfo->FieldNumber : null); - $details->fieldName = (isset($checkInfo->FieldName) ? (string)$checkInfo->FieldName : null); - return $details; - } -} diff --git a/classes/includes/src/Entities/Check/HpsCheckResponseDetails.php b/classes/includes/src/Entities/Check/HpsCheckResponseDetails.php deleted file mode 100644 index 80567c5..0000000 --- a/classes/includes/src/Entities/Check/HpsCheckResponseDetails.php +++ /dev/null @@ -1,13 +0,0 @@ -Transaction->$txnType; - - $auth = parent::fromDict($rsp, $txnType, $returnType); - $auth->authorizationCode = (isset($authResponse->AuthCode) ? (string)$authResponse->AuthCode : null); - $auth->avsResultCode = (isset($authResponse->AVSRsltCode) ? (string)$authResponse->AVSRsltCode : null); - $auth->avsResultText = (isset($authResponse->AVSRsltText) ? (string)$authResponse->AVSRsltText : null); - $auth->cvvResultCode = (isset($authResponse->CVVRsltCode) ? (string)$authResponse->CVVRsltCode : null); - $auth->cvvResultText = (isset($authResponse->CVVRsltText) ? (string)$authResponse->CVVRsltText : null); - $auth->authorizedAmount = (isset($authResponse->AuthAmt) ? (string)$authResponse->AuthAmt : null); - $auth->cardType = (isset($authResponse->CardType) ? (string)$authResponse->CardType : null); - $auth->descriptor = (isset($authResponse->TxnDescriptor) ? (string)$authResponse->TxnDescriptor : null); - $auth->cpcIndicator = (isset($authResponse->CPCInd) ? (string)$authResponse->CPCInd : null); - - if (isset($rsp->Header->TokenData)) { - $auth->tokenData = new HpsTokenData(); - $auth->tokenData->responseCode = (isset($rsp->Header->TokenData->TokenRspCode) ? (string)$rsp->Header->TokenData->TokenRspCode : null); - $auth->tokenData->responseMessage = (isset($rsp->Header->TokenData->TokenRspMsg) ? (string)$rsp->Header->TokenData->TokenRspMsg : null); - $auth->tokenData->tokenValue = (isset($rsp->Header->TokenData->TokenValue) ? (string)$rsp->Header->TokenData->TokenValue : null); - } - return $auth; - } -} diff --git a/classes/includes/src/Entities/Credit/HpsCPCData.php b/classes/includes/src/Entities/Credit/HpsCPCData.php deleted file mode 100644 index 36c83df..0000000 --- a/classes/includes/src/Entities/Credit/HpsCPCData.php +++ /dev/null @@ -1,37 +0,0 @@ - 17) { - throw new HpsArgumentException('Card holder PO number must be less than 17 characters',HpsExceptionCodes::INVALID_CPC_DATA); - } - $this->cardHolderPONbr = $poNbr; - } - - if ($taxType != null) { - $this->taxType = $taxType; - } - - if ($taxAmt != null) { - $this->taxAmt = $taxAmt; - } - } -} diff --git a/classes/includes/src/Entities/Credit/HpsCPCEdit.php b/classes/includes/src/Entities/Credit/HpsCPCEdit.php deleted file mode 100644 index c74b02b..0000000 --- a/classes/includes/src/Entities/Credit/HpsCPCEdit.php +++ /dev/null @@ -1,22 +0,0 @@ -responseCode = '00'; - $cpcEdit->responseText = ''; - return $cpcEdit; - } -} diff --git a/classes/includes/src/Entities/Credit/HpsCardHolder.php b/classes/includes/src/Entities/Credit/HpsCardHolder.php deleted file mode 100644 index d022a6a..0000000 --- a/classes/includes/src/Entities/Credit/HpsCardHolder.php +++ /dev/null @@ -1,8 +0,0 @@ - '/^3[47][0-9]{13}$/', - 'MasterCard' => '/^5[1-5][0-9]{14}$/', - 'Visa' => '/^4[0-9]{12}(?:[0-9]{3})?$/', - 'DinersClub' => '/^3(?:0[0-5]|[68][0-9])[0-9]{11}$/', - 'EnRoute' => '/^(2014|2149)/', - 'Discover' => '/^6(?:011|5[0-9]{2})[0-9]{12}$/', - 'Jcb' => '/^(?:2131|1800|35\d{3})\d{11}$/', - ); - foreach ($regexMap as $card => $rx) { - if (preg_match($rx, $this->number)) { - return $card; - } - } - return "Unknown"; - } -} diff --git a/classes/includes/src/Entities/Credit/HpsManageTokensResponse.php b/classes/includes/src/Entities/Credit/HpsManageTokensResponse.php deleted file mode 100644 index 3915aec..0000000 --- a/classes/includes/src/Entities/Credit/HpsManageTokensResponse.php +++ /dev/null @@ -1,22 +0,0 @@ -responseCode = '00'; - $transaction->responseText = ''; - return $transaction; - } -} \ No newline at end of file diff --git a/classes/includes/src/Entities/Credit/HpsOfflineAuthorization.php b/classes/includes/src/Entities/Credit/HpsOfflineAuthorization.php deleted file mode 100644 index e221e7d..0000000 --- a/classes/includes/src/Entities/Credit/HpsOfflineAuthorization.php +++ /dev/null @@ -1,22 +0,0 @@ -responseCode = '00'; - $offlineAuth->responseText = ''; - return $offlineAuth; - } -} diff --git a/classes/includes/src/Entities/Credit/HpsRecurringBilling.php b/classes/includes/src/Entities/Credit/HpsRecurringBilling.php deleted file mode 100644 index 89606ad..0000000 --- a/classes/includes/src/Entities/Credit/HpsRecurringBilling.php +++ /dev/null @@ -1,8 +0,0 @@ -responseCode = '00'; - $refund->responseText = ''; - return $refund; - } -} diff --git a/classes/includes/src/Entities/Credit/HpsReportTransactionDetails.php b/classes/includes/src/Entities/Credit/HpsReportTransactionDetails.php deleted file mode 100644 index 0c0f352..0000000 --- a/classes/includes/src/Entities/Credit/HpsReportTransactionDetails.php +++ /dev/null @@ -1,84 +0,0 @@ -Transaction->$txnType; - - $details = parent::fromDict($rsp, $txnType, $returnType); - $details->originalTransactionId = (isset($reportResponse->OriginalGatewayTxnId) ? (string)$reportResponse->OriginalGatewayTxnId : null); - $details->authorizedAmount = (isset($reportResponse->Data->AuthAmt) ? (string)$reportResponse->Data->AuthAmt : null); - $details->maskedCardNumber = (isset($reportResponse->Data->MaskedCardNbr) ? (string)$reportResponse->Data->MaskedCardNbr : null); - $details->authorizationCode = (isset($reportResponse->Data->AuthCode) ? (string)$reportResponse->Data->AuthCode : null); - $details->avsResultCode = (isset($reportResponse->Data->AVSRsltCode) ? (string)$reportResponse->Data->AVSRsltCode : null); - $details->avsResultText = (isset($reportResponse->Data->AVSRsltText) ? (string)$reportResponse->Data->AVSRsltText : null); - $details->cardType = (isset($reportResponse->Data->CardType) ? (string)$reportResponse->Data->CardType : null); - $details->descriptor = (isset($reportResponse->Data->TxnDescriptor) ? (string)$reportResponse->Data->TxnDescriptor : null); - $details->transactionType = (isset($reportResponse->ServiceName) ? HpsTransaction::serviceNameToTransactionType((string)$reportResponse->ServiceName) : null); - $details->transactionUTCDate = (isset($reportResponse->RspUtcDT) ? (string)$reportResponse->RspUtcDT : null); - $details->cpcIndicator = (isset($reportResponse->Data->CPCInd) ? (string)$reportResponse->Data->CPCInd : null); - $details->cvvResultCode = (isset($reportResponse->Data->CVVRsltCode) ? (string)$reportResponse->Data->CVVRsltCode : null); - $details->cvvResultText = (isset($reportResponse->Data->CVVRsltText) ? (string)$reportResponse->Data->CVVRsltText : null); - $details->referenceNumber = (isset($reportResponse->Data->RefNbr) ? (string)$reportResponse->Data->RefNbr : null); - $details->responseCode = (isset($reportResponse->Data->RspCode) ? (string)$reportResponse->Data->RspCode : null); - $details->responseText = (isset($reportResponse->Data->RspText) ? (string)$reportResponse->Data->RspText : null); - $details->transactionStatus = (isset($reportResponse->Data->TxnStatus) ? (string)$reportResponse->Data->TxnStatus : null); - $details->gratuityAmount = (isset($reportResponse->Data->GratuityAmtInfo) ? (string)$reportResponse->Data->GratuityAmtInfo : null); - $details->settlementAmount = (isset($reportResponse->Data->SettlementAmt) ? (string)$reportResponse->Data->SettlementAmt : null); - $details->convenienceAmount = (isset($reportResponse->Data->ConvenienceAmtInfo) ? (string)$reportResponse->Data->ConvenienceAmtInfo : null); - $details->shippingAmount = (isset($reportResponse->Data->ShippingAmtInfo) ? (string)$reportResponse->Data->ShippingAmtInfo : null); - - if (isset($reportResponse->Data->TokenizationMsg)) { - $details->tokenData = new HpsTokenData(); - $details->tokenData->responseMessage = (string)$reportResponse->Data->TokenizationMsg; - } - - if (isset($reportResponse->Data->AdditionalTxnFields)) { - $additionalTxnFields = $reportResponse->Data->AdditionalTxnFields; - $details->memo = (isset($additionalTxnFields->Description) ? (string)$additionalTxnFields->Description : null); - $details->invoiceNumber = (isset($additionalTxnFields->InvoiceNbr) ? (string)$additionalTxnFields->InvoiceNbr : null); - $details->customerId = (isset($additionalTxnFields->CustomerID) ? (string)$additionalTxnFields->CustomerID : null); - } - - if ((string)$reportResponse->GatewayRspCode != '0' && (string)$reportResponse->Data->RspCode != '00') { - if ($details->exceptions == null) { - $details->exceptions = new HpsChargeExceptions(); - } - - $details->exceptions->issuerException = HpsIssuerResponseValidation::getException( - (string)$rsp->Header->GatewayTxnId, - (string)$reportResponse->Data->RspCode, - (string)$reportResponse->Data->RspText, - 'credit' - ); - } - - return $details; - } -} diff --git a/classes/includes/src/Entities/Credit/HpsReportTransactionSummary.php b/classes/includes/src/Entities/Credit/HpsReportTransactionSummary.php deleted file mode 100644 index 339b091..0000000 --- a/classes/includes/src/Entities/Credit/HpsReportTransactionSummary.php +++ /dev/null @@ -1,81 +0,0 @@ -Transaction->ReportActivity->Header->TxnCnt == "0") { - return $transactions; - } - - if ($filterBy != null && is_string($filterBy)) { - $filterBy = HpsTransaction::serviceNameToTransactionType($filterBy); - } - - $summary = null; - $serviceName = (isset($filterBy) ? HpsTransaction::transactionTypeToServiceName($filterBy) : null); - - foreach ($rsp->Transaction->ReportActivity->Details as $charge) { - if (isset($serviceName) && $serviceName != (string)$charge->ServiceName) { - continue; - } - - $summary = new HpsReportTransactionSummary(); - - // Hydrate the header - $summary->_header = new HpsTransactionHeader(); - $summary->_header->gatewayResponseCode = (string)$charge->GatewayRspCode; - $summary->_header->gatewayResponseMessage = (string)$charge->GatewayRspMsg; - - $summary->transactionId = (string)$charge->GatewayTxnId; - - $summary->originalTransactionId = (isset($charge->OriginalGatewayTxnId) ? (string)$charge->OriginalGatewayTxnId : null); - $summary->maskedCardNumber = (isset($charge->MaskedCardNbr) ? (string)$charge->MaskedCardNbr : null); - $summary->responseCode = (isset($charge->IssuerRspCode) ? (string)$charge->IssuerRspCode : null); - $summary->responseText = (isset($charge->IssuerRspText) ? (string)$charge->IssuerRspText : null); - $summary->amount = (isset($charge->Amt) ? (string)$charge->Amt : null); - $summary->settlementAmount = (isset($charge->SettlementAmt) ? (string)$charge->SettlementAmt : null); - $summary->transactionType = (isset($charge->ServiceName) ? HpsTransaction::serviceNameToTransactionType((string)$charge->ServiceName) : null); - $summary->transactionUTCDate = (isset($charge->TxnUtcDT) ? (string)$charge->TxnUtcDT : null); - - $gwResponseCode = (isset($charge->GatewayRspCode) ? (string)$charge->GatewayRspCode : null); - $issuerResponseCode = (isset($charge->IssuerRspCode) ? (string)$charge->IssuerRspCode : null); - - if ($gwResponseCode != "0" || $issuerResponseCode != "00") { - $exceptions = new HpsChargeExceptions(); - if ($gwResponseCode != "0") { - $message = (string)$charge->GatewayRspMsg; - $exceptions->hpsException = HpsGatewayResponseValidation::getException((string)$charge->GatewayTxnId, $gwResponseCode, $message); - } - if ($issuerResponseCode != "00") { - $message = (string)$charge->IssuerRspText; - $exceptions->cardException = HpsIssuerResponseValidation::getException((string)$charge->GatewayTxnId, $issuerResponseCode, $message, 'credit'); - } - $summary->exceptions = $exceptions; - } - - $transactions[] = $summary; - } - return $transactions; - } -} diff --git a/classes/includes/src/Entities/Credit/HpsReversal.php b/classes/includes/src/Entities/Credit/HpsReversal.php deleted file mode 100644 index b2043e1..0000000 --- a/classes/includes/src/Entities/Credit/HpsReversal.php +++ /dev/null @@ -1,33 +0,0 @@ -Transaction->$txnType; - - $reverse = parent::fromDict($rsp, $txnType, $returnType); - $reverse->avsResultCode = (isset($reverseResponse->AVSRsltCode) ? (string)$reverseResponse->AVSRsltCode : null); - $reverse->avsResultText = (isset($reverseResponse->AVSRsltText) ? (string)$reverseResponse->AVSRsltText : null); - $reverse->cpcIndicator = (isset($reverseResponse->CPCInd) ? (string)$reverseResponse->CPCInd : null); - $reverse->cvvResultCode = (isset($reverseResponse->CVVRsltCode) ? (string)$reverseResponse->CVVRsltCode : null); - $reverse->cvvResultText = (isset($reverseResponse->CVVRsltText) ? (string)$reverseResponse->CVVRsltText : null); - - return $reverse; - } -} diff --git a/classes/includes/src/Entities/Credit/HpsSecureEcommerce.php b/classes/includes/src/Entities/Credit/HpsSecureEcommerce.php deleted file mode 100644 index 00fdfb4..0000000 --- a/classes/includes/src/Entities/Credit/HpsSecureEcommerce.php +++ /dev/null @@ -1,13 +0,0 @@ -responseCode = '00'; - $void->responseText = ''; - return $void; - } -} diff --git a/classes/includes/src/Entities/Debit/HpsDebitAddValue.php b/classes/includes/src/Entities/Debit/HpsDebitAddValue.php deleted file mode 100644 index f768643..0000000 --- a/classes/includes/src/Entities/Debit/HpsDebitAddValue.php +++ /dev/null @@ -1,8 +0,0 @@ -name = $name; - $this->action = $action; - } -} diff --git a/classes/includes/src/Entities/Fluent/HpsUnknownPropertyException.php b/classes/includes/src/Entities/Fluent/HpsUnknownPropertyException.php deleted file mode 100644 index 5e08470..0000000 --- a/classes/includes/src/Entities/Fluent/HpsUnknownPropertyException.php +++ /dev/null @@ -1,27 +0,0 @@ -number = $number; - } -} diff --git a/classes/includes/src/Entities/Gift/HpsGiftCardActivate.php b/classes/includes/src/Entities/Gift/HpsGiftCardActivate.php deleted file mode 100644 index 31d9350..0000000 --- a/classes/includes/src/Entities/Gift/HpsGiftCardActivate.php +++ /dev/null @@ -1,56 +0,0 @@ -Transaction->$txnType; - - $activation = new $returnType(); - - $activation->transactionId = (string)$rsp->Header->GatewayTxnId; - $activation->authorizationCode = (isset($activationRsp->AuthCode) ? (string)$activationRsp->AuthCode : null); - $activation->balanceAmount = (isset($activationRsp->BalanceAmt) ? (string)$activationRsp->BalanceAmt : null); - $activation->pointsBalanceAmount = (isset($activationRsp->PointsBalanceAmt) ? (string)$activationRsp->PointsBalanceAmt : null); - $activation->rewards = (isset($activationRsp->Rewards) ? (string)$activationRsp->Rewards : null); - $activation->notes = (isset($activationRsp->Notes) ? (string)$activationRsp->Notes : null); - $activation->responseCode = (isset($activationRsp->RspCode) ? (string)$activationRsp->RspCode : null); - $activation->responseText = (isset($activationRsp->RspText) ? (string)$activationRsp->RspText : null); - - return $activation; - } -} diff --git a/classes/includes/src/Entities/Gift/HpsGiftCardAddValue.php b/classes/includes/src/Entities/Gift/HpsGiftCardAddValue.php deleted file mode 100644 index e3d9f77..0000000 --- a/classes/includes/src/Entities/Gift/HpsGiftCardAddValue.php +++ /dev/null @@ -1,8 +0,0 @@ -Transaction->$txnType; - - $alias = new HpsGiftCardAlias(); - $alias->transactionId = (string)$rsp->Header->GatewayTxnId; - $alias->giftCard = new HpsGiftCard($item->CardData); - $alias->responseCode = (isset($item->RspCode) ? (string)$item->RspCode : null); - $alias->responseText = (isset($item->RspText) ? (string)$item->RspText : null); - - return $alias; - } -} diff --git a/classes/includes/src/Entities/Gift/HpsGiftCardBalance.php b/classes/includes/src/Entities/Gift/HpsGiftCardBalance.php deleted file mode 100644 index 789d0f2..0000000 --- a/classes/includes/src/Entities/Gift/HpsGiftCardBalance.php +++ /dev/null @@ -1,8 +0,0 @@ -Transaction; - - $sale = parent::fromDict($rsp, $txnType, $returnType); - $sale->splitTenderCardAmount = (isset($item->SplitTenderCardAmt) ? (string)$item->SplitTenderCardAmt : null); - $sale->splitTenderBalanceDue = (isset($item->SplitTenderBalanceDueAmt) ? (string)$item->SplitTenderBalanceDueAmt : null); - - return $sale; - } -} diff --git a/classes/includes/src/Entities/Gift/HpsGiftCardVoid.php b/classes/includes/src/Entities/Gift/HpsGiftCardVoid.php deleted file mode 100644 index 1890340..0000000 --- a/classes/includes/src/Entities/Gift/HpsGiftCardVoid.php +++ /dev/null @@ -1,8 +0,0 @@ -invoiceNumber = $invoiceNumber; - - if ($shipMonth == null) { - $shipMonth = date('m'); - } - $this->shipMonth = $shipMonth; - - if ($shipDay == null) { - $shipDay = date('d'); - } - $this->shipDay = $shipDay; - } -} diff --git a/classes/includes/src/Entities/HpsEncryptionData.php b/classes/includes/src/Entities/HpsEncryptionData.php deleted file mode 100644 index 2d766bb..0000000 --- a/classes/includes/src/Entities/HpsEncryptionData.php +++ /dev/null @@ -1,34 +0,0 @@ -responseMessage = $responseMessage; - } -} diff --git a/classes/includes/src/Entities/HpsTrackData.php b/classes/includes/src/Entities/HpsTrackData.php deleted file mode 100644 index 85fee46..0000000 --- a/classes/includes/src/Entities/HpsTrackData.php +++ /dev/null @@ -1,16 +0,0 @@ -_header = new HpsTransactionHeader(); - $transaction->_header->gatewayResponseCode = (string)$rsp->Header->GatewayRspCode; - $transaction->_header->gatewayResponseMessage = (string)$rsp->Header->GatewayRspMsg; - $transaction->_header->responseDt = (string)$rsp->Header->RspDT; - $transaction->_header->clientTxnId = (isset($rsp->Header->ClientTxnId) ? (string)$rsp->Header->ClientTxnId : null); - - $transaction->transactionId = (string)$rsp->Header->GatewayTxnId; - if (isset($rsp->Header->ClientTxnId)) { - $transaction->clientTransactionId = (string)$rsp->Header->ClientTxnId; - } - - // Hydrate the body - if (!isset($rsp->Transaction) || !isset($rsp->Transaction->{$txnType})) { - return $transaction; - } - // Hydrate the body - $item = $rsp->Transaction->{$txnType}; - if ($item != null) { - $transaction->responseCode = (isset($item->RspCode) ? (string)$item->RspCode : null); - $transaction->responseText = (isset($item->RspText) ? (string)$item->RspText : null); - $transaction->referenceNumber = (isset($item->RefNbr) ? (string)$item->RefNbr : null); - } - - return $transaction; - } - /** - * @return object - */ - public function gatewayResponse() - { - return (object)array( - 'code' => $this->_header->gatewayResponseCode, - 'message' => $this->_header->gatewayResponseMessage, - ); - } - /** - * @param $transactionType - * - * @return string - */ - public static function transactionTypeToServiceName($transactionType) - { - switch ($transactionType) { - case HpsTransactionType::AUTHORIZE: - return HpsItemChoiceTypePosResponseVer10Transaction::CREDIT_AUTH; - break; - case HpsTransactionType::CAPTURE: - return HpsItemChoiceTypePosResponseVer10Transaction::CREDIT_ADD_TO_BATCH; - break; - case HpsTransactionType::CHARGE: - return HpsItemChoiceTypePosResponseVer10Transaction::CREDIT_SALE; - break; - case HpsTransactionType::REFUND: - return HpsItemChoiceTypePosResponseVer10Transaction::CREDIT_RETURN; - break; - case HpsTransactionType::REVERSE: - return HpsItemChoiceTypePosResponseVer10Transaction::CREDIT_REVERSAL; - break; - case HpsTransactionType::VERIFY: - return HpsItemChoiceTypePosResponseVer10Transaction::CREDIT_ACCOUNT_VERIFY; - break; - case HpsTransactionType::LIST_TRANSACTION: - return HpsItemChoiceTypePosResponseVer10Transaction::REPORT_ACTIVITY; - break; - case HpsTransactionType::GET: - return HpsItemChoiceTypePosResponseVer10Transaction::REPORT_TXN_DETAIL; - break; - case HpsTransactionType::VOID: - return HpsItemChoiceTypePosResponseVer10Transaction::CREDIT_VOID; - break; - case HpsTransactionType::BATCH_CLOSE: - return HpsItemChoiceTypePosResponseVer10Transaction::BATCH_CLOSE; - break; - case HpsTransactionType::SECURITY_ERROR: - return "SecurityError"; - break; - default: - return ""; - } - } - /** - * @param $serviceName - * - * @return int|null - */ - public static function serviceNameToTransactionType($serviceName) - { - switch ($serviceName) { - case HpsItemChoiceTypePosResponseVer10Transaction::CREDIT_AUTH: - return HpsTransactionType::AUTHORIZE; - break; - case HpsItemChoiceTypePosResponseVer10Transaction::CREDIT_ADD_TO_BATCH: - return HpsTransactionType::CAPTURE; - break; - case HpsItemChoiceTypePosResponseVer10Transaction::CREDIT_SALE: - return HpsTransactionType::CHARGE; - break; - case HpsItemChoiceTypePosResponseVer10Transaction::CREDIT_RETURN: - return HpsTransactionType::REFUND; - break; - case HpsItemChoiceTypePosResponseVer10Transaction::CREDIT_REVERSAL: - return HpsTransactionType::REVERSE; - break; - case HpsItemChoiceTypePosResponseVer10Transaction::CREDIT_ACCOUNT_VERIFY: - return HpsTransactionType::VERIFY; - break; - case HpsItemChoiceTypePosResponseVer10Transaction::REPORT_ACTIVITY: - return HpsTransactionType::LIST_TRANSACTION; - break; - case HpsItemChoiceTypePosResponseVer10Transaction::REPORT_TXN_DETAIL: - return HpsTransactionType::GET; - break; - case HpsItemChoiceTypePosResponseVer10Transaction::CREDIT_VOID: - return HpsTransactionType::VOID; - break; - case HpsItemChoiceTypePosResponseVer10Transaction::BATCH_CLOSE: - return HpsTransactionType::BATCH_CLOSE; - break; - default: - return null; - } - } -} diff --git a/classes/includes/src/Entities/HpsTransactionDetails.php b/classes/includes/src/Entities/HpsTransactionDetails.php deleted file mode 100644 index 3a3c014..0000000 --- a/classes/includes/src/Entities/HpsTransactionDetails.php +++ /dev/null @@ -1,12 +0,0 @@ -Transaction->$txnType; - - $status = parent::fromDict($rsp, $txnType, $returnType); - $status->authorizationCode = (isset($statusResponse->TransactionStatus->AuthCode) ? (string)$statusResponse->TransactionStatus->AuthCode : null); - $status->originalGatewayResponseCode = (isset($statusResponse->TransactionStatus->GatewayRspCode) ? (string)$statusResponse->TransactionStatus->GatewayRspCode : null); - $status->originalGatewayResponseText = (isset($statusResponse->TransactionStatus->GatewayRspMsg) ? (string)$statusResponse->TransactionStatus->GatewayRspMsg : null); - $status->originalResponseCode = (isset($statusResponse->TransactionStatus->RspCode) ? (string)$statusResponse->TransactionStatus->RspCode : null); - $status->originalResponseText = (isset($statusResponse->TransactionStatus->RspText) ? (string)$statusResponse->TransactionStatus->RspText : null); - $status->transactionStatus = (isset($statusResponse->TransactionStatus->TxnStatus) ? (string)$statusResponse->TransactionStatus->TxnStatus : null); - $status->originalTransactionId = (isset($statusResponse->TransactionStatus->GatewayTxnId) ? (string)$statusResponse->TransactionStatus->GatewayTxnId : null); - $status->altPayment = (isset($statusResponse->TransactionStatus->AltPayment) ? $statusResponse->TransactionStatus->AltPayment : null); - $status->timezoneConversion = (isset($statusResponse->TzConversion) ? (string)$statusResponse->TzConversion : null); - - return $status; - } -} diff --git a/classes/includes/src/Entities/PayPlan/HpsPayPlanAmount.php b/classes/includes/src/Entities/PayPlan/HpsPayPlanAmount.php deleted file mode 100644 index b0cb39d..0000000 --- a/classes/includes/src/Entities/PayPlan/HpsPayPlanAmount.php +++ /dev/null @@ -1,23 +0,0 @@ -value = $value; - if ($currency != null) { - $this->currency = $currency; - } - } -} diff --git a/classes/includes/src/Entities/PayPlan/HpsPayPlanCustomer.php b/classes/includes/src/Entities/PayPlan/HpsPayPlanCustomer.php deleted file mode 100644 index 5528055..0000000 --- a/classes/includes/src/Entities/PayPlan/HpsPayPlanCustomer.php +++ /dev/null @@ -1,181 +0,0 @@ -customerKey = property_exists($obj, 'customerKey') ? $obj->customerKey : null; - $ret->customerIdentifier = property_exists($obj, 'customerIdentifier') ? $obj->customerIdentifier : null; - $ret->firstName = property_exists($obj, 'firstName') ? $obj->firstName : null; - $ret->lastName = property_exists($obj, 'lastName') ? $obj->lastName : null; - $ret->company = property_exists($obj, 'company') ? $obj->company : null; - $ret->customerStatus = property_exists($obj, 'customerStatus') ? $obj->customerStatus : null; - $ret->primaryEmail = property_exists($obj, 'primaryEmail') ? $obj->primaryEmail : null; - $ret->phoneDay = property_exists($obj, 'phoneDay') ? $obj->phoneDay : null; - $ret->phoneDayExt = property_exists($obj, 'phoneDayExt') ? $obj->phoneDayExt : null; - $ret->phoneEvening = property_exists($obj, 'phoneEvening') ? $obj->phoneEvening : null; - $ret->phoneEveningExt = property_exists($obj, 'phoneEveningExt') ? $obj->phoneEveningExt : null; - $ret->phoneMobile = property_exists($obj, 'phoneMobile') ? $obj->phoneMobile : null; - $ret->phoneMobileExt = property_exists($obj, 'phoneMobileExt') ? $obj->phoneMobileExt : null; - $ret->fax = property_exists($obj, 'fax') ? $obj->fax : null; - $ret->title = property_exists($obj, 'title') ? $obj->title : null; - $ret->department = property_exists($obj, 'department') ? $obj->department : null; - $ret->addressLine1 = property_exists($obj, 'addressLine1') ? $obj->addressLine1 : null; - $ret->addressLine2 = property_exists($obj, 'addressLine2') ? $obj->addressLine2 : null; - $ret->city = property_exists($obj, 'city') ? $obj->city : null; - $ret->country = property_exists($obj, 'country') ? $obj->country : null; - $ret->stateProvince = property_exists($obj, 'stateProvince') ? $obj->stateProvince : null; - $ret->zipPostalCode = property_exists($obj, 'zipPostalCode') ? $obj->zipPostalCode : null; - $ret->paymentMethods = property_exists($obj, 'paymentMethods') ? array_map('HpsPayPlanPaymentMethod::fromStdClass', $obj->paymentMethods) : null; - $ret->schedules = property_exists($obj, 'schedules') ? array_map('HpsPayPlanSchedule::fromStdClass', $obj->schedules) : null; - $ret->creationDate = property_exists($obj, 'creationDate') ? $obj->creationDate : null; - $ret->lastChangeDate = property_exists($obj, 'lastChangeDate') ? $obj->lastChangeDate : null; - $ret->statusSetDate = property_exists($obj, 'statusSetDate') ? $obj->statusSetDate : null; - return $ret; - } - - // Needs to be implemented to get name of child class - /** - * @param string $class - * @param array $params - * - * @return array - */ - public function getEditableFieldsWithValues($class = '', $params = array()) - { - return parent::getEditableFieldsWithValues(get_class(), $params); - } -} diff --git a/classes/includes/src/Entities/PayPlan/HpsPayPlanPaymentMethod.php b/classes/includes/src/Entities/PayPlan/HpsPayPlanPaymentMethod.php deleted file mode 100644 index a2bae11..0000000 --- a/classes/includes/src/Entities/PayPlan/HpsPayPlanPaymentMethod.php +++ /dev/null @@ -1,239 +0,0 @@ -paymentMethodKey = property_exists($obj, 'paymentMethodKey') ? $obj->paymentMethodKey : null; - $ret->paymentMethodType = property_exists($obj, 'paymentMethodType') ? $obj->paymentMethodType : null; - $ret->preferredPayment = property_exists($obj, 'preferredPayment') ? $obj->preferredPayment : null; - $ret->paymentStatus = property_exists($obj, 'paymentStatus') ? $obj->paymentStatus : null; - $ret->paymentMethodIdentifier = property_exists($obj, 'paymentMethodIdentifier') ? $obj->paymentMethodIdentifier : null; - $ret->customerKey = property_exists($obj, 'customerKey') ? $obj->customerKey : null; - $ret->customerIdentifier = property_exists($obj, 'customerIdentifier') ? $obj->customerIdentifier : null; - $ret->customerStatus = property_exists($obj, 'customerStatus') ? $obj->customerStatus : null; - $ret->firstName = property_exists($obj, 'firstName') ? $obj->firstName : null; - $ret->lastName = property_exists($obj, 'lastName') ? $obj->lastName : null; - $ret->company = property_exists($obj, 'company') ? $obj->company : null; - $ret->nameOnAccount = property_exists($obj, 'nameOnAccount') ? $obj->nameOnAccount : null; - $ret->accountNumberLast4 = property_exists($obj, 'accountNumberLast4') ? $obj->accountNumberLast4 : null; - $ret->paymentMethod = property_exists($obj, 'paymentMethod') ? $obj->paymentMethod : null; - $ret->cardBrand = property_exists($obj, 'cardBrand') ? $obj->cardBrand : null; - $ret->expirationDate = property_exists($obj, 'expirationDate') ? $obj->expirationDate : null; - $ret->cvvResponseCode = property_exists($obj, 'cvvResponseCode') ? $obj->cvvResponseCode : null; - $ret->avsResponseCode = property_exists($obj, 'avsResponseCode') ? $obj->avsResponseCode : null; - $ret->achType = property_exists($obj, 'achType') ? $obj->achType : null; - $ret->accountType = property_exists($obj, 'accountType') ? $obj->accountType : null; - $ret->routingNumber = property_exists($obj, 'routingNumber') ? $obj->routingNumber : null; - $ret->telephoneIndicator = property_exists($obj, 'telephoneIndicator') ? $obj->telephoneIndicator : null; - $ret->addressLine1 = property_exists($obj, 'addressLine1') ? $obj->addressLine1 : null; - $ret->addressLine2 = property_exists($obj, 'addressLine2') ? $obj->addressLine2 : null; - $ret->city = property_exists($obj, 'city') ? $obj->city : null; - $ret->stateProvince = property_exists($obj, 'stateProvince') ? $obj->stateProvince : null; - $ret->zipPostalCode = property_exists($obj, 'zipPostalCode') ? $obj->zipPostalCode : null; - $ret->country = property_exists($obj, 'country') ? $obj->country : null; - $ret->accountHolderYob = property_exists($obj, 'accountHolderYob') ? $obj->accountHolderYob : null; - $ret->driversLicenseState = property_exists($obj, 'driversLicenseState') ? $obj->driversLicenseState : null; - $ret->driversLicenseNumber = property_exists($obj, 'driversLicenseNumber') ? $obj->driversLicenseNumber : null; - $ret->socialSecurityNumberLast4 = property_exists($obj, 'socialSecurityNumberLast4') ? $obj->socialSecurityNumberLast4 : null; - $ret->hasSchedules = property_exists($obj, 'hasSchedules') ? $obj->hasSchedules : null; - $ret->hasActiveSchedules = property_exists($obj, 'hasActiveSchedules') ? $obj->hasActiveSchedules : null; - $ret->creationDate = property_exists($obj, 'creationDate') ? $obj->creationDate : null; - $ret->lastChangeDate = property_exists($obj, 'lastChangeDate') ? $obj->lastChangeDate : null; - $ret->statusSetDate = property_exists($obj, 'statusSetDate') ? $obj->statusSetDate : null; - return $ret; - } - - // Needs to be implemented to get name of child class - /** - * @param string $class - * @param array $params - * - * @return array - */ - public function getEditableFieldsWithValues($class = '', $params = array()) - { - return parent::getEditableFieldsWithValues(get_class(), array($this->paymentMethodType)); - } -} diff --git a/classes/includes/src/Entities/PayPlan/HpsPayPlanSchedule.php b/classes/includes/src/Entities/PayPlan/HpsPayPlanSchedule.php deleted file mode 100644 index 258ff4a..0000000 --- a/classes/includes/src/Entities/PayPlan/HpsPayPlanSchedule.php +++ /dev/null @@ -1,220 +0,0 @@ -emailReceipt = 'Never'; - $this->emailAdvanceNotice = 'No'; - } - /** - * @param \HpsPayPlanSchedule|null $schedule - * - * @return array - */ - public static function getEditableFields( HpsPayPlanSchedule $schedule = null ) - { - $editableFields = array( - 'scheduleName', - 'scheduleStatus', - 'deviceId', - 'paymentMethodKey', - 'subtotalAmount', - 'taxAmount', - 'numberOfPaymentsRemaining', - 'endDate', - 'reprocessingCount', - 'emailReceipt', - 'emailAdvanceNotice', - 'processingDateInfo', - 'invoiceNbr', - 'description', - ); - if ($schedule->scheduleStarted === true){ - $editableFields[] = 'cancellationDate'; - $editableFields[] = 'nextProcessingDate'; - } - // Only editable when scheduleStarted = false - else{ - $editableFields[] = 'scheduleIdentifier'; - $editableFields[] = 'startDate'; - $editableFields[] = 'frequency'; - $editableFields[] = 'duration'; - } - return $editableFields; - } - /** - * @return array - */ - public static function getSearchableFields() - { - return array( - 'scheduleIdentifier', - 'scheduleName', - 'deviceIdFilter', - 'deviceName', - 'customerIdentifier', - 'customerKey', - 'lastname', - 'company', - 'paymentMethodType', - 'paymentMethodKey', - 'achType', - 'accountType', - 'cardBrand', - 'totalAmount', - 'startDate', - 'previousProcessingDate', - 'nextProcessingDate', - 'frequency', - 'duration', - 'scheduleStatus', - ); - } - /** - * @param $obj - * - * @return \HpsPayPlanSchedule - */ - public static function fromStdClass($obj) - { - $ret = new HpsPayPlanSchedule(); - $ret->scheduleKey = property_exists($obj, 'scheduleKey') ? $obj->scheduleKey : null; - $ret->scheduleIdentifier = property_exists($obj, 'scheduleIdentifier') ? $obj->scheduleIdentifier : null; - $ret->customerKey = property_exists($obj, 'customerKey') ? $obj->customerKey : null; - $ret->scheduleName = property_exists($obj, 'scheduleName') ? $obj->scheduleName : null; - $ret->scheduleStatus = property_exists($obj, 'scheduleStatus') ? $obj->scheduleStatus : null; - $ret->paymentMethodKey = property_exists($obj, 'paymentMethodKey') ? $obj->paymentMethodKey : null; - $ret->subtotalAmount = property_exists($obj, 'subtotalAmount') ? $obj->subtotalAmount : null; - $ret->taxAmount = property_exists($obj, 'taxAmount') ? $obj->taxAmount : null; - $ret->totalAmount = property_exists($obj, 'totalAmount') ? $obj->totalAmount : null; - $ret->deviceId = property_exists($obj, 'deviceId') ? $obj->deviceId : null; - $ret->startDate = property_exists($obj, 'startDate') ? $obj->startDate : null; - $ret->processingDateInfo = property_exists($obj, 'processingDateInfo') ? $obj->processingDateInfo : null; - $ret->frequency = property_exists($obj, 'frequency') ? $obj->frequency : null; - $ret->duration = property_exists($obj, 'duration') ? $obj->duration : null; - $ret->endDate = property_exists($obj, 'endDate') ? $obj->endDate : null; - $ret->reprocessingCount = property_exists($obj, 'reprocessingCount') ? $obj->reprocessingCount : null; - $ret->emailReceipt = property_exists($obj, 'emailReceipt') ? $obj->emailReceipt : null; - $ret->emailAdvanceNotice = property_exists($obj, 'emailAdvanceNotice') ? $obj->emailAdvanceNotice : null; - $ret->nextProcessingDate = property_exists($obj, 'nextProcessingDate') ? $obj->nextProcessingDate : null; - $ret->previousProcessingDate = property_exists($obj, 'previousProcessingDate') ? $obj->previousProcessingDate : null; - $ret->approvedTransactionCount = property_exists($obj, 'approvedTransactionCount') ? $obj->approvedTransactionCount : null; - $ret->failureCount = property_exists($obj, 'failureCount') ? $obj->failureCount : null; - $ret->totalApprovedAmountToDate = property_exists($obj, 'totalApprovedAmountToDate') ? $obj->totalApprovedAmountToDate : null; - $ret->numberOfPaymentsRemaining = property_exists($obj, 'numberOfPaymentsRemaining') ? $obj->numberOfPaymentsRemaining : null; - $ret->cancellationDate = property_exists($obj, 'cancellationDate') ? $obj->cancellationDate : null; - $ret->scheduleStarted = property_exists($obj, 'scheduleStarted') ? $obj->scheduleStarted : null; - $ret->creationDate = property_exists($obj, 'creationDate') ? $obj->creationDate : null; - $ret->lastChangeDate = property_exists($obj, 'lastChangeDate') ? $obj->lastChangeDate : null; - $ret->statusSetDate = property_exists($obj, 'statusSetDate') ? $obj->statusSetDate : null; - $ret->description = property_exists($obj, 'description') ? $obj->description : null; - $ret->invoiceNbr = property_exists($obj, 'invoiceNbr') ? $obj->invoiceNbr : null; - return $ret; - } - - // Needs to be implemented to get name of child class - /** - * @param null $params - * @param string $class - * - * @return array - */ - public function getEditableFieldsWithValues($params = null,$class = 'HpsPayPlanSchedule'){ - if ($params===null){ - $params=$this; - } - return parent::getEditableFieldsWithValues($class, $params); - } -} diff --git a/classes/includes/src/Entities/index.php b/classes/includes/src/Entities/index.php deleted file mode 100644 index b3d9bbc..0000000 --- a/classes/includes/src/Entities/index.php +++ /dev/null @@ -1 +0,0 @@ -code = $code; - $this->message = (string) $message; - } -} diff --git a/classes/includes/src/Infrastructure/HpsCheckException.php b/classes/includes/src/Infrastructure/HpsCheckException.php deleted file mode 100644 index de88f17..0000000 --- a/classes/includes/src/Infrastructure/HpsCheckException.php +++ /dev/null @@ -1,26 +0,0 @@ -transactionId = $transactionId; - $this->details = $details; - $this->code = $code; - $this->message = (string) $message; - } -} diff --git a/classes/includes/src/Infrastructure/HpsConfiguration.php b/classes/includes/src/Infrastructure/HpsConfiguration.php deleted file mode 100644 index d2b8dc6..0000000 --- a/classes/includes/src/Infrastructure/HpsConfiguration.php +++ /dev/null @@ -1,21 +0,0 @@ -transactionId = $transactionId; - $this->code = $code; - - if ($issuerCode != null || $issuerMessage != null) { - $this->details = new HpsCreditExceptionDetails(); - $this->details->issuerResponseCode = $issuerCode; - $this->details->issuerResponseText = $issuerMessage; - parent::__construct($message, $code, $innerException); - } - } -} diff --git a/classes/includes/src/Infrastructure/HpsCreditExceptionDetails.php b/classes/includes/src/Infrastructure/HpsCreditExceptionDetails.php deleted file mode 100644 index cee4fa2..0000000 --- a/classes/includes/src/Infrastructure/HpsCreditExceptionDetails.php +++ /dev/null @@ -1,10 +0,0 @@ -message = (string) $message; - if ($code != null) { - $this->code = $code; - } - if ($innerException != null) { - $this->innerException = $innerException; - } - } -} diff --git a/classes/includes/src/Infrastructure/HpsGatewayException.php b/classes/includes/src/Infrastructure/HpsGatewayException.php deleted file mode 100644 index 2d85059..0000000 --- a/classes/includes/src/Infrastructure/HpsGatewayException.php +++ /dev/null @@ -1,37 +0,0 @@ -code = $code; - $this->message = (string) $message; - - if ($gatewayResponseCode != null || $gatewayResponseMessage != null) { - $this->details = new HpsGatewayExceptionDetails(); - $this->details->gatewayResponseCode = $gatewayResponseCode; - $this->details->gatewayResponseMessage = $gatewayResponseMessage; - - $this->innerException = $innerException; - } - - $this->transactionId = $transactionId; - } -} diff --git a/classes/includes/src/Infrastructure/HpsGatewayExceptionDetails.php b/classes/includes/src/Infrastructure/HpsGatewayExceptionDetails.php deleted file mode 100644 index e622554..0000000 --- a/classes/includes/src/Infrastructure/HpsGatewayExceptionDetails.php +++ /dev/null @@ -1,10 +0,0 @@ -param = $paramName; - $this->message = (string) $message; - $this->code = $code; - parent::__construct($message); - } -} diff --git a/classes/includes/src/Infrastructure/HpsLogger.php b/classes/includes/src/Infrastructure/HpsLogger.php deleted file mode 100644 index 252937c..0000000 --- a/classes/includes/src/Infrastructure/HpsLogger.php +++ /dev/null @@ -1,42 +0,0 @@ -_logger = new HpsEmptyLogger(); - } - /** - * @return \HpsLogger|null - */ - public static function getInstance() - { - if (null === self::$_instance) { - self::$_instance = new HpsLogger(); - } - return self::$_instance; - } - /** - * @param \HpsLoggerInterface $logger - */ - public function useLogger(HpsLoggerInterface $logger) - { - $this->_logger = $logger; - } - /** - * @param $message - * @param null $object - */ - public function log($message, $object = null) - { - $this->_logger->log($message, $object); - } -} diff --git a/classes/includes/src/Infrastructure/HpsProcessorError.php b/classes/includes/src/Infrastructure/HpsProcessorError.php deleted file mode 100644 index 2637eba..0000000 --- a/classes/includes/src/Infrastructure/HpsProcessorError.php +++ /dev/null @@ -1,11 +0,0 @@ -transactionId = $transactionId; - $this->code = $code; - - if ($processorCode != null || $processorMessage != null) { - $this->details = new HpsProcessorExceptionDetails(); - $this->details->processorResponseCode = $processorCode; - $this->details->processorResponseText = $processorMessage; - parent::__construct($message, $code, $innerException); - } - } -} diff --git a/classes/includes/src/Infrastructure/HpsProcessorExceptionDetails.php b/classes/includes/src/Infrastructure/HpsProcessorExceptionDetails.php deleted file mode 100644 index 9bde5de..0000000 --- a/classes/includes/src/Infrastructure/HpsProcessorExceptionDetails.php +++ /dev/null @@ -1,10 +0,0 @@ -Header->GatewayRspCode; - $rspText = $response->Header->GatewayRspMsg; - $transactionId = (isset($response->Header->GatewayTxnId) ? $response->Header->GatewayTxnId : null); - $e = HpsGatewayResponseValidation::getException($rspCode, $rspText, $response); - - if ($e != null) { - if ($e instanceof HpsGatewayException) { - $e->transactionId = $transactionId; - } - throw $e; - } - if (!isset($response->Transaction) || !isset($response->Transaction->$expectedType)) { - throw new HpsGatewayException( - HpsExceptionCodes::UNEXPECTED_GATEWAY_ERROR, - 'Unexpected response from HPS gateway', - null, - null, - null, - $transactionId - ); - } - } - /** - * @param $responseCode - * @param $responseText - * @param $response - * - * @return \HpsAuthenticationException|\HpsGatewayException|null - */ - public static function getException($responseCode, $responseText, $response) - { - $e = null; - - switch ($responseCode) { - case '0': - break; - case '-2': - $e = new HpsAuthenticationException( - HpsExceptionCodes::AUTHENTICATION_ERROR, - 'Authentication Error. Please double check your service configuration' - ); - break; - case '3': - $e = new HpsGatewayException( - HpsExceptionCodes::INVALID_ORIGINAL_TRANSACTION, - $responseText, - $responseCode, - $responseText - ); - break; - case '5': - $e = new HpsGatewayException( - HpsExceptionCodes::NO_OPEN_BATCH, - $responseText, - $responseCode, - $responseText - ); - break; - case '12': - $e = new HpsGatewayException( - HpsExceptionCodes::INVALID_CPC_DATA, - 'Invalid CPC data', - $responseCode, - $responseText - ); - break; - case '27': - case '34': - case '26': - case '13': - $e = new HpsGatewayException( - HpsExceptionCodes::INVALID_CARD_DATA, - 'Invalid card data', - $responseCode, - $responseText - ); - break; - case '14': - $e = new HpsGatewayException( - HpsExceptionCodes::INVALID_NUMBER, - 'The card number is not valid', - $responseCode, - $responseText - ); - break; - case '30': - $e = new HpsGatewayException( - HpsExceptionCodes::GATEWAY_ERROR, - 'Gateway timed out', - $responseCode, - $responseText - ); - break; - case '1': - default: - $e = new HpsGatewayException( - HpsExceptionCodes::UNKNOWN_GATEWAY_ERROR, - $responseText, - $responseCode, - $responseText - ); - } - - return $e; - } -} diff --git a/classes/includes/src/Infrastructure/Validation/HpsInputValidation.php b/classes/includes/src/Infrastructure/Validation/HpsInputValidation.php deleted file mode 100644 index f6cac37..0000000 --- a/classes/includes/src/Infrastructure/Validation/HpsInputValidation.php +++ /dev/null @@ -1,197 +0,0 @@ - 20, - 'ZipCode' => 9, - 'FirstName' => 26, - 'LastName' => 26, - 'City' => 20, - 'Email' => 100, - 'State' => 20 - ); - /** - * @param $amount - * - * @return string - * @throws \HpsInvalidRequestException - */ - public static function checkAmount($amount) - { - if ($amount < 0 || $amount === null) { - throw new HpsInvalidRequestException( - HpsExceptionCodes::INVALID_AMOUNT, - 'Must be greater than or equal to 0.', - 'amount' - ); - } - $amount = preg_replace('/[^0-9\.]/', '', $amount); - return sprintf("%0.2f", round($amount, 3)); - } - /** - * @param $currency - * @param null $allowedCurrencies - * - * @throws \HpsInvalidRequestException - */ - public static function checkCurrency($currency, $allowedCurrencies = null) - { - $currencies = self::$_defaultAllowedCurrencies; - if (isset($allowedCurrencies) && is_array($allowedCurrencies)) { - $currencies = $allowedCurrencies; - } - - if ($currency == null || $currency == '') { - throw new HpsInvalidRequestException( - HpsExceptionCodes::MISSING_CURRENCY, - 'Currency cannot be none', - 'currency' - ); - } else if (!in_array(strtolower($currency), $currencies)) { - throw new HpsInvalidRequestException( - HpsExceptionCodes::INVALID_CURRENCY, - "'".strtolower($currency)."' is not a supported currency", - 'currency' - ); - } - } - /** - * @param $number - * - * @return mixed - */ - public static function cleanPhoneNumber($number) - { - return preg_replace('/\D+/', '', trim($number)); - } - /** - * @param $zip - * - * @return mixed - */ - public static function cleanZipCode($zip) - { - return preg_replace('/[^0-9A-Za-z]/', '', trim($zip)); - } - /** - * @param $date - * - * @throws \HpsInvalidRequestException - */ - public static function checkDateNotFuture($date) - { - $current = date('Y-m-d\TH:i:s.00\Z', time()); - - if ($date != null && $date > $current) { - throw new HpsInvalidRequestException( - HpsExceptionCodes::INVALID_DATE, - 'Date cannot be in the future' - ); - } - } - /** - * @param $text - * - * @return mixed - */ - public static function cleanAscii($text) - { - return preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $text); - } - - /** - * This method clears the user input and return the phone number in correct format or throw an exception - * - * @param string $phoneNumber this is user entered phone number - * @return string - * @throws HpsInvalidRequestException - */ - public static function checkPhoneNumber($phoneNumber) { - $phoneNumber = self::cleanPhoneNumber($phoneNumber); - - if (!empty($phoneNumber) && strlen($phoneNumber) > self::$_inputFldMaxLength['PhoneNumber']) { - $errorMessage = 'The value for phone number can be no more than ' . self::$_inputFldMaxLength['PhoneNumber'] . ' characters, Please try again after making corrections'; - throw new HpsInvalidRequestException( - HpsExceptionCodes::INVALID_PHONE_NUMBER, $errorMessage - ); - } - return $phoneNumber; - } - - /** - * This method clears the user input and return the Zip code in correct format or throw an exception - * - * @param string $zipCode this is user entered zip code - * @return string - * @throws HpsInvalidRequestException - */ - public static function checkZipCode($zipCode) { - $zipCode = self::cleanZipCode($zipCode); - - if (!empty($zipCode) && strlen($zipCode) > self::$_inputFldMaxLength['ZipCode']) { - $errorMessage = 'The value for zip code can be no more than ' . self::$_inputFldMaxLength['ZipCode'] . ' characters, Please try again after making corrections'; - throw new HpsInvalidRequestException( - HpsExceptionCodes::INVALID_ZIP_CODE, $errorMessage - ); - } - return $zipCode; - } - - /** - * This method clears the user input and return the user input in correct format or throw an exception - * - * @param string $value this is user entered value (first name or last name or email or city) - * @param string $type this is user entered value field name - * @return string - * @throws HpsInvalidRequestException - */ - public static function checkCardHolderData($value, $type = '') { - - $value = filter_var(trim($value),FILTER_SANITIZE_SPECIAL_CHARS); - - //validate length of input data and throw exception - //if maximum characters is not mentioned in $_inputFldMaxLength the sanitized values will be returned - if (!empty(self::$_inputFldMaxLength[$type]) && strlen($value) > self::$_inputFldMaxLength[$type]) { - $errorMessage = "The value for $type can be no more than " . self::$_inputFldMaxLength[$type] . ' characters, Please try again after making corrections'; - throw new HpsInvalidRequestException( - HpsExceptionCodes::INVALID_INPUT_LENGTH, $errorMessage - ); - } - return $value; - } - - /** - * This method clears the user input and return the email in correct format or throw an exception - * - * @param string $value this is user entered email address - * @return string - * @throws HpsInvalidRequestException - */ - public static function checkEmailAddress($value) { - $value = filter_var(trim($value),FILTER_SANITIZE_EMAIL); - - //validate the email address format - if(!empty($value) && filter_var($value, FILTER_VALIDATE_EMAIL) === false){ - throw new HpsInvalidRequestException( - HpsExceptionCodes::INVALID_EMAIL_ADDRESS, 'Invalid email address' - ); - } - - //validate length of input data and throw exception - if (!empty(self::$_inputFldMaxLength['Email']) && strlen($value) > self::$_inputFldMaxLength['Email']) { - $errorMessage = "The value for Email can be no more than " . self::$_inputFldMaxLength['Email'] . ' characters, Please try again after making corrections'; - throw new HpsInvalidRequestException( - HpsExceptionCodes::INVALID_INPUT_LENGTH, $errorMessage - ); - } - return $value; - } - - - -} diff --git a/classes/includes/src/Infrastructure/Validation/HpsIssuerResponseValidation.php b/classes/includes/src/Infrastructure/Validation/HpsIssuerResponseValidation.php deleted file mode 100644 index 5430be9..0000000 --- a/classes/includes/src/Infrastructure/Validation/HpsIssuerResponseValidation.php +++ /dev/null @@ -1,158 +0,0 @@ - HpsExceptionCodes::CARD_DECLINED, - '03' => HpsExceptionCodes::CARD_DECLINED, - '04' => HpsExceptionCodes::CARD_DECLINED, - '05' => HpsExceptionCodes::CARD_DECLINED, - '41' => HpsExceptionCodes::CARD_DECLINED, - '43' => HpsExceptionCodes::CARD_DECLINED, - '44' => HpsExceptionCodes::CARD_DECLINED, - '51' => HpsExceptionCodes::CARD_DECLINED, - '56' => HpsExceptionCodes::CARD_DECLINED, - '61' => HpsExceptionCodes::CARD_DECLINED, - '62' => HpsExceptionCodes::CARD_DECLINED, - '63' => HpsExceptionCodes::CARD_DECLINED, - '65' => HpsExceptionCodes::CARD_DECLINED, - '78' => HpsExceptionCodes::CARD_DECLINED, - '06' => HpsExceptionCodes::PROCESSING_ERROR, - '07' => HpsExceptionCodes::PROCESSING_ERROR, - '12' => HpsExceptionCodes::PROCESSING_ERROR, - '15' => HpsExceptionCodes::PROCESSING_ERROR, - '19' => HpsExceptionCodes::PROCESSING_ERROR, - '52' => HpsExceptionCodes::PROCESSING_ERROR, - '53' => HpsExceptionCodes::PROCESSING_ERROR, - '57' => HpsExceptionCodes::PROCESSING_ERROR, - '58' => HpsExceptionCodes::PROCESSING_ERROR, - '76' => HpsExceptionCodes::PROCESSING_ERROR, - '77' => HpsExceptionCodes::PROCESSING_ERROR, - '96' => HpsExceptionCodes::PROCESSING_ERROR, - 'EC' => HpsExceptionCodes::PROCESSING_ERROR, - '13' => HpsExceptionCodes::INVALID_AMOUNT, - '14' => HpsExceptionCodes::INCORRECT_NUMBER, - '54' => HpsExceptionCodes::EXPIRED_CARD, - '55' => HpsExceptionCodes::INVALID_PIN, - '75' => HpsExceptionCodes::PIN_ENTRIES_EXCEEDED, - '80' => HpsExceptionCodes::INVALID_EXPIRY, - '86' => HpsExceptionCodes::PIN_VERIFICATION, - '91' => HpsExceptionCodes::ISSUER_TIMEOUT, - 'EB' => HpsExceptionCodes::INCORRECT_CVC, - 'N7' => HpsExceptionCodes::INCORRECT_CVC, - 'FR' => HpsExceptionCodes::POSSIBLE_FRAUD_DETECTED, - ); - - public static $_issuerCodeToGiftExceptionCode = array( - '1' => HpsExceptionCodes::UNKNOWN_GIFT_ERROR, - '2' => HpsExceptionCodes::UNKNOWN_GIFT_ERROR, - '11' => HpsExceptionCodes::UNKNOWN_GIFT_ERROR, - '3' => HpsExceptionCodes::INVALID_CARD_DATA, - '8' => HpsExceptionCodes::INVALID_CARD_DATA, - '4' => HpsExceptionCodes::EXPIRED_CARD, - '5' => HpsExceptionCodes::CARD_DECLINED, - '12' => HpsExceptionCodes::CARD_DECLINED, - '6' => HpsExceptionCodes::PROCESSING_ERROR, - '7' => HpsExceptionCodes::PROCESSING_ERROR, - '10' => HpsExceptionCodes::PROCESSING_ERROR, - '9' => HpsExceptionCodes::INVALID_AMOUNT, - '13' => HpsExceptionCodes::PARTIAL_APPROVAL, - '14' => HpsExceptionCodes::INVALID_PIN, - ); - - public static $_creditExceptionCodeToMessage = array( - HpsExceptionCodes::CARD_DECLINED => "The card was declined.", - HpsExceptionCodes::PROCESSING_ERROR => "An error occurred while processing the card.", - HpsExceptionCodes::INVALID_AMOUNT => "Must be greater than or equal 0.", - HpsExceptionCodes::EXPIRED_CARD => "The card has expired.", - HpsExceptionCodes::INVALID_PIN => "The pin is invalid.", - HpsExceptionCodes::PIN_ENTRIES_EXCEEDED => "Maximum number of pin retries exceeded.", - HpsExceptionCodes::INVALID_EXPIRY => "Card expiration date is invalid.", - HpsExceptionCodes::PIN_VERIFICATION => "Can't verify card pin number.", - HpsExceptionCodes::INCORRECT_CVC => "The card's security code is incorrect.", - HpsExceptionCodes::ISSUER_TIMEOUT => "The card issuer timed-out.", - HpsExceptionCodes::UNKNOWN_CREDIT_ERROR => "An unknown issuer error has occurred.", - HpsExceptionCodes::INCORRECT_NUMBER => "The card number is incorrect.", - HpsExceptionCodes::POSSIBLE_FRAUD_DETECTED => "Possible fraud detected", - HpsExceptionCodes::UNKNOWN_GIFT_ERROR => "An unknown gift error has occurred.", - HpsExceptionCodes::PARTIAL_APPROVAL => "The amount was partially approved.", - HpsExceptionCodes::INVALID_CARD_DATA => "The card data is invalid.", - ); - /** - * @param $transactionId - * @param $responseCode - * @param $responseText - * @param string $type - * - * @throws \HpsCreditException - * @throws null - */ - public static function checkResponse($transactionId, $responseCode, $responseText, $type = 'credit') - { - $e = HpsIssuerResponseValidation::getException( - (string)$transactionId, - (string)$responseCode, - (string)$responseText, - $type - ); - - if ($e != null) { - throw $e; - } - } - /** - * @param $transactionId - * @param $responseCode - * @param $responseText - * @param $type - * - * @return \HpsCreditException|null - */ - public static function getException($transactionId, $responseCode, $responseText, $type) - { - $acceptedCodes = array('00', '0'); - $map = array(); - - switch ($type) { - case 'credit': - $acceptedCodes = array_merge($acceptedCodes, array('85', '10')); - $map = self::$_issuerCodeToCreditExceptionCode; - break; - case 'gift': - $acceptedCodes = array_merge($acceptedCodes, array('13')); - $map = self::$_issuerCodeToGiftExceptionCode; - break; - } - - if (in_array($responseCode, $acceptedCodes)) { - return null; - } - - $code = null; - if (array_key_exists($responseCode, $map)) { - $code = $map[$responseCode]; - } - - if ($code == null) { - return new HpsCreditException( - $transactionId, - HpsExceptionCodes::UNKNOWN_CREDIT_ERROR, - self::$_creditExceptionCodeToMessage[HpsExceptionCodes::UNKNOWN_CREDIT_ERROR], - $responseCode, - $responseText - ); - } - - $message = null; - if (array_key_exists($code, self::$_creditExceptionCodeToMessage)) { - $message = self::$_creditExceptionCodeToMessage[$code]; - } else { - $message = 'Unknown issuer error'; - } - - return new HpsCreditException($transactionId, $code, $message, $responseCode, $responseText); - } -} diff --git a/classes/includes/src/Infrastructure/Validation/HpsProcessorResponseValidation.php b/classes/includes/src/Infrastructure/Validation/HpsProcessorResponseValidation.php deleted file mode 100644 index d340eea..0000000 --- a/classes/includes/src/Infrastructure/Validation/HpsProcessorResponseValidation.php +++ /dev/null @@ -1,64 +0,0 @@ -Processor) && isset($item->Processor->Response)) { - $error = self::nvpToArray($item->Processor->Response); - $code = $error['Code']; - $message = $error['Message']; - } - - return new HpsProcessorException($transactionId, $code, $message, $responseCode, $responseText); - } - /** - * @param $pairs - * - * @return array - */ - protected static function nvpToArray($pairs) - { - $array = array(); - foreach ($pairs->NameValuePair as $pair) { - $array[(string)$pair->Name] = (string)$pair->Value; - } - return $array; - } -} diff --git a/classes/includes/src/Infrastructure/index.php b/classes/includes/src/Infrastructure/index.php deleted file mode 100644 index b3d9bbc..0000000 --- a/classes/includes/src/Infrastructure/index.php +++ /dev/null @@ -1 +0,0 @@ -setUpValidations(); - } - - /** - * Creates an override transaction through the HpsCheckService - */ - public function execute() - { - parent::execute(); - - return $this->service->_buildTransaction( - 'OVERRIDE', - $this->check, - $this->amount, - $this->clientTransactionId - ); - } - - /** - * Setups up validations for building sales. - * - * @return null - */ - private function setUpValidations() - { - $this - ->addValidation(array($this, 'checkNotNull'), 'HpsArgumentException', 'Override needs an check') - ->addValidation(array($this, 'amountNotNull'), 'HpsArgumentException', 'Override needs an amount'); - } - - /** - * Ensures an amount has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function amountNotNull($actionCounts) - { - return isset($actionCounts['amount']); - } - - /** - * Ensures a check has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function checkNotNull($actionCounts) - { - return isset($actionCounts['check']); - } -} diff --git a/classes/includes/src/Services/Fluent/Gateway/Check/HpsCheckServiceRecurringBuilder.php b/classes/includes/src/Services/Fluent/Gateway/Check/HpsCheckServiceRecurringBuilder.php deleted file mode 100644 index 0509b8f..0000000 --- a/classes/includes/src/Services/Fluent/Gateway/Check/HpsCheckServiceRecurringBuilder.php +++ /dev/null @@ -1,107 +0,0 @@ -setUpValidations(); - } - - /** - * Creates a sale transaction through the HpsCheckService - */ - public function execute() - { - parent::execute(); - - HpsInputValidation::checkAmount($this->amount); - - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsCheckSale = $xml->createElement('hps:CheckSale'); - $hpsBlock1 = $xml->createElement('hps:Block1'); - - $hpsBlock1->appendChild($xml->createElement('hps:Amt', sprintf("%0.2f", round($this->amount, 3)))); - $hpsBlock1->appendChild($xml->createElement('hps:CheckAction', 'SALE')); - $hpsBlock1->appendChild($xml->createElement('hps:PaymentMethodKey', $this->paymentMethodKey)); - - $recurringData = $xml->createElement('hps:RecurringData'); - if ($this->schedule != null) { - $scheduleKey = $this->schedule; - if ($this->schedule instanceof HpsPayPlanSchedule) { - $scheduleKey = $this->schedule->scheduleKey; - } - $recurringData->appendChild($xml->createElement('hps:ScheduleID', $scheduleKey)); - } - $recurringData->appendChild($xml->createElement('hps:OneTime', ($this->oneTime ? 'Y' : 'N'))); - - $hpsBlock1->appendChild($recurringData); - $hpsCheckSale->appendChild($hpsBlock1); - $hpsTransaction->appendChild($hpsCheckSale); - - return $this->service->_submitTransaction($hpsTransaction, 'CheckSale'); - } - - /** - * Setups up validations for building sales. - * - * @return null - */ - private function setUpValidations() - { - $this - ->addValidation(array($this, 'paymentMethodKeyNotNull'), 'HpsArgumentException', 'Sale needs a payment method key') - ->addValidation(array($this, 'amountNotNull'), 'HpsArgumentException', 'Sale needs an amount'); - } - - /** - * Ensures an amount has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function amountNotNull($actionCounts) - { - return isset($actionCounts['amount']); - } - - /** - * Ensures a paymentMethodKey has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function paymentMethodKeyNotNull($actionCounts) - { - return isset($actionCounts['paymentMethodKey']) && $actionCounts['paymentMethodKey'] == 1; - } -} diff --git a/classes/includes/src/Services/Fluent/Gateway/Check/HpsCheckServiceReturnBuilder.php b/classes/includes/src/Services/Fluent/Gateway/Check/HpsCheckServiceReturnBuilder.php deleted file mode 100644 index ce67eef..0000000 --- a/classes/includes/src/Services/Fluent/Gateway/Check/HpsCheckServiceReturnBuilder.php +++ /dev/null @@ -1,83 +0,0 @@ -setUpValidations(); - } - - /** - * Creates a return transaction through the HpsCheckService - */ - public function execute() - { - parent::execute(); - - return $this->service->_buildTransaction( - 'RETURN', - $this->check, - $this->amount, - $this->clientTransactionId - ); - } - - /** - * Setups up validations for building returns. - * - * @return null - */ - private function setUpValidations() - { - $this - ->addValidation(array($this, 'checkNotNull'), 'HpsArgumentException', 'Return needs an check') - ->addValidation(array($this, 'amountNotNull'), 'HpsArgumentException', 'Return needs an amount'); - } - - /** - * Ensures an amount has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function amountNotNull($actionCounts) - { - return isset($actionCounts['amount']); - } - - /** - * Ensures a check has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function checkNotNull($actionCounts) - { - return isset($actionCounts['check']); - } -} diff --git a/classes/includes/src/Services/Fluent/Gateway/Check/HpsCheckServiceSaleBuilder.php b/classes/includes/src/Services/Fluent/Gateway/Check/HpsCheckServiceSaleBuilder.php deleted file mode 100644 index c4c1e09..0000000 --- a/classes/includes/src/Services/Fluent/Gateway/Check/HpsCheckServiceSaleBuilder.php +++ /dev/null @@ -1,96 +0,0 @@ -setUpValidations(); - } - - /** - * Creates a sale transaction through the HpsCheckService - */ - public function execute() - { - parent::execute(); - - return $this->service->_buildTransaction( - 'SALE', - $this->check, - $this->amount, - $this->clientTransactionId, - $this->checkVerify, - $this->achVerify - ); - } - - /** - * Setups up validations for building sales. - * - * @return null - */ - private function setUpValidations() - { - $this - ->addValidation(array($this, 'checkNotNull'), 'HpsArgumentException', 'Sale needs a check') - ->addValidation(array($this, 'amountNotNull'), 'HpsArgumentException', 'Sale needs an amount'); - } - - /** - * Ensures an amount has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function amountNotNull($actionCounts) - { - if ($this->checkVerify || $this->achVerify) { - return true; - } - return isset($actionCounts['amount']); - } - - /** - * Ensures a check has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function checkNotNull($actionCounts) - { - return isset($actionCounts['check']); - } -} diff --git a/classes/includes/src/Services/Fluent/Gateway/Check/HpsCheckServiceVoidBuilder.php b/classes/includes/src/Services/Fluent/Gateway/Check/HpsCheckServiceVoidBuilder.php deleted file mode 100644 index 9dd966d..0000000 --- a/classes/includes/src/Services/Fluent/Gateway/Check/HpsCheckServiceVoidBuilder.php +++ /dev/null @@ -1,81 +0,0 @@ -setUpValidations(); - } - - /** - * Creates a void transaction through the HpsCheckService - */ - public function execute() - { - parent::execute(); - - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsCheckVoid = $xml->createElement('hps:CheckVoid'); - $hpsBlock1 = $xml->createElement('hps:Block1'); - - if ($this->transactionId != null) { - $hpsBlock1->appendChild($xml->createElement('hps:GatewayTxnId', $this->transactionId)); - } else if ($this->clientTransactionId != null) { - $hpsBlock1->appendChild($xml->createElement('hps:ClientTxnId', $this->clientTransactionId)); - } - - $hpsCheckVoid->appendChild($hpsBlock1); - $hpsTransaction->appendChild($hpsCheckVoid); - return $this->service->_submitTransaction($hpsTransaction, 'CheckVoid'); - } - - /** - * Setups up validations for building voids. - * - * @return null - */ - private function setUpValidations() - { - $this - ->addValidation(array($this, 'onlyOneTransactionId'), 'HpsArgumentException', 'Void can only use one transaction id'); - } - - /** - * Ensures there is only one transaction id, and checks that - * there is only one transactionId or one clientTransactionId - * in use. Both cannot be used. - * - * @param array $actionCounts - * - * @return bool - */ - public function onlyOneTransactionId($actionCounts) - { - return (isset($actionCounts['transactionId']) && $actionCounts['transactionId'] == 1 - && (!isset($actionCounts['clientTransactionId']) - || isset($actionCounts['clientTransactionId']) && $actionCounts['clientTransactionId'] == 0)) - || (isset($actionCounts['clientTransactionId']) && $actionCounts['clientTransactionId'] == 1 - && (!isset($actionCounts['transactionId']) - || isset($actionCounts['transactionId']) && $actionCounts['transactionId'] == 0)); - } -} diff --git a/classes/includes/src/Services/Fluent/Gateway/Check/HpsCreditServiceRecurringBuilder.php b/classes/includes/src/Services/Fluent/Gateway/Check/HpsCreditServiceRecurringBuilder.php deleted file mode 100644 index 8176d6a..0000000 --- a/classes/includes/src/Services/Fluent/Gateway/Check/HpsCreditServiceRecurringBuilder.php +++ /dev/null @@ -1,107 +0,0 @@ -setUpValidations(); - } - - /** - * Creates a sale transaction through the HpsCheckService - */ - public function execute() - { - parent::execute(); - - HpsInputValidation::checkAmount($this->amount); - - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsCheckSale = $xml->createElement('hps:CheckSale'); - $hpsBlock1 = $xml->createElement('hps:Block1'); - - $hpsBlock1->appendChild($xml->createElement('hps:Amt', sprintf("%0.2f", round($this->amount, 3)))); - $hpsBlock1->appendChild($xml->createElement('hps:CheckAction', 'SALE')); - $hpsBlock1->appendChild($xml->createElement('hps:PaymentMethodKey', $this->paymentMethodKey)); - - $recurringData = $xml->createElement('hps:RecurringData'); - if ($this->schedule != null) { - $scheduleKey = $this->schedule; - if ($this->schedule instanceof HpsPayPlanSchedule) { - $scheduleKey = $this->schedule->scheduleKey; - } - $recurringData->appendChild($xml->createElement('hps:ScheduleID', $scheduleKey)); - } - $recurringData->appendChild($xml->createElement('hps:OneTime', ($this->oneTime ? 'Y' : 'N'))); - - $hpsBlock1->appendChild($recurringData); - $hpsCheckSale->appendChild($hpsBlock1); - $hpsTransaction->appendChild($hpsCheckSale); - - return $this->_submitTransaction($hpsTransaction, 'CheckSale', $clientTransactionId); - } - - /** - * Setups up validations for building sales. - * - * @return null - */ - private function setUpValidations() - { - $this - ->addValidation(array($this, 'paymentMethodKeyNotNull'), 'HpsArgumentException', 'Sale needs a payment method key') - ->addValidation(array($this, 'amountNotNull'), 'HpsArgumentException', 'Sale needs an amount'); - } - - /** - * Ensures an amount has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function amountNotNull($actionCounts) - { - return isset($actionCounts['amount']); - } - - /** - * Ensures a paymentMethodKey has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function paymentMethodKeyNotNull($actionCounts) - { - return isset($actionCounts['paymentMethodKey']); - } -} diff --git a/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceAuthorizeBuilder.php b/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceAuthorizeBuilder.php deleted file mode 100644 index 46a445f..0000000 --- a/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceAuthorizeBuilder.php +++ /dev/null @@ -1,271 +0,0 @@ -setUpValidations(); - } - - /** - * Creates an authorization transaction through the HpsCreditService - */ - public function execute() - { - parent::execute(); - - HpsInputValidation::checkCurrency($this->currency); - HpsInputValidation::checkAmount($this->amount); - - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsCreditAuth = $xml->createElement('hps:CreditAuth'); - $hpsBlock1 = $xml->createElement('hps:Block1'); - - $hpsBlock1->appendChild($xml->createElement('hps:AllowDup', ($this->allowDuplicates ? 'Y' : 'N'))); - $hpsBlock1->appendChild($xml->createElement('hps:AllowPartialAuth', ($this->allowPartialAuth ? 'Y' : 'N'))); - $hpsBlock1->appendChild($xml->createElement('hps:Amt', $this->amount)); - - //update convenienceAmtInfo if passed - if ($this->convenienceAmtInfo != null && $this->convenienceAmtInfo != '') { - $hpsBlock1->appendChild($xml->createElement('hps:ConvenienceAmtInfo', HpsInputValidation::checkAmount($this->convenienceAmtInfo))); - } - - //update shippingAmtInfo if passed - if ($this->shippingAmtInfo != null && $this->shippingAmtInfo != '') { - $hpsBlock1->appendChild($xml->createElement('hps:ShippingAmtInfo', HpsInputValidation::checkAmount($this->shippingAmtInfo))); - } - - if ($this->gratuity != null) { - $hpsBlock1->appendChild($xml->createElement('hps:GratuityAmtInfo', $this->gratuity)); - } - - if ($this->cardHolder != null) { - $hpsBlock1->appendChild($this->service->_hydrateCardHolderData($this->cardHolder, $xml)); - } - - $cardData = $xml->createElement('hps:CardData'); - if ($this->card != null) { - $cardData->appendChild($this->service->_hydrateManualEntry( - $this->card, - $xml, - $this->cardPresent, - $this->readerPresent - )); - if ($this->card->encryptionData != null) { - $cardData->appendChild($this->service->_hydrateEncryptionData($this->card->encryptionData, $xml)); - } - } else if ($this->token != null) { - $cardData->appendChild($this->service->_hydrateTokenData( - $this->token, - $xml, - $this->cardPresent, - $this->readerPresent - )); - } else if ($this->trackData != null) { - $cardData->appendChild($this->service->_hydrateTrackData($this->trackData, $xml)); - if ($this->trackData->encryptionData != null) { - $cardData->appendChild($this->service->_hydrateEncryptionData($this->trackData->encryptionData, $xml)); - } - } else if ($this->paymentData != null) { - $manualEntry = $xml->createElement('hps:ManualEntry'); - $manualEntry->appendChild($xml->createElement('hps:CardNbr', $this->paymentData->applicationPrimaryAccountNumber)); - $expDate = (string)$this->paymentData->applicationExpirationDate; - $manualEntry->appendChild($xml->createElement('hps:ExpMonth', substr($expDate, 2, 2))); - $manualEntry->appendChild($xml->createElement('hps:ExpYear', '20'.substr($expDate, 0, 2))); - $cardData->appendChild($manualEntry); - } - - $cardData->appendChild($xml->createElement('hps:TokenRequest', ($this->requestMultiUseToken ? 'Y' : 'N'))); - - $hpsBlock1->appendChild($cardData); - - if ($this->paymentData != null) { - $hpsBlock1->appendChild($this->service->_hydrateSecureEcommerce($this->paymentData->paymentData, $xml)); - } - - if ($this->cpcReq == true) { - $hpsBlock1->appendChild($xml->createElement('hps:CPCReq', 'Y')); - } - - if ($this->details != null) { - $hpsBlock1->appendChild($this->service->_hydrateAdditionalTxnFields($this->details, $xml)); - } - - if ($this->txnDescriptor != null) { - $hpsBlock1->appendChild($xml->createElement('hps:TxnDescriptor', $this->txnDescriptor)); - } - - if ($this->autoSubstantiation != null) { - $hpsBlock1->appendChild($this->service->_hydrateAutoSubstantiation($this->autoSubstantiation, $xml)); - } - - if ($this->originalTxnReferenceData != null) { - $refElement = $xml->createElement('hps:OrigTxnRefData'); - $refElement->appendChild($xml->createElement('hps:AuthCode', $this->originalTxnReferenceData->authorizationCode)); - $refElement->appendChild($xml->createElement('hps:CardNbrLastFour', $this->originalTxnReferenceData->cardNumberLast4)); - $hpsBlock1->appendChild($refElement); - } - - if ($this->secureEcommerce != null) { - $hpsBlock1->appendChild($this->service->_hydrateSecureEcommerce($this->secureEcommerce, $xml)); - } - - $hpsCreditAuth->appendChild($hpsBlock1); - $hpsTransaction->appendChild($hpsCreditAuth); - - return $this->service->_submitTransaction($hpsTransaction, 'CreditAuth', (isset($this->details->clientTransactionId) ? $this->details->clientTransactionId : null)); - } - - /** - * Setups up validations for building authorizations. - * - * @return null - */ - private function setUpValidations() - { - $this - ->addValidation(array($this, 'onlyOnePaymentMethod'), 'HpsArgumentException', 'Authorize can only use one payment method') - ->addValidation(array($this, 'amountNotNull'), 'HpsArgumentException', 'Authorize needs an amount') - ->addValidation(array($this, 'currencyNotNull'), 'HpsArgumentException', 'Authorize needs a currency'); - } - - /** - * Ensures there is only one payment method, and checks that - * there is only one card or one token in use. Both cannot be - * used. - * - * @param array $actionCounts - * - * @return bool - */ - public function onlyOnePaymentMethod($actionCounts) - { - $count = 0; - if (isset($actionCounts['card'])) { $count++; } - if (isset($actionCounts['token'])) { $count++; } - if (isset($actionCounts['trackData'])) { $count++; } - return 1 === $count; - } - - /** - * Ensures an amount has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function amountNotNull($actionCounts) - { - return isset($actionCounts['amount']); - } - - /** - * Ensures a currency has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function currencyNotNull($actionCounts) - { - return isset($actionCounts['currency']); - } -} diff --git a/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceCaptureBuilder.php b/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceCaptureBuilder.php deleted file mode 100644 index 11b1936..0000000 --- a/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceCaptureBuilder.php +++ /dev/null @@ -1,95 +0,0 @@ -setUpValidations(); - } - - /** - * Creates a capture transaction through the HpsCreditService - */ - public function execute() - { - parent::execute(); - - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsCreditAddToBatch = $xml->createElement('hps:CreditAddToBatch'); - - $hpsCreditAddToBatch->appendChild($xml->createElement('hps:GatewayTxnId', $this->transactionId)); - if ($this->amount != null) { - $amount = sprintf("%0.2f", round($this->amount, 3)); - $hpsCreditAddToBatch->appendChild($xml->createElement('hps:Amt', $amount)); - } - if ($this->gratuity != null) { - $hpsCreditAddToBatch->appendChild($xml->createElement('hps:GratuityAmtInfo', $this->gratuity)); - } - - if ($this->directMarketData != null && $this->directMarketData->invoiceNumber != null) { - $hpsCreditAddToBatch->appendChild($this->_hydrateDirectMarketData($this->directMarketData, $xml)); - } - $hpsTransaction->appendChild($hpsCreditAddToBatch); - $response = $this->service->doRequest($hpsTransaction); - $this->_processChargeGatewayResponse($response, 'CreditAddToBatch'); - - return $this->service - ->get($this->transactionId) - ->execute(); - } - - /** - * Setups up validations for building captures. - * - * @return null - */ - private function setUpValidations() - { - $this - ->addValidation(array($this, 'transactionIdNotNull'), 'HpsArgumentException', 'Capture needs a transactionId'); - } - - /** - * Ensures a transactionId has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function transactionIdNotNull($actionCounts) - { - return isset($actionCounts['transactionId']); - } -} diff --git a/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceChargeBuilder.php b/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceChargeBuilder.php deleted file mode 100644 index 77acca1..0000000 --- a/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceChargeBuilder.php +++ /dev/null @@ -1,264 +0,0 @@ -setUpValidations(); - } - - /** - * Creates a charge transaction through the HpsCreditService - */ - public function execute() - { - parent::execute(); - - HpsInputValidation::checkCurrency($this->currency); - HpsInputValidation::checkAmount($this->amount); - - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsCreditSale = $xml->createElement('hps:CreditSale'); - $hpsBlock1 = $xml->createElement('hps:Block1'); - - $hpsBlock1->appendChild($xml->createElement('hps:AllowDup', ($this->allowDuplicates ? 'Y' : 'N'))); - $hpsBlock1->appendChild($xml->createElement('hps:AllowPartialAuth', ($this->allowPartialAuth ? 'Y' : 'N'))); - $hpsBlock1->appendChild($xml->createElement('hps:Amt', $this->amount)); - - //update convenienceAmtInfo if passed - if ($this->convenienceAmtInfo != null && $this->convenienceAmtInfo != '') { - $hpsBlock1->appendChild($xml->createElement('hps:ConvenienceAmtInfo', HpsInputValidation::checkAmount($this->convenienceAmtInfo))); - } - - //update shippingAmtInfo if passed - if ($this->shippingAmtInfo != null && $this->shippingAmtInfo != '') { - $hpsBlock1->appendChild($xml->createElement('hps:ShippingAmtInfo', HpsInputValidation::checkAmount($this->shippingAmtInfo))); - } - - if ($this->gratuity != null) { - $hpsBlock1->appendChild($xml->createElement('hps:GratuityAmtInfo', $this->gratuity)); - } - - if ($this->cardHolder != null) { - $hpsBlock1->appendChild($this->service->_hydrateCardHolderData($this->cardHolder, $xml)); - } - - $cardData = $xml->createElement('hps:CardData'); - if ($this->card != null) { - $cardData->appendChild($this->service->_hydrateManualEntry( - $this->card, - $xml, - $this->cardPresent, - $this->readerPresent - )); - if ($this->card->encryptionData != null) { - $cardData->appendChild($this->service->_hydrateEncryptionData( - $this->card->encryptionData, - $xml - )); - } - } else if ($this->token != null) { - $cardData->appendChild($this->service->_hydrateTokenData( - $this->token, - $xml, - $this->cardPresent, - $this->readerPresent - )); - } else if ($this->trackData != null) { - $cardData->appendChild($this->service->_hydrateTrackData($this->trackData, $xml)); - if ($this->trackData->encryptionData != null) { - $cardData->appendChild($this->service->_hydrateEncryptionData( - $this->trackData->encryptionData, - $xml - )); - } - } else if ($this->paymentData != null) { - $manualEntry = $xml->createElement('hps:ManualEntry'); - $manualEntry->appendChild($xml->createElement('hps:CardNbr', $this->paymentData->applicationPrimaryAccountNumber)); - $expDate = $this->paymentData->applicationExpirationDate; - $manualEntry->appendChild($xml->createElement('hps:ExpMonth', substr($expDate, 2, 2))); - $manualEntry->appendChild($xml->createElement('hps:ExpYear', '20' . substr($expDate, 0, 2))); - $cardData->appendChild($manualEntry); - } - - if ($this->cpcReq) { - $hpsBlock1->appendChild($xml->createElement('hps:CPCReq', 'Y')); - } - - $cardData->appendChild($xml->createElement('hps:TokenRequest', ($this->requestMultiUseToken ? 'Y' : 'N'))); - - if ($this->details != null) { - $hpsBlock1->appendChild($this->service->_hydrateAdditionalTxnFields($this->details, $xml)); - } - - if ($this->txnDescriptor != null && $this->txnDescriptor != '') { - $hpsBlock1->appendChild($xml->createElement('hps:TxnDescriptor', $this->txnDescriptor)); - } - - if ($this->directMarketData != null && $this->directMarketData->invoiceNumber != null) { - $hpsBlock1->appendChild($this->service->_hydrateDirectMarketData($this->directMarketData, $xml)); - } - - if ($this->originalTxnReferenceData != null) { - $refElement = $xml->createElement('hps:OrigTxnRefData'); - $refElement->appendChild($xml->createElement('hps:AuthCode', $this->originalTxnReferenceData->authorizationCode)); - $refElement->appendChild($xml->createElement('hps:CardNbrLastFour', $this->originalTxnReferenceData->cardNumberLast4)); - } - - $hpsBlock1->appendChild($cardData); - - if ($this->secureEcommerce != null) { - $hpsBlock1->appendChild($this->service->_hydrateSecureEcommerce($this->secureEcommerce, $xml)); - } - - $hpsCreditSale->appendChild($hpsBlock1); - $hpsTransaction->appendChild($hpsCreditSale); - - return $this->service->_submitTransaction($hpsTransaction, 'CreditSale', (isset($this->details->clientTransactionId) ? $this->details->clientTransactionId : null)); - } - - /** - * Setups up validations for building charges. - * - * @return null - */ - private function setUpValidations() - { - $this - ->addValidation(array($this, 'amountNotNull'), 'HpsArgumentException', 'Charge needs an amount') - ->addValidation(array($this, 'onlyOnePaymentMethod'), 'HpsArgumentException', 'Charge can only use one payment method') - ->addValidation(array($this, 'currencyNotNull'), 'HpsArgumentException', 'Charge needs a currency'); - } - - /** - * Ensures there is only one payment method, and checks that - * there is only one card or one token in use. Both cannot be - * used. - * - * @param array $actionCounts - * - * @return bool - */ - public function onlyOnePaymentMethod($actionCounts) - { - $methods = 0; - if (isset($actionCounts['card']) && $actionCounts['card'] == 1) { - $methods++; - } - if (isset($actionCounts['token']) && $actionCounts['token'] == 1) { - $methods++; - } - if (isset($actionCounts['trackData']) && $actionCounts['trackData'] == 1) { - $methods++; - } - return $methods == 1; - } - - /** - * Ensures an amount has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function amountNotNull($actionCounts) - { - return isset($actionCounts['amount']); - } - - /** - * Ensures a currency has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function currencyNotNull($actionCounts) - { - return isset($actionCounts['currency']); - } -} diff --git a/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceCpcEditBuilder.php b/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceCpcEditBuilder.php deleted file mode 100644 index c03d3fe..0000000 --- a/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceCpcEditBuilder.php +++ /dev/null @@ -1,81 +0,0 @@ -setUpValidations(); - } - - /** - * Creates a cpcEdit transaction through the HpsCreditService - */ - public function execute() - { - parent::execute(); - - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsPosCreditCPCEdit = $xml->createElement('hps:CreditCPCEdit'); - $hpsPosCreditCPCEdit->appendChild($xml->createElement('hps:GatewayTxnId', $this->transactionId)); - $hpsPosCreditCPCEdit->appendChild($this->service->_hydrateCPCData($this->cpcData, $xml)); - $hpsTransaction->appendChild($hpsPosCreditCPCEdit); - - return $this->service->_submitTransaction($hpsTransaction, 'CreditCPCEdit'); - } - - /** - * Setups up validations for building cpcEdits. - * - * @return null - */ - private function setUpValidations() - { - $this - ->addValidation(array($this, 'transactionIdNotNull'), 'HpsArgumentException', 'CpcEdit needs a transactionId') - ->addValidation(array($this, 'cpcDataNotNull'), 'HpsArgumentException', 'CpcEdit needs cpcData'); - } - - /** - * Ensures a transactionId has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function transactionIdNotNull($actionCounts) - { - return isset($actionCounts['transactionId']); - } - - /** - * Ensures cpcData has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function cpcDataNotNull($actionCounts) - { - return isset($actionCounts['cpcData']); - } -} diff --git a/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceEditBuilder.php b/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceEditBuilder.php deleted file mode 100644 index 93d0ace..0000000 --- a/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceEditBuilder.php +++ /dev/null @@ -1,88 +0,0 @@ -setUpValidations(); - } - - /** - * Creates an edit transaction through the HpsCreditService - */ - public function execute() - { - parent::execute(); - - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsCreditTxnEdit = $xml->createElement('hps:CreditTxnEdit'); - - $hpsCreditTxnEdit->appendChild($xml->createElement('hps:GatewayTxnId', $this->transactionId)); - if ($this->amount != null) { - $amount = sprintf('%0.2f', round($this->amount, 3)); - $hpsCreditTxnEdit->appendChild($xml->createElement('hps:Amt', $amount)); - } - if ($this->gratuity != null) { - $hpsCreditTxnEdit->appendChild($xml->createElement('hps:GratuityAmtInfo', $this->gratuity)); - } - - $hpsTransaction->appendChild($hpsCreditTxnEdit); - $trans = $this->service->_submitTransaction($hpsTransaction, 'CreditTxnEdit', $this->clientTransactionId); - - $trans->responseCode = '00'; - $trans->responseText = ''; - - return $trans; - } - - /** - * Setups up validations for building edits. - * - * @return null - */ - private function setUpValidations() - { - $this - ->addValidation(array($this, 'transactionIdNotNull'), 'HpsArgumentException', 'Edit needs a transactionId'); - } - - /** - * Ensures a transactionId has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function transactionIdNotNull($actionCounts) - { - return isset($actionCounts['transactionId']); - } -} diff --git a/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceGetBuilder.php b/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceGetBuilder.php deleted file mode 100644 index ca6dbbd..0000000 --- a/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceGetBuilder.php +++ /dev/null @@ -1,67 +0,0 @@ -setUpValidations(); - } - - /** - * Creates a get transaction through the HpsCreditService - */ - public function execute() - { - parent::execute(); - - if ($this->transactionId <= 0) { - throw new HpsArgumentException('Invalid Transaction Id',HpsExceptionCodes::INVALID_ORIGINAL_TRANSACTION); - } - - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsReportTxnDetail = $xml->createElement('hps:ReportTxnDetail'); - $hpsReportTxnDetail->appendChild($xml->createElement('hps:TxnId', $this->transactionId)); - $hpsTransaction->appendChild($hpsReportTxnDetail); - - return $this->service->_submitTransaction($hpsTransaction, 'ReportTxnDetail'); - } - - /** - * Setups up validations for building edits. - * - * @return null - */ - private function setUpValidations() - { - $this - ->addValidation(array($this, 'transactionIdNotNull'), 'HpsArgumentException', 'Get needs a transactionId'); - } - - /** - * Ensures a transactionId has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function transactionIdNotNull($actionCounts) - { - return isset($actionCounts['transactionId']); - } -} diff --git a/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceListTransactionsBuilder.php b/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceListTransactionsBuilder.php deleted file mode 100644 index 409ea5a..0000000 --- a/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceListTransactionsBuilder.php +++ /dev/null @@ -1,94 +0,0 @@ -setUpValidations(); - } - - /** - * Creates a listTransactions transaction through the HpsCreditService - */ - public function execute() - { - parent::execute(); - - date_default_timezone_set("UTC"); - $dateFormat = 'Y-m-d\TH:i:s.00\Z'; - $current = new DateTime(); - $currentTime = $current->format($dateFormat); - - HpsInputValidation::checkDateNotFuture($this->startDate); - HpsInputValidation::checkDateNotFuture($this->endDate); - - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsReportActivity = $xml->createElement('hps:ReportActivity'); - $hpsReportActivity->appendChild($xml->createElement('hps:RptStartUtcDT', $this->startDate)); - $hpsReportActivity->appendChild($xml->createElement('hps:RptEndUtcDT', $this->endDate)); - $hpsTransaction->appendChild($hpsReportActivity); - - return $this->service->_submitTransaction($hpsTransaction, 'ReportActivity'); - } - - /** - * Setups up validations for building edits. - * - * @return null - */ - private function setUpValidations() - { - $this - ->addValidation(array($this, 'startDateNotNull'), 'HpsArgumentException', 'ListTransactions needs a startDate') - ->addValidation(array($this, 'endDateNotNull'), 'HpsArgumentException', 'ListTransactions needs an endDate'); - } - - /** - * Ensures a startDate has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function startDateNotNull($actionCounts) - { - return isset($actionCounts['startDate']); - } - - /** - * Ensures an endDate has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function endDateNotNull($actionCounts) - { - return isset($actionCounts['endDate']); - } -} diff --git a/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceOfflineAuthBuilder.php b/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceOfflineAuthBuilder.php deleted file mode 100644 index 48b8f01..0000000 --- a/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceOfflineAuthBuilder.php +++ /dev/null @@ -1,227 +0,0 @@ -setUpValidations(); - } - - /** - * Creates a offline auth transaction through the HpsCreditService - */ - public function execute() - { - parent::execute(); - - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsCreditOfflineAuth = $xml->createElement('hps:CreditOfflineAuth'); - $hpsBlock1 = $xml->createElement('hps:Block1'); - - $hpsBlock1->appendChild($xml->createElement('hps:AllowDup', ($this->allowDuplicates ? 'Y' : 'N'))); - $hpsBlock1->appendChild($xml->createElement('hps:Amt', $this->amount)); - - //update convenienceAmtInfo if passed - if ($this->convenienceAmtInfo != null && $this->convenienceAmtInfo != '') { - $hpsBlock1->appendChild($xml->createElement('hps:ConvenienceAmtInfo', HpsInputValidation::checkAmount($this->convenienceAmtInfo))); - } - - //update shippingAmtInfo if passed - if ($this->shippingAmtInfo != null && $this->shippingAmtInfo != '') { - $hpsBlock1->appendChild($xml->createElement('hps:ShippingAmtInfo', HpsInputValidation::checkAmount($this->shippingAmtInfo))); - } - - if ($this->gratuity != null) { - $hpsBlock1->appendChild($xml->createElement('hps:GratuityAmtInfo', $this->gratuity)); - } - - if ($this->cardHolder != null) { - $hpsBlock1->appendChild($this->service->_hydrateCardHolderData($this->cardHolder, $xml)); - } - - $cardData = $xml->createElement('hps:CardData'); - if ($this->card != null) { - $cardData->appendChild($this->service->_hydrateManualEntry( - $this->card, - $xml, - $this->cardPresent, - $this->readerPresent - )); - } else if ($this->token != null) { - $cardData->appendChild($this->service->_hydrateTokenData( - $this->token, - $xml, - $this->cardPresent, - $this->readerPresent - )); - } else if ($this->trackData != null) { - $cardData->appendChild($this->service->_hydrateTrackData($this->trackData, $xml)); - if ($this->trackData->encryptionData != null) { - $cardData->appendChild($this->service->_hydrateEncryptionData($this->trackData->encryptionData)); - } - } else if ($this->paymentData != null) { - $manualEntry = $xml->createElement('hps:ManualEntry'); - $manualEntry->appendChild($xml->createElement('hps:CardNbr', $this->paymentData->applicationPrimaryAccountNumber)); - $expDate = (string)$this->paymentData->applicationExpirationDate; - $manualEntry->appendChild($xml->createElement('hps:ExpMonth', substr($expDate, 2, 2))); - $manualEntry->appendChild($xml->createElement('hps:ExpYear', substr($expDate, 0, 2))); - $cardData->appendChild($manualEntry); - } - - $cardData->appendChild($xml->createElement('hps:TokenRequest', ($this->requestMultiUseToken ? 'Y' : 'N'))); - - $hpsBlock1->appendChild($cardData); - - if ($this->paymentData != null) { - $hpsBlock1->appendChild($this->service->_hydrateSecureEcommerce($this->paymentData->paymentData)); - } - - if ($this->cpcReq == true) { - $hpsBlock1->appendChild($xml->createElement('hps:CPCReq', 'Y')); - } - - if ($this->txnDescriptor != null) { - $hpsBlock1->appendChild($xml->createElement('hps:TxnDescriptor', $this->txnDescriptor)); - } - - if ($this->autoSubstantiation != null) { - $hpsBlock1->appendChild($this->service->_hydrateAutoSubstantiation($this->autoSubstantiation)); - } - - if ($this->offlineAuthCode != null) { - $hpsBlock1->appendChild($xml->createElement('hps:OfflineAuthCode', $this->offlineAuthCode)); - } - - $hpsCreditOfflineAuth->appendChild($hpsBlock1); - $hpsTransaction->appendChild($hpsCreditOfflineAuth); - - return $this->service->_submitTransaction($hpsTransaction, 'CreditOfflineAuth', (isset($this->details->clientTransactionId) ? $this->details->clientTransactionId : null)); - } - - /** - * Setups up validations for building offline auths. - * - * @return null - */ - private function setUpValidations() - { - $this - ->addValidation(array($this, 'onlyOnePaymentMethod'), 'HpsArgumentException', 'Offline Auth can only use one payment method'); - } - - /** - * Ensures there is only one payment method, and checks that - * there is only one card or one token in use. Both cannot be - * used. - * - * @param array $actionCounts - * - * @return bool - */ - public function onlyOnePaymentMethod($actionCounts) - { - $methods = 0; - if (isset($actionCounts['card']) && $actionCounts['card'] == 1) { - $methods++; - } - if (isset($actionCounts['token']) && $actionCounts['token'] == 1) { - $methods++; - } - if (isset($actionCounts['trackData']) && $actionCounts['trackData'] == 1) { - $methods++; - } - return $methods == 1; - } -} diff --git a/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceOfflineChargeBuilder.php b/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceOfflineChargeBuilder.php deleted file mode 100644 index 2d45299..0000000 --- a/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceOfflineChargeBuilder.php +++ /dev/null @@ -1,184 +0,0 @@ -createElement('hps:Transaction'); - $hpsCreditOfflineAuth = $xml->createElement('hps:CreditOfflineAuth'); - $hpsBlock1 = $xml->createElement('hps:Block1'); - - $hpsBlock1->appendChild($xml->createElement('hps:AllowDup', ($this->allowDuplicates ? 'Y' : 'N'))); - $hpsBlock1->appendChild($xml->createElement('hps:Amt', $this->amount)); - - //update convenienceAmtInfo if passed - if ($this->convenienceAmtInfo != null && $this->convenienceAmtInfo != '') { - $hpsBlock1->appendChild($xml->createElement('hps:ConvenienceAmtInfo', HpsInputValidation::checkAmount($this->convenienceAmtInfo))); - } - - //update shippingAmtInfo if passed - if ($this->shippingAmtInfo != null && $this->shippingAmtInfo != '') { - $hpsBlock1->appendChild($xml->createElement('hps:ShippingAmtInfo', HpsInputValidation::checkAmount($this->shippingAmtInfo))); - } - - if ($this->gratuity != null) { - $hpsBlock1->appendChild($xml->createElement('hps:GratuityAmtInfo', $this->gratuity)); - } - - if ($this->cardHolder != null) { - $hpsBlock1->appendChild($this->service->_hydrateCardHolderData($this->cardHolder, $xml)); - } - - $cardData = $xml->createElement('hps:CardData'); - if ($this->card != null) { - $cardData->appendChild($this->service->_hydrateManualEntry( - $this->card, - $xml, - $this->cardPresent, - $this->readerPresent - )); - if ($this->card->encryptionData != null) { - $cardData->appendChild($this->service->_hydrateEncryptionData($this->card->encryptionData)); - } - } else if ($this->token != null) { - $cardData->appendChild($this->service->_hydrateTokenData( - $this->token, - $xml, - $this->cardPresent, - $this->readerPresent - )); - } else if ($this->trackData != null) { - $cardData->appendChild($this->service->_hydrateTrackData($this->trackData, $xml)); - if ($this->trackData->encryptionData != null) { - $cardData->appendChild($this->service->_hydrateEncryptionData($this->trackData->encryptionData)); - } - } else if ($this->paymentData != null) { - $manualEntry = $xml->createElement('hps:ManualEntry'); - $manualEntry->appendChild($xml->createElement('hps:CardNbr', $this->paymentData->applicationPrimaryAccountNumber)); - $expDate = (string)$this->paymentData->applicationExpirationDate; - $manualEntry->appendChild($xml->createElement('hps:ExpMonth', substr($expDate, 2, 2))); - $manualEntry->appendChild($xml->createElement('hps:ExpYear', '20'.substr($expDate, 0, 2))); - $cardData->appendChild($manualEntry); - } - - $cardData->appendChild($xml->createElement('hps:TokenRequest', ($this->requestMultiUseToken ? 'Y' : 'N'))); - - $hpsBlock1->appendChild($cardData); - - if ($this->paymentData != null) { - $hpsBlock1->appendChild($this->service->_hydrateSecureEcommerce($this->paymentData->paymentData)); - } - - if ($this->cpcReq == true) { - $hpsBlock1->appendChild($xml->createElement('hps:CPCReq', 'Y')); - } - - if ($this->txnDescriptor != null) { - $hpsBlock1->appendChild($xml->createElement('hps:TxnDescriptor', $this->txnDescriptor)); - } - - if ($this->autoSubstantiation != null) { - $hpsBlock1->appendChild($this->service->_hydrateAutoSubstantiation($this->autoSubstantiation)); - } - - if ($this->offlineAuthCode != null) { - $hpsBlock1->appendChild($xml->createElement('hps:OfflineAuthCode', $this->offlineAuthCode)); - } - - $hpsCreditOfflineAuth->appendChild($hpsBlock1); - $hpsTransaction->appendChild($hpsCreditOfflineAuth); - - return $this->service->_submitTransaction($hpsTransaction, 'CreditOfflineAuth', (isset($this->details->clientTransactionId) ? $this->details->clientTransactionId : null)); - } -} diff --git a/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServicePrepaidAddValueBuilder.php b/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServicePrepaidAddValueBuilder.php deleted file mode 100644 index 2edb1bf..0000000 --- a/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServicePrepaidAddValueBuilder.php +++ /dev/null @@ -1,110 +0,0 @@ -setUpValidations(); - } - - /** - * Creates an add value transaction through the HpsCreditService - */ - public function execute() - { - parent::execute(); - - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsCreditAuth = $xml->createElement('hps:PrePaidAddValue'); - $hpsBlock1 = $xml->createElement('hps:Block1'); - - $hpsBlock1->appendChild($xml->createElement('hps:Amt', $this->amount)); - $hpsBlock1->appendChild($xml->createElement('hps:AllowDup', ($this->allowDuplicates ? 'Y' : 'N'))); - - $cardData = $xml->createElement('hps:CardData'); - if ($this->card != null) { - $cardData->appendChild($this->service->_hydrateManualEntry($this->card, $xml)); - } else if ($this->trackData != null) { - $cardData->appendChild($this->service->_hydrateTrackData($this->trackData, $xml)); - } else if ($this->token != null) { - $cardData->appendChild($this->service->_hydrateTokenData($this->token, $xml)); - } - - $hpsBlock1->appendChild($cardData); - $hpsCreditAuth->appendChild($hpsBlock1); - $hpsTransaction->appendChild($hpsCreditAuth); - - return $this->service->_submitTransaction($hpsTransaction, 'PrePaidAddValue'); - } - - /** - * Setups up validations for building balance inquiries. - * - * @return null - */ - private function setUpValidations() - { - $this - ->addValidation(array($this, 'onlyOnePaymentMethod'), 'HpsArgumentException', 'Add Value can only use one payment method'); - } - - /** - * Ensures there is only one payment method, and checks that - * there is only one card or one token in use. Both cannot be - * used. - * - * @param array $actionCounts - * - * @return bool - */ - public function onlyOnePaymentMethod($actionCounts) - { - $methods = 0; - if (isset($actionCounts['card']) && $actionCounts['card'] == 1) { - $methods++; - } - if (isset($actionCounts['token']) && $actionCounts['token'] == 1) { - $methods++; - } - if (isset($actionCounts['trackData']) && $actionCounts['trackData'] == 1) { - $methods++; - } - return $methods == 1; - } -} diff --git a/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServicePrepaidBalanceInquiryBuilder.php b/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServicePrepaidBalanceInquiryBuilder.php deleted file mode 100644 index c22ea82..0000000 --- a/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServicePrepaidBalanceInquiryBuilder.php +++ /dev/null @@ -1,103 +0,0 @@ -setUpValidations(); - } - - /** - * Creates a balance inquiry transaction through the HpsCreditService - */ - public function execute() - { - parent::execute(); - - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsCreditAuth = $xml->createElement('hps:PrePaidBalanceInquiry'); - $hpsBlock1 = $xml->createElement('hps:Block1'); - - $cardData = $xml->createElement('hps:CardData'); - if ($this->card != null) { - $cardData->appendChild($this->service->_hydrateManualEntry($this->card, $xml)); - } else if ($this->trackData != null) { - $cardData->appendChild($this->service->_hydrateTrackData($this->trackData, $xml)); - } else if ($this->token != null) { - $cardData->appendChild($this->service->_hydrateTokenData($this->token, $xml)); - } - $hpsBlock1->appendChild($cardData); - - if ($this->cardHolder != null) { - $hpsBlock1->appendChild($this->service->_hydrateCardHolderData($this->cardHolder, $xml)); - } - - $hpsCreditAuth->appendChild($hpsBlock1); - $hpsTransaction->appendChild($hpsCreditAuth); - - return $this->service->_submitTransaction($hpsTransaction, 'PrePaidBalanceInquiry'); - } - - /** - * Setups up validations for building balance inquiries. - * - * @return null - */ - private function setUpValidations() - { - $this - ->addValidation(array($this, 'onlyOnePaymentMethod'), 'HpsArgumentException', 'Balance Inquiry can only use one payment method'); - } - - /** - * Ensures there is only one payment method, and checks that - * there is only one card or one token in use. Both cannot be - * used. - * - * @param array $actionCounts - * - * @return bool - */ - public function onlyOnePaymentMethod($actionCounts) - { - $methods = 0; - if (isset($actionCounts['card']) && $actionCounts['card'] == 1) { - $methods++; - } - if (isset($actionCounts['token']) && $actionCounts['token'] == 1) { - $methods++; - } - if (isset($actionCounts['trackData']) && $actionCounts['trackData'] == 1) { - $methods++; - } - return $methods == 1; - } -} diff --git a/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceRecurringBuilder.php b/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceRecurringBuilder.php deleted file mode 100644 index 517c1dd..0000000 --- a/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceRecurringBuilder.php +++ /dev/null @@ -1,160 +0,0 @@ -setUpValidations(); - } - - /** - * Creates a recurring billing transaction through the HpsCreditService - */ - public function execute() - { - parent::execute(); - - HpsInputValidation::checkAmount($this->amount); - - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsRecurringBilling = $xml->createElement('hps:RecurringBilling'); - $hpsBlock1 = $xml->createElement('hps:Block1'); - - $hpsBlock1->appendChild($xml->createElement('hps:AllowDup', 'Y')); - $hpsBlock1->appendChild($xml->createElement('hps:Amt', $this->amount)); - if ($this->cardHolder != null) { - $hpsBlock1->appendChild($this->service->_hydrateCardHolderData($this->cardHolder, $xml)); - } - if ($this->details != null) { - $hpsBlock1->appendChild($this->service->_hydrateAdditionalTxnFields($this->details, $xml)); - } - - if ($this->card != null) { - $cardData = $xml->createElement('hps:CardData'); - $cardData->appendChild($this->service->_hydrateManualEntry($this->card, $xml)); - $hpsBlock1->appendChild($cardData); - } else if ($this->token != null) { - $cardData = $xml->createElement('hps:CardData'); - $cardData->appendChild($this->service->_hydrateTokenData($this->token, $xml)); - $hpsBlock1->appendChild($cardData); - } else if ($this->paymentMethodKey != null) { - $hpsBlock1->appendChild($xml->createElement('hps:PaymentMethodKey', $this->paymentMethodKey)); - } - - $recurringData = $xml->createElement('hps:RecurringData'); - if ($this->schedule != null) { - $id = $this->schedule; - if ($this->schedule instanceof HpsPayPlanSchedule) { - $id = $this->schedule->scheduleIdentifier; - } - $recurringData->appendChild($xml->createElement('hps:ScheduleID', $id)); - } - $recurringData->appendChild($xml->createElement('hps:OneTime', ($this->oneTime ? 'Y' : 'N'))); - - $hpsBlock1->appendChild($recurringData); - $hpsRecurringBilling->appendChild($hpsBlock1); - $hpsTransaction->appendChild($hpsRecurringBilling); - - return $this->service->_submitTransaction($hpsTransaction, 'RecurringBilling', (isset($this->details->clientTransactionId) ? $this->details->clientTransactionId : null)); - } - - /** - * Setups up validations for building recurring billings. - * - * @return null - */ - private function setUpValidations() - { - $this - ->addValidation(array($this, 'onlyOnePaymentMethod'), 'HpsArgumentException', 'Recurring Billing can only use one payment method') - ->addValidation(array($this, 'amountNotNull'), 'HpsArgumentException', 'Recurring Billing needs an amount'); - } - - /** - * Ensures there is only one payment method, and checks that - * there is only one card or one token in use. Both cannot be - * used. - * - * @param array $actionCounts - * - * @return bool - */ - public function onlyOnePaymentMethod($actionCounts) - { - $methods = 0; - - if (isset($actionCounts['card']) && $actionCounts['card'] == 1) { - $methods++; - } - - if (isset($actionCounts['token']) && $actionCounts['token'] == 1) { - $methods++; - } - - if (isset($actionCounts['paymentMethodKey']) && $actionCounts['paymentMethodKey'] == 1) { - $methods++; - } - - return $methods == 1; - } - - /** - * Ensures an amount has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function amountNotNull($actionCounts) - { - return isset($actionCounts['amount']); - } -} diff --git a/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceRefundBuilder.php b/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceRefundBuilder.php deleted file mode 100644 index 9722388..0000000 --- a/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceRefundBuilder.php +++ /dev/null @@ -1,171 +0,0 @@ -setUpValidations(); - } - - /** - * Creates a refund transaction through the HpsCreditService - */ - public function execute() - { - parent::execute(); - - HpsInputValidation::checkCurrency($this->currency); - HpsInputValidation::checkAmount($this->amount); - - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsCreditReturn = $xml->createElement('hps:CreditReturn'); - $hpsBlock1 = $xml->createElement('hps:Block1'); - - $hpsBlock1->appendChild($xml->createElement('hps:AllowDup', ($this->allowDuplicates ? 'Y' : 'N'))); - $hpsBlock1->appendChild($xml->createElement('hps:Amt', $this->amount)); - - if ($this->cardHolder != null) { - $hpsBlock1->appendChild($this->service->_hydrateCardHolderData($this->cardHolder, $xml)); - } - - if ($this->card != null) { - $cardData = $xml->createElement('hps:CardData'); - $cardData->appendChild($this->service->_hydrateManualEntry( - $this->card, - $xml - )); - $hpsBlock1->appendChild($cardData); - } else if ($this->token != null) { - $cardData = $xml->createElement('hps:CardData'); - $cardData->appendChild($this->service->_hydrateTokenData( - $this->token, - $xml - )); - $hpsBlock1->appendChild($cardData); - } else { - $hpsBlock1->appendChild($xml->createElement('hps:GatewayTxnId', $this->transactionId)); - } - - if ($this->details != null) { - $hpsBlock1->appendChild($this->service->_hydrateAdditionalTxnFields($this->details, $xml)); - } - - $hpsCreditReturn->appendChild($hpsBlock1); - $hpsTransaction->appendChild($hpsCreditReturn); - - return $this->service->_submitTransaction($hpsTransaction, 'CreditReturn', (isset($this->details->clientTransactionId) ? $this->details->clientTransationId : null)); - } - - /** - * Setups up validations for building refunds. - * - * @return null - */ - private function setUpValidations() - { - $this - ->addValidation(array($this, 'onlyOnePaymentMethod'), 'HpsArgumentException', 'Refund can only use one payment method') - ->addValidation(array($this, 'amountNotNull'), 'HpsArgumentException', 'Refund needs an amount') - ->addValidation(array($this, 'currencyNotNull'), 'HpsArgumentException', 'Refund needs an currency'); - } - - /** - * Ensures there is only one payment method, and checks that - * there is only one card, one token, or one transactionId - * in use. - * - * @param array $actionCounts - * - * @return bool - */ - public function onlyOnePaymentMethod($actionCounts) - { - return (isset($actionCounts['card']) && $actionCounts['card'] == 1 - && (!isset($actionCounts['token']) - || isset($actionCounts['token']) && $actionCounts['token'] == 0) - && (!isset($actionCounts['transactionId']) - || isset($actionCounts['transactionId']) == 0)) - || (isset($actionCounts['token']) && $actionCounts['token'] == 1 - && (!isset($actionCounts['card']) - || isset($actionCounts['card']) && $actionCounts['card'] == 0) - && (!isset($actionCounts['transactionId']) - || isset($actionCounts['transactionId']) == 0)) - || (isset($actionCounts['transactionId']) && $actionCounts['transactionId'] == 1 - && (!isset($actionCounts['card']) - || isset($actionCounts['card']) && $actionCounts['card'] == 0) - && (!isset($actionCounts['token']) - || isset($actionCounts['token']) == 0)); - } - - /** - * Ensures an amount has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function amountNotNull($actionCounts) - { - return isset($actionCounts['amount']); - } - - /** - * Ensures a currency has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function currencyNotNull($actionCounts) - { - return isset($actionCounts['currency']); - } -} diff --git a/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceReverseBuilder.php b/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceReverseBuilder.php deleted file mode 100644 index b9271a2..0000000 --- a/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceReverseBuilder.php +++ /dev/null @@ -1,162 +0,0 @@ -setUpValidations(); - } - - /** - * Creates a reverse transaction through the HpsCreditService - */ - public function execute() - { - parent::execute(); - - HpsInputValidation::checkCurrency($this->currency); - HpsInputValidation::checkAmount($this->amount); - - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsCreditReversal = $xml->createElement('hps:CreditReversal'); - $hpsBlock1 = $xml->createElement('hps:Block1'); - - $hpsBlock1->appendChild($xml->createElement('hps:Amt', $this->amount)); - - if ($this->authAmount != null) { - $hpsBlock1->appendChild($xml->createElement('hps:AuthAmt', $this->authAmount)); - } - - if ($this->card != null) { - $cardData = $xml->createElement('hps:CardData'); - $cardData->appendChild($this->service->_hydrateManualEntry( - $this->card, - $xml - )); - $hpsBlock1->appendChild($cardData); - } else if ($this->token != null) { - $cardData = $xml->createElement('hps:CardData'); - $cardData->appendChild($this->service->_hydrateTokenData( - $this->token, - $xml - )); - $hpsBlock1->appendChild($cardData); - } else { - $hpsBlock1->appendChild($xml->createElement('hps:GatewayTxnId', $this->transactionId)); - } - - if ($this->details != null) { - $hpsBlock1->appendChild($this->service->_hydrateAdditionalTxnFields($this->details, $xml)); - } - - $hpsCreditReversal->appendChild($hpsBlock1); - $hpsTransaction->appendChild($hpsCreditReversal); - - return $this->service->_submitTransaction($hpsTransaction, 'CreditReversal', (isset($this->details->clientTransactionId) ? $this->details->clientTransationId : null)); - } - - /** - * Setups up validations for building reverses. - * - * @return null - */ - private function setUpValidations() - { - $this - ->addValidation(array($this, 'onlyOnePaymentMethod'), 'HpsArgumentException', 'Reverse can only use one payment method') - ->addValidation(array($this, 'amountNotNull'), 'HpsArgumentException', 'Reverse needs an amount') - ->addValidation(array($this, 'currencyNotNull'), 'HpsArgumentException', 'Reverse needs an currency'); - } - - /** - * Ensures there is only one payment method, and checks that - * there is only one card, one token, or one transactionId - * in use. - * - * @param array $actionCounts - * - * @return bool - */ - public function onlyOnePaymentMethod($actionCounts) - { - return (isset($actionCounts['card']) && $actionCounts['card'] == 1 - && (!isset($actionCounts['token']) - || isset($actionCounts['token']) && $actionCounts['token'] == 0) - && (!isset($actionCounts['transactionId']) - || isset($actionCounts['transactionId']) == 0)) - || (isset($actionCounts['token']) && $actionCounts['token'] == 1 - && (!isset($actionCounts['card']) - || isset($actionCounts['card']) && $actionCounts['card'] == 0) - && (!isset($actionCounts['transactionId']) - || isset($actionCounts['transactionId']) == 0)) - || (isset($actionCounts['transactionId']) && $actionCounts['transactionId'] == 1 - && (!isset($actionCounts['card']) - || isset($actionCounts['card']) && $actionCounts['card'] == 0) - && (!isset($actionCounts['token']) - || isset($actionCounts['token']) == 0)); - } - - /** - * Ensures an amount has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function amountNotNull($actionCounts) - { - return isset($actionCounts['amount']); - } - - /** - * Ensures a currency has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function currencyNotNull($actionCounts) - { - return isset($actionCounts['currency']); - } -} diff --git a/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceUpdateTokenExpirationBuilder.php b/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceUpdateTokenExpirationBuilder.php deleted file mode 100644 index ebed1e8..0000000 --- a/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceUpdateTokenExpirationBuilder.php +++ /dev/null @@ -1,100 +0,0 @@ -setUpValidations(); - } - - /** - * Creates an edit transaction through the HpsCreditService - */ - public function execute() - { - parent::execute(); - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsManageTokens = $xml->createElement('hps:ManageTokens'); - - $hpsManageTokens->appendChild($xml->createElement('hps:TokenValue', trim((string)$this->token))); - - $hpsTokenActions = $xml->createElement('hps:TokenActions'); - $hpsSet = $xml->createElement('hps:Set'); - $hpsAttribute = $xml->createElement('hps:Attribute'); - - $hpsAttribute->appendChild($xml->createElement('hps:Name', 'ExpMonth')); - $hpsAttribute->appendChild($xml->createElement('hps:Value', (string)sprintf("%'.02d", (int)$this->expMonth))); - - $hpsSet->appendChild($hpsAttribute); - - $hpsAttribute = $xml->createElement('hps:Attribute'); - - $hpsAttribute->appendChild($xml->createElement('hps:Name', 'ExpYear')); - $hpsAttribute->appendChild($xml->createElement('hps:Value', (string)$this->expYear)); - - $hpsSet->appendChild($hpsAttribute); - - $hpsTokenActions->appendChild($hpsSet); - - $hpsManageTokens->appendChild($hpsTokenActions); - - $hpsTransaction->appendChild($hpsManageTokens); - $trans = $this->service->_submitTransaction($hpsTransaction, 'ManageTokens', null); - - $trans->responseCode = '00'; - $trans->responseText = ''; - - return $trans; - } - - /** - * Setups up validations for building edits. - * - * @return null - */ - private function setUpValidations() - { - $this - ->addValidation(array($this, 'tokenNotNull'), 'HpsArgumentException', 'Edit needs a multi use token value'); - } - - /** - * Ensures a token has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function tokenNotNull($actionCounts) - { - return isset($actionCounts['token']); - } -} \ No newline at end of file diff --git a/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceVerifyBuilder.php b/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceVerifyBuilder.php deleted file mode 100644 index 677578e..0000000 --- a/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceVerifyBuilder.php +++ /dev/null @@ -1,136 +0,0 @@ -setUpValidations(); - } - - /** - * Creates a verify transaction through the HpsCreditService - */ - public function execute() - { - parent::execute(); - - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsCreditAccountVerify = $xml->createElement('hps:CreditAccountVerify'); - $hpsBlock1 = $xml->createElement('hps:Block1'); - - if ($this->cardHolder != null) { - $hpsBlock1->appendChild($this->service->_hydrateCardHolderData($this->cardHolder, $xml)); - } - - $cardData = $xml->createElement('hps:CardData'); - if ($this->card != null) { - $cardData->appendChild($this->service->_hydrateManualEntry( - $this->card, - $xml, - $this->cardPresent, - $this->readerPresent - )); - if ($this->card->encryptionData != null) { - $cardData->appendChild($this->service->_hydrateEncryptionData( - $this->card->encryptionData, - $xml - )); - } - } else if ($this->token != null) { - $cardData->appendChild($this->service->_hydrateTokenData( - $this->token, - $xml, - $this->cardPresent, - $this->readerPresent - )); - } else if ($this->trackData != null) { - $cardData->appendChild($this->service->_hydrateTrackData($this->trackData, $xml)); - if ($this->trackData->encryptionData != null) { - $cardData->appendChild($this->service->_hydrateEncryptionData( - $this->trackData->encryptionData, - $xml - )); - } - } - $cardData->appendChild($xml->createElement('hps:TokenRequest', ($this->requestMultiUseToken) ? 'Y' : 'N')); - - $hpsBlock1->appendChild($cardData); - $hpsCreditAccountVerify->appendChild($hpsBlock1); - $hpsTransaction->appendChild($hpsCreditAccountVerify); - - return $this->service->_submitTransaction($hpsTransaction, 'CreditAccountVerify', $this->clientTransactionId); - } - - /** - * Setups up validations for building verifys. - * - * @return null - */ - private function setUpValidations() - { - $this - ->addValidation(array($this, 'onlyOnePaymentMethod'), 'HpsArgumentException', 'Verify can only use one payment method'); - } - - /** - * Ensures there is only one payment method, and checks that - * there is only one card or one token in use. Both cannot be - * used. - * - * @param array $actionCounts - * - * @return bool - */ - public function onlyOnePaymentMethod($actionCounts) - { - $count = 0; - if (isset($actionCounts['card'])) { $count++; } - if (isset($actionCounts['token'])) { $count++; } - if (isset($actionCounts['trackData'])) { $count++; } - return 1 === $count; - } -} diff --git a/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceVoidBuilder.php b/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceVoidBuilder.php deleted file mode 100644 index 82e0e52..0000000 --- a/classes/includes/src/Services/Fluent/Gateway/Credit/HpsCreditServiceVoidBuilder.php +++ /dev/null @@ -1,67 +0,0 @@ -setUpValidations(); - } - - /** - * Creates a void transaction through the HpsCreditService - */ - public function execute() - { - parent::execute(); - - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsCreditVoid = $xml->createElement('hps:CreditVoid'); - $hpsCreditVoid->appendChild($xml->createElement('hps:GatewayTxnId', $this->transactionId)); - $hpsTransaction->appendChild($hpsCreditVoid); - - return $this->service->_submitTransaction($hpsTransaction, 'CreditVoid', $this->clientTransactionId); - } - - /** - * Setups up validations for building edits. - * - * @return null - */ - private function setUpValidations() - { - $this - ->addValidation(array($this, 'transactionIdNotNull'), 'HpsArgumentException', 'Void needs a transactionId'); - } - - /** - * Ensures a transactionId has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function transactionIdNotNull($actionCounts) - { - return isset($actionCounts['transactionId']); - } -} diff --git a/classes/includes/src/Services/Fluent/Gateway/Debit/HpsDebitServiceAddValueBuilder.php b/classes/includes/src/Services/Fluent/Gateway/Debit/HpsDebitServiceAddValueBuilder.php deleted file mode 100644 index 50c29a2..0000000 --- a/classes/includes/src/Services/Fluent/Gateway/Debit/HpsDebitServiceAddValueBuilder.php +++ /dev/null @@ -1,139 +0,0 @@ -setUpValidations(); - } - - /** - * Creates a addValue transaction through the HpsDebitService - */ - public function execute() - { - parent::execute(); - - $addValueSvc = new HpsDebitService($this->service->servicesConfig()); - return $addValueSvc->addValue( - $this->amount, - $this->currency, - $this->trackData, - $this->pinBlock, - $this->encryptionData, - $this->allowDuplicates, - $this->cardHolder, - $this->details, - $this->clientTransactionId - ); - } - - /** - * Setups up validations for building addValues. - * - * @return null - */ - private function setUpValidations() - { - $this - ->addValidation(array($this, 'amountNotNull'), 'HpsArgumentException', 'AddValue needs an amount') - ->addValidation(array($this, 'currencyNotNull'), 'HpsArgumentException', 'AddValue needs an currency') - ->addValidation(array($this, 'trackDataNotNull'), 'HpsArgumentException', 'AddValue needs an trackData') - ->addValidation(array($this, 'pinBlockNotNull'), 'HpsArgumentException', 'AddValue needs an pinBlock'); - } - - /** - * Ensures an amount has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function amountNotNull($actionCounts) - { - return isset($actionCounts['amount']); - } - - /** - * Ensures a currency has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function currencyNotNull($actionCounts) - { - return isset($actionCounts['currency']); - } - - /** - * Ensures a trackData has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function trackDataNotNull($actionCounts) - { - return isset($actionCounts['trackData']); - } - - /** - * Ensures a pinBlock has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function pinBlockNotNull($actionCounts) - { - return isset($actionCounts['pinBlock']); - } -} diff --git a/classes/includes/src/Services/Fluent/Gateway/Debit/HpsDebitServiceChargeBuilder.php b/classes/includes/src/Services/Fluent/Gateway/Debit/HpsDebitServiceChargeBuilder.php deleted file mode 100644 index 1c59892..0000000 --- a/classes/includes/src/Services/Fluent/Gateway/Debit/HpsDebitServiceChargeBuilder.php +++ /dev/null @@ -1,149 +0,0 @@ -setUpValidations(); - } - - /** - * Creates a charge transaction through the HpsDebitService - */ - public function execute() - { - parent::execute(); - - $chargeSvc = new HpsDebitService($this->service->servicesConfig()); - return $chargeSvc->charge( - $this->amount, - $this->currency, - $this->trackData, - $this->pinBlock, - $this->encryptionData, - $this->allowDuplicates, - $this->cashBackAmount, - $this->allowPartialAuth, - $this->cardHolder, - $this->details, - $this->clientTransactionId - ); - } - - /** - * Setups up validations for building charges. - * - * @return null - */ - private function setUpValidations() - { - $this - ->addValidation(array($this, 'amountNotNull'), 'HpsArgumentException', 'Charge needs an amount') - ->addValidation(array($this, 'currencyNotNull'), 'HpsArgumentException', 'Charge needs an currency') - ->addValidation(array($this, 'trackDataNotNull'), 'HpsArgumentException', 'Charge needs an trackData') - ->addValidation(array($this, 'pinBlockNotNull'), 'HpsArgumentException', 'Charge needs an pinBlock'); - } - - /** - * Ensures an amount has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function amountNotNull($actionCounts) - { - return isset($actionCounts['amount']); - } - - /** - * Ensures a currency has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function currencyNotNull($actionCounts) - { - return isset($actionCounts['currency']); - } - - /** - * Ensures a trackData has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function trackDataNotNull($actionCounts) - { - return isset($actionCounts['trackData']); - } - - /** - * Ensures a pinBlock has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function pinBlockNotNull($actionCounts) - { - return isset($actionCounts['pinBlock']); - } -} diff --git a/classes/includes/src/Services/Fluent/Gateway/Debit/HpsDebitServiceReturnBuilder.php b/classes/includes/src/Services/Fluent/Gateway/Debit/HpsDebitServiceReturnBuilder.php deleted file mode 100644 index 17a794d..0000000 --- a/classes/includes/src/Services/Fluent/Gateway/Debit/HpsDebitServiceReturnBuilder.php +++ /dev/null @@ -1,139 +0,0 @@ -setUpValidations(); - } - - /** - * Creates a return transaction through the HpsDebitService - */ - public function execute() - { - parent::execute(); - - $returnSvc = new HpsDebitService($this->service->servicesConfig()); - return $returnSvc->returnDebit( - $this->transactionId, - $this->amount, - $this->trackData, - $this->pinBlock, - $this->allowDuplicates, - $this->cardHolder, - $this->encryptionData, - $this->details, - $this->clientTransactionId - ); - } - - /** - * Setups up validations for building returns. - * - * @return null - */ - private function setUpValidations() - { - $this - ->addValidation(array($this, 'transactionIdNotNull'), 'HpsArgumentException', 'Return needs an transactionId') - ->addValidation(array($this, 'amountNotNull'), 'HpsArgumentException', 'Return needs an amount') - ->addValidation(array($this, 'trackDataNotNull'), 'HpsArgumentException', 'Return needs an trackData') - ->addValidation(array($this, 'pinBlockNotNull'), 'HpsArgumentException', 'Return needs an pinBlock'); - } - - /** - * Ensures a transactionId has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function transactionIdNotNull($actionCounts) - { - return isset($actionCounts['transactionId']); - } - - /** - * Ensures an amount has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function amountNotNull($actionCounts) - { - return isset($actionCounts['amount']); - } - - /** - * Ensures a trackData has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function trackDataNotNull($actionCounts) - { - return isset($actionCounts['trackData']); - } - - /** - * Ensures a pinBlock has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function pinBlockNotNull($actionCounts) - { - return isset($actionCounts['pinBlock']); - } -} diff --git a/classes/includes/src/Services/Fluent/Gateway/Debit/HpsDebitServiceReverseBuilder.php b/classes/includes/src/Services/Fluent/Gateway/Debit/HpsDebitServiceReverseBuilder.php deleted file mode 100644 index c16a68c..0000000 --- a/classes/includes/src/Services/Fluent/Gateway/Debit/HpsDebitServiceReverseBuilder.php +++ /dev/null @@ -1,116 +0,0 @@ -setUpValidations(); - } - - /** - * Creates a reverse transaction through the HpsDebitService - */ - public function execute() - { - parent::execute(); - - $reverseSvc = new HpsDebitService($this->service->servicesConfig()); - return $reverseSvc->reverse( - $this->transactionId, - $this->amount, - $this->trackData, - $this->authorizedAmount, - $this->encryptionData, - $this->details, - $this->clientTransactionId - ); - } - - /** - * Setups up validations for building reverses. - * - * @return null - */ - private function setUpValidations() - { - $this - ->addValidation(array($this, 'transactionIdNotNull'), 'HpsArgumentException', 'Reverse needs an transactionId') - ->addValidation(array($this, 'amountNotNull'), 'HpsArgumentException', 'Reverse needs an amount') - ->addValidation(array($this, 'trackDataNotNull'), 'HpsArgumentException', 'Reverse needs an trackData'); - } - - /** - * Ensures a transactionId has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function transactionIdNotNull($actionCounts) - { - return isset($actionCounts['transactionId']); - } - - /** - * Ensures an amount has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function amountNotNull($actionCounts) - { - return isset($actionCounts['amount']); - } - - /** - * Ensures a trackData has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function trackDataNotNull($actionCounts) - { - return isset($actionCounts['trackData']); - } -} diff --git a/classes/includes/src/Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceActivateBuilder.php b/classes/includes/src/Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceActivateBuilder.php deleted file mode 100644 index a43458e..0000000 --- a/classes/includes/src/Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceActivateBuilder.php +++ /dev/null @@ -1,127 +0,0 @@ -setUpValidations(); - } - - /** - * Creates an activate transaction through the HpsGiftCardService - */ - public function execute() - { - parent::execute(); - - $activateSvc = new HpsGiftCardService($this->service->servicesConfig()); - if ($this->token != null && ($this->token instanceof HpsTokenData)) { - if ($this->card == null) { - $this->card = new HpsGiftCard(); - } - $this->card->tokenValue = $this->token->tokenValue; - } - return $activateSvc->activate( - $this->amount, - $this->currency, - $this->card - ); - } - - /** - * Setups up validations for building activates. - * - * @return null - */ - private function setUpValidations() - { - $this - ->addValidation(array($this, 'onlyOnePaymentMethod'), 'HpsArgumentException', 'Activate can only use one payment method') - ->addValidation(array($this, 'amountNotNull'), 'HpsArgumentException', 'Activate needs an amount') - ->addValidation(array($this, 'currencyNotNull'), 'HpsArgumentException', 'Activate needs a currency'); - } - - /** - * Ensures there is only one payment method, and checks that - * there is only one card or one token in use. Both cannot be - * used. - * - * @param array $actionCounts - * - * @return bool - */ - public function onlyOnePaymentMethod($actionCounts) - { - $methods = 0; - if (isset($actionCounts['card']) && $actionCounts['card'] == 1) { - $methods++; - } - if (isset($actionCounts['token']) && $actionCounts['token'] == 1) { - $methods++; - } - return $methods == 1; - } - - /** - * Ensures a card has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function cardNotNull($actionCounts) - { - return isset($actionCounts['card']); - } - - /** - * Ensures an amount has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function amountNotNull($actionCounts) - { - return isset($actionCounts['amount']); - } - - /** - * Ensures a currency has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function currencyNotNull($actionCounts) - { - return isset($actionCounts['currency']); - } -} diff --git a/classes/includes/src/Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceAddValueBuilder.php b/classes/includes/src/Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceAddValueBuilder.php deleted file mode 100644 index 073751c..0000000 --- a/classes/includes/src/Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceAddValueBuilder.php +++ /dev/null @@ -1,127 +0,0 @@ -setUpValidations(); - } - - /** - * Creates an addValue transaction through the HpsGiftCardService - */ - public function execute() - { - parent::execute(); - - $addValueSvc = new HpsGiftCardService($this->service->servicesConfig()); - if ($this->token != null && ($this->token instanceof HpsTokenData)) { - if ($this->card == null) { - $this->card = new HpsGiftCard(); - } - $this->card->tokenValue = $this->token->tokenValue; - } - return $addValueSvc->addValue( - $this->amount, - $this->currency, - $this->card - ); - } - - /** - * Setups up validations for building addValues. - * - * @return null - */ - private function setUpValidations() - { - $this - ->addValidation(array($this, 'onlyOnePaymentMethod'), 'HpsArgumentException', 'AddValue can only use one payment method') - ->addValidation(array($this, 'amountNotNull'), 'HpsArgumentException', 'AddValue needs an amount') - ->addValidation(array($this, 'currencyNotNull'), 'HpsArgumentException', 'AddValue needs a currency'); - } - - /** - * Ensures there is only one payment method, and checks that - * there is only one card or one token in use. Both cannot be - * used. - * - * @param array $actionCounts - * - * @return bool - */ - public function onlyOnePaymentMethod($actionCounts) - { - $methods = 0; - if (isset($actionCounts['card']) && $actionCounts['card'] == 1) { - $methods++; - } - if (isset($actionCounts['token']) && $actionCounts['token'] == 1) { - $methods++; - } - return $methods == 1; - } - - /** - * Ensures a card has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function cardNotNull($actionCounts) - { - return isset($actionCounts['card']); - } - - /** - * Ensures an amount has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function amountNotNull($actionCounts) - { - return isset($actionCounts['amount']); - } - - /** - * Ensures a currency has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function currencyNotNull($actionCounts) - { - return isset($actionCounts['currency']); - } -} diff --git a/classes/includes/src/Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceAliasBuilder.php b/classes/includes/src/Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceAliasBuilder.php deleted file mode 100644 index c665ed2..0000000 --- a/classes/includes/src/Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceAliasBuilder.php +++ /dev/null @@ -1,140 +0,0 @@ -setUpValidations(); - } - - /** - * Creates an alias transaction through the HpsGiftCardService - */ - public function execute() - { - parent::execute(); - - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsGiftAlias = $xml->createElement('hps:GiftCardAlias'); - $hpsBlock1 = $xml->createElement('hps:Block1'); - - $hpsBlock1->appendChild($xml->createElement('hps:Action', $this->action)); - $hpsBlock1->appendChild($xml->createElement('hps:Alias', $this->alias)); - - if ($this->token != null && ($this->token instanceof HpsTokenData)) { - if ($this->card == null) { - $this->card = new HpsGiftCard(); - } - $this->card->tokenValue = $this->token->tokenValue; - } - $cardData = $this->service->_hydrateGiftCardData($this->card, $xml); - $hpsBlock1->appendChild($cardData); - - $hpsGiftAlias->appendChild($hpsBlock1); - $hpsTransaction->appendChild($hpsGiftAlias); - - return $this->service->_submitTransaction($hpsTransaction, 'GiftCardAlias'); - } - - /** - * Setups up validations for building aliases. - * - * @return null - */ - private function setUpValidations() - { - $this - ->addValidation(array($this, 'onlyOnePaymentMethod'), 'HpsArgumentException', 'Alias can only use one payment method') - ->addValidation(array($this, 'aliasNotNull'), 'HpsArgumentException', 'Alias needs an alias') - ->addValidation(array($this, 'actionNotNull'), 'HpsArgumentException', 'Alias needs an action'); - } - - /** - * Ensures there is only one payment method, and checks that - * there is only one card or one token in use. Both cannot be - * used. - * - * @param array $actionCounts - * - * @return bool - */ - public function onlyOnePaymentMethod($actionCounts) - { - $methods = 0; - if (isset($actionCounts['card']) && $actionCounts['card'] == 1) { - $methods++; - } - if (isset($actionCounts['token']) && $actionCounts['token'] == 1) { - $methods++; - } - return $methods == 1; - } - - /** - * Ensures a card has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function cardNotNull($actionCounts) - { - if ($this->action == 'CREATE') { - return $this->card == null; - } - - return isset($actionCounts['card']); - } - - /** - * Ensures an alias has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function aliasNotNull($actionCounts) - { - return isset($actionCounts['alias']); - } - - /** - * Ensures a action has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function actionNotNull($actionCounts) - { - return isset($actionCounts['action']); - } -} diff --git a/classes/includes/src/Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceBalanceBuilder.php b/classes/includes/src/Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceBalanceBuilder.php deleted file mode 100644 index 1a860de..0000000 --- a/classes/includes/src/Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceBalanceBuilder.php +++ /dev/null @@ -1,91 +0,0 @@ -setUpValidations(); - } - - /** - * Creates a balance transaction through the HpsGiftCardService - */ - public function execute() - { - parent::execute(); - - $balanceSvc = new HpsGiftCardService($this->service->servicesConfig()); - if ($this->token != null && ($this->token instanceof HpsTokenData)) { - if ($this->card == null) { - $this->card = new HpsGiftCard(); - } - $this->card->tokenValue = $this->token->tokenValue; - } - return $balanceSvc->balance( - $this->card - ); - } - - /** - * Setups up validations for building balances. - * - * @return null - */ - private function setUpValidations() - { - $this - ->addValidation(array($this, 'onlyOnePaymentMethod'), 'HpsArgumentException', 'Balance can only use one payment method'); - } - - /** - * Ensures there is only one payment method, and checks that - * there is only one card or one token in use. Both cannot be - * used. - * - * @param array $actionCounts - * - * @return bool - */ - public function onlyOnePaymentMethod($actionCounts) - { - $methods = 0; - if (isset($actionCounts['card']) && $actionCounts['card'] == 1) { - $methods++; - } - if (isset($actionCounts['token']) && $actionCounts['token'] == 1) { - $methods++; - } - return $methods == 1; - } - - /** - * Ensures a card has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function cardNotNull($actionCounts) - { - return isset($actionCounts['card']); - } -} diff --git a/classes/includes/src/Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceDeactivateBuilder.php b/classes/includes/src/Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceDeactivateBuilder.php deleted file mode 100644 index 559373c..0000000 --- a/classes/includes/src/Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceDeactivateBuilder.php +++ /dev/null @@ -1,91 +0,0 @@ -setUpValidations(); - } - - /** - * Creates a deactivate transaction through the HpsGiftCardService - */ - public function execute() - { - parent::execute(); - - $deactivateSvc = new HpsGiftCardService($this->service->servicesConfig()); - if ($this->token != null && ($this->token instanceof HpsTokenData)) { - if ($this->card == null) { - $this->card = new HpsGiftCard(); - } - $this->card->tokenValue = $this->token->tokenValue; - } - return $deactivateSvc->deactivate( - $this->card - ); - } - - /** - * Setups up validations for building deactivates. - * - * @return null - */ - private function setUpValidations() - { - $this - ->addValidation(array($this, 'onlyOnePaymentMethod'), 'HpsArgumentException', 'Deactivate can only use one payment method'); - } - - /** - * Ensures there is only one payment method, and checks that - * there is only one card or one token in use. Both cannot be - * used. - * - * @param array $actionCounts - * - * @return bool - */ - public function onlyOnePaymentMethod($actionCounts) - { - $methods = 0; - if (isset($actionCounts['card']) && $actionCounts['card'] == 1) { - $methods++; - } - if (isset($actionCounts['token']) && $actionCounts['token'] == 1) { - $methods++; - } - return $methods == 1; - } - - /** - * Ensures a card has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function cardNotNull($actionCounts) - { - return isset($actionCounts['card']); - } -} diff --git a/classes/includes/src/Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceReplaceBuilder.php b/classes/includes/src/Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceReplaceBuilder.php deleted file mode 100644 index 26a0310..0000000 --- a/classes/includes/src/Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceReplaceBuilder.php +++ /dev/null @@ -1,78 +0,0 @@ -setUpValidations(); - } - - /** - * Creates a replace transaction through the HpsGiftCardService - */ - public function execute() - { - parent::execute(); - - $replaceSvc = new HpsGiftCardService($this->service->servicesConfig()); - return $replaceSvc->replace( - $this->oldCard, - $this->newCard - ); - } - - /** - * Setups up validations for building replaces. - * - * @return null - */ - private function setUpValidations() - { - $this - ->addValidation(array($this, 'oldCardNotNull'), 'HpsArgumentException', 'Replace needs an oldCard') - ->addValidation(array($this, 'newCardNotNull'), 'HpsArgumentException', 'Replace needs a newCard'); - } - - /** - * Ensures an oldCard has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function oldCardNotNull($actionCounts) - { - return isset($actionCounts['oldCard']); - } - - /** - * Ensures a newCard has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function newCardNotNull($actionCounts) - { - return isset($actionCounts['newCard']); - } -} diff --git a/classes/includes/src/Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceReverseBuilder.php b/classes/includes/src/Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceReverseBuilder.php deleted file mode 100644 index 2e22756..0000000 --- a/classes/includes/src/Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceReverseBuilder.php +++ /dev/null @@ -1,102 +0,0 @@ -setUpValidations(); - } - - /** - * Creates a reverse transaction through the HpsGiftCardService - */ - public function execute() - { - parent::execute(); - - $reverseSvc = new HpsGiftCardService($this->service->servicesConfig()); - if ($this->token != null && ($this->token instanceof HpsTokenData)) { - if ($this->card == null) { - $this->card = new HpsGiftCard(); - } - $this->card->tokenValue = $this->token->tokenValue; - } - return $reverseSvc->reverse( - isset($this->card) ? $this->card : $this->transactionId, - $this->amount, - $this->currency - ); - } - - /** - * Setups up validations for building reverses. - * - * @return null - */ - private function setUpValidations() - { - $this - ->addValidation(array($this, 'cardOrTransactionId'), 'HpsArgumentException', 'Reverse can only use one payment method or a transactionId') - ->addValidation(array($this, 'amountNotNull'), 'HpsArgumentException', 'Reverse needs an amount'); - } - - /** - * Ensures a card has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function cardOrTransactionId($actionCounts) - { - return (isset($actionCounts['card']) && $actionCounts['card'] == 1 - && (!isset($actionCounts['transactionId']) - || isset($actionCounts['transactionId']) && $actionCounts['transactionId'] == 0)) - || (isset($actionCounts['transactionId']) && $actionCounts['transactionId'] == 1 - && (!isset($actionCounts['card']) - || isset($actionCounts['card']) && $actionCounts['card'] == 0)); - } - - /** - * Ensures an amount has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function amountNotNull($actionCounts) - { - return isset($actionCounts['amount']); - } -} diff --git a/classes/includes/src/Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceRewardBuilder.php b/classes/includes/src/Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceRewardBuilder.php deleted file mode 100644 index 84dd289..0000000 --- a/classes/includes/src/Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceRewardBuilder.php +++ /dev/null @@ -1,124 +0,0 @@ -setUpValidations(); - } - - /** - * Creates a reward transaction through the HpsGiftCardService - */ - public function execute() - { - parent::execute(); - - $rewardSvc = new HpsGiftCardService($this->service->servicesConfig()); - if ($this->token != null && ($this->token instanceof HpsTokenData)) { - if ($this->card == null) { - $this->card = new HpsGiftCard(); - } - $this->card->tokenValue = $this->token->tokenValue; - } - return $rewardSvc->reward( - $this->card, - $this->amount, - $this->currency, - $this->gratuity, - $this->tax - ); - } - - /** - * Setups up validations for building rewards. - * - * @return null - */ - private function setUpValidations() - { - $this - ->addValidation(array($this, 'onlyOnePaymentMethod'), 'HpsArgumentException', 'Reward can only use one payment method') - ->addValidation(array($this, 'amountNotNull'), 'HpsArgumentException', 'Reward needs an amount'); - } - - /** - * Ensures there is only one payment method, and checks that - * there is only one card or one token in use. Both cannot be - * used. - * - * @param array $actionCounts - * - * @return bool - */ - public function onlyOnePaymentMethod($actionCounts) - { - $methods = 0; - if (isset($actionCounts['card']) && $actionCounts['card'] == 1) { - $methods++; - } - if (isset($actionCounts['token']) && $actionCounts['token'] == 1) { - $methods++; - } - return $methods == 1; - } - - /** - * Ensures a card has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function cardNotNull($actionCounts) - { - return isset($actionCounts['card']); - } - - /** - * Ensures an amount has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function amountNotNull($actionCounts) - { - return isset($actionCounts['amount']); - } -} diff --git a/classes/includes/src/Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceSaleBuilder.php b/classes/includes/src/Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceSaleBuilder.php deleted file mode 100644 index 9dad6d9..0000000 --- a/classes/includes/src/Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceSaleBuilder.php +++ /dev/null @@ -1,157 +0,0 @@ -setUpValidations(); - } - - /** - * Creates a sale transaction through the HpsGiftCardService - */ - public function execute() - { - parent::execute(); - - HpsInputValidation::checkAmount($this->amount); - $this->currency = strtolower($this->currency); - - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsGiftSale = $xml->createElement('hps:GiftCardSale'); - $hpsBlock1 = $xml->createElement('hps:Block1'); - - $hpsBlock1->appendChild($xml->createElement('hps:Amt', $this->amount)); - if ($this->token != null && ($this->token instanceof HpsTokenData)) { - if ($this->card == null) { - $this->card = new HpsGiftCard(); - } - $this->card->tokenValue = $this->token->tokenValue; - } - $cardData = $this->service->_hydrateGiftCardData($this->card, $xml); - $hpsBlock1->appendChild($cardData); - - if (in_array($this->currency, array('points', 'usd'))) { - $hpsBlock1->appendChild($xml->createElement('hps:Currency', strtoupper($this->currency))); - } - - if ($this->gratuity != null) { - $hpsBlock1->appendChild($xml->createElement('hps:GratuityAmtInfo', $this->gratuity)); - } - - if ($this->tax != null) { - $hpsBlock1->appendChild($xml->createElement('hps:TaxAmtInfo', $this->tax)); - } - - $hpsGiftSale->appendChild($hpsBlock1); - $hpsTransaction->appendChild($hpsGiftSale); - - return $this->service->_submitTransaction($hpsTransaction, 'GiftCardSale'); - } - - /** - * Setups up validations for building sales. - * - * @return null - */ - private function setUpValidations() - { - $this - ->addValidation(array($this, 'onlyOnePaymentMethod'), 'HpsArgumentException', 'Sale can only use one payment method') - ->addValidation(array($this, 'amountNotNull'), 'HpsArgumentException', 'Sale needs an amount') - ->addValidation(array($this, 'currencyNotNull'), 'HpsArgumentException', 'Sale needs a currency'); - } - - /** - * Ensures there is only one payment method, and checks that - * there is only one card or one token in use. Both cannot be - * used. - * - * @param array $actionCounts - * - * @return bool - */ - public function onlyOnePaymentMethod($actionCounts) - { - $methods = 0; - if (isset($actionCounts['card']) && $actionCounts['card'] == 1) { - $methods++; - } - if (isset($actionCounts['token']) && $actionCounts['token'] == 1) { - $methods++; - } - return $methods == 1; - } - - /** - * Ensures a card has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function cardNotNull($actionCounts) - { - return isset($actionCounts['card']); - } - - /** - * Ensures an amount has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function amountNotNull($actionCounts) - { - return isset($actionCounts['amount']); - } - - /** - * Ensures a currency has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function currencyNotNull($actionCounts) - { - return isset($actionCounts['currency']); - } -} diff --git a/classes/includes/src/Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceVoidBuilder.php b/classes/includes/src/Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceVoidBuilder.php deleted file mode 100644 index 8626097..0000000 --- a/classes/includes/src/Services/Fluent/Gateway/GiftCard/HpsGiftCardServiceVoidBuilder.php +++ /dev/null @@ -1,60 +0,0 @@ -setUpValidations(); - } - - /** - * Creates a void transaction through the HpsGiftCardService - */ - public function execute() - { - parent::execute(); - - $voidSvc = new HpsGiftCardService($this->service->servicesConfig()); - return $voidSvc->void( - $this->transactionId - ); - } - - /** - * Setups up validations for building voids. - * - * @return null - */ - private function setUpValidations() - { - $this - ->addValidation(array($this, 'transactionIdNotNull'), 'HpsArgumentException', 'Void needs a transactionId'); - } - - /** - * Ensures a transactionId has been set. - * - * @param array $actionCounts - * - * @return bool - */ - protected function transactionIdNotNull($actionCounts) - { - return isset($actionCounts['transactionId']); - } -} diff --git a/classes/includes/src/Services/Fluent/Gateway/HpsFluentCheckService.php b/classes/includes/src/Services/Fluent/Gateway/HpsFluentCheckService.php deleted file mode 100644 index eb6aa3f..0000000 --- a/classes/includes/src/Services/Fluent/Gateway/HpsFluentCheckService.php +++ /dev/null @@ -1,160 +0,0 @@ -_config = $config; - return $this; - } - /** - * @return \HpsCheckServiceOverrideBuilder - */ - public function override() - { - return new HpsCheckServiceOverrideBuilder($this); - } - /** - * @param null $amount - * - * @return \HpsCheckServiceRecurringBuilder - */ - public function recurring($amount = null) - { - $builder = new HpsCheckServiceRecurringBuilder($this); - return $builder->withAmount($amount); - } - /** - * @return \HpsCheckServiceReturnBuilder - */ - public function returnCheck() - { - return new HpsCheckServiceReturnBuilder($this); - } - /** - * @param null $amount - * - * @return \HpsCheckServiceSaleBuilder - */ - public function sale($amount = null) - { - $builder = new HpsCheckServiceSaleBuilder($this); - return $builder - ->withAmount($amount); - } - /** - * @return \HpsCheckServiceVoidBuilder - */ - public function void() - { - return new HpsCheckServiceVoidBuilder($this); - } - /** - * @param $action - * @param \HpsCheck $check - * @param $amount - * @param null $clientTransactionId - * @param bool $checkVerify - * @param bool $achVerify - * - * @return mixed - * @throws \HpsCheckException - * @throws \HpsInvalidRequestException - */ - public function _buildTransaction($action, HpsCheck $check, $amount, $clientTransactionId = null, $checkVerify = false, $achVerify = false) - { - if ($amount != null) { - HpsInputValidation::checkAmount($amount); - } - - if ($check->secCode == HpsSECCode::CCD && - ($check->checkHolder == null || $check->checkHolder->checkName == null)) { - throw new HpsInvalidRequestException( - HpsExceptionCodes::MISSING_CHECK_NAME, - 'For SEC code CCD, the check name is required', - 'check_name' - ); - } - - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsCheckSale = $xml->createElement('hps:CheckSale'); - $hpsBlock1 = $xml->createElement('hps:Block1'); - - $hpsBlock1->appendChild($xml->createElement('hps:Amt', sprintf("%0.2f", round($amount, 3)))); - $hpsBlock1->appendChild($this->_hydrateCheckData($check, $xml)); - $hpsBlock1->appendChild($xml->createElement('hps:CheckAction', $action)); - $hpsBlock1->appendChild($xml->createElement('hps:SECCode', $check->secCode)); - - if ($checkVerify || $achVerify) { - $verifyElement = $xml->createElement('hps:VerifyInfo'); - if ($checkVerify) { - $verifyElement->appendChild($xml->createElement('hps:CheckVerify', ($checkVerify ? 'Y' : 'N'))); - } - if ($achVerify) { - $verifyElement->appendChild($xml->createElement('hps:ACHVerify', ($achVerify ? 'Y' : 'N'))); - } - $hpsBlock1->appendChild($verifyElement); - } - - if ($check->checkType != null) { - $hpsBlock1->appendChild($xml->createElement('hps:CheckType', $check->checkType)); - } - if ($check->dataEntryMode != null) { - $hpsBlock1->appendChild($xml->createElement('hps:DataEntryMode', $check->dataEntryMode)); - } - if ($check->checkHolder != null) { - $hpsBlock1->appendChild($this->_hydrateConsumerInfo($check, $xml)); - } - - $hpsCheckSale->appendChild($hpsBlock1); - $hpsTransaction->appendChild($hpsCheckSale); - - return $this->_submitTransaction($hpsTransaction, 'CheckSale', $clientTransactionId); - } - /** - * @param $transaction - * @param $txnType - * @param null $clientTransactionId - * - * @return mixed - * @throws \HpsAuthenticationException - * @throws \HpsCheckException - * @throws \HpsGatewayException - * @throws null - */ - public function _submitTransaction($transaction, $txnType, $clientTransactionId = null) - { - $rsp = $this->doRequest($transaction, $clientTransactionId); - HpsGatewayResponseValidation::checkResponse($rsp, $txnType); - $response = HpsCheckResponse::fromDict($rsp, $txnType); - - if ($response->responseCode != 0) { - throw new HpsCheckException( - $rsp->Header->GatewayTxnId, - $response->details, - $response->responseCode, - $response->responseText - ); - } - - return $response; - } -} diff --git a/classes/includes/src/Services/Fluent/Gateway/HpsFluentCreditService.php b/classes/includes/src/Services/Fluent/Gateway/HpsFluentCreditService.php deleted file mode 100644 index 1f331ce..0000000 --- a/classes/includes/src/Services/Fluent/Gateway/HpsFluentCreditService.php +++ /dev/null @@ -1,365 +0,0 @@ -_config = $config; - return $this; - } - /** - * @param null $amount - * - * @return \HpsCreditServiceAuthorizeBuilder - */ - public function authorize($amount = null) - { - $builder = new HpsCreditServiceAuthorizeBuilder($this); - return $builder - ->withAmount($amount) - ->withCurrency('usd'); - } - /** - * @param null $transactionId - * - * @return \HpsCreditServiceCaptureBuilder - */ - public function capture($transactionId = null) - { - $builder = new HpsCreditServiceCaptureBuilder($this); - return $builder - ->withTransactionId($transactionId); - } - /** - * @param null $amount - * - * @return \HpsCreditServiceChargeBuilder - */ - public function charge($amount = null) - { - $builder = new HpsCreditServiceChargeBuilder($this); - return $builder - ->withAmount($amount) - ->withCurrency('usd'); - } - /** - * @param null $transactionId - * - * @return \HpsCreditServiceCpcEditBuilder - */ - public function cpcEdit($transactionId = null) - { - $builder = new HpsCreditServiceCpcEditBuilder($this); - return $builder - ->withTransactionId($transactionId); - } - /** - * @return \HpsCreditServiceEditBuilder - */ - public function edit() - { - return new HpsCreditServiceEditBuilder($this); - } - /** - * @return \HpsCreditServiceUpdateTokenExpirationBuilder - */ - public function updateTokenExpiration() - { - $builder = new HpsCreditServiceUpdateTokenExpirationBuilder($this); - //print_r($builder); - return $builder; - } - /** - * @param null $transactionId - * - * @return \HpsCreditServiceGetBuilder - */ - public function get($transactionId = null) - { - $builder = new HpsCreditServiceGetBuilder($this); - return $builder - ->withTransactionId($transactionId); - } - /** - * @return \HpsCreditServiceListTransactionsBuilder - */ - public function listTransactions() - { - return new HpsCreditServiceListTransactionsBuilder($this); - } - /** - * @param null $amount - * - * @return \HpsCreditServiceOfflineAuthBuilder - */ - public function offlineAuth($amount = null) - { - $builder = new HpsCreditServiceOfflineAuthBuilder($this); - return $builder - ->withAmount($amount) - ->withCurrency('usd'); - } - /** - * @param null $amount - * - * @return \HpsCreditServiceOfflineChargeBuilder - */ - public function offlineCharge($amount = null) - { - $builder = new HpsCreditServiceOfflineChargeBuilder($this); - return $builder - ->withAmount($amount) - ->withCurrency('usd'); - } - /** - * @return \HpsCreditServicePrepaidBalanceInquiryBuilder - */ - public function prepaidBalanceInquiry() - { - return new HpsCreditServicePrepaidBalanceInquiryBuilder($this); - } - /** - * @param null $amount - * - * @return \HpsCreditServicePrepaidAddValueBuilder - */ - public function prepaidAddValue($amount = null) - { - $builder = new HpsCreditServicePrepaidAddValueBuilder($this); - return $builder - ->withAmount($amount) - ->withCurrency('usd'); - } - /** - * @param null $amount - * - * @return \HpsCreditServiceRecurringBuilder - */ - public function recurring($amount = null) - { - $builder = new HpsCreditServiceRecurringBuilder($this); - return $builder->withAmount($amount); - } - /** - * @param null $amount - * - * @return \HpsCreditServiceRefundBuilder - */ - public function refund($amount = null) - { - $builder = new HpsCreditServiceRefundBuilder($this); - return $builder - ->withAmount($amount) - ->withCurrency('usd'); - } - /** - * @param null $amount - * - * @return \HpsCreditServiceReverseBuilder - */ - public function reverse($amount = null) - { - $builder = new HpsCreditServiceReverseBuilder($this); - return $builder - ->withAmount($amount) - ->withCurrency('usd'); - } - /** - * @return \HpsAccountVerify - */ - public function verify() - { - return new HpsCreditServiceVerifyBuilder($this); - } - /** - * @param null $transactionId - * - * @return \HpsCreditServiceVoidBuilder - */ - public function void($transactionId = null) - { - $builder = new HpsCreditServiceVoidBuilder($this); - return $builder - ->withTransactionId($transactionId); - } - /** - * @param $response - * @param $expectedType - * - * @throws \HpsAuthenticationException - * @throws \HpsGatewayException - * @throws null - */ - private function _processChargeGatewayResponse($response, $expectedType) - { - $gatewayRspCode = (isset($response->Header->GatewayRspCode) ? $response->Header->GatewayRspCode : null); - $transactionId = (isset($response->Header->GatewayTxnId) ? $response->Header->GatewayTxnId : null); - - if ($gatewayRspCode == '0') { - return; - } - - if ($gatewayRspCode == '30') { - try { - $this->reverse($this->_amount)->withTransactionId($transactionId)->execute(); - } catch (Exception $e) { - throw new HpsGatewayException( - HpsExceptionCodes::GATEWAY_TIMEOUT_REVERSAL_ERROR, - 'Error occurred while reversing a charge due to HPS gateway timeout', - $e - ); - } - } - - HpsGatewayResponseValidation::checkResponse($response, $expectedType); - } - /** - * @param $response - * @param $expectedType - * - * @throws \HpsCreditException - * @throws null - */ - private function _processChargeIssuerResponse($response, $expectedType) - { - $transactionId = (isset($response->Header->GatewayTxnId) ? $response->Header->GatewayTxnId : null); - $item = $response->Transaction->$expectedType; - - if ($item != null) { - $responseCode = (isset($item->RspCode) ? $item->RspCode : null); - $responseText = (isset($item->RspText) ? $item->RspText : null); - - if ($responseCode != null) { - // check if we need to do a reversal - if ($responseCode == '91') { - try { - $this->reverse($this->_amount)->withTransactionId($transactionId)->execute(); - } catch (HpsGatewayException $e) { - // if the transaction wasn't found; throw the original timeout exception - if ($e->details->gatewayResponseCode == 3) { - HpsIssuerResponseValidation::checkResponse($transactionId, $responseCode, $responseText); - } - throw new HpsCreditException( - $transactionId, - HpsExceptionCodes::ISSUER_TIMEOUT_REVERSAL_ERROR, - 'Error occurred while reversing a charge due to HPS issuer timeout', - $e - ); - } catch (HpsException $e) { - throw new HpsCreditException( - $transactionId, - HpsExceptionCodes::ISSUER_TIMEOUT_REVERSAL_ERROR, - 'Error occurred while reversing a charge due to HPS issuer timeout', - $e - ); - } - } - HpsIssuerResponseValidation::checkResponse($transactionId, $responseCode, $responseText); - } - } - } - /** - * @param $transaction - * @param $txnType - * @param null $clientTxnId - * @param null $cardData - * - * @return array|null - * @throws \HpsCreditException - * @throws \HpsException - * @throws \HpsGatewayException - */ - public function _submitTransaction($transaction, $txnType, $clientTxnId = null, $cardData = null) - { - try { - $response = $this->doRequest($transaction, $clientTxnId); - } catch (HpsException $e) { - if ($e->innerException != null && $e->innerException->getMessage() == 'gateway_time-out') { - if (in_array($txnType, array('CreditSale', 'CreditAuth'))) { - try { - $this->reverse($this->_amount)->withCard($cardData)->execute(); - } catch (Exception $e) { - throw new HpsGatewayException('0', HpsExceptionCodes::GATEWAY_TIMEOUT_REVERSAL_ERROR); - } - } - throw new HpsException('An error occurred and the gateway has timed out', 'gateway_timeout', $e, 'gateway_timeout'); - } - throw $e; - } - $this->_processChargeGatewayResponse($response, $txnType); - $this->_processChargeIssuerResponse($response, $txnType); - - $rvalue = null; - switch ($txnType) { - case 'ReportTxnDetail': - $rvalue = HpsReportTransactionDetails::fromDict($response, $txnType); - break; - case 'ReportActivity': - $rvalue = HpsReportTransactionSummary::fromDict($response, $txnType, $this->_filterBy); - break; - case 'CreditSale': - $rvalue = HpsCharge::fromDict($response, $txnType); - break; - case 'CreditAccountVerify': - $rvalue = HpsAccountVerify::fromDict($response, $txnType); - break; - case 'CreditAuth': - $rvalue = HpsAuthorization::fromDict($response, $txnType); - break; - case 'CreditReturn': - $rvalue = HpsRefund::fromDict($response, $txnType); - break; - case 'CreditReversal': - $rvalue = HpsReversal::fromDict($response, $txnType); - break; - case 'CreditVoid': - $rvalue = HpsVoid::fromDict($response, $txnType); - break; - case 'CreditCPCEdit': - $rvalue = HpsCPCEdit::fromDict($response, $txnType); - break; - case 'CreditTxnEdit': - $rvalue = HpsTransaction::fromDict($response, $txnType); - break; - case 'RecurringBilling': - $rvalue = HpsRecurringBilling::fromDict($response, $txnType); - break; - case 'CreditAdditionalAuth': - $rvalue = HpsAuthorization::fromDict($response, $txnType); - break; - case 'PrePaidBalanceInquiry': - $rvalue = HpsAuthorization::fromDict($response, $txnType); - break; - case 'PrePaidAddValue': - $rvalue = HpsAuthorization::fromDict($response, $txnType); - break; - case 'CreditOfflineAuth': - $rvalue = HpsOfflineAuthorization::fromDict($response, $txnType); - break; - case 'ManageTokens': - $rvalue = HpsManageTokensResponse::fromDict($response, $txnType); - break; - default: - break; - } - - return $rvalue; - } -} diff --git a/classes/includes/src/Services/Fluent/Gateway/HpsFluentDebitService.php b/classes/includes/src/Services/Fluent/Gateway/HpsFluentDebitService.php deleted file mode 100644 index e68ce6b..0000000 --- a/classes/includes/src/Services/Fluent/Gateway/HpsFluentDebitService.php +++ /dev/null @@ -1,71 +0,0 @@ -_config = $config; - return $this; - } - /** - * @param null $amount - * - * @return \HpsDebitServiceAddValueBuilder - */ - public function addValue($amount = null) - { - $builder = new HpsDebitServiceAddValueBuilder($this); - return $builder - ->withAmount($amount); - } - /** - * @param null $amount - * - * @return \HpsDebitServiceChargeBuilder - */ - public function charge($amount = null) - { - $builder = new HpsDebitServiceChargeBuilder($this); - return $builder - ->withAmount($amount); - } - /** - * @param null $transactionId - * - * @return \HpsDebitServiceReturnBuilder - */ - public function returnDebit($transactionId = null) - { - $builder = new HpsDebitServiceReturnBuilder($this); - return $builder - ->withTransactionId($transactionId); - } - /** - * @param null $transactionId - * - * @return \HpsDebitServiceReverseBuilder - */ - public function reverse($transactionId = null) - { - $builder = new HpsDebitServiceReverseBuilder($this); - return $builder - ->withTransactionId($transactionId); - } -} diff --git a/classes/includes/src/Services/Fluent/Gateway/HpsFluentGiftCardService.php b/classes/includes/src/Services/Fluent/Gateway/HpsFluentGiftCardService.php deleted file mode 100644 index 849eb6e..0000000 --- a/classes/includes/src/Services/Fluent/Gateway/HpsFluentGiftCardService.php +++ /dev/null @@ -1,186 +0,0 @@ -_config = $config; - return $this; - } - /** - * @param null $amount - * - * @return \HpsGiftCardServiceActivateBuilder - */ - public function activate($amount = null) - { - $builder = new HpsGiftCardServiceActivateBuilder($this); - return $builder - ->withAmount($amount) - ->withCurrency('usd'); - } - /** - * @param null $amount - * - * @return \HpsGiftCardServiceAddValueBuilder - */ - public function addValue($amount = null) - { - $builder = new HpsGiftCardServiceAddValueBuilder($this); - return $builder - ->withAmount($amount); - } - /** - * @return \HpsGiftCardServiceAliasBuilder - */ - public function alias() - { - return new HpsGiftCardServiceAliasBuilder($this); - } - /** - * @return \HpsGiftCardServiceBalanceBuilder - */ - public function balance() - { - return new HpsGiftCardServiceBalanceBuilder($this); - } - /** - * @return \HpsGiftCardServiceDeactivateBuilder - */ - public function deactivate() - { - return new HpsGiftCardServiceDeactivateBuilder($this); - } - /** - * @return \HpsGiftCardServiceReplaceBuilder - */ - public function replace() - { - return new HpsGiftCardServiceReplaceBuilder($this); - } - /** - * @param null $amount - * - * @return \HpsGiftCardServiceReverseBuilder - */ - public function reverse($amount = null) - { - $builder = new HpsGiftCardServiceReverseBuilder($this); - return $builder - ->withAmount($amount) - ->withCurrency('usd'); - } - /** - * @param null $amount - * - * @return \HpsGiftCardServiceRewardBuilder - */ - public function reward($amount = null) - { - $builder = new HpsGiftCardServiceRewardBuilder($this); - return $builder - ->withAmount($amount) - ->withCurrency('usd'); - } - /** - * @param null $amount - * - * @return \HpsGiftCardServiceSaleBuilder - */ - public function sale($amount = null) - { - $builder = new HpsGiftCardServiceSaleBuilder($this); - return $builder - ->withAmount($amount) - ->withCurrency('usd'); - } - /** - * @param null $transactionId - * - * @return \HpsGiftCardServiceVoidBuilder - */ - public function void($transactionId = null) - { - $builder = new HpsGiftCardServiceVoidBuilder($this); - return $builder - ->withTransactionId($transactionId); - } - /** - * @param $transaction - * @param $txnType - * @param null $clientTxnId - * - * @return \HpsGiftCardAlias|string - * @throws \HpsAuthenticationException - * @throws \HpsCreditException - * @throws \HpsGatewayException - * @throws null - */ - public function _submitTransaction($transaction, $txnType, $clientTxnId = null) - { - $response = $this->doRequest($transaction, $clientTxnId); - - HpsGatewayResponseValidation::checkResponse($response, $txnType); - HpsIssuerResponseValidation::checkResponse( - $response->Header->GatewayTxnId, - $response->Transaction->$txnType->RspCode, - $response->Transaction->$txnType->RspText, - 'gift' - ); - - $rvalue = ''; - switch ($txnType) { - case 'GiftCardActivate': - $rvalue = HpsGiftCardActivate::fromDict($response, $txnType, 'HpsGiftCardActivate'); - break; - case 'GiftCardAddValue': - $rvalue = HpsGiftCardAddValue::fromDict($response, $txnType, 'HpsGiftCardAddValue'); - break; - case 'GiftCardAlias': - $rvalue = HpsGiftCardAlias::fromDict($response, $txnType, 'HpsGiftCardAlias'); - break; - case 'GiftCardBalance': - $rvalue = HpsGiftCardBalance::fromDict($response, $txnType, 'HpsGiftCardBalance'); - break; - case 'GiftCardDeactivate': - $rvalue = HpsGiftCardDeactivate::fromDict($response, $txnType, 'HpsGiftCardDeactivate'); - break; - case 'GiftCardReplace': - $rvalue = HpsGiftCardReplace::fromDict($response, $txnType, 'HpsGiftCardReplace'); - break; - case 'GiftCardReward': - $rvalue = HpsGiftCardReward::fromDict($response, $txnType, 'HpsGiftCardReward'); - break; - case 'GiftCardSale': - $rvalue = HpsGiftCardSale::fromDict($response, $txnType, 'HpsGiftCardSale'); - break; - case 'GiftCardVoid': - $rvalue = HpsGiftCardVoid::fromDict($response, $txnType, 'HpsGiftCardVoid'); - break; - case 'GiftCardReversal': - $rvalue = HpsGiftCardReversal::fromDict($response, $txnType, 'HpsGiftCardReversal'); - break; - default: - break; - } - - return $rvalue; - } -} diff --git a/classes/includes/src/Services/Gateway/AltPayment/HpsAltPaymentService.php b/classes/includes/src/Services/Gateway/AltPayment/HpsAltPaymentService.php deleted file mode 100644 index 9c83fe3..0000000 --- a/classes/includes/src/Services/Gateway/AltPayment/HpsAltPaymentService.php +++ /dev/null @@ -1,484 +0,0 @@ -createElement('hps:Transaction'); - $auth = $xml->createElement('hps:AltPaymentAuth'); - - $auth->appendChild($xml->createElement('hps:TransactionType', $this->_transactionType)); - $auth->appendChild($xml->createElement('hps:SessionId', $sessionId)); - $auth->appendChild($this->hydrateBuyerData($buyer, $xml)); - $auth->appendChild($xml->createElement('hps:Amt', $amount)); - $auth->appendChild($this->hydratePaymentData($payment, $xml)); - if ($shippingAddress != null) { - $auth->appendChild($this->hydrateShippingData($shippingAddress, $xml)); - } - if ($lineItems != null) { - $auth->appendChild($this->hydrateLineItems($lineItems, $xml)); - } - - $transaction->appendChild($auth); - return $this->_submitTransaction($transaction, 'AltPaymentAuth'); - } - /** - * @param $transactionId - * @param $amount - * - * @return null - * @throws \HpsException - * @throws \HpsInvalidRequestException - */ - public function capture($transactionId, $amount) - { - HpsInputValidation::checkAmount($amount); - - $xml = new DOMDocument(); - $transaction = $xml->createElement('hps:Transaction'); - $capture = $xml->createElement('hps:AltPaymentCapture'); - - $capture->appendChild($xml->createElement('hps:TransactionType', $this->_transactionType)); - $capture->appendChild($xml->createElement('hps:GatewayTxnId', $transactionId)); - $capture->appendChild($xml->createElement('hps:Amt', $amount)); - - $payment = $xml->createElement('hps:Payment'); - $nvp = $xml->createElement('hps:NameValuePair'); - $nvp->appendChild($xml->createElement('hps:Name', 'FullyCapturedFlag')); - $nvp->appendChild($xml->createElement('hps:Value', 'true')); - $payment->appendChild($nvp); - - $capture->appendChild($payment); - $transaction->appendChild($capture); - return $this->_submitTransaction($transaction, 'AltPaymentCapture'); - } - /** - * @param $amount - * @param $currency - * @param \HpsBuyerData|null $buyer - * @param \HpsPaymentData|null $payment - * @param \HpsShippingInfo|null $shippingAddress - * @param null $lineItems - * - * @return null - * @throws \HpsException - * @throws \HpsInvalidRequestException - */ - public function createSession($amount, $currency, HpsBuyerData $buyer = null, HpsPaymentData $payment = null, HpsShippingInfo $shippingAddress = null, $lineItems = null) - { - HpsInputValidation::checkAmount($amount); - HpsInputValidation::checkCurrency($currency); - - $xml = new DOMDocument(); - $transaction = $xml->createElement('hps:Transaction'); - $createSession = $xml->createElement('hps:AltPaymentCreateSession'); - - $createSession->appendChild($xml->createElement('hps:TransactionType', $this->_transactionType)); - $createSession->appendChild($this->hydrateBuyerData($buyer, $xml)); - $createSession->appendChild($xml->createElement('hps:Amt', $amount)); - $createSession->appendChild($this->hydratePaymentData($payment, $xml)); - if ($shippingAddress != null) { - $createSession->appendChild($this->hydrateShippingData($shippingAddress, $xml)); - } - if ($lineItems != null) { - $createSession->appendChild($this->hydrateLineItems($lineItems, $xml)); - } - - $transaction->appendChild($createSession); - return $this->_submitTransaction($transaction, 'AltPaymentCreateSession'); - } - /** - * @param $transactionId - * @param bool $isPartial - * @param null $partialAmount - * - * @return null - * @throws \HpsException - */ - public function refund($transactionId, $isPartial = false, $partialAmount = null) - { - $xml = new DOMDocument(); - $transaction = $xml->createElement('hps:Transaction'); - $return = $xml->createElement('hps:AltPaymentReturn'); - - $return->appendChild($xml->createElement('hps:TransactionType', $this->_transactionType)); - $return->appendChild($xml->createElement('hps:GatewayTxnId', $transactionId)); - - if ($isPartial) { - $return->appendChild($xml->createElement('hps:Amt', $partialAmount)); - } - - $payment = $xml->createElement('hps:Return'); - $nvp = $xml->createElement('hps:NameValuePair'); - $nvp->appendChild($xml->createElement('hps:Name', 'ReturnType')); - $nvp->appendChild($xml->createElement('hps:Value', $isPartial ? 'partial' : 'full')); - $payment->appendChild($nvp); - - $return->appendChild($payment); - $transaction->appendChild($return); - return $this->_submitTransaction($transaction, 'AltPaymentReturn'); - } - /** - * @param $sessionId - * @param $amount - * @param $currency - * @param \HpsBuyerData|null $buyer - * @param \HpsPaymentData|null $payment - * @param \HpsShippingInfo|null $shippingAddress - * @param null $lineItems - * - * @return null - * @throws \HpsException - * @throws \HpsInvalidRequestException - */ - public function sale($sessionId, $amount, $currency, HpsBuyerData $buyer = null, HpsPaymentData $payment = null, HpsShippingInfo $shippingAddress = null, $lineItems = null) - { - HpsInputValidation::checkAmount($amount); - HpsInputValidation::checkCurrency($currency); - - $xml = new DOMDocument(); - $transaction = $xml->createElement('hps:Transaction'); - $sale = $xml->createElement('hps:AltPaymentSale'); - - $sale->appendChild($xml->createElement('hps:TransactionType', $this->_transactionType)); - $sale->appendChild($xml->createElement('hps:SessionId', $sessionId)); - $sale->appendChild($this->hydrateBuyerData($buyer, $xml)); - $sale->appendChild($xml->createElement('hps:Amt', $amount)); - $sale->appendChild($this->hydratePaymentData($payment, $xml)); - if ($shippingAddress != null) { - $sale->appendChild($this->hydrateShippingData($shippingAddress, $xml)); - } - if ($lineItems != null) { - $sale->appendChild($this->hydrateLineItems($lineItems, $xml)); - } - - $transaction->appendChild($sale); - return $this->_submitTransaction($transaction, 'AltPaymentSale'); - } - /** - * @param $transactionId - * - * @return null - * @throws \HpsException - */ - public function void($transactionId) - { - $xml = new DOMDocument(); - $transaction = $xml->createElement('hps:Transaction'); - $void = $xml->createElement('hps:AltPaymentVoid'); - - $void->appendChild($xml->createElement('hps:TransactionType', $this->_transactionType)); - $void->appendChild($xml->createElement('hps:GatewayTxnId', $transactionId)); - - $transaction->appendChild($void); - return $this->_submitTransaction($transaction, 'AltPaymentVoid'); - } - /** - * @param $sessionId - * - * @return null - * @throws \HpsException - */ - public function sessionInfo($sessionId) - { - $xml = new DOMDocument(); - $transaction = $xml->createElement('hps:Transaction'); - $info = $xml->createElement('hps:AltPaymentSessionInfo'); - - $info->appendChild($xml->createElement('hps:TransactionType', $this->_transactionType)); - $info->appendChild($xml->createElement('hps:SessionId', $sessionId)); - - $transaction->appendChild($info); - return $this->_submitTransaction($transaction, 'AltPaymentSessionInfo'); - } - /** - * @param $type - */ - public function setTransactionType($type) - { - $this->_transactionType = $type; - } - /** - * @param $transactionId - * - * @return null - * @throws \HpsException - */ - public function status($transactionId) - { - $xml = new DOMDocument(); - $transaction = $xml->createElement('hps:Transaction'); - $status = $xml->createElement('hps:GetTransactionStatus'); - - $status->appendChild($xml->createElement('hps:GatewayTxnId', $transactionId)); - - $transaction->appendChild($status); - return $this->_submitTransaction($transaction, 'GetTransactionStatus'); - } - /** - * @param \HpsBuyerData $buyer - * @param \DOMDocument $xml - * - * @return \DOMElement - */ - protected function hydrateBuyerData(HpsBuyerData $buyer, DOMDocument $xml) - { - $data = $xml->createElement('hps:Buyer'); - if (isset($buyer->returnUrl)) { - $data->appendChild($this->hydrateNameValuePair('ReturnUrl', $buyer->returnUrl, $xml)); - } - if (isset($buyer->cancelUrl)) { - $data->appendChild($this->hydrateNameValuePair('CancelUrl', $buyer->cancelUrl, $xml)); - } - if (isset($buyer->emailAddress)) { - $data->appendChild($this->hydrateNameValuePair('EmailAddress', $buyer->emailAddress, $xml)); - } - if (isset($buyer->payerId)) { - $data->appendChild($this->hydrateNameValuePair('BuyerId', $buyer->payerId, $xml)); - } - if (isset($buyer->credit) && $buyer->credit != false) { - $data->appendChild($this->hydrateNameValuePair('FundingSource', 'credit', $xml)); - } - return $data; - } - /** - * @param $items - * @param \DOMDocument $xml - * - * @return \DOMElement - */ - protected function hydrateLineItems($items, DOMDocument $xml) - { - $lineItems = $xml->createElement('hps:LineItem'); - - foreach ($items as $item) { - if (!$item instanceof HpsLineItem) { - continue; - } - $detail = $xml->createElement('hps:Detail'); - if (isset($item->name)) { - $detail->appendChild($this->hydrateNameValuePair('Name', $item->name, $xml)); - } - if (isset($item->description)) { - $detail->appendChild($this->hydrateNameValuePair('Description', $item->description, $xml)); - } - if (isset($item->number)) { - $detail->appendChild($this->hydrateNameValuePair('Number', $item->number, $xml)); - } - if (isset($item->amount)) { - $detail->appendChild($this->hydrateNameValuePair('Amount', $item->amount, $xml)); - } - if (isset($item->quantity)) { - $detail->appendChild($this->hydrateNameValuePair('Quantity', $item->quantity, $xml)); - } - if (isset($item->taxAmount)) { - $detail->appendChild($this->hydrateNameValuePair('TaxAmount', $item->taxAmount, $xml)); - } - $lineItems->appendChild($detail); - } - return $lineItems; - } - /** - * @param $name - * @param $value - * @param \DOMDocument $xml - * - * @return \DOMElement - */ - protected function hydrateNameValuePair($name, $value, DOMDocument $xml) - { - $nvp = $xml->createElement('hps:NameValuePair'); - $nvp->appendChild($xml->createElement('hps:Name', $name)); - $nvp->appendChild($xml->createElement('hps:Value', HpsInputValidation::cleanAscii($value))); - return $nvp; - } - /** - * @param \HpsPaymentData $payment - * @param \DOMDocument $xml - * - * @return \DOMElement - */ - protected function hydratePaymentData(HpsPaymentData $payment, DOMDocument $xml) - { - $data = $xml->createElement('hps:Payment'); - $data->appendChild($this->hydrateNameValuePair('ItemAmount', $payment->subtotal, $xml)); - if (isset($payment->shippingAmount)) { - $data->appendChild($this->hydrateNameValuePair('ShippingAmount', $payment->shippingAmount, $xml)); - } - if (isset($payment->taxAmount)) { - $data->appendChild($this->hydrateNameValuePair('TaxAmount', $payment->taxAmount, $xml)); - } - if (isset($payment->paymentType)) { - $data->appendChild($this->hydrateNameValuePair('PaymentType', $payment->paymentType, $xml)); - } - if (isset($payment->invoiceNumber)) { - $data->appendChild($this->hydrateNameValuePair('InvoiceNbr', $payment->invoiceNumber, $xml)); - } - return $data; - } - /** - * @param \HpsShippingInfo $info - * @param \DOMDocument $xml - * - * @return \DOMElement - */ - protected function hydrateShippingData(HpsShippingInfo $info, DOMDocument $xml) - { - $shipping = $xml->createElement('hps:Shipping'); - $address = $xml->createElement('hps:Address'); - $address->appendChild($this->hydrateNameValuePair('AllowAddressOverride', 'false', $xml)); - $address->appendChild($this->hydrateNameValuePair('ShipName', $info->name, $xml)); - $address->appendChild($this->hydrateNameValuePair('ShipAddress', $info->address->address, $xml)); - $address->appendChild($this->hydrateNameValuePair('ShipCity', $info->address->city, $xml)); - $address->appendChild($this->hydrateNameValuePair('ShipState', $info->address->state, $xml)); - $address->appendChild($this->hydrateNameValuePair('ShipZip', $info->address->zip, $xml)); - $address->appendChild($this->hydrateNameValuePair('ShipCountryCode', $info->address->country, $xml)); - $shipping->appendChild($address); - return $shipping; - } - /** - * @param $response - * @param $expectedType - * - * @throws \HpsAuthenticationException - * @throws \HpsGatewayException - * @throws null - */ - private function _processGatewayResponse($response, $expectedType) - { - $gatewayRspCode = (isset($response->Header->GatewayRspCode) ? $response->Header->GatewayRspCode : null); - $transactionId = (isset($response->Header->GatewayTxnId) ? $response->Header->GatewayTxnId : null); - - if ($gatewayRspCode == '0') { - return; - } - - if ($gatewayRspCode == '30') { - try { - $this->void($transactionId); - } catch (Exception $e) { - throw new HpsGatewayException( - HpsExceptionCodes::GATEWAY_TIMEOUT_REVERSAL_ERROR, - 'Error occurred while reversing a charge due to HPS gateway timeout', - $e, - null, - null, - $transactionId - ); - } - } - - HpsGatewayResponseValidation::checkResponse($response, $expectedType); - } - /** - * @param $response - * @param $expectedType - * - * @throws \HpsProcessorException - * @throws null - */ - private function _processProcessorResponse($response, $expectedType) - { - $transactionId = (isset($response->Header->GatewayTxnId) ? $response->Header->GatewayTxnId : null); - $item = $response->Transaction->$expectedType; - - if ($item != null) { - $responseCode = (isset($item->RspCode) ? $item->RspCode : null); - $responseMessage = (isset($item->RspMessage) ? $item->RspMessage : null); - - if ($responseCode == null && isset($item->TransactionStatus->RspCode)) { - $responseCode = $item->TransactionStatus->RspCode; - } - if ($responseMessage == null && isset($item->TransactionStatus->RspText)) { - $responseMessage = $item->TransactionStatus->RspText; - } - - HpsProcessorResponseValidation::checkResponse($transactionId, $responseCode, $responseMessage, $item); - } - } - /** - * @param $transaction - * @param $txnType - * @param null $clientTxnId - * @param null $cardData - * - * @return null - * @throws \HpsException - * @throws \HpsGatewayException - */ - private function _submitTransaction($transaction, $txnType, $clientTxnId = null, $cardData = null) - { - try { - $response = $this->doRequest($transaction, $clientTxnId); - } catch (HpsException $e) { - if ($e->innerException != null && $e->innerException->getMessage() == 'gateway_time-out') { - // if (in_array($txnType, array('CreditSale', 'CreditAuth'))) { - // try { - // $this->reverse($cardData, $this->_amount, $this->_currency); - // } catch (Exception $e) { - // throw new HpsGatewayException('0', HpsExceptionCodes::GATEWAY_TIMEOUT_REVERSAL_ERROR); - // } - // } - throw new HpsException('An error occurred and the gateway has timed out', 'gateway_timeout', $e, 'gateway_timeout'); - } - throw $e; - } - - $this->_processGatewayResponse($response, $txnType); - $this->_processProcessorResponse($response, $txnType); - - $rvalue = null; - switch ($txnType) { - case 'AltPaymentCreateSession': - $rvalue = HpsAltPaymentCreateSession::fromDict($response, $txnType); - break; - case 'AltPaymentSessionInfo': - $rvalue = HpsAltPaymentSessionInfo::fromDict($response, $txnType); - break; - case 'AltPaymentSale': - $rvalue = HpsAltPaymentSale::fromDict($response, $txnType); - break; - case 'AltPaymentAuth': - $rvalue = HpsAltPaymentAuth::fromDict($response, $txnType); - break; - case 'AltPaymentCapture': - $rvalue = HpsAltPaymentCapture::fromDict($response, $txnType); - break; - case 'AltPaymentReturn': - $rvalue = HpsAltPaymentReturn::fromDict($response, $txnType); - break; - case 'AltPaymentVoid': - $rvalue = HpsAltPaymentVoid::fromDict($response, $txnType); - break; - case 'GetTransactionStatus': - $rvalue = HpsTransactionStatus::fromDict($response, $txnType); - break; - default: - break; - } - - return $rvalue; - } -} diff --git a/classes/includes/src/Services/Gateway/AltPayment/HpsMasterPassService.php b/classes/includes/src/Services/Gateway/AltPayment/HpsMasterPassService.php deleted file mode 100644 index 6a065ff..0000000 --- a/classes/includes/src/Services/Gateway/AltPayment/HpsMasterPassService.php +++ /dev/null @@ -1,622 +0,0 @@ - - * @license https://github.com/hps/heartland-php/blob/master/LICENSE.txt Custom - * @link https://github.com/hps/heartland-php - */ - -/** - * MasterPass using Cardinal Commerce - * - * @category PHP - * @package HPS - * @author Heartland Payment Systems - * @license https://github.com/hps/heartland-php/blob/master/LICENSE.txt Custom - * @link https://github.com/hps/heartland-php - */ -class HpsMasterPassService - extends HpsCentinelGatewayService - implements HpsAltPaymentServiceInterface -{ - protected static $currencyCodes = array( - 'usd' => '840', - ); - - /** - * Updates the Merchant’s front-end order number with their back-end order - * number in the Centinel system. The Merchant’s original order number is - * persisted and searchable. The transaction expects the OrderId and - * OrderNumber values to correspond to the original Lookup response message. - * - * @param string $orderId order id from Cardinal - * @param HpsOrderData $orderData Cardinal/MasterPass specific data - * - * @return object - */ - public function addOrderNumber( - $orderId, - HpsOrderData $orderData - ) { - $payload = array( - 'OrderId' => $orderId, - 'OrderNumber' => $orderData->orderNumber, - 'TransactionType' => 'WT', - ); - return $this->submitTransaction($payload, 'cmpi_add_order_number'); - } - - /** - * Responsible for returning the status of the MasterPass transaction to the - * Merchant. The message will return the status of the transaction, enabling - * the Merchant to handle the order according to the outcome. In the event - * that the ErrorNo element is 0 (zero) then the PAResStatus value will define - * how the transaction should be processed. Based on the transaction outcome - * the Merchant's order management system should be updated and the appropriate - * message should be displayed to the consumer. In the event that a nonzero - * ErrorNo value is returned or PAResStatus value is not Y, the consumer should - * be prompted for an alternate form of payment. - * - * @param string $orderId order id from Cardinal - * @param string $oauthToken oauth token from MasterPass - * @param string $oauthVerifier oauth verifier from MasterPass - * @param string $payload payload data from Cardinal - * @param string $resourceUrl resource URL from MasterPass - * @param HpsOrderData $orderData Cardinal/MasterPass specific data - * - * @return object - */ - public function authenticate( - $orderId, - $oauthToken, - $oauthVerifier, - $payload, - $resourceUrl, - HpsOrderData $orderData = null - ) { - $data = array( - 'OrderId' => $orderId, - 'PAResPayload' => $payload, - 'Status' => $orderData->transactionStatus, - 'TransactionType' => 'WT', - ); - - if ($orderData->checkoutType === HpsCentinelCheckoutType::PAIRING - || $orderData->checkoutType === HpsCentinelCheckoutType::PAIRING_CHECKOUT - ) { - $data['PairingToken'] = $orderData->pairingToken; - $data['PairingVerifier'] = $orderData->pairingVerifier; - } - - if ($orderData->checkoutType === null - || $orderData->checkoutType === HpsCentinelCheckoutType::LIGHTBOX - || $orderData->checkoutType === HpsCentinelCheckoutType::PAIRING_CHECKOUT - ) { - $data['CheckoutResourceUrl'] = $resourceUrl; - $data['OAuthToken'] = $oauthToken; - $data['OAuthVerifier'] = $oauthVerifier; - } - - return $this->submitTransaction($data, 'cmpi_authenticate'); - } - - /** - * Responsible for authorizing the transaction. Once authorized, the - * transaction amount can be captured at a later point in time. Once the - * Merchant is ready to perform the actual Authorization of funds the - * Authorize message should be processes referencing the original OrderId - * returned in the Lookup message. This authorization request checks the - * availability of the Customer’s funds to obtain an honor period for - * capture/settlement. - * - * @param string $orderId order id from Cardinal - * @param mixed $amount amount to be authorized - * @param string $currency currency code - * @param HpsBuyerData $buyer buyer information - * @param HpsPaymentData $payment payment information - * @param HpsShippingInfo $shippingAddress shipping information - * @param array $lineItems line items from order - * @param HpsOrderData $orderData Cardinal/MasterPass specific - * data - * - * @return object - */ - public function authorize( - $orderId, - $amount, - $currency, - HpsBuyerData $buyer = null, - HpsPaymentData $payment = null, - HpsShippingInfo $shippingAddress = null, - $lineItems = null, - HpsOrderData $orderData = null - ) { - $payload = array( - 'TransactionType' => 'WT', - 'Amount' => $this->formatAmount($amount), - 'OrderId' => $orderId, - 'CurrencyCode' => $this->currencyStringToNumeric($currency), - ); - if ($buyer !== null) { - $payload = array_merge($payload, $this->hydrateBuyerData($buyer)); - } - if ($payment !== null) { - $payload = array_merge($payload, $this->hydratePaymentData($payment)); - } - if ($shippingAddress !== null) { - $payload = array_merge( - $payload, - $this->hydrateShippingInfo($shippingAddress) - ); - } - if ($lineItems !== null) { - $payload = array_merge($payload, $this->hydrateLineItems($lineItems)); - } - return $this->submitTransaction($payload, 'cmpi_authorize'); - } - - /** - * Responsible for settling funds from previous authorization transaction. - * Payment for the complete or partial amount of the authorization is available. - * Multiple captures can be processed against a single Authorization up to 100% - * of the authorization. - * - * @param string $orderId order id from Cardinal - * @param mixed $amount amount to be authorized - * @param HpsOrderData $orderData Cardinal/MasterPass specific data - * - * @return object - */ - public function capture( - $orderId, - $amount, - HpsOrderData $orderData = null - ) { - $payload = array( - 'Amount' => $this->formatAmount($amount), - 'CurrencyCode' => $this->currencyStringToNumeric( - $orderData->currencyCode - ), - 'OrderId' => $orderId, - 'OrderNumber' => $orderData->orderNumber, - 'TransactionType' => 'WT', - ); - return $this->submitTransaction($payload, 'cmpi_capture'); - } - - /** - * Responsible for initiating the MasterPass transaction. The Lookup Message - * is constructed and sent to the Centinel platform for processing. The Lookup - * Message requires transaction specific data elements to be formatted on the - * request message. Please refer to the Message API section for the complete - * list of required message elements. - * - * The Centinel platform will then redirect the consumer back to the TermUrl - * representing a web page on the merchant's website. At that point, the - * merchant will process the Authenticate message to retrieve the status from - * the MasterPass processing. - * - * @param mixed $amount amount to be authorized - * @param string $currency currency code - * @param HpsBuyerData $buyer buyer information - * @param HpsPaymentData $payment payment information - * @param HpsShippingInfo $shippingAddress shipping information - * @param array $lineItems line items from order - * @param HpsOrderData $orderData Cardinal/MasterPass specific - * data - * - * @return object - */ - public function createSession( - $amount, - $currency, - HpsBuyerData $buyer = null, - HpsPaymentData $payment = null, - HpsShippingInfo $shippingAddress = null, - $lineItems = null, - HpsOrderData $orderData = null - ) { - $payload = array( - 'TransactionType' => 'WT', - 'OverridePaymentMethod' => 'MPPWLT', - 'Amount' => $this->formatAmount($amount), - 'CurrencyCode' => $this->currencyStringToNumeric($currency), - 'OverrideCheckoutType' => $this->getCheckoutType($orderData), - 'ConnectTimeout' => '10000', - 'TransactionMode' => 'S', - 'OrderNumber' => $orderData->orderNumber, - 'IPAddress' => $orderData->ipAddress, - 'BrowserHeader' => $orderData->browserHeader, - 'UserAgent' => $orderData->userAgent, - 'OriginUrl' => $orderData->originUrl, - 'TermUrl' => $orderData->termUrl, - ); - if ($orderData->orderId !== null) { - $payload['OrderId'] = $orderData->orderId; - } - if ($buyer !== null) { - $payload = array_merge($payload, $this->hydrateBuyerData($buyer)); - } - if ($payment !== null) { - $payload = array_merge($payload, $this->hydratePaymentData($payment)); - } - if ($shippingAddress !== null) { - $payload = array_merge( - $payload, - $this->hydrateShippingInfo($shippingAddress) - ); - } - if ($lineItems !== null) { - $payload = array_merge($payload, $this->hydrateLineItems($lineItems)); - } - return $this->submitTransaction($payload, 'cmpi_lookup'); - } - - /** - * Gives Merchants the ability to provide the consumer the opportunity to - * pre-select their checkout options before completing checkout. - * - * @param string $longAccessToken Access token from Cardinal/MasterPass - * @param HpsOrderData $orderData Cardinal/MasterPass specific data - * - * @return object - */ - public function preApproval( - $longAccessToken, - HpsOrderData $orderData = null - ) { - $payload = array( - 'LongAccessToken' => $longAccessToken, - 'SubMsgType' => 'cmpi_preapproval', - 'TransactionType' => 'WT', - ); - return $this->submitTransaction($payload, 'cmpi_baseserver_api'); - } - - /** - * Responsible for crediting the consumer some portion or all of the original - * settlement amount. Multiple refunds can be processed against the original - * capture transaction. - * - * @param string $orderId order id from Cardinal - * @param boolean $isPartial flag for partial refund - * @param string $amount amount to be refunded - * @param HpsOrderData $orderData Cardinal/MasterPass specific data - * - * @return object - */ - public function refund( - $orderId, - $isPartial = false, - $amount = null, - HpsOrderData $orderData = null - ) { - $payload = array( - 'Amount' => $this->formatAmount($amount), - 'CurrencyCode' => $this->currencyStringToNumeric( - $orderData->currencyCode - ), - 'OrderId' => $orderId, - 'TransactionType' => 'WT', - ); - return $this->submitTransaction($payload, 'cmpi_refund'); - } - - /** - * Responsible for authorizing the transaction. Once authorized, the - * transaction amount can be captured at a later point in time. Once the - * Merchant is ready to perform the actual Authorization of funds the - * Authorize message should be processes referencing the original OrderId - * returned in the Lookup message. This authorization request checks the - * availability of the Customer’s funds to obtain an honor period for - * capture/settlement. - * - * @param string $orderId order id from Cardinal - * @param mixed $amount amount to be authorized - * @param string $currency currency code - * @param HpsBuyerData $buyer buyer information - * @param HpsPaymentData $payment payment information - * @param HpsShippingInfo $shippingAddress shipping information - * @param array $lineItems line items from order - * @param HpsOrderData $orderData Cardinal/MasterPass specific - * data - * - * @return object - */ - public function sale( - $orderId, - $amount, - $currency, - HpsBuyerData $buyer = null, - HpsPaymentData $payment = null, - HpsShippingInfo $shippingAddress = null, - $lineItems = null, - HpsOrderData $orderData = null - ) { - $authorization = $this->authorize( - $orderId, - $amount, - $currency, - $buyer, - $payment, - $shippingAddress, - $lineItems, - $orderData - ); - if (null === $orderData) { - $orderData = new HpsOrderData(); - } - $orderData->currencyCode = $currency; - $capture = $this->capture( - $orderId, - $this->formatAmount($amount), - $orderData - ); - return (object)array( - 'authorization' => $authorization, - 'capture' => $capture, - ); - } - - /** - * Cancels an authorized transaction with MasterPass. Any hold on consumer - * funds will be removed when the transaction is voided. - * - * @param string $orderId order id from Cardinal - * @param HpsOrderData $orderData Cardinal/MasterPass specific data - * - * @return object - */ - public function void( - $orderId, - HpsOrderData $orderData = null - ) { - $payload = array( - 'OrderId' => $orderId, - ); - return $this->submitTransaction($payload, 'cmpi_void'); - } - - /** - * Gets information about a MasterPass session - * - * @param string $orderId order id from Cardinal - * @param HpsOrderData $orderData Cardinal/MasterPass specific data - * - * @return object - */ - public function sessionInfo( - $orderId, - HpsOrderData $orderData = null - ) { - } - - /** - * Gets checkout type from `$orderData` or `lightbox` if not set - * - * @param HpsOrderData $orderData the order data - * - * @return string - */ - protected function getCheckoutType(HpsOrderData $orderData) - { - return isset($orderData->checkoutType) - ? $orderData->checkoutType - : 'lightbox'; - } - /** - * Converts a 3-letter currency code to 3-digit ISO 4217 version - * - * @param string $currency currency code - * - * @return string - * @throws \HpsArgumentException - * @raises HpsArgumentException - */ - protected function currencyStringToNumeric($currency) - { - if (!in_array(strtolower($currency), array_keys(self::$currencyCodes))) { - throw new HpsArgumentException( - 'Currency is not supported', - HpsExceptionCodes::INVALID_CURRENCY - ); - } - return self::$currencyCodes[strtolower($currency)]; - } - - /** - * Converts HpsBuyerData into expected format for Cardinal - * - * @param HpsBuyerData $buyer buyer information - * - * @return array - */ - protected function hydrateBuyerData(HpsBuyerData $buyer) - { - return array( - 'BillingAddress1' => $buyer->address->address, - 'BillingCity' => $buyer->address->city, - 'BillingCountryCode' => $buyer->countryCode, - 'BillingFirstName' => $buyer->firstName, - 'BillingLastName' => $buyer->lastName, - 'BillingMiddleName' => $buyer->middleName, - 'BillingPhone' => $buyer->phoneNumber, - 'BillingPostalCode' => $buyer->address->zip, - 'BillingState' => $buyer->address->state, - ); - } - - /** - * Converts HpsLineItem's into expected format for Cardinal - * - * @param array $items line items from order - * - * @return array - */ - protected function hydrateLineItems($items) - { - $result = array(); - if ($items == null) { - return $result; - } - - foreach ($items as $i => $item) { - $result = array_merge( - $result, - array( - 'Item_Name_' . $i => $item->name, - 'Item_Desc_' . $i => $item->description, - 'Item_Price_' . $i => $this->formatAmount($item->amount), - 'Item_Quantity_' . $i => $item->quantity, - 'Item_SKU_' . $i => $item->number, - ) - ); - } - - return $result; - } - - /** - * Converts HpsShippingInfo into expected format for Cardinal - * - * @param HpsPaymentData $payment payment information - * - * @return array - */ - protected function hydratePaymentData(HpsPaymentData $payment) - { - return array( - 'TaxAmount' => $this->formatAmount($payment->taxAmount), - 'ShippingAmount' => $this->formatAmount($payment->shippingAmount), - ); - } - - /** - * Converts HpsShippingInfo into expected format for Cardinal - * - * @param HpsShippingInfo $shipping shipping information - * - * @return array - */ - protected function hydrateShippingInfo(HpsShippingInfo $shipping) - { - return array( - 'ShippingAddress1' => $shipping->address->address, - 'ShippingCity' => $shipping->address->city, - 'ShippingCountryCode' => $shipping->countryCode, - 'ShippingFirstName' => $shipping->firstName, - 'ShippingLastName' => $shipping->lastName, - 'ShippingMiddleName' => $shipping->middleName, - 'ShippingPhone' => $shipping->phoneNumber, - 'ShippingPostalCode' => $shipping->address->zip, - 'ShippingState' => $shipping->address->state, - ); - } - - /** - * Formats the amount in form of cents - * - * @param mixed $amount amount to be formatted - * - * @return string - */ - protected function formatAmount($amount) - { - return sprintf('%s', ceil(intval($amount) * 100)); - // return $amount; - } - /** - * Processes the response from Cardinal - * - * @param object $response response from Cardinal - * - * @return null - * @throws \HpsException - */ - protected function processGatewayResponse($response) - { - $gatewayRspCode = isset($response->ErrorNo) - ? (string)$response->ErrorNo - : null; - - if ($gatewayRspCode == '0') { - return; - } - - throw new HpsException((string)$response->ErrorDesc); - } - /** - * Processes the response from MasterPass - * - * @param object $response response from Cardinal - * - * @return null - * @throws \HpsException - */ - protected function processProcessorResponse($response) - { - $statusCode = isset($response->StatusCode) - ? (string)$response->StatusCode - : null; - - if ($statusCode == null || $statusCode == 'Y') { - return; - } - - throw new HpsException((string)$response->ErrorDesc); - } - - /** - * Submits a transaction to the gateway - * - * @param array $request request payload - * @param string $txnType type of transaction to be ran - * - * @return object - */ - protected function submitTransaction( - $request, - $txnType - ) { - $request = array_merge($request, array('MsgType' => $txnType)); - $response = $this->doRequest($request); - - $this->processGatewayResponse($response); - $this->processProcessorResponse($response); - - $result = null; - - switch ($txnType) { - case 'cmpi_lookup': - $result = HpsCardinalMPILookupResponse::fromObject($response); - break; - case 'cmpi_authenticate': - $result = HpsCardinalMPIAuthenticateResponse::fromObject($response); - break; - case 'cmpi_baseserver_api': - $result = HpsCardinalMPIPreapprovalResponse::fromObject($response); - break; - case 'cmpi_authorize': - $result = HpsCardinalMPIAuthorizeResponse::fromObject($response); - break; - case 'cmpi_capture': - $result = HpsCardinalMPICaptureResponse::fromObject($response); - break; - case 'cmpi_refund': - $result = HpsCardinalMPIRefundResponse::fromObject($response); - break; - case 'cmpi_void': - $result = HpsCardinalMPIVoidResponse::fromObject($response); - break; - case 'cmpi_add_order_number': - $result = HpsCardinalMPIAddOrderNumberResponse::fromObject($response); - break; - } - return $result; - } -} diff --git a/classes/includes/src/Services/Gateway/AltPayment/HpsPayPalService.php b/classes/includes/src/Services/Gateway/AltPayment/HpsPayPalService.php deleted file mode 100644 index f7d1b95..0000000 --- a/classes/includes/src/Services/Gateway/AltPayment/HpsPayPalService.php +++ /dev/null @@ -1,9 +0,0 @@ -createElement('hps:Transaction'); - - $hpsGetAttachments = $hpsTransaction - ->appendChild($xml->createElement('hps:GetAttachments')); - - $hpsGetAttachments->appendChild($xml->createElement('hps:GatewayTxnId', $GatewayTxnId)); - - if ($AttachmentTypeProvided) { - $hpsGetAttachments->appendChild($xml->createElement('hps:AttachmentType', $AttachmentType)); - } - - if ($ReturnAttachmentTypesOnly === true) { - $hpsGetAttachments->appendChild($xml->createElement('hps:ReturnAttachmentTypesOnly', 'true')); - } - - if ($AttachmentDataId) { - $hpsGetAttachments->appendChild($xml->createElement('hps:AttachmentDataId', $AttachmentDataId)); - } - - return $this->_submitTransaction($hpsTransaction, 'GetAttachments'); - - } - - /** - * @param \DOMElement $transaction - * @param string $txnType - * - * @return array|null - * @throws \HpsException - * @throws \HpsGatewayException - */ - private function _submitTransaction($transaction, $txnType) - { - - try { - $response = $this->doRequest($transaction); - } catch (HpsException $e) { - if ($e->innerException != null && $e->innerException->getMessage() == 'gateway_time-out') { - throw new HpsException('An error occurred and the gateway has timed out', 'gateway_timeout', $e, 'gateway_timeout'); - } - throw $e; - } - - $this->_processGatewayResponse($response, $txnType); - - $rvalue = null; - switch ($txnType) { - case 'GetAttachments': - $rvalue = HpsAttachment::fromDict($response, $txnType); - break; - default: - break; - } - - return $rvalue; - } - - /** - * @param SimpleXMLElement $response raw XML response - * @param string $expectedType - * @throws HpsAuthenticationException - * @throws HpsGatewayException - * @throws null - */ - private function _processGatewayResponse($response, $expectedType) - { - $gatewayRspCode = (isset($response->Header->GatewayRspCode) ? $response->Header->GatewayRspCode : null); - $transactionId = (isset($response->Header->GatewayTxnId) ? (float)$response->Header->GatewayTxnId : null); - - if ($gatewayRspCode == '0') { - return; - } - - if ($gatewayRspCode == '3') { - throw new HpsGatewayException( - HpsExceptionCodes::GATEWAY_ERROR, - 'Image could not be retrieved for ' . $transactionId, - null, - null, - null, - $transactionId - ); - } - - HpsGatewayResponseValidation::checkResponse($response, $expectedType); - } -} \ No newline at end of file diff --git a/classes/includes/src/Services/Gateway/HpsBatchService.php b/classes/includes/src/Services/Gateway/HpsBatchService.php deleted file mode 100644 index 6a2e1bd..0000000 --- a/classes/includes/src/Services/Gateway/HpsBatchService.php +++ /dev/null @@ -1,43 +0,0 @@ -createElement('hps:Transaction'); - $hpsBatchClose = $xml->createElement('hps:BatchClose'); - $hpsTransaction->appendChild($hpsBatchClose); - - $response = $this->doRequest($hpsTransaction); - HpsGatewayResponseValidation::checkResponse($response, 'BatchClose'); - - //Process the response - $batchClose = $response->Transaction->BatchClose; - $result = new HpsBatch(); - $result->id = (isset($batchClose->BatchId) ? $batchClose->BatchId : null); - $result->sequenceNumber = (isset($batchClose->BatchSeqNbr) ? $batchClose->BatchSeqNbr : null); - $result->totalAmount = (isset($batchClose->TotalAmt) ? $batchClose->TotalAmt : null); - $result->transactionCount = (isset($batchClose->TxnCnt) ? $batchClose->TxnCnt : null); - - return $result; - } -} diff --git a/classes/includes/src/Services/Gateway/HpsCentinelGatewayService.php b/classes/includes/src/Services/Gateway/HpsCentinelGatewayService.php deleted file mode 100644 index a1409c9..0000000 --- a/classes/includes/src/Services/Gateway/HpsCentinelGatewayService.php +++ /dev/null @@ -1,70 +0,0 @@ - $this->_config->version, - 'ProcessorId' => $this->_config->processorId, - 'MerchantId' => $this->_config->merchantId, - 'TransactionPwd' => $this->_config->transactionPwd, - )); - - $xml = new DOMDocument('1.0', 'utf-8'); - $envelope = $xml->createElement('CardinalMPI'); - foreach ($request as $k => $v) { - $envelope->appendChild($xml->createElement($k, $v)); - } - $xml->appendChild($envelope); - - $url = $this->_config->serviceUri(); - $xmlData = $xml->saveXML(); - $data = 'cmpi_msg=' . urlencode($xmlData); - $header = array( - 'Content-type: application/x-www-form-urlencoded;charset="utf-8"', - 'Accept: text/xml', - 'Content-length: '.strlen($data), - ); - // error_log($xmlData); - - return $this->submitRequest($url, $header, $data); - } - /** - * @param $curlResponse - * @param $curlInfo - * @param $curlError - * - * @return \SimpleXMLElement - * @throws \HpsException - */ - public function processResponse($curlResponse, $curlInfo, $curlError) - { - // error_log($curlResponse); - switch ($curlInfo['http_code']) { - case '200': - return simplexml_load_string($curlResponse); - break; - case '500': - $faultString = ''; - throw new HpsException($faultString); - break; - default: - throw new HpsException('Unexpected response'); - break; - } - } -} diff --git a/classes/includes/src/Services/Gateway/HpsCheckService.php b/classes/includes/src/Services/Gateway/HpsCheckService.php deleted file mode 100644 index dba9535..0000000 --- a/classes/includes/src/Services/Gateway/HpsCheckService.php +++ /dev/null @@ -1,179 +0,0 @@ -NOTE: The Portico Gateway supports both GETI and HPS Colonnade for processing check transactions. While - * the available services are the same regardless of the check processor, the services may have different behaviors. - * For example, GETI-processed Check Sale transactions support the ability to override a Check Sale transaction - * already presented as well as the ability to verify a check. - * - * @param \HpsCheck|string $check The Check information. - * @param string $amount The amount of the sale. - * - * @param null $clientTransactionId - * - * @return \HpsCheckResponse - * @throws \HpsInvalidRequestException - * @internal param string $action Type of Check Action (Sale, Return, Override) - */ - public function sale(HpsCheck $check, $amount, $clientTransactionId = null) - { - return $this->_buildTransaction('SALE', $check, $amount, $clientTransactionId); - } - /** - * @param \HpsCheck $check - * @param $amount - * @param null $clientTransactionId - * - * @return mixed - * @throws \HpsException - * @throws \HpsInvalidRequestException - */ - public function returnCheck(HpsCheck $check, $amount, $clientTransactionId = null) - { - //TODO: implement replacement - throw new HpsException('Check action RETURN not currently supported'); - return $this->_buildTransaction('RETURN', $check, $amount, $clientTransactionId); - } - /** - * @param \HpsCheck $check - * @param $amount - * @param null $clientTransactionId - * - * @return mixed - * @throws \HpsException - * @throws \HpsInvalidRequestException - */ - public function override(HpsCheck $check, $amount, $clientTransactionId = null) - { - //TODO: implement replacemen - throw new HpsException('Check action OVERRIDE not currently supported'); - return $this->_buildTransaction('OVERRIDE', $check, $amount, $clientTransactionId); - } - /** - * A Void transaction is used to cancel a previously successful sale transaction. The original sale transaction - * can be identified by the GatewayTxnid of the original or by the ClientTxnId of the original if provided on the - * original Sale Transaction. - * - * @param null $transactionId - * @param null $clientTransactionId - * - * @return mixed - * @throws \HpsCheckException - * @throws \HpsException - */ - public function void($transactionId = null, $clientTransactionId = null) - { - if (($transactionId == null && $clientTransactionId == null) || ($transactionId != null && $clientTransactionId != null)) { - throw new HpsException('Please provide either a transaction id or a client transaction id'); - } - - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsCheckVoid = $xml->createElement('hps:CheckVoid'); - $hpsBlock1 = $xml->createElement('hps:Block1'); - - if ($transactionId != null) { - $hpsBlock1->appendChild($xml->createElement('hps:GatewayTxnId', $transactionId)); - } else { - $hpsBlock1->appendChild($xml->createElement('hps:ClientTxnId', $clientTransactionId)); - } - - $hpsCheckVoid->appendChild($hpsBlock1); - $hpsTransaction->appendChild($hpsCheckVoid); - return $this->_submitTransaction($hpsTransaction, 'CheckVoid'); - } - /** - * @param $action - * @param \HpsCheck $check - * @param $amount - * @param null $clientTransactionId - * - * @return mixed - * @throws \HpsCheckException - * @throws \HpsInvalidRequestException - */ - private function _buildTransaction($action, HpsCheck $check, $amount, $clientTransactionId = null) - { - $amount = HpsInputValidation::checkAmount($amount); - - if ($check->secCode == HpsSECCode::CCD && - ($check->checkHolder == null || $check->checkHolder->checkName == null)) { - throw new HpsInvalidRequestException( - HpsExceptionCodes::MISSING_CHECK_NAME, - 'For SEC code CCD, the check name is required', - 'check_name' - ); - } - - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsCheckSale = $xml->createElement('hps:CheckSale'); - $hpsBlock1 = $xml->createElement('hps:Block1'); - - $hpsBlock1->appendChild($xml->createElement('hps:Amt', sprintf("%0.2f", round($amount, 3)))); - $hpsBlock1->appendChild($this->_hydrateCheckData($check, $xml)); - $hpsBlock1->appendChild($xml->createElement('hps:CheckAction', $action)); - $hpsBlock1->appendChild($xml->createElement('hps:SECCode', $check->secCode)); - if ($check->checkType != null) { - $hpsBlock1->appendChild($xml->createElement('hps:CheckType', $check->checkType)); - } - $hpsBlock1->appendChild($xml->createElement('hps:DataEntryMode', $check->dataEntryMode)); - if ($check->checkHolder != null) { - $hpsBlock1->appendChild($this->_hydrateConsumerInfo($check, $xml)); - } - - $hpsCheckSale->appendChild($hpsBlock1); - $hpsTransaction->appendChild($hpsCheckSale); - - return $this->_submitTransaction($hpsTransaction, 'CheckSale', $clientTransactionId); - } - /** - * @param $transaction - * @param $txnType - * @param null $clientTransactionId - * - * @return mixed - * @throws \HpsAuthenticationException - * @throws \HpsCheckException - * @throws \HpsGatewayException - * @throws null - */ - private function _submitTransaction($transaction, $txnType, $clientTransactionId = null) - { - $options = array(); - if ($clientTransactionId !== null) { - $options['clientTransactionId'] = $clientTransactionId; - } - $rsp = $this->doRequest($transaction, $options); - HpsGatewayResponseValidation::checkResponse($rsp, $txnType); - $response = HpsCheckResponse::fromDict($rsp, $txnType); - - if ($response->responseCode != 0) { - throw new HpsCheckException( - $rsp->Header->GatewayTxnId, - $response->details, - $response->responseCode, - $response->responseText - ); - } - - return $response; - } -} diff --git a/classes/includes/src/Services/Gateway/HpsCreditService.php b/classes/includes/src/Services/Gateway/HpsCreditService.php deleted file mode 100644 index a63ce3b..0000000 --- a/classes/includes/src/Services/Gateway/HpsCreditService.php +++ /dev/null @@ -1,710 +0,0 @@ -_currency = $currency; - $this->_amount = HpsInputValidation::checkAmount($amount); - - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsCreditAuth = $xml->createElement('hps:CreditAuth'); - $hpsBlock1 = $xml->createElement('hps:Block1'); - - $hpsBlock1->appendChild($xml->createElement('hps:AllowDup', 'Y')); - $hpsBlock1->appendChild($xml->createElement('hps:AllowPartialAuth', ($allowPartialAuth ? 'Y' : 'N'))); - $hpsBlock1->appendChild($xml->createElement('hps:Amt', $amount)); - //update convenienceAmtInfo if passed - if ($convenienceAmtInfo != null && $convenienceAmtInfo != '') { - $hpsBlock1->appendChild($xml->createElement('hps:ConvenienceAmtInfo', $convenienceAmtInfo)); - } - - //update shippingAmtInfo if passed - if ($shippingAmtInfo != null && $shippingAmtInfo != '') { - $hpsBlock1->appendChild($xml->createElement('hps:ShippingAmtInfo', $shippingAmtInfo)); - } - - if ($cardHolder != null) { - $hpsBlock1->appendChild($this->_hydrateCardHolderData($cardHolder, $xml)); - } - if ($details != null) { - $hpsBlock1->appendChild($this->_hydrateAdditionalTxnFields($details, $xml)); - } - if ($txnDescriptor != null && $txnDescriptor != '') { - $hpsBlock1->appendChild($xml->createElement('hps:TxnDescriptor', $txnDescriptor)); - } - - $cardData = $xml->createElement('hps:CardData'); - if ($cardOrToken instanceof HpsCreditCard) { - $cardData->appendChild($this->_hydrateManualEntry($cardOrToken, $xml)); - } else { - $cardData->appendChild($this->_hydrateTokenData($cardOrToken, $xml)); - } - $cardData->appendChild($xml->createElement('hps:TokenRequest', ($requestMultiUseToken) ? 'Y' : 'N')); - if ($cpcReq) { - $hpsBlock1->appendChild($xml->createElement('hps:CPCReq', 'Y')); - } - - $hpsBlock1->appendChild($cardData); - $hpsCreditAuth->appendChild($hpsBlock1); - $hpsTransaction->appendChild($hpsCreditAuth); - - return $this->_submitTransaction($hpsTransaction, 'CreditAuth', (isset($details->clientTransactionId) ? $details->clientTransactionId : null), $cardOrToken); - } - /** - * @param $transactionId - * @param null $amount - * @param null $gratuity - * @param null $clientTransactionId - * @param null $directMarketData - * - * @return array|null - * @throws \HpsArgumentException - * @throws \HpsGatewayException - */ - public function capture($transactionId, $amount = null, $gratuity = null, $clientTransactionId = null, $directMarketData = null) - { - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsCreditAddToBatch = $xml->createElement('hps:CreditAddToBatch'); - - $hpsCreditAddToBatch->appendChild($xml->createElement('hps:GatewayTxnId', $transactionId)); - if ($amount != null) { - $amount = sprintf("%0.2f", round($amount, 3)); - $hpsCreditAddToBatch->appendChild($xml->createElement('hps:Amt', $amount)); - } - if ($gratuity != null) { - $hpsCreditAddToBatch->appendChild($xml->createElement('hps:GratuityAmtInfo', $gratuity)); - } - - if ($directMarketData != null && $directMarketData->invoiceNumber != null) { - $hpsCreditAddToBatch->appendChild($this->_hydrateDirectMarketData($directMarketData, $xml)); - } - - $hpsTransaction->appendChild($hpsCreditAddToBatch); - $options = array(); - if ($clientTransactionId != null) { - $options['clientTransactionId'] = $clientTransactionId; - } - $response = $this->doRequest($hpsTransaction, $options); - $this->_processChargeGatewayResponse($response, 'CreditAddToBatch'); - - return $this->get($transactionId); - } - /** - * @param $amount - * @param $currency - * @param $cardOrToken - * @param null $cardHolder - * @param bool $requestMultiUseToken - * @param null $details - * @param null $txnDescriptor - * @param bool $allowPartialAuth - * @param bool $cpcReq - * @param null $directMarketData - * @param null $convenienceAmtInfo - * @param null $shippingAmtInfo - * - * @return array|null - * @throws \HpsException - * @throws \HpsGatewayException - * @throws \HpsInvalidRequestException - */ - public function charge($amount, $currency, $cardOrToken, $cardHolder = null, $requestMultiUseToken = false, $details = null, $txnDescriptor = null, $allowPartialAuth = false, $cpcReq = false, $directMarketData = null, $convenienceAmtInfo = null, $shippingAmtInfo = null) - { - HpsInputValidation::checkCurrency($currency); - $this->_currency = $currency; - $this->_amount = HpsInputValidation::checkAmount($amount); - - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsCreditSale = $xml->createElement('hps:CreditSale'); - $hpsBlock1 = $xml->createElement('hps:Block1'); - - $hpsBlock1->appendChild($xml->createElement('hps:AllowDup', 'Y')); - $hpsBlock1->appendChild($xml->createElement('hps:AllowPartialAuth', ($allowPartialAuth ? 'Y' : 'N'))); - $hpsBlock1->appendChild($xml->createElement('hps:Amt', $amount)); - //update convenienceAmtInfo if passed - if ($convenienceAmtInfo != null && $convenienceAmtInfo != '') { - $hpsBlock1->appendChild($xml->createElement('hps:ConvenienceAmtInfo', $convenienceAmtInfo)); - } - - //update shippingAmtInfo if passed - if ($shippingAmtInfo != null && $shippingAmtInfo != '') { - $hpsBlock1->appendChild($xml->createElement('hps:ShippingAmtInfo', $shippingAmtInfo)); - } - if ($cardHolder != null) { - $hpsBlock1->appendChild($this->_hydrateCardHolderData($cardHolder, $xml)); - } - if ($details != null) { - $hpsBlock1->appendChild($this->_hydrateAdditionalTxnFields($details, $xml)); - } - if ($txnDescriptor != null && $txnDescriptor != '') { - $hpsBlock1->appendChild($xml->createElement('hps:TxnDescriptor', $txnDescriptor)); - } - - $cardData = $xml->createElement('hps:CardData'); - if ($cardOrToken instanceof HpsCreditCard) { - $cardData->appendChild($this->_hydrateManualEntry($cardOrToken, $xml)); - } else { - $cardData->appendChild($this->_hydrateTokenData($cardOrToken, $xml)); - } - if ($cpcReq) { - $hpsBlock1->appendChild($xml->createElement('hps:CPCReq', 'Y')); - } - $cardData->appendChild($xml->createElement('hps:TokenRequest', ($requestMultiUseToken) ? 'Y' : 'N')); - - if ($directMarketData != null && $directMarketData->invoiceNumber != null) { - $hpsBlock1->appendChild($this->_hydrateDirectMarketData($directMarketData, $xml)); - } - - $hpsBlock1->appendChild($cardData); - $hpsCreditSale->appendChild($hpsBlock1); - $hpsTransaction->appendChild($hpsCreditSale); - - return $this->_submitTransaction($hpsTransaction, 'CreditSale', (isset($details->clientTransactionId) ? $details->clientTransactionId : null), $cardOrToken); - } - /** - * @param $schedule - * @param $amount - * @param $cardOrTokenOrPMKey - * @param null $cardHolder - * @param bool $oneTime - * @param null $details - * - * @return array|null - * @throws \HpsException - * @throws \HpsGatewayException - * @throws \HpsInvalidRequestException - */ - public function recurring($schedule, $amount, $cardOrTokenOrPMKey, $cardHolder = null, $oneTime = false, $details = null) - { - $this->_amount = HpsInputValidation::checkAmount($amount); - - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsRecurringBilling = $xml->createElement('hps:RecurringBilling'); - $hpsBlock1 = $xml->createElement('hps:Block1'); - - $hpsBlock1->appendChild($xml->createElement('hps:AllowDup', 'Y')); - $hpsBlock1->appendChild($xml->createElement('hps:Amt', $amount)); - if ($cardHolder != null) { - $hpsBlock1->appendChild($this->_hydrateCardHolderData($cardHolder, $xml)); - } - if ($details != null) { - $hpsBlock1->appendChild($this->_hydrateAdditionalTxnFields($details, $xml)); - } - - if ($cardOrTokenOrPMKey instanceof HpsCreditCard) { - $cardData = $xml->createElement('hps:CardData'); - $cardData->appendChild($this->_hydrateManualEntry($cardOrTokenOrPMKey, $xml)); - $hpsBlock1->appendChild($cardData); - } else if ($cardOrTokenOrPMKey instanceof HpsTokenData) { - $cardData = $xml->createElement('hps:CardData'); - $cardData->appendChild($this->_hydrateTokenData($cardOrTokenOrPMKey, $xml)); - $hpsBlock1->appendChild($cardData); - } else { - $hpsBlock1->appendChild($xml->createElement('hps:PaymentMethodKey', $cardOrTokenOrPMKey)); - } - - $id = $schedule; - if ($schedule instanceof HpsPayPlanSchedule) { - $id = $schedule->scheduleIdentifier; - } - $recurringData = $xml->createElement('hps:RecurringData'); - $recurringData->appendChild($xml->createElement('hps:ScheduleID', $id)); - $recurringData->appendChild($xml->createElement('hps:OneTime', ($oneTime ? 'Y' : 'N'))); - - $hpsBlock1->appendChild($recurringData); - $hpsRecurringBilling->appendChild($hpsBlock1); - $hpsTransaction->appendChild($hpsRecurringBilling); - - return $this->_submitTransaction($hpsTransaction, 'RecurringBilling', (isset($details->clientTransactionId) ? $details->clientTransactionId : null), $cardOrTokenOrPMKey); - } - /** - * @param $transactionId - * @param $cpcData - * - * @return array|null - * @throws \HpsException - * @throws \HpsGatewayException - */ - public function cpcEdit($transactionId, $cpcData) - { - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsPosCreditCPCEdit = $xml->createElement('hps:CreditCPCEdit'); - $hpsPosCreditCPCEdit->appendChild($xml->createElement('hps:GatewayTxnId', $transactionId)); - $hpsPosCreditCPCEdit->appendChild($this->_hydrateCPCData($cpcData, $xml)); - $hpsTransaction->appendChild($hpsPosCreditCPCEdit); - - return $this->_submitTransaction($hpsTransaction, 'CreditCPCEdit'); - } - /** - * @param $transactionId - * @param null $amount - * @param null $gratuity - * @param null $clientTransactionId - * - * @return array|null - * @throws \HpsException - * @throws \HpsGatewayException - */ - public function edit($transactionId, $amount = null, $gratuity = null, $clientTransactionId = null) - { - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsCreditTxnEdit = $xml->createElement('hps:CreditTxnEdit'); - - $hpsCreditTxnEdit->appendChild($xml->createElement('hps:GatewayTxnId', $transactionId)); - if ($amount != null) { - $amount = sprintf('%0.2f', round($amount, 3)); - $hpsCreditTxnEdit->appendChild($xml->createElement('hps:Amt', $amount)); - } - if ($gratuity != null) { - $hpsCreditTxnEdit->appendChild($xml->createElement('hps:GratuityAmtInfo', $gratuity)); - } - - $hpsTransaction->appendChild($hpsCreditTxnEdit); - $trans = $this->_submitTransaction($hpsTransaction, 'CreditTxnEdit', $clientTransactionId); - - $trans->responseCode = '00'; - $trans->responseText = ''; - - return $trans; - } - - /** builds soap transaction for Portico so that expiration dates can be updated for expired cards with a new current issuance - * @param string $tokenValue - * @param int $expMonth 1-12 padding will be handled automatically - * @param int $expYear must be 4 digits. - * - * @return \HpsManageTokensResponse - * @throws \HpsException - * @throws \HpsGatewayException - */ - public function updateTokenExpiration($tokenValue, $expMonth, $expYear) { - // new DOM - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsManageTokens = $xml->createElement('hps:ManageTokens'); - - $hpsManageTokens->appendChild($xml->createElement('hps:TokenValue', trim((string)$tokenValue))); - - $hpsTokenActions = $xml->createElement('hps:TokenActions'); - $hpsSet = $xml->createElement('hps:Set'); - $hpsAttribute = $xml->createElement('hps:Attribute'); - - $hpsAttribute->appendChild($xml->createElement('hps:Name', 'ExpMonth')); - $hpsAttribute->appendChild($xml->createElement('hps:Value', (string)sprintf("%'.02d", (int)$expMonth))); - - $hpsSet->appendChild($hpsAttribute); - - $hpsAttribute = $xml->createElement('hps:Attribute'); - - $hpsAttribute->appendChild($xml->createElement('hps:Name', 'ExpYear')); - $hpsAttribute->appendChild($xml->createElement('hps:Value', (string)$expYear)); - - $hpsSet->appendChild($hpsAttribute); - - $hpsTokenActions->appendChild($hpsSet); - - $hpsManageTokens->appendChild($hpsTokenActions); - - $hpsTransaction->appendChild($hpsManageTokens); - - return $this->_submitTransaction($hpsTransaction, 'ManageTokens'); - } - /** - * @param $transactionId - * - * @return array|null - * @throws \HpsArgumentException - * @throws \HpsException - * @throws \HpsGatewayException - */ - public function get($transactionId) - { - if ($transactionId <= 0) { - throw new HpsArgumentException('Invalid Transaction Id',HpsExceptionCodes::INVALID_ORIGINAL_TRANSACTION); - } - - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsReportTxnDetail = $xml->createElement('hps:ReportTxnDetail'); - $hpsReportTxnDetail->appendChild($xml->createElement('hps:TxnId', $transactionId)); - $hpsTransaction->appendChild($hpsReportTxnDetail); - - return $this->_submitTransaction($hpsTransaction, 'ReportTxnDetail'); - } - /** - * @param $startDate - * @param $endDate - * @param null $filterBy - * - * @return array|null - * @throws \HpsException - * @throws \HpsGatewayException - * @throws \HpsInvalidRequestException - */ - public function listTransactions($startDate, $endDate, $filterBy = null) - { - $this->_filterBy = $filterBy; - date_default_timezone_set("UTC"); - $dateFormat = 'Y-m-d\TH:i:s.00\Z'; - $current = new DateTime(); - $currentTime = $current->format($dateFormat); - - HpsInputValidation::checkDateNotFuture($startDate); - HpsInputValidation::checkDateNotFuture($endDate); - - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsReportActivity = $xml->createElement('hps:ReportActivity'); - $hpsReportActivity->appendChild($xml->createElement('hps:RptStartUtcDT', $startDate)); - $hpsReportActivity->appendChild($xml->createElement('hps:RptEndUtcDT', $endDate)); - $hpsTransaction->appendChild($hpsReportActivity); - - return $this->_submitTransaction($hpsTransaction, 'ReportActivity'); - } - /** - * @param $amount - * @param $currency - * @param $cardData - * @param null $cardHolder - * @param null $details - * - * @return array|null - * @throws \HpsException - * @throws \HpsGatewayException - * @throws \HpsInvalidRequestException - */ - public function refund($amount, $currency, $cardData, $cardHolder = null, $details = null) - { - HpsInputValidation::checkCurrency($currency); - $this->_currency = $currency; - $this->_amount = HpsInputValidation::checkAmount($amount); - - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsCreditReturn = $xml->createElement('hps:CreditReturn'); - $hpsBlock1 = $xml->createElement('hps:Block1'); - - $hpsBlock1->appendChild($xml->createElement('hps:AllowDup', 'Y')); - $hpsBlock1->appendChild($xml->createElement('hps:Amt', $amount)); - if ($cardData instanceof HpsCreditCard) { - $cardDataElement = $xml->createElement('hps:CardData'); - $cardDataElement->appendChild($this->_hydrateManualEntry($cardData, $xml)); - $hpsBlock1->appendChild($cardDataElement); - } else if ($cardData instanceof HpsTokenData) { - $cardDataElement = $xml->createElement('hps:CardData'); - $cardDataElement->appendChild($this->_hydrateTokenData($cardData, $xml)); - $hpsBlock1->appendChild($cardDataElement); - } else { - $hpsBlock1->appendChild($xml->createElement('hps:GatewayTxnId', $cardData)); - } - if ($cardHolder != null) { - $hpsBlock1->appendChild($this->_hydrateCardHolderData($cardHolder, $xml)); - } - if ($details != null) { - $hpsBlock1->appendChild($this->_hydrateAdditionalTxnFields($details, $xml)); - } - - $hpsCreditReturn->appendChild($hpsBlock1); - $hpsTransaction->appendChild($hpsCreditReturn); - - return $this->_submitTransaction($hpsTransaction, 'CreditReturn', (isset($details->clientTransactionId) ? $details->clientTransationId : null)); - } - /** - * @param HpsCreditCard|HpsTokenData|int $cardData GatewayTxnId - * @param float $amount - * @param string $currency - * @param null|HpsTransactionDetails $details - * @param null|float $authAmount - * @return HpsReversal - * @throws HpsException - * @throws HpsGatewayException - * @throws HpsInvalidRequestException - */ - public function reverse($cardData, $amount, $currency, $details = null, $authAmount = null) - { - HpsInputValidation::checkCurrency($currency); - $this->_currency = $currency; - $this->_amount = HpsInputValidation::checkAmount($amount); - - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsCreditReversal = $xml->createElement('hps:CreditReversal'); - $hpsBlock1 = $xml->createElement('hps:Block1'); - - $hpsBlock1->appendChild($xml->createElement('hps:Amt', $amount)); - if ($authAmount !== null){ - $hpsBlock1->appendChild($xml->createElement('hps:AuthAmt', HpsInputValidation::checkAmount($authAmount))); - } - $cardDataElement = null; - if ($cardData instanceof HpsCreditCard) { - $cardDataElement = $xml->createElement('hps:CardData'); - $cardDataElement->appendChild($this->_hydrateManualEntry($cardData, $xml)); - } else if ($cardData instanceof HpsTokenData) { - $cardDataElement = $xml->createElement('hps:CardData'); - $cardDataElement->appendChild($this->_hydrateTokenData($cardData, $xml)); - } else { - $cardDataElement = $xml->createElement('hps:GatewayTxnId', $cardData); - } - $hpsBlock1->appendChild($cardDataElement); - if ($details != null) { - $hpsBlock1->appendChild($this->_hydrateAdditionalTxnFields($details, $xml)); - } - - $hpsCreditReversal->appendChild($hpsBlock1); - $hpsTransaction->appendChild($hpsCreditReversal); - - return $this->_submitTransaction($hpsTransaction, 'CreditReversal', (isset($details->clientTransactionId) ? $details->clientTransactionId : null)); - } - /** - * @param $cardOrToken - * @param null $cardHolder - * @param bool $requestMultiUseToken - * @param null $clientTransactionId - * - * @return array|null - * @throws \HpsException - * @throws \HpsGatewayException - */ - public function verify($cardOrToken, $cardHolder = null, $requestMultiUseToken = false, $clientTransactionId = null) - { - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsCreditAccountVerify = $xml->createElement('hps:CreditAccountVerify'); - $hpsBlock1 = $xml->createElement('hps:Block1'); - - if ($cardHolder != null) { - $hpsBlock1->appendChild($this->_hydrateCardHolderData($cardHolder, $xml)); - } - - $cardData = $xml->createElement('hps:CardData'); - if ($cardOrToken instanceof HpsCreditCard) { - $cardData->appendChild($this->_hydrateManualEntry($cardOrToken, $xml)); - } else { - $cardData->appendChild($this->_hydrateTokenData($cardOrToken, $xml)); - } - $cardData->appendChild($xml->createElement('hps:TokenRequest', ($requestMultiUseToken) ? 'Y' : 'N')); - - $hpsBlock1->appendChild($cardData); - $hpsCreditAccountVerify->appendChild($hpsBlock1); - $hpsTransaction->appendChild($hpsCreditAccountVerify); - - return $this->_submitTransaction($hpsTransaction, 'CreditAccountVerify', $clientTransactionId); - } - /** - * @param $transactionId - * @param null $clientTransactionId - * - * @return array|null - * @throws \HpsException - * @throws \HpsGatewayException - */ - public function void($transactionId, $clientTransactionId = null) - { - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsCreditVoid = $xml->createElement('hps:CreditVoid'); - $hpsCreditVoid->appendChild($xml->createElement('hps:GatewayTxnId', $transactionId)); - $hpsTransaction->appendChild($hpsCreditVoid); - - return $this->_submitTransaction($hpsTransaction, 'CreditVoid', $clientTransactionId); - } - /** - * @param $response - * @param $expectedType - * - * @throws \HpsAuthenticationException - * @throws \HpsGatewayException - * @throws null - */ - private function _processChargeGatewayResponse($response, $expectedType) - { - $gatewayRspCode = (isset($response->Header->GatewayRspCode) ? $response->Header->GatewayRspCode : null); - $transactionId = (isset($response->Header->GatewayTxnId) ? $response->Header->GatewayTxnId : null); - - if ($gatewayRspCode == '0') { - return; - } - - if ($gatewayRspCode == '30') { - try { - $this->reverse($transactionId, $this->_amount, $this->_currency); - } catch (Exception $e) { - throw new HpsGatewayException( - HpsExceptionCodes::GATEWAY_TIMEOUT_REVERSAL_ERROR, - 'Error occurred while reversing a charge due to HPS gateway timeout', - $e, - null, - null, - $transactionId - ); - } - } - - HpsGatewayResponseValidation::checkResponse($response, $expectedType); - } - /** - * @param $response - * @param $expectedType - * - * @throws \HpsCreditException - * @throws null - */ - private function _processChargeIssuerResponse($response, $expectedType) - { - $transactionId = (isset($response->Header->GatewayTxnId) ? $response->Header->GatewayTxnId : null); - $item = $response->Transaction->$expectedType; - - if ($item != null) { - $responseCode = (isset($item->RspCode) ? $item->RspCode : null); - $responseText = (isset($item->RspText) ? $item->RspText : null); - - if ($responseCode != null) { - // check if we need to do a reversal - if ($responseCode == '91') { - try { - $this->reverse($transactionId, $this->_amount, $this->_currency); - } catch (HpsGatewayException $e) { - // if the transaction wasn't found; throw the original timeout exception - if ($e->details->gatewayResponseCode == 3) { - HpsIssuerResponseValidation::checkResponse($transactionId, $responseCode, $responseText); - } - throw new HpsCreditException( - $transactionId, - HpsExceptionCodes::ISSUER_TIMEOUT_REVERSAL_ERROR, - 'Error occurred while reversing a charge due to HPS issuer timeout', - $e - ); - } catch (HpsException $e) { - throw new HpsCreditException( - $transactionId, - HpsExceptionCodes::ISSUER_TIMEOUT_REVERSAL_ERROR, - 'Error occurred while reversing a charge due to HPS issuer timeout', - $e - ); - } - } - HpsIssuerResponseValidation::checkResponse($transactionId, $responseCode, $responseText); - } - } - } - - /** - * @param $transaction - * @param $txnType - * @param null $clientTxnId - * @param null $cardData - * - * @return array|null - * @throws \HpsCreditException - * @throws \HpsException - * @throws \HpsGatewayException - */ - private function _submitTransaction($transaction, $txnType, $clientTxnId = null, $cardData = null) - { - $options = array(); - if ($clientTxnId != null) { - $options['clientTransactionId'] = $clientTxnId; - } - - try { - $response = $this->doRequest($transaction, $options); - } catch (HpsException $e) { - if ($e->innerException != null && $e->innerException->getMessage() == 'gateway_time-out') { - if (in_array($txnType, array('CreditSale', 'CreditAuth'))) { - try { - $this->reverse($cardData, $this->_amount, $this->_currency); - } catch (Exception $e) { - throw new HpsGatewayException('0', HpsExceptionCodes::GATEWAY_TIMEOUT_REVERSAL_ERROR); - } - } - throw new HpsException('An error occurred and the gateway has timed out', 'gateway_timeout', $e, 'gateway_timeout'); - } - throw $e; - } - - $this->_processChargeGatewayResponse($response, $txnType); - $this->_processChargeIssuerResponse($response, $txnType); - - $rvalue = null; - switch ($txnType) { - case 'ReportTxnDetail': - $rvalue = HpsReportTransactionDetails::fromDict($response, $txnType); - break; - case 'ReportActivity': - $rvalue = HpsReportTransactionSummary::fromDict($response, $txnType, $this->_filterBy); - break; - case 'CreditSale': - $rvalue = HpsCharge::fromDict($response, $txnType); - break; - case 'CreditAccountVerify': - $rvalue = HpsAccountVerify::fromDict($response, $txnType); - break; - case 'CreditAuth': - $rvalue = HpsAuthorization::fromDict($response, $txnType); - break; - case 'CreditReturn': - $rvalue = HpsRefund::fromDict($response, $txnType); - break; - case 'CreditReversal': - $rvalue = HpsReversal::fromDict($response, $txnType); - break; - case 'CreditVoid': - $rvalue = HpsVoid::fromDict($response, $txnType); - break; - case 'CreditCPCEdit': - $rvalue = HpsCPCEdit::fromDict($response, $txnType); - break; - case 'CreditTxnEdit': - $rvalue = HpsTransaction::fromDict($response, $txnType); - break; - case 'RecurringBilling': - $rvalue = HpsRecurringBilling::fromDict($response, $txnType); - break; - case 'ManageTokens': - $rvalue = HpsManageTokensResponse::fromDict($response); - break; - default: - break; - } - - return $rvalue; - } -} diff --git a/classes/includes/src/Services/Gateway/HpsDebitService.php b/classes/includes/src/Services/Gateway/HpsDebitService.php deleted file mode 100644 index 800b622..0000000 --- a/classes/includes/src/Services/Gateway/HpsDebitService.php +++ /dev/null @@ -1,346 +0,0 @@ -createElement('hps:Transaction'); - $hpsGiftCard = $xml->createElement('hps:DebitAddValue'); - $hpsBlock1 = $xml->createElement('hps:Block1'); - - $hpsBlock1->appendChild($xml->createElement('hps:TrackData', $trackData)); - $hpsBlock1->appendChild($xml->createElement('hps:AllowDup', ($allowDuplicates ? 'Y' : 'N'))); - if ($cardHolder != null) { - $hpsBlock1->appendChild($this->_hydrateCardHolderData($cardHolder, $xml)); - } - $hpsBlock1->appendChild($xml->createElement('hps:Amt', $amount)); - $hpsBlock1->appendChild($xml->createElement('hps:PinBlock', $pinBlock)); - if ($encryptionData != null) { - $hpsBlock1->appendChild($this->_hydrateEncryptionData($encryptionData, $xml)); - } - if ($details != null) { - $hpsBlock1->appendChild($this->_hydrateAdditionalTxnFields($details, $xml)); - } - - $hpsGiftCard->appendChild($hpsBlock1); - $hpsTransaction->appendChild($hpsGiftCard); - - return $this->_submitTransaction($hpsTransaction, 'DebitAddValue', $clientTransactionId); - } - - /** - * A Debit Return transaction returns funds to the cardholder. The transaction is generally used as a - * counterpart to a Debit Charge transaction that needs to be reversed. The Debit Return transaction is - * placed in the current open batch. If a batch is not open, this transaction create an open batch. - * - * @param string $transactionId The gateway transaciton ID of the charge to be returned. - * @param double $amount Authorization amount. - * @param string $trackData Track data read from the card by the card reader. - * @param string $pinBlock PIN block. - * @param bool $allowDuplicates Indicates whether to allow duplicate transactions. - * @param HpsCardHolder $cardHolder Card holder information. - * @param HpsEncryptionData $encryptionData E3 encryption data group. - * @param HpsTransactionDetails $details Group containing additional transaction fields to be included in detail reporting. - * @param string $clientTransactionId Optional client transaction ID. - * - * @return HpsDebitReturn The Return (Authorization) results. - */ - public function returnDebit($transactionId, $amount, $trackData, $pinBlock, $allowDuplicates = false, HpsCardHolder $cardHolder = null, HpsEncryptionData $encryptionData = null, HpsTransactionDetails $details = null, $clientTransactionId = null) - { - HpsInputValidation::checkAmount($amount); - - /* Build the transaction request. */ - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsGiftCard = $xml->createElement('hps:DebitReturn'); - $hpsBlock1 = $xml->createElement('hps:Block1'); - - $hpsBlock1->appendChild($xml->createElement('hps:TrackData', $trackData)); - $hpsBlock1->appendChild($xml->createElement('hps:AllowDup', ($allowDuplicates ? 'Y' : 'N'))); - if ($cardHolder != null) { - $hpsBlock1->appendChild($this->_hydrateCardHolderData($cardHolder, $xml)); - } - $hpsBlock1->appendChild($xml->createElement('hps:Amt', $amount)); - $hpsBlock1->appendChild($xml->createElement('hps:PinBlock', $pinBlock)); - if ($encryptionData != null) { - $hpsBlock1->appendChild($this->_hydrateEncryptionData($encryptionData, $xml)); - } - if ($details != null) { - $hpsBlock1->appendChild($this->_hydrateAdditionalTxnFields($details, $xml)); - } - - $hpsGiftCard->appendChild($hpsBlock1); - $hpsTransaction->appendChild($hpsGiftCard); - - return $this->_submitTransaction($hpsTransaction, 'DebitReturn', $clientTransactionId); - } - - /** - * A Debit Reversal transaction reverses a Debit Charge or Debit Return transaction. - * - * @param string $transactionId The gateway transaciton ID of the charge to be reversed. - * @param double $amount Authorization amount. - * @param string $trackData Track data read from the card by the card reader. - * @param double $authorizedAmount Settlement amount or New Authorization amount after reversal occures. - * @param HpsEncryptionData $encryptionData E3 encryption data group. - * @param HpsTransactionDetails $details Group containing additional transaction fields to be included in detail reporting. - * @param string $clientTransactionId Optional client transaction ID. - * - * @return HpsDebitReversal The reversal result. - */ - public function reverse($transactionId, $amount, $trackData, $authorizedAmount = null, HpsEncryptionData $encryptionData = null, HpsTransactionDetails $details = null, $clientTransactionId = null) - { - HpsInputValidation::checkAmount($amount); - - /* Build the transaction request. */ - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsGiftCard = $xml->createElement('hps:DebitReversal'); - $hpsBlock1 = $xml->createElement('hps:Block1'); - - $hpsBlock1->appendChild($xml->createElement('hps:GatewayTxnId', $transactionId)); - $hpsBlock1->appendChild($xml->createElement('hps:TrackData', $trackData)); - $hpsBlock1->appendChild($xml->createElement('hps:Amt', $amount)); - if ($encryptionData != null) { - $hpsBlock1->appendChild($this->_hydrateEncryptionData($encryptionData, $xml)); - } - if ($details != null) { - $hpsBlock1->appendChild($this->_hydrateAdditionalTxnFields($details, $xml)); - } - - - if (isset($authorizedAmount)) { - $hpsBlock1->appendChild($xml->createElement('hps:authAmt', $authorizedAmount)); - $hpsBlock1->appendChild($xml->createElement('hps:authAmtSpecified', true)); - } - - $hpsGiftCard->appendChild($hpsBlock1); - $hpsTransaction->appendChild($hpsGiftCard); - - $rsp = $this->_submitTransaction($hpsTransaction, 'DebitReversal', $clientTransactionId); - $rsp->responseCode = '00'; - $rsp->responseText = ''; - - return $rsp; - } - - /** - * A Debit Charge transaction performs a sale purchased with a Debit Card. The Debit Charge is placed - * in the current open batch. If a batch is not open, this transaction creates an open batch. - * - * @param double $amount Authorization amount. - * @param string $currency Currency ("usd") - * @param string $trackData Track data read from the card by the card reader. - * @param string $pinBlock PIN block. - * @param HpsEncryptionData $encryptionData E3 encryption data group. - * @param bool $allowDuplicates Indicates whether to allow duplicate transactions. - * @param double $cashBackAmount Contains the portion of the amount that is cash back. - * @param bool $allowPartialAuth Indicate whether to allow partial authorization. - * @param HpsCardHolder $cardHolder Card holder information. - * @param HpsTransactionDetails $details Group containing additional transaction fields to be included in detail reporting. - * @param string $clientTransactionId Optional client transaction ID. - * - * @return HpsDebitSale The Debit Charge result. - */ - public function charge($amount, $currency, $trackData, $pinBlock, HpsEncryptionData $encryptionData = null, $allowDuplicates = false, $cashBackAmount = null, $allowPartialAuth = false, HpsCardHolder $cardHolder = null, HpsTransactionDetails $details = null, $clientTransactionId = null) - { - HpsInputValidation::checkAmount($amount); - HpsInputValidation::checkCurrency($currency); - - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsGiftCard = $xml->createElement('hps:DebitSale'); - $hpsBlock1 = $xml->createElement('hps:Block1'); - - $hpsBlock1->appendChild($xml->createElement('hps:TrackData', $trackData)); - $hpsBlock1->appendChild($xml->createElement('hps:AllowDup', ($allowDuplicates ? 'Y' : 'N'))); - if ($cardHolder != null) { - $hpsBlock1->appendChild($this->_hydrateCardHolderData($cardHolder, $xml)); - } - $hpsBlock1->appendChild($xml->createElement('hps:Amt', $amount)); - $hpsBlock1->appendChild($xml->createElement('hps:CashbackAmtInfo', isset($cashBackAmount) ? $cashBackAmount : 0)); - $hpsBlock1->appendChild($xml->createElement('hps:AllowPartialAuth', ($allowPartialAuth ? 'Y' : 'N'))); - $hpsBlock1->appendChild($xml->createElement('hps:PinBlock', $pinBlock)); - if ($encryptionData != null) { - $hpsBlock1->appendChild($this->_hydrateEncryptionData($encryptionData, $xml)); - } - if ($details != null) { - $hpsBlock1->appendChild($this->_hydrateAdditionalTxnFields($details, $xml)); - } - - $hpsGiftCard->appendChild($hpsBlock1); - $hpsTransaction->appendChild($hpsGiftCard); - - return $this->_submitTransaction($hpsTransaction, 'DebitSale', $clientTransactionId); - } - /** - * @param $response - * @param $expectedType - * - * @throws \HpsAuthenticationException - * @throws \HpsGatewayException - * @throws null - */ - private function _processChargeGatewayResponse($response, $expectedType) - { - $gatewayRspCode = (isset($response->Header->GatewayRspCode) ? $response->Header->GatewayRspCode : null); - $transactionId = (isset($response->Header->GatewayTxnId) ? $response->Header->GatewayTxnId : null); - - if ($gatewayRspCode == '0') { - return; - } - - if ($gatewayRspCode == '30') { - try { - $this->reverse($transactionId, $this->_amount, $this->_currency); - } catch (Exception $e) { - throw new HpsGatewayException( - HpsExceptionCodes::GATEWAY_TIMEOUT_REVERSAL_ERROR, - 'Error occurred while reversing a charge due to HPS gateway timeout', - $e, - null, - null, - $transactionId - ); - } - } - - HpsGatewayResponseValidation::checkResponse($response, $expectedType); - } - /** - * @param $response - * @param $expectedType - * - * @throws \HpsCreditException - * @throws null - */ - private function _processChargeIssuerResponse($response, $expectedType) - { - $transactionId = (isset($response->Header->GatewayTxnId) ? $response->Header->GatewayTxnId : null); - $item = $response->Transaction->$expectedType; - - if ($item != null) { - $responseCode = (isset($item->RspCode) ? $item->RspCode : null); - $responseText = (isset($item->RspText) ? $item->RspText : null); - - if ($responseCode != null) { - // check if we need to do a reversal - if ($responseCode == '91') { - try { - $this->reverse($transactionId, $this->_amount, $this->_currency); - } catch (HpsGatewayException $e) { - // if the transaction wasn't found; throw the original timeout exception - if ($e->details->gatewayResponseCode == 3) { - HpsIssuerResponseValidation::checkResponse($transactionId, $responseCode, $responseText); - } - throw new HpsCreditException( - $transactionId, - HpsExceptionCodes::ISSUER_TIMEOUT_REVERSAL_ERROR, - 'Error occurred while reversing a charge due to HPS issuer timeout', - $e - ); - } catch (HpsException $e) { - throw new HpsCreditException( - $transactionId, - HpsExceptionCodes::ISSUER_TIMEOUT_REVERSAL_ERROR, - 'Error occurred while reversing a charge due to HPS issuer timeout', - $e - ); - } - } - HpsIssuerResponseValidation::checkResponse($transactionId, $responseCode, $responseText); - } - } - } - /** - * @param $transaction - * @param $txnType - * @param null $clientTxnId - * @param null $cardData - * - * @return null - * @throws \HpsCreditException - * @throws \HpsException - * @throws \HpsGatewayException - */ - private function _submitTransaction($transaction, $txnType, $clientTxnId = null, $cardData = null) - { - $options = array(); - if ($clientTxnId !== null) { - $options['clientTransactionId'] = $clientTxnId; - } - - try { - $response = $this->doRequest($transaction, $options); - } catch (HpsException $e) { - if ($e->innerException != null && $e->innerException->getMessage() == 'gateway_time-out') { - if ($txnType == 'DebitSale') { - try { - $this->reverse($cardData, $this->_amount, $this->_currency); - } catch (Exception $e) { - throw new HpsGatewayException('0', HpsExceptionCodes::GATEWAY_TIMEOUT_REVERSAL_ERROR); - } - } - throw new HpsException('An error occurred and the gateway has timed out', 'gateway_timeout', $e, 'gateway_timeout'); - } - throw $e; - } - - $this->_processChargeGatewayResponse($response, $txnType); - $this->_processChargeIssuerResponse($response, $txnType); - - $rvalue = null; - switch ($txnType) { - case 'DebitSale': - $rvalue = HpsDebitSale::fromDict($response, $txnType); - break; - case 'DebitAddValue': - $rvalue = HpsDebitAddValue::fromDict($response, $txnType); - break; - case 'DebitReturn': - $rvalue = HpsDebitReturn::fromDict($response, $txnType); - break; - case 'DebitReversal': - $rvalue = HpsDebitReversal::fromDict($response, $txnType); - break; - default: - break; - } - - return $rvalue; - } -} diff --git a/classes/includes/src/Services/Gateway/HpsGiftCardService.php b/classes/includes/src/Services/Gateway/HpsGiftCardService.php deleted file mode 100644 index 87e89c2..0000000 --- a/classes/includes/src/Services/Gateway/HpsGiftCardService.php +++ /dev/null @@ -1,408 +0,0 @@ -createElement('hps:Transaction'); - $hpsGiftCard = $xml->createElement('hps:'.$txnType); - $hpsBlock1 = $xml->createElement('hps:Block1'); - - $hpsBlock1->appendChild($xml->createElement('hps:Amt', $amount)); - - if ( $giftCard instanceof HpsTokenData ) { - $cardData = new HpsGiftCard(); - $cardData->tokenValue = $giftCard->tokenValue; - } else { - $cardData = $giftCard; - } - $hpsBlock1->appendChild($this->_hydrateGiftCardData($cardData, $xml)); - - $hpsGiftCard->appendChild($hpsBlock1); - $hpsTransaction->appendChild($hpsGiftCard); - - return $this->_submitTransaction($hpsTransaction, $txnType); - } - /** - * @param $amount - * @param $currency - * @param $giftCard - * - * @return \HpsGiftCardAlias|string - * @throws \HpsInvalidRequestException - */ - public function addValue($amount, $currency, $giftCard) - { - HpsInputValidation::checkCurrency($currency); - $amount = HpsInputValidation::checkAmount($amount); - $txnType = 'GiftCardAddValue'; - - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsGiftCard = $xml->createElement('hps:'.$txnType); - $hpsBlock1 = $xml->createElement('hps:Block1'); - - $hpsBlock1->appendChild($xml->createElement('hps:Amt', $amount)); - - if ( $giftCard instanceof HpsTokenData ) { - $cardData = new HpsGiftCard(); - $cardData->tokenValue = $giftCard->tokenValue; - } else { - $cardData = $giftCard; - } - $hpsBlock1->appendChild($this->_hydrateGiftCardData($cardData, $xml)); - - $hpsGiftCard->appendChild($hpsBlock1); - $hpsTransaction->appendChild($hpsGiftCard); - - return $this->_submitTransaction($hpsTransaction, $txnType); - } - /** - * @param $action - * @param $giftCard - * @param $aliasStr - * - * @return \HpsGiftCardAlias|string - */ - public function alias($action, $giftCard, $aliasStr) - { - $txnType = 'GiftCardAlias'; - - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsGiftCardAlias = $xml->createElement('hps:'. $txnType); - $hpsBlock1 = $xml->createElement('hps:Block1'); - - $hpsBlock1->appendChild($xml->createElement('hps:Action', strtoupper($action))); - $hpsBlock1->appendChild($xml->createElement('hps:Alias', $aliasStr)); - - if ( $giftCard instanceof HpsTokenData ) { - $cardData = new HpsGiftCard(); - $cardData->tokenValue = $giftCard->tokenValue; - } else { - $cardData = $giftCard; - } - $hpsBlock1->appendChild($this->_hydrateGiftCardData($cardData, $xml)); - - $hpsGiftCardAlias->appendChild($hpsBlock1); - $hpsTransaction->appendChild($hpsGiftCardAlias); - - return $this->_submitTransaction($hpsTransaction, $txnType); - } - /** - * @param $giftCard - * - * @return \HpsGiftCardAlias|string - */ - public function balance($giftCard) - { - $txnType = 'GiftCardBalance'; - - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsGiftCard = $xml->createElement('hps:'. $txnType); - $hpsBlock1 = $xml->createElement('hps:Block1'); - - if ( $giftCard instanceof HpsTokenData ) { - $cardData = new HpsGiftCard(); - $cardData->tokenValue = $giftCard->tokenValue; - } else { - $cardData = $giftCard; - } - $hpsBlock1->appendChild($this->_hydrateGiftCardData($cardData, $xml)); - - $hpsGiftCard->appendChild($hpsBlock1); - $hpsTransaction->appendChild($hpsGiftCard); - - return $this->_submitTransaction($hpsTransaction, $txnType); - } - /** - * @param $giftCard - * - * @return \HpsGiftCardAlias|string - */ - public function deactivate($giftCard) - { - $txnType = 'GiftCardDeactivate'; - - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsGiftCard = $xml->createElement('hps:'. $txnType); - $hpsBlock1 = $xml->createElement('hps:Block1'); - - if ( $giftCard instanceof HpsTokenData ) { - $cardData = new HpsGiftCard(); - $cardData->tokenValue = $giftCard->tokenValue; - } else { - $cardData = $giftCard; - } - $hpsBlock1->appendChild($this->_hydrateGiftCardData($cardData, $xml)); - - $hpsGiftCard->appendChild($hpsBlock1); - $hpsTransaction->appendChild($hpsGiftCard); - - return $this->_submitTransaction($hpsTransaction, $txnType); - } - /** - * @param $oldGiftCard - * @param $newGiftCard - * - * @return \HpsGiftCardAlias|string - */ - public function replace($oldGiftCard, $newGiftCard) - { - $txnType = 'GiftCardReplace'; - - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsGiftCard = $xml->createElement('hps:'. $txnType); - $hpsBlock1 = $xml->createElement('hps:Block1'); - - $hpsBlock1->appendChild($this->_hydrateGiftCardData($oldGiftCard, $xml, 'OldCardData')); - $hpsBlock1->appendChild($this->_hydrateGiftCardData($newGiftCard, $xml, 'NewCardData')); - - $hpsGiftCard->appendChild($hpsBlock1); - $hpsTransaction->appendChild($hpsGiftCard); - - return $this->_submitTransaction($hpsTransaction, $txnType); - } - /** - * @param $giftCard - * @param $amount - * @param string $currency - * - * @return \HpsGiftCardAlias|string - * @throws \HpsInvalidRequestException - */ - public function reverse($giftCard, $amount, $currency = 'usd') - { - $txnType = 'GiftCardReversal'; - - HpsInputValidation::checkCurrency($currency); - $amount = HpsInputValidation::checkAmount($amount); - - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsGiftCard = $xml->createElement('hps:'. $txnType); - $hpsBlock1 = $xml->createElement('hps:Block1'); - - $hpsBlock1->appendChild($xml->createElement('hps:Amt', $amount)); - if ($giftCard instanceof HpsGiftCard) { - $hpsBlock1->appendChild($this->_hydrateGiftCardData($giftCard, $xml)); - } else if ( $giftCard instanceof HpsTokenData ) { - $cardData = new HpsGiftCard(); - $cardData->tokenValue = $giftCard->tokenValue; - } else { - $hpsBlock1->appendChild($xml->createElement('hps:GatewayTxnId', $giftCard)); - } - - $hpsGiftCard->appendChild($hpsBlock1); - $hpsTransaction->appendChild($hpsGiftCard); - - return $this->_submitTransaction($hpsTransaction, $txnType); - } - /** - * @param $giftCard - * @param $amount - * @param string $currency - * @param null $gratuity - * @param null $tax - * - * @return \HpsGiftCardAlias|string - * @throws \HpsInvalidRequestException - */ - public function reward($giftCard, $amount, $currency = 'usd', $gratuity = null, $tax = null) - { - $txnType = 'GiftCardReward'; - - HpsInputValidation::checkCurrency($currency); - $amount = HpsInputValidation::checkAmount($amount); - - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsGiftCard = $xml->createElement('hps:'. $txnType); - $hpsBlock1 = $xml->createElement('hps:Block1'); - - $hpsBlock1->appendChild($xml->createElement('hps:Amt', $amount)); - - if ( $giftCard instanceof HpsTokenData ) { - $cardData = new HpsGiftCard(); - $cardData->tokenValue = $giftCard->tokenValue; - } else { - $cardData = $giftCard; - } - $hpsBlock1->appendChild($this->_hydrateGiftCardData($cardData, $xml)); - - if (strtolower($currency) == 'usd' || $currency == 'points') { - $hpsBlock1->appendChild($xml->createElement('hps:Currency', (strtolower($currency) == 'usd' ? 'USD' : 'POINTS'))); - } - if ($gratuity != null) { - $hpsBlock1->appendChild($xml->createElement('hps:GratuityAmtInfo', $gratuity)); - } - if ($tax != null) { - $hpsBlock1->appendChild($xml->createElement('hps:TaxAmtInfo', $tax)); - } - - $hpsGiftCard->appendChild($hpsBlock1); - $hpsTransaction->appendChild($hpsGiftCard); - - return $this->_submitTransaction($hpsTransaction, $txnType); - } - /** - * @param $giftCard - * @param $amount - * @param string $currency - * @param null $gratuity - * @param null $tax - * - * @return \HpsGiftCardAlias|string - * @throws \HpsInvalidRequestException - */ - public function sale($giftCard, $amount, $currency = 'usd', $gratuity = null, $tax = null) - { - $txnType = 'GiftCardSale'; - - HpsInputValidation::checkCurrency($currency); - $amount = HpsInputValidation::checkAmount($amount); - - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsGiftCard = $xml->createElement('hps:'. $txnType); - $hpsBlock1 = $xml->createElement('hps:Block1'); - - $hpsBlock1->appendChild($xml->createElement('hps:Amt', $amount)); - - if ( $giftCard instanceof HpsTokenData ) { - $cardData = new HpsGiftCard(); - $cardData->tokenValue = $giftCard->tokenValue; - } else { - $cardData = $giftCard; - } - $hpsBlock1->appendChild($this->_hydrateGiftCardData($cardData, $xml)); - if (strtolower($currency) == 'usd' || $currency == 'points') { - $hpsBlock1->appendChild($xml->createElement('hps:Currency', (strtolower($currency) == 'usd' ? 'USD' : 'POINTS'))); - } - if ($gratuity != null) { - $hpsBlock1->appendChild($xml->createElement('hps:GratuityAmtInfo', $gratuity)); - } - if ($tax != null) { - $hpsBlock1->appendChild($xml->createElement('hps:TaxAmtInfo', $tax)); - } - - $hpsGiftCard->appendChild($hpsBlock1); - $hpsTransaction->appendChild($hpsGiftCard); - - return $this->_submitTransaction($hpsTransaction, $txnType); - } - /** - * @param $transactionId - * - * @return \HpsGiftCardAlias|string - */ - public function void($transactionId) - { - $txnType = 'GiftCardVoid'; - - $xml = new DOMDocument(); - $hpsTransaction = $xml->createElement('hps:Transaction'); - $hpsGiftCard = $xml->createElement('hps:'. $txnType); - $hpsBlock1 = $xml->createElement('hps:Block1'); - - $hpsBlock1->appendChild($xml->createElement('hps:GatewayTxnId', $transactionId)); - - $hpsGiftCard->appendChild($hpsBlock1); - $hpsTransaction->appendChild($hpsGiftCard); - - return $this->_submitTransaction($hpsTransaction, $txnType); - } - /** - * @param $transaction - * @param $txnType - * @param null $clientTxnId - * - * @return \HpsGiftCardAlias|string - * @throws \HpsAuthenticationException - * @throws \HpsCreditException - * @throws \HpsGatewayException - * @throws null - */ - private function _submitTransaction($transaction, $txnType, $clientTxnId = null) - { - $options = array(); - if ($clientTxnId != null) { - $options['clientTransactionId'] = $clientTxnId; - } - $response = $this->doRequest($transaction, $options); - - HpsGatewayResponseValidation::checkResponse($response, $txnType); - HpsIssuerResponseValidation::checkResponse( - $response->Header->GatewayTxnId, - $response->Transaction->$txnType->RspCode, - $response->Transaction->$txnType->RspText, - 'gift' - ); - - $rvalue = ''; - switch ($txnType) { - case 'GiftCardActivate': - $rvalue = HpsGiftCardActivate::fromDict($response, $txnType, 'HpsGiftCardActivate'); - break; - case 'GiftCardAddValue': - $rvalue = HpsGiftCardAddValue::fromDict($response, $txnType, 'HpsGiftCardAddValue'); - break; - case 'GiftCardAlias': - $rvalue = HpsGiftCardAlias::fromDict($response, $txnType, 'HpsGiftCardAlias'); - break; - case 'GiftCardBalance': - $rvalue = HpsGiftCardBalance::fromDict($response, $txnType, 'HpsGiftCardBalance'); - break; - case 'GiftCardDeactivate': - $rvalue = HpsGiftCardDeactivate::fromDict($response, $txnType, 'HpsGiftCardDeactivate'); - break; - case 'GiftCardReplace': - $rvalue = HpsGiftCardReplace::fromDict($response, $txnType, 'HpsGiftCardReplace'); - break; - case 'GiftCardReward': - $rvalue = HpsGiftCardReward::fromDict($response, $txnType, 'HpsGiftCardReward'); - break; - case 'GiftCardSale': - $rvalue = HpsGiftCardSale::fromDict($response, $txnType, 'HpsGiftCardSale'); - break; - case 'GiftCardVoid': - $rvalue = HpsGiftCardVoid::fromDict($response, $txnType, 'HpsGiftCardVoid'); - break; - case 'GiftCardReversal': - $rvalue = HpsGiftCardReversal::fromDict($response, $txnType, 'HpsGiftCardReversal'); - break; - default: - break; - } - - return $rvalue; - } -} diff --git a/classes/includes/src/Services/Gateway/HpsPayPlanService.php b/classes/includes/src/Services/Gateway/HpsPayPlanService.php deleted file mode 100644 index cd1d81b..0000000 --- a/classes/includes/src/Services/Gateway/HpsPayPlanService.php +++ /dev/null @@ -1,178 +0,0 @@ -customer = new HpsPayPlanCustomerService($config); - $this->paymentMethod = new HpsPayPlanPaymentMethodService($config); - $this->schedule = new HpsPayPlanScheduleService($config); - } - /** - * @param \HpsServicesConfig $config - */ - public function setServicesConfig(HpsServicesConfig $config) - { - $this->customer->setServicesConfig($config); - $this->paymentMethod->setServicesConfig($config); - $this->schedule->setServicesConfig($config); - } - - /// Customer methods - - /** - * @param \HpsPayPlanCustomer $customer - * - * @return mixed - */ - public function addCustomer(HpsPayPlanCustomer $customer) - { - return $this->customer->add($customer); - } - /** - * @param \HpsPayPlanCustomer $customer - * - * @return mixed - */ - public function editCustomer(HpsPayPlanCustomer $customer) - { - return $this->customer->edit($customer); - } - /** - * @param array $searchFields - * - * @return object - */ - public function findAllCustomers($searchFields = array()) - { - return $this->customer->findAll($searchFields); - } - /** - * @param $customer - * - * @return mixed - */ - public function getCustomer($customer) - { - return $this->customer->get($customer); - } - /** - * @param $customer - * @param bool $forceDelete - * - * @return mixed - */ - public function deleteCustomer($customer, $forceDelete = false) - { - return $this->customer->delete($customer, $forceDelete); - } - - /// PaymentMethod methods - - /** - * @param \HpsPayPlanPaymentMethod $paymentMethod - * - * @return mixed - */ - public function addPaymentMethod(HpsPayPlanPaymentMethod $paymentMethod) - { - return $this->paymentMethod->add($paymentMethod); - } - /** - * @param \HpsPayPlanPaymentMethod $paymentMethod - * - * @return mixed - */ - public function editPaymentMethod(HpsPayPlanPaymentMethod $paymentMethod) - { - return $this->paymentMethod->edit($paymentMethod); - } - /** - * @param array $searchFields - * - * @return object - */ - public function findAllPaymentMethods($searchFields = array()) - { - return $this->paymentMethod->findAll($searchFields); - } - /** - * @param $paymentMethod - * - * @return mixed - */ - public function getPaymentMethod($paymentMethod) - { - return $this->paymentMethod->get($paymentMethod); - } - /** - * @param $paymentMethod - * @param bool $forceDelete - * - * @return mixed - */ - public function deletePaymentMethod($paymentMethod, $forceDelete = false) - { - return $this->paymentMethod->delete($paymentMethod, $forceDelete); - } - - /// Schedule methods - - /** - * @param \HpsPayPlanSchedule $schedule - * - * @return mixed - */ - public function addSchedule(HpsPayPlanSchedule $schedule) - { - return $this->schedule->add($schedule); - } - /** - * @param \HpsPayPlanSchedule $schedule - * - * @return mixed - */ - public function editSchedule(HpsPayPlanSchedule $schedule) - { - return $this->schedule->edit($schedule); - } - /** - * @param array $searchFields - * - * @return object - */ - public function findAllSchedules($searchFields = array()) - { - return $this->schedule->findAll($searchFields); - } - /** - * @param $schedule - * - * @return mixed - */ - public function getSchedule($schedule) - { - return $this->schedule->get($schedule); - } - /** - * @param $schedule - * @param bool $forceDelete - * - * @return mixed - */ - public function deleteSchedule($schedule, $forceDelete = false) - { - return $this->schedule->delete($schedule, $forceDelete); - } -} diff --git a/classes/includes/src/Services/Gateway/HpsRestGatewayService.php b/classes/includes/src/Services/Gateway/HpsRestGatewayService.php deleted file mode 100644 index a7c866a..0000000 --- a/classes/includes/src/Services/Gateway/HpsRestGatewayService.php +++ /dev/null @@ -1,165 +0,0 @@ -limit = $limit; - $this->offset = $offset; - return $this; - } - /** - * @param $searchFields - * - * @return $this - */ - public function search($searchFields) - { - $this->searchFields = $searchFields; - return $this; - } - /** - * @param null $data - * @param array $options - * - * @return mixed - * @throws \HpsAuthenticationException - * @throws \HpsGatewayException - */ - protected function doRequest($data = null, $options = array()) - { - $endpoint = isset($options['endpoint']) ? $options['endpoint'] : ''; - $verb = isset($options['verb']) ? $options['verb'] : 'GET'; - $url = $this->_gatewayUrlForKey() . '/' . $endpoint; - - if (isset($this->limit) && isset($this->offset)) { - $paging = array( - 'limit' => $this->limit, - 'offset' => $this->offset, - ); - $url .= '?' . http_build_query($paging); - } - - if ($this->searchFields != null) { - $data = $this->searchFields; - } - - $encodedData = json_encode($data); - - $identity = array(); - if (isset($this->_config->siteId)) { - $identity[0] = 'SiteID='.$this->_config->siteId; - } - if (isset($this->_config->deviceId)) { - $identity[1] = 'DeviceID='.$this->_config->deviceId; - } - if (isset($this->_config->licenseId)) { - $identity[2] = 'LicenseID='.$this->_config->licenseId; - } - - $auth = isset($this->_config->username) - ? $this->_config->username.':'.$this->_config->password - : $this->_config->secretApiKey; - $header = array( - 'Authorization: Basic '.base64_encode($auth), - 'Content-Type: application/json; charset=utf-8', - 'Content-Length: '.strlen($encodedData), - ); - - if (isset($this->_config->username)) { - $header[] = 'HPS-Identity: '.implode(',', $identity); - } - $keyType = HpsServicesConfig::KEY_TYPE_SECRET; - // print "\n" . $encodedData; - return $this->submitRequest($url, $header, $encodedData, $verb, $keyType); - } - /** - * @param $curlResponse - * @param $curlInfo - * @param $curlError - * - * @return mixed - * @throws \HpsException - */ - protected function processResponse($curlResponse, $curlInfo, $curlError) - { - // print "\n" . $curlResponse; - $response = json_decode($curlResponse); - - switch ($curlInfo['http_code']) { - case '200': - case '204': - return $response; - break; - case '400': - throw new HpsException($response->error->message); - break; - default: - throw new HpsException('Unexpected response'); - break; - } - } - /** - * @param $result - * @param $type - * - * @return mixed - */ - protected function hydrateObject($result, $type) - { - return call_user_func(array($type, 'fromStdClass'), $result); - } - /** - * @param $resultSet - * @param $type - * - * @return object - */ - protected function hydrateSearchResults($resultSet, $type) - { - $results = array(); - foreach ($resultSet->results as $result) { - $results[] = $this->hydrateObject($result, $type); - } - unset($result); - - return (object)array( - 'offset' => $resultSet->offset, - 'limit' => $resultSet->limit, - 'total' => $resultSet->totalMatchingRecords, - 'results' => $results, - ); - } - /** - * @return string - */ - private function _gatewayUrlForKey() - { - if ($this->_config->secretApiKey != null && $this->_config->secretApiKey != "") { - if (strpos($this->_config->secretApiKey, '_cert_') !== false) { - return self::CERT_URL; - } else if (strpos($this->_config->secretApiKey, '_uat_') !== false) { - return self::UAT_URL; - } else { - return self::PROD_URL; - } - } else { - return $this->_config->soapServiceUri; - } - } -} diff --git a/classes/includes/src/Services/Gateway/HpsSoapGatewayService.php b/classes/includes/src/Services/Gateway/HpsSoapGatewayService.php deleted file mode 100644 index 81dfe22..0000000 --- a/classes/includes/src/Services/Gateway/HpsSoapGatewayService.php +++ /dev/null @@ -1,484 +0,0 @@ -createElement('soapenv:Envelope'); - $soapEnvelope->setAttribute('xmlns:soapenv', 'http://schemas.xmlsoap.org/soap/envelope/'); - $soapEnvelope->setAttribute('xmlns:hps', 'http://Hps.Exchange.PosGateway'); - - $soapBody = $xml->createElement('soapenv:Body'); - $hpsRequest = $xml->createElement('hps:PosRequest'); - - $hpsVersion = $xml->createElement('hps:Ver1.0'); - $hpsHeader = $xml->createElement('hps:Header'); - - if ($this->_config->secretApiKey != null && $this->_config->secretApiKey != "") { - $hpsHeader->appendChild($xml->createElement('hps:SecretAPIKey', trim($this->_config->secretApiKey))); - } else { - $hpsHeader->appendChild($xml->createElement('hps:SiteId', $this->_config->siteId)); - $hpsHeader->appendChild($xml->createElement('hps:DeviceId', $this->_config->deviceId)); - $hpsHeader->appendChild($xml->createElement('hps:LicenseId', $this->_config->licenseId)); - $hpsHeader->appendChild($xml->createElement('hps:UserName', $this->_config->username)); - $hpsHeader->appendChild($xml->createElement('hps:Password', $this->_config->password)); - } - if ($this->_config->developerId != null && $this->_config->developerId != "") { - $hpsHeader->appendChild($xml->createElement('hps:DeveloperID', $this->_config->developerId)); - $hpsHeader->appendChild($xml->createElement('hps:VersionNbr', $this->_config->versionNumber)); - $hpsHeader->appendChild($xml->createElement('hps:SiteTrace', $this->_config->siteTrace)); - } - if (isset($options['clientTransactionId'])) { - $hpsHeader->appendChild($xml->createElement('hps:ClientTxnId', $options['clientTransactionId'])); - } - - $hpsVersion->appendChild($hpsHeader); - $transaction = $xml->importNode($transaction, true); - $hpsVersion->appendChild($transaction); - - $hpsRequest->appendChild($hpsVersion); - $soapBody->appendChild($hpsRequest); - $soapEnvelope->appendChild($soapBody); - $xml->appendChild($soapEnvelope); - - $url = $this->_gatewayUrlForKey(); - $header = array( - 'Content-type: text/xml;charset="utf-8"', - 'Accept: text/xml', - 'SOAPAction: ""', - 'Content-length: '.strlen($xml->saveXML()), - ); - $data = $xml->saveXML(); - // print "\n" . $data; - - return $this->submitRequest($url, $header, $data); - } - /** - * @param $curlResponse - * @param $curlInfo - * @param $curlError - * - * @return mixed - * @throws \HpsException - */ - public function processResponse($curlResponse, $curlInfo, $curlError) - { - // print "\n" . $curlResponse; - switch ($curlInfo['http_code']) { - case '200': - $responseObject = $this->_XML2Array($curlResponse); - $ver = "Ver1.0"; - return $responseObject->$ver; - break; - case '500': - $faultString = $this->_XMLFault2String($curlResponse); - throw new HpsException($faultString); - break; - default: - throw new HpsException('Unexpected response'); - break; - } - } - /** - * @param $details - * @param \DOMDocument $xml - * - * @return \DOMElement - */ - public function _hydrateAdditionalTxnFields($details, DOMDocument $xml) - { - $additionalTxnFields = $xml->createElement('hps:AdditionalTxnFields'); - - if ($details->memo != null && $details->memo != "") { - $additionalTxnFields->appendChild($xml->createElement('hps:Description', $details->memo)); - } - - if ($details->invoiceNumber != null && $details->invoiceNumber != "") { - $additionalTxnFields->appendChild($xml->createElement('hps:InvoiceNbr', $details->invoiceNumber)); - } - - if ($details->customerId != null && $details->customerId != "") { - $additionalTxnFields->appendChild($xml->createElement('hps:CustomerID', $details->customerId)); - } - - return $additionalTxnFields; - } - /** - * @param \HpsCardHolder $cardHolder - * @param \DOMDocument $xml - * - * @return \DOMElement - * @throws \HpsInvalidRequestException - */ - public function _hydrateCardHolderData(HpsCardHolder $cardHolder, DOMDocument $xml) - { - //handle both phone and phoneNumber properties as a valid phone - if($cardHolder->phone === null && !empty($cardHolder->phoneNumber) === true){ - $cardHolder->phone = $cardHolder->phoneNumber; - } - //handle both email and emailAddress properties as a valid email - if($cardHolder->email === null && !empty($cardHolder->emailAddress) === true){ - $cardHolder->email = $cardHolder->emailAddress; - } - - $cardHolderData = $xml->createElement('hps:CardHolderData'); - $cardHolderData->appendChild($xml->createElement('hps:CardHolderFirstName', HpsInputValidation::checkCardHolderData($cardHolder->firstName, 'FirstName'))); - $cardHolderData->appendChild($xml->createElement('hps:CardHolderLastName', HpsInputValidation::checkCardHolderData($cardHolder->lastName,'LastName'))); - $cardHolderData->appendChild($xml->createElement('hps:CardHolderEmail', HpsInputValidation::checkEmailAddress($cardHolder->email))); - $cardHolderData->appendChild($xml->createElement('hps:CardHolderPhone', HpsInputValidation::checkPhoneNumber($cardHolder->phone))); - $cardHolderData->appendChild($xml->createElement('hps:CardHolderAddr', HpsInputValidation::checkCardHolderData($cardHolder->address->address))); - $cardHolderData->appendChild($xml->createElement('hps:CardHolderCity', HpsInputValidation::checkCardHolderData($cardHolder->address->city, 'City'))); - $cardHolderData->appendChild($xml->createElement('hps:CardHolderState', HpsInputValidation::checkCardHolderData($cardHolder->address->state, 'State'))); - $cardHolderData->appendChild($xml->createElement('hps:CardHolderZip', HpsInputValidation::checkZipCode($cardHolder->address->zip))); - - return $cardHolderData; - } - /** - * @param \HpsCheck $check - * @param \DOMDocument $xml - * - * @return \DOMElement - */ - public function _hydrateCheckData(HpsCheck $check, DOMDocument $xml) - { - $checkData = $xml->createElement('hps:AccountInfo'); - - if ($check->accountNumber != null) { - $checkData->appendChild($xml->createElement('hps:AccountNumber', $check->accountNumber)); - } - - if ($check->checkNumber != null) { - $checkData->appendChild($xml->createElement('hps:CheckNumber', $check->checkNumber)); - } - - if ($check->micrNumber != null) { - $checkData->appendChild($xml->createElement('hps:MICRData', $check->micrNumber)); - } - - if ($check->routingNumber != null) { - $checkData->appendChild($xml->createElement('hps:RoutingNumber', $check->routingNumber)); - } - - if ($check->accountType != null) { - $checkData->appendChild($xml->createElement('hps:AccountType', strtoupper($check->accountType))); - } - - return $checkData; - } - /** - * @param \HpsCheck $check - * @param \DOMDocument $xml - * - * @return \DOMElement - */ - public function _hydrateConsumerInfo(HpsCheck $check, DOMDocument $xml) - { - $consumerInfo = $xml->createElement('hps:ConsumerInfo'); - - if ($check->checkHolder->address != null) { - $consumerInfo->appendChild($xml->createElement('hps:Address1', $check->checkHolder->address->address)); - $consumerInfo->appendChild($xml->createElement('hps:City', $check->checkHolder->address->city)); - $consumerInfo->appendChild($xml->createElement('hps:State', $check->checkHolder->address->state)); - $consumerInfo->appendChild($xml->createElement('hps:Zip', $check->checkHolder->address->zip)); - } - - if ($check->checkHolder->checkName != null) { - $consumerInfo->appendChild($xml->createElement('hps:CheckName', $check->checkHolder->checkName)); - } - - if ($check->checkHolder->courtesyCard != null) { - $consumerInfo->appendChild($xml->createElement('hps:CourtesyCard', $check->checkHolder->courtesyCard)); - } - - if ($check->checkHolder->dlNumber != null) { - $consumerInfo->appendChild($xml->createElement('hps:DLNumber', $check->checkHolder->dlNumber)); - } - - if ($check->checkHolder->dlState != null) { - $consumerInfo->appendChild($xml->createElement('hps:DLState', $check->checkHolder->dlState)); - } - - if ($check->checkHolder->email != null) { - $consumerInfo->appendChild($xml->createElement('hps:EmailAddress', $check->checkHolder->email)); - } - - if ($check->checkHolder->firstName != null) { - $consumerInfo->appendChild($xml->createElement('hps:FirstName', $check->checkHolder->firstName)); - } - - if ($check->checkHolder->lastName != null) { - $consumerInfo->appendChild($xml->createElement('hps:LastName', $check->checkHolder->lastName)); - } - - if ($check->checkHolder->phone != null) { - $consumerInfo->appendChild($xml->createElement('hps:PhoneNumber', $check->checkHolder->phone)); - } - - if ($check->checkHolder->ssl4 != null || $check->checkHolder->dobYear != null) { - $identityInfo = $xml->createElement('hps:IdentityInfo'); - if ($check->checkHolder->ssl4 != null) { - $identityInfo->appendChild($xml->createElement('hps:SSNL4', $check->checkHolder->ssl4)); - } - if ($check->checkHolder->dobYear != null) { - $identityInfo->appendChild($xml->createElement('hps:DOBYear', $check->checkHolder->dobYear)); - } - $consumerInfo->appendChild($identityInfo); - } - - return $consumerInfo; - } - /** - * @param \HpsCPCData $cpcData - * @param \DOMDocument $xml - * - * @return \DOMElement - */ - public function _hydrateCPCData(HpsCPCData $cpcData, DOMDocument $xml) - { - $cpcDataElement = $xml->createElement('hps:CPCData'); - if (isset($cpcData->cardHolderPONbr)) { - $cpcDataElement->appendChild($xml->createElement('hps:CardHolderPONbr', $cpcData->cardHolderPONbr)); - } - if (isset($cpcData->taxAmt)) { - $cpcDataElement->appendChild($xml->createElement('hps:TaxAmt', $cpcData->taxAmt)); - } - if (isset($cpcData->taxType)) { - $cpcDataElement->appendChild($xml->createElement('hps:TaxType', $cpcData->taxType)); - } - - return $cpcDataElement; - } - /** - * @param \HpsDirectMarketData $data - * @param \DOMDocument $xml - * - * @return \DOMElement - */ - public function _hydrateDirectMarketData(HpsDirectMarketData $data, DOMDocument $xml) - { - $directMktDataElement = $xml->createElement('hps:DirectMktData'); - $directMktDataElement->appendChild($xml->createElement('hps:DirectMktInvoiceNbr', $data->invoiceNumber)); - $directMktDataElement->appendChild($xml->createElement('hps:DirectMktShipMonth', $data->shipMonth)); - $directMktDataElement->appendChild($xml->createElement('hps:DirectMktShipDay', $data->shipDay)); - - return $directMktDataElement; - } - /** - * @param \HpsEncryptionData $encryptionData - * @param \DOMDocument $xml - * - * @return \DOMElement - */ - public function _hydrateEncryptionData(HpsEncryptionData $encryptionData, DOMDocument $xml) - { - $encData = $xml->createElement('hps:EncryptionData'); - if ($encryptionData->encryptedTrackNumber != null) { - $encData->appendChild($xml->createElement('hps:EncryptedTrackNumber', $encryptionData->encryptedTrackNumber)); - } - $encData->appendChild($xml->createElement('hps:KSN', $encryptionData->ksn)); - $encData->appendChild($xml->createElement('hps:KTB', $encryptionData->ktb)); - $encData->appendChild($xml->createElement('hps:Version', $encryptionData->version)); - return $encData; - } - /** - * @param \HpsGiftCard $giftCard - * @param \DOMDocument $xml - * @param string $elementName - * - * @return \DOMElement - */ - public function _hydrateGiftCardData(HpsGiftCard $giftCard, DOMDocument $xml, $elementName = 'CardData') - { - $giftCardData = $xml->createElement('hps:'.$elementName); - if ($giftCard->number != null) { - $giftCardData->appendChild($xml->createElement('hps:CardNbr', $giftCard->number)); - } else if ($giftCard->trackData != null) { - $giftCardData->appendChild($xml->createElement('hps:TrackData', $giftCard->trackData)); - } else if ($giftCard->alias != null) { - $giftCardData->appendChild($xml->createElement('hps:Alias', $giftCard->alias)); - } else if ($giftCard->tokenValue != null) { - $giftCardData->appendChild($xml->createElement('hps:TokenValue', $giftCard->tokenValue)); - } - - if ($giftCard->encryptionData != null) { - $giftCardData->appendChild($this->_hydrateEncryptionData($giftCard->encryptionData, $xml)); - } - - if ($giftCard->pin != null) { - $giftCardData->appendChild($xml->createElement('hps:PIN', $giftCard->pin)); - } - - return $giftCardData; - } - /** - * @param \HpsCreditCard $card - * @param \DOMDocument $xml - * @param bool $cardPresent - * @param bool $readerPresent - * - * @return \DOMElement - */ - public function _hydrateManualEntry(HpsCreditCard $card, DOMDocument $xml, $cardPresent = false, $readerPresent = false) - { - $manualEntry = $xml->createElement('hps:ManualEntry'); - - if (isset($card->number)) { - $manualEntry->appendChild($xml->createElement('hps:CardNbr', $card->number)); - } - - if (isset($card->expMonth)) { - $manualEntry->appendChild($xml->createElement('hps:ExpMonth', $card->expMonth)); - } - - if (isset($card->expYear)) { - $manualEntry->appendChild($xml->createElement('hps:ExpYear', $card->expYear)); - } - - if (isset($card->cvv)) { - $manualEntry->appendChild($xml->createElement('hps:CVV2', $card->cvv)); - } - - $manualEntry->appendChild($xml->createElement('hps:CardPresent', ($cardPresent ? 'Y' : 'N'))); - $manualEntry->appendChild($xml->createElement('hps:ReaderPresent', ($readerPresent ? 'Y' : 'N'))); - - return $manualEntry; - } - /** - * @param $data - * @param $xml - * - * @return mixed - */ - public function _hydrateSecureEcommerce($data, $xml) - { - $secureEcommerce = $xml->createElement('hps:SecureECommerce'); - $secureEcommerce->appendChild($xml->createElement('hps:PaymentDataSource', $data->dataSource)); - $secureEcommerce->appendChild($xml->createElement('hps:TypeOfPaymentData', $data->type)); - - $paymentDataElement = $xml->createElement('hps:PaymentData', $data->data); - $paymentDataElementEncoding = $xml->createAttribute('encoding'); - $paymentDataElementEncoding->value = 'base64'; - $paymentDataElement->appendChild($paymentDataElementEncoding); - $secureEcommerce->appendChild($paymentDataElement); - - if ($data->eciFlag != null && $data->eciFlag != '') { - $secureEcommerce->appendChild($xml->createElement('hps:ECommerceIndicator', $data->eciFlag)); - } - - $xidElement = $xml->createElement('hps:XID', $data->xid); - $xidElementEncoding = $xml->createAttribute('encoding'); - $xidElementEncoding->value = 'base64'; - $xidElement->appendChild($xidElementEncoding); - $secureEcommerce->appendChild($xidElement); - - return $secureEcommerce; - } - /* - * @link https://github.com/hps/heartland-php/pull/21 - * @description resolves a recursion issue identified in the link above - */ - /** - * @param $token - * @param \DOMDocument $xml - * @param bool $cardPresent - * @param bool $readerPresent - * - * @return \DOMElement - */ - public function _hydrateTokenData($token, DOMDocument $xml, $cardPresent = false, $readerPresent = false) - { - if (!$token instanceof HpsTokenData) { - $tokenValue = $token; - $token = new HpsTokenData(); - $token->tokenValue = $tokenValue; - } - - $tokenData = $xml->createElement('hps:TokenData'); - $tokenData->appendChild($xml->createElement('hps:TokenValue', $token->tokenValue)); - - if (isset($token->expMonth)) { - $tokenData->appendChild($xml->createElement('hps:ExpMonth', $token->expMonth)); - } - - if (isset($token->expYear)) { - $tokenData->appendChild($xml->createElement('hps:ExpYear', $token->expYear)); - } - - if (isset($token->cvv)) { - $tokenData->appendChild($xml->createElement('hps:CVV2', $token->cvv)); - } - - $tokenData->appendChild($xml->createElement('hps:CardPresent', ($cardPresent ? 'Y' : 'N'))); - $tokenData->appendChild($xml->createElement('hps:ReaderPresent', ($readerPresent ? 'Y' : 'N'))); - return $tokenData; - } - /** - * @param \HpsTrackData $trackData - * @param $xml - * - * @return mixed - */ - public function _hydrateTrackData(HpsTrackData $trackData, $xml) - { - $trackDataElement = $xml->createElement('hps:TrackData', $trackData->value); - $trackDataElementMethod = $xml->createAttribute('method'); - $trackDataElementMethod->value = $trackData->method; - $trackDataElement->appendChild($trackDataElementMethod); - return $trackDataElement; - } - /** - * @return string - */ - private function _gatewayUrlForKey() - { - if ($this->_config->secretApiKey != null && $this->_config->secretApiKey != "") { - if (strpos($this->_config->secretApiKey, '_cert_') !== false) { - return "https://cert.api2.heartlandportico.com/Hps.Exchange.PosGateway/PosGatewayService.asmx"; - } else if (strpos($this->_config->secretApiKey, '_uat_') !== false) { - return "https://posgateway.uat.secureexchange.net/Hps.Exchange.PosGateway/PosGatewayService.asmx"; - } else { - return "https://api2.heartlandportico.com/Hps.Exchange.PosGateway/PosGatewayService.asmx"; - } - } else { - return $this->_config->soapServiceUri; - } - } - /** - * @param $xml - * - * @return mixed - */ - private function _XML2Array($xml) - { - $envelope = simplexml_load_string($xml, "SimpleXMLElement", 0, 'http://schemas.xmlsoap.org/soap/envelope/'); - foreach ($envelope->Body as $response) { - foreach ($response->children('http://Hps.Exchange.PosGateway') as $item) { - return $item; - } - } - return null; - } - /** - * @param $xml - * - * @return string - */ - private function _XMLFault2String($xml) - { - $dom = new DOMDocument(); - $dom->loadXML($xml); - return $dom->getElementsByTagName('faultstring')->item(0)->nodeValue; - } -} diff --git a/classes/includes/src/Services/Gateway/HpsTokenService.php b/classes/includes/src/Services/Gateway/HpsTokenService.php deleted file mode 100644 index 73c506d..0000000 --- a/classes/includes/src/Services/Gateway/HpsTokenService.php +++ /dev/null @@ -1,97 +0,0 @@ -_config = new HpsServicesConfig(); - $this->_config->publicApiKey = $publicAPIKey; - - $components = explode("_", $publicAPIKey); - if (count($components) == 3 && strtolower($components[1]) == "prod") { - $this->_url = "https://api2.heartlandportico.com/SecureSubmit.v1/api/token"; - } else { - $this->_url = "https://cert.api2.heartlandportico.com/Hps.Exchange.PosGateway.Hpf.v1/api/token"; - } - } - /** - * @param \HpsCreditCard $cardData - * - * @return mixed - * @throws \HpsAuthenticationException - * @throws \HpsGatewayException - */ - public function getToken(HpsCreditCard $cardData) - { - $data = array(); - $data['api_key'] = $this->_config->publicApiKey; - $data['object'] = 'token'; - $data['token_type'] = 'supt'; - $data['_method'] = 'post'; - $data['card[number]'] = $cardData->number; - $data['card[cvc]'] = $cardData->cvv; - $data['card[exp_month]'] = $cardData->expMonth; - $data['card[exp_year]'] = $cardData->expYear; - - $url = $this->_url ."?". http_build_query($data); - $header = array('Content-type: application/json'); - - return $this->submitRequest($url, $header, null, 'GET', HpsServicesConfig::KEY_TYPE_PUBLIC); - } - /** - * @param \HpsGiftCard $cardData - * - * @return mixed - * @throws \HpsAuthenticationException - * @throws \HpsGatewayException - */ - public function getGiftCardToken(HpsGiftCard $cardData) - { - $data = array(); - $data['api_key'] = $this->_config->publicApiKey; - $data['object'] = 'token'; - $data['token_type'] = 'supt'; - $data['_method'] = 'post'; - $data['card[number]'] = $cardData->number; - - $url = $this->_url ."?". http_build_query($data); - $header = array('Content-type: application/json'); - - return $this->submitRequest($url, $header, null, 'GET', HpsServicesConfig::KEY_TYPE_PUBLIC); - } - /** - * @param $curlResponse - * @param $curlInfo - * @param $curlError - * - * @return mixed - * @throws \HpsException - */ - protected function processResponse($curlResponse, $curlInfo, $curlError) - { - $response = json_decode($curlResponse); - - if (isset($response->error) && is_object($response->error)) { - throw new HpsException($response->error->message, $response->error->code); - } - - return $response; - } - /** - * @return bool - */ - protected function _isConfigInvalid() - { - return $this->_config->publicApiKey == null || $this->_url == null; - } -} diff --git a/classes/includes/src/Services/Gateway/PayPlan/HpsPayPlanCustomerService.php b/classes/includes/src/Services/Gateway/PayPlan/HpsPayPlanCustomerService.php deleted file mode 100644 index 6d7618f..0000000 --- a/classes/includes/src/Services/Gateway/PayPlan/HpsPayPlanCustomerService.php +++ /dev/null @@ -1,96 +0,0 @@ -getEditableFieldsWithValues(); - $result = $this->doRequest($data, array( - 'verb' => 'POST', - 'endpoint' => 'customers', - )); - return $this->hydrateObject($result, 'HpsPayPlanCustomer'); - } - /** - * @param \HpsPayPlanCustomer $customer - * - * @return mixed - */ - public function edit(HpsPayPlanCustomer $customer) - { - $data = $customer->getEditableFieldsWithValues(); - $result = $this->doRequest($data, array( - 'verb' => 'PUT', - 'endpoint' => 'customers/'.$customer->customerKey, - )); - return $this->hydrateObject($result, 'HpsPayPlanCustomer'); - } - /** - * @param array $searchFields - * - * @return object - */ - public function findAll($searchFields = array()) - { - // Cannot have an array as the root object - // in a JSON document - $data = $searchFields === array() ? (object)array() : $searchFields; - $results = $this - ->doRequest($data, array( - 'verb' => 'POST', - 'endpoint' => 'searchCustomers', - )); - - return $this->hydrateSearchResults($results, 'HpsPayPlanCustomer'); - } - /** - * @param $customer - * - * @return mixed - */ - public function get($customer) - { - $id = null; - if ($customer instanceof HpsPayPlanCustomer) { - $id = $customer->customerKey; - } else { - $id = $customer; - } - $result = $this->doRequest(null, array( - 'verb' => 'GET', - 'endpoint' => 'customers/'.$id, - )); - return $this->hydrateObject($result, 'HpsPayPlanCustomer'); - } - /** - * @param $customer - * @param bool $forceDelete - * - * @return mixed - */ - public function delete($customer, $forceDelete = false) - { - $id = null; - if ($customer instanceof HpsPayPlanCustomer) { - $id = $customer->customerKey; - } else { - $id = $customer; - } - - $data = array( - 'forceDelete' => $forceDelete, - ); - return $this->doRequest($data, array( - 'verb' => 'DELETE', - 'endpoint' => 'customers/'.$id, - )); - } -} diff --git a/classes/includes/src/Services/Gateway/PayPlan/HpsPayPlanPaymentMethodService.php b/classes/includes/src/Services/Gateway/PayPlan/HpsPayPlanPaymentMethodService.php deleted file mode 100644 index 2cadf03..0000000 --- a/classes/includes/src/Services/Gateway/PayPlan/HpsPayPlanPaymentMethodService.php +++ /dev/null @@ -1,165 +0,0 @@ -paymentMethodType == HpsPayPlanPaymentMethodType::ACH) { - $result = $this->addACH($paymentMethod); - } else { - $result = $this->addCreditCard($paymentMethod); - } - return $this->hydrateObject($result, 'HpsPayPlanPaymentMethod'); - } - /** - * @param \HpsPayPlanPaymentMethod $paymentMethod - * - * @return mixed - */ - public function edit(HpsPayPlanPaymentMethod $paymentMethod) - { - $result = null; - if ($paymentMethod->paymentMethodType == HpsPayPlanPaymentMethodType::ACH) { - $result = $this->editACH($paymentMethod); - } else { - $result = $this->editCreditCard($paymentMethod); - } - return $this->hydrateObject($result, 'HpsPayPlanPaymentMethod'); - } - /** - * @param array $searchFields - * - * @return object - */ - public function findAll($searchFields = array()) - { - // Cannot have an array as the root object - // in a JSON document - $data = $searchFields === array() ? (object)array() : $searchFields; - $results = $this - ->doRequest($data, array( - 'verb' => 'POST', - 'endpoint' => 'searchPaymentMethods', - )); - - return $this->hydrateSearchResults($results, 'HpsPayPlanPaymentMethod'); - } - /** - * @param $paymentMethod - * - * @return mixed - */ - public function get($paymentMethod) - { - $id = null; - if ($paymentMethod instanceof HpsPayPlanPaymentMethod) { - $id = $paymentMethod->paymentMethodKey; - } else { - $id = $paymentMethod; - } - $result = $this->doRequest(null, array( - 'verb' => 'GET', - 'endpoint' => 'paymentMethods/'.$id - )); - return $this->hydrateObject($result, 'HpsPayPlanPaymentMethod'); - } - /** - * @param $paymentMethod - * @param bool $forceDelete - * - * @return mixed - */ - public function delete($paymentMethod, $forceDelete = false) - { - $id = null; - if ($paymentMethod instanceof HpsPayPlanPaymentMethod) { - $id = $paymentMethod->paymentMethodKey; - } else { - $id = $paymentMethod; - } - - $data = array( - 'forceDelete' => $forceDelete, - ); - return $this->doRequest($data, array( - 'verb' => 'DELETE', - 'endpoint' => 'paymentMethods/'.$id, - )); - } - /** - * @param \HpsPayPlanPaymentMethod $paymentMethod - * - * @return mixed - */ - private function addCreditCard(HpsPayPlanPaymentMethod $paymentMethod) - { - $data = $paymentMethod->getEditableFieldsWithValues(); - $data['customerKey'] = $paymentMethod->customerKey; - if (isset($paymentMethod->accountNumber)) { - $data['accountNumber'] = $paymentMethod->accountNumber; - } else if (isset($paymentMethod->paymentToken)) { - $data['paymentToken'] = $paymentMethod->paymentToken; - } - $result = $this->doRequest($data, array( - 'verb' => 'POST', - 'endpoint' => 'paymentMethodsCreditCard', - )); - return $this->hydrateObject($result, 'HpsPayPlanPaymentMethod'); - } - /** - * @param \HpsPayPlanPaymentMethod $paymentMethod - * - * @return mixed - */ - private function editCreditCard(HpsPayPlanPaymentMethod $paymentMethod) - { - $data = $paymentMethod->getEditableFieldsWithValues(); - $result = $this->doRequest($data, array( - 'verb' => 'PUT', - 'endpoint' => 'paymentMethodsCreditCard/'.$paymentMethod->paymentMethodKey, - )); - return $this->hydrateObject($result, 'HpsPayPlanPaymentMethod'); - } - /** - * @param \HpsPayPlanPaymentMethod $paymentMethod - * - * @return mixed - */ - private function addACH(HpsPayPlanPaymentMethod $paymentMethod) - { - $data = $paymentMethod->getEditableFieldsWithValues(); - $data['customerKey'] = $paymentMethod->customerKey; - $data['accountNumber'] = $paymentMethod->accountNumber; - $data['accountType'] = $paymentMethod->accountType; - $data['achType'] = $paymentMethod->achType; - $data['routingNumber'] = $paymentMethod->routingNumber; - $result = $this->doRequest($data, array( - 'verb' => 'POST', - 'endpoint' => 'paymentMethodsACH', - )); - return $this->hydrateObject($result, 'HpsPayPlanPaymentMethod'); - } - /** - * @param \HpsPayPlanPaymentMethod $paymentMethod - * - * @return mixed - */ - private function editACH(HpsPayPlanPaymentMethod $paymentMethod) - { - $data = $paymentMethod->getEditableFieldsWithValues(); - $result = $this->doRequest($data, array( - 'verb' => 'PUT', - 'endpoint' => 'paymentMethodsACH/'.$paymentMethod->paymentMethodKey, - )); - return $this->hydrateObject($result, 'HpsPayPlanPaymentMethod'); - } -} diff --git a/classes/includes/src/Services/Gateway/PayPlan/HpsPayPlanScheduleService.php b/classes/includes/src/Services/Gateway/PayPlan/HpsPayPlanScheduleService.php deleted file mode 100644 index cb05c0e..0000000 --- a/classes/includes/src/Services/Gateway/PayPlan/HpsPayPlanScheduleService.php +++ /dev/null @@ -1,96 +0,0 @@ -getEditableFieldsWithValues(); - $data['customerKey'] = $schedule->customerKey; - $data['numberOfPayments'] = $schedule->numberOfPayments; - $result = $this->doRequest($data, array( - 'verb' => 'POST', - 'endpoint' => 'schedules', - )); - return $this->hydrateObject($result, 'HpsPayPlanSchedule'); - } - /** - * @param \HpsPayPlanSchedule $schedule - * - * @return mixed - */ - public function edit(HpsPayPlanSchedule $schedule) - { - $data = $schedule->getEditableFieldsWithValues( $schedule ); - $result = $this->doRequest($data, array( - 'verb' => 'PUT', - 'endpoint' => 'schedules/'.$schedule->scheduleKey, - )); - return $this->hydrateObject($result, 'HpsPayPlanSchedule'); - } - /** - * @param array $searchFields - * - * @return object - */ - public function findAll($searchFields = array()) - { - // Cannot have an array as the root object - // in a JSON document - $data = $searchFields === array() ? (object)array() : $searchFields; - $results = $this - ->doRequest($data, array( - 'verb' => 'POST', - 'endpoint' => 'searchSchedules', - )); - return $this->hydrateSearchResults($results, 'HpsPayPlanSchedule'); - } - /** - * @param $schedule - * - * @return mixed - */ - public function get($schedule) - { - $id = null; - if ($schedule instanceof HpsPayPlanSchedule) { - $id = $schedule->scheduleKey; - } else { - $id = $schedule; - } - $result = $this->doRequest(null, array( - 'verb' => 'GET', - 'endpoint' => 'schedules/'.$id, - )); - return $this->hydrateObject($result, 'HpsPayPlanSchedule'); - } - /** - * @param $schedule - * @param bool $forceDelete - * - * @return mixed - */ - public function delete($schedule, $forceDelete = false) - { - $id = null; - if ($schedule instanceof HpsPayPlanSchedule) { - $id = $schedule->scheduleKey; - } else { - $id = $schedule; - } - $data = array( - 'forceDelete' => $forceDelete, - ); - return $this->doRequest($data, array( - 'verb' => 'DELETE', - 'endpoint' => 'schedules/'.$id, - )); - } -} \ No newline at end of file diff --git a/classes/includes/src/Services/HpsCentinelConfig.php b/classes/includes/src/Services/HpsCentinelConfig.php deleted file mode 100644 index 6fbdc2f..0000000 --- a/classes/includes/src/Services/HpsCentinelConfig.php +++ /dev/null @@ -1,41 +0,0 @@ -serviceUri; - } - /** - * @param $value - * - * @return mixed|void - */ - public function setServiceUri($value) - { - $this->serviceUri = $value; - } - /** - * @param $keyType - * - * @return bool - */ - public function validate($keyType) - { - return true; - } -} diff --git a/classes/includes/src/Services/HpsServicesConfig.php b/classes/includes/src/Services/HpsServicesConfig.php deleted file mode 100644 index 212b2c6..0000000 --- a/classes/includes/src/Services/HpsServicesConfig.php +++ /dev/null @@ -1,88 +0,0 @@ -soapServiceUri; - } - /** - * @param $value - * - * @return mixed|void - */ - public function setServiceUri($value) - { - $this->soapServiceUri = $value; - } - /** - * @param $keyType - * - * @return bool - */ - public function validate($keyType) - { - return ($keyType == self::KEY_TYPE_PUBLIC && $this->validatePublicApiKey()) - || ($keyType == self::KEY_TYPE_SECRET && $this->validateSecretApiKey()); - } - /** - * @param $keyType - * - * @return string - */ - public function getKeyType($keyType) - { - $key = trim($keyType == self::KEY_TYPE_SECRET ? $this->secretApiKey : $this->publicApiKey); - switch (true) { - case substr($key, 0, 6) == 'skapi_': - return self::KEY_TYPE_SECRET; - break; - case substr($key, 0, 6) == 'pkapi_': - return self::KEY_TYPE_PUBLIC; - break; - default: - return self::KEY_TYPE_UNKNOWN; - break; - } - } - /** - * @return bool - */ - protected function validateSecretApiKey() - { - return is_string($this->secretApiKey) - && $this->getKeyType(self::KEY_TYPE_SECRET) == self::KEY_TYPE_SECRET - && strlen($this->secretApiKey) >= 48; - } - /** - * @return bool - */ - protected function validatePublicApiKey() - { - return is_string($this->publicApiKey) - && $this->getKeyType(self::KEY_TYPE_PUBLIC) == self::KEY_TYPE_PUBLIC - && strlen($this->publicApiKey) >= 28; - } -} diff --git a/classes/includes/src/Services/index.php b/classes/includes/src/Services/index.php deleted file mode 100644 index b3d9bbc..0000000 --- a/classes/includes/src/Services/index.php +++ /dev/null @@ -1 +0,0 @@ -

      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%0A!7%Ol3@KYb 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 diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Builders/AuthorizationBuilder.php b/classes/includes/vendor/globalpayments/php-sdk/src/Builders/AuthorizationBuilder.php deleted file mode 100644 index bb891e4..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Builders/AuthorizationBuilder.php +++ /dev/null @@ -1,1117 +0,0 @@ - - */ - public $customData; - - /** - * Payment method CVN - * - * Only applicable for recurring payments - * - * @internal - * @var string - */ - public $cvn; - - /** - * Request description - * - * @internal - * @var string - */ - public $description; - - /** - * Request decisionManager - * - * @internal - * @var DecisionManager - */ - public $decisionManager; - - /** - * Request dynamic descriptor - * - * @internal - * @var string - */ - public $dynamicDescriptor; - - /** - * Request ecommerceInfo - * - * @internal - * @var EcommerceInfo - */ - public $ecommerceInfo; - - /** - * Request gratuity - * - * @internal - * @var string|amount - */ - public $gratuity; - - /** - * Request convenience amount - * - * @internal - * @var string|amount - */ - public $convenienceAmount; - - /** - * Request shipping amount - * - * @internal - * @var string|amount - */ - public $shippingAmount; - - /** - * @internal - * @var StoredCredential - */ - public $storedCredential; - - /** - * Request hosted payment data - * - * @internal - * @var HostedPaymentData - */ - public $hostedPaymentData; - - /** - * Request invoice number - * - * @internal - * @var string|float - */ - public $invoiceNumber; - - /** - * Request should request Level II - * - * @internal - * @var bool - */ - public $level2Request; - - /** - * Request offline authorization code - * - * @internal - * @var string - */ - public $offlineAuthCode; - - /** - * Request should be considered one-time - * - * Typically only applicable with recurring payment methods - * - * @internal - * @var bool - */ - public $oneTimePayment; - - /** - * Request order ID - * - * @internal - * @var string|float - */ - public $orderId; - - /** - * Request product Data - * - * @internal - * @var array - */ - public $productData; - - /** - * Request product ID - * - * @internal - * @var string|float - */ - public $productId; - - /** - * Request recurring sequence - * - * @internal - * @var RecurringSequence - */ - public $recurringSequence; - - /** - * Request recurring type - * - * @internal - * @var RecurringType - */ - public $recurringType; - - /** - * Request should request multi-use token - * - * @internal - * @var bool - */ - public $requestMultiUseToken; - - /** - * Request replacement gift card - * - * @internal - * @var GiftCard - */ - public $replacementCard; - - /** - * Request schedule ID - * - * Typically only applicable with recurring payment methods - * - * @internal - * @var string - */ - public $scheduleId; - - /** - * Request shipping address - * - * @internal - * @var Address - */ - public $shippingAddress; - - /** - * Request timestamp - * - * @internal - * @var string|float - */ - public $timestamp; - - /** - * DCC rate Data - * - * @internal - * @var dccRateData - */ - public $dccRateData; - - /** - * DCC processor - * - * @internal - * @var dccProcessor - */ - public $dccProcessor; - - /** - * DCC Rate Type - * - * @internal - * @var dccRateType - */ - public $dccRateType; - - /** - * DCC Type - * - * @internal - * @var dccType - */ - public $dccType; - - /** - * Fraud Filter - * - * Typically only applicable with recurring payment methods - * - * @internal - * @var string - */ - public $fraudFilter; - - /** - * For AVS (Address verification System) request - * - * @internal - * @var bool - */ - public $verifyAddress; - - /** - * {@inheritdoc} - * - * @param TransactionType $type Request transaction type - * @param IPaymentMethod $paymentMethod Request payment method - * - * @return - */ - public function __construct($type, IPaymentMethod $paymentMethod = null) - { - parent::__construct($type, $paymentMethod); - $this->withPaymentMethod($paymentMethod); - } - - /** - * {@inheritdoc} - * - * @return Transaction - */ - public function execute() - { - parent::execute(); - return ServicesContainer::instance() - ->getClient() - ->processAuthorization($this); - } - - /** - * {@inheritdoc} - * - * @return String - */ - public function serialize() - { - $this->transactionModifier = TransactionModifier::HOSTEDREQUEST; - parent::execute(); - - $client = ServicesContainer::instance()->getClient(); - - if ($client->supportsHostedPayments()) { - return $client->serializeRequest($this); - } - throw new UnsupportedTransactionException("Your current gateway does not support hosted payments."); - } - - /** - * {@inheritdoc} - * - * @return void - */ - protected function setupValidations() - { - $this->validations->of( - TransactionType::AUTH | - TransactionType::SALE | - TransactionType::REFUND | - TransactionType::ADD_VALUE - ) - ->with(TransactionModifier::NONE) - ->check('amount')->isNotNull() - ->check('currency')->isNotNull() - ->check('paymentMethod')->isNotNull(); - - $this->validations->of( - TransactionType::AUTH | - TransactionType::SALE - ) - ->with(TransactionModifier::HOSTEDREQUEST) - ->check('amount')->isNotNull() - ->check('currency')->isNotNull(); - - $this->validations->of( - TransactionType::AUTH | - TransactionType::SALE - ) - ->with(TransactionModifier::OFFLINE) - ->check('amount')->isNotNull() - ->check('currency')->isNotNull() - ->check('offlineAuthCode')->isNotNull(); - - $this->validations->of(TransactionType::BALANCE) - ->check('paymentMethod')->isNotNull(); - - $this->validations->of(TransactionType::ALIAS) - ->check('aliasAction')->isNotNull() - ->check('alias')->isNotNull(); - - $this->validations->of(TransactionType::REPLACE) - ->check('replacementCard')->isNotNull(); - - $this->validations->of( - TransactionType::AUTH | - TransactionType::SALE - ) - ->with(TransactionModifier::ENCRYPTED_MOBILE) - ->check('paymentMethod')->isNotNull() - ->check('token')->isNotNullInSubProperty('paymentMethod') - ->check('mobileType')->isNotNullInSubProperty('paymentMethod'); - - $this->validations->of( - TransactionType::VERIFY - ) - ->with(TransactionModifier::HOSTEDREQUEST) - ->check('currency')->isNotNull(); - - $this->validations->of( - TransactionType::AUTH | - TransactionType::SALE - ) - ->with(TransactionModifier::ALTERNATIVE_PAYMENT_METHOD) - ->check('amount')->isNotNull() - ->check('currency')->isNotNull() - ->check('paymentMethod')->isNotNull() - ->check('alternativePaymentMethodType')->isNotNullInSubProperty('paymentMethod') - ->check('returnUrl')->isNotNullInSubProperty('paymentMethod') - ->check('statusUpdateUrl')->isNotNullInSubProperty('paymentMethod') - ->check('country')->isNotNullInSubProperty('paymentMethod') - ->check('accountHolderName')->isNotNullInSubProperty('paymentMethod'); - } - - /** - * Set an address value; where applicable. - * - * Currently supports billing and shipping addresses. - * - * @param Address $address The desired address information - * @param AddressType|string $type The desired address type - * - * @return AuthorizationBuilder - */ - public function withAddress(Address $address, $type = AddressType::BILLING) - { - $address->type = $type; - if ($type === AddressType::BILLING) { - $this->billingAddress = $address; - } else { - $this->shippingAddress = $address; - } - return $this; - } - - /** - * Set the request alias - * - * @internal - * @param string $aliasAction Request alias action - * @param string $alias Request alias - * - * @return AuthorizationBuilder - */ - public function withAlias($aliasAction, $alias) - { - $this->aliasAction = $aliasAction; - $this->alias = $alias; - return $this; - } - - /** - * Set the request to allow duplicates - * - * @param bool $allowDuplicates Request to allow duplicates - * - * @return AuthorizationBuilder - */ - public function withAllowDuplicates($allowDuplicates) - { - $this->allowDuplicates = $allowDuplicates; - return $this; - } - - /** - * Set the request to allow a partial authorization - * - * @param bool $allowPartialAuth Request to allow a partial authorization - * - * @return AuthorizationBuilder - */ - public function withAllowPartialAuth($allowPartialAuth) - { - $this->allowPartialAuth = $allowPartialAuth; - return $this; - } - - /** - * Set the request amount - * - * @param string|float $amount Request amount - * - * @return AuthorizationBuilder - */ - public function withAmount($amount) - { - $this->amount = $amount; - return $this; - } - - /** @return AuthorizationBuilder */ - public function withAmountEstimated($value) - { - $this->amountEstimated = $value; - return $this; - } - - /** - * Set the request authorization amount - * - * @param string|float $authAmount Request authorization amount - * - * @return AuthorizationBuilder - */ - public function withAuthAmount($authAmount) - { - $this->authAmount = $authAmount; - return $this; - } - - /** - * Set the request's balance inquiry type - * - * @param string $balanceInquiryType Balance inquiry type - * - * @return AuthorizationBuilder - */ - public function withBalanceInquiryType($balanceInquiryType) - { - $this->balanceInquiryType = $balanceInquiryType; - return $this; - } - - /** - * Set the request cashback amount - * - * @param string|float $cashbackAmount Request cashback amount - * - * @return AuthorizationBuilder - */ - public function withCashBack($cashBackAmount) - { - $this->cashBackAmount = $cashBackAmount; - $this->transactionModifier = TransactionModifier::CASH_BACK; - return $this; - } - - public function withClientTransactionId($clientTransactionId) - { - if ($this->transactionType !== TransactionType::REVERSAL && $this->transactionType !== TransactionType::REFUND - ) { - $this->clientTransactionId = $clientTransactionId; - return $this; - } - - if (!$this->paymentMethod instanceof TransactionReference) { - $this->paymentMethod = new TransactionReference(); - } - - $this->paymentMethod->clientTransactionId = $clientTransactionId; - return $this; - } - - /** - * Set the request currency - * - * @param string $currency Request currency - * - * @return AuthorizationBuilder - */ - public function withCurrency($currency) - { - $this->currency = $currency; - return $this; - } - - /** - * Set the request customer ID - * - * @param string|float $customerId Request customer ID - * - * @return AuthorizationBuilder - */ - public function withCustomerId($customerId) - { - $this->customerId = $customerId; - return $this; - } - - /** - * Set the request customer IP address - * - * @param string|float $customerIpAddress Request customer IP address - * - * @return AuthorizationBuilder - */ - public function withCustomerIpAddress($customerIpAddress) - { - $this->customerIpAddress = $customerIpAddress; - return $this; - } - - /** - * Set the request customer Data - * - * @param Customer $customerData Request customer Data - * - * @return AuthorizationBuilder - */ - public function withCustomerData(Customer $customerData) - { - $this->customerData = $customerData; - return $this; - } - - /** - * Set the request customData - * - * @param string $customData Request customData - * - * @return AuthorizationBuilder - */ - public function withCustomData($customData) - { - $this->customData = $customData; - return $this; - } - - /** - * Set the request description - * - * @param string $description Request description - * - * @return AuthorizationBuilder - */ - public function withDescription($description) - { - $this->description = $description; - return $this; - } - - /** - * Set the request decisionManager - * - * @param DecisionManager $decisionManager Request decisionManager - * - * @return AuthorizationBuilder - */ - public function withDecisionManager(DecisionManager $decisionManager) - { - $this->decisionManager = $decisionManager; - return $this; - } - - /** - * Set the request dynamic descriptor - * - * @param string $dynamicDescriptor Request dynamic descriptor - * - * @return AuthorizationBuilder - */ - public function withDynamicDescriptor($dynamicDescriptor) - { - $this->dynamicDescriptor = $dynamicDescriptor; - return $this; - } - - /** - * Set the request gratuity - * - * @param string|amount $gratuity Request gratuity - * - * @return AuthorizationBuilder - */ - public function withGratuity($gratuity) - { - $this->gratuity = $gratuity; - return $this; - } - - /** - * Set the request invoice number - * - * @param string|float $invoiceNumber Request invoice number - * - * @return AuthorizationBuilder - */ - public function withInvoiceNumber($invoiceNumber) - { - $this->invoiceNumber = $invoiceNumber; - return $this; - } - - /** - * Set the request to request Level II - * - * @param bool $level2Request Request to request Level II - * - * @return AuthorizationBuilder - */ - public function withCommercialRequest($level2Request) - { - $this->level2Request = $level2Request; - return $this; - } - - /** - * Set the request offline authorization code - * - * @param string $offlineAuthCode Authorization code from offline authorization - * - * @return AuthorizationBuilder - */ - public function withOfflineAuthCode($offlineAuthCode) - { - $this->offlineAuthCode = $offlineAuthCode; - $this->transactionModifier = TransactionModifier::OFFLINE; - return $this; - } - - /** - * Sets the one-time payment flag; where applicable. - * - * This is only useful when using recurring payment profiles for - * one-time payments that are not a part of a recurring schedule. - * - * @param boolean $value The one-time flag - * - * @return AuthorizationBuilder - */ - public function withOneTimePayment($value) - { - $this->oneTimePayment = $value; - $this->transactionModifier = TransactionModifier::RECURRING; - return $this; - } - - /** - * Set the request order ID - * - * @param string|float $orderId Request order ID - * - * @return AuthorizationBuilder - */ - public function withOrderId($orderId) - { - $this->orderId = $orderId; - return $this; - } - - /** - * Set the request payment method - * - * @param IPaymentMethod $paymentMethod Request payment method - * - * @return AuthorizationBuilder - */ - public function withPaymentMethod($paymentMethod) - { - $this->paymentMethod = $paymentMethod; - if ($paymentMethod instanceof EBTCardData && $paymentMethod->serialNumber !== null) { - $this->transactionModifier = TransactionModifier::VOUCHER; - } - return $this; - } - - /** - * Set the request productData - * - * @param string $productData Request productData - * - * @return AuthorizationBuilder - */ - public function withProductData($productData) - { - $this->productData = $productData; - return $this; - } - - /** - * Set the request product ID - * - * @param string|float $productId Request product ID - * - * @return AuthorizationBuilder - */ - public function withProductId($productId) - { - $this->productId = $productId; - return $this; - } - - /** - * Set the request to request multi-use token - * - * @param bool $requestMultiUseToken Request to request multi-use token - * - * @return AuthorizationBuilder - */ - public function withRequestMultiUseToken($requestMultiUseToken) - { - $this->requestMultiUseToken = $requestMultiUseToken; - return $this; - } - - /** - * Previous request's transaction ID - * - * @param string $transactionId Transaction ID - * - * @return AuthorizationBuilder - */ - public function withTransactionId($transactionId) - { - $this->paymentMethod = new TransactionReference($transactionId); - return $this; - } - - /** - * Set the request's ecommerce info - * - * @param EcommerceInfo $ecommerceInfo Ecommerce info - * - * @return AuthorizationBuilder - */ - public function withEcommerceInfo(EcommerceInfo $ecommerceInfo) - { - $this->ecommerceInfo = $ecommerceInfo; - return $this; - } - - /** - * Set the request's replacement gift card - * - * @param GiftCard $replacementCard replacement gift card - * - * @return AuthorizationBuilder - */ - public function withReplacementCard(GiftCard $replacementCard) - { - $this->replacementCard = $replacementCard; - return $this; - } - - /** - * Set the request CVN - * - * @param string|float $cvn Request cvn - * - * @return AuthorizationBuilder - */ - public function withCvn($cvn) - { - $this->cvn = $cvn; - return $this; - } - - /** - * Set the request recurringType and recurringSequence - * - * @param RecurringType $recurringType & RecurringSequence $recurringSequence - * - * @return AuthorizationBuilder - */ - public function withRecurringInfo($recurringType, $recurringSequence) - { - $this->recurringType = $recurringType; - $this->recurringSequence = $recurringSequence; - return $this; - } - - /** - * Set the request dccRateData - * - * @param DccRateData dccRateData - * - * @return AuthorizationBuilder - */ - public function withDccRateData($value) - { - $this->dccRateData = $value; - return $this; - } - - /** - * Set the request dccProcessor - * - * @param DccProcessor dccProcessor - * - * @return AuthorizationBuilder - */ - public function withDccProcessor($value) - { - $this->dccProcessor = $value; - return $this; - } - - /** - * Set the request dccRateType - * - * @param DccRateType dccRateType - * - * @return AuthorizationBuilder - */ - public function withDccRateType($value) - { - $this->dccRateType = $value; - return $this; - } - - /** - * Set the request dccType - * - * @param string dccType - * - * @return AuthorizationBuilder - */ - public function withDccType($value) - { - $this->dccType = $value; - return $this; - } - - /** - * Set the request Convenience amount - * - * @param string|float $convenienceAmt Request Convenience amount - * - * @return AuthorizationBuilder - */ - public function withConvenienceAmount($convenienceAmount) - { - $this->convenienceAmount = $convenienceAmount ; - return $this; - } - - /** - * Set the request shippingAmount - * - * @param string|float $shippingAmount Request shippingAmount - * - * @return AuthorizationBuilder - */ - public function withShippingAmount($shippingAmount) - { - $this->shippingAmount = $shippingAmount; - return $this; - } - - /** - * @return AuthorizationBuilder - */ - public function withStoredCredential($storedCredential) - { - $this->storedCredential = $storedCredential; - return $this; - } - - /** - * Set the request customer IP address - * - * @param string|float $customerIpAddress Request customer IP address - * - * @return AuthorizationBuilder - */ - public function withFraudFilter($fraudFilter) - { - $this->fraudFilter = $fraudFilter; - return $this; - } - - /** - * Set whether AVS requested - * - * @param string|bool $verifyAddress - * - * @return AuthorizationBuilder - */ - public function withVerifyAddress($verifyAddress) - { - $this->verifyAddress = $verifyAddress; - return $this; - } - - /** - * Set the timestamp - * - * @param string $timestamp - * - * @return AuthorizationBuilder - */ - public function withTimeStamp($timestamp) - { - $this->timestamp = $timestamp; - return $this; - } - - /** - * Set the hostedPaymentData - * - * @param string $hostedPaymentData - * - * @return AuthorizationBuilder - */ - public function withHostedPaymentData($hostedPaymentData) - { - $this->hostedPaymentData = $hostedPaymentData; - return $this; - } - - /** - * Set the associated schedule ID - * - * @param string $scheduleId - * - * @return AuthorizationBuilder - */ - public function withScheduleId($scheduleId) - { - $this->scheduleId = $scheduleId; - return $this; - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Builders/BaseBuilder.php b/classes/includes/vendor/globalpayments/php-sdk/src/Builders/BaseBuilder.php deleted file mode 100644 index 3eb490d..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Builders/BaseBuilder.php +++ /dev/null @@ -1,94 +0,0 @@ -validations = new Validations(); - $this->setupValidations(); - } - - /** - * Executes the builder - * - * @return Transaction - */ - public function execute() - { - $this->validate(); - return new Transaction(); - } - - /** - * Used to setup validations for the builder. - * - * @return void - */ - abstract protected function setupValidations(); - - /** - * Validates the builder based on validations in `$validations` - * - * @return void - */ - protected function validate() - { - array_map( - [$this, 'maybeRunValidationKeyRules'], - array_keys($this->validations->rules) - ); - } - - /** - * Runs validations for `$key` - * - * @param mixed $key Validation rules key - * - * @throws BuilderException - * @return void - */ - protected function maybeRunValidationKeyRules($key) - { - if (($key & $this->transactionType) !== $this->transactionType) { - return; - } - - foreach ($this->validations->rules[$key] as $validation) { - if (null === $validation->clause) { - continue; - } - - if ($this->transactionModifier === $validation->modifier - && !call_user_func($validation->clause->callback, $this) - ) { - throw new BuilderException($validation->clause->message); - } - } - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Builders/BaseBuilder/ValidationClause.php b/classes/includes/vendor/globalpayments/php-sdk/src/Builders/BaseBuilder/ValidationClause.php deleted file mode 100644 index 8c0343f..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Builders/BaseBuilder/ValidationClause.php +++ /dev/null @@ -1,277 +0,0 @@ -parent = $parent; - $this->target = $target; - $this->precondition = $precondition; - } - - /** - * Validates the target property is not null - * - * @param string $subProperty Parent of current property - * @param string $message Validation message to override the default - * - * @return ValidationTarget - */ - public function isNotNull($message = null, $subProperty = null) - { - $this->callback = function ($builder) use ($subProperty) { - $builder = ($subProperty !== null && !empty($builder->{$subProperty})) - ? $builder->{$subProperty} - : $builder; - if (!property_exists($builder, $this->target->property) - && !isset($builder->{$this->target->property}) - ) { - throw new BuilderException( - sprintf( - 'Property `%s` does not exist on `%s`', - $this->target->property, - get_class($builder) - ) - ); - } - $value = $builder->{$this->target->property}; - return null !== $value; - }; - $this->message = !empty($message) - ? $message - // TODO: implement a way to expose property name - : sprintf( - '%s cannot be null for this transaction type.', - $this->target->property - ); - - if ($this->precondition) { - return $this->target; - } - - return $this->parent->of($this->target->type, $this->target->modifier); - } - - /** - * Validates the target property is null - * - * @param string $subProperty Parent of current property - * @param string $message Validation message to override the default - * - * @return ValidationTarget - */ - public function isNull($message = null, $subProperty = null) - { - $this->callback = function ($builder) use ($subProperty) { - $builder = ($subProperty == null && empty($builder->{$subProperty})) - ? $builder->{$subProperty} - : $builder; - if (!property_exists($builder, $this->target->property) - && !isset($builder->{$this->target->property}) - ) { - throw new BuilderException( - sprintf( - 'Property `%s` does not exist on `%s`', - $this->target->property, - get_class($builder) - ) - ); - } - $value = $builder->{$this->target->property}; - return null == $value; - }; - $this->message = !empty($message) - ? $message - // TODO: implement a way to expose property name - : sprintf( - '%s cannot be set for this transaction type.', - $this->target->property - ); - - if ($this->precondition) { - return $this->target; - } - - return $this->parent->of($this->target->type, $this->target->modifier); - } - - /** - * - * @param class $clazz - * @param string $message - * - * @return ValidationTarget - */ - public function isInstanceOf($clazz, $message = null) - { - $this->callback = function ($builder) use ($clazz) { - if (!($builder->{$this->target->property} instanceof $clazz)) { - throw new BuilderException( - sprintf( - '%s must be an instance of the %s class.', - $this->target->property, - $clazz - ) - ); - return false; - } - return true; - }; - - $this->message = !empty($message) - ? $message - // TODO: implement a way to expose property name - : sprintf( - '%s must be an instance of the %s class.', - $this->target->property, - $clazz - ); - - if ($this->precondition) { - return $this->target; - } - - return $this->parent->of($this->target->type, $this->target->modifier); - } - - /** - * Validates the target property is equal to the expected value - * - * @param string $expected - * @param string $message Validation message to override the default - * - * @return ValidationTarget - */ - public function isEqualTo($expected, $message = null) - { - $this->callback = function ($builder) use ($expected) { - if ($builder->{$this->target->property} !== $expected) { - throw new BuilderException( - sprintf( - 'Property `%s` does not equal the expected value `%s`', - $this->target->property, - $expected - ) - ); - return false; - } - return true; - }; - $this->message = !empty($message) - ? $message - // TODO: implement a way to expose property name - : sprintf( - 'Property `%s` does not equal the expected value `%s`', - $this->target->property, - $expected - ); - - if ($this->precondition) { - return $this->target; - } - - return $this->parent->of($this->target->type, $this->target->modifier); - } - - /** - * Validates the target property is NOT equal to the expected value - * - * @param string $expected - * @param string $message Validation message to override the default - * - * @return ValidationTarget - */ - public function isNotEqualTo($expected, $message = null) - { - $this->callback = function ($builder) use ($expected) { - if ($builder->{$this->target->property} === $expected) { - throw new BuilderException( - sprintf( - 'Property `%s`is equal to the expected value `%s`', - $this->target->property, - $expected - ) - ); - return false; - } - return true; - }; - $this->message = !empty($message) - ? $message - // TODO: implement a way to expose property name - : sprintf( - 'Property `%s` is equal to the expected value `%s`', - $this->target->property, - $expected - ); - - if ($this->precondition) { - return $this->target; - } - - return $this->parent->of($this->target->type, $this->target->modifier); - } - - /** - * Validates the target property is not null in a sub class - * - * @param string $subProperty Parent of current property - * @param string $message Validation message to override the default - * - * @return ValidationTarget - */ - public function isNotNullInSubProperty($subProperty, $message = null) - { - return $this->isNotNull($message, $subProperty); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Builders/BaseBuilder/ValidationTarget.php b/classes/includes/vendor/globalpayments/php-sdk/src/Builders/BaseBuilder/ValidationTarget.php deleted file mode 100644 index 4a5bdbf..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Builders/BaseBuilder/ValidationTarget.php +++ /dev/null @@ -1,103 +0,0 @@ -parent = $parent; - $this->type = $type; - $this->modifier = $modifier; - } - - /** - * Sets the validation's transaction modifier - * - * @param TransactionModifier|int $modifier Validation modifier - * - * @return ValidationTarget - */ - public function with($modifier) - { - $this->modifier = $modifier; - return $this; - } - - /** - * Creates a new `ValidationClause` to specify validations on the - * given property. - * - * @param string $targetProperty Property to validate - * - * @return ValidationClause - */ - public function check($targetProperty) - { - $this->property = $targetProperty; - $this->clause = new ValidationClause($this->parent, $this); - return $this->clause; - } - - /** - * Creates a new `ValidationClause` to specify conditions for future - * validations checked against the given property. - * - * @param string $targetProperty Property to validate - * - * @return ValidationClause - */ - public function when($targetProperty) - { - $this->property = $targetProperty; - $this->clause = new ValidationClause($this->parent, $this, true); - return $this->clause; - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Builders/BaseBuilder/Validations.php b/classes/includes/vendor/globalpayments/php-sdk/src/Builders/BaseBuilder/Validations.php deleted file mode 100644 index a9773a0..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Builders/BaseBuilder/Validations.php +++ /dev/null @@ -1,46 +0,0 @@ -rules = []; - } - - /** - * Creates a new `ValidationTarget` for the given - * transaction type mask. - * - * @param TransactionType|int $type Mask of transaction types - * @param TransactionModifier|int $modifier Transaction modifier - * - * @return ValidationTarget - */ - public function of($type, $modifier = TransactionModifier::NONE) - { - if (!array_key_exists($type, $this->rules)) { - $this->rules[$type] = []; - } - - $target = new ValidationTarget($this, $type, $modifier); - $this->rules[$type][] = $target; - return $target; - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Builders/ManagementBuilder.php b/classes/includes/vendor/globalpayments/php-sdk/src/Builders/ManagementBuilder.php deleted file mode 100644 index e61f5a7..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Builders/ManagementBuilder.php +++ /dev/null @@ -1,383 +0,0 @@ -paymentMethod instanceof TransactionReference) { - return $this->paymentMethod->transactionId; - } - return null; - case 'orderId': - if ($this->paymentMethod instanceof TransactionReference) { - return $this->paymentMethod->orderId; - } - return null; - case 'authorizationCode': - if ($this->paymentMethod instanceof TransactionReference) { - return $this->paymentMethod->authCode; - } - return null; - } - } - - public function __isset($name) - { - return in_array($name, [ - 'transactionId', - 'orderId', - 'authorizationId', - ]) || isset($this->{$name}); - } - - /** - * {@inheritdoc} - * - * @return Transaction - */ - public function execute() - { - parent::execute(); - return ServicesContainer::instance() - ->getClient() - ->manageTransaction($this); - } - - /** - * {@inheritdoc} - * - * @return void - */ - protected function setupValidations() - { - $this->validations->of( - TransactionType::CAPTURE | - TransactionType::EDIT | - TransactionType::HOLD | - TransactionType::RELEASE - ) - ->check('transactionId')->isNotNull(); - - $this->validations->of(TransactionType::EDIT) - ->with(TransactionModifier::LEVEL_II) - ->check('taxType')->isNotNull(); - - $this->validations->of(TransactionType::REFUND) - ->when('amount')->isNotNull() - ->check('currency')->isNotNull(); - - $this->validations->of(TransactionType::VERIFY_SIGNATURE) - ->check('payerAuthenticationResponse')->isNotNull() - ->check('amount')->isNotNull() - ->check('currency')->isNotNull() - ->check('orderId')->isNotNull(); - - $this->validations->of(TransactionType::TOKEN_DELETE | TransactionType::TOKEN_UPDATE) - ->check('paymentMethod')->isNotNull() - ->check('paymentMethod')->isInstanceOf(ITokenizable::class); - - $this->validations->of(TransactionType::TOKEN_UPDATE) - ->check('paymentMethod')->isInstanceOf(CreditCardData::class); - } - - /** - * Sets the current transaction's amount. - * - * @param string|float $amount The amount - * - * @return ManagementBuilder - */ - public function withAmount($amount) - { - $this->amount = $amount; - return $this; - } - - /** - * Sets the current transaction's authorized amount; where applicable. - * - * @param string|float $authAmount The authorized amount - * - * @return ManagementBuilder - */ - public function withAuthAmount($authAmount) - { - $this->authAmount = $authAmount; - return $this; - } - - /** - * Sets the currency. - * - * The formatting for the supplied value will currently depend on the - * configured gateway's requirements. - * - * @param string $currency The currency - * - * @return ManagementBuilder - */ - public function withCurrency($currency) - { - $this->currency = $currency; - return $this; - } - - /** - * Sets the transaction's description. - * - * This value is not guaranteed to be sent in the authorization - * or settlement process. - * - * @param string $value The description - * - * @return ManagementBuilder - */ - public function withDescription($value) - { - $this->description = $value; - return $this; - } - - /** - * Sets the gratuity amount; where applicable. - * - * This value is information only and does not affect the - * authorization amount. - * - * @param string|float $gratuity the gratuity - * - * @return ManagementBuilder - */ - public function withGratuity($gratuity) - { - $this->gratuity = $gratuity; - return $this; - } - - /** - * @return ManagementBuilder - */ - public function withIssuerData(CardIssuerEntryTag $tag, String $value) - { - if ($this->issuerData == null) { - $this->issuerData = []; - } - $this->issuerData[$tag] = $value; - return $this; - } - - /** - * Previous request's transaction reference - * - * @internal - * @param IPaymentMethod $paymentMethod Transaction reference - * - * @return ManagementBuilder - */ - public function withPaymentMethod(IPaymentMethod $paymentMethod) - { - $this->paymentMethod = $paymentMethod; - return $this; - } - - /** - * Sets the purchase order number; where applicable. - * - * @param string|float $poNumber The purchase order number - * - * @return ManagementBuilder - */ - public function withPoNumber($poNumber) - { - $this->poNumber = $poNumber; - return $this; - } - - /** - * Sets the reason code for the transaction. - * - * @param ReasonCode $value The reason code - * - * @return ManagementBuilder - */ - public function withReasonCode($value) - { - $this->reasonCode = $value; - return $this; - } - - /** - * Sets the tax amount. - * - * Useful for commercial purchase card requests. - * - * @param string|float $taxAmount The tax amount - * - * @return ManagementBuilder - */ - public function withTaxAmount($taxAmount) - { - $this->taxAmount = $taxAmount; - return $this; - } - - /** - * Sets the tax type. - * - * Useful for commercial purchase card requests. - * - * @param TaxType $taxType The tax type - * - * @return ManagementBuilder - */ - public function withTaxType($taxType) - { - $this->taxType = $taxType; - return $this; - } - - public function withAlternativePaymentType($alternativePaymentType) - { - $this->alternativePaymentType = $alternativePaymentType; - return $this; - } - - public function withPayerAuthenticationResponse($payerAuthenticationResponse) - { - $this->payerAuthenticationResponse = $payerAuthenticationResponse; - return $this; - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Builders/RecurringBuilder.php b/classes/includes/vendor/globalpayments/php-sdk/src/Builders/RecurringBuilder.php deleted file mode 100644 index 2c48de3..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Builders/RecurringBuilder.php +++ /dev/null @@ -1,92 +0,0 @@ - - */ - public $searchCriteria; - - /** - * @param TransactionType $type - * @param IRecurringEntity $entity - * - * @return - */ - public function __construct($type, IRecurringEntity $entity = null) - { - parent::__construct($type); - - $this->searchCriteria = []; - if ($entity !== null) { - $this->entity = $entity; - $this->key = $entity->key; - } - } - - /** - * @internal - * @param string $key - * @param string $value - * - * @return RecurringBuilder - */ - public function addSearchCriteria($key, $value) - { - $this->searchCriteria[$key] = $value; - return $this; - } - - /** - * Executes the builder against the gateway. - * - * @return mixed - */ - public function execute() - { - parent::execute(); - - $client = ServicesContainer::instance()->getRecurringClient(); - return $client->processRecurring($this); - } - - protected function setupValidations() - { - $this->validations->of( - TransactionType::EDIT | - TransactionType::DELETE | - TransactionType::FETCH - ) - ->check('key')->isNotNull(); - - $this->validations->of( - TransactionType::SEARCH - ) - ->check('searchCriteria')->isNotNull(); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Builders/ReportBuilder.php b/classes/includes/vendor/globalpayments/php-sdk/src/Builders/ReportBuilder.php deleted file mode 100644 index 73138db..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Builders/ReportBuilder.php +++ /dev/null @@ -1,44 +0,0 @@ -reportType = $reportType; - } - - /** - * Executes the builder against the gateway. - * - * @return mixed - */ - public function execute() - { - parent::execute(); - - $client = ServicesContainer::instance()->getClient(); - return $client->processReport($this); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Builders/Secure3dBuilder.php b/classes/includes/vendor/globalpayments/php-sdk/src/Builders/Secure3dBuilder.php deleted file mode 100644 index a77fddc..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Builders/Secure3dBuilder.php +++ /dev/null @@ -1,1228 +0,0 @@ - */ - public $sdkUiTypes; - /** @var Address */ - public $shippingAddress; - /** @var DateTime */ - public $shippingAddressCreateDate; - /** @var AgeIndicator */ - public $shippingAddressUsageIndicator; - /** @var ShippingMethod */ - public $shippingMethod; - /** @var bool */ - public $shippingNameMatchesCardHolderName; - /** @var ThreeDSecure */ - public $threeDSecure; - /** @var TransactionType */ - public $transactionType; - /** @var TransactionModifier */ - public $transactionModifier = TransactionModifier::NONE; - // /** @var Secure3dVersion */ - // public $version; - /** @var string */ - public $workCountryCode; - /** @var string */ - public $workNumber; - - public function __construct($transactionType) - { - parent::__construct(); - $this->authenticationSource = AuthenticationSource::BROWSER; - $this->authenticationRequestType = AuthenticationRequestType::PAYMENT_TRANSACTION; - $this->messageCategory = MessageCategory::PAYMENT_AUTHENTICATION; - $this->transactionType = $transactionType; - } - - /** @return AgeIndicator */ - public function getAccountAgeIndicator() - { - return $this->accountAgeIndicator; - } - /** @return DateTime */ - public function getAccountChangeDate() - { - return $this->accountChangeDate; - } - /** @return DateTime */ - public function getAccountCreateDate() - { - return $this->accountCreateDate; - } - /** @return AgeIndicator */ - public function getAccountChangeIndicator() - { - return $this->accountChangeIndicator; - } - /** @return bool */ - public function isAddressMatchIndicator() - { - return $this->addressMatchIndicator; - } - /** @return string|float */ - public function getAmount() - { - return $this->amount; - } - /** @return string */ - public function getApplicationId() - { - return $this->applicationId; - } - /** @return AuthenticationSource */ - public function getAuthenticationSource() - { - return $this->authenticationSource; - } - /** @return AuthenticationRequestType */ - public function getAuthenticationRequestType() - { - return $this->authenticationRequestType; - } - /** @return address */ - public function getBillingAddress() - { - return $this->billingAddress; - } - /** @return BrowserData */ - public function getBrowserData() - { - return $this->browserData; - } - /** @return string */ - public function getCurrency() - { - return $this->currency; - } - /** @return string */ - public function getCustomerAccountId() - { - return $this->customerAccountId; - } - /** @return string */ - public function getCustomerAuthenticationData() - { - return $this->customerAuthenticationData; - } - /** @return CustomerAuthenticationMethod */ - public function getCustomerAuthenticationMethod() - { - return $this->customerAuthenticationMethod; - } - /** @return DateTime */ - public function getCustomerAuthenticationTimestamp() - { - return $this->customerAuthenticationTimestamp; - } - /** @return string */ - public function getCustomerEmail() - { - return $this->customerEmail; - } - /** @return string */ - public function getDeliveryEmail() - { - return $this->deliveryEmail; - } - /** @return DeliveryTimeFrame */ - public function getDeliveryTimeframe() - { - return $this->deliveryTimeframe; - } - /** @return string */ - public function getEncodedData() - { - return $this->encodedData; - } - /** @return string */ - public function getEphemeralPublicKey() - { - return $this->ephemeralPublicKey; - } - /** @return int */ - public function getGiftCardCount() - { - return $this->giftCardCount; - } - /** @return string */ - public function getGiftCardCurrency() - { - return $this->giftCardCurrency; - } - /** @return decimal */ - public function getGiftCardAmount() - { - return $this->giftCardAmount; - } - /** @return string */ - public function getHomeCountryCode() - { - return $this->homeCountryCode; - } - /** @return string */ - public function getHomeNumber() - { - return $this->homeNumber; - } - /** @return int */ - public function getMaxNumberOfInstallments() - { - return $this->maxNumberOfInstallments; - } - /** @return int */ - public function getMaximumTimeout() - { - return $this->maximumTimeout; - } - /** @return MerchantDataCollection */ - public function getMerchantData() - { - return $this->merchantData; - } - /** @return MessageCategory */ - public function getMessageCategory() - { - return $this->messageCategory; - } - /** @return AuthenticationRequestType */ - public function getMerchantInitiatedRequestType() - { - return $this->merchantInitiatedRequestType; - } - /** @return MessageVersion */ - public function getMessageVersion() - { - return $this->messageVersion; - } - /** @return MethodUrlCompletion */ - public function getMethodUrlCompletion() - { - return $this->methodUrlCompletion; - } - /** @return string */ - public function getMobileCountryCode() - { - return $this->mobileCountryCode; - } - /** @return string */ - public function getMobileNumber() - { - return $this->mobileNumber; - } - /** @return int */ - public function getNumberOfAddCardAttemptsInLast24Hours() - { - return $this->numberOfAddCardAttemptsInLast24Hours; - } - /** @return int */ - public function getNumberOfPurchasesInLastSixMonths() - { - return $this->numberOfPurchasesInLastSixMonths; - } - /** @return int */ - public function getNumberOfTransactionsInLast24Hours() - { - return $this->numberOfTransactionsInLast24Hours; - } - /** @return int */ - public function getNumberOfTransactionsInLastYear() - { - return $this->numberOfTransactionsInLastYear; - } - /** @return DateTime */ - public function getOrderCreateDate() - { - return $this->orderCreateDate; - } - /** @return string */ - public function getOrderId() - { - return $this->orderId; - } - /** @return OrderTransactionType */ - public function getOrderTransactionType() - { - return $this->orderTransactionType; - } - /** @return DateTime */ - public function getPasswordChangeDate() - { - return $this->passwordChangeDate; - } - /** @return AgeIndicator */ - public function getPasswordChangeIndicator() - { - return $this->passwordChangeIndicator; - } - /** @return DateTime */ - public function getPaymentAccountCreateDate() - { - return $this->paymentAccountCreateDate; - } - /** @return AgeIndicator */ - public function getPaymentAgeIndicator() - { - return $this->paymentAgeIndicator; - } - /** @return string */ - public function getPayerAuthenticationResponse() - { - return $this->payerAuthenticationResponse; - } - /** @return IPaymentMethod */ - public function getPaymentMethod() - { - return $this->paymentMethod; - } - /** @return DateTime */ - public function getPreOrderAvailabilityDate() - { - return $this->preOrderAvailabilityDate; - } - /** @return PreOrderIndicator */ - public function getPreOrderIndicator() - { - return $this->preOrderIndicator; - } - /** @return bool */ - public function getPreviousSuspiciousActivity() - { - return $this->previousSuspiciousActivity; - } - /** @return string */ - public function getPriorAuthenticationData() - { - return $this->priorAuthenticationData; - } - /** @return PriorAuthenticationMethod */ - public function getPriorAuthenticationMethod() - { - return $this->priorAuthenticationMethod; - } - /** @return string */ - public function getPriorAuthenticationTransactionId() - { - return $this->priorAuthenticationTransactionId; - } - /** @return DateTime */ - public function getPriorAuthenticationTimestamp() - { - return $this->priorAuthenticationTimestamp; - } - /** @return DateTime */ - public function getRecurringAuthorizationExpiryDate() - { - return $this->recurringAuthorizationExpiryDate; - } - /** @return int */ - public function getRecurringAuthorizationFrequency() - { - return $this->recurringAuthorizationFrequency; - } - /** @return string */ - public function getReferenceNumber() - { - return $this->referenceNumber; - } - /** @return ReorderIndicator */ - public function getReorderIndicator() - { - return $this->reorderIndicator; - } - /** @return SdkInterface */ - public function getSdkInterface() - { - return $this->sdkInterface; - } - /** @return string */ - public function getSdkTransactionId() - { - return $this->sdkTransactionId; - } - /** @return array */ - public function getSdkUiTypes() - { - return $this->sdkUiTypes; - } - /** @return string */ - public function getServerTransactionId() - { - if (!empty($this->threeDSecure)) { - return $this->threeDSecure->serverTransactionId; - } - return null; - } - /** @return Address */ - public function getShippingAddress() - { - return $this->shippingAddress; - } - /** @return DateTime */ - public function getShippingAddressCreateDate() - { - return $this->shippingAddressCreateDate; - } - /** @return AgeIndicator */ - public function getShippingAddressUsageIndicator() - { - return $this->shippingAddressUsageIndicator; - } - /** @return ShippingMethod */ - public function getShippingMethod() - { - return $this->shippingMethod; - } - /** @return bool */ - public function getShippingNameMatchesCardHolderName() - { - return $this->shippingNameMatchesCardHolderName; - } - /** @return ThreeDSecure */ - public function getThreeDSecure() - { - return $this->threeDSecure; - } - /** @return TransactionType */ - public function getTransactionType() - { - return $this->transactionType; - } - /** @return Secure3dVersion */ - public function getVersion() - { - if (!empty($this->threeDSecure)) { - return $this->threeDSecure->version; - } - return null; - } - /** @return string */ - public function getWorkCountryCode() - { - return $this->workCountryCode; - } - /** @return string */ - public function getWorkNumber() - { - return $this->workNumber; - } - - // HELPER METHOD FOR THE CONNECTOR - /** @return bool */ - public function hasMobileFields() - { - return( - !empty($this->applicationId) || - $this->ephemeralPublicKey != null || - $this->maximumTimeout != null || - $this->referenceNumber != null || - !empty($this->sdkTransactionId) || - !empty($this->encodedData) || - $this->sdkInterface != null || - $this->sdkUiTypes != null - ); - } - /** @return bool */ - public function hasPriorAuthenticationData() - { - return ( - $this->priorAuthenticationMethod != null || - !empty($this->priorAuthenticationTransactionId) || - $this->priorAuthenticationTimestamp != null || - !empty($this->priorAuthenticationData) - ); - } - /** @return bool */ - public function hasRecurringAuthData() - { - return ( - $this->maxNumberOfInstallments != null || - $this->recurringAuthorizationFrequency != null || - $this->recurringAuthorizationExpiryDate != null - ); - } - /** @return bool */ - public function hasPayerLoginData() - { - return ( - !empty($this->customerAuthenticationData) || - $this->customerAuthenticationTimestamp != null || - $this->customerAuthenticationMethod != null - ); - } - - /** @return Secure3dBuilder */ - public function withAddress(Address $address, $type = AddressType::BILLING) - { - if ($type === AddressType::BILLING) { - $this->billingAddress = $address; - } else { - $this->shippingAddress = $address; - } - return $this; - } - - /** @return Secure3dBuilder */ - public function withAccountAgeIndicator($ageIndicator) - { - $this->accountAgeIndicator = $ageIndicator; - return $this; - } - - /** @return Secure3dBuilder */ - public function withAccountChangeDate($accountChangeDate) - { - $this->accountChangeDate = $accountChangeDate; - return $this; - } - - /** @return Secure3dBuilder */ - public function withAccountCreateDate($accountCreateDate) - { - $this->accountCreateDate = $accountCreateDate; - return $this; - } - - /** @return Secure3dBuilder */ - public function withAccountChangeIndicator($accountChangeIndicator) - { - $this->accountChangeIndicator = $accountChangeIndicator; - return $this; - } - - /** @return Secure3dBuilder */ - public function withAddressMatchIndicator(bool $value) - { - $this->addressMatchIndicator = $value; - return $this; - } - - /** @return Secure3dBuilder */ - public function withAmount($value) - { - $this->amount = $value; - return $this; - } - - /** @return Secure3dBuilder */ - public function withApplicationId($applicationId) - { - $this->applicationId = $applicationId; - return $this; - } - - /** @return Secure3dBuilder */ - public function withAuthenticationSource($value) - { - $this->authenticationSource = $value; - return $this; - } - - /** @return Secure3dBuilder */ - public function withAuthenticationRequestType($value) - { - $this->authenticationRequestType = $value; - return $this; - } - - /** @return Secure3dBuilder */ - public function withBrowserData($value) - { - $this->browserData = $value; - return $this; - } - - /** @return Secure3dBuilder */ - public function withCustomerAccountId($customerAccountId) - { - $this->customerAccountId = $customerAccountId; - return $this; - } - - /** @return Secure3dBuilder */ - public function withCustomerAuthenticationData($customerAuthenticationData) - { - $this->customerAuthenticationData = $customerAuthenticationData; - return $this; - } - - /** @return Secure3dBuilder */ - public function withCustomerAuthenticationMethod($customerAuthenticationMethod) - { - $this->customerAuthenticationMethod = $customerAuthenticationMethod; - return $this; - } - - /** @return Secure3dBuilder */ - public function withCustomerAuthenticationTimestamp($customerAuthenticationTimestamp) - { - $this->customerAuthenticationTimestamp = $customerAuthenticationTimestamp; - return $this; - } - - /** @return Secure3dBuilder */ - public function withCurrency($value) - { - $this->currency = $value; - return $this; - } - - /** @return Secure3dBuilder */ - public function withCustomerEmail($value) - { - $this->customerEmail = $value; - return $this; - } - - /** @return Secure3dBuilder */ - public function withDeliveryEmail($deliveryEmail) - { - $this->deliveryEmail = $deliveryEmail; - return $this; - } - - /** @return Secure3dBuilder */ - public function withDeliveryTimeFrame($deliveryTimeframe) - { - $this->deliveryTimeframe = $deliveryTimeframe; - return $this; - } - - /** @return Secure3dBuilder */ - public function withEncodedData($encodedData) - { - $this->encodedData = $encodedData; - return $this; - } - - /** @return Secure3dBuilder */ - public function withEphemeralPublicKey($ephemeralPublicKey) - { - $this->ephemeralPublicKey = $ephemeralPublicKey; - return $this; - } - - /** @return Secure3dBuilder */ - public function withGiftCardCount($giftCardCount) - { - $this->giftCardCount = $giftCardCount; - return $this; - } - - /** @return Secure3dBuilder */ - public function withGiftCardCurrency($giftCardCurrency) - { - $this->giftCardCurrency = $giftCardCurrency; - return $this; - } - - /** @return Secure3dBuilder */ - public function withGiftCardAmount($giftCardAmount) - { - $this->giftCardAmount = $giftCardAmount; - return $this; - } - - /** @return Secure3dBuilder */ - public function withHomeNumber($countryCode, $number) - { - $this->homeCountryCode = $countryCode; - $this->homeNumber = $number; - return $this; - } - - /** @return Secure3dBuilder */ - public function withMaxNumberOfInstallments($maxNumberOfInstallments) - { - $this->maxNumberOfInstallments = $maxNumberOfInstallments; - return $this; - } - - /** @return Secure3dBuilder */ - public function withMaximumTimeout($maximumTimeout) - { - $this->maximumTimeout = $maximumTimeout; - return $this; - } - - /** @return Secure3dBuilder */ - public function withMerchantData(MerchantDataCollection $value) - { - $this->merchantData = $value; - if (!empty($this->merchantData)) { - if (empty($this->threeDSecure)) { - $this->threeDSecure = new ThreeDSecure(); - } - $this->threeDSecure->setMerchantData($value); - } - return $this; - } - - /** @return Secure3dBuilder */ - public function withMessageCategory($value) - { - $this->messageCategory = $value; - return $this; - } - - /** @return Secure3dBuilder */ - public function withMerchantInitiatedRequestType($merchantInitiatedRequestType) - { - $this->merchantInitiatedRequestType = $merchantInitiatedRequestType; - return $this; - } - - /** @return Secure3dBuilder */ - public function withMessageVersion($value) - { - $this->messageVersion = $value; - return $this; - } - - /** @return Secure3dBuilder */ - public function withMethodUrlCompletion($value) - { - $this->methodUrlCompletion = $value; - return $this; - } - - /** @return Secure3dBuilder */ - public function withMobileNumber($countryCode, $number) - { - $this->mobileCountryCode = $countryCode; - $this->mobileNumber = $number; - return $this; - } - - /** @return Secure3dBuilder */ - public function withNumberOfAddCardAttemptsInLast24Hours($numberOfAddCardAttemptsInLast24Hours) - { - $this->numberOfAddCardAttemptsInLast24Hours = $numberOfAddCardAttemptsInLast24Hours; - return $this; - } - - /** @return Secure3dBuilder */ - public function withNumberOfPurchasesInLastSixMonths($numberOfPurchasesInLastSixMonths) - { - $this->numberOfPurchasesInLastSixMonths = $numberOfPurchasesInLastSixMonths; - return $this; - } - - /** @return Secure3dBuilder */ - public function withNumberOfTransactionsInLast24Hours($numberOfTransactionsInLast24Hours) - { - $this->numberOfTransactionsInLast24Hours = $numberOfTransactionsInLast24Hours; - return $this; - } - - /** @return Secure3dBuilder */ - public function withNumberOfTransactionsInLastYear($numberOfTransactionsInLastYear) - { - $this->numberOfTransactionsInLastYear = $numberOfTransactionsInLastYear; - return $this; - } - - /** @return Secure3dBuilder */ - public function withOrderCreateDate($value) - { - $this->orderCreateDate = $value; - return $this; - } - - /** @return Secure3dBuilder */ - public function withOrderId($value) - { - $this->orderId = $value; - return $this; - } - - /** @return Secure3dBuilder */ - public function withOrderTransactionType($orderTransactionType) - { - $this->orderTransactionType = $orderTransactionType; - return $this; - } - - /** @return Secure3dBuilder */ - public function withPasswordChangeDate($passwordChangeDate) - { - $this->passwordChangeDate = $passwordChangeDate; - return $this; - } - - /** @return Secure3dBuilder */ - public function withPasswordChangeIndicator($passwordChangeIndicator) - { - $this->passwordChangeIndicator = $passwordChangeIndicator; - return $this; - } - - /** @return Secure3dBuilder */ - public function withPaymentAccountCreateDate($paymentAccountCreateDate) - { - $this->paymentAccountCreateDate = $paymentAccountCreateDate; - return $this; - } - - /** @return Secure3dBuilder */ - public function withPaymentAccountAgeIndicator($paymentAgeIndicator) - { - $this->paymentAgeIndicator = $paymentAgeIndicator; - return $this; - } - - /** @return Secure3dBuilder */ - public function withPayerAuthenticationResponse($value) - { - $this->payerAuthenticationResponse = $value; - return $this; - } - - /** @return Secure3dBuilder */ - public function withPaymentMethod($value) - { - $this->paymentMethod = $value; - if ($this->paymentMethod instanceof ISecure3d) { - $secureEcom = $this->paymentMethod->threeDSecure; - if (!empty($secureEcom)) { - $this->threeDSecure = $secureEcom; - } - } - return $this; - } - - /** @return Secure3dBuilder */ - public function withPreOrderAvailabilityDate($preOrderAvailabilityDate) - { - $this->preOrderAvailabilityDate = $preOrderAvailabilityDate; - return $this; - } - - /** @return Secure3dBuilder */ - public function withPreOrderIndicator($preOrderIndicator) - { - $this->preOrderIndicator = $preOrderIndicator; - return $this; - } - - /** @return Secure3dBuilder */ - public function withPreviousSuspiciousActivity(bool $previousSuspiciousActivity) - { - $this->previousSuspiciousActivity = $previousSuspiciousActivity; - return $this; - } - - /** @return Secure3dBuilder */ - public function withPriorAuthenticationData($priorAuthenticationData) - { - $this->priorAuthenticationData = $priorAuthenticationData; - return $this; - } - - /** @return Secure3dBuilder */ - public function withPriorAuthenticationMethod($priorAuthenticationMethod) - { - $this->priorAuthenticationMethod = $priorAuthenticationMethod; - return $this; - } - - /** @return Secure3dBuilder */ - public function withPriorAuthenticationTransactionId($priorAuthencitationTransactionId) - { - $this->priorAuthenticationTransactionId = $priorAuthencitationTransactionId; - return $this; - } - - /** @return Secure3dBuilder */ - public function withPriorAuthenticationTimestamp($priorAuthenticationTimestamp) - { - $this->priorAuthenticationTimestamp = $priorAuthenticationTimestamp; - return $this; - } - - /** @return Secure3dBuilder */ - public function withRecurringAuthorizationExpiryDate($recurringAuthorizationExpiryDate) - { - $this->recurringAuthorizationExpiryDate = $recurringAuthorizationExpiryDate; - return $this; - } - - /** @return Secure3dBuilder */ - public function withRecurringAuthorizationFrequency($recurringAuthorizationFrequency) - { - $this->recurringAuthorizationFrequency = $recurringAuthorizationFrequency; - return $this; - } - - /** @return Secure3dBuilder */ - public function withReferenceNumber($referenceNumber) - { - $this->referenceNumber = $referenceNumber; - return $this; - } - - /** @return Secure3dBuilder */ - public function withReorderIndicator($reorderIndicator) - { - $this->reorderIndicator = $reorderIndicator; - return $this; - } - - /** @return Secure3dBuilder */ - public function withSdkInterface($sdkInterface) - { - $this->sdkInterface = $sdkInterface; - return $this; - } - - /** @return Secure3dBuilder */ - public function withSdkTransactionId($sdkTransactionId) - { - $this->sdkTransactionId = $sdkTransactionId; - return $this; - } - - /** @return Secure3dBuilder */ - public function withSdkUiTypes($sdkUiTypes) - { - $this->sdkUiTypes = $sdkUiTypes; - return $this; - } - - /** @return Secure3dBuilder */ - public function withServerTransactionId($value) - { - if (empty($this->threeDSecure)) { - $this->threeDSecure = new ThreeDSecure(); - } - $this->threeDSecure->serverTransactionId = $value; - return $this; - } - - /** @return Secure3dBuilder */ - public function withShippingAddressCreateDate($shippingAddressCreateDate) - { - $this->shippingAddressCreateDate = $shippingAddressCreateDate; - return $this; - } - - /** @return Secure3dBuilder */ - public function withShippingAddressUsageIndicator($shippingAddressUsageIndicator) - { - $this->shippingAddressUsageIndicator = $shippingAddressUsageIndicator; - return $this; - } - - /** @return Secure3dBuilder */ - public function withShippingMethod($shippingMethod) - { - $this->shippingMethod = $shippingMethod; - return $this; - } - - /** @return Secure3dBuilder */ - public function withShippingNameMatchesCardHolderName($shippingNameMatchesCardHolderName) - { - $this->shippingNameMatchesCardHolderName = $shippingNameMatchesCardHolderName; - return $this; - } - - /** @return Secure3dBuilder */ - public function withThreeDSecure(ThreeDSecure $threeDSecure) - { - $this->threeDSecure = $threeDSecure; - return $this; - } - - /** @return Secure3dBuilder */ - public function withTransactionType($transactionType) - { - $this->transactionType = $transactionType; - return $this; - } - - /** @return Secure3dBuilder */ - public function withWorkNumber($countryCode, $number) - { - $this->workCountryCode = $countryCode; - $this->workNumber = $number; - return $this; - } - - /** - * @throws ApiException - * @return ThreeDSecure */ - public function execute($version = Secure3dVersion::ANY) - { - // TODO Get validations working - // parent::execute(); - - // setup return object - $rvalue = $this->threeDSecure; - if (empty($rvalue)) { - $rvalue = new ThreeDSecure(); - $rvalue->setVersion($version); - } - - // working version - if ($rvalue->getVersion() != null) { - $version = $rvalue->getVersion(); - } - - // get the provider - $provider = ServicesContainer::instance()->getSecure3d($version); - if (!empty($provider)) { - $canDowngrade = false; - if ($provider->getVersion() === Secure3dVersion::TWO && $version === Secure3dVersion::ANY) { - try { - $oneProvider = ServicesContainer::instance()->getSecure3d(Secure3dVersion::ONE); - $canDowngrade = (bool)(!empty($oneProvider)); - } catch (ConfigurationException $exc) { - // NOT CONFIGURED - } - } - - // process the request, capture any exceptions which might have been thrown - $response = null; - try { - $response = $provider->processSecure3d($this); - - if (empty($response) && (bool)$canDowngrade) { - return $this->execute(Secure3dVersion::ONE); - } - } catch (GatewayException $exc) { - // check for not enrolled - if ($exc->responseCode != null) { - if ($exc->responseCode == '110' && $provider->getVersion() === Secure3dVersion::ONE) { - return $rvalue; - } - } elseif ((bool)$canDowngrade && $this->transactionType === TransactionType::VERIFY_ENROLLED) { // check if we can downgrade - return $this->execute(Secure3dVersion::ONE); - } else { // throw exception - throw $exc; - } - } - - // check the response - if (!empty($response)) { - switch ($this->transactionType) { - case TransactionType::VERIFY_ENROLLED: - if (!empty($response->threeDSecure)) { - $rvalue = $response->threeDSecure; - if ((bool)$rvalue->enrolled) { - $rvalue->setAmount($this->amount); - $rvalue->setCurrency($this->currency); - $rvalue->setOrderId($response->orderId); - $rvalue->setVersion($provider->getVersion()); - } elseif ((bool)$canDowngrade) { - return $this->execute(Secure3dVersion::ONE); - } - } elseif ((bool)$canDowngrade) { - return $this->execute(Secure3dVersion::ONE); - } - break; - case TransactionType::INITIATE_AUTHENTICATION: - case TransactionType::VERIFY_SIGNATURE: { - $rvalue->merge($response->threeDSecure); - } break; - } - } - } - return $rvalue; - } - - /** @return void */ - public function setupValidations() - { - $this->validations->of(TransactionType::VERIFY_ENROLLED) - ->check('paymentMethod')->isNotNull(); - - $this->validations->of(TransactionType::VERIFY_ENROLLED) - ->when('paymentMethod')->isNotNull() - ->check('paymentMethod')->isInstanceOf(ISecure3d::class); - - $this->validations->of(TransactionType::VERIFY_SIGNATURE) - ->when('version')->isEqualTo(Secure3dVersion::ONE) - ->check('threeDSecure')->isNotNull() - ->when('version')->isEqualTo(Secure3dVersion::ONE) - ->check('payerAuthenticationResponse')->isNotNull(); - - $this->validations->of(TransactionType::VERIFY_SIGNATURE) - ->when('version')->isEqualTo(Secure3dVersion::TWO) - ->check('serverTransactionId')->isNotNull(); - - $this->validations->of(TransactionType::INITIATE_AUTHENTICATION) - ->check('threeDSecure')->isNotNull(); - - $this->validations->of(TransactionType::INITIATE_AUTHENTICATION) - ->when('paymentMethod')->isNotNull() - ->check('paymentMethod')->isInstanceOf(ISecure3d::class); - - $this->validations->of(TransactionType::INITIATE_AUTHENTICATION) - ->when('merchantInitiatedRequestType')->isNotNull() - ->check('merchantInitiatedRequestType')->isNotEqualTo(AuthenticationRequestType::PAYMENT_TRANSACTION); - - $this->validations->of(TransactionType::INITIATE_AUTHENTICATION) - ->when('accountAgeIndicator')->isNotNull() - ->check('accountAgeIndicator')->isNotEqualTo(AgeIndicator::NO_CHANGE); - - $this->validations->of(TransactionType::INITIATE_AUTHENTICATION) - ->when('passwordChangeIndicator')->isNotNull() - ->check('passwordChangeIndicator')->isNotEqualTo(AgeIndicator::NO_ACCOUNT); - - $this->validations->of(TransactionType::INITIATE_AUTHENTICATION) - ->when('shippingAddressUsageIndicator')->isNotNull() - ->check('shippingAddressUsageIndicator')->isNotEqualTo(AgeIndicator::NO_CHANGE) - ->when('shippingAddressUsageIndicator')->isNotNull() - ->check('shippingAddressUsageIndicator')->isNotEqualTo(AgeIndicator::NO_ACCOUNT); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Builders/TransactionBuilder.php b/classes/includes/vendor/globalpayments/php-sdk/src/Builders/TransactionBuilder.php deleted file mode 100644 index 6b2a43a..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Builders/TransactionBuilder.php +++ /dev/null @@ -1,99 +0,0 @@ -transactionType = $type; - $this->paymentMethod = $paymentMethod; - } - - /** - * Set the request transaction type - * - * @internal - * @param TransactionType $transactionType Request transaction type - * - * @return AuthorizationBuilder - */ - public function withTransactionType($transactionType) - { - $this->transactionType = $transactionType; - return $this; - } - - /** - * Set the request transaction modifier - * - * @internal - * @param TransactionModifier $modifier Request transaction modifier - * - * @return AuthorizationBuilder - */ - public function withModifier($modifier) - { - $this->transactionModifier = $modifier; - return $this; - } - - /** - * Set the request to allow duplicates - * - * @param bool $allowDuplicates Request to allow duplicates - * - * @return AuthorizationBuilder - */ - public function withAllowDuplicates($allowDuplicates) - { - $this->allowDuplicates = $allowDuplicates; - return $this; - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Builders/TransactionReportBuilder.php b/classes/includes/vendor/globalpayments/php-sdk/src/Builders/TransactionReportBuilder.php deleted file mode 100644 index 6ccd5aa..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Builders/TransactionReportBuilder.php +++ /dev/null @@ -1,148 +0,0 @@ -searchBuilder = new SearchCriteriaBuilder($this); - } - - /** - * Sets the device ID as criteria for the report. - * - * @param string $value The device ID - * - * @return TransactionReportBuilder - */ - public function withDeviceId($value) - { - $this->searchBuilder->deviceId = $value; - return $this; - } - - /** - * Sets the end date as criteria for the report. - * - * @param DateTime $value The end date - * - * @return TransactionReportBuilder - */ - public function withEndDate($value) - { - $this->searchBuilder->endDate = $value; - return $this; - } - - /** - * Sets the start date as criteria for the report. - * - * @param DateTime $value The start date - * - * @return TransactionReportBuilder - */ - public function withStartDate($value) - { - $this->searchBuilder->startDate = $value; - return $this; - } - - /** - * Sets the timezone conversion method for the report. - * - * @param TimeZoneConversion $value The timezone conversion method - * - * @return TransactionReportBuilder - */ - public function withTimeZoneConversion($value) - { - $this->timeZoneConversion = $value; - return $this; - } - - /** - * Sets the transaction ID as criteria for the report. - * - * @param string $value The transaction ID - * - * @return TransactionReportBuilder - */ - public function withTransactionId($value) - { - $this->transactionId = $value; - return $this; - } - - /** - * @return SearchCriteriaBuilder - */ - public function where($criteria, $value) - { - return $this->searchBuilder->and($criteria, $value); - } - - protected function setupValidations() - { - $this->validations->of(ReportType::TRANSACTION_DETAIL) - ->check('transactionId')->isNotNull(); - - $this->validations->of(ReportType::ACTIVITY) - ->check('transactionId')->isNull(); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Address.php b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Address.php deleted file mode 100644 index 2082da0..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Address.php +++ /dev/null @@ -1,96 +0,0 @@ -province) - ? $this->province - : $this->state; - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/AlternativePaymentResponse.php b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/AlternativePaymentResponse.php deleted file mode 100644 index 41193b8..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/AlternativePaymentResponse.php +++ /dev/null @@ -1,53 +0,0 @@ -firstName, $this->lastName); - if (empty(str_replace(' ', '', $nameOnAccount))) { - $nameOnAccount = $this->company; - } - - $payment = new RecurringPaymentMethod($paymentMethod); - $payment->address = $this->address; - $payment->customerKey = $this->key; - $payment->id = $paymentId; - $payment->nameOnAccount = $nameOnAccount; - return $payment; - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/DccRateData.php b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/DccRateData.php deleted file mode 100644 index d6b722e..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/DccRateData.php +++ /dev/null @@ -1,59 +0,0 @@ -channel = EcommerceChannel::ECOM; - $this->shipDay = (new \DateTime()) - ->add(new \DateInterval('P1D')) - ->format('d'); - $this->shipMonth = (new \DateTime()) - ->add(new \DateInterval('P1D')) - ->format('m'); - $this->paymentDataType = '3DSecure'; - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/EncryptionData.php b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/EncryptionData.php deleted file mode 100644 index ee1fb95..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/EncryptionData.php +++ /dev/null @@ -1,70 +0,0 @@ -version = '01'; - return $data; - } - - /** - * Convenience method for creating version `02` encryption data. - * - * @param string $ktb - * @param string $trackNumber - * - * @return EncryptionData - */ - public static function version2($ktb, $trackNumber = null) - { - $data = new EncryptionData(); - $data->version = '02'; - $data->trackNumber = $trackNumber; - $data->ktb = $ktb; - return $data; - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enum.php b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enum.php deleted file mode 100644 index 3fccff6..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enum.php +++ /dev/null @@ -1,36 +0,0 @@ -getConstants() as $allowedValue) { - if ($value === $allowedValue) { - return $allowedValue; - } - } - - throw new ArgumentException( - sprintf( - 'Invalid value `%s` on enum `%s`', - $value, - static::class - ) - ); - } -} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/AccountType.php b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/AccountType.php deleted file mode 100644 index e29b991..0000000 --- a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/AccountType.php +++ /dev/null @@ -1,11 +0,0 @@ - -/// Indicates a reason for the transaction. -/// -/// -/// This is typically used for returns/reversals. -/// -class ReasonCode extends Enum -{ - ///

    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

    pMdfY) znkuzlO`1rIc1T@}GjJ8S#%l><+p>GPAVHMW#tu3HFZXa$PipuWHYCF9@sOOC_Nf>f z2Ul|=w-&c>vCQc-Y{$(t;8)BADyd>Al83I=K)2I60DQ0_pTSp<2TPP#IO340DRjs+ zw_ywrF3wp7nNX;6f=%=ZD50&~o%SW9UDeXze5fRWW|jnKYEzhT93%63gX?PioZXwj z$MoQL8{D5>W`4kQO4@F^?_&ef#W{Jb5p-t!oZ2oWXidJ356I!Qxq$^Q-j3S&Y~2aq zYbM8Xzio=})}!shyhM3bEv}u%Pe%l<-`qppU+6j(FxxPcD})uv1~Hp^0>d$SB=uPa zP(<~(4;wU&gX3+N-tE(2*oCflk_HK#IF&LFHDS~_$Q(=z7_ z3bD-}g5__5-ncUExPeXZ1u~!wls^!vbh&_+%nP6u@F2W0tXT@d?f96QY@8D*ak6F% zJMSs{e#Izta~7jG&@)^xFN#bL^pvpIZEXxILVA=7Mt}n&@ zaIt=tB=PA`f3EzH*P(7abJ|}zPlMvLyK@1Ot^Q^%gdHIqncp0UqtpwmR6T9UFk^_| zh>fp+2o_1=bppPmhkrWNP81Hrspp+Z2D^E`GeBn*c?(HQyLaN*Gidtl^n!)!Yu`G9 zAd)iQ4(_)KeulL%h$N%Wd8zc5UcxeG+5*14^fum&C1A|`_^>}MXhnL$zJo+30xnC; z<_hs&pD$Su{_xvtRwj{e)Hir+{`;MMKC|DwKq_3C;9?j|5_}*4Dzy3jB7zf{T4xnEh&Bh7@fC76+>IfPup*d$Dcy0(FkGt=|mflNI*%)Ir%I zQ67i_Kvh5D@@BhbuAIHU6=b6vj}GVtXH!PlZH8IAyAht)%L^ibUGY>H~+x30Cz_&o^dSwWvDxcQfeTOCi-Cv#a zw43leOw&DW{)xZv>yP+vtGPebZnW^M-A3V~c5`s{(yqL6U+b%)bwzO*ssLL3Y3){j z+U$R?-G2Wu2PVzO$Nct_vf?RqMnT>UIt*}Uz>KU4P!LZ4@_dN?c0PP9dZ2fP0rHos z=bxSrAIHNtAvFSL0l*xeC)4vi^y={ESBL*}&VA2Q{wnBroey7+2cRB)Kh{1$a{+?> z_sH6(f;cGM3f4v-o&ym&q1=lWapI#gePl5XSU#m7M{K#IJa4f~sL(dMn! zC&HD+V|f)^BtgwH5?KHb)?0~SlwRz;t&o6IsMPCKh+jls-xzmgb6nmac(?^7Y0 zIvs$2AiXrCtAjHH79YNY>iY4R)DChWnbYOeqhSXm1H)S6aQ8?mN=zC zfm@HhJFp&icb=@cr8s0JpbvhKC;y;1KmbJu+GP&FRX;Uh|DZXj?dg$&$mN-1w@9}F z@U>EW8KSoTikCSdpQxy5?10fJSS$T~YdJ;IhBLQ;&6{ra7^>)+Wv&`>76VBa6 z5FwM@5qA6BLl{B7MafVsET^MusKXC~PB&?SXvF016zXBR4+x09K z43O~*dw_m!%*MsFFrnN|x@tIE@Q@>jt#NPPID7m**7g6k6#V<}^-ot0vVLAU(vJiS z6+VtD9lzsSNar|FaIvHglsA7#Z-SVy&mI5w;_wH?-=`+@t%?6t$G`d9@jt64Xot7| zk&ge_@V^)sp8Y&?-y!E8ee^1P>-eV+UYkJ=fVFtLFuYI~5|p$w9Ay0bZ1|D?RLB2p z_`%Bqd7jh%yyJg1{K&_6<=^f2QvwCs0!vJg-7Ia7PjN4-D>`7W;t7rd$&0YZ{dq+( z<~gsG4*EzYIUEH_&QC|p3PkAfW06)3SB3zC{GRo;&bC9qck;RyyT0-gJ{`CnXK0Uf(zAhdmThyHQ(w$jAUXH}~mJR+Nkh0&;9cbS^9X#LiApT(`di>g{BG9T{B;uR8 zHE9-{$8DqC=FY6nvmr-S&z2ATmvtHlu~3}kV z=`s-F1_RX&zyPHTHhU%0!FWr&nhw7TYF*e})Op$MRJP4h2Bb`cq=k;rULd?)K4Cm) zi6oe70>G!ONA6M;-Y$;Zhv6QMd>8fHa2U#mCS{h_@syvQjrw%7aOsAU?8EG=WdH}& z7_-#Qo&pVN&x4KCt?k|MJbf=ux9kKfvHq8PrJtGQ*cFR>M}*T70kI~4Q@q}pX0Qza z@Gz!L+A!F$uepd`D>uafqlyj000WL;OX2aIX82{k8Xs)UqYC0-=X1o?CSZe`aLhX3 zq}n{Bo_tFt2J`Q=7t7cC4tgv&MT#eX<%kAgDSZYMyMP>hU+N*$D}7i;!I)U-ba*pI z(Hc6Cq?Qi1as!V2**W$NXQ}t;w!vZR58xgU3T+Sv8$08iA3;(cOk%d~;BDb7@7bc5 zsFV(`3VNOkz%59Xtu>brt51(b199?v;1RjydQ{DkYmqH%Zyw>Bbz2CwaWfi@RKmG) zu-K%}9brXv@VX+1V zSlfKG>U+ZF+2AH@kpiFq2MHye8@=6Si%UUPUaI~cy7qAad^7fK{`!_j|2{(f&Gu~j zPc#cZUJpP0-=8jxAUT6egeTg#Aldjf`M(UAhzTC z@b(>-3>k39dkEa~%zr=fUl*DAL#_tHTSzhbLp1R7^#dF3E4G||`Ba{Z$p69X2X=33 zzLJFUr?TRoyne4J;AdU&Ls{{^`T9XQ@th^S%;-N{Grzum*YtO}!+L3z6^58?l>r2? z1wTGSpYg|K#1*W0KZ2c6Toj-mk_#%a%e^IeFz4P`LSckN@5y@FwKN5BQZC68d>KhB zJ0qY9CaO&z-bCR!5RP%)>rjX(TJZ(saje}UW5=Ej@y%%m@~R?@d@vJvFqwG1jlR_P z$gc`~m>_&ljeryw#~^NZ3ytiVa3v-fEX_GRH=izQ!f_8rJxLD;R7Bi&l8$Poi;KbD zy(V>b^?)sKuhk&!cRaBAb~tHH3Zk!7K;3)s+co3*tg4U-! z43s~ze?-a7Zkw(u4q2=3PU-f#g)1Xu{;}(?T?c~0f<|IZXgi#kBBH`!?%Qw;WPIU< z$#+f5biBD{Yw8@R*O)x3wd`WD>MOHd95a05`*cil>i(g^FdV^8!%?Ro72JwEMmxD) zb?DbtF>w~(6c^~=rt$`Co;ZX|q)mT@=?X{`9{097Caln|IvW4|!7GQYcn`9_@Y*Y< zzy6Q6U+lmPY?u}7cD}z0zPmTr@;!FoK z37}QJS-nBO*0^LAX^pL2Ki%uwoo3&pyb&Z7JqaM-{sx2L3tXH=<8!vu0a};Ayc^TD{Y;!=@`je<@zhJ6O9Ix2T3SnWt8Sb%D~1niK$cwP%nl@m1v2aN z+HkpoE78T%CA}RUmqUC)&*i~ZvAdX_B=o#sDryNHgyR~P%y9fru~VDMOpb_m#ZB&$?Rr5K{wFY#|ZvE2s?Sw^)yNjqoS9F~Cs& zKFCJCy65I|Rc1>P?PM|^h{FuFYsow=sP)eI%Gvln$QIh=As%ex;SQLo0&sx7DWEU!H_($I&gTbrH3Isu zkxTL5?N9_dhb6BZn_2NJ5bhJGMs4`D7(rePsmm!{OXOS03m25+>oY<=Kc#oc#K%hX z`C2Bwa*Oe=q-8vM1}%fnRI*%ThaSPs1q?&c-qxqBxI35b^k}b;q5y#z;-y}5FessM zovqJkN3-h4x{p}R>BlPB;}Eup=~btgx5R8qq_-LVu-rf@GRg1!%yGz+x=xT$K!p$a zxXWz4Vy%THcDHDAlTCEDrHHmao9?c&_tN1qMwPK*+f&{vDMCVSx_%Dw-Gv17uNs{~ zd3m+!TtCN3I7l3Eevr_Mb{N&um2^{&7j;oVyFs1>|8y168dr;RZtk5V$&v8D5A`zI z3?Ld?r|I#i904^Hx~Bx(BjASHX@0pm0poC3-W3UTWyp@d+|0yBYle;ig}c5?5D8IK zGpQjU_1$ugL&xIXJ6&S%hc6|QrED7F<_@-W19kdwh)q~H)sO+KRw*YsOe`PCRW4vU zRL7iFkH+TO2o;Zz#;Sv-EwjbN6}E|2_=9t+mfg*Ev2%@@9nUGV8x5hv^zM;dTo%Or z07T&?$Qt{S=#Lhw9Trpz)_#XD@NQ|!$LdUr}LOf_SRSf zh7}@QASW+W#5?@}u)5RlAFDM)R~rd`iZOyukhY%HwP!T-TIWx?idB%u86?^AoQK72 zZTEiSv+y`2l^HdSr-e}7fwI|Na@UL7u6=;b`%7|Dtn0((fIRF%gZ=nDB2<*~n!GLo0xDW^QzFHl+bFh25UcjoyrjZ+f zR#W|Hld+ruZThmk;IuvyCy55YCIjGT93MbHc>I*wMeh;y5WBf4FKUyUcWb#cd%j z06QLdx3~ejbf;ua;Gau5+)e7NCy=k0TOCjYWR_pktHxAvo9Y}-Mu1_(9`PWzq`|hv zlMt1V0wQOZC~?}0j^9G>uvl}r%~UppQYIwBoUT`Gut!a{=G9HQ+Lo@jhoKQ}8A4W$ zxY%#VZDP|+yUF^?&h=0IfXQh&^-$l;0Gjm=(gH#e9OF2l^Fu>flVHJE4=Vl(S&m|V z8pmL&7{t^HX66q^Z4ca04c>#^QDF`Yh{vBEu&Y0sXt{H@3b9Es91GA>n-9q@YWjU4K`mU_@iv9?NjXMoh9`D^^ z2z27U3HCOz6%Tg+Lud!xd>9gEFNT6eP07D(1GNsi+jx`;szCPpg@FHI(0A&(`oDDH zy_Nh^g+PPT4zM!&_stZoY92cK*YBPd~^5;hyhd9Beb8YiSfp=yx zp91N?>XQS)>pNi(l(zYEGv(W$?E#&Sx3Ojk@cuAk{x&5WuEO=Q7 zie3T7dyw7{UR3m~9NupmF2-BJ!)M;g2~H#MC$yEy$+cKm`Imx+0U+Wl;`~J(izOF` zN#BW=KPNHV=k-0P0^Fi6+DoL4IX1BG4kAb^#OO?-1z2)&1N zYc4s`>ANIpR=(RZA^LUVkbdVaGXt{20`@+cK1GOwJ7(mLi8MG`$ zHE}USM%mHWwKZyhP)Gy$F6#ns!2uy;ot*3D1^{6r_A{>$OL{S^v}1p<7aE{9$!^0k z++xf1=z~rm3A{avi{*A@1|c922l%Y7=Dc6_wz2VyD{aZr?Qw<>yKo1jds;f5{fGgw z%nX@}&J-<46}|cG?i}%VzUzDIF7V230CQqEQ66GcW4i?|ak{CR2G5c;c+r7|YuSnG zQvvnZ*_2u?x9iRP?kiVF+#3MF!`{DcVLmW~@Pl}Zsnl^AelNdvWX~Cj3h97J17WQy zF~g-Beu_hMgMim7WO;uNaU~%RltQ>CiW=zD&~4_=BvVK#1y&>f3><|#Q3v;+3wGp`wVq`-k}Mf&F618$V?sH!dm@TOza95pWm2np3$iDw@lU5^Dnxu1k~mk z-U^RMeSSlDgy!?>YRFp6p3$g~2A{ni>N7_6^~m50yn&dXky4*t8wj|ye#oW}%eRl8 zh{^*JOxOT{w$EASjUd(G8Q%;rw20#!K%0D68OZ7a~~<^Vo!vc}fuHW*N$ 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%0A!7%Ol3@KYb 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 literal 0 HcmV?d00001 diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Builders/AuthorizationBuilder.php b/classes/includes/vendor/globalpayments/php-sdk/src/Builders/AuthorizationBuilder.php new file mode 100644 index 0000000..bb891e4 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Builders/AuthorizationBuilder.php @@ -0,0 +1,1117 @@ + + */ + public $customData; + + /** + * Payment method CVN + * + * Only applicable for recurring payments + * + * @internal + * @var string + */ + public $cvn; + + /** + * Request description + * + * @internal + * @var string + */ + public $description; + + /** + * Request decisionManager + * + * @internal + * @var DecisionManager + */ + public $decisionManager; + + /** + * Request dynamic descriptor + * + * @internal + * @var string + */ + public $dynamicDescriptor; + + /** + * Request ecommerceInfo + * + * @internal + * @var EcommerceInfo + */ + public $ecommerceInfo; + + /** + * Request gratuity + * + * @internal + * @var string|amount + */ + public $gratuity; + + /** + * Request convenience amount + * + * @internal + * @var string|amount + */ + public $convenienceAmount; + + /** + * Request shipping amount + * + * @internal + * @var string|amount + */ + public $shippingAmount; + + /** + * @internal + * @var StoredCredential + */ + public $storedCredential; + + /** + * Request hosted payment data + * + * @internal + * @var HostedPaymentData + */ + public $hostedPaymentData; + + /** + * Request invoice number + * + * @internal + * @var string|float + */ + public $invoiceNumber; + + /** + * Request should request Level II + * + * @internal + * @var bool + */ + public $level2Request; + + /** + * Request offline authorization code + * + * @internal + * @var string + */ + public $offlineAuthCode; + + /** + * Request should be considered one-time + * + * Typically only applicable with recurring payment methods + * + * @internal + * @var bool + */ + public $oneTimePayment; + + /** + * Request order ID + * + * @internal + * @var string|float + */ + public $orderId; + + /** + * Request product Data + * + * @internal + * @var array + */ + public $productData; + + /** + * Request product ID + * + * @internal + * @var string|float + */ + public $productId; + + /** + * Request recurring sequence + * + * @internal + * @var RecurringSequence + */ + public $recurringSequence; + + /** + * Request recurring type + * + * @internal + * @var RecurringType + */ + public $recurringType; + + /** + * Request should request multi-use token + * + * @internal + * @var bool + */ + public $requestMultiUseToken; + + /** + * Request replacement gift card + * + * @internal + * @var GiftCard + */ + public $replacementCard; + + /** + * Request schedule ID + * + * Typically only applicable with recurring payment methods + * + * @internal + * @var string + */ + public $scheduleId; + + /** + * Request shipping address + * + * @internal + * @var Address + */ + public $shippingAddress; + + /** + * Request timestamp + * + * @internal + * @var string|float + */ + public $timestamp; + + /** + * DCC rate Data + * + * @internal + * @var dccRateData + */ + public $dccRateData; + + /** + * DCC processor + * + * @internal + * @var dccProcessor + */ + public $dccProcessor; + + /** + * DCC Rate Type + * + * @internal + * @var dccRateType + */ + public $dccRateType; + + /** + * DCC Type + * + * @internal + * @var dccType + */ + public $dccType; + + /** + * Fraud Filter + * + * Typically only applicable with recurring payment methods + * + * @internal + * @var string + */ + public $fraudFilter; + + /** + * For AVS (Address verification System) request + * + * @internal + * @var bool + */ + public $verifyAddress; + + /** + * {@inheritdoc} + * + * @param TransactionType $type Request transaction type + * @param IPaymentMethod $paymentMethod Request payment method + * + * @return + */ + public function __construct($type, IPaymentMethod $paymentMethod = null) + { + parent::__construct($type, $paymentMethod); + $this->withPaymentMethod($paymentMethod); + } + + /** + * {@inheritdoc} + * + * @return Transaction + */ + public function execute() + { + parent::execute(); + return ServicesContainer::instance() + ->getClient() + ->processAuthorization($this); + } + + /** + * {@inheritdoc} + * + * @return String + */ + public function serialize() + { + $this->transactionModifier = TransactionModifier::HOSTEDREQUEST; + parent::execute(); + + $client = ServicesContainer::instance()->getClient(); + + if ($client->supportsHostedPayments()) { + return $client->serializeRequest($this); + } + throw new UnsupportedTransactionException("Your current gateway does not support hosted payments."); + } + + /** + * {@inheritdoc} + * + * @return void + */ + protected function setupValidations() + { + $this->validations->of( + TransactionType::AUTH | + TransactionType::SALE | + TransactionType::REFUND | + TransactionType::ADD_VALUE + ) + ->with(TransactionModifier::NONE) + ->check('amount')->isNotNull() + ->check('currency')->isNotNull() + ->check('paymentMethod')->isNotNull(); + + $this->validations->of( + TransactionType::AUTH | + TransactionType::SALE + ) + ->with(TransactionModifier::HOSTEDREQUEST) + ->check('amount')->isNotNull() + ->check('currency')->isNotNull(); + + $this->validations->of( + TransactionType::AUTH | + TransactionType::SALE + ) + ->with(TransactionModifier::OFFLINE) + ->check('amount')->isNotNull() + ->check('currency')->isNotNull() + ->check('offlineAuthCode')->isNotNull(); + + $this->validations->of(TransactionType::BALANCE) + ->check('paymentMethod')->isNotNull(); + + $this->validations->of(TransactionType::ALIAS) + ->check('aliasAction')->isNotNull() + ->check('alias')->isNotNull(); + + $this->validations->of(TransactionType::REPLACE) + ->check('replacementCard')->isNotNull(); + + $this->validations->of( + TransactionType::AUTH | + TransactionType::SALE + ) + ->with(TransactionModifier::ENCRYPTED_MOBILE) + ->check('paymentMethod')->isNotNull() + ->check('token')->isNotNullInSubProperty('paymentMethod') + ->check('mobileType')->isNotNullInSubProperty('paymentMethod'); + + $this->validations->of( + TransactionType::VERIFY + ) + ->with(TransactionModifier::HOSTEDREQUEST) + ->check('currency')->isNotNull(); + + $this->validations->of( + TransactionType::AUTH | + TransactionType::SALE + ) + ->with(TransactionModifier::ALTERNATIVE_PAYMENT_METHOD) + ->check('amount')->isNotNull() + ->check('currency')->isNotNull() + ->check('paymentMethod')->isNotNull() + ->check('alternativePaymentMethodType')->isNotNullInSubProperty('paymentMethod') + ->check('returnUrl')->isNotNullInSubProperty('paymentMethod') + ->check('statusUpdateUrl')->isNotNullInSubProperty('paymentMethod') + ->check('country')->isNotNullInSubProperty('paymentMethod') + ->check('accountHolderName')->isNotNullInSubProperty('paymentMethod'); + } + + /** + * Set an address value; where applicable. + * + * Currently supports billing and shipping addresses. + * + * @param Address $address The desired address information + * @param AddressType|string $type The desired address type + * + * @return AuthorizationBuilder + */ + public function withAddress(Address $address, $type = AddressType::BILLING) + { + $address->type = $type; + if ($type === AddressType::BILLING) { + $this->billingAddress = $address; + } else { + $this->shippingAddress = $address; + } + return $this; + } + + /** + * Set the request alias + * + * @internal + * @param string $aliasAction Request alias action + * @param string $alias Request alias + * + * @return AuthorizationBuilder + */ + public function withAlias($aliasAction, $alias) + { + $this->aliasAction = $aliasAction; + $this->alias = $alias; + return $this; + } + + /** + * Set the request to allow duplicates + * + * @param bool $allowDuplicates Request to allow duplicates + * + * @return AuthorizationBuilder + */ + public function withAllowDuplicates($allowDuplicates) + { + $this->allowDuplicates = $allowDuplicates; + return $this; + } + + /** + * Set the request to allow a partial authorization + * + * @param bool $allowPartialAuth Request to allow a partial authorization + * + * @return AuthorizationBuilder + */ + public function withAllowPartialAuth($allowPartialAuth) + { + $this->allowPartialAuth = $allowPartialAuth; + return $this; + } + + /** + * Set the request amount + * + * @param string|float $amount Request amount + * + * @return AuthorizationBuilder + */ + public function withAmount($amount) + { + $this->amount = $amount; + return $this; + } + + /** @return AuthorizationBuilder */ + public function withAmountEstimated($value) + { + $this->amountEstimated = $value; + return $this; + } + + /** + * Set the request authorization amount + * + * @param string|float $authAmount Request authorization amount + * + * @return AuthorizationBuilder + */ + public function withAuthAmount($authAmount) + { + $this->authAmount = $authAmount; + return $this; + } + + /** + * Set the request's balance inquiry type + * + * @param string $balanceInquiryType Balance inquiry type + * + * @return AuthorizationBuilder + */ + public function withBalanceInquiryType($balanceInquiryType) + { + $this->balanceInquiryType = $balanceInquiryType; + return $this; + } + + /** + * Set the request cashback amount + * + * @param string|float $cashbackAmount Request cashback amount + * + * @return AuthorizationBuilder + */ + public function withCashBack($cashBackAmount) + { + $this->cashBackAmount = $cashBackAmount; + $this->transactionModifier = TransactionModifier::CASH_BACK; + return $this; + } + + public function withClientTransactionId($clientTransactionId) + { + if ($this->transactionType !== TransactionType::REVERSAL && $this->transactionType !== TransactionType::REFUND + ) { + $this->clientTransactionId = $clientTransactionId; + return $this; + } + + if (!$this->paymentMethod instanceof TransactionReference) { + $this->paymentMethod = new TransactionReference(); + } + + $this->paymentMethod->clientTransactionId = $clientTransactionId; + return $this; + } + + /** + * Set the request currency + * + * @param string $currency Request currency + * + * @return AuthorizationBuilder + */ + public function withCurrency($currency) + { + $this->currency = $currency; + return $this; + } + + /** + * Set the request customer ID + * + * @param string|float $customerId Request customer ID + * + * @return AuthorizationBuilder + */ + public function withCustomerId($customerId) + { + $this->customerId = $customerId; + return $this; + } + + /** + * Set the request customer IP address + * + * @param string|float $customerIpAddress Request customer IP address + * + * @return AuthorizationBuilder + */ + public function withCustomerIpAddress($customerIpAddress) + { + $this->customerIpAddress = $customerIpAddress; + return $this; + } + + /** + * Set the request customer Data + * + * @param Customer $customerData Request customer Data + * + * @return AuthorizationBuilder + */ + public function withCustomerData(Customer $customerData) + { + $this->customerData = $customerData; + return $this; + } + + /** + * Set the request customData + * + * @param string $customData Request customData + * + * @return AuthorizationBuilder + */ + public function withCustomData($customData) + { + $this->customData = $customData; + return $this; + } + + /** + * Set the request description + * + * @param string $description Request description + * + * @return AuthorizationBuilder + */ + public function withDescription($description) + { + $this->description = $description; + return $this; + } + + /** + * Set the request decisionManager + * + * @param DecisionManager $decisionManager Request decisionManager + * + * @return AuthorizationBuilder + */ + public function withDecisionManager(DecisionManager $decisionManager) + { + $this->decisionManager = $decisionManager; + return $this; + } + + /** + * Set the request dynamic descriptor + * + * @param string $dynamicDescriptor Request dynamic descriptor + * + * @return AuthorizationBuilder + */ + public function withDynamicDescriptor($dynamicDescriptor) + { + $this->dynamicDescriptor = $dynamicDescriptor; + return $this; + } + + /** + * Set the request gratuity + * + * @param string|amount $gratuity Request gratuity + * + * @return AuthorizationBuilder + */ + public function withGratuity($gratuity) + { + $this->gratuity = $gratuity; + return $this; + } + + /** + * Set the request invoice number + * + * @param string|float $invoiceNumber Request invoice number + * + * @return AuthorizationBuilder + */ + public function withInvoiceNumber($invoiceNumber) + { + $this->invoiceNumber = $invoiceNumber; + return $this; + } + + /** + * Set the request to request Level II + * + * @param bool $level2Request Request to request Level II + * + * @return AuthorizationBuilder + */ + public function withCommercialRequest($level2Request) + { + $this->level2Request = $level2Request; + return $this; + } + + /** + * Set the request offline authorization code + * + * @param string $offlineAuthCode Authorization code from offline authorization + * + * @return AuthorizationBuilder + */ + public function withOfflineAuthCode($offlineAuthCode) + { + $this->offlineAuthCode = $offlineAuthCode; + $this->transactionModifier = TransactionModifier::OFFLINE; + return $this; + } + + /** + * Sets the one-time payment flag; where applicable. + * + * This is only useful when using recurring payment profiles for + * one-time payments that are not a part of a recurring schedule. + * + * @param boolean $value The one-time flag + * + * @return AuthorizationBuilder + */ + public function withOneTimePayment($value) + { + $this->oneTimePayment = $value; + $this->transactionModifier = TransactionModifier::RECURRING; + return $this; + } + + /** + * Set the request order ID + * + * @param string|float $orderId Request order ID + * + * @return AuthorizationBuilder + */ + public function withOrderId($orderId) + { + $this->orderId = $orderId; + return $this; + } + + /** + * Set the request payment method + * + * @param IPaymentMethod $paymentMethod Request payment method + * + * @return AuthorizationBuilder + */ + public function withPaymentMethod($paymentMethod) + { + $this->paymentMethod = $paymentMethod; + if ($paymentMethod instanceof EBTCardData && $paymentMethod->serialNumber !== null) { + $this->transactionModifier = TransactionModifier::VOUCHER; + } + return $this; + } + + /** + * Set the request productData + * + * @param string $productData Request productData + * + * @return AuthorizationBuilder + */ + public function withProductData($productData) + { + $this->productData = $productData; + return $this; + } + + /** + * Set the request product ID + * + * @param string|float $productId Request product ID + * + * @return AuthorizationBuilder + */ + public function withProductId($productId) + { + $this->productId = $productId; + return $this; + } + + /** + * Set the request to request multi-use token + * + * @param bool $requestMultiUseToken Request to request multi-use token + * + * @return AuthorizationBuilder + */ + public function withRequestMultiUseToken($requestMultiUseToken) + { + $this->requestMultiUseToken = $requestMultiUseToken; + return $this; + } + + /** + * Previous request's transaction ID + * + * @param string $transactionId Transaction ID + * + * @return AuthorizationBuilder + */ + public function withTransactionId($transactionId) + { + $this->paymentMethod = new TransactionReference($transactionId); + return $this; + } + + /** + * Set the request's ecommerce info + * + * @param EcommerceInfo $ecommerceInfo Ecommerce info + * + * @return AuthorizationBuilder + */ + public function withEcommerceInfo(EcommerceInfo $ecommerceInfo) + { + $this->ecommerceInfo = $ecommerceInfo; + return $this; + } + + /** + * Set the request's replacement gift card + * + * @param GiftCard $replacementCard replacement gift card + * + * @return AuthorizationBuilder + */ + public function withReplacementCard(GiftCard $replacementCard) + { + $this->replacementCard = $replacementCard; + return $this; + } + + /** + * Set the request CVN + * + * @param string|float $cvn Request cvn + * + * @return AuthorizationBuilder + */ + public function withCvn($cvn) + { + $this->cvn = $cvn; + return $this; + } + + /** + * Set the request recurringType and recurringSequence + * + * @param RecurringType $recurringType & RecurringSequence $recurringSequence + * + * @return AuthorizationBuilder + */ + public function withRecurringInfo($recurringType, $recurringSequence) + { + $this->recurringType = $recurringType; + $this->recurringSequence = $recurringSequence; + return $this; + } + + /** + * Set the request dccRateData + * + * @param DccRateData dccRateData + * + * @return AuthorizationBuilder + */ + public function withDccRateData($value) + { + $this->dccRateData = $value; + return $this; + } + + /** + * Set the request dccProcessor + * + * @param DccProcessor dccProcessor + * + * @return AuthorizationBuilder + */ + public function withDccProcessor($value) + { + $this->dccProcessor = $value; + return $this; + } + + /** + * Set the request dccRateType + * + * @param DccRateType dccRateType + * + * @return AuthorizationBuilder + */ + public function withDccRateType($value) + { + $this->dccRateType = $value; + return $this; + } + + /** + * Set the request dccType + * + * @param string dccType + * + * @return AuthorizationBuilder + */ + public function withDccType($value) + { + $this->dccType = $value; + return $this; + } + + /** + * Set the request Convenience amount + * + * @param string|float $convenienceAmt Request Convenience amount + * + * @return AuthorizationBuilder + */ + public function withConvenienceAmount($convenienceAmount) + { + $this->convenienceAmount = $convenienceAmount ; + return $this; + } + + /** + * Set the request shippingAmount + * + * @param string|float $shippingAmount Request shippingAmount + * + * @return AuthorizationBuilder + */ + public function withShippingAmount($shippingAmount) + { + $this->shippingAmount = $shippingAmount; + return $this; + } + + /** + * @return AuthorizationBuilder + */ + public function withStoredCredential($storedCredential) + { + $this->storedCredential = $storedCredential; + return $this; + } + + /** + * Set the request customer IP address + * + * @param string|float $customerIpAddress Request customer IP address + * + * @return AuthorizationBuilder + */ + public function withFraudFilter($fraudFilter) + { + $this->fraudFilter = $fraudFilter; + return $this; + } + + /** + * Set whether AVS requested + * + * @param string|bool $verifyAddress + * + * @return AuthorizationBuilder + */ + public function withVerifyAddress($verifyAddress) + { + $this->verifyAddress = $verifyAddress; + return $this; + } + + /** + * Set the timestamp + * + * @param string $timestamp + * + * @return AuthorizationBuilder + */ + public function withTimeStamp($timestamp) + { + $this->timestamp = $timestamp; + return $this; + } + + /** + * Set the hostedPaymentData + * + * @param string $hostedPaymentData + * + * @return AuthorizationBuilder + */ + public function withHostedPaymentData($hostedPaymentData) + { + $this->hostedPaymentData = $hostedPaymentData; + return $this; + } + + /** + * Set the associated schedule ID + * + * @param string $scheduleId + * + * @return AuthorizationBuilder + */ + public function withScheduleId($scheduleId) + { + $this->scheduleId = $scheduleId; + return $this; + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Builders/BaseBuilder.php b/classes/includes/vendor/globalpayments/php-sdk/src/Builders/BaseBuilder.php new file mode 100644 index 0000000..3eb490d --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Builders/BaseBuilder.php @@ -0,0 +1,94 @@ +validations = new Validations(); + $this->setupValidations(); + } + + /** + * Executes the builder + * + * @return Transaction + */ + public function execute() + { + $this->validate(); + return new Transaction(); + } + + /** + * Used to setup validations for the builder. + * + * @return void + */ + abstract protected function setupValidations(); + + /** + * Validates the builder based on validations in `$validations` + * + * @return void + */ + protected function validate() + { + array_map( + [$this, 'maybeRunValidationKeyRules'], + array_keys($this->validations->rules) + ); + } + + /** + * Runs validations for `$key` + * + * @param mixed $key Validation rules key + * + * @throws BuilderException + * @return void + */ + protected function maybeRunValidationKeyRules($key) + { + if (($key & $this->transactionType) !== $this->transactionType) { + return; + } + + foreach ($this->validations->rules[$key] as $validation) { + if (null === $validation->clause) { + continue; + } + + if ($this->transactionModifier === $validation->modifier + && !call_user_func($validation->clause->callback, $this) + ) { + throw new BuilderException($validation->clause->message); + } + } + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Builders/BaseBuilder/ValidationClause.php b/classes/includes/vendor/globalpayments/php-sdk/src/Builders/BaseBuilder/ValidationClause.php new file mode 100644 index 0000000..8c0343f --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Builders/BaseBuilder/ValidationClause.php @@ -0,0 +1,277 @@ +parent = $parent; + $this->target = $target; + $this->precondition = $precondition; + } + + /** + * Validates the target property is not null + * + * @param string $subProperty Parent of current property + * @param string $message Validation message to override the default + * + * @return ValidationTarget + */ + public function isNotNull($message = null, $subProperty = null) + { + $this->callback = function ($builder) use ($subProperty) { + $builder = ($subProperty !== null && !empty($builder->{$subProperty})) + ? $builder->{$subProperty} + : $builder; + if (!property_exists($builder, $this->target->property) + && !isset($builder->{$this->target->property}) + ) { + throw new BuilderException( + sprintf( + 'Property `%s` does not exist on `%s`', + $this->target->property, + get_class($builder) + ) + ); + } + $value = $builder->{$this->target->property}; + return null !== $value; + }; + $this->message = !empty($message) + ? $message + // TODO: implement a way to expose property name + : sprintf( + '%s cannot be null for this transaction type.', + $this->target->property + ); + + if ($this->precondition) { + return $this->target; + } + + return $this->parent->of($this->target->type, $this->target->modifier); + } + + /** + * Validates the target property is null + * + * @param string $subProperty Parent of current property + * @param string $message Validation message to override the default + * + * @return ValidationTarget + */ + public function isNull($message = null, $subProperty = null) + { + $this->callback = function ($builder) use ($subProperty) { + $builder = ($subProperty == null && empty($builder->{$subProperty})) + ? $builder->{$subProperty} + : $builder; + if (!property_exists($builder, $this->target->property) + && !isset($builder->{$this->target->property}) + ) { + throw new BuilderException( + sprintf( + 'Property `%s` does not exist on `%s`', + $this->target->property, + get_class($builder) + ) + ); + } + $value = $builder->{$this->target->property}; + return null == $value; + }; + $this->message = !empty($message) + ? $message + // TODO: implement a way to expose property name + : sprintf( + '%s cannot be set for this transaction type.', + $this->target->property + ); + + if ($this->precondition) { + return $this->target; + } + + return $this->parent->of($this->target->type, $this->target->modifier); + } + + /** + * + * @param class $clazz + * @param string $message + * + * @return ValidationTarget + */ + public function isInstanceOf($clazz, $message = null) + { + $this->callback = function ($builder) use ($clazz) { + if (!($builder->{$this->target->property} instanceof $clazz)) { + throw new BuilderException( + sprintf( + '%s must be an instance of the %s class.', + $this->target->property, + $clazz + ) + ); + return false; + } + return true; + }; + + $this->message = !empty($message) + ? $message + // TODO: implement a way to expose property name + : sprintf( + '%s must be an instance of the %s class.', + $this->target->property, + $clazz + ); + + if ($this->precondition) { + return $this->target; + } + + return $this->parent->of($this->target->type, $this->target->modifier); + } + + /** + * Validates the target property is equal to the expected value + * + * @param string $expected + * @param string $message Validation message to override the default + * + * @return ValidationTarget + */ + public function isEqualTo($expected, $message = null) + { + $this->callback = function ($builder) use ($expected) { + if ($builder->{$this->target->property} !== $expected) { + throw new BuilderException( + sprintf( + 'Property `%s` does not equal the expected value `%s`', + $this->target->property, + $expected + ) + ); + return false; + } + return true; + }; + $this->message = !empty($message) + ? $message + // TODO: implement a way to expose property name + : sprintf( + 'Property `%s` does not equal the expected value `%s`', + $this->target->property, + $expected + ); + + if ($this->precondition) { + return $this->target; + } + + return $this->parent->of($this->target->type, $this->target->modifier); + } + + /** + * Validates the target property is NOT equal to the expected value + * + * @param string $expected + * @param string $message Validation message to override the default + * + * @return ValidationTarget + */ + public function isNotEqualTo($expected, $message = null) + { + $this->callback = function ($builder) use ($expected) { + if ($builder->{$this->target->property} === $expected) { + throw new BuilderException( + sprintf( + 'Property `%s`is equal to the expected value `%s`', + $this->target->property, + $expected + ) + ); + return false; + } + return true; + }; + $this->message = !empty($message) + ? $message + // TODO: implement a way to expose property name + : sprintf( + 'Property `%s` is equal to the expected value `%s`', + $this->target->property, + $expected + ); + + if ($this->precondition) { + return $this->target; + } + + return $this->parent->of($this->target->type, $this->target->modifier); + } + + /** + * Validates the target property is not null in a sub class + * + * @param string $subProperty Parent of current property + * @param string $message Validation message to override the default + * + * @return ValidationTarget + */ + public function isNotNullInSubProperty($subProperty, $message = null) + { + return $this->isNotNull($message, $subProperty); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Builders/BaseBuilder/ValidationTarget.php b/classes/includes/vendor/globalpayments/php-sdk/src/Builders/BaseBuilder/ValidationTarget.php new file mode 100644 index 0000000..4a5bdbf --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Builders/BaseBuilder/ValidationTarget.php @@ -0,0 +1,103 @@ +parent = $parent; + $this->type = $type; + $this->modifier = $modifier; + } + + /** + * Sets the validation's transaction modifier + * + * @param TransactionModifier|int $modifier Validation modifier + * + * @return ValidationTarget + */ + public function with($modifier) + { + $this->modifier = $modifier; + return $this; + } + + /** + * Creates a new `ValidationClause` to specify validations on the + * given property. + * + * @param string $targetProperty Property to validate + * + * @return ValidationClause + */ + public function check($targetProperty) + { + $this->property = $targetProperty; + $this->clause = new ValidationClause($this->parent, $this); + return $this->clause; + } + + /** + * Creates a new `ValidationClause` to specify conditions for future + * validations checked against the given property. + * + * @param string $targetProperty Property to validate + * + * @return ValidationClause + */ + public function when($targetProperty) + { + $this->property = $targetProperty; + $this->clause = new ValidationClause($this->parent, $this, true); + return $this->clause; + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Builders/BaseBuilder/Validations.php b/classes/includes/vendor/globalpayments/php-sdk/src/Builders/BaseBuilder/Validations.php new file mode 100644 index 0000000..a9773a0 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Builders/BaseBuilder/Validations.php @@ -0,0 +1,46 @@ +rules = []; + } + + /** + * Creates a new `ValidationTarget` for the given + * transaction type mask. + * + * @param TransactionType|int $type Mask of transaction types + * @param TransactionModifier|int $modifier Transaction modifier + * + * @return ValidationTarget + */ + public function of($type, $modifier = TransactionModifier::NONE) + { + if (!array_key_exists($type, $this->rules)) { + $this->rules[$type] = []; + } + + $target = new ValidationTarget($this, $type, $modifier); + $this->rules[$type][] = $target; + return $target; + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Builders/ManagementBuilder.php b/classes/includes/vendor/globalpayments/php-sdk/src/Builders/ManagementBuilder.php new file mode 100644 index 0000000..e61f5a7 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Builders/ManagementBuilder.php @@ -0,0 +1,383 @@ +paymentMethod instanceof TransactionReference) { + return $this->paymentMethod->transactionId; + } + return null; + case 'orderId': + if ($this->paymentMethod instanceof TransactionReference) { + return $this->paymentMethod->orderId; + } + return null; + case 'authorizationCode': + if ($this->paymentMethod instanceof TransactionReference) { + return $this->paymentMethod->authCode; + } + return null; + } + } + + public function __isset($name) + { + return in_array($name, [ + 'transactionId', + 'orderId', + 'authorizationId', + ]) || isset($this->{$name}); + } + + /** + * {@inheritdoc} + * + * @return Transaction + */ + public function execute() + { + parent::execute(); + return ServicesContainer::instance() + ->getClient() + ->manageTransaction($this); + } + + /** + * {@inheritdoc} + * + * @return void + */ + protected function setupValidations() + { + $this->validations->of( + TransactionType::CAPTURE | + TransactionType::EDIT | + TransactionType::HOLD | + TransactionType::RELEASE + ) + ->check('transactionId')->isNotNull(); + + $this->validations->of(TransactionType::EDIT) + ->with(TransactionModifier::LEVEL_II) + ->check('taxType')->isNotNull(); + + $this->validations->of(TransactionType::REFUND) + ->when('amount')->isNotNull() + ->check('currency')->isNotNull(); + + $this->validations->of(TransactionType::VERIFY_SIGNATURE) + ->check('payerAuthenticationResponse')->isNotNull() + ->check('amount')->isNotNull() + ->check('currency')->isNotNull() + ->check('orderId')->isNotNull(); + + $this->validations->of(TransactionType::TOKEN_DELETE | TransactionType::TOKEN_UPDATE) + ->check('paymentMethod')->isNotNull() + ->check('paymentMethod')->isInstanceOf(ITokenizable::class); + + $this->validations->of(TransactionType::TOKEN_UPDATE) + ->check('paymentMethod')->isInstanceOf(CreditCardData::class); + } + + /** + * Sets the current transaction's amount. + * + * @param string|float $amount The amount + * + * @return ManagementBuilder + */ + public function withAmount($amount) + { + $this->amount = $amount; + return $this; + } + + /** + * Sets the current transaction's authorized amount; where applicable. + * + * @param string|float $authAmount The authorized amount + * + * @return ManagementBuilder + */ + public function withAuthAmount($authAmount) + { + $this->authAmount = $authAmount; + return $this; + } + + /** + * Sets the currency. + * + * The formatting for the supplied value will currently depend on the + * configured gateway's requirements. + * + * @param string $currency The currency + * + * @return ManagementBuilder + */ + public function withCurrency($currency) + { + $this->currency = $currency; + return $this; + } + + /** + * Sets the transaction's description. + * + * This value is not guaranteed to be sent in the authorization + * or settlement process. + * + * @param string $value The description + * + * @return ManagementBuilder + */ + public function withDescription($value) + { + $this->description = $value; + return $this; + } + + /** + * Sets the gratuity amount; where applicable. + * + * This value is information only and does not affect the + * authorization amount. + * + * @param string|float $gratuity the gratuity + * + * @return ManagementBuilder + */ + public function withGratuity($gratuity) + { + $this->gratuity = $gratuity; + return $this; + } + + /** + * @return ManagementBuilder + */ + public function withIssuerData(CardIssuerEntryTag $tag, String $value) + { + if ($this->issuerData == null) { + $this->issuerData = []; + } + $this->issuerData[$tag] = $value; + return $this; + } + + /** + * Previous request's transaction reference + * + * @internal + * @param IPaymentMethod $paymentMethod Transaction reference + * + * @return ManagementBuilder + */ + public function withPaymentMethod(IPaymentMethod $paymentMethod) + { + $this->paymentMethod = $paymentMethod; + return $this; + } + + /** + * Sets the purchase order number; where applicable. + * + * @param string|float $poNumber The purchase order number + * + * @return ManagementBuilder + */ + public function withPoNumber($poNumber) + { + $this->poNumber = $poNumber; + return $this; + } + + /** + * Sets the reason code for the transaction. + * + * @param ReasonCode $value The reason code + * + * @return ManagementBuilder + */ + public function withReasonCode($value) + { + $this->reasonCode = $value; + return $this; + } + + /** + * Sets the tax amount. + * + * Useful for commercial purchase card requests. + * + * @param string|float $taxAmount The tax amount + * + * @return ManagementBuilder + */ + public function withTaxAmount($taxAmount) + { + $this->taxAmount = $taxAmount; + return $this; + } + + /** + * Sets the tax type. + * + * Useful for commercial purchase card requests. + * + * @param TaxType $taxType The tax type + * + * @return ManagementBuilder + */ + public function withTaxType($taxType) + { + $this->taxType = $taxType; + return $this; + } + + public function withAlternativePaymentType($alternativePaymentType) + { + $this->alternativePaymentType = $alternativePaymentType; + return $this; + } + + public function withPayerAuthenticationResponse($payerAuthenticationResponse) + { + $this->payerAuthenticationResponse = $payerAuthenticationResponse; + return $this; + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Builders/RecurringBuilder.php b/classes/includes/vendor/globalpayments/php-sdk/src/Builders/RecurringBuilder.php new file mode 100644 index 0000000..2c48de3 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Builders/RecurringBuilder.php @@ -0,0 +1,92 @@ + + */ + public $searchCriteria; + + /** + * @param TransactionType $type + * @param IRecurringEntity $entity + * + * @return + */ + public function __construct($type, IRecurringEntity $entity = null) + { + parent::__construct($type); + + $this->searchCriteria = []; + if ($entity !== null) { + $this->entity = $entity; + $this->key = $entity->key; + } + } + + /** + * @internal + * @param string $key + * @param string $value + * + * @return RecurringBuilder + */ + public function addSearchCriteria($key, $value) + { + $this->searchCriteria[$key] = $value; + return $this; + } + + /** + * Executes the builder against the gateway. + * + * @return mixed + */ + public function execute() + { + parent::execute(); + + $client = ServicesContainer::instance()->getRecurringClient(); + return $client->processRecurring($this); + } + + protected function setupValidations() + { + $this->validations->of( + TransactionType::EDIT | + TransactionType::DELETE | + TransactionType::FETCH + ) + ->check('key')->isNotNull(); + + $this->validations->of( + TransactionType::SEARCH + ) + ->check('searchCriteria')->isNotNull(); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Builders/ReportBuilder.php b/classes/includes/vendor/globalpayments/php-sdk/src/Builders/ReportBuilder.php new file mode 100644 index 0000000..73138db --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Builders/ReportBuilder.php @@ -0,0 +1,44 @@ +reportType = $reportType; + } + + /** + * Executes the builder against the gateway. + * + * @return mixed + */ + public function execute() + { + parent::execute(); + + $client = ServicesContainer::instance()->getClient(); + return $client->processReport($this); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Builders/Secure3dBuilder.php b/classes/includes/vendor/globalpayments/php-sdk/src/Builders/Secure3dBuilder.php new file mode 100644 index 0000000..a77fddc --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Builders/Secure3dBuilder.php @@ -0,0 +1,1228 @@ + */ + public $sdkUiTypes; + /** @var Address */ + public $shippingAddress; + /** @var DateTime */ + public $shippingAddressCreateDate; + /** @var AgeIndicator */ + public $shippingAddressUsageIndicator; + /** @var ShippingMethod */ + public $shippingMethod; + /** @var bool */ + public $shippingNameMatchesCardHolderName; + /** @var ThreeDSecure */ + public $threeDSecure; + /** @var TransactionType */ + public $transactionType; + /** @var TransactionModifier */ + public $transactionModifier = TransactionModifier::NONE; + // /** @var Secure3dVersion */ + // public $version; + /** @var string */ + public $workCountryCode; + /** @var string */ + public $workNumber; + + public function __construct($transactionType) + { + parent::__construct(); + $this->authenticationSource = AuthenticationSource::BROWSER; + $this->authenticationRequestType = AuthenticationRequestType::PAYMENT_TRANSACTION; + $this->messageCategory = MessageCategory::PAYMENT_AUTHENTICATION; + $this->transactionType = $transactionType; + } + + /** @return AgeIndicator */ + public function getAccountAgeIndicator() + { + return $this->accountAgeIndicator; + } + /** @return DateTime */ + public function getAccountChangeDate() + { + return $this->accountChangeDate; + } + /** @return DateTime */ + public function getAccountCreateDate() + { + return $this->accountCreateDate; + } + /** @return AgeIndicator */ + public function getAccountChangeIndicator() + { + return $this->accountChangeIndicator; + } + /** @return bool */ + public function isAddressMatchIndicator() + { + return $this->addressMatchIndicator; + } + /** @return string|float */ + public function getAmount() + { + return $this->amount; + } + /** @return string */ + public function getApplicationId() + { + return $this->applicationId; + } + /** @return AuthenticationSource */ + public function getAuthenticationSource() + { + return $this->authenticationSource; + } + /** @return AuthenticationRequestType */ + public function getAuthenticationRequestType() + { + return $this->authenticationRequestType; + } + /** @return address */ + public function getBillingAddress() + { + return $this->billingAddress; + } + /** @return BrowserData */ + public function getBrowserData() + { + return $this->browserData; + } + /** @return string */ + public function getCurrency() + { + return $this->currency; + } + /** @return string */ + public function getCustomerAccountId() + { + return $this->customerAccountId; + } + /** @return string */ + public function getCustomerAuthenticationData() + { + return $this->customerAuthenticationData; + } + /** @return CustomerAuthenticationMethod */ + public function getCustomerAuthenticationMethod() + { + return $this->customerAuthenticationMethod; + } + /** @return DateTime */ + public function getCustomerAuthenticationTimestamp() + { + return $this->customerAuthenticationTimestamp; + } + /** @return string */ + public function getCustomerEmail() + { + return $this->customerEmail; + } + /** @return string */ + public function getDeliveryEmail() + { + return $this->deliveryEmail; + } + /** @return DeliveryTimeFrame */ + public function getDeliveryTimeframe() + { + return $this->deliveryTimeframe; + } + /** @return string */ + public function getEncodedData() + { + return $this->encodedData; + } + /** @return string */ + public function getEphemeralPublicKey() + { + return $this->ephemeralPublicKey; + } + /** @return int */ + public function getGiftCardCount() + { + return $this->giftCardCount; + } + /** @return string */ + public function getGiftCardCurrency() + { + return $this->giftCardCurrency; + } + /** @return decimal */ + public function getGiftCardAmount() + { + return $this->giftCardAmount; + } + /** @return string */ + public function getHomeCountryCode() + { + return $this->homeCountryCode; + } + /** @return string */ + public function getHomeNumber() + { + return $this->homeNumber; + } + /** @return int */ + public function getMaxNumberOfInstallments() + { + return $this->maxNumberOfInstallments; + } + /** @return int */ + public function getMaximumTimeout() + { + return $this->maximumTimeout; + } + /** @return MerchantDataCollection */ + public function getMerchantData() + { + return $this->merchantData; + } + /** @return MessageCategory */ + public function getMessageCategory() + { + return $this->messageCategory; + } + /** @return AuthenticationRequestType */ + public function getMerchantInitiatedRequestType() + { + return $this->merchantInitiatedRequestType; + } + /** @return MessageVersion */ + public function getMessageVersion() + { + return $this->messageVersion; + } + /** @return MethodUrlCompletion */ + public function getMethodUrlCompletion() + { + return $this->methodUrlCompletion; + } + /** @return string */ + public function getMobileCountryCode() + { + return $this->mobileCountryCode; + } + /** @return string */ + public function getMobileNumber() + { + return $this->mobileNumber; + } + /** @return int */ + public function getNumberOfAddCardAttemptsInLast24Hours() + { + return $this->numberOfAddCardAttemptsInLast24Hours; + } + /** @return int */ + public function getNumberOfPurchasesInLastSixMonths() + { + return $this->numberOfPurchasesInLastSixMonths; + } + /** @return int */ + public function getNumberOfTransactionsInLast24Hours() + { + return $this->numberOfTransactionsInLast24Hours; + } + /** @return int */ + public function getNumberOfTransactionsInLastYear() + { + return $this->numberOfTransactionsInLastYear; + } + /** @return DateTime */ + public function getOrderCreateDate() + { + return $this->orderCreateDate; + } + /** @return string */ + public function getOrderId() + { + return $this->orderId; + } + /** @return OrderTransactionType */ + public function getOrderTransactionType() + { + return $this->orderTransactionType; + } + /** @return DateTime */ + public function getPasswordChangeDate() + { + return $this->passwordChangeDate; + } + /** @return AgeIndicator */ + public function getPasswordChangeIndicator() + { + return $this->passwordChangeIndicator; + } + /** @return DateTime */ + public function getPaymentAccountCreateDate() + { + return $this->paymentAccountCreateDate; + } + /** @return AgeIndicator */ + public function getPaymentAgeIndicator() + { + return $this->paymentAgeIndicator; + } + /** @return string */ + public function getPayerAuthenticationResponse() + { + return $this->payerAuthenticationResponse; + } + /** @return IPaymentMethod */ + public function getPaymentMethod() + { + return $this->paymentMethod; + } + /** @return DateTime */ + public function getPreOrderAvailabilityDate() + { + return $this->preOrderAvailabilityDate; + } + /** @return PreOrderIndicator */ + public function getPreOrderIndicator() + { + return $this->preOrderIndicator; + } + /** @return bool */ + public function getPreviousSuspiciousActivity() + { + return $this->previousSuspiciousActivity; + } + /** @return string */ + public function getPriorAuthenticationData() + { + return $this->priorAuthenticationData; + } + /** @return PriorAuthenticationMethod */ + public function getPriorAuthenticationMethod() + { + return $this->priorAuthenticationMethod; + } + /** @return string */ + public function getPriorAuthenticationTransactionId() + { + return $this->priorAuthenticationTransactionId; + } + /** @return DateTime */ + public function getPriorAuthenticationTimestamp() + { + return $this->priorAuthenticationTimestamp; + } + /** @return DateTime */ + public function getRecurringAuthorizationExpiryDate() + { + return $this->recurringAuthorizationExpiryDate; + } + /** @return int */ + public function getRecurringAuthorizationFrequency() + { + return $this->recurringAuthorizationFrequency; + } + /** @return string */ + public function getReferenceNumber() + { + return $this->referenceNumber; + } + /** @return ReorderIndicator */ + public function getReorderIndicator() + { + return $this->reorderIndicator; + } + /** @return SdkInterface */ + public function getSdkInterface() + { + return $this->sdkInterface; + } + /** @return string */ + public function getSdkTransactionId() + { + return $this->sdkTransactionId; + } + /** @return array */ + public function getSdkUiTypes() + { + return $this->sdkUiTypes; + } + /** @return string */ + public function getServerTransactionId() + { + if (!empty($this->threeDSecure)) { + return $this->threeDSecure->serverTransactionId; + } + return null; + } + /** @return Address */ + public function getShippingAddress() + { + return $this->shippingAddress; + } + /** @return DateTime */ + public function getShippingAddressCreateDate() + { + return $this->shippingAddressCreateDate; + } + /** @return AgeIndicator */ + public function getShippingAddressUsageIndicator() + { + return $this->shippingAddressUsageIndicator; + } + /** @return ShippingMethod */ + public function getShippingMethod() + { + return $this->shippingMethod; + } + /** @return bool */ + public function getShippingNameMatchesCardHolderName() + { + return $this->shippingNameMatchesCardHolderName; + } + /** @return ThreeDSecure */ + public function getThreeDSecure() + { + return $this->threeDSecure; + } + /** @return TransactionType */ + public function getTransactionType() + { + return $this->transactionType; + } + /** @return Secure3dVersion */ + public function getVersion() + { + if (!empty($this->threeDSecure)) { + return $this->threeDSecure->version; + } + return null; + } + /** @return string */ + public function getWorkCountryCode() + { + return $this->workCountryCode; + } + /** @return string */ + public function getWorkNumber() + { + return $this->workNumber; + } + + // HELPER METHOD FOR THE CONNECTOR + /** @return bool */ + public function hasMobileFields() + { + return( + !empty($this->applicationId) || + $this->ephemeralPublicKey != null || + $this->maximumTimeout != null || + $this->referenceNumber != null || + !empty($this->sdkTransactionId) || + !empty($this->encodedData) || + $this->sdkInterface != null || + $this->sdkUiTypes != null + ); + } + /** @return bool */ + public function hasPriorAuthenticationData() + { + return ( + $this->priorAuthenticationMethod != null || + !empty($this->priorAuthenticationTransactionId) || + $this->priorAuthenticationTimestamp != null || + !empty($this->priorAuthenticationData) + ); + } + /** @return bool */ + public function hasRecurringAuthData() + { + return ( + $this->maxNumberOfInstallments != null || + $this->recurringAuthorizationFrequency != null || + $this->recurringAuthorizationExpiryDate != null + ); + } + /** @return bool */ + public function hasPayerLoginData() + { + return ( + !empty($this->customerAuthenticationData) || + $this->customerAuthenticationTimestamp != null || + $this->customerAuthenticationMethod != null + ); + } + + /** @return Secure3dBuilder */ + public function withAddress(Address $address, $type = AddressType::BILLING) + { + if ($type === AddressType::BILLING) { + $this->billingAddress = $address; + } else { + $this->shippingAddress = $address; + } + return $this; + } + + /** @return Secure3dBuilder */ + public function withAccountAgeIndicator($ageIndicator) + { + $this->accountAgeIndicator = $ageIndicator; + return $this; + } + + /** @return Secure3dBuilder */ + public function withAccountChangeDate($accountChangeDate) + { + $this->accountChangeDate = $accountChangeDate; + return $this; + } + + /** @return Secure3dBuilder */ + public function withAccountCreateDate($accountCreateDate) + { + $this->accountCreateDate = $accountCreateDate; + return $this; + } + + /** @return Secure3dBuilder */ + public function withAccountChangeIndicator($accountChangeIndicator) + { + $this->accountChangeIndicator = $accountChangeIndicator; + return $this; + } + + /** @return Secure3dBuilder */ + public function withAddressMatchIndicator(bool $value) + { + $this->addressMatchIndicator = $value; + return $this; + } + + /** @return Secure3dBuilder */ + public function withAmount($value) + { + $this->amount = $value; + return $this; + } + + /** @return Secure3dBuilder */ + public function withApplicationId($applicationId) + { + $this->applicationId = $applicationId; + return $this; + } + + /** @return Secure3dBuilder */ + public function withAuthenticationSource($value) + { + $this->authenticationSource = $value; + return $this; + } + + /** @return Secure3dBuilder */ + public function withAuthenticationRequestType($value) + { + $this->authenticationRequestType = $value; + return $this; + } + + /** @return Secure3dBuilder */ + public function withBrowserData($value) + { + $this->browserData = $value; + return $this; + } + + /** @return Secure3dBuilder */ + public function withCustomerAccountId($customerAccountId) + { + $this->customerAccountId = $customerAccountId; + return $this; + } + + /** @return Secure3dBuilder */ + public function withCustomerAuthenticationData($customerAuthenticationData) + { + $this->customerAuthenticationData = $customerAuthenticationData; + return $this; + } + + /** @return Secure3dBuilder */ + public function withCustomerAuthenticationMethod($customerAuthenticationMethod) + { + $this->customerAuthenticationMethod = $customerAuthenticationMethod; + return $this; + } + + /** @return Secure3dBuilder */ + public function withCustomerAuthenticationTimestamp($customerAuthenticationTimestamp) + { + $this->customerAuthenticationTimestamp = $customerAuthenticationTimestamp; + return $this; + } + + /** @return Secure3dBuilder */ + public function withCurrency($value) + { + $this->currency = $value; + return $this; + } + + /** @return Secure3dBuilder */ + public function withCustomerEmail($value) + { + $this->customerEmail = $value; + return $this; + } + + /** @return Secure3dBuilder */ + public function withDeliveryEmail($deliveryEmail) + { + $this->deliveryEmail = $deliveryEmail; + return $this; + } + + /** @return Secure3dBuilder */ + public function withDeliveryTimeFrame($deliveryTimeframe) + { + $this->deliveryTimeframe = $deliveryTimeframe; + return $this; + } + + /** @return Secure3dBuilder */ + public function withEncodedData($encodedData) + { + $this->encodedData = $encodedData; + return $this; + } + + /** @return Secure3dBuilder */ + public function withEphemeralPublicKey($ephemeralPublicKey) + { + $this->ephemeralPublicKey = $ephemeralPublicKey; + return $this; + } + + /** @return Secure3dBuilder */ + public function withGiftCardCount($giftCardCount) + { + $this->giftCardCount = $giftCardCount; + return $this; + } + + /** @return Secure3dBuilder */ + public function withGiftCardCurrency($giftCardCurrency) + { + $this->giftCardCurrency = $giftCardCurrency; + return $this; + } + + /** @return Secure3dBuilder */ + public function withGiftCardAmount($giftCardAmount) + { + $this->giftCardAmount = $giftCardAmount; + return $this; + } + + /** @return Secure3dBuilder */ + public function withHomeNumber($countryCode, $number) + { + $this->homeCountryCode = $countryCode; + $this->homeNumber = $number; + return $this; + } + + /** @return Secure3dBuilder */ + public function withMaxNumberOfInstallments($maxNumberOfInstallments) + { + $this->maxNumberOfInstallments = $maxNumberOfInstallments; + return $this; + } + + /** @return Secure3dBuilder */ + public function withMaximumTimeout($maximumTimeout) + { + $this->maximumTimeout = $maximumTimeout; + return $this; + } + + /** @return Secure3dBuilder */ + public function withMerchantData(MerchantDataCollection $value) + { + $this->merchantData = $value; + if (!empty($this->merchantData)) { + if (empty($this->threeDSecure)) { + $this->threeDSecure = new ThreeDSecure(); + } + $this->threeDSecure->setMerchantData($value); + } + return $this; + } + + /** @return Secure3dBuilder */ + public function withMessageCategory($value) + { + $this->messageCategory = $value; + return $this; + } + + /** @return Secure3dBuilder */ + public function withMerchantInitiatedRequestType($merchantInitiatedRequestType) + { + $this->merchantInitiatedRequestType = $merchantInitiatedRequestType; + return $this; + } + + /** @return Secure3dBuilder */ + public function withMessageVersion($value) + { + $this->messageVersion = $value; + return $this; + } + + /** @return Secure3dBuilder */ + public function withMethodUrlCompletion($value) + { + $this->methodUrlCompletion = $value; + return $this; + } + + /** @return Secure3dBuilder */ + public function withMobileNumber($countryCode, $number) + { + $this->mobileCountryCode = $countryCode; + $this->mobileNumber = $number; + return $this; + } + + /** @return Secure3dBuilder */ + public function withNumberOfAddCardAttemptsInLast24Hours($numberOfAddCardAttemptsInLast24Hours) + { + $this->numberOfAddCardAttemptsInLast24Hours = $numberOfAddCardAttemptsInLast24Hours; + return $this; + } + + /** @return Secure3dBuilder */ + public function withNumberOfPurchasesInLastSixMonths($numberOfPurchasesInLastSixMonths) + { + $this->numberOfPurchasesInLastSixMonths = $numberOfPurchasesInLastSixMonths; + return $this; + } + + /** @return Secure3dBuilder */ + public function withNumberOfTransactionsInLast24Hours($numberOfTransactionsInLast24Hours) + { + $this->numberOfTransactionsInLast24Hours = $numberOfTransactionsInLast24Hours; + return $this; + } + + /** @return Secure3dBuilder */ + public function withNumberOfTransactionsInLastYear($numberOfTransactionsInLastYear) + { + $this->numberOfTransactionsInLastYear = $numberOfTransactionsInLastYear; + return $this; + } + + /** @return Secure3dBuilder */ + public function withOrderCreateDate($value) + { + $this->orderCreateDate = $value; + return $this; + } + + /** @return Secure3dBuilder */ + public function withOrderId($value) + { + $this->orderId = $value; + return $this; + } + + /** @return Secure3dBuilder */ + public function withOrderTransactionType($orderTransactionType) + { + $this->orderTransactionType = $orderTransactionType; + return $this; + } + + /** @return Secure3dBuilder */ + public function withPasswordChangeDate($passwordChangeDate) + { + $this->passwordChangeDate = $passwordChangeDate; + return $this; + } + + /** @return Secure3dBuilder */ + public function withPasswordChangeIndicator($passwordChangeIndicator) + { + $this->passwordChangeIndicator = $passwordChangeIndicator; + return $this; + } + + /** @return Secure3dBuilder */ + public function withPaymentAccountCreateDate($paymentAccountCreateDate) + { + $this->paymentAccountCreateDate = $paymentAccountCreateDate; + return $this; + } + + /** @return Secure3dBuilder */ + public function withPaymentAccountAgeIndicator($paymentAgeIndicator) + { + $this->paymentAgeIndicator = $paymentAgeIndicator; + return $this; + } + + /** @return Secure3dBuilder */ + public function withPayerAuthenticationResponse($value) + { + $this->payerAuthenticationResponse = $value; + return $this; + } + + /** @return Secure3dBuilder */ + public function withPaymentMethod($value) + { + $this->paymentMethod = $value; + if ($this->paymentMethod instanceof ISecure3d) { + $secureEcom = $this->paymentMethod->threeDSecure; + if (!empty($secureEcom)) { + $this->threeDSecure = $secureEcom; + } + } + return $this; + } + + /** @return Secure3dBuilder */ + public function withPreOrderAvailabilityDate($preOrderAvailabilityDate) + { + $this->preOrderAvailabilityDate = $preOrderAvailabilityDate; + return $this; + } + + /** @return Secure3dBuilder */ + public function withPreOrderIndicator($preOrderIndicator) + { + $this->preOrderIndicator = $preOrderIndicator; + return $this; + } + + /** @return Secure3dBuilder */ + public function withPreviousSuspiciousActivity(bool $previousSuspiciousActivity) + { + $this->previousSuspiciousActivity = $previousSuspiciousActivity; + return $this; + } + + /** @return Secure3dBuilder */ + public function withPriorAuthenticationData($priorAuthenticationData) + { + $this->priorAuthenticationData = $priorAuthenticationData; + return $this; + } + + /** @return Secure3dBuilder */ + public function withPriorAuthenticationMethod($priorAuthenticationMethod) + { + $this->priorAuthenticationMethod = $priorAuthenticationMethod; + return $this; + } + + /** @return Secure3dBuilder */ + public function withPriorAuthenticationTransactionId($priorAuthencitationTransactionId) + { + $this->priorAuthenticationTransactionId = $priorAuthencitationTransactionId; + return $this; + } + + /** @return Secure3dBuilder */ + public function withPriorAuthenticationTimestamp($priorAuthenticationTimestamp) + { + $this->priorAuthenticationTimestamp = $priorAuthenticationTimestamp; + return $this; + } + + /** @return Secure3dBuilder */ + public function withRecurringAuthorizationExpiryDate($recurringAuthorizationExpiryDate) + { + $this->recurringAuthorizationExpiryDate = $recurringAuthorizationExpiryDate; + return $this; + } + + /** @return Secure3dBuilder */ + public function withRecurringAuthorizationFrequency($recurringAuthorizationFrequency) + { + $this->recurringAuthorizationFrequency = $recurringAuthorizationFrequency; + return $this; + } + + /** @return Secure3dBuilder */ + public function withReferenceNumber($referenceNumber) + { + $this->referenceNumber = $referenceNumber; + return $this; + } + + /** @return Secure3dBuilder */ + public function withReorderIndicator($reorderIndicator) + { + $this->reorderIndicator = $reorderIndicator; + return $this; + } + + /** @return Secure3dBuilder */ + public function withSdkInterface($sdkInterface) + { + $this->sdkInterface = $sdkInterface; + return $this; + } + + /** @return Secure3dBuilder */ + public function withSdkTransactionId($sdkTransactionId) + { + $this->sdkTransactionId = $sdkTransactionId; + return $this; + } + + /** @return Secure3dBuilder */ + public function withSdkUiTypes($sdkUiTypes) + { + $this->sdkUiTypes = $sdkUiTypes; + return $this; + } + + /** @return Secure3dBuilder */ + public function withServerTransactionId($value) + { + if (empty($this->threeDSecure)) { + $this->threeDSecure = new ThreeDSecure(); + } + $this->threeDSecure->serverTransactionId = $value; + return $this; + } + + /** @return Secure3dBuilder */ + public function withShippingAddressCreateDate($shippingAddressCreateDate) + { + $this->shippingAddressCreateDate = $shippingAddressCreateDate; + return $this; + } + + /** @return Secure3dBuilder */ + public function withShippingAddressUsageIndicator($shippingAddressUsageIndicator) + { + $this->shippingAddressUsageIndicator = $shippingAddressUsageIndicator; + return $this; + } + + /** @return Secure3dBuilder */ + public function withShippingMethod($shippingMethod) + { + $this->shippingMethod = $shippingMethod; + return $this; + } + + /** @return Secure3dBuilder */ + public function withShippingNameMatchesCardHolderName($shippingNameMatchesCardHolderName) + { + $this->shippingNameMatchesCardHolderName = $shippingNameMatchesCardHolderName; + return $this; + } + + /** @return Secure3dBuilder */ + public function withThreeDSecure(ThreeDSecure $threeDSecure) + { + $this->threeDSecure = $threeDSecure; + return $this; + } + + /** @return Secure3dBuilder */ + public function withTransactionType($transactionType) + { + $this->transactionType = $transactionType; + return $this; + } + + /** @return Secure3dBuilder */ + public function withWorkNumber($countryCode, $number) + { + $this->workCountryCode = $countryCode; + $this->workNumber = $number; + return $this; + } + + /** + * @throws ApiException + * @return ThreeDSecure */ + public function execute($version = Secure3dVersion::ANY) + { + // TODO Get validations working + // parent::execute(); + + // setup return object + $rvalue = $this->threeDSecure; + if (empty($rvalue)) { + $rvalue = new ThreeDSecure(); + $rvalue->setVersion($version); + } + + // working version + if ($rvalue->getVersion() != null) { + $version = $rvalue->getVersion(); + } + + // get the provider + $provider = ServicesContainer::instance()->getSecure3d($version); + if (!empty($provider)) { + $canDowngrade = false; + if ($provider->getVersion() === Secure3dVersion::TWO && $version === Secure3dVersion::ANY) { + try { + $oneProvider = ServicesContainer::instance()->getSecure3d(Secure3dVersion::ONE); + $canDowngrade = (bool)(!empty($oneProvider)); + } catch (ConfigurationException $exc) { + // NOT CONFIGURED + } + } + + // process the request, capture any exceptions which might have been thrown + $response = null; + try { + $response = $provider->processSecure3d($this); + + if (empty($response) && (bool)$canDowngrade) { + return $this->execute(Secure3dVersion::ONE); + } + } catch (GatewayException $exc) { + // check for not enrolled + if ($exc->responseCode != null) { + if ($exc->responseCode == '110' && $provider->getVersion() === Secure3dVersion::ONE) { + return $rvalue; + } + } elseif ((bool)$canDowngrade && $this->transactionType === TransactionType::VERIFY_ENROLLED) { // check if we can downgrade + return $this->execute(Secure3dVersion::ONE); + } else { // throw exception + throw $exc; + } + } + + // check the response + if (!empty($response)) { + switch ($this->transactionType) { + case TransactionType::VERIFY_ENROLLED: + if (!empty($response->threeDSecure)) { + $rvalue = $response->threeDSecure; + if ((bool)$rvalue->enrolled) { + $rvalue->setAmount($this->amount); + $rvalue->setCurrency($this->currency); + $rvalue->setOrderId($response->orderId); + $rvalue->setVersion($provider->getVersion()); + } elseif ((bool)$canDowngrade) { + return $this->execute(Secure3dVersion::ONE); + } + } elseif ((bool)$canDowngrade) { + return $this->execute(Secure3dVersion::ONE); + } + break; + case TransactionType::INITIATE_AUTHENTICATION: + case TransactionType::VERIFY_SIGNATURE: { + $rvalue->merge($response->threeDSecure); + } break; + } + } + } + return $rvalue; + } + + /** @return void */ + public function setupValidations() + { + $this->validations->of(TransactionType::VERIFY_ENROLLED) + ->check('paymentMethod')->isNotNull(); + + $this->validations->of(TransactionType::VERIFY_ENROLLED) + ->when('paymentMethod')->isNotNull() + ->check('paymentMethod')->isInstanceOf(ISecure3d::class); + + $this->validations->of(TransactionType::VERIFY_SIGNATURE) + ->when('version')->isEqualTo(Secure3dVersion::ONE) + ->check('threeDSecure')->isNotNull() + ->when('version')->isEqualTo(Secure3dVersion::ONE) + ->check('payerAuthenticationResponse')->isNotNull(); + + $this->validations->of(TransactionType::VERIFY_SIGNATURE) + ->when('version')->isEqualTo(Secure3dVersion::TWO) + ->check('serverTransactionId')->isNotNull(); + + $this->validations->of(TransactionType::INITIATE_AUTHENTICATION) + ->check('threeDSecure')->isNotNull(); + + $this->validations->of(TransactionType::INITIATE_AUTHENTICATION) + ->when('paymentMethod')->isNotNull() + ->check('paymentMethod')->isInstanceOf(ISecure3d::class); + + $this->validations->of(TransactionType::INITIATE_AUTHENTICATION) + ->when('merchantInitiatedRequestType')->isNotNull() + ->check('merchantInitiatedRequestType')->isNotEqualTo(AuthenticationRequestType::PAYMENT_TRANSACTION); + + $this->validations->of(TransactionType::INITIATE_AUTHENTICATION) + ->when('accountAgeIndicator')->isNotNull() + ->check('accountAgeIndicator')->isNotEqualTo(AgeIndicator::NO_CHANGE); + + $this->validations->of(TransactionType::INITIATE_AUTHENTICATION) + ->when('passwordChangeIndicator')->isNotNull() + ->check('passwordChangeIndicator')->isNotEqualTo(AgeIndicator::NO_ACCOUNT); + + $this->validations->of(TransactionType::INITIATE_AUTHENTICATION) + ->when('shippingAddressUsageIndicator')->isNotNull() + ->check('shippingAddressUsageIndicator')->isNotEqualTo(AgeIndicator::NO_CHANGE) + ->when('shippingAddressUsageIndicator')->isNotNull() + ->check('shippingAddressUsageIndicator')->isNotEqualTo(AgeIndicator::NO_ACCOUNT); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Builders/TransactionBuilder.php b/classes/includes/vendor/globalpayments/php-sdk/src/Builders/TransactionBuilder.php new file mode 100644 index 0000000..6b2a43a --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Builders/TransactionBuilder.php @@ -0,0 +1,99 @@ +transactionType = $type; + $this->paymentMethod = $paymentMethod; + } + + /** + * Set the request transaction type + * + * @internal + * @param TransactionType $transactionType Request transaction type + * + * @return AuthorizationBuilder + */ + public function withTransactionType($transactionType) + { + $this->transactionType = $transactionType; + return $this; + } + + /** + * Set the request transaction modifier + * + * @internal + * @param TransactionModifier $modifier Request transaction modifier + * + * @return AuthorizationBuilder + */ + public function withModifier($modifier) + { + $this->transactionModifier = $modifier; + return $this; + } + + /** + * Set the request to allow duplicates + * + * @param bool $allowDuplicates Request to allow duplicates + * + * @return AuthorizationBuilder + */ + public function withAllowDuplicates($allowDuplicates) + { + $this->allowDuplicates = $allowDuplicates; + return $this; + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Builders/TransactionReportBuilder.php b/classes/includes/vendor/globalpayments/php-sdk/src/Builders/TransactionReportBuilder.php new file mode 100644 index 0000000..6ccd5aa --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Builders/TransactionReportBuilder.php @@ -0,0 +1,148 @@ +searchBuilder = new SearchCriteriaBuilder($this); + } + + /** + * Sets the device ID as criteria for the report. + * + * @param string $value The device ID + * + * @return TransactionReportBuilder + */ + public function withDeviceId($value) + { + $this->searchBuilder->deviceId = $value; + return $this; + } + + /** + * Sets the end date as criteria for the report. + * + * @param DateTime $value The end date + * + * @return TransactionReportBuilder + */ + public function withEndDate($value) + { + $this->searchBuilder->endDate = $value; + return $this; + } + + /** + * Sets the start date as criteria for the report. + * + * @param DateTime $value The start date + * + * @return TransactionReportBuilder + */ + public function withStartDate($value) + { + $this->searchBuilder->startDate = $value; + return $this; + } + + /** + * Sets the timezone conversion method for the report. + * + * @param TimeZoneConversion $value The timezone conversion method + * + * @return TransactionReportBuilder + */ + public function withTimeZoneConversion($value) + { + $this->timeZoneConversion = $value; + return $this; + } + + /** + * Sets the transaction ID as criteria for the report. + * + * @param string $value The transaction ID + * + * @return TransactionReportBuilder + */ + public function withTransactionId($value) + { + $this->transactionId = $value; + return $this; + } + + /** + * @return SearchCriteriaBuilder + */ + public function where($criteria, $value) + { + return $this->searchBuilder->and($criteria, $value); + } + + protected function setupValidations() + { + $this->validations->of(ReportType::TRANSACTION_DETAIL) + ->check('transactionId')->isNotNull(); + + $this->validations->of(ReportType::ACTIVITY) + ->check('transactionId')->isNull(); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Address.php b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Address.php new file mode 100644 index 0000000..2082da0 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Address.php @@ -0,0 +1,96 @@ +province) + ? $this->province + : $this->state; + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/AlternativePaymentResponse.php b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/AlternativePaymentResponse.php new file mode 100644 index 0000000..41193b8 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/AlternativePaymentResponse.php @@ -0,0 +1,53 @@ +firstName, $this->lastName); + if (empty(str_replace(' ', '', $nameOnAccount))) { + $nameOnAccount = $this->company; + } + + $payment = new RecurringPaymentMethod($paymentMethod); + $payment->address = $this->address; + $payment->customerKey = $this->key; + $payment->id = $paymentId; + $payment->nameOnAccount = $nameOnAccount; + return $payment; + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/DccRateData.php b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/DccRateData.php new file mode 100644 index 0000000..d6b722e --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/DccRateData.php @@ -0,0 +1,59 @@ +channel = EcommerceChannel::ECOM; + $this->shipDay = (new \DateTime()) + ->add(new \DateInterval('P1D')) + ->format('d'); + $this->shipMonth = (new \DateTime()) + ->add(new \DateInterval('P1D')) + ->format('m'); + $this->paymentDataType = '3DSecure'; + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/EncryptionData.php b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/EncryptionData.php new file mode 100644 index 0000000..ee1fb95 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/EncryptionData.php @@ -0,0 +1,70 @@ +version = '01'; + return $data; + } + + /** + * Convenience method for creating version `02` encryption data. + * + * @param string $ktb + * @param string $trackNumber + * + * @return EncryptionData + */ + public static function version2($ktb, $trackNumber = null) + { + $data = new EncryptionData(); + $data->version = '02'; + $data->trackNumber = $trackNumber; + $data->ktb = $ktb; + return $data; + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enum.php b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enum.php new file mode 100644 index 0000000..3fccff6 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enum.php @@ -0,0 +1,36 @@ +getConstants() as $allowedValue) { + if ($value === $allowedValue) { + return $allowedValue; + } + } + + throw new ArgumentException( + sprintf( + 'Invalid value `%s` on enum `%s`', + $value, + static::class + ) + ); + } +} diff --git a/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/AccountType.php b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/AccountType.php new file mode 100644 index 0000000..e29b991 --- /dev/null +++ b/classes/includes/vendor/globalpayments/php-sdk/src/Entities/Enums/AccountType.php @@ -0,0 +1,11 @@ + +/// Indicates a reason for the transaction. +/// +/// +/// This is typically used for returns/reversals. +/// +class ReasonCode extends Enum +{ + ///

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

pMdfY) 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%0D68OZ7a~~<^Vo!vc}fuHW*N$ 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