From 1de90640beab0b4275c9bb5e874b2514ac318909 Mon Sep 17 00:00:00 2001 From: Chuck Scott Date: Thu, 5 Apr 2018 16:30:39 -0400 Subject: [PATCH] Various minor updates and now using new Authorixe.net class with saved card profiles. Updated views/admin/management/registrations.html to remove no longer required settings for Authorize.net Also added support for Verified Merchant Seal HTML code. Updated some comments in checkout.php to better explain the checkout options selection. Removed lib/paymentProcessors - Moved that to main member plugin and updated it. Updated database to add reg_authorize_net_merchant_seal to management Updated dataManagement.php and the management view to use merchant seal. Checkout now using saved credit card profiles with new Authorize.net payment processor class in main plugin. --- classes/data/dataAccount.php | 24 + classes/data/dataManagement.php | 10 +- css/front.css | 8 +- index.php | 2 +- .../Authorize.Net/AIM_guide-1.pdf | Bin 339407 -> 0 bytes .../anet_php_sdk/AuthorizeNet.php | 29 - .../Authorize.Net/anet_php_sdk/License.pdf | Bin 208848 -> 0 bytes .../Authorize.Net/anet_php_sdk/README | 230 ----- .../Authorize.Net/anet_php_sdk/README.html | 358 ------- .../anet_php_sdk/doc/AIM.markdown | 187 ---- .../anet_php_sdk/doc/ARB.markdown | 52 - .../anet_php_sdk/doc/CIM.markdown | 249 ----- .../anet_php_sdk/doc/CP.markdown | 43 - .../anet_php_sdk/doc/DPM.markdown | 24 - .../anet_php_sdk/doc/SIM.markdown | 74 -- .../anet_php_sdk/doc/SOAP.markdown | 10 - .../anet_php_sdk/doc/TD.markdown | 55 -- .../anet_php_sdk/lib/AuthorizeNetAIM.php | 502 ---------- .../anet_php_sdk/lib/AuthorizeNetARB.php | 159 ---- .../anet_php_sdk/lib/AuthorizeNetCIM.php | 511 ---------- .../anet_php_sdk/lib/AuthorizeNetCP.php | 222 ----- .../anet_php_sdk/lib/AuthorizeNetDPM.php | 237 ----- .../anet_php_sdk/lib/AuthorizeNetSIM.php | 212 ----- .../anet_php_sdk/lib/AuthorizeNetSOAP.php | 99 -- .../anet_php_sdk/lib/AuthorizeNetTD.php | 209 ----- .../lib/shared/AuthorizeNetRequest.php | 121 --- .../lib/shared/AuthorizeNetResponse.php | 75 -- .../lib/shared/AuthorizeNetTypes.php | 323 ------- .../lib/shared/AuthorizeNetXMLResponse.php | 128 --- .../anet_php_sdk/lib/ssl/cert.pem | 253 ----- .../tests/AuthorizeNetAIM_Test.php | 888 ------------------ .../tests/AuthorizeNetARB_Test.php | 201 ---- .../tests/AuthorizeNetCIM_Test.php | 355 ------- .../tests/AuthorizeNetCP_Test.php | 179 ---- .../tests/AuthorizeNetDPM_Test.php | 25 - .../tests/AuthorizeNetSIM_Test.php | 56 -- .../tests/AuthorizeNetSSL_Test.php | 23 - .../tests/AuthorizeNetTD_Test.php | 96 -- .../tests/AuthorizeNet_SOAP_Test.php | 31 - .../tests/AuthorizeNet_Test_Config.php | 47 - .../Authorize.Net/anet_php_sdk/tests/README | 17 - .../anet_php_sdk/tests/domain.crt | 51 - .../anet_php_sdk/tests/report.html | 1 - .../Authorize.Net/paymentGateway.php | 285 ------ .../MerchantSolutions/paymentGateway.php | 349 ------- .../PayPal/assets/x-click-but6.gif | Bin 4774 -> 0 bytes .../PayPal/paymentGateway.php | 591 ------------ .../rest-api-sdk-php/.coveralls.yml | 6 - .../rest-api-sdk-php/.gitignore | 14 - .../rest-api-sdk-php/.travis.yml | 15 - .../rest-api-sdk-php/CHANGELOG.md | 24 - .../rest-api-sdk-php/LICENSE.txt | 41 - .../rest-api-sdk-php/README.md | 68 -- .../rest-api-sdk-php/build.xml | 67 -- .../rest-api-sdk-php/composer.json | 29 - .../lib/PayPal/Api/Address.php | 167 ---- .../lib/PayPal/Api/Amount.php | 61 -- .../lib/PayPal/Api/Authorization.php | 299 ------ .../lib/PayPal/Api/Capture.php | 270 ------ .../lib/PayPal/Api/CreditCard.php | 416 -------- .../lib/PayPal/Api/CreditCardHistory.php | 97 -- .../lib/PayPal/Api/CreditCardToken.php | 183 ---- .../lib/PayPal/Api/Details.php | 79 -- .../lib/PayPal/Api/FundingInstrument.php | 77 -- .../lib/PayPal/Api/HyperSchema.php | 116 --- .../rest-api-sdk-php/lib/PayPal/Api/Item.php | 97 -- .../lib/PayPal/Api/ItemList.php | 61 -- .../rest-api-sdk-php/lib/PayPal/Api/Links.php | 115 --- .../rest-api-sdk-php/lib/PayPal/Api/Payee.php | 78 -- .../rest-api-sdk-php/lib/PayPal/Api/Payer.php | 114 --- .../lib/PayPal/Api/PayerInfo.php | 183 ---- .../lib/PayPal/Api/Payment.php | 299 ------ .../lib/PayPal/Api/PaymentExecution.php | 61 -- .../lib/PayPal/Api/PaymentHistory.php | 79 -- .../lib/PayPal/Api/RedirectUrls.php | 77 -- .../lib/PayPal/Api/Refund.php | 251 ----- .../lib/PayPal/Api/RelatedResources.php | 79 -- .../rest-api-sdk-php/lib/PayPal/Api/Sale.php | 235 ----- .../lib/PayPal/Api/ShippingAddress.php | 42 - .../lib/PayPal/Api/Transaction.php | 152 --- .../lib/PayPal/Api/Transactions.php | 25 - .../lib/PayPal/Auth/OAuthTokenCredential.php | 137 --- .../lib/PayPal/Rest/ApiContext.php | 78 -- .../lib/PayPal/Rest/IResource.php | 7 - .../lib/PayPal/Rest/RestHandler.php | 84 -- .../rest-api-sdk-php/phpunit.xml | 29 - .../tests/PayPal/Test/Api/AddressTest.php | 54 -- .../tests/PayPal/Test/Api/AmountTest.php | 45 - .../PayPal/Test/Api/AuthorizationTest.php | 156 --- .../tests/PayPal/Test/Api/CaptureTest.php | 87 -- .../PayPal/Test/Api/CreditCardHistoryTest.php | 72 -- .../tests/PayPal/Test/Api/CreditCardTest.php | 94 -- .../PayPal/Test/Api/CreditCardTokenTest.php | 38 - .../tests/PayPal/Test/Api/DetailsTest.php | 45 - .../PayPal/Test/Api/FundingInstrumentTest.php | 36 - .../tests/PayPal/Test/Api/ItemListTest.php | 46 - .../tests/PayPal/Test/Api/ItemTest.php | 46 - .../tests/PayPal/Test/Api/LinksTest.php | 40 - .../tests/PayPal/Test/Api/PayeeTest.php | 44 - .../tests/PayPal/Test/Api/PayerInfoTest.php | 50 - .../tests/PayPal/Test/Api/PayerTest.php | 45 - .../PayPal/Test/Api/PaymentHistoryTest.php | 39 - .../tests/PayPal/Test/Api/PaymentTest.php | 78 -- .../tests/PayPal/Test/Api/RefundTest.php | 54 -- .../PayPal/Test/Api/RelatedResourcesTest.php | 35 - .../tests/PayPal/Test/Api/SaleTest.php | 73 -- .../PayPal/Test/Api/ShippingAddressTest.php | 56 -- .../tests/PayPal/Test/Api/TransactionTest.php | 49 - .../Test/Auth/OAuthTokenCredentialTest.php | 35 - .../tests/PayPal/Test/Common/ArrayClass.php | 29 - .../PayPal/Test/Common/ArrayUtilTest.php | 21 - .../tests/PayPal/Test/Common/ChildClass.php | 6 - .../tests/PayPal/Test/Common/ModelTest.php | 66 -- .../tests/PayPal/Test/Common/NestedClass.php | 27 - .../tests/PayPal/Test/Common/SimpleClass.php | 19 - .../PayPal/Test/Common/UserAgentTest.php | 26 - .../tests/PayPal/Test/Constants.php | 7 - .../tests/PayPal/Test/Rest/CallTest.php | 41 - .../rest-api-sdk-php/tests/bootstrap.php | 6 - .../rest-api-sdk-php/tests/sdk_config.ini | 35 - .../sdk-core-php/.gitignore | 14 - .../sdk-core-php/CHANGELOG.md | 18 - .../sdk-core-php/LICENSE.txt | 41 - .../sdk-core-php/README.md | 42 - .../sdk-core-php/build.xml | 24 - .../sdk-core-php/composer.json | 23 - .../lib/PayPal/Auth/IPPCredential.php | 23 - .../Auth/IPPThirdPartyAuthorization.php | 11 - .../lib/PayPal/Auth/Oauth/AuthSignature.php | 37 - .../PayPal/Auth/Oauth/MockOAuthDataStore.php | 54 -- .../lib/PayPal/Auth/Oauth/OAuthConsumer.php | 17 - .../lib/PayPal/Auth/Oauth/OAuthDataStore.php | 27 - .../lib/PayPal/Auth/Oauth/OAuthRequest.php | 297 ------ .../lib/PayPal/Auth/Oauth/OAuthServer.php | 223 ----- .../Auth/Oauth/OAuthSignatureMethod.php | 38 - .../Oauth/OAuthSignatureMethodHmacSha1.php | 30 - .../Oauth/OAuthSignatureMethodPLAINTEXT.php | 34 - .../Oauth/OAuthSignatureMethodRsaSha1.php | 68 -- .../lib/PayPal/Auth/Oauth/OAuthToken.php | 31 - .../lib/PayPal/Auth/Oauth/OAuthUtil.php | 169 ---- .../PayPal/Auth/Openid/PPOpenIdAddress.php | 95 -- .../lib/PayPal/Auth/Openid/PPOpenIdError.php | 61 -- .../PayPal/Auth/Openid/PPOpenIdSession.php | 79 -- .../PayPal/Auth/Openid/PPOpenIdTokeninfo.php | 181 ---- .../PayPal/Auth/Openid/PPOpenIdUserinfo.php | 400 -------- .../PayPal/Auth/PPCertificateCredential.php | 103 -- .../lib/PayPal/Auth/PPSignatureCredential.php | 69 -- .../PayPal/Auth/PPSubjectAuthorization.php | 26 - .../lib/PayPal/Auth/PPTokenAuthorization.php | 38 - .../lib/PayPal/Common/PPApiContext.php | 33 - .../lib/PayPal/Common/PPArrayUtil.php | 18 - .../lib/PayPal/Common/PPModel.php | 84 -- .../lib/PayPal/Common/PPReflectionUtil.php | 74 -- .../lib/PayPal/Common/PPUserAgent.php | 41 - .../lib/PayPal/Core/PPAPIService.php | 92 -- .../lib/PayPal/Core/PPBaseService.php | 87 -- .../lib/PayPal/Core/PPConfigManager.php | 123 --- .../lib/PayPal/Core/PPConnectionManager.php | 42 - .../lib/PayPal/Core/PPConstants.php | 19 - .../lib/PayPal/Core/PPCredentialManager.php | 155 --- .../lib/PayPal/Core/PPHttpConfig.php | 158 ---- .../lib/PayPal/Core/PPHttpConnection.php | 112 --- .../lib/PayPal/Core/PPLoggingManager.php | 77 -- .../lib/PayPal/Core/PPMessage.php | 117 --- .../lib/PayPal/Core/PPRequest.php | 73 -- .../sdk-core-php/lib/PayPal/Core/PPUtils.php | 397 -------- .../lib/PayPal/Core/PPXmlMessage.php | 186 ---- .../sdk-core-php/lib/PayPal/Core/cacert.pem | 171 ---- .../lib/PayPal/Exception/OAuthException.php | 8 - .../Exception/PPConfigurationException.php | 8 - .../Exception/PPConnectionException.php | 33 - .../PPInvalidCredentialException.php | 17 - .../PPMissingCredentialException.php | 18 - .../Exception/PPTransformerException.php | 17 - .../lib/PayPal/Formatter/FormatterFactory.php | 16 - .../lib/PayPal/Formatter/IPPFormatter.php | 22 - .../lib/PayPal/Formatter/PPNVPFormatter.php | 12 - .../lib/PayPal/Formatter/PPSOAPFormatter.php | 28 - .../lib/PayPal/Handler/IPPHandler.php | 10 - .../Handler/PPAuthenticationHandler.php | 38 - .../Handler/PPCertificateAuthHandler.php | 46 - .../Handler/PPGenericServiceHandler.php | 18 - .../Handler/PPMerchantServiceHandler.php | 64 -- .../lib/PayPal/Handler/PPOpenIdHandler.php | 51 - .../Handler/PPPlatformServiceHandler.php | 47 - .../PayPal/Handler/PPSignatureAuthHandler.php | 48 - .../lib/PayPal/IPN/PPIPNMessage.php | 172 ---- .../lib/PayPal/Transport/PPRestCall.php | 50 - .../tests/Openid/PPOpenIdAddressTest.php | 39 - .../tests/Openid/PPOpenIdSessionTest.php | 84 -- .../tests/Openid/PPOpenIdTokeninfoTest.php | 41 - .../tests/Openid/PPOpenIdUserinfoTest.php | 46 - .../sdk-core-php/tests/PPAPIServiceTest.php | 72 -- .../sdk-core-php/tests/PPBaseServiceTest.php | 41 - .../sdk-core-php/tests/PPBootStrap.php | 11 - .../tests/PPCertificateCredentialTest.php | 106 --- .../tests/PPConfigManagerTest.php | 55 -- .../tests/PPConfigurationExceptionTest.php | 37 - .../tests/PPConnectionExceptionTest.php | 48 - .../tests/PPConnectionManagerTest.php | 76 -- .../tests/PPCredentialManagerTest.php | 104 -- .../sdk-core-php/tests/PPIPNMessageTest.php | 58 -- .../PPInvalidCredentialExceptionTest.php | 40 - .../tests/PPLoggingManagerTest.php | 64 -- .../sdk-core-php/tests/PPMessageTest.php | 441 --------- .../PPMissingCredentialExceptionTest.php | 41 - .../tests/PPSignatureCredentialTest.php | 103 -- .../sdk-core-php/tests/PPUtilsTest.php | 63 -- .../sdk-core-php/tests/sdk_config.ini | 33 - lib/paymentProcessors/PayPal/test.php | 111 --- .../TestByCardNumber/paymentGateway.php | 190 ---- .../TestGood/paymentGateway.php | 96 -- lib/paymentProcessors/readme.txt | 11 - models/front/registrations/cartLinkWidget.php | 3 +- models/front/registrations/checkout.php | 5 +- .../front/registrations/checkoutProcess.php | 133 ++- models/front/registrations/login.php | 142 +++ ...0.0.25.sql => create_database_V0.0.27.sql} | 7 +- setup/databaseScripts/dbVersions.php | 4 +- ..._V0.0.25.sql => drop_database_V0.0.26.sql} | 0 .../update_database_V0.0.26.sql | 25 + .../update_database_V0.0.27.sql | 9 + setup/frontHooks.php | 6 +- setup/shortcodes.php | 3 +- views/admin/management/registrations.html | 30 +- ...NDING_DELETE_registrationsPaymentCode.html | 268 ------ views/front/registrations/account.html | 2 +- views/front/registrations/accountHeader.html | 18 +- views/front/registrations/checkout.html | 54 +- views/front/registrations/header.html | 2 +- views/front/registrations/login.html | 18 +- 231 files changed, 437 insertions(+), 20871 deletions(-) delete mode 100644 lib/paymentProcessors/Authorize.Net/AIM_guide-1.pdf delete mode 100755 lib/paymentProcessors/Authorize.Net/anet_php_sdk/AuthorizeNet.php delete mode 100755 lib/paymentProcessors/Authorize.Net/anet_php_sdk/License.pdf delete mode 100755 lib/paymentProcessors/Authorize.Net/anet_php_sdk/README delete mode 100755 lib/paymentProcessors/Authorize.Net/anet_php_sdk/README.html delete mode 100755 lib/paymentProcessors/Authorize.Net/anet_php_sdk/doc/AIM.markdown delete mode 100755 lib/paymentProcessors/Authorize.Net/anet_php_sdk/doc/ARB.markdown delete mode 100755 lib/paymentProcessors/Authorize.Net/anet_php_sdk/doc/CIM.markdown delete mode 100755 lib/paymentProcessors/Authorize.Net/anet_php_sdk/doc/CP.markdown delete mode 100755 lib/paymentProcessors/Authorize.Net/anet_php_sdk/doc/DPM.markdown delete mode 100755 lib/paymentProcessors/Authorize.Net/anet_php_sdk/doc/SIM.markdown delete mode 100755 lib/paymentProcessors/Authorize.Net/anet_php_sdk/doc/SOAP.markdown delete mode 100755 lib/paymentProcessors/Authorize.Net/anet_php_sdk/doc/TD.markdown delete mode 100755 lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/AuthorizeNetAIM.php delete mode 100755 lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/AuthorizeNetARB.php delete mode 100755 lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/AuthorizeNetCIM.php delete mode 100755 lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/AuthorizeNetCP.php delete mode 100755 lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/AuthorizeNetDPM.php delete mode 100755 lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/AuthorizeNetSIM.php delete mode 100755 lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/AuthorizeNetSOAP.php delete mode 100755 lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/AuthorizeNetTD.php delete mode 100755 lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/shared/AuthorizeNetRequest.php delete mode 100755 lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/shared/AuthorizeNetResponse.php delete mode 100755 lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/shared/AuthorizeNetTypes.php delete mode 100755 lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/shared/AuthorizeNetXMLResponse.php delete mode 100755 lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/ssl/cert.pem delete mode 100755 lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/AuthorizeNetAIM_Test.php delete mode 100755 lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/AuthorizeNetARB_Test.php delete mode 100755 lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/AuthorizeNetCIM_Test.php delete mode 100755 lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/AuthorizeNetCP_Test.php delete mode 100755 lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/AuthorizeNetDPM_Test.php delete mode 100755 lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/AuthorizeNetSIM_Test.php delete mode 100755 lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/AuthorizeNetSSL_Test.php delete mode 100755 lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/AuthorizeNetTD_Test.php delete mode 100755 lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/AuthorizeNet_SOAP_Test.php delete mode 100755 lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/AuthorizeNet_Test_Config.php delete mode 100755 lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/README delete mode 100755 lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/domain.crt delete mode 100755 lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/report.html delete mode 100644 lib/paymentProcessors/Authorize.Net/paymentGateway.php delete mode 100644 lib/paymentProcessors/MerchantSolutions/paymentGateway.php delete mode 100755 lib/paymentProcessors/PayPal/assets/x-click-but6.gif delete mode 100755 lib/paymentProcessors/PayPal/paymentGateway.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/.coveralls.yml delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/.gitignore delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/.travis.yml delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/CHANGELOG.md delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/LICENSE.txt delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/README.md delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/build.xml delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/composer.json delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Address.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Amount.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Authorization.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Capture.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/CreditCard.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/CreditCardHistory.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/CreditCardToken.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Details.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/FundingInstrument.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/HyperSchema.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Item.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/ItemList.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Links.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Payee.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Payer.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/PayerInfo.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Payment.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/PaymentExecution.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/PaymentHistory.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/RedirectUrls.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Refund.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/RelatedResources.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Sale.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/ShippingAddress.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Transaction.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Transactions.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Auth/OAuthTokenCredential.php delete mode 100755 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Rest/ApiContext.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Rest/IResource.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Rest/RestHandler.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/phpunit.xml delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/AddressTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/AmountTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/AuthorizationTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/CaptureTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/CreditCardHistoryTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/CreditCardTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/CreditCardTokenTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/DetailsTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/FundingInstrumentTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/ItemListTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/ItemTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/LinksTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/PayeeTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/PayerInfoTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/PayerTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/PaymentHistoryTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/PaymentTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/RefundTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/RelatedResourcesTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/SaleTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/ShippingAddressTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/TransactionTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Auth/OAuthTokenCredentialTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Common/ArrayClass.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Common/ArrayUtilTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Common/ChildClass.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Common/ModelTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Common/NestedClass.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Common/SimpleClass.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Common/UserAgentTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Constants.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Rest/CallTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/bootstrap.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/sdk_config.ini delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/.gitignore delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/CHANGELOG.md delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/LICENSE.txt delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/README.md delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/build.xml delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/composer.json delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/IPPCredential.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/IPPThirdPartyAuthorization.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Oauth/AuthSignature.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Oauth/MockOAuthDataStore.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Oauth/OAuthConsumer.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Oauth/OAuthDataStore.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Oauth/OAuthRequest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Oauth/OAuthServer.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Oauth/OAuthSignatureMethod.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Oauth/OAuthSignatureMethodHmacSha1.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Oauth/OAuthSignatureMethodPLAINTEXT.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Oauth/OAuthSignatureMethodRsaSha1.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Oauth/OAuthToken.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Oauth/OAuthUtil.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Openid/PPOpenIdAddress.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Openid/PPOpenIdError.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Openid/PPOpenIdSession.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Openid/PPOpenIdTokeninfo.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Openid/PPOpenIdUserinfo.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/PPCertificateCredential.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/PPSignatureCredential.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/PPSubjectAuthorization.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/PPTokenAuthorization.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Common/PPApiContext.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Common/PPArrayUtil.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Common/PPModel.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Common/PPReflectionUtil.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Common/PPUserAgent.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPAPIService.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPBaseService.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPConfigManager.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPConnectionManager.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPConstants.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPCredentialManager.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPHttpConfig.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPHttpConnection.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPLoggingManager.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPMessage.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPRequest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPUtils.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPXmlMessage.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/cacert.pem delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Exception/OAuthException.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Exception/PPConfigurationException.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Exception/PPConnectionException.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Exception/PPInvalidCredentialException.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Exception/PPMissingCredentialException.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Exception/PPTransformerException.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Formatter/FormatterFactory.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Formatter/IPPFormatter.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Formatter/PPNVPFormatter.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Formatter/PPSOAPFormatter.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Handler/IPPHandler.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Handler/PPAuthenticationHandler.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Handler/PPCertificateAuthHandler.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Handler/PPGenericServiceHandler.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Handler/PPMerchantServiceHandler.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Handler/PPOpenIdHandler.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Handler/PPPlatformServiceHandler.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Handler/PPSignatureAuthHandler.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/IPN/PPIPNMessage.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Transport/PPRestCall.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/Openid/PPOpenIdAddressTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/Openid/PPOpenIdSessionTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/Openid/PPOpenIdTokeninfoTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/Openid/PPOpenIdUserinfoTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPAPIServiceTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPBaseServiceTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPBootStrap.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPCertificateCredentialTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPConfigManagerTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPConfigurationExceptionTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPConnectionExceptionTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPConnectionManagerTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPCredentialManagerTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPIPNMessageTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPInvalidCredentialExceptionTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPLoggingManagerTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPMessageTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPMissingCredentialExceptionTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPSignatureCredentialTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPUtilsTest.php delete mode 100644 lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/sdk_config.ini delete mode 100755 lib/paymentProcessors/PayPal/test.php delete mode 100644 lib/paymentProcessors/TestByCardNumber/paymentGateway.php delete mode 100644 lib/paymentProcessors/TestGood/paymentGateway.php delete mode 100644 lib/paymentProcessors/readme.txt rename setup/databaseScripts/{create_database_V0.0.25.sql => create_database_V0.0.27.sql} (98%) rename setup/databaseScripts/{drop_database_V0.0.25.sql => drop_database_V0.0.26.sql} (100%) create mode 100644 setup/databaseScripts/update_database_V0.0.26.sql create mode 100644 setup/databaseScripts/update_database_V0.0.27.sql delete mode 100644 views/admin/settings/PENDING_DELETE_registrationsPaymentCode.html diff --git a/classes/data/dataAccount.php b/classes/data/dataAccount.php index d17786b..ed6faae 100644 --- a/classes/data/dataAccount.php +++ b/classes/data/dataAccount.php @@ -394,6 +394,30 @@ class GlmDataRegistrationsAccount extends GlmDataAbstract 'default' => 0 ), + // Customer Profile ID for stored credit card profile with Authorize.net + 'customer_profile_id' => array ( + 'field' => 'customer_profile_id', + 'type' => 'text', + 'required' => false, + 'use' => 'a' + ), + + // Payment Profile ID for stored credit card profile with Authorize.net + 'payment_profile_id' => array ( + 'field' => 'payment_profile_id', + 'type' => 'text', + 'required' => false, + 'use' => 'a' + ), + + // Payment Profile card with only last 4 digits for card profile with Authorize.net + 'payment_profile_card' => array ( + 'field' => 'payment_profile_card', + 'type' => 'text', + 'required' => false, + 'use' => 'a' + ), + // Pointer to GLM Associate member contact record if account is for a member contact 'contact_id' => array ( 'field' => 'contact_id', diff --git a/classes/data/dataManagement.php b/classes/data/dataManagement.php index 515c81b..5a8d9fe 100644 --- a/classes/data/dataManagement.php +++ b/classes/data/dataManagement.php @@ -260,13 +260,21 @@ class GlmDataRegistrationsManagement extends GlmDataAbstract 'default' => 0, ), - // Authorize.net Merchant Email + // Authorize.net Merchant E-Mail 'reg_authorize_net_merchant_email' => array ( 'field' => 'reg_authorize_net_merchant_email', 'type' => 'text', 'use' => 'a' ), + // Authorize.net Verified Merchant Seal code. + 'reg_authorize_net_merchant_seal' => array ( + 'field' => 'reg_authorize_net_merchant_seal', + 'type' => 'text', + 'filter' => FILTER_SANITIZE_SPECIAL_CHARS, + 'use' => 'a' + ), + // Merchant Solutions Account ID 'reg_merchant_solutions_acctid' => array ( 'field' => 'reg_merchant_solutions_acctid', diff --git a/css/front.css b/css/front.css index 4bf18b6..d014c09 100644 --- a/css/front.css +++ b/css/front.css @@ -785,7 +785,13 @@ span.glm-error { } #accountHeader .glm-reg-header-btn:hover { text-decoration: none; - +} +#accountHeader .glm-reg-header-logout { + color: white; +} +#accountHeader .glm-reg-header-logout:hover { + text-decoration: none; + color: #e3a146; } #accountHeader #register { clear: both; diff --git a/index.php b/index.php index ac79f4f..1bf3c97 100644 --- a/index.php +++ b/index.php @@ -44,7 +44,7 @@ if (!defined('ABSPATH')) { * version from this plugin. */ define('GLM_MEMBERS_REGISTRATIONS_PLUGIN_VERSION', '0.0.1'); -define('GLM_MEMBERS_REGISTRATIONS_PLUGIN_DB_VERSION', '0.0.25'); +define('GLM_MEMBERS_REGISTRATIONS_PLUGIN_DB_VERSION', '0.0.27'); // This is the minimum version of the GLM Members DB plugin require for this plugin. define('GLM_MEMBERS_REGISTRATIONS_PLUGIN_MIN_MEMBERS_REQUIRED_VERSION', '2.10.17'); diff --git a/lib/paymentProcessors/Authorize.Net/AIM_guide-1.pdf b/lib/paymentProcessors/Authorize.Net/AIM_guide-1.pdf deleted file mode 100644 index 4ed80c011797438e5b2164aebbd4c1ee9763f1b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 339407 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

D5g3`^K5)VwDTVmAl z{(VQO(~G|T*B!Ne#t<^3w;_UI6|rgKx`5Qk-E;YZ*T#L7+*=~WuH@Za`{sMS$}up0 znMQiZJRK6^RBjeu$oTc~wwe{D3-7p|&CaakIzfl4ImgjI$~DgB zSypbWty5ih$usN48s#<{KI+PO9I0A&jK9Pu=$ z{#>(RSwWGa$9LdXXhM2WLOP|WkZD|+dij1gukEhIsV?lL2EV;lJy|Jh`a}-!`y}`e!P!bTzm5d=#tiVFZ3 z1QBP6!BOxy$`S+?zyN4~g2s|i7#tNxqGE}N4<95$6TYKKd3>r1%kG0ZI7LSWKu|Ch zjSdM3u?)dkN~Hd14242L!%Y>7MZpv(S*RG|C{SYA{2?L3a#)~@D-{Go0*M%*mdo*z z$RRossa7=d8LAhLJEA98E)@=H;c?NR5EOx8NQTB(V$dVPVO|=KOXW+XA`Zmh1P2QR zT#i}`I+(|&p+}2G6{+bV0VD(mYdNBPu)0hkG(J}?Uu~~YpoW1e@hKj{fF@P5h{Sna^SB{iOq;3+4kYOj~h(IP;L0AcPa5c4D#RV9#R6?I*{?@X-vz161tL z!=|4a6(26oar_!Hed=S+Zi97(OSjE;_tsnE{7Wnq@x95MWf!Lx(D(O8=rQYppZmC5 z`n2}0xo2sA<{2`JYMorLJ}AIXxqMo;_Izj&X3pBgeMR57Y8V7nuDyN^qr+~zP>Ui- zQnTl3c#D0M_h)$`OTL<7bI63>GTq|mqqwK~!ssUH!0XLkokpon&)@fNEyq&|pDF6H zL;AOzec&9d_s!uS9%mHG`*xM*XC7O%wV~v9GllPNT1+8yU}iaI&H-@y8efkCy8M`j zzQhAF_)+=*ce_5Y^zO{uvib`@ZF|HPO17LnxaQLBtfK^r)448}eh+ zq4nDOs&jTl+u=La=7y$#yI(i)6#_ zM%#<|5(GR?qh3XD8HSw#KL+L^kwEGK^(2!E+Eow+s#Am^SFCmc`Do9z7z7T1@gAMW z38-&R4hl%%=oP1`LXE;_m4#Qwp;snl-!U`IwBN&8NhvGVU3Bg3vV($BlRbqiEj(fk zwJE|o9O()_KdIh!z-NK+-kKs|t}5bsNB-5`YxPwYUj3?0Uh5V6-=0%yv6-KP$bm=BTc&Nbi-oT+`bvuE=GRdkN1)>HJ5B?e=oq zR;#q|Cz3Pfb;*Y(g{QbFZx~j1{Ifhx_ye82+1375zVqd%EW1mExsJ3(>EQ;G@LfN` z2RoIU6MHub7yVpUiwxZ1How=d#Lz&?Db3wPnzg8MV;1Na=dz(Uv0_En2ARq$Xs&Hf zV49n!$&gBW?{b~q?yR?H zWbk z+@BBh^dvKmRBTFV{W>_S4>DqhmsnC7C%*Ato+!nqJ zCgICaN^YB2F+^cMO7K2PKQFH1&D`DTZCBtER!nZ|@1CGTf`{}{NFfFJGc++6_z`eZ LQ(Gsy8JhnAufm3T diff --git a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/AuthorizeNet.php b/lib/paymentProcessors/Authorize.Net/anet_php_sdk/AuthorizeNet.php deleted file mode 100755 index 31fdaa9..0000000 --- a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/AuthorizeNet.php +++ /dev/null @@ -1,29 +0,0 @@ -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 oiV>RHSwKDa0ux3IPje?lQ5{X>vC?dD}*X^ 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듯P+dYC)B$uSRi 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

&G7}GBpw23AXK%A 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

{}e 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ÐDCLVT1JIQ!>4?)_Dn9Bffc04+y*}(`Z+yD`_i*v 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 z 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%0AL3I&H$~pnEVo$KCy#-0C+tNR&;+VKzZ{WG`6 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 Includes all classes. Include this file in your project. - - lib/AuthorizeNetAIM.php -> AIM API. - - lib/AuthorizeNetARB.php -> ARB API. - - lib/AuthorizeNetCIM.php -> CIM API. - - lib/AuthorizeNetSIM.php -> SIM API. - - lib/AuthorizeNetTD.php -> Reporting API. - - lib/AuthorizeNetCP.php -> Card Present API. - - lib/AuthorizeNetDPM.php -> Direct Post Method Helpers. - - lib/AuthorizeNetSOAP.php -> Class to assist with using the SOAP API. - - lib/shared/AuthorizeNetRequest.php -> Class to connect to AuthorizeNet. - - lib/shared/AuthorizeNetTypes.php -> Classes for AuthorizeNet Datatypes. - - lib/shared/AuthorizeNetResponse.php -> Class to parse AuthorizeNet NVP Responses. - - lib/shared/AuthorizeNetXMLResponse.php -> Class to parse AuthorizeNet XML Responses. - - lib/ssl/cert.pem -> The AuthorizeNet Certificate bundle. - - tests/ -> Tests & examples for each of the API methods. - - README -> This file. - - README.html -> HTML version of this file. - -Requirements: - - cURL PHP Extension - - PHP 5.2+ - - An Authorize.Net Merchant Account or Test Account. You can get a - free test account at http://developer.authorize.net/testaccount/ - -Install: - - Include the 'AuthorizeNet.php' file in your application. - - Use your desired API. - -Usage Examples: - See below for basic usage examples. View the tests/ folder for more examples of each API. - -AuthorizeNetAIM.php Quick Usage Example: - amount = "5.99"; - $sale->card_num = '6011000000000012'; - $sale->exp_date = '04/15'; - $response = $sale->authorizeAndCapture(); - if ($response->approved) { - $transaction_id = $response->transaction_id; - } - ?> - -AuthorizeNetAIM.php Advanced Usage Example: - amount = "45.00"; - - // Use eCheck: - $auth->setECheck( - '121042882', - '123456789123', - 'CHECKING', - 'Bank of Earth', - 'Jane Doe', - 'WEB' - ); - - // Set multiple line items: - $auth->addLineItem('item1', 'Golf tees', 'Blue tees', '2', '5.00', 'N'); - $auth->addLineItem('item2', 'Golf shirt', 'XL', '1', '40.00', 'N'); - - // Set Invoice Number: - $auth->invoice_num = time(); - - // Set a Merchant Defined Field: - $auth->setCustomField("entrance_source", "Search Engine"); - - // Authorize Only: - $response = $auth->authorizeOnly(); - - if ($response->approved) { - $auth_code = $response->transaction_id; - - // Now capture: - $capture = new AuthorizeNetAIM; - $capture_response = $capture->priorAuthCapture($auth_code); - - // Now void: - $void = new AuthorizeNetAIM; - $void_response = $void->void($capture_response->transaction_id); - } - ?> - -AuthorizeNetARB.php Usage Example: - name = "PHP Monthly Magazine"; - $subscription->intervalLength = "1"; - $subscription->intervalUnit = "months"; - $subscription->startDate = "2011-03-12"; - $subscription->totalOccurrences = "12"; - $subscription->amount = "12.99"); - $subscription->creditCardCardNumber = "6011000000000012"; - $subscription->creditCardExpirationDate= "2018-10"; - $subscription->creditCardCardCode = "123"; - $subscription->billToFirstName = "Rasmus"; - $subscription->billToLastName = "Doe"; - - // Create the subscription. - $request = new AuthorizeNetARB; - $response = $request->createSubscription($subscription); - $subscription_id = $response->getSubscriptionId(); - ?> - -AuthorizeNetCIM.php Usage Example: - description = "Description of customer"; - $customerProfile->merchantCustomerId= time(); - $customerProfile->email = "test@domain.com"; - $response = $request->createCustomerProfile($customerProfile); - if ($response->isOk()) { - $customerProfileId = $response->getCustomerProfileId(); - } - ?> - -AuthorizeNetSIM.php Usage Example: - isAuthorizeNet()) { - $transactionId = $message->transaction_id; - } - ?> - -AuthorizeNetDPM.php Usage Example: - - -AuthorizeNetCP.php Usage Example: - amount = '59.99'; - $sale->device_type = '4'; - $sale->setTrack1Data('%B4111111111111111^CARDUSER/JOHN^1803101000000000020000831000000?'); - $response = $sale->authorizeAndCapture(); - $trans_id = $response->transaction_id; - ?> - -AuthorizeNetTD.php Usage Example: - getTransactionDetails("12345"); - echo $response->xml->transaction->transactionStatus; - ?> - -Test Credit Card Numbers: - - Set the expiration date to anytime in the future. - - American Express Test Card=> 370000000000002 - - Discover Test Card => 6011000000000012 - - Visa Test Card => 4007000000027 - - Second Visa Test Card => 4012888818888 - - JCB => 3088000000000017 - - Diners Club/ Carte Blanche=> 38000000000006 - -PHPDoc: - To autogenerate PHPDocs run: - phpdoc -t phpdocs/ -f AuthorizeNet.php -d lib - -Release Notes - Version 1.1.8 - - Fixed an issue with validationMode in CIM::updateCustomerPaymentProfile. - Note: The behavior where validationMode persisted across transactions using the same request object - has been removed. This was unsupported behavior. - - Removed an unused validationMode argument in CIM::updateCustomerProfile. The parameter used to be ignored, now its removed. - - Enhanced the tests with checks for single digit months in expiration date support and SSL certificate validity. - Version 1.1.7 - - Added getBatchStatisticsRequest and getUnsettledTransactionListRequest support to the SDK. - Version 1.1.6 - - Added the HTML version of the README to the distributed bundle. It was missing in version 1.1.5. - Version 1.1.5 - - Added HTML version of README. - Version 1.1.4 - - Updated the cert.pem bundle to include the new secure.authorize.net SSL certificate. - Version 1.1.3 - - Added more documentation - - Improved support for all Transaction Details API methods. - - Added support for the Card Present API. - - Added easier xpath support to XML Response class. - - Added ability to use DPM sample app with production account. - Version 1.1.2 - - Added getValidationResponses method to CIM Response for parsing the validation results when validating payment profiles. - - Added support for UpdateSplitTenderGroup method to CIM request. - - Bug fix. In CIM requests using validation mode the the validation mode element should have been added to the end of the request. - - Bug fix. In AIM Response class where $response->account_number was returning the wrong value. \ No newline at end of file diff --git a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/README.html b/lib/paymentProcessors/Authorize.Net/anet_php_sdk/README.html deleted file mode 100755 index 795637a..0000000 --- a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/README.html +++ /dev/null @@ -1,358 +0,0 @@ - - - - PHP SDK README - - - - -

Authorize.Net PHP SDK

-

version 3.1.2

-
http://developer.authorize.net
-
http://community.developer.authorize.net
- -
-

License

-Authorize.Net
- See License.pdf -
- -
-

About

-A PHP library for working with all Authorize.Net APIs. - - -
-

Files

- - - - - - - - - - - - - - - - - - - -
Authorize.Net.phpIncludes all classes. Include this file in your project.
AuthorizeNet.phpIncludes all classes. Include this file in your project.
lib/AuthorizeNetAIM.phpAIM API.
lib/AuthorizeNetARB.php-> ARB API.
lib/AuthorizeNetCIM.phpCIM API.
lib/AuthorizeNetSIM.phpSIM API.
lib/AuthorizeNetTD.phpReporting API.
lib/AuthorizeNetCP.phpCard Present API.
lib/AuthorizeNetDPM.phpDirect Post Method Helpers.
lib/AuthorizeNetSOAP.phpClass to assist with using the SOAP API.
lib/shared/AuthorizeNetRequest.phpClass to connect to AuthorizeNet.
lib/shared/AuthorizeNetTypes.phpClasses for AuthorizeNet Datatypes.
lib/shared/AuthorizeNetResponse.phpClass to parse AuthorizeNet NVP Responses.
lib/shared/AuthorizeNetXMLResponse.phpClass to parse AuthorizeNet XML Responses.
lib/ssl/cert.pemThe AuthorizeNet Certificate bundle.
tests/Tests & examples for each of the API methods.
READMEPlain text version of this file.
README.htmlThis file.
- -
-

Requirements

- - -

Install

-
    -
  • Include the 'AuthorizeNet.php' file in your application. -
  • Use your desired API. -
- -

Usage Examples:

- See below for basic usage examples. View the tests/ folder for more examples of each API. - -
AuthorizeNetAIM.php Quick Usage Example
-<?php - require_once 'anet_php_sdk/AuthorizeNet.php'; - define("AUTHORIZENET_API_LOGIN_ID", "YOURLOGIN"); - define("AUTHORIZENET_TRANSACTION_KEY", "YOURKEY"); - define("AUTHORIZENET_SANDBOX", true); - $sale = new AuthorizeNetAIM; - $sale->amount = "5.99"; - $sale->card_num = '6011000000000012'; - $sale->exp_date = '04/15'; - $response = $sale->authorizeAndCapture(); - if ($response->approved) { - $transaction_id = $response->transaction_id; - } -?> - - -
AuthorizeNetAIM.php Advanced Usage Example
-<?php - require_once 'anet_php_sdk/AuthorizeNet.php'; - define("AUTHORIZENET_API_LOGIN_ID", "YOURLOGIN"); - define("AUTHORIZENET_TRANSACTION_KEY", "YOURKEY"); - define("AUTHORIZENET_SANDBOX", true); - $auth = new AuthorizeNetAIM; - $auth->amount = "45.00"; - - // Use eCheck: - $auth->setECheck( - '121042882', - '123456789123', - 'CHECKING', - 'Bank of Earth', - 'Jane Doe', - 'WEB' - ); - - // Set multiple line items: - $auth->addLineItem('item1', 'Golf tees', 'Blue tees', '2', '5.00', 'N'); - $auth->addLineItem('item2', 'Golf shirt', 'XL', '1', '40.00', 'N'); - - // Set Invoice Number: - $auth->invoice_num = time(); - - // Set a Merchant Defined Field: - $auth->setCustomField("entrance_source", "Search Engine"); - - // Authorize Only: - $response = $auth->authorizeOnly(); - - if ($response->approved) { - $auth_code = $response->transaction_id; - - // Now capture: - $capture = new AuthorizeNetAIM; - $capture_response = $capture->priorAuthCapture($auth_code); - - // Now void: - $void = new AuthorizeNetAIM; - $void_response = $void->void($capture_response->transaction_id); - } -?> - - -
AuthorizeNetARB.php Usage Example
-<?php - require_once 'anet_php_sdk/AuthorizeNet.php'; - define("AUTHORIZENET_API_LOGIN_ID", "YOURLOGIN"); - define("AUTHORIZENET_TRANSACTION_KEY", "YOURKEY"); - $subscription = new AuthorizeNet_Subscription; - $subscription->name = "PHP Monthly Magazine"; - $subscription->intervalLength = "1"; - $subscription->intervalUnit = "months"; - $subscription->startDate = "2011-03-12"; - $subscription->totalOccurrences = "12"; - $subscription->amount = "12.99"); - $subscription->creditCardCardNumber = "6011000000000012"; - $subscription->creditCardExpirationDate= "2018-10"; - $subscription->creditCardCardCode = "123"; - $subscription->billToFirstName = "Rasmus"; - $subscription->billToLastName = "Doe"; - - // Create the subscription. - $request = new AuthorizeNetARB; - $response = $request->createSubscription($subscription); - $subscription_id = $response->getSubscriptionId(); -?> - - -
AuthorizeNetCIM.php Usage Example
-<?php - require_once 'anet_php_sdk/AuthorizeNet.php'; - define("AUTHORIZENET_API_LOGIN_ID", "YOURLOGIN"); - define("AUTHORIZENET_TRANSACTION_KEY", "YOURKEY"); - $request = new AuthorizeNetCIM; - // Create new customer profile - $customerProfile = new AuthorizeNetCustomer; - $customerProfile->description = "Description of customer"; - $customerProfile->merchantCustomerId= time(); - $customerProfile->email = "test@domain.com"; - $response = $request->createCustomerProfile($customerProfile); - if ($response->isOk()) { - $customerProfileId = $response->getCustomerProfileId(); - } -?> - - -
AuthorizeNetSIM.php Usage Example
-<?php - require_once 'anet_php_sdk/AuthorizeNet.php'; - define("AUTHORIZENET_API_LOGIN_ID", "YOURLOGIN"); - define("AUTHORIZENET_MD5_SETTING", ""); - $message = new AuthorizeNetSIM; - if ($message->isAuthorizeNet()) { - $transactionId = $message->transaction_id; - } -?> - - -
AuthorizeNetDPM.php Usage Example
-<?php // Filename: direct_post.php - require_once 'anet_php_sdk/AuthorizeNet.php'; // The SDK - $url = "http://YOUR_DOMAIN.com/direct_post.php"; - $api_login_id = 'YOUR_API_LOGIN_ID'; - $transaction_key = 'YOUR_TRANSACTION_KEY'; - $md5_setting = 'YOUR_MD5_SETTING'; // Your MD5 Setting - $amount = "5.99"; - AuthorizeNetDPM::directPostDemo($url, $api_login_id, $transaction_key, $amount, $md5_setting); -?> - - -
AuthorizeNetCP.php Usage Example
-<?php - require_once 'anet_php_sdk/AuthorizeNet.php'; - define("AUTHORIZENET_API_LOGIN_ID", "YOURLOGIN"); - define("AUTHORIZENET_TRANSACTION_KEY", "YOURKEY"); - define("AUTHORIZENET_MD5_SETTING", ""); - $sale = new AuthorizeNetCP; - $sale->amount = '59.99'; - $sale->device_type = '4'; - $sale->setTrack1Data('%B4111111111111111^CARDUSER/JOHN^1803101000000000020000831000000?'); - $response = $sale->authorizeAndCapture(); - $trans_id = $response->transaction_id; -?> - - -
AuthorizeNetTD.php Usage Example
-<?php - require_once 'anet_php_sdk/AuthorizeNet.php'; - define("AUTHORIZENET_API_LOGIN_ID", "YOURLOGIN"); - define("AUTHORIZENET_TRANSACTION_KEY", "YOURKEY"); - $request = new AuthorizeNetTD; - $response = $request->getTransactionDetails("12345"); - echo $response->xml->transaction->transactionStatus; -?> - - -
-

Test Credit Card Numbers

- - - - - - - -
American Express Test Card370000000000002
Discover Test Card6011000000000012
Visa Test Card4007000000027
Second Visa Test Card4012888818888
JCB3088000000000017
Diners Club/ Carte Blanche38000000000006
-Set the expiration date to anytime in the future. -
- -

PHPDoc:

- To autogenerate PHPDocs run - phpdoc -t phpdocs/ -f AuthorizeNet.php -d lib - -

Release Notes

- - Version 1.1.8 -
    -
  • - Fixed an issue with validationMode in CIM::updateCustomerPaymentProfile. Note: The behavior where validationMode persisted across transactions using the same request object has been removed. This was unsupported behavior. -
  • -
  • - Removed an unused validationMode argument in CIM::updateCustomerProfile. The parameter used to be ignored, now its removed. -
  • -
  • - Enhanced the tests with checks for single digit months in expiration date support and SSL certificate validity. -
  • -
- Version 1.1.7 -
    -
  • Added getBatchStatisticsRequest and getUnsettledTransactionListRequest support to the SDK.
  • -
- Version 1.1.6 -
    -
  • Added the HTML version of the README to the distributed bundle. It was missing in version 1.1.5.
  • -
- Version 1.1.5 -
    -
  • Added HTML version of README.
  • -
- Version 1.1.4 -
    -
  • Updated the cert.pem bundle to include the new secure.authorize.net SSL certificate.
  • -
- Version 1.1.3 -
    -
  • Added more documentation
  • -
  • Improved support for all Transaction Details API methods.
  • -
  • Added support for the Card Present API.
  • -
  • Added easier xpath support to XML Response class.
  • -
  • Added ability to use DPM sample app with production account.
  • -
- Version 1.1.2 -
    -
  • Added getValidationResponses method to CIM Response for parsing the validation results when validating payment profiles.
  • -
  • Added support for UpdateSplitTenderGroup method to CIM request.
  • -
  • Bug fix. In CIM requests using validation mode the the validation mode element should have been added to the end of the request.
  • -
  • Bug fix. In AIM Response class where $response->account_number was returning the wrong value.
  • -
-
- - \ No newline at end of file diff --git a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/doc/AIM.markdown b/lib/paymentProcessors/Authorize.Net/anet_php_sdk/doc/AIM.markdown deleted file mode 100755 index 2ae1541..0000000 --- a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/doc/AIM.markdown +++ /dev/null @@ -1,187 +0,0 @@ -Advanced Integration Method -=========================== - -Basic Overview --------------- - -The AuthorizeNetAIM class creates a request object for submitting transactions -to the AuthorizeNetAIM API. To use, create an instance of the class, set the fields -for your transaction, call the method you want to use (Authorize Only, Authorize & -Capture, etc.) and you'll receive an AuthorizeNetAIM response object providing easy access -to the results of the transaction. - -Including the SDK ------------------ - -require_once 'anet_php_sdk/AuthorizeNet.php'; - -Setting Merchant Credentials ----------------------------- -The easiest way to set credentials is to define constants which the SDK uses: -define("AUTHORIZENET_API_LOGIN_ID", "YOURLOGIN"); -define("AUTHORIZENET_TRANSACTION_KEY", "YOURKEY"); - -You can also set credentials manually per request like so: - -$sale = new AuthorizeNetAIM("YOUR_API_LOGIN_ID","YOUR_TRANSACTION_KEY"); - - -Setting the Transaction Post Location -------------------------------------- - -To post transactions to the live Authorize.Net gateway: -define("AUTHORIZENET_SANDBOX", false); - -To post transactions to the Authorize.Net test server: -define("AUTHORIZENET_SANDBOX", true); - -You can also set the location manually per request: -$sale->setSandbox(false); - - -Setting Fields --------------- - -An Authorize.Net AIM request is simply a set of name/value pairs. The PHP SDK -allows you to set these fields in a few different ways depending on your -preference. - -Note: to make things easier on the developer, the "x_" prefix attached to each -field in the AIM API has been removed. Thus, instead of setting $sale->x_card_num, -set $sale->card_num instead. - -1.) By Setting Fields Directly: -$sale = new AuthorizeNetAIM; -$sale->amount = "1999.99"; -$sale->card_num = '6011000000000012'; -$sale->exp_date = '04/15'; -$response = $sale->authorizeAndCapture(); - -2.) By Setting Multiple Fields at Once: -$sale = new AuthorizeNetAIM; -$sale->setFields( - array( - 'amount' => rand(1, 1000), - 'card_num' => '6011000000000012', - 'exp_date' => '0415' - ) -); - -3.) By Setting Special Items - -To add line items or set custom fields use the respective functions: - -Line Items: -$sale->addLineItem( - 'item1', // Item Id - 'Golf tees', // Item Name - 'Blue tees', // Item Description - '2', // Item Quantity - '5.00', // Item Unit Price - 'N' // Item taxable - ); - -Custom Fields: -$sale->setCustomField("coupon_code", "SAVE2011"); - -4.) By Passing in Objects - -Each property will be copied from the object to the AIM request. - -$sale = new AuthorizeNetAIM; -$customer = (object)array(); -$customer->first_name = "Jane"; -$customer->last_name = "Smith"; -$customer->company = "Jane Smith Enterprises Inc."; -$customer->address = "20 Main Street"; -$customer->city = "San Francisco"; -$customer->state = "CA"; -$customer->zip = "94110"; -$customer->country = "US"; -$customer->phone = "415-555-5557"; -$customer->fax = "415-555-5556"; -$customer->email = "foo@example.com"; -$customer->cust_id = "55"; -$customer->customer_ip = "98.5.5.5"; -$sale->setFields($customer); - -Submitting Transactions ------------------------ -To submit a transaction call one of the 7 methods: - --authorizeAndCapture() --authorizeOnly() --priorAuthCapture() --void() --captureOnly() --credit() - -Each method has optional parameters which highlight the fields required by the -Authorize.Net API for that transaction type. - - -eCheck ------- -To submit an electronic check transaction you can set the required fields individually -or simply use the setECheck method: - -$sale = new AuthorizeNetAIM; -$sale->amount = "45.00"; -$sale->setECheck( - '121042882', // bank_aba_code - '123456789123', // bank_acct_num - 'CHECKING', // bank_acct_type - 'Bank of Earth', // bank_name - 'Jane Doe', // bank_acct_name - 'WEB' // echeck_type -); -$response = $sale->authorizeAndCapture(); - - -Partial Authorization Transactions ----------------------------------- -To enable partial authorization transactions set the partial_auth flag -to true: - -$sale->allow_partial_auth = true; - -You should receive a split tender id in the response if a partial auth -is made: - -$split_tender_id = $response->split_tender_id; - - -Itemized Order Information --------------------------- -To add itemized order information use the addLineItem method: - -$auth->addLineItem( - 'item1', // Item Id - 'Golf tees', // Item Name - 'Blue tees', // Item Description - '2', // Item Quantity - '5.00', // Item Unit Price - 'N' // Item taxable - ); - - -Merchant Defined Fields ------------------------ -You can use the setCustomField method to set any custom merchant defined field(s): - -$sale->setCustomField("entrance_source", "Search Engine"); -$sale->setCustomField("coupon_code", "SAVE2011"); - - -Transaction Response --------------------- -When you submit an AIM transaction you receive an AuthorizeNetAIM_Response -object in return. You can access each name/value pair in the response as -you would normally expect: - -$response = $sale->authorizeAndCapture(); -$response->response_code; -$response->response_subcode; -$response->response_reason_code; -$response->transaction_id; - diff --git a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/doc/ARB.markdown b/lib/paymentProcessors/Authorize.Net/anet_php_sdk/doc/ARB.markdown deleted file mode 100755 index 1d4bb92..0000000 --- a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/doc/ARB.markdown +++ /dev/null @@ -1,52 +0,0 @@ -ARB API -======= - -Basic Overview --------------- - -The AuthorizeNetARB class creates a request object for submitting transactions -to the AuthorizeNetARB API. - - -Creating/Updating Subscriptions -------------------------------- - -To create or update a subscription first create a subscription object: - -$subscription = new AuthorizeNet_Subscription; -$subscription->name = "Short subscription"; -$subscription->intervalLength = "1"; -$subscription->intervalUnit = "months"; -$subscription->startDate = "2011-03-12"; -$subscription->totalOccurrences = "14"; -$subscription->amount = rand(1,100); -$subscription->creditCardCardNumber = "6011000000000012"; -$subscription->creditCardExpirationDate = "2018-10"; -$subscription->creditCardCardCode = "123"; -$subscription->billToFirstName = "john"; -$subscription->billToLastName = "doe"; - -Then create an AuthorizeNetARB object and call the appropriate method -passing in your subscription object: - -$request = new AuthorizeNetARB; -$response = $request->createSubscription($subscription); - - or for updating a subscription: - -$response = $request->updateSubscription($subscription_id, $subscription); - -Getting Subscription Status ---------------------------- - -Create a new AuthorizeNetARB object and call the getSubscriptionStatus -method with the subscription_id you want the status of as the parameter: - -$status_request = new AuthorizeNetARB; -$status_response = $status_request->getSubscriptionStatus($subscription_id); - -Canceling a Subscription ------------------------- - -$cancellation = new AuthorizeNetARB; -$cancel_response = $cancellation->cancelSubscription($subscription_id); diff --git a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/doc/CIM.markdown b/lib/paymentProcessors/Authorize.Net/anet_php_sdk/doc/CIM.markdown deleted file mode 100755 index bbe8a3b..0000000 --- a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/doc/CIM.markdown +++ /dev/null @@ -1,249 +0,0 @@ -CIM API -======= - -Basic Overview --------------- - -The AuthorizeNetCIM class creates a request object for submitting transactions -to the Authorize.Net CIM API. - - -Creating a Customer Profile ---------------------------- - -To create a new cusomter profile, first create a new AuthorizeNetCustomer -object. - -$customerProfile = new AuthorizeNetCustomer; -$customerProfile->description = "Description of customer"; -$customerProfile->merchantCustomerId = 123; -$customerProfile->email = "user@domain.com"; - -You can then create an add payment profiles and addresses to this -customer object. - -// Add payment profile. -$paymentProfile = new AuthorizeNetPaymentProfile; -$paymentProfile->customerType = "individual"; -$paymentProfile->payment->creditCard->cardNumber = "4111111111111111"; -$paymentProfile->payment->creditCard->expirationDate = "2015-10"; -$customerProfile->paymentProfiles[] = $paymentProfile; - -// Add another payment profile. -$paymentProfile2 = new AuthorizeNetPaymentProfile; -$paymentProfile2->customerType = "business"; -$paymentProfile2->payment->bankAccount->accountType = "businessChecking"; -$paymentProfile2->payment->bankAccount->routingNumber = "121042882"; -$paymentProfile2->payment->bankAccount->accountNumber = "123456789123"; -$paymentProfile2->payment->bankAccount->nameOnAccount = "Jane Doe"; -$paymentProfile2->payment->bankAccount->echeckType = "WEB"; -$paymentProfile2->payment->bankAccount->bankName = "Pandora Bank"; -$customerProfile->paymentProfiles[] = $paymentProfile2; - - -// Add shipping address. -$address = new AuthorizeNetAddress; -$address->firstName = "john"; -$address->lastName = "Doe"; -$address->company = "John Doe Company"; -$address->address = "1 Main Street"; -$address->city = "Boston"; -$address->state = "MA"; -$address->zip = "02412"; -$address->country = "USA"; -$address->phoneNumber = "555-555-5555"; -$address->faxNumber = "555-555-5556"; -$customerProfile->shipToList[] = $address; - -// Add another shipping address. -$address2 = new AuthorizeNetAddress; -$address2->firstName = "jane"; -$address2->lastName = "Doe"; -$address2->address = "11 Main Street"; -$address2->city = "Boston"; -$address2->state = "MA"; -$address2->zip = "02412"; -$address2->country = "USA"; -$address2->phoneNumber = "555-512-5555"; -$address2->faxNumber = "555-523-5556"; -$customerProfile->shipToList[] = $address2; - - -Next, create an AuthorizeNetCIM object: - -$request = new AuthorizeNetCIM; - -Finally, call the createCustomerProfile method and pass in your -customer object: - -$response = $request->createCustomerProfile($customerProfile); - -The response object provides some helper methods for easy access to the -results of the transaction: - -$new_customer_id = $response->getCustomerProfileId(); - -The response object also stores the XML response as a SimpleXml element -which you can access like so: - -$new_customer_id = $response->xml->customerProfileId - -You can also run xpath queries against the result: - -$array = $response->xpath('customerProfileId'); -$new_customer_id = $array[0]; - - -Deleting a Customer Profile ---------------------------- - -To delete a customer profile first create a new AuthorizeNetCIM object: - -$request = new AuthorizeNetCIM; - -Then call the deleteCustomerProfile method: - -request->deleteCustomerProfile($customer_id); - - -Retrieving a Customer Profile ------------------------------ - -To retrieve a customer profile call the getCustomerProfile method: - -$response = $request->getCustomerProfile($customerProfileId); - - -Validation Mode ---------------- - -Validation mode allows you to generate a test transaction at the time you create a customer profile. In Test Mode, only field validation is performed. In Live Mode, a transaction is generated and submitted to the processor with the amount of $0.00 or $0.01. If successful, the transaction is immediately voided. - -To create a customer profile with Validation mode, simply pass in the -a value for the validation mode parameter on the createCustomerProfile method: - -$response = $request->createCustomerProfile($customerProfile, "testMode"); - -You can access the validation response for each payment profile via xpath, -the SimpleXML element or the getValidationResponses method: - -$validationResponses = $response->getValidationResponses(); - foreach ($validationResponses as $vr) { - echo $vr->approved; -} - - -Updating a Customer Profile ---------------------------- - -Call the updateCustomerProfile method with the customerProfileId and customerProfile -parameters: - -$response = $request->updateCustomerProfile($customerProfileId, $customerProfile); - - -Adding a Payment Profile ------------------------- - - -$paymentProfile = new AuthorizeNetPaymentProfile; -$paymentProfile->customerType = "individual"; -$paymentProfile->payment->creditCard->cardNumber = "4111111111111111"; -$paymentProfile->payment->creditCard->expirationDate = "2015-10"; -$response = $request->createCustomerPaymentProfile($customerProfileId, $paymentProfile); - - -Updating a Payment Profile --------------------------- - -$paymentProfile->payment->creditCard->cardNumber = "4111111111111111"; -$paymentProfile->payment->creditCard->expirationDate = "2017-11"; -$response = $request->updateCustomerPaymentProfile($customerProfileId,$paymentProfileId, $paymentProfile); - -Adding a Shipping Address -------------------------- - - - -$address = new AuthorizeNetAddress; -$address->firstName = "john"; -$address->lastName = "Doe"; -$address->company = "John Doe Company"; -$address->address = "1 Main Street"; -$address->city = "Boston"; -$address->state = "MA"; -$address->zip = "02412"; -$address->country = "USA"; -$address->phoneNumber = "555-555-5555"; -$address->faxNumber = "555-555-5556"; -$response = $request->createCustomerShippingAddress($customerProfileId, $address); -$customerAddressId = $response->getCustomerAddressId(); - -Updating a Shipping Address ---------------------------- - -// Update shipping address. -$address->address = "2 First Street"; -$response = $request->updateCustomerShippingAddress($customerProfileId, $customerAddressId, $address); - - -Creating Transactions ---------------------- - -// Create Auth & Capture Transaction -$transaction = new AuthorizeNetTransaction; -$transaction->amount = "9.79"; -$transaction->customerProfileId = $customerProfileId; -$transaction->customerPaymentProfileId = $paymentProfileId; -$transaction->customerShippingAddressId = $customerAddressId; - -$lineItem = new AuthorizeNetLineItem; -$lineItem->itemId = "4"; -$lineItem->name = "Cookies"; -$lineItem->description = "Chocolate Chip"; -$lineItem->quantity = "4"; -$lineItem->unitPrice = "1.00"; -$lineItem->taxable = "true"; - -$lineItem2 = new AuthorizeNetLineItem; -$lineItem2->itemId = "4"; -$lineItem2->name = "Cookies"; -$lineItem2->description= "Peanut Butter"; -$lineItem2->quantity = "4"; -$lineItem2->unitPrice = "1.00"; -$lineItem2->taxable = "true"; - -$transaction->lineItems[] = $lineItem; -$transaction->lineItems[] = $lineItem2; - - -$response = $request->createCustomerProfileTransaction("AuthCapture", $transaction); -$transactionResponse = $response->getTransactionResponse(); -$transactionId = $transactionResponse->transaction_id; - - -Voiding a Transaction ---------------------- - -$transaction = new AuthorizeNetTransaction; -$transaction->transId = $transactionId; -$response = $request->createCustomerProfileTransaction("Void", $transaction); - - -Deleting a Shipping Address ---------------------------- - -$response = $request->deleteCustomerShippingAddress($customerProfileId, $customerAddressId); - - -Deleting a Payment Profile --------------------------- - -$response = $request->deleteCustomerPaymentProfile($customerProfileId, $paymentProfileId); - - - -Getting Customer Profile IDs ----------------------------- - -$response = $request->getCustomerProfileIds(); \ No newline at end of file diff --git a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/doc/CP.markdown b/lib/paymentProcessors/Authorize.Net/anet_php_sdk/doc/CP.markdown deleted file mode 100755 index 96ea161..0000000 --- a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/doc/CP.markdown +++ /dev/null @@ -1,43 +0,0 @@ -Card Present API -================ - -Basic Overview --------------- - -The AuthorizeNetCP class creates a request object for submitting transactions -to the AuthorizeNetCP API. The AuthorizeNetCP class extends the AuthorizeNetAIM -class. See the AIM.markdown for help with the basics. This document contains -information regarding the special features of the AuthorizeNetCP class. - - -Merchant Credentials --------------------- - -Please note that if you are using both the CNP and CP APIs your merchant -credentials will be different. - -Setting Track Data ------------------- - -To set Track 1 and/or Track 2 data, use the respective methods like so: - -$sale = new AuthorizeNetCP(CP_API_LOGIN_ID, CP_TRANSACTION_KEY); -$sale->setFields( - array( - 'amount' => rand(1, 1000), - 'device_type' => '4', - ) -); -$sale->setTrack1Data('%B4111111111111111^CARDUSER/JOHN^1803101000000000020000831000000?'); -$response = $sale->authorizeAndCapture(); - -$sale = new AuthorizeNetCP(CP_API_LOGIN_ID, CP_TRANSACTION_KEY); -$sale->setFields( - array( - 'amount' => rand(1, 1000), - 'device_type' => '4', - ) -); -$sale->setTrack2Data('4111111111111111=1803101000020000831?'); -$response = $sale->authorizeAndCapture(); - diff --git a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/doc/DPM.markdown b/lib/paymentProcessors/Authorize.Net/anet_php_sdk/doc/DPM.markdown deleted file mode 100755 index 115cc9d..0000000 --- a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/doc/DPM.markdown +++ /dev/null @@ -1,24 +0,0 @@ -Direct Post Method -================== - -Basic Overview --------------- - -The Authorize.Net PHP SDK includes a class that demonstrates one way -of implementing the Direct Post Method. - -While it is not necessary to use the AuthorizeNetDPM class to implement -DPM, it may serve as a handy reference. - -The AuthorizeNetDPM class extends the AuthorizeNetSIM_Form class. -See the SIM.markdown for additional documentation. - -Relay Response Snippet ----------------------- - -The AuthorizeNetDPM class contains a getRelayResponseSnippet($redirect_url) -which generates a snippet of HTML that will redirect a user back to your -site after submitting a checkout form using DPM/SIM. - -Use this method(or just grab the html) if you want to create a checkout -experience where the user only interacts with pages on your site. \ No newline at end of file diff --git a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/doc/SIM.markdown b/lib/paymentProcessors/Authorize.Net/anet_php_sdk/doc/SIM.markdown deleted file mode 100755 index ee38e59..0000000 --- a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/doc/SIM.markdown +++ /dev/null @@ -1,74 +0,0 @@ -Server Integration Method -========================= - -Basic Overview --------------- - -The Authorize.Net PHP SDK includes classes that can speed up implementing -a Server Integration Method solution. - - -Hosted Order/Receipt Page -------------------------- - -The AuthorizeNetSIM_Form class aims to make it easier to setup the hidden -fields necessary for creating a SIM experience. While it is not necessary -to use the AuthorizeNetSIM_Form class to implement SIM, it may be handy for -reference. - -The code below will generate a buy now button that leads to a hosted order page: - -
- $amount, - 'x_fp_sequence' => $fp_sequence, - 'x_fp_hash' => $fingerprint, - 'x_fp_timestamp' => $time, - 'x_relay_response'=> "FALSE", - 'x_login' => $api_login_id, - ) -); -echo $sim->getHiddenFieldString();?> - -
- -Fingerprint Generation ----------------------- - -To generate the fingerprint needed for a SIM transaction call the getFingerprint method: - -$fingerprint = AuthorizeNetSIM_Form::getFingerprint($api_login_id, $transaction_key, $amount, $fp_sequence, $fp_timestamp); - - -Relay Response --------------- - -The PHP SDK includes a AuthorizeNetSIM class for handling a relay response from -Authorize.Net. - -To receive a relay response from Authorize.Net you can either configure the -url in the Merchant Interface or specify the url when submitting a transaction -with SIM using the "x_relay_url" field. - -When a transaction occurs, Authorize.Net will post the transaction details to -this url. You can then craete a page on your server at a url such as -http://yourdomain.com/response_handler.php and execute any logic you want -when a transaction occurs. The AuthorizeNetSIM class makes it easy to verify -the transaction came from Authorize.Net and parse the response: - -$response = new AuthorizeNetSIM; -if ($response->isAuthorizeNet()) -{ - if ($response->approved) - { - // Activate magazine subscription - magazine_subscription_activate($response->cust_id); - } -} diff --git a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/doc/SOAP.markdown b/lib/paymentProcessors/Authorize.Net/anet_php_sdk/doc/SOAP.markdown deleted file mode 100755 index a535f00..0000000 --- a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/doc/SOAP.markdown +++ /dev/null @@ -1,10 +0,0 @@ -SOAP -==== - -Basic Overview --------------- - -The AuthorizeNetSOAP class provides a very basic wrapper to PHP's bundled -SoapClient class. The AuthorizeNetSOAP class merely contains the WSDL, -Sandbox, and Live Production server urls to make it easier to connect -to the Authorize.Net SOAP API. \ No newline at end of file diff --git a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/doc/TD.markdown b/lib/paymentProcessors/Authorize.Net/anet_php_sdk/doc/TD.markdown deleted file mode 100755 index c9a1bfb..0000000 --- a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/doc/TD.markdown +++ /dev/null @@ -1,55 +0,0 @@ -Transaction Details API -======================= - -Basic Overview --------------- - -The AuthorizeNetTD class creates a request object for submitting requests -to the Authorize.Net Transaction Details API. - -The AuthorizeNetTD class returns a response that uses PHP's bundled SimpleXML -class for accessing it's members. - -The AuthorizeNetTD response provides two ways to access response elements: - -1.) A SimpleXml object: - -$response->xml->transaction->payment->creditCard->cardType - -2.) Xpath: - -$batches = $response->xpath("batchList/batch"); - -3.) AuthorizeNet Objects (todo) - - - -Get Transaction Details ------------------------ - -$request = new AuthorizeNetTD; -$response = $request->getTransactionDetails($transId); -echo "Amount: {$response->xml->transaction->authAmount}"; - -Get Settled Batch List ----------------------- -$request = new AuthorizeNetTD; -$response = $request->getSettledBatchList(); -$batches = $response->xpath("batchList/batch"); -echo "Batch 1: {$batches[0]->batchId}"; - -Get Transaction List --------------------- -$request = new AuthorizeNetTD; -$response = $request->getTransactionList($batch_id); -$transactions = $response->xpath("transactions/transaction") - -There are two additional helper methods in the PHP SDK which -will make multiple calls to retrieve a day's worth of -transactions or a month's worth of batches: - -getTransactionsForDay($month, $day, $year = false) -getSettledBatchListForMonth($month , $year) - -If you don't pass parameters into these methods they will default -to the current day/month. diff --git a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/AuthorizeNetAIM.php b/lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/AuthorizeNetAIM.php deleted file mode 100755 index d63f98c..0000000 --- a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/AuthorizeNetAIM.php +++ /dev/null @@ -1,502 +0,0 @@ - - * setFields( - * array( - * 'amount' => '4.99', - * 'card_num' => '411111111111111', - * 'exp_date' => '0515' - * ) - * ); - * $response = $sale->authorizeAndCapture(); - * if ($response->approved) { - * echo "Sale successful!"; } else { - * echo $response->error_message; - * } - * ?> - * - * - * Note: To send requests to the live gateway, either define this: - * define("AUTHORIZENET_SANDBOX", false); - * -- OR -- - * $sale = new AuthorizeNetAIM; - * $sale->setSandbox(false); - * - * @package AuthorizeNet - * @subpackage AuthorizeNetAIM - * @link http://www.authorize.net/support/AIM_guide.pdf AIM Guide - */ - - -/** - * Builds and sends an AuthorizeNet AIM Request. - * - * @package AuthorizeNet - * @subpackage AuthorizeNetAIM - */ -class AuthorizeNetAIM extends AuthorizeNetRequest -{ - - // const LIVE_URL = 'https://secure.authorize.net/gateway/transact.dll'; - const LIVE_URL = 'http://ws6.gaslightmedia.com/AuthorizeNetRelay/glmAuthNetRelay/AuthNetRelayProduction.php'; - //const SANDBOX_URL = 'https://test.authorize.net/gateway/transact.dll'; - const SANDBOX_URL = 'http://ws6.gaslightmedia.com/AuthorizeNetRelay/glmAuthNetRelay/AuthNetRelayTest.php'; - - /** - * Holds all the x_* name/values that will be posted in the request. - * Default values are provided for best practice fields. - */ - protected $_x_post_fields = array( - "version" => "3.1", - "delim_char" => ",", - "delim_data" => "TRUE", - "relay_response" => "FALSE", - "encap_char" => "|", - ); - - /** - * Only used if merchant wants to send multiple line items about the charge. - */ - private $_additional_line_items = array(); - - /** - * Only used if merchant wants to send custom fields. - */ - private $_custom_fields = array(); - - /** - * Checks to make sure a field is actually in the API before setting. - * Set to false to skip this check. - */ - public $verify_x_fields = true; - - /** - * A list of all fields in the AIM API. - * Used to warn user if they try to set a field not offered in the API. - */ - private $_all_aim_fields = array("address","allow_partial_auth","amount", - "auth_code","authentication_indicator", "bank_aba_code","bank_acct_name", - "bank_acct_num","bank_acct_type","bank_check_number","bank_name", - "card_code","card_num","cardholder_authentication_value","city","company", - "country","cust_id","customer_ip","delim_char","delim_data","description", - "duplicate_window","duty","echeck_type","email","email_customer", - "encap_char","exp_date","fax","first_name","footer_email_receipt", - "freight","header_email_receipt","invoice_num","last_name","line_item", - "login","method","phone","po_num","recurring_billing","relay_response", - "ship_to_address","ship_to_city","ship_to_company","ship_to_country", - "ship_to_first_name","ship_to_last_name","ship_to_state","ship_to_zip", - "split_tender_id","state","tax","tax_exempt","test_request","tran_key", - "trans_id","type","version","zip" - ); - - /** - * Do an AUTH_CAPTURE transaction. - * - * Required "x_" fields: card_num, exp_date, amount - * - * @param string $amount The dollar amount to charge - * @param string $card_num The credit card number - * @param string $exp_date CC expiration date - * - * @return AuthorizeNetAIM_Response - */ - public function authorizeAndCapture($amount = false, $card_num = false, $exp_date = false) - { - ($amount ? $this->amount = $amount : null); - ($card_num ? $this->card_num = $card_num : null); - ($exp_date ? $this->exp_date = $exp_date : null); - $this->type = "AUTH_CAPTURE"; - return $this->_sendRequest(); - } - - /** - * Do a PRIOR_AUTH_CAPTURE transaction. - * - * Required "x_" field: trans_id(The transaction id of the prior auth, unless split - * tender, then set x_split_tender_id manually.) - * amount (only if lesser than original auth) - * - * @param string $trans_id Transaction id to charge - * @param string $amount Dollar amount to charge if lesser than auth - * - * @return AuthorizeNetAIM_Response - */ - public function priorAuthCapture($trans_id = false, $amount = false) - { - ($trans_id ? $this->trans_id = $trans_id : null); - ($amount ? $this->amount = $amount : null); - $this->type = "PRIOR_AUTH_CAPTURE"; - return $this->_sendRequest(); - } - - /** - * Do an AUTH_ONLY transaction. - * - * Required "x_" fields: card_num, exp_date, amount - * - * @param string $amount The dollar amount to charge - * @param string $card_num The credit card number - * @param string $exp_date CC expiration date - * - * @return AuthorizeNetAIM_Response - */ - public function authorizeOnly($amount = false, $card_num = false, $exp_date = false) - { - ($amount ? $this->amount = $amount : null); - ($card_num ? $this->card_num = $card_num : null); - ($exp_date ? $this->exp_date = $exp_date : null); - $this->type = "AUTH_ONLY"; - return $this->_sendRequest(); - } - - /** - * Do a VOID transaction. - * - * Required "x_" field: trans_id(The transaction id of the prior auth, unless split - * tender, then set x_split_tender_id manually.) - * - * @param string $trans_id Transaction id to void - * - * @return AuthorizeNetAIM_Response - */ - public function void($trans_id = false) - { - ($trans_id ? $this->trans_id = $trans_id : null); - $this->type = "VOID"; - return $this->_sendRequest(); - } - - /** - * Do a CAPTURE_ONLY transaction. - * - * Required "x_" fields: auth_code, amount, card_num , exp_date - * - * @param string $auth_code The auth code - * @param string $amount The dollar amount to charge - * @param string $card_num The last 4 of credit card number - * @param string $exp_date CC expiration date - * - * @return AuthorizeNetAIM_Response - */ - public function captureOnly($auth_code = false, $amount = false, $card_num = false, $exp_date = false) - { - ($auth_code ? $this->auth_code = $auth_code : null); - ($amount ? $this->amount = $amount : null); - ($card_num ? $this->card_num = $card_num : null); - ($exp_date ? $this->exp_date = $exp_date : null); - $this->type = "CAPTURE_ONLY"; - return $this->_sendRequest(); - } - - /** - * Do a CREDIT transaction. - * - * Required "x_" fields: trans_id, amount, card_num (just the last 4) - * - * @param string $trans_id Transaction id to credit - * @param string $amount The dollar amount to credit - * @param string $card_num The last 4 of credit card number - * - * @return AuthorizeNetAIM_Response - */ - public function credit($trans_id = false, $amount = false, $card_num = false) - { - ($trans_id ? $this->trans_id = $trans_id : null); - ($amount ? $this->amount = $amount : null); - ($card_num ? $this->card_num = $card_num : null); - $this->type = "CREDIT"; - return $this->_sendRequest(); - } - - /** - * Alternative syntax for setting x_ fields. - * - * Usage: $sale->method = "echeck"; - * - * @param string $name - * @param string $value - */ - public function __set($name, $value) - { - $this->setField($name, $value); - } - - /** - * Quickly set multiple fields. - * - * Note: The prefix x_ will be added to all fields. If you want to set a - * custom field without the x_ prefix, use setCustomField or setCustomFields. - * - * @param array $fields Takes an array or object. - */ - public function setFields($fields) - { - $array = (array)$fields; - foreach ($array as $key => $value) { - $this->setField($key, $value); - } - } - - /** - * Quickly set multiple custom fields. - * - * @param array $fields - */ - public function setCustomFields($fields) - { - $array = (array)$fields; - foreach ($array as $key => $value) { - $this->setCustomField($key, $value); - } - } - - /** - * Add a line item. - * - * @param string $item_id - * @param string $item_name - * @param string $item_description - * @param string $item_quantity - * @param string $item_unit_price - * @param string $item_taxable - */ - public function addLineItem($item_id, $item_name, $item_description, $item_quantity, $item_unit_price, $item_taxable) - { - $line_item = ""; - $delimiter = ""; - foreach (func_get_args() as $key => $value) { - $line_item .= $delimiter . $value; - $delimiter = "<|>"; - } - $this->_additional_line_items[] = $line_item; - } - - /** - * Use ECHECK as payment type. - */ - public function setECheck($bank_aba_code, $bank_acct_num, $bank_acct_type, $bank_name, $bank_acct_name, $echeck_type = 'WEB') - { - $this->setFields( - array( - 'method' => 'echeck', - 'bank_aba_code' => $bank_aba_code, - 'bank_acct_num' => $bank_acct_num, - 'bank_acct_type' => $bank_acct_type, - 'bank_name' => $bank_name, - 'bank_acct_name' => $bank_acct_type, - 'echeck_type' => $echeck_type, - ) - ); - } - - /** - * Set an individual name/value pair. This will append x_ to the name - * before posting. - * - * @param string $name - * @param string $value - */ - public function setField($name, $value) - { - if ($this->verify_x_fields) { - if (in_array($name, $this->_all_aim_fields)) { - $this->_x_post_fields[$name] = $value; - } else { - throw new AuthorizeNetException("Error: no field $name exists in the AIM API. - To set a custom field use setCustomField('field','value') instead."); - } - } else { - $this->_x_post_fields[$name] = $value; - } - } - - /** - * Set a custom field. Note: the x_ prefix will not be added to - * your custom field if you use this method. - * - * @param string $name - * @param string $value - */ - public function setCustomField($name, $value) - { - $this->_custom_fields[$name] = $value; - } - - /** - * Unset an x_ field. - * - * @param string $name Field to unset. - */ - public function unsetField($name) - { - unset($this->_x_post_fields[$name]); - } - - /** - * - * - * @param string $response - * - * @return AuthorizeNetAIM_Response - */ - protected function _handleResponse($response) - { - return new AuthorizeNetAIM_Response($response, $this->_x_post_fields['delim_char'], $this->_x_post_fields['encap_char'], $this->_custom_fields); - } - - /** - * @return string - */ - protected function _getPostUrl() - { - return ($this->_sandbox ? self::SANDBOX_URL : self::LIVE_URL); - } - - /** - * Converts the x_post_fields array into a string suitable for posting. - */ - protected function _setPostString() - { - $this->_x_post_fields['login'] = $this->_api_login; - $this->_x_post_fields['tran_key'] = $this->_transaction_key; - $this->_post_string = ""; - foreach ($this->_x_post_fields as $key => $value) { - $this->_post_string .= "x_$key=" . urlencode($value) . "&"; - } - // Add line items - foreach ($this->_additional_line_items as $key => $value) { - $this->_post_string .= "x_line_item=" . urlencode($value) . "&"; - } - // Add custom fields - foreach ($this->_custom_fields as $key => $value) { - $this->_post_string .= "$key=" . urlencode($value) . "&"; - } - $this->_post_string = rtrim($this->_post_string, "& "); - } -} - -/** - * Parses an AuthorizeNet AIM Response. - * - * @package AuthorizeNet - * @subpackage AuthorizeNetAIM - */ -class AuthorizeNetAIM_Response extends AuthorizeNetResponse -{ - private $_response_array = array(); // An array with the split response. - - /** - * Constructor. Parses the AuthorizeNet response string. - * - * @param string $response The response from the AuthNet server. - * @param string $delimiter The delimiter used (default is ",") - * @param string $encap_char The encap_char used (default is "|") - * @param array $custom_fields Any custom fields set in the request. - */ - public function __construct($response, $delimiter, $encap_char, $custom_fields) - { - if ($response) { - - // Split Array - $this->response = $response; - if ($encap_char) { - $this->_response_array = explode($encap_char.$delimiter.$encap_char, substr($response, 1, -1)); - } else { - $this->_response_array = explode($delimiter, $response); - } - - /** - * If AuthorizeNet doesn't return a delimited response. - */ - if (count($this->_response_array) < 10) { - $this->approved = false; - $this->error = true; - $this->error_message = "Unrecognized response from AuthorizeNet: $response"; - return; - } - - - - // Set all fields - $this->response_code = $this->_response_array[0]; - $this->response_subcode = $this->_response_array[1]; - $this->response_reason_code = $this->_response_array[2]; - $this->response_reason_text = $this->_response_array[3]; - $this->authorization_code = $this->_response_array[4]; - $this->avs_response = $this->_response_array[5]; - $this->transaction_id = $this->_response_array[6]; - $this->invoice_number = $this->_response_array[7]; - $this->description = $this->_response_array[8]; - $this->amount = $this->_response_array[9]; - $this->method = $this->_response_array[10]; - $this->transaction_type = $this->_response_array[11]; - $this->customer_id = $this->_response_array[12]; - $this->first_name = $this->_response_array[13]; - $this->last_name = $this->_response_array[14]; - $this->company = $this->_response_array[15]; - $this->address = $this->_response_array[16]; - $this->city = $this->_response_array[17]; - $this->state = $this->_response_array[18]; - $this->zip_code = $this->_response_array[19]; - $this->country = $this->_response_array[20]; - $this->phone = $this->_response_array[21]; - $this->fax = $this->_response_array[22]; - $this->email_address = $this->_response_array[23]; - $this->ship_to_first_name = $this->_response_array[24]; - $this->ship_to_last_name = $this->_response_array[25]; - $this->ship_to_company = $this->_response_array[26]; - $this->ship_to_address = $this->_response_array[27]; - $this->ship_to_city = $this->_response_array[28]; - $this->ship_to_state = $this->_response_array[29]; - $this->ship_to_zip_code = $this->_response_array[30]; - $this->ship_to_country = $this->_response_array[31]; - $this->tax = $this->_response_array[32]; - $this->duty = $this->_response_array[33]; - $this->freight = $this->_response_array[34]; - $this->tax_exempt = $this->_response_array[35]; - $this->purchase_order_number= $this->_response_array[36]; - $this->md5_hash = $this->_response_array[37]; - $this->card_code_response = $this->_response_array[38]; - $this->cavv_response = $this->_response_array[39]; - $this->account_number = $this->_response_array[50]; - $this->card_type = $this->_response_array[51]; - $this->split_tender_id = $this->_response_array[52]; - $this->requested_amount = $this->_response_array[53]; - $this->balance_on_card = $this->_response_array[54]; - - $this->approved = ($this->response_code == self::APPROVED); - $this->declined = ($this->response_code == self::DECLINED); - $this->error = ($this->response_code == self::ERROR); - $this->held = ($this->response_code == self::HELD); - - // Set custom fields - if ($count = count($custom_fields)) { - $custom_fields_response = array_slice($this->_response_array, -$count, $count); - $i = 0; - foreach ($custom_fields as $key => $value) { - $this->$key = $custom_fields_response[$i]; - $i++; - } - } - - if ($this->error) { - $this->error_message = "AuthorizeNet Error: - Response Code: ".$this->response_code." - Response Subcode: ".$this->response_subcode." - Response Reason Code: ".$this->response_reason_code." - Response Reason Text: ".$this->response_reason_text." - "; - } - } else { - $this->approved = false; - $this->error = true; - $this->error_message = "Error connecting to AuthorizeNet"; - } - } - -} diff --git a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/AuthorizeNetARB.php b/lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/AuthorizeNetARB.php deleted file mode 100755 index 8df101a..0000000 --- a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/AuthorizeNetARB.php +++ /dev/null @@ -1,159 +0,0 @@ -_request_payload = ($refId ? "$refId" : ""); - } - - /** - * Create an ARB subscription - * - * @param AuthorizeNet_Subscription $subscription - * - * @return AuthorizeNetARB_Response - */ - public function createSubscription(AuthorizeNet_Subscription $subscription) - { - $this->_request_type = "CreateSubscriptionRequest"; - $this->_request_payload .= $subscription->getXml(); - return $this->_sendRequest(); - } - - /** - * Update an ARB subscription - * - * @param int $subscriptionId - * @param AuthorizeNet_Subscription $subscription - * - * @return AuthorizeNetARB_Response - */ - public function updateSubscription($subscriptionId, AuthorizeNet_Subscription $subscription) - { - $this->_request_type = "UpdateSubscriptionRequest"; - $this->_request_payload .= "$subscriptionId"; - $this->_request_payload .= $subscription->getXml(); - return $this->_sendRequest(); - } - - /** - * Get status of a subscription - * - * @param int $subscriptionId - * - * @return AuthorizeNetARB_Response - */ - public function getSubscriptionStatus($subscriptionId) - { - $this->_request_type = "GetSubscriptionStatusRequest"; - $this->_request_payload .= "$subscriptionId"; - return $this->_sendRequest(); - } - - /** - * Cancel a subscription - * - * @param int $subscriptionId - * - * @return AuthorizeNetARB_Response - */ - public function cancelSubscription($subscriptionId) - { - $this->_request_type = "CancelSubscriptionRequest"; - $this->_request_payload .= "$subscriptionId"; - return $this->_sendRequest(); - } - - /** - * - * - * @param string $response - * - * @return AuthorizeNetARB_Response - */ - protected function _handleResponse($response) - { - return new AuthorizeNetARB_Response($response); - } - - /** - * @return string - */ - protected function _getPostUrl() - { - return ($this->_sandbox ? self::SANDBOX_URL : self::LIVE_URL); - } - - /** - * Prepare the XML document for posting. - */ - protected function _setPostString() - { - $this->_post_string =<< -_request_type} xmlns= "AnetApi/xml/v1/schema/AnetApiSchema.xsd"> - - {$this->_api_login} - {$this->_transaction_key} - - {$this->_request_payload} -_request_type}> -XML; - } - -} - - -/** - * A class to parse a response from the ARB XML API. - * - * @package AuthorizeNet - * @subpackage AuthorizeNetARB - */ -class AuthorizeNetARB_Response extends AuthorizeNetXMLResponse -{ - - /** - * @return int - */ - public function getSubscriptionId() - { - return $this->_getElementContents("subscriptionId"); - } - - /** - * @return string - */ - public function getSubscriptionStatus() - { - return $this->_getElementContents("Status"); - } - -} \ No newline at end of file diff --git a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/AuthorizeNetCIM.php b/lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/AuthorizeNetCIM.php deleted file mode 100755 index eb44342..0000000 --- a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/AuthorizeNetCIM.php +++ /dev/null @@ -1,511 +0,0 @@ -_refId = $refId; - } - - /** - * Create a customer profile. - * - * @param AuthorizeNetCustomer $customerProfile - * @param string $validationMode - * - * @return AuthorizeNetCIM_Response - */ - public function createCustomerProfile($customerProfile, $validationMode = "none") - { - $this->_validationMode = $validationMode; - $this->_constructXml("createCustomerProfileRequest"); - $profile = $this->_xml->addChild("profile"); - $this->_addObject($profile, $customerProfile); - return $this->_sendRequest(); - } - - /** - * Create a customer payment profile. - * - * @param int $customerProfileId - * @param AuthorizeNetPaymentProfile $paymentProfile - * @param string $validationMode - * - * @return AuthorizeNetCIM_Response - */ - public function createCustomerPaymentProfile($customerProfileId, $paymentProfile, $validationMode = "none") - { - $this->_validationMode = $validationMode; - $this->_constructXml("createCustomerPaymentProfileRequest"); - $this->_xml->addChild("customerProfileId", $customerProfileId); - $profile = $this->_xml->addChild("paymentProfile"); - $this->_addObject($profile, $paymentProfile); - return $this->_sendRequest(); - } - - /** - * Create a shipping address. - * - * @param int $customerProfileId - * @param AuthorizeNetAddress $shippingAddress - * - * @return AuthorizeNetCIM_Response - */ - public function createCustomerShippingAddress($customerProfileId, $shippingAddress) - { - $this->_constructXml("createCustomerShippingAddressRequest"); - $this->_xml->addChild("customerProfileId", $customerProfileId); - $address = $this->_xml->addChild("address"); - $this->_addObject($address, $shippingAddress); - return $this->_sendRequest(); - } - - /** - * Create a transaction. - * - * @param string $transactionType - * @param AuthorizeNetTransaction $transaction - * @param string $extraOptionsString - * - * @return AuthorizeNetCIM_Response - */ - public function createCustomerProfileTransaction($transactionType, $transaction, $extraOptionsString = "") - { - $this->_constructXml("createCustomerProfileTransactionRequest"); - $transactionParent = $this->_xml->addChild("transaction"); - $transactionChild = $transactionParent->addChild("profileTrans" . $transactionType); - $this->_addObject($transactionChild, $transaction); - $this->_extraOptions = $extraOptionsString; - return $this->_sendRequest(); - } - - /** - * Delete a customer profile. - * - * @param int $customerProfileId - * - * @return AuthorizeNetCIM_Response - */ - public function deleteCustomerProfile($customerProfileId) - { - $this->_constructXml("deleteCustomerProfileRequest"); - $this->_xml->addChild("customerProfileId", $customerProfileId); - return $this->_sendRequest(); - } - - /** - * Delete a payment profile. - * - * @param int $customerProfileId - * @param int $customerPaymentProfileId - * - * @return AuthorizeNetCIM_Response - */ - public function deleteCustomerPaymentProfile($customerProfileId, $customerPaymentProfileId) - { - $this->_constructXml("deleteCustomerPaymentProfileRequest"); - $this->_xml->addChild("customerProfileId", $customerProfileId); - $this->_xml->addChild("customerPaymentProfileId", $customerPaymentProfileId); - return $this->_sendRequest(); - } - - /** - * Delete a shipping address. - * - * @param int $customerProfileId - * @param int $customerAddressId - * - * @return AuthorizeNetCIM_Response - */ - public function deleteCustomerShippingAddress($customerProfileId, $customerAddressId) - { - $this->_constructXml("deleteCustomerShippingAddressRequest"); - $this->_xml->addChild("customerProfileId", $customerProfileId); - $this->_xml->addChild("customerAddressId", $customerAddressId); - return $this->_sendRequest(); - } - - /** - * Get all customer profile ids. - * - * @return AuthorizeNetCIM_Response - */ - public function getCustomerProfileIds() - { - $this->_constructXml("getCustomerProfileIdsRequest"); - return $this->_sendRequest(); - } - - /** - * Get a customer profile. - * - * @param int $customerProfileId - * - * @return AuthorizeNetCIM_Response - */ - public function getCustomerProfile($customerProfileId) - { - $this->_constructXml("getCustomerProfileRequest"); - $this->_xml->addChild("customerProfileId", $customerProfileId); - return $this->_sendRequest(); - } - - /** - * Get a payment profile. - * - * @param int $customerProfileId - * @param int $customerPaymentProfileId - * - * @return AuthorizeNetCIM_Response - */ - public function getCustomerPaymentProfile($customerProfileId, $customerPaymentProfileId) - { - $this->_constructXml("getCustomerPaymentProfileRequest"); - $this->_xml->addChild("customerProfileId", $customerProfileId); - $this->_xml->addChild("customerPaymentProfileId", $customerPaymentProfileId); - return $this->_sendRequest(); - } - - /** - * Get a shipping address. - * - * @param int $customerProfileId - * @param int $customerAddressId - * - * @return AuthorizeNetCIM_Response - */ - public function getCustomerShippingAddress($customerProfileId, $customerAddressId) - { - $this->_constructXml("getCustomerShippingAddressRequest"); - $this->_xml->addChild("customerProfileId", $customerProfileId); - $this->_xml->addChild("customerAddressId", $customerAddressId); - return $this->_sendRequest(); - } - - /** - * Update a profile. - * - * @param int $customerProfileId - * @param AuthorizeNetCustomer $customerProfile - * - * @return AuthorizeNetCIM_Response - */ - public function updateCustomerProfile($customerProfileId, $customerProfile) - { - $this->_constructXml("updateCustomerProfileRequest"); - $customerProfile->customerProfileId = $customerProfileId; - $profile = $this->_xml->addChild("profile"); - $this->_addObject($profile, $customerProfile); - return $this->_sendRequest(); - } - - /** - * Update a payment profile. - * - * @param int $customerProfileId - * @param int $customerPaymentProfileId - * @param AuthorizeNetPaymentProfile $paymentProfile - * @param string $validationMode - * - * @return AuthorizeNetCIM_Response - */ - public function updateCustomerPaymentProfile($customerProfileId, $customerPaymentProfileId, $paymentProfile, $validationMode = "none") - { - $this->_validationMode = $validationMode; - $this->_constructXml("updateCustomerPaymentProfileRequest"); - $this->_xml->addChild("customerProfileId", $customerProfileId); - $paymentProfile->customerPaymentProfileId = $customerPaymentProfileId; - $profile = $this->_xml->addChild("paymentProfile"); - $this->_addObject($profile, $paymentProfile); - return $this->_sendRequest(); - } - - /** - * Update a shipping address. - * - * @param int $customerProfileId - * @param int $customerShippingAddressId - * @param AuthorizeNetAddress $shippingAddress - * - * @return AuthorizeNetCIM_Response - */ - public function updateCustomerShippingAddress($customerProfileId, $customerShippingAddressId, $shippingAddress) - { - - $this->_constructXml("updateCustomerShippingAddressRequest"); - $this->_xml->addChild("customerProfileId", $customerProfileId); - $shippingAddress->customerAddressId = $customerShippingAddressId; - $sa = $this->_xml->addChild("address"); - $this->_addObject($sa, $shippingAddress); - return $this->_sendRequest(); - } - - /** - * Update the status of an existing order that contains multiple transactions with the same splitTenderId. - * - * @param int $splitTenderId - * @param string $splitTenderStatus - * - * @return AuthorizeNetCIM_Response - */ - public function updateSplitTenderGroup($splitTenderId, $splitTenderStatus) - { - $this->_constructXml("updateSplitTenderGroupRequest"); - $this->_xml->addChild("splitTenderId", $splitTenderId); - $this->_xml->addChild("splitTenderStatus", $splitTenderStatus); - return $this->_sendRequest(); - } - - /** - * Validate a customer payment profile. - * - * @param int $customerProfileId - * @param int $customerPaymentProfileId - * @param int $customerShippingAddressId - * @param int $cardCode - * @param string $validationMode - * - * @return AuthorizeNetCIM_Response - */ - public function validateCustomerPaymentProfile($customerProfileId, $customerPaymentProfileId, $customerShippingAddressId, $cardCode, $validationMode = "testMode") - { - $this->_validationMode = $validationMode; - $this->_constructXml("validateCustomerPaymentProfileRequest"); - $this->_xml->addChild("customerProfileId",$customerProfileId); - $this->_xml->addChild("customerPaymentProfileId",$customerPaymentProfileId); - $this->_xml->addChild("customerShippingAddressId",$customerShippingAddressId); - $this->_xml->addChild("cardCode",$cardCode); - return $this->_sendRequest(); - } - - /** - * @return string - */ - protected function _getPostUrl() - { - return ($this->_sandbox ? self::SANDBOX_URL : self::LIVE_URL); - } - - /** - * - * - * @param string $response - * - * @return AuthorizeNetCIM_Response - */ - protected function _handleResponse($response) - { - return new AuthorizeNetCIM_Response($response); - } - - /** - * Prepare the XML post string. - */ - protected function _setPostString() - { - ($this->_validationMode != "none" ? $this->_xml->addChild('validationMode',$this->_validationMode) : ""); - $this->_post_string = $this->_xml->asXML(); - - // Add extraOptions CDATA - if ($this->_extraOptions) { - $this->_xml->addChild("extraOptions"); - $this->_post_string = str_replace("",'_extraOptions . ']]>', $this->_xml->asXML()); - $this->_extraOptions = false; - } - // Blank out our validation mode, so that we don't include it in calls that - // don't use it. - $this->_validationMode = "none"; - } - - /** - * Start the SimpleXMLElement that will be posted. - * - * @param string $request_type The action to be performed. - */ - private function _constructXml($request_type) - { - $string = '<'.$request_type.' xmlns="AnetApi/xml/v1/schema/AnetApiSchema.xsd">'; - $this->_xml = @new SimpleXMLElement($string); - $merchant = $this->_xml->addChild('merchantAuthentication'); - $merchant->addChild('name',$this->_api_login); - $merchant->addChild('transactionKey',$this->_transaction_key); - ($this->_refId ? $this->_xml->addChild('refId',$this->_refId) : ""); - } - - /** - * Add an object to an SimpleXMLElement parent element. - * - * @param SimpleXMLElement $destination The parent element. - * @param Object $object An object, array or value. - */ - private function _addObject($destination, $object) - { - $array = (array)$object; - foreach ($array as $key => $value) { - if ($value && !is_object($value)) { - if (is_array($value) && count($value)) { - foreach ($value as $index => $item) { - $items = $destination->addChild($key); - $this->_addObject($items, $item); - } - } else { - $destination->addChild($key,$value); - } - } elseif (is_object($value) && self::_notEmpty($value)) { - $dest = $destination->addChild($key); - $this->_addObject($dest, $value); - } - } - } - - /** - * Checks whether an array or object contains any values. - * - * @param Object $object - * - * @return bool - */ - private static function _notEmpty($object) - { - $array = (array)$object; - foreach ($array as $key => $value) { - if ($value && !is_object($value)) { - return true; - } elseif (is_object($value)) { - if (self::_notEmpty($value)) { - return true; - } - } - } - return false; - } - -} - -/** - * A class to parse a response from the CIM XML API. - * - * @package AuthorizeNet - * @subpackage AuthorizeNetCIM - */ -class AuthorizeNetCIM_Response extends AuthorizeNetXMLResponse -{ - /** - * @return AuthorizeNetAIM_Response - */ - public function getTransactionResponse() - { - return new AuthorizeNetAIM_Response($this->_getElementContents("directResponse"), ",", "", array()); - } - - /** - * @return array Array of AuthorizeNetAIM_Response objects for each payment profile. - */ - public function getValidationResponses() - { - $responses = (array)$this->xml->validationDirectResponseList; - $return = array(); - foreach ((array)$responses["string"] as $response) { - $return[] = new AuthorizeNetAIM_Response($response, ",", "", array()); - } - return $return; - } - - /** - * @return AuthorizeNetAIM_Response - */ - public function getValidationResponse() - { - return new AuthorizeNetAIM_Response($this->_getElementContents("validationDirectResponse"), ",", "", array()); - } - - /** - * @return array - */ - public function getCustomerProfileIds() - { - $ids = (array)$this->xml->ids; - return $ids["numericString"]; - } - - /** - * @return array - */ - public function getCustomerPaymentProfileIds() - { - $ids = (array)$this->xml->customerPaymentProfileIdList; - return $ids["numericString"]; - } - - /** - * @return array - */ - public function getCustomerShippingAddressIds() - { - $ids = (array)$this->xml->customerShippingAddressIdList; - return $ids["numericString"]; - } - - /** - * @return string - */ - public function getCustomerAddressId() - { - return $this->_getElementContents("customerAddressId"); - } - - /** - * @return string - */ - public function getCustomerProfileId() - { - return $this->_getElementContents("customerProfileId"); - } - - /** - * @return string - */ - public function getPaymentProfileId() - { - return $this->_getElementContents("customerPaymentProfileId"); - } - -} diff --git a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/AuthorizeNetCP.php b/lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/AuthorizeNetCP.php deleted file mode 100755 index 1ff0a3d..0000000 --- a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/AuthorizeNetCP.php +++ /dev/null @@ -1,222 +0,0 @@ - "1.0", - "delim_char" => ",", - "encap_char" => "|", - "market_type" => "2", - "response_format" => "1", // 0 - XML, 1 - NVP - ); - - /** - * Device Types (x_device_type) - * 1 = Unknown - * 2 = Unattended Terminal - * 3 = Self Service Terminal - * 4 = Electronic Cash Register - * 5 = Personal Computer- Based Terminal - * 6 = AirPay - * 7 = Wireless POS - * 8 = Website - * 9 = Dial Terminal - * 10 = Virtual Terminal - */ - - /** - * Strip sentinels and set track1 field. - * - * @param string $track1data - */ - public function setTrack1Data($track1data) { - if (preg_match('/^%.*\?$/', $track1data)) { - $this->track1 = substr($track1data, 1, -1); - } else { - $this->track1 = $track1data; - } - } - - /** - * Strip sentinels and set track2 field. - * - * @param string $track2data - */ - public function setTrack2Data($track2data) { - if (preg_match('/^;.*\?$/', $track2data)) { - $this->track2 = substr($track2data, 1, -1); - } else { - $this->track2 = $track2data; - } - } - - /** - * - * - * @param string $response - * - * @return AuthorizeNetAIM_Response - */ - protected function _handleResponse($response) - { - return new AuthorizeNetCP_Response($response, $this->_x_post_fields['delim_char'], $this->_x_post_fields['encap_char'], $this->_custom_fields); - } - -} - - -/** - * Parses an AuthorizeNet Card Present Response. - * - * @package AuthorizeNet - * @subpackage AuthorizeNetCP - */ -class AuthorizeNetCP_Response extends AuthorizeNetResponse -{ - private $_response_array = array(); // An array with the split response. - - /** - * Constructor. Parses the AuthorizeNet response string. - * - * @param string $response The response from the AuthNet server. - * @param string $delimiter The delimiter used (default is ",") - * @param string $encap_char The encap_char used (default is "|") - * @param array $custom_fields Any custom fields set in the request. - */ - public function __construct($response, $delimiter, $encap_char, $custom_fields) - { - if ($response) { - - // If it's an XML response - if (substr($response, 0, 5) == "xml = @simplexml_load_string($response); - // Set all fields - $this->version = array_pop(array_slice(explode('"', $response), 1,1)); - $this->response_code = (string)$this->xml->ResponseCode; - - if ($this->response_code == 1) { - $this->response_reason_code = (string)$this->xml->Messages->Message->Code; - $this->response_reason_text = (string)$this->xml->Messages->Message->Description; - } else { - $this->response_reason_code = (string)$this->xml->Errors->Error->ErrorCode; - $this->response_reason_text = (string)$this->xml->Errors->Error->ErrorText; - } - - $this->authorization_code = (string)$this->xml->AuthCode; - $this->avs_code = (string)$this->xml->AVSResultCode; - $this->card_code_response = (string)$this->xml->CVVResultCode; - $this->transaction_id = (string)$this->xml->TransID; - $this->md5_hash = (string)$this->xml->TransHash; - $this->user_ref = (string)$this->xml->UserRef; - $this->card_num = (string)$this->xml->AccountNumber; - $this->card_type = (string)$this->xml->AccountType; - $this->test_mode = (string)$this->xml->TestMode; - $this->ref_trans_id = (string)$this->xml->RefTransID; - - - } else { // If it's an NVP response - - // Split Array - $this->response = $response; - if ($encap_char) { - $this->_response_array = explode($encap_char.$delimiter.$encap_char, substr($response, 1, -1)); - } else { - $this->_response_array = explode($delimiter, $response); - } - - /** - * If AuthorizeNet doesn't return a delimited response. - */ - if (count($this->_response_array) < 10) { - $this->approved = false; - $this->error = true; - $this->error_message = "Unrecognized response from AuthorizeNet: $response"; - return; - } - - - - // Set all fields - $this->version = $this->_response_array[0]; - $this->response_code = $this->_response_array[1]; - $this->response_reason_code = $this->_response_array[2]; - $this->response_reason_text = $this->_response_array[3]; - $this->authorization_code = $this->_response_array[4]; - $this->avs_code = $this->_response_array[5]; - $this->card_code_response = $this->_response_array[6]; - $this->transaction_id = $this->_response_array[7]; - $this->md5_hash = $this->_response_array[8]; - $this->user_ref = $this->_response_array[9]; - $this->card_num = $this->_response_array[20]; - $this->card_type = $this->_response_array[21]; - $this->split_tender_id = $this->_response_array[22]; - $this->requested_amount = $this->_response_array[23]; - $this->approved_amount = $this->_response_array[24]; - $this->card_balance = $this->_response_array[25]; - - - - } - $this->approved = ($this->response_code == self::APPROVED); - $this->declined = ($this->response_code == self::DECLINED); - $this->error = ($this->response_code == self::ERROR); - $this->held = ($this->response_code == self::HELD); - - - if ($this->error) { - $this->error_message = "AuthorizeNet Error: - Response Code: ".$this->response_code." - Response Reason Code: ".$this->response_reason_code." - Response Reason Text: ".$this->response_reason_text." - "; - } - - } else { - $this->approved = false; - $this->error = true; - $this->error_message = "Error connecting to AuthorizeNet"; - } - } - - /** - * Is the MD5 provided correct? - * - * @param string $api_login_id - * @param string $md5_setting - * @return bool - */ - public function isAuthorizeNet($api_login_id = false, $md5_setting = false) - { - $amount = ($this->amount ? $this->amount : '0.00'); - $api_login_id = ($api_login_id ? $api_login_id : AUTHORIZENET_API_LOGIN_ID); - $md5_setting = ($md5_setting ? $md5_setting : AUTHORIZENET_MD5_SETTING); - return ($this->md5_hash == strtoupper(md5($md5_setting . $api_login_id . $this->transaction_id . $amount))); - } - -} - diff --git a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/AuthorizeNetDPM.php b/lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/AuthorizeNetDPM.php deleted file mode 100755 index 5e693cc..0000000 --- a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/AuthorizeNetDPM.php +++ /dev/null @@ -1,237 +0,0 @@ -isAuthorizeNet()) - { - if ($response->approved) - { - // Do your processing here. - $redirect_url = $url . '?response_code=1&transaction_id=' . $response->transaction_id; - } - else - { - // Redirect to error page. - $redirect_url = $url . '?response_code='.$response->response_code . '&response_reason_text=' . $response->response_reason_text; - } - // Send the Javascript back to AuthorizeNet, which will redirect user back to your site. - echo AuthorizeNetDPM::getRelayResponseSnippet($redirect_url); - } - else - { - echo "Error -- not AuthorizeNet. Check your MD5 Setting."; - } - } - // Step 3: Show receipt page to customer. - elseif (!count($_POST) && count($_GET)) - { - if ($_GET['response_code'] == 1) - { - echo "Thank you for your purchase! Transaction id: " . htmlentities($_GET['transaction_id']); - } - else - { - echo "Sorry, an error occurred: " . htmlentities($_GET['response_reason_text']); - } - } - } - - /** - * A snippet to send to AuthorizeNet to redirect the user back to the - * merchant's server. Use this on your relay response page. - * - * @param string $redirect_url Where to redirect the user. - * - * @return string - */ - public static function getRelayResponseSnippet($redirect_url) - { - return " - "; - } - - /** - * Generate a sample form for use in a demo Direct Post implementation. - * - * @param string $amount Amount of the transaction. - * @param string $fp_sequence Sequential number(ie. Invoice #) - * @param string $relay_response_url The Relay Response URL - * @param string $api_login_id Your API Login ID - * @param string $transaction_key Your API Tran Key. - * @param bool $test_mode Use the sandbox? - * @param bool $prefill Prefill sample values(for test purposes). - * - * @return string - */ - public static function getCreditCardForm($amount, $fp_sequence, $relay_response_url, $api_login_id, $transaction_key, $test_mode = true, $prefill = true) - { - $time = time(); - $fp = self::getFingerprint($api_login_id, $transaction_key, $amount, $fp_sequence, $time); - $sim = new AuthorizeNetSIM_Form( - array( - 'x_amount' => $amount, - 'x_fp_sequence' => $fp_sequence, - 'x_fp_hash' => $fp, - 'x_fp_timestamp' => $time, - 'x_relay_response'=> "TRUE", - 'x_relay_url' => $relay_response_url, - 'x_login' => $api_login_id, - ) - ); - $hidden_fields = $sim->getHiddenFieldString(); - $post_url = ($test_mode ? self::SANDBOX_URL : self::LIVE_URL); - - $form = ' - -
- '.$hidden_fields.' -
-
- - -
-
- - -
-
- - -
-
-
-
- - -
-
- - -
-
-
-
- - -
-
- - -
-
-
-
- - -
-
- - -
-
- - -
-
- -
'; - return $form; - } - -} \ No newline at end of file diff --git a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/AuthorizeNetSIM.php b/lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/AuthorizeNetSIM.php deleted file mode 100755 index 60297e5..0000000 --- a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/AuthorizeNetSIM.php +++ /dev/null @@ -1,212 +0,0 @@ -api_login_id = ($api_login_id ? $api_login_id : (defined('AUTHORIZENET_API_LOGIN_ID') ? AUTHORIZENET_API_LOGIN_ID : "")); - $this->md5_setting = ($md5_setting ? $md5_setting : (defined('AUTHORIZENET_MD5_SETTING') ? AUTHORIZENET_MD5_SETTING : "")); - $this->response = $_POST; - - // Set fields without x_ prefix - foreach ($_POST as $key => $value) { - $name = substr($key, 2); - $this->$name = $value; - } - - // Set some human readable fields - $map = array( - 'avs_response' => 'x_avs_code', - 'authorization_code' => 'x_auth_code', - 'transaction_id' => 'x_trans_id', - 'customer_id' => 'x_cust_id', - 'md5_hash' => 'x_MD5_Hash', - 'card_code_response' => 'x_cvv2_resp_code', - 'cavv_response' => 'x_cavv_response', - ); - foreach ($map as $key => $value) { - $this->$key = (isset($_POST[$value]) ? $_POST[$value] : ""); - } - - $this->approved = ($this->response_code == self::APPROVED); - $this->declined = ($this->response_code == self::DECLINED); - $this->error = ($this->response_code == self::ERROR); - $this->held = ($this->response_code == self::HELD); - } - - /** - * Verify the request is AuthorizeNet. - * - * @return bool - */ - public function isAuthorizeNet() - { - return count($_POST) && $this->md5_hash && ($this->generateHash() == $this->md5_hash); - } - - /** - * Generates an Md5 hash to compare against Authorize.Net's. - * - * @return string Hash - */ - public function generateHash() - { - $amount = ($this->amount ? $this->amount : "0.00"); - return strtoupper(md5($this->md5_setting . $this->api_login_id . $this->transaction_id . $amount)); - } - -} - -/** - * A helper class for using hosted order page. - * - * @package AuthorizeNet - * @subpackage AuthorizeNetSIM - */ -class AuthorizeNetSIM_Form -{ - public $x_address; - public $x_amount; - public $x_background_url; - public $x_card_num; - public $x_city; - public $x_color_background; - public $x_color_link; - public $x_color_text; - public $x_company; - public $x_country; - public $x_cust_id; - public $x_customer_ip; - public $x_description; - public $x_delim_data; - public $x_duplicate_window; - public $x_duty; - public $x_email; - public $x_email_customer; - public $x_fax; - public $x_first_name; - public $x_footer_email_receipt; - public $x_footer_html_payment_form; - public $x_footer_html_receipt; - public $x_fp_hash; - public $x_fp_sequence; - public $x_fp_timestamp; - public $x_freight; - public $x_header_email_receipt; - public $x_header_html_payment_form; - public $x_header_html_receipt; - public $x_invoice_num; - public $x_last_name; - public $x_line_item; - public $x_login; - public $x_logo_url; - public $x_method; - public $x_phone; - public $x_po_num; - public $x_receipt_link_method; - public $x_receipt_link_text; - public $x_receipt_link_url; - public $x_recurring_billing; - public $x_relay_response; - public $x_relay_url; - public $x_rename; - public $x_ship_to_address; - public $x_ship_to_company; - public $x_ship_to_country; - public $x_ship_to_city; - public $x_ship_to_first_name; - public $x_ship_to_last_name; - public $x_ship_to_state; - public $x_ship_to_zip; - public $x_show_form; - public $x_state; - public $x_tax; - public $x_tax_exempt; - public $x_test_request; - public $x_trans_id; - public $x_type; - public $x_version; - public $x_zip; - - /** - * Constructor - * - * @param array $fields Fields to set. - */ - public function __construct($fields = false) - { - // Set some best practice fields - $this->x_relay_response = "FALSE"; - $this->x_version = "3.1"; - $this->x_delim_char = ","; - $this->x_delim_data = "TRUE"; - - if ($fields) { - foreach ($fields as $key => $value) { - $this->$key = $value; - } - } - } - - /** - * Get a string of HTML hidden fields for use in a form. - * - * @return string - */ - public function getHiddenFieldString() - { - $array = (array)$this; - $string = ""; - foreach ($array as $key => $value) { - if ($value) { - $string .= ''; - } - } - return $string; - } - - /** - * Generates a fingerprint needed for a hosted order form or DPM. - * - * @param string $api_login_id Login ID. - * @param string $transaction_key API key. - * @param string $amount Amount of transaction. - * @param string $fp_sequence An invoice number or random number. - * @param string $fp_timestamp Timestamp. - * - * @return string The fingerprint. - */ - public static function getFingerprint($api_login_id, $transaction_key, $amount, $fp_sequence, $fp_timestamp) - { - $api_login_id = ($api_login_id ? $api_login_id : (defined('AUTHORIZENET_API_LOGIN_ID') ? AUTHORIZENET_API_LOGIN_ID : "")); - $transaction_key = ($transaction_key ? $transaction_key : (defined('AUTHORIZENET_TRANSACTION_KEY') ? AUTHORIZENET_TRANSACTION_KEY : "")); - if (function_exists('hash_hmac')) { - return hash_hmac("md5", $api_login_id . "^" . $fp_sequence . "^" . $fp_timestamp . "^" . $amount . "^", $transaction_key); - } - return bin2hex(mhash(MHASH_MD5, $api_login_id . "^" . $fp_sequence . "^" . $fp_timestamp . "^" . $amount . "^", $transaction_key)); - } - -} \ No newline at end of file diff --git a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/AuthorizeNetSOAP.php b/lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/AuthorizeNetSOAP.php deleted file mode 100755 index 36c30a4..0000000 --- a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/AuthorizeNetSOAP.php +++ /dev/null @@ -1,99 +0,0 @@ -__setLocation(self::SANDBOX_URL); - } - - /** - * Switch between the sandbox or production gateway. - * - * @param bool - */ - public function setSandbox($bool) - { - $this->__setLocation(($bool ? self::SANDBOX_URL : self::LIVE_URL)); - } - - /** - * Get all types as PHP Code. - * @return string - */ - public function getSoapTypes() - { - $string = ""; - $types = $this->__getTypes(); - foreach ($types as $type) { - if (preg_match("/struct /",$type)) { - $type = preg_replace("/struct /","class ",$type); - $type = preg_replace("/ (\w+) (\w+);/"," // $1\n public \$$2;",$type); - $string .= $type ."\n"; - } - } - return $string; - } - - /** - * Get all methods as PHP Code. - * @return string - */ - public function getSoapMethods() - { - $string = ""; - $functions = array(); - $methods = $this->__getFunctions(); - foreach ($methods as $index => $method) { - $sig = explode(" ", $method, 2); - if (!isset($functions[$sig[1]])) { - $string .= " /**\n * @return {$sig[0]}\n */\n public function {$sig[1]} {}\n\n"; - $functions[$sig[1]] = true; - } - } - return $string; - } - - /** - * Create a file from the WSDL for reference. - */ - public function saveSoapDocumentation($path) - { - $string = "getSoapMethods() . "\n}\n\n" . $this->getSoapTypes() ."\n\n ?>"; - return file_put_contents($path, $string); - } - - - -} \ No newline at end of file diff --git a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/AuthorizeNetTD.php b/lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/AuthorizeNetTD.php deleted file mode 100755 index e98a6cd..0000000 --- a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/AuthorizeNetTD.php +++ /dev/null @@ -1,209 +0,0 @@ -_constructXml("getSettledBatchListRequest"); - ($includeStatistics ? - $this->_xml->addChild("includeStatistics", $includeStatistics) : null); - ($firstSettlementDate ? - $this->_xml->addChild("firstSettlementDate", $firstSettlementDate . $utc) : null); - ($lastSettlementDate ? - $this->_xml->addChild("lastSettlementDate", $lastSettlementDate . $utc) : null); - return $this->_sendRequest(); - } - - /** - * Return all settled batches for a certain month. - * - * @param int $month - * @param int $year - * - * @return AuthorizeNetTD_Response - */ - public function getSettledBatchListForMonth($month = false, $year = false) - { - $month = ($month ? $month : date('m')); - $year = ($year ? $year : date('Y')); - $firstSettlementDate = substr(date('c',mktime(0, 0, 0, $month, 1, $year)),0,-6); - $lastSettlementDate = substr(date('c',mktime(0, 0, 0, $month+1, 0, $year)),0,-6); - return $this->getSettledBatchList(true, $firstSettlementDate, $lastSettlementDate); - } - - /** - * This function returns limited transaction details for a specified batch ID - * - * @param int $batchId - * - * @return AuthorizeNetTD_Response - */ - public function getTransactionList($batchId) - { - $this->_constructXml("getTransactionListRequest"); - $this->_xml->addChild("batchId", $batchId); - return $this->_sendRequest(); - } - - /** - * Return all transactions for a certain day. - * - * @param int $month - * @param int $day - * @param int $year - * - * @return array Array of SimpleXMLElments - */ - public function getTransactionsForDay($month = false, $day = false, $year = false) - { - $transactions = array(); - $month = ($month ? $month : date('m')); - $day = ($day ? $day : date('d')); - $year = ($year ? $year : date('Y')); - $firstSettlementDate = substr(date('c',mktime(0, 0, 0, (int)$month, (int)$day, (int)$year)),0,-6); - $lastSettlementDate = substr(date('c',mktime(0, 0, 0, (int)$month, (int)$day, (int)$year)),0,-6); - $response = $this->getSettledBatchList(true, $firstSettlementDate, $lastSettlementDate); - $batches = $response->xpath("batchList/batch"); - foreach ($batches as $batch) { - $batch_id = (string)$batch->batchId; - $request = new AuthorizeNetTD; - $tran_list = $request->getTransactionList($batch_id); - $transactions = array_merge($transactions, $tran_list->xpath("transactions/transaction")); - } - return $transactions; - } - - /** - * This function returns full transaction details for a specified transaction ID. - * - * @param int $transId - * - * @return AuthorizeNetTD_Response - */ - public function getTransactionDetails($transId) - { - $this->_constructXml("getTransactionDetailsRequest"); - $this->_xml->addChild("transId", $transId); - return $this->_sendRequest(); - } - - /** - * This function returns statistics about the settled batch specified by $batchId. - * - * @param int $batchId - * - * @return AuthorizeNetTD_Response - */ - public function getBatchStatistics($batchId) - { - $this->_constructXml("getBatchStatisticsRequest"); - $this->_xml->addChild("batchId", $batchId); - return $this->_sendRequest(); - } - - /** - * This function returns the last 1000 unsettled transactions. - * - * - * @return AuthorizeNetTD_Response - */ - public function getUnsettledTransactionList() - { - $this->_constructXml("getUnsettledTransactionListRequest"); - return $this->_sendRequest(); - } - - /** - * @return string - */ - protected function _getPostUrl() - { - return ($this->_sandbox ? self::SANDBOX_URL : self::LIVE_URL); - } - - /** - * - * - * @param string $response - * - * @return AuthorizeNetTransactionDetails_Response - */ - protected function _handleResponse($response) - { - return new AuthorizeNetTD_Response($response); - } - - /** - * Prepare the XML post string. - */ - protected function _setPostString() - { - $this->_post_string = $this->_xml->asXML(); - - } - - /** - * Start the SimpleXMLElement that will be posted. - * - * @param string $request_type The action to be performed. - */ - private function _constructXml($request_type) - { - $string = '<'.$request_type.' xmlns="AnetApi/xml/v1/schema/AnetApiSchema.xsd">'; - $this->_xml = @new SimpleXMLElement($string); - $merchant = $this->_xml->addChild('merchantAuthentication'); - $merchant->addChild('name',$this->_api_login); - $merchant->addChild('transactionKey',$this->_transaction_key); - } - -} - -/** - * A class to parse a response from the Transaction Details XML API. - * - * @package AuthorizeNet - * @subpackage AuthorizeNetTD - */ -class AuthorizeNetTD_Response extends AuthorizeNetXMLResponse -{ - - -} diff --git a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/shared/AuthorizeNetRequest.php b/lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/shared/AuthorizeNetRequest.php deleted file mode 100755 index a0749e0..0000000 --- a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/shared/AuthorizeNetRequest.php +++ /dev/null @@ -1,121 +0,0 @@ -_api_login = ($api_login_id ? $api_login_id : (defined('AUTHORIZENET_API_LOGIN_ID') ? AUTHORIZENET_API_LOGIN_ID : "")); - $this->_transaction_key = ($transaction_key ? $transaction_key : (defined('AUTHORIZENET_TRANSACTION_KEY') ? AUTHORIZENET_TRANSACTION_KEY : "")); - $this->_sandbox = (defined('AUTHORIZENET_SANDBOX') ? AUTHORIZENET_SANDBOX : true); - $this->_log_file = (defined('AUTHORIZENET_LOG_FILE') ? AUTHORIZENET_LOG_FILE : false); - } - - /** - * Alter the gateway url. - * - * @param bool $bool Use the Sandbox. - */ - public function setSandbox($bool) - { - $this->_sandbox = $bool; - } - - /** - * Set a log file. - * - * @param string $filepath Path to log file. - */ - public function setLogFile($filepath) - { - $this->_log_file = $filepath; - } - - /** - * Return the post string. - * - * @return string - */ - public function getPostString() - { - return $this->_post_string; - } - - /** - * Posts the request to AuthorizeNet & returns response. - * - * @return AuthorizeNetARB_Response The response. - */ - protected function _sendRequest() - { - $this->_setPostString(); - - $post_url = $this->_getPostUrl(); - $curl_request = curl_init($post_url); - curl_setopt($curl_request, CURLOPT_POSTFIELDS, $this->_post_string); - curl_setopt($curl_request, CURLOPT_HEADER, 0); - curl_setopt($curl_request, CURLOPT_TIMEOUT, 45); - curl_setopt($curl_request, CURLOPT_RETURNTRANSFER, 1); -// curl_setopt($curl_request, CURLOPT_SSL_VERIFYHOST, 2); // Not used when submitting through our AuthNetRelay - if ($this->VERIFY_PEER) { - curl_setopt($curl_request, CURLOPT_CAINFO, dirname(dirname(__FILE__)) . '/ssl/cert.pem'); - } else { - curl_setopt($curl_request, CURLOPT_SSL_VERIFYPEER, false); - } - - if (preg_match('/xml/',$post_url)) { - curl_setopt($curl_request, CURLOPT_HTTPHEADER, Array("Content-Type: text/xml")); - } - - $response = curl_exec($curl_request); - - if ($this->_log_file) { - - if ($curl_error = curl_error($curl_request)) { - file_put_contents($this->_log_file, "----CURL ERROR----\n$curl_error\n\n", FILE_APPEND); - } - // Do not log requests that could contain CC info. - // file_put_contents($this->_log_file, "----Request----\n{$this->_post_string}\n", FILE_APPEND); - - file_put_contents($this->_log_file, "----Response----\n$response\n\n", FILE_APPEND); - } - curl_close($curl_request); - - return $this->_handleResponse($response); - } - -} \ No newline at end of file diff --git a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/shared/AuthorizeNetResponse.php b/lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/shared/AuthorizeNetResponse.php deleted file mode 100755 index 7b96cb9..0000000 --- a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/shared/AuthorizeNetResponse.php +++ /dev/null @@ -1,75 +0,0 @@ -billTo = new AuthorizeNetAddress; - $this->payment = new AuthorizeNetPayment; - } - -} - -/** - * A class that contains all fields for a CIM Payment Type. - * - * @package AuthorizeNet - * @subpackage AuthorizeNetCIM - */ -class AuthorizeNetPayment -{ - public $creditCard; - public $bankAccount; - - public function __construct() - { - $this->creditCard = new AuthorizeNetCreditCard; - $this->bankAccount = new AuthorizeNetBankAccount; - } -} - -/** - * A class that contains all fields for a CIM Transaction. - * - * @package AuthorizeNet - * @subpackage AuthorizeNetCIM - */ -class AuthorizeNetTransaction -{ - public $amount; - public $tax; - public $shipping; - public $duty; - public $lineItems = array(); - public $customerProfileId; - public $customerPaymentProfileId; - public $customerShippingAddressId; - public $creditCardNumberMasked; - public $bankRoutingNumberMasked; - public $bankAccountNumberMasked; - public $order; - public $taxExempt; - public $recurringBilling; - public $cardCode; - public $splitTenderId; - public $approvalCode; - public $transId; - - public function __construct() - { - $this->tax = (object)array(); - $this->tax->amount = ""; - $this->tax->name = ""; - $this->tax->description = ""; - - $this->shipping = (object)array(); - $this->shipping->amount = ""; - $this->shipping->name = ""; - $this->shipping->description = ""; - - $this->duty = (object)array(); - $this->duty->amount = ""; - $this->duty->name = ""; - $this->duty->description = ""; - - // line items - - $this->order = (object)array(); - $this->order->invoiceNumber = ""; - $this->order->description = ""; - $this->order->purchaseOrderNumber = ""; - } - -} - -/** - * A class that contains all fields for a CIM Transaction Line Item. - * - * @package AuthorizeNet - * @subpackage AuthorizeNetCIM - */ -class AuthorizeNetLineItem -{ - public $itemId; - public $name; - public $description; - public $quantity; - public $unitPrice; - public $taxable; - -} - -/** - * A class that contains all fields for a CIM Credit Card. - * - * @package AuthorizeNet - * @subpackage AuthorizeNetCIM - */ -class AuthorizeNetCreditCard -{ - public $cardNumber; - public $expirationDate; - public $cardCode; -} - -/** - * A class that contains all fields for a CIM Bank Account. - * - * @package AuthorizeNet - * @subpackage AuthorizeNetCIM - */ -class AuthorizeNetBankAccount -{ - public $accountType; - public $routingNumber; - public $accountNumber; - public $nameOnAccount; - public $echeckType; - public $bankName; -} - -/** - * A class that contains all fields for an AuthorizeNet ARB Subscription. - * - * @package AuthorizeNet - * @subpackage AuthorizeNetARB - */ -class AuthorizeNet_Subscription -{ - - public $name; - public $intervalLength; - public $intervalUnit; - public $startDate; - public $totalOccurrences; - public $trialOccurrences; - public $amount; - public $trialAmount; - public $creditCardCardNumber; - public $creditCardExpirationDate; - public $creditCardCardCode; - public $bankAccountAccountType; - public $bankAccountRoutingNumber; - public $bankAccountAccountNumber; - public $bankAccountNameOnAccount; - public $bankAccountEcheckType; - public $bankAccountBankName; - public $orderInvoiceNumber; - public $orderDescription; - public $customerId; - public $customerEmail; - public $customerPhoneNumber; - public $customerFaxNumber; - public $billToFirstName; - public $billToLastName; - public $billToCompany; - public $billToAddress; - public $billToCity; - public $billToState; - public $billToZip; - public $billToCountry; - public $shipToFirstName; - public $shipToLastName; - public $shipToCompany; - public $shipToAddress; - public $shipToCity; - public $shipToState; - public $shipToZip; - public $shipToCountry; - - public function getXml() - { - $xml = " - {$this->name} - - - {$this->intervalLength} - {$this->intervalUnit} - - {$this->startDate} - {$this->totalOccurrences} - {$this->trialOccurrences} - - {$this->amount} - {$this->trialAmount} - - - {$this->creditCardCardNumber} - {$this->creditCardExpirationDate} - {$this->creditCardCardCode} - - - {$this->bankAccountAccountType} - {$this->bankAccountRoutingNumber} - {$this->bankAccountAccountNumber} - {$this->bankAccountNameOnAccount} - {$this->bankAccountEcheckType} - {$this->bankAccountBankName} - - - - {$this->orderInvoiceNumber} - {$this->orderDescription} - - - {$this->customerId} - {$this->customerEmail} - {$this->customerPhoneNumber} - {$this->customerFaxNumber} - - - {$this->billToFirstName} - {$this->billToLastName} - {$this->billToCompany} -
{$this->billToAddress}
- {$this->billToCity} - {$this->billToState} - {$this->billToZip} - {$this->billToCountry} -
- - {$this->shipToFirstName} - {$this->shipToLastName} - {$this->shipToCompany} -
{$this->shipToAddress}
- {$this->shipToCity} - {$this->shipToState} - {$this->shipToZip} - {$this->shipToCountry} -
-
"; - - $xml_clean = ""; - // Remove any blank child elements - foreach (preg_split("/(\r?\n)/", $xml) as $key => $line) { - if (!preg_match('/><\//', $line)) { - $xml_clean .= $line . "\n"; - } - } - - // Remove any blank parent elements - $element_removed = 1; - // Recursively repeat if a change is made - while ($element_removed) { - $element_removed = 0; - if (preg_match('/<[a-z]+>[\r?\n]+\s*<\/[a-z]+>/i', $xml_clean)) { - $xml_clean = preg_replace('/<[a-z]+>[\r?\n]+\s*<\/[a-z]+>/i', '', $xml_clean); - $element_removed = 1; - } - } - - // Remove any blank lines - // $xml_clean = preg_replace('/\r\n[\s]+\r\n/','',$xml_clean); - return $xml_clean; - } -} - diff --git a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/shared/AuthorizeNetXMLResponse.php b/lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/shared/AuthorizeNetXMLResponse.php deleted file mode 100755 index ede7854..0000000 --- a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/shared/AuthorizeNetXMLResponse.php +++ /dev/null @@ -1,128 +0,0 @@ -response = $response; - if ($response) { - $this->xml = @simplexml_load_string($response); - - // Remove namespaces for use with XPath. - $this->xpath_xml = @simplexml_load_string(preg_replace('/ xmlns:xsi[^>]+/','',$response)); - } - } - - /** - * Was the transaction successful? - * - * @return bool - */ - public function isOk() - { - return ($this->getResultCode() == "Ok"); - } - - /** - * Run an xpath query on the cleaned XML response - * - * @param string $path - * @return array Returns an array of SimpleXMLElement objects or FALSE in case of an error. - */ - public function xpath($path) - { - return $this->xpath_xml->xpath($path); - } - - /** - * Was there an error? - * - * @return bool - */ - public function isError() - { - return ($this->getResultCode() == "Error"); - } - - /** - * @return string - */ - public function getErrorMessage() - { - return "Error: {$this->getResultCode()} - Message: {$this->getMessageText()} - {$this->getMessageCode()}"; - } - - /** - * @return string - */ - public function getRefID() - { - return $this->_getElementContents("refId"); - } - - /** - * @return string - */ - public function getResultCode() - { - return $this->_getElementContents("resultCode"); - } - - /** - * @return string - */ - public function getMessageCode() - { - return $this->_getElementContents("code"); - } - - /** - * @return string - */ - public function getMessageText() - { - return $this->_getElementContents("text"); - } - - /** - * Grabs the contents of a unique element. - * - * @param string - * @return string - */ - protected function _getElementContents($elementName) - { - $start = "<$elementName>"; - $end = ""; - if (strpos($this->response,$start) === false || strpos($this->response,$end) === false) { - return false; - } else { - $start_position = strpos($this->response, $start)+strlen($start); - $end_position = strpos($this->response, $end); - return substr($this->response, $start_position, $end_position-$start_position); - } - } - -} \ No newline at end of file diff --git a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/ssl/cert.pem b/lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/ssl/cert.pem deleted file mode 100755 index b59fbb0..0000000 --- a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/lib/ssl/cert.pem +++ /dev/null @@ -1,253 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIEYTCCA0mgAwIBAgIESyDOMjANBgkqhkiG9w0BAQUFADCBsTELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 -Lm5ldC9ycGEgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW -KGMpIDIwMDkgRW50cnVzdCwgSW5jLjEuMCwGA1UEAxMlRW50cnVzdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSAtIEwxQzAeFw0xMDAzMzExNzA0MDBaFw0xMjAzMzAx -NzMzNTdaMIGVMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQG -A1UEBxMNTW91bnRhaW4gVmlldzEgMB4GA1UEChMXQ3liZXJzb3VyY2UgQ29ycG9y -YXRpb24xHTAbBgNVBAsTFFBsYXRpbnVtU1NMIFdpbGRjYXJkMRgwFgYDVQQDFA8q -LmF1dGhvcml6ZS5uZXQwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOSIsv0X -OFMm2cV74o2jSF7zkNGeLHkPsI10xsFXTG1xqjzq4eImAReA3eIp1oHvLmji4kea -rmTbxoURYdsRsWkx61b2vDrKJwjGU+hPvTYna0M4I9fpDgmp7e/Q5TJBWqI7BX9N -2ccL95/2rV0g021JJhkqYMDFERTYRqkLFLfNAgMBAAGjggEdMIIBGTALBgNVHQ8E -BAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwMwYDVR0fBCwwKjAooCagJIYiaHR0 -cDovL2NybC5lbnRydXN0Lm5ldC9sZXZlbDFjLmNybDAzBggrBgEFBQcBAQQnMCUw -IwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLmVudHJ1c3QubmV0MEAGA1UdIAQ5MDcw -NQYJKoZIhvZ9B0sCMCgwJgYIKwYBBQUHAgEWGmh0dHA6Ly93d3cuZW50cnVzdC5u -ZXQvcnBhMB8GA1UdIwQYMBaAFB7xq4kG+EkPATN37hR67hl8kyhNMB0GA1UdDgQW -BBQ/gzreJ5piCG2MLGy5XOBCVB9iTTAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBBQUA -A4IBAQCK6J1LZ3kGde6kzS4aGnPq5WUnJTdwB/ASIB15OOdK20Mdi7D0zF0Aevew -+f73shY3f7eozVmh8aCb7uDRojrBgLGdtj0vcRiqUm+e1LKf9p0XPdFMLGzh2E2W -+eLhBTMEYOgGPQDY/sf2MEKHRIgobccFI3LUUXylncY6+UKtUWJQ114duoZH0+o+ -RIlSRgGsGNYkWJ9+jeI6acvG15ahIzIfUx8m0vQp0Nri9/3p/HOezQjNdN0knTlR -pRbXZJ65zOig2wjt4an0OfYnOcqpJ/2yslCv0/jKwumHeygVt68l3J4rH7nUwUzs -B+JUkDiJgBD/+BFADuJkTJLMcn6t ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIE8jCCA9qgAwIBAgIEOGPp/DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML -RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp -bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 -IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw0wOTEyMTAyMDQzNTRaFw0xOTEy -MTAyMTEzNTRaMIGxMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNRW50cnVzdCwgSW5j -LjE5MDcGA1UECxMwd3d3LmVudHJ1c3QubmV0L3JwYSBpcyBpbmNvcnBvcmF0ZWQg -YnkgcmVmZXJlbmNlMR8wHQYDVQQLExYoYykgMjAwOSBFbnRydXN0LCBJbmMuMS4w -LAYDVQQDEyVFbnRydXN0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gTDFDMIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAl6MtPJ7eBdoTwhGNnY7jf8dL -flqfs/9iq3PIKGu6EGSChxPNVxj/KM7A5g4GkVApg9Hywyrb2NtOBMwA64u2lty8 -qvpSdwTB2xnkrpz9PIsD7028GgNl+cGxP3KG8jiqGa4QiHgo2nXDPQKCApy5wWV3 -diRMmPdtMTj72/7bNwJ2oRiXpszeIAlJNiRpQvbkN2LxWW2pPO00nKOO29w61/cK -b+8u2NWTWnrtCElo4kHjWpDBhlX8UUOd4LLEZ7TLMjEl8FSfS9Fv29Td/K9ebHiQ -ld7KOki5eTybGdZ1BaD5iNfB6KUJ5BoV3IcjqrJ1jGMlh9j4PabCzGb/pWZoVQID -AQABo4IBCzCCAQcwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wMwYI -KwYBBQUHAQEEJzAlMCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5lbnRydXN0Lm5l -dDAyBgNVHR8EKzApMCegJaAjhiFodHRwOi8vY3JsLmVudHJ1c3QubmV0LzIwNDhj -YS5jcmwwOwYDVR0gBDQwMjAwBgRVHSAAMCgwJgYIKwYBBQUHAgEWGmh0dHA6Ly93 -d3cuZW50cnVzdC5uZXQvcnBhMB0GA1UdDgQWBBQe8auJBvhJDwEzd+4Ueu4ZfJMo -TTAfBgNVHSMEGDAWgBRV5IHREYC+2Im5CKMx+aEkCRa5cDANBgkqhkiG9w0BAQUF -AAOCAQEAB/ZfgoR/gEDHkDRGQiQDzi+ruoOeJXMN7awFacaH7aNc8lfBsUl2mk3y -P93kDv4LPrmY2TKVHTL0Ae6cyMjlP+BTdmL83attPZSQ8sCzPJgnNl4olyL8G0DT -Kw2ttVdt3w/jS+9zAhBl+hvQrDHV4w/oujIwg+5K0L/fIpB6vuw6G8RJBB3xroB3 -PEII26c7KKaAAQPmOaPr34BZG/MsvtxyRHmgbAelbU1EjkJoypR8Lja6hZ7NqsRe -PFS+/i/qaZ0cHimbltjI/lGQ8SSmkAaz8Cmi/3gud1xFIdlEADHzvjJP9QoyDfz8 -uhZ2VrLWSJLyi6Y+t6xcaeoLP2ZFuQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEnzCCBAigAwIBAgIERp6RGjANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC -VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u -ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc -KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u -ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wOTAz -MjMxNTE4MjdaFw0xOTAzMjMxNTQ4MjdaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5l -dDFAMD4GA1UECxQ3d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkg -cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5u -ZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA -rU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL -Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3ed -Vc3kw37XamSrhRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4 -LeksyZB2ZnuU4q941mVTXTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5 -CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N -328mz8MYIWJmQ3DW1cAH4QIDAQABo4IBJzCCASMwDgYDVR0PAQH/BAQDAgEGMA8G -A1UdEwEB/wQFMAMBAf8wMwYIKwYBBQUHAQEEJzAlMCMGCCsGAQUFBzABhhdodHRw -Oi8vb2NzcC5lbnRydXN0Lm5ldDAzBgNVHR8ELDAqMCigJqAkhiJodHRwOi8vY3Js -LmVudHJ1c3QubmV0L3NlcnZlcjEuY3JsMDsGA1UdIAQ0MDIwMAYEVR0gADAoMCYG -CCsGAQUFBwIBFhpodHRwOi8vd3d3LmVudHJ1c3QubmV0L0NQUzAdBgNVHQ4EFgQU -VeSB0RGAvtiJuQijMfmhJAkWuXAwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX -8+1i0BowGQYJKoZIhvZ9B0EABAwwChsEVjcuMQMCAIEwDQYJKoZIhvcNAQEFBQAD -gYEAj2WiMI4mq4rsNRaY6QPwjRdfvExsAvZ0UuDCxh/O8qYRDKixDk2Ei3E277M1 -RfPB+JbFi1WkzGuDFiAy2r77r5u3n+F+hJ+ePFCnP1zCvouGuAiS7vhCKw0T43aF -SApKv9ClOwqwVLht4wj5NI0LjosSzBcaM4eVyJ4K3FBTF3s= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC -VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u -ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc -KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u -ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 -MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE -ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j -b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF -bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg -U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA -A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ -I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 -wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC -AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb -oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 -BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p -dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk -MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp -b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu -dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 -MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi -E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa -MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI -hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN -95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd -2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDSTCCArKgAwIBAgIQfmO9EP9/fYY45sRzhqgfGzANBgkqhkiG9w0BAQUFADBM -MQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhhd3RlIENvbnN1bHRpbmcgKFB0eSkg -THRkLjEWMBQGA1UEAxMNVGhhd3RlIFNHQyBDQTAeFw0wOTA0MDkwMDAwMDBaFw0x -MTA0MTEyMzU5NTlaMIGPMQswCQYDVQQGEwJVUzENMAsGA1UECBMEVXRhaDEWMBQG -A1UEBxMNQW1lcmljYW4gRm9yazEcMBoGA1UEChMTQXV0aG9yaXplLk5ldCBDb3Jw -LjEcMBoGA1UECxMTQVVUSE9SSVpFLk5FVCBDT1JQLjEdMBsGA1UEAxMUc2VjdXJl -LmF1dGhvcml6ZS5uZXQwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAN0dh86L -70MHbun7wTNGV0pNXsnebt3z9mCpndLUiBp5J/b57hQO5/HvevkhkDyCrky/Dn7y -4SEJh6RHYuP4ZBk30DS8iH5dWCRHqSQgpMKhUl/+D7KHbVqgPzOpOR44TiSa1P5m -Fv0qicvRR3iwSK/6ESywNvEJk1iiYPnpnnlvAgMBAAGjgecwgeQwDAYDVR0TAQH/ -BAIwADA2BgNVHR8ELzAtMCugKaAnhiVodHRwOi8vY3JsLnRoYXd0ZS5jb20vVGhh -d3RlU0dDQ0EuY3JsMCgGA1UdJQQhMB8GCCsGAQUFBwMBBggrBgEFBQcDAgYJYIZI -AYb4QgQBMHIGCCsGAQUFBwEBBGYwZDAiBggrBgEFBQcwAYYWaHR0cDovL29jc3Au -dGhhd3RlLmNvbTA+BggrBgEFBQcwAoYyaHR0cDovL3d3dy50aGF3dGUuY29tL3Jl -cG9zaXRvcnkvVGhhd3RlX1NHQ19DQS5jcnQwDQYJKoZIhvcNAQEFBQADgYEARa0l -PaGn4TOw3KOMVu8eiSdho4Nmal6u9AWE3rWHDakO2/a1AkZTM2/Wpt6KI3fp6WWK -LSsa9wLoVYSJ6pI7bmiJTvyx42yPP0PZXQSz05PHgTEGyW2jAn4N1hFvbTj28mZT -jv2jd12xgrmX34nulLdydNaM8J7CauhMvqwwvZ0= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDIzCCAoygAwIBAgIEMAAAAjANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1BgNVBAsTLkNsYXNzIDMgUHVi -bGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNTEzMDAw -MDAwWhcNMTQwNTEyMjM1OTU5WjBMMQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhh -d3RlIENvbnN1bHRpbmcgKFB0eSkgTHRkLjEWMBQGA1UEAxMNVGhhd3RlIFNHQyBD -QTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1NNn0I0Vf67NMf59HZGhPwtx -PKzMyGT7Y/wySweUvW+Aui/hBJPAM/wJMyPpC3QrccQDxtLN4i/1CWPN/0ilAL/g -5/OIty0y3pg25gqtAHvEZEo7hHUD8nCSfQ5i9SGraTaEMXWQ+L/HbIgbBpV8yeWo -3nWhLHpo39XKHIdYYBkCAwEAAaOB/jCB+zASBgNVHRMBAf8ECDAGAQH/AgEAMAsG -A1UdDwQEAwIBBjARBglghkgBhvhCAQEEBAMCAQYwKAYDVR0RBCEwH6QdMBsxGTAX -BgNVBAMTEFByaXZhdGVMYWJlbDMtMTUwMQYDVR0fBCowKDAmoCSgIoYgaHR0cDov -L2NybC52ZXJpc2lnbi5jb20vcGNhMy5jcmwwMgYIKwYBBQUHAQEEJjAkMCIGCCsG -AQUFBzABhhZodHRwOi8vb2NzcC50aGF3dGUuY29tMDQGA1UdJQQtMCsGCCsGAQUF -BwMBBggrBgEFBQcDAgYJYIZIAYb4QgQBBgpghkgBhvhFAQgBMA0GCSqGSIb3DQEB -BQUAA4GBAFWsY+reod3SkF+fC852vhNRj5PZBSvIG3dLrWlQoe7e3P3bB+noOZTc -q3J5Lwa/q4FwxKjt6lM07e8eU9kGx1Yr0Vz00YqOtCuxN5BICEIlxT6Ky3/rbwTR -bcV0oveifHtgPHfNDs5IAn8BL7abN+AqKjbc1YXWrOU/VG+WHgWv ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 -MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN -ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE -BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is -I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G -CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do -lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc -AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFCjCCA/KgAwIBAgIERWua3DANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 -Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW -KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA5MTIxMDIwNTU0M1oXDTE5MTIxMDIx -MjU0M1owgbExCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw -NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvcnBhIGlzIGluY29ycG9yYXRlZCBieSBy -ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA5IEVudHJ1c3QsIEluYy4xLjAsBgNV -BAMTJUVudHJ1c3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBMMUUwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC2WwRUd90OJGbcKqHbgMxdx1/9UhZY -2l+UBqm4trljDEcgguzHlU6LuHdSaj21h6nW4cx05abIwNRWT40u1gg+DExDPvBB -k15G7znn2WUqDHZQJ71bDTMzB+D3oqmc4REzrWb80ix6qqNzFr6ThXUP1zeM+iO3 -ZPjjTG7tswW94jbbfN52RNqCcna2bv+UodCG9xDNSlqLsHWMZlKATkhMSYOmQNd3 -gRNNXnJ+SEYiqg/iPmWUOOFycf5KcQm6NX9ViT2B1bgoARB3NloQhdK9YIQrSWGU -DN5MQGoqxHlghCSCMmlKmEviVhC6A0VRINPP2o5UG0W2erqXmlrYxtFfAgMBAAGj -ggEnMIIBIzAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAzBggrBgEF -BQcBAQQnMCUwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLmVudHJ1c3QubmV0MDMG -A1UdHwQsMCowKKAmoCSGImh0dHA6Ly9jcmwuZW50cnVzdC5uZXQvcm9vdGNhMS5j -cmwwOwYDVR0gBDQwMjAwBgRVHSAAMCgwJgYIKwYBBQUHAgEWGmh0dHA6Ly93d3cu -ZW50cnVzdC5uZXQvQ1BTMB0GA1UdDgQWBBRbQYqyxEPBvb/IVEFVneCWrf+5oTAf -BgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAZBgkqhkiG9n0HQQAEDDAK -GwRWNy4xAwIAgTANBgkqhkiG9w0BAQUFAAOCAQEAsjvSnsG8O0i23NhaGGZTw701 -DUhCLDUB2BCi4uONLLqmAxHta7FJy1/N7GCzutQC62FPTn7435BfTtOQAhxS2hIA -L5tx2gQSFMGQgy4o0hBAEYsmLeuZVVRvYI7Fgx3Aoz/VihQ5ahsN79NadznPabS9 -aW9PeNOhhqObt9f7qi3w+iah+WcsiEulNNWD+0zxW3AiZhubWU9NzpjbQaT+GqPr -OOb58TkCnUa2ycKePoK2H5/KSqixBl8QNDv92nusM07tprdL85H1nAsRktwTasjV -8TttlmsB5CNMscHg0hIhnynUrZU9pvfnMsV1twtX2KT5wOzsMjMMTa7oCNXsqg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEmzCCBASgAwIBAgIEQoctTDANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC -VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u -ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc -KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u -ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNzAx -MDUxOTIwMzlaFw0xNzAxMDUxOTUwMzlaMIGwMQswCQYDVQQGEwJVUzEWMBQGA1UE -ChMNRW50cnVzdCwgSW5jLjE5MDcGA1UECxMwd3d3LmVudHJ1c3QubmV0L0NQUyBp -cyBpbmNvcnBvcmF0ZWQgYnkgcmVmZXJlbmNlMR8wHQYDVQQLExYoYykgMjAwNiBF -bnRydXN0LCBJbmMuMS0wKwYDVQQDEyRFbnRydXN0IFJvb3QgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC2lbZD -QvrGbSpvSN+UTDlXBe7DeRFBaDbt7P6aAY+hOCj89xBGZi5NHhqxGk7G0cCViLDJ -/zGLMwPbt4N7PiCEXu2yViin+OC5QHE3xctHDpcqaMAilWIV20fZ9dAr/4JLya0+ -3kzbkIBQPwmKhADsMAo9GM37/SpZmiOVFyxFnh9uQ3ltDFyY/kinxSNHXF79buce -tPZoRdGGg1uiio2x4ymA/iVxiK2+vI+sUpZLqlGN5BMxGehOTZ/brLNq1bw5VHHK -enp/kN19HYDZgbtZJsIR/uaT4veA5GX7NDcOKYBwTa84hi6ef1evnheu6xzLKCFf -thzY56IEIvnT2tjLAgMBAAGjggEnMIIBIzAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUHMAGGF2h0dHA6Ly9v -Y3NwLmVudHJ1c3QubmV0MDMGA1UdHwQsMCowKKAmoCSGImh0dHA6Ly9jcmwuZW50 -cnVzdC5uZXQvc2VydmVyMS5jcmwwOwYDVR0gBDQwMjAwBgRVHSAAMCgwJgYIKwYB -BQUHAgEWGmh0dHA6Ly93d3cuZW50cnVzdC5uZXQvQ1BTMB0GA1UdDgQWBBRokORn -pKZTgMeGZqTx90tD+4S9bTAfBgNVHSMEGDAWgBTwF2ITVT2z/woAa/tQhJfz7WLQ -GjAZBgkqhkiG9n0HQQAEDDAKGwRWNy4xAwIAgTANBgkqhkiG9w0BAQUFAAOBgQAM -sIR8LRP+mj2/GAWVPSBIoxaBhxVQFaSIjZ9g1Dpv6y1uOoakqdLBnYl6CBykLbNH -jg9kSm9mA4M/TzSUNqopbYuNAiIrjM13pXCVhpHRtr9SvjNqa5n5b+ESvgTLM7/1 -EhpORLpbFk0wufO0dM5u8mhWWN3Yof1UBfQjkYXJ+Q== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFdDCCBFygAwIBAgIETCA3bTANBgkqhkiG9w0BAQUFADCBsTELMAkGA1UE -BhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5l -bnRydXN0Lm5ldC9ycGEgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEf -MB0GA1UECxMWKGMpIDIwMDkgRW50cnVzdCwgSW5jLjEuMCwGA1UEAxMlRW50 -cnVzdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEwxRTAeFw0xMTAzMjMx -NjQ4MzhaFw0xMzAzMjIyMzE4MDFaMIH4MQswCQYDVQQGEwJVUzETMBEGA1UE -CBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzETMBEGCysG -AQQBgjc8AgEDEwJVUzEZMBcGCysGAQQBgjc8AgECEwhEZWxhd2FyZTEgMB4G -A1UEChMXQ3liZXJzb3VyY2UgQ29ycG9yYXRpb24xHTAbBgNVBA8TFFByaXZh -dGUgT3JnYW5pemF0aW9uMRwwGgYDVQQLExNBVVRIT1JJWkUuTkVUIENPUlAu -MS0wDgYDVQQFEwcyODM4OTIxMBsGA1UEAxMUc2VjdXJlLmF1dGhvcml6ZS5u -ZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvrwbLk7kDJnja -13i9lcXhYlHIwCTKHegPRuAkGDO6hNH0yNVv10kQSWjKhZ6KnoEA2p0F92FN -HwFTUfm0QGlaXW9kPc8nUi94hgY05iYwh96FHNdibqeO2r73GGol/RJkUO69 -ekqP1f+ABi7qWguL29cadX1DmOVQSkIeWc0xn9IVgS8dxnDzKwJ+41M5gLfM -YAJQ/FOwjOpt0j/Kg+38iHZ71FM7ehceYFggn+7y0ZcAcDUx4l6sKBuqFXq7 -viMqP2/Np0TpzmJMi2X8Wy0FDYoilHb9qBJWkl2AYxfjLTTSu27OMAJYyvEM -RmjOkLn7hQBPoSE6u3UKevtF2WPtAgMBAAGjggFJMIIBRTALBgNVHQ8EBAMC -BaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMDMGCCsGAQUFBwEB -BCcwJTAjBggrBgEFBQcwAYYXaHR0cDovL29jc3AuZW50cnVzdC5uZXQwMwYD -VR0fBCwwKjAooCagJIYiaHR0cDovL2NybC5lbnRydXN0Lm5ldC9sZXZlbDFl -LmNybDBBBgNVHSAEOjA4MDYGCmCGSAGG+mwKAQIwKDAmBggrBgEFBQcCARYa -aHR0cDovL3d3dy5lbnRydXN0Lm5ldC9ycGEwHwYDVR0RBBgwFoIUc2VjdXJl -LmF1dGhvcml6ZS5uZXQwHwYDVR0jBBgwFoAUW0GKssRDwb2/yFRBVZ3glq3/ -uaEwHQYDVR0OBBYEFGZazQ8qcWqAiT+oFpV/D7WTbcGlMAkGA1UdEwQCMAAw -DQYJKoZIhvcNAQEFBQADggEBAEG1lvV2JQXDXRmEXkDp5qpF6uj1eNfffViE -QR6XCLPWIuaEcgnieTfFzRPEYbxzUY9jCqM62U37hUTDdMKjZas7fwaZ8RjE -wQASNPrIsHFsXEb0Nbz58g3cY00teCH3qQ9N9uW3TC+OXiSz9aSBxYkHD/63 -2D1rzaZLVHXUoReMMbjwf69zLDN7qsy6VDksHMVjqQugZF0ZCLFPPH5jfdAx -sOtocx7eyUovzO387ve8UMTdw6Anr9Ai7iVaYf4MpMqcuaHVet3QeE97Koy1 -mT3q9FmUGbXM+nCqSs/TQ4jSqOo4zqDnkK/cOgbzjsuJJZ/rCPSxaKvz3b/n -wMWH7kM= ------END CERTIFICATE----- \ No newline at end of file diff --git a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/AuthorizeNetAIM_Test.php b/lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/AuthorizeNetAIM_Test.php deleted file mode 100755 index d403735..0000000 --- a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/AuthorizeNetAIM_Test.php +++ /dev/null @@ -1,888 +0,0 @@ -setFields( - array( - 'amount' => rand(1, 1000), - 'card_num' => '4111111111111111', - 'exp_date' => '0415' - ) - ); - $response = $sale->authorizeAndCapture(); - $this->assertTrue($response->approved); - } - - public function testAuthCaptureSingleDigitMonth() - { - $sale = new AuthorizeNetAIM; - $sale->setFields( - array( - 'amount' => rand(1, 1000), - 'card_num' => '4111111111111111', - 'exp_date' => '415' - ) - ); - $response = $sale->authorizeAndCapture(); - $this->assertTrue($response->approved); - } - - public function testAuthCaptureSingleDigitMonthWithSlash() - { - $sale = new AuthorizeNetAIM; - $sale->setFields( - array( - 'amount' => rand(1, 1000), - 'card_num' => '4111111111111111', - 'exp_date' => '4/15' - ) - ); - $response = $sale->authorizeAndCapture(); - $this->assertTrue($response->approved); - } - - public function testAuthCaptureTwoDigitMonthWithSlash() - { - $sale = new AuthorizeNetAIM; - $sale->setFields( - array( - 'amount' => rand(1, 1000), - 'card_num' => '4111111111111111', - 'exp_date' => '04/15' - ) - ); - $response = $sale->authorizeAndCapture(); - $this->assertTrue($response->approved); - } - - public function testAuthCaptureAlternate() - { - $sale = new AuthorizeNetAIM; - $sale->amount = rand(1, 10000); - $sale->card_num = '6011000000000012'; - $sale->exp_date = '04/15'; - $response = $sale->authorizeAndCapture(); - $this->assertTrue($response->approved); - } - - public function testAuthCaptureShort() - { - $sale = new AuthorizeNetAIM; - $response = $sale->authorizeAndCapture(rand(1, 100), '6011000000000012', '04/16'); - $this->assertTrue($response->approved); - } - - public function testAuthCapturePartial() - { - $amount = 3.69; - - $sale = new AuthorizeNetAIM; - $sale->amount = $amount; - $sale->card_num = '4222222222222'; - $sale->zip = "46225"; - $sale->exp_date = '04/15'; - $sale->allow_partial_auth = true; - $response = $sale->authorizeAndCapture(); - $this->assertTrue($response->held); - $this->assertEquals("1.23", $response->amount); - $this->assertEquals($amount, $response->requested_amount); - $split_tender_id = $response->split_tender_id; - - // Pay the balance with a different card - $sale = new AuthorizeNetAIM; - $sale->amount = $amount - $response->amount; - $sale->card_num = '6011000000000012'; - $sale->exp_date = '04/20'; - $sale->split_tender_id = $split_tender_id; - $sale->allow_partial_auth = true; - $response = $sale->authorizeAndCapture(); - $this->assertTrue($response->approved); - - - } - - public function testAuthCaptureShortNoVerify() - { - $sale = new AuthorizeNetAIM; - $sale->VERIFY_PEER = false; - $response = $sale->authorizeAndCapture(rand(1, 100), '6011000000000012', '04/19'); - $this->assertTrue($response->approved); - } - - // public function testVisaVerify() - // { - // return; // Remove to enable test - // $verify = new AuthorizeNetAIM; - // $verify->amount = "0.00"; - // $verify->card_num = '4012888818888'; - // $verify->exp_date = "0517"; - // $verify->address = "123 Main Street"; - // $verify->zip = "94110"; - // $verify->authentication_indicator = "5"; - // $verify->cardholder_authentication_value = "512"; - // $response = $verify->authorizeOnly(); - // $this->assertTrue($response->approved); - // } - // - // public function testVisaVerifyFail() - // { - // return; // Remove to enable test - // $verify = new AuthorizeNetAIM; - // $verify->amount = "0.00"; - // $verify->card_num = '4012888818888'; - // $verify->exp_date = "0517"; - // $verify->address = "123 Main Street"; - // $verify->zip = "94110"; - // $verify->authentication_indicator = "5"; - // $verify->cardholder_authentication_value = ""; - // $response = $verify->authorizeOnly(); - // $this->assertTrue($response->declined); - // } - // - // public function testMastercardVerify() - // { - // return; // Remove to enable test - // $verify = new AuthorizeNetAIM; - // $verify->amount = "0.00"; - // $verify->card_num = '5424000000000015'; - // $verify->exp_date = "0517"; - // $verify->address = "123 Main Street"; - // $verify->zip = "94110"; - // $verify->authentication_indicator = "2"; - // $verify->cardholder_authentication_value = "512"; - // $response = $verify->authorizeOnly(); - // $this->assertTrue($response->approved); - // } - // - // public function testMastercardVerifyFail() - // { - // return; // Remove to enable test - // $verify = new AuthorizeNetAIM; - // $verify->amount = "0.00"; - // $verify->card_num = '5424000000000015'; - // $verify->exp_date = "0517"; - // $verify->address = "123 Main Street"; - // $verify->zip = "94110"; - // $verify->authentication_indicator = "2"; - // $verify->cardholder_authentication_value = ""; - // $response = $verify->authorizeOnly(); - // $this->assertTrue($response->declined); - // } - - public function testAimResponseFields() - { - - $sale = new AuthorizeNetAIM; - $sale->card_num = '4111111111111111'; - $sale->exp_date = '04/16'; - $sale->amount = $amount = rand(1,99); - $sale->description = $description = "Sale description"; - $sale->first_name = $first_name = "Jane"; - $sale->last_name = $last_name = "Smith"; - $sale->company = $company = "Jane Smith Enterprises Inc."; - $sale->address = $address = "20 Main Street"; - $sale->city = $city = "San Francisco"; - $sale->state = $state = "CA"; - $sale->zip = $zip = "94110"; - $sale->country = $country = "US"; - $sale->phone = $phone = "415-555-5557"; - $sale->fax = $fax = "415-555-5556"; - $sale->email = $email = "foo@example.com"; - $sale->cust_id = $customer_id = "55"; - $sale->customer_ip = "98.5.5.5"; - $sale->invoice_num = $invoice_number = "123"; - $sale->ship_to_first_name = $ship_to_first_name = "John"; - $sale->ship_to_last_name = $ship_to_last_name = "Smith"; - $sale->ship_to_company = $ship_to_company = "Smith Enterprises Inc."; - $sale->ship_to_address = $ship_to_address = "10 Main Street"; - $sale->ship_to_city = $ship_to_city = "San Francisco"; - $sale->ship_to_state = $ship_to_state = "CA"; - $sale->ship_to_zip = $ship_to_zip_code = "94110"; - $sale->ship_to_country = $ship_to_country = "US"; - $sale->tax = $tax = "0.00"; - $sale->freight = $freight = "Freight<|>ground overnight<|>12.95"; - $sale->duty = $duty = "Duty1<|>export<|>15.00"; - $sale->tax_exempt = $tax_exempt = "FALSE"; - $sale->po_num = $po_num = "12"; - - - - $response = $sale->authorizeAndCapture(); - $this->assertTrue($response->approved); - $this->assertEquals("1", $response->response_code); - $this->assertEquals("1", $response->response_subcode); - $this->assertEquals("1", $response->response_reason_code); - $this->assertEquals("This transaction has been approved.", $response->response_reason_text); - $this->assertGreaterThan(1, strlen($response->authorization_code)); - $this->assertEquals("Y", $response->avs_response); - $this->assertGreaterThan(1, strlen($response->transaction_id)); - $this->assertEquals($invoice_number, $response->invoice_number); - $this->assertEquals($description, $response->description); - $this->assertEquals($amount, $response->amount); - $this->assertEquals("CC", $response->method); - $this->assertEquals("auth_capture", $response->transaction_type); - $this->assertEquals($customer_id, $response->customer_id); - $this->assertEquals($first_name, $response->first_name); - $this->assertEquals($last_name, $response->last_name); - $this->assertEquals($company, $response->company); - $this->assertEquals($address, $response->address); - $this->assertEquals($city, $response->city); - $this->assertEquals($state, $response->state); - $this->assertEquals($zip, $response->zip_code); - $this->assertEquals($country, $response->country); - $this->assertEquals($phone, $response->phone); - $this->assertEquals($fax, $response->fax); - $this->assertEquals($email, $response->email_address); - $this->assertEquals($ship_to_first_name, $response->ship_to_first_name); - $this->assertEquals($ship_to_last_name, $response->ship_to_last_name); - $this->assertEquals($ship_to_company, $response->ship_to_company); - $this->assertEquals($ship_to_address, $response->ship_to_address); - $this->assertEquals($ship_to_city, $response->ship_to_city); - $this->assertEquals($ship_to_state, $response->ship_to_state); - $this->assertEquals($ship_to_zip_code, $response->ship_to_zip_code); - $this->assertEquals($ship_to_country, $response->ship_to_country); - $this->assertEquals($tax, $response->tax); - $this->assertEquals("15.00", $response->duty); - $this->assertEquals("12.95", $response->freight); - $this->assertEquals($tax_exempt, $response->tax_exempt); - $this->assertEquals($po_num, $response->purchase_order_number); - $this->assertGreaterThan(1, strlen($response->md5_hash)); - $this->assertEquals("", $response->card_code_response); - $this->assertEquals("2", $response->cavv_response); - $this->assertEquals("XXXX1111", $response->account_number); - $this->assertEquals("Visa", $response->card_type); - $this->assertEquals("", $response->split_tender_id); - $this->assertEquals("", $response->requested_amount); - $this->assertEquals("", $response->balance_on_card); - - - } - - - public function testVoid() - { - // First create transaction to void. - $amount = rand(1, 1000); - $sale = new AuthorizeNetAIM; - $sale->setFields( - array( - 'amount' => $amount, - 'card_num' => '6011000000000012', - 'exp_date' => '0415' - ) - ); - $response = $sale->authorizeAndCapture(); - $this->assertTrue($response->approved); - - $void = new AuthorizeNetAIM; - $void->setFields( - array( - 'amount' => $amount, - 'card_num' => '6011000000000012', - 'trans_id' => $response->transaction_id, - ) - ); - $void_response = $void->Void(); - $this->assertTrue($void_response->approved); - } - - public function testVoidShort() - { - // First create transaction to void. - $amount = rand(1, 1000); - $card_num = '6011000000000012'; - $exp_date = '0415'; - $sale = new AuthorizeNetAIM; - $response = $sale->authorizeAndCapture($amount, $card_num, $exp_date); - $this->assertTrue($response->approved); - - $void = new AuthorizeNetAIM; - $void_response = $void->void($response->transaction_id); - $this->assertTrue($void_response->approved); - } - - public function testAuthCaptureECheckSandbox() - { - $sale = new AuthorizeNetAIM; - $sale->setFields( - array( - 'amount' => rand(1, 1000), - 'method' => 'echeck', - 'bank_aba_code' => '121042882', - 'bank_acct_num' => '123456789123', - 'bank_acct_type' => 'CHECKING', - 'bank_name' => 'Bank of Earth', - 'bank_acct_name' => 'Jane Doe', - 'echeck_type' => 'WEB', - ) - ); - $response = $sale->authorizeAndCapture(); - $this->assertEquals("ECHECK", $response->method); - $this->assertTrue($response->approved); - - } - - public function testAmex() - { - $sale = new AuthorizeNetAIM; - $response = $sale->authorizeAndCapture(rand(1, 100), '370000000000002', '04/16'); - $this->assertTrue($response->approved); - } - - public function testDiscover() - { - $sale = new AuthorizeNetAIM; - $response = $sale->authorizeAndCapture(rand(1, 100), '6011000000000012', '04/16'); - $this->assertTrue($response->approved); - } - - public function testVisa() - { - $sale = new AuthorizeNetAIM; - $response = $sale->authorizeAndCapture(rand(1, 100), '4012888818888', '04/16'); - $this->assertTrue($response->approved); - } - - // public function testJCB() - // { - // return; // Remove to enable test - // $sale = new AuthorizeNetAIM; - // $response = $sale->authorizeAndCapture(rand(1, 100), '3088000000000017', '0905'); - // $this->assertTrue($response->approved); - // } - // - // public function testDinersClub() - // { - // return; // Remove to enable test - // $sale = new AuthorizeNetAIM; - // $response = $sale->authorizeAndCapture(rand(1, 100), '38000000000006', '0905'); - // $this->assertTrue($response->approved); - // } - - public function testAuthOnly() - { - $auth = new AuthorizeNetAIM; - $auth->setFields( - array( - 'amount' => rand(1, 1000), - 'card_num' => '6011000000000012', - 'exp_date' => '0415' - ) - ); - $response = $auth->authorizeOnly(); - $this->assertTrue($response->approved); - } - - public function testAuthCaptureVoid() - { - $amount = rand(1, 1000); - $auth = new AuthorizeNetAIM; - $auth->setFields( - array( - 'amount' => $amount, - 'card_num' => '6011000000000012', - 'exp_date' => '0415' - ) - ); - $auth_response = $auth->authorizeOnly(); - $this->assertTrue($auth_response->approved); - - // Now capture. - $capture = new AuthorizeNetAIM; - $capture->setFields( - array( - 'amount' => $amount, - 'card_num' => '6011000000000012', - 'exp_date' => '0415', - 'trans_id' => $auth_response->transaction_id, - ) - ); - $capture_response = $capture->priorAuthCapture(); - $this->assertTrue($capture_response->approved); - - // Now void - $void = new AuthorizeNetAIM; - $void->setFields( - array( - 'amount' => $amount, - 'card_num' => '0012', - 'trans_id' => $auth_response->transaction_id, - ) - ); - $void_response = $void->void(); - $this->assertTrue($void_response->approved); - } - - // public function testCredit() - // { - // - // } - // - // public function testPriorAuthCapture() - // { - // - // } - // - // public function testCaptureOnly() - // { - // - // } - - public function testAdvancedAIM() - { - $auth = new AuthorizeNetAIM; - $auth->amount = "45.00"; - - // Use eCheck: - $auth->setECheck( - '121042882', - '123456789123', - 'CHECKING', - 'Bank of Earth', - 'Jane Doe', - 'WEB' - ); - - // Set multiple line items: - $auth->addLineItem('item1', 'Golf tees', 'Blue tees', '2', '5.00', 'N'); - $auth->addLineItem('item2', 'Golf shirt', 'XL', '1', '40.00', 'N'); - - // Set Invoice Number: - $auth->invoice_num = time(); - - // Set a Merchant Defined Field: - $auth->setCustomField("entrance_source", "Search Engine"); - - // Authorize Only: - $response = $auth->authorizeOnly(); - $this->assertTrue($response->approved); - if ($response->approved) { - $auth_code = $response->transaction_id; - - // Now capture: - $capture = new AuthorizeNetAIM; - $capture_response = $capture->priorAuthCapture($auth_code); - $this->assertTrue($capture_response->approved); - - // Now void: - $void = new AuthorizeNetAIM; - $void_response = $void->void($capture_response->transaction_id); - $this->assertTrue($void_response->approved); - } - } - - public function testAuthCaptureCustomFields() - { - $sale = new AuthorizeNetAIM; - $sale->setFields( - array( - 'amount' => rand(1, 1000), - 'card_num' => '6011000000000012', - 'exp_date' => '0415' - ) - ); - $sale->setCustomField("foo", "bar"); - $sale->setCustomField("foo2", "bar2"); - $sale->setCustomField("foo3", "bar3"); - $sale->setCustomField("foo4", "bar4"); - $sale->setCustomField("foo5", "bar5"); - $sale->setCustomField("My_MerchantField6", "My Merchant Value6"); - $sale->setCustomField("foo7", "bar7"); - $response = $sale->authorizeAndCapture(); - $this->assertTrue($response->approved); - $this->assertEquals("bar", $response->foo); - $this->assertEquals("bar2", $response->foo2); - } - - public function testEncapCharacter() - { - $description = "john doe's present, with comma"; - $amount = rand(1, 1000); - $sale = new AuthorizeNetAIM; - $sale->setFields( - array( - 'amount' => $amount, - 'card_num' => '6011000000000012', - 'exp_date' => '0415', - 'encap_char' => '$', - 'description' => $description, - ) - ); - $response = $sale->authorizeAndCapture(); - $this->assertTrue($response->approved); - $this->assertEquals($amount, $response->amount); - $this->assertEquals($description, $response->description); - } - - public function testAuthCaptureSetMultipleCustomFields() - { - $sale = new AuthorizeNetAIM; - $sale->setFields( - array( - 'amount' => rand(1, 1000), - 'card_num' => '6011000000000012', - 'exp_date' => '0415' - ) - ); - $sale->setCustomFields(array("foo" => "bar", "foo2" => "bar2")); - $response = $sale->authorizeAndCapture(); - $this->assertTrue($response->approved); - $this->assertEquals("bar", $response->foo); - $this->assertEquals("bar2", $response->foo2); - } - - public function testInvalidMerchantCredentials() - { - $auth = new AuthorizeNetAIM('d', 'd'); - $response = $auth->AuthorizeOnly(); - $this->assertTrue($response->error); - $this->assertEquals($response->response_subcode, 2); - $this->assertEquals($response->response_reason_code, 13); - } - - public function testInvalidCreditCard() - { - $sale = new AuthorizeNetAIM; - $sale->setFields( - array( - 'amount' => rand(1, 1000), - 'card_num' => '123', - 'exp_date' => '0415' - ) - ); - $response = $sale->authorizeAndCapture(); - $this->assertFalse($response->approved); - $this->assertTrue($response->error); - } - - public function testError() - { - $sale = new AuthorizeNetAIM; - $sale->unsetField("login"); - $sale->unsetField("tran_key"); - $sale->unsetField("delim_data"); - - $sale->unsetField("version"); - $sale->unsetField("relay_response"); - - $response = $sale->authorizeAndCapture(); - // An exception should have been thrown. - $this->assertFalse($response->approved); - $this->assertTrue($response->error); - - } - - public function testMultipleLineItems() - { - $merchant = (object)array(); - $merchant->login = AUTHORIZENET_API_LOGIN_ID; - $merchant->tran_key = AUTHORIZENET_TRANSACTION_KEY; - $merchant->allow_partial_auth = "false"; - - $creditCard = array( - 'exp_date' => '02/2012', - 'card_num' => '6011000000000012', - 'card_code' => '452', - ); - - $transaction = array( - 'amount' => rand(100, 1000), - 'duplicate_window' => '10', - // 'email_customer' => 'true', - 'footer_email_receipt' => 'thank you for your business!', - 'header_email_receipt' => 'a copy of your receipt is below', - ); - - $order = array( - 'description' => 'Johns Bday Gift', - 'invoice_num' => '3123', - 'line_item' => 'item1<|>golf balls<|><|>2<|>18.95<|>Y', - ); - - $customer = (object)array(); - $customer->first_name = "Jane"; - $customer->last_name = "Smith"; - $customer->company = "Jane Smith Enterprises Inc."; - $customer->address = "20 Main Street"; - $customer->city = "San Francisco"; - $customer->state = "CA"; - $customer->zip = "94110"; - $customer->country = "US"; - $customer->phone = "415-555-5557"; - $customer->fax = "415-555-5556"; - $customer->email = "foo@example.com"; - $customer->cust_id = "55"; - $customer->customer_ip = "98.5.5.5"; - - $shipping_info = (object)array(); - $shipping_info->ship_to_first_name = "John"; - $shipping_info->ship_to_last_name = "Smith"; - $shipping_info->ship_to_company = "Smith Enterprises Inc."; - $shipping_info->ship_to_address = "10 Main Street"; - $shipping_info->ship_to_city = "San Francisco"; - $shipping_info->ship_to_state = "CA"; - $shipping_info->ship_to_zip = "94110"; - $shipping_info->ship_to_country = "US"; - $shipping_info->tax = "CA"; - $shipping_info->freight = "Freight<|>ground overnight<|>12.95"; - $shipping_info->duty = "Duty1<|>export<|>15.00"; - $shipping_info->tax_exempt = "false"; - $shipping_info->po_num = "12"; - - $sale = new AuthorizeNetAIM; - $sale->setFields($creditCard); - $sale->setFields($shipping_info); - $sale->setFields($customer); - $sale->setFields($order); - $sale->setFields($merchant); - $sale->setFields($transaction); - - $sale->addLineItem('item2', 'golf tees', 'titanium tees', '2', '2.95', 'Y'); - $sale->addLineItem('item3', 'golf shirt', 'red, large', '2', '3.95', 'Y'); - - $response = $sale->authorizeAndCapture(); - - $this->assertTrue($response->approved); - } - - public function testAllFieldsLongMethod() - { - $merchant = (object)array(); - $merchant->login = AUTHORIZENET_API_LOGIN_ID; - $merchant->tran_key = AUTHORIZENET_TRANSACTION_KEY; - $merchant->allow_partial_auth = "false"; - - $creditCard = array( - 'exp_date' => '02/2012', - 'card_num' => '6011000000000012', - 'card_code' => '452', - ); - - $transaction = array( - 'amount' => rand(100, 1000), - 'duplicate_window' => '10', - // 'email_customer' => 'true', - 'footer_email_receipt' => 'thank you for your business!', - 'header_email_receipt' => 'a copy of your receipt is below', - ); - - $order = array( - 'description' => 'Johns Bday Gift', - 'invoice_num' => '3123', - 'line_item' => 'item1<|>golf balls<|><|>2<|>18.95<|>Y', - ); - - $customer = (object)array(); - $customer->first_name = "Jane"; - $customer->last_name = "Smith"; - $customer->company = "Jane Smith Enterprises Inc."; - $customer->address = "20 Main Street"; - $customer->city = "San Francisco"; - $customer->state = "CA"; - $customer->zip = "94110"; - $customer->country = "US"; - $customer->phone = "415-555-5557"; - $customer->fax = "415-555-5556"; - $customer->email = "foo@example.com"; - $customer->cust_id = "55"; - $customer->customer_ip = "98.5.5.5"; - - $shipping_info = (object)array(); - $shipping_info->ship_to_first_name = "John"; - $shipping_info->ship_to_last_name = "Smith"; - $shipping_info->ship_to_company = "Smith Enterprises Inc."; - $shipping_info->ship_to_address = "10 Main Street"; - $shipping_info->ship_to_city = "San Francisco"; - $shipping_info->ship_to_state = "CA"; - $shipping_info->ship_to_zip = "94110"; - $shipping_info->ship_to_country = "US"; - $shipping_info->tax = "CA"; - $shipping_info->freight = "Freight<|>ground overnight<|>12.95"; - $shipping_info->duty = "Duty1<|>export<|>15.00"; - $shipping_info->tax_exempt = "false"; - $shipping_info->po_num = "12"; - - $sale = new AuthorizeNetAIM; - $sale->setFields($creditCard); - $sale->setFields($shipping_info); - $sale->setFields($customer); - $sale->setFields($order); - $sale->setFields($merchant); - $sale->setFields($transaction); - $response = $sale->authorizeAndCapture(); - - $this->assertTrue($response->approved); - } - - public function testResponseMethods() - { - $amount = rand(1, 1000); - $zipcode = "02301"; - - $sale = new AuthorizeNetAIM; - $sale->setFields( - array( - 'amount' => $amount, - 'card_num' => '6011000000000012', - 'exp_date' => '0415', - 'zip' => $zipcode, - ) - ); - - $sale->setCustomField("custom1", "custom1value"); - $sale->setCustomField("custom2", "custom2value"); - $result = $sale->authorizeAndCapture(); - $this->assertTrue($result->approved); - - $this->assertEquals("custom2value", $result->custom2); - $this->assertEquals($amount, $result->amount); - $this->assertEquals("CC", $result->method); - $this->assertEquals("auth_capture", $result->transaction_type); - $this->assertEquals("Discover", $result->card_type); - $this->assertEquals($zipcode, $result->zip_code); - } - - public function testSetBadField() - { - try { - $amount = rand(1, 1000); - $zipcode = "02301"; - - $sale = new AuthorizeNetAIM; - $sale->setFields( - array( - 'amount' => $amount, - 'card_num' => '6011000000000012', - 'exp_date' => '0415', - 'zipcode' => $zipcode, // Should actually be just "zip" - ) - ); - - $result = $sale->authorizeAndCapture(); - $this->assertTrue($result->approved); - // should have thrown an exception by now - $this->assertFalse(true); - } - catch (AuthorizeNetException $e){ - $this->assertTrue(true); - - } - } - -} - - -class AuthorizeNetAIM_Live_Test extends PHPUnit_Framework_TestCase -{ - - public function testAuthCaptureSetECheckMethod() - { - if (MERCHANT_LIVE_API_LOGIN_ID) { - // $this->markTestIncomplete('Depends on whether eChecks is enabled'); - $sale = new AuthorizeNetAIM(MERCHANT_LIVE_API_LOGIN_ID,MERCHANT_LIVE_TRANSACTION_KEY); - $sale->setSandbox(false); - $sale->test_request = 'TRUE'; - $sale->amount = "4.99"; - $sale->setECheck( - '121042882', - '123456789123', - 'CHECKING', - 'Bank of Earth', - 'Jane Doe', - 'WEB' - ); - $response = $sale->authorizeAndCapture(); - $this->assertEquals("ECHECK", $response->method); - $this->assertEquals("18", $response->response_reason_code); - // $this->assertTrue($response->approved); - } - } - - public function testAuthCaptureECheck() - { - if (MERCHANT_LIVE_API_LOGIN_ID) { - // $this->markTestIncomplete('Depends on whether eChecks is enabled'); - $sale = new AuthorizeNetAIM(MERCHANT_LIVE_API_LOGIN_ID,MERCHANT_LIVE_TRANSACTION_KEY); - $sale->setSandbox(false); - $sale->test_request = 'TRUE'; - $sale->setFields( - array( - 'amount' => rand(1, 1000), - 'method' => 'echeck', - 'bank_aba_code' => '121042882', - 'bank_acct_num' => '123456789123', - 'bank_acct_type' => 'CHECKING', - 'bank_name' => 'Bank of Earth', - 'bank_acct_name' => 'Jane Doe', - 'echeck_type' => 'WEB', - ) - ); - $response = $sale->authorizeAndCapture(); - $this->assertEquals("ECHECK", $response->method); - $this->assertEquals("18", $response->response_reason_code); - // $this->assertTrue($response->approved); - } - } - - public function testAuthCaptureLiveServerTestRequest() - { - if (MERCHANT_LIVE_API_LOGIN_ID) { - $sale = new AuthorizeNetAIM(MERCHANT_LIVE_API_LOGIN_ID,MERCHANT_LIVE_TRANSACTION_KEY); - $sale->setSandbox(false); - $sale->setFields( - array( - 'amount' => rand(1, 1000), - 'card_num' => '6011000000000012', - 'exp_date' => '0415' - ) - ); - $sale->setField('test_request', 'TRUE'); - $response = $sale->authorizeAndCapture(); - $this->assertTrue($response->approved); - } - } - - public function testAuthCaptureLiveServer() - { - if (MERCHANT_LIVE_API_LOGIN_ID) { - $sale = new AuthorizeNetAIM(MERCHANT_LIVE_API_LOGIN_ID,MERCHANT_LIVE_TRANSACTION_KEY); - $sale->setSandbox(false); - $sale->test_request = 'TRUE'; - $sale->setFields( - array( - 'amount' => rand(1, 1000), - 'card_num' => '6011000000000012', - 'exp_date' => '0415' - ) - ); - $response = $sale->authorizeAndCapture(); - $this->assertTrue($response->approved); - } - } - - public function testInvalidCredentials() - { - if (MERCHANT_LIVE_API_LOGIN_ID) { - // Post a response to live server using invalid credentials. - $sale = new AuthorizeNetAIM('a','a'); - $sale->setSandbox(false); - $sale->setFields( - array( - 'amount' => rand(1, 1000), - 'card_num' => '6011000000000012', - 'exp_date' => '0415' - ) - ); - $response = $sale->authorizeAndCapture(); - $this->assertTrue($response->error); - $this->assertEquals("13", $response->response_reason_code); - } - } - -} \ No newline at end of file diff --git a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/AuthorizeNetARB_Test.php b/lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/AuthorizeNetARB_Test.php deleted file mode 100755 index ef120af..0000000 --- a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/AuthorizeNetARB_Test.php +++ /dev/null @@ -1,201 +0,0 @@ -name = "Short subscription"; - $subscription->intervalLength = "1"; - $subscription->intervalUnit = "months"; - $subscription->startDate = "2011-03-12"; - $subscription->totalOccurrences = "14"; - $subscription->amount = rand(1,100); - $subscription->creditCardCardNumber = "6011000000000012"; - $subscription->creditCardExpirationDate = "2018-10"; - $subscription->creditCardCardCode = "123"; - $subscription->billToFirstName = "john"; - $subscription->billToLastName = "doe"; - - // Create the subscription. - $request = new AuthorizeNetARB; - $response = $request->createSubscription($subscription); - $this->assertTrue($response->isOk()); - $subscription_id = $response->getSubscriptionId(); - - // Get the subscription status - $status_request = new AuthorizeNetARB; - $status_response = $status_request->getSubscriptionStatus($subscription_id); - $this->assertEquals("active",$status_response->getSubscriptionStatus()); - - // Update the subscription - $update_request = new AuthorizeNetARB; - $updated_subscription_info = new AuthorizeNet_Subscription; - $updated_subscription_info->billToFirstName = "jane"; - $updated_subscription_info->billToLastName = "smith"; - $updated_subscription_info->creditCardCardNumber = "6011000000000012"; - $updated_subscription_info->creditCardExpirationDate = "2019-10"; - $updated_subscription_info->creditCardCardCode = "423"; - $update_response = $update_request->updateSubscription($subscription_id, $updated_subscription_info); - $this->assertTrue($update_response->isOk()); - - // Cancel the subscription - $cancellation = new AuthorizeNetARB; - $cancel_response = $cancellation->cancelSubscription($subscription_id); - $this->assertTrue($cancel_response->isOk()); - - // Get the subscription status - $status_request = new AuthorizeNetARB; - $status_response = $status_request->getSubscriptionStatus($subscription_id); - $this->assertEquals("canceled", $status_response->getSubscriptionStatus()); - - } - - - public function testCreateSubscriptionLong() - { - - $subscription = new AuthorizeNet_Subscription; - $subscription->name = "test subscription"; - $subscription->intervalLength = "1"; - $subscription->intervalUnit = "months"; - $subscription->startDate = "2015-03-12"; - $subscription->totalOccurrences = "14"; - $subscription->trialOccurrences = ""; - $subscription->amount = "6.99"; - $subscription->trialAmount = ""; - $subscription->creditCardCardNumber = "6011000000000012"; - $subscription->creditCardExpirationDate = "2018-10"; - $subscription->creditCardCardCode = "123"; - $subscription->bankAccountAccountType = ""; - $subscription->bankAccountRoutingNumber = ""; - $subscription->bankAccountAccountNumber = ""; - $subscription->bankAccountNameOnAccount = ""; - $subscription->bankAccountEcheckType = ""; - $subscription->bankAccountBankName = ""; - $subscription->orderInvoiceNumber = ""; - $subscription->orderDescription = ""; - $subscription->customerId = "12"; - $subscription->customerEmail = "foo@domain.com"; - $subscription->customerPhoneNumber = ""; - $subscription->customerFaxNumber = ""; - $subscription->billToFirstName = "john"; - $subscription->billToLastName = "doe"; - $subscription->billToCompany = ""; - $subscription->billToAddress = ""; - $subscription->billToCity = ""; - $subscription->billToState = ""; - $subscription->billToZip = ""; - $subscription->billToCountry = ""; - $subscription->shipToFirstName = ""; - $subscription->shipToLastName = ""; - $subscription->shipToCompany = ""; - $subscription->shipToAddress = ""; - $subscription->shipToCity = ""; - $subscription->shipToState = ""; - $subscription->shipToZip = ""; - $subscription->shipToCountry = ""; - - $refId = "ref" . time(); - - // Create the request and send it. - $request = new AuthorizeNetARB; - $request->setRefId($refId); - $response = $request->createSubscription($subscription); - - - // Handle the response. - - $this->assertTrue($response->isOk()); - $this->assertEquals($response->getMessageCode(), "I00001"); - $this->assertEquals($response->getMessageText(), "Successful."); - $this->assertEquals($response->getRefId(), $refId); - $this->assertEquals($response->getResultCode(), "Ok"); - - // Cancel the subscription to avoid duplicate errors in future - - $cancellation = new AuthorizeNetARB; - $cancellation->setRefId($refId); - $cancel_response = $cancellation->cancelSubscription($response->getSubscriptionId()); - - - - $this->assertTrue($cancel_response->isOk()); - - } - - public function testCreateSubscriptionECheck() - { - - $subscription = new AuthorizeNet_Subscription; - $subscription->name = "my test echeck subscription"; - $subscription->intervalLength = "1"; - $subscription->intervalUnit = "months"; - $subscription->startDate = "2015-04-12"; - $subscription->totalOccurrences = "2"; - $subscription->trialOccurrences = ""; - $subscription->amount = "11.99"; - $subscription->trialAmount = ""; - $subscription->bankAccountAccountType = "checking"; - $subscription->bankAccountRoutingNumber = "121000248"; - $subscription->bankAccountAccountNumber = "12345678"; - $subscription->bankAccountNameOnAccount = "John Doe"; - $subscription->bankAccountEcheckType = "WEB"; - $subscription->bankAccountBankName = "Bank of Earth"; - $subscription->orderInvoiceNumber = ""; - $subscription->orderDescription = ""; - $subscription->customerId = "12"; - $subscription->customerEmail = "foo@domain.com"; - $subscription->customerPhoneNumber = ""; - $subscription->customerFaxNumber = ""; - $subscription->billToFirstName = "john"; - $subscription->billToLastName = "doe"; - $subscription->billToCompany = ""; - $subscription->billToAddress = ""; - $subscription->billToCity = ""; - $subscription->billToState = ""; - $subscription->billToZip = ""; - $subscription->billToCountry = ""; - $subscription->shipToFirstName = ""; - $subscription->shipToLastName = ""; - $subscription->shipToCompany = ""; - $subscription->shipToAddress = ""; - $subscription->shipToCity = ""; - $subscription->shipToState = ""; - $subscription->shipToZip = ""; - $subscription->shipToCountry = ""; - - $refId = "ref" . time(); - - // Create the request and send it. - $request = new AuthorizeNetARB; - $request->setRefId($refId); - - $response = $request->createSubscription($subscription); - - - // Handle the response. - - $this->assertTrue($response->isOk()); - $this->assertEquals($response->getMessageCode(), "I00001"); - $this->assertEquals($response->getMessageText(), "Successful."); - $this->assertEquals($response->getRefId(), $refId); - $this->assertEquals($response->getResultCode(), "Ok"); - - - // Cancel the subscription to avoid duplicate errors in future - - - $cancellation = new AuthorizeNetARB; - $cancellation->setRefId($refId); - $cancel_response = $cancellation->cancelSubscription($response->getSubscriptionId()); - - $this->assertTrue($cancel_response->isOk()); - - } - -} \ No newline at end of file diff --git a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/AuthorizeNetCIM_Test.php b/lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/AuthorizeNetCIM_Test.php deleted file mode 100755 index 75c58d9..0000000 --- a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/AuthorizeNetCIM_Test.php +++ /dev/null @@ -1,355 +0,0 @@ -getCustomerProfileIds(); - $customers = $response->getCustomerProfileIds(); - - foreach ($customers as $customer) { - $response = $request->deleteCustomerProfile($customer); - $this->assertTrue($response->isOk()); - } - - - } - - public function testXPath() - { - - // Create new customer profile - $request = new AuthorizeNetCIM; - $customerProfile = new AuthorizeNetCustomer; - $customerProfile->description = $description = "Some Description of customer 2"; - $customerProfile->merchantCustomerId = $merchantCustomerId = time().rand(1,150); - $customerProfile->email = $email = "test2@domain.com"; - - // Add payment profile. - $paymentProfile = new AuthorizeNetPaymentProfile; - $paymentProfile->customerType = "individual"; - $paymentProfile->payment->creditCard->cardNumber = "4111111111111111"; - $paymentProfile->payment->creditCard->expirationDate = "2021-04"; - $customerProfile->paymentProfiles[] = $paymentProfile; - - $response = $request->createCustomerProfile($customerProfile); - $this->assertTrue($response->isOk()); - $array = $response->xpath('customerProfileId'); - $this->assertEquals($response->getCustomerProfileId(), "{$array[0]}"); - - $profile = $request->getCustomerProfile($response->getCustomerProfileId()); - - $this->assertEquals($email, (string)array_pop($profile->xpath('profile/email'))); - $this->assertEquals($email, (string)array_pop($profile->xpath('profile/email'))); - $this->assertEquals($description, (string)array_pop($profile->xpath('profile/description'))); - $this->assertEquals($merchantCustomerId, (string)array_pop($profile->xpath('profile/merchantCustomerId'))); - - } - - - - public function testCreateCustomerProfile() - { - // Create new customer profile - $request = new AuthorizeNetCIM; - $customerProfile = new AuthorizeNetCustomer; - $customerProfile->description = "Description of customer"; - $customerProfile->merchantCustomerId = time().rand(1,100); - $customerProfile->email = "blahbla@domain.com"; - - // Add payment profile. - $paymentProfile = new AuthorizeNetPaymentProfile; - $paymentProfile->customerType = "individual"; - $paymentProfile->payment->creditCard->cardNumber = "4111111111111111"; - $paymentProfile->payment->creditCard->expirationDate = "2015-10"; - $customerProfile->paymentProfiles[] = $paymentProfile; - - // Add another payment profile. - $paymentProfile2 = new AuthorizeNetPaymentProfile; - $paymentProfile2->customerType = "business"; - $paymentProfile2->payment->bankAccount->accountType = "businessChecking"; - $paymentProfile2->payment->bankAccount->routingNumber = "121042882"; - $paymentProfile2->payment->bankAccount->accountNumber = "123456789123"; - $paymentProfile2->payment->bankAccount->nameOnAccount = "Jane Doe"; - $paymentProfile2->payment->bankAccount->echeckType = "WEB"; - $paymentProfile2->payment->bankAccount->bankName = "Pandora Bank"; - $customerProfile->paymentProfiles[] = $paymentProfile2; - - - // Add shipping address. - $address = new AuthorizeNetAddress; - $address->firstName = "john"; - $address->lastName = "Doe"; - $address->company = "John Doe Company"; - $address->address = "1 Main Street"; - $address->city = "Boston"; - $address->state = "MA"; - $address->zip = "02412"; - $address->country = "USA"; - $address->phoneNumber = "555-555-5555"; - $address->faxNumber = "555-555-5556"; - $customerProfile->shipToList[] = $address; - - // Add another shipping address. - $address2 = new AuthorizeNetAddress; - $address2->firstName = "jane"; - $address2->lastName = "Doe"; - $address2->address = "11 Main Street"; - $address2->city = "Boston"; - $address2->state = "MA"; - $address2->zip = "02412"; - $address2->country = "USA"; - $address2->phoneNumber = "555-512-5555"; - $address2->faxNumber = "555-523-5556"; - $customerProfile->shipToList[] = $address2; - - $response = $request->createCustomerProfile($customerProfile); - $this->assertTrue($response->isOk()); - $this->assertEquals(2, count($response->getCustomerShippingAddressIds())); - $this->assertEquals(2, count($response->getCustomerPaymentProfileIds())); - $customerProfileId = $response->getCustomerProfileId(); - - $this->assertEquals($response->getCustomerProfileId(), "{$response->xml->customerProfileId}"); - - - - $response = $request->getCustomerProfile($customerProfileId); - $this->assertEquals($customerProfile->description, (string)$response->xml->profile->description); - $this->assertEquals($customerProfile->merchantCustomerId, (string)$response->xml->profile->merchantCustomerId); - $this->assertEquals($customerProfile->email, (string)$response->xml->profile->email); - $this->assertEquals(substr($customerProfile->paymentProfiles[0]->payment->creditCard->cardNumber, -4, 4), substr((string)$response->xml->profile->paymentProfiles->payment->creditCard->cardNumber, -4, 4)); - - - - $this->assertTrue($response->isOk()); - - - } - - public function testGetCustomerProfile() - { - // Create new customer profile - $request = new AuthorizeNetCIM; - $customerProfile = new AuthorizeNetCustomer; - $customerProfile->description = "Description of customer"; - $customerProfile->merchantCustomerId = time().rand(1,10); - $customerProfile->email = "blahlah@domain.com"; - $response = $request->createCustomerProfile($customerProfile); - $this->assertTrue($response->isOk()); - $customerProfileId = $response->getCustomerProfileId(); - - $response = $request->getCustomerProfile($customerProfileId); - - $this->assertTrue($response->isOk()); - - } - - public function testCreateCustomerProfileWithValidationMode() - { - // Create new customer profile - $request = new AuthorizeNetCIM; - $customerProfile = new AuthorizeNetCustomer; - $customerProfile->description = "Some Description of customer 2"; - $customerProfile->merchantCustomerId = time().rand(1,10); - $customerProfile->email = "test2@domain.com"; - - // Add payment profile. - $paymentProfile = new AuthorizeNetPaymentProfile; - $paymentProfile->customerType = "individual"; - $paymentProfile->payment->creditCard->cardNumber = "4111111111111111"; - $paymentProfile->payment->creditCard->expirationDate = "2015-04"; - $customerProfile->paymentProfiles[] = $paymentProfile; - - // Add another payment profile. - $paymentProfile2 = new AuthorizeNetPaymentProfile; - $paymentProfile2->customerType = "individual"; - $paymentProfile2->payment->creditCard->cardNumber = "4222222222222"; - $paymentProfile2->payment->creditCard->expirationDate = "2019-10"; - $customerProfile->paymentProfiles[] = $paymentProfile2; - - $response = $request->createCustomerProfile($customerProfile, "testMode"); - - $this->assertTrue($response->isOk()); - - $validationResponses = $response->getValidationResponses(); - foreach ($validationResponses as $vr) { - $this->assertTrue($vr->approved); - } - - } - - public function testUpdateSplitTenderGroup() - { - // Create a partial auth test transaction - $amount = 4.92; - - $sale = new AuthorizeNetAIM; - $sale->amount = $amount; - $sale->card_num = '4222222222222'; - $sale->zip = "46225"; - $sale->exp_date = '04/24'; - $sale->allow_partial_auth = true; - $response = $sale->authorizeAndCapture(); - $this->assertTrue($response->held); - $this->assertEquals("1.23", $response->amount); - $this->assertEquals($amount, $response->requested_amount); - $split_tender_id = $response->split_tender_id; - - // Charge a bit more - $sale = new AuthorizeNetAIM; - $sale->amount = 1.23; - $sale->card_num = '6011000000000012'; - $sale->exp_date = '04/26'; - $sale->split_tender_id = $split_tender_id; - $sale->allow_partial_auth = true; - $response = $sale->authorizeAndCapture(); - $this->assertTrue($response->approved); - - // Void the group of partial auths. - - $request = new AuthorizeNetCIM; - $response = $request->updateSplitTenderGroup($split_tender_id, "voided"); - $this->assertTrue($response->isOk()); - } - - public function testAll() - { - // Create new customer profile - $request = new AuthorizeNetCIM; - $customerProfile = new AuthorizeNetCustomer; - $customerProfile->description = "Description of customer"; - $customerProfile->merchantCustomerId = time().rand(1,10); - $customerProfile->email = "blahblahblah@domain.com"; - $response = $request->createCustomerProfile($customerProfile); - $this->assertTrue($response->isOk()); - $customerProfileId = $response->getCustomerProfileId(); - - // Update customer profile - $customerProfile->description = "New description"; - $customerProfile->email = "newemail@domain.com"; - $response = $request->updateCustomerProfile($customerProfileId, $customerProfile); - $this->assertTrue($response->isOk()); - - // Add payment profile. - $paymentProfile = new AuthorizeNetPaymentProfile; - $paymentProfile->customerType = "individual"; - $paymentProfile->payment->creditCard->cardNumber = "4111111111111111"; - $paymentProfile->payment->creditCard->expirationDate = "2015-10"; - $response = $request->createCustomerPaymentProfile($customerProfileId, $paymentProfile); - $this->assertTrue($response->isOk()); - $paymentProfileId = $response->getPaymentProfileId(); - - // Update payment profile. - $paymentProfile->payment->creditCard->cardNumber = "4111111111111111"; - $paymentProfile->payment->creditCard->expirationDate = "2017-11"; - $response = $request->updateCustomerPaymentProfile($customerProfileId,$paymentProfileId, $paymentProfile); - $this->assertTrue($response->isOk()); - - // Add shipping address. - $address = new AuthorizeNetAddress; - $address->firstName = "john"; - $address->lastName = "Doe"; - $address->company = "John Doe Company"; - $address->address = "1 Main Street"; - $address->city = "Boston"; - $address->state = "MA"; - $address->zip = "02412"; - $address->country = "USA"; - $address->phoneNumber = "555-555-5555"; - $address->faxNumber = "555-555-5556"; - $response = $request->createCustomerShippingAddress($customerProfileId, $address); - $this->assertTrue($response->isOk()); - $customerAddressId = $response->getCustomerAddressId(); - - // Update shipping address. - $address->address = "2 First Street"; - $response = $request->updateCustomerShippingAddress($customerProfileId, $customerAddressId, $address); - $this->assertTrue($response->isOk()); - - // Create Auth & Capture Transaction - $transaction = new AuthorizeNetTransaction; - $transaction->amount = "9.79"; - $transaction->customerProfileId = $customerProfileId; - $transaction->customerPaymentProfileId = $paymentProfileId; - $transaction->customerShippingAddressId = $customerAddressId; - - $lineItem = new AuthorizeNetLineItem; - $lineItem->itemId = "4"; - $lineItem->name = "Cookies"; - $lineItem->description = "Chocolate Chip"; - $lineItem->quantity = "4"; - $lineItem->unitPrice = "1.00"; - $lineItem->taxable = "true"; - - $lineItem2 = new AuthorizeNetLineItem; - $lineItem2->itemId = "4"; - $lineItem2->name = "Cookies"; - $lineItem2->description= "Peanut Butter"; - $lineItem2->quantity = "4"; - $lineItem2->unitPrice = "1.00"; - $lineItem2->taxable = "true"; - - $transaction->lineItems[] = $lineItem; - $transaction->lineItems[] = $lineItem2; - - - $response = $request->createCustomerProfileTransaction("AuthCapture", $transaction); - $this->assertTrue($response->isOk()); - $transactionResponse = $response->getTransactionResponse(); - $this->assertTrue($transactionResponse->approved); - $transactionId = $transactionResponse->transaction_id; - - // Void the transaction - $transaction = new AuthorizeNetTransaction; - $transaction->transId = $transactionId; - $response = $request->createCustomerProfileTransaction("Void", $transaction); - $this->assertTrue($response->isOk()); - $transactionResponse = $response->getTransactionResponse(); - $this->assertTrue($transactionResponse->approved); - - - // Delete Shipping Address - $response = $request->deleteCustomerShippingAddress($customerProfileId, $customerAddressId); - $this->assertTrue($response->isOk()); - - // Delete payment profile. - $response = $request->deleteCustomerPaymentProfile($customerProfileId, $paymentProfileId); - $this->assertTrue($response->isOk()); - - - // Delete the profile id for future testing. - $response = $request->deleteCustomerProfile($customerProfileId); - $this->assertTrue($response->isOk()); - } - - - - - public function testGetCustomerProfileIds() - { - // Create new customer profile - $request = new AuthorizeNetCIM; - $customerProfile = new AuthorizeNetCustomer; - $customerProfile->description = "Description of customer"; - $customerProfile->merchantCustomerId = time().rand(1,10); - $customerProfile->email = "blahblahblah@domain.com"; - $response = $request->createCustomerProfile($customerProfile); - $this->assertTrue($response->isOk()); - $customerProfileId = $response->getCustomerProfileId(); - - $response = $request->getCustomerProfileIds(); - $this->assertTrue($response->isOk()); - $this->assertTrue(in_array($customerProfileId, $response->getCustomerProfileIds())); - - - } - - - - -} \ No newline at end of file diff --git a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/AuthorizeNetCP_Test.php b/lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/AuthorizeNetCP_Test.php deleted file mode 100755 index aa8c580..0000000 --- a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/AuthorizeNetCP_Test.php +++ /dev/null @@ -1,179 +0,0 @@ -setFields( - array( - 'amount' => rand(1, 1000), - 'card_num' => '4111111111111111', - 'exp_date' => '0415', - 'device_type' => '4', - ) - ); - $response = $sale->authorizeAndCapture(); - $this->assertTrue($response->approved); - } - - // public function testMd5() - // { - // return; - // $sale = new AuthorizeNetCP(CP_API_LOGIN_ID, CP_TRANSACTION_KEY); - // $sale->setFields( - // array( - // 'amount' => rand(1, 1000), - // 'card_num' => '4111111111111111', - // 'exp_date' => '0415', - // 'device_type' => '4', - // ) - // ); - // $response = $sale->authorizeAndCapture(); - // $this->assertTrue($response->approved); - // $this->assertTrue($response->isAuthorizeNet(CP_API_LOGIN_ID)); - // } - - public function testAuthCaptureTrack1() - { - $sale = new AuthorizeNetCP(CP_API_LOGIN_ID, CP_TRANSACTION_KEY); - $sale->setFields( - array( - 'amount' => rand(1, 1000), - 'device_type' => '4', - ) - ); - $sale->setTrack1Data('%B4111111111111111^CARDUSER/JOHN^1803101000000000020000831000000?'); - $response = $sale->authorizeAndCapture(); - $this->assertTrue($response->approved); - } - - public function testAuthCaptureTrack2() - { - $sale = new AuthorizeNetCP(CP_API_LOGIN_ID, CP_TRANSACTION_KEY); - $sale->setFields( - array( - 'amount' => rand(1, 1000), - 'device_type' => '4', - ) - ); - $sale->setTrack2Data('4111111111111111=1803101000020000831?'); - $response = $sale->authorizeAndCapture(); - $this->assertTrue($response->approved); - } - - public function testAuthCaptureTrack2Error() - { - $sale = new AuthorizeNetCP(CP_API_LOGIN_ID, CP_TRANSACTION_KEY); - $sale->setFields( - array( - 'amount' => rand(1, 1000), - 'device_type' => '4', - ) - ); - $sale->setTrack2Data('4411111111111111=1803101000020000831?'); - $response = $sale->authorizeAndCapture(); - $this->assertFalse($response->approved); - $this->assertTrue($response->error); - $this->assertEquals(6, $response->response_reason_code); - } - - public function testResponseFields() - { - $sale = new AuthorizeNetCP(CP_API_LOGIN_ID, CP_TRANSACTION_KEY); - $sale->setFields( - array( - 'amount' => rand(1, 1000), - 'device_type' => '4', - ) - ); - $sale->user_ref = $user_ref = "someCustomVariable123"; - $sale->setTrack1Data('%B4111111111111111^CARDUSER/JOHN^1803101000000000020000831000000?'); - $response = $sale->authorizeAndCapture(); - - - $this->assertTrue($response->approved); - $this->assertEquals('1.0',$response->version); - $this->assertEquals('1',$response->response_code); - $this->assertEquals('1',$response->response_reason_code); - $this->assertEquals('(TESTMODE) This transaction has been approved.',$response->response_reason_text); - $this->assertEquals('000000',$response->authorization_code); - $this->assertEquals('P',$response->avs_code); - $this->assertEquals('',$response->card_code_response); - $this->assertEquals('0',$response->transaction_id); - $this->assertStringMatchesFormat('%x',$response->md5_hash); - $this->assertEquals($user_ref, $response->user_ref); - $this->assertEquals('XXXX1111',$response->card_num); - $this->assertEquals('Visa',$response->card_type); - - - } - - public function testXmlResponse() - { - $sale = new AuthorizeNetCP(CP_API_LOGIN_ID, CP_TRANSACTION_KEY); - $sale->setFields( - array( - 'amount' => rand(1, 1000), - 'device_type' => '4', - 'response_format' => '0', - ) - ); - $sale->user_ref = $user_ref = "dummyvalue323"; - $sale->setTrack1Data('%B4111111111111111^CARDUSER/JOHN^1803101000000000020000831000000?'); - $response = $sale->authorizeAndCapture(); - - - $this->assertTrue($response->approved); - $this->assertEquals('1.0',$response->version); - $this->assertEquals('1',$response->response_code); - $this->assertEquals('1',$response->response_reason_code); - $this->assertEquals('This transaction has been approved.',$response->response_reason_text); - $this->assertEquals('000000',$response->authorization_code); - $this->assertEquals('P',$response->avs_code); - $this->assertEquals('',$response->card_code_response); - $this->assertEquals('0',$response->transaction_id); - $this->assertStringMatchesFormat('%x',$response->md5_hash); - $this->assertEquals($user_ref, $response->user_ref); - $this->assertEquals('XXXX1111',$response->card_num); - $this->assertEquals('Visa',$response->card_type); - - - } - - public function testXmlResponseFailure() - { - $sale = new AuthorizeNetCP(CP_API_LOGIN_ID, CP_TRANSACTION_KEY); - $sale->setFields( - array( - 'amount' => rand(1, 1000), - 'device_type' => '4', - 'response_format' => '0', - ) - ); - $sale->user_ref = $user_ref = "dummyvalue323"; - $sale->setTrack1Data('%B4111111111111^CARDUSER/JOHN^1803101000000000020000831000000?'); - $response = $sale->authorizeAndCapture(); - - - $this->assertTrue($response->error); - $this->assertEquals('1.0',$response->version); - $this->assertEquals('3',$response->response_code); - $this->assertEquals('6',$response->response_reason_code); - $this->assertEquals('The credit card number is invalid.',$response->response_reason_text); - $this->assertEquals('000000',$response->authorization_code); - $this->assertEquals('P',$response->avs_code); - $this->assertEquals('',$response->card_code_response); - $this->assertEquals('0',$response->transaction_id); - $this->assertStringMatchesFormat('%x',$response->md5_hash); - $this->assertEquals($user_ref, $response->user_ref); - $this->assertEquals('XXXX1111',$response->card_num); - - - } - - -} \ No newline at end of file diff --git a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/AuthorizeNetDPM_Test.php b/lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/AuthorizeNetDPM_Test.php deleted file mode 100755 index 78b7e5a..0000000 --- a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/AuthorizeNetDPM_Test.php +++ /dev/null @@ -1,25 +0,0 @@ -assertEquals("db88bbebb8f699acdbe70daad897a68a",AuthorizeNetDPM::getFingerprint("123","123","123","123","123")); - } - - public function testGetCreditCardForm() - { - $fp_sequence = "12345"; - $this->assertContains('',AuthorizeNetDPM::getCreditCardForm('2', $fp_sequence, 'ht', '2', '1', true)); - } - - public function testRelayResponseUrl() - { - $return_url = 'http://yourdomain.com'; - - $this->assertContains('window.location="'.$return_url.'";', AuthorizeNetDPM::getRelayResponseSnippet($return_url)); - } - -} \ No newline at end of file diff --git a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/AuthorizeNetSIM_Test.php b/lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/AuthorizeNetSIM_Test.php deleted file mode 100755 index 62ef5a3..0000000 --- a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/AuthorizeNetSIM_Test.php +++ /dev/null @@ -1,56 +0,0 @@ -assertEquals("8FC33C32ABB3EDD8BBC4BE3E904CB47E",$message->generateHash()); - } - - public function testAmount() - { - $_POST['x_amount'] = "4.12"; - $_POST['x_response_code'] = "1"; - $message = new AuthorizeNetSIM("528udYYwz","test"); - $this->assertEquals("4.12",$message->amount); - $this->assertTrue($message->approved); - } - - public function testIsAuthNet() - { - $_POST['x_amount'] = "4.12"; - $_POST['x_trans_id'] = "123"; - $_POST['x_MD5_Hash'] = "8FC33C32ABB3EDD8BBC4BE3E904CB47E"; - $message = new AuthorizeNetSIM("528udYYwz","test"); - $this->assertTrue($message->isAuthorizeNet()); - - - $_POST['x_amount'] = "4.12"; - $_POST['x_trans_id'] = "123"; - $_POST['x_MD5_Hash'] = "8FC33C32BB3EDD8BBC4BE3E904CB47E"; - $message = new AuthorizeNetSIM("528udYYwz","test"); - $this->assertFalse($message->isAuthorizeNet()); - } - - public function testIsError() - { - $_POST['x_amount'] = "4.12"; - $_POST['x_response_code'] = "3"; - $_POST['x_ship_to_state'] = "CA"; - $message = new AuthorizeNetSIM("528udYYwz","test"); - $this->assertEquals("3",$message->response_code); - $this->assertTrue($message->error); - $this->assertFalse($message->approved); - $this->assertEquals("CA",$message->ship_to_state); - } - - - - -} \ No newline at end of file diff --git a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/AuthorizeNetSSL_Test.php b/lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/AuthorizeNetSSL_Test.php deleted file mode 100755 index b4191e1..0000000 --- a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/AuthorizeNetSSL_Test.php +++ /dev/null @@ -1,23 +0,0 @@ -&1", $output, $return_value); - $this->assertEquals(0, $return_value); - $this->assertTrue(in_array('Verify return code: 0 (ok)', array_map('trim', $output))); - exec("echo | openssl s_client -connect apitest.authorize.net:443 -showcerts -verify 10 -CAfile ../lib/ssl/cert.pem 2>&1", $output, $return_value); - $this->assertEquals(0, $return_value); - $this->assertTrue(in_array('Verify return code: 0 (ok)', array_map('trim', $output))); - } - - public function testLiveSSLCertIsValid() - { - exec("echo | openssl s_client -connect secure.authorize.net:443 -showcerts -verify 10 -CAfile ../lib/ssl/cert.pem 2>&1", $output, $return_value); - $this->assertEquals(0, $return_value); - $this->assertTrue(in_array('Verify return code: 0 (ok)', array_map('trim', $output))); - exec("echo | openssl s_client -connect api.authorize.net:443 -showcerts -verify 10 -CAfile ../lib/ssl/cert.pem 2>&1", $output, $return_value); - $this->assertEquals(0, $return_value); - $this->assertTrue(in_array('Verify return code: 0 (ok)', array_map('trim', $output))); - } -} diff --git a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/AuthorizeNetTD_Test.php b/lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/AuthorizeNetTD_Test.php deleted file mode 100755 index 4e12168..0000000 --- a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/AuthorizeNetTD_Test.php +++ /dev/null @@ -1,96 +0,0 @@ -getSettledBatchList(); - $this->assertTrue($response->isOk()); - $this->assertEquals("I00001",(string)array_pop($response->xpath("messages/message/code"))); - } - - public function testGetSettledBatchListIncludeStatistics() - { - $request = new AuthorizeNetTD; - $response = $request->getSettledBatchList(true); - $this->assertTrue($response->isOk()); - } - - public function testGetSettledBatchListForMonth() - { - $request = new AuthorizeNetTD; - $response = $request->getSettledBatchListForMonth(); - $this->assertTrue($response->isOk()); - } - - public function testGetTransactionsForDay() - { - $request = new AuthorizeNetTD; - $transactions = $request->getTransactionsForDay(12, 8, 2010); - $this->assertTrue(is_array($transactions)); - } - - public function testGetTransactionList() - { - $request = new AuthorizeNetTD; - $response = $request->getSettledBatchList(); - $this->assertTrue($response->isOk()); - $batches = $response->xpath("batchList/batch"); - $batch_id = (string)$batches[0]->batchId; - $response = $request->getTransactionList($batch_id); - $this->assertTrue($response->isOk()); - } - - public function testGetTransactionDetails() - { - $sale = new AuthorizeNetAIM; - $amount = rand(1, 100); - $response = $sale->authorizeAndCapture($amount, '4012888818888', '04/17'); - $this->assertTrue($response->approved); - - $transId = $response->transaction_id; - - $request = new AuthorizeNetTD; - $response = $request->getTransactionDetails($transId); - $this->assertTrue($response->isOk()); - - $this->assertEquals($transId, (string)$response->xml->transaction->transId); - $this->assertEquals($amount, (string)$response->xml->transaction->authAmount); - $this->assertEquals("Visa", (string)$response->xml->transaction->payment->creditCard->cardType); - - } - - public function testGetUnsettledTransactionList() - { - $sale = new AuthorizeNetAIM; - $amount = rand(1, 100); - $response = $sale->authorizeAndCapture($amount, '4012888818888', '04/17'); - $this->assertTrue($response->approved); - - $request = new AuthorizeNetTD; - $response = $request->getUnsettledTransactionList(); - $this->assertTrue($response->isOk()); - $this->assertTrue($response->xml->transactions->count() >= 1); - } - - public function testGetBatchStatistics() - { - $request = new AuthorizeNetTD; - $response = $request->getSettledBatchList(); - $this->assertTrue($response->isOk()); - $this->assertTrue($response->xml->batchList->count() >= 1); - $batchId = $response->xml->batchList->batch[0]->batchId; - - $request = new AuthorizeNetTD; - $response = $request->getBatchStatistics($batchId); - $this->assertTrue($response->isOk()); - } - - -} \ No newline at end of file diff --git a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/AuthorizeNet_SOAP_Test.php b/lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/AuthorizeNet_SOAP_Test.php deleted file mode 100755 index 20b87d7..0000000 --- a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/AuthorizeNet_SOAP_Test.php +++ /dev/null @@ -1,31 +0,0 @@ -assertTrue($client->saveSoapDocumentation($filepath) > 1); - unlink($filepath); - } - - public function testGetCustomerIds () - { - $client = new AuthorizeNetSOAP; - $result = $client->GetCustomerProfileIds( - array( - 'merchantAuthentication' => array( - 'name' => AUTHORIZENET_API_LOGIN_ID, - 'transactionKey' => AUTHORIZENET_TRANSACTION_KEY, - ), - ) - ); - $customer_ids = $result->GetCustomerProfileIdsResult->ids->long; - $this->assertTrue(is_array($customer_ids)); - } - -} \ No newline at end of file diff --git a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/AuthorizeNet_Test_Config.php b/lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/AuthorizeNet_Test_Config.php deleted file mode 100755 index 1038042..0000000 --- a/lib/paymentProcessors/Authorize.Net/anet_php_sdk/tests/AuthorizeNet_Test_Config.php +++ /dev/null @@ -1,47 +0,0 @@ -

AuthorizeNet_SOAP_

  • Save soap doc
  • Get customer ids

AuthorizeNetAIM_Sandbox_

  • Auth capture
  • Auth capture alternate
  • Auth capture short
  • Auth capture partial
  • Auth capture short no verify
  • Aim response fields
  • Void
  • Void short
  • Auth capture e check sandbox
  • Amex
  • Discover
  • Visa
  • Auth only
  • Auth capture void
  • Advanced a i m
  • Auth capture custom fields
  • Encap character
  • Auth capture set multiple custom fields
  • Invalid merchant credentials
  • Invalid credit card
  • Error
  • Multiple line items
  • All fields long method
  • Response methods
  • Set bad field

AuthorizeNetAIM_Live_

  • Auth capture set e check method
  • Auth capture e check
  • Auth capture live server test request
  • Auth capture live server
  • Invalid credentials

AuthorizeNetARB_

  • All methods
  • Create subscription long
  • Create subscription e check

AuthorizeNetCIM_

  • Delete all customer profiles
  • X path
  • Create customer profile
  • Get customer profile
  • Create customer profile with validation mode
  • Update split tender group
  • All
  • Get customer profile ids

AuthorizeNetCP_

  • Auth capture
  • Auth capture track 1
  • Auth capture track
  • Auth capture track 2 error
  • Response fields
  • Xml response
  • Xml response failure

AuthorizeNetDPM_

  • Generate fingerprint
  • Get credit card form
  • Relay response url

AuthorizeNetSIM_

  • Generate hash
  • Amount
  • Is auth net
  • Is error

AuthorizeNetTD_

  • Get settled batch list
  • Get settled batch list include statistics
  • Get settled batch list for month
  • Get transactions for day
  • Get transaction list
  • Get transaction details
\ No newline at end of file diff --git a/lib/paymentProcessors/Authorize.Net/paymentGateway.php b/lib/paymentProcessors/Authorize.Net/paymentGateway.php deleted file mode 100644 index 37be0cf..0000000 --- a/lib/paymentProcessors/Authorize.Net/paymentGateway.php +++ /dev/null @@ -1,285 +0,0 @@ - - * @license http://www.gaslightmedia.com Gaslightmedia - * @release SVN: $Id: AuthorizeNet.php,v 1.0 2011/01/25 19:31:47 cscott Exp $ - * @link <> - */ -require_once dirname(__FILE__).'/anet_php_sdk/AuthorizeNet.php'; - -/** - * Authorize.net PaymentGateway class - * - * PHP version 5 - * - * @category Event Management Admin Tickets - * @package EventManagement - * @author Chuck Scott - * @license http://www.gaslightmedia.com Gaslightmedia - * @release SVN: $Id: AuthorizeNet.php,v 1.0 2011/01/25 19:31:47 cscott Exp $ - * @link <> - */ - -class PaymentGateway -{ - /** - * account - * - * @var array - * @access public - */ - var $account; - - /** - * Constructor - * - * @param array $account Account information - * - * @access public - * - * Information provided - * - * $account - * login Authorize.net login - * key Authorize.net login key - * test Test mode - * 0 = Production Mode - * 1 = Local Transaction Approval Test - * 2 = Local Transaction Decline Test - * 3 = On-Line Transaction Test - * conf True if Authorize.net should send confirmation E-Mail to customer - * email Merchant E-Mail address to receive notices from Authorize.net for the transaction - * - * Test Account - * login: GLM4AuthNet - * PW: GLm7AuTHnet - * API Access - * API Login ID: 44pvQ8D7d - * Transaction Key: 8rj6ME772K9Pe9pJ - * Secret Question: Simon - * Admin Interface: https://test.authorize.net/ - * - */ - public function __construct($account) - { - $this->account = $account; - } - - /** - * Process a Payment - * - * @param payment Array payment information - * @param contact Array contact information - * - * @access public - * @return array - * - * Information provided - * - * $payment array - * name Name of Venue - * charge Total to be charged - * cctype Card type (not used for Authorize.net) - * ccname Name on card (not used for Authorize.net) - * ccnumb Card number - * ccexp Expiration date (m/y) - * cccode Security code on back of card - * invoice Invoice # is session ID (or some part thereof) - * Max 20 chars, letters and digits only - * Only last 20 chars used if longer - * - * $contact array - * fname Customer first name - * lname Customer last name - * addr1 Address Line 1 - * addr2 Address Line 2 - * city City - * state State - * country Country - * zip ZIP/Postal code - * phone Customer phone number - * email Customer E-Mail address - * - * return array - * status Numeric return status code - * 1 Approved - * 2 Bad data supplied - * 3 Communications failure - * 4 Bad response - * 5 Transaction not valid - * 6 Merchant account problem - * 7 Card declined - * statusText Short name of status - * authCode Authorization code - blank if card not accepted - * description Longer description of result - * - * Authorize.net test card numbers - * American Express 370000000000002 - * Discover 6011000000000012 - * Visa 4007000000027 - * 4012888818888 - * JCB 3088000000000017 - * Diners Club 38000000000006 - * Carte Blanche 38000000000006 - */ - public function processPayment($payment = false, $contact = false) - { - - // Check for required data - if (!is_array($payment) || !is_array($payment)) { - $resp = array( - 'gateway' => 'Authorize.Net', - 'status' => 2, - 'statusText' => 'Bad Data Supplied', - 'authCode' => '', - 'description' => 'The required payment and contact information was not supplied.' - ); - return $resp; - } - - // Create a new sale instance - $sale = new AuthorizeNetAIM($this->account['login'], $this->account['key']); - $sale->setSandbox(false); - - // Check for local tests that don't require communication with Authorize.net - switch ($this->account['test']) { - - // Local Test - case 1: - // Always return a card approval - $resp = array( - 'gateway' => 'Authorize.Net', - 'status' => 1, - 'statusText' => 'Card Approved', - 'authCode' => '000000', - 'description' => '(TESTMODE) Local Test - Card Approved' - ); - return $resp; - break; - - // Fail Test - case 2: - $resp = array( - 'gateway' => 'Authorize.Net', - 'status' => 7, - 'statusText' => 'Card Declined', - 'authCode' => '', - 'description' => '(TESTMODE) Local Test - Card Declined' - ); - return $resp; - break; - - // Online Test - case 3: - // Use the Authorize.net test sandbox - $sale->setSandbox(true); - $sale->test_request = true; - break; - - // Production Mode - case 0: - - break; - } - - // Provide transaction information - Might want to validate this better some day - $sale->amount = $payment['charge']; - $sale->card_num = $payment['ccnumb']; - $sale->card_code = $payment['cccode']; - $sale->exp_date = $payment['ccexp']; - $sale->first_name = $contact['fname']; - $sale->last_name = $contact['lname']; - $sale->address = $contact['addr1'].($contact['addr2']!=''?', '.$contact['addr2']:''); - $sale->city = $contact['city']; - $sale->state = $contact['state']; - $sale->zip = $contact['zip']; - $sale->country = $contact['country']; - $sale->invoice_num = substr($payment['invoice'], -20); // Only use last 20 chars - $sale->description = $payment['name'].' - Event Tickets'; - $sale->email = $contact['email']; - $sale->email_customer = $this->account['conf']; - $sale->phone = $contact['phone']; - - // Submit the transaction - $response = $sale->authorizeAndCapture(); - - /* - * Check returned status code - * Possible Authorize.net status codes - * 1 = approved - * 2 = declined - * 3 = error - * 4 = held for review) - * - */ - - // Compile text and numeric response string to use for certain types of failures - $respDescr = $response->response_reason_text.' ' - .'('.$response->response_code - .','.$response->response_subcode - .','.$response->response_reason_code - .')'; - - // Determine response method - switch ($response->response_code) { - case 1: - $resp = array( - 'gateway' => 'Authorize.Net', - 'status' => 1, - 'statusText' => 'Card Approved', - 'authCode' => $response->authorization_code, - 'description' => $response->response_reason_text - ); - break; - - case 2: - $resp = array( - 'gateway' => 'Authorize.Net', - 'status' => 7, - 'statusText' => 'Card Declined', - 'authCode' => '', - 'description' => $respDescr - ); - break; - - case 3: - $resp = array( - 'gateway' => 'Authorize.Net', - 'status' => 3, - 'statusText' => 'Transaction Error', - 'authCode' => '', - 'description' => $respDescr - ); - break; - - case 4: - $resp = array( - 'gateway' => 'Authorize.Net', - 'status' => 7, - 'statusText' => 'Held for review', - 'authCode' => '', - 'description' => $response->response_reason_text - ); - break; - - default: - $resp = array( - 'gateway' => 'Authorize.Net', - 'status' => 4, - 'statusText' => 'Bad Response', - 'authCode' => '', - 'description' => $respDescr - ); - break; - - } - - return $resp; - - } - -} diff --git a/lib/paymentProcessors/MerchantSolutions/paymentGateway.php b/lib/paymentProcessors/MerchantSolutions/paymentGateway.php deleted file mode 100644 index 6968fe8..0000000 --- a/lib/paymentProcessors/MerchantSolutions/paymentGateway.php +++ /dev/null @@ -1,349 +0,0 @@ - - * @license http://www.gaslightmedia.com Gaslightmedia - * @release SVN: $Id: classes/paymentProcessors/MerchantSolutions.php,v 1.0 2011/01/25 19:31:47 cscott Exp $ - * @link <> - */ - -/** - * MerchantSolutions PaymentGateway class - * - * PHP version 5 - * - * @category Event Management Admin Tickets - * @package EventManagement - * @author Chuck Scott - * @license http://www.gaslightmedia.com Gaslightmedia - * @release SVN: $Id: classes/paymentProcessors/MerchantSolutions.php,v 1.0 2011/01/25 19:31:47 cscott Exp $ - * @link <> - */ - -define( "MS_WSDL", "https://trans.merchantsolution.com/Web/services/TransactionService?wsdl" ); - -/** - * Merchant Solutions Payment Gateway class - * - * PHP version 5 - */ - -class PaymentGateway -{ - /** - * Transaction Result - * - * @var $result - * @access public - */ - public $result = false; - /** - * Raw response data - * - * @var $response - * @access public - */ - public $response = false; - /** - * XML Soap Client Object - * - * @var $client - * @access public - */ - public $client; - /** - * Request Object - * - * @var $request - * @access public - */ - public $request; - - /** - * Constructor - * - * @param array $account Account information - * - * @return boolean Returns value of $success parameter - * @access public - * - * $account - * acctid MerchantSolutions account ID - Use "TEST0" for texting - * merchantpin MerchantSolutions account PIN - Login to Merchant center, then "FRISK(TM) Management" and "Configure Options" - * test Test mode - * 0 = Production Mode - * 1 = Local Transaction Approval Test - * 2 = Local Transaction Decline Test - * 3 = On-Line Transaction Test - * conf (not used for Merchant Solutions) - * email Merchant E-Mail address to receive notices from Merchant Solutions for the transaction - * - * Test Merchant Account - * AcctID: MSDMO - * Userid: Cscott - * Password: Glm3Merch#Sol - * MerchantPin: BVR0V3462V5GmZK03MXtWE5u9HeUJX62 - * - */ - public function __construct($account) - { - - // Setup request object - $this->request = (object) array( - 'acctid' => false, - 'merchantpin' => false, - 'amount' => false, - 'ccnum' => false, - 'expmon' => false, - 'expyear' => false, - 'ccname' => false, - 'cardpresent' => 0, - 'cardreaderpresent' => 0, - 'cvv2' => false, - 'accttype' => 1, - 'profileactiontype' => 2, - 'manualrecurring' => 0, - 'avs_override' => 0, - 'cvv2_override' => 0, - 'loadbalance_override' => 0, - 'duplicate_override' => 0, - 'accountlookupflag' => 0, - 'billaddress' => (object) array( - 'addr1' => '', - 'addr2' => '', - 'city' => '', - 'state' => '', - 'zip' => '', - 'country' => '' - ) - ); - - $this->account = $account; - $this->request->acctid = $account['acctid']; - $this->request->merchantpin = $account['merchantpin']; - - // Test to see if soap support has been installed - if (!extension_loaded('soap')) { - trigger_error('*** PHP SOAP not installed and required by MerchantSolutions payment gateway! ***', E_USER_ERROR); - } - - // Setup options related to doing the SOAP calls - ini_set('soap.wsdl_cache_enabled', 1); - use_soap_error_handler(false); - $soapOptions = array( - "exceptions" => 1, - 'connection_timeout' => 10 - ); - - // Setup SOAP client and get WSDL for gateway - try { - - // XDebug prevents catching fatal errors with the Soap calls - if (function_exists('xdebug_disable')) { - xdebug_disable(); - } - - // Create new soap client instance - $this->client = @new SoapClient(MS_WSDL, $soapOptions); - - // If XDebug was dissabled, re-enable it - if (function_exists('xdebug_enable')) { - xdebug_enable(); - } - - // Indicate setup OK - return true; - - } catch (SoapFault $exception) { - - return false; - } - - return false; - } - - /** - * Process a Payment - * - * @param payment Array payment information - * @param contact Array contact information - * - * @access public - * @return array - * - * Information provided - * - * $payment array - * name Name of Venue - * charge Total to be charged - * cctype Card type - * ccname Name on card - * ccnumb Card number - * ccexp Expiration date (m/y) - * cccode Security code on back of card - * invoice Invoice # is session ID (or some part thereof) - * - * $contact array - * fname Customer first name - * lname Customer last name - * addr1 Address Line 1 - * addr2 Address Line 2 - * city City - * state State - * country Country - * zip ZIP/Postal code - * phone Customer phone number - * email Customer E-Mail address - * - * return array - * status Numeric return status code - * 1 Approved - * 2 Bad data supplied - * 3 Communications failure - * 4 Bad response - * 5 Transaction not valid - * 6 Merchant account problem - * 7 Card declined - * statusText Short name of status - * authCode Authorization code - blank if card not accepted - * description Longer description of result - * - * - */ - public function processPayment($payment = false, $contact = false) - { - - // Set data - $this->request->amount = $payment['charge']; - $this->request->ccnum = $payment['ccnumb']; - $exp = explode('/', $payment['ccexp']); - $this->request->expmon = $exp[0]; - $this->request->expyear = $exp[1]; - $this->request->ccname = $payment['ccname']; - $this->request->cvv2 = $payment['cccode']; - $this->request->memo = $payment['name'].' - Event Tickets'; - $this->request->billaddress->addr1 = $contact['addr1']; - $this->request->billaddress->addr2 = $contact['addr2']; - $this->request->billaddress->city = $contact['city']; - $this->request->billaddress->state = $contact['state']; - $this->request->billaddress->zip = $contact['zip']; - $this->request->billaddress->addr1 = $contact['country']; - $this->request->phone = $contact['phone']; - $this->request->email = $contact['email']; - $this->request->merchantordernumber = substr($payment['invoice'], -20); - - // Check for local tests that don't require communication with Authorize.net - switch ($this->account['test']) { - - // Local Test - case 1: - // Always return a card approval - $resp = array( - 'gateway' => 'MerchantSolutions', - 'status' => 1, - 'statusText' => 'Card Approved', - 'authCode' => '000000', - 'description' => '(TESTMODE) Local Test - Card Approved' - ); - return $resp; - break; - - // Fail Test - case 2: - $resp = array( - 'gateway' => 'MerchantSolutions', - 'status' => 7, - 'statusText' => 'Card Declined', - 'authCode' => '', - 'description' => '(TESTMODE) Local Test - Card Declined' - ); - return $resp; - break; - - // Online Test - case 3: - $this->request->acctid = 'TEST0'; - break; - - // Production Mode - case 0: - break; - } - - - - // Try to process the transaction - try { - - // Deal with XDebug if that's enabled - if (function_exists('xdebug_disable')) { - xdebug_disable(); - } - - // Send request to Merchant Solutions - $this->response = $this->client->processCCSale($this->request); - - // Restore XDebug if that was enabled - if (function_exists('xdebug_enable')) { - xdebug_enable(); - } - - // If approved - if (strtoupper($this->result) == 'APPROVED') { - - $resp = array( - 'gateway' => 'MerchantSolutions', - 'status' => 1, - 'statusText' => 'Card Approved', - 'authCode' => $this->response->authcode, - 'description' => $this->response->status - ); - return $resp; - - // Must be declined - } else { - - $x = explode(":", $this->response->result); - $resp = array( - 'gateway' => 'MerchantSolutions', - 'status' => 7, - 'statusText' => 'Card Declined', - 'authCode' => '', - 'description' => $x[2] - ); - return $resp; - - - } - - // If there's a communications failure - } catch (SoapFault $exception) { - - // Return communications failure - $resp = array( - 'gateway' => 'MerchantSolutions', - 'status' => 3, - 'statusText' => 'Transaction Error', - 'authCode' => '', - 'description' => 'Unable to communicate with credit card processing service.' - ); - return $resp; - - } - - $resp = array( - 'gateway' => 'MerchantSolutions', - 'status' => 4, - 'statusText' => 'Bad Response', - 'authCode' => '', - 'description' => 'Received unknown response from the credit card processing service.' - ); - return $resp; - - } - -} diff --git a/lib/paymentProcessors/PayPal/assets/x-click-but6.gif b/lib/paymentProcessors/PayPal/assets/x-click-but6.gif deleted file mode 100755 index 5da5a520da3967c966b4aa4bd9f0fcdeba928312..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4774 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 diff --git a/lib/paymentProcessors/PayPal/paymentGateway.php b/lib/paymentProcessors/PayPal/paymentGateway.php deleted file mode 100755 index 1161fca..0000000 --- a/lib/paymentProcessors/PayPal/paymentGateway.php +++ /dev/null @@ -1,591 +0,0 @@ - - * @license http://www.gaslightmedia.com Gaslightmedia - * @release SVN: $Id: PayPal.php,v 1.0 2011/01/25 19:31:47 cscott Exp $ - * @link <> - */ - - -/** - * Account Information - * - * Developer account - * PayPal API: https://developer.paypal.com/webapps/developer/ - * E-Mail Address: PayPal@n8dnx.org - * Password: pAy#glM2Pal - * - * PayPal test account - * E-Mail address: paypalAcct2@n8dnx.org - * Password: {std insecure}2 - * - * Test credentials - * Test account: PayPal-facilitator@n8dnx.org - * Endpoint: api.sandbox.paypal.com - * Client ID: AY2IlhCAFCgTaYSgrGfBQ0h5WKKgpLwU-jd2QkKsEbDpGEWtCDZKtp2VLhu1 - * Secret: EOWLsBDrkvdOKUlfhAKJ47aXHBr5xzw-2o7JdLCcLVciGqNGXlhMayP1WKhe - * - * Gaslight Media Live credentials - * Endpoint: api.paypal.com - * Client ID: AZw7VxC8rVTxlKoZVBd60ugOy_9PZWLDazQHF0RlYYWBQbAvkX2MBLy2vfmQ - * Secret: EN3ZaxB4AhZ3J1814MtpfFjUXOqRTR8dto-fhFgk2wuLDTCoPfD0I0Dpbwuu - * - * Standard PayPal buttons and images - * https://ppmts.custhelp.com/app/answers/detail/a_id/632 - * https://www.paypal.com/en_US/i/btn/x-click-but6.gif - */ - -/** - * EventManagementPayPalPaymentProcessing class - * - * PHP version 5 - * - * @category Event Management PayPal Payment Processing - * @package EventManagement - * @author Chuck Scott - * @license http://www.gaslightmedia.com Gaslightmedia - * @release SVN: $Id: PayPal.php,v 1.0 2011/01/25 19:31:47 cscott Exp $ - * @link <> - */ - -class PaymentGateway -{ - /** - * Curl Object - * - * @var $curl - * @access private - */ - private $curl = false; - /** - * Result Status - * - * @var $status - * @access public - */ - public $status = false; - /** - * Access Data - * - * @var $access - * @access private - */ - public $access = false; - /** - * Curl Errors - * - * @var $error - * @access public - */ - public $error = ''; - /** - * PayPal Transaction - * - * @var $trans - * @access public - */ - public $trans; - /** - * Test Mode - Use Sandbox - * - * @var $sandbox - * @access public - */ - public $sandbox = false; - /** - * API URLs - * - * @var $apiURLs - * @access public - */ - public $apiURLs = false; - - /** - * Constructor - * - * To facilitate continuing after a return URL has been followed - * as required to execute or cancel the transaction, the constructor - * may optionally take an "access" object created in a previous - * instance (probably stored in a session or database) to re-establish - * a connection to the same transaction. - * - * @param array $account Account information - * @param object $access Access object from previous instance that should - * be used instead of creating a new one - * @param object $trans Transaction object from a previous instance. - * - * @return boolean Returns value of $success parameter - * @access public - * - * $account - * clientID PayPal Client ID - * secret PayPal Secret - * returnURL URL for PayPal to return to after payment confirmation by customer - * cancelURL URL for PayPal to return to after payment cancelation by customer - * test 1=Local Test (not available for PayPal), 2=Fail test (not available for PayPal), 3=PayPal Sandbox test, 0=Live production - * - */ - public function __construct($account, $access = false, $trans = false) - { - - // URLs to use for requests if we're using the development sandbox - $sandboxURLs = (object) array( - 'access' => 'https://api.sandbox.paypal.com/v1/oauth2/token', - 'process' => 'https://api.sandbox.paypal.com/v1/payments/payment', - 'execute' => 'https://api.sandbox.paypal.com/v1/payments/payment/{transID}/execute/' - ); - - // URLs to use for requests if we're doing live transactions - $liveURLs = (object) array( - 'access' => 'https://api.paypal.com/v1/oauth2/token', - 'process' => 'https://api.paypal.com/v1/payments/payment', - 'execute' => 'https://api.paypal.com/v1/payments/payment/{transID}/execute/' - ); - - - // Save account information - $this->account = $account; - - // Check for various test modes - switch ($this->account['test']) { - - // Local Test - case 1: - break; - - // Fail Test - case 2: - break; - - // Online Test - Use sandbox - case 3: - $this->sandbox = true; - $this->apiURLs = $sandboxURLs; - break; - - // Production Mode - case 0: - $this->sandbox = false; - $this->apiURLs = $liveURLs; - break; - } - - // Was an access object from a previous instance supplied? - if ($access) { - - // Yes, so store that and be done - $this->access = $access; - $this->status = true; - - // If we also have a transaction object - if ($trans) { - - // Store that - $this->trans = $trans; - } - - if (defined('PAYPAL_DEBUG') && PAYPAL_DEBUG) { - echo - '__construct() - Existing Instance

' - .'Account Data:
' - .'

'.print_r($account,1).'
' - .'Access:
' - .'
'.print_r($access,1)."
" - .'Transaction:
' - .'
'.print_r($trans,1)."
"; - } - - - // Otherwise, we need to create an access object - } else { - - // Build request information - $url = $this->apiURLs->access; - $headers = array( - "Accept: application/json", - "Accept-Language: en_US", - "Content-type: application/x-www-form-urlencoded" - ); - $request = 'grant_type=client_credentials'; - - if (defined('PAYPAL_DEBUG') && PAYPAL_DEBUG) { - echo - '__construct() - New Instance

' - .'Account Data:
' - .'

'.print_r($account,1).'
' - .'Headers:
' - .'
'.print_r($headers,1)."
" - .'Request:
' - .'
'.print_r($request,1)."
"; - } - - // Send request - $response = $this->sendRequest($url, $headers, $request); - - // If bad response - if (!$response) { - $this->access = false; - $this->status = false; - return; - } - - // Store our access data - $this->access = $response; - $this->status = true; - - } - - return $this->status; - } - - /** - * Process a Payment - * - * NOTE: For PayPal, this method only requests the payment. - * The user must follow the approval_url supplied by this - * method and confirm the payment. When that is done, PayPal - * will send the user to the approval_url along with a - * PayerID. The executePayment() method must then be called - * to actually execute the payment. - * - * @param array $payment Array payment information - * @param array $contact Array contact information - * - * @access public - * @return array - * - * Information provided - * - * $payment array - * name Name of vendor - required - * charge Total to be charged - required - * cctype Card type - not used - * ccname Name on card - not used - * ccnumb Card number - not used - * ccexp Expiration date (m/y) - not used - * cccode Security code on back of card - not used - * invoice Invoice # is session ID (or some part thereof) - not used - * description Description of transaction - not used - * items Array of items being purchased - required - * Each item has following - * - * quantity A number - Required - * name Name of the item - Required - * price Price of the item (numeric float) - Required - * sku SKU string - Optional - * - * - * $contact array - * fname Customer first name - * lname Customer last name - * addr1 Address Line 1 - * addr2 Address Line 2 - * city City - * state State - * country Country - * zip ZIP/Postal code - * phone Customer phone number - * email Customer E-Mail address - * - * return array - * status Numeric return status code - * 1 Approved - * 2 Bad data supplied - * 3 Communications failure - * 4 Bad response - * 5 Transaction not valid - * 6 Merchant account problem - * 7 Card declined - * statusText Short name of status - * authCode Authorization code - blank if card not accepted - * description Longer description of result - * - * - */ - public function processPayment($payment = false, $contact = false) - { - - // Check for local tests that don't require communication with PayPal - switch ($this->account['test']) { - - // Local Test - case 1: - // invalid type for PayPal class - default to sandbox - case 2: - // invalid type for PayPal class - default to sandbox - case 3: - $this->sandbox = true; - break; - - // Production Mode - case 0: - break; - } - - // Build request information - $url = $this->apiURLs->process; - $headers = array( - "Content-type:application/json", - 'Authorization:'.$this->access->token_type.' '.$this->access->access_token - ); - - // Build payment request - $charge = number_format($payment['charge'], 2, '.', ''); - $requestArray = array( - 'intent' => 'sale', - 'redirect_urls' => array( - 'return_url' => $this->account['returnURL'], - 'cancel_url' => $this->account['cancelURL'] - ), - 'payer' => array( - 'payment_method' => 'paypal' - ), - 'transactions' => array( - 0 => array( - 'amount' => array( - 'total' => $charge, - 'currency' => 'USD' - ), - 'item_list' => array( - 'items' => array( - ) - ) - ) - ) - ); - - // Add item list - if (isset($payment['items']) && count($payment['items']) > 0) { - - foreach ($payment['items'] as $item) { - - $item['name'] = trim($item['name']); - $item['currency'] = 'USD'; - $item['price'] = number_format($item['price'], 2, '.', ''); - - // Check required items - if ( - ($item['quantity']-0) <= 0 || - $item['name'] == '' || - ($item['price']-0) <= 0 - ) { - - if (defined('PAYPAL_DEBUG') && PAYPAL_DEBUG) { - echo "

ERROR: payment item incomplete

".print_r($item,1)."
"; - } - - // Can't proceed, bad data supplied - May need to warn someone of this problem here - $this->trans = false; - $this->status = false; - return; - - } - - // Add this item to the list - $requestArray['transactions'][0]['item_list']['items'][] = $item; - - } - - // If not, then we can't proceed - While not required by PayPal, we are requiring it - } else { - - echo "ERROR: PayPal integration requires an item list but none was provided along with " - ."the payment information to the processPayment() method."; - exit; - - } - - // Convert request to a JSON - $request = json_encode($requestArray, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); - - if (defined('PAYPAL_DEBUG') && PAYPAL_DEBUG) { - echo 'processPayment()

' - .'Headers:
' - .'

'.print_r($headers,1)."
" - .'Request:
' - .'
'.$request.'
'; - } - - // Send request - $response = $this->sendRequest($url, $headers, $request); - - // If bad response - if (!$response) { - $this->trans = false; - $this->status = false; - return; - } - - // Store URLs in a way they can be easily accessed - $response->urls = new stdClass(); - foreach ($response->links as $link) { - $response->urls->{$link->rel} = $link; - } - - // Store our access data - $this->trans = $response; - $this->status = true; - - - return $this->status; - - - } - - /** - * Execute the Payment - * - * This is the final step in PayPal payment approval. - * This method should be called with the PayerID provided - * when the user is sent back to us on a return URL. - * - * Note for this to work, the constructor must have been - * suppled the access and transaction data. - * - * Since the transaction ID is passed to PayPal in the URL - * we're assuming that the response we get back is for the - * correct transaction, so we don't check that. - * - * @param string $payerID PayerID returned by PayPal on the return link - * - * @access public - * @return array - * - * - */ - public function executePayment($payerID) - { - - // Build request information - $url = str_replace('{transID}', $this->trans->id, $this->apiURLs->execute); - - $headers = array( - "Content-type:application/json", - 'Authorization:'.$this->access->token_type.' '.$this->access->access_token - ); - - // Build payment request - $charge = number_format($payment['charge'], 2, '.', ''); - $request = '{"payer_id" : "'.$payerID.'" }'; - - if (defined('PAYPAL_DEBUG') && PAYPAL_DEBUG) { - echo 'executePayment()

' - .'Headers:
' - .'

'.print_r($headers,1)."
" - .'Request:
' - .'
'.$request.'
'; - } - - // Send request - $response = $this->sendRequest($url, $headers, $request); - - // If bad response - if (!$response) { - $this->confirmation = false; - $this->status = false; - return false; - } - - // Save results - $this->confirmation = $response; - - // Check if payment not approved - if ($response->state != 'approved') { - $this->status = false; - return false; - } - - $r = array( - 'status' => 1, - 'statusText' => 'Approved', - 'authCode' => '', - 'description' => 'PayPal approval: ' - .$this->response->payer->payer_info->first_name.' ' - .$this->response->payer->payer_info->last_name.' ' - .$this->response->update_time, - 'payerName' => $this->response->payer->payer_info->first_name.' ' - .$this->response->payer->payer_info->last_name.' ' - - ); - - return $r; - } - - /** - * Make Curl call to place request - * - * @param array $headers Array of headers to include - * @param mixed $request Fields to supply as POST data, either string, array, or json - * - * @access public - * @return array - * - */ - private function sendRequest($url, $headers, $request) - { - - if (defined('PAYPAL_DEBUG') && PAYPAL_DEBUG) { - echo '

sendRequest():
URL = '.$url.'
Headers:

'
-    			.print_r($headers,1).'
Request:
'.print_r($request,1).'
'; - } - - // Init Curl - $this->curl = curl_init(); - - // Curl Parameters - $id_pw = $this->account['clientID'].':'.$this->account['secret']; - $agent = "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"; - - // Set curl options - curl_setopt($this->curl, CURLOPT_URL, $url); - curl_setopt($this->curl, CURLOPT_SSLVERSION,4); - curl_setopt($this->curl, CURLOPT_SSL_VERIFYPEER, FALSE); - curl_setopt($this->curl, CURLOPT_SSL_VERIFYHOST, 2); - curl_setopt($this->curl, CURLOPT_HEADER, false); - curl_setopt($this->curl, CURLOPT_HTTPHEADER, $headers); - curl_setopt($this->curl, CURLOPT_POST, true); - curl_setopt($this->curl, CURLOPT_POSTFIELDS, $request); - curl_setopt($this->curl, CURLOPT_USERPWD, $id_pw); - curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, true); - curl_setopt($this->curl, CURLOPT_USERAGENT, $agent); - - // Place Curl call to get access token - $raw = curl_exec($this->curl); - - // If we received a good response - if (!curl_errno($this->curl)) { - - // Save access data - $response = json_decode($raw); - - if (defined('PAYPAL_DEBUG') && PAYPAL_DEBUG) { - echo 'Response:
' - .'
'.print_r($response,1).'
'; - } - - // Otherwise - } else { - - // Save our error message - $this->error = curl_error($this->curl); - $response = false; - - if (defined('PAYPAL_DEBUG') && PAYPAL_DEBUG) { - echo "Curl Error: ".$this->error."

"; - } - - } - - // Close our curl object - curl_close($this->curl); - - return $response; - - } - -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/.coveralls.yml b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/.coveralls.yml deleted file mode 100644 index 90f55b5..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/.coveralls.yml +++ /dev/null @@ -1,6 +0,0 @@ -# .coveralls.yml configuration - -# for php-coveralls -src_dir: lib -coverage_clover: build/coverage/clover.xml -json_path: build/coverage/coveralls-upload.json \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/.gitignore b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/.gitignore deleted file mode 100644 index e9c37ab..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ - -build -.DS_Store -*.log - -# IDE -.project -.settings -.buildpath -*.bak - -# Composer -vendor -composer.lock diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/.travis.yml b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/.travis.yml deleted file mode 100644 index 91cb229..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/.travis.yml +++ /dev/null @@ -1,15 +0,0 @@ -language: php -php: - - 5.4 - - 5.3 -before_script: - - composer install --dev - - composer update satooshi/php-coveralls --dev -script: - - ant coverage -after_script: - - php vendor/bin/coveralls -v -c .coveralls.yml -notifications: - recipients: - - DL-PP-Platform-PHP-SDK@ebay.com - on_success: change \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/CHANGELOG.md b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/CHANGELOG.md deleted file mode 100644 index 0c6c6f2..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/CHANGELOG.md +++ /dev/null @@ -1,24 +0,0 @@ -CHANGELOG -========= - -V0.7.1 (July 31, 2013) ------------------------ - * Added support for Reauthorization - -V0.7.0 (May 30, 2013) ------------------------ - - * Added support for Auth and Capture APIs - * Types modified to match the API Spec - * Updated SDK to use namespace supported core library - -V0.6.0 (April 26, 2013) ------------------------ - - * Adding support for dynamic configuration of SDK (Upgrading sdk-core-php dependency to V1.4.0) - * Deprecating the setCredential method and changing resource class methods to take an ApiContext argument instead of a OauthTokenCredential argument. - -V0.5.0 (March 07, 2013) ------------------------ - - * Initial Release diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/LICENSE.txt b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/LICENSE.txt deleted file mode 100644 index ad030e5..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/LICENSE.txt +++ /dev/null @@ -1,41 +0,0 @@ -PAYPAL, INC. - -SDK LICENSE - -NOTICE TO USER: PayPal, Inc. is providing the Software and Documentation for use under the terms of this Agreement. Any use, reproduction, modification or distribution of the Software or Documentation, or any derivatives or portions hereof, constitutes your acceptance of this Agreement. - -As used in this Agreement, "PayPal" means PayPal, Inc. "Software" means the software code accompanying this agreement. "Documentation" means the documents, specifications and all other items accompanying this Agreement other than the Software. - -1. LICENSE GRANT Subject to the terms of this Agreement, PayPal hereby grants you a non-exclusive, worldwide, royalty free license to use, reproduce, prepare derivative works from, publicly display, publicly perform, distribute and sublicense the Software for any purpose, provided the copyright notice below appears in a conspicuous location within the source code of the distributed Software and this license is distributed in the supporting documentation of the Software you distribute. Furthermore, you must comply with all third party licenses in order to use the third party software contained in the Software. - -Subject to the terms of this Agreement, PayPal hereby grants you a non-exclusive, worldwide, royalty free license to use, reproduce, publicly display, publicly perform, distribute and sublicense the Documentation for any purpose. You may not modify the Documentation. - -No title to the intellectual property in the Software or Documentation is transferred to you under the terms of this Agreement. You do not acquire any rights to the Software or the Documentation except as expressly set forth in this Agreement. - -If you choose to distribute the Software in a commercial product, you do so with the understanding that you agree to defend, indemnify and hold harmless PayPal and its suppliers against any losses, damages and costs arising from the claims, lawsuits or other legal actions arising out of such distribution. You may distribute the Software in object code form under your own license, provided that your license agreement: - -(a) complies with the terms and conditions of this license agreement; - -(b) effectively disclaims all warranties and conditions, express or implied, on behalf of PayPal; - -(c) effectively excludes all liability for damages on behalf of PayPal; - -(d) states that any provisions that differ from this Agreement are offered by you alone and not PayPal; and - -(e) states that the Software is available from you or PayPal and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange. - -2. DISCLAIMER OF WARRANTY -PAYPAL LICENSES THE SOFTWARE AND DOCUMENTATION TO YOU ONLY ON AN "AS IS" BASIS WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. PAYPAL MAKES NO WARRANTY THAT THE SOFTWARE OR DOCUMENTATION WILL BE ERROR-FREE. Each user of the Software or Documentation is solely responsible for determining the appropriateness of using and distributing the Software and Documentation and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs, or equipment, and unavailability or interruption of operations. Use of the Software and Documentation is made with the understanding that PayPal will not provide you with any technical or customer support or maintenance. Some states or jurisdictions do not allow the exclusion of implied warranties or limitations on how long an implied warranty may last, so the above limitations may not apply to you. To the extent permissible, any implied warranties are limited to ninety (90) days. - - -3. LIMITATION OF LIABILITY -PAYPAL AND ITS SUPPLIERS SHALL NOT BE LIABLE FOR LOSS OR DAMAGE ARISING OUT OF THIS AGREEMENT OR FROM THE USE OF THE SOFTWARE OR DOCUMENTATION. IN NO EVENT WILL PAYPAL OR ITS SUPPLIERS BE LIABLE TO YOU OR ANY THIRD PARTY FOR ANY DIRECT, INDIRECT, CONSEQUENTIAL, INCIDENTAL, OR SPECIAL DAMAGES INCLUDING LOST PROFITS, LOST SAVINGS, COSTS, FEES, OR EXPENSES OF ANY KIND ARISING OUT OF ANY PROVISION OF THIS AGREEMENT OR THE USE OR THE INABILITY TO USE THE SOFTWARE OR DOCUMENTATION, HOWEVER CAUSED AND UNDER ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY OR TORT INCLUDING NEGLIGENCE OR OTHERWISE), EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. PAYPAL'S AGGREGATE LIABILITY AND THAT OF ITS SUPPLIERS UNDER OR IN CONNECTION WITH THIS AGREEMENT SHALL BE LIMITED TO THE AMOUNT PAID BY YOU FOR THE SOFTWARE AND DOCUMENTATION. - -4. TRADEMARK USAGE -PayPal is a trademark PayPal, Inc. in the United States and other countries. Such trademarks may not be used to endorse or promote any product unless expressly permitted under separate agreement with PayPal. - -5. TERM -Your rights under this Agreement shall terminate if you fail to comply with any of the material terms or conditions of this Agreement and do not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all your rights under this Agreement terminate, you agree to cease use and distribution of the Software and Documentation as soon as reasonably practicable. - -6. GOVERNING LAW AND JURISDICTION. This Agreement is governed by the statutes and laws of the State of California, without regard to the conflicts of law principles thereof. If any part of this Agreement is found void and unenforceable, it will not affect the validity of the balance of the Agreement, which shall remain valid and enforceable according to its terms. Any dispute arising out of or related to this Agreement shall be brought in the courts of Santa Clara County, California, USA. - diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/README.md b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/README.md deleted file mode 100644 index 2dcdc6d..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/README.md +++ /dev/null @@ -1,68 +0,0 @@ -REST API SDK for PHP -==================== -[![Build Status](https://travis-ci.org/paypal/rest-api-sdk-php.png?branch=master)](https://travis-ci.org/paypal/rest-api-sdk-php) [![Coverage Status](https://coveralls.io/repos/paypal/rest-api-sdk-php/badge.png?branch=master)](https://coveralls.io/r/paypal/rest-api-sdk-php?branch=master) [![Latest Stable Version](https://poser.pugx.org/paypal/rest-api-sdk-php/v/stable.png)](https://packagist.org/packages/paypal/rest-api-sdk-php) [![Total Downloads](https://poser.pugx.org/paypal/rest-api-sdk-php/downloads.png)](https://packagist.org/packages/paypal/rest-api-sdk-php) - -This repository contains PayPal's PHP SDK and samples for REST API. - - -Prerequisites -------------- - - * PHP 5.3 or above - * curl, json & openssl extensions must be enabled - * composer for running the sample out of the box (See http://getcomposer.org) - - -Running the sample ------------------- - - * Ensure that you have composer installed on your machine. - * Navigate to the samples folder and run 'composer update'. - * Optionally, update the bootstrap.php file with your own client Id and client secret. - * Run any of the samples in the 'samples' folder to see what the APIs can do. - - -Usage ------ - -To write an app that uses the SDK - - * Copy the composer.json file from the sample folder over to your project and run 'composer update' to fetch all -dependencies - * Copy the sample configuration file sdk_config.ini to a location of your choice and let the SDK know your config path using the following define directive - -```php - define('PP_CONFIG_PATH', /path/to/your/sdk_config.ini); -``` - - * Obtain your clientId and client secret from the developer portal. You will use them to create a `OAuthTokenCredential` object. - * Now you are all set to make your first API call. Create a resource object as per your need and call the relevant operation or invoke one of the static methods on your resource class. - -```php - - $apiContext = new ApiContext(new OAuthTokenCredential('', 'setIntent("Sale"); - - ... - - $payment->create($apiContext); - - *OR* - - $payment = Payment::get('payment_id', $apiContext); -``` - -These examples pick the SDK configuration from the sdk_config.ini file. If you do not want to use an ini file or want to pick your configuration dynamically, you can use the `$apiContext->setConfig()` method to pass in the configuration. - - -Contributing ------------- - -More help ---------- - - * [API Reference](https://developer.paypal.com/webapps/developer/docs/api/) - * [Reporting issues / feature requests] (https://github.com/paypal/rest-api-sdk-php/issues) \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/build.xml b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/build.xml deleted file mode 100644 index d4e2ad4..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/build.xml +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - Composer is installed - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/composer.json b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/composer.json deleted file mode 100644 index 20d7592..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/composer.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "paypal/rest-api-sdk-php", - "description": "PayPal's PHP SDK for REST APIs", - "keywords": ["paypal", "payments", "rest", "sdk"], - "type": "library", - "license": "Apache2", - "homepage": "https://github.com/paypal/rest-api-sdk-php", - "authors": [ - { - "name": "PayPal", - "homepage": "https://github.com/paypal/rest-api-sdk-php/contributors" - } - ], - "require": { - "php": ">=5.3.0", - "ext-curl": "*", - "ext-json": "*", - "paypal/sdk-core-php": "2.4.*" - }, - "require-dev": { - "phpunit/phpunit": "3.7.*", - "satooshi/php-coveralls": "dev-master" - }, - "autoload": { - "psr-0": { - "PayPal": "lib/" - } - } -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Address.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Address.php deleted file mode 100644 index fa9300e..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Address.php +++ /dev/null @@ -1,167 +0,0 @@ -line1 = $line1; - return $this; - } - - /** - * Line 1 of the Address (eg. number, street, etc). - * @return string - */ - public function getLine1() { - return $this->line1; - } - - - /** - * Optional line 2 of the Address (eg. suite, apt #, etc.). - * @param string $line2 - */ - public function setLine2($line2) { - $this->line2 = $line2; - return $this; - } - - /** - * Optional line 2 of the Address (eg. suite, apt #, etc.). - * @return string - */ - public function getLine2() { - return $this->line2; - } - - - /** - * City name. - * @param string $city - */ - public function setCity($city) { - $this->city = $city; - return $this; - } - - /** - * City name. - * @return string - */ - public function getCity() { - return $this->city; - } - - - /** - * 2 letter country code. - * @param string $country_code - */ - public function setCountryCode($country_code) { - $this->country_code = $country_code; - return $this; - } - - /** - * 2 letter country code. - * @return string - */ - public function getCountryCode() { - return $this->country_code; - } - - /** - * 2 letter country code. - * @param string $country_code - * @deprecated. Instead use setCountryCode - */ - public function setCountry_code($country_code) { - $this->country_code = $country_code; - return $this; - } - /** - * 2 letter country code. - * @return string - * @deprecated. Instead use getCountryCode - */ - public function getCountry_code() { - return $this->country_code; - } - - /** - * Zip code or equivalent is usually required for countries that have them. For list of countries that do not have postal codes please refer to http://en.wikipedia.org/wiki/Postal_code. - * @param string $postal_code - */ - public function setPostalCode($postal_code) { - $this->postal_code = $postal_code; - return $this; - } - - /** - * Zip code or equivalent is usually required for countries that have them. For list of countries that do not have postal codes please refer to http://en.wikipedia.org/wiki/Postal_code. - * @return string - */ - public function getPostalCode() { - return $this->postal_code; - } - - /** - * Zip code or equivalent is usually required for countries that have them. For list of countries that do not have postal codes please refer to http://en.wikipedia.org/wiki/Postal_code. - * @param string $postal_code - * @deprecated. Instead use setPostalCode - */ - public function setPostal_code($postal_code) { - $this->postal_code = $postal_code; - return $this; - } - /** - * Zip code or equivalent is usually required for countries that have them. For list of countries that do not have postal codes please refer to http://en.wikipedia.org/wiki/Postal_code. - * @return string - * @deprecated. Instead use getPostalCode - */ - public function getPostal_code() { - return $this->postal_code; - } - - /** - * 2 letter code for US states, and the equivalent for other countries. - * @param string $state - */ - public function setState($state) { - $this->state = $state; - return $this; - } - - /** - * 2 letter code for US states, and the equivalent for other countries. - * @return string - */ - public function getState() { - return $this->state; - } - - - /** - * Phone number in E.123 format. - * @param string $phone - */ - public function setPhone($phone) { - $this->phone = $phone; - return $this; - } - - /** - * Phone number in E.123 format. - * @return string - */ - public function getPhone() { - return $this->phone; - } - - -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Amount.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Amount.php deleted file mode 100644 index 8c7cfe2..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Amount.php +++ /dev/null @@ -1,61 +0,0 @@ -currency = $currency; - return $this; - } - - /** - * 3 letter currency code - * @return string - */ - public function getCurrency() { - return $this->currency; - } - - - /** - * Total amount charged from the Payer account (or card) to Payee. In case of a refund, this is the refunded amount to the original Payer from Payee account. - * @param string $total - */ - public function setTotal($total) { - $this->total = $total; - return $this; - } - - /** - * Total amount charged from the Payer account (or card) to Payee. In case of a refund, this is the refunded amount to the original Payer from Payee account. - * @return string - */ - public function getTotal() { - return $this->total; - } - - - /** - * Additional details of the payment amount. - * @param PayPal\Api\Details $details - */ - public function setDetails($details) { - $this->details = $details; - return $this; - } - - /** - * Additional details of the payment amount. - * @return PayPal\Api\Details - */ - public function getDetails() { - return $this->details; - } - - -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Authorization.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Authorization.php deleted file mode 100644 index 9fc4b6d..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Authorization.php +++ /dev/null @@ -1,299 +0,0 @@ -id = $id; - return $this; - } - - /** - * Identifier of the authorization transaction. - * @return string - */ - public function getId() { - return $this->id; - } - - - /** - * Time the resource was created. - * @param string $create_time - */ - public function setCreateTime($create_time) { - $this->create_time = $create_time; - return $this; - } - - /** - * Time the resource was created. - * @return string - */ - public function getCreateTime() { - return $this->create_time; - } - - /** - * Time the resource was created. - * @param string $create_time - * @deprecated. Instead use setCreateTime - */ - public function setCreate_time($create_time) { - $this->create_time = $create_time; - return $this; - } - /** - * Time the resource was created. - * @return string - * @deprecated. Instead use getCreateTime - */ - public function getCreate_time() { - return $this->create_time; - } - - /** - * Time the resource was last updated. - * @param string $update_time - */ - public function setUpdateTime($update_time) { - $this->update_time = $update_time; - return $this; - } - - /** - * Time the resource was last updated. - * @return string - */ - public function getUpdateTime() { - return $this->update_time; - } - - /** - * Time the resource was last updated. - * @param string $update_time - * @deprecated. Instead use setUpdateTime - */ - public function setUpdate_time($update_time) { - $this->update_time = $update_time; - return $this; - } - /** - * Time the resource was last updated. - * @return string - * @deprecated. Instead use getUpdateTime - */ - public function getUpdate_time() { - return $this->update_time; - } - - /** - * Amount being authorized for. - * @param PayPal\Api\Amount $amount - */ - public function setAmount($amount) { - $this->amount = $amount; - return $this; - } - - /** - * Amount being authorized for. - * @return PayPal\Api\Amount - */ - public function getAmount() { - return $this->amount; - } - - - /** - * State of the authorization transaction. - * @param string $state - */ - public function setState($state) { - $this->state = $state; - return $this; - } - - /** - * State of the authorization transaction. - * @return string - */ - public function getState() { - return $this->state; - } - - - /** - * ID of the Payment resource that this transaction is based on. - * @param string $parent_payment - */ - public function setParentPayment($parent_payment) { - $this->parent_payment = $parent_payment; - return $this; - } - - /** - * ID of the Payment resource that this transaction is based on. - * @return string - */ - public function getParentPayment() { - return $this->parent_payment; - } - - /** - * ID of the Payment resource that this transaction is based on. - * @param string $parent_payment - * @deprecated. Instead use setParentPayment - */ - public function setParent_payment($parent_payment) { - $this->parent_payment = $parent_payment; - return $this; - } - /** - * ID of the Payment resource that this transaction is based on. - * @return string - * @deprecated. Instead use getParentPayment - */ - public function getParent_payment() { - return $this->parent_payment; - } - - /** - * Date/Time until which funds may be captured against this resource. - * @param string $valid_until - */ - public function setValidUntil($valid_until) { - $this->valid_until = $valid_until; - return $this; - } - - /** - * Date/Time until which funds may be captured against this resource. - * @return string - */ - public function getValidUntil() { - return $this->valid_until; - } - - /** - * Date/Time until which funds may be captured against this resource. - * @param string $valid_until - * @deprecated. Instead use setValidUntil - */ - public function setValid_until($valid_until) { - $this->valid_until = $valid_until; - return $this; - } - /** - * Date/Time until which funds may be captured against this resource. - * @return string - * @deprecated. Instead use getValidUntil - */ - public function getValid_until() { - return $this->valid_until; - } - - /** - * - * @array - * @param PayPal\Api\Links $links - */ - public function setLinks($links) { - $this->links = $links; - return $this; - } - - /** - * - * @return PayPal\Api\Links - */ - public function getLinks() { - return $this->links; - } - - - - public static function get($authorizationId, $apiContext = null) { - if (($authorizationId == null) || (strlen($authorizationId) <= 0)) { - throw new \InvalidArgumentException("authorizationId cannot be null or empty"); - } - $payLoad = ""; - if ($apiContext == null) { - $apiContext = new ApiContext(self::$credential); - } - $call = new PPRestCall($apiContext); - $json = $call->execute(array('PayPal\Rest\RestHandler'), "/v1/payments/authorization/$authorizationId", "GET", $payLoad); - $ret = new Authorization(); - $ret->fromJson($json); - return $ret; - } - - public function capture($capture, $apiContext = null) { - if ($this->getId() == null) { - throw new \InvalidArgumentException("Id cannot be null"); - } - if (($capture == null)) { - throw new \InvalidArgumentException("capture cannot be null or empty"); - } - $payLoad = $capture->toJSON(); - if ($apiContext == null) { - $apiContext = new ApiContext(self::$credential); - } - $call = new PPRestCall($apiContext); - $json = $call->execute(array('PayPal\Rest\RestHandler'), "/v1/payments/authorization/{$this->getId()}/capture", "POST", $payLoad); - $ret = new Capture(); - $ret->fromJson($json); - return $ret; - } - - public function void($apiContext = null) { - if ($this->getId() == null) { - throw new \InvalidArgumentException("Id cannot be null"); - } - $payLoad = ""; - if ($apiContext == null) { - $apiContext = new ApiContext(self::$credential); - } - $call = new PPRestCall($apiContext); - $json = $call->execute(array('PayPal\Rest\RestHandler'), "/v1/payments/authorization/{$this->getId()}/void", "POST", $payLoad); - $ret = new Authorization(); - $ret->fromJson($json); - return $ret; - } - - public function reauthorize($apiContext = null) { - if ($this->getId() == null) { - throw new \InvalidArgumentException("Id cannot be null"); - } - $payLoad = $this->toJSON(); - if ($apiContext == null) { - $apiContext = new ApiContext(self::$credential); - } - $call = new PPRestCall($apiContext); - $json = $call->execute(array('PayPal\Rest\RestHandler'), "/v1/payments/authorization/{$this->getId()}/reauthorize", "POST", $payLoad); - $this->fromJson($json); - return $this; - } -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Capture.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Capture.php deleted file mode 100644 index 773f952..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Capture.php +++ /dev/null @@ -1,270 +0,0 @@ -id = $id; - return $this; - } - - /** - * Identifier of the Capture transaction. - * @return string - */ - public function getId() { - return $this->id; - } - - - /** - * Time the resource was created. - * @param string $create_time - */ - public function setCreateTime($create_time) { - $this->create_time = $create_time; - return $this; - } - - /** - * Time the resource was created. - * @return string - */ - public function getCreateTime() { - return $this->create_time; - } - - /** - * Time the resource was created. - * @param string $create_time - * @deprecated. Instead use setCreateTime - */ - public function setCreate_time($create_time) { - $this->create_time = $create_time; - return $this; - } - /** - * Time the resource was created. - * @return string - * @deprecated. Instead use getCreateTime - */ - public function getCreate_time() { - return $this->create_time; - } - - /** - * Time the resource was last updated. - * @param string $update_time - */ - public function setUpdateTime($update_time) { - $this->update_time = $update_time; - return $this; - } - - /** - * Time the resource was last updated. - * @return string - */ - public function getUpdateTime() { - return $this->update_time; - } - - /** - * Time the resource was last updated. - * @param string $update_time - * @deprecated. Instead use setUpdateTime - */ - public function setUpdate_time($update_time) { - $this->update_time = $update_time; - return $this; - } - /** - * Time the resource was last updated. - * @return string - * @deprecated. Instead use getUpdateTime - */ - public function getUpdate_time() { - return $this->update_time; - } - - /** - * Amount being captured. If no amount is specified, amount is used from the authorization being captured. If amount is same as the amount that's authorized for, the state of the authorization changes to captured. If not, the state of the authorization changes to partially_captured. Alternatively, you could indicate a final capture by seting the is_final_capture flag to true. - * @param PayPal\Api\Amount $amount - */ - public function setAmount($amount) { - $this->amount = $amount; - return $this; - } - - /** - * Amount being captured. If no amount is specified, amount is used from the authorization being captured. If amount is same as the amount that's authorized for, the state of the authorization changes to captured. If not, the state of the authorization changes to partially_captured. Alternatively, you could indicate a final capture by seting the is_final_capture flag to true. - * @return PayPal\Api\Amount - */ - public function getAmount() { - return $this->amount; - } - - - /** - * whether this is a final capture for the given authorization or not. If it's final, all the remaining funds held by the authorization, will be released in the funding instrument. - * @param boolean $is_final_capture - */ - public function setIsFinalCapture($is_final_capture) { - $this->is_final_capture = $is_final_capture; - return $this; - } - - /** - * whether this is a final capture for the given authorization or not. If it's final, all the remaining funds held by the authorization, will be released in the funding instrument. - * @return boolean - */ - public function getIsFinalCapture() { - return $this->is_final_capture; - } - - /** - * whether this is a final capture for the given authorization or not. If it's final, all the remaining funds held by the authorization, will be released in the funding instrument. - * @param boolean $is_final_capture - * @deprecated. Instead use setIsFinalCapture - */ - public function setIs_final_capture($is_final_capture) { - $this->is_final_capture = $is_final_capture; - return $this; - } - /** - * whether this is a final capture for the given authorization or not. If it's final, all the remaining funds held by the authorization, will be released in the funding instrument. - * @return boolean - * @deprecated. Instead use getIsFinalCapture - */ - public function getIs_final_capture() { - return $this->is_final_capture; - } - - /** - * State of the capture transaction. - * @param string $state - */ - public function setState($state) { - $this->state = $state; - return $this; - } - - /** - * State of the capture transaction. - * @return string - */ - public function getState() { - return $this->state; - } - - - /** - * ID of the Payment resource that this transaction is based on. - * @param string $parent_payment - */ - public function setParentPayment($parent_payment) { - $this->parent_payment = $parent_payment; - return $this; - } - - /** - * ID of the Payment resource that this transaction is based on. - * @return string - */ - public function getParentPayment() { - return $this->parent_payment; - } - - /** - * ID of the Payment resource that this transaction is based on. - * @param string $parent_payment - * @deprecated. Instead use setParentPayment - */ - public function setParent_payment($parent_payment) { - $this->parent_payment = $parent_payment; - return $this; - } - /** - * ID of the Payment resource that this transaction is based on. - * @return string - * @deprecated. Instead use getParentPayment - */ - public function getParent_payment() { - return $this->parent_payment; - } - - /** - * - * @array - * @param PayPal\Api\Links $links - */ - public function setLinks($links) { - $this->links = $links; - return $this; - } - - /** - * - * @return PayPal\Api\Links - */ - public function getLinks() { - return $this->links; - } - - - - public static function get($captureId, $apiContext = null) { - if (($captureId == null) || (strlen($captureId) <= 0)) { - throw new \InvalidArgumentException("captureId cannot be null or empty"); - } - $payLoad = ""; - if ($apiContext == null) { - $apiContext = new ApiContext(self::$credential); - } - $call = new PPRestCall($apiContext); - $json = $call->execute(array('PayPal\Rest\RestHandler'), "/v1/payments/capture/$captureId", "GET", $payLoad); - $ret = new Capture(); - $ret->fromJson($json); - return $ret; - } - - public function refund($refund, $apiContext = null) { - if ($this->getId() == null) { - throw new \InvalidArgumentException("Id cannot be null"); - } - if (($refund == null)) { - throw new \InvalidArgumentException("refund cannot be null or empty"); - } - $payLoad = $refund->toJSON(); - if ($apiContext == null) { - $apiContext = new ApiContext(self::$credential); - } - $call = new PPRestCall($apiContext); - $json = $call->execute(array('PayPal\Rest\RestHandler'), "/v1/payments/capture/{$this->getId()}/refund", "POST", $payLoad); - $ret = new Refund(); - $ret->fromJson($json); - return $ret; - } -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/CreditCard.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/CreditCard.php deleted file mode 100644 index cd0ee91..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/CreditCard.php +++ /dev/null @@ -1,416 +0,0 @@ -id = $id; - return $this; - } - - /** - * ID of the credit card being saved for later use. - * @return string - */ - public function getId() { - return $this->id; - } - - - /** - * Card number. - * @param string $number - */ - public function setNumber($number) { - $this->number = $number; - return $this; - } - - /** - * Card number. - * @return string - */ - public function getNumber() { - return $this->number; - } - - - /** - * Type of the Card (eg. Visa, Mastercard, etc.). - * @param string $type - */ - public function setType($type) { - $this->type = $type; - return $this; - } - - /** - * Type of the Card (eg. Visa, Mastercard, etc.). - * @return string - */ - public function getType() { - return $this->type; - } - - - /** - * card expiry month with value 1 - 12. - * @param integer $expire_month - */ - public function setExpireMonth($expire_month) { - $this->expire_month = $expire_month; - return $this; - } - - /** - * card expiry month with value 1 - 12. - * @return integer - */ - public function getExpireMonth() { - return $this->expire_month; - } - - /** - * card expiry month with value 1 - 12. - * @param integer $expire_month - * @deprecated. Instead use setExpireMonth - */ - public function setExpire_month($expire_month) { - $this->expire_month = $expire_month; - return $this; - } - /** - * card expiry month with value 1 - 12. - * @return integer - * @deprecated. Instead use getExpireMonth - */ - public function getExpire_month() { - return $this->expire_month; - } - - /** - * 4 digit card expiry year - * @param integer $expire_year - */ - public function setExpireYear($expire_year) { - $this->expire_year = $expire_year; - return $this; - } - - /** - * 4 digit card expiry year - * @return integer - */ - public function getExpireYear() { - return $this->expire_year; - } - - /** - * 4 digit card expiry year - * @param integer $expire_year - * @deprecated. Instead use setExpireYear - */ - public function setExpire_year($expire_year) { - $this->expire_year = $expire_year; - return $this; - } - /** - * 4 digit card expiry year - * @return integer - * @deprecated. Instead use getExpireYear - */ - public function getExpire_year() { - return $this->expire_year; - } - - /** - * Card validation code. Only supported when making a Payment but not when saving a credit card for future use. - * @param string $cvv2 - */ - public function setCvv2($cvv2) { - $this->cvv2 = $cvv2; - return $this; - } - - /** - * Card validation code. Only supported when making a Payment but not when saving a credit card for future use. - * @return string - */ - public function getCvv2() { - return $this->cvv2; - } - - - /** - * Card holder's first name. - * @param string $first_name - */ - public function setFirstName($first_name) { - $this->first_name = $first_name; - return $this; - } - - /** - * Card holder's first name. - * @return string - */ - public function getFirstName() { - return $this->first_name; - } - - /** - * Card holder's first name. - * @param string $first_name - * @deprecated. Instead use setFirstName - */ - public function setFirst_name($first_name) { - $this->first_name = $first_name; - return $this; - } - /** - * Card holder's first name. - * @return string - * @deprecated. Instead use getFirstName - */ - public function getFirst_name() { - return $this->first_name; - } - - /** - * Card holder's last name. - * @param string $last_name - */ - public function setLastName($last_name) { - $this->last_name = $last_name; - return $this; - } - - /** - * Card holder's last name. - * @return string - */ - public function getLastName() { - return $this->last_name; - } - - /** - * Card holder's last name. - * @param string $last_name - * @deprecated. Instead use setLastName - */ - public function setLast_name($last_name) { - $this->last_name = $last_name; - return $this; - } - /** - * Card holder's last name. - * @return string - * @deprecated. Instead use getLastName - */ - public function getLast_name() { - return $this->last_name; - } - - /** - * Billing Address associated with this card. - * @param PayPal\Api\Address $billing_address - */ - public function setBillingAddress($billing_address) { - $this->billing_address = $billing_address; - return $this; - } - - /** - * Billing Address associated with this card. - * @return PayPal\Api\Address - */ - public function getBillingAddress() { - return $this->billing_address; - } - - /** - * Billing Address associated with this card. - * @param PayPal\Api\Address $billing_address - * @deprecated. Instead use setBillingAddress - */ - public function setBilling_address($billing_address) { - $this->billing_address = $billing_address; - return $this; - } - /** - * Billing Address associated with this card. - * @return PayPal\Api\Address - * @deprecated. Instead use getBillingAddress - */ - public function getBilling_address() { - return $this->billing_address; - } - - /** - * A unique identifier of the payer generated and provided by the facilitator. This is required when creating or using a tokenized funding instrument. - * @param string $payer_id - */ - public function setPayerId($payer_id) { - $this->payer_id = $payer_id; - return $this; - } - - /** - * A unique identifier of the payer generated and provided by the facilitator. This is required when creating or using a tokenized funding instrument. - * @return string - */ - public function getPayerId() { - return $this->payer_id; - } - - /** - * A unique identifier of the payer generated and provided by the facilitator. This is required when creating or using a tokenized funding instrument. - * @param string $payer_id - * @deprecated. Instead use setPayerId - */ - public function setPayer_id($payer_id) { - $this->payer_id = $payer_id; - return $this; - } - /** - * A unique identifier of the payer generated and provided by the facilitator. This is required when creating or using a tokenized funding instrument. - * @return string - * @deprecated. Instead use getPayerId - */ - public function getPayer_id() { - return $this->payer_id; - } - - /** - * State of the funding instrument. - * @param string $state - */ - public function setState($state) { - $this->state = $state; - return $this; - } - - /** - * State of the funding instrument. - * @return string - */ - public function getState() { - return $this->state; - } - - - /** - * Date/Time until this resource can be used fund a payment. - * @param string $valid_until - */ - public function setValidUntil($valid_until) { - $this->valid_until = $valid_until; - return $this; - } - - /** - * Date/Time until this resource can be used fund a payment. - * @return string - */ - public function getValidUntil() { - return $this->valid_until; - } - - /** - * Date/Time until this resource can be used fund a payment. - * @param string $valid_until - * @deprecated. Instead use setValidUntil - */ - public function setValid_until($valid_until) { - $this->valid_until = $valid_until; - return $this; - } - /** - * Date/Time until this resource can be used fund a payment. - * @return string - * @deprecated. Instead use getValidUntil - */ - public function getValid_until() { - return $this->valid_until; - } - - /** - * - * @array - * @param PayPal\Api\Links $links - */ - public function setLinks($links) { - $this->links = $links; - return $this; - } - - /** - * - * @return PayPal\Api\Links - */ - public function getLinks() { - return $this->links; - } - - - - public function create($apiContext = null) { - $payLoad = $this->toJSON(); - if ($apiContext == null) { - $apiContext = new ApiContext(self::$credential); - } - $call = new PPRestCall($apiContext); - $json = $call->execute(array('PayPal\Rest\RestHandler'), "/v1/vault/credit-card", "POST", $payLoad); - $this->fromJson($json); - return $this; - } - - public static function get($creditCardId, $apiContext = null) { - if (($creditCardId == null) || (strlen($creditCardId) <= 0)) { - throw new \InvalidArgumentException("creditCardId cannot be null or empty"); - } - $payLoad = ""; - if ($apiContext == null) { - $apiContext = new ApiContext(self::$credential); - } - $call = new PPRestCall($apiContext); - $json = $call->execute(array('PayPal\Rest\RestHandler'), "/v1/vault/credit-card/$creditCardId", "GET", $payLoad); - $ret = new CreditCard(); - $ret->fromJson($json); - return $ret; - } - - public function delete($apiContext = null) { - if ($this->getId() == null) { - throw new \InvalidArgumentException("Id cannot be null"); - } - $payLoad = ""; - if ($apiContext == null) { - $apiContext = new ApiContext(self::$credential); - } - $call = new PPRestCall($apiContext); - $json = $call->execute(array('PayPal\Rest\RestHandler'), "/v1/vault/credit-card/{$this->getId()}", "DELETE", $payLoad); - return true; - } -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/CreditCardHistory.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/CreditCardHistory.php deleted file mode 100644 index 4251e62..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/CreditCardHistory.php +++ /dev/null @@ -1,97 +0,0 @@ -{"credit-cards"} = $credit_cards; - return $this; - } - - /** - * A list of credit card resources - * @return PayPal\Api\CreditCard - */ - public function getCreditCards() { - return $this->{"credit-cards"}; - } - - /** - * A list of credit card resources - * @array - * @param PayPal\Api\CreditCard $credit-cards - * @deprecated. Instead use setCreditCards - */ - public function setCredit_cards($credit_cards) { - $this->{"credit-cards"} = $credit_cards; - return $this; - } - /** - * A list of credit card resources - * @return PayPal\Api\CreditCard - * @deprecated. Instead use getCreditCards - */ - public function getCredit_cards() { - return $this->{"credit-cards"}; - } - - /** - * Number of items returned in each range of results. Note that the last results range could have fewer items than the requested number of items. - * @param integer $count - */ - public function setCount($count) { - $this->count = $count; - return $this; - } - - /** - * Number of items returned in each range of results. Note that the last results range could have fewer items than the requested number of items. - * @return integer - */ - public function getCount() { - return $this->count; - } - - - /** - * Identifier of the next element to get the next range of results. - * @param string $next_id - */ - public function setNextId($next_id) { - $this->next_id = $next_id; - return $this; - } - - /** - * Identifier of the next element to get the next range of results. - * @return string - */ - public function getNextId() { - return $this->next_id; - } - - /** - * Identifier of the next element to get the next range of results. - * @param string $next_id - * @deprecated. Instead use setNextId - */ - public function setNext_id($next_id) { - $this->next_id = $next_id; - return $this; - } - /** - * Identifier of the next element to get the next range of results. - * @return string - * @deprecated. Instead use getNextId - */ - public function getNext_id() { - return $this->next_id; - } - -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/CreditCardToken.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/CreditCardToken.php deleted file mode 100644 index 13430dd..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/CreditCardToken.php +++ /dev/null @@ -1,183 +0,0 @@ -credit_card_id = $credit_card_id; - return $this; - } - - /** - * ID of a previously saved Credit Card resource using /vault/credit-card API. - * @return string - */ - public function getCreditCardId() { - return $this->credit_card_id; - } - - /** - * ID of a previously saved Credit Card resource using /vault/credit-card API. - * @param string $credit_card_id - * @deprecated. Instead use setCreditCardId - */ - public function setCredit_card_id($credit_card_id) { - $this->credit_card_id = $credit_card_id; - return $this; - } - /** - * ID of a previously saved Credit Card resource using /vault/credit-card API. - * @return string - * @deprecated. Instead use getCreditCardId - */ - public function getCredit_card_id() { - return $this->credit_card_id; - } - - /** - * The unique identifier of the payer used when saving this credit card using /vault/credit-card API. - * @param string $payer_id - */ - public function setPayerId($payer_id) { - $this->payer_id = $payer_id; - return $this; - } - - /** - * The unique identifier of the payer used when saving this credit card using /vault/credit-card API. - * @return string - */ - public function getPayerId() { - return $this->payer_id; - } - - /** - * The unique identifier of the payer used when saving this credit card using /vault/credit-card API. - * @param string $payer_id - * @deprecated. Instead use setPayerId - */ - public function setPayer_id($payer_id) { - $this->payer_id = $payer_id; - return $this; - } - /** - * The unique identifier of the payer used when saving this credit card using /vault/credit-card API. - * @return string - * @deprecated. Instead use getPayerId - */ - public function getPayer_id() { - return $this->payer_id; - } - - /** - * Last 4 digits of the card number from the saved card. - * @param string $last4 - */ - public function setLast4($last4) { - $this->last4 = $last4; - return $this; - } - - /** - * Last 4 digits of the card number from the saved card. - * @return string - */ - public function getLast4() { - return $this->last4; - } - - - /** - * Type of the Card (eg. visa, mastercard, etc.) from the saved card. Please note that the values are always in lowercase and not meant to be used directly for display. - * @param string $type - */ - public function setType($type) { - $this->type = $type; - return $this; - } - - /** - * Type of the Card (eg. visa, mastercard, etc.) from the saved card. Please note that the values are always in lowercase and not meant to be used directly for display. - * @return string - */ - public function getType() { - return $this->type; - } - - - /** - * card expiry month from the saved card with value 1 - 12 - * @param integer $expire_month - */ - public function setExpireMonth($expire_month) { - $this->expire_month = $expire_month; - return $this; - } - - /** - * card expiry month from the saved card with value 1 - 12 - * @return integer - */ - public function getExpireMonth() { - return $this->expire_month; - } - - /** - * card expiry month from the saved card with value 1 - 12 - * @param integer $expire_month - * @deprecated. Instead use setExpireMonth - */ - public function setExpire_month($expire_month) { - $this->expire_month = $expire_month; - return $this; - } - /** - * card expiry month from the saved card with value 1 - 12 - * @return integer - * @deprecated. Instead use getExpireMonth - */ - public function getExpire_month() { - return $this->expire_month; - } - - /** - * 4 digit card expiry year from the saved card - * @param integer $expire_year - */ - public function setExpireYear($expire_year) { - $this->expire_year = $expire_year; - return $this; - } - - /** - * 4 digit card expiry year from the saved card - * @return integer - */ - public function getExpireYear() { - return $this->expire_year; - } - - /** - * 4 digit card expiry year from the saved card - * @param integer $expire_year - * @deprecated. Instead use setExpireYear - */ - public function setExpire_year($expire_year) { - $this->expire_year = $expire_year; - return $this; - } - /** - * 4 digit card expiry year from the saved card - * @return integer - * @deprecated. Instead use getExpireYear - */ - public function getExpire_year() { - return $this->expire_year; - } - -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Details.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Details.php deleted file mode 100644 index ab38367..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Details.php +++ /dev/null @@ -1,79 +0,0 @@ -shipping = $shipping; - return $this; - } - - /** - * Amount being charged for shipping. - * @return string - */ - public function getShipping() { - return $this->shipping; - } - - - /** - * Sub-total (amount) of items being paid for. - * @param string $subtotal - */ - public function setSubtotal($subtotal) { - $this->subtotal = $subtotal; - return $this; - } - - /** - * Sub-total (amount) of items being paid for. - * @return string - */ - public function getSubtotal() { - return $this->subtotal; - } - - - /** - * Amount being charged as tax. - * @param string $tax - */ - public function setTax($tax) { - $this->tax = $tax; - return $this; - } - - /** - * Amount being charged as tax. - * @return string - */ - public function getTax() { - return $this->tax; - } - - - /** - * Fee charged by PayPal. In case of a refund, this is the fee amount refunded to the original receipient of the payment. - * @param string $fee - */ - public function setFee($fee) { - $this->fee = $fee; - return $this; - } - - /** - * Fee charged by PayPal. In case of a refund, this is the fee amount refunded to the original receipient of the payment. - * @return string - */ - public function getFee() { - return $this->fee; - } - - -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/FundingInstrument.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/FundingInstrument.php deleted file mode 100644 index 6800675..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/FundingInstrument.php +++ /dev/null @@ -1,77 +0,0 @@ -credit_card = $credit_card; - return $this; - } - - /** - * Credit Card information. - * @return PayPal\Api\CreditCard - */ - public function getCreditCard() { - return $this->credit_card; - } - - /** - * Credit Card information. - * @param PayPal\Api\CreditCard $credit_card - * @deprecated. Instead use setCreditCard - */ - public function setCredit_card($credit_card) { - $this->credit_card = $credit_card; - return $this; - } - /** - * Credit Card information. - * @return PayPal\Api\CreditCard - * @deprecated. Instead use getCreditCard - */ - public function getCredit_card() { - return $this->credit_card; - } - - /** - * Credit Card information. - * @param PayPal\Api\CreditCardToken $credit_card_token - */ - public function setCreditCardToken($credit_card_token) { - $this->credit_card_token = $credit_card_token; - return $this; - } - - /** - * Credit Card information. - * @return PayPal\Api\CreditCardToken - */ - public function getCreditCardToken() { - return $this->credit_card_token; - } - - /** - * Credit Card information. - * @param PayPal\Api\CreditCardToken $credit_card_token - * @deprecated. Instead use setCreditCardToken - */ - public function setCredit_card_token($credit_card_token) { - $this->credit_card_token = $credit_card_token; - return $this; - } - /** - * Credit Card information. - * @return PayPal\Api\CreditCardToken - * @deprecated. Instead use getCreditCardToken - */ - public function getCredit_card_token() { - return $this->credit_card_token; - } - -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/HyperSchema.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/HyperSchema.php deleted file mode 100644 index a09ee92..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/HyperSchema.php +++ /dev/null @@ -1,116 +0,0 @@ -links = $links; - return $this; - } - - /** - * - * @return PayPal\Api\Links - */ - public function getLinks() { - return $this->links; - } - - - /** - * - * @param string $fragmentResolution - */ - public function setFragmentResolution($fragmentResolution) { - $this->fragmentResolution = $fragmentResolution; - return $this; - } - - /** - * - * @return string - */ - public function getFragmentResolution() { - return $this->fragmentResolution; - } - - - /** - * - * @param boolean $readonly - */ - public function setReadonly($readonly) { - $this->readonly = $readonly; - return $this; - } - - /** - * - * @return boolean - */ - public function getReadonly() { - return $this->readonly; - } - - - /** - * - * @param string $contentEncoding - */ - public function setContentEncoding($contentEncoding) { - $this->contentEncoding = $contentEncoding; - return $this; - } - - /** - * - * @return string - */ - public function getContentEncoding() { - return $this->contentEncoding; - } - - - /** - * - * @param string $pathStart - */ - public function setPathStart($pathStart) { - $this->pathStart = $pathStart; - return $this; - } - - /** - * - * @return string - */ - public function getPathStart() { - return $this->pathStart; - } - - - /** - * - * @param string $mediaType - */ - public function setMediaType($mediaType) { - $this->mediaType = $mediaType; - return $this; - } - - /** - * - * @return string - */ - public function getMediaType() { - return $this->mediaType; - } - - -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Item.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Item.php deleted file mode 100644 index 4a40632..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Item.php +++ /dev/null @@ -1,97 +0,0 @@ -quantity = $quantity; - return $this; - } - - /** - * Number of items. - * @return string - */ - public function getQuantity() { - return $this->quantity; - } - - - /** - * Name of the item. - * @param string $name - */ - public function setName($name) { - $this->name = $name; - return $this; - } - - /** - * Name of the item. - * @return string - */ - public function getName() { - return $this->name; - } - - - /** - * Cost of the item. - * @param string $price - */ - public function setPrice($price) { - $this->price = $price; - return $this; - } - - /** - * Cost of the item. - * @return string - */ - public function getPrice() { - return $this->price; - } - - - /** - * 3-letter Currency Code - * @param string $currency - */ - public function setCurrency($currency) { - $this->currency = $currency; - return $this; - } - - /** - * 3-letter Currency Code - * @return string - */ - public function getCurrency() { - return $this->currency; - } - - - /** - * Number or code to identify the item in your catalog/records. - * @param string $sku - */ - public function setSku($sku) { - $this->sku = $sku; - return $this; - } - - /** - * Number or code to identify the item in your catalog/records. - * @return string - */ - public function getSku() { - return $this->sku; - } - - -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/ItemList.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/ItemList.php deleted file mode 100644 index ea38da6..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/ItemList.php +++ /dev/null @@ -1,61 +0,0 @@ -items = $items; - return $this; - } - - /** - * List of items. - * @return PayPal\Api\Item - */ - public function getItems() { - return $this->items; - } - - - /** - * Shipping address. - * @param PayPal\Api\ShippingAddress $shipping_address - */ - public function setShippingAddress($shipping_address) { - $this->shipping_address = $shipping_address; - return $this; - } - - /** - * Shipping address. - * @return PayPal\Api\ShippingAddress - */ - public function getShippingAddress() { - return $this->shipping_address; - } - - /** - * Shipping address. - * @param PayPal\Api\ShippingAddress $shipping_address - * @deprecated. Instead use setShippingAddress - */ - public function setShipping_address($shipping_address) { - $this->shipping_address = $shipping_address; - return $this; - } - /** - * Shipping address. - * @return PayPal\Api\ShippingAddress - * @deprecated. Instead use getShippingAddress - */ - public function getShipping_address() { - return $this->shipping_address; - } - -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Links.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Links.php deleted file mode 100644 index 9cbd85e..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Links.php +++ /dev/null @@ -1,115 +0,0 @@ -href = $href; - return $this; - } - - /** - * - * @return string - */ - public function getHref() { - return $this->href; - } - - - /** - * - * @param string $rel - */ - public function setRel($rel) { - $this->rel = $rel; - return $this; - } - - /** - * - * @return string - */ - public function getRel() { - return $this->rel; - } - - - /** - * - * @param PayPal\Api\HyperSchema $targetSchema - */ - public function setTargetSchema($targetSchema) { - $this->targetSchema = $targetSchema; - return $this; - } - - /** - * - * @return PayPal\Api\HyperSchema - */ - public function getTargetSchema() { - return $this->targetSchema; - } - - - /** - * - * @param string $method - */ - public function setMethod($method) { - $this->method = $method; - return $this; - } - - /** - * - * @return string - */ - public function getMethod() { - return $this->method; - } - - - /** - * - * @param string $enctype - */ - public function setEnctype($enctype) { - $this->enctype = $enctype; - return $this; - } - - /** - * - * @return string - */ - public function getEnctype() { - return $this->enctype; - } - - - /** - * - * @param PayPal\Api\HyperSchema $schema - */ - public function setSchema($schema) { - $this->schema = $schema; - return $this; - } - - /** - * - * @return PayPal\Api\HyperSchema - */ - public function getSchema() { - return $this->schema; - } - - -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Payee.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Payee.php deleted file mode 100644 index d0ccea3..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Payee.php +++ /dev/null @@ -1,78 +0,0 @@ -email = $email; - return $this; - } - - /** - * Email Address associated with the Payee's PayPal Account. If the provided email address is not associated with any PayPal Account, the payee can only receiver PayPal Wallet Payments. Direct Credit Card Payments will be denied due to card compliance requirements. - * @return string - */ - public function getEmail() { - return $this->email; - } - - - /** - * Encrypted PayPal Account identifier for the Payee. - * @param string $merchant_id - */ - public function setMerchantId($merchant_id) { - $this->merchant_id = $merchant_id; - return $this; - } - - /** - * Encrypted PayPal Account identifier for the Payee. - * @return string - */ - public function getMerchantId() { - return $this->merchant_id; - } - - /** - * Encrypted PayPal Account identifier for the Payee. - * @param string $merchant_id - * @deprecated. Instead use setMerchantId - */ - public function setMerchant_id($merchant_id) { - $this->merchant_id = $merchant_id; - return $this; - } - /** - * Encrypted PayPal Account identifier for the Payee. - * @return string - * @deprecated. Instead use getMerchantId - */ - public function getMerchant_id() { - return $this->merchant_id; - } - - /** - * Phone number (in E.123 format) associated with the Payee's PayPal Account. If the provided phont number is not associated with any PayPal Account, the payee can only receiver PayPal Wallet Payments. Direct Credit Card Payments will be denied due to card compliance requirements. - * @param string $phone - */ - public function setPhone($phone) { - $this->phone = $phone; - return $this; - } - - /** - * Phone number (in E.123 format) associated with the Payee's PayPal Account. If the provided phont number is not associated with any PayPal Account, the payee can only receiver PayPal Wallet Payments. Direct Credit Card Payments will be denied due to card compliance requirements. - * @return string - */ - public function getPhone() { - return $this->phone; - } - - -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Payer.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Payer.php deleted file mode 100644 index d21d238..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Payer.php +++ /dev/null @@ -1,114 +0,0 @@ -payment_method = $payment_method; - return $this; - } - - /** - * Payment method being used - PayPal Wallet payment or Direct Credit card. - * @return string - */ - public function getPaymentMethod() { - return $this->payment_method; - } - - /** - * Payment method being used - PayPal Wallet payment or Direct Credit card. - * @param string $payment_method - * @deprecated. Instead use setPaymentMethod - */ - public function setPayment_method($payment_method) { - $this->payment_method = $payment_method; - return $this; - } - /** - * Payment method being used - PayPal Wallet payment or Direct Credit card. - * @return string - * @deprecated. Instead use getPaymentMethod - */ - public function getPayment_method() { - return $this->payment_method; - } - - /** - * List of funding instruments from where the funds of the current payment come from. Typically a credit card. - * @array - * @param PayPal\Api\FundingInstrument $funding_instruments - */ - public function setFundingInstruments($funding_instruments) { - $this->funding_instruments = $funding_instruments; - return $this; - } - - /** - * List of funding instruments from where the funds of the current payment come from. Typically a credit card. - * @return PayPal\Api\FundingInstrument - */ - public function getFundingInstruments() { - return $this->funding_instruments; - } - - /** - * List of funding instruments from where the funds of the current payment come from. Typically a credit card. - * @array - * @param PayPal\Api\FundingInstrument $funding_instruments - * @deprecated. Instead use setFundingInstruments - */ - public function setFunding_instruments($funding_instruments) { - $this->funding_instruments = $funding_instruments; - return $this; - } - /** - * List of funding instruments from where the funds of the current payment come from. Typically a credit card. - * @return PayPal\Api\FundingInstrument - * @deprecated. Instead use getFundingInstruments - */ - public function getFunding_instruments() { - return $this->funding_instruments; - } - - /** - * Information related to the Payer. In case of PayPal Wallet payment, this information will be filled in by PayPal after the user approves the payment using their PayPal Wallet. - * @param PayPal\Api\PayerInfo $payer_info - */ - public function setPayerInfo($payer_info) { - $this->payer_info = $payer_info; - return $this; - } - - /** - * Information related to the Payer. In case of PayPal Wallet payment, this information will be filled in by PayPal after the user approves the payment using their PayPal Wallet. - * @return PayPal\Api\PayerInfo - */ - public function getPayerInfo() { - return $this->payer_info; - } - - /** - * Information related to the Payer. In case of PayPal Wallet payment, this information will be filled in by PayPal after the user approves the payment using their PayPal Wallet. - * @param PayPal\Api\PayerInfo $payer_info - * @deprecated. Instead use setPayerInfo - */ - public function setPayer_info($payer_info) { - $this->payer_info = $payer_info; - return $this; - } - /** - * Information related to the Payer. In case of PayPal Wallet payment, this information will be filled in by PayPal after the user approves the payment using their PayPal Wallet. - * @return PayPal\Api\PayerInfo - * @deprecated. Instead use getPayerInfo - */ - public function getPayer_info() { - return $this->payer_info; - } - -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/PayerInfo.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/PayerInfo.php deleted file mode 100644 index a9ff596..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/PayerInfo.php +++ /dev/null @@ -1,183 +0,0 @@ -email = $email; - return $this; - } - - /** - * Email address representing the Payer. - * @return string - */ - public function getEmail() { - return $this->email; - } - - - /** - * First Name of the Payer from their PayPal Account. - * @param string $first_name - */ - public function setFirstName($first_name) { - $this->first_name = $first_name; - return $this; - } - - /** - * First Name of the Payer from their PayPal Account. - * @return string - */ - public function getFirstName() { - return $this->first_name; - } - - /** - * First Name of the Payer from their PayPal Account. - * @param string $first_name - * @deprecated. Instead use setFirstName - */ - public function setFirst_name($first_name) { - $this->first_name = $first_name; - return $this; - } - /** - * First Name of the Payer from their PayPal Account. - * @return string - * @deprecated. Instead use getFirstName - */ - public function getFirst_name() { - return $this->first_name; - } - - /** - * Last Name of the Payer from their PayPal Account. - * @param string $last_name - */ - public function setLastName($last_name) { - $this->last_name = $last_name; - return $this; - } - - /** - * Last Name of the Payer from their PayPal Account. - * @return string - */ - public function getLastName() { - return $this->last_name; - } - - /** - * Last Name of the Payer from their PayPal Account. - * @param string $last_name - * @deprecated. Instead use setLastName - */ - public function setLast_name($last_name) { - $this->last_name = $last_name; - return $this; - } - /** - * Last Name of the Payer from their PayPal Account. - * @return string - * @deprecated. Instead use getLastName - */ - public function getLast_name() { - return $this->last_name; - } - - /** - * PayPal assigned Payer ID. - * @param string $payer_id - */ - public function setPayerId($payer_id) { - $this->payer_id = $payer_id; - return $this; - } - - /** - * PayPal assigned Payer ID. - * @return string - */ - public function getPayerId() { - return $this->payer_id; - } - - /** - * PayPal assigned Payer ID. - * @param string $payer_id - * @deprecated. Instead use setPayerId - */ - public function setPayer_id($payer_id) { - $this->payer_id = $payer_id; - return $this; - } - /** - * PayPal assigned Payer ID. - * @return string - * @deprecated. Instead use getPayerId - */ - public function getPayer_id() { - return $this->payer_id; - } - - /** - * Phone number representing the Payer. - * @param string $phone - */ - public function setPhone($phone) { - $this->phone = $phone; - return $this; - } - - /** - * Phone number representing the Payer. - * @return string - */ - public function getPhone() { - return $this->phone; - } - - - /** - * Shipping address of the Payer from their PayPal Account. - * @param PayPal\Api\Address $shipping_address - */ - public function setShippingAddress($shipping_address) { - $this->shipping_address = $shipping_address; - return $this; - } - - /** - * Shipping address of the Payer from their PayPal Account. - * @return PayPal\Api\Address - */ - public function getShippingAddress() { - return $this->shipping_address; - } - - /** - * Shipping address of the Payer from their PayPal Account. - * @param PayPal\Api\Address $shipping_address - * @deprecated. Instead use setShippingAddress - */ - public function setShipping_address($shipping_address) { - $this->shipping_address = $shipping_address; - return $this; - } - /** - * Shipping address of the Payer from their PayPal Account. - * @return PayPal\Api\Address - * @deprecated. Instead use getShippingAddress - */ - public function getShipping_address() { - return $this->shipping_address; - } - -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Payment.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Payment.php deleted file mode 100644 index cf223f0..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Payment.php +++ /dev/null @@ -1,299 +0,0 @@ -id = $id; - return $this; - } - - /** - * Identifier of the payment resource created. - * @return string - */ - public function getId() { - return $this->id; - } - - - /** - * Time the resource was created. - * @param string $create_time - */ - public function setCreateTime($create_time) { - $this->create_time = $create_time; - return $this; - } - - /** - * Time the resource was created. - * @return string - */ - public function getCreateTime() { - return $this->create_time; - } - - /** - * Time the resource was created. - * @param string $create_time - * @deprecated. Instead use setCreateTime - */ - public function setCreate_time($create_time) { - $this->create_time = $create_time; - return $this; - } - /** - * Time the resource was created. - * @return string - * @deprecated. Instead use getCreateTime - */ - public function getCreate_time() { - return $this->create_time; - } - - /** - * Time the resource was last updated. - * @param string $update_time - */ - public function setUpdateTime($update_time) { - $this->update_time = $update_time; - return $this; - } - - /** - * Time the resource was last updated. - * @return string - */ - public function getUpdateTime() { - return $this->update_time; - } - - /** - * Time the resource was last updated. - * @param string $update_time - * @deprecated. Instead use setUpdateTime - */ - public function setUpdate_time($update_time) { - $this->update_time = $update_time; - return $this; - } - /** - * Time the resource was last updated. - * @return string - * @deprecated. Instead use getUpdateTime - */ - public function getUpdate_time() { - return $this->update_time; - } - - /** - * Intent of the payment - Sale or Authorization or Order. - * @param string $intent - */ - public function setIntent($intent) { - $this->intent = $intent; - return $this; - } - - /** - * Intent of the payment - Sale or Authorization or Order. - * @return string - */ - public function getIntent() { - return $this->intent; - } - - - /** - * Source of the funds for this payment represented by a PayPal account or a direct credit card. - * @param PayPal\Api\Payer $payer - */ - public function setPayer($payer) { - $this->payer = $payer; - return $this; - } - - /** - * Source of the funds for this payment represented by a PayPal account or a direct credit card. - * @return PayPal\Api\Payer - */ - public function getPayer() { - return $this->payer; - } - - - /** - * A payment can have more than one transaction, with each transaction establishing a contract between the payer and a payee - * @array - * @param PayPal\Api\Transaction $transactions - */ - public function setTransactions($transactions) { - $this->transactions = $transactions; - return $this; - } - - /** - * A payment can have more than one transaction, with each transaction establishing a contract between the payer and a payee - * @return PayPal\Api\Transaction - */ - public function getTransactions() { - return $this->transactions; - } - - - /** - * state of the payment - * @param string $state - */ - public function setState($state) { - $this->state = $state; - return $this; - } - - /** - * state of the payment - * @return string - */ - public function getState() { - return $this->state; - } - - - /** - * Redirect urls required only when using payment_method as PayPal - the only settings supported are return and cancel urls. - * @param PayPal\Api\RedirectUrls $redirect_urls - */ - public function setRedirectUrls($redirect_urls) { - $this->redirect_urls = $redirect_urls; - return $this; - } - - /** - * Redirect urls required only when using payment_method as PayPal - the only settings supported are return and cancel urls. - * @return PayPal\Api\RedirectUrls - */ - public function getRedirectUrls() { - return $this->redirect_urls; - } - - /** - * Redirect urls required only when using payment_method as PayPal - the only settings supported are return and cancel urls. - * @param PayPal\Api\RedirectUrls $redirect_urls - * @deprecated. Instead use setRedirectUrls - */ - public function setRedirect_urls($redirect_urls) { - $this->redirect_urls = $redirect_urls; - return $this; - } - /** - * Redirect urls required only when using payment_method as PayPal - the only settings supported are return and cancel urls. - * @return PayPal\Api\RedirectUrls - * @deprecated. Instead use getRedirectUrls - */ - public function getRedirect_urls() { - return $this->redirect_urls; - } - - /** - * - * @array - * @param PayPal\Api\Links $links - */ - public function setLinks($links) { - $this->links = $links; - return $this; - } - - /** - * - * @return PayPal\Api\Links - */ - public function getLinks() { - return $this->links; - } - - - - public function create($apiContext = null) { - $payLoad = $this->toJSON(); - if ($apiContext == null) { - $apiContext = new ApiContext(self::$credential); - } - $call = new PPRestCall($apiContext); - $json = $call->execute(array('PayPal\Rest\RestHandler'), "/v1/payments/payment", "POST", $payLoad); - $this->fromJson($json); - return $this; - } - - public static function get($paymentId, $apiContext = null) { - if (($paymentId == null) || (strlen($paymentId) <= 0)) { - throw new \InvalidArgumentException("paymentId cannot be null or empty"); - } - $payLoad = ""; - if ($apiContext == null) { - $apiContext = new ApiContext(self::$credential); - } - $call = new PPRestCall($apiContext); - $json = $call->execute(array('PayPal\Rest\RestHandler'), "/v1/payments/payment/$paymentId", "GET", $payLoad); - $ret = new Payment(); - $ret->fromJson($json); - return $ret; - } - - public function execute($paymentExecution, $apiContext = null) { - if ($this->getId() == null) { - throw new \InvalidArgumentException("Id cannot be null"); - } - if (($paymentExecution == null)) { - throw new \InvalidArgumentException("paymentExecution cannot be null or empty"); - } - $payLoad = $paymentExecution->toJSON(); - if ($apiContext == null) { - $apiContext = new ApiContext(self::$credential); - } - $call = new PPRestCall($apiContext); - $json = $call->execute(array('PayPal\Rest\RestHandler'), "/v1/payments/payment/{$this->getId()}/execute", "POST", $payLoad); - $ret = new Payment(); - $ret->fromJson($json); - return $ret; - } - - public static function all($params, $apiContext = null) { - if (($params == null)) { - throw new \InvalidArgumentException("params cannot be null or empty"); - } - $payLoad = ""; - $allowedParams = array('count' => 1, 'start_id' => 1, 'start_index' => 1, 'start_time' => 1, 'end_time' => 1, 'payee_id' => 1, 'sort_by' => 1, 'sort_order' => 1, ); - if ($apiContext == null) { - $apiContext = new ApiContext(self::$credential); - } - $call = new PPRestCall($apiContext); - $json = $call->execute(array('PayPal\Rest\RestHandler'), "/v1/payments/payment?" . http_build_query(array_intersect_key($params, $allowedParams)), "GET", $payLoad); - $ret = new PaymentHistory(); - $ret->fromJson($json); - return $ret; - } -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/PaymentExecution.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/PaymentExecution.php deleted file mode 100644 index b7048eb..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/PaymentExecution.php +++ /dev/null @@ -1,61 +0,0 @@ -payer_id = $payer_id; - return $this; - } - - /** - * PayPal assigned Payer ID returned in the approval return url. - * @return string - */ - public function getPayerId() { - return $this->payer_id; - } - - /** - * PayPal assigned Payer ID returned in the approval return url. - * @param string $payer_id - * @deprecated. Instead use setPayerId - */ - public function setPayer_id($payer_id) { - $this->payer_id = $payer_id; - return $this; - } - /** - * PayPal assigned Payer ID returned in the approval return url. - * @return string - * @deprecated. Instead use getPayerId - */ - public function getPayer_id() { - return $this->payer_id; - } - - /** - * If the amount needs to be updated after obtaining the PayPal Payer info (eg. shipping address), it can be updated using this element. - * @array - * @param PayPal\Api\Transactions $transactions - */ - public function setTransactions($transactions) { - $this->transactions = $transactions; - return $this; - } - - /** - * If the amount needs to be updated after obtaining the PayPal Payer info (eg. shipping address), it can be updated using this element. - * @return PayPal\Api\Transactions - */ - public function getTransactions() { - return $this->transactions; - } - - -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/PaymentHistory.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/PaymentHistory.php deleted file mode 100644 index e9f28af..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/PaymentHistory.php +++ /dev/null @@ -1,79 +0,0 @@ -payments = $payments; - return $this; - } - - /** - * A list of Payment resources - * @return PayPal\Api\Payment - */ - public function getPayments() { - return $this->payments; - } - - - /** - * Number of items returned in each range of results. Note that the last results range could have fewer items than the requested number of items. - * @param integer $count - */ - public function setCount($count) { - $this->count = $count; - return $this; - } - - /** - * Number of items returned in each range of results. Note that the last results range could have fewer items than the requested number of items. - * @return integer - */ - public function getCount() { - return $this->count; - } - - - /** - * Identifier of the next element to get the next range of results. - * @param string $next_id - */ - public function setNextId($next_id) { - $this->next_id = $next_id; - return $this; - } - - /** - * Identifier of the next element to get the next range of results. - * @return string - */ - public function getNextId() { - return $this->next_id; - } - - /** - * Identifier of the next element to get the next range of results. - * @param string $next_id - * @deprecated. Instead use setNextId - */ - public function setNext_id($next_id) { - $this->next_id = $next_id; - return $this; - } - /** - * Identifier of the next element to get the next range of results. - * @return string - * @deprecated. Instead use getNextId - */ - public function getNext_id() { - return $this->next_id; - } - -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/RedirectUrls.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/RedirectUrls.php deleted file mode 100644 index c954b49..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/RedirectUrls.php +++ /dev/null @@ -1,77 +0,0 @@ -return_url = $return_url; - return $this; - } - - /** - * Url where the payer would be redirected to after approving the payment. - * @return string - */ - public function getReturnUrl() { - return $this->return_url; - } - - /** - * Url where the payer would be redirected to after approving the payment. - * @param string $return_url - * @deprecated. Instead use setReturnUrl - */ - public function setReturn_url($return_url) { - $this->return_url = $return_url; - return $this; - } - /** - * Url where the payer would be redirected to after approving the payment. - * @return string - * @deprecated. Instead use getReturnUrl - */ - public function getReturn_url() { - return $this->return_url; - } - - /** - * Url where the payer would be redirected to after canceling the payment. - * @param string $cancel_url - */ - public function setCancelUrl($cancel_url) { - $this->cancel_url = $cancel_url; - return $this; - } - - /** - * Url where the payer would be redirected to after canceling the payment. - * @return string - */ - public function getCancelUrl() { - return $this->cancel_url; - } - - /** - * Url where the payer would be redirected to after canceling the payment. - * @param string $cancel_url - * @deprecated. Instead use setCancelUrl - */ - public function setCancel_url($cancel_url) { - $this->cancel_url = $cancel_url; - return $this; - } - /** - * Url where the payer would be redirected to after canceling the payment. - * @return string - * @deprecated. Instead use getCancelUrl - */ - public function getCancel_url() { - return $this->cancel_url; - } - -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Refund.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Refund.php deleted file mode 100644 index 095200a..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Refund.php +++ /dev/null @@ -1,251 +0,0 @@ -id = $id; - return $this; - } - - /** - * Identifier of the refund transaction. - * @return string - */ - public function getId() { - return $this->id; - } - - - /** - * Time the resource was created. - * @param string $create_time - */ - public function setCreateTime($create_time) { - $this->create_time = $create_time; - return $this; - } - - /** - * Time the resource was created. - * @return string - */ - public function getCreateTime() { - return $this->create_time; - } - - /** - * Time the resource was created. - * @param string $create_time - * @deprecated. Instead use setCreateTime - */ - public function setCreate_time($create_time) { - $this->create_time = $create_time; - return $this; - } - /** - * Time the resource was created. - * @return string - * @deprecated. Instead use getCreateTime - */ - public function getCreate_time() { - return $this->create_time; - } - - /** - * Details including both refunded amount (to Payer) and refunded fee (to Payee).If amount is not specified, it's assumed to be full refund. - * @param PayPal\Api\Amount $amount - */ - public function setAmount($amount) { - $this->amount = $amount; - return $this; - } - - /** - * Details including both refunded amount (to Payer) and refunded fee (to Payee).If amount is not specified, it's assumed to be full refund. - * @return PayPal\Api\Amount - */ - public function getAmount() { - return $this->amount; - } - - - /** - * State of the refund transaction. - * @param string $state - */ - public function setState($state) { - $this->state = $state; - return $this; - } - - /** - * State of the refund transaction. - * @return string - */ - public function getState() { - return $this->state; - } - - - /** - * ID of the Sale transaction being refunded. - * @param string $sale_id - */ - public function setSaleId($sale_id) { - $this->sale_id = $sale_id; - return $this; - } - - /** - * ID of the Sale transaction being refunded. - * @return string - */ - public function getSaleId() { - return $this->sale_id; - } - - /** - * ID of the Sale transaction being refunded. - * @param string $sale_id - * @deprecated. Instead use setSaleId - */ - public function setSale_id($sale_id) { - $this->sale_id = $sale_id; - return $this; - } - /** - * ID of the Sale transaction being refunded. - * @return string - * @deprecated. Instead use getSaleId - */ - public function getSale_id() { - return $this->sale_id; - } - - /** - * ID of the Capture transaction being refunded. - * @param string $capture_id - */ - public function setCaptureId($capture_id) { - $this->capture_id = $capture_id; - return $this; - } - - /** - * ID of the Capture transaction being refunded. - * @return string - */ - public function getCaptureId() { - return $this->capture_id; - } - - /** - * ID of the Capture transaction being refunded. - * @param string $capture_id - * @deprecated. Instead use setCaptureId - */ - public function setCapture_id($capture_id) { - $this->capture_id = $capture_id; - return $this; - } - /** - * ID of the Capture transaction being refunded. - * @return string - * @deprecated. Instead use getCaptureId - */ - public function getCapture_id() { - return $this->capture_id; - } - - /** - * ID of the Payment resource that this transaction is based on. - * @param string $parent_payment - */ - public function setParentPayment($parent_payment) { - $this->parent_payment = $parent_payment; - return $this; - } - - /** - * ID of the Payment resource that this transaction is based on. - * @return string - */ - public function getParentPayment() { - return $this->parent_payment; - } - - /** - * ID of the Payment resource that this transaction is based on. - * @param string $parent_payment - * @deprecated. Instead use setParentPayment - */ - public function setParent_payment($parent_payment) { - $this->parent_payment = $parent_payment; - return $this; - } - /** - * ID of the Payment resource that this transaction is based on. - * @return string - * @deprecated. Instead use getParentPayment - */ - public function getParent_payment() { - return $this->parent_payment; - } - - /** - * - * @array - * @param PayPal\Api\Links $links - */ - public function setLinks($links) { - $this->links = $links; - return $this; - } - - /** - * - * @return PayPal\Api\Links - */ - public function getLinks() { - return $this->links; - } - - - - public static function get($refundId, $apiContext = null) { - if (($refundId == null) || (strlen($refundId) <= 0)) { - throw new \InvalidArgumentException("refundId cannot be null or empty"); - } - $payLoad = ""; - if ($apiContext == null) { - $apiContext = new ApiContext(self::$credential); - } - $call = new PPRestCall($apiContext); - $json = $call->execute(array('PayPal\Rest\RestHandler'), "/v1/payments/refund/$refundId", "GET", $payLoad); - $ret = new Refund(); - $ret->fromJson($json); - return $ret; - } -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/RelatedResources.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/RelatedResources.php deleted file mode 100644 index 7e97776..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/RelatedResources.php +++ /dev/null @@ -1,79 +0,0 @@ -sale = $sale; - return $this; - } - - /** - * A sale transaction - * @return PayPal\Api\Sale - */ - public function getSale() { - return $this->sale; - } - - - /** - * An authorization transaction - * @param PayPal\Api\Authorization $authorization - */ - public function setAuthorization($authorization) { - $this->authorization = $authorization; - return $this; - } - - /** - * An authorization transaction - * @return PayPal\Api\Authorization - */ - public function getAuthorization() { - return $this->authorization; - } - - - /** - * A capture transaction - * @param PayPal\Api\Capture $capture - */ - public function setCapture($capture) { - $this->capture = $capture; - return $this; - } - - /** - * A capture transaction - * @return PayPal\Api\Capture - */ - public function getCapture() { - return $this->capture; - } - - - /** - * A refund transaction - * @param PayPal\Api\Refund $refund - */ - public function setRefund($refund) { - $this->refund = $refund; - return $this; - } - - /** - * A refund transaction - * @return PayPal\Api\Refund - */ - public function getRefund() { - return $this->refund; - } - - -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Sale.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Sale.php deleted file mode 100644 index 5fb1284..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Sale.php +++ /dev/null @@ -1,235 +0,0 @@ -id = $id; - return $this; - } - - /** - * Identifier of the authorization transaction. - * @return string - */ - public function getId() { - return $this->id; - } - - - /** - * Time the resource was created. - * @param string $create_time - */ - public function setCreateTime($create_time) { - $this->create_time = $create_time; - return $this; - } - - /** - * Time the resource was created. - * @return string - */ - public function getCreateTime() { - return $this->create_time; - } - - /** - * Time the resource was created. - * @param string $create_time - * @deprecated. Instead use setCreateTime - */ - public function setCreate_time($create_time) { - $this->create_time = $create_time; - return $this; - } - /** - * Time the resource was created. - * @return string - * @deprecated. Instead use getCreateTime - */ - public function getCreate_time() { - return $this->create_time; - } - - /** - * Time the resource was last updated. - * @param string $update_time - */ - public function setUpdateTime($update_time) { - $this->update_time = $update_time; - return $this; - } - - /** - * Time the resource was last updated. - * @return string - */ - public function getUpdateTime() { - return $this->update_time; - } - - /** - * Time the resource was last updated. - * @param string $update_time - * @deprecated. Instead use setUpdateTime - */ - public function setUpdate_time($update_time) { - $this->update_time = $update_time; - return $this; - } - /** - * Time the resource was last updated. - * @return string - * @deprecated. Instead use getUpdateTime - */ - public function getUpdate_time() { - return $this->update_time; - } - - /** - * Amount being collected. - * @param PayPal\Api\Amount $amount - */ - public function setAmount($amount) { - $this->amount = $amount; - return $this; - } - - /** - * Amount being collected. - * @return PayPal\Api\Amount - */ - public function getAmount() { - return $this->amount; - } - - - /** - * State of the sale transaction. - * @param string $state - */ - public function setState($state) { - $this->state = $state; - return $this; - } - - /** - * State of the sale transaction. - * @return string - */ - public function getState() { - return $this->state; - } - - - /** - * ID of the Payment resource that this transaction is based on. - * @param string $parent_payment - */ - public function setParentPayment($parent_payment) { - $this->parent_payment = $parent_payment; - return $this; - } - - /** - * ID of the Payment resource that this transaction is based on. - * @return string - */ - public function getParentPayment() { - return $this->parent_payment; - } - - /** - * ID of the Payment resource that this transaction is based on. - * @param string $parent_payment - * @deprecated. Instead use setParentPayment - */ - public function setParent_payment($parent_payment) { - $this->parent_payment = $parent_payment; - return $this; - } - /** - * ID of the Payment resource that this transaction is based on. - * @return string - * @deprecated. Instead use getParentPayment - */ - public function getParent_payment() { - return $this->parent_payment; - } - - /** - * - * @array - * @param PayPal\Api\Links $links - */ - public function setLinks($links) { - $this->links = $links; - return $this; - } - - /** - * - * @return PayPal\Api\Links - */ - public function getLinks() { - return $this->links; - } - - - - public static function get($saleId, $apiContext = null) { - if (($saleId == null) || (strlen($saleId) <= 0)) { - throw new \InvalidArgumentException("saleId cannot be null or empty"); - } - $payLoad = ""; - if ($apiContext == null) { - $apiContext = new ApiContext(self::$credential); - } - $call = new PPRestCall($apiContext); - $json = $call->execute(array('PayPal\Rest\RestHandler'), "/v1/payments/sale/$saleId", "GET", $payLoad); - $ret = new Sale(); - $ret->fromJson($json); - return $ret; - } - - public function refund($refund, $apiContext = null) { - if ($this->getId() == null) { - throw new \InvalidArgumentException("Id cannot be null"); - } - if (($refund == null)) { - throw new \InvalidArgumentException("refund cannot be null or empty"); - } - $payLoad = $refund->toJSON(); - if ($apiContext == null) { - $apiContext = new ApiContext(self::$credential); - } - $call = new PPRestCall($apiContext); - $json = $call->execute(array('PayPal\Rest\RestHandler'), "/v1/payments/sale/{$this->getId()}/refund", "POST", $payLoad); - $ret = new Refund(); - $ret->fromJson($json); - return $ret; - } -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/ShippingAddress.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/ShippingAddress.php deleted file mode 100644 index a7f4de9..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/ShippingAddress.php +++ /dev/null @@ -1,42 +0,0 @@ -recipient_name = $recipient_name; - return $this; - } - - /** - * Name of the recipient at this address. - * @return string - */ - public function getRecipientName() { - return $this->recipient_name; - } - - /** - * Name of the recipient at this address. - * @param string $recipient_name - * @deprecated. Instead use setRecipientName - */ - public function setRecipient_name($recipient_name) { - $this->recipient_name = $recipient_name; - return $this; - } - /** - * Name of the recipient at this address. - * @return string - * @deprecated. Instead use getRecipientName - */ - public function getRecipient_name() { - return $this->recipient_name; - } - -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Transaction.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Transaction.php deleted file mode 100644 index d8420aa..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Transaction.php +++ /dev/null @@ -1,152 +0,0 @@ -amount = $amount; - return $this; - } - - /** - * Amount being collected. - * @return PayPal\Api\Amount - */ - public function getAmount() { - return $this->amount; - } - - - /** - * Recepient of the funds in this transaction. - * @param PayPal\Api\Payee $payee - */ - public function setPayee($payee) { - $this->payee = $payee; - return $this; - } - - /** - * Recepient of the funds in this transaction. - * @return PayPal\Api\Payee - */ - public function getPayee() { - return $this->payee; - } - - - /** - * Description of what is being paid for. - * @param string $description - */ - public function setDescription($description) { - $this->description = $description; - return $this; - } - - /** - * Description of what is being paid for. - * @return string - */ - public function getDescription() { - return $this->description; - } - - - /** - * List of items being paid for. - * @param PayPal\Api\ItemList $item_list - */ - public function setItemList($item_list) { - $this->item_list = $item_list; - return $this; - } - - /** - * List of items being paid for. - * @return PayPal\Api\ItemList - */ - public function getItemList() { - return $this->item_list; - } - - /** - * List of items being paid for. - * @param PayPal\Api\ItemList $item_list - * @deprecated. Instead use setItemList - */ - public function setItem_list($item_list) { - $this->item_list = $item_list; - return $this; - } - /** - * List of items being paid for. - * @return PayPal\Api\ItemList - * @deprecated. Instead use getItemList - */ - public function getItem_list() { - return $this->item_list; - } - - /** - * List of financial transactions (Sale, Authorization, Capture, Refund) related to the payment. - * @array - * @param PayPal\Api\RelatedResources $related_resources - */ - public function setRelatedResources($related_resources) { - $this->related_resources = $related_resources; - return $this; - } - - /** - * List of financial transactions (Sale, Authorization, Capture, Refund) related to the payment. - * @return PayPal\Api\RelatedResources - */ - public function getRelatedResources() { - return $this->related_resources; - } - - /** - * List of financial transactions (Sale, Authorization, Capture, Refund) related to the payment. - * @array - * @param PayPal\Api\RelatedResources $related_resources - * @deprecated. Instead use setRelatedResources - */ - public function setRelated_resources($related_resources) { - $this->related_resources = $related_resources; - return $this; - } - /** - * List of financial transactions (Sale, Authorization, Capture, Refund) related to the payment. - * @return PayPal\Api\RelatedResources - * @deprecated. Instead use getRelatedResources - */ - public function getRelated_resources() { - return $this->related_resources; - } - - /** - * Additional transactions for complex payment (Parallel and Chained) scenarios. - * @array - * @param PayPal\Api\self $transactions - */ - public function setTransactions($transactions) { - $this->transactions = $transactions; - return $this; - } - - /** - * Additional transactions for complex payment (Parallel and Chained) scenarios. - * @return PayPal\Api\self - */ - public function getTransactions() { - return $this->transactions; - } - - -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Transactions.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Transactions.php deleted file mode 100644 index 2219837..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Api/Transactions.php +++ /dev/null @@ -1,25 +0,0 @@ -amount = $amount; - return $this; - } - - /** - * Amount being collected. - * @return PayPal\Api\Amount - */ - public function getAmount() { - return $this->amount; - } - - -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Auth/OAuthTokenCredential.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Auth/OAuthTokenCredential.php deleted file mode 100644 index 8b4d4e6..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Auth/OAuthTokenCredential.php +++ /dev/null @@ -1,137 +0,0 @@ -clientId = $clientId; - $this->clientSecret = $clientSecret; - } - - /** - * @return the accessToken - */ - public function getAccessToken($config) { - - $this->logger = new PPLoggingManager(__CLASS__, $config); - // Check if Access Token is not null and has not expired. - // The API returns expiry time as a relative time unit - // We use a buffer time when checking for token expiry to account - // for API call delays and any delay between the time the token is - // retrieved and subsequently used - if ($this->accessToken != null && - (time() - $this->tokenCreateTime) > ($this->tokenExpiresIn - self::$expiryBufferTime)) { - $this->accessToken = null; - } - // If accessToken is Null, obtain a new token - if ($this->accessToken == null) { - $this->_generateAccessToken($config); - } - return $this->accessToken; - } - - /** - * Generates a new access token - */ - private function _generateAccessToken($config) { - - $base64ClientID = base64_encode($this->clientId . ":" . $this->clientSecret); - $headers = array( - "User-Agent" => PPUserAgent::getValue(RestHandler::$sdkName, RestHandler::$sdkVersion), - "Authorization" => "Basic " . $base64ClientID, - "Accept" => "*/*" - ); - $httpConfiguration = $this->getOAuthHttpConfiguration($config); - $httpConfiguration->setHeaders($headers); - - $connection = PPConnectionManager::getInstance()->getConnection($httpConfiguration, $config); - $res = $connection->execute("grant_type=client_credentials"); - $jsonResponse = json_decode($res, true); - if($jsonResponse == NULL || - !isset($jsonResponse["access_token"]) || !isset($jsonResponse["expires_in"]) ) { - $this->accessToken = NULL; - $this->tokenExpiresIn = NULL; - $this->logger->warning("Could not generate new Access token. Invalid response from server: " . $jsonResponse); - } else { - $this->accessToken = $jsonResponse["access_token"]; - $this->tokenExpiresIn = $jsonResponse["expires_in"]; - } - $this->tokenCreateTime = time(); - return $this->accessToken; - } - - /* - * Get HttpConfiguration object for OAuth API - */ - private function getOAuthHttpConfiguration($config) { - if (isset($config['oauth.EndPoint'])) { - $baseEndpoint = $config['oauth.EndPoint']; - } else if (isset($config['service.EndPoint'])) { - $baseEndpoint = $config['service.EndPoint']; - } else if (isset($config['mode'])) { - switch (strtoupper($config['mode'])) { - case 'SANDBOX': - $baseEndpoint = PPConstants::REST_SANDBOX_ENDPOINT; - break; - case 'LIVE': - $baseEndpoint = PPConstants::REST_LIVE_ENDPOINT; - break; - default: - throw new PPConfigurationException('The mode config parameter must be set to either sandbox/live'); - } - } else { - throw new PPConfigurationException('You must set one of service.endpoint or mode parameters in your configuration'); - } - - $baseEndpoint = rtrim(trim($baseEndpoint), '/'); - return new PPHttpConfig($baseEndpoint . "/v1/oauth2/token", "POST"); - } -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Rest/ApiContext.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Rest/ApiContext.php deleted file mode 100755 index 4250b5e..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Rest/ApiContext.php +++ /dev/null @@ -1,78 +0,0 @@ -credential; - } - - public function getrequestId() { - if($this->requestId == null) { - $this->requestId = $this->generateRequestId(); - } - return $this->requestId; - } - - - /** - * - * @param PayPal/Api/OAuthTokenCredential $credential - * @param string $requestId - */ - public function __construct($credential, $requestId=null) { - $this->credential = $credential; - $this->requestId = $requestId; - } - - /** - * Generates a unique per request id that - * can be used to set the PayPal-Request-Id header - * that is used for idemptency - * @return string - */ - private function generateRequestId() { - - static $pid = -1; - static $addr = -1; - - if ($pid == -1) { - $pid = getmypid(); - } - if ($addr == -1) { - if(array_key_exists('SERVER_ADDR', $_SERVER)) { - $addr = ip2long($_SERVER['SERVER_ADDR']); - } else { - $addr = php_uname('n'); - } - } - - return $addr . $pid . $_SERVER['REQUEST_TIME'] . mt_rand(0, 0xffff); - } -} -echo "kkkkk"; \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Rest/IResource.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Rest/IResource.php deleted file mode 100644 index 395586c..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/lib/PayPal/Rest/IResource.php +++ /dev/null @@ -1,7 +0,0 @@ -apiContext = $apiContext; - } - - public function handle($httpConfig, $request, $options) { - - $credential = $this->apiContext->getCredential(); - $config = $this->apiContext->getConfig(); - - if($credential == NULL) { - // Try picking credentials from the config file - $credMgr = PPCredentialManager::getInstance($config); - $credValues = $credMgr->getCredentialObject(); - if(!is_array($credValues)) { - throw new PPMissingCredentialException("Empty or invalid credentials passed"); - } - $credential = new OAuthTokenCredential($credValues['clientId'], $credValues['clientSecret']); - } - if($credential == NULL || ! ($credential instanceof OAuthTokenCredential) ) { - throw new PPInvalidCredentialException("Invalid credentials passed"); - } - - - $httpConfig->setUrl( - rtrim( trim($this->_getEndpoint($config)), '/') . - (isset($options['path']) ? $options['path'] : '') - ); - - if(!array_key_exists("User-Agent", $httpConfig->getHeaders())) { - $httpConfig->addHeader("User-Agent", PPUserAgent::getValue(self::$sdkName, self::$sdkVersion)); - } - if(!is_null($credential) && $credential instanceof OAuthTokenCredential) { - $httpConfig->addHeader('Authorization', "Bearer " . $credential->getAccessToken($config)); - } - if($httpConfig->getMethod() == 'POST' || $httpConfig->getMethod() == 'PUT') { - $httpConfig->addHeader('PayPal-Request-Id', $this->apiContext->getRequestId()); - } - - } - - private function _getEndpoint($config) { - if (isset($config['service.EndPoint'])) { - return $config['service.EndPoint']; - } else if (isset($config['mode'])) { - switch (strtoupper($config['mode'])) { - case 'SANDBOX': - return PPConstants::REST_SANDBOX_ENDPOINT; - break; - case 'LIVE': - return PPConstants::REST_LIVE_ENDPOINT; - break; - default: - throw new PPConfigurationException('The mode config parameter must be set to either sandbox/live'); - break; - } - } else { - throw new PPConfigurationException('You must set one of service.endpoint or mode parameters in your configuration'); - } - } - -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/phpunit.xml b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/phpunit.xml deleted file mode 100644 index d8063ef..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/phpunit.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - tests - - - - - - - - - - ./lib - - - - - \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/AddressTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/AddressTest.php deleted file mode 100644 index ec271c9..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/AddressTest.php +++ /dev/null @@ -1,54 +0,0 @@ -setLine1(self::$line1); - $addr->setLine2(self::$line2); - $addr->setCity(self::$city); - $addr->setState(self::$state); - $addr->setPostalCode(self::$postalCode); - $addr->setCountryCode(self::$countryCode); - $addr->setPhone(self::$phone); - return $addr; - } - - public function setup() { - $this->address = self::createAddress(); - } - - public function testGetterSetter() { - $this->assertEquals(self::$line1, $this->address->getLine1()); - $this->assertEquals(self::$line2, $this->address->getLine2()); - $this->assertEquals(self::$city, $this->address->getCity()); - $this->assertEquals(self::$state, $this->address->getState()); - $this->assertEquals(self::$postalCode, $this->address->getPostalCode()); - $this->assertEquals(self::$countryCode, $this->address->getCountryCode()); - $this->assertEquals(self::$phone, $this->address->getPhone()); - } - - public function testSerializeDeserialize() { - $a1 = $this->address; - - $a2 = new Address(); - $a2->fromJson($a1->toJson()); - - $this->assertEquals($a1, $a2); - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/AmountTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/AmountTest.php deleted file mode 100644 index 7f24e7b..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/AmountTest.php +++ /dev/null @@ -1,45 +0,0 @@ -setCurrency(self::$currency); - $amount->setTotal(self::$total); - - return $amount; - } - - public function setup() { - $this->amounts['partial'] = self::createAmount(); - - $amount = self::createAmount(); - $amount->setDetails(DetailsTest::createAmountDetails()); - $this->amounts['full'] = $amount; - } - - public function testGetterSetter() { - $this->assertEquals(self::$currency, $this->amounts['partial']->getCurrency()); - $this->assertEquals(self::$total, $this->amounts['partial']->getTotal()); - $this->assertEquals(DetailsTest::$fee, $this->amounts['full']->getDetails()->getFee()); - } - - public function testSerializeDeserialize() { - $a1 = $this->amounts['partial']; - - $a2 = new Amount(); - $a2->fromJson($a1->toJson()); - - $this->assertEquals($a1, $a2); - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/AuthorizationTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/AuthorizationTest.php deleted file mode 100644 index 63ba8cb..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/AuthorizationTest.php +++ /dev/null @@ -1,156 +0,0 @@ -setCreateTime(self::$create_time); - $authorization->setId(self::$id); - $authorization->setState(self::$state); - - $authorization->setAmount(AmountTest::createAmount()); - $authorization->setLinks(array(LinksTest::createLinks())); - - return $authorization; - } - - public static function authorize() - { - $addr = new Address(); - $addr->setLine1("3909 Witmer Road"); - $addr->setLine2("Niagara Falls"); - $addr->setCity("Niagara Falls"); - $addr->setState("NY"); - $addr->setPostal_code("14305"); - $addr->setCountry_code("US"); - $addr->setPhone("716-298-1822"); - - $card = new CreditCard(); - $card->setType("visa"); - $card->setNumber("4417119669820331"); - $card->setExpire_month("11"); - $card->setExpire_year("2019"); - $card->setCvv2("012"); - $card->setFirst_name("Joe"); - $card->setLast_name("Shopper"); - $card->setBilling_address($addr); - - $fi = new FundingInstrument(); - $fi->setCredit_card($card); - - $payer = new Payer(); - $payer->setPayment_method("credit_card"); - $payer->setFunding_instruments(array($fi)); - - $amount = new Amount(); - $amount->setCurrency("USD"); - $amount->setTotal("1.00"); - - $transaction = new Transaction(); - $transaction->setAmount($amount); - $transaction->setDescription("This is the payment description."); - - $payment = new Payment(); - $payment->setIntent("authorize"); - $payment->setPayer($payer); - $payment->setTransactions(array($transaction)); - - $paymnt = $payment->create(); - $resArray = $paymnt->toArray(); - - return $authId = $resArray['transactions'][0]['related_resources'][0]['authorization']['id']; - - } - public function setup() { - $authorization = new Authorization(); - $authorization->setCreateTime(self::$create_time); - $authorization->setId(self::$id); - $authorization->setState(self::$state); - $authorization->setParentPayment(self::$parent_payment); - $this->authorizations['partial'] = $authorization; - $this->authorizations['full'] = self::createAuthorization(); - - } - - public function testGetterSetter() { - $authorization = $this->authorizations['partial']; - $this->assertEquals(self::$create_time, $authorization->getCreateTime()); - $this->assertEquals(self::$id, $authorization->getId()); - $this->assertEquals(self::$state, $authorization->getState()); - $this->assertEquals(self::$parent_payment, $authorization->getParentPayment()); - - $authorization = $this->authorizations['full']; - $this->assertEquals(AmountTest::$currency, $authorization->getAmount()->getCurrency()); - $this->assertEquals(1, count($authorization->getLinks())); - } - - public function testSerializeDeserialize() { - $a1 = $this->authorizations['partial']; - $a2 = new Authorization(); - $a2->fromJson($a1->toJson()); - $this->assertEquals($a1, $a2); - } - public function testOperations() { - $authId = self::authorize(); - $auth = Authorization::get($authId); - $this->assertNotNull($auth->getId()); - - $amount = new Amount(); - $amount->setCurrency("USD"); - $amount->setTotal("1.00"); - - $captur = new Capture(); - $captur->setId($authId); - $captur->setAmount($amount); - - $capt = $auth->capture($captur); - $this->assertNotNull( $capt->getId()); - - $authId = self::authorize(); - $auth = Authorization::get($authId); - $void = $auth->void(); - $this->assertNotNull($void->getId()); - - } - - public function testReauthorize(){ - $authorization = Authorization::get('7GH53639GA425732B'); - - $amount = new Amount(); - $amount->setCurrency("USD"); - $amount->setTotal("1.00"); - - $authorization->setAmount($amount); - try{ - $reauthorization = $authorization->reauthorize(); - }catch (PPConnectionException $ex){ - $this->assertEquals(strpos($ex->getMessage(),"500"), false); - } - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/CaptureTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/CaptureTest.php deleted file mode 100644 index a1162fd..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/CaptureTest.php +++ /dev/null @@ -1,87 +0,0 @@ -setCreateTime(self::$create_time); - $capture->setId(self::$id); - $capture->setParentPayment(self::$parent_payment); - $capture->setState(self::$state); - - return $capture; - } - - public function setup() { - $this->captures['partial'] = self::createCapture(); - - $capture = self::createCapture(); - $capture->setAmount(AmountTest::createAmount()); - $capture->setLinks(array(LinksTest::createLinks())); - $this->captures['full'] = $capture; - } - - public function testGetterSetter() { - $this->assertEquals(self::$create_time, $this->captures['partial']->getCreateTime()); - $this->assertEquals(self::$id, $this->captures['partial']->getId()); - $this->assertEquals(self::$parent_payment, $this->captures['partial']->getParentPayment()); - $this->assertEquals(self::$state, $this->captures['partial']->getState()); - - $this->assertEquals(AmountTest::$currency, $this->captures['full']->getAmount()->getCurrency()); - $links = $this->captures['full']->getLinks(); - $this->assertEquals(LinksTest::$href, $links[0]->getHref()); - } - - public function testSerializeDeserialize() { - $c1 = $this->captures['partial']; - - $c2 = new Capture(); - $c2->fromJson($c1->toJson()); - - $this->assertEquals($c1, $c2); - } - - public function testOperations() - { - $authId = AuthorizationTest::authorize(); - $auth = Authorization::get($authId); - - $amount = new Amount(); - $amount->setCurrency("USD"); - $amount->setTotal("1.00"); - - $captr = new Capture(); - $captr->setId($authId); - $captr->setAmount($amount); - - $capt = $auth->capture($captr); - $captureId = $capt->getId(); - $this->assertNotNull($captureId); - - $refund = new Refund(); - $refund->setId($captureId); - $refund->setAmount($amount); - - $capture = Capture::get($captureId); - $this->assertNotNull($capture->getId()); - - $retund = $capture->refund($refund); - $this->assertNotNull($retund->getId()); - - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/CreditCardHistoryTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/CreditCardHistoryTest.php deleted file mode 100644 index a7f1b53..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/CreditCardHistoryTest.php +++ /dev/null @@ -1,72 +0,0 @@ -setType(self::$cardType); - $card->setNumber(self::$cardNumber); - $card->setExpireMonth(self::$expireMonth); - $card->setExpireYear(self::$expireYear); - $card->setCvv2(self::$cvv); - $card->setFirstName(self::$firstName); - $card->setLastName(self::$lastName); - $card->setId(self::$id); - $card->setValidUntil(self::$validUntil); - $card->setState(self::$state); - $card->setPayerId(self::$payerId); - return $card; - } - - public function setup() { - - $card = self::createCreditCard(); - $card->setBillingAddress(AddressTest::createAddress()); - $card->setLinks(array(LinksTest::createLinks())); - $this->cards['full'] = $card; - - $card = self::createCreditCard(); - $this->cards['partial'] = $card; - } - - public function testGetterSetters() { - $cardHistory = new CreditCardHistory(); - $cardHistory->setCreditCards(array($this->cards['partial'], $this->cards['full'])); - $cardHistory->setCount(2); - - $this->assertEquals(2, count($cardHistory->getCreditCards())); - } - - - public function testSerializationDeserialization() { - $cardHistory = new CreditCardHistory(); - $cardHistory->setCreditCards(array($this->cards['partial'], $this->cards['full'])); - $cardHistory->setCount(2); - - $cardHistoryCopy = new CreditCardHistory(); - $cardHistoryCopy->fromJson($cardHistory->toJSON()); - - $this->assertEquals($cardHistory, $cardHistoryCopy); - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/CreditCardTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/CreditCardTest.php deleted file mode 100644 index 27896fe..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/CreditCardTest.php +++ /dev/null @@ -1,94 +0,0 @@ -setType(self::$cardType); - $card->setNumber(self::$cardNumber); - $card->setExpireMonth(self::$expireMonth); - $card->setExpireYear(self::$expireYear); - $card->setCvv2(self::$cvv); - $card->setFirstName(self::$firstName); - $card->setLastName(self::$lastName); - $card->setId(self::$id); - $card->setValidUntil(self::$validUntil); - $card->setState(self::$state); - $card->setPayerId(self::$payerId); - return $card; - } - - public function setup() { - - $card = self::createCreditCard(); - $card->setBillingAddress(AddressTest::createAddress()); - $card->setLinks(array(LinksTest::createLinks())); - $this->cards['full'] = $card; - - $card = self::createCreditCard(); - $this->cards['partial'] = $card; - } - - public function testGetterSetters() { - $c = $this->cards['partial']; - $this->assertEquals(self::$cardType, $c->getType()); - $this->assertEquals(self::$cardNumber, $c->getNumber()); - $this->assertEquals(self::$expireMonth, $c->getExpireMonth()); - $this->assertEquals(self::$expireYear, $c->getExpireYear()); - $this->assertEquals(self::$cvv, $c->getCvv2()); - $this->assertEquals(self::$firstName, $c->getFirstName()); - $this->assertEquals(self::$lastName, $c->getLastName()); - $this->assertEquals(self::$id, $c->getId()); - $this->assertEquals(self::$validUntil, $c->getValidUntil()); - $this->assertEquals(self::$state, $c->getState()); - $this->assertEquals(self::$payerId, $c->getPayerId()); - - $c = $this->cards['full']; - $this->assertEquals(AddressTest::$line1, $c->getBillingAddress()->getLine1()); - $link = $c->getLinks(); - $this->assertEquals(LinksTest::$href, $link[0]->getHref()); - } - - public function testSerializeDeserialize() { - $c1 = $this->cards['full']; - $json = $c1->toJson(); - - $c2 = new CreditCard(); - $c2->fromJson($json); - - $this->assertEquals($c1, $c2); - } - - public function testOperations() { - $c1 = $this->cards['full']; - -// $this->assertNull($c1->getId()); - $c1->create(); - $this->assertNotNull($c1->getId()); - - $c2 = CreditCard::get($c1->getId()); - $this->assertEquals($c1->getBillingAddress(), $c2->getBillingAddress()); - $this->assertGreaterThan(0, count($c2->getLinks())); - $this->assertEquals(self::$cardType, $c2->getType()); - $this->assertNotNull($c2->getState()); - $this->assertEquals(true, $c2->delete()); - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/CreditCardTokenTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/CreditCardTokenTest.php deleted file mode 100644 index d1f8db9..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/CreditCardTokenTest.php +++ /dev/null @@ -1,38 +0,0 @@ -setPayerId(self::$payerId); - $ccToken->setCreditCardId(self::$creditCardId); - return $ccToken; - } - - public function setup() { - $this->ccToken = self::createCreditCardToken(); - } - - public function testGetterSetter() { - $this->assertEquals(self::$payerId, $this->ccToken->getPayerId()); - $this->assertEquals(self::$creditCardId, $this->ccToken->getCreditCardId()); - } - - public function testSerializeDeserialize() { - $t1 = $this->ccToken; - - $t2 = new CreditCardToken(); - $t2->fromJson($t1->toJson()); - - $this->assertEquals($t1, $t2); - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/DetailsTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/DetailsTest.php deleted file mode 100644 index ae1cba9..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/DetailsTest.php +++ /dev/null @@ -1,45 +0,0 @@ -setSubtotal(self::$subtotal); - $amountDetails->setTax(self::$tax); - $amountDetails->setShipping(self::$shipping); - $amountDetails->setFee(self::$fee); - - return $amountDetails; - } - - public function setup() { - $this->amountDetails = self::createAmountDetails(); - } - - public function testGetterSetters() { - $this->assertEquals(self::$subtotal, $this->amountDetails->getSubtotal()); - $this->assertEquals(self::$tax, $this->amountDetails->getTax()); - $this->assertEquals(self::$shipping, $this->amountDetails->getShipping()); - $this->assertEquals(self::$fee, $this->amountDetails->getFee()); - } - - public function testSerializeDeserialize() { - $a1 = $this->amountDetails; - - $a2 = new Details(); - $a2->fromJson($a1->toJson()); - - $this->assertEquals($a1, $a2); - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/FundingInstrumentTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/FundingInstrumentTest.php deleted file mode 100644 index cb420d6..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/FundingInstrumentTest.php +++ /dev/null @@ -1,36 +0,0 @@ -setCreditCard(CreditCardTest::createCreditCard()); - $fi->setCreditCardToken(CreditCardTokenTest::createCreditCardToken()); - return $fi; - } - - public function setup() { - $this->fi = self::createFundingInstrument(); - } - - public function testGetterSetter() { - $this->assertEquals(CreditCardTest::$cardNumber, $this->fi->getCreditCard()->getNumber()); - $this->assertEquals(CreditCardTokenTest::$creditCardId, - $this->fi->getCreditCardToken()->getCreditCardId()); - } - - public function testSerializeDeserialize() { - $fi1 = $this->fi; - - $fi2 = new FundingInstrument(); - $fi2->fromJson($fi1->toJson()); - $this->assertEquals($fi1, $fi2); - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/ItemListTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/ItemListTest.php deleted file mode 100644 index fe5f870..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/ItemListTest.php +++ /dev/null @@ -1,46 +0,0 @@ -setItems(array($item)); - $itemList->setShippingAddress(ShippingAddressTest::createAddress()); - - return $itemList; - } - - public function setup() { - $this->items = self::createItemList(); - } - - public function testGetterSetters() { - $items = $this->items->getItems(); - $this->assertEquals(ItemTest::createItem(), $items[0]); - $this->assertEquals(ShippingAddressTest::createAddress(), $this->items->getShippingAddress()); - } - - public function testSerializeDeserialize() { - $itemList = new ItemList(); - $itemList->fromJson($this->items->toJSON()); - - $this->assertEquals($itemList, $this->items); - } - -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/ItemTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/ItemTest.php deleted file mode 100644 index 59be288..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/ItemTest.php +++ /dev/null @@ -1,46 +0,0 @@ -setName(self::$name); - $item->setPrice(self::$price); - $item->setQuantity(self::$quantity); - $item->setSku(self::$sku); - $item->setCurrency(self::$currency); - - return $item; - } - public function setup() { - $this->item = ItemTest::createItem(); - } - - public function testGetterSetters() { - $this->assertEquals(self::$name, $this->item->getName()); - $this->assertEquals(self::$price, $this->item->getPrice()); - $this->assertEquals(self::$sku, $this->item->getSku()); - $this->assertEquals(self::$quantity, $this->item->getQuantity()); - $this->assertEquals(self::$currency, $this->item->getCurrency()); - } - - public function testSerializeDeserialize() { - $item = new Item(); - $item->fromJson($this->item->toJSON()); - - $this->assertEquals($item, $this->item); - } - -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/LinksTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/LinksTest.php deleted file mode 100644 index 68da69a..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/LinksTest.php +++ /dev/null @@ -1,40 +0,0 @@ -setHref(self::$href); - $links->setRel(self::$rel); - $links->setMethod(self::$method); - - return $links; - } - - public function setup() { - $this->links = self::createLinks(); - } - - public function testGetterSetters() { - $this->assertEquals(self::$href, $this->links->getHref()); - $this->assertEquals(self::$rel, $this->links->getRel()); - $this->assertEquals(self::$method, $this->links->getMethod()); - } - - public function testSerializeDeserialize() { - $link2 = new Links(); - $link2->fromJson($this->links->toJSON()); - $this->assertEquals($this->links, $link2); - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/PayeeTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/PayeeTest.php deleted file mode 100644 index ea9469f..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/PayeeTest.php +++ /dev/null @@ -1,44 +0,0 @@ -setEmail(self::$email); - $payee->setMerchantId(self::$merchant_id); - $payee->setPhone(self::$phone); - - return $payee; - } - - public function setup() { - $this->payee = self::createPayee(); - } - - public function testGetterSetter() { - $this->assertEquals(self::$email, $this->payee->getEmail()); - $this->assertEquals(self::$merchant_id, $this->payee->getMerchantId()); - $this->assertEquals(self::$phone, $this->payee->getPhone()); - } - - public function testSerializeDeserialize() { - $p1 = $this->payee; - - $p2 = new Payee(); - $p2->fromJson($p1->toJson()); - - $this->assertEquals($p1, $p2); - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/PayerInfoTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/PayerInfoTest.php deleted file mode 100644 index b1f5858..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/PayerInfoTest.php +++ /dev/null @@ -1,50 +0,0 @@ -setEmail(self::$email); - $payerInfo->setFirstName(self::$firstName); - $payerInfo->setLastName(self::$lastName); - $payerInfo->setPhone(self::$phone); - $payerInfo->setPayerId(self::$payerId); - $payerInfo->setShippingAddress(AddressTest::createAddress()); - - return $payerInfo; - } - - public function setup() { - $this->payerInfo = self::createPayerInfo(); - } - - public function testGetterSetter() { - $this->assertEquals(self::$email, $this->payerInfo->getEmail()); - $this->assertEquals(self::$firstName, $this->payerInfo->getFirstName()); - $this->assertEquals(self::$lastName, $this->payerInfo->getLastName()); - $this->assertEquals(self::$phone, $this->payerInfo->getPhone()); - $this->assertEquals(self::$payerId, $this->payerInfo->getPayerId()); - $this->assertEquals(AddressTest::$line1, $this->payerInfo->getShippingAddress()->getLine1()); - } - - public function testSerializeDeserialize() { - $p1 = $this->payerInfo; - - $p2 = new PayerInfo(); - $p2->fromJson($p1->toJson()); - - $this->assertEquals($p1, $p2); - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/PayerTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/PayerTest.php deleted file mode 100644 index 7568a3c..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/PayerTest.php +++ /dev/null @@ -1,45 +0,0 @@ -setPaymentMethod(self::$paymentMethod); - $payer->setPayerInfo(PayerInfoTest::createPayerInfo()); - $payer->setFundingInstruments(array(FundingInstrumentTest::createFundingInstrument())); - - return $payer; - } - - public function setup() { - $this->payer = self::createPayer(); - } - - public function testGetterSetter() { - $this->assertEquals(self::$paymentMethod, $this->payer->getPaymentMethod()); - $this->assertEquals(PayerInfoTest::$email, $this->payer->getPayerInfo()->getEmail()); - - $fi = $this->payer->getFundingInstruments(); - $this->assertEquals(CreditCardTokenTest::$creditCardId, $fi[0]->getCreditCardToken()->getCreditCardId()); - } - - public function testSerializeDeserialize() { - $p1 = $this->payer; - - $p2 = new Payer(); - $p2->fromJson($p1->toJson()); - - $this->assertEquals($p1, $p2); - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/PaymentHistoryTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/PaymentHistoryTest.php deleted file mode 100644 index 577d282..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/PaymentHistoryTest.php +++ /dev/null @@ -1,39 +0,0 @@ -setCount(self::$count); - $history->setNextId(self::$nextId); - $history->setPayments(array(PaymentTest::createPayment())); - return $history; - } - public function setup() { - $this->history = PaymentHistoryTest::createPaymentHistory(); - } - - public function testGetterSetters() { - $this->assertEquals(self::$count, $this->history->getCount()); - $this->assertEquals(self::$nextId, $this->history->getNextId()); - - } - - public function testSerializeDeserialize() { - $history = new PaymentHistory(); - $history->fromJson($this->history->toJSON()); - - $this->assertEquals($history, $this->history); - } - -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/PaymentTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/PaymentTest.php deleted file mode 100644 index 2bf9795..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/PaymentTest.php +++ /dev/null @@ -1,78 +0,0 @@ -setReturnUrl("http://localhost/return"); - $redirectUrls->setCancelUrl("http://localhost/cancel"); - - $payment = new Payment(); - $payment->setIntent("sale"); - $payment->setRedirectUrls($redirectUrls); - $payment->setPayer(PayerTest::createPayer()); - $payment->setTransactions(array(TransactionTest::createTransaction())); - - return $payment; - } - - public static function createNewPayment() { - $payer = new Payer(); - $payer->setPaymentMethod("credit_card"); - $payer->setFundingInstruments(array(FundingInstrumentTest::createFundingInstrument())); - - $transaction = new Transaction(); - $transaction->setAmount(AmountTest::createAmount()); - $transaction->setDescription("This is the payment description."); - - $redirectUrls = new RedirectUrls(); - $redirectUrls->setReturnUrl("http://localhost/return"); - $redirectUrls->setCancelUrl("http://localhost/cancel"); - - $payment = new Payment(); - $payment->setIntent("sale"); - $payment->setRedirectUrls($redirectUrls); - $payment->setPayer($payer); - $payment->setTransactions(array($transaction)); - - return $payment; - } - - public function setup() { - $this->payments['full'] = self::createPayment(); - $this->payments['new'] = self::createNewPayment(); - } - - public function testSerializeDeserialize() { - $p2 = new Payment(); - $p2->fromJson($this->payments['full']->toJSON()); - $this->assertEquals($p2, $this->payments['full']); - } - - public function testOperations() { - - $p1 = $this->payments['new']; - - $p1->create(); - $this->assertNotNull($p1->getId()); - - $p2 = Payment::get($p1->getId()); - $this->assertNotNull($p2); - - $paymentHistory = Payment::all(array('count' => '10')); - $this->assertNotNull($paymentHistory); - } -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/RefundTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/RefundTest.php deleted file mode 100644 index 657e167..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/RefundTest.php +++ /dev/null @@ -1,54 +0,0 @@ -setCreateTime(self::$createTime); - $refund->setAmount(AmountTest::createAmount()); - $refund->setCaptureId(self::$captureId); - $refund->setId(self::$id); - $refund->setLinks(array(LinksTest::createLinks())); - $refund->setParentPayment(self::$parentPayment); - - return $refund; - } - - public function setup() { - $this->refund = self::createRefund(); - } - - public function testGetterSetter() { - $this->assertEquals(self::$captureId, $this->refund->getCaptureId()); - $this->assertEquals(self::$createTime, $this->refund->getCreateTime()); - $this->assertEquals(self::$id, $this->refund->getId()); - $this->assertEquals(self::$parentPayment, $this->refund->getParentPayment()); - $this->assertEquals(AmountTest::$currency, $this->refund->getAmount()->getCurrency()); - $links = $this->refund->getLinks(); - $this->assertEquals(LinksTest::$href, $links[0]->getHref()); - } - - public function testSerializeDeserialize() { - $r1 = $this->refund; - - $r2 = new Refund(); - $r2->fromJson($r1->toJson()); - - $this->assertEquals($r1, $r2); - } - - public function testOperations() { - - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/RelatedResourcesTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/RelatedResourcesTest.php deleted file mode 100644 index c977395..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/RelatedResourcesTest.php +++ /dev/null @@ -1,35 +0,0 @@ -setAuthorization(AuthorizationTest::createAuthorization()); - $relatedResources->setCapture(CaptureTest::createCapture()); - return $relatedResources; - } - - public function setup() { - $this->relatedResources = self::createRelatedResources(); - } - - public function testGetterSetter() { - $this->assertEquals(AuthorizationTest::$create_time, $this->relatedResources->getAuthorization()->getCreateTime()); - $this->assertEquals(CaptureTest::$create_time, $this->relatedResources->getCapture()->getCreateTime()); - } - - public function testSerializeDeserialize() { - $s1 = $this->relatedResources; - - $s2 = new RelatedResources(); - $s2->fromJson($s1->toJson()); - - $this->assertEquals($s1, $s2); - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/SaleTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/SaleTest.php deleted file mode 100644 index b4c6972..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/SaleTest.php +++ /dev/null @@ -1,73 +0,0 @@ -setAmount(AmountTest::createAmount()); - $sale->setCreateTime(self::$createTime); - $sale->setId(self::$id); - $sale->setLinks(array(LinksTest::createLinks())); - $sale->setParentPayment(self::$parentPayment); - $sale->setState(self::$state); - return $sale; - } - - public function setup() { - $this->sale = self::createSale(); - } - - public function testGetterSetter() { - $this->assertEquals(self::$createTime, $this->sale->getCreateTime()); - $this->assertEquals(self::$id, $this->sale->getId()); - $this->assertEquals(self::$parentPayment, $this->sale->getParentPayment()); - $this->assertEquals(self::$state, $this->sale->getState()); - $this->assertEquals(AmountTest::$currency, $this->sale->getAmount()->getCurrency()); - $links = $this->sale->getLinks(); - $this->assertEquals(LinksTest::$href, $links[0]->getHref()); - } - - public function testSerializeDeserialize() { - $s1 = $this->sale; - - $s2 = new Sale(); - $s2->fromJson($s1->toJson()); - - $this->assertEquals($s1, $s2); - } - - public function testOperations() { - $payment = PaymentTest::createNewPayment(); - $payment->create(); - - $transactions = $payment->getTransactions(); - $resources = $transactions[0]->getRelatedResources(); - $saleId = $resources[0]->getSale()->getId(); - - $sale = Sale::get($saleId); - $this->assertNotNull($sale); - - $refund = new Refund(); - $refund->setAmount(AmountTest::createAmount()); - $sale->refund($refund); - - $this->setExpectedException('\InvalidArgumentException'); - $sale->refund(NULL); - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/ShippingAddressTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/ShippingAddressTest.php deleted file mode 100644 index 6ca8b93..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/ShippingAddressTest.php +++ /dev/null @@ -1,56 +0,0 @@ -setLine1(self::$line1); - $addr->setLine2(self::$line2); - $addr->setCity(self::$city); - $addr->setState(self::$state); - $addr->setPostalCode(self::$postalCode); - $addr->setCountryCode(self::$countryCode); - $addr->setPhone(self::$phone); - $addr->setRecipientName(self::$recipientName); - return $addr; - } - - public function setup() { - $this->address = self::createAddress(); - } - - public function testGetterSetter() { - $this->assertEquals(self::$line1, $this->address->getLine1()); - $this->assertEquals(self::$line2, $this->address->getLine2()); - $this->assertEquals(self::$city, $this->address->getCity()); - $this->assertEquals(self::$state, $this->address->getState()); - $this->assertEquals(self::$postalCode, $this->address->getPostalCode()); - $this->assertEquals(self::$countryCode, $this->address->getCountryCode()); - $this->assertEquals(self::$phone, $this->address->getPhone()); - $this->assertEquals(self::$recipientName, $this->address->getRecipientName()); - } - - public function testSerializeDeserialize() { - $a1 = $this->address; - - $a2 = new ShippingAddress(); - $a2->fromJson($a1->toJson()); - - $this->assertEquals($a1, $a2); - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/TransactionTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/TransactionTest.php deleted file mode 100644 index f2e0ba3..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Api/TransactionTest.php +++ /dev/null @@ -1,49 +0,0 @@ -setAmount(AmountTest::createAmount()); - $transaction->setDescription(self::$description); - $transaction->setItemList(ItemListTest::createItemList()); - $transaction->setPayee(PayeeTest::createPayee()); - $transaction->setRelatedResources( array(RelatedResourcesTest::createRelatedResources()) ); - return $transaction; - } - - public function setup() { - $this->transaction = self::createTransaction(); - } - - public function testGetterSetter() { - $this->assertEquals(AmountTest::$currency, $this->transaction->getAmount()->getCurrency()); - $this->assertEquals(self::$description, $this->transaction->getDescription()); - $items = $this->transaction->getItemList()->getItems(); - $this->assertEquals(ItemTest::$quantity, $items[0]->getQuantity()); - $this->assertEquals(PayeeTest::$email, $this->transaction->getPayee()->getEmail()); - $resources = $this->transaction->getRelatedResources(); - $this->assertEquals(AuthorizationTest::$create_time, $resources[0]->getAuthorization()->getCreateTime()); - } - - public function testSerializeDeserialize() { - $t1 = $this->transaction; - - $t2 = new Transaction(); - $t2->fromJson($t1->toJson()); - - $this->assertEquals($t1, $t2); - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Auth/OAuthTokenCredentialTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Auth/OAuthTokenCredentialTest.php deleted file mode 100644 index 5dfe13e..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Auth/OAuthTokenCredentialTest.php +++ /dev/null @@ -1,35 +0,0 @@ -getConfigHashmap(); - - $token = $cred->getAccessToken($config); - $this->assertNotNull($token); - - // Check that we get the same token when issuing a new call before token expiry - $newToken = $cred->getAccessToken($config); - $this->assertNotNull($newToken); - $this->assertEquals($token, $newToken); - -// sleep(60*8); -// $newToken = $cred->getAccessToken(); -// $this->assertNotNull($newToken); -// $this->assertNotEqual($token, $newToken); - - } - - public function testInvalidCredentials() { - $this->setExpectedException('PayPal\Exception\PPConnectionException'); - $cred = new OAuthTokenCredential('dummy', 'secret'); - $this->assertNull($cred->getAccessToken(PPConfigManager::getInstance()->getConfigHashmap())); - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Common/ArrayClass.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Common/ArrayClass.php deleted file mode 100644 index 3470847..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Common/ArrayClass.php +++ /dev/null @@ -1,29 +0,0 @@ -name = $name; - } - public function getName() { - return $this->name; - } - - public function setDescription($desc) { - $this->desc = $desc; - } - public function getDescription() { - return $this->desc; - } - - public function setTags($tags) { - if(!is_array($tags)) { - $tags = array($tags); - } - $this->tags = $tags; - } - public function getTags() { - return $this->tags; - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Common/ArrayUtilTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Common/ArrayUtilTest.php deleted file mode 100644 index 824b684..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Common/ArrayUtilTest.php +++ /dev/null @@ -1,21 +0,0 @@ -assertEquals(false, PPArrayUtil::isAssocArray($arr)); - - $arr = array( - 'name' => 'John Doe', - 'City' => 'San Jose' - ); - $this->assertEquals(true, PPArrayUtil::isAssocArray($arr)); - - $arr[] = 'CA'; - $this->assertEquals(false, PPArrayUtil::isAssocArray($arr)); - } -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Common/ChildClass.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Common/ChildClass.php deleted file mode 100644 index a9a294b..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Common/ChildClass.php +++ /dev/null @@ -1,6 +0,0 @@ -setName("test"); - $o->setDescription("description"); - - $this->assertEquals("test", $o->getName()); - $this->assertEquals("description", $o->getDescription()); - - $json = $o->toJSON(); - $this->assertEquals('{"name":"test","desc":"description"}', $json); - - $newO = new SimpleClass(); - $newO->fromJson($json); - $this->assertEquals($o, $newO); - - } - - - public function testArrayClassConversion() { - $o = new ArrayClass(); - $o->setName("test"); - $o->setDescription("description"); - $o->setTags(array('payment', 'info', 'test')); - - $this->assertEquals("test", $o->getName()); - $this->assertEquals("description", $o->getDescription()); - $this->assertEquals(array('payment', 'info', 'test'), $o->getTags()); - - $json = $o->toJSON(); - $this->assertEquals('{"name":"test","desc":"description","tags":["payment","info","test"]}', $json); - - $newO = new ArrayClass(); - $newO->fromJson($json); - $this->assertEquals($o, $newO); - } - - public function testNestedClassConversion() { - $n = new ArrayClass(); - $n->setName("test"); - $n->setDescription("description"); -// $n->setTags(array('payment', 'info', 'test')); - $o = new NestedClass(); - $o->setId('123'); - $o->setInfo($n); - - $this->assertEquals("123", $o->getId()); - $this->assertEquals("test", $o->getInfo()->getName()); -// $this->assertEquals(array('payment', 'info', 'test'), $o->getInfo()->getTags()); - - $json = $o->toJSON(); -// $this->assertEquals('{"id":"123","info":{"name":"test","desc":"description","tags":["payment","info","test"]}}', $json); - $this->assertEquals('{"id":"123","info":{"name":"test","desc":"description"}}', $json); - - $newO = new NestedClass(); - $newO->fromJson($json); - $this->assertEquals($o, $newO); - } -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Common/NestedClass.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Common/NestedClass.php deleted file mode 100644 index 06e5e00..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Common/NestedClass.php +++ /dev/null @@ -1,27 +0,0 @@ -id = $id; - } - public function getId() { - return $this->id; - } - - /** - * - * @param PayPal\Test\Common\ArrayClass $info - */ - public function setInfo($info) { - $this->info = $info; - } - /** - * - * @return PayPal\Test\Common\ArrayClass - */ - public function getInfo() { - return $this->info; - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Common/SimpleClass.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Common/SimpleClass.php deleted file mode 100644 index 86732b1..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Common/SimpleClass.php +++ /dev/null @@ -1,19 +0,0 @@ -name = $name; - } - public function getName() { - return $this->name; - } - - public function setDescription($desc) { - $this->desc = $desc; - } - public function getDescription() { - return $this->desc; - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Common/UserAgentTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Common/UserAgentTest.php deleted file mode 100644 index d945374..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Common/UserAgentTest.php +++ /dev/null @@ -1,26 +0,0 @@ -assertNotNull($id); - $this->assertNotNull($version); - $this->assertNotNull($features); - - $this->assertEquals("name", $id); - $this->assertEquals("version", $version); - - // Check that we pass in these mininal features - $this->assertThat($features, $this->stringContains("OS=")); - $this->assertThat($features, $this->stringContains("Bit=")); - $this->assertThat($features, $this->stringContains("Lang=")); - $this->assertThat($features, $this->stringContains("V=")); - $this->assertGreaterThan(5, count(explode(';', $features))); - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Constants.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Constants.php deleted file mode 100644 index 7c424e3..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/PayPal/Test/Constants.php +++ /dev/null @@ -1,7 +0,0 @@ -execute('/v1/payments/echo', "POST", $data, $cred); - $this->assertEquals($data, $ret); - } - - public function testExecuteWithInvalidCredentials() { - - $cred = new OAuthTokenCredential('test', 'dummy'); - $data = '"request":"test message"'; - - $call = new Call(); - $this->setExpectedException('\PPConnectionException'); - $ret = $call->execute('/v1/payments/echo', "POST", $data, $cred); - - } - - - public function testExecuteWithDefaultCredentials() { - - $data = '"request":"test message"'; - - $call = new Call(); - $ret = $call->execute('/v1/payments/echo', "POST", $data); - $this->assertEquals($data, $ret); - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/bootstrap.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/bootstrap.php deleted file mode 100644 index d249596..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/bootstrap.php +++ /dev/null @@ -1,6 +0,0 @@ -add('PayPal\\Test', __DIR__); -define("PP_CONFIG_PATH", __DIR__); \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/sdk_config.ini b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/sdk_config.ini deleted file mode 100644 index f73b92a..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/rest-api-sdk-php/tests/sdk_config.ini +++ /dev/null @@ -1,35 +0,0 @@ -;Account credentials from developer portal -[Account] -acct1.ClientId = EBWKjlELKMYqRNQ6sYvFo64FtaRLRR5BdHEESmha49TM -acct1.ClientSecret = EO422dn3gQLgDbuwqTjzrFgFtaRLRR5BdHEESmha49TM - - -;Connection Information -[Http] -http.ConnectionTimeOut = 30 -http.Retry = 1 -;http.Proxy=http://[username:password]@hostname[:port][/path] - - -;Service Configuration -[Service] -service.EndPoint="https://api.sandbox.paypal.com" -; Uncomment this line for integrating with the live endpoint -; service.EndPoint="https://api.paypal.com" - - -;Logging Information -[Log] - -log.LogEnabled=true - -# When using a relative path, the log file is created -# relative to the .php file that is the entry point -# for this request. You can also provide an absolute -# path here -log.FileName=PayPal.log - -# Logging level can be one of FINE, INFO, WARN or ERROR -# Logging is most verbose in the 'FINE' level and -# decreases as you proceed towards ERROR -log.LogLevel=FINE diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/.gitignore b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/.gitignore deleted file mode 100644 index 0db5431..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ -tests/reports -build -.DS_Store -*.log - -# IDE -.project -.settings -.buildpath -*.bak - -# Composer -vendor -composer.lock diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/CHANGELOG.md b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/CHANGELOG.md deleted file mode 100644 index bfa023a..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/CHANGELOG.md +++ /dev/null @@ -1,18 +0,0 @@ - -CHANGELOG -========= -V2.4.0 (May 20, 2013) ---------------------------------------------------------------------------------------- - * Bugfix - removing deprecated methods like setAccessToken, getAccessToken from baseService - * Bugfix - adding correct thirdparty auth header - -V2.4.0 (May 20, 2013) ---------------------------------------------------------------------------------------- - * Updating SDK to use NameSpaces - - -V1.4.0 (April 26, 2013) ---------------------------------------------------------------------------------------- - * Adding support for Openid Connect - - diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/LICENSE.txt b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/LICENSE.txt deleted file mode 100644 index ad030e5..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/LICENSE.txt +++ /dev/null @@ -1,41 +0,0 @@ -PAYPAL, INC. - -SDK LICENSE - -NOTICE TO USER: PayPal, Inc. is providing the Software and Documentation for use under the terms of this Agreement. Any use, reproduction, modification or distribution of the Software or Documentation, or any derivatives or portions hereof, constitutes your acceptance of this Agreement. - -As used in this Agreement, "PayPal" means PayPal, Inc. "Software" means the software code accompanying this agreement. "Documentation" means the documents, specifications and all other items accompanying this Agreement other than the Software. - -1. LICENSE GRANT Subject to the terms of this Agreement, PayPal hereby grants you a non-exclusive, worldwide, royalty free license to use, reproduce, prepare derivative works from, publicly display, publicly perform, distribute and sublicense the Software for any purpose, provided the copyright notice below appears in a conspicuous location within the source code of the distributed Software and this license is distributed in the supporting documentation of the Software you distribute. Furthermore, you must comply with all third party licenses in order to use the third party software contained in the Software. - -Subject to the terms of this Agreement, PayPal hereby grants you a non-exclusive, worldwide, royalty free license to use, reproduce, publicly display, publicly perform, distribute and sublicense the Documentation for any purpose. You may not modify the Documentation. - -No title to the intellectual property in the Software or Documentation is transferred to you under the terms of this Agreement. You do not acquire any rights to the Software or the Documentation except as expressly set forth in this Agreement. - -If you choose to distribute the Software in a commercial product, you do so with the understanding that you agree to defend, indemnify and hold harmless PayPal and its suppliers against any losses, damages and costs arising from the claims, lawsuits or other legal actions arising out of such distribution. You may distribute the Software in object code form under your own license, provided that your license agreement: - -(a) complies with the terms and conditions of this license agreement; - -(b) effectively disclaims all warranties and conditions, express or implied, on behalf of PayPal; - -(c) effectively excludes all liability for damages on behalf of PayPal; - -(d) states that any provisions that differ from this Agreement are offered by you alone and not PayPal; and - -(e) states that the Software is available from you or PayPal and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange. - -2. DISCLAIMER OF WARRANTY -PAYPAL LICENSES THE SOFTWARE AND DOCUMENTATION TO YOU ONLY ON AN "AS IS" BASIS WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. PAYPAL MAKES NO WARRANTY THAT THE SOFTWARE OR DOCUMENTATION WILL BE ERROR-FREE. Each user of the Software or Documentation is solely responsible for determining the appropriateness of using and distributing the Software and Documentation and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs, or equipment, and unavailability or interruption of operations. Use of the Software and Documentation is made with the understanding that PayPal will not provide you with any technical or customer support or maintenance. Some states or jurisdictions do not allow the exclusion of implied warranties or limitations on how long an implied warranty may last, so the above limitations may not apply to you. To the extent permissible, any implied warranties are limited to ninety (90) days. - - -3. LIMITATION OF LIABILITY -PAYPAL AND ITS SUPPLIERS SHALL NOT BE LIABLE FOR LOSS OR DAMAGE ARISING OUT OF THIS AGREEMENT OR FROM THE USE OF THE SOFTWARE OR DOCUMENTATION. IN NO EVENT WILL PAYPAL OR ITS SUPPLIERS BE LIABLE TO YOU OR ANY THIRD PARTY FOR ANY DIRECT, INDIRECT, CONSEQUENTIAL, INCIDENTAL, OR SPECIAL DAMAGES INCLUDING LOST PROFITS, LOST SAVINGS, COSTS, FEES, OR EXPENSES OF ANY KIND ARISING OUT OF ANY PROVISION OF THIS AGREEMENT OR THE USE OR THE INABILITY TO USE THE SOFTWARE OR DOCUMENTATION, HOWEVER CAUSED AND UNDER ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY OR TORT INCLUDING NEGLIGENCE OR OTHERWISE), EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. PAYPAL'S AGGREGATE LIABILITY AND THAT OF ITS SUPPLIERS UNDER OR IN CONNECTION WITH THIS AGREEMENT SHALL BE LIMITED TO THE AMOUNT PAID BY YOU FOR THE SOFTWARE AND DOCUMENTATION. - -4. TRADEMARK USAGE -PayPal is a trademark PayPal, Inc. in the United States and other countries. Such trademarks may not be used to endorse or promote any product unless expressly permitted under separate agreement with PayPal. - -5. TERM -Your rights under this Agreement shall terminate if you fail to comply with any of the material terms or conditions of this Agreement and do not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all your rights under this Agreement terminate, you agree to cease use and distribution of the Software and Documentation as soon as reasonably practicable. - -6. GOVERNING LAW AND JURISDICTION. This Agreement is governed by the statutes and laws of the State of California, without regard to the conflicts of law principles thereof. If any part of this Agreement is found void and unenforceable, it will not affect the validity of the balance of the Agreement, which shall remain valid and enforceable according to its terms. Any dispute arising out of or related to this Agreement shall be brought in the courts of Santa Clara County, California, USA. - diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/README.md b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/README.md deleted file mode 100644 index 035c047..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/README.md +++ /dev/null @@ -1,42 +0,0 @@ -### PayPal Core SDK - V2.4.0 - -#### Prerequisites - - * PHP 5.3 and above - * curl extension with support for OpenSSL - * PHPUnit 3.5 for running test suite (Optional) - * Composer - -#### Configuration - - -#### OpenID Connect Integration - - 1. Redirect your buyer to `PPOpenIdSession::getAuthorizationUrl($redirectUri, array('openid', 'address'));` to obtain authorization. The second argument is the list of access privileges that you want from the buyer. - 2. Capture the authorization code that is available as a query parameter (`code`) in the redirect url - 3. Exchange the authorization code for a access token, refresh token, id token combo - - -```php - $token = PPOpenIdTokeninfo::createFromAuthorizationCode( - array( - 'code' => $authCode - ) - ); -``` - 4. The access token is valid for a predefined duration and can be used for seamless XO or for retrieving user information - - -```php - $user = PPOpenIdUserinfo::getUserinfo( - array( - 'access_token' => $token->getAccessToken() - ) - ); -``` - 5. If the access token has expired, you can obtain a new access token using the refresh token from the 3'rd step. - -```php - $token->createFromRefreshToken(array('openid', 'address')); -``` - 6. Redirect your buyer to `PPOpenIdSession::getLogoutUrl($redirectUri, $idToken);` to log him out of paypal. diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/build.xml b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/build.xml deleted file mode 100644 index 0496420..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/build.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/composer.json b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/composer.json deleted file mode 100644 index 961fb47..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/composer.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "paypal/sdk-core-php", - "description": "PayPal Core SDK for PHP", - "keywords": ["paypal", "php", "sdk"], - "type": "library", - "homepage": "https://github.com/paypal/sdk-core-php", - "license": "Apache2", - "authors": [ - { - "name": "PayPal", - "homepage": "https://github.com/paypal/sdk-core-php/contributors" - } - ], - "require": { - "php": ">=5.3.0", - "ext-curl": "*" - }, - "autoload": { - "psr-0": { - "PayPal": "lib/" - } - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/IPPCredential.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/IPPCredential.php deleted file mode 100644 index da994c4..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/IPPCredential.php +++ /dev/null @@ -1,23 +0,0 @@ -thirdPartyAuthorization = $thirdPartyAuthorization; - } - - public function getThirdPartyAuthorization() { - return $this->thirdPartyAuthorization; - } - - public abstract function validate(); -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/IPPThirdPartyAuthorization.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/IPPThirdPartyAuthorization.php deleted file mode 100644 index f019dfa..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/IPPThirdPartyAuthorization.php +++ /dev/null @@ -1,11 +0,0 @@ -add_signature_method($hmac_method); - - $sig_method = $hmac_method; - $authConsumer = new OAuthConsumer($key, $secret, NULL); - $authToken = NULL; - $authToken = new OAuthToken($token, $tokenSecret); - - //$params is the query param array which is required only in the httpMethod is "GET" - $params = array(); - //TODO: set the Query parameters to $params if httpMethod is "GET" - - $acc_req = OAuthRequest::from_consumer_and_token($authConsumer, $authToken, $httpMethod, $endpoint, $params); - $acc_req->sign_request($sig_method,$authConsumer, $authToken); - return OAuthutil::parseQueryString($acc_req); - } - - public static function generateFullAuthString($key, $secret, $token, $tokenSecret, $httpMethod, $endpoint) { - $authSignature = new AuthSignature(); - $response = $authSignature->genSign($key, $secret, $token, $tokenSecret, $httpMethod, $endpoint); - return "token=" . $token . - ",signature=" . $response['oauth_signature'] . - ",timestamp=" . $response['oauth_timestamp']; - } - -} -?> \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Oauth/MockOAuthDataStore.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Oauth/MockOAuthDataStore.php deleted file mode 100644 index c9f0833..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Oauth/MockOAuthDataStore.php +++ /dev/null @@ -1,54 +0,0 @@ -consumer = new OAuthConsumer("key", "secret", NULL); - $this->request_token = new OAuthToken("requestkey", "requestsecret", 1); - $this->access_token = new OAuthToken("accesskey", "accesssecret", 1); - $this->nonce = "nonce"; - }/*}}}*/ - - function lookup_consumer($consumer_key) {/*{{{*/ - if ($consumer_key == $this->consumer->key) return $this->consumer; - return NULL; - }/*}}}*/ - - function lookup_token($consumer, $token_type, $token) {/*{{{*/ - $token_attrib = $token_type . "_token"; - if ($consumer->key == $this->consumer->key - && $token == $this->$token_attrib->key) { - return $this->$token_attrib; - } - return NULL; - }/*}}}*/ - - function lookup_nonce($consumer, $token, $nonce, $timestamp) {/*{{{*/ - if ($consumer->key == $this->consumer->key - && (($token && $token->key == $this->request_token->key) - || ($token && $token->key == $this->access_token->key)) - && $nonce == $this->nonce) { - return $this->nonce; - } - return NULL; - }/*}}}*/ - - function new_request_token($consumer, $callback = NULL) {/*{{{*/ - if ($consumer->key == $this->consumer->key) { - return $this->request_token; - } - return NULL; - }/*}}}*/ - - function new_access_token($token, $consumer, $verifier = NULL) {/*{{{*/ - if ($consumer->key == $this->consumer->key - && $token->key == $this->request_token->key) { - return $this->access_token; - } - return NULL; - }/*}}}*/ -}/*}}}*/ diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Oauth/OAuthConsumer.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Oauth/OAuthConsumer.php deleted file mode 100644 index 95bb48e..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Oauth/OAuthConsumer.php +++ /dev/null @@ -1,17 +0,0 @@ -key = $key; - $this->secret = $secret; - $this->callback_url = $callback_url; - } - - function __toString() { - return "OAuthConsumer[key=$this->key,secret=$this->secret]"; - } -} -?> \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Oauth/OAuthDataStore.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Oauth/OAuthDataStore.php deleted file mode 100644 index 2133acc..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Oauth/OAuthDataStore.php +++ /dev/null @@ -1,27 +0,0 @@ -parameters = $parameters; - $this->http_method = $http_method; - $this->http_url = $http_url; - } - - - /** - * attempt to build up a request from what was passed to the server - */ - public static function from_request($http_method=NULL, $http_url=NULL, $parameters=NULL) { - $scheme = (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != "on") - ? 'http' - : 'https'; - $http_url = ($http_url) ? $http_url : $scheme . - '://' . $_SERVER['HTTP_HOST'] . - ':' . - $_SERVER['SERVER_PORT'] . - $_SERVER['REQUEST_URI']; - $http_method = ($http_method) ? $http_method : $_SERVER['REQUEST_METHOD']; - - // We weren't handed any parameters, so let's find the ones relevant to - // this request. - // If you run XML-RPC or similar you should use this to provide your own - // parsed parameter-list - if (!$parameters) { - // Find request headers - $request_headers = OAuthUtil::get_headers(); - - // Parse the query-string to find GET parameters - $parameters = OAuthUtil::parse_parameters($_SERVER['QUERY_STRING']); - - // It's a POST request of the proper content-type, so parse POST - // parameters and add those overriding any duplicates from GET - if ($http_method == "POST" - && isset($request_headers['Content-Type']) - && strstr($request_headers['Content-Type'], - 'application/x-www-form-urlencoded') - ) { - $post_data = OAuthUtil::parse_parameters( - file_get_contents(self::$POST_INPUT) - ); - $parameters = array_merge($parameters, $post_data); - } - - // We have a Authorization-header with OAuth data. Parse the header - // and add those overriding any duplicates from GET or POST - if (isset($request_headers['Authorization']) && substr($request_headers['Authorization'], 0, 6) == 'OAuth ') { - $header_parameters = OAuthUtil::split_header( - $request_headers['Authorization'] - ); - $parameters = array_merge($parameters, $header_parameters); - } - - } - - return new OAuthRequest($http_method, $http_url, $parameters); - } - - /** - * pretty much a helper function to set up the request - */ - public static function from_consumer_and_token($consumer, $token, $http_method, $http_url, $parameters=NULL) { - $parameters = ($parameters) ? $parameters : array(); - $defaults = array("oauth_version" => OAuthRequest::$version, - // "oauth_nonce" => OAuthRequest::generate_nonce(), - "oauth_timestamp" => OAuthRequest::generate_timestamp(), - - "oauth_consumer_key" => $consumer->key); - if ($token) - $defaults['oauth_token'] = $token->key; - - $parameters = array_merge($defaults, $parameters); - ksort($parameters); - return new OAuthRequest($http_method, $http_url, $parameters); - } - - public function set_parameter($name, $value, $allow_duplicates = true) { - if ($allow_duplicates && isset($this->parameters[$name])) { - // We have already added parameter(s) with this name, so add to the list - if (is_scalar($this->parameters[$name])) { - // This is the first duplicate, so transform scalar (string) - // into an array so we can add the duplicates - $this->parameters[$name] = array($this->parameters[$name]); - } - - $this->parameters[$name][] = $value; - } else { - $this->parameters[$name] = $value; - } - } - - public function get_parameter($name) { - return isset($this->parameters[$name]) ? $this->parameters[$name] : null; - } - - public function get_parameters() { - return $this->parameters; - } - - public function unset_parameter($name) { - unset($this->parameters[$name]); - } - - /** - * The request parameters, sorted and concatenated into a normalized string. - * @return string - */ - public function get_signable_parameters() { - // Grab all parameters - $params = $this->parameters; - ksort($params); - // Remove oauth_signature if present - // Ref: Spec: 9.1.1 ("The oauth_signature parameter MUST be excluded.") - if (isset($params['oauth_signature'])) { - unset($params['oauth_signature']); - } - foreach($params as $key => $value) - { - $res[]=$key."=".$value; - } - - return implode('&', $res); - //return OAuthUtil::build_http_query($params); - } - - /** - * Returns the base string of this request - * - * The base string defined as the method, the url - * and the parameters (normalized), each urlencoded - * and the concated with &. - */ - public function get_signature_base_string() { - $parts = array( - $this->get_normalized_http_method(), - $this->get_normalized_http_url(), - $this->get_signable_parameters() - ); - - $parts = OAuthUtil::urlencode_rfc3986($parts); - - return implode('&', $parts); - } - - /** - * just uppercases the http method - */ - public function get_normalized_http_method() { - return strtoupper($this->http_method); - } - - /** - * parses the url and rebuilds it to be - * scheme://host/path - */ - public function get_normalized_http_url() { - $parts = parse_url($this->http_url); - - $scheme = (isset($parts['scheme'])) ? $parts['scheme'] : 'http'; - $port = (isset($parts['port'])) ? $parts['port'] : (($scheme == 'https') ? '443' : '80'); - $host = (isset($parts['host'])) ? $parts['host'] : ''; - $path = (isset($parts['path'])) ? $parts['path'] : ''; - - if (($scheme == 'https' && $port != '443') - || ($scheme == 'http' && $port != '80')) { - $host = "$host:$port"; - } - return "$scheme://$host$path"; - } - - /** - * builds a url usable for a GET request - */ - public function to_url() { - $post_data = $this->to_postdata(); - $out = $this->get_normalized_http_url(); - if ($post_data) { - $out .= '?'.$post_data; - } - return $out; - } - - /** - * builds the data one would send in a POST request - */ - public function to_postdata() { - return OAuthUtil::build_http_query($this->parameters); - } - - /** - * builds the Authorization: header - */ - public function to_header($realm=null) { - $first = true; - if($realm) { - $out = 'Authorization: OAuth realm="' . OAuthUtil::urlencode_rfc3986($realm) . '"'; - $first = false; - } else - $out = 'Authorization: OAuth'; - - $total = array(); - foreach ($this->parameters as $k => $v) { - if (substr($k, 0, 5) != "oauth") continue; - if (is_array($v)) { - throw new OAuthException('Arrays not supported in headers'); - } - $out .= ($first) ? ' ' : ','; - $out .= OAuthUtil::urlencode_rfc3986($k) . - '="' . - OAuthUtil::urlencode_rfc3986($v) . - '"'; - $first = false; - } - return $out; - } - - public function __toString() { - return $this->to_url(); - } - - - public function sign_request($signature_method,$consumer, $token) { - - $empty=false; - $msg=array(); - if( $token->key==null){ - $msg[] = 'Token key'; - } - if($token->secret==null){ - $msg[] = 'Token secret'; - } - if($consumer->key == null){ - - $msg[] = 'Consumer key'; - } - if($consumer->secret == null){ - - $msg[] = 'Consumer secret'; - } - if($this->http_url == null){ - - $msg[] ='Endpoint'; - } - if($this->http_method == null){ - - $msg[] ='HTTP method'; - } - if(count($msg)) - { - throw new OAuthException('Enter valid '. implode(',',$msg)); - } - $this->set_parameter( - "oauth_signature_method", - $signature_method->get_name(), - false ); - - $signature = $this->build_signature($signature_method, $consumer, $token); - $this->set_parameter("oauth_signature", $signature, false); - - } - - public function build_signature($signature_method, $consumer, $token) { - $signature = $signature_method->build_signature($this, $consumer, $token); - return $signature; - } - - /** - * util function: current timestamp - */ - private static function generate_timestamp() { - return time(); - } - - /** - * util function: current nonce - */ - private static function generate_nonce() { - $mt = microtime(); - $rand = mt_rand(); - - return md5($mt . $rand); // md5s look nicer than numbers - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Oauth/OAuthServer.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Oauth/OAuthServer.php deleted file mode 100644 index 48c3257..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Oauth/OAuthServer.php +++ /dev/null @@ -1,223 +0,0 @@ -data_store = $data_store; - } - - public function add_signature_method($signature_method) { - $this->signature_methods[$signature_method->get_name()] = - $signature_method; - } - - // high level functions - - /** - * process a request_token request - * returns the request token on success - */ - public function fetch_request_token(&$request) { - $this->get_version($request); - - $consumer = $this->get_consumer($request); - - // no token required for the initial token request - $token = NULL; - - $this->check_signature($request, $consumer, $token); - - // Rev A change - $callback = $request->get_parameter('oauth_callback'); - $new_token = $this->data_store->new_request_token($consumer, $callback); - - return $new_token; - } - - /** - * process an access_token request - * returns the access token on success - */ - public function fetch_access_token(&$request) { - $this->get_version($request); - - $consumer = $this->get_consumer($request); - - // requires authorized request token - $token = $this->get_token($request, $consumer, "request"); - - $this->check_signature($request, $consumer, $token); - - // Rev A change - $verifier = $request->get_parameter('oauth_verifier'); - $new_token = $this->data_store->new_access_token($token, $consumer, $verifier); - - return $new_token; - } - - /** - * verify an api call, checks all the parameters - */ - public function verify_request(&$request) { - $this->get_version($request); - $consumer = $this->get_consumer($request); - $token = $this->get_token($request, $consumer, "access"); - $this->check_signature($request, $consumer, $token); - return array($consumer, $token); - } - - // Internals from here - /** - * version 1 - */ - private function get_version(&$request) { - $version = $request->get_parameter("oauth_version"); - if (!$version) { - // Service Providers MUST assume the protocol version to be 1.0 if this parameter is not present. - // Chapter 7.0 ("Accessing Protected Ressources") - $version = '1.0'; - } - if ($version !== $this->version) { - throw new OAuthException("OAuth version '$version' not supported"); - } - return $version; - } - - /** - * figure out the signature with some defaults - */ - private function get_signature_method($request) { - $signature_method = $request instanceof OAuthRequest - ? $request->get_parameter("oauth_signature_method") - : NULL; - - if (!$signature_method) { - // According to chapter 7 ("Accessing Protected Ressources") the signature-method - // parameter is required, and we can't just fallback to PLAINTEXT - throw new OAuthException('No signature method parameter. This parameter is required'); - } - - if (!in_array($signature_method, - array_keys($this->signature_methods))) { - throw new OAuthException( - "Signature method '$signature_method' not supported " . - "try one of the following: " . - implode(", ", array_keys($this->signature_methods)) - ); - } - return $this->signature_methods[$signature_method]; - } - - /** - * try to find the consumer for the provided request's consumer key - */ - private function get_consumer($request) { - $consumer_key = $request instanceof OAuthRequest - ? $request->get_parameter("oauth_consumer_key") - : NULL; - - if (!$consumer_key) { - throw new OAuthException("Invalid consumer key"); - } - - $consumer = $this->data_store->lookup_consumer($consumer_key); - if (!$consumer) { - throw new OAuthException("Invalid consumer"); - } - - return $consumer; - } - - /** - * try to find the token for the provided request's token key - */ - private function get_token($request, $consumer, $token_type="access") { - $token_field = $request instanceof OAuthRequest - ? $request->get_parameter('oauth_token') - : NULL; - - $token = $this->data_store->lookup_token( - $consumer, $token_type, $token_field - ); - if (!$token) { - throw new OAuthException("Invalid $token_type token: $token_field"); - } - return $token; - } - - /** - * all-in-one function to check the signature on a request - * should guess the signature method appropriately - */ - private function check_signature($request, $consumer, $token) { - // this should probably be in a different method - $timestamp = $request instanceof OAuthRequest - ? $request->get_parameter('oauth_timestamp') - : NULL; - $nonce = $request instanceof OAuthRequest - ? $request->get_parameter('oauth_nonce') - : NULL; - - $this->check_timestamp($timestamp); - $this->check_nonce($consumer, $token, $nonce, $timestamp); - - $signature_method = $this->get_signature_method($request); - - $signature = $request->get_parameter('oauth_signature'); - $valid_sig = $signature_method->check_signature( - $request, - $consumer, - $token, - $signature - ); - - if (!$valid_sig) { - throw new OAuthException("Invalid signature"); - } - } - - /** - * check that the timestamp is new enough - */ - private function check_timestamp($timestamp) { - if( ! $timestamp ) - throw new OAuthException( - 'Missing timestamp parameter. The parameter is required' - ); - - // verify that timestamp is recentish - $now = time(); - if (abs($now - $timestamp) > $this->timestamp_threshold) { - throw new OAuthException( - "Expired timestamp, yours $timestamp, ours $now" - ); - } - } - - /** - * check that the nonce is not repeated - */ - private function check_nonce($consumer, $token, $nonce, $timestamp) { - if( ! $nonce ) - throw new OAuthException( - 'Missing nonce parameter. The parameter is required' - ); - - // verify that the nonce is uniqueish - $found = $this->data_store->lookup_nonce( - $consumer, - $token, - $nonce, - $timestamp - ); - if ($found) { - throw new OAuthException("Nonce already used: $nonce"); - } - } - -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Oauth/OAuthSignatureMethod.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Oauth/OAuthSignatureMethod.php deleted file mode 100644 index 2e557d9..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Oauth/OAuthSignatureMethod.php +++ /dev/null @@ -1,38 +0,0 @@ -build_signature($request, $consumer, $token); - return $built == $signature; - } -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Oauth/OAuthSignatureMethodHmacSha1.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Oauth/OAuthSignatureMethodHmacSha1.php deleted file mode 100644 index 2c35c97..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Oauth/OAuthSignatureMethodHmacSha1.php +++ /dev/null @@ -1,30 +0,0 @@ -get_signature_base_string(); - $base_string=preg_replace("/(%[A-Za-z0-9]{2})/e", "strtolower('\\0')", $base_string);//convert base string to lowercase - $request->base_string = $base_string; - - $key_parts = array( - $consumer->secret, - ($token) ? $token->secret : "" - ); - - $key_parts = OAuthUtil::urlencode_rfc3986($key_parts); - $key = implode('&', $key_parts); - $key=preg_replace("/(%[A-Za-z0-9]{2})/e", "strtolower('\\0')", $key);//convert to lowercase - return base64_encode(hash_hmac('sha1', $base_string, $key, true)); - } -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Oauth/OAuthSignatureMethodPLAINTEXT.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Oauth/OAuthSignatureMethodPLAINTEXT.php deleted file mode 100644 index c29ebf3..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Oauth/OAuthSignatureMethodPLAINTEXT.php +++ /dev/null @@ -1,34 +0,0 @@ -secret, - ($token) ? $token->secret : "" - ); - - $key_parts = OAuthUtil::urlencode_rfc3986($key_parts); - $key = implode('&', $key_parts); - $request->base_string = $key; - - return $key; - } -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Oauth/OAuthSignatureMethodRsaSha1.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Oauth/OAuthSignatureMethodRsaSha1.php deleted file mode 100644 index 8dbcc5e..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Oauth/OAuthSignatureMethodRsaSha1.php +++ /dev/null @@ -1,68 +0,0 @@ -get_signature_base_string(); - $request->base_string = $base_string; - - // Fetch the private key cert based on the request - $cert = $this->fetch_private_cert($request); - - // Pull the private key ID from the certificate - $privatekeyid = openssl_get_privatekey($cert); - - // Sign using the key - $ok = openssl_sign($base_string, $signature, $privatekeyid); - - // Release the key resource - openssl_free_key($privatekeyid); - - return base64_encode($signature); - } - - public function check_signature($request, $consumer, $token, $signature) { - $decoded_sig = base64_decode($signature); - - $base_string = $request->get_signature_base_string(); - - // Fetch the public key cert based on the request - $cert = $this->fetch_public_cert($request); - - // Pull the public key ID from the certificate - $publickeyid = openssl_get_publickey($cert); - - // Check the computed signature against the one passed in the query - $ok = openssl_verify($base_string, $decoded_sig, $publickeyid); - - // Release the key resource - openssl_free_key($publickeyid); - - return $ok == 1; - } -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Oauth/OAuthToken.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Oauth/OAuthToken.php deleted file mode 100644 index 50563e7..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Oauth/OAuthToken.php +++ /dev/null @@ -1,31 +0,0 @@ -key = $key; - $this->secret = $secret; - } - - /** - * generates the basic string serialization of a token that a server - * would respond to request_token and access_token calls with - */ - function to_string() { - return "oauth_token=" . - OAuthUtil::urlencode_rfc3986($this->key) . - "&oauth_token_secret=" . - OAuthUtil::urlencode_rfc3986($this->secret); - } - - function __toString() { - return $this->to_string(); - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Oauth/OAuthUtil.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Oauth/OAuthUtil.php deleted file mode 100644 index 8c7d34c..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Oauth/OAuthUtil.php +++ /dev/null @@ -1,169 +0,0 @@ - $h) { - $params[$h] = OAuthUtil::urldecode_rfc3986(empty($matches[3][$i]) ? $matches[4][$i] : $matches[3][$i]); - } - if (isset($params['realm'])) { - unset($params['realm']); - } - } - return $params; - } - - // helper to try to sort out headers for people who aren't running apache - public static function get_headers() { - if (function_exists('apache_request_headers')) { - // we need this to get the actual Authorization: header - // because apache tends to tell us it doesn't exist - $headers = apache_request_headers(); - - // sanitize the output of apache_request_headers because - // we always want the keys to be Cased-Like-This and arh() - // returns the headers in the same case as they are in the - // request - $out = array(); - foreach ($headers AS $key => $value) { - $key = str_replace( - " ", - "-", - ucwords(strtolower(str_replace("-", " ", $key))) - ); - $out[$key] = $value; - } - } else { - // otherwise we don't have apache and are just going to have to hope - // that $_SERVER actually contains what we need - $out = array(); - if( isset($_SERVER['CONTENT_TYPE']) ) - $out['Content-Type'] = $_SERVER['CONTENT_TYPE']; - if( isset($_ENV['CONTENT_TYPE']) ) - $out['Content-Type'] = $_ENV['CONTENT_TYPE']; - - foreach ($_SERVER as $key => $value) { - if (substr($key, 0, 5) == "HTTP_") { - // this is chaos, basically it is just there to capitalize the first - // letter of every word that is not an initial HTTP and strip HTTP - // code from przemek - $key = str_replace( - " ", - "-", - ucwords(strtolower(str_replace("_", " ", substr($key, 5)))) - ); - $out[$key] = $value; - } - } - } - return $out; - } - - // This function takes a input like a=b&a=c&d=e and returns the parsed - // parameters like this - // array('a' => array('b','c'), 'd' => 'e') - public static function parse_parameters( $input ) { - if (!isset($input) || !$input) return array(); - - $pairs = explode('&', $input); - - $parsed_parameters = array(); - foreach ($pairs as $pair) { - $split = explode('=', $pair, 2); - $parameter = OAuthUtil::urldecode_rfc3986($split[0]); - $value = isset($split[1]) ? OAuthUtil::urldecode_rfc3986($split[1]) : ''; - - if (isset($parsed_parameters[$parameter])) { - // We have already recieved parameter(s) with this name, so add to the list - // of parameters with this name - - if (is_scalar($parsed_parameters[$parameter])) { - // This is the first duplicate, so transform scalar (string) into an array - // so we can add the duplicates - $parsed_parameters[$parameter] = array($parsed_parameters[$parameter]); - } - - $parsed_parameters[$parameter][] = $value; - } else { - $parsed_parameters[$parameter] = $value; - } - } - return $parsed_parameters; - } - - public static function build_http_query($params) { - if (!$params) return ''; - - // Urlencode both keys and values - $keys = OAuthUtil::urlencode_rfc3986(array_keys($params)); - $values = OAuthUtil::urlencode_rfc3986(array_values($params)); - $params = array_combine($keys, $values); - - // Parameters are sorted by name, using lexicographical byte value ordering. - // Ref: Spec: 9.1.1 (1) - uksort($params, 'strcmp'); - - $pairs = array(); - foreach ($params as $parameter => $value) { - if (is_array($value)) { - // If two or more parameters share the same name, they are sorted by their value - // Ref: Spec: 9.1.1 (1) - // June 12th, 2010 - changed to sort because of issue 164 by hidetaka - sort($value, SORT_STRING); - foreach ($value as $duplicate_value) { - $pairs[] = $parameter . '=' . $duplicate_value; - } - } else { - $pairs[] = $parameter . '=' . $value; - } - } - // For each parameter, the name is separated from the corresponding value by an '=' character (ASCII code 61) - // Each name-value pair is separated by an '&' character (ASCII code 38) - return implode('&', $pairs); - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Openid/PPOpenIdAddress.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Openid/PPOpenIdAddress.php deleted file mode 100644 index 4cee501..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Openid/PPOpenIdAddress.php +++ /dev/null @@ -1,95 +0,0 @@ -street_address = $street_address; - return $this; - } - - /** - * Full street address component, which may include house number, street name. - * @return string - */ - public function getStreetAddress() { - return $this->street_address; - } - - /** - * City or locality component. - * @param string $locality - */ - public function setLocality($locality) { - $this->locality = $locality; - return $this; - } - - /** - * City or locality component. - * @return string - */ - public function getLocality() { - return $this->locality; - } - - /** - * State, province, prefecture or region component. - * @param string $region - */ - public function setRegion($region) { - $this->region = $region; - return $this; - } - - /** - * State, province, prefecture or region component. - * @return string - */ - public function getRegion() { - return $this->region; - } - - /** - * Zip code or postal code component. - * @param string $postal_code - */ - public function setPostalCode($postal_code) { - $this->postal_code = $postal_code; - return $this; - } - - /** - * Zip code or postal code component. - * @return string - */ - public function getPostalCode() { - return $this->postal_code; - } - - /** - * Country name component. - * @param string $country - */ - public function setCountry($country) { - $this->country = $country; - return $this; - } - - /** - * Country name component. - * @return string - */ - public function getCountry() { - return $this->country; - } - - -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Openid/PPOpenIdError.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Openid/PPOpenIdError.php deleted file mode 100644 index 1c5e051..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Openid/PPOpenIdError.php +++ /dev/null @@ -1,61 +0,0 @@ -error = $error; - return $this; - } - - /** - * A single ASCII error code from the following enum. - * @return string - */ - public function getError() { - return $this->error; - } - - /** - * A resource ID that indicates the starting resource in the returned results. - * @param string $error_description - */ - public function setErrorDescription($error_description) { - $this->error_description = $error_description; - return $this; - } - - /** - * A resource ID that indicates the starting resource in the returned results. - * @return string - */ - public function getErrorDescription() { - return $this->error_description; - } - - /** - * A URI identifying a human-readable web page with information about the error, used to provide the client developer with additional information about the error. - * @param string $error_uri - */ - public function setErrorUri($error_uri) { - $this->error_uri = $error_uri; - return $this; - } - - /** - * A URI identifying a human-readable web page with information about the error, used to provide the client developer with additional information about the error. - * @return string - */ - public function getErrorUri() { - return $this->error_uri; - } - - -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Openid/PPOpenIdSession.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Openid/PPOpenIdSession.php deleted file mode 100644 index ba76f0a..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Openid/PPOpenIdSession.php +++ /dev/null @@ -1,79 +0,0 @@ -getConfig(); - - $scope = count($scope) != 0 ? $scope : array('openid', 'profile', 'address', 'email', 'phone', 'https://uri.paypal.com/services/paypalattributes'); - if(!in_array('openid', $scope)) { - $scope[] = 'openid'; - } - $params = array( - 'client_id' => $config['acct1.ClientId'], - 'response_type' => 'code', - 'scope' => implode(" ", $scope), - 'redirect_uri' => $redirectUri - ); - return sprintf("%s/v1/authorize?%s", self::getBaseUrl($config), http_build_query($params)); - } - - - /** - * Returns the URL to which the user must be redirected to - * logout from the OpenID provider (i.e. PayPal) - * - * @param string $redirectUri Uri on merchant website to where - * the user must be redirected to post logout - * @param string $idToken id_token from the TokenInfo object - * @param PayPal/Rest/APIContext $apiContext Optional API Context - */ - public static function getLogoutUrl($redirectUri, $idToken, $apiContext=null) { - - if(is_null($apiContext)) { - $apiContext = new PPApiContext(); - } - $config = $apiContext->getConfig(); - - PPConstants::OPENID_REDIRECT_LIVE_URL; - $params = array( - 'id_token' => $idToken, - 'redirect_uri' => $redirectUri, - 'logout' => 'true' - ); - return sprintf("%s/v1/endsession?%s", self::getBaseUrl($config), http_build_query($params)); - } - - private static function getBaseUrl($config) { - - if(array_key_exists('openid.RedirectUri', $config)) { - return $config['openid.RedirectUri']; - } else if (array_key_exists('mode', $config)) { - switch(strtoupper($config['mode'])) { - case 'SANDBOX': - return PPConstants::OPENID_REDIRECT_SANDBOX_URL; - case 'LIVE': - return PPConstants::OPENID_REDIRECT_LIVE_URL; - } - } - return ; - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Openid/PPOpenIdTokeninfo.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Openid/PPOpenIdTokeninfo.php deleted file mode 100644 index cdb90d0..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Openid/PPOpenIdTokeninfo.php +++ /dev/null @@ -1,181 +0,0 @@ -scope = $scope; - return $this; - } - - /** - * OPTIONAL, if identical to the scope requested by the client; otherwise, REQUIRED. - * @return string - */ - public function getScope() { - return $this->scope; - } - - /** - * The access token issued by the authorization server. - * @param string $access_token - */ - public function setAccessToken($access_token) { - $this->access_token = $access_token; - return $this; - } - - /** - * The access token issued by the authorization server. - * @return string - */ - public function getAccessToken() { - return $this->access_token; - } - - /** - * The refresh token, which can be used to obtain new access tokens using the same authorization grant as described in OAuth2.0 RFC6749 in Section 6. - * @param string $refresh_token - */ - public function setRefreshToken($refresh_token) { - $this->refresh_token = $refresh_token; - return $this; - } - - /** - * The refresh token, which can be used to obtain new access tokens using the same authorization grant as described in OAuth2.0 RFC6749 in Section 6. - * @return string - */ - public function getRefreshToken() { - return $this->refresh_token; - } - - /** - * The type of the token issued as described in OAuth2.0 RFC6749 (Section 7.1). Value is case insensitive. - * @param string $token_type - */ - public function setTokenType($token_type) { - $this->token_type = $token_type; - return $this; - } - - /** - * The type of the token issued as described in OAuth2.0 RFC6749 (Section 7.1). Value is case insensitive. - * @return string - */ - public function getTokenType() { - return $this->token_type; - } - - /** - * The id_token is a session token assertion that denotes the user's authentication status - * @param string $id_token - */ - public function setIdToken($id_token) { - $this->id_token = $id_token; - return $this; - } - - /** - * The id_token is a session token assertion that denotes the user's authentication status - * @return string - */ - public function getIdToken() { - return $this->id_token; - } - - /** - * The lifetime in seconds of the access token. - * @param integer $expires_in - */ - public function setExpiresIn($expires_in) { - $this->expires_in = $expires_in; - return $this; - } - - /** - * The lifetime in seconds of the access token. - * @return integer - */ - public function getExpiresIn() { - return $this->expires_in; - } - - - /** - * Creates an Access Token from an Authorization Code. - * - * @path /v1/identity/openidconnect/tokenservice - * @method POST - * @param array $params (allowed values are grant_type, code and redirect_uri) - * (optional) grant_type is the Token grant type. Defaults to authorization_code - * code is Authorization code previously received from the authorization server - * redirect_uri Redirection endpoint that must match the one provided during the - * authorization request that ended in receiving the authorization code. - * @param PPApiContext $apiContext Optional API Context - * @return PPOpenIdTokeninfo - */ - public static function createFromAuthorizationCode($params, $apiContext=null) { - static $allowedParams = array('grant_type' => 1, 'code' => 1, 'redirect_uri' => 1); - if(is_null($apiContext)) { - $apiContext = new PPApiContext(); - } - - if(!array_key_exists('grant_type', $params)) { - $params['grant_type'] = 'authorization_code'; - } - - $call = new PPRestCall($apiContext); - $token = new PPOpenIdTokeninfo(); - $token->fromJson( - $call->execute(array('PPOpenIdHandler'), - "/v1/identity/openidconnect/tokenservice" , "POST", - http_build_query(array_intersect_key($params, $allowedParams)), - array('Content-Type' => 'application/x-www-form-urlencoded') - )); - return $token; - } - /** - * Creates an Access Token from an Refresh Token. - * - * @path /v1/identity/openidconnect/tokenservice - * @method POST - * @param array $params (allowed values are grant_type and scope) - * (optional) refresh_token refresh token. If one is not passed, refresh token from the current object is used. - * (optional) grant_type is the Token grant type. Defaults to refresh_token - * scope is an array that either the same or a subset of the scope passed to the authorization request - * @param APIContext $apiContext Optional API Context - * @return PPOpenIdTokeninfo - */ - public function createFromRefreshToken($params, $apiContext=null) { - - static $allowedParams = array('grant_type' => 1, 'refresh_token' => 1, 'scope' => 1); - if(is_null($apiContext)) { - $apiContext = new PPApiContext(); - } - - if(!array_key_exists('grant_type', $params)) { - $params['grant_type'] = 'refresh_token'; - } - if(!array_key_exists('refresh_token', $params)) { - $params['refresh_token'] = $this->getRefreshToken(); - } - - - $call = new PPRestCall($apiContext); - $this->fromJson( - $call->execute(array('PPOpenIdHandler'), - "/v1/identity/openidconnect/tokenservice", "POST", - http_build_query(array_intersect_key($params, $allowedParams)), - array('Content-Type' => 'application/x-www-form-urlencoded') - )); - return $this; - } -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Openid/PPOpenIdUserinfo.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Openid/PPOpenIdUserinfo.php deleted file mode 100644 index 29ff51f..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/Openid/PPOpenIdUserinfo.php +++ /dev/null @@ -1,400 +0,0 @@ -user_id = $user_id; - return $this; - } - - /** - * Subject - Identifier for the End-User at the Issuer. - * @return string - */ - public function getUserId() { - return $this->user_id; - } - - /** - * Subject - Identifier for the End-User at the Issuer. - * @param string $sub - */ - public function setSub($sub) { - $this->sub = $sub; - return $this; - } - - /** - * Subject - Identifier for the End-User at the Issuer. - * @return string - */ - public function getSub() { - return $this->sub; - } - - /** - * End-User's full name in displayable form including all name parts, possibly including titles and suffixes, ordered according to the End-User's locale and preferences. - * @param string $name - */ - public function setName($name) { - $this->name = $name; - return $this; - } - - /** - * End-User's full name in displayable form including all name parts, possibly including titles and suffixes, ordered according to the End-User's locale and preferences. - * @return string - */ - public function getName() { - return $this->name; - } - - /** - * Given name(s) or first name(s) of the End-User - * @param string $given_name - */ - public function setGivenName($given_name) { - $this->given_name = $given_name; - return $this; - } - - /** - * Given name(s) or first name(s) of the End-User - * @return string - */ - public function getGivenName() { - return $this->given_name; - } - - /** - * Surname(s) or last name(s) of the End-User. - * @param string $family_name - */ - public function setFamilyName($family_name) { - $this->family_name = $family_name; - return $this; - } - - /** - * Surname(s) or last name(s) of the End-User. - * @return string - */ - public function getFamilyName() { - return $this->family_name; - } - - /** - * Middle name(s) of the End-User. - * @param string $middle_name - */ - public function setMiddleName($middle_name) { - $this->middle_name = $middle_name; - return $this; - } - - /** - * Middle name(s) of the End-User. - * @return string - */ - public function getMiddleName() { - return $this->middle_name; - } - - /** - * URL of the End-User's profile picture. - * @param string $picture - */ - public function setPicture($picture) { - $this->picture = $picture; - return $this; - } - - /** - * URL of the End-User's profile picture. - * @return string - */ - public function getPicture() { - return $this->picture; - } - - /** - * End-User's preferred e-mail address. - * @param string $email - */ - public function setEmail($email) { - $this->email = $email; - return $this; - } - - /** - * End-User's preferred e-mail address. - * @return string - */ - public function getEmail() { - return $this->email; - } - - /** - * True if the End-User's e-mail address has been verified; otherwise false. - * @param boolean $email_verified - */ - public function setEmailVerified($email_verified) { - $this->email_verified = $email_verified; - return $this; - } - - /** - * True if the End-User's e-mail address has been verified; otherwise false. - * @return boolean - */ - public function getEmailVerified() { - return $this->email_verified; - } - - /** - * End-User's gender. - * @param string $gender - */ - public function setGender($gender) { - $this->gender = $gender; - return $this; - } - - /** - * End-User's gender. - * @return string - */ - public function getGender() { - return $this->gender; - } - - /** - * End-User's birthday, represented as an YYYY-MM-DD format. They year MAY be 0000, indicating it is omited. To represent only the year, YYYY format would be used. - * @param string $birthday - */ - public function setBirthday($birthday) { - $this->birthday = $birthday; - return $this; - } - - /** - * End-User's birthday, represented as an YYYY-MM-DD format. They year MAY be 0000, indicating it is omited. To represent only the year, YYYY format would be used. - * @return string - */ - public function getBirthday() { - return $this->birthday; - } - - /** - * Time zone database representing the End-User's time zone - * @param string $zoneinfo - */ - public function setZoneinfo($zoneinfo) { - $this->zoneinfo = $zoneinfo; - return $this; - } - - /** - * Time zone database representing the End-User's time zone - * @return string - */ - public function getZoneinfo() { - return $this->zoneinfo; - } - - /** - * End-User's locale. - * @param string $locale - */ - public function setLocale($locale) { - $this->locale = $locale; - return $this; - } - - /** - * End-User's locale. - * @return string - */ - public function getLocale() { - return $this->locale; - } - - /** - * End-User's language. - * @param string $language - */ - public function setLanguage($language) { - $this->language = $language; - return $this; - } - - /** - * End-User's language. - * @return string - */ - public function getLanguage() { - return $this->language; - } - - /** - * End-User's verified status. - * @param boolean $verified - */ - public function setVerified($verified) { - $this->verified = $verified; - return $this; - } - - /** - * End-User's verified status. - * @return boolean - */ - public function getVerified() { - return $this->verified; - } - - /** - * End-User's preferred telephone number. - * @param string $phone_number - */ - public function setPhoneNumber($phone_number) { - $this->phone_number = $phone_number; - return $this; - } - - /** - * End-User's preferred telephone number. - * @return string - */ - public function getPhoneNumber() { - return $this->phone_number; - } - - /** - * End-User's preferred address. - * @param PPOpenIdAddress $address - */ - public function setAddress($address) { - $this->address = $address; - return $this; - } - - /** - * End-User's preferred address. - * @return PPOpenIdAddress - */ - public function getAddress() { - return $this->address; - } - - /** - * Verified account status. - * @param boolean $verified_account - */ - public function setVerifiedAccount($verified_account) { - $this->verified_account = $verified_account; - return $this; - } - - /** - * Verified account status. - * @return boolean - */ - public function getVerifiedAccount() { - return $this->verified_account; - } - - /** - * Account type. - * @param string $account_type - */ - public function setAccountType($account_type) { - $this->account_type = $account_type; - return $this; - } - - /** - * Account type. - * @return string - */ - public function getAccountType() { - return $this->account_type; - } - - /** - * Account holder age range. - * @param string $age_range - */ - public function setAgeRange($age_range) { - $this->age_range = $age_range; - return $this; - } - - /** - * Account holder age range. - * @return string - */ - public function getAgeRange() { - return $this->age_range; - } - - /** - * Account payer identifier. - * @param string $payer_id - */ - public function setPayerId($payer_id) { - $this->payer_id = $payer_id; - return $this; - } - - /** - * Account payer identifier. - * @return string - */ - public function getPayerId() { - return $this->payer_id; - } - - - /** - * returns user details - * - * @path /v1/identity/openidconnect/userinfo - * @method GET - * @param array $params (allowed values are access_token) - * access_token - access token from the createFromAuthorizationCode / createFromRefreshToken calls - * @param PPApiContext $apiContext Optional API Context - * @return PPOpenIdUserinfo - */ - public static function getUserinfo($params, $apiContext=null) { - static $allowedParams = array( 'schema' => 1); - if(is_null($apiContext)) { - $apiContext = new PPApiContext(); - } - - if(!array_key_exists('schema', $params)) { - $params['schema'] = 'openid'; - } - $requestUrl = "/v1/identity/openidconnect/userinfo?" - . http_build_query(array_intersect_key($params, $allowedParams)); - $call = new PPRestCall($apiContext); - $ret = new PPOpenIdUserinfo(); - $ret->fromJson( - $call->execute(array('PPOpenIdHandler'), $requestUrl, "GET", "", - array( - 'Authorization' => "Bearer " . $params['access_token'], - 'Content-Type'=> 'x-www-form-urlencoded' - ) - ) - ); - return $ret; - } -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/PPCertificateCredential.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/PPCertificateCredential.php deleted file mode 100644 index a33ab96..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/PPCertificateCredential.php +++ /dev/null @@ -1,103 +0,0 @@ -userName = trim($userName); - $this->password = trim($password); - $this->certificatePath = trim($certPath); - $this->certificatePassPhrase = $certificatePassPhrase; - $this->validate(); - } - - public function validate() { - - if (empty($this->userName)) { - throw new PPMissingCredentialException("username cannot be empty"); - } - if (empty($this->password)) { - throw new PPMissingCredentialException("password cannot be empty"); - } - if (empty($this->certificatePath)) { - throw new PPMissingCredentialException("certificate cannot be empty"); - } - } - - public function getUserName() { - return $this->userName; - } - - public function getPassword() { - return $this->password; - } - - public function getCertificatePath() { - if (realpath($this->certificatePath)) { - return realpath($this->certificatePath); - } else if(defined('PP_CONFIG_PATH')) { - return constant('PP_CONFIG_PATH') . DIRECTORY_SEPARATOR . $this->certificatePath; - } else { - return realpath(dirname(__FILE__) . DIRECTORY_SEPARATOR . ".." .DIRECTORY_SEPARATOR . ".." . DIRECTORY_SEPARATOR . "config" . DIRECTORY_SEPARATOR . $this->certificatePath); - } - } - - public function getCertificatePassPhrase() { - return $this->certificatePassPhrase; - } - - public function setApplicationId($applicationId) { - $this->applicationId = trim($applicationId); - } - - public function getApplicationId() { - return $this->applicationId; - } - -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/PPSignatureCredential.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/PPSignatureCredential.php deleted file mode 100644 index d1e6f49..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/PPSignatureCredential.php +++ /dev/null @@ -1,69 +0,0 @@ -userName = trim($userName); - $this->password = trim($password); - $this->signature = trim($signature); - $this->validate(); - } - - public function validate() { - - if (empty($this->userName)) { - throw new PPMissingCredentialException("username cannot be empty"); - } - if (empty($this->password)) { - throw new PPMissingCredentialException("password cannot be empty"); - } - // Signature can be empty if using 3-rd party auth tokens from permissions API - } - - public function getUserName() { - return $this->userName; - } - public function getPassword() { - return $this->password; - } - public function getSignature() { - return $this->signature; - } - - public function setApplicationId($applicationId) { - $this->applicationId = trim($applicationId); - } - public function getApplicationId() { - return $this->applicationId; - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/PPSubjectAuthorization.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/PPSubjectAuthorization.php deleted file mode 100644 index 27f1f8f..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/PPSubjectAuthorization.php +++ /dev/null @@ -1,26 +0,0 @@ -subject = $subject; - } - - public function getSubject() { - return $this->subject; - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/PPTokenAuthorization.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/PPTokenAuthorization.php deleted file mode 100644 index d9a80e7..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Auth/PPTokenAuthorization.php +++ /dev/null @@ -1,38 +0,0 @@ -accessToken = $accessToken; - $this->tokenSecret = $tokenSecret; - } - - public function getAccessToken() { - return $this->accessToken; - } - - public function getTokenSecret() { - return $this->tokenSecret; - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Common/PPApiContext.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Common/PPApiContext.php deleted file mode 100644 index 5affd24..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Common/PPApiContext.php +++ /dev/null @@ -1,33 +0,0 @@ -config = $config; - } - - public function getConfig() { - if(!isset($this->config)) { - $this->config = PPConfigManager::getInstance()->getConfigHashmap(); - } - return $this->config; - } - - public function __construct($config=null) { - if(!is_null($config)) { - $this->config = $config; - } - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Common/PPArrayUtil.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Common/PPArrayUtil.php deleted file mode 100644 index a93fe19..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Common/PPArrayUtil.php +++ /dev/null @@ -1,18 +0,0 @@ - $v) { - if(is_int($k)) { - return false; - } - } - return true; - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Common/PPModel.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Common/PPModel.php deleted file mode 100644 index ec4ae90..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Common/PPModel.php +++ /dev/null @@ -1,84 +0,0 @@ -_propMap[$key]; - } - - public function __set($key, $value) { - $this->_propMap[$key] = $value; - } - - public function __isset($key) { - return isset($this->_propMap[$key]); - } - - public function __unset($key) { - unset($this->_propMap[$key]); - } - - - private function _convertToArray($param) { - $ret = array(); - foreach($param as $k => $v) { - if($v instanceof PPModel ) { - $ret[$k] = $v->toArray(); - } else if (is_array($v)) { - $ret[$k] = $this->_convertToArray($v); - } else { - $ret[$k] = $v; - } - } - return $ret; - } - - public function fromArray($arr) { - - foreach($arr as $k => $v) { - if(is_array($v)) { - $clazz = PPReflectionUtil::getPropertyClass(get_class($this), $k); - - if(PPArrayUtil::isAssocArray($v)) { - $o = new $clazz(); - $o->fromArray($v); - $this->__set($k, $o); - } else { - $arr = array(); - foreach($v as $nk => $nv) { - if(is_array($nv)) { - $o = new $clazz(); - $o->fromArray($nv); - $arr[$nk] = $o; - } else { - $arr[$nk] = $nv; - } - } - $this->__set($k, $arr); - } - }else { - $this->$k = $v; - } - } - } - - public function fromJson($json) { - $this->fromArray(json_decode($json, true)); - } - - public function toArray() { - return $this->_convertToArray($this->_propMap); - } - - public function toJSON() { - return json_encode($this->toArray()); - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Common/PPReflectionUtil.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Common/PPReflectionUtil.php deleted file mode 100644 index 83bfd8f..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Common/PPReflectionUtil.php +++ /dev/null @@ -1,74 +0,0 @@ -getDocComment(), $annots, PREG_PATTERN_ORDER)) { - return NULL; - } - foreach ($annots[1] as $i => $annot) { - $annotations[strtolower($annot)] = empty($annots[2][$i]) ? TRUE : rtrim($annots[2][$i], " \t\n\r)"); - } - - return $annotations; - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Common/PPUserAgent.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Common/PPUserAgent.php deleted file mode 100644 index 551c93b..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Common/PPUserAgent.php +++ /dev/null @@ -1,41 +0,0 @@ -config = $config; - $this->serviceName = $serviceName; - $this->port = $port; - - $this->logger = new PPLoggingManager(__CLASS__, $this->config); - $this->handlers = $handlers; - $this->serviceBinding = $serviceBinding; - - } - - public function setServiceName($serviceName) { - $this->serviceName = $serviceName; - } - - public function addHandler($handler) { - $this->handlers[] = $handler; - } - - public function makeRequest($apiMethod, $params, $apiUsername = null) { - - $this->apiMethod = $apiMethod; - if(is_string($apiUsername) || is_null($apiUsername)) { - // $apiUsername is optional, if null the default account in config file is taken - $credMgr = PPCredentialManager::getInstance($this->config); - $apiCredential = clone($credMgr->getCredentialObject($apiUsername )); - } else { - $apiCredential = $apiUsername; //TODO: Aargh - } - if((isset($this->config['accessToken']) && isset($this->config['tokenSecret']))) { - $apiCredential->setThirdPartyAuthorization( - new PPTokenAuthorization($this->config['accessToken'], $this->config['tokenSecret'])); - } - - - $request = new PPRequest($params, $this->serviceBinding); - $request->setCredential($apiCredential); - $httpConfig = new PPHttpConfig(null, PPHttpConfig::HTTP_POST); - $this->runHandlers($httpConfig, $request); - - $formatter = FormatterFactory::factory($this->serviceBinding); - $payload = $formatter->toString($request); - $connection = PPConnectionManager::getInstance()->getConnection($httpConfig, $this->config); - $this->logger->info("Request: $payload"); - $response = $connection->execute($payload); - $this->logger->info("Response: $response"); - - return array('request' => $payload, 'response' => $response); - } - - private function runHandlers($httpConfig, $request) { - - $this->getOptions(); - - foreach($this->handlers as $handlerClass) { - $handler = new $handlerClass(); - $handler->handle($httpConfig, $request, $this->options); - } - $handler = new PPAuthenticationHandler(); - $handler->handle($httpConfig, $request, $this->options); - } - - private function getOptions() - { - $this->options['port'] = $this->port; - $this->options['serviceName'] = $this->serviceName; - $this->options['serviceBinding'] = $this->serviceBinding; - $this->options['config'] = $this->config; - $this->options['apiMethod'] = $this->apiMethod; - } -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPBaseService.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPBaseService.php deleted file mode 100644 index fc6de3f..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPBaseService.php +++ /dev/null @@ -1,87 +0,0 @@ -lastRequest; - } - public function setLastRequest($lastRqst) { - $this->lastRequest = $lastRqst; - } - public function getLastResponse() { - return $this->lastResponse; - } - public function setLastResponse($lastRspns) { - $this->lastResponse = $lastRspns; - } - - public function __construct($serviceName, $serviceBinding, $handlers=array(), $config = null) { - $this->serviceName = $serviceName; - $this->serviceBinding = $serviceBinding; - $this->handlers = $handlers; - if($config == null) - { - $configFile = PPConfigManager::getInstance(); - $this->config = $configFile->getConfigHashmap(); - } - else - { - $this->config = PPConfigManager::mergrDefaults($config); - } - } - - public function getServiceName() { - return $this->serviceName; - } - - /** - * - * @param string $method - API method to call - * @param object $requestObject Request object - * @param mixed $apiCredential - Optional API credential - can either be - * a username configured in sdk_config.ini or a ICredential object - * created dynamically - */ - public function call($port, $method, $requestObject, $apiUserName = NULL) { - $service = new PPAPIService($port, $this->serviceName, - $this->serviceBinding, $this->handlers,$this->config); - $ret = $service->makeRequest($method, $requestObject, $apiUserName); - $this->lastRequest = $ret['request']; - $this->lastResponse = $ret['response']; - return $this->lastResponse; - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPConfigManager.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPConfigManager.php deleted file mode 100644 index f03560e..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPConfigManager.php +++ /dev/null @@ -1,123 +0,0 @@ - "30", - "http.Retry" => "5", - ); - - private static $instance; - - private function __construct(){ - if(defined('PP_CONFIG_PATH')) { - $configFile = constant('PP_CONFIG_PATH') . '/sdk_config.ini'; - } else { - $configFile = implode(DIRECTORY_SEPARATOR, - array(dirname(__FILE__), "..", "config", "sdk_config.ini")); - } - $this->load($configFile); - } - - // create singleton object for PPConfigManager - public static function getInstance() - { - if ( !isset(self::$instance) ) { - self::$instance = new PPConfigManager(); - } - return self::$instance; - } - - //used to load the file - private function load($fileName) { - - $this->config = @parse_ini_file($fileName); - if($this->config == NULL || count($this->config) == 0) { - throw new PPConfigurationException("Config file $fileName not found","303"); - } - } - - /** - * simple getter for configuration params - * If an exact match for key is not found, - * does a "contains" search on the key - */ - public function get($searchKey){ - - if(array_key_exists($searchKey, $this->config)) - { - return $this->config[$searchKey]; - } - else { - $arr = array(); - foreach ($this->config as $k => $v){ - if(strstr($k, $searchKey)){ - $arr[$k] = $v; - } - } - - return $arr; - } - - } - - /** - * Utility method for handling account configuration - * return config key corresponding to the API userId passed in - * - * If $userId is null, returns config keys corresponding to - * all configured accounts - */ - public function getIniPrefix($userId = null) { - - if($userId == null) { - $arr = array(); - foreach ($this->config as $key => $value) { - $pos = strpos($key, '.'); - if(strstr($key, "acct")){ - $arr[] = substr($key, 0, $pos); - } - } - return array_unique($arr); - } else { - $iniPrefix = array_search($userId, $this->config); - $pos = strpos($iniPrefix, '.'); - $acct = substr($iniPrefix, 0, $pos); - - return $acct; - } - } - - /** - * returns the config file hashmap - * - */ - public function getConfigHashmap() - { - return $this->config; - } - - /** - * use the default configuration if it is not passed in hashmap - */ - public static function mergrDefaults($config) - { - return array_merge(PPConfigManager::$defaults, $config); - } -} - - \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPConnectionManager.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPConnectionManager.php deleted file mode 100644 index 0b4a93c..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPConnectionManager.php +++ /dev/null @@ -1,42 +0,0 @@ -setHttpTimeout( $config["http.ConnectionTimeOut"] ); - } - if(isset( $config["http.Proxy"] )) { - $httpConfig->setHttpProxy($config["http.Proxy"] ); - } - if(isset( $config["http.Retry"] )) { - $retry = $config["http.Retry"]; - $httpConfig->setHttpRetryCount($retry ) ; - } - - return new PPHttpConnection($httpConfig, $config); - } - -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPConstants.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPConstants.php deleted file mode 100644 index da09c92..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPConstants.php +++ /dev/null @@ -1,19 +0,0 @@ -initCredential($config); - } catch (Exception $e) { - $this->credentialHashmap = array(); - throw $e; - } - } - - /* - * Create singleton instance for this class. - */ - public static function getInstance($config) - { - - return self::$instance = new PPCredentialManager($config); - - } - - /* - * Load credentials for multiple accounts, with priority given to Signature credential. - */ - private function initCredential($config){ - // $configMgr = PPConfigManager::getInstance(); - $suffix = 1; - $prefix = "acct"; - - // $credArr = $configMgr->get($prefix); - // $arrayPartKeys = $configMgr->getIniPrefix(); - - if(array_key_exists($prefix, $config)) - { - $credArr = $this->config[$searchKey]; - } - else { - $arr = array(); - foreach ($config as $k => $v){ - if(strstr($k, $prefix)){ - $arr[$k] = $v; - } - } - - $credArr = $arr; - } - - $arr = array(); - foreach ($config as $key => $value) { - $pos = strpos($key, '.'); - if(strstr($key, "acct")){ - $arr[] = substr($key, 0, $pos); - } - } - $arrayPartKeys = array_unique($arr); - - if(count($arrayPartKeys) == 0) - throw new PPMissingCredentialException("No valid API accounts have been configured"); - - $key = $prefix.$suffix; - while (in_array($key, $arrayPartKeys)){ - - if(isset($credArr[$key.".Signature"]) - && $credArr[$key.".Signature"] != null && $credArr[$key.".Signature"] != ""){ - - $userName = isset($credArr[$key.'.UserName']) ? $credArr[$key.'.UserName'] : ""; - $password = isset($credArr[$key.'.Password']) ? $credArr[$key.'.Password'] : ""; - $signature = isset($credArr[$key.'.Signature']) ? $credArr[$key.'.Signature'] : ""; - - $this->credentialHashmap[$userName] = new PPSignatureCredential($userName, $password, $signature); - if (isset($credArr[$key.'.AppId'])) { - $this->credentialHashmap[$userName]->setApplicationId($credArr[$key.'.AppId']); - } - - } elseif (isset($credArr[$key.".CertPath"]) - && $credArr[$key.".CertPath"] != null && $credArr[$key.".CertPath"] != ""){ - - $userName = isset($credArr[$key.'.UserName']) ? $credArr[$key.'.UserName'] : ""; - $password = isset($credArr[$key.'.Password']) ? $credArr[$key.'.Password'] : ""; - $certPassPhrase = isset($credArr[$key.'.CertKey']) ? $credArr[$key.'.CertKey'] : ""; - $certPath = isset($credArr[$key.'.CertPath']) ? $credArr[$key.'.CertPath'] : ""; - - $this->credentialHashmap[$userName] = new PPCertificateCredential($userName, $password, $certPath, $certPassPhrase); - if (isset($credArr[$key.'.AppId'])) { - $this->credentialHashmap[$userName]->setApplicationId($credArr[$key.'.AppId']); - } - } elseif (isset($credArr[$key.".ClientId"]) && isset($credArr[$key.".ClientId"]) ){ - $userName = $key; - $this->credentialHashmap[$userName] = array('clientId' => $credArr[$key.".ClientId"], - 'clientSecret' => $credArr[$key.".ClientSecret"]); - } - if($userName && isset($credArr[$key . ".Subject"]) && trim($credArr[$key . ".Subject"]) != "" ) { - $this->credentialHashmap[$userName]->setThirdPartyAuthorization( - new PPSubjectAuthorization($credArr[$key . ".Subject"])); - } - - if ($userName && $this->defaultAccountName == null) { - if(array_key_exists($key. '.UserName', $credArr)) { - $this->defaultAccountName = $credArr[$key . '.UserName']; - } else { - $this->defaultAccountName = $key; - } - } - $suffix++; - $key = $prefix.$suffix; - } - - } - - /* - * Obtain Credential Object based on UserId provided. - */ - public function getCredentialObject($userId = null){ - - if($userId == null) { - $credObj = $this->credentialHashmap[$this->defaultAccountName]; - } else if (array_key_exists($userId, $this->credentialHashmap)) { - $credObj = $this->credentialHashmap[$userId]; - } - - if (empty($credObj)) { - throw new PPInvalidCredentialException("Invalid userId $userId"); - } - return $credObj; - } - - - public function __clone() - { - trigger_error('Clone is not allowed.', E_USER_ERROR); - } - -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPHttpConfig.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPHttpConfig.php deleted file mode 100644 index a8523bc..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPHttpConfig.php +++ /dev/null @@ -1,158 +0,0 @@ - 3, - CURLOPT_CONNECTTIMEOUT => 10, - CURLOPT_RETURNTRANSFER => TRUE, - CURLOPT_TIMEOUT => 60, // maximum number of seconds to allow cURL functions to execute - CURLOPT_USERAGENT => 'PayPal-PHP-SDK', - CURLOPT_HTTPHEADER => array(), - CURLOPT_SSL_VERIFYHOST => 2, - CURLOPT_SSL_VERIFYPEER => 1 - ); - - const HEADER_SEPARATOR = ';'; - const HTTP_GET = 'GET'; - const HTTP_POST = 'POST'; - - private $headers = array(); - - private $curlOptions; - - private $url; - - private $method; - /*** - * Number of times to retry a failed HTTP call - */ - private $retryCount; - - /** - * - * @param string $url - * @param string $method HTTP method (GET, POST etc) defaults to POST - */ - public function __construct($url=null, $method=self::HTTP_POST) { - $this->url = $url; - $this->method = $method; - $this->curlOptions = self::$DEFAULT_CURL_OPTS; - } - - public function getUrl() { - return $this->url; - } - - public function getMethod() { - return $this->method; - } - - public function getHeaders() { - return $this->headers; - } - - public function getHeader($name) { - if(array_key_exists($name, $this->headers)) { - return $this->headers[$name]; - } - return NULL; - } - - public function setUrl($url) { - $this->url = $url; - } - - public function setHeaders(array $headers) { - $this->headers = $headers; - } - - public function addHeader($name, $value, $overWrite=true) { - if(!array_key_exists($name, $this->headers) || $overWrite) { - $this->headers[$name] = $value; - } else { - $this->headers[$name] = $this->headers[$name] . HEADER_SEPARATOR . $value; - } - } - - public function removeHeader($name) { - unset($this->headers[$name]); - } - - - - public function getCurlOptions() { - return $this->curlOptions; - } - - public function addCurlOption($name, $value) { - $this->curlOptions[$name] = $value; - } - - public function setCurlOptions($options) { - $this->curlOptions = $options; - } - - - - /** - * Set ssl parameters for certificate based client authentication - * - * @param string $certPath - path to client certificate file (PEM formatted file) - */ - public function setSSLCert($certPath, $passPhrase=NULL) { - $this->curlOptions[CURLOPT_SSLCERT] = realpath($certPath); - if(isset($passPhrase) && trim($passPhrase) != "") { - $this->curlOptions[CURLOPT_SSLCERTPASSWD] = $passPhrase; - } - } - - /** - * Set connection timeout in seconds - * @param integer $timeout - */ - public function setHttpTimeout($timeout) { - $this->curlOptions[CURLOPT_CONNECTTIMEOUT] = $timeout; - } - - /** - * Set HTTP proxy information - * @param string $proxy - * @throws PPConfigurationException - */ - public function setHttpProxy($proxy) { - $urlParts = parse_url($proxy); - if($urlParts == false || !array_key_exists("host", $urlParts)) - throw new PPConfigurationException("Invalid proxy configuration ".$proxy); - - $this->curlOptions[CURLOPT_PROXY] = $urlParts["host"]; - if(isset($urlParts["port"])) - $this->curlOptions[CURLOPT_PROXY] .= ":" . $urlParts["port"]; - if(isset($urlParts["user"])) - $this->curlOptions[URLOPT_PROXYUSERPWD] = $urlParts["user"] . ":" . $urlParts["pass"]; - } - - /** - * @param integer $retry - */ - public function setHttpRetryCount($retryCount) { - $this->retryCount = $retryCount; - } - - public function getHttpRetryCount() { - return $this->retryCount; - } - - /** - * Sets the User-Agent string on the HTTP request - * @param string $userAgentString - */ - public function setUserAgent($userAgentString) { - $this->curlOptions[CURLOPT_USERAGENT] = $userAgentString; - } -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPHttpConnection.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPHttpConnection.php deleted file mode 100644 index 2c39520..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPHttpConnection.php +++ /dev/null @@ -1,112 +0,0 @@ -httpConfig = $httpConfig; - $this->logger = new PPLoggingManager(__CLASS__, $config); - } - - private function getHttpHeaders() { - - $ret = array(); - foreach($this->httpConfig->getHeaders() as $k=>$v) { - $ret[] = "$k: $v"; - } - return $ret; - } - - /** - * Executes an HTTP request - * - * @param string $data query string OR POST content as a string - * @throws PPConnectionException - */ - public function execute($data) { - $this->logger->fine("Connecting to " . $this->httpConfig->getUrl()); - $this->logger->fine("Payload " . $data); - - $ch = curl_init($this->httpConfig->getUrl()); - curl_setopt_array($ch, $this->httpConfig->getCurlOptions()); - curl_setopt($ch, CURLOPT_URL, $this->httpConfig->getUrl()); - curl_setopt($ch, CURLOPT_HEADER, false); - curl_setopt($ch, CURLOPT_HTTPHEADER, $this->getHttpHeaders()); - - switch($this->httpConfig->getMethod()) { - case 'POST': - curl_setopt($ch, CURLOPT_POST, true); - curl_setopt($ch, CURLOPT_POSTFIELDS, $data); - break; - } - if($this->httpConfig->getMethod() != NULL) { - curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $this->httpConfig->getMethod()); - } - foreach($this->getHttpHeaders() as $header) { - //TODO: Strip out credentials and other secure info when logging. - $this->logger->info("Adding header $header"); - } - $result = curl_exec($ch); - if ((curl_errno($ch) == 60) && ($this->httpConfig->getMethod() != "DELETE")) { - $this->logger->info("Invalid or no certificate authority found - Retrying using bundled CA certs file"); - curl_setopt($ch, CURLOPT_CAINFO, - dirname(__FILE__) . '/cacert.pem'); - $result = curl_exec($ch); - } - $httpStatus = curl_getinfo($ch, CURLINFO_HTTP_CODE); - $retries = 0; - if(in_array($httpStatus, self::$retryCodes) && $this->httpConfig->getHttpRetryCount() != null) { - $this->logger->info("Got $httpStatus response from server. Retrying"); - - do { - $result = curl_exec($ch); - $httpStatus = curl_getinfo($ch, CURLINFO_HTTP_CODE); - } while (in_array($httpStatus, self::$retryCodes) && (++$retries < $this->httpConfig->getHttpRetryCount()) ); - } - if ( curl_errno($ch) ) { - $ex = new PPConnectionException($this->httpConfig->getUrl(), curl_error($ch), curl_errno($ch)); - curl_close($ch); - throw $ex; - } - - curl_close($ch); - - if(in_array($httpStatus, self::$retryCodes)) { - $ex = new PPConnectionException($this->httpConfig->getUrl() , - "Got Http response code $httpStatus when accessing {$this->httpConfig->getUrl()}. Retried $retries times."); - $ex->setData($result); - throw $ex; - } else if($httpStatus < 200 || $httpStatus >=300) { - $ex = new PPConnectionException($this->httpConfig->getUrl() , - "Got Http response code $httpStatus when accessing {$this->httpConfig->getUrl()}."); - $ex->setData($result); - throw $ex; - } - return $result; - } - -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPLoggingManager.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPLoggingManager.php deleted file mode 100644 index cc817e3..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPLoggingManager.php +++ /dev/null @@ -1,77 +0,0 @@ -loggerName = $loggerName; - if($config == null) { - $config = PPConfigManager::getInstance()->getConfigHashmap(); - } - $this->isLoggingEnabled = (array_key_exists('log.LogEnabled', $config) && $config['log.LogEnabled'] == '1'); - - if($this->isLoggingEnabled) { - $this->loggerFile = ($config['log.FileName']) ? $config['log.FileName'] : ini_get('error_log'); - $loggingLevel = strtoupper($config['log.LogLevel']); - $this->loggingLevel = (isset($loggingLevel) && defined(__NAMESPACE__."\\PPLoggingLevel::$loggingLevel")) ? constant(__NAMESPACE__."\\PPLoggingLevel::$loggingLevel") : PPLoggingManager::DEFAULT_LOGGING_LEVEL; - } - } - - private function log($message, $level=PPLoggingLevel::INFO) { - if($this->isLoggingEnabled && ($level <= $this->loggingLevel)) { - error_log( $this->loggerName . ": $message\n", 3, $this->loggerFile); - } - } - - public function error($message) { - $this->log($message, PPLoggingLevel::ERROR); - } - - public function warning($message) { - $this->log($message, PPLoggingLevel::WARN); - } - - public function info($message) { - $this->log($message, PPLoggingLevel::INFO); - } - - public function fine($message) { - $this->log($message, PPLoggingLevel::FINE); - } - -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPMessage.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPMessage.php deleted file mode 100644 index 82be10a..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPMessage.php +++ /dev/null @@ -1,117 +0,0 @@ - $defaultValue) { - - if (($propertyValue = $this->{$property}) === NULL || $propertyValue == NULL) { - continue; - } - - if (is_object($propertyValue)) { - $nvp[] = $propertyValue->toNVPString($prefix . $property . '.'); // prefix - - } elseif (is_array($defaultValue) || is_array($propertyValue)) { - foreach (array_values($propertyValue) as $i => $item) { - if (!is_object($item)){ - $nvp[] = $prefix . $property . "($i)" . '=' . urlencode($item); - }else{ - $nvp[] = $item->toNVPString($prefix . $property . "($i)."); - } - } - - } else { - // Handle classes with attributes - if($property == 'value' && ($anno = PPUtils::propertyAnnotations($this, $property)) != NULL && isset($anno['value']) ) { - $nvpKey = substr($prefix, 0, -1); // Remove the ending '.' - } else { - $nvpKey = $prefix . $property ; - } - $nvp[] = $nvpKey . '=' . urlencode($propertyValue); - } - } - - return implode('&', $nvp); - } - - - - /** - * @param array $map - * @param string $prefix - */ - public function init(array $map = array(), $prefix = '') - { - if (empty($map)) { - return; - } - - $map = PPUtils::lowerKeys($map); - - foreach (get_object_vars($this) as $property => $defaultValue) { - if (array_key_exists($propKey = strtolower($prefix . $property), $map) && - $this->isBuiltInType(($type = PPUtils::propertyType($this, $property)))){ - $type = PPUtils::propertyType($this, $property); - $this->{$property} = urldecode($map[$propKey]); - continue; // string - - } elseif (!$filtered = PPUtils::filterKeyPrefix($map, $propKey)) { - continue; // NULL - } - - if (!class_exists($type = PPUtils::propertyType($this, $property)) && !$this->isBuiltInType($type)) { - trigger_error("Class $type not found.", E_USER_NOTICE); - continue; // just ignore - } - - if (is_array($defaultValue) || PPUtils::isPropertyArray($this, $property)) { // array of objects - if($this->isBuiltInType($type)) { // Array of simple types - foreach($filtered as $key => $value) { - $this->{$property}[trim($key, "()")] = urldecode($value); - } - } else { // Array of complex objects - $delim = '.'; - for ($i = 0; $itemValues = PPUtils::filterKeyPrefix($filtered, "($i)") ;$i++) { - $this->{$property}[$i] = $item = new $type(); - $item->init(PPUtils::filterKeyPrefix($itemValues, ".")); - if(array_key_exists("", $itemValues)) { - $item->value = urldecode($itemValues[""]); - } - } - // Handle cases where we have a list of objects - // with just the value present and all attributes values are null - foreach($filtered as $key => $value) { - $idx = trim($key, "()"); - if(is_numeric($idx) && (is_null($this->{$property}) || !array_key_exists($idx, $this->{$property})) ) { - $this->{$property}[$idx] = new $type; - $this->{$property}[$idx]->value = urldecode($value); - } - } - } - } else { // one object - $this->{$property} = new $type(); - $this->{$property}->init(PPUtils::filterKeyPrefix($filtered, '.')); // unprefix - if(array_key_exists("", $filtered)) { - $this->{$property}->value = urldecode($filtered[""]); - } - } - } - } - - private function isBuiltInType($typeName) { - static $types = array('string', 'int', 'integer', 'bool', 'boolean', 'float', 'decimal', 'long', 'datetime', 'double'); - return in_array(strtolower($typeName), $types); - } -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPRequest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPRequest.php deleted file mode 100644 index 22e7f69..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPRequest.php +++ /dev/null @@ -1,73 +0,0 @@ -requestObject = $requestObject; - $this->bindingType = $bindingType; - } - - public function getRequestObject() { - return $this->requestObject; - } - - public function getBindingType() { - return $this->bindingType; - } - - public function getBindingInfo($name=NULL) { - if(isset($name)) { - return $this->bindingInfo[$name]; - } - return $this->bindingInfo; - } - - /** - * - * @param string $name - * @param mixed $value - */ - public function addBindingInfo($name, $value) { - $this->bindingInfo[$name] = $value; - } - - public function setCredential($credential) { - $this->credential = $credential; - } - - public function getCredential() { - return $this->credential; - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPUtils.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPUtils.php deleted file mode 100644 index 3ef6d8b..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPUtils.php +++ /dev/null @@ -1,397 +0,0 @@ - $v) { - preg_match($pattern, $k, $matches); - if (count($matches) > 0) { - return true; - } - } - return false; - } - - - - /** - * Get the local IP address. The client address is a required - * request parameter for some API calls - */ - public static function getLocalIPAddress() - { - if (array_key_exists("SERVER_ADDR", $_SERVER)) { - // SERVER_ADDR is available only if we are running the CGI SAPI - return $_SERVER['SERVER_ADDR']; - - } else { - if (function_exists("gethostname")) { - // gethostname is available only in PHP >= v5.3 - return gethostbyname(gethostname()); - - } else { - // fallback if nothing works - return "127.0.0.1"; - } - } - } - - public static function xmlToArray($xmlInput) - { - $xml = simplexml_load_string($xmlInput); - - $ns = $xml->getNamespaces(true); - $soap = $xml->children($ns['SOAP-ENV']); - $getChild = $soap->Body->children(); - $array = array(); - $ret = PPUtils::convertXmlObjToArr($getChild, $array); - return $ret; - } - - - - private static function convertXmlObjToArr($obj, &$arr) - { - $children = $obj->children(); - foreach ($children as $elementName => $node) { - $nextIdx = count($arr); - $arr[$nextIdx] = array(); - $arr[$nextIdx]['name'] = strtolower((string)$elementName); - $arr[$nextIdx]['attributes'] = array(); - $attributes = $node->attributes(); - foreach ($attributes as $attributeName => $attributeValue) { - $attribName = strtolower(trim((string)$attributeName)); - $attribVal = trim((string)$attributeValue); - $arr[$nextIdx]['attributes'][$attribName] = $attribVal; - } - $text = (string)$node; - $text = trim($text); - if (strlen($text) > 0) { - $arr[$nextIdx]['text'] = $text; - } - $arr[$nextIdx]['children'] = array(); - PPutils::convertXmlObjToArr($node, $arr[$nextIdx]['children']); - } - return $arr; - } - - - - /** - * Escapes invalid xml characters - * - * @param $textContent = xml data to be escaped - * @return string - */ - public static function escapeInvalidXmlCharsRegex($textContent) - { - return htmlspecialchars($textContent, (1 | 2), 'UTF-8', false); - } - - - - /** - * @param array $map - * @param string $keyPrefix - * @return array - */ - public static function filterKeyPrefix(array $map, $keyPrefix) - { - $filtered = array(); - foreach ($map as $key => $val) { - if (($pos = stripos($key, $keyPrefix)) !== 0) { - continue; - } - - $filtered[substr_replace($key, '', 0, strlen($keyPrefix))] = $val; - } - - return $filtered; - } - - - - /** - * @var array|ReflectionProperty[] - */ - private static $propertiesRefl = array(); - - /** - * @var array|string[] - */ - private static $propertiesType = array(); - - - - /** - * @param string $class - * @param string $propertyName - * @throws RuntimeException - * @return string - */ - public static function propertyAnnotations($class, $propertyName) - { - $class = is_object($class) ? get_class($class) : $class; - if (!class_exists('ReflectionProperty')) { - throw new \RuntimeException("Property type of " . $class . "::{$propertyName} cannot be resolved"); - } - - if ($annotations =& self::$propertiesType[$class][$propertyName]) { - return $annotations; - } - - if (!($refl =& self::$propertiesRefl[$class][$propertyName])) { - $refl = new \ReflectionProperty($class, $propertyName); - } - - // todo: smarter regexp - if (!preg_match_all('~\@([^\s@\(]+)[\t ]*(?:\(?([^\n@]+)\)?)?~i', $refl->getDocComment(), $annots, PREG_PATTERN_ORDER)) { - return NULL; - } - foreach ($annots[1] as $i => $annot) { - $annotations[strtolower($annot)] = empty($annots[2][$i]) ? TRUE : rtrim($annots[2][$i], " \t\n\r)"); - } - - return $annotations; - } - - /** - * @param string $class - * @param string $propertyName - * @return string - */ - public static function isAttributeProperty($class, $propertyName) { - if (($annotations = self::propertyAnnotations($class, $property))) { - return $annotations['attribute']; - } - return FALSE; - } - - /** - * @param string $class - * @param string $propertyName - * @return string - */ - public static function isPropertyArray($class, $propertyName) { - if (($annotations = self::propertyAnnotations($class, $propertyName))) { - if (isset($annotations['var']) && substr($annotations['var'], -2) === '[]') { - return TRUE; - - } elseif (isset($annotations['array'])) { - return TRUE; - } - } - - return FALSE; - } - - - - /** - * @param string $class - * @param string $propertyName - * @throws RuntimeException - * @return string - */ - public static function propertyType($class, $propertyName) - { - if (($annotations = self::propertyAnnotations($class, $propertyName)) && isset($annotations['var'])) { - if (substr($annotations['var'], -2) === '[]') { - return substr($annotations['var'], 0, -2); - } - - return $annotations['var']; - } - - return 'string'; - } - - /** - * @param object $object - * @return array - */ - public static function objectProperties($object) - { - $props = array(); - foreach (get_object_vars($object) as $property => $default) { - $annotations = self::propertyAnnotations($object, $property); - if (isset($annotations['name'])) { - $props[strtolower($annotations['name'])] = $property; - } - - $props[strtolower($property)] = $property; - } - - return $props; - } - - - - /** - * @param array $array - * @return array - */ - public static function lowerKeys(array $array) - { - $ret = array(); - foreach ($array as $key => $value) { - $ret[strtolower($key)] = $value; - } - - return $ret; - } - -} - - - -/** - * XMLToArray Generator Class - * - * @author : MA Razzaque Rupom , - * Moderator, phpResource (LINK1http://groups.yahoo.com/group/phpresource/LINK1) - * URL: LINK2http://www.rupom.infoLINK2 - * @version : 1.0 - * @date 06/05/2006 - * Purpose : Creating Hierarchical Array from XML Data - * Released : Under GPL - */ -class XmlToArray -{ - - var $xml = ''; - - - - /** - * Default Constructor - * - * @param $xml = xml data - * @return none - */ - function XmlToArray($xml) - { - $this->xml = $xml; - } - - - - /** - * _struct_to_array($values, &$i) - * - * This is adds the contents of the return xml into the array for easier processing. - * Recursive, Static - * - * @access private - * @param array $values this is the xml data in an array - * @param int $i this is the current location in the array - * @return Array - */ - function _struct_to_array($values, &$i) - { - $child = array(); - if (isset($values[$i]['value'])) { - array_push($child, $values[$i]['value']); - } - - while ($i++ < count($values)) { - switch ($values[$i]['type']) { - case 'cdata': - array_push($child, $values[$i]['value']); - break; - - case 'complete': - $name = $values[$i]['tag']; - if (!empty($name)) { - $child[$name] = ($values[$i]['value']) ? ($values[$i]['value']) : ''; - if (isset($values[$i]['attributes'])) { - $child[$name] = $values[$i]['attributes']; - } - } - break; - - case 'open': - $name = $values[$i]['tag']; - $size = isset($child[$name]) ? sizeof($child[$name]) : 0; - $child[$name][$size] = $this->_struct_to_array($values, $i); - break; - - case 'close': - return $child; - break; - } - } - return $child; - } - - - - /** - * createArray($data) - * - * This is adds the contents of the return xml into the array for easier processing. - * - * @access public - * @return Array - */ - function createArray() - { - $xml = $this->xml; - $values = array(); - $index = array(); - $array = array(); - $parser = xml_parser_create(); - xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1); - xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0); - xml_parse_into_struct($parser, $xml, $values, $index); - xml_parser_free($parser); - $i = 0; - $name = $values[$i]['tag']; - $array[$name] = isset($values[$i]['attributes']) ? $values[$i]['attributes'] : ''; - $array[$name] = $this->_struct_to_array($values, $i); - return $array; - } - -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPXmlMessage.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPXmlMessage.php deleted file mode 100644 index 123bf4b..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/PPXmlMessage.php +++ /dev/null @@ -1,186 +0,0 @@ -toXMLString(); - } - - - - /** - * @return string - */ - public function toXMLString() - { - if (count($properties = get_object_vars($this)) >= 2 && array_key_exists('value', $properties)) { - $attributes = array(); - foreach (array_keys($properties) as $property) { - if ($property === 'value') continue; - if (($annots = PPUtils::propertyAnnotations($this, $property)) && isset($annots['attribute'])) { - if (($propertyValue = $this->{$property}) === NULL || $propertyValue == NULL) { - $attributes[] = NULL; - continue; - } - - $attributes[] = $property . '="' . PPUtils::escapeInvalidXmlCharsRegex($propertyValue) . '"'; - } - } - - if (count($attributes)) { - return implode(' ', $attributes) . '>' . PPUtils::escapeInvalidXmlCharsRegex($this->value); - } - } - - $xml = array(); - foreach ($properties as $property => $defaultValue) { - if (($propertyValue = $this->{$property}) === NULL || $propertyValue == NULL) { - continue; - } - - if (is_array($defaultValue) || is_array($propertyValue)) { - foreach ($propertyValue as $item) { - if (!is_object($item)) { - $xml[] = $this->buildProperty($property, $item); - }else{ - $xml[] = $this->buildProperty($property, $item); - } - } - - } else { - $xml[] = $this->buildProperty($property, $propertyValue); - } - } - - return implode($xml); - } - - - - /** - * @param string $property - * @param PPXmlMessage|string $value - * @param string $namespace - * @return string - */ - private function buildProperty($property, $value, $namespace = 'ebl') - { - $annotations = PPUtils::propertyAnnotations($this, $property); - if (!empty($annotations['namespace'])) { - $namespace = $annotations['namespace']; - } - if (!empty($annotations['name'])) { - $property = $annotations['name']; - } - - $el = '<' . $namespace . ':' . $property; - if (!is_object($value)) { - $el .= '>' . PPUtils::escapeInvalidXmlCharsRegex($value); - - } else { - if (substr($value = $value->toXMLString(), 0, 1) === '<' || $value=='') { - $el .= '>' . $value; - - } else { - $el .= ' ' . $value; - } - } - - return $el . ''; - } - - - - /** - * @param array $map - * @param string $prefix - */ - public function init(array $map = array(), $prefix = '') - { - if (empty($map)) { - return; - } - - if (($first = reset($map)) && !is_array($first) && !is_numeric(key($map))) { - parent::init($map, $prefix); - return; - } - - $propertiesMap = PPUtils::objectProperties($this); - $arrayCtr = array(); - foreach ($map as $element) { - - if (empty($element) || empty($element['name'])) { - continue; - - } elseif (!array_key_exists($property = strtolower($element['name']), $propertiesMap)) { - if (!preg_match('~^(.+)[\[\(](\d+)[\]\)]$~', $property, $m)) { - continue; - } - - $element['name'] = $m[1]; - $element['num'] = $m[2]; - } - $element['name'] = $propertiesMap[strtolower($element['name'])]; - if(PPUtils::isPropertyArray($this, $element['name'])) { - $arrayCtr[$element['name']] = isset($arrayCtr[$element['name']]) ? ($arrayCtr[$element['name']]+1) : 0; - $element['num'] = $arrayCtr[$element['name']]; - } - if (!empty($element["attributes"]) && is_array($element["attributes"])) { - foreach ($element["attributes"] as $key => $val) { - $element["children"][] = array( - 'name' => $key, - 'text' => $val, - ); - } - - if (isset($element['text'])) { - $element["children"][] = array( - 'name' => 'value', - 'text' => $element['text'], - ); - } - - $this->fillRelation($element['name'], $element); - - } elseif (!empty($element['text'])) { - $this->{$element['name']} = $element['text']; - - } elseif (!empty($element["children"]) && is_array($element["children"])) { - $this->fillRelation($element['name'], $element); - } - } - } - - - - /** - * @param string $property - * @param array $element - */ - private function fillRelation($property, array $element) - { - if (!class_exists($type = PPUtils::propertyType($this, $property))) { - trigger_error("Class $type not found.", E_USER_NOTICE); - return; // just ignore - } - - if (isset($element['num'])) { // array of objects - $this->{$property}[$element['num']] = $item = new $type(); - $item->init($element['children']); - - } else { - $this->{$property} = new $type(); - $this->{$property}->init($element["children"]); - } - } - -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/cacert.pem b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/cacert.pem deleted file mode 100644 index 1202c20..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Core/cacert.pem +++ /dev/null @@ -1,171 +0,0 @@ -Verisign Class 3 Public Primary Certification Authority -======================================================= ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx -FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow -XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz -IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 -f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol -hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA -TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah -WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf -Tqj/ZA1k ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority - G2 -============================================================ ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT -MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz -dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT -MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz -dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO -FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71 -lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB -MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT -1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD -Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9 ------END CERTIFICATE----- - - -Verisign Class 3 Public Primary Certification Authority - G3 -============================================================ ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy -dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 -EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc -cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw -EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj -055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA -ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f -j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC -/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 -xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa -t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== ------END CERTIFICATE----- - -Verisign Class 4 Public Primary Certification Authority - G3 -============================================================ ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy -dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS -tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM -8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW -Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX -Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA -j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt -mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm -fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd -RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG -UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== ------END CERTIFICATE----- -VeriSign Class 3 Public Primary Certification Authority - G5 -============================================================ ------BEGIN CERTIFICATE----- -MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE -BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO -ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk -IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB -yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln -biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh -dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz -j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD -Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ -Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r -fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ -BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv -Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy -aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG -SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ -X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE -KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC -Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE -ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq ------END CERTIFICATE----- -VeriSign Universal Root Certification Authority -=============================================== ------BEGIN CERTIFICATE----- -MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE -BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO -ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk -IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u -IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj -1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP -MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 -9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I -AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR -tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G -CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O -a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud -DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 -Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx -Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx -P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P -wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 -mJO37M2CYfE45k+XmCpajQ== ------END CERTIFICATE----- - -VeriSign Class 3 Public Primary Certification Authority - G4 -============================================================ ------BEGIN CERTIFICATE----- -MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC -VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 -b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz -ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU -cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo -b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 -Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz -rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw -HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u -Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD -A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx -AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== ------END CERTIFICATE----- -Verisign Class 3 Public Primary Certification Authority -======================================================= ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx -FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow -XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz -IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 -f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol -hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky -CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX -bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/ -D/xwzoiQ ------END CERTIFICATE----- diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Exception/OAuthException.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Exception/OAuthException.php deleted file mode 100644 index e10ea33..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Exception/OAuthException.php +++ /dev/null @@ -1,8 +0,0 @@ - \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Exception/PPConfigurationException.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Exception/PPConfigurationException.php deleted file mode 100644 index 60dfa57..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Exception/PPConfigurationException.php +++ /dev/null @@ -1,8 +0,0 @@ -url = $url; - } - - public function setData($data) { - $this->data = $data; - } - - public function getData() { - return $this->data; - } - - public function getUrl() { - return $this->url; - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Exception/PPInvalidCredentialException.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Exception/PPInvalidCredentialException.php deleted file mode 100644 index c492173..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Exception/PPInvalidCredentialException.php +++ /dev/null @@ -1,17 +0,0 @@ -getLine().' in '.$this->getFile() - .': '.$this->getMessage().''; - return $errorMsg; - } - -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Exception/PPMissingCredentialException.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Exception/PPMissingCredentialException.php deleted file mode 100644 index a33ae8f..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Exception/PPMissingCredentialException.php +++ /dev/null @@ -1,18 +0,0 @@ -getLine().' in '.$this->getFile() - .': '.$this->getMessage().''; - - return $errorMsg; - } - -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Exception/PPTransformerException.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Exception/PPTransformerException.php deleted file mode 100644 index 616db00..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Exception/PPTransformerException.php +++ /dev/null @@ -1,17 +0,0 @@ -getLine().' in '.$this->getFile() - .': '.$this->getMessage().''; - - return $errorMsg; - } - -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Formatter/FormatterFactory.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Formatter/FormatterFactory.php deleted file mode 100644 index 9c26f46..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Formatter/FormatterFactory.php +++ /dev/null @@ -1,16 +0,0 @@ -getRequestObject()->toNVPString(); - } - - public function toObject($string, $options=array()) { - throw new BadMethodCallException("Unimplemented"); - } -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Formatter/PPSOAPFormatter.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Formatter/PPSOAPFormatter.php deleted file mode 100644 index 1c2920b..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Formatter/PPSOAPFormatter.php +++ /dev/null @@ -1,28 +0,0 @@ -getBindingInfo('namespace') != null ) ? $request->getBindingInfo('namespace') : ""; - $soapEnvelope = '"; - - $soapHeader = ''; - if($request->getBindingInfo('securityHeader') != null) { - $soapHeader .= $request->getBindingInfo('securityHeader'); - } - $soapHeader .= ''; - - $soapBody = ''; - $soapBody .= $request->getRequestObject()->toXMLString(); - $soapBody .= ''; - - return $soapEnvelope . $soapHeader . $soapBody . ''; - } - - public function toObject($string, $options=array()) { - throw new BadMethodCallException("Unimplemented"); - } -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Handler/IPPHandler.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Handler/IPPHandler.php deleted file mode 100644 index 42b4216..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Handler/IPPHandler.php +++ /dev/null @@ -1,10 +0,0 @@ -getCredential(); - if(isset($credential)) { - $thirdPartyAuth = $credential->getThirdPartyAuthorization(); - if($thirdPartyAuth && $thirdPartyAuth instanceof PPTokenAuthorization) { - $authSignature = AuthSignature::generateFullAuthString($credential->getUsername(), $credential->getPassword(), $thirdPartyAuth->getAccessToken(), $thirdPartyAuth->getTokenSecret(), $httpConfig->getMethod(), $httpConfig->getUrl()); - if($options['port'] == 'PayPalAPI' || $options['port'] == 'PayPalAPIAA') { - $httpConfig->addHeader('X-PP-AUTHORIZATION', $authSignature); - } - else { - $httpConfig->addHeader('X-PAYPAL-AUTHORIZATION', $authSignature); - } - } - if($credential instanceof PPSignatureCredential) { - $handler = new PPSignatureAuthHandler($credential); - } else if($credential instanceof PPCertificateCredential) { - $handler = new PPCertificateAuthHandler($credential); - } else { - throw new PPInvalidCredentialException(); - } - $handler->handle($httpConfig, $request, $options); - } - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Handler/PPCertificateAuthHandler.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Handler/PPCertificateAuthHandler.php deleted file mode 100644 index 4b24cba..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Handler/PPCertificateAuthHandler.php +++ /dev/null @@ -1,46 +0,0 @@ -getCredential(); - if(!isset($credential)) { - return; - } - - $httpConfig->setSSLCert($credential->getCertificatePath(), $credential->getCertificatePassPhrase()); - $thirdPartyAuth = $credential->getThirdPartyAuthorization(); - - switch($request->getBindingType()) { - case 'NV': - if(!$thirdPartyAuth || !$thirdPartyAuth instanceof PPTokenAuthorization) { - $httpConfig->addHeader('X-PAYPAL-SECURITY-USERID', $credential->getUserName()); - $httpConfig->addHeader('X-PAYPAL-SECURITY-PASSWORD', $credential->getPassword()); - if($thirdPartyAuth) { - $httpConfig->addHeader('X-PAYPAL-SECURITY-SUBJECT', $thirdPartyAuth->getSubject()); - } - } - break; - case 'SOAP': - if($thirdPartyAuth && $thirdPartyAuth instanceof PPTokenAuthorization) { - $securityHeader = ''; - } else { - $securityHeader = ''; - $securityHeader .= '' . $credential->getUserName() . ''; - $securityHeader .= '' . $credential->getPassword() . ''; - if($thirdPartyAuth && $thirdPartyAuth instanceof PPSubjectAuthorization) { - $securityHeader .= '' . $thirdPartyAuth->getSubject() . ''; - } - $securityHeader .= ''; - $request->addBindingInfo('securityHeader' , $securityHeader); - } - break; - } - } - -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Handler/PPGenericServiceHandler.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Handler/PPGenericServiceHandler.php deleted file mode 100644 index 51c1e0e..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Handler/PPGenericServiceHandler.php +++ /dev/null @@ -1,18 +0,0 @@ -addHeader('X-PAYPAL-REQUEST-DATA-FORMAT', $request->getBindingType()); - $httpConfig->addHeader('X-PAYPAL-RESPONSE-DATA-FORMAT', $request->getBindingType()); - $httpConfig->addHeader('X-PAYPAL-DEVICE-IPADDRESS', PPUtils::getLocalIPAddress()); - $httpConfig->addHeader('X-PAYPAL-REQUEST-SOURCE', PPBaseService::getRequestSource()); - if(isset($options['config']['service.SandboxEmailAddress'])) - { - $httpConfig->addHeader('X-PAYPAL-SANDBOX-EMAIL-ADDRESS', $options['config']['service.SandboxEmailAddress']); - } - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Handler/PPMerchantServiceHandler.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Handler/PPMerchantServiceHandler.php deleted file mode 100644 index 8f56366..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Handler/PPMerchantServiceHandler.php +++ /dev/null @@ -1,64 +0,0 @@ -config = $options['config']; - $credential = $request->getCredential(); - if($options['port'] != null && isset($this->config['service.EndPoint.'.$options['port']])) - { - $this->endpoint = $this->config['service.EndPoint.'.$options['port']]; - } - // for backward compatibilty (for those who are using old config files with 'service.EndPoint') - else if (isset($this->config['service.EndPoint'])) - { - $this->endpoint = $this->config['service.EndPoint']; - } - else if (isset($this->config['mode'])) - { - if(strtoupper($this->config['mode']) == 'SANDBOX') - { - if($credential instanceof PPSignatureCredential) - { - $this->endpoint = PPConstants::MERCHANT_SANDBOX_SIGNATURE_ENDPOINT; - } - else if($credential instanceof PPCertificateCredential) - { - $this->endpoint = PPConstants::MERCHANT_SANDBOX_CERT_ENDPOINT; - } - } - else if(strtoupper($this->config['mode']) == 'LIVE') - { - if($credential instanceof PPSignatureCredential) - { - $this->endpoint = PPConstants::MERCHANT_LIVE_SIGNATURE_ENDPOINT; - } - else if($credential instanceof PPCertificateCredential) - { - $this->endpoint = PPConstants::MERCHANT_LIVE_CERT_ENDPOINT; - } - } - } - else - { - throw new PPConfigurationException('endpoint Not Set'); - } - - if($options['serviceBinding'] == 'SOAP' ) - { - $httpConfig->setUrl($this->endpoint); - } - else - { - throw new PPConfigurationException('expecting service binding to be SOAP'); - } - - $request->addBindingInfo("namespace", "xmlns:ns=\"urn:ebay:api:PayPalAPI\" xmlns:ebl=\"urn:ebay:apis:eBLBaseComponents\" xmlns:cc=\"urn:ebay:apis:CoreComponentTypes\" xmlns:ed=\"urn:ebay:apis:EnhancedDataTypes\""); - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Handler/PPOpenIdHandler.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Handler/PPOpenIdHandler.php deleted file mode 100644 index b66ec5e..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Handler/PPOpenIdHandler.php +++ /dev/null @@ -1,51 +0,0 @@ -apiContext = $apiContext; - } - - public function handle($httpConfig, $request, $options) { - - $config = $this->apiContext->getConfig(); - $httpConfig->setUrl( - rtrim(trim($this->_getEndpoint($config)), '/') . - (isset($options['path']) ? $options['path'] : '') - ); - - if(!array_key_exists("Authorization", $httpConfig->getHeaders())) { - $auth = base64_encode($config['acct1.ClientId'] . ':' . $config['acct1.ClientSecret']); - $httpConfig->addHeader("Authorization", "Basic $auth"); - } - if(!array_key_exists("User-Agent", $httpConfig->getHeaders())) { - $httpConfig->addHeader("User-Agent", PPUserAgent::getValue(self::$sdkName, self::$sdkVersion)); - } - } - - private function _getEndpoint($config) { - if (isset($config['openid.EndPoint'])) { - return $config['openid.EndPoint']; - } else if (isset($config['service.EndPoint'])) { - return $config['service.EndPoint']; - } else if (isset($config['mode'])) { - switch (strtoupper($config['mode'])) { - case 'SANDBOX': - return PPConstants::REST_SANDBOX_ENDPOINT; - case 'LIVE': - return PPConstants::REST_LIVE_ENDPOINT; - default: - throw new PPConfigurationException('The mode config parameter must be set to either sandbox/live'); - } - } else { - throw new PPConfigurationException('You must set one of service.endpoint or mode parameters in your configuration'); - } - } -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Handler/PPPlatformServiceHandler.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Handler/PPPlatformServiceHandler.php deleted file mode 100644 index 7b3c50e..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Handler/PPPlatformServiceHandler.php +++ /dev/null @@ -1,47 +0,0 @@ -config = $options['config']; - $credential = $request->getCredential(); - //TODO: Assuming existence of getApplicationId - if($credential && $credential->getApplicationId() != NULL) { - $httpConfig->addHeader('X-PAYPAL-APPLICATION-ID', $credential->getApplicationId()); - } - if($options['port'] != null && isset($this->config['service.EndPoint.'.$options['port']])) - { - $endpnt = 'service.EndPoint.'.$options['port']; - $this->endpoint = $this->config[$endpnt]; - } - // for backward compatibilty (for those who are using old config files with 'service.EndPoint') - else if (isset($this->config['service.EndPoint'])) - { - $this->endpoint = $this->config['service.EndPoint']; - } - else if (isset($this->config['mode'])) - { - if(strtoupper($this->config['mode']) == 'SANDBOX') - { - $this->endpoint = PPConstants::PLATFORM_SANDBOX_ENDPOINT; - } - else if(strtoupper($this->config['mode']) == 'LIVE') - { - $this->endpoint = PPConstants::PLATFORM_LIVE_ENDPOINT; - } - } - else - { - throw new PPConfigurationException('endpoint Not Set'); - } - $httpConfig->setUrl($this->endpoint . $options['serviceName'] . '/' . $options['apiMethod']); - - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Handler/PPSignatureAuthHandler.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Handler/PPSignatureAuthHandler.php deleted file mode 100644 index 428d5e4..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Handler/PPSignatureAuthHandler.php +++ /dev/null @@ -1,48 +0,0 @@ -getCredential(); - if(!isset($credential)) { - return; - } - $thirdPartyAuth = $credential->getThirdPartyAuthorization(); - - switch($request->getBindingType()) { - case 'NV': - if(!$thirdPartyAuth || !$thirdPartyAuth instanceof PPTokenAuthorization) { - $httpConfig->addHeader('X-PAYPAL-SECURITY-USERID', $credential->getUserName()); - $httpConfig->addHeader('X-PAYPAL-SECURITY-PASSWORD', $credential->getPassword()); - $httpConfig->addHeader('X-PAYPAL-SECURITY-SIGNATURE', $credential->getSignature()); - if($thirdPartyAuth) { - $httpConfig->addHeader('X-PAYPAL-SECURITY-SUBJECT', $thirdPartyAuth->getSubject()); - } - } - break; - case 'SOAP': - if($thirdPartyAuth && $thirdPartyAuth instanceof PPTokenAuthorization) { - $request->addBindingInfo('securityHeader' , ''); - } else { - $securityHeader = ''; - $securityHeader .= '' . $credential->getUserName() . ''; - $securityHeader .= '' . $credential->getPassword() . ''; - $securityHeader .= '' . $credential->getSignature() . ''; - if($thirdPartyAuth && $thirdPartyAuth instanceof PPSubjectAuthorization) { - $securityHeader .= '' . $thirdPartyAuth->getSubject() . ''; - } - $securityHeader .= ''; - $request->addBindingInfo('securityHeader' , $securityHeader); - } - break; - } - } - -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/IPN/PPIPNMessage.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/IPN/PPIPNMessage.php deleted file mode 100644 index ffb2383..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/IPN/PPIPNMessage.php +++ /dev/null @@ -1,172 +0,0 @@ -config = $conf->config; - } - else - { - $this->config = $config; - } - if($postData == '') { - // reading posted data from directly from $_POST may causes serialization issues with array data in POST - // reading raw POST data from input stream instead. - $postData = file_get_contents('php://input'); - } - - $rawPostArray = explode('&', $postData); - foreach ($rawPostArray as $keyValue) { - $keyValue = explode ('=', $keyValue); - if (count($keyValue) == 2) - $this->ipnData[$keyValue[0]] = urldecode($keyValue[1]); - } - //var_dump($this->ipnData); - } - - /** - * Returns a hashmap of raw IPN data - * - * @return array - */ - public function getRawData() { - return $this->ipnData; - } - - /** - * Validates a IPN message - * - * @return boolean - */ - public function validate() { - if(isset($this->isIpnVerified)) - { - return $this->isIpnVerified; - } - else - { - $request = self::IPN_CMD; - if(function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc() == 1) { - $get_magic_quotes_exists = true; - } else { - $get_magic_quotes_exists = false; - } - foreach ($this->ipnData as $key => $value) { - if($get_magic_quotes_exists) { - $value = urlencode(stripslashes($value)); - } else { - $value = urlencode($value); - } - $request .= "&$key=$value"; - } - - $httpConfig = new PPHttpConfig($this->setEndpoint()); - $httpConfig->addCurlOption(CURLOPT_FORBID_REUSE, 1); - $httpConfig->addCurlOption(CURLOPT_HTTPHEADER, array('Connection: Close')); - - $connection = PPConnectionManager::getInstance()->getConnection($httpConfig, $this->config); - $response = $connection->execute($request); - if($response == 'VERIFIED') { - $this->isIpnVerified = true; - return true; - } - $this->isIpnVerified = false; - return false; // value is 'INVALID' - } - } - - /** - * Returns the transaction id for which - * this IPN was generated, if one is available - * - * @return string - */ - public function getTransactionId() { - if(isset($this->ipnData['txn_id'])) { - return $this->ipnData['txn_id']; - } else if(isset($this->ipnData['transaction[0].id'])) { - $idx = 0; - do { - $transId[] = $this->ipnData["transaction[$idx].id"]; - $idx++; - } while(isset($this->ipnData["transaction[$idx].id"])); - return $transId; - } - } - - /** - * Returns the transaction type for which - * this IPN was generated - * - * @return string - */ - public function getTransactionType() { - return $this->ipnData['transaction_type']; - } - - private function setEndpoint() - { - if(isset($this->config['service.EndPoint.IPN'])) - { - $url = $this->config['service.EndPoint.IPN']; - } - else if(isset($this->config['mode'])) - { - if(strtoupper($this->config['mode']) == 'SANDBOX') - { - $url = PPConstants::IPN_SANDBOX_ENDPOINT; - } - else if (strtoupper($this->config['mode']) == 'LIVE') - { - $url = PPConstants::IPN_LIVE_ENDPOINT; - } - else - { - throw new PPConfigurationException('mode should be LIVE or SANDBOX'); - } - } - else - { - throw new PPConfigurationException('No COnfig file found'); - } - return $url; - } - -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Transport/PPRestCall.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Transport/PPRestCall.php deleted file mode 100644 index cb8910e..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/lib/PayPal/Transport/PPRestCall.php +++ /dev/null @@ -1,50 +0,0 @@ -apiContext = $apiContext; - $this->logger = new PPLoggingManager(__CLASS__, $apiContext->getConfig()); - } - - /** - * @param array $handlers array of handlers - * @param string $path Resource path relative to base service endpoint - * @param string $method HTTP method - one of GET, POST, PUT, DELETE, PATCH etc - * @param string $data Request payload - * @param array $headers HTTP headers - */ - public function execute($handlers, $path, $method, $data='', $headers=array()) { - - $config = $this->apiContext->getConfig(); - $httpConfig = new PPHttpConfig(null, $method); - $httpConfig->setHeaders($headers + - array( - 'Content-Type' => 'application/json' - ) - ); - - foreach($handlers as $handler) { - $handler = new $handler($this->apiContext); - $handler->handle($httpConfig, $data, array('path' => $path)); - } - $connection = new PPHttpConnection($httpConfig, $config); - $response = $connection->execute($data); - $this->logger->fine($response); - - return $response; - } - -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/Openid/PPOpenIdAddressTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/Openid/PPOpenIdAddressTest.php deleted file mode 100644 index 87475c4..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/Openid/PPOpenIdAddressTest.php +++ /dev/null @@ -1,39 +0,0 @@ -addr = new PPOpenIdAddress(); - $this->addr->setCountry("US")->setLocality("San Jose") - ->setPostalCode("95112")->setRegion("CA") - ->setStreetAddress("1, North 1'st street"); - } - - /** - * Tears down the fixture, for example, closes a network connection. - * This method is called after a test is executed. - */ - protected function tearDown() - { - } - - /** - * @test - */ - public function testSerializationDeserialization() { - $addrCopy = new PPOpenIdAddress(); - $addrCopy->fromJson($this->addr->toJson()); - - $this->assertEquals($this->addr, $addrCopy); - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/Openid/PPOpenIdSessionTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/Openid/PPOpenIdSessionTest.php deleted file mode 100644 index 46e84d1..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/Openid/PPOpenIdSessionTest.php +++ /dev/null @@ -1,84 +0,0 @@ -context = new PPApiContext( - array( - 'acct1.ClientId' => 'DummyId', - 'acct1.ClientSecret' => 'A8VERY8SECRET8VALUE0', - 'mode' => 'live' - ) - ); - } - - /** - * Tears down the fixture, for example, closes a network connection. - * This method is called after a test is executed. - */ - protected function tearDown() - { - } - - - /** - * @test - */ - public function testLoginUrlForMultipleScopes() { - - $redirectUri = 'http://mywebsite.com'; - $scope = array('this', 'that', 'and more'); - - $expectedBaseUrl = "https://www.sandbox.paypal.com/webapps/auth/protocol/openidconnect/v1/authorize"; - - $this->assertEquals($expectedBaseUrl . "?client_id=ProxyRP-01&response_type=code&scope=this+that+and+more+openid&redirect_uri=" . urlencode($redirectUri), - PPOpenIdSession::getAuthorizationUrl($redirectUri, $scope), "Failed case - custom scope"); - - $scope = array(); - $this->assertEquals($expectedBaseUrl . "?client_id=ProxyRP-01&response_type=code&scope=openid+profile+address+email+phone+" . urlencode("https://uri.paypal.com/services/paypalattributes") . "&redirect_uri=" . urlencode($redirectUri), - PPOpenIdSession::getAuthorizationUrl($redirectUri, $scope), "Failed case - default scope"); - - $scope = array('openid'); - $this->assertEquals($expectedBaseUrl . "?client_id=ProxyRP-01&response_type=code&scope=openid&redirect_uri=" . urlencode($redirectUri), - PPOpenIdSession::getAuthorizationUrl($redirectUri, $scope), "Failed case - openid scope"); - } - - /** - * @test - */ - public function testLoginWithCustomConfig() { - - $redirectUri = 'http://mywebsite.com'; - $scope = array('this', 'that', 'and more'); - - $expectedBaseUrl = "https://www.paypal.com/webapps/auth/protocol/openidconnect/v1/authorize"; - - $this->assertEquals($expectedBaseUrl . "?client_id=DummyId&response_type=code&scope=this+that+and+more+openid&redirect_uri=" . urlencode($redirectUri), - PPOpenIdSession::getAuthorizationUrl($redirectUri, $scope, $this->context), "Failed case - custom config"); - } - - /** - * @test - */ - public function testLogoutWithCustomConfig() { - - $redirectUri = 'http://mywebsite.com'; - $idToken = 'abc'; - - $expectedBaseUrl = "https://www.paypal.com/webapps/auth/protocol/openidconnect/v1/endsession"; - - $this->assertEquals($expectedBaseUrl . "?id_token=$idToken&redirect_uri=" . urlencode($redirectUri) . "&logout=true", - PPOpenIdSession::getLogoutUrl($redirectUri, $idToken, $this->context), "Failed case - custom config"); - } -} diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/Openid/PPOpenIdTokeninfoTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/Openid/PPOpenIdTokeninfoTest.php deleted file mode 100644 index 999145d..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/Openid/PPOpenIdTokeninfoTest.php +++ /dev/null @@ -1,41 +0,0 @@ -token = new PPOpenIdTokeninfo(); - $this->token->setAccessToken("Access token") - ->setExpiresIn(900) - ->setRefreshToken("Refresh token") - ->setScope("openid address") - ->setTokenType("Bearer"); - } - - /** - * Tears down the fixture, for example, closes a network connection. - * This method is called after a test is executed. - */ - protected function tearDown() - { - } - - /** - * @test - */ - public function testSerializationDeserialization() { - $tokenCopy = new PPOpenIdTokeninfo(); - $tokenCopy->fromJson($this->token->toJson()); - - $this->assertEquals($this->token, $tokenCopy); - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/Openid/PPOpenIdUserinfoTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/Openid/PPOpenIdUserinfoTest.php deleted file mode 100644 index 330d843..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/Openid/PPOpenIdUserinfoTest.php +++ /dev/null @@ -1,46 +0,0 @@ -setAccountType("PERSONAL")->setAgeRange("20-30")->setBirthday("1970-01-01") - ->setEmail("me@email.com")->setEmailVerified(true) - ->setFamilyName("Doe")->setMiddleName("A")->setGivenName("John") - ->setLocale("en-US")->setGender("male")->setName("John A Doe") - ->setPayerId("A-XZASASA")->setPhoneNumber("1-408-111-1111") - ->setPicture("http://gravatar.com/me.jpg") - ->setSub("me@email.com")->setUserId("userId") - ->setVerifiedAccount(true)->setZoneinfo("America/PST"); - - $userCopy = new PPOpenIdUserinfo(); - $userCopy->fromJson($user->toJSON()); - - $this->assertEquals($user, $userCopy); - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPAPIServiceTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPAPIServiceTest.php deleted file mode 100644 index 4d7cca9..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPAPIServiceTest.php +++ /dev/null @@ -1,72 +0,0 @@ - 'jb-us-seller_api1.paypal.com' , - 'acct1.Password' => 'WX4WTU3S8MY44S7F' , - 'acct1.Signature' => 'AFcWxV21C7fd0v3bYYYRCpSSRl31A7yDhhsPUU2XhtMoZXsWHFxu-RWy' , - 'acct1.AppId' => 'APP-80W284485P519543T' , - 'acct2.UserName' => 'certuser_biz_api1.paypal.com' , - 'acct2.Password' => 'D6JNKKULHN3G5B8A' , - 'acct2.CertPath' => 'cert_key.pem' , - 'acct2.AppId' => 'APP-80W284485P519543T' , - 'http.ConnectionTimeOut' => '30' , - 'http.Retry' => '5' , - 'service.RedirectURL' => 'https://www.sandbox.paypal.com/webscr&cmd=' , - 'service.DevCentralURL' => 'https://developer.paypal.com' , - 'service.EndPoint.IPN' => 'https://www.sandbox.paypal.com/cgi-bin/webscr' , - 'service.EndPoint.AdaptivePayments' => 'https://svcs.sandbox.paypal.com/' , - 'service.SandboxEmailAddress' => 'platform_sdk_seller@gmail.com', - 'log.FileName' => 'PayPal1.log' , - 'log.LogLevel' => 'INFO' , - 'log.LogEnabled' => '1' , - - - ); - - /** - * Sets up the fixture, for example, opens a network connection. - * This method is called before a test is executed. - */ - protected function setUp() - { - $this->object = new PPAPIService(null,'AdaptiveAccounts', 'SOAP', null, $this->config); - } - - /** - * Tears down the fixture, for example, closes a network connection. - * This method is called after a test is executed. - */ - protected function tearDown() - { - } - - /** - * @test - */ - public function testSetServiceName() - { - $this->assertEquals('AdaptiveAccounts',$this->object->serviceName); - $this->object->setServiceName('Invoice'); - $this->assertEquals('Invoice',$this->object->serviceName); - } - - /** - * @test - */ - public function testMakeRequest() - { - - } -} -?> diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPBaseServiceTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPBaseServiceTest.php deleted file mode 100644 index 0b2b592..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPBaseServiceTest.php +++ /dev/null @@ -1,41 +0,0 @@ -object = new PPBaseService('serviceName', 'serviceBinding', null); - } - - /** - * Tears down the fixture, for example, closes a network connection. - * This method is called after a test is executed. - */ - protected function tearDown() - { - } - - /** - * @test - */ - public function testGetServiceName() - { - $this->assertEquals('serviceName',$this->object->getServiceName() ); - } - - -} -?> diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPBootStrap.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPBootStrap.php deleted file mode 100644 index dd5d70f..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPBootStrap.php +++ /dev/null @@ -1,11 +0,0 @@ -credential = new PPCertificateCredential("platfo_1255077030_biz_api1.gmail.com", "1255077037", "cacert.pem"); - $this->credential->setApplicationId('APP-80W284485P519543T'); - } - - /** - * Tears down the fixture, for example, closes a network connection. - * This method is called after a test is executed. - */ - protected function tearDown() - { - } - - /**@test - */ - public function testValidateUname() - { - $this->setExpectedException('PayPal\Exception\PPMissingCredentialException'); - $credUname = new PPCertificateCredential("", "1255077037", "cacert.pem"); - $credUname->validate(); - $setNotExpectedException('PPMissingCredentialException'); - $credCorrect = new PPCertificateCredential("platfo_1255077030_biz_api1.gmail.com", "1255077037", "cacert.pem"); - $var = $credCorrect->validate(); - $this->assertNull($var); - } - /** - * @test - */ - public function testValidatePwd() - { - $this->setExpectedException('PayPal\Exception\PPMissingCredentialException'); - $credpwd = new PPCertificateCredential("platfo_1255077030_biz_api1.gmail.com", "", "cacert.pem"); - $credpwd->validate(); - - } - /** - * @test - */ - public function testValidateCertPath() - { - $this->setExpectedException('PayPal\Exception\PPMissingCredentialException'); - $credCertPath = new PPCertificateCredential("platfo_1255077030_biz_api1.gmail.com", "1255077037", ""); - $credCertPath->validate(); - } - /** - * @test - */ - public function testGetAppId() - { - $credAppid = new PPCertificateCredential("platfo_1255077030_biz_api1.gmail.com", "1255077037", "cacert.pem"); - $credAppid->setApplicationId("APP-ID"); - $this->assertEquals($credAppid->getApplicationId(), "APP-ID"); - } - - /** - * @test - */ - public function testGetUserName() - { - $this->assertEquals('platfo_1255077030_biz_api1.gmail.com', $this->credential->getUserName()); - - } - - /** - * @test - */ - public function testGetPassword() - { - $this->assertEquals('1255077037', $this->credential->getPassword()); - } - - /** - * @test - */ - public function testGetCertificatePath() - { - $this->assertStringEndsWith(dirname(__FILE__). DIRECTORY_SEPARATOR .'cacert.pem', $this->credential->getCertificatePath()); - } - - /**@test - */ - public function testGetApplicationId() - { - $this->assertEquals('APP-80W284485P519543T', $this->credential->getApplicationId()); - } -} -?> diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPConfigManagerTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPConfigManagerTest.php deleted file mode 100644 index eda5d38..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPConfigManagerTest.php +++ /dev/null @@ -1,55 +0,0 @@ -object = PPConfigManager::getInstance(); - } - - /** - * Tears down the fixture, for example, closes a network connection. - * This method is called after a test is executed. - */ - protected function tearDown() - { - } - - - - /** - * @test - */ - public function testGetInstance() - { - $instance = $this->object->getInstance(); - $this->assertTrue($instance instanceof PPConfigManager); - } - - /** - * @test - */ - public function testGetIniPrefix() - { - $ret = $this->object->getIniPrefix(); - $this->assertContains('acct1', $ret); - $this->assertEquals(sizeof($ret), 2); - - $ret = $this->object->getIniPrefix('jb-us-seller_api1.paypal.com'); - $this->assertEquals('acct1', $ret); - } -} -?> diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPConfigurationExceptionTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPConfigurationExceptionTest.php deleted file mode 100644 index 420cd11..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPConfigurationExceptionTest.php +++ /dev/null @@ -1,37 +0,0 @@ -object = new PPConfigurationException('Test PPConfigurationException'); - } - - /** - * Tears down the fixture, for example, closes a network connection. - * This method is called after a test is executed. - */ - protected function tearDown() - { - } - public function testPPConfigurationException() - { - $this->setExpectedException('PayPal\Exception\PPConfigurationException'); - throw new PPConfigurationException('Test PPConfigurationException'); - - } -} -?> diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPConnectionExceptionTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPConnectionExceptionTest.php deleted file mode 100644 index d01550a..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPConnectionExceptionTest.php +++ /dev/null @@ -1,48 +0,0 @@ -object = new PPConnectionException('http://testURL', 'test message'); - } - - /** - * Tears down the fixture, for example, closes a network connection. - * This method is called after a test is executed. - */ - protected function tearDown() - { - } - - /** - * @test - */ - public function testGetUrl() - { - $this->assertEquals('http://testURL',$this->object->getUrl()); - } - /** - * @test - */ - public function testPPConnectionException() - { - $this->setExpectedException('PayPal\Exception\PPConnectionException'); - throw new PPConnectionException('http://testURL','Test msg PPConnectionException'); - - } -} -?> diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPConnectionManagerTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPConnectionManagerTest.php deleted file mode 100644 index 999c464..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPConnectionManagerTest.php +++ /dev/null @@ -1,76 +0,0 @@ - 'jb-us-seller_api1.paypal.com' , - 'acct1.Password' => 'WX4WTU3S8MY44S7F' , - 'acct1.Signature' => 'AFcWxV21C7fd0v3bYYYRCpSSRl31A7yDhhsPUU2XhtMoZXsWHFxu-RWy' , - 'acct1.AppId' => 'APP-80W284485P519543T' , - 'acct2.UserName' => 'certuser_biz_api1.paypal.com' , - 'acct2.Password' => 'D6JNKKULHN3G5B8A' , - 'acct2.CertPath' => 'cert_key.pem' , - 'acct2.AppId' => 'APP-80W284485P519543T' , - 'http.ConnectionTimeOut' => '30' , - 'http.Retry' => '5' , - 'service.RedirectURL' => 'https://www.sandbox.paypal.com/webscr&cmd=' , - 'service.DevCentralURL' => 'https://developer.paypal.com' , - 'service.EndPoint.IPN' => 'https://www.sandbox.paypal.com/cgi-bin/webscr' , - 'service.EndPoint.AdaptivePayments' => 'https://svcs.sandbox.paypal.com/' , - 'service.SandboxEmailAddress' => 'platform_sdk_seller@gmail.com', - 'log.FileName' => 'PayPal1.log' , - 'log.LogLevel' => 'INFO' , - 'log.LogEnabled' => '1' , - - - ); - - /** - * Sets up the fixture, for example, opens a network connection. - * This method is called before a test is executed. - */ - protected function setUp() - { - $this->object = PPConnectionManager::getInstance(); - } - - /** - * Tears down the fixture, for example, closes a network connection. - * This method is called after a test is executed. - */ - protected function tearDown() - { - } - - /** - * @test - */ - public function testGetInstance() - { - $instance = $this->object->getInstance(); - $this->assertTrue($instance instanceof PPConnectionManager); - } - - /** - * @test - */ - public function testGetConnection() - { - $conn = $this->object->getConnection(new PPHttpConfig("http://domain.com"), $this->config); - $this->assertNotNull($conn); - $this->assertTrue($conn instanceof PPHttpConnection); - $this->assertEquals(get_class($conn), "PayPal\Core\PPHttpConnection"); - } -} -?> diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPCredentialManagerTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPCredentialManagerTest.php deleted file mode 100644 index 81cf5c8..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPCredentialManagerTest.php +++ /dev/null @@ -1,104 +0,0 @@ - 'jb-us-seller_api1.paypal.com' , - 'acct1.Password' => 'WX4WTU3S8MY44S7F' , - 'acct1.Signature' => 'AFcWxV21C7fd0v3bYYYRCpSSRl31A7yDhhsPUU2XhtMoZXsWHFxu-RWy' , - 'acct1.AppId' => 'APP-80W284485P519543T' , - 'acct2.UserName' => 'certuser_biz_api1.paypal.com' , - 'acct2.Password' => 'D6JNKKULHN3G5B8A' , - 'acct2.CertPath' => 'cert_key.pem' , - 'acct2.AppId' => 'APP-80W284485P519543T' , - 'http.ConnectionTimeOut' => '30' , - 'http.Retry' => '5' , - 'service.RedirectURL' => 'https://www.sandbox.paypal.com/webscr&cmd=' , - 'service.DevCentralURL' => 'https://developer.paypal.com' , - 'service.EndPoint.IPN' => 'https://www.sandbox.paypal.com/cgi-bin/webscr' , - 'service.EndPoint.AdaptivePayments' => 'https://svcs.sandbox.paypal.com/' , - 'service.SandboxEmailAddress' => 'platform_sdk_seller@gmail.com', - 'log.FileName' => 'PayPal1.log' , - 'log.LogLevel' => 'INFO' , - 'log.LogEnabled' => '1' , - - - ); - /** - * Sets up the fixture, for example, opens a network connection. - * This method is called before a test is executed. - */ - protected function setUp() - { - $this->object = PPCredentialManager::getInstance($this->config); - } - - /** - * Tears down the fixture, for example, closes a network connection. - * This method is called after a test is executed. - */ - protected function tearDown() - { - } - - /** - * @test - */ - public function testGetInstance() - { - $instance = $this->object->getInstance($this->config); - $this->assertTrue($instance instanceof PPCredentialManager); - } - - /** - * @test - */ - public function testGetSpecificCredentialObject() - { - $cred = $this->object->getCredentialObject('jb-us-seller_api1.paypal.com'); - $this->assertNotNull($cred); - $this->assertEquals('jb-us-seller_api1.paypal.com', $cred->getUsername()); - - $cred = $this->object->getCredentialObject('certuser_biz_api1.paypal.com'); - $this->assertNotNull($cred); - $this->assertEquals('certuser_biz_api1.paypal.com', $cred->getUsername()); - $this->assertStringEndsWith('cert_key.pem', $cred->getCertificatePath()); - } - - /** - * @test - */ - public function testGetInvalidCredentialObject() - { - $this->setExpectedException('PayPal\Exception\PPInvalidCredentialException'); - $cred = $this->object->getCredentialObject('invalid_biz_api1.gmail.com'); - } - - /** - * @test - */ - public function testGetDefaultCredentialObject() - { - $cred = $this->object->getCredentialObject(); - $this->assertEquals('jb-us-seller_api1.paypal.com', $cred->getUsername()); - } - - /** - * @test - */ - public function testGetPlatformCredentialObject() - { - $cred = $this->object->getCredentialObject(); - $this->assertEquals('APP-80W284485P519543T', $cred->getApplicationId()); - } -} -?> diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPIPNMessageTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPIPNMessageTest.php deleted file mode 100644 index 9da5007..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPIPNMessageTest.php +++ /dev/null @@ -1,58 +0,0 @@ -assertEquals(false, $ipn->validate()); - } - - - /** - * @test - */ - - public function processIPNWithArrayElements() { - $ipnData = 'transaction[0].id=6WM123443434&transaction[0].status=Completed&transaction[1].id=2F12129812A1&transaction[1].status=Pending'; - $ipn = new PPIPNMessage($ipnData); - - $rawData = $ipn->getRawData(); - $this->assertEquals(4, count($rawData)); - $this->assertEquals('6WM123443434', $rawData['transaction[0].id']); - } - - /** - * @test - */ - public function processIPNWithSpecialCharacters() { - $ipnData = "description=Jake's store"; - - ini_set('get_magic_quotes_gpc', true); - $ipn = new PPIPNMessage($ipnData); - $rawData = $ipn->getRawData(); - $this->assertEquals($rawData['description'], "Jake's store"); - - ini_set('get_magic_quotes_gpc', false); - $ipn = new PPIPNMessage($ipnData); - $rawData = $ipn->getRawData(); - $this->assertEquals($rawData['description'], "Jake's store"); - $this->assertEquals($rawData['description'], "Jake's store"); - } - -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPInvalidCredentialExceptionTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPInvalidCredentialExceptionTest.php deleted file mode 100644 index 7ed7c5a..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPInvalidCredentialExceptionTest.php +++ /dev/null @@ -1,40 +0,0 @@ -object = new PPInvalidCredentialException; - } - - /** - * Tears down the fixture, for example, closes a network connection. - * This method is called after a test is executed. - */ - protected function tearDown() - { - } - - /** - * @test - */ - public function testErrorMessage() - { - $msg = $this->object->errorMessage(); - $this->assertContains('Error on line', $msg); - } -} -?> diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPLoggingManagerTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPLoggingManagerTest.php deleted file mode 100644 index 5285ed8..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPLoggingManagerTest.php +++ /dev/null @@ -1,64 +0,0 @@ -object = new PPLoggingManager('InvoiceTest'); - } - - /** - * Tears down the fixture, for example, closes a network connection. - * This method is called after a test is executed. - */ - protected function tearDown() - { - } - - /** - * @test - */ - public function testError() - { - $this->object->error('Test Error Message'); - - } - - /** - * @test - */ - public function testWarning() - { - $this->object->warning('Test Warning Message'); - } - - /** - * @test - */ - public function testInfo() - { - $this->object->info('Test info Message'); - } - - /** - * @test - */ - public function testFine() - { - $this->object->fine('Test fine Message'); - } -} -?> diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPMessageTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPMessageTest.php deleted file mode 100644 index 8f29a7f..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPMessageTest.php +++ /dev/null @@ -1,441 +0,0 @@ -attrib1 = "abc"; - $o->attrib2 = "random value"; - $c = new AttributeContainerTestClass(); - $c->member = $o; - - $this->assertEquals("attrib1=abc&attrib2=random+value", $o->toNVPString()); - $this->assertEquals("member.attrib1=abc&member.attrib2=random+value", $c->toNVPString()); - - $o->value = "value"; - $this->assertEquals("attrib1=abc&attrib2=random+value&=value", $o->toNVPString()); - $this->assertEquals("member.attrib1=abc&member.attrib2=random+value&member=value", $c->toNVPString()); - - - } - - /** - * @test - */ - public function attributeSerializationInArrays() { - $o = new AttributeTestClass(); - $o->attrib1 = "abc"; - $o->attrib2 = "random value"; - $o->value = "value"; - - $c = new AttributeContainerTestClass(); - $c->member = $o; - - $o = new AttributeTestClass(); - $o->attrib1 = "abc"; - $o->attrib2 = "random value"; - $c->arrayMember = array($o); - - $this->assertEquals("member.attrib1=abc&member.attrib2=random+value&member=value&arrayMember(0).attrib1=abc&arrayMember(0).attrib2=random+value", - $c->toNVPString()); - - $c->arrayMember[0]->value = "value"; - $this->assertEquals("member.attrib1=abc&member.attrib2=random+value&member=value&arrayMember(0).attrib1=abc&arrayMember(0).attrib2=random+value&arrayMember(0)=value", - $c->toNVPString()); - - } - - /** - * @test - */ - public function attributeDeserialization() { - - // Attributes and value present - $responseMap = array( - "member.attrib1" => "abc", - "member.attrib2" => "random+value", - "member" => "value" - ); - $c = new AttributeContainerTestClass(); - $c->init($responseMap); - - $this->assertNotNull($c->member); - $this->assertEquals("abc", $c->member->attrib1); - $this->assertEquals("random value", $c->member->attrib2); - $this->assertEquals("value", $c->member->value); - - // Only value present - $responseMap = array( - "member" => "value" - ); - $c = new AttributeContainerTestClass(); - $c->init($responseMap); - - $this->assertNotNull($c->member); - $this->assertEquals("value", $c->member->value); - - - // Only attributes present - $responseMap = array( - "member.attrib1" => "abc", - "member.attrib2" => "random+value" - ); - $c = new AttributeContainerTestClass(); - $c->init($responseMap); - - $this->assertNotNull($c->member); - $this->assertEquals("abc", $c->member->attrib1); - $this->assertEquals("random value", $c->member->attrib2); - - } - - /** - * @test - */ - public function attributeDeserializationInArrays() { - - // Only value present. Single item in list - $responseMap = array( - "arrayMember(0)" => "value+1" - ); - $c = new AttributeContainerTestClass(); - $c->init($responseMap); - $this->assertNotNull($c->arrayMember[0]); - $this->assertEquals("value 1", $c->arrayMember[0]->value); - - - // Only attributes present. Single item in list - $responseMap = array( - "arrayMember(0).attrib1" => "abc", - "arrayMember(0).attrib2" => "random+value", - ); - $c = new AttributeContainerTestClass(); - $c->init($responseMap); - - $this->assertNotNull($c->arrayMember[0]); - $this->assertEquals("abc", $c->arrayMember[0]->attrib1); - $this->assertEquals("random value", $c->arrayMember[0]->attrib2); - - - // Attributes and value present. Mulitple items in list - $responseMap = array( - "arrayMember(0).attrib1" => "abc", - "arrayMember(0).attrib2" => "random+value", - "arrayMember(0)" => "value", - "arrayMember(0).attrib1" => "xyz", - "arrayMember(1).attrib1" => "attribute1" - ); - $c->init($responseMap); - - $this->assertEquals("value", $c->arrayMember[0]->value); - $this->assertEquals("xyz", $c->arrayMember[0]->attrib1); - $this->assertEquals("random value", $c->arrayMember[0]->attrib2); - - $this->assertEquals("attribute1", $c->arrayMember[1]->attrib1); - $this->assertNull($c->arrayMember[1]->value); - - } - - - /** - * @test - */ - public function simpleSerialization() { - - $o = new SimpleTestClass(); - $o->field1 = "fieldvalue1"; - $o->field2 = "fieldvalue2"; - - $this->assertEquals("field1=fieldvalue1&field2=fieldvalue2", $o->toNVPString('')); - } - - - /** - * @test - */ - public function simpleDeserialization() { - - $map = array( - "field1" => "fieldvalue1", - "field2" => "field+value2" - ); - $o = new SimpleTestClass(); - $o->init($map); - - $this->assertEquals("fieldvalue1", $o->field1); - $this->assertEquals("field value2", $o->field2); - } - - - /** - * @test - */ - public function nestedSerialization() { - - $o = new SimpleTestClass(); - $o->field1 = "fieldvalue1"; - $o->field2 = "fieldvalue2"; - - $c = new SimpleContainerTestClass(); - $c->nestedField = $o; - $c->field1 = "abc"; - - $this->assertEquals("field1=abc&nestedField.field1=fieldvalue1&nestedField.field2=fieldvalue2", $c->toNVPString('')); - } - - - /** - * @test - */ - public function nestedDeserialization() { - - $map = array( - "field1" => "abc", - "nestedField.field1" => "fieldvalue1", - "nestedField.field2" => "field+value2" - ); - - $c = new SimpleContainerTestClass(); - $c->init($map); - - $this->assertEquals("abc", $c->field1); - $this->assertEquals("fieldvalue1", $c->nestedField->field1); - $this->assertEquals("field value2", $c->nestedField->field2); - } - - - /** - * @test - */ - public function simpleListSerialization() { - - $c = new SimpleContainerTestClass(); - $c->list1 = array('Array', "of", "some strings"); - $c->field1 = "abc"; - - $this->assertEquals("field1=abc&list1(0)=Array&list1(1)=of&list1(2)=some+strings", $c->toNVPString('')); - } - - /** - * @test - */ - public function simpleListDeserialization() { - - $map = array( - "field1" => "abc", - "list1(0)" => "Array", - "list1(1)" => "of", - "list1(2)" => "some+strings" - ); - - $c = new SimpleContainerTestClass(); - $c->init($map); - - $this->assertEquals("abc", $c->field1); - $this->assertEquals(3, count($c->list1)); - $this->assertEquals("some strings", $c->list1[2]); - } - - /** - * @test - */ - public function complexListSerialization() { - - $o1 = new SimpleTestClass(); - $o1->field1 = "somevalue1"; - $o1->field2 = "somevalue2"; - - $o2 = new SimpleTestClass(); - $o2->field1 = "another value1"; - $o2->field2 = "anothervalue2"; - - $c = new SimpleContainerTestClass(); - $c->list2 = array($o1, $o2); - - $this->assertEquals("list2(0).field1=somevalue1&list2(0).field2=somevalue2&list2(1).field1=another+value1&list2(1).field2=anothervalue2", - $c->toNVPString('')); - } - - /** - * @test - */ - public function complexListDeserialization() { - - $map = array( - "list2(0).field1" => "somevalue1", - "list2(0).field2" => "somevalue2", - "list2(1).field1" => "another+value1", - "list2(1).field2" => "anothervalue2" - ); - - $c = new SimpleContainerTestClass(); - $c->init($map); - - $this->assertEquals(2, count($c->list2)); - $this->assertEquals("somevalue1", $c->list2[0]->field1); - $this->assertEquals("another value1", $c->list2[1]->field1); - } - - - /** - * @test - */ - public function serializeAndDeserialize() { - - $o1 = new AttributeTestClass(); - $o1->value = "some value"; - $o1->attrib1 = "someattrib"; - - $o2 = new AttributeTestClass(); - $o2->value = "some value2"; - - $o3 = new AttributeTestClass(); - $o3->attrib1 = "attribute"; - $o3->value = "some value3"; - - $c = new SimpleContainerTestClass(); - $c->list3 = array($o1, $o2, $o3); - - $newC = new SimpleContainerTestClass(); - $newC->init(PPUtils::nvpToMap($c->toNVPString(''))); //TODO: Mock nvpToMap - - $this->assertEquals($c, $newC); - } - - /** - * @test - */ - public function deserializeAndSerialize() { - $nvpString = "list2(0).field1=somevalue1&list2(0).field2=somevalue2&list2(1).field1=another+value1&list2(1).field2=anothervalue2&list3(0).attrib1=somevalue1&list3(0).attrib2=somevalue2&list3(0)=value+field&list3(1).attrib1=another+value1&list3(2)=anothervalue2"; - $newC = new SimpleContainerTestClass(); - $newC->init(PPUtils::nvpToMap($nvpString)); //TODO: Mock nvpToMap - $this->assertEquals($nvpString, $newC->toNVPString()); - } -} \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPMissingCredentialExceptionTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPMissingCredentialExceptionTest.php deleted file mode 100644 index ec8e752..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPMissingCredentialExceptionTest.php +++ /dev/null @@ -1,41 +0,0 @@ -object = new PPMissingCredentialException; - } - - /** - * Tears down the fixture, for example, closes a network connection. - * This method is called after a test is executed. - */ - protected function tearDown() - { - } - - /** - * @test - */ - public function testErrorMessage() - { - $msg = $this->object->errorMessage(); - $this->assertContains('Error on line', $msg); - } -} -?> diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPSignatureCredentialTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPSignatureCredentialTest.php deleted file mode 100644 index 2d48a9d..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPSignatureCredentialTest.php +++ /dev/null @@ -1,103 +0,0 @@ -merchantCredential = new PPSignatureCredential("platfo_1255077030_biz_api1.gmail.com", "1255077037","Abg0gYcQyxQvnf2HDJkKtA-p6pqhA1k-KTYE0Gcy1diujFio4io5Vqjf"); - - $this->platformCredential = new PPSignatureCredential("platfo_1255077030_biz_api1.gmail.com", "1255077037","Abg0gYcQyxQvnf2HDJkKtA-p6pqhA1k-KTYE0Gcy1diujFio4io5Vqjf"); - $this->platformCredential->setApplicationId("APP-80W284485P519543T"); - } - - /** - * Tears down the fixture, for example, closes a network connection. - * This method is called after a test is executed. - */ - protected function tearDown() - { - } - - /** - * @test - */ - public function testValidateUsername() - { - $this->setExpectedException('PayPal\Exception\PPMissingCredentialException'); - $cred = new PPSignatureCredential("", "1255077037","Abg0gYcQyxQvnf2HDJkKtA-p6pqhA1k-KTYE0Gcy1diujFio4io5Vqjf"); - $cred->validate(); - } - - /** - * @test - */ - public function testValidatepwd() - { - $this->setExpectedException('PayPal\Exception\PPMissingCredentialException'); - $cred = new PPSignatureCredential("platfo_1255077030_biz_api1.gmail.com", "","Abg0gYcQyxQvnf2HDJkKtA-p6pqhA1k-KTYE0Gcy1diujFio4io5Vqjf"); - $cred->validate(); - } - - /** - * @test - */ - public function testGetSignature() - { - $this->assertEquals('Abg0gYcQyxQvnf2HDJkKtA-p6pqhA1k-KTYE0Gcy1diujFio4io5Vqjf', $this->merchantCredential->getSignature()); - } - /** - * @test - */ - public function testGetUserName() - { - $this->assertEquals('platfo_1255077030_biz_api1.gmail.com', $this->merchantCredential->getUserName()); - } - /** - * @test - */ - public function testGetPassword() - { - $this->assertEquals('1255077037', $this->merchantCredential->getPassword()); - } - /** - * @test - */ - public function testGetAppId() - { - $this->assertEquals('APP-80W284485P519543T', $this->platformCredential->getApplicationId()); - } - - public function testThirdPartyAuthorization() { - $authorizerEmail = "merchant@domain.com"; - $thirdPartyAuth = new PPSubjectAuthorization($authorizerEmail); - $cred = new PPSignatureCredential("username", "pwd", "signature"); - $cred->setThirdPartyAuthorization($thirdPartyAuth); - $this->assertEquals($cred->getThirdPartyAuthorization()->getSubject(), $authorizerEmail); - - $accessToken = "atoken"; - $tokenSecret = "asecret"; - $thirdPartyAuth = new PPTokenAuthorization($accessToken, $tokenSecret); - $cred->setThirdPartyAuthorization($thirdPartyAuth); - $this->assertEquals($cred->getThirdPartyAuthorization()->getAccessToken(), $accessToken); - $this->assertEquals($cred->getThirdPartyAuthorization()->getTokenSecret(), $tokenSecret); - } - -} -?> diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPUtilsTest.php b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPUtilsTest.php deleted file mode 100644 index 7ad664d..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/PPUtilsTest.php +++ /dev/null @@ -1,63 +0,0 @@ -object = new PPUtils(); - } - - /** - * Tears down the fixture, for example, closes a network connection. - * This method is called after a test is executed. - */ - protected function tearDown() - { - } - - /** - * @test - */ - public function testNvpToMap() - { - $arr = $this->object->nvpToMap('requestEnvelope.detailLevel=ReturnAll&requestEnvelope.errorLanguage=en_US&invoice.merchantEmail=jb-us-seller1@paypal.com&invoice.payerEmail=jbui-us-personal1@paypal.com&invoice.items[0].name=product1&invoice.items[0].quantity=10.0&invoice.items[0].unitPrice=1.2&invoice.currencyCode=USD&invoice.paymentTerms=DueOnReceipt'); - $this->assertArrayHasKey('requestEnvelope.detailLevel', $arr); - $this->assertArrayHasKey('requestEnvelope.errorLanguage', $arr); - $this->assertEquals(is_array($arr),true); - } - - /** - * @test - */ - public function testArray_match_key() - { - $arr = array('key1' => 'somevalue', 'key2' => 'someothervalue'); - $this->assertEquals(PPUtils::array_match_key($arr, "key"), true); - $arr = unserialize('a:10:{s:26:"responseEnvelope.timestamp";s:35:"2011-04-19T04%3A32%3A29.469-07%3A00";s:20:"responseEnvelope.ack";s:7:"Failure";s:30:"responseEnvelope.correlationId";s:13:"c2514f258ddf1";s:22:"responseEnvelope.build";s:7:"1829457";s:16:"error(0).errorId";s:6:"580027";s:15:"error(0).domain";s:8:"PLATFORM";s:17:"error(0).severity";s:5:"Error";s:17:"error(0).category";s:11:"Application";s:16:"error(0).message";s:44:"Prohibited+request+parameter%3A+businessInfo";s:21:"error(0).parameter(0)";s:12:"businessInfo";}'); - $this->assertEquals(PPUtils::array_match_key($arr, "error(0)."), true); - } - - /** - * @test - */ - public function testGetLocalIPAddress() - { - $ip = $this->object->getLocalIPAddress(); - //$this->assertEquals('127.0.0.1',$ip); - } - -} -?> diff --git a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/sdk_config.ini b/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/sdk_config.ini deleted file mode 100644 index 37e11b4..0000000 --- a/lib/paymentProcessors/PayPal/paypal-API-Not_sure_if_will_use/sdk-core-php/tests/sdk_config.ini +++ /dev/null @@ -1,33 +0,0 @@ -;Account credentials -[Account] - -acct1.ClientId = ProxyRP-01 -acct1.ClientSecret = A8VERY8SECRET8VALUE0 -acct1.UserName = jb-us-seller_api1.paypal.com -acct1.Password = WX4WTU3S8MY44S7F -acct1.Signature = AFcWxV21C7fd0v3bYYYRCpSSRl31A7yDhhsPUU2XhtMoZXsWHFxu-RWy -acct1.AppId = APP-80W284485P519543T -# Subject is optional and is required only in case of third party authorization -acct1.Subject = - -; Certificate Credentials Test Account -acct2.UserName = platfo_1255170694_biz_api1.gmail.com -acct2.Password = 2DPPKUPKB7DQLXNR -; Certificate path relative to config folder or absolute path in file system -acct2.CertPath = cacert.pem - - -;Connection Information -[Http] -http.ConnectionTimeOut = 30 -http.Retry = 5 -;http.Proxy - -;Logging Information -[Log] -log.FileName=../PayPal.log -log.LogLevel=INFO -log.LogEnabled=true - -mode = sandbox - \ No newline at end of file diff --git a/lib/paymentProcessors/PayPal/test.php b/lib/paymentProcessors/PayPal/test.php deleted file mode 100755 index 6ee2f98..0000000 --- a/lib/paymentProcessors/PayPal/test.php +++ /dev/null @@ -1,111 +0,0 @@ - 'AY2IlhCAFCgTaYSgrGfBQ0h5WKKgpLwU-jd2QkKsEbDpGEWtCDZKtp2VLhu1', - 'secret' => 'EOWLsBDrkvdOKUlfhAKJ47aXHBr5xzw-2o7JdLCcLVciGqNGXlhMayP1WKhe', - 'returnURL' => $thisScript.'?PayPalAction=Approved', - 'cancelURL' => $thisScript.'?PayPalAction=Canceled', - 'test' => 3 -); -$payment = array( - 'name' => 'Gaslight Media', - 'charge' => 22.4, - 'invoice' => '123abc', - 'description' => 'Event Tickets Purchase', - 'items' => array( - array( - 'quantity' => '2', - 'name' => 'Fancy Dancy Dance', - 'price' => 5.6, - 'sku' => '123ABC1' - ), - array( - 'quantity' => '1', - 'name' => 'TuTu Tango', - 'price' => 11.2, - 'sku' => '123ABC2' - ) - ) -); -$contact = array(); - -// Load the PayPal class file -require_once dirname(__FILE__).'/PayPal.php'; - -// Start session -session_start(); - - -// Check for certain actions related to sending user to PayPal site for approval -switch ($_REQUEST['PayPalAction']) { - - case 'GetApproval': - - // Use browser redirect 302 to send user to PayPal. - // This is proper way to do so according to the API documentation. - $trans = $_SESSION['trans']; - header('Location: '.$trans->urls->approval_url->href); - exit; - - break; - - case 'Approved': - - echo "Return link followed.

"; - - // Save Payer ID - $_SESSION['payerID'] = $_REQUEST['PayerID']; // NEED TO FILTER THIS FOR PRODUCTION - - // Create PayPal object with existing access object from the session - $PayPal = new PaymentGateway($account, $_SESSION['access'], $_SESSION['trans']); - - // Execute the PayPal payment - $r = $PayPal->executePayment($_SESSION['payerID']); - - echo "Payment Executed Successfully

"; - - exit; - - break; - - case 'Canceled': - - echo "Payment Cancelled

"; - exit; - - break; -} - -// Create the PayPal object (note no previous access object) -$PayPal = new PaymentGateway($account, false, false); - -// Was there an error? -if (!$PayPal->status) { - echo "Received an error: ".$PayPal->error; - exit; -} - -// Store access information -$_SESSION['access'] = $PayPal->access; - -// Try to enter Payment -$PayPal->processPayment($payment, $contact); - -// Was there an error? -if (!$PayPal->status) { - echo "Received an error: ".$PayPal->error; - exit; -} - -// Store Transaction data to session -$_SESSION['trans'] = $PayPal->trans; - -// Show user link to PayPal for them to approve payment -// Note that uses a target to create a new window/tab -echo 'Proceed to PayPal'; - -?> \ No newline at end of file diff --git a/lib/paymentProcessors/TestByCardNumber/paymentGateway.php b/lib/paymentProcessors/TestByCardNumber/paymentGateway.php deleted file mode 100644 index 9098c5f..0000000 --- a/lib/paymentProcessors/TestByCardNumber/paymentGateway.php +++ /dev/null @@ -1,190 +0,0 @@ - - * @license http://www.gaslightmedia.com Gaslightmedia - * @release SVN: $Id: classes/paymentProcessors/test.php,v 1.0 2011/01/25 19:31:47 cscott Exp $ - * @link <> - */ - -/** - * EventManagementAuthorizeNetPaymentProcessing class - * - * PHP version 5 - * - * @category Event Management Admin Tickets - * @package EventManagement - * @author Chuck Scott - * @license http://www.gaslightmedia.com Gaslightmedia - * @release SVN: $Id: classes/paymentProcessors/test.php,v 1.0 2011/01/25 19:31:47 cscott Exp $ - * @link <> - */ - -/** - * Test Payment Gateway class - * - * PHP version 5 - */ - -class PaymentGateway -{ - - /** - * Constructor - * - * @param $account Array of account information - Not used for Test Processor - * - * @return boolean Returns value of $success parameter - * @access public - */ - function __construct($account = false) - { - - // Nothing to do here for the test processor - return true; - - } - - /* - * Process Credit Card Payment - * - * @param array $pmt Payment information - * - * array( - * 'gateway' => {selected payment gateway}, - * 'name' => {name of venue} - * 'charge' => {amount to charge card} - * 'cctype' => {type of card - text} - * 'ccnumb' => {card number - digits only} - * 'ccexp' => {expiration date as m/Y} - * 'ccode' => {security code on back of card} - * ) - * - * @param array $contact Billing contact information (not used in this class) - * - * This Test Processor looks at the last digit of the card number - * and synthesizes a corresponding response. - * - * 1 Card Approved - * 2 Bad Data Supplied - * 3 Communications Failure - * 4 Bad response or no response from processor - * 5 Transaction validation not accepted - * 6 Merchant authentication failure or bad account - * 7 Card Declined - * - * @return array Returns array of results - */ - function processPayment($pmt, $contact = false) - { - - // Get last digit of card number that indicates desired response - $respCode = substr($pmt['ccnumb'], 15, 1); - - // Approved flag - $approved = false; - - // Prepare synthesized response - switch ($respCode) { - - case 1: - - $resp = array( - 'gateway' => 'Card # Tests', - 'status' => 1, - 'statusText' => 'Card Approved', - 'authCode' => '00110011', - 'description' => 'Card Approved' - ); - break; - - case 2: - - $resp = array( - 'gateway' => 'Card # Tests', - 'status' => 2, - 'statusText' => 'Bad data supplied', - 'authCode' => '', - 'description' => 'Card number was not recognizable' - ); - break; - - case 3: - - $resp = array( - 'gateway' => 'Card # Tests', - 'status' => 3, - 'statusText' => 'Communications failure', - 'authCode' => '', - 'description' => 'We were unable to communicate with the credit card processing service.' - ); - break; - - case 4: - - $resp = array( - 'gateway' => 'Card # Tests', - 'status' => 4, - 'statusText' => 'Bad Response', - 'authCode' => '', - 'description' => 'We received an unrecognizable response from the credit card processing service.' - ); - break; - - case 5: - - $resp = array( - 'gateway' => 'Card # Tests', - 'status' => 5, - 'statusText' => 'Transaction not valid', - 'authCode' => '', - 'description' => 'We were unable to validate the response from the credit card processor.' - ); - break; - - case 6: - - $resp = array( - 'gateway' => 'Card # Tests', - 'status' => 6, - 'statusText' => 'Merchant account problem', - 'authCode' => '00110011', - 'description' => 'The merchant account for this venue was not recognized by the credit card processor.' - ); - break; - - case 7: - - $resp = array( - 'gateway' => 'Card # Tests', - 'status' => 7, - 'statusText' => 'Card Declined', - 'authCode' => '', - 'description' => 'Your credit card purchase was declined.' - ); - break; - - default: // Consider any other last digit as approved - - $resp = array( - 'gateway' => 'Card # Tests', - 'status' => 1, - 'statusText' => 'Card Approved', - 'authCode' => '00110011', - 'description' => 'Card Approved' - ); - break; - - } - - return $resp; - } - -} - - -?> \ No newline at end of file diff --git a/lib/paymentProcessors/TestGood/paymentGateway.php b/lib/paymentProcessors/TestGood/paymentGateway.php deleted file mode 100644 index 2dd38a8..0000000 --- a/lib/paymentProcessors/TestGood/paymentGateway.php +++ /dev/null @@ -1,96 +0,0 @@ - - * @license http://www.gaslightmedia.com Gaslightmedia - * @release SVN: $Id: classes/paymentProcessors/no_payment.php,v 1.0 2011/01/25 19:31:47 cscott Exp $ - * @link <> - */ - -/** - * No Payment PaymentGateway class - * - * PHP version 5 - * - * @category Event Management Admin Tickets - * @package EventManagement - * @author Chuck Scott - * @license http://www.gaslightmedia.com Gaslightmedia - * @release SVN: $Id: classes/paymentProcessors/no_payment.php,v 1.0 2011/01/25 19:31:47 cscott Exp $ - * @link <> - */ - -/** - * No Payment Gateway class - * - * PHP version 5 - */ - -class PaymentGateway -{ - - /** - * Constructor - * - * @param $account Array of account information - Not used for Test Processor - * - * @return boolean Returns value of $success parameter - * @access public - */ - function __construct($account = false) - { - - // Nothing to do here - return true; - - } - - /* - * No Payment Required - * - * @param array $pmt Payment information - * - * array( - * 'gateway' => {selected payment gateway}, - * 'name' => {name of venue} - * 'charge' => {amount to charge card} - * 'cctype' => {type of card - text} - * 'ccnumb' => {card number - digits only} - * 'ccexp' => {expiration date as m/Y} - * 'ccode' => {security code on back of card} - * ) - * - * @param array $contact Billing contact information (not used in this class) - * - * This Processor always returns a "Card Approved" status - * and synthesizes a corresponding response. - * - * 1 Card Approved - * - * @return array Returns array of results - */ - function processPayment($pmt, $contact = false) - { - - // Get last digit of card number that indicates desired response - $respCode = 'NO-PAYMENT'; - - // Approved flag - $approved = false; - - $resp = array( - 'gateway' => 'Card Good', - 'status' => 1, - 'statusText' => 'No Payment', - 'authCode' => '000000', - 'description' => 'No Payment Required' - ); - - return $resp; - } - -} \ No newline at end of file diff --git a/lib/paymentProcessors/readme.txt b/lib/paymentProcessors/readme.txt deleted file mode 100644 index 5796411..0000000 --- a/lib/paymentProcessors/readme.txt +++ /dev/null @@ -1,11 +0,0 @@ -Gaslight Media Payment Gateway Classes --------------------------------------- - -These classes are standardized so they may be used to process payments for the same calling code. -To do this, all of the classes that need to be called are named "paymentGaetway.php" and they use -the same standards for method names, calling parameters, and return results. - -Since all of the classes have the same name, it is only necessary to specify the directory in which -to find the class to select the desired payment methd. - -(Need to add standards documentation here) \ No newline at end of file diff --git a/models/front/registrations/cartLinkWidget.php b/models/front/registrations/cartLinkWidget.php index beddaa0..97b1922 100644 --- a/models/front/registrations/cartLinkWidget.php +++ b/models/front/registrations/cartLinkWidget.php @@ -82,6 +82,7 @@ class GlmMembersFront_registrations_cartLinkWidget $haveCart = false; $viewAttr = isset($actionData['request']['view']) ? $actionData['request']['view'] : false; + $pageAttr = isset($actionData['request']['page']) ? $actionData['request']['page'] : false; $cartData = apply_filters('glm_members_registrations_cart_summary_data', false, false); @@ -92,10 +93,10 @@ class GlmMembersFront_registrations_cartLinkWidget // Compile template data $templateData = $cartData; $templateData = array_merge( $cartData, array( + 'page' => $pageAttr, 'haveCart' => $haveCart, 'assetUrl' => GLM_MEMBERS_REGISTRATIONS_PLUGIN_ASSETS_URL, 'regUrl' => GLM_MEMBERS_REGISTRATIONS_SITE_BASE_URL.$this->config['settings']['canonical_reg_page'].'/', - 'page' => 'registration', 'loggedIn' => ( isset( $_SESSION['LoginAccount'] ) ) ? $_SESSION['LoginAccount']: false, ) ); diff --git a/models/front/registrations/checkout.php b/models/front/registrations/checkout.php index 70b3021..d791acb 100644 --- a/models/front/registrations/checkout.php +++ b/models/front/registrations/checkout.php @@ -58,6 +58,8 @@ class GlmMembersFront_registrations_checkout extends GlmRegCartSupport $payMethod = false; $compCode = false; + $loggedIn = ( isset( $_SESSION['LoginAccount'] ) ) ? $_SESSION['LoginAccount']: false; + // Get misc texts require_once GLM_MEMBERS_REGISTRATIONS_PLUGIN_CLASS_PATH.'/data/dataMisc.php'; $Misc = new GlmDataRegistrationsMisc($this->wpdb, $this->config); @@ -289,6 +291,7 @@ echo "

".print_r($this->cart,1)."
"; } // For each event in cart, check each payment method. Only methods enabled in all events are available. + // Note that $event['payment_methods'] has already been set for restricted or unrestricted methods by support class. foreach ($this->cart['events'] as $event) { foreach ($event['payment_methods']['bitmap'] as $payMethodKey=>$payMethodVal) { @@ -332,7 +335,7 @@ echo "
".print_r($this->cart,1)."
"; 'haveCart' => $haveCart, 'cart' => $this->cart, 'checkoutUrl' => GLM_MEMBERS_REGISTRATIONS_SITE_BASE_URL.$this->config['settings']['canonical_reg_page'].'/', - 'loggedIn' => ( isset( $_SESSION['LoginAccount'] ) ) ? $_SESSION['LoginAccount']: false, + 'loggedIn' => $loggedIn, 'regUrl' => GLM_MEMBERS_REGISTRATIONS_SITE_BASE_URL.$this->config['settings']['canonical_reg_page'].'/', 'assetUrl' => GLM_MEMBERS_REGISTRATIONS_PLUGIN_ASSETS_URL, 'haveMessages' => count($messages) > 0, diff --git a/models/front/registrations/checkoutProcess.php b/models/front/registrations/checkoutProcess.php index cd163bb..92ea7b7 100644 --- a/models/front/registrations/checkoutProcess.php +++ b/models/front/registrations/checkoutProcess.php @@ -181,9 +181,12 @@ class GlmMembersFront_registrations_checkoutProcess extends GlmRegCartSupport // Try to update the account information and if that works get the data for editing again if ($accountId > 0) { + // Update the account billing information only then grab it again for edit to match what we're getting below. $regAccount = $Account->updateAccountBillingOnly($accountId); + $regAccount = $Account->editEntry($accountId); } + // Otherwise this is a guest so try to create the account using the submitted data } else { @@ -286,6 +289,7 @@ class GlmMembersFront_registrations_checkoutProcess extends GlmRegCartSupport // Add billing information to billing array $billing = array( + 'id' => false, 'fname' => $regAccount['fieldData']['bill_fname'], 'lname' => $regAccount['fieldData']['bill_lname'], 'addr1' => $regAccount['fieldData']['bill_addr1'], @@ -298,6 +302,12 @@ class GlmMembersFront_registrations_checkoutProcess extends GlmRegCartSupport 'email' => $regAccount['fieldData']['email'] ); + // Other data fields that might be supplied + $transOpt = 0; + $customerProfileId = false; + $paymentProfileId = false; + $checkCC = true; + // Execute selected payment method switch ($payMethod) { @@ -361,6 +371,15 @@ class GlmMembersFront_registrations_checkoutProcess extends GlmRegCartSupport // Credit Card case $this->config['payment_method_numb']['CreditCard']: + // Get the credit card input in case we need it + $cardData = array( + 'cc_type' => filter_input(INPUT_POST, 'cc_type', FILTER_SANITIZE_NUMBER_INT), + 'cc_name' => filter_input(INPUT_POST, 'cc_name', FILTER_SANITIZE_STRING), + 'cc_numb' => filter_input(INPUT_POST, 'cc_numb', FILTER_SANITIZE_NUMBER_INT), + 'cc_exp' => filter_input(INPUT_POST, 'cc_exp', FILTER_SANITIZE_STRING), + 'cc_cvv' => filter_input(INPUT_POST, 'cc_cvv', FILTER_SANITIZE_NUMBER_INT) + ); + // Get the selected credit card processor type $ccProcessor = $this->config['settings']['reg_proc_methods']; @@ -378,6 +397,23 @@ class GlmMembersFront_registrations_checkoutProcess extends GlmRegCartSupport 'email' => $this->config['settings']['reg_authorize_net_merchant_email'] ); + // Add payment fields for Payment Profiles + if (isset($_REQUEST['use_saved_cc_profile']) && trim($_REQUEST['use_saved_cc_profile']) != '' ) { + $transOpt = 2; + $checkCC = false; + $customerProfileId = $regAccount['fieldData']['customer_profile_id']; + $paymentProfileId = $regAccount['fieldData']['payment_profile_id']; + + } elseif (isset($_REQUEST['cc_save']) && trim($_REQUEST['cc_save']) != '' ) { + $transOpt = 1; + } + + // Convert card expiration date to required format + if ($transOpt < 2) { + $cardExp = explode('/', $cardData['cc_exp']); + $cardData['cc_exp'] = '20'.$cardExp[1].'-'.$cardExp[0]; + } + break; case $this->config['proc_method_numb']['MerchantSolutions']: @@ -403,52 +439,51 @@ class GlmMembersFront_registrations_checkoutProcess extends GlmRegCartSupport } - // Get the credit card input - $cardData = array( - 'cc_type' => filter_input(INPUT_POST, 'cc_type', FILTER_SANITIZE_NUMBER_INT), - 'cc_name' => filter_input(INPUT_POST, 'cc_name', FILTER_SANITIZE_STRING), - 'cc_numb' => filter_input(INPUT_POST, 'cc_numb', FILTER_SANITIZE_NUMBER_INT), - 'cc_exp' => filter_input(INPUT_POST, 'cc_exp', FILTER_SANITIZE_STRING), - 'cc_cvv' => filter_input(INPUT_POST, 'cc_cvv', FILTER_SANITIZE_NUMBER_INT) - ); + // If we need to check for proper credit card data + if ($checkCC) { - // Check all credit card input - if ( - $cardData['cc_type'] && $cardData['cc_type'] > 0 && - $cardData['cc_name'] && $cardData['cc_name'] != '' && - $cardData['cc_numb'] && $cardData['cc_numb'] > 0 && - $cardData['cc_exp'] && $cardData['cc_exp'] != '' && - $cardData['cc_cvv'] && $cardData['cc_cvv'] > 0 - ) { + // Check all credit card input + if ( + $cardData['cc_type'] && $cardData['cc_type'] > 0 && + $cardData['cc_name'] && $cardData['cc_name'] != '' && + $cardData['cc_numb'] && $cardData['cc_numb'] > 0 && + $cardData['cc_exp'] && $cardData['cc_exp'] != '' && + $cardData['cc_cvv'] && $cardData['cc_cvv'] > 0 + ) { - if (!isset($this->config['credit_card_match'][$cardData['cc_type']]) || - !preg_match($this->config['credit_card_match'][$cardData['cc_type']], $cardData['cc_numb']) - ) { - $messages[] = 'The credit card number you entered does not match the selected type of credit card.'; + if (!isset($this->config['credit_card_match'][$cardData['cc_type']]) || + !preg_match($this->config['credit_card_match'][$cardData['cc_type']], $cardData['cc_numb']) + ) { + $messages[] = 'The credit card number you entered does not match the selected type of credit card.'; + } + + } else { + $messages[] = 'You did not supply all required credit card information.'; } - } else { - $messages[] = 'You did not supply all required credit card information.'; } if (count($messages) == 0) { // Determine the directory of the payment processor to load and instatiate it. if ($ccProcessor && isset($this->config['proc_dir'][$ccProcessor])) { - require_once GLM_MEMBERS_REGISTRATIONS_PLUGIN_LIB_PATH.'/paymentProcessors/'.$this->config['proc_dir'][$ccProcessor].'/paymentGateway.php'; + require_once GLM_MEMBERS_PLUGIN_LIB_PATH.'/paymentProcessors/'.$this->config['proc_dir'][$ccProcessor].'/paymentGateway.php'; $CcProcessor = new PaymentGateway($account); } $payment = array( - 'name' => $this->config['settings']['reg_org_name'], // Name of venue - 'charge' => $this->cart['totalCharges'], // Total charges - 'cctype' => $cardData['cc_type'], // Card Type - 'ccname' => $cardData['cc_name'], // Name on Card - 'ccnumb' => $cardData['cc_numb'], // Card Number - 'ccexp' => $cardData['cc_exp'], // Expiration Date - 'cccode' => $cardData['cc_cvv'], // CCV - security code - 'invoice' => 'reg-'.$_SESSION['glm_reg_cart_id'] // Invoice # is "reg-" plus cart ID + 'transOpt' => $transOpt, // 0 = charge card, 1 = charge and store, 2 = charge stored card + 'name' => $this->config['settings']['reg_org_name'], // Name of venue + 'charge' => $this->cart['totalCharges'], // Total charges + 'customerProfileId' => $customerProfileId, // Customer profile ID for charging stored card + 'paymentProfileId' => $paymentProfileId, // Payment profile ID for charging stored card + 'cctype' => $cardData['cc_type'], // Card Type + 'ccname' => $cardData['cc_name'], // Name on Card + 'ccnumb' => $cardData['cc_numb'], // Card Number + 'ccexp' => $cardData['cc_exp'], // Expiration Date + 'cccode' => $cardData['cc_cvv'], // CCV - security code + 'invoice' => 'reg-'.$_SESSION['glm_reg_cart_id'] // Invoice # is "reg-" plus cart ID ); // Now try to run the card processor @@ -466,9 +501,9 @@ class GlmMembersFront_registrations_checkoutProcess extends GlmRegCartSupport array( 'cc_type' => $payment['cctype'], 'cc_name' => $payment['ccname'], - 'cc_numb' => $cc_numb_store, + 'cc_numb' => ($transOpt == 2 ? 'Stored':'').$cc_numb_store, 'cc_exp' => $payment['ccexp'], - 'cc_conf' => $ccConfirmation, + 'cc_conf' => $ccResult['authCode'] ) ); $reqFormat = array_merge( @@ -482,6 +517,38 @@ class GlmMembersFront_registrations_checkoutProcess extends GlmRegCartSupport ) ); + // Check if we need to store new card profile data + if ($transOpt == 1) { + $customerProfileId = filter_var($ccResult['customerProfileId'], FILTER_SANITIZE_NUMBER_INT); + $paymentProfileId = filter_var($ccResult['paymentProfileId'], FILTER_SANITIZE_NUMBER_INT); + $profileStatus = filter_var($ccResult['profileStatus'], FILTER_SANITIZE_NUMBER_INT); + $profileStatusText = filter_var($ccResult['profileStatusText'], FILTER_SANITIZE_STRING); + + // If saving the credit card was successful + if ($profileStatus) { + + // Save the profile information in the submitting account + $updated = $this->wpdb->update( + GLM_MEMBERS_REGISTRATIONS_PLUGIN_DB_PREFIX.'account', + array( + 'customer_profile_id' => $customerProfileId, + 'payment_profile_id' => $paymentProfileId, + 'payment_profile_card' => $cc_numb_store + ), + array( 'id' => $accountId ), + array( + '%s', + '%s', + '%s' + ) + ); + + } else { + $messages[] = "Sorry, we were unable to store your credit card data for future use, but we did try."; + } + + } + } } diff --git a/models/front/registrations/login.php b/models/front/registrations/login.php index 6087bed..e91413e 100644 --- a/models/front/registrations/login.php +++ b/models/front/registrations/login.php @@ -42,6 +42,7 @@ $message = ''; $modelRedirect = false; $email = ''; + $memberContact = false; // Check for $option $option = ( isset( $_REQUEST['option'] ) ) ? filter_var( $_REQUEST['option'], FILTER_SANITIZE_STRING) : null; @@ -93,6 +94,7 @@ 'email' => $username, 'fname' => $returnData['fname'], 'lname' => $returnData['lname'], + 'member' => false ); // Check for existing carts in "CART" status @@ -154,7 +156,146 @@ break; + case 'contactLogin': + + $accountId = false; + + // If the user is not already logged in to Registrations + if (!isset($_SESSION['LoginAccount'])) { + + // If the user is a logged in member contact? + if ($this->config['loggedInUser']) { + $loggedInContact = $this->config['loggedInUser']['contactUser']; + + // Try to get an existing registrations account for this contactg user + require_once GLM_MEMBERS_REGISTRATIONS_PLUGIN_CLASS_PATH.'/data/dataAccount.php'; + $Accounts = new GlmDataRegistrationsAccount($this->wpdb, $this->config); + $account = $Accounts->getList("contact_id = ".$loggedInContact['ID']." AND contact_member_id = ".$loggedInContact['ref_dest']); + + // If no account found - Create an account + if (!$account) { + + // Get full contact data + require_once GLM_MEMBERS_CONTACTS_PLUGIN_CLASS_PATH.'/data/dataContacts.php'; + $Contacts = new GlmDataContacts($this->wpdb, $this->config); + $contactData = $Contacts->getEntry($loggedInContact['ID']); + + $thisDate = date('Y-m-d'); + + $this->wpdb->insert( + $Accounts->table, + array( + 'active' => true, + 'fname' => $contactData['fname'], + 'lname' => $contactData['lname'], + 'org' => $contactData['org'], + 'title' => $contactData['title'], + 'addr1' => $contactData['addr1'], + 'addr2' => $contactData['addr2'], + 'city' => $contactData['city']['name'], + 'state' => $contactData['state']['value'], + 'country' => $contactData['country']['value'], + 'zip' => $contactData['zip'], + 'phone' => $contactData['office_phone'], + 'fax' => $contactData['fax'], + 'email' => $contactData['email'], + 'is_member' => true, + 'contact_id' => $loggedInContact['ID'], + 'contact_member_id' => $loggedInContact['ref_dest'], + 'contact_fname' => $contactData['fname'], + 'contact_lname' => $contactData['lname'], + 'contact_org' => $contactData['org'], + 'contact_title' => $contactData['title'], + 'contact_addr1' => $contactData['addr1'], + 'contact_addr2' => $contactData['addr2'], + 'contact_city' => $contactData['city']['name'], + 'contact_state' => $contactData['state']['value'], + 'contact_country' => $contactData['country']['value'], + 'contact_zip' => $contactData['zip'], + 'contact_phone' => $contactData['office_phone'], + 'contact_fax' => $contactData['fax'], + 'contact_email' => $contactData['email'], + 'date_created' => $thisDate + ), + array( + '%d', // active + '%s', // fname + '%s', // lname + '%s', // org + '%s', // title + '%s', // addr1 + '%s', // addr2 + '%s', // city + '%s', // state + '%s', // country + '%s', // zip + '%s', // phone + '%s', // fax + '%s', // email + '%d', // is_member + '%d', // contact_id + '%d', // contact_member_id + '%s', // contact_fname + '%s', // contact_lname + '%s', // contact_org + '%s', // contact_title + '%s', // contact_addr1 + '%s', // contact_addr2 + '%s', // contact_city + '%s', // contact_state + '%s', // contact_country + '%s', // contact_zip + '%s', // contact_phone + '%s', // contact_fax + '%s', // contact_email + '%s' // date_created + ) + ); + + $accountId = $this->wpdb->insert_id; + + // Otherwise use existing account + } else { + $existingAccount = reset($account); + $accountId = $existingAccount['id']; + } + + if ($accountId) { + + // Add the user to the php session + $_SESSION['LoginAccount'] = array( + 'id' => $accountId, + 'email' => $loggedInContact['email'], + 'fname' => $loggedInContact['fname'], + 'lname' => $loggedInContact['lname'], + 'member' => $loggedInContact['ref_dest'] + ); + + $modelRedirect = 'index'; + $_REQUEST['page'] = 'list'; + + } + + } + + } + + break; + default: + + // If the user is not already logged in to Registrations + if (!isset($_SESSION['LoginAccount'])) { + + // If the user is a logged in member contact? + if ($this->config['loggedInUser'] && is_array($this->config['loggedInUser']['contactUser'])) { + + $memberContact = true; + + } + + } + break; } @@ -164,6 +305,7 @@ 'message' => $message, 'email' => $email, 'regUrl' => GLM_MEMBERS_REGISTRATIONS_SITE_BASE_URL.$this->config['settings']['canonical_reg_page'].'/', + 'memberContact' => $memberContact, 'loggedIn' => ( isset( $_SESSION['LoginAccount'] ) ) ? $_SESSION['LoginAccount']: false, ); diff --git a/setup/databaseScripts/create_database_V0.0.25.sql b/setup/databaseScripts/create_database_V0.0.27.sql similarity index 98% rename from setup/databaseScripts/create_database_V0.0.25.sql rename to setup/databaseScripts/create_database_V0.0.27.sql index d0ab8f8..7d06953 100644 --- a/setup/databaseScripts/create_database_V0.0.25.sql +++ b/setup/databaseScripts/create_database_V0.0.27.sql @@ -84,6 +84,7 @@ CREATE TABLE {prefix}management ( reg_authorize_net_test TINYINT NULL, -- Authorize.net test mode - List - see proc_test_mode in plugin.ini reg_authorize_net_conf BOOLEAN NULL, -- Flag to send payment confirmation Email from Authorize.net reg_authorize_net_merchant_email TINYTEXT NULL, -- E-Mail Authorize.net will send copy of confirmation E-Mail + reg_authorize_net_merchant_seal TEXT NULL, -- Authorize.net Verified Merchant Seal code -- Merchant Solutions Credentials reg_merchant_solutions_acctid TINYTEXT NULL, -- Merchant Solutions credentials reg_merchant_solutions_merchantpin TINYTEXT NULL, @@ -365,7 +366,7 @@ CREATE TABLE {prefix}account ( validated BOOLEAN NULL, -- Flag indicating that the account has been validated - Set to false when recovering password validation_code TINYTEXT NULL, -- Validation code and timestamp ("{validation code}-{timestamp}) - Clear this after validation registered_by INT NULL, -- Account - member_id TINYTEXT NULL, -- Free-form field for a member ID (not a GLM Associate member ID) + member_id TINYTEXT NULL, -- Free-form field for a member ID (not a GLM Associate member ID - See "contact_member_id" below) fname TINYTEXT NULL, -- Account primary address lname TINYTEXT NULL, org TINYTEXT NULL, @@ -394,7 +395,11 @@ CREATE TABLE {prefix}account ( password TINYTEXT NULL, -- Crypted password for login back into this account email_ok BOOLEAN NULL, is_member BOOLEAN NULL, -- Is a member of the entity that owns the site + customer_profile_id TINYTEXT NULL, -- Stored Credit Card customer profile ID + payment_profile_id TINYTEXT NULL, -- Stored Credit Card payment profile ID + payment_profile_card TINYTEXT NULL, -- Stored Credit Card last card digits contact_id INT NULL, -- Pointer to GLM Associate member contact record if account is for a member contact + contact_member_id INT NULL, -- Pointer to GLM Associate Member for this contact contact_fname TINYTEXT NULL, contact_lname TINYTEXT NULL, contact_org TINYTEXT NULL, diff --git a/setup/databaseScripts/dbVersions.php b/setup/databaseScripts/dbVersions.php index 1abc662..a2369af 100644 --- a/setup/databaseScripts/dbVersions.php +++ b/setup/databaseScripts/dbVersions.php @@ -38,7 +38,9 @@ $glmMembersRegistrationsDbVersions = array( '0.0.22' => array('version' => '0.0.22', 'tables' => 17, 'date' => '01/09/2018'), '0.0.23' => array('version' => '0.0.23', 'tables' => 18, 'date' => '01/19/2018'), '0.0.24' => array('version' => '0.0.24', 'tables' => 18, 'date' => '01/19/2018'), - '0.0.25' => array('version' => '0.0.25', 'tables' => 18, 'date' => '02/02/2018') + '0.0.25' => array('version' => '0.0.25', 'tables' => 18, 'date' => '02/02/2018'), + '0.0.26' => array('version' => '0.0.26', 'tables' => 18, 'date' => '03/27/2018'), + '0.0.27' => array('version' => '0.0.27', 'tables' => 18, 'date' => '04/05/2018') ); diff --git a/setup/databaseScripts/drop_database_V0.0.25.sql b/setup/databaseScripts/drop_database_V0.0.26.sql similarity index 100% rename from setup/databaseScripts/drop_database_V0.0.25.sql rename to setup/databaseScripts/drop_database_V0.0.26.sql diff --git a/setup/databaseScripts/update_database_V0.0.26.sql b/setup/databaseScripts/update_database_V0.0.26.sql new file mode 100644 index 0000000..b61abbc --- /dev/null +++ b/setup/databaseScripts/update_database_V0.0.26.sql @@ -0,0 +1,25 @@ +-- Gaslight Media Members Database - Registratiuons Add-On +-- File Created: 2018-02-27 +-- Database Version: 0.0.26 +-- Database Update From Previous Version Script +-- +-- To permit each query below to be executed separately, +-- all queries must be separated by a line with four dashes + +ALTER TABLE {prefix}account ADD COLUMN contact_member_id INTEGER; + +---- + +ALTER TABLE {prefix}account ADD COLUMN customer_profile_id TINYTEXT; + +---- + +ALTER TABLE {prefix}account ADD COLUMN payment_profile_id TINYTEXT; + +---- + +ALTER TABLE {prefix}account ADD COLUMN payment_profile_card TINYTEXT; + +---- + +ALTER TABLE {prefix}management MODIFY reg_authorize_net_merchant_email TEXT; diff --git a/setup/databaseScripts/update_database_V0.0.27.sql b/setup/databaseScripts/update_database_V0.0.27.sql new file mode 100644 index 0000000..f745469 --- /dev/null +++ b/setup/databaseScripts/update_database_V0.0.27.sql @@ -0,0 +1,9 @@ +-- Gaslight Media Members Database - Registratiuons Add-On +-- File Created: 2018-04-04 +-- Database Version: 0.0.27 +-- Database Update From Previous Version Script +-- +-- To permit each query below to be executed separately, +-- all queries must be separated by a line with four dashes + +ALTER TABLE {prefix}management ADD COLUMN reg_authorize_net_merchant_seal TEXT; diff --git a/setup/frontHooks.php b/setup/frontHooks.php index 6bf8e0f..f115291 100644 --- a/setup/frontHooks.php +++ b/setup/frontHooks.php @@ -71,6 +71,6 @@ add_filter( 2 ); -add_filter( 'glm_members_registrations_header', function($view ){ - echo do_shortcode( '[glm-members-registrations-cart-link-widget view="accountHeader"]' ); -},10,1); +add_filter( 'glm_members_registrations_header', function($view, $page ){ + echo do_shortcode( '[glm-members-registrations-cart-link-widget view="accountHeader" page="'.$page.'"]' ); +},10,2); diff --git a/setup/shortcodes.php b/setup/shortcodes.php index e69fed3..4fe7a9b 100644 --- a/setup/shortcodes.php +++ b/setup/shortcodes.php @@ -113,7 +113,8 @@ $glmMembersRegistrationsShortcodes = array( 'action' => 'cartLinkWidget', 'table' => false, 'attributes' => array( - 'view' => false + 'view' => false, + 'page' => false ) ) diff --git a/views/admin/management/registrations.html b/views/admin/management/registrations.html index 9039c0b..ba71fed 100644 --- a/views/admin/management/registrations.html +++ b/views/admin/management/registrations.html @@ -168,7 +168,12 @@ - Send Confirmation E-Mail + + See Authorize.net Merchant Portal for notifications sent by Authorize.net. + + + + + + Verified Merchant Seal HTML: + +
+ {$regSettings.fieldData.reg_authorize_net_merchant_seal|unescape} +
+
+ This field is for HTML code that will display an authorized seal for the merchant's Authorized.net account. + Once the correct HTML code is entered above, the seal should show to the left of this text. If that does not happen, + make sure the seal was created for the domain of this Web site. Also click on the seal to verify that the "Merchant Verified" + pop-up shows and verifies that the seal is authentic. + More information is available HERE. +
+
+ + + +

Merchant Solutions

@@ -283,7 +309,7 @@ Billing Info used for
Payment by Call From Merchant: {foreach from=$regSettings.fieldData.reg_bill_info_req_merchant_call.bitmap item=v} - {$v.name} + {$v.name} {/foreach} {if $regSettings.fieldFail.reg_bill_info_req_merchant_call}

{$regSettings.fieldFail.reg_bill_info_req_merchant_call}

{/if} diff --git a/views/admin/settings/PENDING_DELETE_registrationsPaymentCode.html b/views/admin/settings/PENDING_DELETE_registrationsPaymentCode.html deleted file mode 100644 index 59f459c..0000000 --- a/views/admin/settings/PENDING_DELETE_registrationsPaymentCode.html +++ /dev/null @@ -1,268 +0,0 @@ - - - - -{include file='admin/management/header.html'} - - - - - -
- -
Add {$terms.reg_term_payment_code_cap}
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - -
{$terms.reg_term_payment_code_cap}: - -
- -
{$terms.reg_term_payment_code_cap} Type: - -
Payment Amount: - -
Payment Description: - -
-

* Required

- Cancel - - -
-
- - -
-
-

Are you sure you want to delete this {$terms.reg_term_payment_code_cap}?

-

Yes, delete this {$terms.reg_term_payment_code_cap}

-

Cancel

-
-
- - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - -
{$terms.reg_term_payment_code_cap}: - -
- -
{$terms.reg_term_payment_code_cap} Type: - -
Payment Amount: - -
Payment Description: - -
-

* Required

- Cancel - - -
-
- - -

{$terms.reg_term_registration_cap} {$terms.reg_term_payment_code_plur_cap}

- - - - - - - - - - - - - - {if $havePaymentCode} - {assign var="i" value="0"} - {foreach $payment_codes as $p} - {if $i++ is odd by 1} - - {else} - - {/if} - - - - - - - - {/foreach} - {else} - - {/if} - -
Amount Description {$terms.reg_term_payment_code_cap} {$terms.reg_term_payment_code_cap} Type  
-
{$p.amount}
-
-
{$p.descr}
-
-
{$p.code}
-
-
{$p.code_type.name}
-
-
Edit
- -
-
Delete
-
(no comp] codes listed)
-
- - - -{include file='admin/settings/footer.html'} \ No newline at end of file diff --git a/views/front/registrations/account.html b/views/front/registrations/account.html index 0b990ea..452ca50 100644 --- a/views/front/registrations/account.html +++ b/views/front/registrations/account.html @@ -1,4 +1,4 @@ -{include file='front/registrations/header.html'} +{apply_filters('glm_members_registrations_header', 'accountHeader', {$page})} Edit/create Account diff --git a/views/front/registrations/accountHeader.html b/views/front/registrations/accountHeader.html index 4de6e05..5076dcb 100644 --- a/views/front/registrations/accountHeader.html +++ b/views/front/registrations/accountHeader.html @@ -6,7 +6,7 @@ -
+
{if $haveCart && $numb_registrants > 0 && $numb_events > 0} @@ -23,7 +23,7 @@
{/if} - {if $haveOtherRequests} + {if $haveOtherRequests && $page != 'checkout'} - {else if $pmName == "CreditCard"} + {else if $pmName == "CreditCard"} +
+ {if $settings.reg_proc_methods == 2 && $regAccount.fieldData.customer_profile_id != ''} {* If using Authorize.net and have a stored credit card profile *}
+
+ Use the saved credit card ending in {$regAccount.fieldData.payment_profile_card}. +
+
+ {/if} +
Name on Card{if $regAccount.fieldRequired.cc_name} *{/if}
-
+
Card Type{if $regAccount.fieldRequired.cc_type} *{/if}
-
+
Card Number{if $regAccount.fieldRequired.cc_numb} *{/if}
-
+
Card Expiration{if $regAccount.fieldRequired.cc_exp} *{/if}
-
+
CVV{if $regAccount.fieldRequired.cc_cvv} *{/if}
+ {if $settings.reg_proc_methods == 2} {* If using Authorize.net *} +
+
+ You may also have us save your credit card details with our secure credit card processor to simplify future {$terms.reg_term_registration_plur}. + Doing so will replace any previous credit card details you saved.
+ Yes, please save my card details for future use. + {if $regAccount.fieldData.customer_profile_id != ''} +
NOTE: Saving this card will replace your previously stored card. + {/if} +
+
+
+
+

{$settings.reg_authorize_net_merchant_email|unescape}

+
+
+
Your credit card will be processed through Authorize.Net. Click the image to the left to verify our security. +
+
+ {/if} {else}
@@ -401,6 +429,20 @@ }; isAccountSameChecked(); + // Click action for use saved credit card + $('#useSavedCreditCardProfile').click(function() { + var savedCardUsed = $('#useSavedCreditCardProfile').is(':checked'); + if (!savedCardUsed) { + $('.savedCardProfileHide').removeClass('glm-hidden'); + $('.payMethodInput').removeAttr('disabled'); + savedCardUsed = false; + } else { + $('.savedCardProfileHide').addClass('glm-hidden'); + $('.payMethodInput').attr('disabled', true);; + savedCardUsed = true; + } + }); + // Various input masks for credit card input $(".cc-input").mask("0000000000000###"); $(".expire-input").mask("00/00"); diff --git a/views/front/registrations/header.html b/views/front/registrations/header.html index a4e05e7..47306b0 100644 --- a/views/front/registrations/header.html +++ b/views/front/registrations/header.html @@ -4,7 +4,7 @@ Logged in as {$loggedIn.fname} {$loggedIn.lname} Logout {else} - Login + Login or Create Account Create an Account {/if}
diff --git a/views/front/registrations/login.html b/views/front/registrations/login.html index b9bc206..fbdbff5 100644 --- a/views/front/registrations/login.html +++ b/views/front/registrations/login.html @@ -7,13 +7,24 @@
-- 2.17.1

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