PHP code example of emre-tarhan / kuveytturk-vpos-laravel-sdk
1. Go to this page and download the library: Download emre-tarhan/kuveytturk-vpos-laravel-sdk library . Choose the download type require .
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
emre-tarhan / kuveytturk-vpos-laravel-sdk example snippets
return [
'merchant_id' => env('KUVEYTTURK_MERCHANT_ID', ''),
'customer_id' => env('KUVEYTTURK_CUSTOMER_ID', ''),
'username' => env('KUVEYTTURK_USERNAME', ''),
'password' => env('KUVEYTTURK_PASSWORD', ''),
'environment' => env('KUVEYTTURK_ENVIRONMENT', 'test'),
'timeout' => env('KUVEYTTURK_TIMEOUT', 60),
'connect_timeout' => env('KUVEYTTURK_CONNECT_TIMEOUT', 30),
];
use EmreTarhan\KuveytTurkVPos\Services\KuveytTurkVPos;
use EmreTarhan\KuveytTurkVPos\Dto\SaleRequest;
use EmreTarhan\KuveytTurkVPos\Enums\CurrencyCode;
// Servis konteynerinden enjekte et veya app'ten cozumle
$vpos = app(KuveytTurkVPos::class);
$request = new SaleRequest(
merchantOrderId: 'ORDER-' . time(),
amount: 100.00, // 100 TL - dahili olarak 10000'e donusturulur
okUrl: 'https://siteniz.com/odeme/basarili',
failUrl: 'https://siteniz.com/odeme/basarisiz',
cardHolderName: 'Ahmet Yilmaz',
cardNumber: '5188961939192544',
cardExpireDateYear: '25',
cardExpireDateMonth: '06',
cardCVV2: '929',
email: '[email protected] ',
clientIp: request()->ip(),
billAddrCity: 'Istanbul',
billAddrCountry: '792', // Turkiye ulke kodu
billAddrLine1: 'Ornek Sokak No:123',
billAddrPostCode: '34000',
billAddrState: '34',
Cc: 'Ahmet Yilmaz',
subscriber: '[email protected] ',
currencyCode: CurrencyCode::TRY,
installmentCount: 0, // 0 = taksitsiz, 1-24 arasi taksit
);
$response = $vpos->sale($request);
if ($response->isSuccessful()) {
// Odeme basarili
echo "Islem onaylandi! Siparis No: " . $response->orderId;
} else {
// Odeme basarisiz
echo "Odeme basarisiz: " . $response->responseMessage;
}
use EmreTarhan\KuveytTurkVPos\Dto\VerifyCardRequest;
$verifyRequest = new VerifyCardRequest(
merchantOrderId: 'ORDER-' . time(),
amount: 150.00,
okUrl: 'https://siteniz.com/odeme/basarili',
failUrl: 'https://siteniz.com/odeme/basarisiz',
cardHolderName: 'Ahmet Yilmaz',
cardNumber: '5188961939192544',
cardExpireDateYear: '25',
cardExpireDateMonth: '06',
cardCVV2: '929',
email: '[email protected] ',
clientIp: request()->ip(),
billAddrCity: 'Istanbul',
billAddrCountry: '792',
billAddrLine1: 'Ornek Sokak No:123',
billAddrPostCode: '34000',
billAddrState: '34',
Cc: 'Ahmet Yilmaz',
subscriber: '[email protected] ',
currencyCode: CurrencyCode::TRY,
installmentCount: 3, // 3 ay taksit
);
$verifyResponse = $vpos->verifyCard($verifyRequest);
// Asama 2 icin MD degerini saklayin
$mdValue = $verifyResponse->md; // Provizyon icin gerekli
$orderId = $verifyResponse->orderId;
use EmreTarhan\KuveytTurkVPos\Dto\ProvisionRequest;
$provisionRequest = new ProvisionRequest(
merchantOrderId: 'ORDER-' . time(),
amount: 150.00,
md: $asama1denGelenMdDegeri,
okUrl: 'https://siteniz.com/odeme/basarili',
failUrl: 'https://siteniz.com/odeme/basarisiz',
currencyCode: CurrencyCode::TRY,
installmentCount: 3,
);
$provisionResponse = $vpos->provision($provisionRequest);
if ($provisionResponse->isSuccessful()) {
// Odeme tamamlandi
echo "Provizyon basarili! RRN: " . $provisionResponse->rrn;
}
use EmreTarhan\KuveytTurkVPos\Dto\CancelRequest;
use EmreTarhan\KuveytTurkVPos\Enums\CurrencyCode;
$cancelRequest = new CancelRequest(
merchantOrderId: 'ORDER-12345',
amount: 100.00,
provisionNumber: '123456', // Orijinal satis isleminden
rrn: '789012345', // Referans numarasi
stan: '654321', // Sistem iz numarasi
orderId: 'orijinal-siparis-no',
currencyCode: CurrencyCode::TRY,
);
$cancelResponse = $vpos->cancel($cancelRequest);
if ($cancelResponse->isSuccessful()) {
echo "Islem basariyla iptal edildi!";
}
use EmreTarhan\KuveytTurkVPos\Dto\RefundRequest;
$refundRequest = new RefundRequest(
merchantOrderId: 'ORDER-12345',
amount: 100.00,
provisionNumber: '123456',
rrn: '789012345',
stan: '654321',
orderId: 'orijinal-siparis-no',
currencyCode: CurrencyCode::TRY,
);
$refundResponse = $vpos->refund($refundRequest);
if ($refundResponse->isSuccessful()) {
echo "Iade basariyla gerceklestirildi!";
}
use EmreTarhan\KuveytTurkVPos\Dto\PartialRefundRequest;
$partialRefundRequest = new PartialRefundRequest(
merchantOrderId: 'ORDER-12345',
amount: 50.00, // Kismi tutar
provisionNumber: '123456',
rrn: '789012345',
stan: '654321',
orderId: 'orijinal-siparis-no',
currencyCode: CurrencyCode::TRY,
);
$partialRefundResponse = $vpos->partialRefund($partialRefundRequest);
if ($partialRefundResponse->isSuccessful()) {
echo "Kismi iade basariyla gerceklestirildi!";
}
// App\Providers\AppServiceProvider::register()
use EmreTarhan\KuveytTurkVPos\Services\KuveytTurkVPos;
$this->app->singleton(KuveytTurkVPos::class, function () {
return KuveytTurkVPos::fromConfig(config('kuveytturk-vpos'));
});
use EmreTarhan\KuveytTurkVPos\Services\KuveytTurkVPos;
use EmreTarhan\KuveytTurkVPos\Dto\VerifyCardRequest;
use EmreTarhan\KuveytTurkVPos\Enums\CurrencyCode;
public function odeme(Request $request, KuveytTurkVPos $vpos)
{
$verifyRequest = new VerifyCardRequest(
merchantOrderId: 'ORDER-' . time(),
amount: 100.00,
okUrl: route('odeme.callback.basarili'),
failUrl: route('odeme.callback.basarisiz'),
cardHolderName: $request->input('kart_sahibi'),
cardNumber: $request->input('kart_numarasi'),
cardExpireDateYear: $request->input('kart_yil'), // 2 haneli: '28'
cardExpireDateMonth: $request->input('kart_ay'), // 2 haneli: '12'
cardCVV2: $request->input('kart_cvv'),
email: $request->input('email'),
clientIp: $request->ip(),
billAddrCity: 'Istanbul',
billAddrCountry: '792',
billAddrLine1: 'Ornek Sokak',
billAddrPostCode: '34000',
billAddrState: '34',
Cc: $request->input('kart_sahibi'),
subscriber: $request->input('email'),
currencyCode: CurrencyCode::TRY,
installmentCount: 0,
);
$hashCalculator = $vpos->getHashCalculator();
$hashData = $verifyRequest->generateHash($hashCalculator);
$xml = $verifyRequest->toXml($hashData);
// Bankanin kart dogrulama endpoint'ine gonder
$response = Http::withHeaders([
'Content-Type' => 'application/xml',
])->withBody($xml, 'application/xml')
->post($vpos->getCardVerificationUrl());
$body = $response->body();
// Banka 3D Secure yonlendirme HTML'i dondurur — session'a kaydet ve tarayicida render et
if (str_contains($body, '<html') || str_contains($body, '<form')) {
session(['secure3d_html' => $body]);
return redirect()->route('odeme.secure3d');
}
// Dogrudan basarisizlik (3D Secure yonlendirmesi yok)
return back()->withError('Odeme baslatma basarisiz.');
}
// bootstrap/app.php veya routes/web.php — middleware gruplarinin DISINDA
Route::post('/odeme/callback/basarili', [OdemeCallbackController::class, 'basarili'])
->name('odeme.callback.basarili');
Route::post('/odeme/callback/basarisiz', [OdemeCallbackController::class, 'basarisiz'])
->name('odeme.callback.basarisiz');
use EmreTarhan\KuveytTurkVPos\Dto\ProvisionRequest;
use EmreTarhan\KuveytTurkVPos\Enums\CurrencyCode;
public function basarili(Request $request, KuveytTurkVPos $vpos)
{
// Banka URL-encoded XML olarak AuthenticationResponse gonderir
$rawXml = urldecode($request->getContent());
// XML'i guvenli sekilde cozumle
libxml_use_internal_errors(true);
$dom = new \DOMDocument();
$dom->loadXML($rawXml, LIBXML_NONET | LIBXML_NOCDATA);
libxml_clear_errors();
$xpath = new \DOMXPath($dom);
$getir = fn (string $tag): ?string =>
($nodes = $xpath->query("//*[local-name()='{$tag}']")) && $nodes->length > 0
? $nodes->item(0)->textContent : null;
$md = $getir('MD');
$orderId = $getir('OrderId');
$responseCode = $getir('ResponseCode');
$merchantOrderId = $getir('MerchantOrderId');
// Hash dogrulama: SHA1_base64(MerchantOrderId + ResponseCode + OrderId + HashPassword)
$hashCalculator = $vpos->getHashCalculator();
$hashPassword = $hashCalculator->getHashPassword();
$beklenenHash = base64_encode(sha1($merchantOrderId . $responseCode . $orderId . $hashPassword, true));
$gelenHash = $getir('HashData');
if (!hash_equals($beklenenHash, $gelenHash)) {
// Hash uyumsuzlugu — callback'i reddet
return response('Gecersiz hash', 400);
}
// Asama 2: Provizyon
$provisionRequest = new ProvisionRequest(
merchantOrderId: $merchantOrderId,
amount: 100.00,
md: $md,
okUrl: route('odeme.callback.basarili'),
failUrl: route('odeme.callback.basarisiz'),
currencyCode: CurrencyCode::TRY,
installmentCount: 0,
);
$hashData = $provisionRequest->generateHash($hashCalculator);
$provisionXml = $provisionRequest->toXml($hashData);
$response = Http::withHeaders([
'Content-Type' => 'application/xml',
])->withBody($provisionXml, 'application/xml')
->post($vpos->getProvisionUrl());
// Provizyon yanitini cozumle ve siparisi sonuclandir...
if ($responseCode === '00') {
// Odeme basarili — siparis durumunu guncelle
}
}
// Middleware veya yapilandirma
'connect-src' => [..., 'https://*.kuveytturk.com.tr'],
'form-action' => [..., 'https://*.kuveytturk.com.tr'],
use EmreTarhan\KuveytTurkVPos\Services\KuveytTurkVPos;
use EmreTarhan\KuveytTurkVPos\Exceptions\KuveytTurkVPosException;
use EmreTarhan\KuveytTurkVPos\Enums\ErrorCode;
try {
$response = $vpos->sale($request);
if ($response->isSuccessful()) {
// Basarili islemi ele al
} else {
// Is hatasini ele al
$errorCode = ErrorCode::fromString($response->responseCode);
echo "Hata: " . $errorCode->label();
}
} catch (KuveytTurkVPosException $e) {
// Baglanti/dogrulama hatalarini ele al
echo "Hata: " . $e->getMessage();
}
// Hepsi ayni sonucu verir:
$request = new SaleRequest(..., amount: 100.50, ...);
$request = new SaleRequest(..., amount: '100.50', ...);
$request = new SaleRequest(..., amount: 10050, ...); // Zaten banka formatinda
bash
php artisan vendor:publish --tag=kuveytturk-vpos-config
bash
php artisan kuveytturk:install