From a872a96499782d50bf444a16d1e3e46418e06efb Mon Sep 17 00:00:00 2001 From: mustapayev Date: Sun, 19 Jan 2025 12:16:53 +0100 Subject: [PATCH] issue #258 param integration --- README.md | 3 +- composer.json | 11 +- config/pos_production.php | 10 + config/pos_test.php | 10 + docs/PRE-AUTH-POST-EXAMPLE.md | 31 +- docs/THREED-PAYMENT-EXAMPLE.md | 4 +- ...URE-AND-PAY-PAYMENT-IN-MODALBOX-EXAMPLE.md | 12 +- examples/_common-codes/3d/form.php | 103 +- examples/_common-codes/regular/cancel.php | 4 + examples/_common-codes/regular/history.php | 36 +- examples/_common-codes/regular/post-auth.php | 2 + examples/_main_config.php | 13 +- examples/_templates/_header.php | 3 + examples/parampos/3d-host/_config.php | 23 + examples/parampos/3d-host/index.php | 3 + examples/parampos/3d-host/response.php | 3 + examples/parampos/3d-pay/_config.php | 22 + examples/parampos/3d-pay/form.php | 3 + examples/parampos/3d-pay/index.php | 3 + examples/parampos/3d-pay/response.php | 3 + examples/parampos/3d/_config.php | 22 + examples/parampos/3d/form.php | 3 + examples/parampos/3d/index.php | 3 + examples/parampos/3d/response.php | 3 + examples/parampos/_payment_config.php | 23 + examples/parampos/index.php | 6 + examples/parampos/regular/_config.php | 20 + examples/parampos/regular/cancel.php | 3 + examples/parampos/regular/custom_query.php | 16 + examples/parampos/regular/form.php | 3 + examples/parampos/regular/history.php | 3 + examples/parampos/regular/index.php | 3 + examples/parampos/regular/post-auth.php | 3 + examples/parampos/regular/refund.php | 3 + examples/parampos/regular/status.php | 3 + src/Crypt/ParamPosCrypt.php | 153 ++ .../AkbankPosRequestDataMapper.php | 2 + .../EstPosRequestDataMapper.php | 2 + .../GarantiPosRequestDataMapper.php | 3 + .../InterPosRequestDataMapper.php | 2 + .../ParamPosRequestDataMapper.php | 627 ++++++ .../PayForPosRequestDataMapper.php | 2 + .../PosNetRequestDataMapper.php | 2 + .../PosNetV1PosRequestDataMapper.php | 5 +- .../RequestDataMapperInterface.php | 4 +- .../ToslaPosRequestDataMapper.php | 2 + .../ParamPosResponseDataMapper.php | 515 +++++ src/Entity/Account/ParamPosAccount.php | 29 + src/Factory/AccountFactory.php | 15 + src/Factory/CryptFactory.php | 3 + src/Factory/RequestDataMapperFactory.php | 3 + src/Factory/ResponseDataMapperFactory.php | 3 + src/Factory/SerializerFactory.php | 2 + src/Gateways/AbstractGateway.php | 2 +- src/Gateways/AkbankPos.php | 7 + src/Gateways/EstPos.php | 12 +- src/Gateways/GarantiPos.php | 2 + src/Gateways/InterPos.php | 2 + src/Gateways/KuveytPos.php | 2 + src/Gateways/ParamPos.php | 332 +++ src/Gateways/PayFlexCPV4Pos.php | 2 + src/Gateways/PayFlexV4Pos.php | 2 + src/Gateways/PayForPos.php | 2 + src/Gateways/PosNet.php | 2 + src/Gateways/PosNetV1Pos.php | 2 + src/Gateways/ToslaPos.php | 2 + src/Gateways/VakifKatilimPos.php | 2 + src/PosInterface.php | 4 +- src/Serializer/ParamPosSerializer.php | 55 + tests/Functional/ParamPosTest.php | 486 +++++ tests/Functional/PaymentTestTrait.php | 30 +- tests/Unit/Crypt/ParamPosCryptTest.php | 201 ++ .../ParamPosRequestDataMapperTest.php | 1394 +++++++++++++ .../ParamPosResponseDataMapperTest.php | 1503 ++++++++++++++ tests/Unit/Gateways/ParamPosTest.php | 1115 ++++++++++ .../Serializer/ParamPosSerializerTest.php | 116 ++ .../parampos/3d_form_response_success.xml | 123 ++ .../3d_host_form_response_success.xml | 15 + .../parampos/history_response_1.json | 1015 +++++++++ .../parampos/history_response_1_expected.json | 1844 +++++++++++++++++ .../status_pay_then_cancel_response.json | 30 + .../status_pay_then_refund_response.json | 30 + .../parampos/status_post_pay_response.json | 30 + .../parampos/status_pre_pay_response.json | 30 + .../status_pre_pay_then_cancel_response.json | 30 + 85 files changed, 10112 insertions(+), 105 deletions(-) create mode 100644 examples/parampos/3d-host/_config.php create mode 100644 examples/parampos/3d-host/index.php create mode 100644 examples/parampos/3d-host/response.php create mode 100644 examples/parampos/3d-pay/_config.php create mode 100644 examples/parampos/3d-pay/form.php create mode 100644 examples/parampos/3d-pay/index.php create mode 100644 examples/parampos/3d-pay/response.php create mode 100644 examples/parampos/3d/_config.php create mode 100644 examples/parampos/3d/form.php create mode 100644 examples/parampos/3d/index.php create mode 100644 examples/parampos/3d/response.php create mode 100644 examples/parampos/_payment_config.php create mode 100644 examples/parampos/index.php create mode 100644 examples/parampos/regular/_config.php create mode 100644 examples/parampos/regular/cancel.php create mode 100644 examples/parampos/regular/custom_query.php create mode 100644 examples/parampos/regular/form.php create mode 100644 examples/parampos/regular/history.php create mode 100644 examples/parampos/regular/index.php create mode 100644 examples/parampos/regular/post-auth.php create mode 100644 examples/parampos/regular/refund.php create mode 100644 examples/parampos/regular/status.php create mode 100644 src/Crypt/ParamPosCrypt.php create mode 100644 src/DataMapper/RequestDataMapper/ParamPosRequestDataMapper.php create mode 100644 src/DataMapper/ResponseDataMapper/ParamPosResponseDataMapper.php create mode 100644 src/Entity/Account/ParamPosAccount.php create mode 100644 src/Gateways/ParamPos.php create mode 100644 src/Serializer/ParamPosSerializer.php create mode 100644 tests/Functional/ParamPosTest.php create mode 100644 tests/Unit/Crypt/ParamPosCryptTest.php create mode 100644 tests/Unit/DataMapper/RequestDataMapper/ParamPosRequestDataMapperTest.php create mode 100644 tests/Unit/DataMapper/ResponseDataMapper/ParamPosResponseDataMapperTest.php create mode 100644 tests/Unit/Gateways/ParamPosTest.php create mode 100644 tests/Unit/Serializer/ParamPosSerializerTest.php create mode 100644 tests/Unit/test_data/parampos/3d_form_response_success.xml create mode 100644 tests/Unit/test_data/parampos/3d_host_form_response_success.xml create mode 100644 tests/Unit/test_data/parampos/history_response_1.json create mode 100644 tests/Unit/test_data/parampos/history_response_1_expected.json create mode 100644 tests/Unit/test_data/parampos/status_pay_then_cancel_response.json create mode 100644 tests/Unit/test_data/parampos/status_pay_then_refund_response.json create mode 100644 tests/Unit/test_data/parampos/status_post_pay_response.json create mode 100644 tests/Unit/test_data/parampos/status_pre_pay_response.json create mode 100644 tests/Unit/test_data/parampos/status_pre_pay_then_cancel_response.json diff --git a/README.md b/README.md index 951deaeb..25061d03 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ sistemlerinin kullanılabilmesidir. | Gateway | Desktekleyen
bankalar | Desteklenen
Ödeme Tipleri | Desteklenen Sorgular | |------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------| | Tosla
(eski AKÖde) | ? | NonSecure
3DPay
3DHost | İptal
İade
Durum sorgulama
Sipariş Tarihçesini sorgulama
Özel Sorgu | +| ParamPos | ? | NonSecure
3DSecure
3DPay
3DHost (test edilmesi gerekiyor) | İptal
İade
Durum sorgulama
Geçmiş İşlemleri sorgulama
Özel Sorgu | | AkbankPos
(Akbankın yeni altyapısı) | Akbank | NonSecure
3DSecur
3DPay
3DHost
Tekrarlanan Ödeme | İptal
İade
Sipariş Tarihçesini sorgulama
Geçmiş İşlemleri sorgulama
Özel Sorgu | | EST POS
(Asseco/Payten)
_deprecated_
| Akbank
TEB
İşbank
Şekerbank
Halkbank
Finansbank
Ziraat | NonSecure
3DSecure
3DPay
3DHost
3DPayHost
Tekrarlanan Ödeme | İptal
İade
Durum sorgulama
Sipariş Tarihçesini sorgulama
Özel Sorgu | | EST V3 POS

EstPos altyapının
daha güvenli
(sha512) hash
algoritmasıyla
uygulaması.
| -----"----- | -----"----- | -----"----- | @@ -330,7 +331,7 @@ http://localhost/ URL projenin `examples` klasörünün içine bakar. Projenin root klasoründe bu satırı çalıştırmanız gerekiyor ```sh -$ ./vendor/bin/phpunit +$ composer test ``` > Değerli yorum, öneri ve katkılarınızı diff --git a/composer.json b/composer.json index 7bd939a6..6298ce6e 100644 --- a/composer.json +++ b/composer.json @@ -48,7 +48,8 @@ "squizlabs/php_codesniffer": "^3.5", "symfony/event-dispatcher": "^5.4", "symfony/http-client": "^5.4", - "symfony/var-dumper": "^5.1" + "symfony/var-dumper": "^5.1", + "symfony/var-exporter": "^5.4" }, "suggest": { "ext-soap": "KuveytPos ile iptal/iade gibi ödeme olmayan işlemleri yapacaksanız." @@ -61,10 +62,16 @@ }, "scripts": { "test": "./vendor/bin/phpunit --testsuite=unit", + "coverage": "XDEBUG_MODE=coverage ./vendor/bin/phpunit --testsuite=unit", "phpstan": "./vendor/bin/phpstan", "baseline": "./vendor/bin/phpstan --generate-baseline", "rector": "./vendor/bin/rector", "cs-fix": "./vendor/bin/php-cs-fixer fix", - "cs-check": "./vendor/bin/php-cs-fixer fix --dry-run --diff" + "cs-check": "./vendor/bin/php-cs-fixer fix --dry-run --diff", + "do-checks": [ + "@cs-check", + "@phpstan", + "@test" + ] } } diff --git a/config/pos_production.php b/config/pos_production.php index 92668d04..befb5379 100644 --- a/config/pos_production.php +++ b/config/pos_production.php @@ -176,5 +176,15 @@ 'gateway_3d_host' => 'https://boa.vakifkatilim.com.tr/VirtualPOS.Gateway/CommonPaymentPage/CommonPaymentPage', ], ], + 'param-pos' => [ + 'name' => 'TURK Elektronik Para A.Ş', + 'class' => Mews\Pos\Gateways\ParamPos::class, + 'gateway_endpoints' => [ + 'payment_api' => 'https://posws.param.com.tr/turkpos.ws/service_turkpos_prod.asmx', + // API URL for 3D host payment + 'payment_api_2' => 'https://test-pos.param.com.tr/to.ws/Service_Odeme.asmx', + 'gateway_3d_host' => 'https://test-pos.param.com.tr/default.aspx', + ], + ], ], ]; diff --git a/config/pos_test.php b/config/pos_test.php index 6b8975e3..ec54a47c 100644 --- a/config/pos_test.php +++ b/config/pos_test.php @@ -11,6 +11,16 @@ 'gateway_3d_host' => 'https://virtualpospaymentgatewaypre.akbank.com/payhosting', ], ], + 'param-pos' => [ + 'name' => 'TURK Elektronik Para A.Ş', + 'class' => Mews\Pos\Gateways\ParamPos::class, + 'gateway_endpoints' => [ + 'payment_api' => 'https://test-dmz.param.com.tr/turkpos.ws/service_turkpos_test.asmx', + // API URL for 3D host payment + 'payment_api_2' => 'https://test-pos.param.com.tr/to.ws/Service_Odeme.asmx', + 'gateway_3d_host' => 'https://test-pos.param.com.tr/default.aspx', + ], + ], 'payten_v3_hash' => [ 'name' => 'AKBANK T.A.S.', 'class' => Mews\Pos\Gateways\EstV3Pos::class, diff --git a/docs/PRE-AUTH-POST-EXAMPLE.md b/docs/PRE-AUTH-POST-EXAMPLE.md index 08ee6238..0c4ee795 100644 --- a/docs/PRE-AUTH-POST-EXAMPLE.md +++ b/docs/PRE-AUTH-POST-EXAMPLE.md @@ -70,7 +70,8 @@ $order = [ // lang degeri verilmezse account (EstPosAccount) dili kullanılacak 'lang' => \Mews\Pos\Gateways\PosInterface::LANG_TR, // Kullanıcının yönlendirileceği banka gateway sayfasının ve gateway'den dönen mesajların dili. ]; - if (in_array($paymentModel, [ + if ($pos instanceof \Mews\Pos\Gateways\ParamPos + || in_array($paymentModel, [ PosInterface::MODEL_3D_SECURE, PosInterface::MODEL_3D_PAY, PosInterface::MODEL_3D_HOST, @@ -123,18 +124,22 @@ try { exit; } ``` -```html - -
- $value) : ?> - - -
Redirecting...
-
-
- -
-
+```php + + + + +
+ $value) : ?> + + +
Redirecting...
+
+
+ +
+
+ ``` **response.php (gateway'den döndükten sonra çalışacak kod)** diff --git a/docs/THREED-PAYMENT-EXAMPLE.md b/docs/THREED-PAYMENT-EXAMPLE.md index 456a1f53..aa7c6d27 100644 --- a/docs/THREED-PAYMENT-EXAMPLE.md +++ b/docs/THREED-PAYMENT-EXAMPLE.md @@ -239,8 +239,8 @@ try { exit; } ``` -```html - +```php +// $formData içeriği HTML forma render ediyoruz ve kullanıcıyı banka gateway'ine yönlendiriyoruz.
$value) : ?> diff --git a/docs/THREED-SECURE-AND-PAY-PAYMENT-IN-MODALBOX-EXAMPLE.md b/docs/THREED-SECURE-AND-PAY-PAYMENT-IN-MODALBOX-EXAMPLE.md index d95edb09..c58f81b6 100644 --- a/docs/THREED-SECURE-AND-PAY-PAYMENT-IN-MODALBOX-EXAMPLE.md +++ b/docs/THREED-SECURE-AND-PAY-PAYMENT-IN-MODALBOX-EXAMPLE.md @@ -58,7 +58,7 @@ try { ``` **_iframe_form.php** (form.php icinde kullanilacak) -```html +```php @@ -158,9 +158,13 @@ try { exit; } -ob_start(); -include('_iframe_form.php'); -$renderedForm = ob_get_clean(); +if (is_string($formData)) { + $renderedForm = $formData; +} else { + ob_start(); + include('_iframe_form.php'); + $renderedForm = ob_get_clean(); +} ?> diff --git a/examples/_common-codes/3d/form.php b/examples/_common-codes/3d/form.php index 7df39b30..a3c27f9b 100644 --- a/examples/_common-codes/3d/form.php +++ b/examples/_common-codes/3d/form.php @@ -14,8 +14,6 @@ // ornegin /examples/finansbank-payfor/3d/_config.php require '_config.php'; -require '../../_templates/_header.php'; - if ($request->getMethod() !== 'POST') { echo new RedirectResponse($baseUrl.'index.php'); exit(); @@ -75,7 +73,7 @@ function (RequestDataPreparedEvent $requestDataPreparedEvent): void { } // KuveytPos TDV2.0.0 icin zorunlu eklenmesi gereken ekstra alanlar: $additionalRequestDataForKuveyt = [ - 'DeviceData' => [ + 'DeviceData' => [ /** * DeviceChannel : DeviceData alanı içerisinde gönderilmesi beklenen işlemin yapıldığı cihaz bilgisi. * 2 karakter olmalıdır. 01-Mobil, 02-Web Browser için kullanılmalıdır. @@ -87,18 +85,18 @@ function (RequestDataPreparedEvent $requestDataPreparedEvent): void { * BillAddrCity: Kullanılan kart ile ilişkili kart hamilinin fatura adres şehri. * Maksimum 50 karakter uzunluğunda olmalıdır. */ - 'BillAddrCity' => 'İstanbul', + 'BillAddrCity' => 'İstanbul', /** * BillAddrCountry Kullanılan kart ile ilişkili kart hamilinin fatura adresindeki ülke kodu. * Maksimum 3 karakter uzunluğunda olmalıdır. * ISO 3166-1 sayısal üç haneli ülke kodu standardı kullanılmalıdır. */ - 'BillAddrCountry' => '792', + 'BillAddrCountry' => '792', /** * BillAddrLine1: Kullanılan kart ile ilişkili kart hamilinin teslimat adresinde yer alan sokak vb. bilgileri içeren açık adresi. * Maksimum 150 karakter uzunluğunda olmalıdır. */ - 'BillAddrLine1' => 'XXX Mahallesi XXX Caddesi No 55 Daire 1', + 'BillAddrLine1' => 'XXX Mahallesi XXX Caddesi No 55 Daire 1', /** * BillAddrPostCode: Kullanılan kart ile ilişkili kart hamilinin fatura adresindeki posta kodu. */ @@ -107,17 +105,17 @@ function (RequestDataPreparedEvent $requestDataPreparedEvent): void { * BillAddrState: CardHolderData alanı içerisinde gönderilmesi beklenen ödemede kullanılan kart ile ilişkili kart hamilinin fatura adresindeki il veya eyalet bilgisi kodu. * ISO 3166-2'de tanımlı olan il/eyalet kodu olmalıdır. */ - 'BillAddrState' => '40', + 'BillAddrState' => '40', /** * Email: Kullanılan kart ile ilişkili kart hamilinin iş yerinde oluşturduğu hesapta kullandığı email adresi. * Maksimum 254 karakter uzunluğunda olmalıdır. */ - 'Email' => 'xxxxx@gmail.com', - 'MobilePhone' => [ + 'Email' => 'xxxxx@gmail.com', + 'MobilePhone' => [ /** * Cc: Kullanılan kart ile ilişkili kart hamilinin cep telefonuna ait ülke kodu. 1-3 karakter uzunluğunda olmalıdır. */ - 'Cc' => '90', + 'Cc' => '90', /** * Subscriber: Kullanılan kart ile ilişkili kart hamilinin cep telefonuna ait abone numarası. * Maksimum 15 karakter uzunluğunda olmalıdır. @@ -126,18 +124,19 @@ function (RequestDataPreparedEvent $requestDataPreparedEvent): void { ], ], ]; + $requestData = $requestDataPreparedEvent->getRequestData(); $requestData = array_merge_recursive($requestData, $additionalRequestDataForKuveyt); $requestDataPreparedEvent->setRequestData($requestData); }); - /** - * Bu Event'i dinleyerek 3D formun hash verisi hesaplanmadan önce formun input array içireğini güncelleyebilirsiniz. - * Eger ekleyeceginiz veri hash hesaplamada kullanilmiyorsa form verisi olusturduktan sonra da ekleyebilirsiniz. - */ - $eventDispatcher->addListener(Before3DFormHashCalculatedEvent::class, function (Before3DFormHashCalculatedEvent $event): void { - if ($event->getGatewayClass() === \Mews\Pos\Gateways\EstPos::class || $event->getGatewayClass() === \Mews\Pos\Gateways\EstV3Pos::class) { - //Örnek 1: İşbank İmece Kart ile ödeme yaparken aşağıdaki verilerin eklenmesi gerekiyor: +/** + * Bu Event'i dinleyerek 3D formun hash verisi hesaplanmadan önce formun input array içireğini güncelleyebilirsiniz. + * Eger ekleyeceginiz veri hash hesaplamada kullanilmiyorsa form verisi olusturduktan sonra da ekleyebilirsiniz. + */ +$eventDispatcher->addListener(Before3DFormHashCalculatedEvent::class, function (Before3DFormHashCalculatedEvent $event): void { + if ($event->getGatewayClass() === \Mews\Pos\Gateways\EstPos::class || $event->getGatewayClass() === \Mews\Pos\Gateways\EstV3Pos::class) { + //Örnek 1: İşbank İmece Kart ile ödeme yaparken aşağıdaki verilerin eklenmesi gerekiyor: // $supportedPaymentModels = [ // \Mews\Pos\PosInterface::MODEL_3D_PAY, // \Mews\Pos\PosInterface::MODEL_3D_PAY_HOSTING, @@ -149,22 +148,21 @@ function (RequestDataPreparedEvent $requestDataPreparedEvent): void { // $formInputs['FDONEM'] = '5'; // Ödemenin faizsiz ertelenmesini istediğiniz dönem sayısı. // $event->setFormInputs($formInputs); // } - } - if ($event->getGatewayClass() === \Mews\Pos\Gateways\EstV3Pos::class) { + } + if ($event->getGatewayClass() === \Mews\Pos\Gateways\EstV3Pos::class) { // // Örnek 2: callbackUrl eklenmesi // $formInputs = $event->getFormInputs(); // $formInputs['callbackUrl'] = $formInputs['failUrl']; // $formInputs['refreshTime'] = '10'; // birim: saniye; callbackUrl sisteminin doğru çalışması için eklenmesi gereken parametre // $event->setFormInputs($formInputs); - } - }); + } +}); // ============================================================================================ // OZEL DURUMLAR ICIN KODLAR END // ============================================================================================ try { $formData = $pos->get3DFormData($order, $paymentModel, $transaction, $card, false); - //dd($formData); } catch (\InvalidArgumentException $e) { // örneğin kart bilgisi sağlanmadığında bu exception'i alırsınız. dd($e); @@ -215,7 +213,6 @@ function (RequestDataPreparedEvent $requestDataPreparedEvent): void { // OZEL DURUMLAR ICIN KODLAR END // ============================================================================================ - $flowType = $request->get('payment_flow_type'); ?> @@ -232,32 +229,36 @@ function (RequestDataPreparedEvent $requestDataPreparedEvent): void { - - - - - - - - + + + + + + + - + @@ -293,8 +294,6 @@ function (RequestDataPreparedEvent $requestDataPreparedEvent): void { - -