From cec68415197ee01c6bc32816e3965c05c8cf6ec9 Mon Sep 17 00:00:00 2001 From: Nuryagdy Mustapayev Date: Fri, 29 Mar 2024 15:25:24 +0100 Subject: [PATCH] issue #172 - upgrade KuveytPos version to TDV2.0.0 --- config/pos_production.php | 4 +- docs/THREED-PAYMENT-EXAMPLE.md | 33 ++++ examples/_common-codes/3d/form.php | 65 ++++++++ examples/kuveytpos/3d/_config.php | 4 +- examples/kuveytpos/_payment_config.php | 9 +- .../KuveytPosRequestDataMapper.php | 13 +- tests/Functional/KuveytPosTest.php | 141 ++++++++++++++++++ .../KuveytPosRequestDataMapperTest.php | 3 + 8 files changed, 259 insertions(+), 13 deletions(-) create mode 100644 tests/Functional/KuveytPosTest.php diff --git a/config/pos_production.php b/config/pos_production.php index be3e6d7b..213d1e8b 100644 --- a/config/pos_production.php +++ b/config/pos_production.php @@ -152,8 +152,8 @@ 'name' => 'kuveyt-pos', 'class' => Mews\Pos\Gateways\KuveytPos::class, 'gateway_endpoints' => [ - 'payment_api' => 'https://boa.kuveytturk.com.tr/sanalposservice/Home/ThreeDModelProvisionGate', - 'gateway_3d' => 'https://boa.kuveytturk.com.tr/sanalposservice/Home/ThreeDModelPayGate', + 'payment_api' => 'https://sanalpos.kuveytturk.com.tr/ServiceGateWay/Home/ThreeDModelProvisionGate', + 'gateway_3d' => 'https://sanalpos.kuveytturk.com.tr/ServiceGateWay/Home/ThreeDModelPayGate', 'query_api' => 'https://boa.kuveytturk.com.tr/BOA.Integration.WCFService/BOA.Integration.VirtualPos/VirtualPosService.svc?wsdl', ], ], diff --git a/docs/THREED-PAYMENT-EXAMPLE.md b/docs/THREED-PAYMENT-EXAMPLE.md index 83be25be..2ca09672 100644 --- a/docs/THREED-PAYMENT-EXAMPLE.md +++ b/docs/THREED-PAYMENT-EXAMPLE.md @@ -172,6 +172,39 @@ try { } }); + // KuveytVos TDV2.0.0 icin ozel biri durum + $eventDispatcher->addListener( + RequestDataPreparedEvent::class, + function (RequestDataPreparedEvent $requestDataPreparedEvent) use ($pos): void { + if (get_class($pos) !== \Mews\Pos\Gateways\KuveytPos::class) { + return; + } + // KuveytPos TDV2.0.0 icin zorunlu eklenmesi gereken ekstra alanlar: + $additionalRequestDataForKuveyt = [ + 'DeviceData' => [ + //2 karakter olmalıdır. 01-Mobil, 02-Web Browser için kullanılmalıdır. + 'DeviceChannel' => '02', + ], + 'CardHolderData' => [ + 'BillAddrCity' => 'İstanbul', + // ISO 3166-1 sayısal üç haneli ülke kodu standardı kullanılmalıdır. + 'BillAddrCountry' => '792', + 'BillAddrLine1' => 'XXX Mahallesi XXX Caddesi No 55 Daire 1', + 'BillAddrPostCode' => '34000', + // ISO 3166-2'de tanımlı olan il/eyalet kodu olmalıdır. + 'BillAddrState' => '40', + 'Email' => 'xxxxx@gmail.com', + 'MobilePhone' => [ + 'Cc' => '90', + 'Subscriber' => '1234567899', + ], + ], + ]; + $requestData = $requestDataPreparedEvent->getRequestData(); + $requestData = array_merge($requestData, $additionalRequestDataForKuveyt); + $requestDataPreparedEvent->setRequestData($requestData); + }); + $formData = $pos->get3DFormData( $order, $paymentModel, diff --git a/examples/_common-codes/3d/form.php b/examples/_common-codes/3d/form.php index 250f7841..5571d655 100644 --- a/examples/_common-codes/3d/form.php +++ b/examples/_common-codes/3d/form.php @@ -56,6 +56,71 @@ */ }); + // KuveytVos TDV2.0.0 icin ozel biri durum + $eventDispatcher->addListener( + RequestDataPreparedEvent::class, + function (RequestDataPreparedEvent $requestDataPreparedEvent) use ($pos): void { + if (get_class($pos) !== \Mews\Pos\Gateways\KuveytPos::class) { + return; + } + // KuveytPos TDV2.0.0 icin zorunlu eklenmesi gereken ekstra alanlar: + $additionalRequestDataForKuveyt = [ + '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. + */ + 'DeviceChannel' => '02', + ], + 'CardHolderData' => [ + /** + * BillAddrCity: Kullanılan kart ile ilişkili kart hamilinin fatura adres şehri. + * Maksimum 50 karakter uzunluğunda olmalıdır. + */ + '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', + /** + * 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', + /** + * BillAddrPostCode: Kullanılan kart ile ilişkili kart hamilinin fatura adresindeki posta kodu. + */ + 'BillAddrPostCode' => '34000', + /** + * 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', + /** + * 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' => [ + /** + * Cc: Kullanılan kart ile ilişkili kart hamilinin cep telefonuna ait ülke kodu. 1-3 karakter uzunluğunda olmalıdır. + */ + 'Cc' => '90', + /** + * Subscriber: Kullanılan kart ile ilişkili kart hamilinin cep telefonuna ait abone numarası. + * Maksimum 15 karakter uzunluğunda olmalıdır. + */ + 'Subscriber' => '1234567899', + ], + ], + ]; + $requestData = $requestDataPreparedEvent->getRequestData(); + $requestData = array_merge($requestData, $additionalRequestDataForKuveyt); + $requestDataPreparedEvent->setRequestData($requestData); + }); + /** * Bu Event'i dinleyerek 3D formun hash verisi hesaplanmadan önce formun input array içireğini güncelleyebilirsiniz. */ diff --git a/examples/kuveytpos/3d/_config.php b/examples/kuveytpos/3d/_config.php index 792e5d00..f1be35f3 100644 --- a/examples/kuveytpos/3d/_config.php +++ b/examples/kuveytpos/3d/_config.php @@ -9,9 +9,9 @@ $account = \Mews\Pos\Factory\AccountFactory::createKuveytPosAccount( 'kuveytpos', '496', - 'apiuser1', + 'apitest', '400235', - 'Api1232', + 'api123', PosInterface::MODEL_3D_SECURE ); diff --git a/examples/kuveytpos/_payment_config.php b/examples/kuveytpos/_payment_config.php index d73e017d..202cd9e8 100644 --- a/examples/kuveytpos/_payment_config.php +++ b/examples/kuveytpos/_payment_config.php @@ -9,11 +9,12 @@ $testCards = [ 'visa1' => [ - 'number' => '4155650100416111', + //Kart Doğrulama Şifresi: 123456 + 'number' => '5188961939192544', 'year' => '25', - 'month' => '1', - 'cvv' => '123', + 'month' => '06', + 'cvv' => '929', 'name' => 'John Doe', - 'type' => CreditCardInterface::CARD_TYPE_VISA, + 'type' => CreditCardInterface::CARD_TYPE_MASTERCARD, ], ]; diff --git a/src/DataMapper/RequestDataMapper/KuveytPosRequestDataMapper.php b/src/DataMapper/RequestDataMapper/KuveytPosRequestDataMapper.php index c1275144..0fb849aa 100644 --- a/src/DataMapper/RequestDataMapper/KuveytPosRequestDataMapper.php +++ b/src/DataMapper/RequestDataMapper/KuveytPosRequestDataMapper.php @@ -19,7 +19,7 @@ class KuveytPosRequestDataMapper extends AbstractRequestDataMapper { /** @var string */ - public const API_VERSION = '1.0.0'; + public const API_VERSION = 'TDV2.0.0'; /** @var string */ public const CREDIT_CARD_EXP_YEAR_FORMAT = 'y'; @@ -39,10 +39,10 @@ class KuveytPosRequestDataMapper extends AbstractRequestDataMapper * {@inheritDoc} */ protected array $txTypeMappings = [ - PosInterface::TX_TYPE_PAY_AUTH => 'Sale', - PosInterface::TX_TYPE_CANCEL => 'SaleReversal', - PosInterface::TX_TYPE_STATUS => 'GetMerchantOrderDetail', - PosInterface::TX_TYPE_REFUND => 'PartialDrawback', // Also there is a "Drawback" + PosInterface::TX_TYPE_PAY_AUTH => 'Sale', + PosInterface::TX_TYPE_CANCEL => 'SaleReversal', + PosInterface::TX_TYPE_STATUS => 'GetMerchantOrderDetail', + PosInterface::TX_TYPE_REFUND => 'PartialDrawback', // Also there is a "Drawback" ]; /** @@ -133,6 +133,9 @@ public function create3DEnrollmentCheckRequestData(KuveytPosAccount $kuveytPosAc 'MerchantOrderId' => $order['id'], 'OkUrl' => $order['success_url'], 'FailUrl' => $order['fail_url'], + 'DeviceData' => [ + 'ClientIP' => $order['ip'], + ], ]; if ($creditCard instanceof CreditCardInterface) { diff --git a/tests/Functional/KuveytPosTest.php b/tests/Functional/KuveytPosTest.php new file mode 100644 index 00000000..5d66b21d --- /dev/null +++ b/tests/Functional/KuveytPosTest.php @@ -0,0 +1,141 @@ +eventDispatcher = new EventDispatcher(); + + $this->pos = PosFactory::createPosGateway($account, $config, $this->eventDispatcher); + + $this->pos->setTestMode(true); + + $this->card = CreditCardFactory::createForGateway( + $this->pos, + '5188961939192544', + '25', + '06', + '929', + 'John Doe', + CreditCardInterface::CARD_TYPE_MASTERCARD + ); + } + + /** + * NOT: sadece Turkiye IPsiyle istek gonderince cevap alabiliyoruz. + * @return void + */ + public function testCreate3DFormData(): void + { + $order = $this->createPaymentOrder(); + + $eventIsThrown = false; + $this->eventDispatcher->addListener( + RequestDataPreparedEvent::class, + function (RequestDataPreparedEvent $requestDataPreparedEvent) use (&$eventIsThrown): void { + $eventIsThrown = true; + $additionalRequestDataForKuveyt = [ + '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. + */ + 'DeviceChannel' => '02', + ], + 'CardHolderData' => [ + /** + * BillAddrCity: Kullanılan kart ile ilişkili kart hamilinin fatura adres şehri. + * Maksimum 50 karakter uzunluğunda olmalıdır. + */ + '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', + /** + * 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', + /** + * BillAddrPostCode: Kullanılan kart ile ilişkili kart hamilinin fatura adresindeki posta kodu. + */ + 'BillAddrPostCode' => '34000', + /** + * 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', + /** + * 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' => [ + /** + * Cc: Kullanılan kart ile ilişkili kart hamilinin cep telefonuna ait ülke kodu. 1-3 karakter uzunluğunda olmalıdır. + */ + 'Cc' => '90', + /** + * Subscriber: Kullanılan kart ile ilişkili kart hamilinin cep telefonuna ait abone numarası. + * Maksimum 15 karakter uzunluğunda olmalıdır. + */ + 'Subscriber' => '1234567899', + ], + ], + ]; + $requestData = $requestDataPreparedEvent->getRequestData(); + $requestData = array_merge($requestData, $additionalRequestDataForKuveyt); + $requestDataPreparedEvent->setRequestData($requestData); + $this->assertSame(PosInterface::TX_TYPE_PAY_AUTH, $requestDataPreparedEvent->getTxType()); + }); + + $formData = $this->pos->get3DFormData( + $order, + PosInterface::MODEL_3D_SECURE, + PosInterface::TX_TYPE_PAY_AUTH, + $this->card, + ); + + $this->assertIsArray($formData); + $this->assertNotEmpty($formData); + $this->assertTrue($eventIsThrown); + } +} diff --git a/tests/Unit/DataMapper/RequestDataMapper/KuveytPosRequestDataMapperTest.php b/tests/Unit/DataMapper/RequestDataMapper/KuveytPosRequestDataMapperTest.php index 7460b45d..28ff4f05 100644 --- a/tests/Unit/DataMapper/RequestDataMapper/KuveytPosRequestDataMapperTest.php +++ b/tests/Unit/DataMapper/RequestDataMapper/KuveytPosRequestDataMapperTest.php @@ -466,6 +466,9 @@ public static function create3DEnrollmentCheckRequestDataDataProvider(): array 'CardExpireDateYear' => '25', 'CardExpireDateMonth' => '01', 'CardCVV2' => '123', + 'DeviceData' => [ + 'ClientIP' => '127.0.0.1', + ], ], ], ];