Repository files navigation

MultiSafepay PHP SDK

BuildCodecovLatest stable versionTotal downloadsLicense

About MultiSafepay

MultiSafepay is a Dutch payment services provider, which takes care of contracts, processing transactions, and collecting payment for a range of local and international payment methods. Start selling online today and manage all your transactions in one place!

Installation

Run the following composer command:

composer require multisafepay/php-sdk

WARNING! This SDK does not have a direct dependency on Guzzle or cURL. Instead, it uses the PSR-18 client abstraction and PSR-17 factory abstraction. This lets you choose which PSR-7 implementation and HTTP client to use. You can replace all clients without any side effects.

If you don't have a client implementation installed, run:

composer require guzzlehttp/guzzle

If you don't have a factory implementation installed, run:

composer require http-interop/http-factory-guzzle

You should now have installed:

Getting started

Use Composer autoloader to automatically load class dependencies:

require'vendor/autoload.php';

Next, instantiate the SDK with your site API key and a flag to identify whether this is the live environment or testing environment.

$yourApiKey = 'your-api-key';
$isProduction = false;
$multiSafepaySdk = new \MultiSafepay\Sdk($yourApiKey, $isProduction);

From the SDK, you can get various managers:

$multiSafepaySdk->getTransactionManager();
$multiSafepaySdk->getGatewayManager();
$multiSafepaySdk->getPaymentMethodManager();
$multiSafepaySdk->getIssuerManager();
$multiSafepaySdk->getCategoryManager();
$multiSafepaySdk->getTokenManager();
$multiSafepaySdk->getApiTokenManager();

The transaction manager is the most important, because it lets you create orders and refunds.

useMultiSafepay\ValueObject\Customer\Country;
useMultiSafepay\ValueObject\Customer\Address;
useMultiSafepay\ValueObject\Customer\PhoneNumber;
useMultiSafepay\ValueObject\Customer\EmailAddress;
useMultiSafepay\ValueObject\Amount;
useMultiSafepay\ValueObject\Currency;
useMultiSafepay\Api\Transactions\OrderRequest\Arguments\CustomerDetails;
useMultiSafepay\Api\Transactions\OrderRequest\Arguments\PluginDetails;
useMultiSafepay\Api\Transactions\OrderRequest\Arguments\PaymentOptions;
useMultiSafepay\Api\Transactions\OrderRequest;
$yourApiKey = 'your-api-key';
$isProduction = false;
$multiSafepaySdk = new \MultiSafepay\Sdk($yourApiKey, $isProduction);
$orderId = (string) time();
$description = 'Order #' . $orderId;
$amount = newAmount(2000); // Amount must be in cents!!$currency = newCurrency('EUR');
$address = (newAddress())
->addStreetName('Kraanspoor')
->addStreetNameAdditional('(blue door)')
->addHouseNumber('39')
->addZipCode('1033SC')
->addCity('Amsterdam')
->addState('Noord Holland')
->addCountry(newCountry('NL'));
$customer = (newCustomerDetails())
->addFirstName('John')
->addLastName('Doe')
->addAddress($address)
->addEmailAddress(newEmailAddress('noreply@example.org'))
->addPhoneNumber(newPhoneNumber('0208500500'))
->addLocale('nl_NL');
$pluginDetails = (newPluginDetails())
->addApplicationName('My e-commerce application')
->addApplicationVersion('0.0.1')
->addPluginVersion('1.1.0');
$paymentOptions = (newPaymentOptions())
->addNotificationUrl('http://www.example.com/client/notification?type=notification')
->addRedirectUrl('http://www.example.com/client/notification?type=redirect')
->addCancelUrl('http://www.example.com/client/notification?type=cancel')
->addCloseWindow(true);
$orderRequest = (newOrderRequest())
->addType('redirect')
->addOrderId($orderId)
->addDescriptionText($description)
->addAmount($amount)
->addCurrency($currency)
->addGatewayCode('IDEAL')
->addCustomer($customer)
->addDelivery($customer)
->addPluginDetails($pluginDetails)
->addPaymentOptions( $paymentOptions);
$transactionManager = $multiSafepaySdk->getTransactionManager()->create($orderRequest);
$transactionManager->getPaymentUrl();

Example refund:

// Refund example.useMultiSafepay\Api\Transactions\RefundRequest;
useMultiSafepay\ValueObject\Amount;
useMultiSafepay\ValueObject\Currency;
$yourApiKey = 'your-api-key';
$isProduction = false;
$multiSafepaySdk = new \MultiSafepay\Sdk($yourApiKey, $isProduction);
$orderId = XXXXX; // The order ID of a previously completed transaction$refundAmount = newAmount(2000);
$refundCurrency = newCurrency('EUR');
$transactionManager = $multiSafepaySdk->getTransactionManager();
$transaction = $transactionManager->get($orderId);
$transactionManager->refund($transaction, (newRefundRequest())->addAmount($refundAmount)->addCurrency($refundCurrency));

For examples of building full requests, see USAGE.md and the functional tests in tests/Functional/Api/Transactions.

Advanced usage: Strict mode

Strict mode:

  • Adds additional validations on top of various API requests and responses.
  • Validation errors throw an exception, which you need to handle.
  • It is enabled in tests.

Non-strict mode (default) skips some validation errors.

Example: If there is a mismatch between the number of decimal places of the total amount of the items in the ShoppingCart object and your ecommerce platform, strict mode throws an \MultiSafepay\Exception\InvalidTotalAmountException exception.

Code quality checks

The following checks are in place to maintain code quality:

  • PHP CodeSniffer (via ./vendor/bin/phpcs --standard=phpcs.ruleset.xml .)
    • PSR-2
    • Object Calisthenics
  • PHPUnit tests (via ./vendor/bin/phpunit)
    • Unit tests
    • Integration tests
    • Functional tests

Testing

  • Unit tests work without the API or any dependencies (tests/Unit)
  • Integration tests work without the API but have dependencies (tests/Integration)
  • Functional tests work with the live API (tests/Functional) – API key required

Unit tests

To run unit tests from this package:

  1. Clone this repository.
  2. To install all dependencies, run composer install
  3. Run PHPUnit with the following command: ./vendor/bin/phpunit tests/Unit

Functional tests

To run functional tests from this package:

  1. Clone this repository.
  2. To install all dependencies, run composer install.
  3. Copy .env.php.example to .env.php and add your site API key.
  4. Run PHPUnit with the following command: ./vendor/bin/phpunit tests/Functional

Mocking the API for unit and integration tests

Unit and integration tests run without the API, which means that the client is mocking all data calls. To do this, the tests/fixture-data folder contains JSON files to spoof calls. To fill this folder with real data, make sure you have a valid .env.php file, and then use the following command:

php tests/generateApiMocks.php

This commits all generated JSON files into git, so that they serve as fixtures. Files that are not used in tests don't need to be generated.

Support

Create an issue on this repository or email integration@multisafepay.com

Contributors

If you create a pull request to suggest an improvement, we'll send you some MultiSafepay swag as a thank you!

License

Open Software License (OSL 3.0)

Want to be part of the team?

Are you a developer interested in working at MultiSafepay? Check out our job openings and feel free to get in touch!

About

The default PHP library for connecting to the MultiSafepay REST API

Topics

Resources

Code of conduct

Stars

14 stars

Watchers

7 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

MultiSafepay PHP SDK

BuildCodecovLatest stable versionTotal downloadsLicense

About MultiSafepay

MultiSafepay is a Dutch payment services provider, which takes care of contracts, processing transactions, and collecting payment for a range of local and international payment methods. Start selling online today and manage all your transactions in one place!

Installation

Run the following composer command:

composer require multisafepay/php-sdk

WARNING! This SDK does not have a direct dependency on Guzzle or cURL. Instead, it uses the PSR-18 client abstraction and PSR-17 factory abstraction. This lets you choose which PSR-7 implementation and HTTP client to use. You can replace all clients without any side effects.

If you don't have a client implementation installed, run:

composer require guzzlehttp/guzzle

If you don't have a factory implementation installed, run:

composer require http-interop/http-factory-guzzle

You should now have installed:

Getting started

Use Composer autoloader to automatically load class dependencies:

require'vendor/autoload.php';

Next, instantiate the SDK with your site API key and a flag to identify whether this is the live environment or testing environment.

$yourApiKey = 'your-api-key';
$isProduction = false;
$multiSafepaySdk = new \MultiSafepay\Sdk($yourApiKey, $isProduction);

From the SDK, you can get various managers:

$multiSafepaySdk->getTransactionManager();
$multiSafepaySdk->getGatewayManager();
$multiSafepaySdk->getPaymentMethodManager();
$multiSafepaySdk->getIssuerManager();
$multiSafepaySdk->getCategoryManager();
$multiSafepaySdk->getTokenManager();
$multiSafepaySdk->getApiTokenManager();

The transaction manager is the most important, because it lets you create orders and refunds.

useMultiSafepay\ValueObject\Customer\Country;
useMultiSafepay\ValueObject\Customer\Address;
useMultiSafepay\ValueObject\Customer\PhoneNumber;
useMultiSafepay\ValueObject\Customer\EmailAddress;
useMultiSafepay\ValueObject\Amount;
useMultiSafepay\ValueObject\Currency;
useMultiSafepay\Api\Transactions\OrderRequest\Arguments\CustomerDetails;
useMultiSafepay\Api\Transactions\OrderRequest\Arguments\PluginDetails;
useMultiSafepay\Api\Transactions\OrderRequest\Arguments\PaymentOptions;
useMultiSafepay\Api\Transactions\OrderRequest;
$yourApiKey = 'your-api-key';
$isProduction = false;
$multiSafepaySdk = new \MultiSafepay\Sdk($yourApiKey, $isProduction);
$orderId = (string) time();
$description = 'Order #' . $orderId;
$amount = newAmount(2000); // Amount must be in cents!!$currency = newCurrency('EUR');
$address = (newAddress())
->addStreetName('Kraanspoor')
->addStreetNameAdditional('(blue door)')
->addHouseNumber('39')
->addZipCode('1033SC')
->addCity('Amsterdam')
->addState('Noord Holland')
->addCountry(newCountry('NL'));
$customer = (newCustomerDetails())
->addFirstName('John')
->addLastName('Doe')
->addAddress($address)
->addEmailAddress(newEmailAddress('noreply@example.org'))
->addPhoneNumber(newPhoneNumber('0208500500'))
->addLocale('nl_NL');
$pluginDetails = (newPluginDetails())
->addApplicationName('My e-commerce application')
->addApplicationVersion('0.0.1')
->addPluginVersion('1.1.0');
$paymentOptions = (newPaymentOptions())
->addNotificationUrl('http://www.example.com/client/notification?type=notification')
->addRedirectUrl('http://www.example.com/client/notification?type=redirect')
->addCancelUrl('http://www.example.com/client/notification?type=cancel')
->addCloseWindow(true);
$orderRequest = (newOrderRequest())
->addType('redirect')
->addOrderId($orderId)
->addDescriptionText($description)
->addAmount($amount)
->addCurrency($currency)
->addGatewayCode('IDEAL')
->addCustomer($customer)
->addDelivery($customer)
->addPluginDetails($pluginDetails)
->addPaymentOptions( $paymentOptions);
$transactionManager = $multiSafepaySdk->getTransactionManager()->create($orderRequest);
$transactionManager->getPaymentUrl();

Example refund:

// Refund example.useMultiSafepay\Api\Transactions\RefundRequest;
useMultiSafepay\ValueObject\Amount;
useMultiSafepay\ValueObject\Currency;
$yourApiKey = 'your-api-key';
$isProduction = false;
$multiSafepaySdk = new \MultiSafepay\Sdk($yourApiKey, $isProduction);
$orderId = XXXXX; // The order ID of a previously completed transaction$refundAmount = newAmount(2000);
$refundCurrency = newCurrency('EUR');
$transactionManager = $multiSafepaySdk->getTransactionManager();
$transaction = $transactionManager->get($orderId);
$transactionManager->refund($transaction, (newRefundRequest())->addAmount($refundAmount)->addCurrency($refundCurrency));

For examples of building full requests, see USAGE.md and the functional tests in tests/Functional/Api/Transactions.

Advanced usage: Strict mode

Strict mode:

  • Adds additional validations on top of various API requests and responses.
  • Validation errors throw an exception, which you need to handle.
  • It is enabled in tests.

Non-strict mode (default) skips some validation errors.

Example: If there is a mismatch between the number of decimal places of the total amount of the items in the ShoppingCart object and your ecommerce platform, strict mode throws an \MultiSafepay\Exception\InvalidTotalAmountException exception.

Code quality checks

The following checks are in place to maintain code quality:

  • PHP CodeSniffer (via ./vendor/bin/phpcs --standard=phpcs.ruleset.xml .)
    • PSR-2
    • Object Calisthenics
  • PHPUnit tests (via ./vendor/bin/phpunit)
    • Unit tests
    • Integration tests
    • Functional tests

Testing

  • Unit tests work without the API or any dependencies (tests/Unit)
  • Integration tests work without the API but have dependencies (tests/Integration)
  • Functional tests work with the live API (tests/Functional) – API key required

Unit tests

To run unit tests from this package:

  1. Clone this repository.
  2. To install all dependencies, run composer install
  3. Run PHPUnit with the following command: ./vendor/bin/phpunit tests/Unit

Functional tests

To run functional tests from this package:

  1. Clone this repository.
  2. To install all dependencies, run composer install.
  3. Copy .env.php.example to .env.php and add your site API key.
  4. Run PHPUnit with the following command: ./vendor/bin/phpunit tests/Functional

Mocking the API for unit and integration tests

Unit and integration tests run without the API, which means that the client is mocking all data calls. To do this, the tests/fixture-data folder contains JSON files to spoof calls. To fill this folder with real data, make sure you have a valid .env.php file, and then use the following command:

php tests/generateApiMocks.php

This commits all generated JSON files into git, so that they serve as fixtures. Files that are not used in tests don't need to be generated.

Support

Create an issue on this repository or email integration@multisafepay.com

Contributors

If you create a pull request to suggest an improvement, we'll send you some MultiSafepay swag as a thank you!

License

Open Software License (OSL 3.0)

Want to be part of the team?

Are you a developer interested in working at MultiSafepay? Check out our job openings and feel free to get in touch!

About

The default PHP library for connecting to the MultiSafepay REST API

Topics

Resources

Code of conduct

Stars

14 stars

Watchers

7 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MultiSafepay PHP SDK

BuildCodecovLatest stable versionTotal downloadsLicense

About MultiSafepay

MultiSafepay is a Dutch payment services provider, which takes care of contracts, processing transactions, and collecting payment for a range of local and international payment methods. Start selling online today and manage all your transactions in one place!

Installation

Run the following composer command:

composer require multisafepay/php-sdk

WARNING! This SDK does not have a direct dependency on Guzzle or cURL. Instead, it uses the PSR-18 client abstraction and PSR-17 factory abstraction. This lets you choose which PSR-7 implementation and HTTP client to use. You can replace all clients without any side effects.

If you don't have a client implementation installed, run:

composer require guzzlehttp/guzzle

If you don't have a factory implementation installed, run:

composer require http-interop/http-factory-guzzle

You should now have installed:

Getting started

Use Composer autoloader to automatically load class dependencies:

require'vendor/autoload.php';

Next, instantiate the SDK with your site API key and a flag to identify whether this is the live environment or testing environment.

$yourApiKey = 'your-api-key';
$isProduction = false;
$multiSafepaySdk = new \MultiSafepay\Sdk($yourApiKey, $isProduction);

From the SDK, you can get various managers:

$multiSafepaySdk->getTransactionManager();
$multiSafepaySdk->getGatewayManager();
$multiSafepaySdk->getPaymentMethodManager();
$multiSafepaySdk->getIssuerManager();
$multiSafepaySdk->getCategoryManager();
$multiSafepaySdk->getTokenManager();
$multiSafepaySdk->getApiTokenManager();

The transaction manager is the most important, because it lets you create orders and refunds.

useMultiSafepay\ValueObject\Customer\Country;
useMultiSafepay\ValueObject\Customer\Address;
useMultiSafepay\ValueObject\Customer\PhoneNumber;
useMultiSafepay\ValueObject\Customer\EmailAddress;
useMultiSafepay\ValueObject\Amount;
useMultiSafepay\ValueObject\Currency;
useMultiSafepay\Api\Transactions\OrderRequest\Arguments\CustomerDetails;
useMultiSafepay\Api\Transactions\OrderRequest\Arguments\PluginDetails;
useMultiSafepay\Api\Transactions\OrderRequest\Arguments\PaymentOptions;
useMultiSafepay\Api\Transactions\OrderRequest;
$yourApiKey = 'your-api-key';
$isProduction = false;
$multiSafepaySdk = new \MultiSafepay\Sdk($yourApiKey, $isProduction);
$orderId = (string) time();
$description = 'Order #' . $orderId;
$amount = newAmount(2000); // Amount must be in cents!!$currency = newCurrency('EUR');
$address = (newAddress())
->addStreetName('Kraanspoor')
->addStreetNameAdditional('(blue door)')
->addHouseNumber('39')
->addZipCode('1033SC')
->addCity('Amsterdam')
->addState('Noord Holland')
->addCountry(newCountry('NL'));
$customer = (newCustomerDetails())
->addFirstName('John')
->addLastName('Doe')
->addAddress($address)
->addEmailAddress(newEmailAddress('noreply@example.org'))
->addPhoneNumber(newPhoneNumber('0208500500'))
->addLocale('nl_NL');
$pluginDetails = (newPluginDetails())
->addApplicationName('My e-commerce application')
->addApplicationVersion('0.0.1')
->addPluginVersion('1.1.0');
$paymentOptions = (newPaymentOptions())
->addNotificationUrl('http://www.example.com/client/notification?type=notification')
->addRedirectUrl('http://www.example.com/client/notification?type=redirect')
->addCancelUrl('http://www.example.com/client/notification?type=cancel')
->addCloseWindow(true);
$orderRequest = (newOrderRequest())
->addType('redirect')
->addOrderId($orderId)
->addDescriptionText($description)
->addAmount($amount)
->addCurrency($currency)
->addGatewayCode('IDEAL')
->addCustomer($customer)
->addDelivery($customer)
->addPluginDetails($pluginDetails)
->addPaymentOptions( $paymentOptions);
$transactionManager = $multiSafepaySdk->getTransactionManager()->create($orderRequest);
$transactionManager->getPaymentUrl();

Example refund:

// Refund example.useMultiSafepay\Api\Transactions\RefundRequest;
useMultiSafepay\ValueObject\Amount;
useMultiSafepay\ValueObject\Currency;
$yourApiKey = 'your-api-key';
$isProduction = false;
$multiSafepaySdk = new \MultiSafepay\Sdk($yourApiKey, $isProduction);
$orderId = XXXXX; // The order ID of a previously completed transaction$refundAmount = newAmount(2000);
$refundCurrency = newCurrency('EUR');
$transactionManager = $multiSafepaySdk->getTransactionManager();
$transaction = $transactionManager->get($orderId);
$transactionManager->refund($transaction, (newRefundRequest())->addAmount($refundAmount)->addCurrency($refundCurrency));

For examples of building full requests, see USAGE.md and the functional tests in tests/Functional/Api/Transactions.

Advanced usage: Strict mode

Strict mode:

  • Adds additional validations on top of various API requests and responses.
  • Validation errors throw an exception, which you need to handle.
  • It is enabled in tests.

Non-strict mode (default) skips some validation errors.

Example: If there is a mismatch between the number of decimal places of the total amount of the items in the ShoppingCart object and your ecommerce platform, strict mode throws an \MultiSafepay\Exception\InvalidTotalAmountException exception.

Code quality checks

The following checks are in place to maintain code quality:

  • PHP CodeSniffer (via ./vendor/bin/phpcs --standard=phpcs.ruleset.xml .)
    • PSR-2
    • Object Calisthenics
  • PHPUnit tests (via ./vendor/bin/phpunit)
    • Unit tests
    • Integration tests
    • Functional tests

Testing

  • Unit tests work without the API or any dependencies (tests/Unit)
  • Integration tests work without the API but have dependencies (tests/Integration)
  • Functional tests work with the live API (tests/Functional) – API key required

Unit tests

To run unit tests from this package:

  1. Clone this repository.
  2. To install all dependencies, run composer install
  3. Run PHPUnit with the following command: ./vendor/bin/phpunit tests/Unit

Functional tests

To run functional tests from this package:

  1. Clone this repository.
  2. To install all dependencies, run composer install.
  3. Copy .env.php.example to .env.php and add your site API key.
  4. Run PHPUnit with the following command: ./vendor/bin/phpunit tests/Functional

Mocking the API for unit and integration tests

Unit and integration tests run without the API, which means that the client is mocking all data calls. To do this, the tests/fixture-data folder contains JSON files to spoof calls. To fill this folder with real data, make sure you have a valid .env.php file, and then use the following command:

php tests/generateApiMocks.php

This commits all generated JSON files into git, so that they serve as fixtures. Files that are not used in tests don't need to be generated.

Support

Create an issue on this repository or email integration@multisafepay.com

Contributors

If you create a pull request to suggest an improvement, we'll send you some MultiSafepay swag as a thank you!

License

Open Software License (OSL 3.0)

Want to be part of the team?

Are you a developer interested in working at MultiSafepay? Check out our job openings and feel free to get in touch!

About

The default PHP library for connecting to the MultiSafepay REST API

Topics

Resources

Code of conduct

Stars

14 stars

Watchers

7 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MultiSafepay PHP SDK

BuildCodecovLatest stable versionTotal downloadsLicense

About MultiSafepay

MultiSafepay is a Dutch payment services provider, which takes care of contracts, processing transactions, and collecting payment for a range of local and international payment methods. Start selling online today and manage all your transactions in one place!

Installation

Run the following composer command:

composer require multisafepay/php-sdk

WARNING! This SDK does not have a direct dependency on Guzzle or cURL. Instead, it uses the PSR-18 client abstraction and PSR-17 factory abstraction. This lets you choose which PSR-7 implementation and HTTP client to use. You can replace all clients without any side effects.

If you don't have a client implementation installed, run:

composer require guzzlehttp/guzzle

If you don't have a factory implementation installed, run:

composer require http-interop/http-factory-guzzle

You should now have installed:

Getting started

Use Composer autoloader to automatically load class dependencies:

require'vendor/autoload.php';

Next, instantiate the SDK with your site API key and a flag to identify whether this is the live environment or testing environment.

$yourApiKey = 'your-api-key';
$isProduction = false;
$multiSafepaySdk = new \MultiSafepay\Sdk($yourApiKey, $isProduction);

From the SDK, you can get various managers:

$multiSafepaySdk->getTransactionManager();
$multiSafepaySdk->getGatewayManager();
$multiSafepaySdk->getPaymentMethodManager();
$multiSafepaySdk->getIssuerManager();
$multiSafepaySdk->getCategoryManager();
$multiSafepaySdk->getTokenManager();
$multiSafepaySdk->getApiTokenManager();

The transaction manager is the most important, because it lets you create orders and refunds.

useMultiSafepay\ValueObject\Customer\Country;
useMultiSafepay\ValueObject\Customer\Address;
useMultiSafepay\ValueObject\Customer\PhoneNumber;
useMultiSafepay\ValueObject\Customer\EmailAddress;
useMultiSafepay\ValueObject\Amount;
useMultiSafepay\ValueObject\Currency;
useMultiSafepay\Api\Transactions\OrderRequest\Arguments\CustomerDetails;
useMultiSafepay\Api\Transactions\OrderRequest\Arguments\PluginDetails;
useMultiSafepay\Api\Transactions\OrderRequest\Arguments\PaymentOptions;
useMultiSafepay\Api\Transactions\OrderRequest;
$yourApiKey = 'your-api-key';
$isProduction = false;
$multiSafepaySdk = new \MultiSafepay\Sdk($yourApiKey, $isProduction);
$orderId = (string) time();
$description = 'Order #' . $orderId;
$amount = newAmount(2000); // Amount must be in cents!!$currency = newCurrency('EUR');
$address = (newAddress())
->addStreetName('Kraanspoor')
->addStreetNameAdditional('(blue door)')
->addHouseNumber('39')
->addZipCode('1033SC')
->addCity('Amsterdam')
->addState('Noord Holland')
->addCountry(newCountry('NL'));
$customer = (newCustomerDetails())
->addFirstName('John')
->addLastName('Doe')
->addAddress($address)
->addEmailAddress(newEmailAddress('noreply@example.org'))
->addPhoneNumber(newPhoneNumber('0208500500'))
->addLocale('nl_NL');
$pluginDetails = (newPluginDetails())
->addApplicationName('My e-commerce application')
->addApplicationVersion('0.0.1')
->addPluginVersion('1.1.0');
$paymentOptions = (newPaymentOptions())
->addNotificationUrl('http://www.example.com/client/notification?type=notification')
->addRedirectUrl('http://www.example.com/client/notification?type=redirect')
->addCancelUrl('http://www.example.com/client/notification?type=cancel')
->addCloseWindow(true);
$orderRequest = (newOrderRequest())
->addType('redirect')
->addOrderId($orderId)
->addDescriptionText($description)
->addAmount($amount)
->addCurrency($currency)
->addGatewayCode('IDEAL')
->addCustomer($customer)
->addDelivery($customer)
->addPluginDetails($pluginDetails)
->addPaymentOptions( $paymentOptions);
$transactionManager = $multiSafepaySdk->getTransactionManager()->create($orderRequest);
$transactionManager->getPaymentUrl();

Example refund:

// Refund example.useMultiSafepay\Api\Transactions\RefundRequest;
useMultiSafepay\ValueObject\Amount;
useMultiSafepay\ValueObject\Currency;
$yourApiKey = 'your-api-key';
$isProduction = false;
$multiSafepaySdk = new \MultiSafepay\Sdk($yourApiKey, $isProduction);
$orderId = XXXXX; // The order ID of a previously completed transaction$refundAmount = newAmount(2000);
$refundCurrency = newCurrency('EUR');
$transactionManager = $multiSafepaySdk->getTransactionManager();
$transaction = $transactionManager->get($orderId);
$transactionManager->refund($transaction, (newRefundRequest())->addAmount($refundAmount)->addCurrency($refundCurrency));

For examples of building full requests, see USAGE.md and the functional tests in tests/Functional/Api/Transactions.

Advanced usage: Strict mode

Strict mode:

  • Adds additional validations on top of various API requests and responses.
  • Validation errors throw an exception, which you need to handle.
  • It is enabled in tests.

Non-strict mode (default) skips some validation errors.

Example: If there is a mismatch between the number of decimal places of the total amount of the items in the ShoppingCart object and your ecommerce platform, strict mode throws an \MultiSafepay\Exception\InvalidTotalAmountException exception.

Code quality checks

The following checks are in place to maintain code quality:

  • PHP CodeSniffer (via ./vendor/bin/phpcs --standard=phpcs.ruleset.xml .)
    • PSR-2
    • Object Calisthenics
  • PHPUnit tests (via ./vendor/bin/phpunit)
    • Unit tests
    • Integration tests
    • Functional tests

Testing

  • Unit tests work without the API or any dependencies (tests/Unit)
  • Integration tests work without the API but have dependencies (tests/Integration)
  • Functional tests work with the live API (tests/Functional) – API key required

Unit tests

To run unit tests from this package:

  1. Clone this repository.
  2. To install all dependencies, run composer install
  3. Run PHPUnit with the following command: ./vendor/bin/phpunit tests/Unit

Functional tests

To run functional tests from this package:

  1. Clone this repository.
  2. To install all dependencies, run composer install.
  3. Copy .env.php.example to .env.php and add your site API key.
  4. Run PHPUnit with the following command: ./vendor/bin/phpunit tests/Functional

Mocking the API for unit and integration tests

Unit and integration tests run without the API, which means that the client is mocking all data calls. To do this, the tests/fixture-data folder contains JSON files to spoof calls. To fill this folder with real data, make sure you have a valid .env.php file, and then use the following command:

php tests/generateApiMocks.php

This commits all generated JSON files into git, so that they serve as fixtures. Files that are not used in tests don't need to be generated.

Support

Create an issue on this repository or email integration@multisafepay.com

Contributors

If you create a pull request to suggest an improvement, we'll send you some MultiSafepay swag as a thank you!

License

Open Software License (OSL 3.0)

Want to be part of the team?

Are you a developer interested in working at MultiSafepay? Check out our job openings and feel free to get in touch!

About

The default PHP library for connecting to the MultiSafepay REST API

Topics

Resources

Code of conduct

Stars

14 stars

Watchers

7 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

MultiSafepay PHP SDK

BuildCodecovLatest stable versionTotal downloadsLicense

About MultiSafepay

MultiSafepay is a Dutch payment services provider, which takes care of contracts, processing transactions, and collecting payment for a range of local and international payment methods. Start selling online today and manage all your transactions in one place!

Installation

Run the following composer command:

composer require multisafepay/php-sdk

WARNING! This SDK does not have a direct dependency on Guzzle or cURL. Instead, it uses the PSR-18 client abstraction and PSR-17 factory abstraction. This lets you choose which PSR-7 implementation and HTTP client to use. You can replace all clients without any side effects.

If you don't have a client implementation installed, run:

composer require guzzlehttp/guzzle

If you don't have a factory implementation installed, run:

composer require http-interop/http-factory-guzzle

You should now have installed:

Getting started

Use Composer autoloader to automatically load class dependencies:

require'vendor/autoload.php';

Next, instantiate the SDK with your site API key and a flag to identify whether this is the live environment or testing environment.

$yourApiKey = 'your-api-key';
$isProduction = false;
$multiSafepaySdk = new \MultiSafepay\Sdk($yourApiKey, $isProduction);

From the SDK, you can get various managers:

$multiSafepaySdk->getTransactionManager();
$multiSafepaySdk->getGatewayManager();
$multiSafepaySdk->getPaymentMethodManager();
$multiSafepaySdk->getIssuerManager();
$multiSafepaySdk->getCategoryManager();
$multiSafepaySdk->getTokenManager();
$multiSafepaySdk->getApiTokenManager();

The transaction manager is the most important, because it lets you create orders and refunds.

useMultiSafepay\ValueObject\Customer\Country;
useMultiSafepay\ValueObject\Customer\Address;
useMultiSafepay\ValueObject\Customer\PhoneNumber;
useMultiSafepay\ValueObject\Customer\EmailAddress;
useMultiSafepay\ValueObject\Amount;
useMultiSafepay\ValueObject\Currency;
useMultiSafepay\Api\Transactions\OrderRequest\Arguments\CustomerDetails;
useMultiSafepay\Api\Transactions\OrderRequest\Arguments\PluginDetails;
useMultiSafepay\Api\Transactions\OrderRequest\Arguments\PaymentOptions;
useMultiSafepay\Api\Transactions\OrderRequest;
$yourApiKey = 'your-api-key';
$isProduction = false;
$multiSafepaySdk = new \MultiSafepay\Sdk($yourApiKey, $isProduction);
$orderId = (string) time();
$description = 'Order #' . $orderId;
$amount = newAmount(2000); // Amount must be in cents!!$currency = newCurrency('EUR');
$address = (newAddress())
->addStreetName('Kraanspoor')
->addStreetNameAdditional('(blue door)')
->addHouseNumber('39')
->addZipCode('1033SC')
->addCity('Amsterdam')
->addState('Noord Holland')
->addCountry(newCountry('NL'));
$customer = (newCustomerDetails())
->addFirstName('John')
->addLastName('Doe')
->addAddress($address)
->addEmailAddress(newEmailAddress('noreply@example.org'))
->addPhoneNumber(newPhoneNumber('0208500500'))
->addLocale('nl_NL');
$pluginDetails = (newPluginDetails())
->addApplicationName('My e-commerce application')
->addApplicationVersion('0.0.1')
->addPluginVersion('1.1.0');
$paymentOptions = (newPaymentOptions())
->addNotificationUrl('http://www.example.com/client/notification?type=notification')
->addRedirectUrl('http://www.example.com/client/notification?type=redirect')
->addCancelUrl('http://www.example.com/client/notification?type=cancel')
->addCloseWindow(true);
$orderRequest = (newOrderRequest())
->addType('redirect')
->addOrderId($orderId)
->addDescriptionText($description)
->addAmount($amount)
->addCurrency($currency)
->addGatewayCode('IDEAL')
->addCustomer($customer)
->addDelivery($customer)
->addPluginDetails($pluginDetails)
->addPaymentOptions( $paymentOptions);
$transactionManager = $multiSafepaySdk->getTransactionManager()->create($orderRequest);
$transactionManager->getPaymentUrl();

Example refund:

// Refund example.useMultiSafepay\Api\Transactions\RefundRequest;
useMultiSafepay\ValueObject\Amount;
useMultiSafepay\ValueObject\Currency;
$yourApiKey = 'your-api-key';
$isProduction = false;
$multiSafepaySdk = new \MultiSafepay\Sdk($yourApiKey, $isProduction);
$orderId = XXXXX; // The order ID of a previously completed transaction$refundAmount = newAmount(2000);
$refundCurrency = newCurrency('EUR');
$transactionManager = $multiSafepaySdk->getTransactionManager();
$transaction = $transactionManager->get($orderId);
$transactionManager->refund($transaction, (newRefundRequest())->addAmount($refundAmount)->addCurrency($refundCurrency));

For examples of building full requests, see USAGE.md and the functional tests in tests/Functional/Api/Transactions.

Advanced usage: Strict mode

Strict mode:

  • Adds additional validations on top of various API requests and responses.
  • Validation errors throw an exception, which you need to handle.
  • It is enabled in tests.

Non-strict mode (default) skips some validation errors.

Example: If there is a mismatch between the number of decimal places of the total amount of the items in the ShoppingCart object and your ecommerce platform, strict mode throws an \MultiSafepay\Exception\InvalidTotalAmountException exception.

Code quality checks

The following checks are in place to maintain code quality:

  • PHP CodeSniffer (via ./vendor/bin/phpcs --standard=phpcs.ruleset.xml .)
    • PSR-2
    • Object Calisthenics
  • PHPUnit tests (via ./vendor/bin/phpunit)
    • Unit tests
    • Integration tests
    • Functional tests

Testing

  • Unit tests work without the API or any dependencies (tests/Unit)
  • Integration tests work without the API but have dependencies (tests/Integration)
  • Functional tests work with the live API (tests/Functional) – API key required

Unit tests

To run unit tests from this package:

  1. Clone this repository.
  2. To install all dependencies, run composer install
  3. Run PHPUnit with the following command: ./vendor/bin/phpunit tests/Unit

Functional tests

To run functional tests from this package:

  1. Clone this repository.
  2. To install all dependencies, run composer install.
  3. Copy .env.php.example to .env.php and add your site API key.
  4. Run PHPUnit with the following command: ./vendor/bin/phpunit tests/Functional

Mocking the API for unit and integration tests

Unit and integration tests run without the API, which means that the client is mocking all data calls. To do this, the tests/fixture-data folder contains JSON files to spoof calls. To fill this folder with real data, make sure you have a valid .env.php file, and then use the following command:

php tests/generateApiMocks.php

This commits all generated JSON files into git, so that they serve as fixtures. Files that are not used in tests don't need to be generated.

Support

Create an issue on this repository or email integration@multisafepay.com

Contributors

If you create a pull request to suggest an improvement, we'll send you some MultiSafepay swag as a thank you!

License

Open Software License (OSL 3.0)

Want to be part of the team?

Are you a developer interested in working at MultiSafepay? Check out our job openings and feel free to get in touch!

About

The default PHP library for connecting to the MultiSafepay REST API

Topics

Resources

Code of conduct

Stars

14 stars

Watchers

7 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MultiSafepay PHP SDK

BuildCodecovLatest stable versionTotal downloadsLicense

About MultiSafepay

MultiSafepay is a Dutch payment services provider, which takes care of contracts, processing transactions, and collecting payment for a range of local and international payment methods. Start selling online today and manage all your transactions in one place!

Installation

Run the following composer command:

composer require multisafepay/php-sdk

WARNING! This SDK does not have a direct dependency on Guzzle or cURL. Instead, it uses the PSR-18 client abstraction and PSR-17 factory abstraction. This lets you choose which PSR-7 implementation and HTTP client to use. You can replace all clients without any side effects.

If you don't have a client implementation installed, run:

composer require guzzlehttp/guzzle

If you don't have a factory implementation installed, run:

composer require http-interop/http-factory-guzzle

You should now have installed:

Getting started

Use Composer autoloader to automatically load class dependencies:

require'vendor/autoload.php';

Next, instantiate the SDK with your site API key and a flag to identify whether this is the live environment or testing environment.

$yourApiKey = 'your-api-key';
$isProduction = false;
$multiSafepaySdk = new \MultiSafepay\Sdk($yourApiKey, $isProduction);

From the SDK, you can get various managers:

$multiSafepaySdk->getTransactionManager();
$multiSafepaySdk->getGatewayManager();
$multiSafepaySdk->getPaymentMethodManager();
$multiSafepaySdk->getIssuerManager();
$multiSafepaySdk->getCategoryManager();
$multiSafepaySdk->getTokenManager();
$multiSafepaySdk->getApiTokenManager();

The transaction manager is the most important, because it lets you create orders and refunds.

useMultiSafepay\ValueObject\Customer\Country;
useMultiSafepay\ValueObject\Customer\Address;
useMultiSafepay\ValueObject\Customer\PhoneNumber;
useMultiSafepay\ValueObject\Customer\EmailAddress;
useMultiSafepay\ValueObject\Amount;
useMultiSafepay\ValueObject\Currency;
useMultiSafepay\Api\Transactions\OrderRequest\Arguments\CustomerDetails;
useMultiSafepay\Api\Transactions\OrderRequest\Arguments\PluginDetails;
useMultiSafepay\Api\Transactions\OrderRequest\Arguments\PaymentOptions;
useMultiSafepay\Api\Transactions\OrderRequest;
$yourApiKey = 'your-api-key';
$isProduction = false;
$multiSafepaySdk = new \MultiSafepay\Sdk($yourApiKey, $isProduction);
$orderId = (string) time();
$description = 'Order #' . $orderId;
$amount = newAmount(2000); // Amount must be in cents!!$currency = newCurrency('EUR');
$address = (newAddress())
->addStreetName('Kraanspoor')
->addStreetNameAdditional('(blue door)')
->addHouseNumber('39')
->addZipCode('1033SC')
->addCity('Amsterdam')
->addState('Noord Holland')
->addCountry(newCountry('NL'));
$customer = (newCustomerDetails())
->addFirstName('John')
->addLastName('Doe')
->addAddress($address)
->addEmailAddress(newEmailAddress('noreply@example.org'))
->addPhoneNumber(newPhoneNumber('0208500500'))
->addLocale('nl_NL');
$pluginDetails = (newPluginDetails())
->addApplicationName('My e-commerce application')
->addApplicationVersion('0.0.1')
->addPluginVersion('1.1.0');
$paymentOptions = (newPaymentOptions())
->addNotificationUrl('http://www.example.com/client/notification?type=notification')
->addRedirectUrl('http://www.example.com/client/notification?type=redirect')
->addCancelUrl('http://www.example.com/client/notification?type=cancel')
->addCloseWindow(true);
$orderRequest = (newOrderRequest())
->addType('redirect')
->addOrderId($orderId)
->addDescriptionText($description)
->addAmount($amount)
->addCurrency($currency)
->addGatewayCode('IDEAL')
->addCustomer($customer)
->addDelivery($customer)
->addPluginDetails($pluginDetails)
->addPaymentOptions( $paymentOptions);
$transactionManager = $multiSafepaySdk->getTransactionManager()->create($orderRequest);
$transactionManager->getPaymentUrl();

Example refund:

// Refund example.useMultiSafepay\Api\Transactions\RefundRequest;
useMultiSafepay\ValueObject\Amount;
useMultiSafepay\ValueObject\Currency;
$yourApiKey = 'your-api-key';
$isProduction = false;
$multiSafepaySdk = new \MultiSafepay\Sdk($yourApiKey, $isProduction);
$orderId = XXXXX; // The order ID of a previously completed transaction$refundAmount = newAmount(2000);
$refundCurrency = newCurrency('EUR');
$transactionManager = $multiSafepaySdk->getTransactionManager();
$transaction = $transactionManager->get($orderId);
$transactionManager->refund($transaction, (newRefundRequest())->addAmount($refundAmount)->addCurrency($refundCurrency));

For examples of building full requests, see USAGE.md and the functional tests in tests/Functional/Api/Transactions.

Advanced usage: Strict mode

Strict mode:

  • Adds additional validations on top of various API requests and responses.
  • Validation errors throw an exception, which you need to handle.
  • It is enabled in tests.

Non-strict mode (default) skips some validation errors.

Example: If there is a mismatch between the number of decimal places of the total amount of the items in the ShoppingCart object and your ecommerce platform, strict mode throws an \MultiSafepay\Exception\InvalidTotalAmountException exception.

Code quality checks

The following checks are in place to maintain code quality:

  • PHP CodeSniffer (via ./vendor/bin/phpcs --standard=phpcs.ruleset.xml .)
    • PSR-2
    • Object Calisthenics
  • PHPUnit tests (via ./vendor/bin/phpunit)
    • Unit tests
    • Integration tests
    • Functional tests

Testing

  • Unit tests work without the API or any dependencies (tests/Unit)
  • Integration tests work without the API but have dependencies (tests/Integration)
  • Functional tests work with the live API (tests/Functional) – API key required

Unit tests

To run unit tests from this package:

  1. Clone this repository.
  2. To install all dependencies, run composer install
  3. Run PHPUnit with the following command: ./vendor/bin/phpunit tests/Unit

Functional tests

To run functional tests from this package:

  1. Clone this repository.
  2. To install all dependencies, run composer install.
  3. Copy .env.php.example to .env.php and add your site API key.
  4. Run PHPUnit with the following command: ./vendor/bin/phpunit tests/Functional

Mocking the API for unit and integration tests

Unit and integration tests run without the API, which means that the client is mocking all data calls. To do this, the tests/fixture-data folder contains JSON files to spoof calls. To fill this folder with real data, make sure you have a valid .env.php file, and then use the following command:

php tests/generateApiMocks.php

This commits all generated JSON files into git, so that they serve as fixtures. Files that are not used in tests don't need to be generated.

Support

Create an issue on this repository or email integration@multisafepay.com

Contributors

If you create a pull request to suggest an improvement, we'll send you some MultiSafepay swag as a thank you!

License

Open Software License (OSL 3.0)

Want to be part of the team?

Are you a developer interested in working at MultiSafepay? Check out our job openings and feel free to get in touch!

About

The default PHP library for connecting to the MultiSafepay REST API

Topics

Resources

Code of conduct

Stars

14 stars

Watchers

7 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

MultiSafepay PHP SDK

BuildCodecovLatest stable versionTotal downloadsLicense

About MultiSafepay

MultiSafepay is a Dutch payment services provider, which takes care of contracts, processing transactions, and collecting payment for a range of local and international payment methods. Start selling online today and manage all your transactions in one place!

Installation

Run the following composer command:

composer require multisafepay/php-sdk

WARNING! This SDK does not have a direct dependency on Guzzle or cURL. Instead, it uses the PSR-18 client abstraction and PSR-17 factory abstraction. This lets you choose which PSR-7 implementation and HTTP client to use. You can replace all clients without any side effects.

If you don't have a client implementation installed, run:

composer require guzzlehttp/guzzle

If you don't have a factory implementation installed, run:

composer require http-interop/http-factory-guzzle

You should now have installed:

Getting started

Use Composer autoloader to automatically load class dependencies:

require'vendor/autoload.php';

Next, instantiate the SDK with your site API key and a flag to identify whether this is the live environment or testing environment.

$yourApiKey = 'your-api-key';
$isProduction = false;
$multiSafepaySdk = new \MultiSafepay\Sdk($yourApiKey, $isProduction);

From the SDK, you can get various managers:

$multiSafepaySdk->getTransactionManager();
$multiSafepaySdk->getGatewayManager();
$multiSafepaySdk->getPaymentMethodManager();
$multiSafepaySdk->getIssuerManager();
$multiSafepaySdk->getCategoryManager();
$multiSafepaySdk->getTokenManager();
$multiSafepaySdk->getApiTokenManager();

The transaction manager is the most important, because it lets you create orders and refunds.

useMultiSafepay\ValueObject\Customer\Country;
useMultiSafepay\ValueObject\Customer\Address;
useMultiSafepay\ValueObject\Customer\PhoneNumber;
useMultiSafepay\ValueObject\Customer\EmailAddress;
useMultiSafepay\ValueObject\Amount;
useMultiSafepay\ValueObject\Currency;
useMultiSafepay\Api\Transactions\OrderRequest\Arguments\CustomerDetails;
useMultiSafepay\Api\Transactions\OrderRequest\Arguments\PluginDetails;
useMultiSafepay\Api\Transactions\OrderRequest\Arguments\PaymentOptions;
useMultiSafepay\Api\Transactions\OrderRequest;
$yourApiKey = 'your-api-key';
$isProduction = false;
$multiSafepaySdk = new \MultiSafepay\Sdk($yourApiKey, $isProduction);
$orderId = (string) time();
$description = 'Order #' . $orderId;
$amount = newAmount(2000); // Amount must be in cents!!$currency = newCurrency('EUR');
$address = (newAddress())
->addStreetName('Kraanspoor')
->addStreetNameAdditional('(blue door)')
->addHouseNumber('39')
->addZipCode('1033SC')
->addCity('Amsterdam')
->addState('Noord Holland')
->addCountry(newCountry('NL'));
$customer = (newCustomerDetails())
->addFirstName('John')
->addLastName('Doe')
->addAddress($address)
->addEmailAddress(newEmailAddress('noreply@example.org'))
->addPhoneNumber(newPhoneNumber('0208500500'))
->addLocale('nl_NL');
$pluginDetails = (newPluginDetails())
->addApplicationName('My e-commerce application')
->addApplicationVersion('0.0.1')
->addPluginVersion('1.1.0');
$paymentOptions = (newPaymentOptions())
->addNotificationUrl('http://www.example.com/client/notification?type=notification')
->addRedirectUrl('http://www.example.com/client/notification?type=redirect')
->addCancelUrl('http://www.example.com/client/notification?type=cancel')
->addCloseWindow(true);
$orderRequest = (newOrderRequest())
->addType('redirect')
->addOrderId($orderId)
->addDescriptionText($description)
->addAmount($amount)
->addCurrency($currency)
->addGatewayCode('IDEAL')
->addCustomer($customer)
->addDelivery($customer)
->addPluginDetails($pluginDetails)
->addPaymentOptions( $paymentOptions);
$transactionManager = $multiSafepaySdk->getTransactionManager()->create($orderRequest);
$transactionManager->getPaymentUrl();

Example refund:

// Refund example.useMultiSafepay\Api\Transactions\RefundRequest;
useMultiSafepay\ValueObject\Amount;
useMultiSafepay\ValueObject\Currency;
$yourApiKey = 'your-api-key';
$isProduction = false;
$multiSafepaySdk = new \MultiSafepay\Sdk($yourApiKey, $isProduction);
$orderId = XXXXX; // The order ID of a previously completed transaction$refundAmount = newAmount(2000);
$refundCurrency = newCurrency('EUR');
$transactionManager = $multiSafepaySdk->getTransactionManager();
$transaction = $transactionManager->get($orderId);
$transactionManager->refund($transaction, (newRefundRequest())->addAmount($refundAmount)->addCurrency($refundCurrency));

For examples of building full requests, see USAGE.md and the functional tests in tests/Functional/Api/Transactions.

Advanced usage: Strict mode

Strict mode:

  • Adds additional validations on top of various API requests and responses.
  • Validation errors throw an exception, which you need to handle.
  • It is enabled in tests.

Non-strict mode (default) skips some validation errors.

Example: If there is a mismatch between the number of decimal places of the total amount of the items in the ShoppingCart object and your ecommerce platform, strict mode throws an \MultiSafepay\Exception\InvalidTotalAmountException exception.

Code quality checks

The following checks are in place to maintain code quality:

  • PHP CodeSniffer (via ./vendor/bin/phpcs --standard=phpcs.ruleset.xml .)
    • PSR-2
    • Object Calisthenics
  • PHPUnit tests (via ./vendor/bin/phpunit)
    • Unit tests
    • Integration tests
    • Functional tests

Testing

  • Unit tests work without the API or any dependencies (tests/Unit)
  • Integration tests work without the API but have dependencies (tests/Integration)
  • Functional tests work with the live API (tests/Functional) – API key required

Unit tests

To run unit tests from this package:

  1. Clone this repository.
  2. To install all dependencies, run composer install
  3. Run PHPUnit with the following command: ./vendor/bin/phpunit tests/Unit

Functional tests

To run functional tests from this package:

  1. Clone this repository.
  2. To install all dependencies, run composer install.
  3. Copy .env.php.example to .env.php and add your site API key.
  4. Run PHPUnit with the following command: ./vendor/bin/phpunit tests/Functional

Mocking the API for unit and integration tests

Unit and integration tests run without the API, which means that the client is mocking all data calls. To do this, the tests/fixture-data folder contains JSON files to spoof calls. To fill this folder with real data, make sure you have a valid .env.php file, and then use the following command:

php tests/generateApiMocks.php

This commits all generated JSON files into git, so that they serve as fixtures. Files that are not used in tests don't need to be generated.

Support

Create an issue on this repository or email integration@multisafepay.com

Contributors

If you create a pull request to suggest an improvement, we'll send you some MultiSafepay swag as a thank you!

License

Open Software License (OSL 3.0)

Want to be part of the team?

Are you a developer interested in working at MultiSafepay? Check out our job openings and feel free to get in touch!

About

The default PHP library for connecting to the MultiSafepay REST API

Topics

Resources

Code of conduct

Stars

14 stars

Watchers

7 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

MultiSafepay PHP SDK

BuildCodecovLatest stable versionTotal downloadsLicense

About MultiSafepay

MultiSafepay is a Dutch payment services provider, which takes care of contracts, processing transactions, and collecting payment for a range of local and international payment methods. Start selling online today and manage all your transactions in one place!

Installation

Run the following composer command:

composer require multisafepay/php-sdk

WARNING! This SDK does not have a direct dependency on Guzzle or cURL. Instead, it uses the PSR-18 client abstraction and PSR-17 factory abstraction. This lets you choose which PSR-7 implementation and HTTP client to use. You can replace all clients without any side effects.

If you don't have a client implementation installed, run:

composer require guzzlehttp/guzzle

If you don't have a factory implementation installed, run:

composer require http-interop/http-factory-guzzle

You should now have installed:

Getting started

Use Composer autoloader to automatically load class dependencies:

require'vendor/autoload.php';

Next, instantiate the SDK with your site API key and a flag to identify whether this is the live environment or testing environment.

$yourApiKey = 'your-api-key';
$isProduction = false;
$multiSafepaySdk = new \MultiSafepay\Sdk($yourApiKey, $isProduction);

From the SDK, you can get various managers:

$multiSafepaySdk->getTransactionManager();
$multiSafepaySdk->getGatewayManager();
$multiSafepaySdk->getPaymentMethodManager();
$multiSafepaySdk->getIssuerManager();
$multiSafepaySdk->getCategoryManager();
$multiSafepaySdk->getTokenManager();
$multiSafepaySdk->getApiTokenManager();

The transaction manager is the most important, because it lets you create orders and refunds.

useMultiSafepay\ValueObject\Customer\Country;
useMultiSafepay\ValueObject\Customer\Address;
useMultiSafepay\ValueObject\Customer\PhoneNumber;
useMultiSafepay\ValueObject\Customer\EmailAddress;
useMultiSafepay\ValueObject\Amount;
useMultiSafepay\ValueObject\Currency;
useMultiSafepay\Api\Transactions\OrderRequest\Arguments\CustomerDetails;
useMultiSafepay\Api\Transactions\OrderRequest\Arguments\PluginDetails;
useMultiSafepay\Api\Transactions\OrderRequest\Arguments\PaymentOptions;
useMultiSafepay\Api\Transactions\OrderRequest;
$yourApiKey = 'your-api-key';
$isProduction = false;
$multiSafepaySdk = new \MultiSafepay\Sdk($yourApiKey, $isProduction);
$orderId = (string) time();
$description = 'Order #' . $orderId;
$amount = newAmount(2000); // Amount must be in cents!!$currency = newCurrency('EUR');
$address = (newAddress())
->addStreetName('Kraanspoor')
->addStreetNameAdditional('(blue door)')
->addHouseNumber('39')
->addZipCode('1033SC')
->addCity('Amsterdam')
->addState('Noord Holland')
->addCountry(newCountry('NL'));
$customer = (newCustomerDetails())
->addFirstName('John')
->addLastName('Doe')
->addAddress($address)
->addEmailAddress(newEmailAddress('noreply@example.org'))
->addPhoneNumber(newPhoneNumber('0208500500'))
->addLocale('nl_NL');
$pluginDetails = (newPluginDetails())
->addApplicationName('My e-commerce application')
->addApplicationVersion('0.0.1')
->addPluginVersion('1.1.0');
$paymentOptions = (newPaymentOptions())
->addNotificationUrl('http://www.example.com/client/notification?type=notification')
->addRedirectUrl('http://www.example.com/client/notification?type=redirect')
->addCancelUrl('http://www.example.com/client/notification?type=cancel')
->addCloseWindow(true);
$orderRequest = (newOrderRequest())
->addType('redirect')
->addOrderId($orderId)
->addDescriptionText($description)
->addAmount($amount)
->addCurrency($currency)
->addGatewayCode('IDEAL')
->addCustomer($customer)
->addDelivery($customer)
->addPluginDetails($pluginDetails)
->addPaymentOptions( $paymentOptions);
$transactionManager = $multiSafepaySdk->getTransactionManager()->create($orderRequest);
$transactionManager->getPaymentUrl();

Example refund:

// Refund example.useMultiSafepay\Api\Transactions\RefundRequest;
useMultiSafepay\ValueObject\Amount;
useMultiSafepay\ValueObject\Currency;
$yourApiKey = 'your-api-key';
$isProduction = false;
$multiSafepaySdk = new \MultiSafepay\Sdk($yourApiKey, $isProduction);
$orderId = XXXXX; // The order ID of a previously completed transaction$refundAmount = newAmount(2000);
$refundCurrency = newCurrency('EUR');
$transactionManager = $multiSafepaySdk->getTransactionManager();
$transaction = $transactionManager->get($orderId);
$transactionManager->refund($transaction, (newRefundRequest())->addAmount($refundAmount)->addCurrency($refundCurrency));

For examples of building full requests, see USAGE.md and the functional tests in tests/Functional/Api/Transactions.

Advanced usage: Strict mode

Strict mode:

  • Adds additional validations on top of various API requests and responses.
  • Validation errors throw an exception, which you need to handle.
  • It is enabled in tests.

Non-strict mode (default) skips some validation errors.

Example: If there is a mismatch between the number of decimal places of the total amount of the items in the ShoppingCart object and your ecommerce platform, strict mode throws an \MultiSafepay\Exception\InvalidTotalAmountException exception.

Code quality checks

The following checks are in place to maintain code quality:

  • PHP CodeSniffer (via ./vendor/bin/phpcs --standard=phpcs.ruleset.xml .)
    • PSR-2
    • Object Calisthenics
  • PHPUnit tests (via ./vendor/bin/phpunit)
    • Unit tests
    • Integration tests
    • Functional tests

Testing

  • Unit tests work without the API or any dependencies (tests/Unit)
  • Integration tests work without the API but have dependencies (tests/Integration)
  • Functional tests work with the live API (tests/Functional) – API key required

Unit tests

To run unit tests from this package:

  1. Clone this repository.
  2. To install all dependencies, run composer install
  3. Run PHPUnit with the following command: ./vendor/bin/phpunit tests/Unit

Functional tests

To run functional tests from this package:

  1. Clone this repository.
  2. To install all dependencies, run composer install.
  3. Copy .env.php.example to .env.php and add your site API key.
  4. Run PHPUnit with the following command: ./vendor/bin/phpunit tests/Functional

Mocking the API for unit and integration tests

Unit and integration tests run without the API, which means that the client is mocking all data calls. To do this, the tests/fixture-data folder contains JSON files to spoof calls. To fill this folder with real data, make sure you have a valid .env.php file, and then use the following command:

php tests/generateApiMocks.php

This commits all generated JSON files into git, so that they serve as fixtures. Files that are not used in tests don't need to be generated.

Support

Create an issue on this repository or email integration@multisafepay.com

Contributors

If you create a pull request to suggest an improvement, we'll send you some MultiSafepay swag as a thank you!

License

Open Software License (OSL 3.0)

Want to be part of the team?

Are you a developer interested in working at MultiSafepay? Check out our job openings and feel free to get in touch!

About

The default PHP library for connecting to the MultiSafepay REST API

Topics

Resources

Code of conduct

Stars

14 stars

Watchers

7 watching

Forks

Releases

Packages

Used by

Contributors

Languages