Version Description
21-08-2019 =
Add - Introduce MyBank payment method
Fix - Active Payment Object may be NULL causing WSOD after order is placed in Mollie
Fix - ApplePay logo does not have the right resolution
Download this release
Release Info
Developer | wido |
Plugin | Mollie Payments for WooCommerce |
Version | 5.3.0 |
Comparing to | |
See all releases |
Code changes from version 5.2.1 to 5.3.0
- assets/images/applepay.svg +1 -1
- assets/images/mybank.svg +1 -0
- includes/mollie-api-php/.gitattributes +8 -0
- includes/mollie-api-php/.github/ISSUE_TEMPLATE.md +8 -0
- includes/mollie-api-php/.gitignore +8 -0
- includes/mollie-api-php/.travis.yml +46 -0
- includes/mollie-api-php/Makefile +31 -0
- includes/mollie-api-php/composer.json +80 -0
- includes/mollie-api-php/examples/captures/get-capture.php +27 -0
- includes/mollie-api-php/examples/captures/list-captures.php +27 -0
- includes/mollie-api-php/examples/customers/create-customer-first-payment.php +67 -0
- includes/mollie-api-php/examples/customers/create-customer-payment.php +61 -0
- includes/mollie-api-php/examples/customers/create-customer-recurring-payment.php +63 -0
- includes/mollie-api-php/examples/customers/create-customer.php +27 -0
- includes/mollie-api-php/examples/customers/delete-customer.php +17 -0
- includes/mollie-api-php/examples/customers/list-customer-payments.php +58 -0
- includes/mollie-api-php/examples/customers/update-customer.php +31 -0
- includes/mollie-api-php/examples/database/.gitignore +1 -0
- includes/mollie-api-php/examples/functions.php +23 -0
- includes/mollie-api-php/examples/initialize.php +18 -0
- includes/mollie-api-php/examples/initialize_with_oauth.php +19 -0
- includes/mollie-api-php/examples/invoices/list-invoices.php +37 -0
- includes/mollie-api-php/examples/mandates/create-mandate.php +30 -0
- includes/mollie-api-php/examples/mandates/list-mandates.php +28 -0
- includes/mollie-api-php/examples/mandates/revoke-mandate.php +31 -0
- includes/mollie-api-php/examples/orders/cancel-order-lines.php +44 -0
- includes/mollie-api-php/examples/orders/cancel-order.php +26 -0
- includes/mollie-api-php/examples/orders/create-order.php +118 -0
- includes/mollie-api-php/examples/orders/list-methods.php +28 -0
- includes/mollie-api-php/examples/orders/list-orders.php +49 -0
- includes/mollie-api-php/examples/orders/refund-order-completely.php +25 -0
- includes/mollie-api-php/examples/orders/refund-order-partially.php +33 -0
- includes/mollie-api-php/examples/orders/webhook.php +50 -0
- includes/mollie-api-php/examples/payments/create-ideal-payment.php +81 -0
- includes/mollie-api-php/examples/payments/create-payment-oauth.php +67 -0
- includes/mollie-api-php/examples/payments/create-payment.php +60 -0
- includes/mollie-api-php/examples/payments/list-methods.php +27 -0
- includes/mollie-api-php/examples/payments/list-payments.php +85 -0
- includes/mollie-api-php/examples/payments/refund-payment.php +71 -0
- includes/mollie-api-php/examples/payments/return.php +29 -0
- includes/mollie-api-php/examples/payments/webhook.php +65 -0
- includes/mollie-api-php/examples/profiles/create-profile.php +30 -0
- includes/mollie-api-php/examples/profiles/delete-profile.php +23 -0
- includes/mollie-api-php/examples/profiles/list-profiles.php +28 -0
- includes/mollie-api-php/examples/profiles/update-profile.php +33 -0
- includes/mollie-api-php/examples/settlements/list-settlements.php +53 -0
- includes/mollie-api-php/examples/shipments/create-shipment-all.php +27 -0
- includes/mollie-api-php/examples/shipments/create-shipment-partial.php +42 -0
- includes/mollie-api-php/examples/shipments/get-shipment.php +27 -0
- includes/mollie-api-php/examples/shipments/list-shipments.php +30 -0
- includes/mollie-api-php/examples/shipments/update-shipment.php +40 -0
- includes/mollie-api-php/examples/subscriptions/cancel-subscription.php +36 -0
- includes/mollie-api-php/examples/subscriptions/create-subscription.php +61 -0
- includes/mollie-api-php/examples/subscriptions/update-subscription.php +31 -0
- includes/mollie-api-php/phpunit.xml +15 -0
- includes/mollie-api-php/tests/Mollie/API/CompatibilityCheckerTest.php +57 -0
- includes/mollie-api-php/tests/Mollie/API/Endpoints/BaseEndpointTest.php +76 -0
- includes/mollie-api-php/tests/Mollie/API/Endpoints/ChargebackEndpointTest.php +156 -0
- includes/mollie-api-php/tests/Mollie/API/Endpoints/CustomerEndpointTest.php +234 -0
- includes/mollie-api-php/tests/Mollie/API/Endpoints/CustomerPaymentEndpointTest.php +314 -0
- includes/mollie-api-php/tests/Mollie/API/Endpoints/InvoiceEndpointTest.php +222 -0
- includes/mollie-api-php/tests/Mollie/API/Endpoints/MandateEndpointTest.php +428 -0
- includes/mollie-api-php/tests/Mollie/API/Endpoints/MethodEndpointTest.php +641 -0
- includes/mollie-api-php/tests/Mollie/API/Endpoints/OnboardingEndpointTest.php +82 -0
- includes/mollie-api-php/tests/Mollie/API/Endpoints/OrderEndpointTest.php +1085 -0
- includes/mollie-api-php/tests/Mollie/API/Endpoints/OrderLineEndpointTest.php +21 -0
- includes/mollie-api-php/tests/Mollie/API/Endpoints/OrderPaymentEndpointTest.php +289 -0
- includes/mollie-api-php/tests/Mollie/API/Endpoints/OrderRefundEndpointTest.php +427 -0
- includes/mollie-api-php/tests/Mollie/API/Endpoints/OrganizationEndpointTest.php +126 -0
- includes/mollie-api-php/tests/Mollie/API/Endpoints/PaymentCaptureEndpointTest.php +283 -0
- includes/mollie-api-php/tests/Mollie/API/Endpoints/PaymentChargebackEndpointTest.php +265 -0
- includes/mollie-api-php/tests/Mollie/API/Endpoints/PaymentEndpointTest.php +381 -0
- includes/mollie-api-php/tests/Mollie/API/Endpoints/PaymentRefundEndpointTest.php +388 -0
- includes/mollie-api-php/tests/Mollie/API/Endpoints/PermissionEndpointTest.php +169 -0
- includes/mollie-api-php/tests/Mollie/API/Endpoints/ProfileEndpointTest.php +501 -0
- includes/mollie-api-php/tests/Mollie/API/Endpoints/ProfileMethodEndpointTest.php +232 -0
- includes/mollie-api-php/tests/Mollie/API/Endpoints/RefundEndpointTest.php +161 -0
- includes/mollie-api-php/tests/Mollie/API/Endpoints/SettlementEndpointTest.php +450 -0
- includes/mollie-api-php/tests/Mollie/API/Endpoints/ShipmentEndpointTest.php +565 -0
- includes/mollie-api-php/tests/Mollie/API/Endpoints/SubscriptionEndpointTest.php +491 -0
- includes/mollie-api-php/tests/Mollie/API/Exceptions/ApiExceptionTest.php +89 -0
- includes/mollie-api-php/tests/Mollie/API/MollieApiClientTest.php +159 -0
- includes/mollie-api-php/tests/Mollie/API/Resources/InvoiceTest.php +42 -0
- includes/mollie-api-php/tests/Mollie/API/Resources/OnboardingTest.php +42 -0
- includes/mollie-api-php/tests/Mollie/API/Resources/OrderLineCollectionTest.php +36 -0
- includes/mollie-api-php/tests/Mollie/API/Resources/OrderLineTest.php +149 -0
- includes/mollie-api-php/tests/Mollie/API/Resources/OrderTest.php +295 -0
- includes/mollie-api-php/tests/Mollie/API/Resources/PaymentTest.php +212 -0
- includes/mollie-api-php/tests/Mollie/API/Resources/ProfileTest.php +42 -0
- includes/mollie-api-php/tests/Mollie/API/Resources/RefundTest.php +50 -0
- includes/mollie-api-php/tests/Mollie/API/Resources/ResourceFactoryTest.php +34 -0
- includes/mollie-api-php/tests/Mollie/API/Resources/SettlementTest.php +50 -0
- includes/mollie-api-php/tests/Mollie/API/Resources/ShipmentTest.php +84 -0
- includes/mollie-api-php/tests/Mollie/API/Resources/SubscriptionTest.php +60 -0
- includes/mollie-api-php/tests/Mollie/API/Types/MandateMethodTest.php +37 -0
- includes/mollie-api-php/tests/Mollie/TestHelpers/AmountObjectTestHelpers.php +22 -0
- includes/mollie-api-php/tests/Mollie/TestHelpers/LinkObjectTestHelpers.php +29 -0
- includes/mollie-api-php/vendor/autoload.php +1 -1
- includes/mollie-api-php/vendor/composer/autoload_real.php +7 -7
- includes/mollie-api-php/vendor/composer/autoload_static.php +4 -4
- includes/mollie-api-php/vendor/composer/ca-bundle/README.md +7 -7
- includes/mollie-api-php/vendor/composer/ca-bundle/composer.json +2 -2
- includes/mollie-api-php/vendor/composer/ca-bundle/res/cacert.pem +108 -2
- includes/mollie-api-php/vendor/composer/ca-bundle/src/CaBundle.php +25 -23
- includes/mollie-api-php/vendor/composer/installed.json +8 -8
- includes/mollie/wc/gateway/applepay.php +0 -1
- includes/mollie/wc/gateway/mybank.php +85 -0
- includes/mollie/wc/plugin.php +2 -1
- mollie-payments-for-woocommerce.php +2 -2
- readme.txt +7 -1
assets/images/applepay.svg
CHANGED
@@ -1,5 +1,5 @@
|
|
1 |
<?xml version="1.0" encoding="UTF-8"?>
|
2 |
-
<svg width="
|
3 |
<path d="m150.7 0h-135.87c-0.5659 0-1.1328 0-1.6977 0.0033-0.47751 0.0034-0.95391 0.0087-1.4303 0.0217-1.039 0.0281-2.0869 0.0894-3.1129 0.2738-1.0424 0.1876-2.0124 0.4936-2.9587 0.9754-0.9303 0.4731-1.782 1.0919-2.5201 1.8303-0.73841 0.7384-1.3572 1.5887-1.8302 2.52-0.4819 0.9463-0.7881 1.9166-0.9744 2.9598-0.18539 1.0263-0.2471 2.074-0.2751 3.1119-0.0128 0.4764-0.01829 0.9528-0.0214 1.4291-0.0033 0.5661-0.0022 1.1318-0.0022 1.6989v76.318c0 0.5671-0.0011 1.1318 0.0022 1.699 0.00311 0.4763 0.0086 0.9527 0.0214 1.4291 0.028 1.037 0.08971 2.0847 0.2751 3.1107 0.1863 1.0436 0.4925 2.0135 0.9744 2.9599 0.473 0.9313 1.0918 1.7827 1.8302 2.52 0.73809 0.7396 1.5898 1.3583 2.5201 1.8302 0.9463 0.4831 1.9163 0.7892 2.9587 0.9767 1.026 0.1832 2.0739 0.2456 3.1129 0.2737 0.4764 0.0108 0.9528 0.0172 1.4303 0.0194 0.56489 0.0044 1.1318 0.0044 1.6977 0.0044h135.87c0.5649 0 1.1318 0 1.6966-0.0044 0.47641-0.0022 0.95282-0.0086 1.4314-0.0194 1.0368-0.0281 2.0845-0.0905 3.113-0.2737 1.041-0.1875 2.0112-0.4936 2.9576-0.9767 0.9313-0.4719 1.7805-1.0906 2.5201-1.8302 0.7372-0.7373 1.356-1.5887 1.8302-2.52 0.48299-0.9464 0.78889-1.9163 0.97429-2.9599 0.1855-1.026 0.2457-2.0737 0.2738-3.1107 0.013-0.4764 0.01941-0.9528 0.02161-1.4291 0.00439-0.5672 0.00439-1.1319 0.00439-1.699v-76.318c0-0.5671 0-1.1328-0.00439-1.6989-0.0022-0.4763-0.00861-0.9527-0.02161-1.4291-0.02811-1.0379-0.0883-2.0856-0.2738-3.1119-0.18539-1.0432-0.4913-2.0135-0.97429-2.9598-0.47421-0.9313-1.093-1.7816-1.8302-2.52-0.73961-0.7384-1.5888-1.3572-2.5201-1.8303-0.9464-0.4818-1.9166-0.7878-2.9576-0.9754-1.0285-0.1844-2.0762-0.2457-3.113-0.2738-0.47858-0.013-0.95499-0.0183-1.4314-0.0217-0.56478-0.0033-1.1317-0.0033-1.6966-0.0033z"/>
|
4 |
<path d="m150.7 3.532l1.6715 0.0032c0.4528 0.0032 0.90561 0.0081 1.3609 0.0205 0.79201 0.0214 1.7185 0.0643 2.5821 0.2191 0.7507 0.1352 1.3803 0.3408 1.9845 0.6484 0.5965 0.3031 1.143 0.7003 1.6202 1.1768 0.479 0.4797 0.87671 1.0271 1.1838 1.6302 0.30589 0.5995 0.51019 1.2261 0.64459 1.9823 0.1544 0.8542 0.1971 1.7832 0.21881 2.5801 0.01219 0.4498 0.01819 0.8996 0.0204 1.3601 0.00429 0.5569 0.0042 1.1135 0.0042 1.6715v76.318c0 0.558 9e-5 1.1136-0.0043 1.6824-0.00211 0.4497-0.0081 0.8995-0.0204 1.3501-0.02161 0.7957-0.0643 1.7242-0.2206 2.5885-0.13251 0.7458-0.3367 1.3725-0.64429 1.975-0.30621 0.6016-0.70331 1.1484-1.1802 1.6251-0.47989 0.48-1.0246 0.876-1.6282 1.1819-0.5997 0.3061-1.2282 0.51151-1.9715 0.6453-0.88109 0.157-1.8464 0.2002-2.5734 0.2199-0.4574 0.0103-0.9126 0.01649-1.3789 0.0187-0.55571 0.0043-1.1134 0.0042-1.6692 0.0042h-135.87-0.0221c-0.5494 0-1.0999 0-1.6593-0.0043-0.4561-0.00211-0.9112-0.0082-1.3512-0.0182-0.7436-0.0201-1.7095-0.0632-2.5834-0.2193-0.74969-0.1348-1.3782-0.3402-1.9858-0.6503-0.59789-0.3032-1.1422-0.6988-1.6223-1.1797-0.4764-0.4756-0.8723-1.0207-1.1784-1.6232-0.3064-0.6019-0.5114-1.2305-0.64619-1.9852-0.15581-0.8626-0.19861-1.7874-0.22-2.5777-0.01221-0.4525-0.01731-0.9049-0.02021-1.3547l-0.0022-1.3279 1e-4 -0.3506v-76.318l-1e-4 -0.3506 0.0021-1.3251c3e-3 -0.4525 0.0081-0.9049 0.02031-1.357 0.02139-0.7911 0.06419-1.7163 0.22129-2.5861 0.1336-0.7479 0.3385-1.3765 0.6465-1.9814 0.3037-0.5979 0.7003-1.1437 1.1792-1.6225 0.477-0.4772 1.0231-0.8739 1.6248-1.1799 0.6011-0.3061 1.2308-0.5116 1.9805-0.6465 0.8638-0.1552 1.7909-0.198 2.5849-0.2195 0.4526-0.0123 0.9052-0.0172 1.3544-0.0203l1.6771-0.0033h135.87" fill="#fff"/>
|
5 |
<path d="m45.186 35.641c1.4172-1.7727 2.379-4.1528 2.1253-6.5851-2.0746 0.10316-4.6063 1.3687-6.0721 3.1428-1.3161 1.5192-2.4809 3.999-2.1772 6.3293 2.3289 0.20201 4.6556-1.1641 6.124-2.887"/>
|
1 |
<?xml version="1.0" encoding="UTF-8"?>
|
2 |
+
<svg width="32" height="25" enable-background="new 0 0 165.52107 105.9651" version="1.1" viewBox="0 0 165.52107 105.9651" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
|
3 |
<path d="m150.7 0h-135.87c-0.5659 0-1.1328 0-1.6977 0.0033-0.47751 0.0034-0.95391 0.0087-1.4303 0.0217-1.039 0.0281-2.0869 0.0894-3.1129 0.2738-1.0424 0.1876-2.0124 0.4936-2.9587 0.9754-0.9303 0.4731-1.782 1.0919-2.5201 1.8303-0.73841 0.7384-1.3572 1.5887-1.8302 2.52-0.4819 0.9463-0.7881 1.9166-0.9744 2.9598-0.18539 1.0263-0.2471 2.074-0.2751 3.1119-0.0128 0.4764-0.01829 0.9528-0.0214 1.4291-0.0033 0.5661-0.0022 1.1318-0.0022 1.6989v76.318c0 0.5671-0.0011 1.1318 0.0022 1.699 0.00311 0.4763 0.0086 0.9527 0.0214 1.4291 0.028 1.037 0.08971 2.0847 0.2751 3.1107 0.1863 1.0436 0.4925 2.0135 0.9744 2.9599 0.473 0.9313 1.0918 1.7827 1.8302 2.52 0.73809 0.7396 1.5898 1.3583 2.5201 1.8302 0.9463 0.4831 1.9163 0.7892 2.9587 0.9767 1.026 0.1832 2.0739 0.2456 3.1129 0.2737 0.4764 0.0108 0.9528 0.0172 1.4303 0.0194 0.56489 0.0044 1.1318 0.0044 1.6977 0.0044h135.87c0.5649 0 1.1318 0 1.6966-0.0044 0.47641-0.0022 0.95282-0.0086 1.4314-0.0194 1.0368-0.0281 2.0845-0.0905 3.113-0.2737 1.041-0.1875 2.0112-0.4936 2.9576-0.9767 0.9313-0.4719 1.7805-1.0906 2.5201-1.8302 0.7372-0.7373 1.356-1.5887 1.8302-2.52 0.48299-0.9464 0.78889-1.9163 0.97429-2.9599 0.1855-1.026 0.2457-2.0737 0.2738-3.1107 0.013-0.4764 0.01941-0.9528 0.02161-1.4291 0.00439-0.5672 0.00439-1.1319 0.00439-1.699v-76.318c0-0.5671 0-1.1328-0.00439-1.6989-0.0022-0.4763-0.00861-0.9527-0.02161-1.4291-0.02811-1.0379-0.0883-2.0856-0.2738-3.1119-0.18539-1.0432-0.4913-2.0135-0.97429-2.9598-0.47421-0.9313-1.093-1.7816-1.8302-2.52-0.73961-0.7384-1.5888-1.3572-2.5201-1.8303-0.9464-0.4818-1.9166-0.7878-2.9576-0.9754-1.0285-0.1844-2.0762-0.2457-3.113-0.2738-0.47858-0.013-0.95499-0.0183-1.4314-0.0217-0.56478-0.0033-1.1317-0.0033-1.6966-0.0033z"/>
|
4 |
<path d="m150.7 3.532l1.6715 0.0032c0.4528 0.0032 0.90561 0.0081 1.3609 0.0205 0.79201 0.0214 1.7185 0.0643 2.5821 0.2191 0.7507 0.1352 1.3803 0.3408 1.9845 0.6484 0.5965 0.3031 1.143 0.7003 1.6202 1.1768 0.479 0.4797 0.87671 1.0271 1.1838 1.6302 0.30589 0.5995 0.51019 1.2261 0.64459 1.9823 0.1544 0.8542 0.1971 1.7832 0.21881 2.5801 0.01219 0.4498 0.01819 0.8996 0.0204 1.3601 0.00429 0.5569 0.0042 1.1135 0.0042 1.6715v76.318c0 0.558 9e-5 1.1136-0.0043 1.6824-0.00211 0.4497-0.0081 0.8995-0.0204 1.3501-0.02161 0.7957-0.0643 1.7242-0.2206 2.5885-0.13251 0.7458-0.3367 1.3725-0.64429 1.975-0.30621 0.6016-0.70331 1.1484-1.1802 1.6251-0.47989 0.48-1.0246 0.876-1.6282 1.1819-0.5997 0.3061-1.2282 0.51151-1.9715 0.6453-0.88109 0.157-1.8464 0.2002-2.5734 0.2199-0.4574 0.0103-0.9126 0.01649-1.3789 0.0187-0.55571 0.0043-1.1134 0.0042-1.6692 0.0042h-135.87-0.0221c-0.5494 0-1.0999 0-1.6593-0.0043-0.4561-0.00211-0.9112-0.0082-1.3512-0.0182-0.7436-0.0201-1.7095-0.0632-2.5834-0.2193-0.74969-0.1348-1.3782-0.3402-1.9858-0.6503-0.59789-0.3032-1.1422-0.6988-1.6223-1.1797-0.4764-0.4756-0.8723-1.0207-1.1784-1.6232-0.3064-0.6019-0.5114-1.2305-0.64619-1.9852-0.15581-0.8626-0.19861-1.7874-0.22-2.5777-0.01221-0.4525-0.01731-0.9049-0.02021-1.3547l-0.0022-1.3279 1e-4 -0.3506v-76.318l-1e-4 -0.3506 0.0021-1.3251c3e-3 -0.4525 0.0081-0.9049 0.02031-1.357 0.02139-0.7911 0.06419-1.7163 0.22129-2.5861 0.1336-0.7479 0.3385-1.3765 0.6465-1.9814 0.3037-0.5979 0.7003-1.1437 1.1792-1.6225 0.477-0.4772 1.0231-0.8739 1.6248-1.1799 0.6011-0.3061 1.2308-0.5116 1.9805-0.6465 0.8638-0.1552 1.7909-0.198 2.5849-0.2195 0.4526-0.0123 0.9052-0.0172 1.3544-0.0203l1.6771-0.0033h135.87" fill="#fff"/>
|
5 |
<path d="m45.186 35.641c1.4172-1.7727 2.379-4.1528 2.1253-6.5851-2.0746 0.10316-4.6063 1.3687-6.0721 3.1428-1.3161 1.5192-2.4809 3.999-2.1772 6.3293 2.3289 0.20201 4.6556-1.1641 6.124-2.887"/>
|
assets/images/mybank.svg
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
<svg fill="none" height="24" viewBox="0 0 32 24" width="32" xmlns="http://www.w3.org/2000/svg"><path d="m4.12903.5h23.74197c1.9991 0 3.629 1.63976 3.629 3.67391v15.65219c0 2.0341-1.6299 3.6739-3.629 3.6739h-23.74197c-1.99917 0-3.62903-1.6398-3.62903-3.6739v-15.65219c0-2.03415 1.62986-3.67391 3.62903-3.67391z" fill="#fff" stroke="#e6e6e6"/><g clip-rule="evenodd" fill-rule="evenodd"><path d="m22.2986 13.6423s-.7024.1442-.6951-.3586c.0075-.5028 1.2797-.4727 1.41-.432 0 0 .0401.5705-.7149.7906zm.2114-3.1717c-1.0921-.0102-1.6028.6179-1.6028.6179-.3316.3517-.119.828.2063.8624.4674.0494.4626-.3423 1.18-.516.6294-.1523.6566.4307.6566.4307-2.6842-.0667-2.556 2.1857-1.6423 2.6641.8763.4587 1.6953-.12 1.6953-.12s.0308.3117.4643.3117c.4961 0 .4954-.4951.4954-.4951l-.002-2.1924c-.0327-1.604-1.4508-1.5633-1.4508-1.5633z" fill="#204256"/><path d="m31.1779 13.8362-1.0943-1.6471.8043-.7605s.3712-.3436.0664-.6842c-.3377-.3772-.7404-.0048-.7404-.0048l-1.0106.9388v-1.88444c0-.27002-.2188-.48872-.4887-.48872-.2702 0-.489.2187-.489.48872v4.43424c0 .2699.2188.4887.489.4887.2699 0 .4887-.2188.4887-.4887v-1.1805l.1849-.1847.99 1.5516s.3227.5387.798.1959c.3573-.2578.0017-.7743.0017-.7743z" fill="#204256"/><path d="m27.6864 12.0341c0-1.6017-1.3352-1.8274-2.2431-1.3193-.0007.0006-.0016.0024-.002.0029-.0683-.1949-.2519-.3357-.4702-.3357-.2759 0-.4997.2238-.4997.4999v3.3396c0 .2761.2238.4999.4997.4999.2761 0 .4999-.2238.4999-.4999l-.0069-2.2531s.1212-.1443.3158-.2824c.4675-.3314.9132-.2185.9132.3479l.0114 2.1957c0 .2719.2201.4918.4918.4918.2715 0 .4916-.2199.4916-.4918z" fill="#204256"/><path d="m13.317 14.7856c.1145-.1913.1344-.326.1344-.326l-1.1287-2.9503s-.2048-.5708.2465-.7399c.4782-.1794.6508.2773.6867.3731.0359.0957.7131 1.899.7131 1.899l.652-1.8949s.1868-.5891.7091-.379c.4315.1737.2098.7516.2098.7516s-.6672 1.9744-1.2266 3.4067c-.3341.8558-.6194.9402-.9454 1.0204-.4363.1074-1.2612.0542-1.2612-.4883 0-.4279.4381-.4546.6357-.4482.0106.0002.4191.0356.5746-.2242z" fill="#1cb9de"/><path d="m10.6955 9.82625-1.03174 2.84675-1.12477-2.82943s-.16669-.53638-.63567-.53638c-.5434 0-.52567.43043-.5379.53638-.01223.10603 0 4.42453 0 4.42453s-.0055.4534.49307.4534c.50941 0 .48495-.4574.48901-.4574.00407 0 0-2.2798 0-2.2798l.82725 2.2798s.1222.4482.5053.44c.38305-.008.49305-.44.49305-.44l.6928-2.2757v2.2757s0 .4574.5012.4574c.4849 0 .4849-.4574.4849-.4574l.0007-4.41643s0-.54048-.5263-.53789c-.4365.00205-.6024.4205-.6309.51647-.0033.0112-.0048.01732-.0048.01732z" fill="#1cb9de"/><path d="m31.3388 16.4653h-8.708l-6.3938-.0011.0044.0071c-1.2638 1.4809-3.1409 2.4227-5.2405 2.4227-3.80662 0-6.89247-3.0861-6.89247-6.8927 0-3.80669 3.08585-6.89254 6.89247-6.89254 2.1087 0 3.9947.94719 5.2587 2.43893h1.384c-1.4362-2.13813-3.8733-3.54769-6.6427-3.54769-4.41861 0-8.0009 3.58233-8.0009 8.0013 0 4.4189 3.58229 8.0012 8.0009 8.0012 2.3181 0 4.4013-.9896 5.8617-2.5653l13.8203-.0138z" fill="#1cb9de"/><path d="m18.6571 13.7552h-1.3908v-1.3257h1.3908c.3364.0173.663.1885.663.6629 0 .4872-.297.6628-.663.6628zm-1.3908-3.4015h1.2964c.2597.0067.5322.1452.5322.5323 0 .4034-.2383.5323-.5322.5323h-1.2964zm2.4866 1.4663c.0264-.0364.3591-.3059.3328-1.0226-.053-1.45095-1.3131-1.43441-1.592-1.44287-.4493-.0135-.7198-.00808-1.5445 0-.6964.0069-.6913.63978-.6913.63978v4.72709h2.3473c1.2561 0 1.7234-.6915 1.7234-1.6583 0-.9727-.5757-1.2431-.5757-1.2431z" fill="#204256"/></g></svg>
|
includes/mollie-api-php/.gitattributes
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/.github export-ignore
|
2 |
+
/tests export-ignore
|
3 |
+
/.gitattributes export-ignore
|
4 |
+
/.gitignore export-ignore
|
5 |
+
/.travis.yml export-ignore
|
6 |
+
/Makefile export-ignore
|
7 |
+
/phpunit.xml export-ignore
|
8 |
+
/scoper.inc.php export-ignore
|
includes/mollie-api-php/.github/ISSUE_TEMPLATE.md
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
## Specifications
|
2 |
+
|
3 |
+
- API Version:
|
4 |
+
|
5 |
+
## Describe the issue
|
6 |
+
|
7 |
+
...
|
8 |
+
|
includes/mollie-api-php/.gitignore
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/.idea
|
2 |
+
/build
|
3 |
+
/vendor
|
4 |
+
/composer.lock
|
5 |
+
.DS_Store
|
6 |
+
composer.phar
|
7 |
+
php-scoper.phar
|
8 |
+
php-scoper.phar.pubkey
|
includes/mollie-api-php/.travis.yml
ADDED
@@ -0,0 +1,46 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
language: php
|
2 |
+
|
3 |
+
dist: xenial
|
4 |
+
|
5 |
+
matrix:
|
6 |
+
fast_finish: true
|
7 |
+
allow_failures:
|
8 |
+
- php: nightly
|
9 |
+
include:
|
10 |
+
- php: 5.6
|
11 |
+
- php: 7.0
|
12 |
+
- php: 7.1
|
13 |
+
- php: 7.2
|
14 |
+
- php: 7.3
|
15 |
+
- php: nightly
|
16 |
+
|
17 |
+
sudo: false
|
18 |
+
|
19 |
+
cache:
|
20 |
+
directories:
|
21 |
+
- "$HOME/.composer/cache"
|
22 |
+
|
23 |
+
env:
|
24 |
+
- COMPOSER_NO_INTERACTION=1
|
25 |
+
|
26 |
+
install:
|
27 |
+
- travis_retry composer install --no-scripts --no-suggest
|
28 |
+
|
29 |
+
script:
|
30 |
+
- composer validate --strict
|
31 |
+
- find src examples tests -name '*.php' | xargs -n 1 -P4 php -l
|
32 |
+
- vendor/bin/phpunit
|
33 |
+
|
34 |
+
before_deploy:
|
35 |
+
- sed -i "/const CLIENT_VERSION/c\\ const CLIENT_VERSION = '${TRAVIS_TAG:1}';" src/MollieApiClient.php
|
36 |
+
- make mollie-api-php.zip
|
37 |
+
|
38 |
+
deploy:
|
39 |
+
provider: releases
|
40 |
+
api_key:
|
41 |
+
secure: oXVzXjLkVfr7+5leMbIHQnLDg1o9/ldG6qdJ/GtwumZJYiit9h7VBYpxRvQGgXUESzhDlBf2jCLKxqxW+P2/PwG738/rSJVjLvbtbyFRz+pvk4o8rm3U7IKRv87BFhIvhaO9HcgvmyHbPMzGKRdAsWYWGQf/dg9N77xeDZ9++80=
|
42 |
+
file: mollie-api-php.zip
|
43 |
+
skip_cleanup: true
|
44 |
+
on:
|
45 |
+
tags: true
|
46 |
+
php: 7.2
|
includes/mollie-api-php/Makefile
ADDED
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#
|
2 |
+
# This automatically creates a fresh build for distribution with other modules or for getting started with Mollie
|
3 |
+
# without composer.
|
4 |
+
#
|
5 |
+
mollie-api-php.zip: php-scoper.phar
|
6 |
+
rm -rf build/*
|
7 |
+
|
8 |
+
#
|
9 |
+
# First, install all dependencies. Then prefix everything with humbug/php-scoper. Finally, we should dump the
|
10 |
+
# autoloader again to update the autoloader with the new classnames.
|
11 |
+
#
|
12 |
+
composer install --no-dev --no-scripts --no-suggest
|
13 |
+
php php-scoper.phar add-prefix --force
|
14 |
+
composer dump-autoload --working-dir build --classmap-authoritative
|
15 |
+
|
16 |
+
#
|
17 |
+
# Now move the autoload files. We have to use the scoper one to load the aliasses but we want to load the normal
|
18 |
+
# filename. Flip them around.
|
19 |
+
#
|
20 |
+
mv build/vendor/autoload.php build/vendor/composer-autoload.php
|
21 |
+
sed -i 's/autoload.php/composer-autoload.php/g' build/vendor/scoper-autoload.php
|
22 |
+
mv build/vendor/scoper-autoload.php build/vendor/autoload.php
|
23 |
+
|
24 |
+
#
|
25 |
+
# Finally, create a zip file with all built files.
|
26 |
+
#
|
27 |
+
cd build; zip -r ../mollie-api-php.zip examples src vendor composer.json LICENSE README.md
|
28 |
+
|
29 |
+
php-scoper.phar:
|
30 |
+
wget -q https://github.com/humbug/php-scoper/releases/download/0.9.2/php-scoper.phar
|
31 |
+
wget -q https://github.com/humbug/php-scoper/releases/download/0.9.2/php-scoper.phar.pubkey
|
includes/mollie-api-php/composer.json
ADDED
@@ -0,0 +1,80 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"name": "mollie/mollie-api-php",
|
3 |
+
"description": "Mollie API client library for PHP. Mollie is a European Payment Service provider and offers international payment methods such as Mastercard, VISA, American Express and PayPal, and local payment methods such as iDEAL, Bancontact, SOFORT Banking, SEPA direct debit, Belfius Direct Net, KBC Payment Button and various gift cards such as Podiumcadeaukaart and fashioncheque.",
|
4 |
+
"keywords": [
|
5 |
+
"mollie",
|
6 |
+
"payment",
|
7 |
+
"service",
|
8 |
+
"ideal",
|
9 |
+
"creditcard",
|
10 |
+
"apple pay",
|
11 |
+
"mistercash",
|
12 |
+
"bancontact",
|
13 |
+
"sofort",
|
14 |
+
"sofortbanking",
|
15 |
+
"sepa",
|
16 |
+
"paypal",
|
17 |
+
"paysafecard",
|
18 |
+
"podiumcadeaukaart",
|
19 |
+
"przelewy24",
|
20 |
+
"banktransfer",
|
21 |
+
"direct debit",
|
22 |
+
"belfius",
|
23 |
+
"belfius direct net",
|
24 |
+
"refunds",
|
25 |
+
"api",
|
26 |
+
"payments",
|
27 |
+
"gateway",
|
28 |
+
"subscriptions",
|
29 |
+
"recurring",
|
30 |
+
"charges",
|
31 |
+
"kbc",
|
32 |
+
"cbc",
|
33 |
+
"gift cards",
|
34 |
+
"intersolve",
|
35 |
+
"fashioncheque",
|
36 |
+
"inghomepay",
|
37 |
+
"klarna",
|
38 |
+
"paylater",
|
39 |
+
"sliceit"
|
40 |
+
],
|
41 |
+
"homepage": "https://www.mollie.com/en/developers",
|
42 |
+
"license": "BSD-2-Clause",
|
43 |
+
"authors": [
|
44 |
+
{
|
45 |
+
"name": "Mollie B.V.",
|
46 |
+
"email": "info@mollie.com"
|
47 |
+
}
|
48 |
+
],
|
49 |
+
"require": {
|
50 |
+
"php": ">=5.6",
|
51 |
+
"ext-curl": "*",
|
52 |
+
"ext-json": "*",
|
53 |
+
"ext-openssl": "*",
|
54 |
+
"composer/ca-bundle": "^1.1",
|
55 |
+
"guzzlehttp/guzzle": "^6.3"
|
56 |
+
},
|
57 |
+
"require-dev": {
|
58 |
+
"eloquent/liberator": "^2.0",
|
59 |
+
"phpunit/phpunit": "^5.7 || ^6.5 || ^7.1"
|
60 |
+
},
|
61 |
+
"suggest": {
|
62 |
+
"mollie/oauth2-mollie-php": "Use OAuth to authenticate with the Mollie API. This is needed for some endpoints. Visit https://docs.mollie.com/ for more information."
|
63 |
+
},
|
64 |
+
"config": {
|
65 |
+
"sort-packages": true
|
66 |
+
},
|
67 |
+
"autoload": {
|
68 |
+
"psr-4": {
|
69 |
+
"Mollie\\Api\\": "src/"
|
70 |
+
}
|
71 |
+
},
|
72 |
+
"autoload-dev": {
|
73 |
+
"psr-4": {
|
74 |
+
"Tests\\": "tests"
|
75 |
+
}
|
76 |
+
},
|
77 |
+
"scripts": {
|
78 |
+
"test": "./vendor/bin/phpunit tests"
|
79 |
+
}
|
80 |
+
}
|
includes/mollie-api-php/examples/captures/get-capture.php
ADDED
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Retrieve a payment capture using the Mollie API.
|
4 |
+
*/
|
5 |
+
|
6 |
+
try {
|
7 |
+
/*
|
8 |
+
* Initialize the Mollie API library with your API key or OAuth access token.
|
9 |
+
*/
|
10 |
+
require "../initialize.php";
|
11 |
+
|
12 |
+
/*
|
13 |
+
* Retrieve a capture with ID 'cpt_4qqhO89gsT' for payment with
|
14 |
+
* ID 'tr_WDqYK6vllg'.
|
15 |
+
*
|
16 |
+
* See: https://docs.mollie.com/reference/v2/captures-api/get-capture
|
17 |
+
*/
|
18 |
+
|
19 |
+
$payment = $mollie->payments->get('tr_WDqYK6vllg');
|
20 |
+
$capture = $payment->getCapture('cpt_4qqhO89gsT');
|
21 |
+
|
22 |
+
$amount = $capture->amount->currency . ' ' . $capture->amount->value;
|
23 |
+
|
24 |
+
echo 'Captured ' . $amount;
|
25 |
+
} catch (\Mollie\Api\Exceptions\ApiException $e) {
|
26 |
+
echo "API call failed: " . htmlspecialchars($e->getMessage());
|
27 |
+
}
|
includes/mollie-api-php/examples/captures/list-captures.php
ADDED
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* List captures for a payment using the Mollie API.
|
4 |
+
*/
|
5 |
+
|
6 |
+
try {
|
7 |
+
/*
|
8 |
+
* Initialize the Mollie API library with your API key or OAuth access token.
|
9 |
+
*/
|
10 |
+
require "../initialize.php";
|
11 |
+
|
12 |
+
/*
|
13 |
+
* List captures for payment with ID 'tr_WDqYK6vllg'.
|
14 |
+
*
|
15 |
+
* See: https://docs.mollie.com/reference/v2/captures-api/list-captures
|
16 |
+
*/
|
17 |
+
|
18 |
+
$payment = $mollie->payments->get('tr_WDqYK6vllg');
|
19 |
+
$captures = $payment->captures();
|
20 |
+
|
21 |
+
foreach ($captures as $capture) {
|
22 |
+
$amount = $capture->amount->currency . ' ' . $capture->amount->value;
|
23 |
+
echo 'Captured ' . $amount . ' for payment ' . $payment->id;
|
24 |
+
}
|
25 |
+
} catch (\Mollie\Api\Exceptions\ApiException $e) {
|
26 |
+
echo "API call failed: " . htmlspecialchars($e->getMessage());
|
27 |
+
}
|
includes/mollie-api-php/examples/customers/create-customer-first-payment.php
ADDED
@@ -0,0 +1,67 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* How to create a first payment to allow recurring payments later.
|
4 |
+
*/
|
5 |
+
|
6 |
+
try {
|
7 |
+
/*
|
8 |
+
* Initialize the Mollie API library with your API key or OAuth access token.
|
9 |
+
*/
|
10 |
+
require "../initialize.php";
|
11 |
+
|
12 |
+
/*
|
13 |
+
* Retrieve the last created customer for this example.
|
14 |
+
* If no customers are created yet, run the create-customer example.
|
15 |
+
*/
|
16 |
+
$customer = $mollie->customers->page(null, 1)[0];
|
17 |
+
|
18 |
+
/*
|
19 |
+
* Generate a unique order id for this example. It is important to include this unique attribute
|
20 |
+
* in the redirectUrl (below) so a proper return page can be shown to the customer.
|
21 |
+
*/
|
22 |
+
$orderId = time();
|
23 |
+
|
24 |
+
/*
|
25 |
+
* Determine the url parts to these example files.
|
26 |
+
*/
|
27 |
+
$protocol = isset($_SERVER['HTTPS']) && strcasecmp('off', $_SERVER['HTTPS']) !== 0 ? "https" : "http";
|
28 |
+
$hostname = $_SERVER['HTTP_HOST'];
|
29 |
+
$path = dirname(isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : $_SERVER['PHP_SELF']);
|
30 |
+
|
31 |
+
/**
|
32 |
+
* Customer Payment creation parameters.
|
33 |
+
*
|
34 |
+
* @See: https://docs.mollie.com/reference/v2/customers-api/create-customer-payment
|
35 |
+
*/
|
36 |
+
$payment = $customer->createPayment([
|
37 |
+
"amount" => [
|
38 |
+
"value" => "10.00", // You must send the correct number of decimals, thus we enforce the use of strings
|
39 |
+
"currency" => "EUR"
|
40 |
+
],
|
41 |
+
"description" => "First payment - Order #{$orderId}",
|
42 |
+
"redirectUrl" => "{$protocol}://{$hostname}{$path}/payments/return.php?order_id={$orderId}",
|
43 |
+
"webhookUrl" => "{$protocol}://{$hostname}{$path}/payments/webhook.php",
|
44 |
+
"metadata" => [
|
45 |
+
"order_id" => $orderId,
|
46 |
+
],
|
47 |
+
|
48 |
+
// Flag this payment as a first payment to allow recurring payments later.
|
49 |
+
"sequenceType" => \Mollie\Api\Types\SequenceType::SEQUENCETYPE_FIRST,
|
50 |
+
]);
|
51 |
+
|
52 |
+
/*
|
53 |
+
* In this example we store the order with its payment status in a database.
|
54 |
+
*/
|
55 |
+
database_write($orderId, $payment->status);
|
56 |
+
|
57 |
+
/*
|
58 |
+
* Send the customer off to complete the payment.
|
59 |
+
* This request should always be a GET, thus we enforce 303 http response code
|
60 |
+
*
|
61 |
+
* After completion, the customer will have a pending or valid mandate that can be
|
62 |
+
* used for recurring payments and subscriptions.
|
63 |
+
*/
|
64 |
+
header("Location: " . $payment->getCheckoutUrl(), true, 303);
|
65 |
+
} catch (\Mollie\Api\Exceptions\ApiException $e) {
|
66 |
+
echo "API call failed: " . htmlspecialchars($e->getMessage());
|
67 |
+
}
|
includes/mollie-api-php/examples/customers/create-customer-payment.php
ADDED
@@ -0,0 +1,61 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* How to create a new customer in the Mollie API.
|
4 |
+
*/
|
5 |
+
|
6 |
+
try {
|
7 |
+
/*
|
8 |
+
* Initialize the Mollie API library with your API key or OAuth access token.
|
9 |
+
*/
|
10 |
+
require "../initialize.php";
|
11 |
+
|
12 |
+
/*
|
13 |
+
* Retrieve the last created customer for this example.
|
14 |
+
* If no customers are created yet, run create-customer example.
|
15 |
+
*/
|
16 |
+
$customer = $mollie->customers->page(null, 1)[0];
|
17 |
+
|
18 |
+
/*
|
19 |
+
* Generate a unique order id for this example. It is important to include this unique attribute
|
20 |
+
* in the redirectUrl (below) so a proper return page can be shown to the customer.
|
21 |
+
*/
|
22 |
+
$orderId = time();
|
23 |
+
|
24 |
+
/*
|
25 |
+
* Determine the url parts to these example files.
|
26 |
+
*/
|
27 |
+
$protocol = isset($_SERVER['HTTPS']) && strcasecmp('off', $_SERVER['HTTPS']) !== 0 ? "https" : "http";
|
28 |
+
$hostname = $_SERVER['HTTP_HOST'];
|
29 |
+
$path = dirname(isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : $_SERVER['PHP_SELF']);
|
30 |
+
|
31 |
+
/**
|
32 |
+
* Linking customers to payments has a few benefits
|
33 |
+
*
|
34 |
+
* @see https://docs.mollie.com/reference/v2/customers-api/create-customer-payment
|
35 |
+
*/
|
36 |
+
$payment = $customer->createPayment([
|
37 |
+
"amount" => [
|
38 |
+
"value" => "10.00", // You must send the correct number of decimals, thus we enforce the use of strings
|
39 |
+
"currency" => "EUR"
|
40 |
+
],
|
41 |
+
"description" => "Order #{$orderId}",
|
42 |
+
"redirectUrl" => "{$protocol}://{$hostname}{$path}/payments/return.php?order_id={$orderId}",
|
43 |
+
"webhookUrl" => "{$protocol}://{$hostname}{$path}/payments/webhook.php",
|
44 |
+
"metadata" => [
|
45 |
+
"order_id" => $orderId,
|
46 |
+
]
|
47 |
+
]);
|
48 |
+
|
49 |
+
/*
|
50 |
+
* In this example we store the order with its payment status in a database.
|
51 |
+
*/
|
52 |
+
database_write($orderId, $payment->status);
|
53 |
+
|
54 |
+
/*
|
55 |
+
* Send the customer off to complete the payment.
|
56 |
+
* This request should always be a GET, thus we enforce 303 http response code
|
57 |
+
*/
|
58 |
+
header("Location: " . $payment->getCheckoutUrl(), true, 303);
|
59 |
+
} catch (\Mollie\Api\Exceptions\ApiException $e) {
|
60 |
+
echo "API call failed: " . htmlspecialchars($e->getMessage());
|
61 |
+
}
|
includes/mollie-api-php/examples/customers/create-customer-recurring-payment.php
ADDED
@@ -0,0 +1,63 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* How to create an on-demand recurring payment.
|
4 |
+
*/
|
5 |
+
|
6 |
+
try {
|
7 |
+
/*
|
8 |
+
* Initialize the Mollie API library with your API key or OAuth access token.
|
9 |
+
*/
|
10 |
+
require "../initialize.php";
|
11 |
+
|
12 |
+
/*
|
13 |
+
* Retrieve the last created customer for this example.
|
14 |
+
* If no customers are created yet, run the create-customer example.
|
15 |
+
*/
|
16 |
+
$customer = $mollie->customers->page(null, 1)[0];
|
17 |
+
|
18 |
+
/*
|
19 |
+
* Generate a unique order id for this example.
|
20 |
+
*/
|
21 |
+
$orderId = time();
|
22 |
+
|
23 |
+
/*
|
24 |
+
* Determine the url parts to these example files.
|
25 |
+
*/
|
26 |
+
$protocol = isset($_SERVER['HTTPS']) && strcasecmp('off', $_SERVER['HTTPS']) !== 0 ? "https" : "http";
|
27 |
+
$hostname = $_SERVER['HTTP_HOST'];
|
28 |
+
$path = dirname(isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : $_SERVER['PHP_SELF']);
|
29 |
+
|
30 |
+
/**
|
31 |
+
* Customer Payment creation parameters.
|
32 |
+
*
|
33 |
+
* @See: https://docs.mollie.com/reference/v2/customers-api/create-customer-payment
|
34 |
+
*/
|
35 |
+
$payment = $customer->createPayment([
|
36 |
+
"amount" => [
|
37 |
+
"value" => "10.00", // You must send the correct number of decimals, thus we enforce the use of strings
|
38 |
+
"currency" => "EUR"
|
39 |
+
],
|
40 |
+
"description" => "On-demand payment - Order #{$orderId}",
|
41 |
+
"webhookUrl" => "{$protocol}://{$hostname}{$path}/payments/webhook.php",
|
42 |
+
"metadata" => [
|
43 |
+
"order_id" => $orderId,
|
44 |
+
],
|
45 |
+
|
46 |
+
// Flag this payment as a recurring payment.
|
47 |
+
"sequenceType" => \Mollie\Api\Types\SequenceType::SEQUENCETYPE_RECURRING,
|
48 |
+
]);
|
49 |
+
|
50 |
+
/*
|
51 |
+
* In this example we store the order with its payment status in a database.
|
52 |
+
*/
|
53 |
+
database_write($orderId, $payment->status);
|
54 |
+
|
55 |
+
/*
|
56 |
+
* The payment will be either pending or paid immediately. The customer
|
57 |
+
* does not have to perform any payment steps.
|
58 |
+
*/
|
59 |
+
echo "<p>Selected mandate is '" . htmlspecialchars($payment->mandateId) . "' (" . htmlspecialchars($payment->method) . ").</p>\n";
|
60 |
+
echo "<p>The payment status is '" . htmlspecialchars($payment->status) . "'.</p>\n";
|
61 |
+
} catch (\Mollie\Api\Exceptions\ApiException $e) {
|
62 |
+
echo "API call failed: " . htmlspecialchars($e->getMessage());
|
63 |
+
}
|
includes/mollie-api-php/examples/customers/create-customer.php
ADDED
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* How to create a new customer in the Mollie API.
|
4 |
+
*/
|
5 |
+
|
6 |
+
try {
|
7 |
+
/*
|
8 |
+
* Initialize the Mollie API library with your API key or OAuth access token.
|
9 |
+
*/
|
10 |
+
require "../initialize.php";
|
11 |
+
|
12 |
+
/**
|
13 |
+
* Customer creation parameters.
|
14 |
+
*
|
15 |
+
* @See https://docs.mollie.com/reference/v2/customers-api/create-customer
|
16 |
+
*/
|
17 |
+
$customer = $mollie->customers->create([
|
18 |
+
"name" => "Luke Skywalker",
|
19 |
+
"email" => "luke@example.org",
|
20 |
+
"metadata" => [
|
21 |
+
"isJedi" => TRUE,
|
22 |
+
],
|
23 |
+
]);
|
24 |
+
echo "<p>New customer created " . htmlspecialchars($customer->id) . " (" . htmlspecialchars($customer->name) . ").</p>";
|
25 |
+
} catch (\Mollie\Api\Exceptions\ApiException $e) {
|
26 |
+
echo "API call failed: " . htmlspecialchars($e->getMessage());
|
27 |
+
}
|
includes/mollie-api-php/examples/customers/delete-customer.php
ADDED
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Delete a customer from the Mollie API.
|
4 |
+
*/
|
5 |
+
|
6 |
+
try {
|
7 |
+
/*
|
8 |
+
* Initialize the Mollie API library with your API key or OAuth access token.
|
9 |
+
*/
|
10 |
+
require "../initialize.php";
|
11 |
+
|
12 |
+
$mollie->customers->delete("cst_fE3F6nvX");
|
13 |
+
echo "<p>Customer deleted!</p>";
|
14 |
+
|
15 |
+
} catch (\Mollie\Api\Exceptions\ApiException $e) {
|
16 |
+
echo "API call failed: " . htmlspecialchars($e->getMessage());
|
17 |
+
}
|
includes/mollie-api-php/examples/customers/list-customer-payments.php
ADDED
@@ -0,0 +1,58 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* How to retrieve your customers' payments history.
|
4 |
+
*/
|
5 |
+
|
6 |
+
try {
|
7 |
+
/*
|
8 |
+
* Initialize the Mollie API library with your API key.
|
9 |
+
*
|
10 |
+
* See: https://www.mollie.com/dashboard/developers/api-keys
|
11 |
+
*/
|
12 |
+
require "../initialize.php";
|
13 |
+
|
14 |
+
/*
|
15 |
+
* Determine the url parts to these example files.
|
16 |
+
*/
|
17 |
+
$protocol = isset($_SERVER['HTTPS']) && strcasecmp('off', $_SERVER['HTTPS']) !== 0 ? "https" : "http";
|
18 |
+
$hostname = $_SERVER['HTTP_HOST'];
|
19 |
+
$path = dirname(isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : $_SERVER['PHP_SELF']);
|
20 |
+
|
21 |
+
/*
|
22 |
+
* Retrieve the last created customer for this example.
|
23 |
+
* If no customers are created yet, run create-customer example.
|
24 |
+
*/
|
25 |
+
$customer = $mollie->customers->page(null, 1)[0];
|
26 |
+
|
27 |
+
/*
|
28 |
+
* Get the all payments for this API key ordered by newest.
|
29 |
+
*/
|
30 |
+
$payments = $customer->payments();
|
31 |
+
|
32 |
+
echo "<ul>";
|
33 |
+
foreach ($payments as $payment) {
|
34 |
+
echo "<li>";
|
35 |
+
echo "<strong style='font-family: monospace'>" . htmlspecialchars($payment->id) . "</strong><br />";
|
36 |
+
echo htmlspecialchars($payment->description) . "<br />";
|
37 |
+
echo htmlspecialchars($payment->amount->currency) . " " . htmlspecialchars($payment->amount->value) . "<br />";
|
38 |
+
|
39 |
+
echo "Status: " . htmlspecialchars($payment->status) . "<br />";
|
40 |
+
|
41 |
+
if ($payment->hasRefunds()) {
|
42 |
+
echo "Payment has been (partially) refunded.<br />";
|
43 |
+
}
|
44 |
+
|
45 |
+
if ($payment->hasChargebacks()) {
|
46 |
+
echo "Payment has been charged back.<br />";
|
47 |
+
}
|
48 |
+
|
49 |
+
if ($payment->canBeRefunded() && $payment->amountRemaining->currency === 'EUR' && $payment->amountRemaining->value >= '2.00') {
|
50 |
+
echo " (<a href=\"{$protocol}://{$hostname}{$path}/payments/refund-payment.php?payment_id=" . htmlspecialchars($payment->id) . "\">refund</a>)";
|
51 |
+
}
|
52 |
+
|
53 |
+
echo "</li>";
|
54 |
+
}
|
55 |
+
echo "</ul>";
|
56 |
+
} catch (\Mollie\Api\Exceptions\ApiException $e) {
|
57 |
+
echo "API call failed: " . htmlspecialchars($e->getMessage());
|
58 |
+
}
|
includes/mollie-api-php/examples/customers/update-customer.php
ADDED
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Updating an existing customer via the Mollie API.
|
4 |
+
*/
|
5 |
+
|
6 |
+
try {
|
7 |
+
/*
|
8 |
+
* Initialize the Mollie API library with your API key or OAuth access token.
|
9 |
+
*/
|
10 |
+
require "../initialize.php";
|
11 |
+
|
12 |
+
/*
|
13 |
+
* Retrieve an existing customer by his customerId
|
14 |
+
*/
|
15 |
+
$customer = $mollie->customers->get("cst_cUe8HjeBuz");
|
16 |
+
|
17 |
+
/**
|
18 |
+
* Customer fields that can be updated.
|
19 |
+
*
|
20 |
+
* @See https://docs.mollie.com/reference/v2/customers-api/update-customer
|
21 |
+
*/
|
22 |
+
$customer->name = "Luke Sky";
|
23 |
+
$customer->email = "luke@example.org";
|
24 |
+
$customer->locale = "en_US";
|
25 |
+
$customer->metadata->isJedi = TRUE;
|
26 |
+
$customer->update();
|
27 |
+
|
28 |
+
echo "<p>Customer updated: " . htmlspecialchars($customer->name) . "</p>";
|
29 |
+
} catch (\Mollie\Api\Exceptions\ApiException $e) {
|
30 |
+
echo "API call failed: " . htmlspecialchars($e->getMessage());
|
31 |
+
}
|
includes/mollie-api-php/examples/database/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
*.txt
|
includes/mollie-api-php/examples/functions.php
ADDED
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* NOTE: The examples are using a text file as a database.
|
4 |
+
* Please use a real database like MySQL in production code.
|
5 |
+
*/
|
6 |
+
|
7 |
+
function database_read($orderId)
|
8 |
+
{
|
9 |
+
$orderId = intval($orderId);
|
10 |
+
$database = dirname(__FILE__) . "/database/order-{$orderId}.txt";
|
11 |
+
|
12 |
+
$status = @file_get_contents($database);
|
13 |
+
|
14 |
+
return $status ? $status : "unknown order";
|
15 |
+
}
|
16 |
+
|
17 |
+
function database_write($orderId, $status)
|
18 |
+
{
|
19 |
+
$orderId = intval($orderId);
|
20 |
+
$database = dirname(__FILE__) . "/database/order-{$orderId}.txt";
|
21 |
+
|
22 |
+
file_put_contents($database, $status);
|
23 |
+
}
|
includes/mollie-api-php/examples/initialize.php
ADDED
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Make sure to disable the display of errors in production code!
|
4 |
+
*/
|
5 |
+
ini_set('display_errors', 1);
|
6 |
+
ini_set('display_startup_errors', 1);
|
7 |
+
error_reporting(E_ALL);
|
8 |
+
|
9 |
+
require_once __DIR__ . "/../vendor/autoload.php";
|
10 |
+
require_once __DIR__ . "/functions.php";
|
11 |
+
|
12 |
+
/*
|
13 |
+
* Initialize the Mollie API library with your API key.
|
14 |
+
*
|
15 |
+
* See: https://www.mollie.com/dashboard/developers/api-keys
|
16 |
+
*/
|
17 |
+
$mollie = new \Mollie\Api\MollieApiClient();
|
18 |
+
$mollie->setApiKey("test_dHar4XY7LxsDOtmnkVtjNVWXLSlXsM");
|
includes/mollie-api-php/examples/initialize_with_oauth.php
ADDED
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/*
|
4 |
+
* Make sure to disable the display of errors in production code!
|
5 |
+
*/
|
6 |
+
ini_set('display_errors', 1);
|
7 |
+
ini_set('display_startup_errors', 1);
|
8 |
+
error_reporting(E_ALL);
|
9 |
+
|
10 |
+
require_once __DIR__ . "/../vendor/autoload.php";
|
11 |
+
require_once __DIR__ . "/functions.php";
|
12 |
+
|
13 |
+
/*
|
14 |
+
* Initialize the Mollie API library with OAuth.
|
15 |
+
*
|
16 |
+
* See: https://docs.mollie.com/oauth/overview
|
17 |
+
*/
|
18 |
+
$mollie = new \Mollie\Api\MollieApiClient();
|
19 |
+
$mollie->setAccessToken("access_Wwvu7egPcJLLJ9Kb7J632x8wJ2zMeJ");
|
includes/mollie-api-php/examples/invoices/list-invoices.php
ADDED
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* List the Mollie invoices.
|
4 |
+
*/
|
5 |
+
|
6 |
+
try {
|
7 |
+
/*
|
8 |
+
* Initialize the Mollie API library with your API key or OAuth access token.
|
9 |
+
*/
|
10 |
+
require "../initialize_with_oauth.php";
|
11 |
+
|
12 |
+
/*
|
13 |
+
* Get all the activated methods for this API key.
|
14 |
+
*/
|
15 |
+
$invoices = $mollie->invoices->all();
|
16 |
+
foreach ($invoices as $invoice) {
|
17 |
+
echo '<li><b>Invoice ' . htmlspecialchars($invoice->reference) . ':</b> (' . htmlspecialchars($invoice->issuedAt) . ')';
|
18 |
+
echo '<br>Status: <b>' . $invoice->status;
|
19 |
+
echo '<table border="1"><tr><th>Period</th><th>Description</th><th>Count</th><th>VAT Percentage</th><th>Amount</th></tr>';
|
20 |
+
foreach ($invoice->lines as $line) {
|
21 |
+
echo '<tr>';
|
22 |
+
echo '<td>' . htmlspecialchars($line->period) . '</td>';
|
23 |
+
echo '<td>' . htmlspecialchars($line->description) . '</td>';
|
24 |
+
echo '<td align="right">' . htmlspecialchars($line->count) . '</td>';
|
25 |
+
echo '<td align="right">' . htmlspecialchars($line->vatPercentage) . '</td>';
|
26 |
+
echo '<td align="right">' . htmlspecialchars($line->amount->currency . " " . $line->amount->value) . '</td>';
|
27 |
+
echo '</tr>';
|
28 |
+
}
|
29 |
+
echo '<tr><th colspan="5" align="right">Gross Total</th><th align="right">' . htmlspecialchars($invoice->grossAmount->value . " " . $invoice->grossAmount->currency) . '</th></tr>';
|
30 |
+
echo '</table>';
|
31 |
+
echo '<a href="'. $invoice->_links->pdf->href .'" target="_blank">Click here to open PDF</a>';
|
32 |
+
echo '</li>';
|
33 |
+
}
|
34 |
+
|
35 |
+
} catch (\Mollie\Api\Exceptions\ApiException $e) {
|
36 |
+
echo "API call failed: " . htmlspecialchars($e->getMessage());
|
37 |
+
}
|
includes/mollie-api-php/examples/mandates/create-mandate.php
ADDED
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Create a customer mandate via the Mollie API.
|
4 |
+
*/
|
5 |
+
|
6 |
+
try {
|
7 |
+
/*
|
8 |
+
* Initialize the Mollie API library with your API key or OAuth access token.
|
9 |
+
*/
|
10 |
+
require "../initialize.php";
|
11 |
+
|
12 |
+
/*
|
13 |
+
* Retrieve the last created customer for this example.
|
14 |
+
* If no customers are created yet, run create-customer example.
|
15 |
+
*/
|
16 |
+
$customer = $mollie->customers->page(null, 1)[0];
|
17 |
+
|
18 |
+
/*
|
19 |
+
* Create a SEPA Direct Debit mandate for the customer
|
20 |
+
*/
|
21 |
+
$mandate = $customer->createMandate([
|
22 |
+
"method" => \Mollie\Api\Types\MandateMethod::DIRECTDEBIT,
|
23 |
+
"consumerAccount" => 'NL34ABNA0243341423',
|
24 |
+
"consumerName" => 'B. A. Example',
|
25 |
+
]);
|
26 |
+
|
27 |
+
echo "<p>Mandate created with id " . $mandate->id . " for customer " . $customer->name . "</p>";
|
28 |
+
} catch (\Mollie\Api\Exceptions\ApiException $e) {
|
29 |
+
echo "API call failed: " . htmlspecialchars($e->getMessage());
|
30 |
+
}
|
includes/mollie-api-php/examples/mandates/list-mandates.php
ADDED
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* List all customer mandates
|
4 |
+
*/
|
5 |
+
|
6 |
+
try {
|
7 |
+
/*
|
8 |
+
* Initialize the Mollie API library with your API key or OAuth access token.
|
9 |
+
*/
|
10 |
+
require "../initialize.php";
|
11 |
+
|
12 |
+
/*
|
13 |
+
* Retrieve an existing customer by his customerId
|
14 |
+
*/
|
15 |
+
$customer = $mollie->customers->get("cst_cUa8HjKBus");
|
16 |
+
|
17 |
+
/*
|
18 |
+
* List the mandates of this customer
|
19 |
+
*/
|
20 |
+
echo "<ul>";
|
21 |
+
foreach ($customer->mandates() as $mandate) {
|
22 |
+
echo "<li>" . htmlspecialchars($mandate->id) . " - " . htmlspecialchars($mandate->method) . ": " . htmlspecialchars($mandate->status) . "</li>";
|
23 |
+
}
|
24 |
+
echo "</ul>";
|
25 |
+
|
26 |
+
} catch (\Mollie\Api\Exceptions\ApiException $e) {
|
27 |
+
echo "API call failed: " . htmlspecialchars($e->getMessage());
|
28 |
+
}
|
includes/mollie-api-php/examples/mandates/revoke-mandate.php
ADDED
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Revoke a customer mandate
|
4 |
+
*/
|
5 |
+
|
6 |
+
try {
|
7 |
+
/*
|
8 |
+
* Initialize the Mollie API library with your API key or OAuth access token.
|
9 |
+
*/
|
10 |
+
require "../initialize.php";
|
11 |
+
|
12 |
+
/*
|
13 |
+
* Retrieve an existing customer by his customerId
|
14 |
+
*/
|
15 |
+
$customer = $mollie->customers->get("cst_cUa8HjKBus");
|
16 |
+
|
17 |
+
/*
|
18 |
+
* Retrieve an existing mandate by his mandateId
|
19 |
+
*/
|
20 |
+
$mandate = $customer->getMandate("mdt_pa3s7rGnrC");
|
21 |
+
|
22 |
+
/*
|
23 |
+
* Revoke the mandate
|
24 |
+
*/
|
25 |
+
$mandate->revoke();
|
26 |
+
|
27 |
+
echo "<p>Mandate has been successfully revoked.</p>";
|
28 |
+
|
29 |
+
} catch (\Mollie\Api\Exceptions\ApiException $e) {
|
30 |
+
echo "API call failed: " . htmlspecialchars($e->getMessage());
|
31 |
+
}
|
includes/mollie-api-php/examples/orders/cancel-order-lines.php
ADDED
@@ -0,0 +1,44 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Cancel order lines using the Mollie API.
|
4 |
+
*/
|
5 |
+
|
6 |
+
try {
|
7 |
+
/*
|
8 |
+
* Initialize the Mollie API library with your API key or OAuth access token.
|
9 |
+
*/
|
10 |
+
require "../initialize.php";
|
11 |
+
|
12 |
+
/*
|
13 |
+
* Cancel an order line with ID "odl_dgtxyl" for order ID "ord_8wmqcHMN4U"
|
14 |
+
*
|
15 |
+
* See: https://docs.mollie.com/reference/v2/orders-api/cancel-order-line
|
16 |
+
*/
|
17 |
+
|
18 |
+
$orderId = 'ord_8wmqcHMN4U';
|
19 |
+
$lineId = 'odl_dgtxyl';
|
20 |
+
|
21 |
+
$order = $mollie->orders->get($orderId);
|
22 |
+
$line = $order->lines()->get($lineId);
|
23 |
+
if ($line && $line->isCancelable) {
|
24 |
+
$order->cancelLines([
|
25 |
+
'lines' => [
|
26 |
+
[
|
27 |
+
'id' => $lineId,
|
28 |
+
'quantity' => 1, // optional parameter
|
29 |
+
]
|
30 |
+
],
|
31 |
+
]);
|
32 |
+
|
33 |
+
$updatedOrder = $mollie->orders->get($orderId);
|
34 |
+
|
35 |
+
echo 'Your order ' . $order->id . ' was updated:';
|
36 |
+
foreach ($order->lines as $line) {
|
37 |
+
echo $line->description . '. Status: <b>' . $line->status . '</b>.';
|
38 |
+
}
|
39 |
+
} else {
|
40 |
+
echo "Unable to cancel line " . $lineId . " for your order " . $orderId . ".";
|
41 |
+
}
|
42 |
+
} catch (\Mollie\Api\Exceptions\ApiException $e) {
|
43 |
+
echo "API call failed: " . htmlspecialchars($e->getMessage());
|
44 |
+
}
|
includes/mollie-api-php/examples/orders/cancel-order.php
ADDED
@@ -0,0 +1,26 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Cancel an order using the Mollie API.
|
4 |
+
*/
|
5 |
+
|
6 |
+
try {
|
7 |
+
/*
|
8 |
+
* Initialize the Mollie API library with your API key or OAuth access token.
|
9 |
+
*/
|
10 |
+
require "../initialize.php";
|
11 |
+
|
12 |
+
/*
|
13 |
+
* Cancel the order with ID "ord_pbjz8x"
|
14 |
+
*
|
15 |
+
* See: https://docs.mollie.com/reference/v2/orders-api/cancel-order
|
16 |
+
*/
|
17 |
+
$order = $mollie->orders->get("ord_pbjz8x");
|
18 |
+
if ($order->isCancelable) {
|
19 |
+
$canceledOrder = $order->cancel();
|
20 |
+
echo "Your order " . $order->id . " has been canceled.";
|
21 |
+
} else {
|
22 |
+
echo "Unable to cancel your order " . $order->id . ".";
|
23 |
+
}
|
24 |
+
} catch (\Mollie\Api\Exceptions\ApiException $e) {
|
25 |
+
echo "API call failed: " . htmlspecialchars($e->getMessage());
|
26 |
+
}
|
includes/mollie-api-php/examples/orders/create-order.php
ADDED
@@ -0,0 +1,118 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* How to create a new order in the Mollie API.
|
4 |
+
*/
|
5 |
+
|
6 |
+
try {
|
7 |
+
/*
|
8 |
+
* Initialize the Mollie API library with your API key or OAuth access token.
|
9 |
+
*/
|
10 |
+
require "../initialize.php";
|
11 |
+
|
12 |
+
/*
|
13 |
+
* Generate a unique order id for this example. It is important to include this unique attribute
|
14 |
+
* in the redirectUrl (below) so a proper return page can be shown to the customer.
|
15 |
+
*/
|
16 |
+
$orderId = time();
|
17 |
+
|
18 |
+
/*
|
19 |
+
* Determine the url parts to these example files.
|
20 |
+
*/
|
21 |
+
$protocol = isset($_SERVER['HTTPS']) && strcasecmp('off', $_SERVER['HTTPS']) !== 0 ? "https" : "http";
|
22 |
+
$hostname = $_SERVER['HTTP_HOST'];
|
23 |
+
$path = dirname(isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : $_SERVER['PHP_SELF']);
|
24 |
+
|
25 |
+
/*
|
26 |
+
* Order creation parameters.
|
27 |
+
*
|
28 |
+
* See: https://docs.mollie.com/reference/v2/orders-api/create-order
|
29 |
+
*/
|
30 |
+
$order = $mollie->orders->create([
|
31 |
+
"amount" => [
|
32 |
+
"value" => "1027.99",
|
33 |
+
"currency" => "EUR"
|
34 |
+
],
|
35 |
+
"billingAddress" => [
|
36 |
+
"streetAndNumber" => "Keizersgracht 313",
|
37 |
+
"postalCode" => "1016 EE",
|
38 |
+
"city" => "Amsterdam",
|
39 |
+
"country" => "nl",
|
40 |
+
"givenName" => "Luke",
|
41 |
+
"familyName" => "Skywalker",
|
42 |
+
"email" => "luke@skywalker.com",
|
43 |
+
],
|
44 |
+
"shippingAddress" => [
|
45 |
+
"streetAndNumber" => "Keizersgracht 313",
|
46 |
+
"postalCode" => "1016 EE",
|
47 |
+
"city" => "Amsterdam",
|
48 |
+
"country" => "nl",
|
49 |
+
"givenName" => "Luke",
|
50 |
+
"familyName" => "Skywalker",
|
51 |
+
"email" => "luke@skywalker.com",
|
52 |
+
],
|
53 |
+
"metadata" => [
|
54 |
+
"order_id" => $orderId
|
55 |
+
],
|
56 |
+
"consumerDateOfBirth" => "1958-01-31",
|
57 |
+
"locale" => "en_US",
|
58 |
+
"orderNumber" => strval($orderId),
|
59 |
+
"redirectUrl" => "{$protocol}://{$hostname}{$path}/orders/return.php?order_id={$orderId}",
|
60 |
+
"webhookUrl" => "{$protocol}://{$hostname}{$path}/orders/webhook.php",
|
61 |
+
"method" => "ideal",
|
62 |
+
"lines" => [
|
63 |
+
[
|
64 |
+
"sku" => "5702016116977",
|
65 |
+
"name" => "LEGO 42083 Bugatti Chiron",
|
66 |
+
"productUrl" => "https://shop.lego.com/nl-NL/Bugatti-Chiron-42083",
|
67 |
+
"imageUrl" => 'https://sh-s7-live-s.legocdn.com/is/image//LEGO/42083_alt1?$main$',
|
68 |
+
"quantity" => 2,
|
69 |
+
"vatRate" => "21.00",
|
70 |
+
"unitPrice" => [
|
71 |
+
"currency" => "EUR",
|
72 |
+
"value" => "399.00"
|
73 |
+
],
|
74 |
+
"totalAmount" => [
|
75 |
+
"currency" => "EUR",
|
76 |
+
"value" => "698.00"
|
77 |
+
],
|
78 |
+
"discountAmount" => [
|
79 |
+
"currency" => "EUR",
|
80 |
+
"value" => "100.00"
|
81 |
+
],
|
82 |
+
"vatAmount" => [
|
83 |
+
"currency" => "EUR",
|
84 |
+
"value" => "121.14"
|
85 |
+
]
|
86 |
+
],
|
87 |
+
[
|
88 |
+
"type" => "digital",
|
89 |
+
"sku" => "5702015594028",
|
90 |
+
"name" => "LEGO 42056 Porsche 911 GT3 RS",
|
91 |
+
"productUrl" => "https://shop.lego.com/nl-NL/Porsche-911-GT3-RS-42056",
|
92 |
+
"imageUrl" => 'https://sh-s7-live-s.legocdn.com/is/image/LEGO/42056?$PDPDefault$',
|
93 |
+
"quantity" => 1,
|
94 |
+
"vatRate" => "21.00",
|
95 |
+
"unitPrice" => [
|
96 |
+
"currency" => "EUR",
|
97 |
+
"value" => "329.99"
|
98 |
+
],
|
99 |
+
"totalAmount" => [
|
100 |
+
"currency" => "EUR",
|
101 |
+
"value" => "329.99"
|
102 |
+
],
|
103 |
+
"vatAmount" => [
|
104 |
+
"currency" => "EUR",
|
105 |
+
"value" => "57.27"
|
106 |
+
]
|
107 |
+
]
|
108 |
+
]
|
109 |
+
]);
|
110 |
+
|
111 |
+
/*
|
112 |
+
* Send the customer off to complete the order payment.
|
113 |
+
* This request should always be a GET, thus we enforce 303 http response code
|
114 |
+
*/
|
115 |
+
header("Location: " . $order->getCheckoutUrl(), true, 303);
|
116 |
+
} catch (\Mollie\Api\Exceptions\ApiException $e) {
|
117 |
+
echo "API call failed: " . htmlspecialchars($e->getMessage());
|
118 |
+
}
|
includes/mollie-api-php/examples/orders/list-methods.php
ADDED
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* How to get the currently activated payment methods for the Orders API.
|
4 |
+
*/
|
5 |
+
|
6 |
+
try {
|
7 |
+
/*
|
8 |
+
* Initialize the Mollie API library with your API key.
|
9 |
+
*
|
10 |
+
* See: https://www.mollie.com/dashboard/developers/api-keys
|
11 |
+
*/
|
12 |
+
require "../initialize.php";
|
13 |
+
|
14 |
+
/*
|
15 |
+
* Get all the activated methods for this API key.
|
16 |
+
* To get methods that are compatible with the Orders API
|
17 |
+
* we are passing the 'resource' parameter.
|
18 |
+
*/
|
19 |
+
$methods = $mollie->methods->all(['resource' => 'orders']);
|
20 |
+
foreach ($methods as $method) {
|
21 |
+
echo '<div style="line-height:40px; vertical-align:top">';
|
22 |
+
echo '<img src="' . htmlspecialchars($method->image->size1x) . '" srcset="' . htmlspecialchars($method->image->size2x) . ' 2x"> ';
|
23 |
+
echo htmlspecialchars($method->description) . ' (' . htmlspecialchars($method->id) . ')';
|
24 |
+
echo '</div>';
|
25 |
+
}
|
26 |
+
} catch (\Mollie\Api\Exceptions\ApiException $e) {
|
27 |
+
echo "API call failed: " . htmlspecialchars($e->getMessage());
|
28 |
+
}
|
includes/mollie-api-php/examples/orders/list-orders.php
ADDED
@@ -0,0 +1,49 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* List orders using the Mollie API.
|
4 |
+
*/
|
5 |
+
|
6 |
+
use Mollie\Api\Resources\OrderCollection;
|
7 |
+
|
8 |
+
try {
|
9 |
+
/*
|
10 |
+
* Initialize the Mollie API library with your API key or OAuth access token.
|
11 |
+
*/
|
12 |
+
require "../initialize.php";
|
13 |
+
|
14 |
+
/*
|
15 |
+
* List the most recent orders
|
16 |
+
*
|
17 |
+
* See: https://docs.mollie.com/reference/v2/orders-api/list-orders
|
18 |
+
*/
|
19 |
+
echo '<ul>';
|
20 |
+
$latestOrders = $mollie->orders->page();
|
21 |
+
printOrders($latestOrders);
|
22 |
+
|
23 |
+
$previousOrders = $latestOrders->next();
|
24 |
+
printOrders($previousOrders);
|
25 |
+
echo '</ul>';
|
26 |
+
} catch (\Mollie\Api\Exceptions\ApiException $e) {
|
27 |
+
echo "API call failed: " . htmlspecialchars($e->getMessage());
|
28 |
+
}
|
29 |
+
|
30 |
+
function printOrders($orders)
|
31 |
+
{
|
32 |
+
if (empty($orders)) {
|
33 |
+
return ;
|
34 |
+
}
|
35 |
+
|
36 |
+
foreach ($orders as $order) {
|
37 |
+
echo '<li><b>Order ' . htmlspecialchars($order->id) . ':</b> (' . htmlspecialchars($order->createdAt) . ')';
|
38 |
+
echo '<br>Status: <b>' . htmlspecialchars($order->status);
|
39 |
+
echo '<table border="1"><tr><th>Billed to</th><th>Shipped to</th><th>Total amount</th></tr>';
|
40 |
+
echo '<tr>';
|
41 |
+
echo '<td>' . htmlspecialchars($order->shippingAddress->givenName) . ' ' . htmlspecialchars($order->shippingAddress->familyName) . '</td>';
|
42 |
+
echo '<td>' . htmlspecialchars($order->billingAddress->givenName) . ' ' . htmlspecialchars($order->billingAddress->familyName) . '</td>';
|
43 |
+
echo '<td>' . htmlspecialchars($order->amount->currency) . str_replace('.', ',', htmlspecialchars($order->amount->value)) . '</td>';
|
44 |
+
echo '</tr>';
|
45 |
+
echo '</table>';
|
46 |
+
echo '<a href="'. $order->getCheckoutUrl() .'" target="_blank">Click here to pay</a>';
|
47 |
+
echo '</li>';
|
48 |
+
}
|
49 |
+
}
|
includes/mollie-api-php/examples/orders/refund-order-completely.php
ADDED
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Refund all eligible items for an order using the Mollie API.
|
4 |
+
*/
|
5 |
+
|
6 |
+
try {
|
7 |
+
/*
|
8 |
+
* Initialize the Mollie API library with your API key or OAuth access token.
|
9 |
+
*/
|
10 |
+
require "../initialize.php";
|
11 |
+
|
12 |
+
/*
|
13 |
+
* Refund all eligible items for an order with ID "ord_8wmqcHMN4U".
|
14 |
+
*
|
15 |
+
* See: https://docs.mollie.com/reference/v2/orders-api/create-order-refund
|
16 |
+
*/
|
17 |
+
|
18 |
+
$order = $mollie->orders->get('ord_8wmqcHMN4U');
|
19 |
+
$refund = $order->refundAll();
|
20 |
+
|
21 |
+
echo 'Refund ' . $refund->id . ' was created for order ' . $order->id;
|
22 |
+
echo 'You will receive ' . $refund->amount->currency . $refund->amount->value;
|
23 |
+
} catch (\Mollie\Api\Exceptions\ApiException $e) {
|
24 |
+
echo "API call failed: " . htmlspecialchars($e->getMessage());
|
25 |
+
}
|
includes/mollie-api-php/examples/orders/refund-order-partially.php
ADDED
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Refund some items for an order using the Mollie API.
|
4 |
+
*/
|
5 |
+
|
6 |
+
try {
|
7 |
+
/*
|
8 |
+
* Initialize the Mollie API library with your API key or OAuth access token.
|
9 |
+
*/
|
10 |
+
require "../initialize.php";
|
11 |
+
|
12 |
+
/*
|
13 |
+
* Refund 1 item of order line "odl_dgtxyl" for an order with ID "ord_8wmqcHMN4U".
|
14 |
+
*
|
15 |
+
* See: https://docs.mollie.com/reference/v2/orders-api/create-order-refund
|
16 |
+
*/
|
17 |
+
|
18 |
+
$order = $mollie->orders->get('ord_8wmqcHMN4U');
|
19 |
+
$refund = $order->refund([
|
20 |
+
'lines' => [
|
21 |
+
[
|
22 |
+
'id' => 'odl_dgtxyl',
|
23 |
+
'quantity' => 1,
|
24 |
+
]
|
25 |
+
],
|
26 |
+
"description" => "Required quantity not in stock, refunding one photo book.",
|
27 |
+
]);
|
28 |
+
|
29 |
+
echo 'Refund ' . $refund->id . ' was created for part of your order ' . $order->id;
|
30 |
+
echo 'You will receive ' . $refund->amount->currency . $refund->amount->value;
|
31 |
+
} catch (\Mollie\Api\Exceptions\ApiException $e) {
|
32 |
+
echo "API call failed: " . htmlspecialchars($e->getMessage());
|
33 |
+
}
|
includes/mollie-api-php/examples/orders/webhook.php
ADDED
@@ -0,0 +1,50 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Handle an order status change using the Mollie API.
|
4 |
+
*/
|
5 |
+
|
6 |
+
try {
|
7 |
+
/*
|
8 |
+
* Initialize the Mollie API library with your API key or OAuth access token.
|
9 |
+
*/
|
10 |
+
require "../initialize.php";
|
11 |
+
|
12 |
+
/*
|
13 |
+
* After your webhook has been called with the order ID in its body, you'd like
|
14 |
+
* to handle the order's status change. This is how you can do that.
|
15 |
+
*
|
16 |
+
* See: https://docs.mollie.com/reference/v2/orders-api/get-order
|
17 |
+
*/
|
18 |
+
$order = $mollie->orders->get($_POST["id"]);
|
19 |
+
$orderId = $order->metadata->order_id;
|
20 |
+
|
21 |
+
/*
|
22 |
+
* Update the order in the database.
|
23 |
+
*/
|
24 |
+
database_write($orderId, $order->status);
|
25 |
+
|
26 |
+
if ($order->isPaid() || $order->isAuthorized()) {
|
27 |
+
/*
|
28 |
+
* The order is paid or authorized
|
29 |
+
* At this point you'd probably want to start the process of delivering the product to the customer.
|
30 |
+
*/
|
31 |
+
} elseif ($order->isCanceled()) {
|
32 |
+
/*
|
33 |
+
* The order is canceled.
|
34 |
+
*/
|
35 |
+
} elseif ($order->isExpired()) {
|
36 |
+
/*
|
37 |
+
* The order is expired.
|
38 |
+
*/
|
39 |
+
} elseif ($order->isCompleted()) {
|
40 |
+
/*
|
41 |
+
* The order is completed.
|
42 |
+
*/
|
43 |
+
} elseif ($order->isPending()) {
|
44 |
+
/*
|
45 |
+
* The order is pending.
|
46 |
+
*/
|
47 |
+
}
|
48 |
+
} catch (\Mollie\Api\Exceptions\ApiException $e) {
|
49 |
+
echo "API call failed: " . htmlspecialchars($e->getMessage());
|
50 |
+
}
|
includes/mollie-api-php/examples/payments/create-ideal-payment.php
ADDED
@@ -0,0 +1,81 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* How to prepare an iDEAL payment with the Mollie API.
|
4 |
+
*/
|
5 |
+
|
6 |
+
try {
|
7 |
+
/*
|
8 |
+
* Initialize the Mollie API library with your API key.
|
9 |
+
*
|
10 |
+
* See: https://www.mollie.com/dashboard/developers/api-keys
|
11 |
+
*/
|
12 |
+
require "../initialize.php";
|
13 |
+
|
14 |
+
/*
|
15 |
+
* First, let the customer pick the bank in a simple HTML form. This step is actually optional.
|
16 |
+
*/
|
17 |
+
if ($_SERVER["REQUEST_METHOD"] != "POST") {
|
18 |
+
$method = $mollie->methods->get(\Mollie\Api\Types\PaymentMethod::IDEAL, ["include" => "issuers"]);
|
19 |
+
|
20 |
+
echo '<form method="post">Select your bank: <select name="issuer">';
|
21 |
+
|
22 |
+
foreach ($method->issuers() as $issuer) {
|
23 |
+
echo '<option value=' . htmlspecialchars($issuer->id) . '>' . htmlspecialchars($issuer->name) . '</option>';
|
24 |
+
}
|
25 |
+
|
26 |
+
echo '<option value="">or select later</option>';
|
27 |
+
echo '</select><button>OK</button></form>';
|
28 |
+
exit;
|
29 |
+
}
|
30 |
+
|
31 |
+
/*
|
32 |
+
* Generate a unique order id for this example. It is important to include this unique attribute
|
33 |
+
* in the redirectUrl (below) so a proper return page can be shown to the customer.
|
34 |
+
*/
|
35 |
+
$orderId = time();
|
36 |
+
|
37 |
+
/*
|
38 |
+
* Determine the url parts to these example files.
|
39 |
+
*/
|
40 |
+
$protocol = isset($_SERVER['HTTPS']) && strcasecmp('off', $_SERVER['HTTPS']) !== 0 ? "https" : "http";
|
41 |
+
$hostname = $_SERVER['HTTP_HOST'];
|
42 |
+
$path = dirname(isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : $_SERVER['PHP_SELF']);
|
43 |
+
|
44 |
+
/*
|
45 |
+
* Payment parameters:
|
46 |
+
* amount Amount in EUROs. This example creates a € 27.50 payment.
|
47 |
+
* method Payment method "ideal".
|
48 |
+
* description Description of the payment.
|
49 |
+
* redirectUrl Redirect location. The customer will be redirected there after the payment.
|
50 |
+
* webhookUrl Webhook location, used to report when the payment changes state.
|
51 |
+
* metadata Custom metadata that is stored with the payment.
|
52 |
+
* issuer The customer's bank. If empty the customer can select it later.
|
53 |
+
*/
|
54 |
+
$payment = $mollie->payments->create([
|
55 |
+
"amount" => [
|
56 |
+
"currency" => "EUR",
|
57 |
+
"value" => "27.50" // You must send the correct number of decimals, thus we enforce the use of strings
|
58 |
+
],
|
59 |
+
"method" => \Mollie\Api\Types\PaymentMethod::IDEAL,
|
60 |
+
"description" => "Order #{$orderId}",
|
61 |
+
"redirectUrl" => "{$protocol}://{$hostname}{$path}/payments/return.php?order_id={$orderId}",
|
62 |
+
"webhookUrl" => "{$protocol}://{$hostname}{$path}/payments/webhook.php",
|
63 |
+
"metadata" => [
|
64 |
+
"order_id" => $orderId,
|
65 |
+
],
|
66 |
+
"issuer" => !empty($_POST["issuer"]) ? $_POST["issuer"] : null
|
67 |
+
]);
|
68 |
+
|
69 |
+
/*
|
70 |
+
* In this example we store the order with its payment status in a database.
|
71 |
+
*/
|
72 |
+
database_write($orderId, $payment->status);
|
73 |
+
|
74 |
+
/*
|
75 |
+
* Send the customer off to complete the payment.
|
76 |
+
* This request should always be a GET, thus we enforce 303 http response code
|
77 |
+
*/
|
78 |
+
header("Location: " . $payment->getCheckoutUrl(), true, 303);
|
79 |
+
} catch (\Mollie\Api\Exceptions\ApiException $e) {
|
80 |
+
echo "API call failed: " . htmlspecialchars($e->getMessage());
|
81 |
+
}
|
includes/mollie-api-php/examples/payments/create-payment-oauth.php
ADDED
@@ -0,0 +1,67 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Example 10 - Using OAuth access token to prepare a new payment.
|
4 |
+
*/
|
5 |
+
try
|
6 |
+
{
|
7 |
+
/*
|
8 |
+
* Initialize the Mollie API library with your OAuth access token.
|
9 |
+
*/
|
10 |
+
require "../initialize_with_oauth.php";
|
11 |
+
/*
|
12 |
+
* Generate a unique order id for this example. It is important to include this unique attribute
|
13 |
+
* in the redirectUrl (below) so a proper return page can be shown to the customer.
|
14 |
+
*/
|
15 |
+
$orderId = time();
|
16 |
+
/*
|
17 |
+
* Determine the url parts to these example files.
|
18 |
+
*/
|
19 |
+
$protocol = isset($_SERVER['HTTPS']) && strcasecmp('off', $_SERVER['HTTPS']) !== 0 ? "https" : "http";
|
20 |
+
$hostname = $_SERVER['HTTP_HOST'] ? : "my.app";
|
21 |
+
$path = dirname(isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : $_SERVER['PHP_SELF']);
|
22 |
+
/*
|
23 |
+
* Since unlike an API key the OAuth access token does NOT belong to a profile, we need to retrieve a profile
|
24 |
+
* so we can specify the profileId-parameter when creating a payment below.
|
25 |
+
*/
|
26 |
+
$profiles = $mollie->profiles->page();
|
27 |
+
$profile = reset($profiles);
|
28 |
+
|
29 |
+
/**
|
30 |
+
* Paramaters for creating a payment via oAuth
|
31 |
+
*
|
32 |
+
* @See https://docs.mollie.com/reference/v2/payments-api/create-payment
|
33 |
+
*/
|
34 |
+
$payment = $mollie->payments->create([
|
35 |
+
"amount" => [
|
36 |
+
"value" => "10.00",
|
37 |
+
"currency" => "EUR"
|
38 |
+
],
|
39 |
+
"description" => "My first API payment",
|
40 |
+
"redirectUrl" => "{$protocol}://{$hostname}{$path}/payments/return.php?order_id={$orderId}",
|
41 |
+
"webhookUrl" => "{$protocol}://{$hostname}{$path}/payments/webhook.php",
|
42 |
+
"metadata" => [
|
43 |
+
"order_id" => $orderId,
|
44 |
+
],
|
45 |
+
"profileId" => $profile->id // This is specifically necessary for payment resources via OAuth access.
|
46 |
+
]);
|
47 |
+
|
48 |
+
/*
|
49 |
+
* In this example we store the order with its payment status in a database.
|
50 |
+
*/
|
51 |
+
database_write($orderId, $payment->status);
|
52 |
+
|
53 |
+
/*
|
54 |
+
* Send the customer off to complete the payment.
|
55 |
+
* This request should always be a GET, thus we enforce 303 http response code
|
56 |
+
*/
|
57 |
+
if (PHP_SAPI === "cli")
|
58 |
+
{
|
59 |
+
echo "Redirect to: " . $payment->getCheckoutUrl() . PHP_EOL;
|
60 |
+
return;
|
61 |
+
}
|
62 |
+
header("Location: " . $payment->getCheckoutUrl(), true, 303);
|
63 |
+
}
|
64 |
+
catch (\Mollie\Api\Exceptions\ApiException $e)
|
65 |
+
{
|
66 |
+
echo "API call failed: " . htmlspecialchars($e->getMessage());
|
67 |
+
}
|
includes/mollie-api-php/examples/payments/create-payment.php
ADDED
@@ -0,0 +1,60 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* How to prepare a new payment with the Mollie API.
|
4 |
+
*/
|
5 |
+
|
6 |
+
try {
|
7 |
+
/*
|
8 |
+
* Initialize the Mollie API library with your API key.
|
9 |
+
*
|
10 |
+
* See: https://www.mollie.com/dashboard/developers/api-keys
|
11 |
+
*/
|
12 |
+
require "../initialize.php";
|
13 |
+
|
14 |
+
/*
|
15 |
+
* Generate a unique order id for this example. It is important to include this unique attribute
|
16 |
+
* in the redirectUrl (below) so a proper return page can be shown to the customer.
|
17 |
+
*/
|
18 |
+
$orderId = time();
|
19 |
+
|
20 |
+
/*
|
21 |
+
* Determine the url parts to these example files.
|
22 |
+
*/
|
23 |
+
$protocol = isset($_SERVER['HTTPS']) && strcasecmp('off', $_SERVER['HTTPS']) !== 0 ? "https" : "http";
|
24 |
+
$hostname = $_SERVER['HTTP_HOST'];
|
25 |
+
$path = dirname(isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : $_SERVER['PHP_SELF']);
|
26 |
+
|
27 |
+
/*
|
28 |
+
* Payment parameters:
|
29 |
+
* amount Amount in EUROs. This example creates a € 10,- payment.
|
30 |
+
* description Description of the payment.
|
31 |
+
* redirectUrl Redirect location. The customer will be redirected there after the payment.
|
32 |
+
* webhookUrl Webhook location, used to report when the payment changes state.
|
33 |
+
* metadata Custom metadata that is stored with the payment.
|
34 |
+
*/
|
35 |
+
$payment = $mollie->payments->create([
|
36 |
+
"amount" => [
|
37 |
+
"currency" => "EUR",
|
38 |
+
"value" => "10.00" // You must send the correct number of decimals, thus we enforce the use of strings
|
39 |
+
],
|
40 |
+
"description" => "Order #{$orderId}",
|
41 |
+
"redirectUrl" => "{$protocol}://{$hostname}{$path}/payments/return.php?order_id={$orderId}",
|
42 |
+
"webhookUrl" => "{$protocol}://{$hostname}{$path}/payments/webhook.php",
|
43 |
+
"metadata" => [
|
44 |
+
"order_id" => $orderId,
|
45 |
+
],
|
46 |
+
]);
|
47 |
+
|
48 |
+
/*
|
49 |
+
* In this example we store the order with its payment status in a database.
|
50 |
+
*/
|
51 |
+
database_write($orderId, $payment->status);
|
52 |
+
|
53 |
+
/*
|
54 |
+
* Send the customer off to complete the payment.
|
55 |
+
* This request should always be a GET, thus we enforce 303 http response code
|
56 |
+
*/
|
57 |
+
header("Location: " . $payment->getCheckoutUrl(), true, 303);
|
58 |
+
} catch (\Mollie\Api\Exceptions\ApiException $e) {
|
59 |
+
echo "API call failed: " . htmlspecialchars($e->getMessage());
|
60 |
+
}
|
includes/mollie-api-php/examples/payments/list-methods.php
ADDED
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* How to get the currently activated payment methods for the Payments API.
|
4 |
+
*/
|
5 |
+
|
6 |
+
try {
|
7 |
+
/*
|
8 |
+
* Initialize the Mollie API library with your API key.
|
9 |
+
*
|
10 |
+
* See: https://www.mollie.com/dashboard/developers/api-keys
|
11 |
+
*/
|
12 |
+
require "../initialize.php";
|
13 |
+
/*
|
14 |
+
* Get all the activated methods for this API key.
|
15 |
+
* By default we are using the resource "payments".
|
16 |
+
* See the orders folder for an example with the Orders API.
|
17 |
+
*/
|
18 |
+
$methods = $mollie->methods->all();
|
19 |
+
foreach ($methods as $method) {
|
20 |
+
echo '<div style="line-height:40px; vertical-align:top">';
|
21 |
+
echo '<img src="' . htmlspecialchars($method->image->size1x) . '" srcset="' . htmlspecialchars($method->image->size2x) . ' 2x"> ';
|
22 |
+
echo htmlspecialchars($method->description) . ' (' . htmlspecialchars($method->id) . ')';
|
23 |
+
echo '</div>';
|
24 |
+
}
|
25 |
+
} catch (\Mollie\Api\Exceptions\ApiException $e) {
|
26 |
+
echo "API call failed: " . htmlspecialchars($e->getMessage());
|
27 |
+
}
|
includes/mollie-api-php/examples/payments/list-payments.php
ADDED
@@ -0,0 +1,85 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* How to list your payments.
|
4 |
+
*/
|
5 |
+
|
6 |
+
try {
|
7 |
+
/*
|
8 |
+
* Initialize the Mollie API library with your API key.
|
9 |
+
*
|
10 |
+
* See: https://www.mollie.com/dashboard/developers/api-keys
|
11 |
+
*/
|
12 |
+
require "../initialize.php";
|
13 |
+
|
14 |
+
/*
|
15 |
+
* Determine the url parts to these example files.
|
16 |
+
*/
|
17 |
+
$protocol = isset($_SERVER['HTTPS']) && strcasecmp('off', $_SERVER['HTTPS']) !== 0 ? "https" : "http";
|
18 |
+
$hostname = $_SERVER['HTTP_HOST'];
|
19 |
+
$path = dirname(isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : $_SERVER['PHP_SELF']);
|
20 |
+
|
21 |
+
/*
|
22 |
+
* Get the all payments for this API key ordered by newest.
|
23 |
+
*/
|
24 |
+
$payments = $mollie->payments->page();
|
25 |
+
|
26 |
+
echo "<ul>";
|
27 |
+
foreach ($payments as $payment) {
|
28 |
+
echo "<li>";
|
29 |
+
echo "<strong style='font-family: monospace'>" . htmlspecialchars($payment->id) . "</strong><br />";
|
30 |
+
echo htmlspecialchars($payment->description) . "<br />";
|
31 |
+
echo htmlspecialchars($payment->amount->currency) . " " . htmlspecialchars($payment->amount->value) . "<br />";
|
32 |
+
|
33 |
+
echo "Status: " . htmlspecialchars($payment->status) . "<br />";
|
34 |
+
|
35 |
+
if ($payment->hasRefunds()) {
|
36 |
+
echo "Payment has been (partially) refunded.<br />";
|
37 |
+
}
|
38 |
+
|
39 |
+
if ($payment->hasChargebacks()) {
|
40 |
+
echo "Payment has been charged back.<br />";
|
41 |
+
}
|
42 |
+
|
43 |
+
if ($payment->canBeRefunded() && $payment->amountRemaining->currency === 'EUR' && $payment->amountRemaining->value >= '2.00') {
|
44 |
+
echo " (<a href=\"{$protocol}://{$hostname}{$path}/payments/refund-payment.php?payment_id=" . htmlspecialchars($payment->id) . "\">refund</a>)";
|
45 |
+
}
|
46 |
+
|
47 |
+
echo "</li>";
|
48 |
+
}
|
49 |
+
echo "</ul>";
|
50 |
+
|
51 |
+
/**
|
52 |
+
* Get the next set of Payments if applicable
|
53 |
+
*/
|
54 |
+
$nextPayments = $payments->next();
|
55 |
+
|
56 |
+
if (!empty($nextPayments)) {
|
57 |
+
echo "<ul>";
|
58 |
+
foreach ($nextPayments as $payment) {
|
59 |
+
echo "<li>";
|
60 |
+
echo "<strong style='font-family: monospace'>" . htmlspecialchars($payment->id) . "</strong><br />";
|
61 |
+
echo htmlspecialchars($payment->description) . "<br />";
|
62 |
+
echo htmlspecialchars($payment->amount->currency) . " " . htmlspecialchars($payment->amount->value) . "<br />";
|
63 |
+
|
64 |
+
echo "Status: " . htmlspecialchars($payment->status) . "<br />";
|
65 |
+
|
66 |
+
if ($payment->hasRefunds()) {
|
67 |
+
echo "Payment has been (partially) refunded.<br />";
|
68 |
+
}
|
69 |
+
|
70 |
+
if ($payment->hasChargebacks()) {
|
71 |
+
echo "Payment has been charged back.<br />";
|
72 |
+
}
|
73 |
+
|
74 |
+
if ($payment->canBeRefunded() && $payment->amountRemaining->currency === 'EUR' && $payment->amountRemaining->value >= '2.00') {
|
75 |
+
echo " (<a href=\"{$protocol}://{$hostname}{$path}/payments/refund-payment.php?payment_id=" . htmlspecialchars($payment->id) . "\">refund</a>)";
|
76 |
+
}
|
77 |
+
|
78 |
+
echo "</li>";
|
79 |
+
}
|
80 |
+
echo "</ul>";
|
81 |
+
}
|
82 |
+
|
83 |
+
} catch (\Mollie\Api\Exceptions\ApiException $e) {
|
84 |
+
echo "API call failed: " . htmlspecialchars($e->getMessage());
|
85 |
+
}
|
includes/mollie-api-php/examples/payments/refund-payment.php
ADDED
@@ -0,0 +1,71 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* How to refund a payment programmatically
|
4 |
+
*/
|
5 |
+
|
6 |
+
try {
|
7 |
+
/*
|
8 |
+
* Initialize the Mollie API library with your API key.
|
9 |
+
*
|
10 |
+
* See: https://www.mollie.com/dashboard/developers/api-keys
|
11 |
+
*/
|
12 |
+
require "../initialize.php";
|
13 |
+
|
14 |
+
/*
|
15 |
+
* Determine the url parts to these example files.
|
16 |
+
*/
|
17 |
+
$protocol = isset($_SERVER['HTTPS']) && strcasecmp('off', $_SERVER['HTTPS']) !== 0 ? "https" : "http";
|
18 |
+
$hostname = $_SERVER['HTTP_HOST'];
|
19 |
+
$path = dirname(isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : $_SERVER['PHP_SELF']);
|
20 |
+
|
21 |
+
if (isset($_GET['payment_id'])) {
|
22 |
+
/*
|
23 |
+
* Retrieve the payment you want to refund from the API.
|
24 |
+
*/
|
25 |
+
$paymentId = $_GET['payment_id'];
|
26 |
+
$payment = $mollie->payments->get($paymentId);
|
27 |
+
|
28 |
+
if ($payment->canBeRefunded() && $payment->amountRemaining->currency === 'EUR' && $payment->amountRemaining->value >= '2.00') {
|
29 |
+
/*
|
30 |
+
* Refund € 2,00 of the payment.
|
31 |
+
*
|
32 |
+
* https://docs.mollie.com/reference/v2/refunds-api/create-refund
|
33 |
+
*/
|
34 |
+
$refund = $payment->refund([
|
35 |
+
"amount" => [
|
36 |
+
"currency" => "EUR",
|
37 |
+
"value" => "2.00" // You must send the correct number of decimals, thus we enforce the use of strings
|
38 |
+
]
|
39 |
+
]);
|
40 |
+
|
41 |
+
echo "{$refund->amount->currency} {$refund->amount->value} of payment {$paymentId} refunded.", PHP_EOL;
|
42 |
+
} else {
|
43 |
+
echo "Payment {$paymentId} can not be refunded.", PHP_EOL;
|
44 |
+
}
|
45 |
+
|
46 |
+
/*
|
47 |
+
* Retrieve all refunds on a payment.
|
48 |
+
*/
|
49 |
+
echo "<ul>";
|
50 |
+
foreach ($payment->refunds() as $refund) {
|
51 |
+
echo "<li>";
|
52 |
+
echo "<strong style='font-family: monospace'>" . htmlspecialchars($refund->id) . "</strong><br />";
|
53 |
+
echo htmlspecialchars($refund->description) . "<br />";
|
54 |
+
echo htmlspecialchars($refund->amount->currency) . " " . htmlspecialchars($refund->amount->value) . "<br />";
|
55 |
+
echo "Status: " . htmlspecialchars($refund->status);
|
56 |
+
echo "</li>";
|
57 |
+
}
|
58 |
+
echo "</ul>";
|
59 |
+
}
|
60 |
+
|
61 |
+
echo "Refund payment: ";
|
62 |
+
echo "<form method='get'><input name='payment_id' value='tr_xxx'/><input type='submit' /></form>";
|
63 |
+
|
64 |
+
echo "<p>";
|
65 |
+
echo '<a href="' . $protocol . '://' . $hostname . $path . '/payments/create-payment.php">Create a payment</a><br>';
|
66 |
+
echo '<a href="' . $protocol . '://' . $hostname . $path . '/payments/create-ideal-payment.php">Create an iDEAL payment</a><br>';
|
67 |
+
echo '<a href="' . $protocol . '://' . $hostname . $path . '/payments/list-payments.php">List payments</a><br>';
|
68 |
+
echo "</p>";
|
69 |
+
} catch (\Mollie\Api\Exceptions\ApiException $e) {
|
70 |
+
echo "API call failed: " . htmlspecialchars($e->getMessage());
|
71 |
+
}
|
includes/mollie-api-php/examples/payments/return.php
ADDED
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* How to show a return page to the customer.
|
4 |
+
*
|
5 |
+
* In this example we retrieve the order stored in the database.
|
6 |
+
* Here, it's unnecessary to use the Mollie API Client.
|
7 |
+
*/
|
8 |
+
|
9 |
+
/*
|
10 |
+
* NOTE: The examples are using a text file as a database.
|
11 |
+
* Please use a real database like MySQL in production code.
|
12 |
+
*/
|
13 |
+
require_once "../functions.php";
|
14 |
+
|
15 |
+
$status = database_read($_GET["order_id"]);
|
16 |
+
|
17 |
+
/*
|
18 |
+
* Determine the url parts to these example files.
|
19 |
+
*/
|
20 |
+
$protocol = isset($_SERVER['HTTPS']) && strcasecmp('off', $_SERVER['HTTPS']) !== 0 ? "https" : "http";
|
21 |
+
$hostname = $_SERVER['HTTP_HOST'];
|
22 |
+
$path = dirname(isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : $_SERVER['PHP_SELF']);
|
23 |
+
|
24 |
+
echo "<p>Your payment status is '" . htmlspecialchars($status) . "'.</p>";
|
25 |
+
echo "<p>";
|
26 |
+
echo '<a href="' . $protocol . '://' . $hostname . $path . '/payments/create-payment.php">Create a payment</a><br>';
|
27 |
+
echo '<a href="' . $protocol . '://' . $hostname . $path . '/payments/create-ideal-payment.php">Create an iDEAL payment</a><br>';
|
28 |
+
echo '<a href="' . $protocol . '://' . $hostname . $path . '/payments/list-payments.php">List payments</a><br>';
|
29 |
+
echo "</p>";
|
includes/mollie-api-php/examples/payments/webhook.php
ADDED
@@ -0,0 +1,65 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* How to verify Mollie API Payments in a webhook.
|
4 |
+
*
|
5 |
+
* See: https://docs.mollie.com/guides/webhooks
|
6 |
+
*/
|
7 |
+
|
8 |
+
try {
|
9 |
+
/*
|
10 |
+
* Initialize the Mollie API library with your API key.
|
11 |
+
*
|
12 |
+
* See: https://www.mollie.com/dashboard/developers/api-keys
|
13 |
+
*/
|
14 |
+
require "../initialize.php";
|
15 |
+
|
16 |
+
/*
|
17 |
+
* Retrieve the payment's current state.
|
18 |
+
*/
|
19 |
+
$payment = $mollie->payments->get($_POST["id"]);
|
20 |
+
$orderId = $payment->metadata->order_id;
|
21 |
+
|
22 |
+
/*
|
23 |
+
* Update the order in the database.
|
24 |
+
*/
|
25 |
+
database_write($orderId, $payment->status);
|
26 |
+
|
27 |
+
if ($payment->isPaid() && !$payment->hasRefunds() && !$payment->hasChargebacks()) {
|
28 |
+
/*
|
29 |
+
* The payment is paid and isn't refunded or charged back.
|
30 |
+
* At this point you'd probably want to start the process of delivering the product to the customer.
|
31 |
+
*/
|
32 |
+
} elseif ($payment->isOpen()) {
|
33 |
+
/*
|
34 |
+
* The payment is open.
|
35 |
+
*/
|
36 |
+
} elseif ($payment->isPending()) {
|
37 |
+
/*
|
38 |
+
* The payment is pending.
|
39 |
+
*/
|
40 |
+
} elseif ($payment->isFailed()) {
|
41 |
+
/*
|
42 |
+
* The payment has failed.
|
43 |
+
*/
|
44 |
+
} elseif ($payment->isExpired()) {
|
45 |
+
/*
|
46 |
+
* The payment is expired.
|
47 |
+
*/
|
48 |
+
} elseif ($payment->isCanceled()) {
|
49 |
+
/*
|
50 |
+
* The payment has been canceled.
|
51 |
+
*/
|
52 |
+
} elseif ($payment->hasRefunds()) {
|
53 |
+
/*
|
54 |
+
* The payment has been (partially) refunded.
|
55 |
+
* The status of the payment is still "paid"
|
56 |
+
*/
|
57 |
+
} elseif ($payment->hasChargebacks()) {
|
58 |
+
/*
|
59 |
+
* The payment has been (partially) charged back.
|
60 |
+
* The status of the payment is still "paid"
|
61 |
+
*/
|
62 |
+
}
|
63 |
+
} catch (\Mollie\Api\Exceptions\ApiException $e) {
|
64 |
+
echo "API call failed: " . htmlspecialchars($e->getMessage());
|
65 |
+
}
|
includes/mollie-api-php/examples/profiles/create-profile.php
ADDED
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Create a profile via the Mollie API.
|
4 |
+
*/
|
5 |
+
try
|
6 |
+
{
|
7 |
+
/*
|
8 |
+
* Initialize the Mollie API library with your API key or OAuth access token.
|
9 |
+
*/
|
10 |
+
require "../initialize_with_oauth.php";
|
11 |
+
|
12 |
+
/**
|
13 |
+
* Create the profile
|
14 |
+
*
|
15 |
+
* @See https://docs.mollie.com/reference/v2/profiles-api/create-profile
|
16 |
+
*/
|
17 |
+
$profile = $mollie->profiles->create([
|
18 |
+
"name" => "My website name",
|
19 |
+
"website" => "https://www.mywebsite.com",
|
20 |
+
"email" => "info@mywebsite.com",
|
21 |
+
"phone" => "+31208202070",
|
22 |
+
"categoryCode" => 5399,
|
23 |
+
"mode" => "live",
|
24 |
+
]);
|
25 |
+
echo "<p>Profile created: " . htmlspecialchars($profile->name) . "</p>";
|
26 |
+
}
|
27 |
+
catch (\Mollie\Api\Exceptions\ApiException $e)
|
28 |
+
{
|
29 |
+
echo "<p>API call failed: " . htmlspecialchars($e->getMessage()) . "</p>";
|
30 |
+
}
|
includes/mollie-api-php/examples/profiles/delete-profile.php
ADDED
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Delete a profile via the Mollie API.
|
4 |
+
*/
|
5 |
+
try
|
6 |
+
{
|
7 |
+
/*
|
8 |
+
* Initialize the Mollie API library with your API key or OAuth access token.
|
9 |
+
*/
|
10 |
+
require "../initialize_with_oauth.php";
|
11 |
+
|
12 |
+
/**
|
13 |
+
* Delete a profile via the profileId
|
14 |
+
*
|
15 |
+
* @See https://docs.mollie.com/reference/v2/profiles-api/delete-profile
|
16 |
+
*/
|
17 |
+
$profile = $mollie->profiles->delete("pfl_v9hTwCvYqw");
|
18 |
+
echo "<p>Profile deleted</p>";
|
19 |
+
}
|
20 |
+
catch (\Mollie\Api\Exceptions\ApiException $e)
|
21 |
+
{
|
22 |
+
echo "<p>API call failed: " . htmlspecialchars($e->getMessage()) . "</p>";
|
23 |
+
}
|
includes/mollie-api-php/examples/profiles/list-profiles.php
ADDED
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Using OAuth access token to list profiles of an account.
|
4 |
+
*/
|
5 |
+
try
|
6 |
+
{
|
7 |
+
/*
|
8 |
+
* Initialize the Mollie API library with your OAuth access token.
|
9 |
+
*/
|
10 |
+
require "../initialize_with_oauth.php";
|
11 |
+
|
12 |
+
/*
|
13 |
+
* Get the all the profiles for this account.
|
14 |
+
*/
|
15 |
+
$profiles = $mollie->profiles->page();
|
16 |
+
foreach ($profiles as $profile)
|
17 |
+
{
|
18 |
+
echo '<div style="line-height:40px; vertical-align:top">';
|
19 |
+
echo htmlspecialchars($profile->name) .
|
20 |
+
' - ' . htmlspecialchars($profile->website) .
|
21 |
+
' (' . htmlspecialchars($profile->id) . ')';
|
22 |
+
echo '</div>';
|
23 |
+
}
|
24 |
+
}
|
25 |
+
catch (\Mollie\Api\Exceptions\ApiException $e)
|
26 |
+
{
|
27 |
+
echo "API call failed: " . htmlspecialchars($e->getMessage());
|
28 |
+
}
|
includes/mollie-api-php/examples/profiles/update-profile.php
ADDED
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Updating an existing profile via the Mollie API.
|
4 |
+
*/
|
5 |
+
try
|
6 |
+
{
|
7 |
+
/*
|
8 |
+
* Initialize the Mollie API library with your API key or OAuth access token.
|
9 |
+
*/
|
10 |
+
require "../initialize_with_oauth.php";
|
11 |
+
|
12 |
+
/*
|
13 |
+
* Retrieve an existing profile by his profileId
|
14 |
+
*/
|
15 |
+
$profile = $mollie->profiles->get("pfl_eA4MSz7Bvy");
|
16 |
+
|
17 |
+
/**
|
18 |
+
* Profile fields that can be updated.
|
19 |
+
*
|
20 |
+
* @See https://docs.mollie.com/reference/v2/profiles-api/update-profile
|
21 |
+
*/
|
22 |
+
$profile->name = "Mollie B.V.";
|
23 |
+
$profile->website = 'www.mollie.com';
|
24 |
+
$profile->email = 'info@mollie.com';
|
25 |
+
$profile->phone = '0612345670';
|
26 |
+
$profile->categoryCode = 5399;
|
27 |
+
$profile->update();
|
28 |
+
echo "<p>Profile updated: " . htmlspecialchars($profile->name) . "</p>";
|
29 |
+
}
|
30 |
+
catch (\Mollie\Api\Exceptions\ApiException $e)
|
31 |
+
{
|
32 |
+
echo "<p>API call failed: " . htmlspecialchars($e->getMessage()) . "</p>";
|
33 |
+
}
|
includes/mollie-api-php/examples/settlements/list-settlements.php
ADDED
@@ -0,0 +1,53 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Using OAuth access token to list settlements of an account.
|
4 |
+
*/
|
5 |
+
|
6 |
+
try {
|
7 |
+
/*
|
8 |
+
* Initialize the Mollie API library with your OAuth access token.
|
9 |
+
*/
|
10 |
+
require "../initialize_with_oauth.php";
|
11 |
+
|
12 |
+
/*
|
13 |
+
* Get the all the settlements for this account.
|
14 |
+
*/
|
15 |
+
$settlements = $mollie->settlements->page();
|
16 |
+
echo '<ul>';
|
17 |
+
foreach ($settlements as $settlement) {
|
18 |
+
echo '<li><b>Settlement ' . htmlspecialchars($settlement->reference) . ':</b> (' . htmlspecialchars($settlement->createdAt) . ')';
|
19 |
+
echo '<table border="1"><tr><th>Month</th><th>Description</th><th>Count</th><th>Net</th><th>VAT</th><th>Gross</th></tr>';
|
20 |
+
// Convert from stdClass to array
|
21 |
+
$settlement_periods = json_decode(json_encode($settlement->periods), TRUE);
|
22 |
+
foreach ($settlement_periods as $year => $months) {
|
23 |
+
foreach ($months as $month => $monthly_settlement) {
|
24 |
+
foreach ($monthly_settlement['revenue'] as $revenue) {
|
25 |
+
echo '<tr>';
|
26 |
+
echo '<td>' . htmlspecialchars($year . '-' . $month) . '</td>';
|
27 |
+
echo '<td>' . htmlspecialchars($revenue['description']) . '</td>';
|
28 |
+
echo '<td align="right">' . htmlspecialchars($revenue['count']) . ' x</td>';
|
29 |
+
echo '<td align="right">' . htmlspecialchars($revenue['amountNet']['value'] ? $revenue['amountNet']['value'] . " " . $revenue['amountNet']['currency'] : '-') . '</td>';
|
30 |
+
echo '<td align="right">' . htmlspecialchars($revenue['amountVat']['value'] ? $revenue['amountVat']['value'] . " " . $revenue['amountVat']['currency'] : '-') . '</td>';
|
31 |
+
echo '<td align="right">' . htmlspecialchars($revenue['amountGross']['value'] ? $revenue['amountGross']['value'] . " " . $revenue['amountGross']['currency'] : '-') . '</td>';
|
32 |
+
echo '</tr>';
|
33 |
+
}
|
34 |
+
foreach ($monthly_settlement['costs'] as $revenue) {
|
35 |
+
echo '<tr>';
|
36 |
+
echo '<td>' . htmlspecialchars($year . '-' . $month) . '</td>';
|
37 |
+
echo '<td>' . htmlspecialchars($revenue['description']) . '</td>';
|
38 |
+
echo '<td align="right">' . htmlspecialchars($revenue['count']) . ' x</td>';
|
39 |
+
echo '<td align="right">' . htmlspecialchars($revenue['amountNet']['value'] ? $revenue['amountNet']['value'] . " " . $revenue['amountNet']['currency'] : '-') . '</td>';
|
40 |
+
echo '<td align="right">' . htmlspecialchars($revenue['amountVat']['value'] ? $revenue['amountVat']['value'] . " " . $revenue['amountVat']['currency'] : '-') . '</td>';
|
41 |
+
echo '<td align="right">' . htmlspecialchars($revenue['amountGross']['value'] ? $revenue['amountGross']['value'] . " " . $revenue['amountGross']['currency'] : '-') . '</td>';
|
42 |
+
echo '</tr>';
|
43 |
+
}
|
44 |
+
}
|
45 |
+
}
|
46 |
+
echo '<tr><th colspan="5" align="right">TOTAL</th><th align="right">' . htmlspecialchars($settlement->amount->value . " " . $settlement->amount->currency) . '</th></tr>';
|
47 |
+
echo '</table>';
|
48 |
+
echo '</li>';
|
49 |
+
}
|
50 |
+
echo '</ul>';
|
51 |
+
} catch (\Mollie\Api\Exceptions\ApiException $e) {
|
52 |
+
echo "API call failed: " . htmlspecialchars($e->getMessage());
|
53 |
+
}
|
includes/mollie-api-php/examples/shipments/create-shipment-all.php
ADDED
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Create a shipment for an entire order using the Mollie API.
|
4 |
+
*/
|
5 |
+
|
6 |
+
try {
|
7 |
+
/*
|
8 |
+
* Initialize the Mollie API library with your API key or OAuth access token.
|
9 |
+
*/
|
10 |
+
require "../initialize.php";
|
11 |
+
|
12 |
+
/*
|
13 |
+
* Create a shipment for the entire order with ID "ord_8wmqcHMN4U"
|
14 |
+
*
|
15 |
+
* See: https://docs.mollie.com/reference/v2/shipments-api/create-shipment
|
16 |
+
*/
|
17 |
+
|
18 |
+
$order = $mollie->orders->get('ord_8wmqcHMN4U');
|
19 |
+
$shipment = $order->shipAll();
|
20 |
+
|
21 |
+
echo 'A shipment with ID ' . $shipment->id. ' has been created for your order with ID ' . $order->id . '.';
|
22 |
+
foreach ($shipment->lines as $line) {
|
23 |
+
echo $line->name . ' - status: <b>' . $line->status . '</b>.';
|
24 |
+
}
|
25 |
+
} catch (\Mollie\Api\Exceptions\ApiException $e) {
|
26 |
+
echo "API call failed: " . htmlspecialchars($e->getMessage());
|
27 |
+
}
|
includes/mollie-api-php/examples/shipments/create-shipment-partial.php
ADDED
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Example 32 - Create a shipment for part of an order using the Mollie API.
|
4 |
+
*/
|
5 |
+
|
6 |
+
try {
|
7 |
+
/*
|
8 |
+
* Initialize the Mollie API library with your API key or OAuth access token.
|
9 |
+
*/
|
10 |
+
require "./initialize.php";
|
11 |
+
|
12 |
+
/*
|
13 |
+
* Create a shipment for only two lines of the order with ID "ord_8wmqcHMN4U".
|
14 |
+
*
|
15 |
+
* See: https://docs.mollie.com/reference/v2/shipments-api/create-shipment
|
16 |
+
*/
|
17 |
+
|
18 |
+
$order = $this->getOrder('ord_8wmqcHMN4U');
|
19 |
+
$lineId1 = $order->lines()[0]->id;
|
20 |
+
$lineId2 = $order->lines()[1]->id;
|
21 |
+
$shipment = $order->createShipment(
|
22 |
+
[
|
23 |
+
'lines' => [
|
24 |
+
[
|
25 |
+
'id' => $lineId1,
|
26 |
+
// assume all is shipped if no quantity is specified
|
27 |
+
],
|
28 |
+
[
|
29 |
+
'id' => $lineId2,
|
30 |
+
'quantity' => 1, // you can set the quantity if not all is shipped at once
|
31 |
+
],
|
32 |
+
],
|
33 |
+
]
|
34 |
+
);
|
35 |
+
|
36 |
+
echo 'A shipment with ID ' . $shipment->id. ' has been created for your order with ID ' . $order->id . '.';
|
37 |
+
foreach ($shipment->lines as $line) {
|
38 |
+
echo $line->name . '- status: <b>' . $line->status . '</b>.';
|
39 |
+
}
|
40 |
+
} catch (\Mollie\Api\Exceptions\ApiException $e) {
|
41 |
+
echo "API call failed: " . htmlspecialchars($e->getMessage());
|
42 |
+
}
|
includes/mollie-api-php/examples/shipments/get-shipment.php
ADDED
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Retrieve a shipment using the Mollie API.
|
4 |
+
*/
|
5 |
+
|
6 |
+
try {
|
7 |
+
/*
|
8 |
+
* Initialize the Mollie API library with your API key or OAuth access token.
|
9 |
+
*/
|
10 |
+
require "../initialize.php";
|
11 |
+
|
12 |
+
/*
|
13 |
+
* Retrieve a shipment with ID "shp_3wmsgCJN4U" for the order with ID "ord_8wmqcHMN4U".
|
14 |
+
*
|
15 |
+
* See: https://docs.mollie.com/reference/v2/shipments-api/get-shipment
|
16 |
+
*/
|
17 |
+
|
18 |
+
$order = $mollie->orders->get('ord_8wmqcHMN4U');
|
19 |
+
$shipment = $order->getShipment("shp_3wmsgCJN4U");
|
20 |
+
|
21 |
+
echo 'Shipment with ID ' . $shipment->id. ' for order with ID ' . $order->id . '.';
|
22 |
+
foreach ($shipment->lines as $line) {
|
23 |
+
echo $line->name . ' - status: <b>' . $line->status . '</b>.';
|
24 |
+
}
|
25 |
+
} catch (\Mollie\Api\Exceptions\ApiException $e) {
|
26 |
+
echo "API call failed: " . htmlspecialchars($e->getMessage());
|
27 |
+
}
|
includes/mollie-api-php/examples/shipments/list-shipments.php
ADDED
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* List shipment for an order using the Mollie API.
|
4 |
+
*/
|
5 |
+
|
6 |
+
try {
|
7 |
+
/*
|
8 |
+
* Initialize the Mollie API library with your API key or OAuth access token.
|
9 |
+
*/
|
10 |
+
require "../initialize.php";
|
11 |
+
|
12 |
+
/*
|
13 |
+
* Listing shipments for the order with ID "ord_8wmqcHMN4U".
|
14 |
+
*
|
15 |
+
* See: https://docs.mollie.com/reference/v2/shipments-api/get-shipment
|
16 |
+
*/
|
17 |
+
|
18 |
+
$order = $mollie->orders->get('ord_8wmqcHMN4U');
|
19 |
+
$shipments = $order->shipments();
|
20 |
+
|
21 |
+
echo 'Shipments for order with ID ' . $order->id . ':';
|
22 |
+
foreach ($shipments as $shipment) {
|
23 |
+
echo 'Shipment ' . $shipment->id . '. Items:';
|
24 |
+
foreach ($shipment->lines as $line) {
|
25 |
+
echo $line->name . ' - status: <b>' . $line->status . '</b>.';
|
26 |
+
}
|
27 |
+
}
|
28 |
+
} catch (\Mollie\Api\Exceptions\ApiException $e) {
|
29 |
+
echo "API call failed: " . htmlspecialchars($e->getMessage());
|
30 |
+
}
|
includes/mollie-api-php/examples/shipments/update-shipment.php
ADDED
@@ -0,0 +1,40 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Update shipment tracking information using the Mollie API.
|
4 |
+
*/
|
5 |
+
|
6 |
+
try {
|
7 |
+
/*
|
8 |
+
* Initialize the Mollie API library with your API key or OAuth access token.
|
9 |
+
*/
|
10 |
+
require "../initialize.php";
|
11 |
+
|
12 |
+
/*
|
13 |
+
* Update the tracking information for a shipment with ID "shp_3wmsgCJN4U" and
|
14 |
+
* order ID "ord_8wmqcHMN4U"
|
15 |
+
*
|
16 |
+
* See: https://docs.mollie.com/reference/v2/shipments-api/update-shipment
|
17 |
+
*/
|
18 |
+
|
19 |
+
$order = $mollie->orders->get('ord_8wmqcHMN4U');
|
20 |
+
$shipment = $order->getShipment("shp_3wmsgCJN4U");
|
21 |
+
|
22 |
+
$shipment->tracking = [
|
23 |
+
'carrier' => 'PostNL',
|
24 |
+
'code' => '3SKABA000000000',
|
25 |
+
'url' => 'http://postnl.nl/tracktrace/?B=3SKABA000000000&P=1016EE&D=NL&T=C',
|
26 |
+
];
|
27 |
+
$shipment = $shipment->update();
|
28 |
+
|
29 |
+
echo 'Shipment with ID ' . $shipment->id. ' for order with ID ' . $order->id . '.';
|
30 |
+
echo 'Tracking information updated:';
|
31 |
+
echo 'Carrier: ' . $shipment->tracking->carrier;
|
32 |
+
echo 'Code: ' . $shipment->tracking->code;
|
33 |
+
echo 'Url: ' . $shipment->tracking->url;
|
34 |
+
|
35 |
+
foreach ($shipment->lines as $line) {
|
36 |
+
echo $line->name . ' - status: <b>' . $line->status . '</b>.';
|
37 |
+
}
|
38 |
+
} catch (\Mollie\Api\Exceptions\ApiException $e) {
|
39 |
+
echo "API call failed: " . htmlspecialchars($e->getMessage());
|
40 |
+
}
|
includes/mollie-api-php/examples/subscriptions/cancel-subscription.php
ADDED
@@ -0,0 +1,36 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* How to cancel a subscription.
|
4 |
+
*/
|
5 |
+
|
6 |
+
try {
|
7 |
+
/*
|
8 |
+
* Initialize the Mollie API library with your API key or OAuth access token.
|
9 |
+
*/
|
10 |
+
require "../initialize.php";
|
11 |
+
|
12 |
+
/*
|
13 |
+
* Retrieve the last created customer for this example.
|
14 |
+
* If no customers are created yet, run the create-customer example.
|
15 |
+
*/
|
16 |
+
$customer = $mollie->customers->page(null, 1)[0];
|
17 |
+
|
18 |
+
/*
|
19 |
+
* The subscription ID, starting with sub_
|
20 |
+
*/
|
21 |
+
$subscriptionId = isset($_GET['subscription_id']) ? $_GET['subscription_id'] : '';
|
22 |
+
|
23 |
+
/*
|
24 |
+
* Customer Subscription deletion parameters.
|
25 |
+
*
|
26 |
+
* See: https://www.mollie.com/nl/docs/reference/subscriptions/delete
|
27 |
+
*/
|
28 |
+
$canceledSubscription = $customer->cancelSubscription($subscriptionId);
|
29 |
+
|
30 |
+
/*
|
31 |
+
* The subscription status should now be canceled
|
32 |
+
*/
|
33 |
+
echo "<p>The subscription status is now: '" . htmlspecialchars($canceledSubscription->status) . "'.</p>\n";
|
34 |
+
} catch (\Mollie\Api\Exceptions\ApiException $e) {
|
35 |
+
echo "API call failed: " . htmlspecialchars($e->getMessage());
|
36 |
+
}
|
includes/mollie-api-php/examples/subscriptions/create-subscription.php
ADDED
@@ -0,0 +1,61 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* How to create a regular subscription.
|
4 |
+
*/
|
5 |
+
|
6 |
+
try {
|
7 |
+
/*
|
8 |
+
* Initialize the Mollie API library with your API key or OAuth access token.
|
9 |
+
*/
|
10 |
+
require "../initialize.php";
|
11 |
+
|
12 |
+
/*
|
13 |
+
* Determine the url parts to these example files.
|
14 |
+
*/
|
15 |
+
$protocol = isset($_SERVER['HTTPS']) && strcasecmp('off', $_SERVER['HTTPS']) !== 0 ? "https" : "http";
|
16 |
+
$hostname = $_SERVER['HTTP_HOST'];
|
17 |
+
$path = dirname(isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : $_SERVER['PHP_SELF']);
|
18 |
+
|
19 |
+
/*
|
20 |
+
* Retrieve the last created customer for this example.
|
21 |
+
* If no customers are created yet, run create-customer example.
|
22 |
+
*/
|
23 |
+
$customer = $mollie->customers->page(null, 1)[0];
|
24 |
+
|
25 |
+
/*
|
26 |
+
* Generate a unique subscription id for this example. It is important to include this unique attribute
|
27 |
+
* in the webhookUrl (below) so new payments can be associated with this subscription.
|
28 |
+
*/
|
29 |
+
$subscriptionId = time();
|
30 |
+
|
31 |
+
/**
|
32 |
+
* Customer Subscription creation parameters.
|
33 |
+
*
|
34 |
+
* @See: https://docs.mollie.com/reference/v2/subscriptions-api/create-subscription
|
35 |
+
*/
|
36 |
+
$subscription = $customer->createSubscription([
|
37 |
+
"amount" => [
|
38 |
+
"value" => "10.00", // You must send the correct number of decimals, thus we enforce the use of strings
|
39 |
+
"currency" => "EUR"
|
40 |
+
],
|
41 |
+
"times" => 12,
|
42 |
+
"interval" => "1 month",
|
43 |
+
"description" => "Subscription #{$subscriptionId}",
|
44 |
+
"webhookUrl" => "{$protocol}://{$hostname}{$path}/subscriptions/webhook.php",
|
45 |
+
"metadata" => [
|
46 |
+
"subscription_id" => $subscriptionId
|
47 |
+
],
|
48 |
+
]);
|
49 |
+
|
50 |
+
/*
|
51 |
+
* The subscription will be either pending or active depending on whether the customer has
|
52 |
+
* a pending or valid mandate. If the customer has no mandates an error is returned. You
|
53 |
+
* should then set up a "first payment" for the customer.
|
54 |
+
*/
|
55 |
+
echo "<p>The subscription status is '" . htmlspecialchars($subscription->status) . "'.</p>\n";
|
56 |
+
echo "<p>";
|
57 |
+
echo '<a href="' . $protocol . '://' . $hostname . $path . '/17-cancel-subscription.php?subscription_id=' . $subscription->id . '">18-cancel-subscription</a><br>';
|
58 |
+
echo "</p>";
|
59 |
+
} catch (\Mollie\Api\Exceptions\ApiException $e) {
|
60 |
+
echo "API call failed: " . htmlspecialchars($e->getMessage());
|
61 |
+
}
|
includes/mollie-api-php/examples/subscriptions/update-subscription.php
ADDED
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Updating an existing subscription via the Mollie API.
|
4 |
+
*/
|
5 |
+
try {
|
6 |
+
/*
|
7 |
+
* Initialize the Mollie API library with your API key or OAuth access token.
|
8 |
+
*/
|
9 |
+
require "../initialize.php";
|
10 |
+
|
11 |
+
/*
|
12 |
+
* Retrieve an existing subscription
|
13 |
+
*/
|
14 |
+
$customer = $mollie->customers->get("cst_cUe8HjeBuz");
|
15 |
+
$subscription = $customer->getSubscription("sub_DRjwaT5qHx");
|
16 |
+
|
17 |
+
/**
|
18 |
+
* Subscription fields that can be updated are described by the link:
|
19 |
+
* See https://docs.mollie.com/reference/v2/subscriptions-api/update-subscription
|
20 |
+
*/
|
21 |
+
$subscription->times = 10;
|
22 |
+
$subscription->startDate = '2018-12-02'; // Year-month-day
|
23 |
+
$subscription->amount = (object)['value' => '12.12', 'currency' => 'EUR'];
|
24 |
+
$subscription->webhookUrl = 'https://some-webhook-url.com/with/path';
|
25 |
+
$subscription->description = 'Monthly subscription';
|
26 |
+
$subscription->update();
|
27 |
+
|
28 |
+
echo "<p>Subscription updated: " . $subscription->id . "</p>";
|
29 |
+
} catch (\Mollie\Api\Exceptions\ApiException $e) {
|
30 |
+
echo "API call failed: " . htmlspecialchars($e->getMessage());
|
31 |
+
}
|
includes/mollie-api-php/phpunit.xml
ADDED
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0" encoding="UTF-8" ?>
|
2 |
+
<phpunit colors="true" bootstrap="./vendor/autoload.php">
|
3 |
+
<php>
|
4 |
+
<ini name="display_errors" value="stderr"/>
|
5 |
+
<ini name="error_log" value="/dev/null"/>
|
6 |
+
</php>
|
7 |
+
<testsuite name="Unit tests">
|
8 |
+
<directory>tests/</directory>
|
9 |
+
</testsuite>
|
10 |
+
<filter>
|
11 |
+
<whitelist processUncoveredFilesFromWhitelist="true">
|
12 |
+
<directory suffix=".php">src/</directory>
|
13 |
+
</whitelist>
|
14 |
+
</filter>
|
15 |
+
</phpunit>
|
includes/mollie-api-php/tests/Mollie/API/CompatibilityCheckerTest.php
ADDED
@@ -0,0 +1,57 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace Tests\Mollie\Api;
|
3 |
+
|
4 |
+
use Mollie\Api\CompatibilityChecker;
|
5 |
+
|
6 |
+
class CompatibilityCheckerTest extends \PHPUnit\Framework\TestCase
|
7 |
+
{
|
8 |
+
/**
|
9 |
+
* @var CompatibilityChecker|\PHPUnit_Framework_MockObject_MockObject
|
10 |
+
*/
|
11 |
+
protected $checker;
|
12 |
+
|
13 |
+
protected function setUp()
|
14 |
+
{
|
15 |
+
parent::setUp();
|
16 |
+
|
17 |
+
$this->checker = $this->getMockBuilder(CompatibilityChecker::class)
|
18 |
+
->setMethods([
|
19 |
+
"satisfiesPhpVersion",
|
20 |
+
"satisfiesJsonExtension",
|
21 |
+
])
|
22 |
+
->getMock();
|
23 |
+
}
|
24 |
+
|
25 |
+
/**
|
26 |
+
* @expectedException \Mollie\Api\Exceptions\IncompatiblePlatform
|
27 |
+
* @expectedExceptionCode Mollie\Api\Exceptions\IncompatiblePlatform::INCOMPATIBLE_PHP_VERSION
|
28 |
+
*/
|
29 |
+
public function testCheckCompatibilityThrowsExceptionOnPhpVersion()
|
30 |
+
{
|
31 |
+
$this->checker->expects($this->once())
|
32 |
+
->method("satisfiesPhpVersion")
|
33 |
+
->will($this->returnValue(false)); // Fail
|
34 |
+
|
35 |
+
$this->checker->expects($this->never())
|
36 |
+
->method("satisfiesJsonExtension");
|
37 |
+
|
38 |
+
$this->checker->checkCompatibility();
|
39 |
+
}
|
40 |
+
|
41 |
+
/**
|
42 |
+
* @expectedException \Mollie\Api\Exceptions\IncompatiblePlatform
|
43 |
+
* @expectedExceptionCode Mollie\Api\Exceptions\IncompatiblePlatform::INCOMPATIBLE_JSON_EXTENSION
|
44 |
+
*/
|
45 |
+
public function testCheckCompatibilityThrowsExceptionOnJsonExtension()
|
46 |
+
{
|
47 |
+
$this->checker->expects($this->once())
|
48 |
+
->method("satisfiesPhpVersion")
|
49 |
+
->will($this->returnValue(true));
|
50 |
+
|
51 |
+
$this->checker->expects($this->once())
|
52 |
+
->method("satisfiesJsonExtension")
|
53 |
+
->will($this->returnValue(false)); // Fail
|
54 |
+
|
55 |
+
$this->checker->checkCompatibility();
|
56 |
+
}
|
57 |
+
}
|
includes/mollie-api-php/tests/Mollie/API/Endpoints/BaseEndpointTest.php
ADDED
@@ -0,0 +1,76 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tests\Mollie\Api\Endpoints;
|
4 |
+
|
5 |
+
use GuzzleHttp\Client;
|
6 |
+
use GuzzleHttp\Psr7\Request;
|
7 |
+
use GuzzleHttp\Psr7\Response;
|
8 |
+
use Mollie\Api\MollieApiClient;
|
9 |
+
|
10 |
+
abstract class BaseEndpointTest extends \PHPUnit\Framework\TestCase
|
11 |
+
{
|
12 |
+
/**
|
13 |
+
* @var Client|\PHPUnit_Framework_MockObject_MockObject
|
14 |
+
*/
|
15 |
+
protected $guzzleClient;
|
16 |
+
|
17 |
+
/**
|
18 |
+
* @var MollieApiClient
|
19 |
+
*/
|
20 |
+
protected $apiClient;
|
21 |
+
|
22 |
+
protected function mockApiCall(Request $expectedRequest, Response $response, $oAuthClient = false)
|
23 |
+
{
|
24 |
+
$this->guzzleClient = $this->createMock(Client::class);
|
25 |
+
|
26 |
+
$this->apiClient = new MollieApiClient($this->guzzleClient);
|
27 |
+
|
28 |
+
if (!$oAuthClient) {
|
29 |
+
$this->apiClient->setApiKey("test_dHar4XY7LxsDOtmnkVtjNVWXLSlXsM");
|
30 |
+
} else {
|
31 |
+
$this->apiClient->setAccessToken("access_Wwvu7egPcJLLJ9Kb7J632x8wJ2zMeJ");
|
32 |
+
}
|
33 |
+
|
34 |
+
$this->guzzleClient
|
35 |
+
->expects($this->once())
|
36 |
+
->method('send')
|
37 |
+
->with($this->isInstanceOf(Request::class))
|
38 |
+
->willReturnCallback(function (Request $request) use ($expectedRequest, $response) {
|
39 |
+
$this->assertEquals($expectedRequest->getMethod(), $request->getMethod(), "HTTP method must be identical");
|
40 |
+
|
41 |
+
$this->assertEquals(
|
42 |
+
$expectedRequest->getUri()->getPath(),
|
43 |
+
$request->getUri()->getPath(),
|
44 |
+
"URI path must be identical"
|
45 |
+
);
|
46 |
+
|
47 |
+
$this->assertEquals(
|
48 |
+
$expectedRequest->getUri()->getQuery(),
|
49 |
+
$request->getUri()->getQuery(),
|
50 |
+
'Query string parameters must be identical'
|
51 |
+
);
|
52 |
+
|
53 |
+
$requestBody = $request->getBody()->getContents();
|
54 |
+
$expectedBody = $expectedRequest->getBody()->getContents();
|
55 |
+
|
56 |
+
if (strlen($expectedBody) > 0 && strlen($requestBody) > 0) {
|
57 |
+
$this->assertJsonStringEqualsJsonString(
|
58 |
+
$expectedBody,
|
59 |
+
$requestBody,
|
60 |
+
"HTTP body must be identical"
|
61 |
+
);
|
62 |
+
}
|
63 |
+
|
64 |
+
return $response;
|
65 |
+
});
|
66 |
+
}
|
67 |
+
|
68 |
+
protected function copy($array, $object)
|
69 |
+
{
|
70 |
+
foreach ($array as $property => $value) {
|
71 |
+
$object->$property = $value;
|
72 |
+
}
|
73 |
+
|
74 |
+
return $object;
|
75 |
+
}
|
76 |
+
}
|
includes/mollie-api-php/tests/Mollie/API/Endpoints/ChargebackEndpointTest.php
ADDED
@@ -0,0 +1,156 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tests\Mollie\Api\Endpoints;
|
4 |
+
|
5 |
+
use GuzzleHttp\Psr7\Request;
|
6 |
+
use GuzzleHttp\Psr7\Response;
|
7 |
+
use Mollie\Api\Resources\Chargeback;
|
8 |
+
use Mollie\Api\Resources\ChargebackCollection;
|
9 |
+
use Mollie\Api\Resources\Payment;
|
10 |
+
use Tests\Mollie\TestHelpers\AmountObjectTestHelpers;
|
11 |
+
use Tests\Mollie\TestHelpers\LinkObjectTestHelpers;
|
12 |
+
|
13 |
+
class ChargebackEndpointTest extends BaseEndpointTest
|
14 |
+
{
|
15 |
+
use LinkObjectTestHelpers;
|
16 |
+
use AmountObjectTestHelpers;
|
17 |
+
|
18 |
+
public function testListChargebacks()
|
19 |
+
{
|
20 |
+
$this->mockApiCall(
|
21 |
+
new Request(
|
22 |
+
"GET",
|
23 |
+
"/v2/chargebacks"
|
24 |
+
),
|
25 |
+
new Response(
|
26 |
+
200,
|
27 |
+
[],
|
28 |
+
'{
|
29 |
+
"_embedded":{
|
30 |
+
"chargebacks":[
|
31 |
+
{
|
32 |
+
"resource":"chargeback",
|
33 |
+
"id":"chb_n9z0tp",
|
34 |
+
"amount":{
|
35 |
+
"value":"-13.00",
|
36 |
+
"currency":"EUR"
|
37 |
+
},
|
38 |
+
"createdAt":"2018-03-28T11:44:32+00:00",
|
39 |
+
"paymentId":"tr_44aKxzEbr8",
|
40 |
+
"settlementAmount":{
|
41 |
+
"value":"-13.00",
|
42 |
+
"currency":"EUR"
|
43 |
+
},
|
44 |
+
"_links":{
|
45 |
+
"self":{
|
46 |
+
"href":"https://api.mollie.com/v2/payments/tr_44aKxzEbr8/chargebacks/chb_n9z0tp",
|
47 |
+
"type":"application/hal+json"
|
48 |
+
},
|
49 |
+
"payment":{
|
50 |
+
"href":"https://api.mollie.com/v2/payments/tr_44aKxzEbr8",
|
51 |
+
"type":"application/hal+json"
|
52 |
+
},
|
53 |
+
"documentation": {
|
54 |
+
"href": "https://docs.mollie.com/reference/v2/chargebacks-api/get-chargeback",
|
55 |
+
"type": "text/html"
|
56 |
+
}
|
57 |
+
}
|
58 |
+
},
|
59 |
+
{
|
60 |
+
"resource":"chargeback",
|
61 |
+
"id":"chb_6cqlwf",
|
62 |
+
"amount":{
|
63 |
+
"value":"-0.37",
|
64 |
+
"currency":"EUR"
|
65 |
+
},
|
66 |
+
"createdAt":"2018-03-28T11:44:32+00:00",
|
67 |
+
"paymentId":"tr_nQKWJbDj7j",
|
68 |
+
"settlementAmount":{
|
69 |
+
"value":"-0.37",
|
70 |
+
"currency":"EUR"
|
71 |
+
},
|
72 |
+
"_links":{
|
73 |
+
"self":{
|
74 |
+
"href":"https://api.mollie.com/v2/payments/tr_nQKWJbDj7j/chargebacks/chb_6cqlwf",
|
75 |
+
"type":"application/hal+json"
|
76 |
+
},
|
77 |
+
"payment":{
|
78 |
+
"href":"https://api.mollie.com/v2/payments/tr_nQKWJbDj7j",
|
79 |
+
"type":"application/hal+json"
|
80 |
+
},
|
81 |
+
"documentation": {
|
82 |
+
"href": "https://docs.mollie.com/reference/v2/chargebacks-api/get-chargeback",
|
83 |
+
"type": "text/html"
|
84 |
+
}
|
85 |
+
}
|
86 |
+
}
|
87 |
+
]
|
88 |
+
},
|
89 |
+
"_links":{
|
90 |
+
"documentation":{
|
91 |
+
"href":"https://docs.mollie.com/reference/v2/chargebacks-api/list-chargebacks",
|
92 |
+
"type":"text/html"
|
93 |
+
},
|
94 |
+
"self":{
|
95 |
+
"href":"https://api.mollie.com/v2/chargebacks",
|
96 |
+
"type":"application/hal+json"
|
97 |
+
}
|
98 |
+
},
|
99 |
+
"count": 2
|
100 |
+
}'
|
101 |
+
)
|
102 |
+
);
|
103 |
+
|
104 |
+
$chargebacks = $this->apiClient->chargebacks->page();
|
105 |
+
|
106 |
+
$this->assertInstanceOf(ChargebackCollection::class, $chargebacks);
|
107 |
+
$this->assertEquals(2, $chargebacks->count);
|
108 |
+
$this->assertCount(2, $chargebacks);
|
109 |
+
|
110 |
+
$this->assertLinkObject(
|
111 |
+
"https://docs.mollie.com/reference/v2/chargebacks-api/list-chargebacks",
|
112 |
+
"text/html",
|
113 |
+
$chargebacks->_links->documentation
|
114 |
+
);
|
115 |
+
|
116 |
+
$this->assertLinkObject(
|
117 |
+
"https://api.mollie.com/v2/chargebacks",
|
118 |
+
"application/hal+json",
|
119 |
+
$chargebacks->_links->self
|
120 |
+
);
|
121 |
+
|
122 |
+
$this->assertChargeback($chargebacks[0], 'tr_44aKxzEbr8', 'chb_n9z0tp', "-13.00");
|
123 |
+
$this->assertChargeback($chargebacks[1], 'tr_nQKWJbDj7j', 'chb_6cqlwf', "-0.37");
|
124 |
+
}
|
125 |
+
|
126 |
+
protected function assertChargeback($chargeback, $paymentId, $chargebackId, $amount)
|
127 |
+
{
|
128 |
+
$this->assertInstanceOf(Chargeback::class, $chargeback);
|
129 |
+
$this->assertEquals("chargeback", $chargeback->resource);
|
130 |
+
$this->assertEquals($chargebackId, $chargeback->id);
|
131 |
+
|
132 |
+
$this->assertAmountObject($amount, "EUR", $chargeback->amount);
|
133 |
+
$this->assertAmountObject($amount, "EUR", $chargeback->settlementAmount);
|
134 |
+
|
135 |
+
$this->assertEquals("2018-03-28T11:44:32+00:00", $chargeback->createdAt);
|
136 |
+
$this->assertEquals($paymentId, $chargeback->paymentId);
|
137 |
+
|
138 |
+
$this->assertLinkObject(
|
139 |
+
"https://api.mollie.com/v2/payments/{$paymentId}/chargebacks/{$chargebackId}",
|
140 |
+
"application/hal+json",
|
141 |
+
$chargeback->_links->self
|
142 |
+
);
|
143 |
+
|
144 |
+
$this->assertLinkObject(
|
145 |
+
"https://api.mollie.com/v2/payments/{$paymentId}",
|
146 |
+
"application/hal+json",
|
147 |
+
$chargeback->_links->payment
|
148 |
+
);
|
149 |
+
|
150 |
+
$this->assertLinkObject(
|
151 |
+
"https://docs.mollie.com/reference/v2/chargebacks-api/get-chargeback",
|
152 |
+
"text/html",
|
153 |
+
$chargeback->_links->documentation
|
154 |
+
);
|
155 |
+
}
|
156 |
+
}
|
includes/mollie-api-php/tests/Mollie/API/Endpoints/CustomerEndpointTest.php
ADDED
@@ -0,0 +1,234 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tests\Mollie\Api\Endpoints;
|
4 |
+
|
5 |
+
use GuzzleHttp\Psr7\Request;
|
6 |
+
use GuzzleHttp\Psr7\Response;
|
7 |
+
use Mollie\Api\Resources\Customer;
|
8 |
+
use Mollie\Api\Resources\CustomerCollection;
|
9 |
+
|
10 |
+
class CustomerEndpointTest extends BaseEndpointTest
|
11 |
+
{
|
12 |
+
public function testCreateWorks()
|
13 |
+
{
|
14 |
+
$this->mockApiCall(
|
15 |
+
new Request('POST', '/v2/customers'),
|
16 |
+
new Response(
|
17 |
+
200,
|
18 |
+
[],
|
19 |
+
'{
|
20 |
+
"resource": "customer",
|
21 |
+
"id": "cst_FhQJRw4s2n",
|
22 |
+
"mode": "test",
|
23 |
+
"name": "John Doe",
|
24 |
+
"email": "johndoe@example.org",
|
25 |
+
"locale": null,
|
26 |
+
"metadata": null,
|
27 |
+
"recentlyUsedMethods": [],
|
28 |
+
"createdAt": "2018-04-19T08:49:01+00:00",
|
29 |
+
"_links": {
|
30 |
+
"documentation": {
|
31 |
+
"href": "https://docs.mollie.com/reference/v2/customers-api/create-customer",
|
32 |
+
"type": "text/html"
|
33 |
+
}
|
34 |
+
}
|
35 |
+
}'
|
36 |
+
)
|
37 |
+
);
|
38 |
+
|
39 |
+
/** @var Customer $customer */
|
40 |
+
$customer = $this->apiClient->customers->create([
|
41 |
+
"name" => "John Doe",
|
42 |
+
"email" => "johndoe@example.org"
|
43 |
+
]);
|
44 |
+
|
45 |
+
$this->assertInstanceOf(Customer::class, $customer);
|
46 |
+
$this->assertEquals("customer", $customer->resource);
|
47 |
+
$this->assertEquals("cst_FhQJRw4s2n", $customer->id);
|
48 |
+
$this->assertEquals("John Doe", $customer->name);
|
49 |
+
$this->assertEquals("johndoe@example.org", $customer->email);
|
50 |
+
$this->assertNull($customer->locale);
|
51 |
+
$this->assertNull($customer->metadata);
|
52 |
+
$this->assertEquals([], $customer->recentlyUsedMethods);
|
53 |
+
$this->assertEquals("2018-04-19T08:49:01+00:00", $customer->createdAt);
|
54 |
+
|
55 |
+
$documentationLink = (object)["href" => "https://docs.mollie.com/reference/v2/customers-api/create-customer", "type" => "text/html"];
|
56 |
+
$this->assertEquals($documentationLink, $customer->_links->documentation);
|
57 |
+
|
58 |
+
}
|
59 |
+
|
60 |
+
public function testGetWorks()
|
61 |
+
{
|
62 |
+
$this->mockApiCall(
|
63 |
+
new Request('GET', '/v2/customers/cst_FhQJRw4s2n'),
|
64 |
+
new Response(
|
65 |
+
200,
|
66 |
+
[],
|
67 |
+
'{
|
68 |
+
"resource": "customer",
|
69 |
+
"id": "cst_FhQJRw4s2n",
|
70 |
+
"mode": "test",
|
71 |
+
"name": "John Doe",
|
72 |
+
"email": "johndoe@example.org",
|
73 |
+
"locale": null,
|
74 |
+
"metadata": null,
|
75 |
+
"recentlyUsedMethods": [],
|
76 |
+
"createdAt": "2018-04-19T08:49:01+00:00",
|
77 |
+
"_links": {
|
78 |
+
"documentation": {
|
79 |
+
"href": "https://docs.mollie.com/reference/v2/customers-api/get-customer",
|
80 |
+
"type": "text/html"
|
81 |
+
}
|
82 |
+
}
|
83 |
+
}'
|
84 |
+
)
|
85 |
+
);
|
86 |
+
|
87 |
+
/** @var Customer $customer */
|
88 |
+
$customer = $this->apiClient->customers->get("cst_FhQJRw4s2n");
|
89 |
+
|
90 |
+
$this->assertInstanceOf(Customer::class, $customer);
|
91 |
+
$this->assertEquals("customer", $customer->resource);
|
92 |
+
$this->assertEquals("cst_FhQJRw4s2n", $customer->id);
|
93 |
+
$this->assertEquals("John Doe", $customer->name);
|
94 |
+
$this->assertEquals("johndoe@example.org", $customer->email);
|
95 |
+
$this->assertNull($customer->locale);
|
96 |
+
$this->assertNull($customer->metadata);
|
97 |
+
$this->assertEquals([], $customer->recentlyUsedMethods);
|
98 |
+
$this->assertEquals("2018-04-19T08:49:01+00:00", $customer->createdAt);
|
99 |
+
|
100 |
+
$documentationLink = (object)["href" => "https://docs.mollie.com/reference/v2/customers-api/get-customer", "type" => "text/html"];
|
101 |
+
$this->assertEquals($documentationLink, $customer->_links->documentation);
|
102 |
+
|
103 |
+
}
|
104 |
+
|
105 |
+
public function testListWorks()
|
106 |
+
{
|
107 |
+
$this->mockApiCall(
|
108 |
+
new Request('GET', '/v2/customers'),
|
109 |
+
new Response(
|
110 |
+
200,
|
111 |
+
[],
|
112 |
+
'{
|
113 |
+
"_embedded": {
|
114 |
+
"customers": [
|
115 |
+
{
|
116 |
+
"resource": "customer",
|
117 |
+
"id": "cst_FhQJRw4s2n",
|
118 |
+
"mode": "test",
|
119 |
+
"name": "John Doe",
|
120 |
+
"email": "johndoe@example.org",
|
121 |
+
"locale": null,
|
122 |
+
"metadata": null,
|
123 |
+
"recentlyUsedMethods": [],
|
124 |
+
"createdAt": "2018-04-19T08:49:01+00:00"
|
125 |
+
}
|
126 |
+
]
|
127 |
+
},
|
128 |
+
"count": 1,
|
129 |
+
"_links": {
|
130 |
+
"documentation": {
|
131 |
+
"href": "https://docs.mollie.com/reference/v2/customers-api/list-customers",
|
132 |
+
"type": "text/html"
|
133 |
+
},
|
134 |
+
"self": {
|
135 |
+
"href": "https://api.mollie.com/v2/customers?limit=50",
|
136 |
+
"type": "application/hal+json"
|
137 |
+
},
|
138 |
+
"previous": null,
|
139 |
+
"next": null
|
140 |
+
}
|
141 |
+
}'
|
142 |
+
)
|
143 |
+
);
|
144 |
+
|
145 |
+
/** @var Customer $customer */
|
146 |
+
$customers = $this->apiClient->customers->page();
|
147 |
+
|
148 |
+
$this->assertInstanceOf(CustomerCollection::class, $customers);
|
149 |
+
|
150 |
+
$documentationLink = (object)["href" => "https://docs.mollie.com/reference/v2/customers-api/list-customers", "type" => "text/html"];
|
151 |
+
$this->assertEquals($documentationLink, $customers->_links->documentation);
|
152 |
+
|
153 |
+
$selfLink = (object)["href" => "https://api.mollie.com/v2/customers?limit=50", "type" => "application/hal+json"];
|
154 |
+
$this->assertEquals($selfLink, $customers->_links->self);
|
155 |
+
|
156 |
+
foreach ($customers as $customer) {
|
157 |
+
$this->assertInstanceOf(Customer::class, $customer);
|
158 |
+
$this->assertEquals("customer", $customer->resource);
|
159 |
+
$this->assertNotEmpty($customer->createdAt);
|
160 |
+
}
|
161 |
+
|
162 |
+
}
|
163 |
+
|
164 |
+
public function testUpdateWorks()
|
165 |
+
{
|
166 |
+
$expectedName = 'Kaas Broodje';
|
167 |
+
$expectedEmail = 'kaas.broodje@gmail.com';
|
168 |
+
|
169 |
+
$this->mockApiCall(
|
170 |
+
new Request('PATCH', '/v2/customers/cst_FhQJRw4s2n'),
|
171 |
+
new Response(
|
172 |
+
200,
|
173 |
+
[],
|
174 |
+
'{
|
175 |
+
"resource": "customer",
|
176 |
+
"id": "cst_FhQJRw4s2n",
|
177 |
+
"mode": "test",
|
178 |
+
"name": "' . $expectedName . '",
|
179 |
+
"email": "' . $expectedEmail . '",
|
180 |
+
"locale": null,
|
181 |
+
"metadata": null,
|
182 |
+
"recentlyUsedMethods": [],
|
183 |
+
"createdAt": "2018-04-19T08:49:01+00:00",
|
184 |
+
"_links": {
|
185 |
+
"documentation": {
|
186 |
+
"href": "https://docs.mollie.com/reference/v2/customers-api/get-customer",
|
187 |
+
"type": "text/html"
|
188 |
+
}
|
189 |
+
}
|
190 |
+
}'
|
191 |
+
)
|
192 |
+
);
|
193 |
+
|
194 |
+
$customer = $this->getCustomer();
|
195 |
+
$customer->name = $expectedName;
|
196 |
+
$customer->email = $expectedEmail;
|
197 |
+
|
198 |
+
$updatedCustomer = $customer->update();
|
199 |
+
|
200 |
+
$this->assertEquals($expectedName, $updatedCustomer->name);
|
201 |
+
$this->assertEquals($expectedEmail, $updatedCustomer->email);
|
202 |
+
}
|
203 |
+
|
204 |
+
/**
|
205 |
+
* @return Customer
|
206 |
+
*/
|
207 |
+
private function getCustomer()
|
208 |
+
{
|
209 |
+
$customerJson = '{
|
210 |
+
"resource": "customer",
|
211 |
+
"id": "cst_FhQJRw4s2n",
|
212 |
+
"mode": "test",
|
213 |
+
"name": "John Doe",
|
214 |
+
"email": "johndoe@example.org",
|
215 |
+
"locale": null,
|
216 |
+
"metadata": null,
|
217 |
+
"recentlyUsedMethods": [],
|
218 |
+
"createdAt": "2018-04-19T08:49:01+00:00",
|
219 |
+
"_links": {
|
220 |
+
"self": {
|
221 |
+
"href": "http://api.mollie.test/v2/customers/cst_FhQJRw4s2n",
|
222 |
+
"type": "application/hal+json"
|
223 |
+
},
|
224 |
+
"documentation": {
|
225 |
+
"href": "https://docs.mollie.com/reference/v2/customers-api/get-customer",
|
226 |
+
"type": "text/html"
|
227 |
+
}
|
228 |
+
}
|
229 |
+
}';
|
230 |
+
|
231 |
+
return $this->copy(json_decode($customerJson), new Customer($this->apiClient));
|
232 |
+
}
|
233 |
+
|
234 |
+
}
|
includes/mollie-api-php/tests/Mollie/API/Endpoints/CustomerPaymentEndpointTest.php
ADDED
@@ -0,0 +1,314 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tests\Mollie\Api\Endpoints;
|
4 |
+
|
5 |
+
use GuzzleHttp\Psr7\Request;
|
6 |
+
use GuzzleHttp\Psr7\Response;
|
7 |
+
use Mollie\Api\Resources\Customer;
|
8 |
+
use Mollie\Api\Resources\Payment;
|
9 |
+
use Mollie\Api\Resources\PaymentCollection;
|
10 |
+
use Mollie\Api\Types\PaymentStatus;
|
11 |
+
use Mollie\Api\Types\SequenceType;
|
12 |
+
use stdClass;
|
13 |
+
|
14 |
+
class CustomerPaymentEndpointTest extends BaseEndpointTest
|
15 |
+
{
|
16 |
+
public function testCreateCustomerPayment()
|
17 |
+
{
|
18 |
+
$this->mockApiCall(
|
19 |
+
new Request(
|
20 |
+
"POST",
|
21 |
+
"/v2/customers/cst_FhQJRw4s2n/payments",
|
22 |
+
[],
|
23 |
+
'{
|
24 |
+
"amount":{
|
25 |
+
"value":"20.00",
|
26 |
+
"currency":"EUR"
|
27 |
+
},
|
28 |
+
"description": "My first API payment",
|
29 |
+
"redirectUrl": "https://example.org/redirect",
|
30 |
+
"webhookUrl": "https://example.org/webhook",
|
31 |
+
"metadata": {
|
32 |
+
"order_id": "1234"
|
33 |
+
}
|
34 |
+
}'
|
35 |
+
),
|
36 |
+
new Response(
|
37 |
+
201,
|
38 |
+
[],
|
39 |
+
'{
|
40 |
+
"resource":"payment",
|
41 |
+
"id":"tr_44aKxzEbr8",
|
42 |
+
"mode":"test",
|
43 |
+
"createdAt":"2018-03-13T14:02:29+00:00",
|
44 |
+
"amount":{
|
45 |
+
"value":"20.00",
|
46 |
+
"currency":"EUR"
|
47 |
+
},
|
48 |
+
"description":"My first API payment",
|
49 |
+
"method":null,
|
50 |
+
"metadata":{
|
51 |
+
"order_id":1234
|
52 |
+
},
|
53 |
+
"status":"open",
|
54 |
+
"isCancelable":false,
|
55 |
+
"expiresAt":"2018-03-13T14:17:29+00:00",
|
56 |
+
"details":null,
|
57 |
+
"profileId":"pfl_2A1gacu42V",
|
58 |
+
"sequenceType":"oneoff",
|
59 |
+
"redirectUrl":"http://example.org/examples/payment/03-return-page.php?order_id=1234",
|
60 |
+
"webhookUrl":"http://example.org/examples/payment/02-webhook-verification.php",
|
61 |
+
"_links":{
|
62 |
+
"self":{
|
63 |
+
"href":"https://api.mollie.com/v2/payments/tr_44aKxzEbr8",
|
64 |
+
"type":"application/hal+json"
|
65 |
+
},
|
66 |
+
"checkout":{
|
67 |
+
"href":"https://www.mollie.com/payscreen/select-method/44aKxzEbr8",
|
68 |
+
"type":"text/html"
|
69 |
+
},
|
70 |
+
"customer": {
|
71 |
+
"href": "https://api.mollie.com/v2/customers/cst_FhQJRw4s2n",
|
72 |
+
"type": "application/hal+json"
|
73 |
+
},
|
74 |
+
"documentation":{
|
75 |
+
"href":"https://docs.mollie.com/reference/v2/customers-api/create-payment",
|
76 |
+
"type":"text/html"
|
77 |
+
}
|
78 |
+
}
|
79 |
+
}'
|
80 |
+
)
|
81 |
+
);
|
82 |
+
|
83 |
+
$customer = $this->getCustomer();
|
84 |
+
|
85 |
+
$payment = $customer->createPayment([
|
86 |
+
"amount" => [
|
87 |
+
"currency" => "EUR",
|
88 |
+
"value" => "20.00"
|
89 |
+
],
|
90 |
+
"description" => "My first API payment",
|
91 |
+
"redirectUrl" => "https://example.org/redirect",
|
92 |
+
"webhookUrl" => "https://example.org/webhook",
|
93 |
+
"metadata" => [
|
94 |
+
"order_id" => "1234",
|
95 |
+
],
|
96 |
+
]);
|
97 |
+
|
98 |
+
$this->assertInstanceOf(Payment::class, $payment);
|
99 |
+
$this->assertEquals('tr_44aKxzEbr8', $payment->id);
|
100 |
+
$this->assertEquals('test', $payment->mode);
|
101 |
+
$this->assertEquals("2018-03-13T14:02:29+00:00", $payment->createdAt);
|
102 |
+
|
103 |
+
$amount = new Stdclass();
|
104 |
+
$amount->value = '20.00';
|
105 |
+
$amount->currency = "EUR";
|
106 |
+
$this->assertEquals($amount, $payment->amount);
|
107 |
+
|
108 |
+
$this->assertEquals('My first API payment', $payment->description);
|
109 |
+
$this->assertNull($payment->method);
|
110 |
+
$this->assertEquals((object)["order_id" => "1234"], $payment->metadata);
|
111 |
+
$this->assertEquals(PaymentStatus::STATUS_OPEN, $payment->status);
|
112 |
+
$this->assertFalse($payment->isCancelable);
|
113 |
+
$this->assertEquals("2018-03-13T14:17:29+00:00", $payment->expiresAt);
|
114 |
+
$this->assertNull($payment->details);
|
115 |
+
$this->assertEquals("pfl_2A1gacu42V", $payment->profileId);
|
116 |
+
$this->assertEquals(SequenceType::SEQUENCETYPE_ONEOFF, $payment->sequenceType);
|
117 |
+
$this->assertEquals("http://example.org/examples/payment/03-return-page.php?order_id=1234", $payment->redirectUrl);
|
118 |
+
$this->assertEquals("http://example.org/examples/payment/02-webhook-verification.php", $payment->webhookUrl);
|
119 |
+
|
120 |
+
$selfLink = (object)["href" => "https://api.mollie.com/v2/payments/tr_44aKxzEbr8", "type" => "application/hal+json"];
|
121 |
+
$this->assertEquals($selfLink, $payment->_links->self);
|
122 |
+
|
123 |
+
$checkoutLink = (object)["href" => "https://www.mollie.com/payscreen/select-method/44aKxzEbr8", "type" => "text/html"];
|
124 |
+
$this->assertEquals($checkoutLink, $payment->_links->checkout);
|
125 |
+
|
126 |
+
$customerLink = (object)["href" => "https://api.mollie.com/v2/customers/cst_FhQJRw4s2n", "type" => "application/hal+json"];
|
127 |
+
$this->assertEquals($customerLink, $payment->_links->customer);
|
128 |
+
|
129 |
+
$documentationLink = (object)["href" => "https://docs.mollie.com/reference/v2/customers-api/create-payment", "type" => "text/html"];
|
130 |
+
$this->assertEquals($documentationLink, $payment->_links->documentation);
|
131 |
+
}
|
132 |
+
|
133 |
+
public function testListCustomerPayments()
|
134 |
+
{
|
135 |
+
$this->mockApiCall(
|
136 |
+
new Request(
|
137 |
+
"GET",
|
138 |
+
"/v2/customers/cst_FhQJRw4s2n/payments?testmode=true",
|
139 |
+
[],
|
140 |
+
''
|
141 |
+
),
|
142 |
+
new Response(
|
143 |
+
200,
|
144 |
+
[],
|
145 |
+
'{
|
146 |
+
"_embedded": {
|
147 |
+
"payments": [
|
148 |
+
{
|
149 |
+
"resource": "payment",
|
150 |
+
"id": "tr_admNa2tFfa",
|
151 |
+
"mode": "test",
|
152 |
+
"createdAt": "2018-03-19T15:00:50+00:00",
|
153 |
+
"amount": {
|
154 |
+
"value": "100.00",
|
155 |
+
"currency": "EUR"
|
156 |
+
},
|
157 |
+
"description": "Payment no 1",
|
158 |
+
"method": null,
|
159 |
+
"metadata": null,
|
160 |
+
"status": "open",
|
161 |
+
"isCancelable": false,
|
162 |
+
"expiresAt": "2018-03-19T15:15:50+00:00",
|
163 |
+
"details": null,
|
164 |
+
"locale": "nl_NL",
|
165 |
+
"profileId": "pfl_7N5qjbu42V",
|
166 |
+
"sequenceType": "oneoff",
|
167 |
+
"redirectUrl": "https://www.example.org/",
|
168 |
+
"_links": {
|
169 |
+
"self": {
|
170 |
+
"href": "https://api.mollie.com/v2/payments/tr_admNa2tFfa",
|
171 |
+
"type": "application/hal+json"
|
172 |
+
},
|
173 |
+
"checkout": {
|
174 |
+
"href": "https://www.mollie.com/payscreen/select-method/admNa2tFfa",
|
175 |
+
"type": "text/html"
|
176 |
+
},
|
177 |
+
"customer": {
|
178 |
+
"href": "https://api.mollie.com/v2/customers/cst_FhQJRw4s2n",
|
179 |
+
"type": "application/hal+json"
|
180 |
+
}
|
181 |
+
}
|
182 |
+
},
|
183 |
+
{
|
184 |
+
"resource": "payment",
|
185 |
+
"id": "tr_bcaLc7hFfa",
|
186 |
+
"mode": "test",
|
187 |
+
"createdAt": "2018-03-19T15:00:50+00:00",
|
188 |
+
"amount": {
|
189 |
+
"value": "100.00",
|
190 |
+
"currency": "EUR"
|
191 |
+
},
|
192 |
+
"description": "Payment no 2",
|
193 |
+
"method": null,
|
194 |
+
"metadata": null,
|
195 |
+
"status": "open",
|
196 |
+
"isCancelable": false,
|
197 |
+
"expiresAt": "2018-03-19T15:15:50+00:00",
|
198 |
+
"details": null,
|
199 |
+
"locale": "nl_NL",
|
200 |
+
"profileId": "pfl_7N5qjbu42V",
|
201 |
+
"sequenceType": "oneoff",
|
202 |
+
"redirectUrl": "https://www.example.org/",
|
203 |
+
"_links": {
|
204 |
+
"self": {
|
205 |
+
"href": "https://api.mollie.com/v2/payments/tr_bcaLc7hFfa",
|
206 |
+
"type": "application/hal+json"
|
207 |
+
},
|
208 |
+
"checkout": {
|
209 |
+
"href": "https://www.mollie.com/payscreen/select-method/bcaLc7hFfa",
|
210 |
+
"type": "text/html"
|
211 |
+
},
|
212 |
+
"customer": {
|
213 |
+
"href": "https://api.mollie.com/v2/customers/cst_FhQJRw4s2n",
|
214 |
+
"type": "application/hal+json"
|
215 |
+
}
|
216 |
+
}
|
217 |
+
},
|
218 |
+
{
|
219 |
+
"resource": "payment",
|
220 |
+
"id": "tr_pslHy1tFfa",
|
221 |
+
"mode": "test",
|
222 |
+
"createdAt": "2018-03-19T15:00:50+00:00",
|
223 |
+
"amount": {
|
224 |
+
"value": "100.00",
|
225 |
+
"currency": "EUR"
|
226 |
+
},
|
227 |
+
"description": "Payment no 3",
|
228 |
+
"method": null,
|
229 |
+
"metadata": null,
|
230 |
+
"status": "open",
|
231 |
+
"isCancelable": false,
|
232 |
+
"expiresAt": "2018-03-19T15:15:50+00:00",
|
233 |
+
"details": null,
|
234 |
+
"locale": "nl_NL",
|
235 |
+
"profileId": "pfl_7N5qjbu42V",
|
236 |
+
"sequenceType": "oneoff",
|
237 |
+
"redirectUrl": "https://www.example.org/",
|
238 |
+
"_links": {
|
239 |
+
"self": {
|
240 |
+
"href": "https://api.mollie.com/v2/payments/tr_pslHy1tFfa",
|
241 |
+
"type": "application/hal+json"
|
242 |
+
},
|
243 |
+
"checkout": {
|
244 |
+
"href": "https://www.mollie.com/payscreen/select-method/pslHy1tFfa",
|
245 |
+
"type": "text/html"
|
246 |
+
},
|
247 |
+
"customer": {
|
248 |
+
"href": "https://api.mollie.com/v2/customers/cst_FhQJRw4s2n",
|
249 |
+
"type": "application/hal+json"
|
250 |
+
}
|
251 |
+
}
|
252 |
+
}
|
253 |
+
]
|
254 |
+
},
|
255 |
+
"_links": {
|
256 |
+
"documentation": {
|
257 |
+
"href": "https://docs.mollie.com/reference/v2/customers-api/list-customer-payments",
|
258 |
+
"type": "text/html"
|
259 |
+
},
|
260 |
+
"self": {
|
261 |
+
"href": "https://api.mollie.com/v2/customers/cst_TkNdP8yPrH/payments?limit=50",
|
262 |
+
"type": "application/hal+json"
|
263 |
+
},
|
264 |
+
"previous": null,
|
265 |
+
"next": null
|
266 |
+
},
|
267 |
+
"count": 3
|
268 |
+
}'
|
269 |
+
),
|
270 |
+
true
|
271 |
+
);
|
272 |
+
|
273 |
+
/** @var Customer $customer */
|
274 |
+
$customer = $this->getCustomer();
|
275 |
+
|
276 |
+
$payments = $customer->payments();
|
277 |
+
|
278 |
+
$this->assertInstanceOf(PaymentCollection::class, $payments);
|
279 |
+
$this->assertEquals(3, $payments->count);
|
280 |
+
$this->assertEquals(3, count($payments));
|
281 |
+
|
282 |
+
$documentationLink = (object)["href" => "https://docs.mollie.com/reference/v2/customers-api/list-customer-payments", "type" => "text/html"];
|
283 |
+
$this->assertEquals($documentationLink, $payments->_links->documentation);
|
284 |
+
|
285 |
+
$selfLink = (object)["href" => "https://api.mollie.com/v2/customers/cst_TkNdP8yPrH/payments?limit=50", "type" => "application/hal+json"];
|
286 |
+
$this->assertEquals($selfLink, $payments->_links->self);
|
287 |
+
}
|
288 |
+
|
289 |
+
/**
|
290 |
+
* @return CustomerPaymentEndpointTest
|
291 |
+
*/
|
292 |
+
private function getCustomer()
|
293 |
+
{
|
294 |
+
$customerJson = '{
|
295 |
+
"resource": "customer",
|
296 |
+
"id": "cst_FhQJRw4s2n",
|
297 |
+
"mode": "test",
|
298 |
+
"name": "John Doe",
|
299 |
+
"email": "johndoe@example.org",
|
300 |
+
"locale": null,
|
301 |
+
"metadata": null,
|
302 |
+
"recentlyUsedMethods": [],
|
303 |
+
"createdAt": "2018-04-19T08:49:01+00:00",
|
304 |
+
"_links": {
|
305 |
+
"documentation": {
|
306 |
+
"href": "https://docs.mollie.com/reference/v2/customers-api/get-customer",
|
307 |
+
"type": "text/html"
|
308 |
+
}
|
309 |
+
}
|
310 |
+
}';
|
311 |
+
|
312 |
+
return $this->copy(json_decode($customerJson), new Customer($this->apiClient));
|
313 |
+
}
|
314 |
+
}
|
includes/mollie-api-php/tests/Mollie/API/Endpoints/InvoiceEndpointTest.php
ADDED
@@ -0,0 +1,222 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tests\Mollie\Api\Endpoints;
|
4 |
+
|
5 |
+
use GuzzleHttp\Psr7\Request;
|
6 |
+
use GuzzleHttp\Psr7\Response;
|
7 |
+
use Mollie\Api\Resources\Invoice;
|
8 |
+
use Mollie\Api\Resources\InvoiceCollection;
|
9 |
+
use Mollie\Api\Types\InvoiceStatus;
|
10 |
+
|
11 |
+
class InvoiceEndpointTest extends BaseEndpointTest
|
12 |
+
{
|
13 |
+
public function testGetInvoice()
|
14 |
+
{
|
15 |
+
$this->mockApiCall(
|
16 |
+
new Request(
|
17 |
+
"GET",
|
18 |
+
"/v2/invoices/inv_bsa6PvAwaK",
|
19 |
+
[],
|
20 |
+
''
|
21 |
+
),
|
22 |
+
new Response(
|
23 |
+
200,
|
24 |
+
[],
|
25 |
+
'{
|
26 |
+
"resource": "invoice",
|
27 |
+
"id": "inv_bsa6PvAwaK",
|
28 |
+
"reference": "2018.190241",
|
29 |
+
"vatNumber": "123456789B01",
|
30 |
+
"status": "paid",
|
31 |
+
"issuedAt": "2018-05-02",
|
32 |
+
"paidAt": "2018-05-02",
|
33 |
+
"netAmount": {
|
34 |
+
"value": "100.00",
|
35 |
+
"currency": "EUR"
|
36 |
+
},
|
37 |
+
"vatAmount": {
|
38 |
+
"value": "0.00",
|
39 |
+
"currency": "EUR"
|
40 |
+
},
|
41 |
+
"grossAmount": {
|
42 |
+
"value": "100.00",
|
43 |
+
"currency": "EUR"
|
44 |
+
},
|
45 |
+
"lines": [
|
46 |
+
{
|
47 |
+
"period": "2018-04",
|
48 |
+
"description": "iDEAL transaction costs: april 2018",
|
49 |
+
"count": 1337,
|
50 |
+
"vatPercentage": 0,
|
51 |
+
"amount": {
|
52 |
+
"value": "50.00",
|
53 |
+
"currency": "EUR"
|
54 |
+
}
|
55 |
+
},
|
56 |
+
{
|
57 |
+
"period": "2018-04",
|
58 |
+
"description": "Refunds iDEAL: april 2018",
|
59 |
+
"count": 1337,
|
60 |
+
"vatPercentage": 0,
|
61 |
+
"amount": {
|
62 |
+
"value": "50.00",
|
63 |
+
"currency": "EUR"
|
64 |
+
}
|
65 |
+
}
|
66 |
+
],
|
67 |
+
"_links": {
|
68 |
+
"self": {
|
69 |
+
"href": "https://api.mollie.com/v2/invoices/inv_bsa6PvAwaK",
|
70 |
+
"type": "application/hal+json"
|
71 |
+
},
|
72 |
+
"pdf": {
|
73 |
+
"href": "https://www.mollie.com/merchant/download/invoice/bsa6PvAwaK/79aa10f49132b7844c0243648ade6985",
|
74 |
+
"type": "application/pdf"
|
75 |
+
},
|
76 |
+
"documentation": {
|
77 |
+
"href": "https://docs.mollie.com/reference/v2/invoices-api/get-invoice",
|
78 |
+
"type": "text/html"
|
79 |
+
}
|
80 |
+
}
|
81 |
+
}'
|
82 |
+
)
|
83 |
+
);
|
84 |
+
|
85 |
+
$invoice = $this->apiClient->invoices->get("inv_bsa6PvAwaK");
|
86 |
+
|
87 |
+
$this->assertInstanceOf(Invoice::class, $invoice);
|
88 |
+
$this->assertEquals("invoice", $invoice->resource);
|
89 |
+
$this->assertEquals("inv_bsa6PvAwaK", $invoice->id);
|
90 |
+
$this->assertEquals("2018.190241", $invoice->reference);
|
91 |
+
$this->assertEquals("123456789B01", $invoice->vatNumber);
|
92 |
+
$this->assertEquals(InvoiceStatus::STATUS_PAID, $invoice->status);
|
93 |
+
$this->assertEquals("2018-05-02", $invoice->issuedAt);
|
94 |
+
$this->assertEquals("2018-05-02", $invoice->paidAt);
|
95 |
+
|
96 |
+
$this->assertEquals((object) ["value" => "100.00", "currency" => "EUR"], $invoice->netAmount);
|
97 |
+
$this->assertEquals((object) ["value" => "0.00", "currency" => "EUR"], $invoice->vatAmount);
|
98 |
+
$this->assertEquals((object) ["value" => "100.00", "currency" => "EUR"], $invoice->grossAmount);
|
99 |
+
|
100 |
+
$this->assertCount(2, $invoice->lines);
|
101 |
+
|
102 |
+
$selfLink = (object)['href' => 'https://api.mollie.com/v2/invoices/inv_bsa6PvAwaK', 'type' => 'application/hal+json'];
|
103 |
+
$this->assertEquals($selfLink, $invoice->_links->self);
|
104 |
+
|
105 |
+
$pdfLink = (object)['href' => 'https://www.mollie.com/merchant/download/invoice/bsa6PvAwaK/79aa10f49132b7844c0243648ade6985', 'type' => 'application/pdf'];
|
106 |
+
$this->assertEquals($pdfLink, $invoice->_links->pdf);
|
107 |
+
|
108 |
+
$documentationLink = (object)['href' => 'https://docs.mollie.com/reference/v2/invoices-api/get-invoice', 'type' => 'text/html'];
|
109 |
+
$this->assertEquals($documentationLink, $invoice->_links->documentation);
|
110 |
+
}
|
111 |
+
|
112 |
+
public function testListInvoices()
|
113 |
+
{
|
114 |
+
$this->mockApiCall(
|
115 |
+
new Request(
|
116 |
+
"GET",
|
117 |
+
"/v2/invoices",
|
118 |
+
[],
|
119 |
+
''
|
120 |
+
),
|
121 |
+
new Response(
|
122 |
+
200,
|
123 |
+
[],
|
124 |
+
'{
|
125 |
+
"_embedded": {
|
126 |
+
"invoices": [
|
127 |
+
{
|
128 |
+
"resource": "invoice",
|
129 |
+
"id": "inv_bsa6PvAwaK",
|
130 |
+
"reference": "2018.190241",
|
131 |
+
"vatNumber": "123456789B01",
|
132 |
+
"status": "paid",
|
133 |
+
"issuedAt": "2018-05-02",
|
134 |
+
"paidAt": "2018-05-02",
|
135 |
+
"netAmount": {
|
136 |
+
"value": "100.00",
|
137 |
+
"currency": "EUR"
|
138 |
+
},
|
139 |
+
"vatAmount": {
|
140 |
+
"value": "0.00",
|
141 |
+
"currency": "EUR"
|
142 |
+
},
|
143 |
+
"grossAmount": {
|
144 |
+
"value": "100.00",
|
145 |
+
"currency": "EUR"
|
146 |
+
},
|
147 |
+
"lines": [
|
148 |
+
{
|
149 |
+
"period": "2018-04",
|
150 |
+
"description": "iDEAL transaction costs: april 2018",
|
151 |
+
"count": 1337,
|
152 |
+
"vatPercentage": 0,
|
153 |
+
"amount": {
|
154 |
+
"value": "50.00",
|
155 |
+
"currency": "EUR"
|
156 |
+
}
|
157 |
+
},
|
158 |
+
{
|
159 |
+
"period": "2018-04",
|
160 |
+
"description": "Refunds iDEAL: april 2018",
|
161 |
+
"count": 1337,
|
162 |
+
"vatPercentage": 0,
|
163 |
+
"amount": {
|
164 |
+
"value": "50.00",
|
165 |
+
"currency": "EUR"
|
166 |
+
}
|
167 |
+
}
|
168 |
+
],
|
169 |
+
"_links": {
|
170 |
+
"self": {
|
171 |
+
"href": "https://api.mollie.com/v2/invoices/inv_bsa6PvAwaK",
|
172 |
+
"type": "application/hal+json"
|
173 |
+
},
|
174 |
+
"pdf": {
|
175 |
+
"href": "https://www.mollie.com/merchant/download/invoice/bsa6PvAwaK/79aa10f49132b7844c0243648ade6985",
|
176 |
+
"type": "application/pdf"
|
177 |
+
},
|
178 |
+
"documentation": {
|
179 |
+
"href": "https://docs.mollie.com/reference/v2/invoices-api/get-invoice",
|
180 |
+
"type": "text/html"
|
181 |
+
}
|
182 |
+
}
|
183 |
+
}
|
184 |
+
]
|
185 |
+
},
|
186 |
+
"count": 1,
|
187 |
+
"_links": {
|
188 |
+
"documentation": {
|
189 |
+
"href": "https://docs.mollie.com/reference/v2/invoices-api/list-invoices",
|
190 |
+
"type": "text/html"
|
191 |
+
},
|
192 |
+
"self": {
|
193 |
+
"href": "https://api.mollie.nl/v2/invoices?limit=50",
|
194 |
+
"type": "application/hal+json"
|
195 |
+
},
|
196 |
+
"previous": null,
|
197 |
+
"next": null
|
198 |
+
}
|
199 |
+
}'
|
200 |
+
)
|
201 |
+
);
|
202 |
+
|
203 |
+
$invoices = $this->apiClient->invoices->page();
|
204 |
+
$this->assertInstanceOf(InvoiceCollection::class, $invoices);
|
205 |
+
|
206 |
+
$documentationLink = (object)['href' => 'https://docs.mollie.com/reference/v2/invoices-api/list-invoices', 'type' => 'text/html'];
|
207 |
+
$this->assertEquals($documentationLink, $invoices->_links->documentation);
|
208 |
+
|
209 |
+
$selfLink = (object)['href' => 'https://api.mollie.nl/v2/invoices?limit=50', 'type' => 'application/hal+json'];
|
210 |
+
$this->assertEquals($selfLink, $invoices->_links->self);
|
211 |
+
|
212 |
+
$this->assertEmpty($invoices->_links->previous);
|
213 |
+
$this->assertEmpty($invoices->_links->next);
|
214 |
+
|
215 |
+
foreach($invoices as $invoice) {
|
216 |
+
$this->assertInstanceOf(Invoice::class, $invoice);
|
217 |
+
$this->assertEquals("invoice", $invoice->resource);
|
218 |
+
$this->assertNotEmpty($invoice->lines);
|
219 |
+
}
|
220 |
+
}
|
221 |
+
|
222 |
+
}
|
includes/mollie-api-php/tests/Mollie/API/Endpoints/MandateEndpointTest.php
ADDED
@@ -0,0 +1,428 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tests\Mollie\Api\Endpoints;
|
4 |
+
|
5 |
+
use GuzzleHttp\Psr7\Request;
|
6 |
+
use GuzzleHttp\Psr7\Response;
|
7 |
+
use Mollie\Api\Resources\Customer;
|
8 |
+
use Mollie\Api\Resources\Mandate;
|
9 |
+
use Mollie\Api\Resources\MandateCollection;
|
10 |
+
use Mollie\Api\Types\MandateMethod;
|
11 |
+
use Mollie\Api\Types\MandateStatus;
|
12 |
+
|
13 |
+
class MandateEndpointTest extends BaseEndpointTest
|
14 |
+
{
|
15 |
+
|
16 |
+
public function testCreateWorks()
|
17 |
+
{
|
18 |
+
$this->mockApiCall(
|
19 |
+
new Request('POST', '/v2/customers/cst_FhQJRw4s2n/mandates'),
|
20 |
+
new Response(
|
21 |
+
200,
|
22 |
+
[],
|
23 |
+
'{
|
24 |
+
"resource": "mandate",
|
25 |
+
"id": "mdt_AcQl5fdL4h",
|
26 |
+
"status": "valid",
|
27 |
+
"method": "directdebit",
|
28 |
+
"details": {
|
29 |
+
"consumerName": "John Doe",
|
30 |
+
"consumerAccount": "NL55INGB0000000000",
|
31 |
+
"consumerBic": "INGBNL2A"
|
32 |
+
},
|
33 |
+
"mandateReference": null,
|
34 |
+
"signatureDate": "2018-05-07",
|
35 |
+
"createdAt": "2018-05-07T10:49:08+00:00",
|
36 |
+
"_links": {
|
37 |
+
"self": {
|
38 |
+
"href": "https://api.mollie.com/v2/customers/cst_FhQJRw4s2n/mandates/mdt_AcQl5fdL4h",
|
39 |
+
"type": "application/hal+json"
|
40 |
+
},
|
41 |
+
"customer": {
|
42 |
+
"href": "https://api.mollie.com/v2/customers/cst_FhQJRw4s2n",
|
43 |
+
"type": "application/hal+json"
|
44 |
+
},
|
45 |
+
"documentation": {
|
46 |
+
"href": "https://mollie.com/en/docs/reference/customers/create-mandate",
|
47 |
+
"type": "text/html"
|
48 |
+
}
|
49 |
+
}
|
50 |
+
}'
|
51 |
+
)
|
52 |
+
);
|
53 |
+
|
54 |
+
$customer = $this->getCustomer();
|
55 |
+
|
56 |
+
/** @var Mandate $mandate */
|
57 |
+
$mandate = $customer->createMandate([
|
58 |
+
"consumerName" => "John Doe",
|
59 |
+
"method" => "directdebit",
|
60 |
+
"consumerBic" => "INGBNL2A",
|
61 |
+
"consumerAccount" => "NL55INGB0000000000"
|
62 |
+
]);
|
63 |
+
|
64 |
+
$this->assertInstanceOf(Mandate::class, $mandate);
|
65 |
+
$this->assertEquals("mandate", $mandate->resource);
|
66 |
+
$this->assertEquals(MandateStatus::STATUS_VALID, $mandate->status);
|
67 |
+
$this->assertEquals("directdebit", $mandate->method);
|
68 |
+
$this->assertEquals((object) ["consumerName" => "John Doe", "consumerAccount" => "NL55INGB0000000000", "consumerBic" => "INGBNL2A"], $mandate->details);
|
69 |
+
$this->assertNull($mandate->mandateReference);
|
70 |
+
$this->assertEquals("2018-05-07", $mandate->signatureDate);
|
71 |
+
$this->assertEquals("2018-05-07T10:49:08+00:00", $mandate->createdAt);
|
72 |
+
|
73 |
+
$selfLink = (object)["href" => "https://api.mollie.com/v2/customers/cst_FhQJRw4s2n/mandates/mdt_AcQl5fdL4h", "type" => "application/hal+json"];
|
74 |
+
$this->assertEquals($selfLink, $mandate->_links->self);
|
75 |
+
|
76 |
+
$customerLink = (object)["href" => "https://api.mollie.com/v2/customers/cst_FhQJRw4s2n", "type" => "application/hal+json"];
|
77 |
+
$this->assertEquals($customerLink, $mandate->_links->customer);
|
78 |
+
|
79 |
+
$documentationLink = (object)["href" => "https://mollie.com/en/docs/reference/customers/create-mandate", "type" => "text/html"];
|
80 |
+
$this->assertEquals($documentationLink, $mandate->_links->documentation);
|
81 |
+
}
|
82 |
+
|
83 |
+
public function testGetWorks()
|
84 |
+
{
|
85 |
+
$this->mockApiCall(
|
86 |
+
new Request('GET', '/v2/customers/cst_FhQJRw4s2n/mandates/mdt_AcQl5fdL4h'),
|
87 |
+
new Response(
|
88 |
+
200,
|
89 |
+
[],
|
90 |
+
'{
|
91 |
+
"resource": "mandate",
|
92 |
+
"id": "mdt_AcQl5fdL4h",
|
93 |
+
"status": "valid",
|
94 |
+
"method": "directdebit",
|
95 |
+
"details": {
|
96 |
+
"consumerName": "John Doe",
|
97 |
+
"consumerAccount": "NL55INGB0000000000",
|
98 |
+
"consumerBic": "INGBNL2A"
|
99 |
+
},
|
100 |
+
"mandateReference": null,
|
101 |
+
"signatureDate": "2018-05-07",
|
102 |
+
"createdAt": "2018-05-07T10:49:08+00:00",
|
103 |
+
"_links": {
|
104 |
+
"self": {
|
105 |
+
"href": "https://api.mollie.com/v2/customers/cst_FhQJRw4s2n/mandates/mdt_AcQl5fdL4h",
|
106 |
+
"type": "application/hal+json"
|
107 |
+
},
|
108 |
+
"customer": {
|
109 |
+
"href": "https://api.mollie.com/v2/customers/cst_FhQJRw4s2n",
|
110 |
+
"type": "application/hal+json"
|
111 |
+
},
|
112 |
+
"documentation": {
|
113 |
+
"href": "https://mollie.com/en/docs/reference/customers/create-mandate",
|
114 |
+
"type": "text/html"
|
115 |
+
}
|
116 |
+
}
|
117 |
+
}'
|
118 |
+
)
|
119 |
+
);
|
120 |
+
|
121 |
+
$customer = $this->getCustomer();
|
122 |
+
|
123 |
+
/** @var Mandate $mandate */
|
124 |
+
$mandate = $customer->getMandate("mdt_AcQl5fdL4h");
|
125 |
+
|
126 |
+
$this->assertInstanceOf(Mandate::class, $mandate);
|
127 |
+
$this->assertEquals("mandate", $mandate->resource);
|
128 |
+
$this->assertEquals(MandateStatus::STATUS_VALID, $mandate->status);
|
129 |
+
$this->assertEquals(MandateMethod::DIRECTDEBIT, $mandate->method);
|
130 |
+
$this->assertEquals((object) ["consumerName" => "John Doe", "consumerAccount" => "NL55INGB0000000000", "consumerBic" => "INGBNL2A"], $mandate->details);
|
131 |
+
$this->assertNull($mandate->mandateReference);
|
132 |
+
$this->assertEquals("2018-05-07", $mandate->signatureDate);
|
133 |
+
$this->assertEquals("2018-05-07T10:49:08+00:00", $mandate->createdAt);
|
134 |
+
|
135 |
+
$selfLink = (object)["href" => "https://api.mollie.com/v2/customers/cst_FhQJRw4s2n/mandates/mdt_AcQl5fdL4h", "type" => "application/hal+json"];
|
136 |
+
$this->assertEquals($selfLink, $mandate->_links->self);
|
137 |
+
|
138 |
+
$customerLink = (object)["href" => "https://api.mollie.com/v2/customers/cst_FhQJRw4s2n", "type" => "application/hal+json"];
|
139 |
+
$this->assertEquals($customerLink, $mandate->_links->customer);
|
140 |
+
|
141 |
+
$documentationLink = (object)["href" => "https://mollie.com/en/docs/reference/customers/create-mandate", "type" => "text/html"];
|
142 |
+
$this->assertEquals($documentationLink, $mandate->_links->documentation);
|
143 |
+
}
|
144 |
+
|
145 |
+
public function testListWorks()
|
146 |
+
{
|
147 |
+
$this->mockApiCall(
|
148 |
+
new Request('GET', '/v2/customers/cst_FhQJRw4s2n/mandates'),
|
149 |
+
new Response(
|
150 |
+
200,
|
151 |
+
[],
|
152 |
+
'{
|
153 |
+
"_embedded": {
|
154 |
+
"mandates": [
|
155 |
+
{
|
156 |
+
"resource": "mandate",
|
157 |
+
"id": "mdt_AcQl5fdL4h",
|
158 |
+
"status": "valid",
|
159 |
+
"method": "directdebit",
|
160 |
+
"details": {
|
161 |
+
"consumerName": "John Doe",
|
162 |
+
"consumerAccount": "NL55INGB0000000000",
|
163 |
+
"consumerBic": "INGBNL2A"
|
164 |
+
},
|
165 |
+
"mandateReference": null,
|
166 |
+
"signatureDate": "2018-05-07",
|
167 |
+
"createdAt": "2018-05-07T10:49:08+00:00",
|
168 |
+
"_links": {
|
169 |
+
"self": {
|
170 |
+
"href": "https://api.mollie.com/v2/customers/cst_FhQJRw4s2n/mandates/mdt_AcQl5fdL4h",
|
171 |
+
"type": "application/hal+json"
|
172 |
+
},
|
173 |
+
"customer": {
|
174 |
+
"href": "https://api.mollie.com/v2/customers/cst_FhQJRw4s2n",
|
175 |
+
"type": "application/hal+json"
|
176 |
+
}
|
177 |
+
}
|
178 |
+
}
|
179 |
+
]
|
180 |
+
},
|
181 |
+
"count": 1,
|
182 |
+
"_links": {
|
183 |
+
"documentation": {
|
184 |
+
"href": "https://mollie.com/en/docs/reference/customers/list-mandates",
|
185 |
+
"type": "text/html"
|
186 |
+
},
|
187 |
+
"self": {
|
188 |
+
"href": "https://api.mollie.com/v2/customers/cst_vzEExMcxj7/mandates?limit=50",
|
189 |
+
"type": "application/hal+json"
|
190 |
+
},
|
191 |
+
"previous": null,
|
192 |
+
"next": null
|
193 |
+
}
|
194 |
+
}'
|
195 |
+
)
|
196 |
+
);
|
197 |
+
|
198 |
+
$customer = $this->getCustomer();
|
199 |
+
|
200 |
+
/** @var Mandate $mandate */
|
201 |
+
$mandates = $customer->mandates();
|
202 |
+
$this->assertInstanceOf(MandateCollection::class, $mandates);
|
203 |
+
|
204 |
+
foreach ($mandates as $mandate) {
|
205 |
+
$this->assertInstanceOf(Mandate::class, $mandate);
|
206 |
+
$this->assertEquals("mandate", $mandate->resource);
|
207 |
+
$this->assertEquals(MandateStatus::STATUS_VALID, $mandate->status);
|
208 |
+
|
209 |
+
$customerLink = (object)["href" => "https://api.mollie.com/v2/customers/cst_FhQJRw4s2n", "type" => "application/hal+json"];
|
210 |
+
$this->assertEquals($customerLink, $mandate->_links->customer);
|
211 |
+
}
|
212 |
+
|
213 |
+
$selfLink = (object)["href" => "https://api.mollie.com/v2/customers/cst_vzEExMcxj7/mandates?limit=50", "type" => "application/hal+json"];
|
214 |
+
$this->assertEquals($selfLink, $mandates->_links->self);
|
215 |
+
|
216 |
+
$documentationLink = (object)["href" => "https://mollie.com/en/docs/reference/customers/list-mandates", "type" => "text/html"];
|
217 |
+
$this->assertEquals($documentationLink, $mandates->_links->documentation);
|
218 |
+
}
|
219 |
+
|
220 |
+
public function testCustomerHasValidMandateWhenTrue()
|
221 |
+
{
|
222 |
+
$this->mockApiCall(
|
223 |
+
new Request('GET', '/v2/customers/cst_FhQJRw4s2n/mandates'),
|
224 |
+
new Response(
|
225 |
+
200,
|
226 |
+
[],
|
227 |
+
'{
|
228 |
+
"_embedded": {
|
229 |
+
"mandates": [
|
230 |
+
{
|
231 |
+
"resource": "mandate",
|
232 |
+
"id": "mdt_AcQl5fdL4h",
|
233 |
+
"status": "valid",
|
234 |
+
"method": "directdebit",
|
235 |
+
"details": {
|
236 |
+
"consumerName": "John Doe",
|
237 |
+
"consumerAccount": "NL55INGB0000000000",
|
238 |
+
"consumerBic": "INGBNL2A"
|
239 |
+
},
|
240 |
+
"mandateReference": null,
|
241 |
+
"signatureDate": "2018-05-07",
|
242 |
+
"createdAt": "2018-05-07T10:49:08+00:00",
|
243 |
+
"_links": {
|
244 |
+
"self": {
|
245 |
+
"href": "https://api.mollie.com/v2/customers/cst_FhQJRw4s2n/mandates/mdt_AcQl5fdL4h",
|
246 |
+
"type": "application/hal+json"
|
247 |
+
},
|
248 |
+
"customer": {
|
249 |
+
"href": "https://api.mollie.com/v2/customers/cst_FhQJRw4s2n",
|
250 |
+
"type": "application/hal+json"
|
251 |
+
}
|
252 |
+
}
|
253 |
+
}
|
254 |
+
]
|
255 |
+
},
|
256 |
+
"count": 1,
|
257 |
+
"_links": {
|
258 |
+
"documentation": {
|
259 |
+
"href": "https://mollie.com/en/docs/reference/customers/list-mandates",
|
260 |
+
"type": "text/html"
|
261 |
+
},
|
262 |
+
"self": {
|
263 |
+
"href": "https://api.mollie.com/v2/customers/cst_vzEExMcxj7/mandates?limit=50",
|
264 |
+
"type": "application/hal+json"
|
265 |
+
},
|
266 |
+
"previous": null,
|
267 |
+
"next": null
|
268 |
+
}
|
269 |
+
}'
|
270 |
+
)
|
271 |
+
);
|
272 |
+
|
273 |
+
$customer = $this->getCustomer();
|
274 |
+
|
275 |
+
$this->assertTrue($customer->hasValidMandate());
|
276 |
+
}
|
277 |
+
|
278 |
+
public function testCustomerHasValidMandateWhenFalse()
|
279 |
+
{
|
280 |
+
$this->mockApiCall(
|
281 |
+
new Request('GET', '/v2/customers/cst_FhQJRw4s2n/mandates'),
|
282 |
+
new Response(
|
283 |
+
200,
|
284 |
+
[],
|
285 |
+
'{
|
286 |
+
"_embedded": {
|
287 |
+
"mandates": []
|
288 |
+
},
|
289 |
+
"count": 0,
|
290 |
+
"_links": {
|
291 |
+
"documentation": {
|
292 |
+
"href": "https://mollie.com/en/docs/reference/customers/list-mandates",
|
293 |
+
"type": "text/html"
|
294 |
+
},
|
295 |
+
"self": {
|
296 |
+
"href": "https://api.mollie.com/v2/customers/cst_vzEExMcxj7/mandates?limit=50",
|
297 |
+
"type": "application/hal+json"
|
298 |
+
},
|
299 |
+
"previous": null,
|
300 |
+
"next": null
|
301 |
+
}
|
302 |
+
}'
|
303 |
+
)
|
304 |
+
);
|
305 |
+
|
306 |
+
$customer = $this->getCustomer();
|
307 |
+
|
308 |
+
$this->assertFalse($customer->hasValidMandate());
|
309 |
+
}
|
310 |
+
|
311 |
+
public function testCustomerHasValidMandateForMethodWhenFalse()
|
312 |
+
{
|
313 |
+
$this->mockApiCall(
|
314 |
+
new Request('GET', '/v2/customers/cst_FhQJRw4s2n/mandates'),
|
315 |
+
new Response(
|
316 |
+
200,
|
317 |
+
[],
|
318 |
+
'{
|
319 |
+
"_embedded": {
|
320 |
+
"mandates": []
|
321 |
+
},
|
322 |
+
"count": 0,
|
323 |
+
"_links": {
|
324 |
+
"documentation": {
|
325 |
+
"href": "https://mollie.com/en/docs/reference/customers/list-mandates",
|
326 |
+
"type": "text/html"
|
327 |
+
},
|
328 |
+
"self": {
|
329 |
+
"href": "https://api.mollie.com/v2/customers/cst_vzEExMcxj7/mandates?limit=50",
|
330 |
+
"type": "application/hal+json"
|
331 |
+
},
|
332 |
+
"previous": null,
|
333 |
+
"next": null
|
334 |
+
}
|
335 |
+
}'
|
336 |
+
)
|
337 |
+
);
|
338 |
+
|
339 |
+
$customer = $this->getCustomer();
|
340 |
+
|
341 |
+
$this->assertFalse($customer->hasValidMandateForMethod('directdebit'));
|
342 |
+
}
|
343 |
+
|
344 |
+
public function testCustomerHasValidMandateForMethodWhenTrue()
|
345 |
+
{
|
346 |
+
$this->mockApiCall(
|
347 |
+
new Request('GET', '/v2/customers/cst_FhQJRw4s2n/mandates'),
|
348 |
+
new Response(
|
349 |
+
200,
|
350 |
+
[],
|
351 |
+
'{
|
352 |
+
"_embedded": {
|
353 |
+
"mandates": [
|
354 |
+
{
|
355 |
+
"resource": "mandate",
|
356 |
+
"id": "mdt_AcQl5fdL4h",
|
357 |
+
"status": "valid",
|
358 |
+
"method": "directdebit",
|
359 |
+
"details": {
|
360 |
+
"consumerName": "John Doe",
|
361 |
+
"consumerAccount": "NL55INGB0000000000",
|
362 |
+
"consumerBic": "INGBNL2A"
|
363 |
+
},
|
364 |
+
"mandateReference": null,
|
365 |
+
"signatureDate": "2018-05-07",
|
366 |
+
"createdAt": "2018-05-07T10:49:08+00:00",
|
367 |
+
"_links": {
|
368 |
+
"self": {
|
369 |
+
"href": "https://api.mollie.com/v2/customers/cst_FhQJRw4s2n/mandates/mdt_AcQl5fdL4h",
|
370 |
+
"type": "application/hal+json"
|
371 |
+
},
|
372 |
+
"customer": {
|
373 |
+
"href": "https://api.mollie.com/v2/customers/cst_FhQJRw4s2n",
|
374 |
+
"type": "application/hal+json"
|
375 |
+
}
|
376 |
+
}
|
377 |
+
}
|
378 |
+
]
|
379 |
+
},
|
380 |
+
"count": 1,
|
381 |
+
"_links": {
|
382 |
+
"documentation": {
|
383 |
+
"href": "https://mollie.com/en/docs/reference/customers/list-mandates",
|
384 |
+
"type": "text/html"
|
385 |
+
},
|
386 |
+
"self": {
|
387 |
+
"href": "https://api.mollie.com/v2/customers/cst_vzEExMcxj7/mandates?limit=50",
|
388 |
+
"type": "application/hal+json"
|
389 |
+
},
|
390 |
+
"previous": null,
|
391 |
+
"next": null
|
392 |
+
}
|
393 |
+
}'
|
394 |
+
)
|
395 |
+
);
|
396 |
+
|
397 |
+
$customer = $this->getCustomer();
|
398 |
+
|
399 |
+
$this->assertTrue($customer->hasValidMandateForMethod('directdebit'));
|
400 |
+
}
|
401 |
+
|
402 |
+
/**
|
403 |
+
* @return Customer
|
404 |
+
*/
|
405 |
+
private function getCustomer()
|
406 |
+
{
|
407 |
+
$customerJson = '{
|
408 |
+
"resource": "customer",
|
409 |
+
"id": "cst_FhQJRw4s2n",
|
410 |
+
"mode": "test",
|
411 |
+
"name": "John Doe",
|
412 |
+
"email": "johndoe@example.org",
|
413 |
+
"locale": null,
|
414 |
+
"metadata": null,
|
415 |
+
"recentlyUsedMethods": [],
|
416 |
+
"createdAt": "2018-04-19T08:49:01+00:00",
|
417 |
+
"_links": {
|
418 |
+
"documentation": {
|
419 |
+
"href": "https://docs.mollie.com/reference/v2/customers-api/get-customer",
|
420 |
+
"type": "text/html"
|
421 |
+
}
|
422 |
+
}
|
423 |
+
}';
|
424 |
+
|
425 |
+
return $this->copy(json_decode($customerJson), new Customer($this->apiClient));
|
426 |
+
}
|
427 |
+
|
428 |
+
}
|
includes/mollie-api-php/tests/Mollie/API/Endpoints/MethodEndpointTest.php
ADDED
@@ -0,0 +1,641 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tests\Mollie\Api\Endpoints;
|
4 |
+
|
5 |
+
use GuzzleHttp\Psr7\Request;
|
6 |
+
use GuzzleHttp\Psr7\Response;
|
7 |
+
use Mollie\Api\Resources\Issuer;
|
8 |
+
use Mollie\Api\Resources\IssuerCollection;
|
9 |
+
use Mollie\Api\Resources\Method;
|
10 |
+
use Mollie\Api\Resources\MethodCollection;
|
11 |
+
use Mollie\Api\Resources\MethodPrice;
|
12 |
+
use Mollie\Api\Resources\MethodPriceCollection;
|
13 |
+
use stdClass;
|
14 |
+
use Tests\Mollie\TestHelpers\AmountObjectTestHelpers;
|
15 |
+
use Tests\Mollie\TestHelpers\LinkObjectTestHelpers;
|
16 |
+
|
17 |
+
class MethodEndpointTest extends BaseEndpointTest
|
18 |
+
{
|
19 |
+
use LinkObjectTestHelpers;
|
20 |
+
use AmountObjectTestHelpers;
|
21 |
+
|
22 |
+
public function testGetMethod()
|
23 |
+
{
|
24 |
+
$this->mockApiCall(
|
25 |
+
new Request('GET', '/v2/methods/ideal'),
|
26 |
+
new Response(
|
27 |
+
200,
|
28 |
+
[],
|
29 |
+
'{
|
30 |
+
"resource": "method",
|
31 |
+
"id": "ideal",
|
32 |
+
"description": "iDEAL",
|
33 |
+
"minimumAmount": {
|
34 |
+
"value": "0.01",
|
35 |
+
"currency": "EUR"
|
36 |
+
},
|
37 |
+
"maximumAmount": {
|
38 |
+
"value": "50000.00",
|
39 |
+
"currency": "EUR"
|
40 |
+
},
|
41 |
+
"image": {
|
42 |
+
"size1x": "https://www.mollie.com/images/payscreen/methods/ideal.png",
|
43 |
+
"size2x": "https://www.mollie.com/images/payscreen/methods/ideal%402x.png"
|
44 |
+
},
|
45 |
+
"_links": {
|
46 |
+
"self": {
|
47 |
+
"href": "https://api.mollie.com/v2/methods/ideal",
|
48 |
+
"type": "application/hal+json"
|
49 |
+
},
|
50 |
+
"documentation": {
|
51 |
+
"href": "https://docs.mollie.com/reference/v2/methods-api/get-method",
|
52 |
+
"type": "text/html"
|
53 |
+
}
|
54 |
+
}
|
55 |
+
}'
|
56 |
+
)
|
57 |
+
);
|
58 |
+
|
59 |
+
$idealMethod = $this->apiClient->methods->get('ideal');
|
60 |
+
|
61 |
+
$this->assertInstanceOf(Method::class, $idealMethod);
|
62 |
+
$this->assertEquals('ideal', $idealMethod->id);
|
63 |
+
$this->assertEquals('iDEAL', $idealMethod->description);
|
64 |
+
$this->assertAmountObject(0.01, 'EUR', $idealMethod->minimumAmount);
|
65 |
+
$this->assertAmountObject(50000, 'EUR', $idealMethod->maximumAmount);
|
66 |
+
$this->assertEquals('https://www.mollie.com/images/payscreen/methods/ideal.png', $idealMethod->image->size1x);
|
67 |
+
$this->assertEquals('https://www.mollie.com/images/payscreen/methods/ideal%402x.png', $idealMethod->image->size2x);
|
68 |
+
|
69 |
+
$this->assertLinkObject(
|
70 |
+
'https://api.mollie.com/v2/methods/ideal',
|
71 |
+
'application/hal+json',
|
72 |
+
$idealMethod->_links->self
|
73 |
+
);
|
74 |
+
|
75 |
+
$this->assertLinkObject(
|
76 |
+
'https://docs.mollie.com/reference/v2/methods-api/get-method',
|
77 |
+
'text/html',
|
78 |
+
$idealMethod->_links->documentation
|
79 |
+
);
|
80 |
+
}
|
81 |
+
|
82 |
+
public function testGetMethodWithIncludeIssuers()
|
83 |
+
{
|
84 |
+
$this->mockApiCall(
|
85 |
+
new Request('GET', '/v2/methods/ideal?include=issuers'),
|
86 |
+
new Response(
|
87 |
+
200,
|
88 |
+
[],
|
89 |
+
'{
|
90 |
+
"resource": "method",
|
91 |
+
"id": "ideal",
|
92 |
+
"description": "iDEAL",
|
93 |
+
"minimumAmount": {
|
94 |
+
"value": "0.01",
|
95 |
+
"currency": "EUR"
|
96 |
+
},
|
97 |
+
"maximumAmount": {
|
98 |
+
"value": "50000.00",
|
99 |
+
"currency": "EUR"
|
100 |
+
},
|
101 |
+
"image": {
|
102 |
+
"size1x": "https://www.mollie.com/images/payscreen/methods/ideal.png",
|
103 |
+
"size2x": "https://www.mollie.com/images/payscreen/methods/ideal%402x.png"
|
104 |
+
},
|
105 |
+
"issuers": [
|
106 |
+
{
|
107 |
+
"resource": "issuer",
|
108 |
+
"id": "ideal_TESTNL99",
|
109 |
+
"name": "TBM Bank",
|
110 |
+
"method": "ideal",
|
111 |
+
"image": {
|
112 |
+
"size1x": "https://www.mollie.com/images/checkout/v2/ideal-issuer-icons/TESTNL99.png",
|
113 |
+
"size2x": "https://www.mollie.com/images/checkout/v2/ideal-issuer-icons/TESTNL99.png"
|
114 |
+
}
|
115 |
+
}
|
116 |
+
],
|
117 |
+
|
118 |
+
"_links": {
|
119 |
+
"self": {
|
120 |
+
"href": "https://api.mollie.com/v2/methods/ideal",
|
121 |
+
"type": "application/hal+json"
|
122 |
+
},
|
123 |
+
"documentation": {
|
124 |
+
"href": "https://docs.mollie.com/reference/v2/methods-api/get-method",
|
125 |
+
"type": "text/html"
|
126 |
+
}
|
127 |
+
}
|
128 |
+
}'
|
129 |
+
)
|
130 |
+
);
|
131 |
+
|
132 |
+
$idealMethod = $this->apiClient->methods->get('ideal', ['include' => 'issuers']);
|
133 |
+
|
134 |
+
$this->assertInstanceOf(Method::class, $idealMethod);
|
135 |
+
$this->assertEquals('ideal', $idealMethod->id);
|
136 |
+
$this->assertEquals('iDEAL', $idealMethod->description);
|
137 |
+
$this->assertAmountObject(0.01, 'EUR', $idealMethod->minimumAmount);
|
138 |
+
$this->assertAmountObject(50000, 'EUR', $idealMethod->maximumAmount);
|
139 |
+
$this->assertEquals('https://www.mollie.com/images/payscreen/methods/ideal.png', $idealMethod->image->size1x);
|
140 |
+
$this->assertEquals('https://www.mollie.com/images/payscreen/methods/ideal%402x.png', $idealMethod->image->size2x);
|
141 |
+
|
142 |
+
$issuers = $idealMethod->issuers();
|
143 |
+
$this->assertInstanceOf(IssuerCollection::class, $issuers);
|
144 |
+
$this->assertCount(1, $issuers);
|
145 |
+
|
146 |
+
$testIssuer = $issuers[0];
|
147 |
+
|
148 |
+
$this->assertInstanceOf(Issuer::class, $testIssuer);
|
149 |
+
$this->assertEquals('ideal_TESTNL99', $testIssuer->id);
|
150 |
+
$this->assertEquals('TBM Bank', $testIssuer->name);
|
151 |
+
$this->assertEquals('ideal', $testIssuer->method);
|
152 |
+
|
153 |
+
$expectedSize1xImageLink = 'https://www.mollie.com/images/checkout/v2/ideal-issuer-icons/TESTNL99.png';
|
154 |
+
$this->assertEquals($expectedSize1xImageLink, $testIssuer->image->size1x);
|
155 |
+
|
156 |
+
$expectedSize2xImageLink = 'https://www.mollie.com/images/checkout/v2/ideal-issuer-icons/TESTNL99.png';
|
157 |
+
$this->assertEquals($expectedSize2xImageLink, $testIssuer->image->size2x);
|
158 |
+
|
159 |
+
$this->assertLinkObject(
|
160 |
+
'https://api.mollie.com/v2/methods/ideal',
|
161 |
+
'application/hal+json',
|
162 |
+
$idealMethod->_links->self
|
163 |
+
);
|
164 |
+
|
165 |
+
$this->assertLinkObject(
|
166 |
+
'https://docs.mollie.com/reference/v2/methods-api/get-method',
|
167 |
+
'text/html',
|
168 |
+
$idealMethod->_links->documentation
|
169 |
+
);
|
170 |
+
}
|
171 |
+
|
172 |
+
public function testGetMethodWithIncludePricing()
|
173 |
+
{
|
174 |
+
$this->mockApiCall(
|
175 |
+
new Request('GET', '/v2/methods/ideal?include=pricing'),
|
176 |
+
new Response(
|
177 |
+
200,
|
178 |
+
[],
|
179 |
+
'{
|
180 |
+
"resource": "method",
|
181 |
+
"id": "ideal",
|
182 |
+
"description": "iDEAL",
|
183 |
+
"minimumAmount": {
|
184 |
+
"value": "0.01",
|
185 |
+
"currency": "EUR"
|
186 |
+
},
|
187 |
+
"maximumAmount": {
|
188 |
+
"value": "50000.00",
|
189 |
+
"currency": "EUR"
|
190 |
+
},
|
191 |
+
"image": {
|
192 |
+
"size1x": "https://www.mollie.com/external/icons/payment-methods/ideal.png",
|
193 |
+
"size2x": "https://www.mollie.com/external/icons/payment-methods/ideal%402x.png",
|
194 |
+
"svg": "https://www.mollie.com/external/icons/payment-methods/ideal.svg"
|
195 |
+
},
|
196 |
+
"pricing": [
|
197 |
+
{
|
198 |
+
"description": "The Netherlands",
|
199 |
+
"fixed": {
|
200 |
+
"value": "0.29",
|
201 |
+
"currency": "EUR"
|
202 |
+
},
|
203 |
+
"variable": "0"
|
204 |
+
}
|
205 |
+
],
|
206 |
+
"_links": {
|
207 |
+
"self": {
|
208 |
+
"href": "https://api.mollie.com/v2/methods/ideal",
|
209 |
+
"type": "application/hal+json"
|
210 |
+
},
|
211 |
+
"documentation": {
|
212 |
+
"href": "https://docs.mollie.com/reference/v2/methods-api/get-method",
|
213 |
+
"type": "text/html"
|
214 |
+
}
|
215 |
+
}
|
216 |
+
}'
|
217 |
+
)
|
218 |
+
);
|
219 |
+
|
220 |
+
$method = $this->apiClient->methods->get('ideal', ['include' => 'pricing']);
|
221 |
+
|
222 |
+
$this->assertInstanceOf(Method::class, $method);
|
223 |
+
$this->assertEquals('method', $method->resource);
|
224 |
+
$this->assertEquals('ideal', $method->id);
|
225 |
+
$this->assertEquals('iDEAL', $method->description);
|
226 |
+
$this->assertAmountObject(0.01, 'EUR', $method->minimumAmount);
|
227 |
+
$this->assertAmountObject(50000, 'EUR', $method->maximumAmount);
|
228 |
+
$this->assertEquals(
|
229 |
+
'https://www.mollie.com/external/icons/payment-methods/ideal.png',
|
230 |
+
$method->image->size1x);
|
231 |
+
$this->assertEquals(
|
232 |
+
'https://www.mollie.com/external/icons/payment-methods/ideal%402x.png',
|
233 |
+
$method->image->size2x);
|
234 |
+
|
235 |
+
$this->assertEquals(
|
236 |
+
'https://www.mollie.com/external/icons/payment-methods/ideal.svg',
|
237 |
+
$method->image->svg);
|
238 |
+
|
239 |
+
$this->assertLinkObject(
|
240 |
+
'https://api.mollie.com/v2/methods/ideal',
|
241 |
+
'application/hal+json',
|
242 |
+
$method->_links->self
|
243 |
+
);
|
244 |
+
|
245 |
+
$this->assertLinkObject(
|
246 |
+
'https://docs.mollie.com/reference/v2/methods-api/get-method',
|
247 |
+
'text/html',
|
248 |
+
$method->_links->documentation
|
249 |
+
);
|
250 |
+
|
251 |
+
$price = $method->pricing[0];
|
252 |
+
|
253 |
+
$this->assertEquals('The Netherlands', $price->description);
|
254 |
+
$this->assertAmountObject(0.29, 'EUR', $price->fixed);
|
255 |
+
$this->assertEquals('0', $price->variable);
|
256 |
+
|
257 |
+
$method_prices = $method->pricing();
|
258 |
+
|
259 |
+
$this->assertInstanceOf(MethodPriceCollection::class, $method_prices);
|
260 |
+
|
261 |
+
$method_price = $method_prices[0];
|
262 |
+
$this->assertInstanceOf(MethodPrice::class, $method_price);
|
263 |
+
$this->assertAmountObject(0.29, 'EUR', $method_price->fixed);
|
264 |
+
$this->assertEquals('0', $method_price->variable);
|
265 |
+
}
|
266 |
+
|
267 |
+
public function testGetTranslatedMethod()
|
268 |
+
{
|
269 |
+
$this->mockApiCall(
|
270 |
+
new Request('GET', '/v2/methods/sofort?locale=de_DE'),
|
271 |
+
new Response(
|
272 |
+
200,
|
273 |
+
[],
|
274 |
+
'{
|
275 |
+
"resource": "method",
|
276 |
+
"id": "sofort",
|
277 |
+
"description": "SOFORT \u00dcberweisung",
|
278 |
+
"minimumAmount": {
|
279 |
+
"value": "0.01",
|
280 |
+
"currency": "EUR"
|
281 |
+
},
|
282 |
+
"maximumAmount": {
|
283 |
+
"value": "50000.00",
|
284 |
+
"currency": "EUR"
|
285 |
+
},
|
286 |
+
"image": {
|
287 |
+
"size1x": "https://www.mollie.com/images/payscreen/methods/sofort.png",
|
288 |
+
"size2x": "https://www.mollie.com/images/payscreen/methods/sofort%402x.png"
|
289 |
+
},
|
290 |
+
"_links": {
|
291 |
+
"self": {
|
292 |
+
"href": "https://api.mollie.com/v2/methods/sofort",
|
293 |
+
"type": "application/hal+json"
|
294 |
+
},
|
295 |
+
"documentation": {
|
296 |
+
"href": "https://docs.mollie.com/reference/v2/methods-api/get-method",
|
297 |
+
"type": "text/html"
|
298 |
+
}
|
299 |
+
}
|
300 |
+
}'
|
301 |
+
)
|
302 |
+
);
|
303 |
+
|
304 |
+
$method = $this->apiClient->methods->get('sofort', ['locale' => 'de_DE']);
|
305 |
+
|
306 |
+
$this->assertInstanceOf(Method::class, $method);
|
307 |
+
$this->assertEquals('sofort', $method->id);
|
308 |
+
$this->assertEquals('SOFORT Überweisung', $method->description);
|
309 |
+
$this->assertAmountObject(0.01, 'EUR', $method->minimumAmount);
|
310 |
+
$this->assertAmountObject(50000, 'EUR', $method->maximumAmount);
|
311 |
+
|
312 |
+
$amount = new Stdclass();
|
313 |
+
$amount->size1x = 'https://www.mollie.com/images/payscreen/methods/sofort.png';
|
314 |
+
$amount->size2x = 'https://www.mollie.com/images/payscreen/methods/sofort%402x.png';
|
315 |
+
|
316 |
+
$selfLink = (object)[
|
317 |
+
'href' => 'https://api.mollie.com/v2/methods/sofort',
|
318 |
+
'type' => 'application/hal+json'
|
319 |
+
];
|
320 |
+
$this->assertEquals($selfLink, $method->_links->self);
|
321 |
+
|
322 |
+
$documentationLink = (object)[
|
323 |
+
'href' => 'https://docs.mollie.com/reference/v2/methods-api/get-method',
|
324 |
+
'type' => 'text/html'
|
325 |
+
];
|
326 |
+
|
327 |
+
$this->assertEquals($documentationLink, $method->_links->documentation);
|
328 |
+
}
|
329 |
+
|
330 |
+
public function testListAllActiveMethods()
|
331 |
+
{
|
332 |
+
$this->mockApiCall(
|
333 |
+
new Request('GET', '/v2/methods'),
|
334 |
+
new Response(
|
335 |
+
200,
|
336 |
+
[],
|
337 |
+
'{
|
338 |
+
"_embedded": {
|
339 |
+
"methods": [
|
340 |
+
{
|
341 |
+
"resource": "method",
|
342 |
+
"id": "ideal",
|
343 |
+
"description": "iDEAL",
|
344 |
+
"minimumAmount": {
|
345 |
+
"value": "0.01",
|
346 |
+
"currency": "EUR"
|
347 |
+
},
|
348 |
+
"maximumAmount": {
|
349 |
+
"value": "50000.00",
|
350 |
+
"currency": "EUR"
|
351 |
+
},
|
352 |
+
"image": {
|
353 |
+
"size1x": "https://www.mollie.com/images/payscreen/methods/ideal.png",
|
354 |
+
"size2x": "https://www.mollie.com/images/payscreen/methods/ideal%402x.png"
|
355 |
+
},
|
356 |
+
"_links": {
|
357 |
+
"self": {
|
358 |
+
"href": "https://api.mollie.com/v2/methods/ideal",
|
359 |
+
"type": "application/hal+json"
|
360 |
+
}
|
361 |
+
}
|
362 |
+
},
|
363 |
+
{
|
364 |
+
"resource": "method",
|
365 |
+
"id": "creditcard",
|
366 |
+
"description": "Credit card",
|
367 |
+
"minimumAmount": {
|
368 |
+
"value": "0.01",
|
369 |
+
"currency": "EUR"
|
370 |
+
},
|
371 |
+
"maximumAmount": {
|
372 |
+
"value": "2000.00",
|
373 |
+
"currency": "EUR"
|
374 |
+
},
|
375 |
+
"image": {
|
376 |
+
"size1x": "https://www.mollie.com/images/payscreen/methods/creditcard.png",
|
377 |
+
"size2x": "https://www.mollie.com/images/payscreen/methods/creditcard%402x.png"
|
378 |
+
},
|
379 |
+
"_links": {
|
380 |
+
"self": {
|
381 |
+
"href": "https://api.mollie.com/v2/methods/creditcard",
|
382 |
+
"type": "application/hal+json"
|
383 |
+
}
|
384 |
+
}
|
385 |
+
},
|
386 |
+
{
|
387 |
+
"resource": "method",
|
388 |
+
"id": "mistercash",
|
389 |
+
"description": "Bancontact",
|
390 |
+
"minimumAmount": {
|
391 |
+
"value": "0.02",
|
392 |
+
"currency": "EUR"
|
393 |
+
},
|
394 |
+
"maximumAmount": {
|
395 |
+
"value": "50000.00",
|
396 |
+
"currency": "EUR"
|
397 |
+
},
|
398 |
+
"image": {
|
399 |
+
"size1x": "https://www.mollie.com/images/payscreen/methods/mistercash.png",
|
400 |
+
"size2x": "https://www.mollie.com/images/payscreen/methods/mistercash%402x.png"
|
401 |
+
},
|
402 |
+
"_links": {
|
403 |
+
"self": {
|
404 |
+
"href": "https://api.mollie.com/v2/methods/mistercash",
|
405 |
+
"type": "application/hal+json"
|
406 |
+
}
|
407 |
+
}
|
408 |
+
},
|
409 |
+
{
|
410 |
+
"resource": "method",
|
411 |
+
"id": "giftcard",
|
412 |
+
"description": "Gift cards",
|
413 |
+
"minimumAmount": {
|
414 |
+
"value": "0.01",
|
415 |
+
"currency": "EUR"
|
416 |
+
},
|
417 |
+
"maximumAmount": null,
|
418 |
+
"image": {
|
419 |
+
"size1x": "https://www.mollie.com/images/payscreen/methods/giftcard.png",
|
420 |
+
"size2x": "https://www.mollie.com/images/payscreen/methods/giftcard%402x.png"
|
421 |
+
},
|
422 |
+
"_links": {
|
423 |
+
"self": {
|
424 |
+
"href": "https://api.mollie.com/v2/methods/giftcard",
|
425 |
+
"type": "application/hal+json"
|
426 |
+
}
|
427 |
+
}
|
428 |
+
}
|
429 |
+
]
|
430 |
+
},
|
431 |
+
"count": 4,
|
432 |
+
"_links": {
|
433 |
+
"documentation": {
|
434 |
+
"href": "https://docs.mollie.com/reference/v2/methods-api/list-methods",
|
435 |
+
"type": "text/html"
|
436 |
+
},
|
437 |
+
"self": {
|
438 |
+
"href": "http://api.mollie.com/v2/methods",
|
439 |
+
"type": "application/hal+json"
|
440 |
+
}
|
441 |
+
}
|
442 |
+
}'
|
443 |
+
)
|
444 |
+
);
|
445 |
+
|
446 |
+
$methods = $this->apiClient->methods->allActive();
|
447 |
+
|
448 |
+
$this->assertInstanceOf(MethodCollection::class, $methods);
|
449 |
+
$this->assertEquals(4, $methods->count);
|
450 |
+
$this->assertCount(4, $methods);
|
451 |
+
|
452 |
+
$documentationLink = (object)[
|
453 |
+
'href' => 'https://docs.mollie.com/reference/v2/methods-api/list-methods',
|
454 |
+
'type' => 'text/html'
|
455 |
+
];
|
456 |
+
$this->assertEquals($documentationLink, $methods->_links->documentation);
|
457 |
+
|
458 |
+
$selfLink = (object)[
|
459 |
+
'href' => 'http://api.mollie.com/v2/methods',
|
460 |
+
'type' => 'application/hal+json'
|
461 |
+
];
|
462 |
+
$this->assertEquals($selfLink, $methods->_links->self);
|
463 |
+
|
464 |
+
$creditcardMethod = $methods[1];
|
465 |
+
|
466 |
+
$this->assertInstanceOf(Method::class, $creditcardMethod);
|
467 |
+
$this->assertEquals('creditcard', $creditcardMethod->id);
|
468 |
+
$this->assertEquals('Credit card', $creditcardMethod->description);
|
469 |
+
$this->assertAmountObject(0.01, 'EUR', $creditcardMethod->minimumAmount);
|
470 |
+
$this->assertAmountObject(2000, 'EUR', $creditcardMethod->maximumAmount);
|
471 |
+
$this->assertEquals('https://www.mollie.com/images/payscreen/methods/creditcard.png', $creditcardMethod->image->size1x);
|
472 |
+
$this->assertEquals('https://www.mollie.com/images/payscreen/methods/creditcard%402x.png', $creditcardMethod->image->size2x);
|
473 |
+
|
474 |
+
$selfLink = (object)[
|
475 |
+
'href' => 'https://api.mollie.com/v2/methods/creditcard',
|
476 |
+
'type' => 'application/hal+json'
|
477 |
+
];
|
478 |
+
$this->assertEquals($selfLink, $creditcardMethod->_links->self);
|
479 |
+
}
|
480 |
+
|
481 |
+
public function testListAllAvailableMethods()
|
482 |
+
{
|
483 |
+
$this->mockApiCall(
|
484 |
+
new Request('GET', '/v2/methods/all?include=pricing'),
|
485 |
+
new Response(
|
486 |
+
200,
|
487 |
+
[],
|
488 |
+
'{
|
489 |
+
"_embedded": {
|
490 |
+
"methods": [
|
491 |
+
{
|
492 |
+
"resource": "method",
|
493 |
+
"id": "ideal",
|
494 |
+
"description": "iDEAL",
|
495 |
+
"minimumAmount": {
|
496 |
+
"value": "0.01",
|
497 |
+
"currency": "EUR"
|
498 |
+
},
|
499 |
+
"maximumAmount": {
|
500 |
+
"value": "50000.00",
|
501 |
+
"currency": "EUR"
|
502 |
+
},
|
503 |
+
"image": {
|
504 |
+
"size1x": "https://www.mollie.com/images/payscreen/methods/ideal.png",
|
505 |
+
"size2x": "https://www.mollie.com/images/payscreen/methods/ideal%402x.png"
|
506 |
+
},
|
507 |
+
"pricing": [
|
508 |
+
{
|
509 |
+
"description": "Netherlands",
|
510 |
+
"fixed": {
|
511 |
+
"value": "0.29",
|
512 |
+
"currency": "EUR"
|
513 |
+
},
|
514 |
+
"variable": "0"
|
515 |
+
}
|
516 |
+
],
|
517 |
+
"_links": {
|
518 |
+
"self": {
|
519 |
+
"href": "https://api.mollie.com/v2/methods/ideal",
|
520 |
+
"type": "application/hal+json"
|
521 |
+
}
|
522 |
+
}
|
523 |
+
},
|
524 |
+
{
|
525 |
+
"resource": "method",
|
526 |
+
"id": "creditcard",
|
527 |
+
"description": "Credit card",
|
528 |
+
"minimumAmount": {
|
529 |
+
"value": "0.01",
|
530 |
+
"currency": "EUR"
|
531 |
+
},
|
532 |
+
"maximumAmount": {
|
533 |
+
"value": "2000.00",
|
534 |
+
"currency": "EUR"
|
535 |
+
},
|
536 |
+
"image": {
|
537 |
+
"size1x": "https://www.mollie.com/images/payscreen/methods/creditcard.png",
|
538 |
+
"size2x": "https://www.mollie.com/images/payscreen/methods/creditcard%402x.png"
|
539 |
+
},
|
540 |
+
"_links": {
|
541 |
+
"self": {
|
542 |
+
"href": "https://api.mollie.com/v2/methods/creditcard",
|
543 |
+
"type": "application/hal+json"
|
544 |
+
}
|
545 |
+
}
|
546 |
+
},
|
547 |
+
{
|
548 |
+
"resource": "method",
|
549 |
+
"id": "mistercash",
|
550 |
+
"description": "Bancontact",
|
551 |
+
"minimumAmount": {
|
552 |
+
"value": "0.02",
|
553 |
+
"currency": "EUR"
|
554 |
+
},
|
555 |
+
"maximumAmount": {
|
556 |
+
"value": "50000.00",
|
557 |
+
"currency": "EUR"
|
558 |
+
},
|
559 |
+
"image": {
|
560 |
+
"size1x": "https://www.mollie.com/images/payscreen/methods/mistercash.png",
|
561 |
+
"size2x": "https://www.mollie.com/images/payscreen/methods/mistercash%402x.png"
|
562 |
+
},
|
563 |
+
"_links": {
|
564 |
+
"self": {
|
565 |
+
"href": "https://api.mollie.com/v2/methods/mistercash",
|
566 |
+
"type": "application/hal+json"
|
567 |
+
}
|
568 |
+
}
|
569 |
+
},
|
570 |
+
{
|
571 |
+
"resource": "method",
|
572 |
+
"id": "giftcard",
|
573 |
+
"description": "Gift cards",
|
574 |
+
"minimumAmount": {
|
575 |
+
"value": "0.01",
|
576 |
+
"currency": "EUR"
|
577 |
+
},
|
578 |
+
"maximumAmount": null,
|
579 |
+
"image": {
|
580 |
+
"size1x": "https://www.mollie.com/images/payscreen/methods/giftcard.png",
|
581 |
+
"size2x": "https://www.mollie.com/images/payscreen/methods/giftcard%402x.png"
|
582 |
+
},
|
583 |
+
"_links": {
|
584 |
+
"self": {
|
585 |
+
"href": "https://api.mollie.com/v2/methods/giftcard",
|
586 |
+
"type": "application/hal+json"
|
587 |
+
}
|
588 |
+
}
|
589 |
+
}
|
590 |
+
]
|
591 |
+
},
|
592 |
+
"count": 4,
|
593 |
+
"_links": {
|
594 |
+
"documentation": {
|
595 |
+
"href": "https://docs.mollie.com/reference/v2/methods-api/list-methods",
|
596 |
+
"type": "text/html"
|
597 |
+
},
|
598 |
+
"self": {
|
599 |
+
"href": "http://api.mollie.com/v2/methods",
|
600 |
+
"type": "application/hal+json"
|
601 |
+
}
|
602 |
+
}
|
603 |
+
}'
|
604 |
+
)
|
605 |
+
);
|
606 |
+
|
607 |
+
$methods = $this->apiClient->methods->allAvailable(['include' => 'pricing']);
|
608 |
+
|
609 |
+
$this->assertInstanceOf(MethodCollection::class, $methods);
|
610 |
+
$this->assertEquals(4, $methods->count);
|
611 |
+
$this->assertCount(4, $methods);
|
612 |
+
|
613 |
+
$this->assertLinkObject(
|
614 |
+
'https://docs.mollie.com/reference/v2/methods-api/list-methods',
|
615 |
+
'text/html',
|
616 |
+
$methods->_links->documentation
|
617 |
+
);
|
618 |
+
|
619 |
+
$this->assertLinkObject(
|
620 |
+
'http://api.mollie.com/v2/methods',
|
621 |
+
'application/hal+json',
|
622 |
+
$methods->_links->self
|
623 |
+
);
|
624 |
+
|
625 |
+
$creditcardMethod = $methods[1];
|
626 |
+
|
627 |
+
$this->assertInstanceOf(Method::class, $creditcardMethod);
|
628 |
+
$this->assertEquals('creditcard', $creditcardMethod->id);
|
629 |
+
$this->assertEquals('Credit card', $creditcardMethod->description);
|
630 |
+
$this->assertAmountObject(0.01, 'EUR', $creditcardMethod->minimumAmount);
|
631 |
+
$this->assertAmountObject(2000, 'EUR', $creditcardMethod->maximumAmount);
|
632 |
+
$this->assertEquals('https://www.mollie.com/images/payscreen/methods/creditcard.png', $creditcardMethod->image->size1x);
|
633 |
+
$this->assertEquals('https://www.mollie.com/images/payscreen/methods/creditcard%402x.png', $creditcardMethod->image->size2x);
|
634 |
+
|
635 |
+
$this->assertLinkObject(
|
636 |
+
'https://api.mollie.com/v2/methods/creditcard',
|
637 |
+
'application/hal+json',
|
638 |
+
$creditcardMethod->_links->self
|
639 |
+
);
|
640 |
+
}
|
641 |
+
}
|
includes/mollie-api-php/tests/Mollie/API/Endpoints/OnboardingEndpointTest.php
ADDED
@@ -0,0 +1,82 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
declare(strict_types=1);
|
4 |
+
|
5 |
+
namespace Tests\Mollie\API\Endpoints;
|
6 |
+
|
7 |
+
use GuzzleHttp\Psr7\Request;
|
8 |
+
use GuzzleHttp\Psr7\Response;
|
9 |
+
use Mollie\Api\Resources\Onboarding;
|
10 |
+
use Mollie\Api\Types\OnboardingStatus;
|
11 |
+
|
12 |
+
final class OnboardingEndpointTest extends BaseEndpointTest
|
13 |
+
{
|
14 |
+
public function testGetWorks()
|
15 |
+
{
|
16 |
+
$this->mockApiCall(
|
17 |
+
new Request('GET', '/v2/onboarding/me'),
|
18 |
+
new Response(
|
19 |
+
200,
|
20 |
+
[],
|
21 |
+
'{
|
22 |
+
"resource": "onboarding",
|
23 |
+
"name": "Mollie B.V.",
|
24 |
+
"signedUpAt": "2018-12-20T10:49:08+00:00",
|
25 |
+
"status": "completed",
|
26 |
+
"canReceivePayments": true,
|
27 |
+
"canReceiveSettlements": true,
|
28 |
+
"_links": {
|
29 |
+
"self": {
|
30 |
+
"href": "https://api.mollie.com/v2/onboarding/me",
|
31 |
+
"type": "application/hal+json"
|
32 |
+
},
|
33 |
+
"onboarding": {
|
34 |
+
"href": "https://www.mollie.com/dashboard/onboarding",
|
35 |
+
"type": "text/html"
|
36 |
+
},
|
37 |
+
"organization": {
|
38 |
+
"href": "https://api.mollie.com/v2/organization/org_12345",
|
39 |
+
"type": "application/hal+json"
|
40 |
+
},
|
41 |
+
"documentation": {
|
42 |
+
"href": "https://docs.mollie.com/reference/v2/onboarding-api/get-onboarding-status",
|
43 |
+
"type": "text/html"
|
44 |
+
}
|
45 |
+
}
|
46 |
+
}'
|
47 |
+
)
|
48 |
+
);
|
49 |
+
|
50 |
+
$onboarding = $this->apiClient->onboarding->get();
|
51 |
+
|
52 |
+
$this->assertInstanceOf(Onboarding::class, $onboarding);
|
53 |
+
$this->assertEquals("onboarding", $onboarding->resource);
|
54 |
+
$this->assertEquals("Mollie B.V.", $onboarding->name);
|
55 |
+
$this->assertEquals(OnboardingStatus::COMPLETED, $onboarding->status);
|
56 |
+
$this->assertEquals("2018-12-20T10:49:08+00:00", $onboarding->signedUpAt);
|
57 |
+
$this->assertEquals(true, $onboarding->canReceivePayments);
|
58 |
+
$this->assertEquals(true, $onboarding->canReceiveSettlements);
|
59 |
+
|
60 |
+
$selfLink = (object)['href' => 'https://api.mollie.com/v2/onboarding/me', 'type' => 'application/hal+json'];
|
61 |
+
$this->assertEquals($selfLink, $onboarding->_links->self);
|
62 |
+
|
63 |
+
$onboardingLink = (object)['href' => 'https://www.mollie.com/dashboard/onboarding', 'type' => 'text/html'];
|
64 |
+
$this->assertEquals($onboardingLink, $onboarding->_links->onboarding);
|
65 |
+
|
66 |
+
$organizationLink = (object)['href' => 'https://api.mollie.com/v2/organization/org_12345', 'type' => 'application/hal+json'];
|
67 |
+
$this->assertEquals($organizationLink, $onboarding->_links->organization);
|
68 |
+
|
69 |
+
$documentationLink = (object)['href' => 'https://docs.mollie.com/reference/v2/onboarding-api/get-onboarding-status', 'type' => 'text/html'];
|
70 |
+
$this->assertEquals($documentationLink, $onboarding->_links->documentation);
|
71 |
+
}
|
72 |
+
|
73 |
+
public function testSubmitWorks()
|
74 |
+
{
|
75 |
+
$this->mockApiCall(
|
76 |
+
new Request('POST', '/v2/onboarding/me'),
|
77 |
+
new Response(204)
|
78 |
+
);
|
79 |
+
|
80 |
+
$this->apiClient->onboarding->submit();
|
81 |
+
}
|
82 |
+
}
|
includes/mollie-api-php/tests/Mollie/API/Endpoints/OrderEndpointTest.php
ADDED
@@ -0,0 +1,1085 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tests\Mollie\Api\Endpoints;
|
4 |
+
|
5 |
+
use GuzzleHttp\Psr7\Request;
|
6 |
+
use GuzzleHttp\Psr7\Response;
|
7 |
+
use Mollie\Api\Resources\Order;
|
8 |
+
use Mollie\Api\Resources\OrderCollection;
|
9 |
+
use Mollie\Api\Resources\Payment;
|
10 |
+
use Mollie\Api\Resources\PaymentCollection;
|
11 |
+
use Mollie\Api\Resources\Shipment;
|
12 |
+
use Mollie\Api\Types\OrderLineStatus;
|
13 |
+
use Mollie\Api\Types\OrderLineType;
|
14 |
+
use Mollie\Api\Types\OrderStatus;
|
15 |
+
use Tests\Mollie\TestHelpers\AmountObjectTestHelpers;
|
16 |
+
use Tests\Mollie\TestHelpers\LinkObjectTestHelpers;
|
17 |
+
use stdClass;
|
18 |
+
|
19 |
+
class OrderEndpointTest extends BaseEndpointTest
|
20 |
+
{
|
21 |
+
use LinkObjectTestHelpers;
|
22 |
+
use AmountObjectTestHelpers;
|
23 |
+
|
24 |
+
public function testCreateOrder()
|
25 |
+
{
|
26 |
+
$this->mockApiCall(
|
27 |
+
new Request(
|
28 |
+
"POST",
|
29 |
+
"/v2/orders",
|
30 |
+
[],
|
31 |
+
'{
|
32 |
+
"amount": {
|
33 |
+
"value": "1027.99",
|
34 |
+
"currency": "EUR"
|
35 |
+
},
|
36 |
+
"billingAddress": {
|
37 |
+
"organizationName": "Organization Name LTD.",
|
38 |
+
"streetAndNumber": "Keizersgracht 313",
|
39 |
+
"postalCode": "1016 EE",
|
40 |
+
"city": "Amsterdam",
|
41 |
+
"country": "nl",
|
42 |
+
"givenName": "Luke",
|
43 |
+
"familyName": "Skywalker",
|
44 |
+
"email": "luke@skywalker.com"
|
45 |
+
},
|
46 |
+
"shippingAddress": {
|
47 |
+
"organizationName": "Organization Name LTD.",
|
48 |
+
"streetAndNumber": "Keizersgracht 313",
|
49 |
+
"postalCode": "1016 EE",
|
50 |
+
"city": "Amsterdam",
|
51 |
+
"country": "nl",
|
52 |
+
"givenName": "Luke",
|
53 |
+
"familyName": "Skywalker",
|
54 |
+
"email": "luke@skywalker.com"
|
55 |
+
},
|
56 |
+
"metadata": {
|
57 |
+
"order_id": "1337",
|
58 |
+
"description": "Lego cars"
|
59 |
+
},
|
60 |
+
"consumerDateOfBirth": "1958-01-31",
|
61 |
+
"orderNumber": "1337",
|
62 |
+
"locale": "nl_NL",
|
63 |
+
"method" : "klarnapaylater",
|
64 |
+
"redirectUrl": "https://example.org/redirect",
|
65 |
+
"webhookUrl": "https://example.org/webhook",
|
66 |
+
"lines": [
|
67 |
+
{
|
68 |
+
"sku": "5702016116977",
|
69 |
+
"name": "LEGO 42083 Bugatti Chiron",
|
70 |
+
"productUrl": "https://shop.lego.com/nl-NL/Bugatti-Chiron-42083",
|
71 |
+
"imageUrl": "https://sh-s7-live-s.legocdn.com/is/image//LEGO/42083_alt1?$main$",
|
72 |
+
"quantity": 2,
|
73 |
+
"unitPrice": {
|
74 |
+
"currency": "EUR",
|
75 |
+
"value": "399.00"
|
76 |
+
},
|
77 |
+
"vatRate": "21.00",
|
78 |
+
"vatAmount": {
|
79 |
+
"currency": "EUR",
|
80 |
+
"value": "121.14"
|
81 |
+
},
|
82 |
+
"discountAmount": {
|
83 |
+
"currency": "EUR",
|
84 |
+
"value": "100.00"
|
85 |
+
},
|
86 |
+
"totalAmount": {
|
87 |
+
"currency": "EUR",
|
88 |
+
"value": "698.00"
|
89 |
+
}
|
90 |
+
},
|
91 |
+
{
|
92 |
+
"type": "digital",
|
93 |
+
"sku": "5702015594028",
|
94 |
+
"name": "LEGO 42056 Porsche 911 GT3 RS",
|
95 |
+
"productUrl": "https://shop.lego.com/nl-NL/Porsche-911-GT3-RS-42056",
|
96 |
+
"imageUrl": "https://sh-s7-live-s.legocdn.com/is/image/LEGO/42056?$PDPDefault$",
|
97 |
+
"quantity": 1,
|
98 |
+
"unitPrice": {
|
99 |
+
"currency": "EUR",
|
100 |
+
"value": "329.99"
|
101 |
+
},
|
102 |
+
"vatRate": "21.00",
|
103 |
+
"vatAmount": {
|
104 |
+
"currency": "EUR",
|
105 |
+
"value": "57.27"
|
106 |
+
},
|
107 |
+
"totalAmount": {
|
108 |
+
"currency": "EUR",
|
109 |
+
"value": "329.99"
|
110 |
+
}
|
111 |
+
}
|
112 |
+
]
|
113 |
+
}'
|
114 |
+
),
|
115 |
+
new Response(
|
116 |
+
201,
|
117 |
+
[],
|
118 |
+
$this->getOrderResponseFixture("ord_pbjz8x")
|
119 |
+
)
|
120 |
+
);
|
121 |
+
|
122 |
+
$order = $this->apiClient->orders->create([
|
123 |
+
"amount" => [
|
124 |
+
"value" => "1027.99",
|
125 |
+
"currency" => "EUR"
|
126 |
+
],
|
127 |
+
"billingAddress" => [
|
128 |
+
"organizationName" => "Organization Name LTD.",
|
129 |
+
"streetAndNumber" => "Keizersgracht 313",
|
130 |
+
"postalCode" => "1016 EE",
|
131 |
+
"city" => "Amsterdam",
|
132 |
+
"country" => "nl",
|
133 |
+
"givenName" => "Luke",
|
134 |
+
"familyName" => "Skywalker",
|
135 |
+
"email" => "luke@skywalker.com",
|
136 |
+
],
|
137 |
+
"shippingAddress" => [
|
138 |
+
"organizationName" => "Organization Name LTD.",
|
139 |
+
"streetAndNumber" => "Keizersgracht 313",
|
140 |
+
"postalCode" => "1016 EE",
|
141 |
+
"city" => "Amsterdam",
|
142 |
+
"country" => "nl",
|
143 |
+
"givenName" => "Luke",
|
144 |
+
"familyName" => "Skywalker",
|
145 |
+
"email" => "luke@skywalker.com",
|
146 |
+
],
|
147 |
+
"metadata" => [
|
148 |
+
"order_id" => "1337",
|
149 |
+
"description" => "Lego cars"
|
150 |
+
],
|
151 |
+
"consumerDateOfBirth" => "1958-01-31",
|
152 |
+
"locale" => "nl_NL",
|
153 |
+
"orderNumber" => "1337",
|
154 |
+
"redirectUrl" => "https://example.org/redirect",
|
155 |
+
"webhookUrl" => "https://example.org/webhook",
|
156 |
+
"method" => "klarnapaylater",
|
157 |
+
"lines" => [
|
158 |
+
[
|
159 |
+
"sku" => "5702016116977",
|
160 |
+
"name" => "LEGO 42083 Bugatti Chiron",
|
161 |
+
"productUrl" => "https://shop.lego.com/nl-NL/Bugatti-Chiron-42083",
|
162 |
+
"imageUrl" => 'https://sh-s7-live-s.legocdn.com/is/image//LEGO/42083_alt1?$main$',
|
163 |
+
"quantity" => 2,
|
164 |
+
"vatRate" => "21.00",
|
165 |
+
"unitPrice" => [
|
166 |
+
"currency" => "EUR",
|
167 |
+
"value" => "399.00"
|
168 |
+
],
|
169 |
+
"totalAmount" => [
|
170 |
+
"currency" => "EUR",
|
171 |
+
"value" => "698.00"
|
172 |
+
],
|
173 |
+
"discountAmount" => [
|
174 |
+
"currency" => "EUR",
|
175 |
+
"value" => "100.00"
|
176 |
+
],
|
177 |
+
"vatAmount" => [
|
178 |
+
"currency" => "EUR",
|
179 |
+
"value" => "121.14"
|
180 |
+
]
|
181 |
+
],
|
182 |
+
[
|
183 |
+
"type" => "digital",
|
184 |
+
"sku" => "5702015594028",
|
185 |
+
"name" => "LEGO 42056 Porsche 911 GT3 RS",
|
186 |
+
"productUrl" => "https://shop.lego.com/nl-NL/Porsche-911-GT3-RS-42056",
|
187 |
+
"imageUrl" => 'https://sh-s7-live-s.legocdn.com/is/image/LEGO/42056?$PDPDefault$',
|
188 |
+
"quantity" => 1,
|
189 |
+
"vatRate" => "21.00",
|
190 |
+
"unitPrice" => [
|
191 |
+
"currency" => "EUR",
|
192 |
+
"value" => "329.99"
|
193 |
+
],
|
194 |
+
"totalAmount" => [
|
195 |
+
"currency" => "EUR",
|
196 |
+
"value" => "329.99"
|
197 |
+
],
|
198 |
+
"vatAmount" => [
|
199 |
+
"currency" => "EUR",
|
200 |
+
"value" => "57.27"
|
201 |
+
]
|
202 |
+
]
|
203 |
+
]
|
204 |
+
]);
|
205 |
+
|
206 |
+
$this->assertOrder($order, 'ord_pbjz8x');
|
207 |
+
}
|
208 |
+
|
209 |
+
public function testGetOrderDirectly()
|
210 |
+
{
|
211 |
+
$this->mockApiCall(
|
212 |
+
new Request(
|
213 |
+
"GET",
|
214 |
+
"/v2/orders/ord_pbjz8x"
|
215 |
+
),
|
216 |
+
new Response(
|
217 |
+
200,
|
218 |
+
[],
|
219 |
+
$this->getOrderResponseFixture("ord_pbjz8x")
|
220 |
+
)
|
221 |
+
);
|
222 |
+
|
223 |
+
$order = $this->apiClient->orders->get('ord_pbjz8x');
|
224 |
+
|
225 |
+
$this->assertOrder($order, 'ord_pbjz8x');
|
226 |
+
}
|
227 |
+
|
228 |
+
public function testGetOrderDirectlyIncludingPayments()
|
229 |
+
{
|
230 |
+
$this->mockApiCall(
|
231 |
+
new Request(
|
232 |
+
"GET",
|
233 |
+
"/v2/orders/ord_kEn1PlbGa?embed=payments"
|
234 |
+
),
|
235 |
+
new Response(
|
236 |
+
200,
|
237 |
+
[],
|
238 |
+
'{
|
239 |
+
"resource": "order",
|
240 |
+
"id": "ord_kEn1PlbGa",
|
241 |
+
"profileId": "pfl_URR55HPMGx",
|
242 |
+
"method": "klarnapaylater",
|
243 |
+
"amount": {
|
244 |
+
"value": "1027.99",
|
245 |
+
"currency": "EUR"
|
246 |
+
},
|
247 |
+
"status": "created",
|
248 |
+
"isCancelable": true,
|
249 |
+
"metadata": null,
|
250 |
+
"createdAt": "2018-08-02T09:29:56+00:00",
|
251 |
+
"expiresAt": "2018-08-30T09:29:56+00:00",
|
252 |
+
"mode": "live",
|
253 |
+
"locale": "nl_NL",
|
254 |
+
"billingAddress": {
|
255 |
+
"organizationName": "Mollie B.V.",
|
256 |
+
"streetAndNumber": "Keizersgracht 313",
|
257 |
+
"postalCode": "1016 EE",
|
258 |
+
"city": "Amsterdam",
|
259 |
+
"country": "nl",
|
260 |
+
"givenName": "Luke",
|
261 |
+
"familyName": "Skywalker",
|
262 |
+
"email": "luke@skywalker.com"
|
263 |
+
},
|
264 |
+
"orderNumber": "18475",
|
265 |
+
"shippingAddress": {
|
266 |
+
"organizationName": "Mollie B.V.",
|
267 |
+
"streetAndNumber": "Keizersgracht 313",
|
268 |
+
"postalCode": "1016 EE",
|
269 |
+
"city": "Amsterdam",
|
270 |
+
"country": "nl",
|
271 |
+
"givenName": "Luke",
|
272 |
+
"familyName": "Skywalker",
|
273 |
+
"email": "luke@skywalker.com"
|
274 |
+
},
|
275 |
+
"redirectUrl": "https://example.org/redirect",
|
276 |
+
"lines": [
|
277 |
+
{
|
278 |
+
"resource": "orderline",
|
279 |
+
"id": "odl_dgtxyl",
|
280 |
+
"orderId": "ord_pbjz8x",
|
281 |
+
"name": "LEGO 42083 Bugatti Chiron",
|
282 |
+
"sku": "5702016116977",
|
283 |
+
"type": "physical",
|
284 |
+
"status": "created",
|
285 |
+
"metadata": null,
|
286 |
+
"isCancelable": false,
|
287 |
+
"quantity": 2,
|
288 |
+
"quantityShipped": 0,
|
289 |
+
"amountShipped": {
|
290 |
+
"value": "0.00",
|
291 |
+
"currency": "EUR"
|
292 |
+
},
|
293 |
+
"quantityRefunded": 0,
|
294 |
+
"amountRefunded": {
|
295 |
+
"value": "0.00",
|
296 |
+
"currency": "EUR"
|
297 |
+
},
|
298 |
+
"quantityCanceled": 0,
|
299 |
+
"amountCanceled": {
|
300 |
+
"value": "0.00",
|
301 |
+
"currency": "EUR"
|
302 |
+
},
|
303 |
+
"shippableQuantity": 0,
|
304 |
+
"refundableQuantity": 0,
|
305 |
+
"cancelableQuantity": 0,
|
306 |
+
"unitPrice": {
|
307 |
+
"value": "399.00",
|
308 |
+
"currency": "EUR"
|
309 |
+
},
|
310 |
+
"vatRate": "21.00",
|
311 |
+
"vatAmount": {
|
312 |
+
"value": "121.14",
|
313 |
+
"currency": "EUR"
|
314 |
+
},
|
315 |
+
"discountAmount": {
|
316 |
+
"value": "100.00",
|
317 |
+
"currency": "EUR"
|
318 |
+
},
|
319 |
+
"totalAmount": {
|
320 |
+
"value": "698.00",
|
321 |
+
"currency": "EUR"
|
322 |
+
},
|
323 |
+
"createdAt": "2018-08-02T09:29:56+00:00",
|
324 |
+
"_links": {
|
325 |
+
"productUrl": {
|
326 |
+
"href": "https://shop.lego.com/nl-NL/Bugatti-Chiron-42083",
|
327 |
+
"type": "text/html"
|
328 |
+
},
|
329 |
+
"imageUrl": {
|
330 |
+
"href": "https://sh-s7-live-s.legocdn.com/is/image//LEGO/42083_alt1?$main$",
|
331 |
+
"type": "text/html"
|
332 |
+
}
|
333 |
+
}
|
334 |
+
},
|
335 |
+
{
|
336 |
+
"resource": "orderline",
|
337 |
+
"id": "odl_jp31jz",
|
338 |
+
"orderId": "ord_pbjz8x",
|
339 |
+
"name": "LEGO 42056 Porsche 911 GT3 RS",
|
340 |
+
"sku": "5702015594028",
|
341 |
+
"type": "physical",
|
342 |
+
"status": "created",
|
343 |
+
"metadata": null,
|
344 |
+
"isCancelable": false,
|
345 |
+
"quantity": 1,
|
346 |
+
"quantityShipped": 0,
|
347 |
+
"amountShipped": {
|
348 |
+
"value": "0.00",
|
349 |
+
"currency": "EUR"
|
350 |
+
},
|
351 |
+
"quantityRefunded": 0,
|
352 |
+
"amountRefunded": {
|
353 |
+
"value": "0.00",
|
354 |
+
"currency": "EUR"
|
355 |
+
},
|
356 |
+
"quantityCanceled": 0,
|
357 |
+
"amountCanceled": {
|
358 |
+
"value": "0.00",
|
359 |
+
"currency": "EUR"
|
360 |
+
},
|
361 |
+
"shippableQuantity": 0,
|
362 |
+
"refundableQuantity": 0,
|
363 |
+
"cancelableQuantity": 0,
|
364 |
+
"unitPrice": {
|
365 |
+
"value": "329.99",
|
366 |
+
"currency": "EUR"
|
367 |
+
},
|
368 |
+
"vatRate": "21.00",
|
369 |
+
"vatAmount": {
|
370 |
+
"value": "57.27",
|
371 |
+
"currency": "EUR"
|
372 |
+
},
|
373 |
+
"totalAmount": {
|
374 |
+
"value": "329.99",
|
375 |
+
"currency": "EUR"
|
376 |
+
},
|
377 |
+
"createdAt": "2018-08-02T09:29:56+00:00",
|
378 |
+
"_links": {
|
379 |
+
"productUrl": {
|
380 |
+
"href": "https://shop.lego.com/nl-NL/Porsche-911-GT3-RS-42056",
|
381 |
+
"type": "text/html"
|
382 |
+
},
|
383 |
+
"imageUrl": {
|
384 |
+
"href": "https://sh-s7-live-s.legocdn.com/is/image/LEGO/42056?$PDPDefault$",
|
385 |
+
"type": "text/html"
|
386 |
+
}
|
387 |
+
}
|
388 |
+
}
|
389 |
+
],
|
390 |
+
"_embedded": {
|
391 |
+
"payments": [
|
392 |
+
{
|
393 |
+
"resource": "payment",
|
394 |
+
"id": "tr_ncaPcAhuUV",
|
395 |
+
"mode": "live",
|
396 |
+
"createdAt": "2018-09-07T12:00:05+00:00",
|
397 |
+
"amount": {
|
398 |
+
"value": "1027.99",
|
399 |
+
"currency": "EUR"
|
400 |
+
},
|
401 |
+
"description": "Order #1337 (Lego cars)",
|
402 |
+
"method": null,
|
403 |
+
"metadata": null,
|
404 |
+
"status": "open",
|
405 |
+
"isCancelable": false,
|
406 |
+
"locale": "nl_NL",
|
407 |
+
"profileId": "pfl_URR55HPMGx",
|
408 |
+
"orderId": "ord_kEn1PlbGa",
|
409 |
+
"sequenceType": "oneoff",
|
410 |
+
"redirectUrl": "https://example.org/redirect",
|
411 |
+
"_links": {
|
412 |
+
"self": {
|
413 |
+
"href": "https://api.mollie.com/v2/payments/tr_ncaPcAhuUV",
|
414 |
+
"type": "application/hal+json"
|
415 |
+
},
|
416 |
+
"checkout": {
|
417 |
+
"href": "https://www.mollie.com/payscreen/select-method/ncaPcAhuUV",
|
418 |
+
"type": "text/html"
|
419 |
+
},
|
420 |
+
"order": {
|
421 |
+
"href": "https://api.mollie.com/v2/orders/ord_kEn1PlbGa",
|
422 |
+
"type": "application/hal+json"
|
423 |
+
}
|
424 |
+
}
|
425 |
+
}
|
426 |
+
]
|
427 |
+
},
|
428 |
+
"_links": {
|
429 |
+
"self": {
|
430 |
+
"href": "https://api.mollie.com/v2/orders/ord_pbjz8x",
|
431 |
+
"type": "application/hal+json"
|
432 |
+
},
|
433 |
+
"checkout": {
|
434 |
+
"href": "https://www.mollie.com/payscreen/order/checkout/pbjz8x",
|
435 |
+
"type": "text/html"
|
436 |
+
},
|
437 |
+
"documentation": {
|
438 |
+
"href": "https://docs.mollie.com/reference/v2/orders-api/get-order",
|
439 |
+
"type": "text/html"
|
440 |
+
}
|
441 |
+
}
|
442 |
+
}'
|
443 |
+
)
|
444 |
+
);
|
445 |
+
|
446 |
+
$order = $this->apiClient->orders->get('ord_kEn1PlbGa', ['embed' => 'payments']);
|
447 |
+
|
448 |
+
$this->assertInstanceOf(Order::class, $order);
|
449 |
+
$this->assertEquals('ord_kEn1PlbGa', $order->id);
|
450 |
+
|
451 |
+
$payments = $order->payments();
|
452 |
+
$this->assertInstanceOf(PaymentCollection::class, $payments);
|
453 |
+
|
454 |
+
$payment = $payments[0];
|
455 |
+
$this->assertInstanceOf(Payment::class, $payment);
|
456 |
+
$this->assertEquals('tr_ncaPcAhuUV', $payment->id);
|
457 |
+
$this->assertEquals('2018-09-07T12:00:05+00:00', $payment->createdAt);
|
458 |
+
$this->assertAmountObject('1027.99', 'EUR', $payment->amount);
|
459 |
+
$this->assertEquals('Order #1337 (Lego cars)', $payment->description);
|
460 |
+
$this->assertNull($payment->method);
|
461 |
+
$this->assertNull($payment->metadata);
|
462 |
+
$this->assertEquals('open', $payment->status);
|
463 |
+
$this->assertFalse($payment->isCancelable);
|
464 |
+
$this->assertEquals('nl_NL', $payment->locale);
|
465 |
+
$this->assertEquals('pfl_URR55HPMGx', $payment->profileId);
|
466 |
+
$this->assertEquals('ord_kEn1PlbGa', $payment->orderId);
|
467 |
+
$this->assertEquals('oneoff', $payment->sequenceType);
|
468 |
+
$this->assertEquals('https://example.org/redirect', $payment->redirectUrl);
|
469 |
+
$this->assertLinkObject(
|
470 |
+
'https://api.mollie.com/v2/payments/tr_ncaPcAhuUV',
|
471 |
+
'application/hal+json',
|
472 |
+
$payment->_links->self
|
473 |
+
);
|
474 |
+
$this->assertLinkObject(
|
475 |
+
'https://www.mollie.com/payscreen/select-method/ncaPcAhuUV',
|
476 |
+
'text/html',
|
477 |
+
$payment->_links->checkout
|
478 |
+
);
|
479 |
+
$this->assertLinkObject(
|
480 |
+
'https://api.mollie.com/v2/orders/ord_kEn1PlbGa',
|
481 |
+
'application/hal+json',
|
482 |
+
$payment->_links->order
|
483 |
+
);
|
484 |
+
}
|
485 |
+
|
486 |
+
public function testGetOrderOnShipmentResource()
|
487 |
+
{
|
488 |
+
$this->mockApiCall(
|
489 |
+
new Request(
|
490 |
+
"GET",
|
491 |
+
"/v2/orders/ord_pbjz8x"
|
492 |
+
),
|
493 |
+
new Response(
|
494 |
+
200,
|
495 |
+
[],
|
496 |
+
$this->getOrderResponseFixture("ord_pbjz8x")
|
497 |
+
)
|
498 |
+
);
|
499 |
+
|
500 |
+
$shipment = $this->getShipment("shp_3wmsgCJN4U", "ord_pbjz8x");
|
501 |
+
$order = $shipment->order();
|
502 |
+
|
503 |
+
$this->assertOrder($order, 'ord_pbjz8x');
|
504 |
+
}
|
505 |
+
|
506 |
+
public function testListOrders()
|
507 |
+
{
|
508 |
+
$this->mockApiCall(
|
509 |
+
new Request("GET", "/v2/orders"),
|
510 |
+
new Response(
|
511 |
+
200,
|
512 |
+
[],
|
513 |
+
'{
|
514 |
+
"count": 3,
|
515 |
+
"_embedded": {
|
516 |
+
"orders": [
|
517 |
+
' . $this->getOrderResponseFixture("ord_pbjz1x") . ',
|
518 |
+
' . $this->getOrderResponseFixture("ord_pbjz2y") . ',
|
519 |
+
' . $this->getOrderResponseFixture("ord_pbjz3z") . '
|
520 |
+
]
|
521 |
+
},
|
522 |
+
"_links": {
|
523 |
+
"self": {
|
524 |
+
"href": "https://api.mollie.com/v2/orders",
|
525 |
+
"type": "application/hal+json"
|
526 |
+
},
|
527 |
+
"previous": null,
|
528 |
+
"next": {
|
529 |
+
"href": "https://api.mollie.com/v2/orders?from=ord_stTC2WHAuS",
|
530 |
+
"type": "application/hal+json"
|
531 |
+
},
|
532 |
+
"documentation": {
|
533 |
+
"href": "https://docs.mollie.com/reference/v2/orders-api/list-orders",
|
534 |
+
"type": "text/html"
|
535 |
+
}
|
536 |
+
}
|
537 |
+
}'
|
538 |
+
)
|
539 |
+
);
|
540 |
+
|
541 |
+
$orders = $this->apiClient->orders->page();
|
542 |
+
|
543 |
+
$this->assertInstanceOf(OrderCollection::class, $orders);
|
544 |
+
$this->assertEquals(3, $orders->count);
|
545 |
+
$this->assertEquals(3, count($orders));
|
546 |
+
|
547 |
+
$this->assertNull($orders->_links->previous);
|
548 |
+
$selfLink = $this->createLinkObject(
|
549 |
+
"https://api.mollie.com/v2/orders",
|
550 |
+
"application/hal+json"
|
551 |
+
);
|
552 |
+
$this->assertEquals($selfLink, $orders->_links->self);
|
553 |
+
|
554 |
+
$nextLink = $this->createLinkObject(
|
555 |
+
"https://api.mollie.com/v2/orders?from=ord_stTC2WHAuS",
|
556 |
+
"application/hal+json"
|
557 |
+
);
|
558 |
+
$this->assertEquals($nextLink, $orders->_links->next);
|
559 |
+
|
560 |
+
$documentationLink = $this->createLinkObject(
|
561 |
+
"https://docs.mollie.com/reference/v2/orders-api/list-orders",
|
562 |
+
"text/html"
|
563 |
+
);
|
564 |
+
$this->assertEquals($documentationLink, $orders->_links->documentation);
|
565 |
+
|
566 |
+
$this->assertOrder($orders[0], 'ord_pbjz1x');
|
567 |
+
$this->assertOrder($orders[1], 'ord_pbjz2y');
|
568 |
+
$this->assertOrder($orders[2], 'ord_pbjz3z');
|
569 |
+
}
|
570 |
+
|
571 |
+
public function testCancelOrderDirectly()
|
572 |
+
{
|
573 |
+
$this->mockApiCall(
|
574 |
+
new Request("DELETE", "/v2/orders/ord_pbjz1x"),
|
575 |
+
new Response(
|
576 |
+
200,
|
577 |
+
[],
|
578 |
+
$this->getOrderResponseFixture(
|
579 |
+
'ord_pbjz1x',
|
580 |
+
OrderStatus::STATUS_CANCELED
|
581 |
+
)
|
582 |
+
)
|
583 |
+
);
|
584 |
+
$order = $this->apiClient->orders->cancel('ord_pbjz1x');
|
585 |
+
$this->assertOrder($order, 'ord_pbjz1x', OrderStatus::STATUS_CANCELED);
|
586 |
+
}
|
587 |
+
|
588 |
+
public function testCancelOrderOnResource()
|
589 |
+
{
|
590 |
+
$this->mockApiCall(
|
591 |
+
new Request("DELETE", "/v2/orders/ord_pbjz1x"),
|
592 |
+
new Response(
|
593 |
+
200,
|
594 |
+
[],
|
595 |
+
$this->getOrderResponseFixture(
|
596 |
+
'ord_pbjz1x',
|
597 |
+
OrderStatus::STATUS_CANCELED
|
598 |
+
)
|
599 |
+
)
|
600 |
+
);
|
601 |
+
$order = $this->getOrder('ord_pbjz1x');
|
602 |
+
$canceledOrder = $order->cancel();
|
603 |
+
$this->assertOrder($canceledOrder, 'ord_pbjz1x', OrderStatus::STATUS_CANCELED);
|
604 |
+
}
|
605 |
+
|
606 |
+
public function testCancelOrderLines()
|
607 |
+
{
|
608 |
+
$this->mockApiCall(
|
609 |
+
new Request(
|
610 |
+
"DELETE",
|
611 |
+
"/v2/orders/ord_8wmqcHMN4U/lines",
|
612 |
+
[],
|
613 |
+
'{
|
614 |
+
"lines": [
|
615 |
+
{
|
616 |
+
"id": "odl_dgtxyl",
|
617 |
+
"quantity": 1
|
618 |
+
}
|
619 |
+
]
|
620 |
+
}'
|
621 |
+
),
|
622 |
+
new Response(204)
|
623 |
+
);
|
624 |
+
|
625 |
+
$order = $this->getOrder('ord_8wmqcHMN4U');
|
626 |
+
|
627 |
+
$result = $order->cancelLines([
|
628 |
+
'lines' => [
|
629 |
+
[
|
630 |
+
'id' => 'odl_dgtxyl',
|
631 |
+
'quantity' => 1,
|
632 |
+
],
|
633 |
+
],
|
634 |
+
]);
|
635 |
+
|
636 |
+
$this->assertNull($result);
|
637 |
+
}
|
638 |
+
|
639 |
+
public function testCancelAllOrderLines()
|
640 |
+
{
|
641 |
+
$this->mockApiCall(
|
642 |
+
new Request(
|
643 |
+
"DELETE",
|
644 |
+
"/v2/orders/ord_8wmqcHMN4U/lines",
|
645 |
+
[],
|
646 |
+
'{
|
647 |
+
"lines": [],
|
648 |
+
"foo": "bar"
|
649 |
+
}'
|
650 |
+
),
|
651 |
+
new Response(204)
|
652 |
+
);
|
653 |
+
|
654 |
+
$order = $this->getOrder('ord_8wmqcHMN4U');
|
655 |
+
|
656 |
+
$result = $order->cancelAllLines([
|
657 |
+
'foo' => 'bar',
|
658 |
+
]);
|
659 |
+
|
660 |
+
$this->assertNull($result);
|
661 |
+
}
|
662 |
+
|
663 |
+
/** @test */
|
664 |
+
public function testUpdateOrder()
|
665 |
+
{
|
666 |
+
$this->mockApiCall(
|
667 |
+
new Request(
|
668 |
+
"PATCH",
|
669 |
+
"/v2/orders/ord_pbjz8x",
|
670 |
+
[],
|
671 |
+
'{
|
672 |
+
"billingAddress": {
|
673 |
+
"organizationName": "Organization Name LTD.",
|
674 |
+
"streetAndNumber": "Keizersgracht 313",
|
675 |
+
"postalCode": "1234AB",
|
676 |
+
"city": "Amsterdam",
|
677 |
+
"country": "NL",
|
678 |
+
"givenName": "Piet",
|
679 |
+
"familyName": "Mondriaan",
|
680 |
+
"email": "piet@mondriaan.com",
|
681 |
+
"region": "Noord-Holland",
|
682 |
+
"title": "Dhr",
|
683 |
+
"phone": "+31208202070"
|
684 |
+
},
|
685 |
+
"shippingAddress": {
|
686 |
+
"organizationName": "Organization Name LTD.",
|
687 |
+
"streetAndNumber": "Keizersgracht 313",
|
688 |
+
"postalCode": "1016 EE",
|
689 |
+
"city": "Amsterdam",
|
690 |
+
"country": "nl",
|
691 |
+
"givenName": "Luke",
|
692 |
+
"familyName": "Skywalker",
|
693 |
+
"email": "luke@skywalker.com"
|
694 |
+
},
|
695 |
+
"orderNumber": "16738"
|
696 |
+
}'
|
697 |
+
),
|
698 |
+
new Response(
|
699 |
+
200,
|
700 |
+
[],
|
701 |
+
$this->getOrderResponseFixture(
|
702 |
+
"ord_pbjz8x",
|
703 |
+
OrderStatus::STATUS_CREATED,
|
704 |
+
"16738"
|
705 |
+
)
|
706 |
+
)
|
707 |
+
);
|
708 |
+
|
709 |
+
/** @var Order $order */
|
710 |
+
$order = $this->getOrder("ord_pbjz8x");
|
711 |
+
|
712 |
+
$order->billingAddress->organizationName = "Organization Name LTD.";
|
713 |
+
$order->billingAddress->streetAndNumber = "Keizersgracht 313";
|
714 |
+
$order->billingAddress->city = "Amsterdam";
|
715 |
+
$order->billingAddress->region = "Noord-Holland";
|
716 |
+
$order->billingAddress->postalCode = "1234AB";
|
717 |
+
$order->billingAddress->country = "NL";
|
718 |
+
$order->billingAddress->title = "Dhr";
|
719 |
+
$order->billingAddress->givenName = "Piet";
|
720 |
+
$order->billingAddress->familyName = "Mondriaan";
|
721 |
+
$order->billingAddress->email = "piet@mondriaan.com";
|
722 |
+
$order->billingAddress->phone = "+31208202070";
|
723 |
+
$order->orderNumber = "16738";
|
724 |
+
$order = $order->update();
|
725 |
+
|
726 |
+
$this->assertOrder($order, "ord_pbjz8x", OrderStatus::STATUS_CREATED, "16738");
|
727 |
+
}
|
728 |
+
|
729 |
+
protected function assertOrder($order, $order_id, $order_status = OrderStatus::STATUS_CREATED, $orderNumber = "1337")
|
730 |
+
{
|
731 |
+
$this->assertInstanceOf(Order::class, $order);
|
732 |
+
$this->assertEquals('order', $order->resource);
|
733 |
+
$this->assertEquals($order_id, $order->id);
|
734 |
+
$this->assertEquals('pfl_URR55HPMGx', $order->profileId);
|
735 |
+
$this->assertEquals('live', $order->mode);
|
736 |
+
$this->assertEquals('klarnapaylater', $order->method);
|
737 |
+
$this->assertEquals('2018-08-02T09:29:56+00:00', $order->createdAt);
|
738 |
+
|
739 |
+
$this->assertAmountObject('1027.99', 'EUR', $order->amount);
|
740 |
+
$this->assertAmountObject('0.00', 'EUR', $order->amountCaptured);
|
741 |
+
$this->assertAmountObject('0.00', 'EUR', $order->amountRefunded);
|
742 |
+
|
743 |
+
$this->assertEquals((object) [
|
744 |
+
'order_id' => '1337',
|
745 |
+
'description' => 'Lego cars',
|
746 |
+
], $order->metadata);
|
747 |
+
|
748 |
+
$this->assertEquals($order_status, $order->status);
|
749 |
+
|
750 |
+
$billingAddress = new stdClass();
|
751 |
+
$billingAddress->organizationName = "Organization Name LTD.";
|
752 |
+
$billingAddress->streetAndNumber = "Keizersgracht 313";
|
753 |
+
$billingAddress->postalCode = "1016 EE";
|
754 |
+
$billingAddress->city = "Amsterdam";
|
755 |
+
$billingAddress->country = "nl";
|
756 |
+
$billingAddress->givenName = "Luke";
|
757 |
+
$billingAddress->familyName = "Skywalker";
|
758 |
+
$billingAddress->email = "luke@skywalker.com";
|
759 |
+
$this->assertEquals($billingAddress, $order->billingAddress);
|
760 |
+
|
761 |
+
$shippingAddress = new stdClass();
|
762 |
+
$shippingAddress->organizationName = "Organization Name LTD.";
|
763 |
+
$shippingAddress->streetAndNumber = "Keizersgracht 313";
|
764 |
+
$shippingAddress->postalCode = "1016 EE";
|
765 |
+
$shippingAddress->city = "Amsterdam";
|
766 |
+
$shippingAddress->country = "nl";
|
767 |
+
$shippingAddress->givenName = "Luke";
|
768 |
+
$shippingAddress->familyName = "Skywalker";
|
769 |
+
$shippingAddress->email = "luke@skywalker.com";
|
770 |
+
$this->assertEquals($shippingAddress, $order->shippingAddress);
|
771 |
+
|
772 |
+
$this->assertEquals($orderNumber, $order->orderNumber);
|
773 |
+
$this->assertEquals('nl_NL', $order->locale);
|
774 |
+
|
775 |
+
$this->assertEquals("https://example.org/redirect", $order->redirectUrl);
|
776 |
+
$this->assertEquals("https://example.org/webhook", $order->webhookUrl);
|
777 |
+
|
778 |
+
$links = (object )[
|
779 |
+
'self' => $this->createLinkObject(
|
780 |
+
'https://api.mollie.com/v2/orders/' . $order_id,
|
781 |
+
'application/hal+json'
|
782 |
+
),
|
783 |
+
'checkout' => $this->createLinkObject(
|
784 |
+
'https://www.mollie.com/payscreen/select-method/7UhSN1zuXS',
|
785 |
+
'text/html'
|
786 |
+
),
|
787 |
+
'documentation' => $this->createLinkObject(
|
788 |
+
'https://docs.mollie.com/reference/v2/orders-api/get-order',
|
789 |
+
'text/html'
|
790 |
+
),
|
791 |
+
];
|
792 |
+
$this->assertEquals($links, $order->_links);
|
793 |
+
|
794 |
+
$line1 = new stdClass();
|
795 |
+
$line1->resource = "orderline";
|
796 |
+
$line1->id = "odl_dgtxyl";
|
797 |
+
$line1->orderId = $order_id;
|
798 |
+
$line1->name = "LEGO 42083 Bugatti Chiron";
|
799 |
+
$line1->productUrl = "https://shop.lego.com/nl-NL/Bugatti-Chiron-42083";
|
800 |
+
$line1->imageUrl = 'https://sh-s7-live-s.legocdn.com/is/image//LEGO/42083_alt1?$main$';
|
801 |
+
$line1->sku = "5702016116977";
|
802 |
+
$line1->type = OrderLineType::TYPE_PHYSICAL;
|
803 |
+
$line1->status = OrderLineStatus::STATUS_CREATED;
|
804 |
+
$line1->isCancelable = true;
|
805 |
+
$line1->quantity = 2;
|
806 |
+
$line1->unitPrice = $this->createAmountObject("399.00", "EUR");
|
807 |
+
$line1->vatRate = "21.00";
|
808 |
+
$line1->vatAmount = $this->createAmountObject("121.14", "EUR");
|
809 |
+
$line1->discountAmount = $this->createAmountObject("100.00", "EUR");
|
810 |
+
$line1->totalAmount = $this->createAmountObject("698.00", "EUR");
|
811 |
+
$line1->createdAt = "2018-08-02T09:29:56+00:00";
|
812 |
+
$this->assertEquals($line1, $order->lines[0]);
|
813 |
+
|
814 |
+
$line2 = new stdClass();
|
815 |
+
$line2->resource = "orderline";
|
816 |
+
$line2->id = "odl_jp31jz";
|
817 |
+
$line2->orderId = $order_id;
|
818 |
+
$line2->name = "LEGO 42056 Porsche 911 GT3 RS";
|
819 |
+
$line2->productUrl = "https://shop.lego.com/nl-NL/Porsche-911-GT3-RS-42056";
|
820 |
+
$line2->imageUrl = 'https://sh-s7-live-s.legocdn.com/is/image/LEGO/42056?$PDPDefault$';
|
821 |
+
$line2->sku = "5702015594028";
|
822 |
+
$line2->type = OrderLineType::TYPE_DIGITAL;
|
823 |
+
$line2->status = OrderLineStatus::STATUS_CREATED;
|
824 |
+
$line2->isCancelable = true;
|
825 |
+
$line2->quantity = 1;
|
826 |
+
$line2->unitPrice = $this->createAmountObject("329.99", "EUR");
|
827 |
+
$line2->vatRate = "21.00";
|
828 |
+
$line2->vatAmount = $this->createAmountObject("57.27", "EUR");
|
829 |
+
$line2->totalAmount = $this->createAmountObject("329.99", "EUR");
|
830 |
+
$line2->createdAt = "2018-08-02T09:29:56+00:00";
|
831 |
+
$this->assertEquals($line2, $order->lines[1]);
|
832 |
+
|
833 |
+
$this->assertNull($order->payments());
|
834 |
+
}
|
835 |
+
|
836 |
+
protected function getOrder($id)
|
837 |
+
{
|
838 |
+
$orderJson = $this->getOrderResponseFixture($id);
|
839 |
+
return $this->copy(json_decode($orderJson), new Order($this->apiClient));
|
840 |
+
}
|
841 |
+
|
842 |
+
protected function getOrderResponseFixture($order_id, $order_status = OrderStatus::STATUS_CREATED, $orderNumber = '1337')
|
843 |
+
{
|
844 |
+
return str_replace(
|
845 |
+
[
|
846 |
+
"<<order_id>>",
|
847 |
+
"<<order_number>>"
|
848 |
+
],
|
849 |
+
[
|
850 |
+
$order_id,
|
851 |
+
$orderNumber,
|
852 |
+
],
|
853 |
+
'{
|
854 |
+
"resource": "order",
|
855 |
+
"id": "<<order_id>>",
|
856 |
+
"profileId": "pfl_URR55HPMGx",
|
857 |
+
"amount": {
|
858 |
+
"value": "1027.99",
|
859 |
+
"currency": "EUR"
|
860 |
+
},
|
861 |
+
"amountCaptured": {
|
862 |
+
"value": "0.00",
|
863 |
+
"currency": "EUR"
|
864 |
+
},
|
865 |
+
"amountRefunded": {
|
866 |
+
"value": "0.00",
|
867 |
+
"currency": "EUR"
|
868 |
+
},
|
869 |
+
"status": "' . $order_status . '",
|
870 |
+
"metadata": {
|
871 |
+
"order_id": "1337",
|
872 |
+
"description": "Lego cars"
|
873 |
+
},
|
874 |
+
"consumerDateOfBirth": "1958-01-31",
|
875 |
+
"createdAt": "2018-08-02T09:29:56+00:00",
|
876 |
+
"mode": "live",
|
877 |
+
"billingAddress": {
|
878 |
+
"organizationName": "Organization Name LTD.",
|
879 |
+
"streetAndNumber": "Keizersgracht 313",
|
880 |
+
"postalCode": "1016 EE",
|
881 |
+
"city": "Amsterdam",
|
882 |
+
"country": "nl",
|
883 |
+
"givenName": "Luke",
|
884 |
+
"familyName": "Skywalker",
|
885 |
+
"email": "luke@skywalker.com"
|
886 |
+
},
|
887 |
+
"shippingAddress": {
|
888 |
+
"organizationName": "Organization Name LTD.",
|
889 |
+
"streetAndNumber": "Keizersgracht 313",
|
890 |
+
"postalCode": "1016 EE",
|
891 |
+
"city": "Amsterdam",
|
892 |
+
"country": "nl",
|
893 |
+
"givenName": "Luke",
|
894 |
+
"familyName": "Skywalker",
|
895 |
+
"email": "luke@skywalker.com"
|
896 |
+
},
|
897 |
+
"orderNumber": <<order_number>>,
|
898 |
+
"locale": "nl_NL",
|
899 |
+
"method" : "klarnapaylater",
|
900 |
+
"isCancelable": true,
|
901 |
+
"redirectUrl": "https://example.org/redirect",
|
902 |
+
"webhookUrl": "https://example.org/webhook",
|
903 |
+
"lines": [
|
904 |
+
{
|
905 |
+
"resource": "orderline",
|
906 |
+
"id": "odl_dgtxyl",
|
907 |
+
"orderId": "<<order_id>>",
|
908 |
+
"name": "LEGO 42083 Bugatti Chiron",
|
909 |
+
"productUrl": "https://shop.lego.com/nl-NL/Bugatti-Chiron-42083",
|
910 |
+
"imageUrl": "https://sh-s7-live-s.legocdn.com/is/image//LEGO/42083_alt1?$main$",
|
911 |
+
"sku": "5702016116977",
|
912 |
+
"type": "physical",
|
913 |
+
"status": "created",
|
914 |
+
"isCancelable": true,
|
915 |
+
"quantity": 2,
|
916 |
+
"unitPrice": {
|
917 |
+
"value": "399.00",
|
918 |
+
"currency": "EUR"
|
919 |
+
},
|
920 |
+
"vatRate": "21.00",
|
921 |
+
"vatAmount": {
|
922 |
+
"value": "121.14",
|
923 |
+
"currency": "EUR"
|
924 |
+
},
|
925 |
+
"discountAmount": {
|
926 |
+
"value": "100.00",
|
927 |
+
"currency": "EUR"
|
928 |
+
},
|
929 |
+
"totalAmount": {
|
930 |
+
"value": "698.00",
|
931 |
+
"currency": "EUR"
|
932 |
+
},
|
933 |
+
"createdAt": "2018-08-02T09:29:56+00:00"
|
934 |
+
},
|
935 |
+
{
|
936 |
+
"resource": "orderline",
|
937 |
+
"id": "odl_jp31jz",
|
938 |
+
"orderId": "<<order_id>>",
|
939 |
+
"name": "LEGO 42056 Porsche 911 GT3 RS",
|
940 |
+
"productUrl": "https://shop.lego.com/nl-NL/Porsche-911-GT3-RS-42056",
|
941 |
+
"imageUrl": "https://sh-s7-live-s.legocdn.com/is/image/LEGO/42056?$PDPDefault$",
|
942 |
+
"sku": "5702015594028",
|
943 |
+
"type": "digital",
|
944 |
+
"status": "created",
|
945 |
+
"isCancelable": true,
|
946 |
+
"quantity": 1,
|
947 |
+
"unitPrice": {
|
948 |
+
"value": "329.99",
|
949 |
+
"currency": "EUR"
|
950 |
+
},
|
951 |
+
"vatRate": "21.00",
|
952 |
+
"vatAmount": {
|
953 |
+
"value": "57.27",
|
954 |
+
"currency": "EUR"
|
955 |
+
},
|
956 |
+
"totalAmount": {
|
957 |
+
"value": "329.99",
|
958 |
+
"currency": "EUR"
|
959 |
+
},
|
960 |
+
"createdAt": "2018-08-02T09:29:56+00:00"
|
961 |
+
}
|
962 |
+
],
|
963 |
+
"_links": {
|
964 |
+
"self": {
|
965 |
+
"href": "https://api.mollie.com/v2/orders/<<order_id>>",
|
966 |
+
"type": "application/hal+json"
|
967 |
+
},
|
968 |
+
"checkout": {
|
969 |
+
"href": "https://www.mollie.com/payscreen/select-method/7UhSN1zuXS",
|
970 |
+
"type": "text/html"
|
971 |
+
},
|
972 |
+
"documentation": {
|
973 |
+
"href": "https://docs.mollie.com/reference/v2/orders-api/get-order",
|
974 |
+
"type": "text/html"
|
975 |
+
}
|
976 |
+
}
|
977 |
+
}'
|
978 |
+
);
|
979 |
+
}
|
980 |
+
|
981 |
+
protected function getShipment($shipmentId, $orderId, $orderlineStatus = OrderLineStatus::STATUS_SHIPPING)
|
982 |
+
{
|
983 |
+
$shipmentJson = $this->getShipmentResponseFixture(
|
984 |
+
$shipmentId,
|
985 |
+
$orderId,
|
986 |
+
$orderlineStatus
|
987 |
+
);
|
988 |
+
return $this->copy(json_decode($shipmentJson), new Shipment($this->apiClient));
|
989 |
+
}
|
990 |
+
|
991 |
+
protected function getShipmentResponseFixture($shipmentId, $orderId, $orderlineStatus = OrderLineStatus::STATUS_SHIPPING)
|
992 |
+
{
|
993 |
+
return str_replace(
|
994 |
+
[
|
995 |
+
"<<order_id>>",
|
996 |
+
"<<shipment_id>>",
|
997 |
+
"<<orderline_status>>",
|
998 |
+
],
|
999 |
+
[
|
1000 |
+
$orderId,
|
1001 |
+
$shipmentId,
|
1002 |
+
$orderlineStatus
|
1003 |
+
],
|
1004 |
+
'{
|
1005 |
+
"resource": "shipment",
|
1006 |
+
"id": "<<shipment_id>>",
|
1007 |
+
"orderId": "<<order_id>>",
|
1008 |
+
"createdAt": "2018-08-02T09:29:56+00:00",
|
1009 |
+
"profileId": "pfl_URR55HPMGx",
|
1010 |
+
"lines": [
|
1011 |
+
{
|
1012 |
+
"resource": "orderline",
|
1013 |
+
"id": "odl_dgtxyl",
|
1014 |
+
"orderId": "<<order_id>>",
|
1015 |
+
"name": "LEGO 42083 Bugatti Chiron",
|
1016 |
+
"productUrl": "https://shop.lego.com/nl-NL/Bugatti-Chiron-42083",
|
1017 |
+
"imageUrl": "https://sh-s7-live-s.legocdn.com/is/image//LEGO/42083_alt1?$main$",
|
1018 |
+
"sku": "5702016116977",
|
1019 |
+
"type": "physical",
|
1020 |
+
"status": "<<orderline_status>>",
|
1021 |
+
"quantity": 1,
|
1022 |
+
"unitPrice": {
|
1023 |
+
"value": "399.00",
|
1024 |
+
"currency": "EUR"
|
1025 |
+
},
|
1026 |
+
"vatRate": "21.00",
|
1027 |
+
"vatAmount": {
|
1028 |
+
"value": "121.14",
|
1029 |
+
"currency": "EUR"
|
1030 |
+
},
|
1031 |
+
"discountAmount": {
|
1032 |
+
"value": "100.00",
|
1033 |
+
"currency": "EUR"
|
1034 |
+
},
|
1035 |
+
"totalAmount": {
|
1036 |
+
"value": "698.00",
|
1037 |
+
"currency": "EUR"
|
1038 |
+
},
|
1039 |
+
"createdAt": "2018-08-02T09:29:56+00:00"
|
1040 |
+
},
|
1041 |
+
{
|
1042 |
+
"resource": "orderline",
|
1043 |
+
"id": "odl_jp31jz",
|
1044 |
+
"orderId": "<<order_id>>",
|
1045 |
+
"name": "LEGO 42056 Porsche 911 GT3 RS",
|
1046 |
+
"productUrl": "https://shop.lego.com/nl-NL/Porsche-911-GT3-RS-42056",
|
1047 |
+
"imageUrl": "https://sh-s7-live-s.legocdn.com/is/image/LEGO/42056?$PDPDefault$",
|
1048 |
+
"sku": "5702015594028",
|
1049 |
+
"type": "digital",
|
1050 |
+
"status": "<<orderline_status>>",
|
1051 |
+
"quantity": 1,
|
1052 |
+
"unitPrice": {
|
1053 |
+
"value": "329.99",
|
1054 |
+
"currency": "EUR"
|
1055 |
+
},
|
1056 |
+
"vatRate": "21.00",
|
1057 |
+
"vatAmount": {
|
1058 |
+
"value": "57.27",
|
1059 |
+
"currency": "EUR"
|
1060 |
+
},
|
1061 |
+
"totalAmount": {
|
1062 |
+
"value": "329.99",
|
1063 |
+
"currency": "EUR"
|
1064 |
+
},
|
1065 |
+
"createdAt": "2018-08-02T09:29:56+00:00"
|
1066 |
+
}
|
1067 |
+
],
|
1068 |
+
"_links": {
|
1069 |
+
"self": {
|
1070 |
+
"href": "https://api.mollie.com/v2/orders/<<order_id>>/shipments/<<shipment_id>>",
|
1071 |
+
"type": "application/hal+json"
|
1072 |
+
},
|
1073 |
+
"order": {
|
1074 |
+
"href": "https://api.mollie.com/v2/orders/<<order_id>>",
|
1075 |
+
"type": "application/hal+json"
|
1076 |
+
},
|
1077 |
+
"documentation": {
|
1078 |
+
"href": "https://docs.mollie.com/reference/v2/shipments-api/get-shipment",
|
1079 |
+
"type": "text/html"
|
1080 |
+
}
|
1081 |
+
}
|
1082 |
+
}'
|
1083 |
+
);
|
1084 |
+
}
|
1085 |
+
}
|
includes/mollie-api-php/tests/Mollie/API/Endpoints/OrderLineEndpointTest.php
ADDED
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tests\Mollie\Api\Endpoints;
|
4 |
+
|
5 |
+
use GuzzleHttp\Client;
|
6 |
+
use Mollie\Api\Exceptions\ApiException;
|
7 |
+
use Mollie\Api\MollieApiClient;
|
8 |
+
use Mollie\Api\Resources\Order;
|
9 |
+
|
10 |
+
|
11 |
+
class OrderLineEndpointTest extends BaseEndpointTest
|
12 |
+
{
|
13 |
+
public function testCancelLinesRequiresLinesArray() {
|
14 |
+
$this->expectException(ApiException::class);
|
15 |
+
|
16 |
+
$this->guzzleClient = $this->createMock(Client::class);
|
17 |
+
$this->apiClient = new MollieApiClient($this->guzzleClient);
|
18 |
+
|
19 |
+
$this->apiClient->orderLines->cancelFor(new Order($this->apiClient), []);
|
20 |
+
}
|
21 |
+
}
|
includes/mollie-api-php/tests/Mollie/API/Endpoints/OrderPaymentEndpointTest.php
ADDED
@@ -0,0 +1,289 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tests\Mollie\Api\Endpoints;
|
4 |
+
|
5 |
+
use GuzzleHttp\Psr7\Request;
|
6 |
+
use GuzzleHttp\Psr7\Response;
|
7 |
+
use Mollie\Api\Resources\Order;
|
8 |
+
use Mollie\Api\Resources\OrderCollection;
|
9 |
+
use Mollie\Api\Resources\Payment;
|
10 |
+
use Mollie\Api\Resources\Shipment;
|
11 |
+
use Mollie\Api\Types\OrderLineStatus;
|
12 |
+
use Mollie\Api\Types\OrderLineType;
|
13 |
+
use Mollie\Api\Types\OrderStatus;
|
14 |
+
use Mollie\Api\Types\PaymentMethod;
|
15 |
+
use Mollie\Api\Types\PaymentStatus;
|
16 |
+
use Mollie\Api\Types\SequenceType;
|
17 |
+
use Tests\Mollie\TestHelpers\AmountObjectTestHelpers;
|
18 |
+
use Tests\Mollie\TestHelpers\LinkObjectTestHelpers;
|
19 |
+
use stdClass;
|
20 |
+
|
21 |
+
class OrderPaymentEndpointTest extends BaseEndpointTest
|
22 |
+
{
|
23 |
+
use LinkObjectTestHelpers;
|
24 |
+
use AmountObjectTestHelpers;
|
25 |
+
|
26 |
+
public function testCreateOrderPayment()
|
27 |
+
{
|
28 |
+
$this->mockApiCall(
|
29 |
+
new Request(
|
30 |
+
"POST",
|
31 |
+
"/v2/orders/ord_stTC2WHAuS/payments",
|
32 |
+
[],
|
33 |
+
'{
|
34 |
+
"method": "banktransfer",
|
35 |
+
"dueDate": "2018-12-21"
|
36 |
+
}'
|
37 |
+
),
|
38 |
+
new Response(
|
39 |
+
201,
|
40 |
+
[],
|
41 |
+
'{
|
42 |
+
"resource": "payment",
|
43 |
+
"id": "tr_WDqYK6vllg",
|
44 |
+
"mode": "test",
|
45 |
+
"amount": {
|
46 |
+
"currency": "EUR",
|
47 |
+
"value": "698.00"
|
48 |
+
},
|
49 |
+
"status": "open",
|
50 |
+
"description": "Order #1337 (Lego cars)",
|
51 |
+
"createdAt": "2018-12-01T17:09:02+00:00",
|
52 |
+
"method": "banktransfer",
|
53 |
+
"metadata": null,
|
54 |
+
"orderId": "ord_stTC2WHAuS",
|
55 |
+
"isCancelable": true,
|
56 |
+
"locale": "nl_NL",
|
57 |
+
"profileId": "pfl_URR55HPMGx",
|
58 |
+
"sequenceType": "oneoff",
|
59 |
+
"settlementAmount": {
|
60 |
+
"value": "698.00",
|
61 |
+
"currency": "EUR"
|
62 |
+
},
|
63 |
+
"_links": {
|
64 |
+
"self": {
|
65 |
+
"href": "https://api.mollie.com/v2/payments/tr_WDqYK6vllg",
|
66 |
+
"type": "application/hal+json"
|
67 |
+
},
|
68 |
+
"order": {
|
69 |
+
"href": "https://api.mollie.com/v2/orders/ord_stTC2WHAuS",
|
70 |
+
"type": "application/hal+json"
|
71 |
+
},
|
72 |
+
"checkout": {
|
73 |
+
"href": "https://www.mollie.com/paymentscreen/testmode/?method=banktransfer&token=fgnwdh",
|
74 |
+
"type": "text/html"
|
75 |
+
},
|
76 |
+
"status": {
|
77 |
+
"href": "https://www.mollie.com/paymentscreen/banktransfer/status/fgnwdh",
|
78 |
+
"type": "text/html"
|
79 |
+
},
|
80 |
+
"payOnline": {
|
81 |
+
"href": "https://www.mollie.com/paymentscreen/banktransfer/pay-online/fgnwdh",
|
82 |
+
"type": "text/html"
|
83 |
+
},
|
84 |
+
"documentation": {
|
85 |
+
"href": "https://docs.mollie.com/reference/v2/orders-api/create-order-payment",
|
86 |
+
"type": "text/html"
|
87 |
+
}
|
88 |
+
}
|
89 |
+
}'
|
90 |
+
)
|
91 |
+
);
|
92 |
+
|
93 |
+
$order = $this->getOrder('ord_stTC2WHAuS');
|
94 |
+
|
95 |
+
$payment = $order->createPayment([
|
96 |
+
'method' => 'banktransfer',
|
97 |
+
'dueDate' => '2018-12-21',
|
98 |
+
]);
|
99 |
+
|
100 |
+
$this->assertNotNull($payment);
|
101 |
+
$this->assertInstanceOf(Payment::class, $payment);
|
102 |
+
$this->assertEquals('payment', $payment->resource);
|
103 |
+
$this->assertEquals('tr_WDqYK6vllg', $payment->id);
|
104 |
+
$this->assertEquals('test', $payment->mode);
|
105 |
+
$this->assertAmountObject(698, 'EUR', $payment->amount);
|
106 |
+
$this->assertEquals('open', $payment->status);
|
107 |
+
$this->assertEquals(PaymentStatus::STATUS_OPEN, $payment->status);
|
108 |
+
$this->assertEquals('Order #1337 (Lego cars)', $payment->description);
|
109 |
+
$this->assertEquals('2018-12-01T17:09:02+00:00', $payment->createdAt);
|
110 |
+
$this->assertEquals(PaymentMethod::BANKTRANSFER, $payment->method);
|
111 |
+
$this->assertNull($payment->metadata);
|
112 |
+
$this->assertEquals('ord_stTC2WHAuS', $payment->orderId);
|
113 |
+
$this->assertTrue($payment->isCancelable);
|
114 |
+
$this->assertEquals('nl_NL', $payment->locale);
|
115 |
+
$this->assertEquals('pfl_URR55HPMGx', $payment->profileId);
|
116 |
+
$this->assertEquals(SequenceType::SEQUENCETYPE_ONEOFF, $payment->sequenceType);
|
117 |
+
$this->assertAmountObject(698, 'EUR', $payment->settlementAmount);
|
118 |
+
|
119 |
+
$this->assertLinkObject(
|
120 |
+
'https://api.mollie.com/v2/payments/tr_WDqYK6vllg',
|
121 |
+
'application/hal+json',
|
122 |
+
$payment->_links->self
|
123 |
+
);
|
124 |
+
$this->assertLinkObject(
|
125 |
+
'https://api.mollie.com/v2/orders/ord_stTC2WHAuS',
|
126 |
+
'application/hal+json',
|
127 |
+
$payment->_links->order
|
128 |
+
);
|
129 |
+
$this->assertLinkObject(
|
130 |
+
'https://www.mollie.com/paymentscreen/testmode/?method=banktransfer&token=fgnwdh',
|
131 |
+
'text/html',
|
132 |
+
$payment->_links->checkout
|
133 |
+
);
|
134 |
+
$this->assertLinkObject(
|
135 |
+
'https://www.mollie.com/paymentscreen/banktransfer/status/fgnwdh',
|
136 |
+
'text/html',
|
137 |
+
$payment->_links->status
|
138 |
+
);
|
139 |
+
$this->assertLinkObject(
|
140 |
+
'https://www.mollie.com/paymentscreen/banktransfer/pay-online/fgnwdh',
|
141 |
+
'text/html',
|
142 |
+
$payment->_links->payOnline
|
143 |
+
);
|
144 |
+
$this->assertLinkObject(
|
145 |
+
'https://docs.mollie.com/reference/v2/orders-api/create-order-payment',
|
146 |
+
'text/html',
|
147 |
+
$payment->_links->documentation
|
148 |
+
);
|
149 |
+
}
|
150 |
+
|
151 |
+
protected function getOrder($id)
|
152 |
+
{
|
153 |
+
$orderJson = $this->getOrderResponseFixture($id);
|
154 |
+
return $this->copy(json_decode($orderJson), new Order($this->apiClient));
|
155 |
+
}
|
156 |
+
|
157 |
+
protected function getOrderResponseFixture($order_id, $order_status = OrderStatus::STATUS_CREATED)
|
158 |
+
{
|
159 |
+
return str_replace(
|
160 |
+
"<<order_id>>",
|
161 |
+
$order_id,
|
162 |
+
'{
|
163 |
+
"resource": "order",
|
164 |
+
"id": "<<order_id>>",
|
165 |
+
"profileId": "pfl_URR55HPMGx",
|
166 |
+
"amount": {
|
167 |
+
"value": "1027.99",
|
168 |
+
"currency": "EUR"
|
169 |
+
},
|
170 |
+
"amountCaptured": {
|
171 |
+
"value": "0.00",
|
172 |
+
"currency": "EUR"
|
173 |
+
},
|
174 |
+
"amountRefunded": {
|
175 |
+
"value": "0.00",
|
176 |
+
"currency": "EUR"
|
177 |
+
},
|
178 |
+
"status": "' . $order_status . '",
|
179 |
+
"metadata": {
|
180 |
+
"order_id": "1337",
|
181 |
+
"description": "Lego cars"
|
182 |
+
},
|
183 |
+
"consumerDateOfBirth": "1958-01-31",
|
184 |
+
"createdAt": "2018-08-02T09:29:56+00:00",
|
185 |
+
"mode": "live",
|
186 |
+
"billingAddress": {
|
187 |
+
"organizationName": "Organization Name LTD.",
|
188 |
+
"streetAndNumber": "Keizersgracht 313",
|
189 |
+
"postalCode": "1016 EE",
|
190 |
+
"city": "Amsterdam",
|
191 |
+
"country": "nl",
|
192 |
+
"givenName": "Luke",
|
193 |
+
"familyName": "Skywalker",
|
194 |
+
"email": "luke@skywalker.com"
|
195 |
+
},
|
196 |
+
"shippingAddress": {
|
197 |
+
"organizationName": "Organization Name LTD.",
|
198 |
+
"streetAndNumber": "Keizersgracht 313",
|
199 |
+
"postalCode": "1016 EE",
|
200 |
+
"city": "Amsterdam",
|
201 |
+
"country": "nl",
|
202 |
+
"givenName": "Luke",
|
203 |
+
"familyName": "Skywalker",
|
204 |
+
"email": "luke@skywalker.com"
|
205 |
+
},
|
206 |
+
"orderNumber": "1337",
|
207 |
+
"locale": "nl_NL",
|
208 |
+
"method" : "klarnapaylater",
|
209 |
+
"isCancelable": true,
|
210 |
+
"redirectUrl": "https://example.org/redirect",
|
211 |
+
"webhookUrl": "https://example.org/webhook",
|
212 |
+
"lines": [
|
213 |
+
{
|
214 |
+
"resource": "orderline",
|
215 |
+
"id": "odl_dgtxyl",
|
216 |
+
"orderId": "<<order_id>>",
|
217 |
+
"name": "LEGO 42083 Bugatti Chiron",
|
218 |
+
"productUrl": "https://shop.lego.com/nl-NL/Bugatti-Chiron-42083",
|
219 |
+
"imageUrl": "https://sh-s7-live-s.legocdn.com/is/image//LEGO/42083_alt1?$main$",
|
220 |
+
"sku": "5702016116977",
|
221 |
+
"type": "physical",
|
222 |
+
"status": "created",
|
223 |
+
"isCancelable": true,
|
224 |
+
"quantity": 2,
|
225 |
+
"unitPrice": {
|
226 |
+
"value": "399.00",
|
227 |
+
"currency": "EUR"
|
228 |
+
},
|
229 |
+
"vatRate": "21.00",
|
230 |
+
"vatAmount": {
|
231 |
+
"value": "121.14",
|
232 |
+
"currency": "EUR"
|
233 |
+
},
|
234 |
+
"discountAmount": {
|
235 |
+
"value": "100.00",
|
236 |
+
"currency": "EUR"
|
237 |
+
},
|
238 |
+
"totalAmount": {
|
239 |
+
"value": "698.00",
|
240 |
+
"currency": "EUR"
|
241 |
+
},
|
242 |
+
"createdAt": "2018-08-02T09:29:56+00:00"
|
243 |
+
},
|
244 |
+
{
|
245 |
+
"resource": "orderline",
|
246 |
+
"id": "odl_jp31jz",
|
247 |
+
"orderId": "<<order_id>>",
|
248 |
+
"name": "LEGO 42056 Porsche 911 GT3 RS",
|
249 |
+
"productUrl": "https://shop.lego.com/nl-NL/Porsche-911-GT3-RS-42056",
|
250 |
+
"imageUrl": "https://sh-s7-live-s.legocdn.com/is/image/LEGO/42056?$PDPDefault$",
|
251 |
+
"sku": "5702015594028",
|
252 |
+
"type": "digital",
|
253 |
+
"status": "created",
|
254 |
+
"isCancelable": true,
|
255 |
+
"quantity": 1,
|
256 |
+
"unitPrice": {
|
257 |
+
"value": "329.99",
|
258 |
+
"currency": "EUR"
|
259 |
+
},
|
260 |
+
"vatRate": "21.00",
|
261 |
+
"vatAmount": {
|
262 |
+
"value": "57.27",
|
263 |
+
"currency": "EUR"
|
264 |
+
},
|
265 |
+
"totalAmount": {
|
266 |
+
"value": "329.99",
|
267 |
+
"currency": "EUR"
|
268 |
+
},
|
269 |
+
"createdAt": "2018-08-02T09:29:56+00:00"
|
270 |
+
}
|
271 |
+
],
|
272 |
+
"_links": {
|
273 |
+
"self": {
|
274 |
+
"href": "https://api.mollie.com/v2/orders/<<order_id>>",
|
275 |
+
"type": "application/hal+json"
|
276 |
+
},
|
277 |
+
"checkout": {
|
278 |
+
"href": "https://www.mollie.com/payscreen/select-method/7UhSN1zuXS",
|
279 |
+
"type": "text/html"
|
280 |
+
},
|
281 |
+
"documentation": {
|
282 |
+
"href": "https://docs.mollie.com/reference/v2/orders-api/get-order",
|
283 |
+
"type": "text/html"
|
284 |
+
}
|
285 |
+
}
|
286 |
+
}'
|
287 |
+
);
|
288 |
+
}
|
289 |
+
}
|
includes/mollie-api-php/tests/Mollie/API/Endpoints/OrderRefundEndpointTest.php
ADDED
@@ -0,0 +1,427 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tests\Mollie\Api\Endpoints;
|
4 |
+
|
5 |
+
use GuzzleHttp\Psr7\Request;
|
6 |
+
use GuzzleHttp\Psr7\Response;
|
7 |
+
use Mollie\Api\Resources\Order;
|
8 |
+
use Mollie\Api\Resources\OrderLine;
|
9 |
+
use Mollie\Api\Resources\Refund;
|
10 |
+
use Mollie\Api\Resources\RefundCollection;
|
11 |
+
use Mollie\Api\Types\OrderStatus;
|
12 |
+
use Mollie\Api\Types\RefundStatus;
|
13 |
+
use Tests\Mollie\TestHelpers\AmountObjectTestHelpers;
|
14 |
+
use Tests\Mollie\TestHelpers\LinkObjectTestHelpers;
|
15 |
+
|
16 |
+
class OrderRefundEndpointTest extends BaseEndpointTest
|
17 |
+
{
|
18 |
+
use LinkObjectTestHelpers;
|
19 |
+
use AmountObjectTestHelpers;
|
20 |
+
|
21 |
+
public function testCreatePartialOrderRefund()
|
22 |
+
{
|
23 |
+
$this->mockApiCall(
|
24 |
+
new Request(
|
25 |
+
"POST",
|
26 |
+
"/v2/orders/ord_stTC2WHAuS/refunds",
|
27 |
+
[],
|
28 |
+
'{
|
29 |
+
"lines": [
|
30 |
+
{
|
31 |
+
"id": "odl_dgtxyl",
|
32 |
+
"quantity": 1
|
33 |
+
}
|
34 |
+
]
|
35 |
+
}'
|
36 |
+
),
|
37 |
+
new Response(
|
38 |
+
201,
|
39 |
+
[],
|
40 |
+
$this->getOrderRefundResponseFixture('re_4qqhO89gsT', 'ord_stTC2WHAuS')
|
41 |
+
)
|
42 |
+
);
|
43 |
+
|
44 |
+
$order = $this->getOrder('ord_stTC2WHAuS');
|
45 |
+
|
46 |
+
$refund = $order->refund([
|
47 |
+
'lines' => [
|
48 |
+
[
|
49 |
+
'id' => 'odl_dgtxyl',
|
50 |
+
'quantity' => 1,
|
51 |
+
]
|
52 |
+
],
|
53 |
+
]);
|
54 |
+
|
55 |
+
$this->assertOrderRefund($refund, 're_4qqhO89gsT');
|
56 |
+
}
|
57 |
+
|
58 |
+
public function testCreateCompleteOrderRefund()
|
59 |
+
{
|
60 |
+
$this->mockApiCall(
|
61 |
+
new Request(
|
62 |
+
"POST",
|
63 |
+
"/v2/orders/ord_stTC2WHAuS/refunds",
|
64 |
+
[],
|
65 |
+
'{
|
66 |
+
"lines": []
|
67 |
+
}'
|
68 |
+
),
|
69 |
+
new Response(
|
70 |
+
201,
|
71 |
+
[],
|
72 |
+
$this->getOrderRefundResponseFixture('re_4qqhO89gsT', 'ord_stTC2WHAuS')
|
73 |
+
)
|
74 |
+
);
|
75 |
+
|
76 |
+
$order = $this->getOrder('ord_stTC2WHAuS');
|
77 |
+
|
78 |
+
$refund = $order->refundAll();
|
79 |
+
|
80 |
+
$this->assertOrderRefund($refund, 're_4qqhO89gsT');
|
81 |
+
}
|
82 |
+
|
83 |
+
public function testListOrderRefunds()
|
84 |
+
{
|
85 |
+
$this->mockApiCall(
|
86 |
+
new Request(
|
87 |
+
"GET",
|
88 |
+
"/v2/orders/ord_stTC2WHAuS/refunds"
|
89 |
+
),
|
90 |
+
new Response(
|
91 |
+
200,
|
92 |
+
[],
|
93 |
+
'{
|
94 |
+
"count": 1,
|
95 |
+
"_embedded": {
|
96 |
+
"refunds": [
|
97 |
+
{
|
98 |
+
"resource": "refund",
|
99 |
+
"id": "re_4qqhO89gsT",
|
100 |
+
"amount": {
|
101 |
+
"currency": "EUR",
|
102 |
+
"value": "698.00"
|
103 |
+
},
|
104 |
+
"status": "pending",
|
105 |
+
"createdAt": "2018-03-19T12:33:37+00:00",
|
106 |
+
"description": "Item not in stock, refunding",
|
107 |
+
"paymentId": "tr_WDqYK6vllg",
|
108 |
+
"orderId": "ord_pbjz8x",
|
109 |
+
"lines": [
|
110 |
+
{
|
111 |
+
"resource": "orderline",
|
112 |
+
"id": "odl_dgtxyl",
|
113 |
+
"orderId": "ord_pbjz8x",
|
114 |
+
"name": "LEGO 42083 Bugatti Chiron",
|
115 |
+
"productUrl": "https://shop.lego.com/nl-NL/Bugatti-Chiron-42083",
|
116 |
+
"imageUrl": "https://sh-s7-live-s.legocdn.com/is/image//LEGO/42083_alt1?$main$",
|
117 |
+
"sku": "5702016116977",
|
118 |
+
"type": "physical",
|
119 |
+
"status": "refunded",
|
120 |
+
"quantity": 2,
|
121 |
+
"unitPrice": {
|
122 |
+
"value": "399.00",
|
123 |
+
"currency": "EUR"
|
124 |
+
},
|
125 |
+
"vatRate": "21.00",
|
126 |
+
"vatAmount": {
|
127 |
+
"value": "121.14",
|
128 |
+
"currency": "EUR"
|
129 |
+
},
|
130 |
+
"discountAmount": {
|
131 |
+
"value": "100.00",
|
132 |
+
"currency": "EUR"
|
133 |
+
},
|
134 |
+
"totalAmount": {
|
135 |
+
"value": "698.00",
|
136 |
+
"currency": "EUR"
|
137 |
+
},
|
138 |
+
"createdAt": "2018-08-02T09:29:56+00:00"
|
139 |
+
}
|
140 |
+
],
|
141 |
+
"_links": {
|
142 |
+
"self": {
|
143 |
+
"href": "https://api.mollie.com/v2/payments/tr_WDqYK6vllg/refunds/re_4qqhO89gsT",
|
144 |
+
"type": "application/hal+json"
|
145 |
+
},
|
146 |
+
"payment": {
|
147 |
+
"href": "https://api.mollie.com/v2/payments/tr_WDqYK6vllg",
|
148 |
+
"type": "application/hal+json"
|
149 |
+
},
|
150 |
+
"order": {
|
151 |
+
"href": "https://api.mollie.com/v2/orders/ord_pbjz8x",
|
152 |
+
"type": "application/hal+json"
|
153 |
+
},
|
154 |
+
"documentation": {
|
155 |
+
"href": "https://docs.mollie.com/reference/v2/refunds-api/get-refund",
|
156 |
+
"type": "text/html"
|
157 |
+
}
|
158 |
+
}
|
159 |
+
}
|
160 |
+
]
|
161 |
+
},
|
162 |
+
"_links": {
|
163 |
+
"self": {
|
164 |
+
"href": "https://api.mollie.com/v2/payments/tr_7UhSN1zuXS/refunds?limit=5",
|
165 |
+
"type": "application/hal+json"
|
166 |
+
},
|
167 |
+
"previous": null,
|
168 |
+
"next": {
|
169 |
+
"href": "https://api.mollie.com/v2/payments/tr_7UhSN1zuXS/refunds?from=re_APBiGPH2vV&limit=5",
|
170 |
+
"type": "application/hal+json"
|
171 |
+
},
|
172 |
+
"documentation": {
|
173 |
+
"href": "https://docs.mollie.com/reference/v2/orders-api/list-order-refunds",
|
174 |
+
"type": "text/html"
|
175 |
+
}
|
176 |
+
}
|
177 |
+
}'
|
178 |
+
)
|
179 |
+
);
|
180 |
+
|
181 |
+
$order = $this->getOrder('ord_stTC2WHAuS');
|
182 |
+
|
183 |
+
$refunds = $order->refunds();
|
184 |
+
|
185 |
+
$this->assertInstanceOf(RefundCollection::class, $refunds);
|
186 |
+
$this->assertEquals(1, $refunds->count);
|
187 |
+
$this->assertCount(1, $refunds);
|
188 |
+
|
189 |
+
$this->assertOrderRefund($refunds[0], 're_4qqhO89gsT');
|
190 |
+
}
|
191 |
+
|
192 |
+
protected function assertOrderRefund($refund, $refund_id, $refund_status = RefundStatus::STATUS_PENDING)
|
193 |
+
{
|
194 |
+
$this->assertInstanceOf(Refund::class, $refund);
|
195 |
+
$this->assertEquals($refund_id, $refund->id);
|
196 |
+
$this->assertAmountObject('698.00', 'EUR', $refund->amount);
|
197 |
+
|
198 |
+
$this->assertEquals($refund_status, $refund->status);
|
199 |
+
$this->assertEquals("2018-03-19T12:33:37+00:00", $refund->createdAt);
|
200 |
+
$this->assertEquals("Item not in stock, refunding", $refund->description);
|
201 |
+
$this->assertEquals("tr_WDqYK6vllg", $refund->paymentId);
|
202 |
+
|
203 |
+
$this->assertLinkObject(
|
204 |
+
"https://api.mollie.com/v2/payments/tr_WDqYK6vllg/refunds/{$refund_id}",
|
205 |
+
'application/hal+json',
|
206 |
+
$refund->_links->self
|
207 |
+
);
|
208 |
+
|
209 |
+
$this->assertLinkObject(
|
210 |
+
'https://docs.mollie.com/reference/v2/refunds-api/get-refund',
|
211 |
+
'text/html',
|
212 |
+
$refund->_links->documentation
|
213 |
+
);
|
214 |
+
}
|
215 |
+
|
216 |
+
protected function getOrderRefundResponseFixture($refund_id, $order_id)
|
217 |
+
{
|
218 |
+
return str_replace(
|
219 |
+
["<<refund_id>>", "<<order_id>>"],
|
220 |
+
[$refund_id, $order_id],
|
221 |
+
'{
|
222 |
+
"resource": "refund",
|
223 |
+
"id": "<<refund_id>>",
|
224 |
+
"amount": {
|
225 |
+
"currency": "EUR",
|
226 |
+
"value": "698.00"
|
227 |
+
},
|
228 |
+
"status": "pending",
|
229 |
+
"createdAt": "2018-03-19T12:33:37+00:00",
|
230 |
+
"description": "Item not in stock, refunding",
|
231 |
+
"paymentId": "tr_WDqYK6vllg",
|
232 |
+
"orderId": "<<order_id>>",
|
233 |
+
"lines": [
|
234 |
+
{
|
235 |
+
"resource": "orderline",
|
236 |
+
"id": "odl_dgtxyl",
|
237 |
+
"orderId": "<<order_id>>",
|
238 |
+
"name": "LEGO 42083 Bugatti Chiron",
|
239 |
+
"productUrl": "https://shop.lego.com/nl-NL/Bugatti-Chiron-42083",
|
240 |
+
"imageUrl": "https://sh-s7-live-s.legocdn.com/is/image//LEGO/42083_alt1?$main$",
|
241 |
+
"sku": "5702016116977",
|
242 |
+
"type": "physical",
|
243 |
+
"status": "refunded",
|
244 |
+
"quantity": 2,
|
245 |
+
"unitPrice": {
|
246 |
+
"value": "399.00",
|
247 |
+
"currency": "EUR"
|
248 |
+
},
|
249 |
+
"vatRate": "21.00",
|
250 |
+
"vatAmount": {
|
251 |
+
"value": "121.14",
|
252 |
+
"currency": "EUR"
|
253 |
+
},
|
254 |
+
"discountAmount": {
|
255 |
+
"value": "100.00",
|
256 |
+
"currency": "EUR"
|
257 |
+
},
|
258 |
+
"totalAmount": {
|
259 |
+
"value": "698.00",
|
260 |
+
"currency": "EUR"
|
261 |
+
},
|
262 |
+
"createdAt": "2018-08-02T09:29:56+00:00"
|
263 |
+
}
|
264 |
+
],
|
265 |
+
"_links": {
|
266 |
+
"self": {
|
267 |
+
"href": "https://api.mollie.com/v2/payments/tr_WDqYK6vllg/refunds/<<refund_id>>",
|
268 |
+
"type": "application/hal+json"
|
269 |
+
},
|
270 |
+
"payment": {
|
271 |
+
"href": "https://api.mollie.com/v2/payments/tr_WDqYK6vllg",
|
272 |
+
"type": "application/hal+json"
|
273 |
+
},
|
274 |
+
"order": {
|
275 |
+
"href": "https://api.mollie.com/v2/orders/<<order_id>>",
|
276 |
+
"type": "application/hal+json"
|
277 |
+
},
|
278 |
+
"documentation": {
|
279 |
+
"href": "https://docs.mollie.com/reference/v2/refunds-api/get-refund",
|
280 |
+
"type": "text/html"
|
281 |
+
}
|
282 |
+
}
|
283 |
+
}'
|
284 |
+
);
|
285 |
+
}
|
286 |
+
|
287 |
+
protected function getOrder($id)
|
288 |
+
{
|
289 |
+
$orderJson = $this->getOrderResponseFixture($id);
|
290 |
+
return $this->copy(json_decode($orderJson), new Order($this->apiClient));
|
291 |
+
}
|
292 |
+
|
293 |
+
protected function getOrderResponseFixture($order_id, $order_status = OrderStatus::STATUS_CREATED)
|
294 |
+
{
|
295 |
+
return str_replace(
|
296 |
+
"<<order_id>>",
|
297 |
+
$order_id,
|
298 |
+
'{
|
299 |
+
"resource": "order",
|
300 |
+
"id": "<<order_id>>",
|
301 |
+
"profileId": "pfl_URR55HPMGx",
|
302 |
+
"amount": {
|
303 |
+
"value": "1027.99",
|
304 |
+
"currency": "EUR"
|
305 |
+
},
|
306 |
+
"amountCaptured": {
|
307 |
+
"value": "0.00",
|
308 |
+
"currency": "EUR"
|
309 |
+
},
|
310 |
+
"amountRefunded": {
|
311 |
+
"value": "0.00",
|
312 |
+
"currency": "EUR"
|
313 |
+
},
|
314 |
+
"status": "' . $order_status . '",
|
315 |
+
"metadata": {
|
316 |
+
"order_id": "1337",
|
317 |
+
"description": "Lego cars"
|
318 |
+
},
|
319 |
+
"consumerDateOfBirth": "1958-01-31",
|
320 |
+
"createdAt": "2018-08-02T09:29:56+00:00",
|
321 |
+
"mode": "live",
|
322 |
+
"billingAddress": {
|
323 |
+
"streetAndNumber": "Keizersgracht 313",
|
324 |
+
"postalCode": "1016 EE",
|
325 |
+
"city": "Amsterdam",
|
326 |
+
"country": "nl",
|
327 |
+
"givenName": "Luke",
|
328 |
+
"familyName": "Skywalker",
|
329 |
+
"email": "luke@skywalker.com"
|
330 |
+
},
|
331 |
+
"shippingAddress": {
|
332 |
+
"streetAndNumber": "Keizersgracht 313",
|
333 |
+
"postalCode": "1016 EE",
|
334 |
+
"city": "Amsterdam",
|
335 |
+
"country": "nl",
|
336 |
+
"givenName": "Luke",
|
337 |
+
"familyName": "Skywalker",
|
338 |
+
"email": "luke@skywalker.com"
|
339 |
+
},
|
340 |
+
"orderNumber": "1337",
|
341 |
+
"locale": "nl_NL",
|
342 |
+
"method" : "klarnapaylater",
|
343 |
+
"isCancelable": true,
|
344 |
+
"redirectUrl": "https://example.org/redirect",
|
345 |
+
"webhookUrl": "https://example.org/webhook",
|
346 |
+
"lines": [
|
347 |
+
{
|
348 |
+
"resource": "orderline",
|
349 |
+
"id": "odl_dgtxyl",
|
350 |
+
"orderId": "<<order_id>>",
|
351 |
+
"name": "LEGO 42083 Bugatti Chiron",
|
352 |
+
"productUrl": "https://shop.lego.com/nl-NL/Bugatti-Chiron-42083",
|
353 |
+
"imageUrl": "https://sh-s7-live-s.legocdn.com/is/image//LEGO/42083_alt1?$main$",
|
354 |
+
"sku": "5702016116977",
|
355 |
+
"type": "physical",
|
356 |
+
"status": "created",
|
357 |
+
"isCancelable": true,
|
358 |
+
"quantity": 2,
|
359 |
+
"unitPrice": {
|
360 |
+
"value": "399.00",
|
361 |
+
"currency": "EUR"
|
362 |
+
},
|
363 |
+
"vatRate": "21.00",
|
364 |
+
"vatAmount": {
|
365 |
+
"value": "121.14",
|
366 |
+
"currency": "EUR"
|
367 |
+
},
|
368 |
+
"discountAmount": {
|
369 |
+
"value": "100.00",
|
370 |
+
"currency": "EUR"
|
371 |
+
},
|
372 |
+
"totalAmount": {
|
373 |
+
"value": "698.00",
|
374 |
+
"currency": "EUR"
|
375 |
+
},
|
376 |
+
"createdAt": "2018-08-02T09:29:56+00:00"
|
377 |
+
},
|
378 |
+
{
|
379 |
+
"resource": "orderline",
|
380 |
+
"id": "odl_jp31jz",
|
381 |
+
"orderId": "<<order_id>>",
|
382 |
+
"name": "LEGO 42056 Porsche 911 GT3 RS",
|
383 |
+
"productUrl": "https://shop.lego.com/nl-NL/Porsche-911-GT3-RS-42056",
|
384 |
+
"imageUrl": "https://sh-s7-live-s.legocdn.com/is/image/LEGO/42056?$PDPDefault$",
|
385 |
+
"sku": "5702015594028",
|
386 |
+
"type": "digital",
|
387 |
+
"status": "created",
|
388 |
+
"isCancelable": true,
|
389 |
+
"quantity": 1,
|
390 |
+
"unitPrice": {
|
391 |
+
"value": "329.99",
|
392 |
+
"currency": "EUR"
|
393 |
+
},
|
394 |
+
"vatRate": "21.00",
|
395 |
+
"vatAmount": {
|
396 |
+
"value": "57.27",
|
397 |
+
"currency": "EUR"
|
398 |
+
},
|
399 |
+
"totalAmount": {
|
400 |
+
"value": "329.99",
|
401 |
+
"currency": "EUR"
|
402 |
+
},
|
403 |
+
"createdAt": "2018-08-02T09:29:56+00:00"
|
404 |
+
}
|
405 |
+
],
|
406 |
+
"_links": {
|
407 |
+
"refunds": {
|
408 |
+
"href": "https://api.mollie.com/v2/orders/<<order_id>>/refunds",
|
409 |
+
"type": "application/hal+json"
|
410 |
+
},
|
411 |
+
"self": {
|
412 |
+
"href": "https://api.mollie.com/v2/orders/<<order_id>>",
|
413 |
+
"type": "application/hal+json"
|
414 |
+
},
|
415 |
+
"checkout": {
|
416 |
+
"href": "https://www.mollie.com/payscreen/select-method/7UhSN1zuXS",
|
417 |
+
"type": "text/html"
|
418 |
+
},
|
419 |
+
"documentation": {
|
420 |
+
"href": "https://docs.mollie.com/reference/v2/orders-api/get-order",
|
421 |
+
"type": "text/html"
|
422 |
+
}
|
423 |
+
}
|
424 |
+
}'
|
425 |
+
);
|
426 |
+
}
|
427 |
+
}
|
includes/mollie-api-php/tests/Mollie/API/Endpoints/OrganizationEndpointTest.php
ADDED
@@ -0,0 +1,126 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tests\Mollie\Api\Endpoints;
|
4 |
+
|
5 |
+
use GuzzleHttp\Psr7\Request;
|
6 |
+
use GuzzleHttp\Psr7\Response;
|
7 |
+
use Mollie\Api\Resources\Organization;
|
8 |
+
use Mollie\Api\Resources\OrganizationCollection;
|
9 |
+
use Tests\Mollie\TestHelpers\LinkObjectTestHelpers;
|
10 |
+
|
11 |
+
class OrganizationEndpointTest extends BaseEndpointTest
|
12 |
+
{
|
13 |
+
use LinkObjectTestHelpers;
|
14 |
+
|
15 |
+
public function testGetOrganization()
|
16 |
+
{
|
17 |
+
$this->mockApiCall(
|
18 |
+
new Request("GET", "/v2/organizations/org_12345678"),
|
19 |
+
new Response(
|
20 |
+
200,
|
21 |
+
[],
|
22 |
+
'{
|
23 |
+
"resource": "organization",
|
24 |
+
"id": "org_12345678",
|
25 |
+
"name": "Mollie B.V.",
|
26 |
+
"email": "info@mollie.com",
|
27 |
+
"locale": "nl_NL",
|
28 |
+
"address": {
|
29 |
+
"streetAndNumber": "Keizersgracht 313",
|
30 |
+
"postalCode": "1016 EE",
|
31 |
+
"city": "Amsterdam",
|
32 |
+
"country": "NL"
|
33 |
+
},
|
34 |
+
"registrationNumber": "30204462",
|
35 |
+
"vatNumber": "NL815839091B01",
|
36 |
+
"_links": {
|
37 |
+
"self": {
|
38 |
+
"href": "https://api.mollie.com/v2/organizations/org_12345678",
|
39 |
+
"type": "application/hal+json"
|
40 |
+
},
|
41 |
+
"documentation": {
|
42 |
+
"href": "https://docs.mollie.com/reference/v2/organizations-api/get-organization",
|
43 |
+
"type": "text/html"
|
44 |
+
}
|
45 |
+
}
|
46 |
+
}'
|
47 |
+
)
|
48 |
+
);
|
49 |
+
|
50 |
+
$organization = $this->apiClient->organizations->get('org_12345678');
|
51 |
+
|
52 |
+
$this->assertOrganization($organization);
|
53 |
+
}
|
54 |
+
|
55 |
+
public function testGetCurrentOrganization()
|
56 |
+
{
|
57 |
+
$this->mockApiCall(
|
58 |
+
new Request("GET", "/v2/organizations/me"),
|
59 |
+
new Response(
|
60 |
+
200,
|
61 |
+
[],
|
62 |
+
'{
|
63 |
+
"resource": "organization",
|
64 |
+
"id": "org_12345678",
|
65 |
+
"name": "Mollie B.V.",
|
66 |
+
"email": "info@mollie.com",
|
67 |
+
"locale": "nl_NL",
|
68 |
+
"address": {
|
69 |
+
"streetAndNumber": "Keizersgracht 313",
|
70 |
+
"postalCode": "1016 EE",
|
71 |
+
"city": "Amsterdam",
|
72 |
+
"country": "NL"
|
73 |
+
},
|
74 |
+
"registrationNumber": "30204462",
|
75 |
+
"vatNumber": "NL815839091B01",
|
76 |
+
"_links": {
|
77 |
+
"self": {
|
78 |
+
"href": "https://api.mollie.com/v2/organizations/org_12345678",
|
79 |
+
"type": "application/hal+json"
|
80 |
+
},
|
81 |
+
"documentation": {
|
82 |
+
"href": "https://docs.mollie.com/reference/v2/organizations-api/get-organization",
|
83 |
+
"type": "text/html"
|
84 |
+
}
|
85 |
+
}
|
86 |
+
}'
|
87 |
+
)
|
88 |
+
);
|
89 |
+
|
90 |
+
$organization = $this->apiClient->organizations->current();
|
91 |
+
|
92 |
+
$this->assertOrganization($organization);
|
93 |
+
}
|
94 |
+
|
95 |
+
protected function assertOrganization($organization)
|
96 |
+
{
|
97 |
+
$this->assertInstanceOf(Organization::class, $organization);
|
98 |
+
|
99 |
+
$this->assertEquals('org_12345678', $organization->id);
|
100 |
+
$this->assertEquals('Mollie B.V.', $organization->name);
|
101 |
+
$this->assertEquals('info@mollie.com', $organization->email);
|
102 |
+
$this->assertEquals('nl_NL', $organization->locale);
|
103 |
+
|
104 |
+
$this->assertEquals((object) [
|
105 |
+
'streetAndNumber' => 'Keizersgracht 313',
|
106 |
+
'postalCode' => '1016 EE',
|
107 |
+
'city' => 'Amsterdam',
|
108 |
+
'country' => 'NL',
|
109 |
+
], $organization->address);
|
110 |
+
|
111 |
+
$this->assertEquals('30204462', $organization->registrationNumber);
|
112 |
+
$this->assertEquals('NL815839091B01', $organization->vatNumber);
|
113 |
+
|
114 |
+
$this->assertLinkObject(
|
115 |
+
'https://api.mollie.com/v2/organizations/org_12345678',
|
116 |
+
'application/hal+json',
|
117 |
+
$organization->_links->self
|
118 |
+
);
|
119 |
+
|
120 |
+
$this->assertLinkObject(
|
121 |
+
'https://docs.mollie.com/reference/v2/organizations-api/get-organization',
|
122 |
+
'text/html',
|
123 |
+
$organization->_links->documentation
|
124 |
+
);
|
125 |
+
}
|
126 |
+
}
|
includes/mollie-api-php/tests/Mollie/API/Endpoints/PaymentCaptureEndpointTest.php
ADDED
@@ -0,0 +1,283 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tests\Mollie\Api\Endpoints;
|
4 |
+
|
5 |
+
use GuzzleHttp\Psr7\Request;
|
6 |
+
use GuzzleHttp\Psr7\Response;
|
7 |
+
use Mollie\Api\Resources\Capture;
|
8 |
+
use Mollie\Api\Resources\Payment;
|
9 |
+
use Tests\Mollie\TestHelpers\AmountObjectTestHelpers;
|
10 |
+
use Tests\Mollie\TestHelpers\LinkObjectTestHelpers;
|
11 |
+
|
12 |
+
class PaymentCaptureEndpointTest extends BaseEndpointTest
|
13 |
+
{
|
14 |
+
use AmountObjectTestHelpers;
|
15 |
+
use LinkObjectTestHelpers;
|
16 |
+
|
17 |
+
public function testGetCaptureForPaymentResource()
|
18 |
+
{
|
19 |
+
$this->mockApiCall(
|
20 |
+
new Request(
|
21 |
+
'GET',
|
22 |
+
'/v2/payments/tr_WDqYK6vllg/captures/cpt_4qqhO89gsT'
|
23 |
+
),
|
24 |
+
new Response(
|
25 |
+
200,
|
26 |
+
[],
|
27 |
+
$this->getCaptureFixture('tr_WDqYK6vllg', 'cpt_4qqhO89gsT')
|
28 |
+
)
|
29 |
+
);
|
30 |
+
|
31 |
+
$capture = $this->apiClient->paymentCaptures->getFor(
|
32 |
+
$this->getPayment('tr_WDqYK6vllg'),
|
33 |
+
'cpt_4qqhO89gsT'
|
34 |
+
);
|
35 |
+
|
36 |
+
$this->assertCapture($capture);
|
37 |
+
}
|
38 |
+
|
39 |
+
public function testGetCaptureOnPaymentResource()
|
40 |
+
{
|
41 |
+
$this->mockApiCall(
|
42 |
+
new Request(
|
43 |
+
'GET',
|
44 |
+
'/v2/payments/tr_WDqYK6vllg/captures/cpt_4qqhO89gsT'
|
45 |
+
),
|
46 |
+
new Response(
|
47 |
+
200,
|
48 |
+
[],
|
49 |
+
$this->getCaptureFixture('tr_WDqYK6vllg', 'cpt_4qqhO89gsT')
|
50 |
+
)
|
51 |
+
);
|
52 |
+
|
53 |
+
$capture = $this->getPayment('tr_WDqYK6vllg')->getCapture('cpt_4qqhO89gsT');
|
54 |
+
|
55 |
+
$this->assertCapture($capture);
|
56 |
+
}
|
57 |
+
|
58 |
+
public function testListCapturesOnPaymentResource()
|
59 |
+
{
|
60 |
+
$this->mockApiCall(
|
61 |
+
new Request(
|
62 |
+
'GET',
|
63 |
+
'/v2/payments/tr_WDqYK6vllg/captures'
|
64 |
+
),
|
65 |
+
new Response(
|
66 |
+
200,
|
67 |
+
[],
|
68 |
+
'{
|
69 |
+
"_embedded": {
|
70 |
+
"captures": [
|
71 |
+
' . $this->getCaptureFixture('tr_WDqYK6vllg', 'cpt_4qqhO89gsT') . '
|
72 |
+
]
|
73 |
+
},
|
74 |
+
"count": 1,
|
75 |
+
"_links": {
|
76 |
+
"documentation": {
|
77 |
+
"href": "https://docs.mollie.com/reference/v2/captures-api/list-captures",
|
78 |
+
"type": "text/html"
|
79 |
+
},
|
80 |
+
"self": {
|
81 |
+
"href": "https://api.mollie.dev/v2/payments/tr_WDqYK6vllg/captures?limit=50",
|
82 |
+
"type": "application/hal+json"
|
83 |
+
},
|
84 |
+
"previous": null,
|
85 |
+
"next": null
|
86 |
+
}
|
87 |
+
}'
|
88 |
+
)
|
89 |
+
);
|
90 |
+
|
91 |
+
$captures = $this->getPayment('tr_WDqYK6vllg')->captures();
|
92 |
+
|
93 |
+
$this->assertEquals(1, $captures->count);
|
94 |
+
|
95 |
+
$this->assertLinkObject(
|
96 |
+
'https://docs.mollie.com/reference/v2/captures-api/list-captures',
|
97 |
+
'text/html',
|
98 |
+
$captures->_links->documentation
|
99 |
+
);
|
100 |
+
|
101 |
+
$this->assertLinkObject(
|
102 |
+
'https://api.mollie.dev/v2/payments/tr_WDqYK6vllg/captures?limit=50',
|
103 |
+
'application/hal+json',
|
104 |
+
$captures->_links->self
|
105 |
+
);
|
106 |
+
|
107 |
+
$this->assertNull($captures->_links->previous);
|
108 |
+
$this->assertNull($captures->_links->next);
|
109 |
+
|
110 |
+
$this->assertCapture($captures[0]);
|
111 |
+
}
|
112 |
+
|
113 |
+
protected function assertCapture($capture)
|
114 |
+
{
|
115 |
+
$this->assertInstanceOf(Capture::class, $capture);
|
116 |
+
|
117 |
+
$this->assertEquals('capture', $capture->resource);
|
118 |
+
$this->assertEquals('cpt_4qqhO89gsT', $capture->id);
|
119 |
+
$this->assertEquals('live', $capture->mode);
|
120 |
+
$this->assertEquals('tr_WDqYK6vllg', $capture->paymentId);
|
121 |
+
$this->assertEquals('shp_3wmsgCJN4U', $capture->shipmentId);
|
122 |
+
$this->assertEquals('stl_jDk30akdN', $capture->settlementId);
|
123 |
+
|
124 |
+
$this->assertAmountObject('1027.99', 'EUR', $capture->amount);
|
125 |
+
$this->assertAmountObject('399.00', 'EUR', $capture->settlementAmount);
|
126 |
+
|
127 |
+
$this->assertEquals('2018-08-02T09:29:56+00:00', $capture->createdAt);
|
128 |
+
|
129 |
+
$this->assertLinkObject(
|
130 |
+
'https://api.mollie.com/v2/payments/tr_WDqYK6vllg/captures/cpt_4qqhO89gsT',
|
131 |
+
'application/hal+json',
|
132 |
+
$capture->_links->self
|
133 |
+
);
|
134 |
+
|
135 |
+
$this->assertLinkObject(
|
136 |
+
'https://api.mollie.com/v2/payments/tr_WDqYK6vllg',
|
137 |
+
'application/hal+json',
|
138 |
+
$capture->_links->payment
|
139 |
+
);
|
140 |
+
|
141 |
+
$this->assertLinkObject(
|
142 |
+
'https://api.mollie.com/v2/orders/ord_8wmqcHMN4U/shipments/shp_3wmsgCJN4U',
|
143 |
+
'application/hal+json',
|
144 |
+
$capture->_links->shipment
|
145 |
+
);
|
146 |
+
|
147 |
+
$this->assertLinkObject(
|
148 |
+
'https://api.mollie.com/v2/settlements/stl_jDk30akdN',
|
149 |
+
'application/hal+json',
|
150 |
+
$capture->_links->settlement
|
151 |
+
);
|
152 |
+
|
153 |
+
$this->assertLinkObject(
|
154 |
+
'https://docs.mollie.com/reference/v2/captures-api/get-capture',
|
155 |
+
'text/html',
|
156 |
+
$capture->_links->documentation
|
157 |
+
);
|
158 |
+
}
|
159 |
+
|
160 |
+
protected function getCaptureFixture(
|
161 |
+
$payment_id = 'tr_WDqYK6vllg',
|
162 |
+
$capture_id = 'cpt_4qqhO89gsT'
|
163 |
+
) {
|
164 |
+
return str_replace(
|
165 |
+
[
|
166 |
+
'<<payment_id>>',
|
167 |
+
'<<capture_id>>',
|
168 |
+
],
|
169 |
+
[
|
170 |
+
$payment_id,
|
171 |
+
$capture_id,
|
172 |
+
],
|
173 |
+
'{
|
174 |
+
"resource": "capture",
|
175 |
+
"id": "<<capture_id>>",
|
176 |
+
"mode": "live",
|
177 |
+
"amount": {
|
178 |
+
"value": "1027.99",
|
179 |
+
"currency": "EUR"
|
180 |
+
},
|
181 |
+
"settlementAmount": {
|
182 |
+
"value": "399.00",
|
183 |
+
"currency": "EUR"
|
184 |
+
},
|
185 |
+
"paymentId": "<<payment_id>>",
|
186 |
+
"shipmentId": "shp_3wmsgCJN4U",
|
187 |
+
"settlementId": "stl_jDk30akdN",
|
188 |
+
"createdAt": "2018-08-02T09:29:56+00:00",
|
189 |
+
"_links": {
|
190 |
+
"self": {
|
191 |
+
"href": "https://api.mollie.com/v2/payments/<<payment_id>>/captures/<<capture_id>>",
|
192 |
+
"type": "application/hal+json"
|
193 |
+
},
|
194 |
+
"payment": {
|
195 |
+
"href": "https://api.mollie.com/v2/payments/<<payment_id>>",
|
196 |
+
"type": "application/hal+json"
|
197 |
+
},
|
198 |
+
"shipment": {
|
199 |
+
"href": "https://api.mollie.com/v2/orders/ord_8wmqcHMN4U/shipments/shp_3wmsgCJN4U",
|
200 |
+
"type": "application/hal+json"
|
201 |
+
},
|
202 |
+
"settlement": {
|
203 |
+
"href": "https://api.mollie.com/v2/settlements/stl_jDk30akdN",
|
204 |
+
"type": "application/hal+json"
|
205 |
+
},
|
206 |
+
"documentation": {
|
207 |
+
"href": "https://docs.mollie.com/reference/v2/captures-api/get-capture",
|
208 |
+
"type": "text/html"
|
209 |
+
}
|
210 |
+
}
|
211 |
+
}'
|
212 |
+
);
|
213 |
+
}
|
214 |
+
|
215 |
+
/**
|
216 |
+
* @return Payment
|
217 |
+
*/
|
218 |
+
protected function getPayment($payment_id = 'tr_44aKxzEbr8')
|
219 |
+
{
|
220 |
+
$paymentJson = '{
|
221 |
+
"resource":"payment",
|
222 |
+
"id":"<<payment_id>>",
|
223 |
+
"mode":"test",
|
224 |
+
"createdAt":"2018-03-19T12:17:57+00:00",
|
225 |
+
"amount":{
|
226 |
+
"value":"20.00",
|
227 |
+
"currency":"EUR"
|
228 |
+
},
|
229 |
+
"description":"My first API payment",
|
230 |
+
"method":"ideal",
|
231 |
+
"metadata":{
|
232 |
+
"order_id":1234
|
233 |
+
},
|
234 |
+
"status":"paid",
|
235 |
+
"paidAt":"2018-03-19T12:18:35+00:00",
|
236 |
+
"amountRefunded":{
|
237 |
+
"value":"0.00",
|
238 |
+
"currency":"EUR"
|
239 |
+
},
|
240 |
+
"amountRemaining":{
|
241 |
+
"value":"20.00",
|
242 |
+
"currency":"EUR"
|
243 |
+
},
|
244 |
+
"details":{
|
245 |
+
"consumerName":"T. TEST",
|
246 |
+
"consumerAccount":"NL17RABO0213698412",
|
247 |
+
"consumerBic":"TESTNL99"
|
248 |
+
},
|
249 |
+
"locale":"nl_NL",
|
250 |
+
"countryCode":"NL",
|
251 |
+
"profileId":"pfl_2A1gacu42V",
|
252 |
+
"sequenceType":"oneoff",
|
253 |
+
"redirectUrl":"http://example.org/examples/03-return-page.php?order_id=1234",
|
254 |
+
"webhookUrl":"http://example.org/examples/02-webhook-verification.php",
|
255 |
+
"settlementAmount":{
|
256 |
+
"value":"20.00",
|
257 |
+
"currency":"EUR"
|
258 |
+
},
|
259 |
+
"_links":{
|
260 |
+
"self":{
|
261 |
+
"href":"https://api.mollie.com/v2/payments/<<payment_id>>",
|
262 |
+
"type":"application/hal+json"
|
263 |
+
},
|
264 |
+
"documentation":{
|
265 |
+
"href":"https://docs.mollie.com/reference/v2/payments-api/get-payment",
|
266 |
+
"type":"text/html"
|
267 |
+
},
|
268 |
+
"refunds":{
|
269 |
+
"href":"https://api.mollie.com/v2/payments/<<payment_id>>/refunds",
|
270 |
+
"type":"application/hal+json"
|
271 |
+
},
|
272 |
+
"captures":{
|
273 |
+
"href":"https://api.mollie.com/v2/payments/<<payment_id>>/captures",
|
274 |
+
"type":"application/hal+json"
|
275 |
+
}
|
276 |
+
}
|
277 |
+
}';
|
278 |
+
|
279 |
+
$paymentJson = str_replace('<<payment_id>>', $payment_id, $paymentJson);
|
280 |
+
|
281 |
+
return $this->copy(json_decode($paymentJson), new Payment($this->apiClient));
|
282 |
+
}
|
283 |
+
}
|
includes/mollie-api-php/tests/Mollie/API/Endpoints/PaymentChargebackEndpointTest.php
ADDED
@@ -0,0 +1,265 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tests\Mollie\Api\Endpoints;
|
4 |
+
|
5 |
+
use GuzzleHttp\Psr7\Request;
|
6 |
+
use GuzzleHttp\Psr7\Response;
|
7 |
+
use Mollie\Api\Resources\Chargeback;
|
8 |
+
use Mollie\Api\Resources\ChargebackCollection;
|
9 |
+
use Mollie\Api\Resources\Payment;
|
10 |
+
use Tests\Mollie\TestHelpers\AmountObjectTestHelpers;
|
11 |
+
use Tests\Mollie\TestHelpers\LinkObjectTestHelpers;
|
12 |
+
|
13 |
+
class PaymentChargebackEndpointTest extends BaseEndpointTest
|
14 |
+
{
|
15 |
+
use LinkObjectTestHelpers;
|
16 |
+
use AmountObjectTestHelpers;
|
17 |
+
|
18 |
+
public function testListChargebacksOnPaymentResource()
|
19 |
+
{
|
20 |
+
$this->mockApiCall(
|
21 |
+
new Request(
|
22 |
+
"GET",
|
23 |
+
"/v2/payments/tr_44aKxzEbr8/chargebacks"
|
24 |
+
),
|
25 |
+
new Response(
|
26 |
+
200,
|
27 |
+
[],
|
28 |
+
'{
|
29 |
+
"_embedded":{
|
30 |
+
"chargebacks":[
|
31 |
+
{
|
32 |
+
"resource":"chargeback",
|
33 |
+
"id":"chb_n9z0tp",
|
34 |
+
"amount":{
|
35 |
+
"value":"-13.00",
|
36 |
+
"currency":"EUR"
|
37 |
+
},
|
38 |
+
"createdAt":"2018-03-28T11:44:32+00:00",
|
39 |
+
"paymentId":"tr_44aKxzEbr8",
|
40 |
+
"settlementAmount":{
|
41 |
+
"value":"-13.00",
|
42 |
+
"currency":"EUR"
|
43 |
+
},
|
44 |
+
"_links":{
|
45 |
+
"self":{
|
46 |
+
"href":"https://api.mollie.com/v2/payments/tr_44aKxzEbr8/chargebacks/chb_n9z0tp",
|
47 |
+
"type":"application/hal+json"
|
48 |
+
},
|
49 |
+
"payment":{
|
50 |
+
"href":"https://api.mollie.com/v2/payments/tr_44aKxzEbr8",
|
51 |
+
"type":"application/hal+json"
|
52 |
+
},
|
53 |
+
"documentation": {
|
54 |
+
"href": "https://docs.mollie.com/reference/v2/chargebacks-api/get-chargeback",
|
55 |
+
"type": "text/html"
|
56 |
+
}
|
57 |
+
}
|
58 |
+
},
|
59 |
+
{
|
60 |
+
"resource":"chargeback",
|
61 |
+
"id":"chb_6cqlwf",
|
62 |
+
"amount":{
|
63 |
+
"value":"-0.37",
|
64 |
+
"currency":"EUR"
|
65 |
+
},
|
66 |
+
"createdAt":"2018-03-28T11:44:32+00:00",
|
67 |
+
"paymentId":"tr_44aKxzEbr8",
|
68 |
+
"settlementAmount":{
|
69 |
+
"value":"-0.37",
|
70 |
+
"currency":"EUR"
|
71 |
+
},
|
72 |
+
"_links":{
|
73 |
+
"self":{
|
74 |
+
"href":"https://api.mollie.com/v2/payments/tr_44aKxzEbr8/chargebacks/chb_6cqlwf",
|
75 |
+
"type":"application/hal+json"
|
76 |
+
},
|
77 |
+
"payment":{
|
78 |
+
"href":"https://api.mollie.com/v2/payments/tr_44aKxzEbr8",
|
79 |
+
"type":"application/hal+json"
|
80 |
+
},
|
81 |
+
"documentation": {
|
82 |
+
"href": "https://docs.mollie.com/reference/v2/chargebacks-api/get-chargeback",
|
83 |
+
"type": "text/html"
|
84 |
+
}
|
85 |
+
}
|
86 |
+
}
|
87 |
+
]
|
88 |
+
},
|
89 |
+
"_links":{
|
90 |
+
"documentation":{
|
91 |
+
"href":"https://docs.mollie.com/reference/v2/chargebacks-api/list-chargebacks",
|
92 |
+
"type":"text/html"
|
93 |
+
},
|
94 |
+
"self":{
|
95 |
+
"href":"https://api.mollie.com/v2/payments/tr_44aKxzEbr8/chargebacks",
|
96 |
+
"type":"application/hal+json"
|
97 |
+
}
|
98 |
+
},
|
99 |
+
"count": 2
|
100 |
+
}'
|
101 |
+
)
|
102 |
+
);
|
103 |
+
|
104 |
+
$chargebacks = $this->getPayment()->chargebacks();
|
105 |
+
|
106 |
+
$this->assertInstanceOf(ChargebackCollection::class, $chargebacks);
|
107 |
+
$this->assertEquals(2, $chargebacks->count);
|
108 |
+
$this->assertCount(2, $chargebacks);
|
109 |
+
|
110 |
+
$this->assertLinkObject(
|
111 |
+
"https://docs.mollie.com/reference/v2/chargebacks-api/list-chargebacks",
|
112 |
+
"text/html",
|
113 |
+
$chargebacks->_links->documentation
|
114 |
+
);
|
115 |
+
|
116 |
+
$this->assertLinkObject(
|
117 |
+
"https://api.mollie.com/v2/payments/tr_44aKxzEbr8/chargebacks",
|
118 |
+
"application/hal+json",
|
119 |
+
$chargebacks->_links->self
|
120 |
+
);
|
121 |
+
|
122 |
+
$this->assertChargeback($chargebacks[0], 'tr_44aKxzEbr8', 'chb_n9z0tp', "-13.00");
|
123 |
+
$this->assertChargeback($chargebacks[1], 'tr_44aKxzEbr8', 'chb_6cqlwf', "-0.37");
|
124 |
+
}
|
125 |
+
|
126 |
+
public function testGetChargebackOnPaymentResource()
|
127 |
+
{
|
128 |
+
$this->mockApiCall(
|
129 |
+
new Request(
|
130 |
+
"GET",
|
131 |
+
"/v2/payments/tr_44aKxzEbr8/chargebacks/chb_n9z0tp"
|
132 |
+
),
|
133 |
+
new Response(
|
134 |
+
200,
|
135 |
+
[],
|
136 |
+
'{
|
137 |
+
"resource":"chargeback",
|
138 |
+
"id":"chb_n9z0tp",
|
139 |
+
"amount":{
|
140 |
+
"value":"-13.00",
|
141 |
+
"currency":"EUR"
|
142 |
+
},
|
143 |
+
"createdAt":"2018-03-28T11:44:32+00:00",
|
144 |
+
"paymentId":"tr_44aKxzEbr8",
|
145 |
+
"settlementAmount":{
|
146 |
+
"value":"-13.00",
|
147 |
+
"currency":"EUR"
|
148 |
+
},
|
149 |
+
"_links":{
|
150 |
+
"self":{
|
151 |
+
"href":"https://api.mollie.com/v2/payments/tr_44aKxzEbr8/chargebacks/chb_n9z0tp",
|
152 |
+
"type":"application/hal+json"
|
153 |
+
},
|
154 |
+
"payment":{
|
155 |
+
"href":"https://api.mollie.com/v2/payments/tr_44aKxzEbr8",
|
156 |
+
"type":"application/hal+json"
|
157 |
+
},
|
158 |
+
"documentation": {
|
159 |
+
"href": "https://docs.mollie.com/reference/v2/chargebacks-api/get-chargeback",
|
160 |
+
"type": "text/html"
|
161 |
+
}
|
162 |
+
}
|
163 |
+
}'
|
164 |
+
)
|
165 |
+
);
|
166 |
+
|
167 |
+
$chargeback = $this->getPayment()->getChargeback("chb_n9z0tp");
|
168 |
+
|
169 |
+
$this->assertChargeback($chargeback, 'tr_44aKxzEbr8', 'chb_n9z0tp', "-13.00");
|
170 |
+
}
|
171 |
+
|
172 |
+
protected function assertChargeback($chargeback, $paymentId, $chargebackId, $amount)
|
173 |
+
{
|
174 |
+
$this->assertInstanceOf(Chargeback::class, $chargeback);
|
175 |
+
$this->assertEquals("chargeback", $chargeback->resource);
|
176 |
+
$this->assertEquals($chargebackId, $chargeback->id);
|
177 |
+
|
178 |
+
$this->assertAmountObject($amount, "EUR", $chargeback->amount);
|
179 |
+
$this->assertAmountObject($amount, "EUR", $chargeback->settlementAmount);
|
180 |
+
|
181 |
+
$this->assertEquals("2018-03-28T11:44:32+00:00", $chargeback->createdAt);
|
182 |
+
$this->assertEquals($paymentId, $chargeback->paymentId);
|
183 |
+
|
184 |
+
$this->assertLinkObject(
|
185 |
+
"https://api.mollie.com/v2/payments/{$paymentId}/chargebacks/{$chargebackId}",
|
186 |
+
"application/hal+json",
|
187 |
+
$chargeback->_links->self
|
188 |
+
);
|
189 |
+
|
190 |
+
$this->assertLinkObject(
|
191 |
+
"https://api.mollie.com/v2/payments/{$paymentId}",
|
192 |
+
"application/hal+json",
|
193 |
+
$chargeback->_links->payment
|
194 |
+
);
|
195 |
+
|
196 |
+
$this->assertLinkObject(
|
197 |
+
"https://docs.mollie.com/reference/v2/chargebacks-api/get-chargeback",
|
198 |
+
"text/html",
|
199 |
+
$chargeback->_links->documentation
|
200 |
+
);
|
201 |
+
}
|
202 |
+
|
203 |
+
/**
|
204 |
+
* @return Payment
|
205 |
+
*/
|
206 |
+
protected function getPayment()
|
207 |
+
{
|
208 |
+
$paymentJson = '{
|
209 |
+
"resource":"payment",
|
210 |
+
"id":"tr_44aKxzEbr8",
|
211 |
+
"mode":"test",
|
212 |
+
"createdAt":"2018-03-19T12:17:57+00:00",
|
213 |
+
"amount":{
|
214 |
+
"value":"20.00",
|
215 |
+
"currency":"EUR"
|
216 |
+
},
|
217 |
+
"description":"My first API payment",
|
218 |
+
"method":"ideal",
|
219 |
+
"metadata":{
|
220 |
+
"order_id":1234
|
221 |
+
},
|
222 |
+
"status":"paid",
|
223 |
+
"paidAt":"2018-03-19T12:18:35+00:00",
|
224 |
+
"amountRefunded":{
|
225 |
+
"value":"0.00",
|
226 |
+
"currency":"EUR"
|
227 |
+
},
|
228 |
+
"amountRemaining":{
|
229 |
+
"value":"20.00",
|
230 |
+
"currency":"EUR"
|
231 |
+
},
|
232 |
+
"details":{
|
233 |
+
"consumerName":"T. TEST",
|
234 |
+
"consumerAccount":"NL17RABO0213698412",
|
235 |
+
"consumerBic":"TESTNL99"
|
236 |
+
},
|
237 |
+
"locale":"nl_NL",
|
238 |
+
"countryCode":"NL",
|
239 |
+
"profileId":"pfl_2A1gacu42V",
|
240 |
+
"sequenceType":"oneoff",
|
241 |
+
"redirectUrl":"http://example.org/examples/03-return-page.php?order_id=1234",
|
242 |
+
"webhookUrl":"http://example.org/examples/02-webhook-verification.php",
|
243 |
+
"settlementAmount":{
|
244 |
+
"value":"20.00",
|
245 |
+
"currency":"EUR"
|
246 |
+
},
|
247 |
+
"_links":{
|
248 |
+
"self":{
|
249 |
+
"href":"https://api.mollie.com/v2/payments/tr_44aKxzEbr8",
|
250 |
+
"type":"application/hal+json"
|
251 |
+
},
|
252 |
+
"documentation":{
|
253 |
+
"href":"https://docs.mollie.com/reference/v2/payments-api/get-payment",
|
254 |
+
"type":"text/html"
|
255 |
+
},
|
256 |
+
"chargebacks":{
|
257 |
+
"href":"https://api.mollie.com/v2/payments/tr_44aKxzEbr8/chargebacks",
|
258 |
+
"type":"application/hal+json"
|
259 |
+
}
|
260 |
+
}
|
261 |
+
}';
|
262 |
+
|
263 |
+
return $this->copy(json_decode($paymentJson), new Payment($this->apiClient));
|
264 |
+
}
|
265 |
+
}
|
includes/mollie-api-php/tests/Mollie/API/Endpoints/PaymentEndpointTest.php
ADDED
@@ -0,0 +1,381 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tests\Mollie\Api\Endpoints;
|
4 |
+
|
5 |
+
use GuzzleHttp\Psr7\Request;
|
6 |
+
use GuzzleHttp\Psr7\Response;
|
7 |
+
use Mollie\Api\Resources\Payment;
|
8 |
+
use Mollie\Api\Resources\PaymentCollection;
|
9 |
+
use Mollie\Api\Types\PaymentStatus;
|
10 |
+
use Mollie\Api\Types\SequenceType;
|
11 |
+
use stdClass;
|
12 |
+
|
13 |
+
class PaymentEndpointTest extends BaseEndpointTest
|
14 |
+
{
|
15 |
+
public function testCreatePayment()
|
16 |
+
{
|
17 |
+
$this->mockApiCall(
|
18 |
+
new Request(
|
19 |
+
"POST",
|
20 |
+
"/v2/payments",
|
21 |
+
[],
|
22 |
+
'{
|
23 |
+
"amount":{
|
24 |
+
"value":"20.00",
|
25 |
+
"currency":"EUR"
|
26 |
+
},
|
27 |
+
"description": "My first API payment",
|
28 |
+
"redirectUrl": "https://example.org/redirect",
|
29 |
+
"webhookUrl": "https://example.org/webhook",
|
30 |
+
"metadata": {
|
31 |
+
"order_id": "1234"
|
32 |
+
}
|
33 |
+
}'
|
34 |
+
),
|
35 |
+
new Response(
|
36 |
+
201,
|
37 |
+
[],
|
38 |
+
'{
|
39 |
+
"resource":"payment",
|
40 |
+
"id":"tr_44aKxzEbr8",
|
41 |
+
"mode":"test",
|
42 |
+
"createdAt":"2018-03-13T14:02:29+00:00",
|
43 |
+
"amount":{
|
44 |
+
"value":"20.00",
|
45 |
+
"currency":"EUR"
|
46 |
+
},
|
47 |
+
"description":"My first API payment",
|
48 |
+
"method":null,
|
49 |
+
"metadata":{
|
50 |
+
"order_id":1234
|
51 |
+
},
|
52 |
+
"status":"open",
|
53 |
+
"isCancelable":false,
|
54 |
+
"expiresAt":"2018-03-13T14:17:29+00:00",
|
55 |
+
"details":null,
|
56 |
+
"profileId":"pfl_2A1gacu42V",
|
57 |
+
"sequenceType":"oneoff",
|
58 |
+
"redirectUrl":"http://example.org/examples/payment/03-return-page.php?order_id=1234",
|
59 |
+
"webhookUrl":"http://example.org/examples/payment/02-webhook-verification.php",
|
60 |
+
"_links":{
|
61 |
+
"self":{
|
62 |
+
"href":"https://api.mollie.com/v2/payments/tr_44aKxzEbr8",
|
63 |
+
"type":"application/hal+json"
|
64 |
+
},
|
65 |
+
"checkout":{
|
66 |
+
"href":"https://www.mollie.com/payscreen/select-method/44aKxzEbr8",
|
67 |
+
"type":"text/html"
|
68 |
+
},
|
69 |
+
"documentation":{
|
70 |
+
"href":"https://docs.mollie.com/reference/v2/payments-api/create-payment",
|
71 |
+
"type":"text/html"
|
72 |
+
}
|
73 |
+
}
|
74 |
+
}'
|
75 |
+
)
|
76 |
+
);
|
77 |
+
|
78 |
+
$payment = $this->apiClient->payments->create([
|
79 |
+
"amount" => [
|
80 |
+
"currency" => "EUR",
|
81 |
+
"value" => "20.00"
|
82 |
+
],
|
83 |
+
"description" => "My first API payment",
|
84 |
+
"redirectUrl" => "https://example.org/redirect",
|
85 |
+
"webhookUrl" => "https://example.org/webhook",
|
86 |
+
"metadata" => [
|
87 |
+
"order_id" => "1234",
|
88 |
+
],
|
89 |
+
]);
|
90 |
+
|
91 |
+
$this->assertInstanceOf(Payment::class, $payment);
|
92 |
+
$this->assertEquals('tr_44aKxzEbr8', $payment->id);
|
93 |
+
$this->assertEquals('test', $payment->mode);
|
94 |
+
$this->assertEquals("2018-03-13T14:02:29+00:00", $payment->createdAt);
|
95 |
+
|
96 |
+
$amount = new Stdclass();
|
97 |
+
$amount->value = '20.00';
|
98 |
+
$amount->currency = "EUR";
|
99 |
+
$this->assertEquals($amount, $payment->amount);
|
100 |
+
|
101 |
+
$this->assertEquals('My first API payment', $payment->description);
|
102 |
+
$this->assertNull($payment->method);
|
103 |
+
$this->assertEquals((object)["order_id" => "1234"], $payment->metadata);
|
104 |
+
$this->assertEquals(PaymentStatus::STATUS_OPEN, $payment->status);
|
105 |
+
$this->assertFalse($payment->isCancelable);
|
106 |
+
$this->assertEquals("2018-03-13T14:17:29+00:00", $payment->expiresAt);
|
107 |
+
$this->assertNull($payment->details);
|
108 |
+
$this->assertEquals("pfl_2A1gacu42V", $payment->profileId);
|
109 |
+
$this->assertEquals(SequenceType::SEQUENCETYPE_ONEOFF, $payment->sequenceType);
|
110 |
+
$this->assertEquals("http://example.org/examples/payment/03-return-page.php?order_id=1234", $payment->redirectUrl);
|
111 |
+
$this->assertEquals("http://example.org/examples/payment/02-webhook-verification.php", $payment->webhookUrl);
|
112 |
+
|
113 |
+
$selfLink = (object)["href" => "https://api.mollie.com/v2/payments/tr_44aKxzEbr8", "type" => "application/hal+json"];
|
114 |
+
$this->assertEquals($selfLink, $payment->_links->self);
|
115 |
+
|
116 |
+
$checkoutLink = (object)["href" => "https://www.mollie.com/payscreen/select-method/44aKxzEbr8", "type" => "text/html"];
|
117 |
+
$this->assertEquals($checkoutLink, $payment->_links->checkout);
|
118 |
+
|
119 |
+
$documentationLink = (object)["href" => "https://docs.mollie.com/reference/v2/payments-api/create-payment", "type" => "text/html"];
|
120 |
+
$this->assertEquals($documentationLink, $payment->_links->documentation);
|
121 |
+
}
|
122 |
+
|
123 |
+
public function testGetPayment()
|
124 |
+
{
|
125 |
+
$this->mockApiCall(
|
126 |
+
new Request(
|
127 |
+
"GET",
|
128 |
+
"/v2/payments/tr_44aKxzEbr8?testmode=true",
|
129 |
+
[],
|
130 |
+
''
|
131 |
+
),
|
132 |
+
new Response(
|
133 |
+
200,
|
134 |
+
[],
|
135 |
+
'{
|
136 |
+
"resource":"payment",
|
137 |
+
"id":"tr_44aKxzEbr8",
|
138 |
+
"mode":"test",
|
139 |
+
"createdAt":"2018-03-13T14:02:29+00:00",
|
140 |
+
"amount":{
|
141 |
+
"value":"20.00",
|
142 |
+
"currency":"EUR"
|
143 |
+
},
|
144 |
+
"description":"My first API payment",
|
145 |
+
"method":"ideal",
|
146 |
+
"metadata":{
|
147 |
+
"order_id":1234
|
148 |
+
},
|
149 |
+
"status":"paid",
|
150 |
+
"paidAt":"2018-03-19T12:18:35+00:00",
|
151 |
+
"amountRefunded":{
|
152 |
+
"value":"0.00",
|
153 |
+
"currency":"EUR"
|
154 |
+
},
|
155 |
+
"amountRemaining":{
|
156 |
+
"value":"20.00",
|
157 |
+
"currency":"EUR"
|
158 |
+
},
|
159 |
+
"details":{
|
160 |
+
"consumerName":"T. TEST",
|
161 |
+
"consumerAccount":"NL17RABO0213698412",
|
162 |
+
"consumerBic":"TESTNL99"
|
163 |
+
},
|
164 |
+
"locale":"nl_NL",
|
165 |
+
"countryCode":"NL",
|
166 |
+
"profileId":"pfl_2A1gacu42V",
|
167 |
+
"sequenceType":"oneoff",
|
168 |
+
"redirectUrl":"http://example.org/examples/03-return-page.php?order_id=1234",
|
169 |
+
"webhookUrl":"http://example.org/examples/02-webhook-verification.php",
|
170 |
+
"settlementAmount":{
|
171 |
+
"value":"20.00",
|
172 |
+
"currency":"EUR"
|
173 |
+
},
|
174 |
+
"_links":{
|
175 |
+
"self":{
|
176 |
+
"href":"https://api.mollie.com/v2/payments/tr_44aKxzEbr8",
|
177 |
+
"type":"application/hal+json"
|
178 |
+
},
|
179 |
+
"documentation":{
|
180 |
+
"href":"https://docs.mollie.com/reference/v2/payments-api/get-payment",
|
181 |
+
"type":"text/html"
|
182 |
+
}
|
183 |
+
}
|
184 |
+
}'
|
185 |
+
)
|
186 |
+
);
|
187 |
+
|
188 |
+
$payment = $this->apiClient->payments->get("tr_44aKxzEbr8", ["testmode" => true]);
|
189 |
+
|
190 |
+
$this->assertInstanceOf(Payment::class, $payment);
|
191 |
+
$this->assertEquals('tr_44aKxzEbr8', $payment->id);
|
192 |
+
$this->assertEquals('test', $payment->mode);
|
193 |
+
$this->assertEquals("2018-03-13T14:02:29+00:00", $payment->createdAt);
|
194 |
+
|
195 |
+
$amount = new Stdclass();
|
196 |
+
$amount->value = '20.00';
|
197 |
+
$amount->currency = "EUR";
|
198 |
+
$this->assertEquals($amount, $payment->amount);
|
199 |
+
|
200 |
+
$this->assertEquals('My first API payment', $payment->description);
|
201 |
+
$this->assertEquals("ideal", $payment->method);
|
202 |
+
$this->assertEquals((object)["order_id" => "1234"], $payment->metadata);
|
203 |
+
$this->assertEquals(PaymentStatus::STATUS_PAID, $payment->status);
|
204 |
+
|
205 |
+
$amountRefunded = new Stdclass();
|
206 |
+
$amountRefunded->value = '0.00';
|
207 |
+
$amountRefunded->currency = "EUR";
|
208 |
+
$this->assertEquals($amountRefunded, $payment->amountRefunded);
|
209 |
+
|
210 |
+
$amountRemaining = new Stdclass();
|
211 |
+
$amountRemaining->value = '20.00';
|
212 |
+
$amountRemaining->currency = "EUR";
|
213 |
+
$this->assertEquals($amountRemaining, $payment->amountRemaining);
|
214 |
+
|
215 |
+
$details = (object)[
|
216 |
+
'consumerName' => 'T. TEST',
|
217 |
+
'consumerAccount' => 'NL17RABO0213698412',
|
218 |
+
'consumerBic' => 'TESTNL99'
|
219 |
+
];
|
220 |
+
|
221 |
+
$this->assertEquals($details, $payment->details);
|
222 |
+
$this->assertEquals("pfl_2A1gacu42V", $payment->profileId);
|
223 |
+
$this->assertEquals(SequenceType::SEQUENCETYPE_ONEOFF, $payment->sequenceType);
|
224 |
+
$this->assertEquals("http://example.org/examples/03-return-page.php?order_id=1234", $payment->redirectUrl);
|
225 |
+
$this->assertEquals("http://example.org/examples/02-webhook-verification.php", $payment->webhookUrl);
|
226 |
+
|
227 |
+
$selfLink = (object)["href" => "https://api.mollie.com/v2/payments/tr_44aKxzEbr8", "type" => "application/hal+json"];
|
228 |
+
$this->assertEquals($selfLink, $payment->_links->self);
|
229 |
+
|
230 |
+
$documentationLink = (object)["href" => "https://docs.mollie.com/reference/v2/payments-api/get-payment", "type" => "text/html"];
|
231 |
+
$this->assertEquals($documentationLink, $payment->_links->documentation);
|
232 |
+
}
|
233 |
+
|
234 |
+
public function testListPayment()
|
235 |
+
{
|
236 |
+
$this->mockApiCall(
|
237 |
+
new Request(
|
238 |
+
"GET",
|
239 |
+
"/v2/payments?limit=3",
|
240 |
+
[],
|
241 |
+
''
|
242 |
+
),
|
243 |
+
new Response(
|
244 |
+
200,
|
245 |
+
[],
|
246 |
+
'{
|
247 |
+
"_embedded": {
|
248 |
+
"payments": [
|
249 |
+
{
|
250 |
+
"resource": "payment",
|
251 |
+
"id": "tr_admNa2tFfa",
|
252 |
+
"mode": "test",
|
253 |
+
"createdAt": "2018-03-19T15:00:50+00:00",
|
254 |
+
"amount": {
|
255 |
+
"value": "100.00",
|
256 |
+
"currency": "EUR"
|
257 |
+
},
|
258 |
+
"description": "Payment no 1",
|
259 |
+
"method": null,
|
260 |
+
"metadata": null,
|
261 |
+
"status": "open",
|
262 |
+
"isCancelable": false,
|
263 |
+
"expiresAt": "2018-03-19T15:15:50+00:00",
|
264 |
+
"details": null,
|
265 |
+
"locale": "nl_NL",
|
266 |
+
"profileId": "pfl_7N5qjbu42V",
|
267 |
+
"sequenceType": "oneoff",
|
268 |
+
"redirectUrl": "https://www.example.org/",
|
269 |
+
"_links": {
|
270 |
+
"self": {
|
271 |
+
"href": "https://api.mollie.com/v2/payments/tr_admNa2tFfa",
|
272 |
+
"type": "application/hal+json"
|
273 |
+
},
|
274 |
+
"checkout": {
|
275 |
+
"href": "https://www.mollie.com/payscreen/select-method/admNa2tFfa",
|
276 |
+
"type": "text/html"
|
277 |
+
}
|
278 |
+
}
|
279 |
+
},
|
280 |
+
{
|
281 |
+
"resource": "payment",
|
282 |
+
"id": "tr_bcaLc7hFfa",
|
283 |
+
"mode": "test",
|
284 |
+
"createdAt": "2018-03-19T15:00:50+00:00",
|
285 |
+
"amount": {
|
286 |
+
"value": "100.00",
|
287 |
+
"currency": "EUR"
|
288 |
+
},
|
289 |
+
"description": "Payment no 2",
|
290 |
+
"method": null,
|
291 |
+
"metadata": null,
|
292 |
+
"status": "open",
|
293 |
+
"isCancelable": false,
|
294 |
+
"expiresAt": "2018-03-19T15:15:50+00:00",
|
295 |
+
"details": null,
|
296 |
+
"locale": "nl_NL",
|
297 |
+
"profileId": "pfl_7N5qjbu42V",
|
298 |
+
"sequenceType": "oneoff",
|
299 |
+
"redirectUrl": "https://www.example.org/",
|
300 |
+
"_links": {
|
301 |
+
"self": {
|
302 |
+
"href": "https://api.mollie.com/v2/payments/tr_bcaLc7hFfa",
|
303 |
+
"type": "application/hal+json"
|
304 |
+
},
|
305 |
+
"checkout": {
|
306 |
+
"href": "https://www.mollie.com/payscreen/select-method/bcaLc7hFfa",
|
307 |
+
"type": "text/html"
|
308 |
+
}
|
309 |
+
}
|
310 |
+
},
|
311 |
+
{
|
312 |
+
"resource": "payment",
|
313 |
+
"id": "tr_pslHy1tFfa",
|
314 |
+
"mode": "test",
|
315 |
+
"createdAt": "2018-03-19T15:00:50+00:00",
|
316 |
+
"amount": {
|
317 |
+
"value": "100.00",
|
318 |
+
"currency": "EUR"
|
319 |
+
},
|
320 |
+
"description": "Payment no 3",
|
321 |
+
"method": null,
|
322 |
+
"metadata": null,
|
323 |
+
"status": "open",
|
324 |
+
"isCancelable": false,
|
325 |
+
"expiresAt": "2018-03-19T15:15:50+00:00",
|
326 |
+
"details": null,
|
327 |
+
"locale": "nl_NL",
|
328 |
+
"profileId": "pfl_7N5qjbu42V",
|
329 |
+
"sequenceType": "oneoff",
|
330 |
+
"redirectUrl": "https://www.example.org/",
|
331 |
+
"_links": {
|
332 |
+
"self": {
|
333 |
+
"href": "https://api.mollie.com/v2/payments/tr_pslHy1tFfa",
|
334 |
+
"type": "application/hal+json"
|
335 |
+
},
|
336 |
+
"checkout": {
|
337 |
+
"href": "https://www.mollie.com/payscreen/select-method/pslHy1tFfa",
|
338 |
+
"type": "text/html"
|
339 |
+
}
|
340 |
+
}
|
341 |
+
}
|
342 |
+
]
|
343 |
+
},
|
344 |
+
"_links": {
|
345 |
+
"documentation": {
|
346 |
+
"href": "https://docs.mollie.com/reference/v2/payments-api/list-payments",
|
347 |
+
"type": "text/html"
|
348 |
+
},
|
349 |
+
"self": {
|
350 |
+
"href": "http://api.mollie.com/v2/payments?limit=3",
|
351 |
+
"type": "application/hal+json"
|
352 |
+
},
|
353 |
+
"previous": null,
|
354 |
+
"next": {
|
355 |
+
"href": "http://api.mollie.com/v2/payments?from=tr_eW8f5kzUkF&limit=3",
|
356 |
+
"type": "application/hal+json"
|
357 |
+
}
|
358 |
+
},
|
359 |
+
"count": 3
|
360 |
+
}'
|
361 |
+
)
|
362 |
+
);
|
363 |
+
|
364 |
+
$payments = $this->apiClient->payments->page(null, 3);
|
365 |
+
|
366 |
+
$this->assertInstanceOf(PaymentCollection::class, $payments);
|
367 |
+
$this->assertEquals(3, $payments->count);
|
368 |
+
$this->assertEquals(3, count($payments));
|
369 |
+
|
370 |
+
$documentationLink = (object)["href" => "https://docs.mollie.com/reference/v2/payments-api/list-payments", "type" => "text/html"];
|
371 |
+
$this->assertEquals($documentationLink, $payments->_links->documentation);
|
372 |
+
|
373 |
+
$selfLink = (object)["href" => "http://api.mollie.com/v2/payments?limit=3", "type" => "application/hal+json"];
|
374 |
+
$this->assertEquals($selfLink, $payments->_links->self);
|
375 |
+
|
376 |
+
$this->assertNull($payments->_links->previous);
|
377 |
+
|
378 |
+
$nextLink = (object)["href" => "http://api.mollie.com/v2/payments?from=tr_eW8f5kzUkF&limit=3", "type" => "application/hal+json"];
|
379 |
+
$this->assertEquals($nextLink, $payments->_links->next);
|
380 |
+
}
|
381 |
+
}
|
includes/mollie-api-php/tests/Mollie/API/Endpoints/PaymentRefundEndpointTest.php
ADDED
@@ -0,0 +1,388 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tests\Mollie\Api\Endpoints;
|
4 |
+
|
5 |
+
use GuzzleHttp\Psr7\Request;
|
6 |
+
use GuzzleHttp\Psr7\Response;
|
7 |
+
use Mollie\Api\Resources\Payment;
|
8 |
+
use Mollie\Api\Resources\Refund;
|
9 |
+
use Mollie\Api\Resources\RefundCollection;
|
10 |
+
use stdClass;
|
11 |
+
|
12 |
+
class PaymentRefundEndpointTest extends BaseEndpointTest
|
13 |
+
{
|
14 |
+
public function testGetRefundForPaymentResource()
|
15 |
+
{
|
16 |
+
$this->mockApiCall(
|
17 |
+
new Request(
|
18 |
+
"GET",
|
19 |
+
"/v2/payments/tr_44aKxzEbr8/refunds/re_PsAvxvLsnm"
|
20 |
+
),
|
21 |
+
new Response(
|
22 |
+
201,
|
23 |
+
[],
|
24 |
+
'{
|
25 |
+
"resource":"refund",
|
26 |
+
"id":"re_PsAvxvLsnm",
|
27 |
+
"amount":{
|
28 |
+
"value":"20.00",
|
29 |
+
"currency":"EUR"
|
30 |
+
},
|
31 |
+
"status":"pending",
|
32 |
+
"createdAt":"2018-03-19T12:33:37+00:00",
|
33 |
+
"description":"My first API payment",
|
34 |
+
"paymentId":"tr_44aKxzEbr8",
|
35 |
+
"settlementAmount":{
|
36 |
+
"value":"-20.00",
|
37 |
+
"currency":"EUR"
|
38 |
+
},
|
39 |
+
"_links":{
|
40 |
+
"self":{
|
41 |
+
"href":"https://api.mollie.com/v2/payments/tr_Tgxm3amJBT/refunds/re_PmEtpvSsnm",
|
42 |
+
"type":"application/hal+json"
|
43 |
+
},
|
44 |
+
"payment":{
|
45 |
+
"href":"https://api.mollie.com/v2/payments/tr_44aKxzEbr8",
|
46 |
+
"type":"application/hal+json"
|
47 |
+
},
|
48 |
+
"documentation":{
|
49 |
+
"href":"https://docs.mollie.com/reference/v2/refunds-api/create-refund",
|
50 |
+
"type":"text/html"
|
51 |
+
}
|
52 |
+
}
|
53 |
+
}'
|
54 |
+
)
|
55 |
+
);
|
56 |
+
|
57 |
+
$refund = $this->apiClient->paymentRefunds->getFor($this->getPayment(), "re_PsAvxvLsnm");
|
58 |
+
|
59 |
+
$this->assertInstanceOf(Refund::class, $refund);
|
60 |
+
$this->assertEquals("re_PsAvxvLsnm", $refund->id);
|
61 |
+
|
62 |
+
$amount = new Stdclass();
|
63 |
+
$amount->value = '20.00';
|
64 |
+
$amount->currency = "EUR";
|
65 |
+
$this->assertEquals($amount, $refund->amount);
|
66 |
+
|
67 |
+
$this->assertEquals("pending", $refund->status);
|
68 |
+
$this->assertEquals("2018-03-19T12:33:37+00:00", $refund->createdAt);
|
69 |
+
$this->assertEquals("My first API payment", $refund->description);
|
70 |
+
$this->assertEquals("tr_44aKxzEbr8", $refund->paymentId);
|
71 |
+
|
72 |
+
$amount = new Stdclass();
|
73 |
+
$amount->value = '-20.00';
|
74 |
+
$amount->currency = "EUR";
|
75 |
+
$this->assertEquals($amount, $refund->settlementAmount);
|
76 |
+
|
77 |
+
$selfLink = (object)["href" => "https://api.mollie.com/v2/payments/tr_Tgxm3amJBT/refunds/re_PmEtpvSsnm", "type" => "application/hal+json"];
|
78 |
+
$this->assertEquals($selfLink, $refund->_links->self);
|
79 |
+
|
80 |
+
$paymentLink = (object)["href" => "https://api.mollie.com/v2/payments/tr_44aKxzEbr8", "type" => "application/hal+json"];
|
81 |
+
$this->assertEquals($paymentLink, $refund->_links->payment);
|
82 |
+
|
83 |
+
$documentationLink = (object)["href" => "https://docs.mollie.com/reference/v2/refunds-api/create-refund", "type" => "text/html"];
|
84 |
+
$this->assertEquals($documentationLink, $refund->_links->documentation);
|
85 |
+
}
|
86 |
+
|
87 |
+
public function testGetRefundOnPaymentResource()
|
88 |
+
{
|
89 |
+
$this->mockApiCall(
|
90 |
+
new Request(
|
91 |
+
"GET",
|
92 |
+
"/v2/payments/tr_44aKxzEbr8/refunds/re_PsAvxvLsnm"
|
93 |
+
),
|
94 |
+
new Response(
|
95 |
+
201,
|
96 |
+
[],
|
97 |
+
'{
|
98 |
+
"resource":"refund",
|
99 |
+
"id":"re_PsAvxvLsnm",
|
100 |
+
"amount":{
|
101 |
+
"value":"20.00",
|
102 |
+
"currency":"EUR"
|
103 |
+
},
|
104 |
+
"status":"pending",
|
105 |
+
"createdAt":"2018-03-19T12:33:37+00:00",
|
106 |
+
"description":"My first API payment",
|
107 |
+
"paymentId":"tr_44aKxzEbr8",
|
108 |
+
"settlementAmount":{
|
109 |
+
"value":"-20.00",
|
110 |
+
"currency":"EUR"
|
111 |
+
},
|
112 |
+
"_links":{
|
113 |
+
"self":{
|
114 |
+
"href":"https://api.mollie.com/v2/payments/tr_Tgxm3amJBT/refunds/re_PmEtpvSsnm",
|
115 |
+
"type":"application/hal+json"
|
116 |
+
},
|
117 |
+
"payment":{
|
118 |
+
"href":"https://api.mollie.com/v2/payments/tr_44aKxzEbr8",
|
119 |
+
"type":"application/hal+json"
|
120 |
+
},
|
121 |
+
"documentation":{
|
122 |
+
"href":"https://docs.mollie.com/reference/v2/refunds-api/create-refund",
|
123 |
+
"type":"text/html"
|
124 |
+
}
|
125 |
+
}
|
126 |
+
}'
|
127 |
+
)
|
128 |
+
);
|
129 |
+
|
130 |
+
$refund = $this->getPayment("tr_44aKxzEbr8")->getRefund("re_PsAvxvLsnm");
|
131 |
+
|
132 |
+
$this->assertInstanceOf(Refund::class, $refund);
|
133 |
+
$this->assertEquals("re_PsAvxvLsnm", $refund->id);
|
134 |
+
|
135 |
+
$amount = new Stdclass();
|
136 |
+
$amount->value = '20.00';
|
137 |
+
$amount->currency = "EUR";
|
138 |
+
$this->assertEquals($amount, $refund->amount);
|
139 |
+
|
140 |
+
$this->assertEquals("pending", $refund->status);
|
141 |
+
$this->assertEquals("2018-03-19T12:33:37+00:00", $refund->createdAt);
|
142 |
+
$this->assertEquals("My first API payment", $refund->description);
|
143 |
+
$this->assertEquals("tr_44aKxzEbr8", $refund->paymentId);
|
144 |
+
|
145 |
+
$amount = new Stdclass();
|
146 |
+
$amount->value = '-20.00';
|
147 |
+
$amount->currency = "EUR";
|
148 |
+
$this->assertEquals($amount, $refund->settlementAmount);
|
149 |
+
|
150 |
+
$selfLink = (object)["href" => "https://api.mollie.com/v2/payments/tr_Tgxm3amJBT/refunds/re_PmEtpvSsnm", "type" => "application/hal+json"];
|
151 |
+
$this->assertEquals($selfLink, $refund->_links->self);
|
152 |
+
|
153 |
+
$paymentLink = (object)["href" => "https://api.mollie.com/v2/payments/tr_44aKxzEbr8", "type" => "application/hal+json"];
|
154 |
+
$this->assertEquals($paymentLink, $refund->_links->payment);
|
155 |
+
|
156 |
+
$documentationLink = (object)["href" => "https://docs.mollie.com/reference/v2/refunds-api/create-refund", "type" => "text/html"];
|
157 |
+
$this->assertEquals($documentationLink, $refund->_links->documentation);
|
158 |
+
}
|
159 |
+
|
160 |
+
public function testCreateRefund()
|
161 |
+
{
|
162 |
+
$this->mockApiCall(
|
163 |
+
new Request(
|
164 |
+
"POST",
|
165 |
+
"/v2/payments/tr_44aKxzEbr8/refunds",
|
166 |
+
[],
|
167 |
+
'{"amount":{"currency":"EUR","value":"20.00"}}'
|
168 |
+
),
|
169 |
+
new Response(
|
170 |
+
201,
|
171 |
+
[],
|
172 |
+
'{
|
173 |
+
"resource":"refund",
|
174 |
+
"id":"re_PsAvxvLsnm",
|
175 |
+
"amount":{
|
176 |
+
"value":"20.00",
|
177 |
+
"currency":"EUR"
|
178 |
+
},
|
179 |
+
"status":"pending",
|
180 |
+
"createdAt":"2018-03-19T12:33:37+00:00",
|
181 |
+
"description":"My first API payment",
|
182 |
+
"paymentId":"tr_44aKxzEbr8",
|
183 |
+
"settlementAmount":{
|
184 |
+
"value":"-20.00",
|
185 |
+
"currency":"EUR"
|
186 |
+
},
|
187 |
+
"_links":{
|
188 |
+
"self":{
|
189 |
+
"href":"https://api.mollie.com/v2/payments/tr_Tgxm3amJBT/refunds/re_PmEtpvSsnm",
|
190 |
+
"type":"application/hal+json"
|
191 |
+
},
|
192 |
+
"payment":{
|
193 |
+
"href":"https://api.mollie.com/v2/payments/tr_44aKxzEbr8",
|
194 |
+
"type":"application/hal+json"
|
195 |
+
},
|
196 |
+
"documentation":{
|
197 |
+
"href":"https://docs.mollie.com/reference/v2/refunds-api/create-refund",
|
198 |
+
"type":"text/html"
|
199 |
+
}
|
200 |
+
}
|
201 |
+
}'
|
202 |
+
)
|
203 |
+
);
|
204 |
+
|
205 |
+
$refund = $this->getPayment()->refund([
|
206 |
+
"amount" => [
|
207 |
+
"currency" => "EUR",
|
208 |
+
"value" => "20.00"
|
209 |
+
]
|
210 |
+
]);
|
211 |
+
|
212 |
+
$this->assertInstanceOf(Refund::class, $refund);
|
213 |
+
$this->assertEquals("re_PsAvxvLsnm", $refund->id);
|
214 |
+
|
215 |
+
$amount = new Stdclass();
|
216 |
+
$amount->value = '20.00';
|
217 |
+
$amount->currency = "EUR";
|
218 |
+
$this->assertEquals($amount, $refund->amount);
|
219 |
+
|
220 |
+
$this->assertEquals("pending", $refund->status);
|
221 |
+
$this->assertEquals("2018-03-19T12:33:37+00:00", $refund->createdAt);
|
222 |
+
$this->assertEquals("My first API payment", $refund->description);
|
223 |
+
$this->assertEquals("tr_44aKxzEbr8", $refund->paymentId);
|
224 |
+
|
225 |
+
$amount = new Stdclass();
|
226 |
+
$amount->value = '-20.00';
|
227 |
+
$amount->currency = "EUR";
|
228 |
+
$this->assertEquals($amount, $refund->settlementAmount);
|
229 |
+
|
230 |
+
$selfLink = (object)["href" => "https://api.mollie.com/v2/payments/tr_Tgxm3amJBT/refunds/re_PmEtpvSsnm", "type" => "application/hal+json"];
|
231 |
+
$this->assertEquals($selfLink, $refund->_links->self);
|
232 |
+
|
233 |
+
$paymentLink = (object)["href" => "https://api.mollie.com/v2/payments/tr_44aKxzEbr8", "type" => "application/hal+json"];
|
234 |
+
$this->assertEquals($paymentLink, $refund->_links->payment);
|
235 |
+
|
236 |
+
$documentationLink = (object)["href" => "https://docs.mollie.com/reference/v2/refunds-api/create-refund", "type" => "text/html"];
|
237 |
+
$this->assertEquals($documentationLink, $refund->_links->documentation);
|
238 |
+
}
|
239 |
+
|
240 |
+
public function testGetRefundsOnPaymentResource()
|
241 |
+
{
|
242 |
+
$this->mockApiCall(
|
243 |
+
new Request(
|
244 |
+
"GET",
|
245 |
+
"/v2/payments/tr_44aKxzEbr8/refunds",
|
246 |
+
[],
|
247 |
+
''
|
248 |
+
),
|
249 |
+
new Response(
|
250 |
+
201,
|
251 |
+
[],
|
252 |
+
'{
|
253 |
+
"_embedded": {
|
254 |
+
"refunds": [
|
255 |
+
{
|
256 |
+
"resource": "refund",
|
257 |
+
"id": "re_haCsig5aru",
|
258 |
+
"amount": {
|
259 |
+
"value": "2.00",
|
260 |
+
"currency": "EUR"
|
261 |
+
},
|
262 |
+
"status": "pending",
|
263 |
+
"createdAt": "2018-03-28T10:56:10+00:00",
|
264 |
+
"description": "My first API payment",
|
265 |
+
"paymentId": "tr_44aKxzEbr8",
|
266 |
+
"settlementAmount": {
|
267 |
+
"value": "-2.00",
|
268 |
+
"currency": "EUR"
|
269 |
+
},
|
270 |
+
"_links": {
|
271 |
+
"self": {
|
272 |
+
"href": "https://api.mollie.com/v2/payments/tr_44aKxzEbr8/refunds/re_haCsig5aru",
|
273 |
+
"type": "application/hal+json"
|
274 |
+
},
|
275 |
+
"payment": {
|
276 |
+
"href": "https://api.mollie.com/v2/payments/tr_44aKxzEbr8",
|
277 |
+
"type": "application/hal+json"
|
278 |
+
}
|
279 |
+
}
|
280 |
+
}
|
281 |
+
]
|
282 |
+
},
|
283 |
+
"_links": {
|
284 |
+
"documentation": {
|
285 |
+
"href": "https://docs.mollie.com/reference/v2/refunds-api/list-refunds",
|
286 |
+
"type": "text/html"
|
287 |
+
},
|
288 |
+
"self": {
|
289 |
+
"href": "http://api.mollie.nl/v2/payments/tr_44aKxzEbr8/refunds?limit=10",
|
290 |
+
"type": "application/hal+json"
|
291 |
+
},
|
292 |
+
"previous": null,
|
293 |
+
"next": null
|
294 |
+
},
|
295 |
+
"count": 1
|
296 |
+
}'
|
297 |
+
)
|
298 |
+
);
|
299 |
+
|
300 |
+
$refunds = $this->getPayment()->refunds();
|
301 |
+
|
302 |
+
$this->assertInstanceOf(RefundCollection::class, $refunds);
|
303 |
+
$this->assertEquals(1, $refunds->count);
|
304 |
+
$this->assertCount(1, $refunds);
|
305 |
+
|
306 |
+
$refund = $refunds[0];
|
307 |
+
|
308 |
+
$this->assertInstanceOf(Refund::class, $refund);
|
309 |
+
$this->assertEquals("re_haCsig5aru", $refund->id);
|
310 |
+
$this->assertEquals("2.00", $refund->amount->value);
|
311 |
+
$this->assertEquals("EUR", $refund->amount->currency);
|
312 |
+
$this->assertEquals("pending", $refund->status);
|
313 |
+
$this->assertEquals("2018-03-28T10:56:10+00:00", $refund->createdAt);
|
314 |
+
$this->assertEquals("My first API payment", $refund->description);
|
315 |
+
$this->assertEquals("tr_44aKxzEbr8", $refund->paymentId);
|
316 |
+
$this->assertEquals("-2.00", $refund->settlementAmount->value);
|
317 |
+
$this->assertEquals("EUR", $refund->settlementAmount->currency);
|
318 |
+
|
319 |
+
$selfLink = (object)["href" => "https://api.mollie.com/v2/payments/tr_44aKxzEbr8/refunds/re_haCsig5aru", "type" => "application/hal+json"];
|
320 |
+
$this->assertEquals($selfLink, $refund->_links->self);
|
321 |
+
|
322 |
+
$paymentLink = (object)["href" => "https://api.mollie.com/v2/payments/tr_44aKxzEbr8", "type" => "application/hal+json"];
|
323 |
+
$this->assertEquals($paymentLink, $refund->_links->payment);
|
324 |
+
}
|
325 |
+
|
326 |
+
/**
|
327 |
+
* @return Payment
|
328 |
+
*/
|
329 |
+
private function getPayment()
|
330 |
+
{
|
331 |
+
$paymentJson = '{
|
332 |
+
"resource":"payment",
|
333 |
+
"id":"tr_44aKxzEbr8",
|
334 |
+
"mode":"test",
|
335 |
+
"createdAt":"2018-03-19T12:17:57+00:00",
|
336 |
+
"amount":{
|
337 |
+
"value":"20.00",
|
338 |
+
"currency":"EUR"
|
339 |
+
},
|
340 |
+
"description":"My first API payment",
|
341 |
+
"method":"ideal",
|
342 |
+
"metadata":{
|
343 |
+
"order_id":1234
|
344 |
+
},
|
345 |
+
"status":"paid",
|
346 |
+
"paidAt":"2018-03-19T12:18:35+00:00",
|
347 |
+
"amountRefunded":{
|
348 |
+
"value":"0.00",
|
349 |
+
"currency":"EUR"
|
350 |
+
},
|
351 |
+
"amountRemaining":{
|
352 |
+
"value":"20.00",
|
353 |
+
"currency":"EUR"
|
354 |
+
},
|
355 |
+
"details":{
|
356 |
+
"consumerName":"T. TEST",
|
357 |
+
"consumerAccount":"NL17RABO0213698412",
|
358 |
+
"consumerBic":"TESTNL99"
|
359 |
+
},
|
360 |
+
"locale":"nl_NL",
|
361 |
+
"countryCode":"NL",
|
362 |
+
"profileId":"pfl_2A1gacu42V",
|
363 |
+
"sequenceType":"oneoff",
|
364 |
+
"redirectUrl":"http://example.org/examples/03-return-page.php?order_id=1234",
|
365 |
+
"webhookUrl":"http://example.org/examples/02-webhook-verification.php",
|
366 |
+
"settlementAmount":{
|
367 |
+
"value":"20.00",
|
368 |
+
"currency":"EUR"
|
369 |
+
},
|
370 |
+
"_links":{
|
371 |
+
"self":{
|
372 |
+
"href":"https://api.mollie.com/v2/payments/tr_44aKxzEbr8",
|
373 |
+
"type":"application/hal+json"
|
374 |
+
},
|
375 |
+
"documentation":{
|
376 |
+
"href":"https://docs.mollie.com/reference/v2/payments-api/get-payment",
|
377 |
+
"type":"text/html"
|
378 |
+
},
|
379 |
+
"refunds":{
|
380 |
+
"href":"https://api.mollie.com/v2/payments/tr_44aKxzEbr8/refunds",
|
381 |
+
"type":"application/hal+json"
|
382 |
+
}
|
383 |
+
}
|
384 |
+
}';
|
385 |
+
|
386 |
+
return $this->copy(json_decode($paymentJson), new Payment($this->apiClient));
|
387 |
+
}
|
388 |
+
}
|
includes/mollie-api-php/tests/Mollie/API/Endpoints/PermissionEndpointTest.php
ADDED
@@ -0,0 +1,169 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tests\Mollie\Api\Endpoints;
|
4 |
+
|
5 |
+
use GuzzleHttp\Psr7\Request;
|
6 |
+
use GuzzleHttp\Psr7\Response;
|
7 |
+
use Mollie\Api\Resources\Permission;
|
8 |
+
use Mollie\Api\Resources\PermissionCollection;
|
9 |
+
use Tests\Mollie\TestHelpers\LinkObjectTestHelpers;
|
10 |
+
|
11 |
+
class PermissionEndpointTest extends BaseEndpointTest
|
12 |
+
{
|
13 |
+
use LinkObjectTestHelpers;
|
14 |
+
|
15 |
+
/**
|
16 |
+
* @param string id
|
17 |
+
*
|
18 |
+
* @dataProvider dpTestGetPermissionIds
|
19 |
+
*/
|
20 |
+
public function testGetPermissionIds($permissionId)
|
21 |
+
{
|
22 |
+
$this->mockApiCall(
|
23 |
+
new Request('GET', '/v2/permissions/' . $permissionId),
|
24 |
+
new Response(
|
25 |
+
200,
|
26 |
+
[],
|
27 |
+
'{
|
28 |
+
"resource": "permission",
|
29 |
+
"id": "' . $permissionId . '",
|
30 |
+
"description": "Some dummy permission description",
|
31 |
+
"granted": true,
|
32 |
+
"_links": {
|
33 |
+
"self": {
|
34 |
+
"href": "https://api.mollie.com/v2/permissions/' . $permissionId . '",
|
35 |
+
"type": "application/hal+json"
|
36 |
+
},
|
37 |
+
"documentation": {
|
38 |
+
"href": "https://docs.mollie.com/reference/v2/permissions-api/get-permission",
|
39 |
+
"type": "text/html"
|
40 |
+
}
|
41 |
+
}
|
42 |
+
}'
|
43 |
+
)
|
44 |
+
);
|
45 |
+
|
46 |
+
$permission = $this->apiClient->permissions->get($permissionId);
|
47 |
+
|
48 |
+
$this->assertPermission($permission, $permissionId);
|
49 |
+
}
|
50 |
+
|
51 |
+
public function dpTestGetPermissionIds()
|
52 |
+
{
|
53 |
+
return [
|
54 |
+
['payments.read'],
|
55 |
+
['payments.write'],
|
56 |
+
['refunds.read'],
|
57 |
+
['refunds.write'],
|
58 |
+
['customers.read'],
|
59 |
+
['customers.write'],
|
60 |
+
['mandates.read'],
|
61 |
+
['mandates.write'],
|
62 |
+
['subscriptions.read'],
|
63 |
+
['subscriptions.write'],
|
64 |
+
['profiles.read'],
|
65 |
+
['profiles.write'],
|
66 |
+
['invoices.read'],
|
67 |
+
['invoices.write'],
|
68 |
+
['settlements.read'],
|
69 |
+
['settlements.write'],
|
70 |
+
['orders.read'],
|
71 |
+
['orders.write'],
|
72 |
+
['organizations.read'],
|
73 |
+
['organizations.write'],
|
74 |
+
];
|
75 |
+
}
|
76 |
+
|
77 |
+
protected function assertPermission($permission, $permissionId)
|
78 |
+
{
|
79 |
+
$this->assertInstanceOf(Permission::class, $permission);
|
80 |
+
$this->assertEquals('permission', $permission->resource);
|
81 |
+
$this->assertEquals($permissionId, $permission->id);
|
82 |
+
$this->assertEquals(
|
83 |
+
'Some dummy permission description',
|
84 |
+
$permission->description
|
85 |
+
);
|
86 |
+
$this->assertTrue($permission->granted);
|
87 |
+
|
88 |
+
$this->assertLinkObject(
|
89 |
+
'https://api.mollie.com/v2/permissions/' . $permissionId,
|
90 |
+
'application/hal+json',
|
91 |
+
$permission->_links->self
|
92 |
+
);
|
93 |
+
|
94 |
+
$this->assertLinkObject(
|
95 |
+
'https://docs.mollie.com/reference/v2/permissions-api/get-permission',
|
96 |
+
'text/html',
|
97 |
+
$permission->_links->documentation
|
98 |
+
);
|
99 |
+
}
|
100 |
+
|
101 |
+
public function testListPermissions()
|
102 |
+
{
|
103 |
+
$this->mockApiCall(
|
104 |
+
new Request('GET', '/v2/permissions'),
|
105 |
+
new Response(
|
106 |
+
200,
|
107 |
+
[],
|
108 |
+
'{
|
109 |
+
"_embedded": {
|
110 |
+
"permissions": [
|
111 |
+
{
|
112 |
+
"resource": "permission",
|
113 |
+
"id": "payments.write",
|
114 |
+
"description": "Some dummy permission description",
|
115 |
+
"granted": true,
|
116 |
+
"_links": {
|
117 |
+
"self": {
|
118 |
+
"href": "https://api.mollie.com/v2/permissions/payments.write",
|
119 |
+
"type": "application/hal+json"
|
120 |
+
},
|
121 |
+
"documentation": {
|
122 |
+
"href": "https://docs.mollie.com/reference/v2/permissions-api/get-permission",
|
123 |
+
"type": "text/html"
|
124 |
+
}
|
125 |
+
}
|
126 |
+
},
|
127 |
+
{
|
128 |
+
"resource": "permission",
|
129 |
+
"id": "payments.read",
|
130 |
+
"description": "Some dummy permission description",
|
131 |
+
"granted": true,
|
132 |
+
"_links": {
|
133 |
+
"self": {
|
134 |
+
"href": "https://api.mollie.com/v2/permissions/payments.read",
|
135 |
+
"type": "application/hal+json"
|
136 |
+
},
|
137 |
+
"documentation": {
|
138 |
+
"href": "https://docs.mollie.com/reference/v2/permissions-api/get-permission",
|
139 |
+
"type": "text/html"
|
140 |
+
}
|
141 |
+
}
|
142 |
+
}
|
143 |
+
]
|
144 |
+
},
|
145 |
+
"count": 2,
|
146 |
+
"_links": {
|
147 |
+
"documentation": {
|
148 |
+
"href": "https://docs.mollie.com/reference/v2/permissions-api/list-permissions",
|
149 |
+
"type": "text/html"
|
150 |
+
},
|
151 |
+
"self": {
|
152 |
+
"href": "https://api.mollie.com/v2/permissions",
|
153 |
+
"type": "application/hal+json"
|
154 |
+
}
|
155 |
+
}
|
156 |
+
}'
|
157 |
+
)
|
158 |
+
);
|
159 |
+
|
160 |
+
$permissions = $this->apiClient->permissions->all();
|
161 |
+
|
162 |
+
$this->assertInstanceOf(PermissionCollection::class, $permissions);
|
163 |
+
|
164 |
+
$this->assertCount(2, $permissions);
|
165 |
+
|
166 |
+
$this->assertPermission($permissions[0], 'payments.write');
|
167 |
+
$this->assertPermission($permissions[1], 'payments.read');
|
168 |
+
}
|
169 |
+
}
|
includes/mollie-api-php/tests/Mollie/API/Endpoints/ProfileEndpointTest.php
ADDED
@@ -0,0 +1,501 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tests\Mollie\Api\Endpoints;
|
4 |
+
|
5 |
+
use GuzzleHttp\Psr7\Request;
|
6 |
+
use GuzzleHttp\Psr7\Response;
|
7 |
+
use Mollie\Api\Resources\CurrentProfile;
|
8 |
+
use Mollie\Api\Resources\Profile;
|
9 |
+
use Mollie\Api\Resources\ProfileCollection;
|
10 |
+
use Mollie\Api\Types\ProfileStatus;
|
11 |
+
|
12 |
+
class ProfileEndpointTest extends BaseEndpointTest
|
13 |
+
{
|
14 |
+
public function testGetProfile()
|
15 |
+
{
|
16 |
+
$this->mockApiCall(
|
17 |
+
new Request(
|
18 |
+
"GET",
|
19 |
+
"/v2/profiles/pfl_ahe8z8OPut",
|
20 |
+
[],
|
21 |
+
''
|
22 |
+
),
|
23 |
+
new Response(
|
24 |
+
200,
|
25 |
+
[],
|
26 |
+
'{
|
27 |
+
"resource": "profile",
|
28 |
+
"id": "pfl_ahe8z8OPut",
|
29 |
+
"mode": "live",
|
30 |
+
"name": "My website name",
|
31 |
+
"website": "http://www.mywebsite.com",
|
32 |
+
"email": "info@mywebsite.com",
|
33 |
+
"phone": "31123456789",
|
34 |
+
"categoryCode": 5399,
|
35 |
+
"status": "verified",
|
36 |
+
"review": {
|
37 |
+
"status": "pending"
|
38 |
+
},
|
39 |
+
"createdAt": "2016-01-11T13:03:55+00:00",
|
40 |
+
"_links": {
|
41 |
+
"self": {
|
42 |
+
"href": "https://api.mollie.com/v2/profiles/pfl_ahe8z8OPut",
|
43 |
+
"type": "application/hal+json"
|
44 |
+
},
|
45 |
+
"chargebacks": {
|
46 |
+
"href": "https://api.mollie.com/v2/chargebacks?profileId=pfl_ahe8z8OPut",
|
47 |
+
"type": "application/hal+json"
|
48 |
+
},
|
49 |
+
"methods": {
|
50 |
+
"href": "https://api.mollie.com/v2/methods?profileId=pfl_ahe8z8OPut",
|
51 |
+
"type": "application/hal+json"
|
52 |
+
},
|
53 |
+
"payments": {
|
54 |
+
"href": "https://api.mollie.com/v2/payments?profileId=pfl_ahe8z8OPut",
|
55 |
+
"type": "application/hal+json"
|
56 |
+
},
|
57 |
+
"refunds": {
|
58 |
+
"href": "https://api.mollie.com/v2/refunds?profileId=pfl_ahe8z8OPut",
|
59 |
+
"type": "application/hal+json"
|
60 |
+
},
|
61 |
+
"checkoutPreviewUrl": {
|
62 |
+
"href": "https://www.mollie.com/payscreen/preview/pfl_ahe8z8OPut",
|
63 |
+
"type": "text/html"
|
64 |
+
}
|
65 |
+
}
|
66 |
+
}'
|
67 |
+
)
|
68 |
+
);
|
69 |
+
|
70 |
+
$profile = $this->apiClient->profiles->get('pfl_ahe8z8OPut');
|
71 |
+
|
72 |
+
$this->assertInstanceOf(Profile::class, $profile);
|
73 |
+
$this->assertEquals("pfl_ahe8z8OPut", $profile->id);
|
74 |
+
$this->assertEquals("live", $profile->mode);
|
75 |
+
$this->assertEquals("My website name", $profile->name);
|
76 |
+
$this->assertEquals("http://www.mywebsite.com", $profile->website);
|
77 |
+
$this->assertEquals("info@mywebsite.com", $profile->email);
|
78 |
+
$this->assertEquals("31123456789", $profile->phone);
|
79 |
+
$this->assertEquals(5399, $profile->categoryCode);
|
80 |
+
$this->assertEquals(ProfileStatus::STATUS_VERIFIED, $profile->status);
|
81 |
+
$this->assertEquals((object) ["status" => "pending"], $profile->review);
|
82 |
+
|
83 |
+
$selfLink = (object)["href" => "https://api.mollie.com/v2/profiles/pfl_ahe8z8OPut", "type" => "application/hal+json"];
|
84 |
+
$this->assertEquals($selfLink, $profile->_links->self);
|
85 |
+
|
86 |
+
$chargebacksLink = (object)["href" => "https://api.mollie.com/v2/chargebacks?profileId=pfl_ahe8z8OPut", "type" => "application/hal+json"];
|
87 |
+
$this->assertEquals($chargebacksLink, $profile->_links->chargebacks);
|
88 |
+
|
89 |
+
$methodsLink = (object)["href" => "https://api.mollie.com/v2/methods?profileId=pfl_ahe8z8OPut", "type" => "application/hal+json"];
|
90 |
+
$this->assertEquals($methodsLink, $profile->_links->methods);
|
91 |
+
|
92 |
+
$paymentsLink = (object)["href" => "https://api.mollie.com/v2/payments?profileId=pfl_ahe8z8OPut", "type" => "application/hal+json"];
|
93 |
+
$this->assertEquals($paymentsLink, $profile->_links->payments);
|
94 |
+
|
95 |
+
$refundsLink = (object)["href" => "https://api.mollie.com/v2/refunds?profileId=pfl_ahe8z8OPut", "type" => "application/hal+json"];
|
96 |
+
$this->assertEquals($refundsLink, $profile->_links->refunds);
|
97 |
+
|
98 |
+
$checkoutPreviewLink = (object)["href" => "https://www.mollie.com/payscreen/preview/pfl_ahe8z8OPut", "type" => "text/html"];
|
99 |
+
$this->assertEquals($checkoutPreviewLink, $profile->_links->checkoutPreviewUrl);
|
100 |
+
}
|
101 |
+
|
102 |
+
public function testGetProfileUsingMe()
|
103 |
+
{
|
104 |
+
$this->mockApiCall(
|
105 |
+
new Request(
|
106 |
+
"GET",
|
107 |
+
"/v2/profiles/me",
|
108 |
+
[],
|
109 |
+
''
|
110 |
+
),
|
111 |
+
new Response(
|
112 |
+
200,
|
113 |
+
[],
|
114 |
+
'{
|
115 |
+
"resource": "profile",
|
116 |
+
"id": "pfl_ahe8z8OPut",
|
117 |
+
"mode": "live",
|
118 |
+
"name": "My website name",
|
119 |
+
"website": "http://www.mywebsite.com",
|
120 |
+
"email": "info@mywebsite.com",
|
121 |
+
"phone": "31123456789",
|
122 |
+
"categoryCode": 5399,
|
123 |
+
"status": "verified",
|
124 |
+
"review": {
|
125 |
+
"status": "pending"
|
126 |
+
},
|
127 |
+
"createdAt": "2016-01-11T13:03:55+00:00",
|
128 |
+
"_links": {
|
129 |
+
"self": {
|
130 |
+
"href": "https://api.mollie.com/v2/profiles/pfl_ahe8z8OPut",
|
131 |
+
"type": "application/hal+json"
|
132 |
+
},
|
133 |
+
"chargebacks": {
|
134 |
+
"href": "https://api.mollie.com/v2/chargebacks?profileId=pfl_ahe8z8OPut",
|
135 |
+
"type": "application/hal+json"
|
136 |
+
},
|
137 |
+
"methods": {
|
138 |
+
"href": "https://api.mollie.com/v2/methods?profileId=pfl_ahe8z8OPut",
|
139 |
+
"type": "application/hal+json"
|
140 |
+
},
|
141 |
+
"payments": {
|
142 |
+
"href": "https://api.mollie.com/v2/payments?profileId=pfl_ahe8z8OPut",
|
143 |
+
"type": "application/hal+json"
|
144 |
+
},
|
145 |
+
"refunds": {
|
146 |
+
"href": "https://api.mollie.com/v2/refunds?profileId=pfl_ahe8z8OPut",
|
147 |
+
"type": "application/hal+json"
|
148 |
+
},
|
149 |
+
"checkoutPreviewUrl": {
|
150 |
+
"href": "https://www.mollie.com/payscreen/preview/pfl_ahe8z8OPut",
|
151 |
+
"type": "text/html"
|
152 |
+
}
|
153 |
+
}
|
154 |
+
}'
|
155 |
+
)
|
156 |
+
);
|
157 |
+
|
158 |
+
$profile = $this->apiClient->profiles->get('me');
|
159 |
+
|
160 |
+
$this->assertInstanceOf(CurrentProfile::class, $profile);
|
161 |
+
$this->assertEquals("pfl_ahe8z8OPut", $profile->id);
|
162 |
+
|
163 |
+
// No need to test it all again...
|
164 |
+
}
|
165 |
+
|
166 |
+
public function testGetCurrentProfile()
|
167 |
+
{
|
168 |
+
$this->mockApiCall(
|
169 |
+
new Request(
|
170 |
+
"GET",
|
171 |
+
"/v2/profiles/me",
|
172 |
+
[],
|
173 |
+
''
|
174 |
+
),
|
175 |
+
new Response(
|
176 |
+
200,
|
177 |
+
[],
|
178 |
+
'{
|
179 |
+
"resource": "profile",
|
180 |
+
"id": "pfl_ahe8z8OPut",
|
181 |
+
"mode": "live",
|
182 |
+
"name": "My website name",
|
183 |
+
"website": "http://www.mywebsite.com",
|
184 |
+
"email": "info@mywebsite.com",
|
185 |
+
"phone": "31123456789",
|
186 |
+
"categoryCode": 5399,
|
187 |
+
"status": "verified",
|
188 |
+
"review": {
|
189 |
+
"status": "pending"
|
190 |
+
},
|
191 |
+
"createdAt": "2016-01-11T13:03:55+00:00",
|
192 |
+
"_links": {
|
193 |
+
"self": {
|
194 |
+
"href": "https://api.mollie.com/v2/profiles/pfl_ahe8z8OPut",
|
195 |
+
"type": "application/hal+json"
|
196 |
+
},
|
197 |
+
"chargebacks": {
|
198 |
+
"href": "https://api.mollie.com/v2/chargebacks",
|
199 |
+
"type": "application/hal+json"
|
200 |
+
},
|
201 |
+
"methods": {
|
202 |
+
"href": "https://api.mollie.com/v2/methods",
|
203 |
+
"type": "application/hal+json"
|
204 |
+
},
|
205 |
+
"payments": {
|
206 |
+
"href": "https://api.mollie.com/v2/payments",
|
207 |
+
"type": "application/hal+json"
|
208 |
+
},
|
209 |
+
"refunds": {
|
210 |
+
"href": "https://api.mollie.com/v2/refunds",
|
211 |
+
"type": "application/hal+json"
|
212 |
+
},
|
213 |
+
"checkoutPreviewUrl": {
|
214 |
+
"href": "https://www.mollie.com/payscreen/preview/pfl_ahe8z8OPut",
|
215 |
+
"type": "text/html"
|
216 |
+
}
|
217 |
+
}
|
218 |
+
}'
|
219 |
+
)
|
220 |
+
);
|
221 |
+
|
222 |
+
$profile = $this->apiClient->profiles->getCurrent();
|
223 |
+
|
224 |
+
$this->assertInstanceOf(CurrentProfile::class, $profile);
|
225 |
+
$this->assertEquals("pfl_ahe8z8OPut", $profile->id);
|
226 |
+
$this->assertEquals("live", $profile->mode);
|
227 |
+
$this->assertEquals("My website name", $profile->name);
|
228 |
+
$this->assertEquals("http://www.mywebsite.com", $profile->website);
|
229 |
+
$this->assertEquals("info@mywebsite.com", $profile->email);
|
230 |
+
$this->assertEquals("31123456789", $profile->phone);
|
231 |
+
$this->assertEquals(5399, $profile->categoryCode);
|
232 |
+
$this->assertEquals(ProfileStatus::STATUS_VERIFIED, $profile->status);
|
233 |
+
$this->assertEquals((object) ["status" => "pending"], $profile->review);
|
234 |
+
|
235 |
+
$selfLink = (object)["href" => "https://api.mollie.com/v2/profiles/pfl_ahe8z8OPut", "type" => "application/hal+json"];
|
236 |
+
$this->assertEquals($selfLink, $profile->_links->self);
|
237 |
+
|
238 |
+
$chargebacksLink = (object)["href" => "https://api.mollie.com/v2/chargebacks", "type" => "application/hal+json"];
|
239 |
+
$this->assertEquals($chargebacksLink, $profile->_links->chargebacks);
|
240 |
+
|
241 |
+
$methodsLink = (object)["href" => "https://api.mollie.com/v2/methods", "type" => "application/hal+json"];
|
242 |
+
$this->assertEquals($methodsLink, $profile->_links->methods);
|
243 |
+
|
244 |
+
$paymentsLink = (object)["href" => "https://api.mollie.com/v2/payments", "type" => "application/hal+json"];
|
245 |
+
$this->assertEquals($paymentsLink, $profile->_links->payments);
|
246 |
+
|
247 |
+
$refundsLink = (object)["href" => "https://api.mollie.com/v2/refunds", "type" => "application/hal+json"];
|
248 |
+
$this->assertEquals($refundsLink, $profile->_links->refunds);
|
249 |
+
|
250 |
+
$checkoutPreviewLink = (object)["href" => "https://www.mollie.com/payscreen/preview/pfl_ahe8z8OPut", "type" => "text/html"];
|
251 |
+
$this->assertEquals($checkoutPreviewLink, $profile->_links->checkoutPreviewUrl);
|
252 |
+
}
|
253 |
+
|
254 |
+
public function testListProfiles()
|
255 |
+
{
|
256 |
+
$this->mockApiCall(
|
257 |
+
new Request(
|
258 |
+
"GET",
|
259 |
+
"/v2/profiles",
|
260 |
+
[],
|
261 |
+
''
|
262 |
+
),
|
263 |
+
new Response(
|
264 |
+
201,
|
265 |
+
[],
|
266 |
+
'{
|
267 |
+
"_embedded": {
|
268 |
+
"profiles": [{
|
269 |
+
"resource": "profile",
|
270 |
+
"id": "pfl_ahe8z8OPut",
|
271 |
+
"mode": "live",
|
272 |
+
"name": "My website name",
|
273 |
+
"website": "http://www.mywebsite.com",
|
274 |
+
"email": "info@mywebsite.com",
|
275 |
+
"phone": "31123456789",
|
276 |
+
"categoryCode": 5399,
|
277 |
+
"status": "verified",
|
278 |
+
"review": {
|
279 |
+
"status": "pending"
|
280 |
+
},
|
281 |
+
"createdAt": "2016-01-11T13:03:55+00:00",
|
282 |
+
"_links": {
|
283 |
+
"self": {
|
284 |
+
"href": "https://api.mollie.com/v2/profiles/pfl_ahe8z8OPut",
|
285 |
+
"type": "application/hal+json"
|
286 |
+
},
|
287 |
+
"chargebacks": {
|
288 |
+
"href": "https://api.mollie.com/v2/chargebacks?profileId=pfl_ahe8z8OPut",
|
289 |
+
"type": "application/hal+json"
|
290 |
+
},
|
291 |
+
"methods": {
|
292 |
+
"href": "https://api.mollie.com/v2/methods?profileId=pfl_ahe8z8OPut",
|
293 |
+
"type": "application/hal+json"
|
294 |
+
},
|
295 |
+
"payments": {
|
296 |
+
"href": "https://api.mollie.com/v2/payments?profileId=pfl_ahe8z8OPut",
|
297 |
+
"type": "application/hal+json"
|
298 |
+
},
|
299 |
+
"refunds": {
|
300 |
+
"href": "https://api.mollie.com/v2/refunds?profileId=pfl_ahe8z8OPut",
|
301 |
+
"type": "application/hal+json"
|
302 |
+
},
|
303 |
+
"checkoutPreviewUrl": {
|
304 |
+
"href": "https://www.mollie.com/payscreen/preview/pfl_ahe8z8OPut",
|
305 |
+
"type": "text/html"
|
306 |
+
}
|
307 |
+
}
|
308 |
+
},
|
309 |
+
{
|
310 |
+
"resource": "profile",
|
311 |
+
"id": "pfl_znNaTRkJs5",
|
312 |
+
"mode": "live",
|
313 |
+
"name": "My website name 2",
|
314 |
+
"website": "http://www.mywebsite2.com",
|
315 |
+
"email": "info@mywebsite2.com",
|
316 |
+
"phone": "31123456789",
|
317 |
+
"categoryCode": 5399,
|
318 |
+
"status": "verified",
|
319 |
+
"review": {
|
320 |
+
"status": "pending"
|
321 |
+
},
|
322 |
+
"createdAt": "2016-01-11T13:03:55+00:00",
|
323 |
+
"_links": {
|
324 |
+
"self": {
|
325 |
+
"href": "https://api.mollie.com/v2/profiles/pfl_znNaTRkJs5",
|
326 |
+
"type": "application/hal+json"
|
327 |
+
},
|
328 |
+
"chargebacks": {
|
329 |
+
"href": "https://api.mollie.com/v2/chargebacks?profileId=pfl_znNaTRkJs5",
|
330 |
+
"type": "application/hal+json"
|
331 |
+
},
|
332 |
+
"methods": {
|
333 |
+
"href": "https://api.mollie.com/v2/methods?profileId=pfl_znNaTRkJs5",
|
334 |
+
"type": "application/hal+json"
|
335 |
+
},
|
336 |
+
"payments": {
|
337 |
+
"href": "https://api.mollie.com/v2/payments?profileId=pfl_znNaTRkJs5",
|
338 |
+
"type": "application/hal+json"
|
339 |
+
},
|
340 |
+
"refunds": {
|
341 |
+
"href": "https://api.mollie.com/v2/refunds?profileId=pfl_znNaTRkJs5",
|
342 |
+
"type": "application/hal+json"
|
343 |
+
},
|
344 |
+
"checkoutPreviewUrl": {
|
345 |
+
"href": "https://www.mollie.com/payscreen/preview/pfl_znNaTRkJs5",
|
346 |
+
"type": "text/html"
|
347 |
+
}
|
348 |
+
}
|
349 |
+
}
|
350 |
+
]
|
351 |
+
},
|
352 |
+
"count": 2,
|
353 |
+
"_links": {
|
354 |
+
"documentation": {
|
355 |
+
"href": "https://docs.mollie.com/reference/v2/profiles-api/list-profiles",
|
356 |
+
"type": "text/html"
|
357 |
+
},
|
358 |
+
"self": {
|
359 |
+
"href": "https://api.mollie.nl/v2/profiles?limit=50",
|
360 |
+
"type": "application/hal+json"
|
361 |
+
},
|
362 |
+
"previous": null,
|
363 |
+
"next": null
|
364 |
+
}
|
365 |
+
}'
|
366 |
+
)
|
367 |
+
);
|
368 |
+
|
369 |
+
$profiles = $this->apiClient->profiles->page();
|
370 |
+
$this->assertInstanceOf(ProfileCollection::class, $profiles);
|
371 |
+
$this->assertEquals(2, $profiles->count);
|
372 |
+
|
373 |
+
foreach($profiles as $profile) {
|
374 |
+
$this->assertInstanceOf(Profile::class, $profile);
|
375 |
+
}
|
376 |
+
|
377 |
+
$selfLink = (object)["href" => "https://api.mollie.nl/v2/profiles?limit=50", "type" => "application/hal+json"];
|
378 |
+
$this->assertEquals($selfLink, $profiles->_links->self);
|
379 |
+
|
380 |
+
$documentationLink = (object)["href" => "https://docs.mollie.com/reference/v2/profiles-api/list-profiles", "type" => "text/html"];
|
381 |
+
$this->assertEquals($documentationLink, $profiles->_links->documentation);
|
382 |
+
|
383 |
+
}
|
384 |
+
|
385 |
+
public function testUpdateProfile()
|
386 |
+
{
|
387 |
+
$expectedWebsiteName = 'Mollie';
|
388 |
+
$expectedEmail = 'mollie@mollie.com';
|
389 |
+
$expectedPhone = '31123456766';
|
390 |
+
|
391 |
+
$this->mockApiCall(
|
392 |
+
new Request('PATCH', '/v2/profiles/pfl_ahe8z8OPut'),
|
393 |
+
new Response(
|
394 |
+
200,
|
395 |
+
[],
|
396 |
+
'{
|
397 |
+
"resource": "profile",
|
398 |
+
"id": "pfl_ahe8z8OPut",
|
399 |
+
"mode": "live",
|
400 |
+
"name": "' . $expectedWebsiteName . '",
|
401 |
+
"website": "http://www.mywebsite.com",
|
402 |
+
"email": "' . $expectedEmail . '",
|
403 |
+
"phone": "' . $expectedPhone . '",
|
404 |
+
"categoryCode": 5399,
|
405 |
+
"status": "verified",
|
406 |
+
"review": {
|
407 |
+
"status": "pending"
|
408 |
+
},
|
409 |
+
"createdAt": "2016-01-11T13:03:55+00:00",
|
410 |
+
"_links": {
|
411 |
+
"self": {
|
412 |
+
"href": "https://api.mollie.com/v2/profiles/pfl_ahe8z8OPut",
|
413 |
+
"type": "application/hal+json"
|
414 |
+
},
|
415 |
+
"chargebacks": {
|
416 |
+
"href": "https://api.mollie.com/v2/chargebacks?profileId=pfl_ahe8z8OPut",
|
417 |
+
"type": "application/hal+json"
|
418 |
+
},
|
419 |
+
"methods": {
|
420 |
+
"href": "https://api.mollie.com/v2/methods?profileId=pfl_ahe8z8OPut",
|
421 |
+
"type": "application/hal+json"
|
422 |
+
},
|
423 |
+
"payments": {
|
424 |
+
"href": "https://api.mollie.com/v2/payments?profileId=pfl_ahe8z8OPut",
|
425 |
+
"type": "application/hal+json"
|
426 |
+
},
|
427 |
+
"refunds": {
|
428 |
+
"href": "https://api.mollie.com/v2/refunds?profileId=pfl_ahe8z8OPut",
|
429 |
+
"type": "application/hal+json"
|
430 |
+
},
|
431 |
+
"checkoutPreviewUrl": {
|
432 |
+
"href": "https://www.mollie.com/payscreen/preview/pfl_ahe8z8OPut",
|
433 |
+
"type": "text/html"
|
434 |
+
}
|
435 |
+
}
|
436 |
+
}'
|
437 |
+
)
|
438 |
+
);
|
439 |
+
|
440 |
+
$profile = $this->getProfile();
|
441 |
+
$profile->name = $expectedWebsiteName;
|
442 |
+
$profile->email = $expectedEmail;
|
443 |
+
$profile->phone = $expectedPhone;
|
444 |
+
|
445 |
+
$updatedProfile = $profile->update();
|
446 |
+
|
447 |
+
$this->assertEquals($expectedWebsiteName, $updatedProfile->name);
|
448 |
+
$this->assertEquals($expectedEmail, $updatedProfile->email);
|
449 |
+
$this->assertEquals($expectedPhone, $updatedProfile->phone);
|
450 |
+
}
|
451 |
+
|
452 |
+
/**
|
453 |
+
* @return Profile
|
454 |
+
*/
|
455 |
+
private function getProfile()
|
456 |
+
{
|
457 |
+
$json = '{
|
458 |
+
"resource": "profile",
|
459 |
+
"id": "pfl_ahe8z8OPut",
|
460 |
+
"mode": "live",
|
461 |
+
"name": "My website name",
|
462 |
+
"website": "http://www.mywebsite.com",
|
463 |
+
"email": "info@mywebsite.com",
|
464 |
+
"phone": "31123456789",
|
465 |
+
"categoryCode": 5399,
|
466 |
+
"status": "verified",
|
467 |
+
"review": {
|
468 |
+
"status": "pending"
|
469 |
+
},
|
470 |
+
"createdAt": "2016-01-11T13:03:55+00:00",
|
471 |
+
"_links": {
|
472 |
+
"self": {
|
473 |
+
"href": "https://api.mollie.com/v2/profiles/pfl_ahe8z8OPut",
|
474 |
+
"type": "application/hal+json"
|
475 |
+
},
|
476 |
+
"chargebacks": {
|
477 |
+
"href": "https://api.mollie.com/v2/chargebacks?profileId=pfl_ahe8z8OPut",
|
478 |
+
"type": "application/hal+json"
|
479 |
+
},
|
480 |
+
"methods": {
|
481 |
+
"href": "https://api.mollie.com/v2/methods?profileId=pfl_ahe8z8OPut",
|
482 |
+
"type": "application/hal+json"
|
483 |
+
},
|
484 |
+
"payments": {
|
485 |
+
"href": "https://api.mollie.com/v2/payments?profileId=pfl_ahe8z8OPut",
|
486 |
+
"type": "application/hal+json"
|
487 |
+
},
|
488 |
+
"refunds": {
|
489 |
+
"href": "https://api.mollie.com/v2/refunds?profileId=pfl_ahe8z8OPut",
|
490 |
+
"type": "application/hal+json"
|
491 |
+
},
|
492 |
+
"checkoutPreviewUrl": {
|
493 |
+
"href": "https://www.mollie.com/payscreen/preview/pfl_ahe8z8OPut",
|
494 |
+
"type": "text/html"
|
495 |
+
}
|
496 |
+
}
|
497 |
+
}';
|
498 |
+
|
499 |
+
return $this->copy(json_decode($json), new Profile($this->apiClient));
|
500 |
+
}
|
501 |
+
}
|
includes/mollie-api-php/tests/Mollie/API/Endpoints/ProfileMethodEndpointTest.php
ADDED
@@ -0,0 +1,232 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tests\Mollie\Api\Endpoints;
|
4 |
+
|
5 |
+
use GuzzleHttp\Psr7\Request;
|
6 |
+
use GuzzleHttp\Psr7\Response;
|
7 |
+
use Mollie\Api\Resources\CurrentProfile;
|
8 |
+
use Mollie\Api\Resources\Method;
|
9 |
+
use Mollie\Api\Resources\Profile;
|
10 |
+
use Tests\Mollie\TestHelpers\LinkObjectTestHelpers;
|
11 |
+
|
12 |
+
class ProfileMethodEndpointTest extends BaseEndpointTest
|
13 |
+
{
|
14 |
+
use LinkObjectTestHelpers;
|
15 |
+
|
16 |
+
public function testEnableProfileMethod()
|
17 |
+
{
|
18 |
+
$this->mockApiCall(
|
19 |
+
new Request(
|
20 |
+
"POST",
|
21 |
+
"/v2/profiles/pfl_v9hTwCvYqw/methods/bancontact"
|
22 |
+
),
|
23 |
+
new Response(
|
24 |
+
201,
|
25 |
+
[],
|
26 |
+
'{
|
27 |
+
"resource": "method",
|
28 |
+
"id": "bancontact",
|
29 |
+
"description": "Bancontact",
|
30 |
+
"image": {
|
31 |
+
"size1x": "https://www.mollie.com/external/icons/payment-methods/bancontact.png",
|
32 |
+
"size2x": "https://www.mollie.com/external/icons/payment-methods/bancontact%402x.png",
|
33 |
+
"svg": "https://www.mollie.com/external/icons/payment-methods/bancontact.svg"
|
34 |
+
},
|
35 |
+
"_links": {
|
36 |
+
"self": {
|
37 |
+
"href": "https://api.mollie.com/v2/methods/bancontact",
|
38 |
+
"type": "application/hal+json"
|
39 |
+
},
|
40 |
+
"documentation": {
|
41 |
+
"href": "https://docs.mollie.com/reference/v2/profiles-api/activate-method",
|
42 |
+
"type": "text/html"
|
43 |
+
}
|
44 |
+
}
|
45 |
+
}'
|
46 |
+
)
|
47 |
+
);
|
48 |
+
|
49 |
+
$profile = $this->getProfile();
|
50 |
+
$method = $profile->enableMethod('bancontact');
|
51 |
+
|
52 |
+
$this->assertInstanceOf(Method::class, $method);
|
53 |
+
$this->assertEquals('bancontact', $method->id);
|
54 |
+
$this->assertEquals('Bancontact', $method->description);
|
55 |
+
$this->assertEquals('https://www.mollie.com/external/icons/payment-methods/bancontact.png', $method->image->size1x);
|
56 |
+
$this->assertEquals('https://www.mollie.com/external/icons/payment-methods/bancontact%402x.png', $method->image->size2x);
|
57 |
+
$this->assertEquals('https://www.mollie.com/external/icons/payment-methods/bancontact.svg', $method->image->svg);
|
58 |
+
|
59 |
+
$this->assertLinkObject(
|
60 |
+
"https://api.mollie.com/v2/methods/bancontact",
|
61 |
+
"application/hal+json",
|
62 |
+
$method->_links->self
|
63 |
+
);
|
64 |
+
|
65 |
+
$this->assertLinkObject(
|
66 |
+
"https://docs.mollie.com/reference/v2/profiles-api/activate-method",
|
67 |
+
"text/html",
|
68 |
+
$method->_links->documentation
|
69 |
+
);
|
70 |
+
|
71 |
+
}
|
72 |
+
|
73 |
+
public function testDisableProfileMethod()
|
74 |
+
{
|
75 |
+
$this->mockApiCall(
|
76 |
+
new Request(
|
77 |
+
"DELETE",
|
78 |
+
"/v2/profiles/pfl_v9hTwCvYqw/methods/bancontact"
|
79 |
+
),
|
80 |
+
new Response(204)
|
81 |
+
);
|
82 |
+
|
83 |
+
$profile = $this->getProfile();
|
84 |
+
$result = $profile->disableMethod('bancontact');
|
85 |
+
|
86 |
+
$this->assertNull($result);
|
87 |
+
}
|
88 |
+
|
89 |
+
public function testEnableCurrentProfileMethod()
|
90 |
+
{
|
91 |
+
$this->mockApiCall(
|
92 |
+
new Request(
|
93 |
+
"POST",
|
94 |
+
"/v2/profiles/me/methods/bancontact"
|
95 |
+
),
|
96 |
+
new Response(
|
97 |
+
201,
|
98 |
+
[],
|
99 |
+
'{
|
100 |
+
"resource": "method",
|
101 |
+
"id": "bancontact",
|
102 |
+
"description": "Bancontact",
|
103 |
+
"image": {
|
104 |
+
"size1x": "https://www.mollie.com/external/icons/payment-methods/bancontact.png",
|
105 |
+
"size2x": "https://www.mollie.com/external/icons/payment-methods/bancontact%402x.png",
|
106 |
+
"svg": "https://www.mollie.com/external/icons/payment-methods/bancontact.svg"
|
107 |
+
},
|
108 |
+
"_links": {
|
109 |
+
"self": {
|
110 |
+
"href": "https://api.mollie.com/v2/methods/bancontact",
|
111 |
+
"type": "application/hal+json"
|
112 |
+
},
|
113 |
+
"documentation": {
|
114 |
+
"href": "https://docs.mollie.com/reference/v2/profiles-api/activate-method",
|
115 |
+
"type": "text/html"
|
116 |
+
}
|
117 |
+
}
|
118 |
+
}'
|
119 |
+
)
|
120 |
+
);
|
121 |
+
|
122 |
+
$profile = $this->getCurrentProfile();
|
123 |
+
$method = $profile->enableMethod('bancontact');
|
124 |
+
|
125 |
+
$this->assertInstanceOf(Method::class, $method);
|
126 |
+
$this->assertEquals('bancontact', $method->id);
|
127 |
+
$this->assertEquals('Bancontact', $method->description);
|
128 |
+
$this->assertEquals('https://www.mollie.com/external/icons/payment-methods/bancontact.png', $method->image->size1x);
|
129 |
+
$this->assertEquals('https://www.mollie.com/external/icons/payment-methods/bancontact%402x.png', $method->image->size2x);
|
130 |
+
$this->assertEquals('https://www.mollie.com/external/icons/payment-methods/bancontact.svg', $method->image->svg);
|
131 |
+
|
132 |
+
$this->assertLinkObject(
|
133 |
+
"https://api.mollie.com/v2/methods/bancontact",
|
134 |
+
"application/hal+json",
|
135 |
+
$method->_links->self
|
136 |
+
);
|
137 |
+
|
138 |
+
$this->assertLinkObject(
|
139 |
+
"https://docs.mollie.com/reference/v2/profiles-api/activate-method",
|
140 |
+
"text/html",
|
141 |
+
$method->_links->documentation
|
142 |
+
);
|
143 |
+
|
144 |
+
}
|
145 |
+
|
146 |
+
public function testDisableCurrentProfileMethod()
|
147 |
+
{
|
148 |
+
$this->mockApiCall(
|
149 |
+
new Request(
|
150 |
+
"DELETE",
|
151 |
+
"/v2/profiles/me/methods/bancontact"
|
152 |
+
),
|
153 |
+
new Response(204)
|
154 |
+
);
|
155 |
+
|
156 |
+
$profile = $this->getCurrentProfile();
|
157 |
+
|
158 |
+
$result = $profile->disableMethod('bancontact');
|
159 |
+
|
160 |
+
$this->assertNull($result);
|
161 |
+
}
|
162 |
+
|
163 |
+
/**
|
164 |
+
* @return CurrentProfile
|
165 |
+
*/
|
166 |
+
private function getCurrentProfile()
|
167 |
+
{
|
168 |
+
return $this->copy(
|
169 |
+
json_decode($this->getProfileFixture()),
|
170 |
+
new CurrentProfile($this->apiClient)
|
171 |
+
);
|
172 |
+
}
|
173 |
+
|
174 |
+
/**
|
175 |
+
* @return Profile
|
176 |
+
*/
|
177 |
+
private function getProfile()
|
178 |
+
{
|
179 |
+
return $this->copy(
|
180 |
+
json_decode($this->getProfileFixture()),
|
181 |
+
new Profile($this->apiClient)
|
182 |
+
);
|
183 |
+
}
|
184 |
+
|
185 |
+
/**
|
186 |
+
* @return string
|
187 |
+
*/
|
188 |
+
private function getProfileFixture()
|
189 |
+
{
|
190 |
+
return '{
|
191 |
+
"resource": "profile",
|
192 |
+
"id": "pfl_v9hTwCvYqw",
|
193 |
+
"mode": "live",
|
194 |
+
"name": "My website name",
|
195 |
+
"website": "http://www.mywebsite.com",
|
196 |
+
"email": "info@mywebsite.com",
|
197 |
+
"phone": "31123456789",
|
198 |
+
"categoryCode": 5399,
|
199 |
+
"status": "verified",
|
200 |
+
"review": {
|
201 |
+
"status": "pending"
|
202 |
+
},
|
203 |
+
"createdAt": "2016-01-11T13:03:55+00:00",
|
204 |
+
"_links": {
|
205 |
+
"self": {
|
206 |
+
"href": "https://api.mollie.com/v2/profiles/pfl_v9hTwCvYqw",
|
207 |
+
"type": "application/hal+json"
|
208 |
+
},
|
209 |
+
"chargebacks": {
|
210 |
+
"href": "https://api.mollie.com/v2/chargebacks?profileId=pfl_v9hTwCvYqw",
|
211 |
+
"type": "application/hal+json"
|
212 |
+
},
|
213 |
+
"methods": {
|
214 |
+
"href": "https://api.mollie.com/v2/methods?profileId=pfl_v9hTwCvYqw",
|
215 |
+
"type": "application/hal+json"
|
216 |
+
},
|
217 |
+
"payments": {
|
218 |
+
"href": "https://api.mollie.com/v2/payments?profileId=pfl_v9hTwCvYqw",
|
219 |
+
"type": "application/hal+json"
|
220 |
+
},
|
221 |
+
"refunds": {
|
222 |
+
"href": "https://api.mollie.com/v2/refunds?profileId=pfl_v9hTwCvYqw",
|
223 |
+
"type": "application/hal+json"
|
224 |
+
},
|
225 |
+
"checkoutPreviewUrl": {
|
226 |
+
"href": "https://www.mollie.com/payscreen/preview/pfl_v9hTwCvYqw",
|
227 |
+
"type": "text/html"
|
228 |
+
}
|
229 |
+
}
|
230 |
+
}';
|
231 |
+
}
|
232 |
+
}
|
includes/mollie-api-php/tests/Mollie/API/Endpoints/RefundEndpointTest.php
ADDED
@@ -0,0 +1,161 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tests\Mollie\Api\Endpoints;
|
4 |
+
|
5 |
+
use GuzzleHttp\Psr7\Request;
|
6 |
+
use GuzzleHttp\Psr7\Response;
|
7 |
+
use Mollie\Api\Resources\Payment;
|
8 |
+
use Mollie\Api\Resources\Refund;
|
9 |
+
use Mollie\Api\Resources\RefundCollection;
|
10 |
+
|
11 |
+
class RefundEndpointTest extends BaseEndpointTest
|
12 |
+
{
|
13 |
+
public function testListRefunds()
|
14 |
+
{
|
15 |
+
$this->mockApiCall(
|
16 |
+
new Request(
|
17 |
+
"GET",
|
18 |
+
"/v2/refunds",
|
19 |
+
[],
|
20 |
+
''
|
21 |
+
),
|
22 |
+
new Response(
|
23 |
+
201,
|
24 |
+
[],
|
25 |
+
'{
|
26 |
+
"_embedded": {
|
27 |
+
"refunds": [
|
28 |
+
{
|
29 |
+
"resource": "refund",
|
30 |
+
"id": "re_haCsig5aru",
|
31 |
+
"amount": {
|
32 |
+
"value": "2.00",
|
33 |
+
"currency": "EUR"
|
34 |
+
},
|
35 |
+
"status": "pending",
|
36 |
+
"createdAt": "2018-03-28T10:56:10+00:00",
|
37 |
+
"description": "My first API payment",
|
38 |
+
"paymentId": "tr_44aKxzEbr8",
|
39 |
+
"settlementAmount": {
|
40 |
+
"value": "-2.00",
|
41 |
+
"currency": "EUR"
|
42 |
+
},
|
43 |
+
"_links": {
|
44 |
+
"self": {
|
45 |
+
"href": "https://api.mollie.com/v2/payments/tr_44aKxzEbr8/refunds/re_haCsig5aru",
|
46 |
+
"type": "application/hal+json"
|
47 |
+
},
|
48 |
+
"payment": {
|
49 |
+
"href": "https://api.mollie.com/v2/payments/tr_44aKxzEbr8",
|
50 |
+
"type": "application/hal+json"
|
51 |
+
}
|
52 |
+
}
|
53 |
+
}
|
54 |
+
]
|
55 |
+
},
|
56 |
+
"_links": {
|
57 |
+
"documentation": {
|
58 |
+
"href": "https://docs.mollie.com/reference/v2/refunds-api/list-refunds",
|
59 |
+
"type": "text/html"
|
60 |
+
},
|
61 |
+
"self": {
|
62 |
+
"href": "http://api.mollie.nl/v2/payments/tr_44aKxzEbr8/refunds?limit=10",
|
63 |
+
"type": "application/hal+json"
|
64 |
+
},
|
65 |
+
"previous": null,
|
66 |
+
"next": null
|
67 |
+
},
|
68 |
+
"count": 1
|
69 |
+
}'
|
70 |
+
)
|
71 |
+
);
|
72 |
+
|
73 |
+
$refunds = $this->apiClient->refunds->page();
|
74 |
+
|
75 |
+
$this->assertInstanceOf(RefundCollection::class, $refunds);
|
76 |
+
$this->assertEquals(1, $refunds->count);
|
77 |
+
$this->assertCount(1, $refunds);
|
78 |
+
|
79 |
+
$refund = $refunds[0];
|
80 |
+
|
81 |
+
$this->assertInstanceOf(Refund::class, $refund);
|
82 |
+
$this->assertEquals("re_haCsig5aru", $refund->id);
|
83 |
+
$this->assertEquals("2.00", $refund->amount->value);
|
84 |
+
$this->assertEquals("EUR", $refund->amount->currency);
|
85 |
+
$this->assertEquals("pending", $refund->status);
|
86 |
+
$this->assertEquals("2018-03-28T10:56:10+00:00", $refund->createdAt);
|
87 |
+
$this->assertEquals("My first API payment", $refund->description);
|
88 |
+
$this->assertEquals("tr_44aKxzEbr8", $refund->paymentId);
|
89 |
+
$this->assertEquals("-2.00", $refund->settlementAmount->value);
|
90 |
+
$this->assertEquals("EUR", $refund->settlementAmount->currency);
|
91 |
+
|
92 |
+
$selfLink = (object)["href" => "https://api.mollie.com/v2/payments/tr_44aKxzEbr8/refunds/re_haCsig5aru", "type" => "application/hal+json"];
|
93 |
+
$this->assertEquals($selfLink, $refund->_links->self);
|
94 |
+
|
95 |
+
$paymentLink = (object)["href" => "https://api.mollie.com/v2/payments/tr_44aKxzEbr8", "type" => "application/hal+json"];
|
96 |
+
$this->assertEquals($paymentLink, $refund->_links->payment);
|
97 |
+
}
|
98 |
+
|
99 |
+
/**
|
100 |
+
* @return Payment
|
101 |
+
*/
|
102 |
+
private function getPayment()
|
103 |
+
{
|
104 |
+
$paymentJson = '{
|
105 |
+
"resource":"payment",
|
106 |
+
"id":"tr_44aKxzEbr8",
|
107 |
+
"mode":"test",
|
108 |
+
"createdAt":"2018-03-19T12:17:57+00:00",
|
109 |
+
"amount":{
|
110 |
+
"value":"20.00",
|
111 |
+
"currency":"EUR"
|
112 |
+
},
|
113 |
+
"description":"My first API payment",
|
114 |
+
"method":"ideal",
|
115 |
+
"metadata":{
|
116 |
+
"order_id":1234
|
117 |
+
},
|
118 |
+
"status":"paid",
|
119 |
+
"paidAt":"2018-03-19T12:18:35+00:00",
|
120 |
+
"amountRefunded":{
|
121 |
+
"value":"0.00",
|
122 |
+
"currency":"EUR"
|
123 |
+
},
|
124 |
+
"amountRemaining":{
|
125 |
+
"value":"20.00",
|
126 |
+
"currency":"EUR"
|
127 |
+
},
|
128 |
+
"details":{
|
129 |
+
"consumerName":"T. TEST",
|
130 |
+
"consumerAccount":"NL17RABO0213698412",
|
131 |
+
"consumerBic":"TESTNL99"
|
132 |
+
},
|
133 |
+
"locale":"nl_NL",
|
134 |
+
"countryCode":"NL",
|
135 |
+
"profileId":"pfl_2A1gacu42V",
|
136 |
+
"sequenceType":"oneoff",
|
137 |
+
"redirectUrl":"http://example.org/examples/03-return-page.php?order_id=1234",
|
138 |
+
"webhookUrl":"http://example.org/examples/02-webhook-verification.php",
|
139 |
+
"settlementAmount":{
|
140 |
+
"value":"20.00",
|
141 |
+
"currency":"EUR"
|
142 |
+
},
|
143 |
+
"_links":{
|
144 |
+
"self":{
|
145 |
+
"href":"https://api.mollie.com/v2/payments/tr_44aKxzEbr8",
|
146 |
+
"type":"application/hal+json"
|
147 |
+
},
|
148 |
+
"documentation":{
|
149 |
+
"href":"https://docs.mollie.com/reference/v2/payments-api/get-payment",
|
150 |
+
"type":"text/html"
|
151 |
+
},
|
152 |
+
"refunds":{
|
153 |
+
"href":"https://api.mollie.com/v2/payments/tr_44aKxzEbr8/refunds",
|
154 |
+
"type":"application/hal+json"
|
155 |
+
}
|
156 |
+
}
|
157 |
+
}';
|
158 |
+
|
159 |
+
return $this->copy(json_decode($paymentJson), new Payment($this->apiClient));
|
160 |
+
}
|
161 |
+
}
|
includes/mollie-api-php/tests/Mollie/API/Endpoints/SettlementEndpointTest.php
ADDED
@@ -0,0 +1,450 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tests\Mollie\Api\Endpoints;
|
4 |
+
|
5 |
+
use GuzzleHttp\Psr7\Request;
|
6 |
+
use GuzzleHttp\Psr7\Response;
|
7 |
+
use Mollie\Api\Resources\Settlement;
|
8 |
+
use Mollie\Api\Resources\SettlementCollection;
|
9 |
+
use Mollie\Api\Types\SettlementStatus;
|
10 |
+
|
11 |
+
class SettlementEndpointTest extends BaseEndpointTest
|
12 |
+
{
|
13 |
+
public function testGetSettlement()
|
14 |
+
{
|
15 |
+
$this->mockApiCall(
|
16 |
+
new Request(
|
17 |
+
"GET",
|
18 |
+
"/v2/settlements/stl_xcaSGAHuRt",
|
19 |
+
[],
|
20 |
+
''
|
21 |
+
),
|
22 |
+
new Response(
|
23 |
+
200,
|
24 |
+
[],
|
25 |
+
'{
|
26 |
+
"resource": "settlement",
|
27 |
+
"id": "stl_xcaSGAHuRt",
|
28 |
+
"reference": "1234567.1234.12",
|
29 |
+
"createdAt": "2018-04-30T04:00:02+00:00",
|
30 |
+
"settledAt": "2018-05-01T04:00:02+00:00",
|
31 |
+
"status": "pending",
|
32 |
+
"amount": {
|
33 |
+
"value": "1980.98",
|
34 |
+
"currency": "EUR"
|
35 |
+
},
|
36 |
+
"periods": {
|
37 |
+
"2018": {
|
38 |
+
"04": {
|
39 |
+
"revenue": [
|
40 |
+
{
|
41 |
+
"description": "Creditcard",
|
42 |
+
"method": "creditcard",
|
43 |
+
"count": 2,
|
44 |
+
"amountNet": {
|
45 |
+
"value": "790.00",
|
46 |
+
"currency": "EUR"
|
47 |
+
},
|
48 |
+
"amountVat": null,
|
49 |
+
"amountGross": {
|
50 |
+
"value": "1000.00",
|
51 |
+
"currency": "EUR"
|
52 |
+
}
|
53 |
+
},
|
54 |
+
{
|
55 |
+
"description": "iDEAL",
|
56 |
+
"method": "ideal",
|
57 |
+
"count": 2,
|
58 |
+
"amountNet": {
|
59 |
+
"value": "790.00",
|
60 |
+
"currency": "EUR"
|
61 |
+
},
|
62 |
+
"amountVat": null,
|
63 |
+
"amountGross": {
|
64 |
+
"value": "1000.00",
|
65 |
+
"currency": "EUR"
|
66 |
+
}
|
67 |
+
}
|
68 |
+
],
|
69 |
+
"costs": [
|
70 |
+
{
|
71 |
+
"description": "Creditcard",
|
72 |
+
"method": "creditcard",
|
73 |
+
"count": 2,
|
74 |
+
"rate": {
|
75 |
+
"fixed": {
|
76 |
+
"value": "0.00",
|
77 |
+
"currency": "EUR"
|
78 |
+
},
|
79 |
+
"percentage": "1.80"
|
80 |
+
},
|
81 |
+
"amountNet": {
|
82 |
+
"value": "14.22",
|
83 |
+
"currency": "EUR"
|
84 |
+
},
|
85 |
+
"amountVat": {
|
86 |
+
"value": "2.9862",
|
87 |
+
"currency": "EUR"
|
88 |
+
},
|
89 |
+
"amountGross": {
|
90 |
+
"value": "17.2062",
|
91 |
+
"currency": "EUR"
|
92 |
+
}
|
93 |
+
},
|
94 |
+
{
|
95 |
+
"description": "Fixed creditcard costs",
|
96 |
+
"method": "creditcard",
|
97 |
+
"count": 2,
|
98 |
+
"rate": {
|
99 |
+
"fixed": {
|
100 |
+
"value": "0.25",
|
101 |
+
"currency": "EUR"
|
102 |
+
},
|
103 |
+
"percentage": "0"
|
104 |
+
},
|
105 |
+
"amountNet": {
|
106 |
+
"value": "0.50",
|
107 |
+
"currency": "EUR"
|
108 |
+
},
|
109 |
+
"amountVat": {
|
110 |
+
"value": "0.105",
|
111 |
+
"currency": "EUR"
|
112 |
+
},
|
113 |
+
"amountGross": {
|
114 |
+
"value": "0.605",
|
115 |
+
"currency": "EUR"
|
116 |
+
}
|
117 |
+
},
|
118 |
+
{
|
119 |
+
"description": "Fixed iDEAL costs",
|
120 |
+
"method": "ideal",
|
121 |
+
"count": 2,
|
122 |
+
"rate": {
|
123 |
+
"fixed": {
|
124 |
+
"value": "0.25",
|
125 |
+
"currency": "EUR"
|
126 |
+
},
|
127 |
+
"percentage": "0"
|
128 |
+
},
|
129 |
+
"amountNet": {
|
130 |
+
"value": "0.50",
|
131 |
+
"currency": "EUR"
|
132 |
+
},
|
133 |
+
"amountVat": {
|
134 |
+
"value": "0.105",
|
135 |
+
"currency": "EUR"
|
136 |
+
},
|
137 |
+
"amountGross": {
|
138 |
+
"value": "0.605",
|
139 |
+
"currency": "EUR"
|
140 |
+
}
|
141 |
+
},
|
142 |
+
{
|
143 |
+
"description": "Refunds iDEAL",
|
144 |
+
"method": "refund",
|
145 |
+
"count": 2,
|
146 |
+
"rate": {
|
147 |
+
"fixed": {
|
148 |
+
"value": "0.25",
|
149 |
+
"currency": "EUR"
|
150 |
+
},
|
151 |
+
"percentage": "0"
|
152 |
+
},
|
153 |
+
"amountNet": {
|
154 |
+
"value": "0.50",
|
155 |
+
"currency": "EUR"
|
156 |
+
},
|
157 |
+
"amountVat": {
|
158 |
+
"value": "0.105",
|
159 |
+
"currency": "EUR"
|
160 |
+
},
|
161 |
+
"amountGross": {
|
162 |
+
"value": "0.605",
|
163 |
+
"currency": "EUR"
|
164 |
+
}
|
165 |
+
}
|
166 |
+
]
|
167 |
+
}
|
168 |
+
}
|
169 |
+
},
|
170 |
+
"invoiceId": "inv_VseyTUhJSy",
|
171 |
+
"_links": {
|
172 |
+
"self": {
|
173 |
+
"href": "https://api.mollie.com/v2/settlements/stl_xcaSGAHuRt",
|
174 |
+
"type": "application/hal+json"
|
175 |
+
},
|
176 |
+
"payments": {
|
177 |
+
"href": "https://api.mollie.com/v2/settlements/stl_xcaSGAHuRt/payments",
|
178 |
+
"type": "application/hal+json"
|
179 |
+
},
|
180 |
+
"refunds": {
|
181 |
+
"href": "https://api.mollie.com/v2/settlements/stl_xcaSGAHuRt/refunds",
|
182 |
+
"type": "application/hal+json"
|
183 |
+
},
|
184 |
+
"chargebacks": {
|
185 |
+
"href": "https://api.mollie.com/v2/settlements/stl_xcaSGAHuRt/chargebacks",
|
186 |
+
"type": "application/hal+json"
|
187 |
+
},
|
188 |
+
"documentation": {
|
189 |
+
"href": "https://docs.mollie.com/reference/v2/settlements-api/get-settlement",
|
190 |
+
"type": "text/html"
|
191 |
+
}
|
192 |
+
}
|
193 |
+
}'
|
194 |
+
)
|
195 |
+
);
|
196 |
+
|
197 |
+
/** @var Settlement $settlement */
|
198 |
+
$settlement = $this->apiClient->settlements->get("stl_xcaSGAHuRt");
|
199 |
+
|
200 |
+
$this->assertInstanceOf(Settlement::class, $settlement);
|
201 |
+
$this->assertEquals("settlement", $settlement->resource);
|
202 |
+
$this->assertEquals("stl_xcaSGAHuRt", $settlement->id);
|
203 |
+
$this->assertEquals("1234567.1234.12", $settlement->reference);
|
204 |
+
$this->assertEquals("2018-04-30T04:00:02+00:00", $settlement->createdAt);
|
205 |
+
$this->assertEquals("2018-05-01T04:00:02+00:00", $settlement->settledAt);
|
206 |
+
$this->assertEquals(SettlementStatus::STATUS_PENDING, $settlement->status);
|
207 |
+
$this->assertEquals((object) ["value" => "1980.98", "currency" => "EUR"], $settlement->amount);
|
208 |
+
$this->assertNotEmpty($settlement->periods);
|
209 |
+
$this->assertEquals("inv_VseyTUhJSy", $settlement->invoiceId);
|
210 |
+
|
211 |
+
$selfLink = (object)['href' => 'https://api.mollie.com/v2/settlements/stl_xcaSGAHuRt', 'type' => 'application/hal+json'];
|
212 |
+
$this->assertEquals($selfLink, $settlement->_links->self);
|
213 |
+
|
214 |
+
$paymentLink = (object)['href' => 'https://api.mollie.com/v2/settlements/stl_xcaSGAHuRt/payments', 'type' => 'application/hal+json'];
|
215 |
+
$this->assertEquals($paymentLink, $settlement->_links->payments);
|
216 |
+
|
217 |
+
$refundLink = (object)['href' => 'https://api.mollie.com/v2/settlements/stl_xcaSGAHuRt/refunds', 'type' => 'application/hal+json'];
|
218 |
+
$this->assertEquals($refundLink, $settlement->_links->refunds);
|
219 |
+
|
220 |
+
$chargebackLink = (object)['href' => 'https://api.mollie.com/v2/settlements/stl_xcaSGAHuRt/chargebacks', 'type' => 'application/hal+json'];
|
221 |
+
$this->assertEquals($chargebackLink, $settlement->_links->chargebacks);
|
222 |
+
|
223 |
+
$documentationLink = (object)['href' => 'https://docs.mollie.com/reference/v2/settlements-api/get-settlement', 'type' => 'text/html'];
|
224 |
+
$this->assertEquals($documentationLink, $settlement->_links->documentation);
|
225 |
+
}
|
226 |
+
|
227 |
+
public function testListSettlement()
|
228 |
+
{
|
229 |
+
$this->mockApiCall(
|
230 |
+
new Request(
|
231 |
+
"GET",
|
232 |
+
"/v2/settlements",
|
233 |
+
[],
|
234 |
+
''
|
235 |
+
),
|
236 |
+
new Response(
|
237 |
+
200,
|
238 |
+
[],
|
239 |
+
'{
|
240 |
+
"_embedded": {
|
241 |
+
"settlements": [
|
242 |
+
{
|
243 |
+
"resource": "settlement",
|
244 |
+
"id": "stl_xcaSGAHuRt",
|
245 |
+
"reference": "1234567.1234.12",
|
246 |
+
"createdAt": "2018-04-30T04:00:02+00:00",
|
247 |
+
"settledAt": "2018-05-01T04:00:02+00:00",
|
248 |
+
"status": "pending",
|
249 |
+
"amount": {
|
250 |
+
"value": "1980.98",
|
251 |
+
"currency": "EUR"
|
252 |
+
},
|
253 |
+
"periods": {
|
254 |
+
"2018": {
|
255 |
+
"04": {
|
256 |
+
"revenue": [
|
257 |
+
{
|
258 |
+
"description": "Creditcard",
|
259 |
+
"method": "creditcard",
|
260 |
+
"count": 2,
|
261 |
+
"amountNet": {
|
262 |
+
"value": "790.00",
|
263 |
+
"currency": "EUR"
|
264 |
+
},
|
265 |
+
"amountVat": null,
|
266 |
+
"amountGross": {
|
267 |
+
"value": "1000.00",
|
268 |
+
"currency": "EUR"
|
269 |
+
}
|
270 |
+
},
|
271 |
+
{
|
272 |
+
"description": "iDEAL",
|
273 |
+
"method": "ideal",
|
274 |
+
"count": 2,
|
275 |
+
"amountNet": {
|
276 |
+
"value": "790.00",
|
277 |
+
"currency": "EUR"
|
278 |
+
},
|
279 |
+
"amountVat": null,
|
280 |
+
"amountGross": {
|
281 |
+
"value": "1000.00",
|
282 |
+
"currency": "EUR"
|
283 |
+
}
|
284 |
+
}
|
285 |
+
],
|
286 |
+
"costs": [
|
287 |
+
{
|
288 |
+
"description": "Creditcard",
|
289 |
+
"method": "creditcard",
|
290 |
+
"count": 2,
|
291 |
+
"rate": {
|
292 |
+
"fixed": {
|
293 |
+
"value": "0.00",
|
294 |
+
"currency": "EUR"
|
295 |
+
},
|
296 |
+
"percentage": "1.80"
|
297 |
+
},
|
298 |
+
"amountNet": {
|
299 |
+
"value": "14.22",
|
300 |
+
"currency": "EUR"
|
301 |
+
},
|
302 |
+
"amountVat": {
|
303 |
+
"value": "2.9862",
|
304 |
+
"currency": "EUR"
|
305 |
+
},
|
306 |
+
"amountGross": {
|
307 |
+
"value": "17.2062",
|
308 |
+
"currency": "EUR"
|
309 |
+
}
|
310 |
+
},
|
311 |
+
{
|
312 |
+
"description": "Fixed creditcard costs",
|
313 |
+
"method": "creditcard",
|
314 |
+
"count": 2,
|
315 |
+
"rate": {
|
316 |
+
"fixed": {
|
317 |
+
"value": "0.25",
|
318 |
+
"currency": "EUR"
|
319 |
+
},
|
320 |
+
"percentage": "0"
|
321 |
+
},
|
322 |
+
"amountNet": {
|
323 |
+
"value": "0.50",
|
324 |
+
"currency": "EUR"
|
325 |
+
},
|
326 |
+
"amountVat": {
|
327 |
+
"value": "0.105",
|
328 |
+
"currency": "EUR"
|
329 |
+
},
|
330 |
+
"amountGross": {
|
331 |
+
"value": "0.605",
|
332 |
+
"currency": "EUR"
|
333 |
+
}
|
334 |
+
},
|
335 |
+
{
|
336 |
+
"description": "Fixed iDEAL costs",
|
337 |
+
"method": "ideal",
|
338 |
+
"count": 2,
|
339 |
+
"rate": {
|
340 |
+
"fixed": {
|
341 |
+
"value": "0.25",
|
342 |
+
"currency": "EUR"
|
343 |
+
},
|
344 |
+
"percentage": "0"
|
345 |
+
},
|
346 |
+
"amountNet": {
|
347 |
+
"value": "0.50",
|
348 |
+
"currency": "EUR"
|
349 |
+
},
|
350 |
+
"amountVat": {
|
351 |
+
"value": "0.105",
|
352 |
+
"currency": "EUR"
|
353 |
+
},
|
354 |
+
"amountGross": {
|
355 |
+
"value": "0.605",
|
356 |
+
"currency": "EUR"
|
357 |
+
}
|
358 |
+
},
|
359 |
+
{
|
360 |
+
"description": "Refunds iDEAL",
|
361 |
+
"method": "refund",
|
362 |
+
"count": 2,
|
363 |
+
"rate": {
|
364 |
+
"fixed": {
|
365 |
+
"value": "0.25",
|
366 |
+
"currency": "EUR"
|
367 |
+
},
|
368 |
+
"percentage": "0"
|
369 |
+
},
|
370 |
+
"amountNet": {
|
371 |
+
"value": "0.50",
|
372 |
+
"currency": "EUR"
|
373 |
+
},
|
374 |
+
"amountVat": {
|
375 |
+
"value": "0.105",
|
376 |
+
"currency": "EUR"
|
377 |
+
},
|
378 |
+
"amountGross": {
|
379 |
+
"value": "0.605",
|
380 |
+
"currency": "EUR"
|
381 |
+
}
|
382 |
+
}
|
383 |
+
]
|
384 |
+
}
|
385 |
+
}
|
386 |
+
},
|
387 |
+
"_links": {
|
388 |
+
"self": {
|
389 |
+
"href": "https://api.mollie.com/v2/settlements/stl_xcaSGAHuRt",
|
390 |
+
"type": "application/hal+json"
|
391 |
+
},
|
392 |
+
"payments": {
|
393 |
+
"href": "https://api.mollie.com/v2/settlements/stl_xcaSGAHuRt/payments",
|
394 |
+
"type": "application/hal+json"
|
395 |
+
},
|
396 |
+
"refunds": {
|
397 |
+
"href": "https://api.mollie.com/v2/settlements/stl_xcaSGAHuRt/refunds",
|
398 |
+
"type": "application/hal+json"
|
399 |
+
},
|
400 |
+
"chargebacks": {
|
401 |
+
"href": "https://api.mollie.com/v2/settlements/stl_xcaSGAHuRt/chargebacks",
|
402 |
+
"type": "application/hal+json"
|
403 |
+
}
|
404 |
+
}
|
405 |
+
}
|
406 |
+
]
|
407 |
+
},
|
408 |
+
"count": 1,
|
409 |
+
"_links": {
|
410 |
+
"documentation": {
|
411 |
+
"href": "https://docs.mollie.com/reference/v2/settlements-api/list-settlements",
|
412 |
+
"type": "text/html"
|
413 |
+
},
|
414 |
+
"self": {
|
415 |
+
"href": "https://api.mollie.nl/v2/settlements",
|
416 |
+
"type": "application/hal+json"
|
417 |
+
},
|
418 |
+
"previous": null,
|
419 |
+
"next": {
|
420 |
+
"href": "https://api.mollie.nl/v2/settlements?from=stl_xcaSGAHuRt&limit=1&previous=stl_xcaPACKpLs",
|
421 |
+
"type": "application/hal+json"
|
422 |
+
}
|
423 |
+
}
|
424 |
+
}'
|
425 |
+
)
|
426 |
+
);
|
427 |
+
|
428 |
+
/** @var Settlement $settlement */
|
429 |
+
$settlements = $this->apiClient->settlements->page();
|
430 |
+
$this->assertInstanceOf(SettlementCollection::class, $settlements);
|
431 |
+
|
432 |
+
$documentationLink = (object)['href' => 'https://docs.mollie.com/reference/v2/settlements-api/list-settlements', 'type' => 'text/html'];
|
433 |
+
$this->assertEquals($documentationLink, $settlements->_links->documentation);
|
434 |
+
|
435 |
+
$selfLink = (object)['href' => 'https://api.mollie.nl/v2/settlements', 'type' => 'application/hal+json'];
|
436 |
+
$this->assertEquals($selfLink, $settlements->_links->self);
|
437 |
+
|
438 |
+
$this->assertEmpty($settlements->_links->previous);
|
439 |
+
|
440 |
+
$nextLink = (object)['href' => 'https://api.mollie.nl/v2/settlements?from=stl_xcaSGAHuRt&limit=1&previous=stl_xcaPACKpLs', 'type' => 'application/hal+json'];
|
441 |
+
$this->assertEquals($nextLink, $settlements->_links->next);
|
442 |
+
|
443 |
+
foreach($settlements as $settlement) {
|
444 |
+
$this->assertInstanceOf(Settlement::class, $settlement);
|
445 |
+
$this->assertEquals("settlement", $settlement->resource);
|
446 |
+
$this->assertNotEmpty($settlement->periods);
|
447 |
+
}
|
448 |
+
}
|
449 |
+
|
450 |
+
}
|
includes/mollie-api-php/tests/Mollie/API/Endpoints/ShipmentEndpointTest.php
ADDED
@@ -0,0 +1,565 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tests\Mollie\Api\Endpoints;
|
4 |
+
|
5 |
+
use GuzzleHttp\Psr7\Request;
|
6 |
+
use GuzzleHttp\Psr7\Response;
|
7 |
+
use Mollie\Api\Resources\Order;
|
8 |
+
use Mollie\Api\Resources\OrderLine;
|
9 |
+
use Mollie\Api\Resources\Shipment;
|
10 |
+
use Mollie\Api\Resources\ShipmentCollection;
|
11 |
+
use Mollie\Api\Types\OrderLineStatus;
|
12 |
+
use Mollie\Api\Types\OrderStatus;
|
13 |
+
use Tests\Mollie\TestHelpers\AmountObjectTestHelpers;
|
14 |
+
use Tests\Mollie\TestHelpers\LinkObjectTestHelpers;
|
15 |
+
|
16 |
+
class ShipmentEndpointTest extends BaseEndpointTest
|
17 |
+
{
|
18 |
+
use LinkObjectTestHelpers;
|
19 |
+
use AmountObjectTestHelpers;
|
20 |
+
|
21 |
+
public function testCreateShipment()
|
22 |
+
{
|
23 |
+
$this->mockApiCall(
|
24 |
+
new Request(
|
25 |
+
"POST",
|
26 |
+
"/v2/orders/ord_pbjz8x/shipments",
|
27 |
+
[],
|
28 |
+
'{
|
29 |
+
"lines": [
|
30 |
+
{
|
31 |
+
"id": "odl_dgtxyl",
|
32 |
+
"quantity": 1
|
33 |
+
},
|
34 |
+
{
|
35 |
+
"id": "odl_jp31jz"
|
36 |
+
}
|
37 |
+
]
|
38 |
+
}'
|
39 |
+
),
|
40 |
+
new Response(
|
41 |
+
201,
|
42 |
+
[],
|
43 |
+
$this->getShipmentResponseFixture("shp_3wmsgCJN4U", "ord_pbjz8x")
|
44 |
+
)
|
45 |
+
);
|
46 |
+
|
47 |
+
$order = $this->getOrder('ord_pbjz8x');
|
48 |
+
$shipment = $order->createShipment([
|
49 |
+
'lines' => [
|
50 |
+
[
|
51 |
+
'id' => 'odl_dgtxyl',
|
52 |
+
'quantity' => 1,
|
53 |
+
],
|
54 |
+
[
|
55 |
+
'id' => 'odl_jp31jz'
|
56 |
+
],
|
57 |
+
],
|
58 |
+
]);
|
59 |
+
|
60 |
+
$this->assertShipment($shipment, 'shp_3wmsgCJN4U', 'ord_pbjz8x');
|
61 |
+
}
|
62 |
+
|
63 |
+
public function testCreateShipmentUsingShorthand()
|
64 |
+
{
|
65 |
+
$this->mockApiCall(
|
66 |
+
new Request(
|
67 |
+
"POST",
|
68 |
+
"/v2/orders/ord_pbjz8x/shipments",
|
69 |
+
[],
|
70 |
+
'{
|
71 |
+
"lines": []
|
72 |
+
}'
|
73 |
+
),
|
74 |
+
new Response(
|
75 |
+
201,
|
76 |
+
[],
|
77 |
+
$this->getShipmentResponseFixture("shp_3wmsgCJN4U", "ord_pbjz8x")
|
78 |
+
)
|
79 |
+
);
|
80 |
+
|
81 |
+
$order = $this->getOrder('ord_pbjz8x');
|
82 |
+
$shipment = $order->shipAll();
|
83 |
+
|
84 |
+
$this->assertShipment($shipment, 'shp_3wmsgCJN4U', 'ord_pbjz8x');
|
85 |
+
}
|
86 |
+
|
87 |
+
public function testGetShipment()
|
88 |
+
{
|
89 |
+
$this->mockApiCall(
|
90 |
+
new Request(
|
91 |
+
"GET",
|
92 |
+
"/v2/orders/ord_pbjz8x/shipments/shp_3wmsgCJN4U"
|
93 |
+
),
|
94 |
+
new Response(
|
95 |
+
200,
|
96 |
+
[],
|
97 |
+
$this->getShipmentResponseFixture("shp_3wmsgCJN4U", "ord_pbjz8x")
|
98 |
+
)
|
99 |
+
);
|
100 |
+
|
101 |
+
$order = $this->getOrder('ord_pbjz8x');
|
102 |
+
$shipment = $this->apiClient->shipments->getFor($order, "shp_3wmsgCJN4U");
|
103 |
+
|
104 |
+
$this->assertShipment($shipment, 'shp_3wmsgCJN4U', 'ord_pbjz8x');
|
105 |
+
}
|
106 |
+
|
107 |
+
public function testGetShipmentOnOrderResource()
|
108 |
+
{
|
109 |
+
$this->mockApiCall(
|
110 |
+
new Request(
|
111 |
+
"GET",
|
112 |
+
"/v2/orders/ord_pbjz8x/shipments/shp_3wmsgCJN4U"
|
113 |
+
),
|
114 |
+
new Response(
|
115 |
+
200,
|
116 |
+
[],
|
117 |
+
$this->getShipmentResponseFixture("shp_3wmsgCJN4U", "ord_pbjz8x")
|
118 |
+
)
|
119 |
+
);
|
120 |
+
|
121 |
+
$order = $this->getOrder('ord_pbjz8x');
|
122 |
+
$shipment = $order->getShipment('shp_3wmsgCJN4U');
|
123 |
+
|
124 |
+
$this->assertShipment($shipment, 'shp_3wmsgCJN4U', 'ord_pbjz8x');
|
125 |
+
}
|
126 |
+
|
127 |
+
public function testListShipmentsViaShipmentEndpoint()
|
128 |
+
{
|
129 |
+
$this->mockApiCall(
|
130 |
+
new Request(
|
131 |
+
"GET",
|
132 |
+
"/v2/orders/ord_pbjz8x/shipments"
|
133 |
+
),
|
134 |
+
new Response(
|
135 |
+
200,
|
136 |
+
[],
|
137 |
+
'{
|
138 |
+
"count": 2,
|
139 |
+
"_embedded": {
|
140 |
+
"shipments": [
|
141 |
+
' . $this->getShipmentResponseFixture("shp_3wmsgCJN4U", "ord_pbjz8x") . ',
|
142 |
+
' . $this->getShipmentResponseFixture("shp_kjh234CASX", "ord_pbjz8x") . '
|
143 |
+
]
|
144 |
+
},
|
145 |
+
"_links": {
|
146 |
+
"self": {
|
147 |
+
"href": "https://api.mollie.com/v2/order/ord_pbjz8x/shipments",
|
148 |
+
"type": "application/hal+json"
|
149 |
+
},
|
150 |
+
"documentation": {
|
151 |
+
"href": "https://docs.mollie.com/reference/v2/shipments-api/list-shipments",
|
152 |
+
"type": "text/html"
|
153 |
+
}
|
154 |
+
}
|
155 |
+
}'
|
156 |
+
)
|
157 |
+
);
|
158 |
+
|
159 |
+
$order = $this->getOrder('ord_pbjz8x');
|
160 |
+
$shipments = $this->apiClient->shipments->listFor($order);
|
161 |
+
|
162 |
+
$this->assertInstanceOf(ShipmentCollection::class, $shipments);
|
163 |
+
$this->assertShipment($shipments[0], 'shp_3wmsgCJN4U', 'ord_pbjz8x');
|
164 |
+
$this->assertShipment($shipments[1], 'shp_kjh234CASX', 'ord_pbjz8x');
|
165 |
+
}
|
166 |
+
|
167 |
+
public function testListShipmentsOnOrderResource()
|
168 |
+
{
|
169 |
+
$this->mockApiCall(
|
170 |
+
new Request(
|
171 |
+
"GET",
|
172 |
+
"/v2/orders/ord_pbjz8x/shipments"
|
173 |
+
),
|
174 |
+
new Response(
|
175 |
+
200,
|
176 |
+
[],
|
177 |
+
'{
|
178 |
+
"count": 2,
|
179 |
+
"_embedded": {
|
180 |
+
"shipments": [
|
181 |
+
' . $this->getShipmentResponseFixture("shp_3wmsgCJN4U", "ord_pbjz8x") . ',
|
182 |
+
' . $this->getShipmentResponseFixture("shp_kjh234CASX", "ord_pbjz8x") . '
|
183 |
+
]
|
184 |
+
},
|
185 |
+
"_links": {
|
186 |
+
"self": {
|
187 |
+
"href": "https://api.mollie.com/v2/order/ord_pbjz8x/shipments",
|
188 |
+
"type": "application/hal+json"
|
189 |
+
},
|
190 |
+
"documentation": {
|
191 |
+
"href": "https://docs.mollie.com/reference/v2/shipments-api/list-shipments",
|
192 |
+
"type": "text/html"
|
193 |
+
}
|
194 |
+
}
|
195 |
+
}'
|
196 |
+
)
|
197 |
+
);
|
198 |
+
|
199 |
+
$order = $this->getOrder('ord_pbjz8x');
|
200 |
+
|
201 |
+
$shipments = $order->shipments();
|
202 |
+
|
203 |
+
$this->assertInstanceOf(ShipmentCollection::class, $shipments);
|
204 |
+
$this->assertShipment($shipments[0], 'shp_3wmsgCJN4U', 'ord_pbjz8x');
|
205 |
+
$this->assertShipment($shipments[1], 'shp_kjh234CASX', 'ord_pbjz8x');
|
206 |
+
}
|
207 |
+
|
208 |
+
public function testUpdateShipmentTrackingInfo()
|
209 |
+
{
|
210 |
+
$this->mockApiCall(
|
211 |
+
new Request(
|
212 |
+
"PATCH",
|
213 |
+
"/v2/orders/ord_pbjz8x/shipments/shp_3wmsgCJN4U",
|
214 |
+
[],
|
215 |
+
'{
|
216 |
+
"tracking": {
|
217 |
+
"carrier": "PostNL",
|
218 |
+
"code": "3SKABA000000000",
|
219 |
+
"url": "http://postnl.nl/tracktrace/?B=3SKABA000000000&P=1016EE&D=NL&T=C"
|
220 |
+
}
|
221 |
+
}'
|
222 |
+
),
|
223 |
+
new Response(
|
224 |
+
200,
|
225 |
+
[],
|
226 |
+
$this->getShipmentResponseFixture(
|
227 |
+
"shp_3wmsgCJN4U",
|
228 |
+
"ord_pbjz8x",
|
229 |
+
OrderLineStatus::STATUS_SHIPPING,
|
230 |
+
'"tracking": {
|
231 |
+
"carrier": "PostNL",
|
232 |
+
"code": "3SKABA000000000",
|
233 |
+
"url": "http://postnl.nl/tracktrace/?B=3SKABA000000000&P=1016EE&D=NL&T=C"
|
234 |
+
},'
|
235 |
+
)
|
236 |
+
)
|
237 |
+
);
|
238 |
+
|
239 |
+
$shipment = $this->getShipment('shp_3wmsgCJN4U', 'ord_pbjz8x', OrderLineStatus::STATUS_SHIPPING);
|
240 |
+
|
241 |
+
$shipment->tracking = [
|
242 |
+
'carrier' => 'PostNL',
|
243 |
+
'code' => '3SKABA000000000',
|
244 |
+
'url' => 'http://postnl.nl/tracktrace/?B=3SKABA000000000&P=1016EE&D=NL&T=C',
|
245 |
+
];
|
246 |
+
$shipment = $shipment->update();
|
247 |
+
|
248 |
+
$this->assertShipment($shipment, 'shp_3wmsgCJN4U', 'ord_pbjz8x');
|
249 |
+
|
250 |
+
$this->assertEquals((object) [
|
251 |
+
'carrier' => 'PostNL',
|
252 |
+
'code' => '3SKABA000000000',
|
253 |
+
'url' => 'http://postnl.nl/tracktrace/?B=3SKABA000000000&P=1016EE&D=NL&T=C',
|
254 |
+
], $shipment->tracking);
|
255 |
+
}
|
256 |
+
|
257 |
+
protected function assertShipment($shipment, $shipment_id, $order_id)
|
258 |
+
{
|
259 |
+
$this->assertInstanceOf(Shipment::class, $shipment);
|
260 |
+
$this->assertEquals("shipment", $shipment->resource);
|
261 |
+
$this->assertEquals($shipment_id, $shipment->id);
|
262 |
+
$this->assertEquals($order_id, $shipment->orderId);
|
263 |
+
$this->assertEquals('2018-08-02T09:29:56+00:00', $shipment->createdAt);
|
264 |
+
$this->assertLinkObject(
|
265 |
+
"https://api.mollie.com/v2/orders/ord_pbjz8x/shipments/{$shipment_id}",
|
266 |
+
'application/hal+json',
|
267 |
+
$shipment->_links->self
|
268 |
+
);
|
269 |
+
$this->assertLinkObject(
|
270 |
+
'https://api.mollie.com/v2/orders/ord_pbjz8x',
|
271 |
+
'application/hal+json',
|
272 |
+
$shipment->_links->order
|
273 |
+
);
|
274 |
+
$this->assertLinkObject(
|
275 |
+
'https://docs.mollie.com/reference/v2/shipments-api/get-shipment',
|
276 |
+
'text/html',
|
277 |
+
$shipment->_links->documentation
|
278 |
+
);
|
279 |
+
|
280 |
+
$line1 = $shipment->lines()[0];
|
281 |
+
$this->assertEquals('orderline', $line1->resource);
|
282 |
+
$this->assertEquals('odl_dgtxyl', $line1->id);
|
283 |
+
$this->assertEquals('ord_pbjz8x', $line1->orderId);
|
284 |
+
$this->assertEquals('LEGO 42083 Bugatti Chiron', $line1->name);
|
285 |
+
$this->assertEquals('https://shop.lego.com/nl-NL/Bugatti-Chiron-42083', $line1->productUrl);
|
286 |
+
$this->assertEquals('https://sh-s7-live-s.legocdn.com/is/image//LEGO/42083_alt1?$main$', $line1->imageUrl);
|
287 |
+
$this->assertEquals('5702016116977', $line1->sku);
|
288 |
+
$this->assertEquals('physical', $line1->type);
|
289 |
+
$this->assertEquals(OrderLineStatus::STATUS_SHIPPING, $line1->status);
|
290 |
+
$this->assertEquals(2, $line1->quantity);
|
291 |
+
$this->assertEquals('2018-08-02T09:29:56+00:00', $line1->createdAt);
|
292 |
+
$this->assertEquals('21.00', $line1->vatRate);
|
293 |
+
$this->assertAmountObject('121.14', 'EUR', $line1->vatAmount);
|
294 |
+
$this->assertAmountObject('399.00', 'EUR', $line1->unitPrice);
|
295 |
+
$this->assertAmountObject('100.00', 'EUR', $line1->discountAmount);
|
296 |
+
$this->assertAmountObject('698.00', 'EUR', $line1->totalAmount);
|
297 |
+
|
298 |
+
$line2 = $shipment->lines()[1];
|
299 |
+
$this->assertEquals('orderline', $line2->resource);
|
300 |
+
$this->assertEquals('odl_jp31jz', $line2->id);
|
301 |
+
$this->assertEquals('ord_pbjz8x', $line2->orderId);
|
302 |
+
$this->assertEquals('LEGO 42056 Porsche 911 GT3 RS', $line2->name);
|
303 |
+
$this->assertEquals('https://shop.lego.com/nl-NL/Porsche-911-GT3-RS-42056', $line2->productUrl);
|
304 |
+
$this->assertEquals('https://sh-s7-live-s.legocdn.com/is/image/LEGO/42056?$PDPDefault$', $line2->imageUrl);
|
305 |
+
$this->assertEquals('5702015594028', $line2->sku);
|
306 |
+
$this->assertEquals('digital', $line2->type);
|
307 |
+
$this->assertEquals(OrderLineStatus::STATUS_SHIPPING, $line2->status);
|
308 |
+
$this->assertEquals(1, $line2->quantity);
|
309 |
+
$this->assertEquals('2018-08-02T09:29:56+00:00', $line2->createdAt);
|
310 |
+
$this->assertEquals('21.00', $line2->vatRate);
|
311 |
+
$this->assertAmountObject('57.27', 'EUR', $line2->vatAmount);
|
312 |
+
$this->assertAmountObject('329.99', 'EUR', $line2->unitPrice);
|
313 |
+
$this->assertAmountObject('329.99', 'EUR', $line2->totalAmount);
|
314 |
+
}
|
315 |
+
|
316 |
+
protected function getOrder($id)
|
317 |
+
{
|
318 |
+
$orderJson = $this->getOrderResponseFixture($id);
|
319 |
+
return $this->copy(json_decode($orderJson), new Order($this->apiClient));
|
320 |
+
}
|
321 |
+
|
322 |
+
protected function getShipment($shipment_id, $order_id, $orderLineStatus = OrderLineStatus::STATUS_SHIPPING)
|
323 |
+
{
|
324 |
+
$shipmentJson = $this->getShipmentResponseFixture($shipment_id, $order_id, $orderLineStatus);
|
325 |
+
return $this->copy(json_decode($shipmentJson), new Shipment($this->apiClient));
|
326 |
+
}
|
327 |
+
|
328 |
+
protected function getOrderResponseFixture($order_id, $order_status = OrderStatus::STATUS_CREATED)
|
329 |
+
{
|
330 |
+
return str_replace(
|
331 |
+
"<<order_id>>",
|
332 |
+
$order_id,
|
333 |
+
'{
|
334 |
+
"resource": "order",
|
335 |
+
"id": "<<order_id>>",
|
336 |
+
"profileId": "pfl_URR55HPMGx",
|
337 |
+
"amount": {
|
338 |
+
"value": "1027.99",
|
339 |
+
"currency": "EUR"
|
340 |
+
},
|
341 |
+
"amountCaptured": {
|
342 |
+
"value": "0.00",
|
343 |
+
"currency": "EUR"
|
344 |
+
},
|
345 |
+
"amountRefunded": {
|
346 |
+
"value": "0.00",
|
347 |
+
"currency": "EUR"
|
348 |
+
},
|
349 |
+
"status": "' . $order_status . '",
|
350 |
+
"metadata": {
|
351 |
+
"order_id": "1337",
|
352 |
+
"description": "Lego cars"
|
353 |
+
},
|
354 |
+
"consumerDateOfBirth": "1958-01-31",
|
355 |
+
"createdAt": "2018-08-02T09:29:56+00:00",
|
356 |
+
"mode": "live",
|
357 |
+
"billingAddress": {
|
358 |
+
"streetAndNumber": "Keizersgracht 313",
|
359 |
+
"postalCode": "1016 EE",
|
360 |
+
"city": "Amsterdam",
|
361 |
+
"country": "nl",
|
362 |
+
"givenName": "Luke",
|
363 |
+
"familyName": "Skywalker",
|
364 |
+
"email": "luke@skywalker.com"
|
365 |
+
},
|
366 |
+
"shippingAddress": {
|
367 |
+
"streetAndNumber": "Keizersgracht 313",
|
368 |
+
"postalCode": "1016 EE",
|
369 |
+
"city": "Amsterdam",
|
370 |
+
"country": "nl",
|
371 |
+
"givenName": "Luke",
|
372 |
+
"familyName": "Skywalker",
|
373 |
+
"email": "luke@skywalker.com"
|
374 |
+
},
|
375 |
+
"orderNumber": "1337",
|
376 |
+
"locale": "nl_NL",
|
377 |
+
"method" : "klarnapaylater",
|
378 |
+
"redirectUrl": "https://example.org/redirect",
|
379 |
+
"webhookUrl": "https://example.org/webhook",
|
380 |
+
"lines": [
|
381 |
+
{
|
382 |
+
"resource": "orderline",
|
383 |
+
"id": "odl_dgtxyl",
|
384 |
+
"orderId": "<<order_id>>",
|
385 |
+
"name": "LEGO 42083 Bugatti Chiron",
|
386 |
+
"productUrl": "https://shop.lego.com/nl-NL/Bugatti-Chiron-42083",
|
387 |
+
"imageUrl": "https://sh-s7-live-s.legocdn.com/is/image//LEGO/42083_alt1?$main$",
|
388 |
+
"sku": "5702016116977",
|
389 |
+
"type": "physical",
|
390 |
+
"status": "created",
|
391 |
+
"quantity": 2,
|
392 |
+
"unitPrice": {
|
393 |
+
"value": "399.00",
|
394 |
+
"currency": "EUR"
|
395 |
+
},
|
396 |
+
"vatRate": "21.00",
|
397 |
+
"vatAmount": {
|
398 |
+
"value": "121.14",
|
399 |
+
"currency": "EUR"
|
400 |
+
},
|
401 |
+
"discountAmount": {
|
402 |
+
"value": "100.00",
|
403 |
+
"currency": "EUR"
|
404 |
+
},
|
405 |
+
"totalAmount": {
|
406 |
+
"value": "698.00",
|
407 |
+
"currency": "EUR"
|
408 |
+
},
|
409 |
+
"createdAt": "2018-08-02T09:29:56+00:00",
|
410 |
+
"_links": {
|
411 |
+
"self": {
|
412 |
+
"href": "https://api.mollie.com/v2/orders/<<order_id>>/orderlines/odl_dgtxyl",
|
413 |
+
"type": "application/hal+json"
|
414 |
+
}
|
415 |
+
}
|
416 |
+
},
|
417 |
+
{
|
418 |
+
"resource": "orderline",
|
419 |
+
"id": "odl_jp31jz",
|
420 |
+
"orderId": "<<order_id>>",
|
421 |
+
"name": "LEGO 42056 Porsche 911 GT3 RS",
|
422 |
+
"productUrl": "https://shop.lego.com/nl-NL/Porsche-911-GT3-RS-42056",
|
423 |
+
"imageUrl": "https://sh-s7-live-s.legocdn.com/is/image/LEGO/42056?$PDPDefault$",
|
424 |
+
"sku": "5702015594028",
|
425 |
+
"type": "digital",
|
426 |
+
"status": "created",
|
427 |
+
"quantity": 1,
|
428 |
+
"unitPrice": {
|
429 |
+
"value": "329.99",
|
430 |
+
"currency": "EUR"
|
431 |
+
},
|
432 |
+
"vatRate": "21.00",
|
433 |
+
"vatAmount": {
|
434 |
+
"value": "57.27",
|
435 |
+
"currency": "EUR"
|
436 |
+
},
|
437 |
+
"totalAmount": {
|
438 |
+
"value": "329.99",
|
439 |
+
"currency": "EUR"
|
440 |
+
},
|
441 |
+
"createdAt": "2018-08-02T09:29:56+00:00",
|
442 |
+
"_links": {
|
443 |
+
"self": {
|
444 |
+
"href": "https://api.mollie.com/v2/orders/<<order_id>>/orderlines/odl_jp31jz",
|
445 |
+
"type": "application/hal+json"
|
446 |
+
}
|
447 |
+
}
|
448 |
+
}
|
449 |
+
],
|
450 |
+
"_links": {
|
451 |
+
"self": {
|
452 |
+
"href": "https://api.mollie.com/v2/orders/<<order_id>>",
|
453 |
+
"type": "application/hal+json"
|
454 |
+
},
|
455 |
+
"checkout": {
|
456 |
+
"href": "https://www.mollie.com/payscreen/select-method/7UhSN1zuXS",
|
457 |
+
"type": "text/html"
|
458 |
+
},
|
459 |
+
"documentation": {
|
460 |
+
"href": "https://docs.mollie.com/reference/v2/orders-api/get-order",
|
461 |
+
"type": "text/html"
|
462 |
+
}
|
463 |
+
}
|
464 |
+
}'
|
465 |
+
);
|
466 |
+
}
|
467 |
+
|
468 |
+
protected function getShipmentResponseFixture($shipment_id, $order_id, $orderline_status = OrderLineStatus::STATUS_SHIPPING, $tracking_info = '')
|
469 |
+
{
|
470 |
+
return str_replace(
|
471 |
+
[
|
472 |
+
"<<order_id>>",
|
473 |
+
"<<shipment_id>>",
|
474 |
+
"<<orderline_status>>",
|
475 |
+
"<<tracking_info>>",
|
476 |
+
],
|
477 |
+
[
|
478 |
+
$order_id,
|
479 |
+
$shipment_id,
|
480 |
+
$orderline_status,
|
481 |
+
$tracking_info,
|
482 |
+
],
|
483 |
+
'{
|
484 |
+
"resource": "shipment",
|
485 |
+
"id": "<<shipment_id>>",
|
486 |
+
"orderId": "<<order_id>>",
|
487 |
+
"createdAt": "2018-08-02T09:29:56+00:00",
|
488 |
+
"profileId": "pfl_URR55HPMGx",
|
489 |
+
<<tracking_info>>
|
490 |
+
"lines": [
|
491 |
+
{
|
492 |
+
"resource": "orderline",
|
493 |
+
"id": "odl_dgtxyl",
|
494 |
+
"orderId": "<<order_id>>",
|
495 |
+
"name": "LEGO 42083 Bugatti Chiron",
|
496 |
+
"productUrl": "https://shop.lego.com/nl-NL/Bugatti-Chiron-42083",
|
497 |
+
"imageUrl": "https://sh-s7-live-s.legocdn.com/is/image//LEGO/42083_alt1?$main$",
|
498 |
+
"sku": "5702016116977",
|
499 |
+
"type": "physical",
|
500 |
+
"status": "<<orderline_status>>",
|
501 |
+
"quantity": 2,
|
502 |
+
"unitPrice": {
|
503 |
+
"value": "399.00",
|
504 |
+
"currency": "EUR"
|
505 |
+
},
|
506 |
+
"vatRate": "21.00",
|
507 |
+
"vatAmount": {
|
508 |
+
"value": "121.14",
|
509 |
+
"currency": "EUR"
|
510 |
+
},
|
511 |
+
"discountAmount": {
|
512 |
+
"value": "100.00",
|
513 |
+
"currency": "EUR"
|
514 |
+
},
|
515 |
+
"totalAmount": {
|
516 |
+
"value": "698.00",
|
517 |
+
"currency": "EUR"
|
518 |
+
},
|
519 |
+
"createdAt": "2018-08-02T09:29:56+00:00"
|
520 |
+
},
|
521 |
+
{
|
522 |
+
"resource": "orderline",
|
523 |
+
"id": "odl_jp31jz",
|
524 |
+
"orderId": "<<order_id>>",
|
525 |
+
"name": "LEGO 42056 Porsche 911 GT3 RS",
|
526 |
+
"productUrl": "https://shop.lego.com/nl-NL/Porsche-911-GT3-RS-42056",
|
527 |
+
"imageUrl": "https://sh-s7-live-s.legocdn.com/is/image/LEGO/42056?$PDPDefault$",
|
528 |
+
"sku": "5702015594028",
|
529 |
+
"type": "digital",
|
530 |
+
"status": "<<orderline_status>>",
|
531 |
+
"quantity": 1,
|
532 |
+
"unitPrice": {
|
533 |
+
"value": "329.99",
|
534 |
+
"currency": "EUR"
|
535 |
+
},
|
536 |
+
"vatRate": "21.00",
|
537 |
+
"vatAmount": {
|
538 |
+
"value": "57.27",
|
539 |
+
"currency": "EUR"
|
540 |
+
},
|
541 |
+
"totalAmount": {
|
542 |
+
"value": "329.99",
|
543 |
+
"currency": "EUR"
|
544 |
+
},
|
545 |
+
"createdAt": "2018-08-02T09:29:56+00:00"
|
546 |
+
}
|
547 |
+
],
|
548 |
+
"_links": {
|
549 |
+
"self": {
|
550 |
+
"href": "https://api.mollie.com/v2/orders/<<order_id>>/shipments/<<shipment_id>>",
|
551 |
+
"type": "application/hal+json"
|
552 |
+
},
|
553 |
+
"order": {
|
554 |
+
"href": "https://api.mollie.com/v2/orders/<<order_id>>",
|
555 |
+
"type": "application/hal+json"
|
556 |
+
},
|
557 |
+
"documentation": {
|
558 |
+
"href": "https://docs.mollie.com/reference/v2/shipments-api/get-shipment",
|
559 |
+
"type": "text/html"
|
560 |
+
}
|
561 |
+
}
|
562 |
+
}'
|
563 |
+
);
|
564 |
+
}
|
565 |
+
}
|
includes/mollie-api-php/tests/Mollie/API/Endpoints/SubscriptionEndpointTest.php
ADDED
@@ -0,0 +1,491 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tests\Mollie\Api\Endpoints;
|
4 |
+
|
5 |
+
use GuzzleHttp\Psr7\Request;
|
6 |
+
use GuzzleHttp\Psr7\Response;
|
7 |
+
use Mollie\Api\Resources\Customer;
|
8 |
+
use Mollie\Api\Resources\Subscription;
|
9 |
+
use Mollie\Api\Resources\SubscriptionCollection;
|
10 |
+
use Mollie\Api\Types\SubscriptionStatus;
|
11 |
+
|
12 |
+
class SubscriptionEndpointTest extends BaseEndpointTest
|
13 |
+
{
|
14 |
+
public function testCreateWorks()
|
15 |
+
{
|
16 |
+
$this->mockApiCall(
|
17 |
+
new Request('POST', '/v2/customers/cst_FhQJRw4s2n/subscriptions'),
|
18 |
+
new Response(
|
19 |
+
200,
|
20 |
+
[],
|
21 |
+
'{
|
22 |
+
"resource": "subscription",
|
23 |
+
"id": "sub_wByQa6efm6",
|
24 |
+
"mode": "test",
|
25 |
+
"createdAt": "2018-04-24T11:41:55+00:00",
|
26 |
+
"status": "active",
|
27 |
+
"amount": {
|
28 |
+
"value": "10.00",
|
29 |
+
"currency": "EUR"
|
30 |
+
},
|
31 |
+
"description": "Order 1234",
|
32 |
+
"method": null,
|
33 |
+
"times": null,
|
34 |
+
"interval": "1 month",
|
35 |
+
"startDate": "2018-04-24",
|
36 |
+
"webhookUrl": null,
|
37 |
+
"_links": {
|
38 |
+
"self": {
|
39 |
+
"href": "https://api.mollie.com/v2/customers/cst_FhQJRw4s2n/subscriptions/sub_wByQa6efm6",
|
40 |
+
"type": "application/hal+json"
|
41 |
+
},
|
42 |
+
"customer": {
|
43 |
+
"href": "https://api.mollie.com/v2/customers/cst_FhQJRw4s2n",
|
44 |
+
"type": "application/hal+json"
|
45 |
+
},
|
46 |
+
"documentation": {
|
47 |
+
"href": "https://docs.mollie.com/reference/v2/subscriptions-api/create-subscription",
|
48 |
+
"type": "text/html"
|
49 |
+
}
|
50 |
+
}
|
51 |
+
}'
|
52 |
+
)
|
53 |
+
);
|
54 |
+
|
55 |
+
$customer = $this->getCustomer();
|
56 |
+
|
57 |
+
/** @var Subscription $subscription */
|
58 |
+
$subscription = $customer->createSubscription([
|
59 |
+
"amount" => [
|
60 |
+
"value" => "10.00",
|
61 |
+
"currency" => "EUR"
|
62 |
+
],
|
63 |
+
"interval" => "1 month",
|
64 |
+
"description" => "Order 1234"
|
65 |
+
]);
|
66 |
+
|
67 |
+
$this->assertInstanceOf(Subscription::class, $subscription);
|
68 |
+
$this->assertEquals("subscription", $subscription->resource);
|
69 |
+
$this->assertEquals("sub_wByQa6efm6", $subscription->id);
|
70 |
+
$this->assertEquals("test", $subscription->mode);
|
71 |
+
$this->assertEquals("2018-04-24T11:41:55+00:00", $subscription->createdAt);
|
72 |
+
$this->assertEquals(SubscriptionStatus::STATUS_ACTIVE, $subscription->status);
|
73 |
+
$this->assertEquals((object)["value" => "10.00", "currency" => "EUR"], $subscription->amount);
|
74 |
+
$this->assertEquals("Order 1234", $subscription->description);
|
75 |
+
$this->assertNull($subscription->method);
|
76 |
+
$this->assertNull($subscription->times);
|
77 |
+
$this->assertEquals("1 month", $subscription->interval);
|
78 |
+
$this->assertEquals("2018-04-24", $subscription->startDate);
|
79 |
+
|
80 |
+
$selfLink = (object)["href" => "https://api.mollie.com/v2/customers/cst_FhQJRw4s2n/subscriptions/sub_wByQa6efm6", "type" => "application/hal+json"];
|
81 |
+
$this->assertEquals($selfLink, $subscription->_links->self);
|
82 |
+
|
83 |
+
$customerLink = (object)["href" => "https://api.mollie.com/v2/customers/cst_FhQJRw4s2n", "type" => "application/hal+json"];
|
84 |
+
$this->assertEquals($customerLink, $subscription->_links->customer);
|
85 |
+
|
86 |
+
$documentationLink = (object)["href" => "https://docs.mollie.com/reference/v2/subscriptions-api/create-subscription", "type" => "text/html"];
|
87 |
+
$this->assertEquals($documentationLink, $subscription->_links->documentation);
|
88 |
+
}
|
89 |
+
|
90 |
+
public function testGetWorks()
|
91 |
+
{
|
92 |
+
$this->mockApiCall(
|
93 |
+
new Request('GET', '/v2/customers/cst_FhQJRw4s2n/subscriptions/sub_wByQa6efm6'),
|
94 |
+
new Response(
|
95 |
+
200,
|
96 |
+
[],
|
97 |
+
'{
|
98 |
+
"resource": "subscription",
|
99 |
+
"id": "sub_wByQa6efm6",
|
100 |
+
"mode": "test",
|
101 |
+
"createdAt": "2018-04-24T11:41:55+00:00",
|
102 |
+
"status": "active",
|
103 |
+
"amount": {
|
104 |
+
"value": "10.00",
|
105 |
+
"currency": "EUR"
|
106 |
+
},
|
107 |
+
"description": "Order 1234",
|
108 |
+
"method": null,
|
109 |
+
"times": null,
|
110 |
+
"interval": "1 month",
|
111 |
+
"startDate": "2018-04-24",
|
112 |
+
"webhookUrl": null,
|
113 |
+
"_links": {
|
114 |
+
"self": {
|
115 |
+
"href": "https://api.mollie.com/v2/customers/cst_FhQJRw4s2n/subscriptions/sub_wByQa6efm6",
|
116 |
+
"type": "application/hal+json"
|
117 |
+
},
|
118 |
+
"customer": {
|
119 |
+
"href": "https://api.mollie.com/v2/customers/cst_FhQJRw4s2n",
|
120 |
+
"type": "application/hal+json"
|
121 |
+
},
|
122 |
+
"documentation": {
|
123 |
+
"href": "https://docs.mollie.com/reference/v2/subscriptions-api/get-subscription",
|
124 |
+
"type": "text/html"
|
125 |
+
}
|
126 |
+
}
|
127 |
+
}'
|
128 |
+
)
|
129 |
+
);
|
130 |
+
|
131 |
+
$customer = $this->getCustomer();
|
132 |
+
|
133 |
+
/** @var Subscription $subscription */
|
134 |
+
$subscription = $customer->getSubscription("sub_wByQa6efm6");
|
135 |
+
|
136 |
+
$this->assertInstanceOf(Subscription::class, $subscription);
|
137 |
+
$this->assertEquals("subscription", $subscription->resource);
|
138 |
+
$this->assertEquals("sub_wByQa6efm6", $subscription->id);
|
139 |
+
$this->assertEquals("test", $subscription->mode);
|
140 |
+
$this->assertEquals("2018-04-24T11:41:55+00:00", $subscription->createdAt);
|
141 |
+
$this->assertEquals(SubscriptionStatus::STATUS_ACTIVE, $subscription->status);
|
142 |
+
$this->assertEquals((object)["value" => "10.00", "currency" => "EUR"], $subscription->amount);
|
143 |
+
$this->assertEquals("Order 1234", $subscription->description);
|
144 |
+
$this->assertNull($subscription->method);
|
145 |
+
$this->assertNull($subscription->times);
|
146 |
+
$this->assertEquals("1 month", $subscription->interval);
|
147 |
+
$this->assertEquals("2018-04-24", $subscription->startDate);
|
148 |
+
|
149 |
+
$selfLink = (object)["href" => "https://api.mollie.com/v2/customers/cst_FhQJRw4s2n/subscriptions/sub_wByQa6efm6", "type" => "application/hal+json"];
|
150 |
+
$this->assertEquals($selfLink, $subscription->_links->self);
|
151 |
+
|
152 |
+
$customerLink = (object)["href" => "https://api.mollie.com/v2/customers/cst_FhQJRw4s2n", "type" => "application/hal+json"];
|
153 |
+
$this->assertEquals($customerLink, $subscription->_links->customer);
|
154 |
+
|
155 |
+
$documentationLink = (object)["href" => "https://docs.mollie.com/reference/v2/subscriptions-api/get-subscription", "type" => "text/html"];
|
156 |
+
$this->assertEquals($documentationLink, $subscription->_links->documentation);
|
157 |
+
}
|
158 |
+
|
159 |
+
public function testListWorks()
|
160 |
+
{
|
161 |
+
$this->mockApiCall(
|
162 |
+
new Request('GET', '/v2/customers/cst_FhQJRw4s2n/subscriptions'),
|
163 |
+
new Response(
|
164 |
+
200,
|
165 |
+
[],
|
166 |
+
'{
|
167 |
+
"_embedded": {
|
168 |
+
"subscriptions": [{
|
169 |
+
"resource": "subscription",
|
170 |
+
"id": "sub_wByQa6efm6",
|
171 |
+
"mode": "test",
|
172 |
+
"createdAt": "2018-04-24T11:41:55+00:00",
|
173 |
+
"status": "active",
|
174 |
+
"amount": {
|
175 |
+
"value": "10.00",
|
176 |
+
"currency": "EUR"
|
177 |
+
},
|
178 |
+
"description": "Order 1234",
|
179 |
+
"method": null,
|
180 |
+
"times": null,
|
181 |
+
"interval": "1 month",
|
182 |
+
"startDate": "2018-04-24",
|
183 |
+
"webhookUrl": null,
|
184 |
+
"_links": {
|
185 |
+
"self": {
|
186 |
+
"href": "https://api.mollie.com/v2/customers/cst_FhQJRw4s2n/subscriptions/sub_wByQa6efm6",
|
187 |
+
"type": "application/hal+json"
|
188 |
+
},
|
189 |
+
"customer": {
|
190 |
+
"href": "https://api.mollie.com/v2/customers/cst_FhQJRw4s2n",
|
191 |
+
"type": "application/hal+json"
|
192 |
+
}
|
193 |
+
}
|
194 |
+
}]
|
195 |
+
},
|
196 |
+
"count": 1,
|
197 |
+
"_links": {
|
198 |
+
"documentation": {
|
199 |
+
"href": "https://docs.mollie.com/reference/v2/subscriptions-api/list-subscriptions",
|
200 |
+
"type": "text/html"
|
201 |
+
},
|
202 |
+
"self": {
|
203 |
+
"href": "https://api.mollie.com/v2/customers/cst_FhQJRw4s2n/subscriptions?limit=50",
|
204 |
+
"type": "application/hal+json"
|
205 |
+
},
|
206 |
+
"previous": null,
|
207 |
+
"next": null
|
208 |
+
}
|
209 |
+
}'
|
210 |
+
)
|
211 |
+
);
|
212 |
+
|
213 |
+
$customer = $this->getCustomer();
|
214 |
+
|
215 |
+
$subscriptions = $customer->subscriptions();
|
216 |
+
|
217 |
+
$this->assertInstanceOf(SubscriptionCollection::class, $subscriptions);
|
218 |
+
|
219 |
+
$this->assertEquals(count($subscriptions), $subscriptions->count);
|
220 |
+
|
221 |
+
$documentationLink = (object)["href" => "https://docs.mollie.com/reference/v2/subscriptions-api/list-subscriptions", "type" => "text/html"];
|
222 |
+
$this->assertEquals($documentationLink, $subscriptions->_links->documentation);
|
223 |
+
|
224 |
+
$selfLink = (object)["href" => "https://api.mollie.com/v2/customers/cst_FhQJRw4s2n/subscriptions?limit=50", "type" => "application/hal+json"];
|
225 |
+
$this->assertEquals($selfLink, $subscriptions->_links->self);
|
226 |
+
|
227 |
+
foreach ($subscriptions as $subscription) {
|
228 |
+
$this->assertInstanceOf(Subscription::class, $subscription);
|
229 |
+
$this->assertEquals("subscription", $subscription->resource);
|
230 |
+
$this->assertNotEmpty($subscription->createdAt);
|
231 |
+
}
|
232 |
+
}
|
233 |
+
|
234 |
+
public function testCancelViaCustomerResourceWorks()
|
235 |
+
{
|
236 |
+
$this->mockApiCall(
|
237 |
+
new Request('DELETE', '/v2/customers/cst_FhQJRw4s2n/subscriptions/sub_wByQa6efm6'),
|
238 |
+
new Response(
|
239 |
+
200,
|
240 |
+
[],
|
241 |
+
'{
|
242 |
+
"resource": "subscription",
|
243 |
+
"id": "sub_wByQa6efm6",
|
244 |
+
"mode": "test",
|
245 |
+
"createdAt": "2018-04-24T11:41:55+00:00",
|
246 |
+
"status": "canceled",
|
247 |
+
"amount": {
|
248 |
+
"value": "10.00",
|
249 |
+
"currency": "EUR"
|
250 |
+
},
|
251 |
+
"description": "Order 1234",
|
252 |
+
"method": null,
|
253 |
+
"times": null,
|
254 |
+
"interval": "1 month",
|
255 |
+
"startDate": "2018-04-24",
|
256 |
+
"webhookUrl": null,
|
257 |
+
"canceledAt": "2018-04-24T12:31:32+00:00",
|
258 |
+
"_links": {
|
259 |
+
"self": {
|
260 |
+
"href": "https://api.mollie.com/v2/customers/cst_FhQJRw4s2n/subscriptions/sub_wByQa6efm6",
|
261 |
+
"type": "application/hal+json"
|
262 |
+
},
|
263 |
+
"customer": {
|
264 |
+
"href": "https://api.mollie.com/v2/customers/cst_FhQJRw4s2n",
|
265 |
+
"type": "application/hal+json"
|
266 |
+
},
|
267 |
+
"documentation": {
|
268 |
+
"href": "https://docs.mollie.com/reference/v2/subscriptions-api/cancel-subscription",
|
269 |
+
"type": "text/html"
|
270 |
+
}
|
271 |
+
}
|
272 |
+
}'
|
273 |
+
)
|
274 |
+
);
|
275 |
+
|
276 |
+
$customer = $this->getCustomer();
|
277 |
+
|
278 |
+
/** @var Subscription $subscription */
|
279 |
+
$subscription = $customer->cancelSubscription("sub_wByQa6efm6");
|
280 |
+
|
281 |
+
$this->assertInstanceOf(Subscription::class, $subscription);
|
282 |
+
$this->assertEquals("subscription", $subscription->resource);
|
283 |
+
$this->assertEquals("sub_wByQa6efm6", $subscription->id);
|
284 |
+
$this->assertEquals("test", $subscription->mode);
|
285 |
+
$this->assertEquals(SubscriptionStatus::STATUS_CANCELED, $subscription->status);
|
286 |
+
$this->assertEquals("2018-04-24T11:41:55+00:00", $subscription->createdAt);
|
287 |
+
$this->assertEquals("2018-04-24T12:31:32+00:00", $subscription->canceledAt);
|
288 |
+
|
289 |
+
|
290 |
+
$selfLink = (object)["href" => "https://api.mollie.com/v2/customers/cst_FhQJRw4s2n/subscriptions/sub_wByQa6efm6", "type" => "application/hal+json"];
|
291 |
+
$this->assertEquals($selfLink, $subscription->_links->self);
|
292 |
+
|
293 |
+
$customerLink = (object)["href" => "https://api.mollie.com/v2/customers/cst_FhQJRw4s2n", "type" => "application/hal+json"];
|
294 |
+
$this->assertEquals($customerLink, $subscription->_links->customer);
|
295 |
+
|
296 |
+
$documentationLink = (object)["href" => "https://docs.mollie.com/reference/v2/subscriptions-api/cancel-subscription", "type" => "text/html"];
|
297 |
+
$this->assertEquals($documentationLink, $subscription->_links->documentation);
|
298 |
+
}
|
299 |
+
|
300 |
+
public function testCancelOnSubscriptionResourceWorks($value='')
|
301 |
+
{
|
302 |
+
$this->mockApiCall(
|
303 |
+
new Request('DELETE', '/v2/customers/cst_VhjQebNW5j/subscriptions/sub_DRjwaT5qHx'),
|
304 |
+
new Response(
|
305 |
+
200,
|
306 |
+
[],
|
307 |
+
'{
|
308 |
+
"resource": "subscription",
|
309 |
+
"id": "sub_DRjwaT5qHx",
|
310 |
+
"mode": "test",
|
311 |
+
"createdAt": "2018-04-24T11:41:55+00:00",
|
312 |
+
"status": "canceled",
|
313 |
+
"amount": {
|
314 |
+
"value": "10.00",
|
315 |
+
"currency": "EUR"
|
316 |
+
},
|
317 |
+
"description": "Order 1234",
|
318 |
+
"method": null,
|
319 |
+
"times": null,
|
320 |
+
"interval": "1 month",
|
321 |
+
"startDate": "2018-04-24",
|
322 |
+
"webhookUrl": null,
|
323 |
+
"canceledAt": "2018-04-24T12:31:32+00:00",
|
324 |
+
"_links": {
|
325 |
+
"self": {
|
326 |
+
"href": "https://api.mollie.com/v2/customers/cst_VhjQebNW5j/subscriptions/sub_DRjwaT5qHx",
|
327 |
+
"type": "application/hal+json"
|
328 |
+
},
|
329 |
+
"customer": {
|
330 |
+
"href": "https://api.mollie.com/v2/customers/cst_VhjQebNW5j",
|
331 |
+
"type": "application/hal+json"
|
332 |
+
},
|
333 |
+
"documentation": {
|
334 |
+
"href": "https://docs.mollie.com/reference/v2/subscriptions-api/cancel-subscription",
|
335 |
+
"type": "text/html"
|
336 |
+
}
|
337 |
+
}
|
338 |
+
}'
|
339 |
+
)
|
340 |
+
);
|
341 |
+
|
342 |
+
$subscription = $this->getSubscription();
|
343 |
+
|
344 |
+
$subscription = $subscription->cancel();
|
345 |
+
|
346 |
+
$this->assertInstanceOf(Subscription::class, $subscription);
|
347 |
+
$this->assertEquals("subscription", $subscription->resource);
|
348 |
+
$this->assertEquals("sub_DRjwaT5qHx", $subscription->id);
|
349 |
+
$this->assertEquals("test", $subscription->mode);
|
350 |
+
$this->assertEquals(SubscriptionStatus::STATUS_CANCELED, $subscription->status);
|
351 |
+
$this->assertEquals("2018-04-24T11:41:55+00:00", $subscription->createdAt);
|
352 |
+
$this->assertEquals("2018-04-24T12:31:32+00:00", $subscription->canceledAt);
|
353 |
+
|
354 |
+
|
355 |
+
$selfLink = (object)["href" => "https://api.mollie.com/v2/customers/cst_VhjQebNW5j/subscriptions/sub_DRjwaT5qHx", "type" => "application/hal+json"];
|
356 |
+
$this->assertEquals($selfLink, $subscription->_links->self);
|
357 |
+
|
358 |
+
$customerLink = (object)["href" => "https://api.mollie.com/v2/customers/cst_VhjQebNW5j", "type" => "application/hal+json"];
|
359 |
+
$this->assertEquals($customerLink, $subscription->_links->customer);
|
360 |
+
|
361 |
+
$documentationLink = (object)["href" => "https://docs.mollie.com/reference/v2/subscriptions-api/cancel-subscription", "type" => "text/html"];
|
362 |
+
$this->assertEquals($documentationLink, $subscription->_links->documentation);
|
363 |
+
}
|
364 |
+
|
365 |
+
public function testThatUpdateSubscriptionWorks()
|
366 |
+
{
|
367 |
+
$expectedAmountValue = '12.00';
|
368 |
+
$expectedAmountCurrency = 'EUR';
|
369 |
+
$expectedStartDate = '2018-12-12';
|
370 |
+
|
371 |
+
$this->mockApiCall(
|
372 |
+
new Request('PATCH', '/v2/customers/cst_VhjQebNW5j/subscriptions/sub_DRjwaT5qHx'),
|
373 |
+
new Response(
|
374 |
+
200,
|
375 |
+
[],
|
376 |
+
'{
|
377 |
+
"resource": "subscription",
|
378 |
+
"id": "sub_DRjwaT5qHx",
|
379 |
+
"customerId": "cst_VhjQebNW5j",
|
380 |
+
"mode": "live",
|
381 |
+
"createdAt": "2018-07-17T07:45:52+00:00",
|
382 |
+
"status": "active",
|
383 |
+
"amount": {
|
384 |
+
"value": "' . $expectedAmountValue . '",
|
385 |
+
"currency": "' . $expectedAmountCurrency . '"
|
386 |
+
},
|
387 |
+
"description": "Mollie Recurring subscription #1",
|
388 |
+
"method": null,
|
389 |
+
"times": 42,
|
390 |
+
"interval": "15 days",
|
391 |
+
"startDate": "' . $expectedStartDate . '",
|
392 |
+
"webhookUrl": "https://example.org/webhook",
|
393 |
+
"_links": {
|
394 |
+
"self": {
|
395 |
+
"href": "http://api.mollie.test/v2/customers/cst_VhjQebNW5j/subscriptions/sub_DRjwaT5qHx",
|
396 |
+
"type": "application/hal+json"
|
397 |
+
},
|
398 |
+
"customer": {
|
399 |
+
"href": "http://api.mollie.test/v2/customers/cst_VhjQebNW5j",
|
400 |
+
"type": "application/hal+json"
|
401 |
+
},
|
402 |
+
"documentation": {
|
403 |
+
"href": "https://docs.mollie.com/reference/v2/subscriptions-api/update-subscription",
|
404 |
+
"type": "text/html"
|
405 |
+
}
|
406 |
+
}
|
407 |
+
}'
|
408 |
+
)
|
409 |
+
);
|
410 |
+
|
411 |
+
$subscription = $this->getSubscription();
|
412 |
+
$expectedAmountObject = (object)[
|
413 |
+
'value' => $expectedAmountValue,
|
414 |
+
'currency' => $expectedAmountCurrency,
|
415 |
+
];
|
416 |
+
$subscription->amount = $expectedAmountObject;
|
417 |
+
$subscription->startDate = $expectedStartDate;
|
418 |
+
|
419 |
+
$updatedSubscription = $subscription->update();
|
420 |
+
|
421 |
+
$this->assertEquals($expectedStartDate, $updatedSubscription->startDate);
|
422 |
+
$this->assertEquals($expectedAmountObject, $updatedSubscription->amount);
|
423 |
+
}
|
424 |
+
|
425 |
+
/**
|
426 |
+
* @return Subscription
|
427 |
+
*/
|
428 |
+
private function getSubscription()
|
429 |
+
{
|
430 |
+
$subscriptionJson = '{
|
431 |
+
"resource": "subscription",
|
432 |
+
"id": "sub_DRjwaT5qHx",
|
433 |
+
"customerId": "cst_VhjQebNW5j",
|
434 |
+
"mode": "live",
|
435 |
+
"createdAt": "2018-07-17T07:45:52+00:00",
|
436 |
+
"status": "active",
|
437 |
+
"amount": {
|
438 |
+
"value": "10.00",
|
439 |
+
"currency": "EUR"
|
440 |
+
},
|
441 |
+
"description": "Mollie Recurring subscription #1",
|
442 |
+
"method": null,
|
443 |
+
"times": 42,
|
444 |
+
"interval": "15 days",
|
445 |
+
"startDate": "2018-12-12",
|
446 |
+
"webhookUrl": "https://example.org/webhook",
|
447 |
+
"_links": {
|
448 |
+
"self": {
|
449 |
+
"href": "http://api.mollie.test/v2/customers/cst_VhjQebNW5j/subscriptions/sub_DRjwaT5qHx",
|
450 |
+
"type": "application/hal+json"
|
451 |
+
},
|
452 |
+
"customer": {
|
453 |
+
"href": "http://api.mollie.test/v2/customers/cst_VhjQebNW5j",
|
454 |
+
"type": "application/hal+json"
|
455 |
+
},
|
456 |
+
"documentation": {
|
457 |
+
"href": "https://docs.mollie.com/reference/v2/subscriptions-api/update-subscription",
|
458 |
+
"type": "text/html"
|
459 |
+
}
|
460 |
+
}
|
461 |
+
}';
|
462 |
+
|
463 |
+
return $this->copy(json_decode($subscriptionJson), new Subscription($this->apiClient));
|
464 |
+
}
|
465 |
+
|
466 |
+
/**
|
467 |
+
* @return Customer
|
468 |
+
*/
|
469 |
+
private function getCustomer()
|
470 |
+
{
|
471 |
+
$customerJson = '{
|
472 |
+
"resource": "customer",
|
473 |
+
"id": "cst_FhQJRw4s2n",
|
474 |
+
"mode": "test",
|
475 |
+
"name": "John Doe",
|
476 |
+
"email": "johndoe@example.org",
|
477 |
+
"locale": null,
|
478 |
+
"metadata": null,
|
479 |
+
"recentlyUsedMethods": [],
|
480 |
+
"createdAt": "2018-04-19T08:49:01+00:00",
|
481 |
+
"_links": {
|
482 |
+
"documentation": {
|
483 |
+
"href": "https://docs.mollie.com/reference/v2/customers-api/get-customer",
|
484 |
+
"type": "text/html"
|
485 |
+
}
|
486 |
+
}
|
487 |
+
}';
|
488 |
+
|
489 |
+
return $this->copy(json_decode($customerJson), new Customer($this->apiClient));
|
490 |
+
}
|
491 |
+
}
|
includes/mollie-api-php/tests/Mollie/API/Exceptions/ApiExceptionTest.php
ADDED
@@ -0,0 +1,89 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tests\Mollie\API\Exceptions;
|
4 |
+
|
5 |
+
use GuzzleHttp\Exception\RequestException;
|
6 |
+
use GuzzleHttp\Psr7\Request;
|
7 |
+
use GuzzleHttp\Psr7\Response;
|
8 |
+
use Mollie\Api\Exceptions\ApiException;
|
9 |
+
use PHPUnit\Framework\TestCase;
|
10 |
+
use Tests\Mollie\TestHelpers\LinkObjectTestHelpers;
|
11 |
+
|
12 |
+
class ApiExceptionTest extends TestCase
|
13 |
+
{
|
14 |
+
use LinkObjectTestHelpers;
|
15 |
+
|
16 |
+
public function testCreateFromGuzzleException()
|
17 |
+
{
|
18 |
+
$response = new Response(
|
19 |
+
422,
|
20 |
+
[],
|
21 |
+
'{
|
22 |
+
"status": 422,
|
23 |
+
"title": "Unprocessable Entity",
|
24 |
+
"detail": "Can not enable Credit card via the API. Please go to the dashboard to enable this payment method.",
|
25 |
+
"_links": {
|
26 |
+
"dashboard": {
|
27 |
+
"href": "https://www.mollie.com/dashboard/settings/profiles/pfl_v9hTwCvYqw/payment-methods",
|
28 |
+
"type": "text/html"
|
29 |
+
},
|
30 |
+
"documentation": {
|
31 |
+
"href": "https://docs.mollie.com/guides/handling-errors",
|
32 |
+
"type": "text/html"
|
33 |
+
}
|
34 |
+
}
|
35 |
+
}'
|
36 |
+
);
|
37 |
+
|
38 |
+
$guzzleException = new RequestException(
|
39 |
+
'Something went wrong...',
|
40 |
+
new Request(
|
41 |
+
'POST',
|
42 |
+
'https://api.mollie.com/v2/profiles/pfl_v9hTwCvYqw/methods/bancontact'
|
43 |
+
),
|
44 |
+
$response
|
45 |
+
);
|
46 |
+
|
47 |
+
$exception = ApiException::createFromGuzzleException($guzzleException);
|
48 |
+
|
49 |
+
$this->assertInstanceOf(ApiException::class, $exception);
|
50 |
+
$this->assertInstanceOf(Response::class, $exception->getResponse());
|
51 |
+
|
52 |
+
$this->assertEquals($response, $exception->getResponse());
|
53 |
+
$this->assertTrue($exception->hasResponse());
|
54 |
+
|
55 |
+
$this->assertTrue($exception->hasLink('dashboard'));
|
56 |
+
$this->assertTrue($exception->hasLink('documentation'));
|
57 |
+
$this->assertFalse($exception->hasLink('foo'));
|
58 |
+
|
59 |
+
$this->assertLinkObject(
|
60 |
+
'https://www.mollie.com/dashboard/settings/profiles/pfl_v9hTwCvYqw/payment-methods',
|
61 |
+
'text/html',
|
62 |
+
$exception->getLink('dashboard')
|
63 |
+
);
|
64 |
+
|
65 |
+
$this->assertEquals(
|
66 |
+
'https://www.mollie.com/dashboard/settings/profiles/pfl_v9hTwCvYqw/payment-methods',
|
67 |
+
$exception->getUrl('dashboard')
|
68 |
+
);
|
69 |
+
|
70 |
+
$this->assertEquals(
|
71 |
+
'https://www.mollie.com/dashboard/settings/profiles/pfl_v9hTwCvYqw/payment-methods',
|
72 |
+
$exception->getDashboardUrl()
|
73 |
+
);
|
74 |
+
|
75 |
+
$this->assertLinkObject(
|
76 |
+
'https://docs.mollie.com/guides/handling-errors',
|
77 |
+
'text/html',
|
78 |
+
$exception->getLink('documentation')
|
79 |
+
);
|
80 |
+
|
81 |
+
$this->assertEquals(
|
82 |
+
'https://docs.mollie.com/guides/handling-errors',
|
83 |
+
$exception->getDocumentationUrl()
|
84 |
+
);
|
85 |
+
|
86 |
+
$this->assertNull($exception->getLink('foo'));
|
87 |
+
$this->assertNull($exception->getUrl('foo'));
|
88 |
+
}
|
89 |
+
}
|
includes/mollie-api-php/tests/Mollie/API/MollieApiClientTest.php
ADDED
@@ -0,0 +1,159 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace Tests\Mollie\Api;
|
3 |
+
|
4 |
+
use Eloquent\Liberator\Liberator;
|
5 |
+
use GuzzleHttp\Client;
|
6 |
+
use GuzzleHttp\ClientInterface;
|
7 |
+
use GuzzleHttp\Psr7\Response;
|
8 |
+
use Mollie\Api\Exceptions\ApiException;
|
9 |
+
use Mollie\Api\MollieApiClient;
|
10 |
+
|
11 |
+
class MollieApiClientTest extends \PHPUnit\Framework\TestCase
|
12 |
+
{
|
13 |
+
/**
|
14 |
+
* @var ClientInterface|\PHPUnit_Framework_MockObject_MockObject
|
15 |
+
*/
|
16 |
+
private $guzzleClient;
|
17 |
+
|
18 |
+
/**
|
19 |
+
* @var MollieApiClient
|
20 |
+
*/
|
21 |
+
private $mollieApiClient;
|
22 |
+
|
23 |
+
protected function setUp()
|
24 |
+
{
|
25 |
+
parent::setUp();
|
26 |
+
|
27 |
+
$this->guzzleClient = $this->createMock(Client::class);
|
28 |
+
$this->mollieApiClient = new MollieApiClient($this->guzzleClient);
|
29 |
+
|
30 |
+
$this->mollieApiClient->setApiKey('test_foobarfoobarfoobarfoobarfoobar');
|
31 |
+
}
|
32 |
+
|
33 |
+
public function testPerformHttpCallReturnsBodyAsObject()
|
34 |
+
{
|
35 |
+
$response = new Response(200, [], '{"resource": "payment"}');
|
36 |
+
|
37 |
+
$this->guzzleClient
|
38 |
+
->expects($this->once())
|
39 |
+
->method('send')
|
40 |
+
->willReturn($response);
|
41 |
+
|
42 |
+
|
43 |
+
$parsedResponse = $this->mollieApiClient->performHttpCall('GET', '');
|
44 |
+
|
45 |
+
$this->assertEquals(
|
46 |
+
(object)['resource' => 'payment'],
|
47 |
+
$parsedResponse
|
48 |
+
);
|
49 |
+
}
|
50 |
+
|
51 |
+
public function testPerformHttpCallCreatesApiExceptionCorrectly()
|
52 |
+
{
|
53 |
+
$this->expectException(ApiException::class);
|
54 |
+
$this->expectExceptionMessage('Error executing API call (422: Unprocessable Entity): Non-existent parameter "recurringType" for this API call. Did you mean: "sequenceType"?');
|
55 |
+
$this->expectExceptionCode(422);
|
56 |
+
|
57 |
+
$response = new Response(422, [], '{
|
58 |
+
"status": 422,
|
59 |
+
"title": "Unprocessable Entity",
|
60 |
+
"detail": "Non-existent parameter \"recurringType\" for this API call. Did you mean: \"sequenceType\"?",
|
61 |
+
"field": "recurringType",
|
62 |
+
"_links": {
|
63 |
+
"documentation": {
|
64 |
+
"href": "https://docs.mollie.com/guides/handling-errors",
|
65 |
+
"type": "text/html"
|
66 |
+
}
|
67 |
+
}
|
68 |
+
}');
|
69 |
+
|
70 |
+
$this->guzzleClient
|
71 |
+
->expects($this->once())
|
72 |
+
->method('send')
|
73 |
+
->willReturn($response);
|
74 |
+
|
75 |
+
try {
|
76 |
+
$parsedResponse = $this->mollieApiClient->performHttpCall('GET', '');
|
77 |
+
} catch (ApiException $e) {
|
78 |
+
$this->assertEquals('recurringType', $e->getField());
|
79 |
+
$this->assertEquals('https://docs.mollie.com/guides/handling-errors', $e->getDocumentationUrl());
|
80 |
+
$this->assertEquals($response, $e->getResponse());
|
81 |
+
|
82 |
+
throw $e;
|
83 |
+
}
|
84 |
+
}
|
85 |
+
|
86 |
+
public function testPerformHttpCallCreatesApiExceptionWithoutFieldAndDocumentationUrl()
|
87 |
+
{
|
88 |
+
$this->expectException(ApiException::class);
|
89 |
+
$this->expectExceptionMessage('Error executing API call (422: Unprocessable Entity): Non-existent parameter "recurringType" for this API call. Did you mean: "sequenceType"?');
|
90 |
+
$this->expectExceptionCode(422);
|
91 |
+
|
92 |
+
$response = new Response(422, [], '{
|
93 |
+
"status": 422,
|
94 |
+
"title": "Unprocessable Entity",
|
95 |
+
"detail": "Non-existent parameter \"recurringType\" for this API call. Did you mean: \"sequenceType\"?"
|
96 |
+
}');
|
97 |
+
|
98 |
+
$this->guzzleClient
|
99 |
+
->expects($this->once())
|
100 |
+
->method('send')
|
101 |
+
->willReturn($response);
|
102 |
+
|
103 |
+
try {
|
104 |
+
$parsedResponse = $this->mollieApiClient->performHttpCall('GET', '');
|
105 |
+
} catch (ApiException $e) {
|
106 |
+
$this->assertNull($e->getField());
|
107 |
+
$this->assertNull($e->getDocumentationUrl());
|
108 |
+
$this->assertEquals($response, $e->getResponse());
|
109 |
+
|
110 |
+
throw $e;
|
111 |
+
}
|
112 |
+
}
|
113 |
+
|
114 |
+
public function testCanBeSerializedAndUnserialized()
|
115 |
+
{
|
116 |
+
$this->mollieApiClient->setApiEndpoint("https://mymollieproxy.local");
|
117 |
+
$serialized = \serialize($this->mollieApiClient);
|
118 |
+
|
119 |
+
$this->assertNotContains('test_foobarfoobarfoobarfoobarfoobar', $serialized, "API key should not be in serialized data or it will end up in caches.");
|
120 |
+
|
121 |
+
/** @var MollieApiClient $client_copy */
|
122 |
+
$client_copy = Liberator::liberate(unserialize($serialized));
|
123 |
+
|
124 |
+
$this->assertEmpty($client_copy->apiKey, "API key should not have been remembered");
|
125 |
+
$this->assertInstanceOf(ClientInterface::class, $client_copy->httpClient, "A Guzzle client should have been set.");
|
126 |
+
$this->assertNull($client_copy->usesOAuth());
|
127 |
+
$this->assertEquals("https://mymollieproxy.local", $client_copy->getApiEndpoint(), "The API endpoint should be remembered");
|
128 |
+
|
129 |
+
$this->assertNotEmpty($client_copy->customerPayments);
|
130 |
+
$this->assertNotEmpty($client_copy->payments);
|
131 |
+
$this->assertNotEmpty($client_copy->methods);
|
132 |
+
// no need to assert them all.
|
133 |
+
}
|
134 |
+
|
135 |
+
public function testResponseBodyCanBeReadMultipleTimesIfMiddlewareReadsItFirst()
|
136 |
+
{
|
137 |
+
$response = new Response(200, [], '{"resource": "payment"}');
|
138 |
+
|
139 |
+
// Before the MollieApiClient gets the response, some middleware reads the body first.
|
140 |
+
$bodyAsReadFromMiddleware = (string) $response->getBody();
|
141 |
+
|
142 |
+
$this->guzzleClient
|
143 |
+
->expects($this->once())
|
144 |
+
->method('send')
|
145 |
+
->willReturn($response);
|
146 |
+
|
147 |
+
$parsedResponse = $this->mollieApiClient->performHttpCall('GET', '');
|
148 |
+
|
149 |
+
$this->assertEquals(
|
150 |
+
'{"resource": "payment"}',
|
151 |
+
$bodyAsReadFromMiddleware
|
152 |
+
);
|
153 |
+
|
154 |
+
$this->assertEquals(
|
155 |
+
(object)['resource' => 'payment'],
|
156 |
+
$parsedResponse
|
157 |
+
);
|
158 |
+
}
|
159 |
+
}
|
includes/mollie-api-php/tests/Mollie/API/Resources/InvoiceTest.php
ADDED
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tests\Mollie\Api\Resources;
|
4 |
+
|
5 |
+
use Mollie\Api\MollieApiClient;
|
6 |
+
use Mollie\Api\Resources\Invoice;
|
7 |
+
use Mollie\Api\Types\InvoiceStatus;
|
8 |
+
use PHPUnit\Framework\TestCase;
|
9 |
+
|
10 |
+
class InvoiceTest extends TestCase
|
11 |
+
{
|
12 |
+
/**
|
13 |
+
* @param string $status
|
14 |
+
* @param string $function
|
15 |
+
* @param boolean $expected_boolean
|
16 |
+
*
|
17 |
+
* @dataProvider dpTestInvoiceStatuses
|
18 |
+
*/
|
19 |
+
public function testInvoiceStatuses($status, $function, $expected_boolean)
|
20 |
+
{
|
21 |
+
$invoice = new Invoice($this->createMock(MollieApiClient::class));
|
22 |
+
$invoice->status = $status;
|
23 |
+
|
24 |
+
$this->assertEquals($expected_boolean, $invoice->{$function}());
|
25 |
+
}
|
26 |
+
public function dpTestInvoiceStatuses()
|
27 |
+
{
|
28 |
+
return [
|
29 |
+
[InvoiceStatus::STATUS_PAID, "isPaid", true],
|
30 |
+
[InvoiceStatus::STATUS_PAID, "isOpen", false],
|
31 |
+
[InvoiceStatus::STATUS_PAID, "isOverdue", false],
|
32 |
+
|
33 |
+
[InvoiceStatus::STATUS_OPEN, "isPaid", false],
|
34 |
+
[InvoiceStatus::STATUS_OPEN, "isOpen", true],
|
35 |
+
[InvoiceStatus::STATUS_OPEN, "isOverdue", false],
|
36 |
+
|
37 |
+
[InvoiceStatus::STATUS_OVERDUE, "isPaid", false],
|
38 |
+
[InvoiceStatus::STATUS_OVERDUE, "isOpen", false],
|
39 |
+
[InvoiceStatus::STATUS_OVERDUE, "isOverdue", true],
|
40 |
+
];
|
41 |
+
}
|
42 |
+
}
|
includes/mollie-api-php/tests/Mollie/API/Resources/OnboardingTest.php
ADDED
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tests\Mollie\API\Resources;
|
4 |
+
|
5 |
+
use Mollie\Api\MollieApiClient;
|
6 |
+
use Mollie\Api\Resources\Onboarding;
|
7 |
+
use Mollie\Api\Types\OnboardingStatus;
|
8 |
+
|
9 |
+
class OnboardingTest extends \PHPUnit\Framework\TestCase
|
10 |
+
{
|
11 |
+
/**
|
12 |
+
* @param string $status
|
13 |
+
* @param string $function
|
14 |
+
* @param boolean $expected_boolean
|
15 |
+
*
|
16 |
+
* @dataProvider dpTestOnboardingStatuses
|
17 |
+
*/
|
18 |
+
public function testOnboardingStatuses($status, $function, $expected_boolean)
|
19 |
+
{
|
20 |
+
$orderLine = new Onboarding($this->createMock(MollieApiClient::class));
|
21 |
+
$orderLine->status = $status;
|
22 |
+
|
23 |
+
$this->assertEquals($expected_boolean, $orderLine->{$function}());
|
24 |
+
}
|
25 |
+
|
26 |
+
public function dpTestOnboardingStatuses()
|
27 |
+
{
|
28 |
+
return [
|
29 |
+
[OnboardingStatus::NEEDS_DATA, "needsData", true],
|
30 |
+
[OnboardingStatus::NEEDS_DATA, "isInReview", false],
|
31 |
+
[OnboardingStatus::NEEDS_DATA, "isCompleted", false],
|
32 |
+
|
33 |
+
[OnboardingStatus::IN_REVIEW, "needsData", false],
|
34 |
+
[OnboardingStatus::IN_REVIEW, "isInReview", true],
|
35 |
+
[OnboardingStatus::IN_REVIEW, "isCompleted", false],
|
36 |
+
|
37 |
+
[OnboardingStatus::COMPLETED, "needsData", false],
|
38 |
+
[OnboardingStatus::COMPLETED, "isInReview", false],
|
39 |
+
[OnboardingStatus::COMPLETED, "isCompleted", true],
|
40 |
+
];
|
41 |
+
}
|
42 |
+
}
|
includes/mollie-api-php/tests/Mollie/API/Resources/OrderLineCollectionTest.php
ADDED
@@ -0,0 +1,36 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tests\Mollie\Api\Resources;
|
4 |
+
|
5 |
+
use Mollie\Api\MollieApiClient;
|
6 |
+
use Mollie\Api\Resources\OrderLine;
|
7 |
+
use Mollie\Api\Resources\OrderLineCollection;
|
8 |
+
|
9 |
+
class OrderLineCollectionTest extends \PHPUnit\Framework\TestCase
|
10 |
+
{
|
11 |
+
public function testCanGetOrderLine()
|
12 |
+
{
|
13 |
+
$mockApi = $this->createMock(MollieApiClient::class);
|
14 |
+
$lines = new OrderLineCollection($mockApi, 3, []);
|
15 |
+
|
16 |
+
$line1 = new OrderLine($mockApi);
|
17 |
+
$line1->id = 'odl_aaaaaaaaaaa1';
|
18 |
+
|
19 |
+
$line2 = new OrderLine($mockApi);
|
20 |
+
$line2->id = 'odl_aaaaaaaaaaa2';
|
21 |
+
|
22 |
+
$line3 = new OrderLine($mockApi);
|
23 |
+
$line3->id = 'odl_aaaaaaaaaaa3';
|
24 |
+
|
25 |
+
$lines[] = $line1;
|
26 |
+
$lines[] = $line2;
|
27 |
+
$lines[] = $line3;
|
28 |
+
|
29 |
+
$this->assertNull($lines->get('odl_not_existent'));
|
30 |
+
|
31 |
+
$line = $lines->get('odl_aaaaaaaaaaa2');
|
32 |
+
|
33 |
+
$this->assertInstanceOf(OrderLine::class, $line);
|
34 |
+
$this->assertEquals($line2, $line);
|
35 |
+
}
|
36 |
+
}
|
includes/mollie-api-php/tests/Mollie/API/Resources/OrderLineTest.php
ADDED
@@ -0,0 +1,149 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tests\Mollie\Api\Resources;
|
4 |
+
|
5 |
+
use Mollie\Api\MollieApiClient;
|
6 |
+
use Mollie\Api\Resources\OrderLine;
|
7 |
+
use Mollie\Api\Types\OrderLineStatus;
|
8 |
+
use Mollie\Api\Types\OrderLineType;
|
9 |
+
|
10 |
+
class OrderLineTest extends \PHPUnit\Framework\TestCase
|
11 |
+
{
|
12 |
+
/**
|
13 |
+
* @param string $status
|
14 |
+
* @param string $function
|
15 |
+
* @param boolean $expected_boolean
|
16 |
+
*
|
17 |
+
* @dataProvider dpTestOrderLineStatuses
|
18 |
+
*/
|
19 |
+
public function testOrderLineStatuses($status, $function, $expected_boolean)
|
20 |
+
{
|
21 |
+
$orderLine = new OrderLine($this->createMock(MollieApiClient::class));
|
22 |
+
$orderLine->status = $status;
|
23 |
+
|
24 |
+
$this->assertEquals($expected_boolean, $orderLine->{$function}());
|
25 |
+
}
|
26 |
+
|
27 |
+
/**
|
28 |
+
* @param string $type
|
29 |
+
* @param string $function
|
30 |
+
* @param boolean $expected_boolean
|
31 |
+
*
|
32 |
+
* @dataProvider dpTestOrderLineTypes
|
33 |
+
*/
|
34 |
+
public function testOrderLineTypes($type, $function, $expected_boolean)
|
35 |
+
{
|
36 |
+
$orderLine = new OrderLine($this->createMock(MollieApiClient::class));
|
37 |
+
$orderLine->type = $type;
|
38 |
+
|
39 |
+
$this->assertEquals($expected_boolean, $orderLine->{$function}());
|
40 |
+
}
|
41 |
+
|
42 |
+
public function dpTestOrderLineTypes()
|
43 |
+
{
|
44 |
+
return [
|
45 |
+
[OrderLineType::TYPE_PHYSICAL, "isPhysical", true],
|
46 |
+
[OrderLineType::TYPE_PHYSICAL, "isDiscount", false],
|
47 |
+
[OrderLineType::TYPE_PHYSICAL, "isDigital", false],
|
48 |
+
[OrderLineType::TYPE_PHYSICAL, "isShippingFee", false],
|
49 |
+
[OrderLineType::TYPE_PHYSICAL, "isStoreCredit", false],
|
50 |
+
[OrderLineType::TYPE_PHYSICAL, "isGiftCard", false],
|
51 |
+
[OrderLineType::TYPE_PHYSICAL, "isSurcharge", false],
|
52 |
+
|
53 |
+
[OrderLineType::TYPE_DISCOUNT, "isPhysical", false],
|
54 |
+
[OrderLineType::TYPE_DISCOUNT, "isDiscount", true],
|
55 |
+
[OrderLineType::TYPE_DISCOUNT, "isDigital", false],
|
56 |
+
[OrderLineType::TYPE_DISCOUNT, "isShippingFee", false],
|
57 |
+
[OrderLineType::TYPE_DISCOUNT, "isStoreCredit", false],
|
58 |
+
[OrderLineType::TYPE_DISCOUNT, "isGiftCard", false],
|
59 |
+
[OrderLineType::TYPE_DISCOUNT, "isSurcharge", false],
|
60 |
+
|
61 |
+
[OrderLineType::TYPE_DIGITAL, "isPhysical", false],
|
62 |
+
[OrderLineType::TYPE_DIGITAL, "isDiscount", false],
|
63 |
+
[OrderLineType::TYPE_DIGITAL, "isDigital", true],
|
64 |
+
[OrderLineType::TYPE_DIGITAL, "isShippingFee", false],
|
65 |
+
[OrderLineType::TYPE_DIGITAL, "isStoreCredit", false],
|
66 |
+
[OrderLineType::TYPE_DIGITAL, "isGiftCard", false],
|
67 |
+
[OrderLineType::TYPE_DIGITAL, "isSurcharge", false],
|
68 |
+
|
69 |
+
[OrderLineType::TYPE_SHIPPING_FEE, "isPhysical", false],
|
70 |
+
[OrderLineType::TYPE_SHIPPING_FEE, "isDiscount", false],
|
71 |
+
[OrderLineType::TYPE_SHIPPING_FEE, "isDigital", false],
|
72 |
+
[OrderLineType::TYPE_SHIPPING_FEE, "isShippingFee", true],
|
73 |
+
[OrderLineType::TYPE_SHIPPING_FEE, "isStoreCredit", false],
|
74 |
+
[OrderLineType::TYPE_SHIPPING_FEE, "isGiftCard", false],
|
75 |
+
[OrderLineType::TYPE_SHIPPING_FEE, "isSurcharge", false],
|
76 |
+
|
77 |
+
[OrderLineType::TYPE_STORE_CREDIT, "isPhysical", false],
|
78 |
+
[OrderLineType::TYPE_STORE_CREDIT, "isDiscount", false],
|
79 |
+
[OrderLineType::TYPE_STORE_CREDIT, "isDigital", false],
|
80 |
+
[OrderLineType::TYPE_STORE_CREDIT, "isShippingFee", false],
|
81 |
+
[OrderLineType::TYPE_STORE_CREDIT, "isStoreCredit", true],
|
82 |
+
[OrderLineType::TYPE_STORE_CREDIT, "isGiftCard", false],
|
83 |
+
[OrderLineType::TYPE_STORE_CREDIT, "isSurcharge", false],
|
84 |
+
|
85 |
+
[OrderLineType::TYPE_GIFT_CARD, "isPhysical", false],
|
86 |
+
[OrderLineType::TYPE_GIFT_CARD, "isDiscount", false],
|
87 |
+
[OrderLineType::TYPE_GIFT_CARD, "isDigital", false],
|
88 |
+
[OrderLineType::TYPE_GIFT_CARD, "isShippingFee", false],
|
89 |
+
[OrderLineType::TYPE_GIFT_CARD, "isStoreCredit", false],
|
90 |
+
[OrderLineType::TYPE_GIFT_CARD, "isGiftCard", true],
|
91 |
+
[OrderLineType::TYPE_GIFT_CARD, "isSurcharge", false],
|
92 |
+
|
93 |
+
[OrderLineType::TYPE_SURCHARGE, "isPhysical", false],
|
94 |
+
[OrderLineType::TYPE_SURCHARGE, "isDiscount", false],
|
95 |
+
[OrderLineType::TYPE_SURCHARGE, "isDigital", false],
|
96 |
+
[OrderLineType::TYPE_SURCHARGE, "isShippingFee", false],
|
97 |
+
[OrderLineType::TYPE_SURCHARGE, "isStoreCredit", false],
|
98 |
+
[OrderLineType::TYPE_SURCHARGE, "isGiftCard", false],
|
99 |
+
[OrderLineType::TYPE_SURCHARGE, "isSurcharge", true],
|
100 |
+
];
|
101 |
+
}
|
102 |
+
|
103 |
+
public function dpTestOrderLineStatuses()
|
104 |
+
{
|
105 |
+
return [
|
106 |
+
[OrderLineStatus::STATUS_CREATED, "isCreated", true],
|
107 |
+
[OrderLineStatus::STATUS_CREATED, "isPaid", false],
|
108 |
+
[OrderLineStatus::STATUS_CREATED, "isAuthorized", false],
|
109 |
+
[OrderLineStatus::STATUS_CREATED, "isCanceled", false],
|
110 |
+
[OrderLineStatus::STATUS_CREATED, "isShipping", false],
|
111 |
+
[OrderLineStatus::STATUS_CREATED, "isCompleted", false],
|
112 |
+
|
113 |
+
[OrderLineStatus::STATUS_PAID, "isCreated", false],
|
114 |
+
[OrderLineStatus::STATUS_PAID, "isPaid", true],
|
115 |
+
[OrderLineStatus::STATUS_PAID, "isAuthorized", false],
|
116 |
+
[OrderLineStatus::STATUS_PAID, "isCanceled", false],
|
117 |
+
[OrderLineStatus::STATUS_PAID, "isShipping", false],
|
118 |
+
[OrderLineStatus::STATUS_PAID, "isCompleted", false],
|
119 |
+
|
120 |
+
[OrderLineStatus::STATUS_AUTHORIZED, "isCreated", false],
|
121 |
+
[OrderLineStatus::STATUS_AUTHORIZED, "isPaid", false],
|
122 |
+
[OrderLineStatus::STATUS_AUTHORIZED, "isAuthorized", true],
|
123 |
+
[OrderLineStatus::STATUS_AUTHORIZED, "isCanceled", false],
|
124 |
+
[OrderLineStatus::STATUS_AUTHORIZED, "isShipping", false],
|
125 |
+
[OrderLineStatus::STATUS_AUTHORIZED, "isCompleted", false],
|
126 |
+
|
127 |
+
[OrderLineStatus::STATUS_CANCELED, "isCreated", false],
|
128 |
+
[OrderLineStatus::STATUS_CANCELED, "isPaid", false],
|
129 |
+
[OrderLineStatus::STATUS_CANCELED, "isAuthorized", false],
|
130 |
+
[OrderLineStatus::STATUS_CANCELED, "isCanceled", true],
|
131 |
+
[OrderLineStatus::STATUS_CANCELED, "isShipping", false],
|
132 |
+
[OrderLineStatus::STATUS_CANCELED, "isCompleted", false],
|
133 |
+
|
134 |
+
[OrderLineStatus::STATUS_SHIPPING, "isCreated", false],
|
135 |
+
[OrderLineStatus::STATUS_SHIPPING, "isPaid", false],
|
136 |
+
[OrderLineStatus::STATUS_SHIPPING, "isAuthorized", false],
|
137 |
+
[OrderLineStatus::STATUS_SHIPPING, "isCanceled", false],
|
138 |
+
[OrderLineStatus::STATUS_SHIPPING, "isShipping", true],
|
139 |
+
[OrderLineStatus::STATUS_SHIPPING, "isCompleted", false],
|
140 |
+
|
141 |
+
[OrderLineStatus::STATUS_COMPLETED, "isCreated", false],
|
142 |
+
[OrderLineStatus::STATUS_COMPLETED, "isPaid", false],
|
143 |
+
[OrderLineStatus::STATUS_COMPLETED, "isAuthorized", false],
|
144 |
+
[OrderLineStatus::STATUS_COMPLETED, "isCanceled", false],
|
145 |
+
[OrderLineStatus::STATUS_COMPLETED, "isShipping", false],
|
146 |
+
[OrderLineStatus::STATUS_COMPLETED, "isCompleted", true],
|
147 |
+
];
|
148 |
+
}
|
149 |
+
}
|
includes/mollie-api-php/tests/Mollie/API/Resources/OrderTest.php
ADDED
@@ -0,0 +1,295 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tests\Mollie\Api\Resources;
|
4 |
+
|
5 |
+
use Mollie\Api\MollieApiClient;
|
6 |
+
use Mollie\Api\Resources\Order;
|
7 |
+
use Mollie\Api\Resources\OrderLine;
|
8 |
+
use Mollie\Api\Resources\OrderLineCollection;
|
9 |
+
use Mollie\Api\Types\OrderLineStatus;
|
10 |
+
use Mollie\Api\Types\OrderLineType;
|
11 |
+
use Mollie\Api\Types\OrderStatus;
|
12 |
+
use Tests\Mollie\TestHelpers\AmountObjectTestHelpers;
|
13 |
+
use Tests\Mollie\TestHelpers\LinkObjectTestHelpers;
|
14 |
+
use stdClass;
|
15 |
+
|
16 |
+
class OrderTest extends \PHPUnit\Framework\TestCase
|
17 |
+
{
|
18 |
+
use AmountObjectTestHelpers;
|
19 |
+
use LinkObjectTestHelpers;
|
20 |
+
|
21 |
+
/**
|
22 |
+
* @param string $status
|
23 |
+
* @param string $function
|
24 |
+
* @param boolean $expected_boolean
|
25 |
+
*
|
26 |
+
* @dataProvider dpTestOrderStatuses
|
27 |
+
*/
|
28 |
+
public function testOrderStatuses($status, $function, $expected_boolean)
|
29 |
+
{
|
30 |
+
$order = new Order($this->createMock(MollieApiClient::class));
|
31 |
+
$order->status = $status;
|
32 |
+
|
33 |
+
$this->assertEquals($expected_boolean, $order->{$function}());
|
34 |
+
}
|
35 |
+
|
36 |
+
public function dpTestOrderStatuses()
|
37 |
+
{
|
38 |
+
return [
|
39 |
+
[OrderStatus::STATUS_CREATED, "isCreated", true],
|
40 |
+
[OrderStatus::STATUS_CREATED, "isPaid", false],
|
41 |
+
[OrderStatus::STATUS_CREATED, "isAuthorized", false],
|
42 |
+
[OrderStatus::STATUS_CREATED, "isCanceled", false],
|
43 |
+
[OrderStatus::STATUS_CREATED, "isShipping", false],
|
44 |
+
[OrderStatus::STATUS_CREATED, "isCompleted", false],
|
45 |
+
[OrderStatus::STATUS_CREATED, "isExpired", false],
|
46 |
+
[OrderStatus::STATUS_CREATED, "isPending", false],
|
47 |
+
|
48 |
+
[OrderStatus::STATUS_PAID, "isCreated", false],
|
49 |
+
[OrderStatus::STATUS_PAID, "isPaid", true],
|
50 |
+
[OrderStatus::STATUS_PAID, "isAuthorized", false],
|
51 |
+
[OrderStatus::STATUS_PAID, "isCanceled", false],
|
52 |
+
[OrderStatus::STATUS_PAID, "isShipping", false],
|
53 |
+
[OrderStatus::STATUS_PAID, "isCompleted", false],
|
54 |
+
[OrderStatus::STATUS_PAID, "isExpired", false],
|
55 |
+
[OrderStatus::STATUS_PAID, "isPending", false],
|
56 |
+
|
57 |
+
[OrderStatus::STATUS_AUTHORIZED, "isCreated", false],
|
58 |
+
[OrderStatus::STATUS_AUTHORIZED, "isPaid", false],
|
59 |
+
[OrderStatus::STATUS_AUTHORIZED, "isAuthorized", true],
|
60 |
+
[OrderStatus::STATUS_AUTHORIZED, "isCanceled", false],
|
61 |
+
[OrderStatus::STATUS_AUTHORIZED, "isShipping", false],
|
62 |
+
[OrderStatus::STATUS_AUTHORIZED, "isCompleted", false],
|
63 |
+
[OrderStatus::STATUS_AUTHORIZED, "isExpired", false],
|
64 |
+
[OrderStatus::STATUS_AUTHORIZED, "isPending", false],
|
65 |
+
|
66 |
+
[OrderStatus::STATUS_CANCELED, "isCreated", false],
|
67 |
+
[OrderStatus::STATUS_CANCELED, "isPaid", false],
|
68 |
+
[OrderStatus::STATUS_CANCELED, "isAuthorized", false],
|
69 |
+
[OrderStatus::STATUS_CANCELED, "isCanceled", true],
|
70 |
+
[OrderStatus::STATUS_CANCELED, "isShipping", false],
|
71 |
+
[OrderStatus::STATUS_CANCELED, "isCompleted", false],
|
72 |
+
[OrderStatus::STATUS_CANCELED, "isExpired", false],
|
73 |
+
[OrderStatus::STATUS_CANCELED, "isPending", false],
|
74 |
+
|
75 |
+
[OrderStatus::STATUS_SHIPPING, "isCreated", false],
|
76 |
+
[OrderStatus::STATUS_SHIPPING, "isPaid", false],
|
77 |
+
[OrderStatus::STATUS_SHIPPING, "isAuthorized", false],
|
78 |
+
[OrderStatus::STATUS_SHIPPING, "isCanceled", false],
|
79 |
+
[OrderStatus::STATUS_SHIPPING, "isShipping", true],
|
80 |
+
[OrderStatus::STATUS_SHIPPING, "isCompleted", false],
|
81 |
+
[OrderStatus::STATUS_SHIPPING, "isExpired", false],
|
82 |
+
[OrderStatus::STATUS_SHIPPING, "isPending", false],
|
83 |
+
|
84 |
+
[OrderStatus::STATUS_COMPLETED, "isCreated", false],
|
85 |
+
[OrderStatus::STATUS_COMPLETED, "isPaid", false],
|
86 |
+
[OrderStatus::STATUS_COMPLETED, "isAuthorized", false],
|
87 |
+
[OrderStatus::STATUS_COMPLETED, "isCanceled", false],
|
88 |
+
[OrderStatus::STATUS_COMPLETED, "isShipping", false],
|
89 |
+
[OrderStatus::STATUS_COMPLETED, "isCompleted", true],
|
90 |
+
[OrderStatus::STATUS_COMPLETED, "isExpired", false],
|
91 |
+
[OrderStatus::STATUS_COMPLETED, "isPending", false],
|
92 |
+
|
93 |
+
[OrderStatus::STATUS_EXPIRED, "isCreated", false],
|
94 |
+
[OrderStatus::STATUS_EXPIRED, "isPaid", false],
|
95 |
+
[OrderStatus::STATUS_EXPIRED, "isAuthorized", false],
|
96 |
+
[OrderStatus::STATUS_EXPIRED, "isCanceled", false],
|
97 |
+
[OrderStatus::STATUS_EXPIRED, "isShipping", false],
|
98 |
+
[OrderStatus::STATUS_EXPIRED, "isCompleted", false],
|
99 |
+
[OrderStatus::STATUS_EXPIRED, "isExpired", true],
|
100 |
+
[OrderStatus::STATUS_EXPIRED, "isPending", false],
|
101 |
+
|
102 |
+
[OrderStatus::STATUS_PENDING, "isCreated", false],
|
103 |
+
[OrderStatus::STATUS_PENDING, "isPaid", false],
|
104 |
+
[OrderStatus::STATUS_PENDING, "isAuthorized", false],
|
105 |
+
[OrderStatus::STATUS_PENDING, "isCanceled", false],
|
106 |
+
[OrderStatus::STATUS_PENDING, "isShipping", false],
|
107 |
+
[OrderStatus::STATUS_PENDING, "isCompleted", false],
|
108 |
+
[OrderStatus::STATUS_PENDING, "isExpired", false],
|
109 |
+
[OrderStatus::STATUS_PENDING, "isPending", true],
|
110 |
+
];
|
111 |
+
}
|
112 |
+
|
113 |
+
public function testCanGetLinesAsResourcesOnOrderResource()
|
114 |
+
{
|
115 |
+
$order = new Order($this->createMock(MollieApiClient::class));
|
116 |
+
$orderLine = new stdClass;
|
117 |
+
$lineArray = [
|
118 |
+
'resource' => 'orderline',
|
119 |
+
'id' => 'odl_dgtxyl',
|
120 |
+
'orderId' => 'ord_pbjz8x',
|
121 |
+
'type' => 'physical',
|
122 |
+
'name' => 'LEGO 42083 Bugatti Chiron',
|
123 |
+
'productUrl' => 'https://shop.lego.com/nl-NL/Bugatti-Chiron-42083',
|
124 |
+
'imageUrl' => 'https://sh-s7-live-s.legocdn.com/is/image//LEGO/42083_alt1?$main$',
|
125 |
+
'sku' => '5702016116977',
|
126 |
+
'type' => 'physical',
|
127 |
+
'status' => 'created',
|
128 |
+
'quantity' => 2,
|
129 |
+
'unitPrice' => (object) [
|
130 |
+
'value' => '399.00',
|
131 |
+
'currency' => 'EUR',
|
132 |
+
],
|
133 |
+
'vatRate' => '21.00',
|
134 |
+
'vatAmount' => (object) [
|
135 |
+
'value' => '121.14',
|
136 |
+
'currency' => 'EUR',
|
137 |
+
],
|
138 |
+
'discountAmount' => (object) [
|
139 |
+
'value' => '100.00',
|
140 |
+
'currency' => 'EUR',
|
141 |
+
],
|
142 |
+
'totalAmount' => (object) [
|
143 |
+
'value' => '698.00',
|
144 |
+
'currency' => 'EUR',
|
145 |
+
],
|
146 |
+
'createdAt' => '2018-08-02T09:29:56+00:00',
|
147 |
+
];
|
148 |
+
|
149 |
+
foreach ($lineArray as $key => $value) {
|
150 |
+
$orderLine->{$key} = $value;
|
151 |
+
}
|
152 |
+
|
153 |
+
$order->lines = [$orderLine];
|
154 |
+
|
155 |
+
$lines = $order->lines();
|
156 |
+
|
157 |
+
$this->assertInstanceOf(OrderLineCollection::class, $lines);
|
158 |
+
$this->assertCount(1, $lines);
|
159 |
+
|
160 |
+
$line = $lines[0];
|
161 |
+
|
162 |
+
$this->assertInstanceOf(OrderLine::class, $line);
|
163 |
+
|
164 |
+
$this->assertEquals("orderline", $line->resource);
|
165 |
+
$this->assertEquals("odl_dgtxyl", $line->id);
|
166 |
+
$this->assertEquals('ord_pbjz8x', $line->orderId);
|
167 |
+
$this->assertEquals("LEGO 42083 Bugatti Chiron", $line->name);
|
168 |
+
$this->assertEquals("https://shop.lego.com/nl-NL/Bugatti-Chiron-42083", $line->productUrl);
|
169 |
+
$this->assertEquals('https://sh-s7-live-s.legocdn.com/is/image//LEGO/42083_alt1?$main$', $line->imageUrl);
|
170 |
+
$this->assertEquals("5702016116977", $line->sku);
|
171 |
+
$this->assertEquals(OrderLineType::TYPE_PHYSICAL, $line->type);
|
172 |
+
$this->assertEquals(OrderLineStatus::STATUS_CREATED, $line->status);
|
173 |
+
$this->assertEquals(2, $line->quantity);
|
174 |
+
$this->assertAmountObject("399.00", "EUR", $line->unitPrice);
|
175 |
+
$this->assertEquals("21.00", $line->vatRate);
|
176 |
+
$this->assertAmountObject("121.14", "EUR", $line->vatAmount);
|
177 |
+
$this->assertAmountObject("100.00", "EUR", $line->discountAmount);
|
178 |
+
$this->assertAmountObject("698.00", "EUR", $line->totalAmount);
|
179 |
+
$this->assertEquals("2018-08-02T09:29:56+00:00", $line->createdAt);
|
180 |
+
}
|
181 |
+
|
182 |
+
public function testCanGetPaymentsAsResourcesOnOrderResource()
|
183 |
+
{
|
184 |
+
$order = new Order($this->createMock(MollieApiClient::class));
|
185 |
+
$orderLine = new stdClass;
|
186 |
+
$lineArray = [
|
187 |
+
'resource' => 'orderline',
|
188 |
+
'id' => 'odl_dgtxyl',
|
189 |
+
'orderId' => 'ord_pbjz8x',
|
190 |
+
'type' => 'physical',
|
191 |
+
'name' => 'LEGO 42083 Bugatti Chiron',
|
192 |
+
'productUrl' => 'https://shop.lego.com/nl-NL/Bugatti-Chiron-42083',
|
193 |
+
'imageUrl' => 'https://sh-s7-live-s.legocdn.com/is/image//LEGO/42083_alt1?$main$',
|
194 |
+
'sku' => '5702016116977',
|
195 |
+
'type' => 'physical',
|
196 |
+
'status' => 'created',
|
197 |
+
'quantity' => 2,
|
198 |
+
'unitPrice' => (object) [
|
199 |
+
'value' => '399.00',
|
200 |
+
'currency' => 'EUR',
|
201 |
+
],
|
202 |
+
'vatRate' => '21.00',
|
203 |
+
'vatAmount' => (object) [
|
204 |
+
'value' => '121.14',
|
205 |
+
'currency' => 'EUR',
|
206 |
+
],
|
207 |
+
'discountAmount' => (object) [
|
208 |
+
'value' => '100.00',
|
209 |
+
'currency' => 'EUR',
|
210 |
+
],
|
211 |
+
'totalAmount' => (object) [
|
212 |
+
'value' => '698.00',
|
213 |
+
'currency' => 'EUR',
|
214 |
+
],
|
215 |
+
'createdAt' => '2018-08-02T09:29:56+00:00',
|
216 |
+
];
|
217 |
+
|
218 |
+
foreach ($lineArray as $key => $value) {
|
219 |
+
$orderLine->{$key} = $value;
|
220 |
+
}
|
221 |
+
|
222 |
+
$order->lines = [$orderLine];
|
223 |
+
|
224 |
+
$lines = $order->lines();
|
225 |
+
|
226 |
+
$this->assertInstanceOf(OrderLineCollection::class, $lines);
|
227 |
+
$this->assertCount(1, $lines);
|
228 |
+
|
229 |
+
$line = $lines[0];
|
230 |
+
|
231 |
+
$this->assertInstanceOf(OrderLine::class, $line);
|
232 |
+
|
233 |
+
$this->assertEquals("orderline", $line->resource);
|
234 |
+
$this->assertEquals("odl_dgtxyl", $line->id);
|
235 |
+
$this->assertEquals('ord_pbjz8x', $line->orderId);
|
236 |
+
$this->assertEquals("LEGO 42083 Bugatti Chiron", $line->name);
|
237 |
+
$this->assertEquals("https://shop.lego.com/nl-NL/Bugatti-Chiron-42083", $line->productUrl);
|
238 |
+
$this->assertEquals('https://sh-s7-live-s.legocdn.com/is/image//LEGO/42083_alt1?$main$', $line->imageUrl);
|
239 |
+
$this->assertEquals("5702016116977", $line->sku);
|
240 |
+
$this->assertEquals(OrderLineType::TYPE_PHYSICAL, $line->type);
|
241 |
+
$this->assertEquals(OrderLineStatus::STATUS_CREATED, $line->status);
|
242 |
+
$this->assertEquals(2, $line->quantity);
|
243 |
+
$this->assertAmountObject("399.00", "EUR", $line->unitPrice);
|
244 |
+
$this->assertEquals("21.00", $line->vatRate);
|
245 |
+
$this->assertAmountObject("121.14", "EUR", $line->vatAmount);
|
246 |
+
$this->assertAmountObject("100.00", "EUR", $line->discountAmount);
|
247 |
+
$this->assertAmountObject("698.00", "EUR", $line->totalAmount);
|
248 |
+
$this->assertEquals("2018-08-02T09:29:56+00:00", $line->createdAt);
|
249 |
+
}
|
250 |
+
|
251 |
+
public function testGetCheckoutUrlWorks()
|
252 |
+
{
|
253 |
+
$order = new Order($this->createMock(MollieApiClient::class));
|
254 |
+
$order->_links = $this->getOrderLinksDummy([
|
255 |
+
'checkout' => (object) [
|
256 |
+
'href' => 'https://www.some-mollie-checkout-url.com/123',
|
257 |
+
'type' => 'text/html',
|
258 |
+
]
|
259 |
+
]);
|
260 |
+
|
261 |
+
$this->assertEquals(
|
262 |
+
'https://www.some-mollie-checkout-url.com/123',
|
263 |
+
$order->getCheckoutUrl()
|
264 |
+
);
|
265 |
+
}
|
266 |
+
|
267 |
+
public function testGetCheckoutUrlReturnsNullIfNoCheckoutUrlAvailable()
|
268 |
+
{
|
269 |
+
$order = new Order($this->createMock(MollieApiClient::class));
|
270 |
+
$order->_links = $this->getOrderLinksDummy(['checkout' => null]);
|
271 |
+
|
272 |
+
$this->assertNull($order->getCheckoutUrl());
|
273 |
+
}
|
274 |
+
|
275 |
+
public function testPaymentsHelperReturnsIfNoEmbedAvailable()
|
276 |
+
{
|
277 |
+
$order = new Order($this->createMock(MollieApiClient::class));
|
278 |
+
$this->assertNull($order->payments());
|
279 |
+
}
|
280 |
+
|
281 |
+
public function testPaymentsHelperReturnsIfNoPaymentsEmbedded()
|
282 |
+
{
|
283 |
+
$order = new Order($this->createMock(MollieApiClient::class));
|
284 |
+
$order->_embedded = [];
|
285 |
+
$this->assertNull($order->payments());
|
286 |
+
}
|
287 |
+
|
288 |
+
protected function getOrderLinksDummy($overrides = [])
|
289 |
+
{
|
290 |
+
return (object) array_merge(
|
291 |
+
[],
|
292 |
+
$overrides
|
293 |
+
);
|
294 |
+
}
|
295 |
+
}
|
includes/mollie-api-php/tests/Mollie/API/Resources/PaymentTest.php
ADDED
@@ -0,0 +1,212 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tests\Mollie\Api\Resources;
|
4 |
+
|
5 |
+
use Mollie\Api\MollieApiClient;
|
6 |
+
use Mollie\Api\Resources\Payment;
|
7 |
+
use Mollie\Api\Types\PaymentStatus;
|
8 |
+
use Mollie\Api\Types\SequenceType;
|
9 |
+
use stdClass;
|
10 |
+
|
11 |
+
class PaymentTest extends \PHPUnit\Framework\TestCase
|
12 |
+
{
|
13 |
+
/**
|
14 |
+
* @param string $status
|
15 |
+
* @param string $function
|
16 |
+
* @param boolean $expected_boolean
|
17 |
+
*
|
18 |
+
* @dataProvider dpTestPaymentStatuses
|
19 |
+
*/
|
20 |
+
public function testPaymentStatuses($status, $function, $expected_boolean)
|
21 |
+
{
|
22 |
+
$payment = new Payment($this->createMock(MollieApiClient::class));
|
23 |
+
$payment->status = $status;
|
24 |
+
|
25 |
+
$this->assertEquals($expected_boolean, $payment->{$function}());
|
26 |
+
}
|
27 |
+
|
28 |
+
public function dpTestPaymentStatuses()
|
29 |
+
{
|
30 |
+
return [
|
31 |
+
[PaymentStatus::STATUS_PENDING, "isPending", true],
|
32 |
+
[PaymentStatus::STATUS_PENDING, "isAuthorized", false],
|
33 |
+
[PaymentStatus::STATUS_PENDING, "isFailed", false],
|
34 |
+
[PaymentStatus::STATUS_PENDING, "isOpen", false],
|
35 |
+
[PaymentStatus::STATUS_PENDING, "isCanceled", false],
|
36 |
+
[PaymentStatus::STATUS_PENDING, "isPaid", false],
|
37 |
+
[PaymentStatus::STATUS_PENDING, "isExpired", false],
|
38 |
+
|
39 |
+
[PaymentStatus::STATUS_AUTHORIZED, "isPending", false],
|
40 |
+
[PaymentStatus::STATUS_AUTHORIZED, "isAuthorized", true],
|
41 |
+
[PaymentStatus::STATUS_AUTHORIZED, "isFailed", false],
|
42 |
+
[PaymentStatus::STATUS_AUTHORIZED, "isOpen", false],
|
43 |
+
[PaymentStatus::STATUS_AUTHORIZED, "isCanceled", false],
|
44 |
+
[PaymentStatus::STATUS_AUTHORIZED, "isPaid", false],
|
45 |
+
[PaymentStatus::STATUS_AUTHORIZED, "isExpired", false],
|
46 |
+
|
47 |
+
[PaymentStatus::STATUS_FAILED, "isPending", false],
|
48 |
+
[PaymentStatus::STATUS_FAILED, "isAuthorized", false],
|
49 |
+
[PaymentStatus::STATUS_FAILED, "isFailed", true],
|
50 |
+
[PaymentStatus::STATUS_FAILED, "isOpen", false],
|
51 |
+
[PaymentStatus::STATUS_FAILED, "isCanceled", false],
|
52 |
+
[PaymentStatus::STATUS_FAILED, "isPaid", false],
|
53 |
+
[PaymentStatus::STATUS_FAILED, "isExpired", false],
|
54 |
+
|
55 |
+
[PaymentStatus::STATUS_OPEN, "isPending", false],
|
56 |
+
[PaymentStatus::STATUS_OPEN, "isAuthorized", false],
|
57 |
+
[PaymentStatus::STATUS_OPEN, "isFailed", false],
|
58 |
+
[PaymentStatus::STATUS_OPEN, "isOpen", true],
|
59 |
+
[PaymentStatus::STATUS_OPEN, "isCanceled", false],
|
60 |
+
[PaymentStatus::STATUS_OPEN, "isPaid", false],
|
61 |
+
[PaymentStatus::STATUS_OPEN, "isExpired", false],
|
62 |
+
|
63 |
+
[PaymentStatus::STATUS_CANCELED, "isPending", false],
|
64 |
+
[PaymentStatus::STATUS_CANCELED, "isAuthorized", false],
|
65 |
+
[PaymentStatus::STATUS_CANCELED, "isFailed", false],
|
66 |
+
[PaymentStatus::STATUS_CANCELED, "isOpen", false],
|
67 |
+
[PaymentStatus::STATUS_CANCELED, "isCanceled", true],
|
68 |
+
[PaymentStatus::STATUS_CANCELED, "isPaid", false],
|
69 |
+
[PaymentStatus::STATUS_CANCELED, "isExpired", false],
|
70 |
+
|
71 |
+
[PaymentStatus::STATUS_EXPIRED, "isPending", false],
|
72 |
+
[PaymentStatus::STATUS_EXPIRED, "isAuthorized", false],
|
73 |
+
[PaymentStatus::STATUS_EXPIRED, "isFailed", false],
|
74 |
+
[PaymentStatus::STATUS_EXPIRED, "isOpen", false],
|
75 |
+
[PaymentStatus::STATUS_EXPIRED, "isCanceled", false],
|
76 |
+
[PaymentStatus::STATUS_EXPIRED, "isPaid", false],
|
77 |
+
[PaymentStatus::STATUS_EXPIRED, "isExpired", true],
|
78 |
+
];
|
79 |
+
}
|
80 |
+
|
81 |
+
public function testIsPaidReturnsTrueWhenPaidDatetimeIsSet()
|
82 |
+
{
|
83 |
+
$payment = new Payment($this->createMock(MollieApiClient::class));
|
84 |
+
|
85 |
+
$payment->paidAt = "2016-10-24";
|
86 |
+
$this->assertTrue($payment->isPaid());
|
87 |
+
}
|
88 |
+
|
89 |
+
public function testHasRefundsReturnsTrueWhenPaymentHasRefunds()
|
90 |
+
{
|
91 |
+
$payment = new Payment($this->createMock(MollieApiClient::class));
|
92 |
+
|
93 |
+
$payment->_links = new stdClass();
|
94 |
+
$payment->_links->refunds = (object) ["href" => "https://api.mollie.com/v2/payments/tr_44aKxzEbr8/refunds", "type" => "application/hal+json"];
|
95 |
+
|
96 |
+
$this->assertTrue($payment->hasRefunds());
|
97 |
+
}
|
98 |
+
|
99 |
+
public function testHasRefundsReturnsFalseWhenPaymentHasNoRefunds()
|
100 |
+
{
|
101 |
+
$payment = new Payment($this->createMock(MollieApiClient::class));
|
102 |
+
|
103 |
+
$payment->_links = new stdClass();
|
104 |
+
$this->assertFalse($payment->hasRefunds());
|
105 |
+
}
|
106 |
+
|
107 |
+
public function testHasChargedbacksReturnsTrueWhenPaymentHasChargebacks()
|
108 |
+
{
|
109 |
+
$payment = new Payment($this->createMock(MollieApiClient::class));
|
110 |
+
|
111 |
+
$payment->_links = new stdClass();
|
112 |
+
$payment->_links->chargebacks = (object) ["href" => "https://api.mollie.com/v2/payments/tr_44aKxzEbr8/chargebacks", "type" => "application/hal+json"];
|
113 |
+
|
114 |
+
$this->assertTrue($payment->hasChargebacks());
|
115 |
+
}
|
116 |
+
|
117 |
+
public function testHasChargedbacksReturnsFalseWhenPaymentHasNoChargebacks()
|
118 |
+
{
|
119 |
+
$payment = new Payment($this->createMock(MollieApiClient::class));
|
120 |
+
|
121 |
+
$payment->_links = new stdClass();
|
122 |
+
$this->assertFalse($payment->hasChargebacks());
|
123 |
+
}
|
124 |
+
|
125 |
+
public function testHasRecurringTypeReturnsTrueWhenRecurringTypeIsFirst()
|
126 |
+
{
|
127 |
+
$payment = new Payment($this->createMock(MollieApiClient::class));
|
128 |
+
|
129 |
+
$payment->sequenceType = SequenceType::SEQUENCETYPE_FIRST;
|
130 |
+
$this->assertFalse($payment->hasSequenceTypeRecurring());
|
131 |
+
$this->assertTrue($payment->hasSequenceTypeFirst());
|
132 |
+
}
|
133 |
+
|
134 |
+
public function testHasRecurringTypeReturnsTrueWhenRecurringTypeIsRecurring()
|
135 |
+
{
|
136 |
+
$payment = new Payment($this->createMock(MollieApiClient::class));
|
137 |
+
|
138 |
+
$payment->sequenceType = SequenceType::SEQUENCETYPE_RECURRING;
|
139 |
+
$this->assertTrue($payment->hasSequenceTypeRecurring());
|
140 |
+
$this->assertFalse($payment->hasSequenceTypeFirst());
|
141 |
+
}
|
142 |
+
|
143 |
+
public function testHasRecurringTypeReturnsFalseWhenRecurringTypeIsNone()
|
144 |
+
{
|
145 |
+
$payment = new Payment($this->createMock(MollieApiClient::class));
|
146 |
+
|
147 |
+
$payment->sequenceType = SequenceType::SEQUENCETYPE_ONEOFF;
|
148 |
+
$this->assertFalse($payment->hasSequenceTypeFirst());
|
149 |
+
$this->assertFalse($payment->hasSequenceTypeRecurring());
|
150 |
+
}
|
151 |
+
|
152 |
+
public function testGetCheckoutUrlReturnsPaymentUrlFromLinksObject()
|
153 |
+
{
|
154 |
+
$payment = new Payment($this->createMock(MollieApiClient::class));
|
155 |
+
|
156 |
+
$payment->_links = new stdClass();
|
157 |
+
$payment->_links->checkout = new stdClass();
|
158 |
+
$payment->_links->checkout->href = "https://example.com";
|
159 |
+
|
160 |
+
$this->assertSame($payment->getCheckoutUrl(), "https://example.com");
|
161 |
+
}
|
162 |
+
|
163 |
+
public function testCanBeRefundedReturnsTrueWhenAmountRemainingIsSet()
|
164 |
+
{
|
165 |
+
$payment = new Payment($this->createMock(MollieApiClient::class));
|
166 |
+
|
167 |
+
$payment->amountRemaining = 15;
|
168 |
+
$this->assertTrue($payment->canBeRefunded());
|
169 |
+
$this->assertTrue($payment->canBePartiallyRefunded());
|
170 |
+
}
|
171 |
+
|
172 |
+
public function testCanBeRefundedReturnsFalseWhenAmountRemainingIsNull()
|
173 |
+
{
|
174 |
+
$payment = new Payment($this->createMock(MollieApiClient::class));
|
175 |
+
|
176 |
+
$payment->amountRemaining = null;
|
177 |
+
$this->assertFalse($payment->canBeRefunded());
|
178 |
+
$this->assertFalse($payment->canBePartiallyRefunded());
|
179 |
+
}
|
180 |
+
|
181 |
+
public function testGetAmountRefundedReturnsAmountRefundedAsFloat()
|
182 |
+
{
|
183 |
+
$payment = new Payment($this->createMock(MollieApiClient::class));
|
184 |
+
|
185 |
+
$payment->amountRefunded = (object)["value" => 22.0, "currency" => "EUR"];
|
186 |
+
self::assertSame(22.0, $payment->getAmountRefunded());
|
187 |
+
}
|
188 |
+
|
189 |
+
public function testGetAmountRefundedReturns0WhenAmountRefundedIsSetToNull()
|
190 |
+
{
|
191 |
+
$payment = new Payment($this->createMock(MollieApiClient::class));
|
192 |
+
|
193 |
+
$payment->amountRefunded = null;
|
194 |
+
self::assertSame(0.0, $payment->getAmountRefunded());
|
195 |
+
}
|
196 |
+
|
197 |
+
public function testGetAmountRemainingReturnsAmountRemainingAsFloat()
|
198 |
+
{
|
199 |
+
$payment = new Payment($this->createMock(MollieApiClient::class));
|
200 |
+
|
201 |
+
$payment->amountRemaining = (object)["value" => 22.0, "currency" => "EUR"];
|
202 |
+
self::assertSame(22.0, $payment->getAmountRemaining());
|
203 |
+
}
|
204 |
+
|
205 |
+
public function testGetAmountRemainingReturns0WhenAmountRemainingIsSetToNull()
|
206 |
+
{
|
207 |
+
$payment = new Payment($this->createMock(MollieApiClient::class));
|
208 |
+
|
209 |
+
$payment->amountRefunded = null;
|
210 |
+
self::assertSame(0.0, $payment->getAmountRemaining());
|
211 |
+
}
|
212 |
+
}
|
includes/mollie-api-php/tests/Mollie/API/Resources/ProfileTest.php
ADDED
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tests\Mollie\Api\Resources;
|
4 |
+
|
5 |
+
use Mollie\Api\MollieApiClient;
|
6 |
+
use Mollie\Api\Resources\Profile;
|
7 |
+
use Mollie\Api\Types\ProfileStatus;
|
8 |
+
|
9 |
+
class ProfileTest extends \PHPUnit\Framework\TestCase
|
10 |
+
{
|
11 |
+
/**
|
12 |
+
* @param string $status
|
13 |
+
* @param string $function
|
14 |
+
* @param boolean $expected_boolean
|
15 |
+
*
|
16 |
+
* @dataProvider dpTestProfileStatusses
|
17 |
+
*/
|
18 |
+
public function testProfileStatusses($status, $function, $expected_boolean)
|
19 |
+
{
|
20 |
+
$profile = new Profile($this->createMock(MollieApiClient::class));
|
21 |
+
$profile->status = $status;
|
22 |
+
|
23 |
+
$this->assertEquals($expected_boolean, $profile->{$function}());
|
24 |
+
}
|
25 |
+
|
26 |
+
public function dpTestProfileStatusses()
|
27 |
+
{
|
28 |
+
return [
|
29 |
+
[ProfileStatus::STATUS_BLOCKED, "isBlocked", true],
|
30 |
+
[ProfileStatus::STATUS_BLOCKED, "isVerified", false],
|
31 |
+
[ProfileStatus::STATUS_BLOCKED, "isUnverified", false],
|
32 |
+
|
33 |
+
[ProfileStatus::STATUS_VERIFIED, "isBlocked", false],
|
34 |
+
[ProfileStatus::STATUS_VERIFIED, "isVerified", true],
|
35 |
+
[ProfileStatus::STATUS_VERIFIED, "isUnverified", false],
|
36 |
+
|
37 |
+
[ProfileStatus::STATUS_UNVERIFIED, "isBlocked", false],
|
38 |
+
[ProfileStatus::STATUS_UNVERIFIED, "isVerified", false],
|
39 |
+
[ProfileStatus::STATUS_UNVERIFIED, "isUnverified", true],
|
40 |
+
];
|
41 |
+
}
|
42 |
+
}
|
includes/mollie-api-php/tests/Mollie/API/Resources/RefundTest.php
ADDED
@@ -0,0 +1,50 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tests\Mollie\Api\Resources;
|
4 |
+
|
5 |
+
use Mollie\Api\MollieApiClient;
|
6 |
+
use Mollie\Api\Resources\Refund;
|
7 |
+
use Mollie\Api\Types\RefundStatus;
|
8 |
+
|
9 |
+
class RefundTest extends \PHPUnit\Framework\TestCase
|
10 |
+
{
|
11 |
+
/**
|
12 |
+
* @param string $status
|
13 |
+
* @param string $function
|
14 |
+
* @param boolean $expected_boolean
|
15 |
+
*
|
16 |
+
* @dataProvider dpTestRefundStatuses
|
17 |
+
*/
|
18 |
+
public function testRefundStatuses($status, $function, $expected_boolean)
|
19 |
+
{
|
20 |
+
$refund = new Refund($this->createMock(MollieApiClient::class));
|
21 |
+
$refund->status = $status;
|
22 |
+
|
23 |
+
$this->assertEquals($expected_boolean, $refund->{$function}());
|
24 |
+
}
|
25 |
+
|
26 |
+
public function dpTestRefundStatuses()
|
27 |
+
{
|
28 |
+
return [
|
29 |
+
[RefundStatus::STATUS_PENDING, "isPending", true],
|
30 |
+
[RefundStatus::STATUS_PENDING, "isProcessing", false],
|
31 |
+
[RefundStatus::STATUS_PENDING, "isQueued", false],
|
32 |
+
[RefundStatus::STATUS_PENDING, "isTransferred", false],
|
33 |
+
|
34 |
+
[RefundStatus::STATUS_PROCESSING, "isPending", false],
|
35 |
+
[RefundStatus::STATUS_PROCESSING, "isProcessing", true],
|
36 |
+
[RefundStatus::STATUS_PROCESSING, "isQueued", false],
|
37 |
+
[RefundStatus::STATUS_PROCESSING, "isTransferred", false],
|
38 |
+
|
39 |
+
[RefundStatus::STATUS_QUEUED, "isPending", false],
|
40 |
+
[RefundStatus::STATUS_QUEUED, "isProcessing", false],
|
41 |
+
[RefundStatus::STATUS_QUEUED, "isQueued", true],
|
42 |
+
[RefundStatus::STATUS_QUEUED, "isTransferred", false],
|
43 |
+
|
44 |
+
[RefundStatus::STATUS_REFUNDED, "isPending", false],
|
45 |
+
[RefundStatus::STATUS_REFUNDED, "isProcessing", false],
|
46 |
+
[RefundStatus::STATUS_REFUNDED, "isQueued", false],
|
47 |
+
[RefundStatus::STATUS_REFUNDED, "isTransferred", true],
|
48 |
+
];
|
49 |
+
}
|
50 |
+
}
|
includes/mollie-api-php/tests/Mollie/API/Resources/ResourceFactoryTest.php
ADDED
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tests\Mollie\Api\Resources;
|
4 |
+
|
5 |
+
|
6 |
+
use Mollie\Api\MollieApiClient;
|
7 |
+
use Mollie\Api\Resources\Payment;
|
8 |
+
use Mollie\Api\Resources\ResourceFactory;
|
9 |
+
|
10 |
+
class ResourceFactoryTest extends \PHPUnit\Framework\TestCase
|
11 |
+
{
|
12 |
+
public function testCreateFromApiResponseWorks()
|
13 |
+
{
|
14 |
+
$apiResult = json_decode('{
|
15 |
+
"resource":"payment",
|
16 |
+
"id":"tr_44aKxzEbr8",
|
17 |
+
"mode":"test",
|
18 |
+
"createdAt":"2018-03-13T14:02:29+00:00",
|
19 |
+
"amount":{
|
20 |
+
"value":"20.00",
|
21 |
+
"currency":"EUR"
|
22 |
+
}
|
23 |
+
}');
|
24 |
+
|
25 |
+
$payment = ResourceFactory::createFromApiResult($apiResult, new Payment($this->createMock(MollieApiClient::class)));
|
26 |
+
|
27 |
+
$this->assertInstanceOf(Payment::class, $payment);
|
28 |
+
$this->assertEquals("payment", $payment->resource);
|
29 |
+
$this->assertEquals("tr_44aKxzEbr8", $payment->id);
|
30 |
+
$this->assertEquals("test", $payment->mode);
|
31 |
+
$this->assertEquals("2018-03-13T14:02:29+00:00", $payment->createdAt);
|
32 |
+
$this->assertEquals((object) ["value" => "20.00", "currency" => "EUR"], $payment->amount);
|
33 |
+
}
|
34 |
+
}
|
includes/mollie-api-php/tests/Mollie/API/Resources/SettlementTest.php
ADDED
@@ -0,0 +1,50 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tests\Mollie\Api\Resources;
|
4 |
+
|
5 |
+
use Mollie\Api\MollieApiClient;
|
6 |
+
use Mollie\Api\Resources\Settlement;
|
7 |
+
use Mollie\Api\Types\SettlementStatus;
|
8 |
+
|
9 |
+
class SettlementTest extends \PHPUnit\Framework\TestCase
|
10 |
+
{
|
11 |
+
/**
|
12 |
+
* @param string $status
|
13 |
+
* @param string $function
|
14 |
+
* @param boolean $expected_boolean
|
15 |
+
*
|
16 |
+
* @dataProvider dpTestSettlementStatuses
|
17 |
+
*/
|
18 |
+
public function testSettlementStatuses($status, $function, $expected_boolean)
|
19 |
+
{
|
20 |
+
$settlement = new Settlement($this->createMock(MollieApiClient::class));
|
21 |
+
$settlement->status = $status;
|
22 |
+
|
23 |
+
$this->assertEquals($expected_boolean, $settlement->{$function}());
|
24 |
+
}
|
25 |
+
|
26 |
+
public function dpTestSettlementStatuses()
|
27 |
+
{
|
28 |
+
return [
|
29 |
+
[SettlementStatus::STATUS_PENDING, "isPending", true],
|
30 |
+
[SettlementStatus::STATUS_PENDING, "isOpen", false],
|
31 |
+
[SettlementStatus::STATUS_PENDING, "isPaidout", false],
|
32 |
+
[SettlementStatus::STATUS_PENDING, "isFailed", false],
|
33 |
+
|
34 |
+
[SettlementStatus::STATUS_OPEN, "isPending", false],
|
35 |
+
[SettlementStatus::STATUS_OPEN, "isOpen", true],
|
36 |
+
[SettlementStatus::STATUS_OPEN, "isPaidout", false],
|
37 |
+
[SettlementStatus::STATUS_OPEN, "isFailed", false],
|
38 |
+
|
39 |
+
[SettlementStatus::STATUS_PAIDOUT, "isPending", false],
|
40 |
+
[SettlementStatus::STATUS_PAIDOUT, "isOpen", false],
|
41 |
+
[SettlementStatus::STATUS_PAIDOUT, "isPaidout", true],
|
42 |
+
[SettlementStatus::STATUS_PAIDOUT, "isFailed", false],
|
43 |
+
|
44 |
+
[SettlementStatus::STATUS_FAILED, "isPending", false],
|
45 |
+
[SettlementStatus::STATUS_FAILED, "isOpen", false],
|
46 |
+
[SettlementStatus::STATUS_FAILED, "isPaidout", false],
|
47 |
+
[SettlementStatus::STATUS_FAILED, "isFailed", true],
|
48 |
+
];
|
49 |
+
}
|
50 |
+
}
|
includes/mollie-api-php/tests/Mollie/API/Resources/ShipmentTest.php
ADDED
@@ -0,0 +1,84 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tests\Mollie\Api\Resources;
|
4 |
+
|
5 |
+
use Mollie\Api\MollieApiClient;
|
6 |
+
use Mollie\Api\Resources\Shipment;
|
7 |
+
use PHPUnit\Framework\TestCase;
|
8 |
+
|
9 |
+
class ShipmentTest extends TestCase
|
10 |
+
{
|
11 |
+
public function testHasTrackingReturnsTrueIfObjectNotNull()
|
12 |
+
{
|
13 |
+
$shipment = new Shipment($this->createMock(MollieApiClient::class));
|
14 |
+
$shipment->tracking = $this->getTrackingDummy();
|
15 |
+
$this->assertTrue($shipment->hasTracking());
|
16 |
+
}
|
17 |
+
|
18 |
+
public function testHasTrackingReturnsFalseIfObjectIsNull()
|
19 |
+
{
|
20 |
+
$shipment = new Shipment($this->createMock(MollieApiClient::class));
|
21 |
+
$shipment->tracking = null;
|
22 |
+
$this->assertFalse($shipment->hasTracking());
|
23 |
+
}
|
24 |
+
|
25 |
+
public function testHasTrackingUrlReturnsFalseIfTrackingIsNotSet()
|
26 |
+
{
|
27 |
+
$shipment = new Shipment($this->createMock(MollieApiClient::class));
|
28 |
+
$shipment->tracking = null;
|
29 |
+
$this->assertFalse($shipment->hasTrackingUrl());
|
30 |
+
}
|
31 |
+
|
32 |
+
public function testHasTrackingUrlReturnsTrueIfUrlIsSet()
|
33 |
+
{
|
34 |
+
$shipment = new Shipment($this->createMock(MollieApiClient::class));
|
35 |
+
$shipment->tracking = $this->getTrackingDummy([
|
36 |
+
'url' => 'https://www.some-tracking-url.com/123',
|
37 |
+
]);
|
38 |
+
$this->assertTrue($shipment->hasTrackingUrl());
|
39 |
+
}
|
40 |
+
|
41 |
+
public function testHasTrackingUrlReturnsFalseIfUrlIsNotSet()
|
42 |
+
{
|
43 |
+
$shipment = new Shipment($this->createMock(MollieApiClient::class));
|
44 |
+
$shipment->tracking = $this->getTrackingDummy([
|
45 |
+
'url' => null,
|
46 |
+
]);
|
47 |
+
$this->assertFalse($shipment->hasTrackingUrl());
|
48 |
+
}
|
49 |
+
|
50 |
+
public function testGetTrackingUrlReturnsNullIfNotAvailable()
|
51 |
+
{
|
52 |
+
$shipment = new Shipment($this->createMock(MollieApiClient::class));
|
53 |
+
|
54 |
+
$shipment->tracking = null;
|
55 |
+
$this->assertNull($shipment->getTrackingUrl());
|
56 |
+
|
57 |
+
$shipment->tracking = $this->getTrackingDummy([
|
58 |
+
'url' => null,
|
59 |
+
]);
|
60 |
+
$this->assertNull($shipment->getTrackingUrl());
|
61 |
+
}
|
62 |
+
|
63 |
+
public function testGetTrackingUrlReturnsUrlIfAvailable()
|
64 |
+
{
|
65 |
+
$shipment = new Shipment($this->createMock(MollieApiClient::class));
|
66 |
+
$shipment->tracking = $this->getTrackingDummy([
|
67 |
+
'url' => 'https://www.some-tracking-url.com/123',
|
68 |
+
]);
|
69 |
+
|
70 |
+
$this->assertEquals(
|
71 |
+
'https://www.some-tracking-url.com/123',
|
72 |
+
$shipment->getTrackingUrl()
|
73 |
+
);
|
74 |
+
}
|
75 |
+
|
76 |
+
protected function getTrackingDummy($overrides = [])
|
77 |
+
{
|
78 |
+
return (object) array_merge([
|
79 |
+
'carrier' => 'DummyCarrier',
|
80 |
+
'code' => '123456ABCD',
|
81 |
+
'url' => 'https://www.example.org/tracktrace/1234',
|
82 |
+
], $overrides);
|
83 |
+
}
|
84 |
+
}
|
includes/mollie-api-php/tests/Mollie/API/Resources/SubscriptionTest.php
ADDED
@@ -0,0 +1,60 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tests\Mollie\Api\Resources;
|
4 |
+
|
5 |
+
use Mollie\Api\MollieApiClient;
|
6 |
+
use Mollie\Api\Resources\Subscription;
|
7 |
+
use Mollie\Api\Types\SubscriptionStatus;
|
8 |
+
|
9 |
+
class SubscriptionTest extends \PHPUnit\Framework\TestCase
|
10 |
+
{
|
11 |
+
/**
|
12 |
+
* @param string $status
|
13 |
+
* @param string $function
|
14 |
+
* @param boolean $expected_boolean
|
15 |
+
*
|
16 |
+
* @dataProvider dpTestSubscriptionStatuses
|
17 |
+
*/
|
18 |
+
public function testSubscriptionStatuses($status, $function, $expected_boolean)
|
19 |
+
{
|
20 |
+
$subscription = new Subscription($this->createMock(MollieApiClient::class));
|
21 |
+
$subscription->status = $status;
|
22 |
+
|
23 |
+
$this->assertEquals($expected_boolean, $subscription->{$function}());
|
24 |
+
}
|
25 |
+
|
26 |
+
public function dpTestSubscriptionStatuses()
|
27 |
+
{
|
28 |
+
return [
|
29 |
+
[SubscriptionStatus::STATUS_PENDING, "isPending", true],
|
30 |
+
[SubscriptionStatus::STATUS_PENDING, "isCanceled", false],
|
31 |
+
[SubscriptionStatus::STATUS_PENDING, "isCompleted", false],
|
32 |
+
[SubscriptionStatus::STATUS_PENDING, "isSuspended", false],
|
33 |
+
[SubscriptionStatus::STATUS_PENDING, "isActive", false],
|
34 |
+
|
35 |
+
[SubscriptionStatus::STATUS_CANCELED, "isPending", false],
|
36 |
+
[SubscriptionStatus::STATUS_CANCELED, "isCanceled", true],
|
37 |
+
[SubscriptionStatus::STATUS_CANCELED, "isCompleted", false],
|
38 |
+
[SubscriptionStatus::STATUS_CANCELED, "isSuspended", false],
|
39 |
+
[SubscriptionStatus::STATUS_CANCELED, "isActive", false],
|
40 |
+
|
41 |
+
[SubscriptionStatus::STATUS_COMPLETED, "isPending", false],
|
42 |
+
[SubscriptionStatus::STATUS_COMPLETED, "isCanceled", false],
|
43 |
+
[SubscriptionStatus::STATUS_COMPLETED, "isCompleted", true],
|
44 |
+
[SubscriptionStatus::STATUS_COMPLETED, "isSuspended", false],
|
45 |
+
[SubscriptionStatus::STATUS_COMPLETED, "isActive", false],
|
46 |
+
|
47 |
+
[SubscriptionStatus::STATUS_SUSPENDED, "isPending", false],
|
48 |
+
[SubscriptionStatus::STATUS_SUSPENDED, "isCanceled", false],
|
49 |
+
[SubscriptionStatus::STATUS_SUSPENDED, "isCompleted", false],
|
50 |
+
[SubscriptionStatus::STATUS_SUSPENDED, "isSuspended", true],
|
51 |
+
[SubscriptionStatus::STATUS_SUSPENDED, "isActive", false],
|
52 |
+
|
53 |
+
[SubscriptionStatus::STATUS_ACTIVE, "isPending", false],
|
54 |
+
[SubscriptionStatus::STATUS_ACTIVE, "isCanceled", false],
|
55 |
+
[SubscriptionStatus::STATUS_ACTIVE, "isCompleted", false],
|
56 |
+
[SubscriptionStatus::STATUS_ACTIVE, "isSuspended", false],
|
57 |
+
[SubscriptionStatus::STATUS_ACTIVE, "isActive", true],
|
58 |
+
];
|
59 |
+
}
|
60 |
+
}
|
includes/mollie-api-php/tests/Mollie/API/Types/MandateMethodTest.php
ADDED
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tests\Mollie\API\Types;
|
4 |
+
|
5 |
+
use Mollie\Api\Types\MandateMethod;
|
6 |
+
use Mollie\Api\Types\PaymentMethod;
|
7 |
+
use PHPUnit\Framework\TestCase;
|
8 |
+
|
9 |
+
class MandateMethodTest extends TestCase
|
10 |
+
{
|
11 |
+
/**
|
12 |
+
* @param string $firstPaymentMethod
|
13 |
+
* @param string $expectedMethod
|
14 |
+
* @dataProvider dpTestGetForFirstPaymentMethod
|
15 |
+
*/
|
16 |
+
public function testGetForFirstPaymentMethod($firstPaymentMethod, $expectedMethod)
|
17 |
+
{
|
18 |
+
$actualMethod = MandateMethod::getForFirstPaymentMethod($firstPaymentMethod);
|
19 |
+
$this->assertEquals($expectedMethod, $actualMethod);
|
20 |
+
}
|
21 |
+
|
22 |
+
public function dpTestGetForFirstPaymentMethod()
|
23 |
+
{
|
24 |
+
return [
|
25 |
+
[PaymentMethod::APPLEPAY, MandateMethod::CREDITCARD],
|
26 |
+
[PaymentMethod::CREDITCARD, MandateMethod::CREDITCARD],
|
27 |
+
[PaymentMethod::BANCONTACT, MandateMethod::DIRECTDEBIT],
|
28 |
+
[PaymentMethod::BELFIUS, MandateMethod::DIRECTDEBIT],
|
29 |
+
[PaymentMethod::EPS, MandateMethod::DIRECTDEBIT],
|
30 |
+
[PaymentMethod::GIROPAY, MandateMethod::DIRECTDEBIT],
|
31 |
+
[PaymentMethod::IDEAL, MandateMethod::DIRECTDEBIT],
|
32 |
+
[PaymentMethod::INGHOMEPAY, MandateMethod::DIRECTDEBIT],
|
33 |
+
[PaymentMethod::KBC, MandateMethod::DIRECTDEBIT],
|
34 |
+
[PaymentMethod::SOFORT, MandateMethod::DIRECTDEBIT],
|
35 |
+
];
|
36 |
+
}
|
37 |
+
}
|
includes/mollie-api-php/tests/Mollie/TestHelpers/AmountObjectTestHelpers.php
ADDED
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tests\Mollie\TestHelpers;
|
4 |
+
|
5 |
+
trait AmountObjectTestHelpers
|
6 |
+
{
|
7 |
+
protected function assertAmountObject($value, $currency, $amountObject)
|
8 |
+
{
|
9 |
+
return $this->assertEquals(
|
10 |
+
$this->createAmountObject($value, $currency),
|
11 |
+
$amountObject
|
12 |
+
);
|
13 |
+
}
|
14 |
+
|
15 |
+
protected function createAmountObject($value, $currency)
|
16 |
+
{
|
17 |
+
return (object) [
|
18 |
+
'value' => $value,
|
19 |
+
'currency' => $currency,
|
20 |
+
];
|
21 |
+
}
|
22 |
+
}
|
includes/mollie-api-php/tests/Mollie/TestHelpers/LinkObjectTestHelpers.php
ADDED
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
namespace Tests\Mollie\TestHelpers;
|
4 |
+
|
5 |
+
trait LinkObjectTestHelpers
|
6 |
+
{
|
7 |
+
protected function assertLinkObject($href, $type, $linkObject)
|
8 |
+
{
|
9 |
+
return $this->assertEquals(
|
10 |
+
$this->createLinkObject($href, $type),
|
11 |
+
$linkObject
|
12 |
+
);
|
13 |
+
}
|
14 |
+
|
15 |
+
protected function createNamedLinkObject($name, $href, $type)
|
16 |
+
{
|
17 |
+
return (object) [
|
18 |
+
$name => $this->createLinkObject($href, $type),
|
19 |
+
];
|
20 |
+
}
|
21 |
+
|
22 |
+
protected function createLinkObject($href, $type)
|
23 |
+
{
|
24 |
+
return (object) [
|
25 |
+
'href' => $href,
|
26 |
+
'type' => $type,
|
27 |
+
];
|
28 |
+
}
|
29 |
+
}
|
includes/mollie-api-php/vendor/autoload.php
CHANGED
@@ -4,4 +4,4 @@
|
|
4 |
|
5 |
require_once __DIR__ . '/composer/autoload_real.php';
|
6 |
|
7 |
-
return
|
4 |
|
5 |
require_once __DIR__ . '/composer/autoload_real.php';
|
6 |
|
7 |
+
return ComposerAutoloaderInitbadbc7c27712fe1126301394a10557db::getLoader();
|
includes/mollie-api-php/vendor/composer/autoload_real.php
CHANGED
@@ -2,7 +2,7 @@
|
|
2 |
|
3 |
// autoload_real.php @generated by Composer
|
4 |
|
5 |
-
class
|
6 |
{
|
7 |
private static $loader;
|
8 |
|
@@ -19,15 +19,15 @@ class ComposerAutoloaderInitf833268ed2646da8e853833e738212e8
|
|
19 |
return self::$loader;
|
20 |
}
|
21 |
|
22 |
-
spl_autoload_register(array('
|
23 |
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
|
24 |
-
spl_autoload_unregister(array('
|
25 |
|
26 |
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
|
27 |
if ($useStaticLoader) {
|
28 |
require_once __DIR__ . '/autoload_static.php';
|
29 |
|
30 |
-
call_user_func(\Composer\Autoload\
|
31 |
} else {
|
32 |
$map = require __DIR__ . '/autoload_namespaces.php';
|
33 |
foreach ($map as $namespace => $path) {
|
@@ -48,19 +48,19 @@ class ComposerAutoloaderInitf833268ed2646da8e853833e738212e8
|
|
48 |
$loader->register(true);
|
49 |
|
50 |
if ($useStaticLoader) {
|
51 |
-
$includeFiles = Composer\Autoload\
|
52 |
} else {
|
53 |
$includeFiles = require __DIR__ . '/autoload_files.php';
|
54 |
}
|
55 |
foreach ($includeFiles as $fileIdentifier => $file) {
|
56 |
-
|
57 |
}
|
58 |
|
59 |
return $loader;
|
60 |
}
|
61 |
}
|
62 |
|
63 |
-
function
|
64 |
{
|
65 |
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
|
66 |
require $file;
|
2 |
|
3 |
// autoload_real.php @generated by Composer
|
4 |
|
5 |
+
class ComposerAutoloaderInitbadbc7c27712fe1126301394a10557db
|
6 |
{
|
7 |
private static $loader;
|
8 |
|
19 |
return self::$loader;
|
20 |
}
|
21 |
|
22 |
+
spl_autoload_register(array('ComposerAutoloaderInitbadbc7c27712fe1126301394a10557db', 'loadClassLoader'), true, true);
|
23 |
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
|
24 |
+
spl_autoload_unregister(array('ComposerAutoloaderInitbadbc7c27712fe1126301394a10557db', 'loadClassLoader'));
|
25 |
|
26 |
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
|
27 |
if ($useStaticLoader) {
|
28 |
require_once __DIR__ . '/autoload_static.php';
|
29 |
|
30 |
+
call_user_func(\Composer\Autoload\ComposerStaticInitbadbc7c27712fe1126301394a10557db::getInitializer($loader));
|
31 |
} else {
|
32 |
$map = require __DIR__ . '/autoload_namespaces.php';
|
33 |
foreach ($map as $namespace => $path) {
|
48 |
$loader->register(true);
|
49 |
|
50 |
if ($useStaticLoader) {
|
51 |
+
$includeFiles = Composer\Autoload\ComposerStaticInitbadbc7c27712fe1126301394a10557db::$files;
|
52 |
} else {
|
53 |
$includeFiles = require __DIR__ . '/autoload_files.php';
|
54 |
}
|
55 |
foreach ($includeFiles as $fileIdentifier => $file) {
|
56 |
+
composerRequirebadbc7c27712fe1126301394a10557db($fileIdentifier, $file);
|
57 |
}
|
58 |
|
59 |
return $loader;
|
60 |
}
|
61 |
}
|
62 |
|
63 |
+
function composerRequirebadbc7c27712fe1126301394a10557db($fileIdentifier, $file)
|
64 |
{
|
65 |
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
|
66 |
require $file;
|
includes/mollie-api-php/vendor/composer/autoload_static.php
CHANGED
@@ -4,7 +4,7 @@
|
|
4 |
|
5 |
namespace Composer\Autoload;
|
6 |
|
7 |
-
class
|
8 |
{
|
9 |
public static $files = array (
|
10 |
'7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php',
|
@@ -229,9 +229,9 @@ class ComposerStaticInitf833268ed2646da8e853833e738212e8
|
|
229 |
public static function getInitializer(ClassLoader $loader)
|
230 |
{
|
231 |
return \Closure::bind(function () use ($loader) {
|
232 |
-
$loader->prefixLengthsPsr4 =
|
233 |
-
$loader->prefixDirsPsr4 =
|
234 |
-
$loader->classMap =
|
235 |
|
236 |
}, null, ClassLoader::class);
|
237 |
}
|
4 |
|
5 |
namespace Composer\Autoload;
|
6 |
|
7 |
+
class ComposerStaticInitbadbc7c27712fe1126301394a10557db
|
8 |
{
|
9 |
public static $files = array (
|
10 |
'7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php',
|
229 |
public static function getInitializer(ClassLoader $loader)
|
230 |
{
|
231 |
return \Closure::bind(function () use ($loader) {
|
232 |
+
$loader->prefixLengthsPsr4 = ComposerStaticInitbadbc7c27712fe1126301394a10557db::$prefixLengthsPsr4;
|
233 |
+
$loader->prefixDirsPsr4 = ComposerStaticInitbadbc7c27712fe1126301394a10557db::$prefixDirsPsr4;
|
234 |
+
$loader->classMap = ComposerStaticInitbadbc7c27712fe1126301394a10557db::$classMap;
|
235 |
|
236 |
}, null, ClassLoader::class);
|
237 |
}
|
includes/mollie-api-php/vendor/composer/ca-bundle/README.md
CHANGED
@@ -27,22 +27,22 @@ Requirements
|
|
27 |
Basic usage
|
28 |
-----------
|
29 |
|
30 |
-
|
31 |
|
32 |
- `CaBundle::getSystemCaRootBundlePath()`: Returns the system CA bundle path, or a path to the bundled one as fallback
|
33 |
- `CaBundle::getBundledCaBundlePath()`: Returns the path to the bundled CA file
|
34 |
-
- `CaBundle::validateCaFile($filename)`: Validates a CA file using
|
35 |
- `CaBundle::isOpensslParseSafe()`: Test if it is safe to use the PHP function openssl_x509_parse()
|
36 |
- `CaBundle::reset()`: Resets the static caches
|
37 |
|
38 |
|
39 |
-
|
40 |
|
41 |
```php
|
42 |
$curl = curl_init("https://example.org/");
|
43 |
|
44 |
$caPathOrFile = \Composer\CaBundle\CaBundle::getSystemCaRootBundlePath();
|
45 |
-
if (is_dir($caPathOrFile)
|
46 |
curl_setopt($curl, CURLOPT_CAPATH, $caPathOrFile);
|
47 |
} else {
|
48 |
curl_setopt($curl, CURLOPT_CAINFO, $caPathOrFile);
|
@@ -51,7 +51,7 @@ if (is_dir($caPathOrFile) || (is_link($caPathOrFile) && is_dir(readlink($caPathO
|
|
51 |
$result = curl_exec($curl);
|
52 |
```
|
53 |
|
54 |
-
|
55 |
|
56 |
```php
|
57 |
$opts = array(
|
@@ -61,7 +61,7 @@ $opts = array(
|
|
61 |
);
|
62 |
|
63 |
$caPathOrFile = \Composer\CaBundle\CaBundle::getSystemCaRootBundlePath();
|
64 |
-
if (is_dir($caPathOrFile)
|
65 |
$opts['ssl']['capath'] = $caPathOrFile;
|
66 |
} else {
|
67 |
$opts['ssl']['cafile'] = $caPathOrFile;
|
@@ -71,7 +71,7 @@ $context = stream_context_create($opts);
|
|
71 |
$result = file_get_contents('https://example.com', false, $context);
|
72 |
```
|
73 |
|
74 |
-
|
75 |
|
76 |
```php
|
77 |
$client = new \GuzzleHttp\Client([
|
27 |
Basic usage
|
28 |
-----------
|
29 |
|
30 |
+
### `Composer\CaBundle\CaBundle`
|
31 |
|
32 |
- `CaBundle::getSystemCaRootBundlePath()`: Returns the system CA bundle path, or a path to the bundled one as fallback
|
33 |
- `CaBundle::getBundledCaBundlePath()`: Returns the path to the bundled CA file
|
34 |
+
- `CaBundle::validateCaFile($filename)`: Validates a CA file using openssl_x509_parse only if it is safe to use
|
35 |
- `CaBundle::isOpensslParseSafe()`: Test if it is safe to use the PHP function openssl_x509_parse()
|
36 |
- `CaBundle::reset()`: Resets the static caches
|
37 |
|
38 |
|
39 |
+
#### To use with curl
|
40 |
|
41 |
```php
|
42 |
$curl = curl_init("https://example.org/");
|
43 |
|
44 |
$caPathOrFile = \Composer\CaBundle\CaBundle::getSystemCaRootBundlePath();
|
45 |
+
if (is_dir($caPathOrFile)) {
|
46 |
curl_setopt($curl, CURLOPT_CAPATH, $caPathOrFile);
|
47 |
} else {
|
48 |
curl_setopt($curl, CURLOPT_CAINFO, $caPathOrFile);
|
51 |
$result = curl_exec($curl);
|
52 |
```
|
53 |
|
54 |
+
#### To use with php streams
|
55 |
|
56 |
```php
|
57 |
$opts = array(
|
61 |
);
|
62 |
|
63 |
$caPathOrFile = \Composer\CaBundle\CaBundle::getSystemCaRootBundlePath();
|
64 |
+
if (is_dir($caPathOrFile)) {
|
65 |
$opts['ssl']['capath'] = $caPathOrFile;
|
66 |
} else {
|
67 |
$opts['ssl']['cafile'] = $caPathOrFile;
|
71 |
$result = file_get_contents('https://example.com', false, $context);
|
72 |
```
|
73 |
|
74 |
+
#### To use with Guzzle
|
75 |
|
76 |
```php
|
77 |
$client = new \GuzzleHttp\Client([
|
includes/mollie-api-php/vendor/composer/ca-bundle/composer.json
CHANGED
@@ -24,10 +24,10 @@
|
|
24 |
"require": {
|
25 |
"ext-openssl": "*",
|
26 |
"ext-pcre": "*",
|
27 |
-
"php": "^5.3.2 || ^7.0"
|
28 |
},
|
29 |
"require-dev": {
|
30 |
-
"phpunit/phpunit": "^4.8.35 || ^5.7 ||
|
31 |
"psr/log": "^1.0",
|
32 |
"symfony/process": "^2.5 || ^3.0 || ^4.0"
|
33 |
},
|
24 |
"require": {
|
25 |
"ext-openssl": "*",
|
26 |
"ext-pcre": "*",
|
27 |
+
"php": "^5.3.2 || ^7.0 || ^8.0"
|
28 |
},
|
29 |
"require-dev": {
|
30 |
+
"phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8",
|
31 |
"psr/log": "^1.0",
|
32 |
"symfony/process": "^2.5 || ^3.0 || ^4.0"
|
33 |
},
|
includes/mollie-api-php/vendor/composer/ca-bundle/res/cacert.pem
CHANGED
@@ -1,7 +1,7 @@
|
|
1 |
##
|
2 |
## Bundle of CA Root Certificates
|
3 |
##
|
4 |
-
## Certificate data from Mozilla as of: Wed
|
5 |
##
|
6 |
## This is a bundle of X.509 certificates of public Certificate Authorities
|
7 |
## (CA). These were automatically extracted from Mozilla's root certificates
|
@@ -14,7 +14,7 @@
|
|
14 |
## Just configure this file as the SSLCACertificateFile.
|
15 |
##
|
16 |
## Conversion done with mk-ca-bundle.pl version 1.27.
|
17 |
-
## SHA256:
|
18 |
##
|
19 |
|
20 |
|
@@ -3399,3 +3399,109 @@ tlu3zM63Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayhjWZS
|
|
3399 |
aX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw3kAP+HwV96LOPNde
|
3400 |
E4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0=
|
3401 |
-----END CERTIFICATE-----
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
##
|
2 |
## Bundle of CA Root Certificates
|
3 |
##
|
4 |
+
## Certificate data from Mozilla as of: Wed May 15 03:12:09 2019 GMT
|
5 |
##
|
6 |
## This is a bundle of X.509 certificates of public Certificate Authorities
|
7 |
## (CA). These were automatically extracted from Mozilla's root certificates
|
14 |
## Just configure this file as the SSLCACertificateFile.
|
15 |
##
|
16 |
## Conversion done with mk-ca-bundle.pl version 1.27.
|
17 |
+
## SHA256: 61eaa79ac46d923f2f74dfe401189424e96fa8736102b47ba2cdb4ea19af2cc8
|
18 |
##
|
19 |
|
20 |
|
3399 |
aX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw3kAP+HwV96LOPNde
|
3400 |
E4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0=
|
3401 |
-----END CERTIFICATE-----
|
3402 |
+
|
3403 |
+
emSign Root CA - G1
|
3404 |
+
===================
|
3405 |
+
-----BEGIN CERTIFICATE-----
|
3406 |
+
MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYDVQQGEwJJTjET
|
3407 |
+
MBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRl
|
3408 |
+
ZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBHMTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgx
|
3409 |
+
ODMwMDBaMGcxCzAJBgNVBAYTAklOMRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVk
|
3410 |
+
aHJhIFRlY2hub2xvZ2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIB
|
3411 |
+
IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQzf2N4aLTN
|
3412 |
+
LnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO8oG0x5ZOrRkVUkr+PHB1
|
3413 |
+
cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aqd7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHW
|
3414 |
+
DV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhMtTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ
|
3415 |
+
6DqS0hdW5TUaQBw+jSztOd9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrH
|
3416 |
+
hQIDAQABo0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQDAgEG
|
3417 |
+
MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31xPaOfG1vR2vjTnGs2
|
3418 |
+
vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjMwiI/aTvFthUvozXGaCocV685743Q
|
3419 |
+
NcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6dGNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q
|
3420 |
+
+Mri/Tm3R7nrft8EI6/6nAYH6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeih
|
3421 |
+
U80Bv2noWgbyRQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx
|
3422 |
+
iN66zB+Afko=
|
3423 |
+
-----END CERTIFICATE-----
|
3424 |
+
|
3425 |
+
emSign ECC Root CA - G3
|
3426 |
+
=======================
|
3427 |
+
-----BEGIN CERTIFICATE-----
|
3428 |
+
MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQGEwJJTjETMBEG
|
3429 |
+
A1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEg
|
3430 |
+
MB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4
|
3431 |
+
MTgzMDAwWjBrMQswCQYDVQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11
|
3432 |
+
ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g
|
3433 |
+
RzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0WXTsuwYc
|
3434 |
+
58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xySfvalY8L1X44uT6EYGQIr
|
3435 |
+
MgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuBzhccLikenEhjQjAOBgNVHQ8BAf8EBAMC
|
3436 |
+
AQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+D
|
3437 |
+
CBeQyh+KTOgNG3qxrdWBCUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7
|
3438 |
+
jHvrZQnD+JbNR6iC8hZVdyR+EhCVBCyj
|
3439 |
+
-----END CERTIFICATE-----
|
3440 |
+
|
3441 |
+
emSign Root CA - C1
|
3442 |
+
===================
|
3443 |
+
-----BEGIN CERTIFICATE-----
|
3444 |
+
MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkGA1UEBhMCVVMx
|
3445 |
+
EzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNp
|
3446 |
+
Z24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UE
|
3447 |
+
BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQD
|
3448 |
+
ExNlbVNpZ24gUm9vdCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+up
|
3449 |
+
ufGZBczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZHdPIWoU/
|
3450 |
+
Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH3DspVpNqs8FqOp099cGX
|
3451 |
+
OFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvHGPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4V
|
3452 |
+
I5b2P/AgNBbeCsbEBEV5f6f9vtKppa+cxSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleooms
|
3453 |
+
lMuoaJuvimUnzYnu3Yy1aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+
|
3454 |
+
XJGFehiqTbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQAD
|
3455 |
+
ggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87/kOXSTKZEhVb3xEp
|
3456 |
+
/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4kqNPEjE2NuLe/gDEo2APJ62gsIq1
|
3457 |
+
NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrGYQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9
|
3458 |
+
wC68AivTxEDkigcxHpvOJpkT+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQ
|
3459 |
+
BmIMMMAVSKeoWXzhriKi4gp6D/piq1JM4fHfyr6DDUI=
|
3460 |
+
-----END CERTIFICATE-----
|
3461 |
+
|
3462 |
+
emSign ECC Root CA - C3
|
3463 |
+
=======================
|
3464 |
+
-----BEGIN CERTIFICATE-----
|
3465 |
+
MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQGEwJVUzETMBEG
|
3466 |
+
A1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMxIDAeBgNVBAMTF2VtU2lnbiBF
|
3467 |
+
Q0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UE
|
3468 |
+
BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQD
|
3469 |
+
ExdlbVNpZ24gRUNDIFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd
|
3470 |
+
6bciMK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4OjavtisIGJAnB9
|
3471 |
+
SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0OBBYEFPtaSNCAIEDyqOkA
|
3472 |
+
B2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gA
|
3473 |
+
MGUCMQC02C8Cif22TGK6Q04ThHK1rt0c3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwU
|
3474 |
+
ZOR8loMRnLDRWmFLpg9J0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ==
|
3475 |
+
-----END CERTIFICATE-----
|
3476 |
+
|
3477 |
+
Hongkong Post Root CA 3
|
3478 |
+
=======================
|
3479 |
+
-----BEGIN CERTIFICATE-----
|
3480 |
+
MIIFzzCCA7egAwIBAgIUCBZfikyl7ADJk0DfxMauI7gcWqQwDQYJKoZIhvcNAQELBQAwbzELMAkG
|
3481 |
+
A1UEBhMCSEsxEjAQBgNVBAgTCUhvbmcgS29uZzESMBAGA1UEBxMJSG9uZyBLb25nMRYwFAYDVQQK
|
3482 |
+
Ew1Ib25na29uZyBQb3N0MSAwHgYDVQQDExdIb25na29uZyBQb3N0IFJvb3QgQ0EgMzAeFw0xNzA2
|
3483 |
+
MDMwMjI5NDZaFw00MjA2MDMwMjI5NDZaMG8xCzAJBgNVBAYTAkhLMRIwEAYDVQQIEwlIb25nIEtv
|
3484 |
+
bmcxEjAQBgNVBAcTCUhvbmcgS29uZzEWMBQGA1UEChMNSG9uZ2tvbmcgUG9zdDEgMB4GA1UEAxMX
|
3485 |
+
SG9uZ2tvbmcgUG9zdCBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz
|
3486 |
+
iNfqzg8gTr7m1gNt7ln8wlffKWihgw4+aMdoWJwcYEuJQwy51BWy7sFOdem1p+/l6TWZ5Mwc50tf
|
3487 |
+
jTMwIDNT2aa71T4Tjukfh0mtUC1Qyhi+AViiE3CWu4mIVoBc+L0sPOFMV4i707mV78vH9toxdCim
|
3488 |
+
5lSJ9UExyuUmGs2C4HDaOym71QP1mbpV9WTRYA6ziUm4ii8F0oRFKHyPaFASePwLtVPLwpgchKOe
|
3489 |
+
sL4jpNrcyCse2m5FHomY2vkALgbpDDtw1VAliJnLzXNg99X/NWfFobxeq81KuEXryGgeDQ0URhLj
|
3490 |
+
0mRiikKYvLTGCAj4/ahMZJx2Ab0vqWwzD9g/KLg8aQFChn5pwckGyuV6RmXpwtZQQS4/t+TtbNe/
|
3491 |
+
JgERohYpSms0BpDsE9K2+2p20jzt8NYt3eEV7KObLyzJPivkaTv/ciWxNoZbx39ri1UbSsUgYT2u
|
3492 |
+
y1DhCDq+sI9jQVMwCFk8mB13umOResoQUGC/8Ne8lYePl8X+l2oBlKN8W4UdKjk60FSh0Tlxnf0h
|
3493 |
+
+bV78OLgAo9uliQlLKAeLKjEiafv7ZkGL7YKTE/bosw3Gq9HhS2KX8Q0NEwA/RiTZxPRN+ZItIsG
|
3494 |
+
xVd7GYYKecsAyVKvQv83j+GjHno9UKtjBucVtT+2RTeUN7F+8kjDf8V1/peNRY8apxpyKBpADwID
|
3495 |
+
AQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQXnc0e
|
3496 |
+
i9Y5K3DTXNSguB+wAPzFYTAdBgNVHQ4EFgQUF53NHovWOStw01zUoLgfsAD8xWEwDQYJKoZIhvcN
|
3497 |
+
AQELBQADggIBAFbVe27mIgHSQpsY1Q7XZiNc4/6gx5LS6ZStS6LG7BJ8dNVI0lkUmcDrudHr9Egw
|
3498 |
+
W62nV3OZqdPlt9EuWSRY3GguLmLYauRwCy0gUCCkMpXRAJi70/33MvJJrsZ64Ee+bs7Lo3I6LWld
|
3499 |
+
y8joRTnU+kLBEUx3XZL7av9YROXrgZ6voJmtvqkBZss4HTzfQx/0TW60uhdG/H39h4F5ag0zD/ov
|
3500 |
+
+BS5gLNdTaqX4fnkGMX41TiMJjz98iji7lpJiCzfeT2OnpA8vUFKOt1b9pq0zj8lMH8yfaIDlNDc
|
3501 |
+
eqFS3m6TjRgm/VWsvY+b0s+v54Ysyx8Jb6NvqYTUc79NoXQbTiNg8swOqn+knEwlqLJmOzj/2ZQw
|
3502 |
+
9nKEvmhVEA/GcywWaZMH/rFF7buiVWqw2rVKAiUnhde3t4ZEFolsgCs+l6mc1X5VTMbeRRAc6uk7
|
3503 |
+
nwNT7u56AQIWeNTowr5GdogTPyK7SBIdUgC0An4hGh6cJfTzPV4e0hz5sy229zdcxsshTrD3mUcY
|
3504 |
+
hcErulWuBurQB7Lcq9CClnXO0lD+mefPL5/ndtFhKvshuzHQqp9HpLIiyhY6UFfEW0NnxWViA0kB
|
3505 |
+
60PZ2Pierc+xYw5F9KBaLJstxabArahH9CdMOA0uG0k7UvToiIMrVCjU8jVStDKDYmlkDJGcn5fq
|
3506 |
+
dBb9HxEGmpv0
|
3507 |
+
-----END CERTIFICATE-----
|
includes/mollie-api-php/vendor/composer/ca-bundle/src/CaBundle.php
CHANGED
@@ -66,32 +66,21 @@ class CaBundle
|
|
66 |
if (self::$caPath !== null) {
|
67 |
return self::$caPath;
|
68 |
}
|
|
|
|
|
69 |
|
70 |
// If SSL_CERT_FILE env variable points to a valid certificate/bundle, use that.
|
71 |
// This mimics how OpenSSL uses the SSL_CERT_FILE env variable.
|
72 |
-
$
|
73 |
-
if ($envCertFile && is_readable($envCertFile) && static::validateCaFile($envCertFile, $logger)) {
|
74 |
-
return self::$caPath = $envCertFile;
|
75 |
-
}
|
76 |
|
77 |
// If SSL_CERT_DIR env variable points to a valid certificate/bundle, use that.
|
78 |
// This mimics how OpenSSL uses the SSL_CERT_FILE env variable.
|
79 |
-
$
|
80 |
-
if ($envCertDir && is_dir($envCertDir) && is_readable($envCertDir)) {
|
81 |
-
return self::$caPath = $envCertDir;
|
82 |
-
}
|
83 |
|
84 |
-
$
|
85 |
-
|
86 |
-
return self::$caPath = $configured;
|
87 |
-
}
|
88 |
|
89 |
-
$
|
90 |
-
if ($configured && is_dir($configured) && is_readable($configured)) {
|
91 |
-
return self::$caPath = $configured;
|
92 |
-
}
|
93 |
-
|
94 |
-
$caBundlePaths = array(
|
95 |
'/etc/pki/tls/certs/ca-bundle.crt', // Fedora, RHEL, CentOS (ca-certificates package)
|
96 |
'/etc/ssl/certs/ca-certificates.crt', // Debian, Ubuntu, Gentoo, Arch Linux (ca-certificates package)
|
97 |
'/etc/ssl/ca-bundle.pem', // SUSE, openSUSE (ca-certificates package)
|
@@ -105,15 +94,18 @@ class CaBundle
|
|
105 |
'/usr/local/etc/openssl/cert.pem', // OS X homebrew, openssl package
|
106 |
);
|
107 |
|
|
|
|
|
|
|
|
|
|
|
|
|
108 |
foreach ($caBundlePaths as $caBundle) {
|
109 |
-
if (
|
110 |
return self::$caPath = $caBundle;
|
111 |
}
|
112 |
-
}
|
113 |
|
114 |
-
|
115 |
-
$caBundle = dirname($caBundle);
|
116 |
-
if (@is_dir($caBundle) && glob($caBundle.'/*')) {
|
117 |
return self::$caPath = $caBundle;
|
118 |
}
|
119 |
}
|
@@ -305,4 +297,14 @@ EOT;
|
|
305 |
self::$caPath = null;
|
306 |
self::$useOpensslParse = null;
|
307 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
308 |
}
|
66 |
if (self::$caPath !== null) {
|
67 |
return self::$caPath;
|
68 |
}
|
69 |
+
$caBundlePaths = array();
|
70 |
+
|
71 |
|
72 |
// If SSL_CERT_FILE env variable points to a valid certificate/bundle, use that.
|
73 |
// This mimics how OpenSSL uses the SSL_CERT_FILE env variable.
|
74 |
+
$caBundlePaths[] = getenv('SSL_CERT_FILE');
|
|
|
|
|
|
|
75 |
|
76 |
// If SSL_CERT_DIR env variable points to a valid certificate/bundle, use that.
|
77 |
// This mimics how OpenSSL uses the SSL_CERT_FILE env variable.
|
78 |
+
$caBundlePaths[] = getenv('SSL_CERT_DIR');
|
|
|
|
|
|
|
79 |
|
80 |
+
$caBundlePaths[] = ini_get('openssl.cafile');
|
81 |
+
$caBundlePaths[] = ini_get('openssl.capath');
|
|
|
|
|
82 |
|
83 |
+
$otherLocations = array(
|
|
|
|
|
|
|
|
|
|
|
84 |
'/etc/pki/tls/certs/ca-bundle.crt', // Fedora, RHEL, CentOS (ca-certificates package)
|
85 |
'/etc/ssl/certs/ca-certificates.crt', // Debian, Ubuntu, Gentoo, Arch Linux (ca-certificates package)
|
86 |
'/etc/ssl/ca-bundle.pem', // SUSE, openSUSE (ca-certificates package)
|
94 |
'/usr/local/etc/openssl/cert.pem', // OS X homebrew, openssl package
|
95 |
);
|
96 |
|
97 |
+
foreach($otherLocations as $location) {
|
98 |
+
$otherLocations[] = dirname($location);
|
99 |
+
}
|
100 |
+
|
101 |
+
$caBundlePaths = array_merge($caBundlePaths, $otherLocations);
|
102 |
+
|
103 |
foreach ($caBundlePaths as $caBundle) {
|
104 |
+
if (self::caFileUsable($caBundle, $logger)) {
|
105 |
return self::$caPath = $caBundle;
|
106 |
}
|
|
|
107 |
|
108 |
+
if (self::caDirUsable($caBundle)) {
|
|
|
|
|
109 |
return self::$caPath = $caBundle;
|
110 |
}
|
111 |
}
|
297 |
self::$caPath = null;
|
298 |
self::$useOpensslParse = null;
|
299 |
}
|
300 |
+
|
301 |
+
private static function caFileUsable($certFile, LoggerInterface $logger = null)
|
302 |
+
{
|
303 |
+
return $certFile && @is_file($certFile) && @is_readable($certFile) && static::validateCaFile($certFile, $logger);
|
304 |
+
}
|
305 |
+
|
306 |
+
private static function caDirUsable($certDir)
|
307 |
+
{
|
308 |
+
return $certDir && @is_dir($certDir) && @is_readable($certDir) && glob($certDir . '/*');
|
309 |
+
}
|
310 |
}
|
includes/mollie-api-php/vendor/composer/installed.json
CHANGED
@@ -1,30 +1,30 @@
|
|
1 |
[
|
2 |
{
|
3 |
"name": "composer/ca-bundle",
|
4 |
-
"version": "1.
|
5 |
-
"version_normalized": "1.
|
6 |
"source": {
|
7 |
"type": "git",
|
8 |
"url": "https://github.com/composer/ca-bundle.git",
|
9 |
-
"reference": "
|
10 |
},
|
11 |
"dist": {
|
12 |
"type": "zip",
|
13 |
-
"url": "https://api.github.com/repos/composer/ca-bundle/zipball/
|
14 |
-
"reference": "
|
15 |
"shasum": ""
|
16 |
},
|
17 |
"require": {
|
18 |
"ext-openssl": "*",
|
19 |
"ext-pcre": "*",
|
20 |
-
"php": "^5.3.2 || ^7.0"
|
21 |
},
|
22 |
"require-dev": {
|
23 |
-
"phpunit/phpunit": "^4.8.35 || ^5.7 ||
|
24 |
"psr/log": "^1.0",
|
25 |
"symfony/process": "^2.5 || ^3.0 || ^4.0"
|
26 |
},
|
27 |
-
"time": "2019-
|
28 |
"type": "library",
|
29 |
"extra": {
|
30 |
"branch-alias": {
|
1 |
[
|
2 |
{
|
3 |
"name": "composer/ca-bundle",
|
4 |
+
"version": "1.2.3",
|
5 |
+
"version_normalized": "1.2.3.0",
|
6 |
"source": {
|
7 |
"type": "git",
|
8 |
"url": "https://github.com/composer/ca-bundle.git",
|
9 |
+
"reference": "f26a67e397be0e5c00d7c52ec7b5010098e15ce5"
|
10 |
},
|
11 |
"dist": {
|
12 |
"type": "zip",
|
13 |
+
"url": "https://api.github.com/repos/composer/ca-bundle/zipball/f26a67e397be0e5c00d7c52ec7b5010098e15ce5",
|
14 |
+
"reference": "f26a67e397be0e5c00d7c52ec7b5010098e15ce5",
|
15 |
"shasum": ""
|
16 |
},
|
17 |
"require": {
|
18 |
"ext-openssl": "*",
|
19 |
"ext-pcre": "*",
|
20 |
+
"php": "^5.3.2 || ^7.0 || ^8.0"
|
21 |
},
|
22 |
"require-dev": {
|
23 |
+
"phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8",
|
24 |
"psr/log": "^1.0",
|
25 |
"symfony/process": "^2.5 || ^3.0 || ^4.0"
|
26 |
},
|
27 |
+
"time": "2019-08-02T09:05:43+00:00",
|
28 |
"type": "library",
|
29 |
"extra": {
|
30 |
"branch-alias": {
|
includes/mollie/wc/gateway/applepay.php
CHANGED
@@ -13,7 +13,6 @@ class Mollie_WC_Gateway_Applepay extends Mollie_WC_Gateway_Abstract
|
|
13 |
*/
|
14 |
public function __construct()
|
15 |
{
|
16 |
-
// TODO Check if its support refund?
|
17 |
$this->supports = [
|
18 |
'products',
|
19 |
'refunds',
|
13 |
*/
|
14 |
public function __construct()
|
15 |
{
|
|
|
16 |
$this->supports = [
|
17 |
'products',
|
18 |
'refunds',
|
includes/mollie/wc/gateway/mybank.php
ADDED
@@ -0,0 +1,85 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
use Mollie\Api\Resources\Payment;
|
4 |
+
|
5 |
+
/**
|
6 |
+
* Class Mollie_WC_Gateway_MyBank
|
7 |
+
*/
|
8 |
+
class Mollie_WC_Gateway_MyBank extends Mollie_WC_Gateway_Abstract
|
9 |
+
{
|
10 |
+
/**
|
11 |
+
* Mollie_WC_Gateway_Applepay constructor.
|
12 |
+
*/
|
13 |
+
public function __construct()
|
14 |
+
{
|
15 |
+
$this->supports = [
|
16 |
+
'products',
|
17 |
+
'refunds',
|
18 |
+
];
|
19 |
+
|
20 |
+
parent::__construct();
|
21 |
+
}
|
22 |
+
|
23 |
+
/**
|
24 |
+
* @return string
|
25 |
+
*/
|
26 |
+
public function getMollieMethodId()
|
27 |
+
{
|
28 |
+
return 'mybank';
|
29 |
+
}
|
30 |
+
|
31 |
+
/**
|
32 |
+
* @return string
|
33 |
+
*/
|
34 |
+
public function getDefaultTitle()
|
35 |
+
{
|
36 |
+
return __('MyBank', 'mollie-payments-for-woocommerce');
|
37 |
+
}
|
38 |
+
|
39 |
+
/**
|
40 |
+
* @return string
|
41 |
+
*/
|
42 |
+
protected function getSettingsDescription()
|
43 |
+
{
|
44 |
+
return __('To accept payments via MyBank', 'mollie-payments-for-woocommerce');
|
45 |
+
}
|
46 |
+
|
47 |
+
/**
|
48 |
+
* @return string
|
49 |
+
*/
|
50 |
+
protected function getDefaultDescription()
|
51 |
+
{
|
52 |
+
return '';
|
53 |
+
}
|
54 |
+
|
55 |
+
/**
|
56 |
+
* Get Order Instructions
|
57 |
+
*
|
58 |
+
* @param WC_Order $order
|
59 |
+
* @param Payment $payment
|
60 |
+
* @param bool $admin_instructions
|
61 |
+
* @param bool $plain_text
|
62 |
+
* @return string|null
|
63 |
+
*/
|
64 |
+
protected function getInstructions(
|
65 |
+
WC_Order $order,
|
66 |
+
Mollie\Api\Resources\Payment $payment,
|
67 |
+
$admin_instructions,
|
68 |
+
$plain_text
|
69 |
+
) {
|
70 |
+
|
71 |
+
if ($payment->isPaid() && $payment->details) {
|
72 |
+
return sprintf(
|
73 |
+
__(
|
74 |
+
/* translators: Placeholder 1: MyBank consumer name, placeholder 2: Consumer Account number */
|
75 |
+
'Payment completed by <strong>%1$s</strong> - %2$s',
|
76 |
+
'mollie-payments-for-woocommerce'
|
77 |
+
),
|
78 |
+
$payment->details->consumerName,
|
79 |
+
$payment->details->consumerAccount
|
80 |
+
);
|
81 |
+
}
|
82 |
+
|
83 |
+
return parent::getInstructions($order, $payment, $admin_instructions, $plain_text);
|
84 |
+
}
|
85 |
+
}
|
includes/mollie/wc/plugin.php
CHANGED
@@ -7,7 +7,7 @@ class Mollie_WC_Plugin
|
|
7 |
{
|
8 |
const PLUGIN_ID = 'mollie-payments-for-woocommerce';
|
9 |
const PLUGIN_TITLE = 'Mollie Payments for WooCommerce';
|
10 |
-
const PLUGIN_VERSION = '5.
|
11 |
|
12 |
const DB_VERSION = '1.0';
|
13 |
const DB_VERSION_PARAM_NAME = 'mollie-db-version';
|
@@ -46,6 +46,7 @@ class Mollie_WC_Plugin
|
|
46 |
'Mollie_WC_Gateway_Sofort',
|
47 |
'Mollie_WC_Gateway_Giftcard',
|
48 |
'Mollie_WC_Gateway_Applepay',
|
|
|
49 |
);
|
50 |
|
51 |
private function __construct () {}
|
7 |
{
|
8 |
const PLUGIN_ID = 'mollie-payments-for-woocommerce';
|
9 |
const PLUGIN_TITLE = 'Mollie Payments for WooCommerce';
|
10 |
+
const PLUGIN_VERSION = '5.3.0';
|
11 |
|
12 |
const DB_VERSION = '1.0';
|
13 |
const DB_VERSION_PARAM_NAME = 'mollie-db-version';
|
46 |
'Mollie_WC_Gateway_Sofort',
|
47 |
'Mollie_WC_Gateway_Giftcard',
|
48 |
'Mollie_WC_Gateway_Applepay',
|
49 |
+
'Mollie_WC_Gateway_MyBank',
|
50 |
);
|
51 |
|
52 |
private function __construct () {}
|
mollie-payments-for-woocommerce.php
CHANGED
@@ -3,7 +3,7 @@
|
|
3 |
* Plugin Name: Mollie Payments for WooCommerce
|
4 |
* Plugin URI: https://www.mollie.com
|
5 |
* Description: Accept payments in WooCommerce with the official Mollie plugin
|
6 |
-
* Version: 5.
|
7 |
* Author: Mollie
|
8 |
* Author URI: https://www.mollie.com
|
9 |
* Requires at least: 3.8
|
@@ -12,7 +12,7 @@
|
|
12 |
* Domain Path: /i18n/languages/
|
13 |
* License: GPLv2 or later
|
14 |
* WC requires at least: 2.2.0
|
15 |
-
* WC tested up to: 3.
|
16 |
*/
|
17 |
|
18 |
// Exit if accessed directly.
|
3 |
* Plugin Name: Mollie Payments for WooCommerce
|
4 |
* Plugin URI: https://www.mollie.com
|
5 |
* Description: Accept payments in WooCommerce with the official Mollie plugin
|
6 |
+
* Version: 5.3.0
|
7 |
* Author: Mollie
|
8 |
* Author URI: https://www.mollie.com
|
9 |
* Requires at least: 3.8
|
12 |
* Domain Path: /i18n/languages/
|
13 |
* License: GPLv2 or later
|
14 |
* WC requires at least: 2.2.0
|
15 |
+
* WC tested up to: 3.7
|
16 |
*/
|
17 |
|
18 |
// Exit if accessed directly.
|
readme.txt
CHANGED
@@ -3,7 +3,7 @@ Contributors: daanvm, danielhuesken, davdebcom, dinamiko, inpsyde, l.vangunst, n
|
|
3 |
Tags: mollie, payments, payment gateway, woocommerce, credit card, ideal, bancontact, klarna, sofort, giropay, woocommerce subscriptions
|
4 |
Requires at least: 3.8
|
5 |
Tested up to: 5.2
|
6 |
-
Stable tag: 5.
|
7 |
Requires PHP: 5.6
|
8 |
License: GPLv2 or later
|
9 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
@@ -181,6 +181,12 @@ Automatic updates should work like a charm; as always though, ensure you backup
|
|
181 |
|
182 |
== Changelog ==
|
183 |
|
|
|
|
|
|
|
|
|
|
|
|
|
184 |
= 5.2.1 - 24-07-2019 =
|
185 |
|
186 |
* Fix - Payment wall won't load because third party code may register gateways in form of a class instance instead of a string
|
3 |
Tags: mollie, payments, payment gateway, woocommerce, credit card, ideal, bancontact, klarna, sofort, giropay, woocommerce subscriptions
|
4 |
Requires at least: 3.8
|
5 |
Tested up to: 5.2
|
6 |
+
Stable tag: 5.3.0
|
7 |
Requires PHP: 5.6
|
8 |
License: GPLv2 or later
|
9 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
181 |
|
182 |
== Changelog ==
|
183 |
|
184 |
+
= 5.3.0 - 21-08-2019 =
|
185 |
+
|
186 |
+
* Add - Introduce MyBank payment method
|
187 |
+
* Fix - Active Payment Object may be NULL causing WSOD after order is placed in Mollie
|
188 |
+
* Fix - ApplePay logo does not have the right resolution
|
189 |
+
|
190 |
= 5.2.1 - 24-07-2019 =
|
191 |
|
192 |
* Fix - Payment wall won't load because third party code may register gateways in form of a class instance instead of a string
|