From 2dc6cb75da7b13cda5efc5f022717997107ed955 Mon Sep 17 00:00:00 2001 From: Nuryagdy Mustapayev Date: Sat, 16 Dec 2023 23:37:22 +0100 Subject: [PATCH] created THREED-SECURE-PAYMENT-EXAMPLE.md --- README.md | 113 +-------------- docs/THREED-SECURE-PAYMENT-EXAMPLE.md | 193 ++++++++++++++++++++++++++ 2 files changed, 195 insertions(+), 111 deletions(-) create mode 100644 docs/THREED-SECURE-PAYMENT-EXAMPLE.md diff --git a/README.md b/README.md index 98eb277b..220b2f22 100644 --- a/README.md +++ b/README.md @@ -116,6 +116,8 @@ Bu paket ile amaçlanan; ortak bir arayüz sınıfı ile, tüm Türk banka sanal - [Kurulum](#kurulum) - [Farklı Banka Sanal Poslarını Eklemek](#farkli-gatewayler-tek-islem-akisi) - [Ornek Kodlar](#ornek-kodlar) + - [3D Secure Ödeme Örneği](./docs/THREED-SECURE-PAYMENT-EXAMPLE.md). + - [Popup Windowda veya Iframe icinde odeme yapma](#popup-windowda-veya-iframe-icinde-odeme-yapma) - [Troubleshoots](#troubleshoots) - [Genel Kültür](#genel-kultur) @@ -171,117 +173,6 @@ $ composer require php-http/curl-client nyholm/psr7 mews/pos ``` Diğer PSR-18 uygulamasını sağlayan kütühaneler: https://packagist.org/providers/psr/http-client-implementation - -### Örnek ödeme kodu -**config.php (Ayar dosyası)** -```php -setTestMode(true); -} catch (\Mews\Pos\Exceptions\BankNotFoundException | \Mews\Pos\Exceptions\BankClassNullException $e) { - dd($e)); -} -``` - -**form.php (kullanıcıdan kredi kart bilgileri alındıktan sonra çalışacak kod)** -```php - 'BENZERSIZ-SIPERIS-ID', - 'amount' => 1.01, - 'currency' => \Mews\Pos\PosInterface::CURRENCY_TRY, //optional. default: TRY - 'installment' => 0, //0 ya da 1'den büyük değer, optional. default: 0 - - //MODEL_3D_SECURE, MODEL_3D_PAY, MODEL_3D_HOST odemeler icin zorunlu - //Success ve Fail URL'ler farklı olabilir ama kütüphane success ve fail için aynı kod çalıştırır. - 'success_url' => 'https://example.com/response.php', - 'fail_url' => 'https://example.com/response.php', - - //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. -]; -$session->set('order', $order); - -// Kredi kartı bilgieri -$card = \Mews\Pos\Factory\CreditCardFactory::create( - $pos, - '4444555566667777', - '25', - '12', - '123', - 'john', - \Mews\Pos\Entity\Card\CreditCardInterface::CARD_TYPE_VISA, //bankaya göre zorunlu - ); - -// API kullanıcısı ile oluşturulan $pos değişkenine prepare metoduyla sipariş bilgileri tanımlanıyor. -$pos->prepare($order, \Mews\Pos\PosInterface::TX_TYPE_PAY, $card); - -try { - // $formData icerigi form olarak banka gateway'ne yonlendirilir. - // /examples/template/_redirect_form.php bakınız. - $formData = $pos->get3DFormData( - $order, - \Mews\Pos\PosInterface::MODEL_3D_SECURE, - \Mews\Pos\PosInterface::TX_TYPE_PAY, - $card - ); -} catch (\Throwable $e) { - dd($e); -} -```` -**response.php (gateway'den döndükten sonra çalışacak kod)** -```php -get('order'); - -// Ödeme tamamlanıyor, -try { - $pos->payment( - \Mews\Pos\PosInterface::MODEL_3D_SECURE, - $order, - \Mews\Pos\PosInterface::TX_TYPE_PAY, - // $card değeri Non Secure modelde ve Vakıfbank için 3DPay ve 3DSecure ödemede zorunlu. - $card - ); - - // Ödeme başarılı mı? - $pos->isSuccess(); - - // Sonuç çıktısı - dump($pos->getResponse()); - // response içeriği için /examples/template/_payment_response.php dosyaya bakınız. -} catch (Mews\Pos\Exceptions\HashMismatchException $e) { - // todo -} -```` ### Farkli Banka Sanal Poslarını Eklemek Kendi projenizin dizinindeyken ```sh diff --git a/docs/THREED-SECURE-PAYMENT-EXAMPLE.md b/docs/THREED-SECURE-PAYMENT-EXAMPLE.md new file mode 100644 index 00000000..3cd1ee46 --- /dev/null +++ b/docs/THREED-SECURE-PAYMENT-EXAMPLE.md @@ -0,0 +1,193 @@ + +### Örnek 3D Secure ödeme kodu +**config.php (Ayar dosyası)** +```php + 'None', + 'cookie_secure' => true, +]); +$session = new Session($sessionHandler); +$session->start(); + + +// API kullanıcı bilgileri +// AccountFactory'de kullanılacak method Gateway'e göre değişir. Örnek kodlara bakınız. +$account = \Mews\Pos\Factory\AccountFactory::createEstPosAccount( + 'akbank', //pos config'deki ayarın index name'i + 'yourClientID', + 'yourKullaniciAdi', + 'yourSifre', + PosInterface::MODEL_3D_SECURE, // storetype + 'yourStoreKey', + PosInterface::LANG_TR +); + +$eventDispatcher = new Symfony\Component\EventDispatcher\EventDispatcher(); + +try { + $config = require __DIR__.'/../config/pos_test.php'; + + $pos = \Mews\Pos\Factory\PosFactory::createPosGateway($account, $config, $eventDispatcher); + + // GarantiPos ve KuveytPos'u test ortamda test edebilmek için zorunlu. + $pos->setTestMode(true); +} catch (\Mews\Pos\Exceptions\BankNotFoundException | \Mews\Pos\Exceptions\BankClassNullException $e) { + dd($e)); +} +``` + +**form.php (kullanıcıdan kredi kart bilgileri alındıktan sonra çalışacak kod)** +```php + 'BENZERSIZ-SIPERIS-ID', + 'amount' => 1.01, + 'currency' => \Mews\Pos\PosInterface::CURRENCY_TRY, //optional. default: TRY + 'installment' => 0, //0 ya da 1'den büyük değer, optional. default: 0 + + // Success ve Fail URL'ler farklı olabilir ama kütüphane success ve fail için aynı kod çalıştırır. + // success_url ve fail_url'lerin aynı olmasın fayda var çünkü bazı gateyway'ler tek bir URL kabul eder. + 'success_url' => 'https://example.com/response.php', + 'fail_url' => 'https://example.com/response.php', + + //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. +]; + + +$session->set('order', $order); + +// Kredi kartı bilgileri +try { +$card = \Mews\Pos\Factory\CreditCardFactory::create( + $pos, + $_REQUEST['number'], + $_REQUEST['year'], + $_REQUEST['month'], + $_REQUEST['cvv'], + $_REQUEST['name'], + + // kart tipi Gateway'e göre zorunlu, alabileceği örnek değer: "visa" + // alabileceği alternatif değerler için \Mews\Pos\Entity\Card\CreditCardInterface'a bakınız. + $_REQUEST['type'] ?? null + ); +} catch (CardTypeRequiredException $e) { + // bu gateway için kart tipi zorunlu +} catch (CardTypeNotSupportedException $e) { + // sağlanan kart tipi bu gateway tarafından desteklenmiyor +} + +if (get_class($pos) === \Mews\Pos\Gateways\PayFlexV4Pos::class) { + // bu gateway için ödemeyi tamamlarken tekrar kart bilgisi lazım olacak. + $session->set('card', $_REQUEST); +} + +try { + /** @var \Symfony\Component\EventDispatcher\EventDispatcher $eventDispatcher */ + $eventDispatcher->addListener(RequestDataPreparedEvent::class, function (RequestDataPreparedEvent $event) { + /** + * Bazı Gatewayler 3D Form verisini oluşturabilmek için bankaya API istek gönderir. + * 3D form verisini oluşturmak için API isteği Gönderen Gateway'ler: AkOde, PosNet, PayFlexCPV4Pos, PayFlexV4Pos, KuveytPos + * Burda istek banka API'na gonderilmeden once gonderilecek veriyi degistirebilirsiniz. + * Ornek: + * if ($event->getTxType() === PosInterface::TX_TYPE_PAY) { + * $data = $event->getRequestData(); + * $data['abcd'] = '1234'; + * $event->setRequestData($data); + * } + */ + }); + + /** + * Bu Event'i dinleyerek 3D formun hash verisi hesaplanmadan önce formun input array içireğini güncelleyebilirsiniz. + * Eğer ekleyeceğiniz veri hash hesaplamada kullanılmıyorsa Form verisi oluştuktan sonra da güncelleyebilirsiniz. + */ + $eventDispatcher->addListener(Before3DFormHashCalculatedEvent::class, function (Before3DFormHashCalculatedEvent $event) use ($pos): void { + if (get_class($pos) === \Mews\Pos\Gateways\EstPos::class || get_class($pos) === \Mews\Pos\Gateways\EstV3Pos::class) { + /** + * Örnek 1: İşbank İmece Kart ile ödeme yaparken aşağıdaki verilerin eklenmesi gerekiyor: + $supportedPaymentModels = [ + \Mews\Pos\Gateways\PosInterface::MODEL_3D_PAY, + \Mews\Pos\Gateways\PosInterface::MODEL_3D_PAY_HOSTING, + \Mews\Pos\Gateways\PosInterface::MODEL_3D_HOST, + ]; + if ($event->getTxType() === PosInterface::TX_TYPE_PAY && in_array($event->getPaymentModel(), $supportedPaymentModels, true)) { + $formInputs = $event->getRequestData(); + $formInputs['IMCKOD'] = '9999'; // IMCKOD bilgisi bankadan alınmaktadır. + $formInputs['FDONEM'] = '5'; // Ödemenin faizsiz ertelenmesini istediğiniz dönem sayısı. + $event->setRequestData($formInputs); + }*/ + } + }); + + $formData = $pos->get3DFormData( + $order, + \Mews\Pos\PosInterface::MODEL_3D_SECURE, + \Mews\Pos\PosInterface::TX_TYPE_PAY, + $card + ); +} catch (\Throwable $e) { + dd($e); +} +``` +```html + +
+ $value) : ?> + + +
Redirecting...
+
+
+ +
+
+``` +**response.php (gateway'den döndükten sonra çalışacak kod)** +```php +get('order'); +$card = null; +if (get_class($pos) === \Mews\Pos\Gateways\PayFlexV4Pos::class) { + // bu gateway için ödemeyi tamamlarken tekrar kart bilgisi lazım. + $cardData = $session->get('card'); + $card = \Mews\Pos\Factory\CreditCardFactory::create( + $pos, + $cardData['number'], + $cardData['year'], + $cardData['month'], + $cardData['cvv'], + $cardData['name'], + $cardData['type'] + ); +} +// Ödeme tamamlanıyor, +try { + $pos->payment( + \Mews\Pos\PosInterface::MODEL_3D_SECURE, + $order, + \Mews\Pos\PosInterface::TX_TYPE_PAY, + $card + ); + + // Ödeme başarılı mı? + $pos->isSuccess(); + + // Sonuç çıktısı + dump($pos->getResponse()); + // response içeriği için /examples/template/_payment_response.php dosyaya bakınız. +} catch (Mews\Pos\Exceptions\HashMismatchException $e) { + // Bankadan gelen verilerin bankaya ait olmadığında bu exception oluşur. + // Banka API bilgileriniz hatalı ise de oluşur. +} +```