Php İle Restful Apı Tabanlı Ödeme Sistemi Entegrasyonu Nasıl Yapılır?

Php İle Restful Apı Tabanlı Ödeme Sistemi Entegrasyonu Nasıl Yapılır?
Php İle Restful Apı Tabanlı Ödeme Sistemi Entegrasyonu Nasıl Yapılır?

PHP ile RESTful API Tabanlı Ödeme Sistemi Entegrasyonu Nasıl Yapılır?

Modern web uygulamalarında finansal işlemlerin güvenli ve hızlı bir şekilde yürütülmesi, kullanıcı deneyimi ve ticari başarı için kritik öneme sahiptir. PHP ile RESTful API tabanlı ödeme sistemi entegrasyonu, ödeme kuruluşu (Iyzico, Stripe, PayTR vb.) ile sunucunuz arasında güvenli bir köprü kurmanızı sağlar. Bu rehberde, bir ödeme sisteminin nasıl entegre edileceğini, API isteklerinin nasıl yönetileceğini ve güvenlik önlemlerinin nasıl alınacağını adım adım öğreneceksiniz.

Bu eğitim, PHP 8.2 ve üzeri sürümleri kullanan, modern yazılım mimarilerine aşina geliştiriciler için hazırlanmıştır. RESTful (Representational State Transfer) mimarisini kullanarak, sunucunuzdan ödeme sağlayıcısına nasıl veri gönderileceğini ve gelen yanıtların nasıl işleneceğini detaylandıracağız.

Gereksinimler ve Ön Hazırlık

Ödeme entegrasyonuna başlamadan önce geliştirme ortamınızın hazır olduğundan emin olmalısınız. PHP tabanlı bir projede dış API'ler ile haberleşmek için cURL kütüphanesi veya Guzzle HTTP istemcisi standarttır.

  • PHP 8.2+: Modern sözdizimi ve performans iyileştirmeleri için gereklidir.
  • cURL veya Guzzle: HTTP isteklerini yönetmek için kullanılan kütüphaneler.
  • Composer: Bağımlılık yönetimi için zorunludur.
  • SSL Sertifikası: Ödeme verilerinin güvenliği için sunucunuzda mutlaka HTTPS protokolü aktif olmalıdır.

Geliştirme ortamınızda php-curl eklentisinin yüklü olduğunu php -m komutuyla kontrol edebilirsiniz.

Ödeme API İsteği İçin Temel Yapılandırma

Ödeme sağlayıcısına gönderilecek veriler genellikle JSON formatındadır. İlk olarak, API anahtarlarınızı ve temel yapılandırmayı içeren bir sınıf oluşturmalıyız. Bu, kodunuzun sürdürülebilirliğini artırır.


// Config.php
class PaymentConfig {
    public const API_KEY = 'sizin_api_anahtariniz';
    public const SECRET_KEY = 'sizin_gizli_anahtariniz';
    public const BASE_URL = 'https://api.odeme-saglayici.com/v1/';
}

Bu yapılandırma sınıfı, API anahtarlarınızı kodun farklı yerlerinde tekrar yazmanızı engeller ve merkezi bir yönetim sağlar.

cURL Kullanarak İlk API İsteğini Gönderme

RESTful API'ler ile iletişim kurarken HTTP metodlarını (POST, GET, PUT) doğru kullanmak gerekir. Ödeme başlatma işlemi genellikle bir POST isteğidir. Aşağıdaki örnek, bir ödeme isteğinin nasıl oluşturulacağını gösterir.


function sendPaymentRequest($data) {
    $ch = curl_init(PaymentConfig::BASE_URL . 'payment/create');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'Content-Type: application/json',
        'Authorization: Bearer ' . PaymentConfig::API_KEY
    ]);

    $response = curl_exec($ch);
    curl_close($ch);
    return json_decode($response, true);
}

Bu fonksiyon, ödeme verilerini JSON formatına çevirir ve gerekli HTTP başlıklarını (Header) ekleyerek ödeme sağlayıcısına iletir.

Ödeme Yanıtlarını İşleme ve Hata Yönetimi

API'den gelen yanıtlar her zaman başarılı olmayabilir. Gelen yanıtı kontrol etmek ve olası hataları kullanıcıya bildirmek, profesyonel bir entegrasyonun parçasıdır.


$paymentData = ['amount' => 100.00, 'currency' => 'TRY', 'order_id' => 'ORD-123'];
$result = sendPaymentRequest($paymentData);

if (isset($result['status']) && $result['status'] === 'success') {
    echo "Ödeme başarılı: " . $result['transaction_id'];
} else {
    error_log("Ödeme hatası: " . $result['message']);
    echo "Ödeme başarısız, lütfen tekrar deneyin.";
}

Hataları error_log ile sunucu kayıtlarına eklemek, üretim ortamında (production) sorunları tespit etmenize yardımcı olur.

Ödeme Entegrasyon Yöntemleri Karşılaştırması

Yöntem Avantaj Dezavantaj
Hosted Payment Page PCI-DSS uyumluluğu kolaydır. Kontrol daha azdır.
Direct API (Tokenization) Tam özelleştirme sağlar. Yüksek güvenlik gerektirir.

Güvenlik: Webhook Kullanımı ve Doğrulama

Ödeme tamamlandıktan sonra ödeme sağlayıcısı sunucunuza bir "Webhook" gönderir. Bu, ödemenin gerçekten gerçekleştiğini onaylayan bir geri bildirimdir. Webhook verilerinin doğruluğunu kontrol etmek, dolandırıcılığı önlemek için şarttır.

Kritik Güvenlik Uyarısı: Webhook uç noktanızı mutlaka imza (signature) doğrulaması ile koruyun. Ödeme sağlayıcısından gelen verinin değiştirilmediğinden emin olmak için gönderilen hash değerini kendi gizli anahtarınızla karşılaştırın.

// webhook.php
$payload = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_SIGNATURE'];

if (verifySignature($payload, $signature, PaymentConfig::SECRET_KEY)) {
    $data = json_decode($payload, true);
    // Veritabanında siparişi güncelle
} else {
    http_response_code(403);
    die("Geçersiz imza!");
}

Bu kod bloğu, gelen isteğin gerçekten ödeme sağlayıcısından geldiğini doğrular.

Sıkça Sorulan Sorular

Ödeme formunda PCI-DSS uyumluluğu nedir?

Kredi kartı bilgilerinin güvenli bir şekilde işlenmesi için ödeme kartı endüstrisi tarafından belirlenen güvenlik standartlarıdır. Mümkünse kart verilerini kendi sunucunuzda tutmayın.

Neden Guzzle yerine cURL kullanmalıyım?

cURL, PHP'nin yerel bir uzantısıdır ve ek bir bağımlılık gerektirmez. Ancak büyük projelerde Guzzle, sağladığı kolay arayüz ve hata yönetimi ile daha profesyonel bir tercihtir.

Ödeme başarısız olursa ne yapmalıyım?

Kullanıcıya açıklayıcı bir hata mesajı gösterin ve hatayı veritabanınıza kaydederek teknik ekibin incelemesini sağlayın.

Webhook neden önemlidir?

Kullanıcı ödeme sayfasını kapatsa bile ödeme sağlayıcısı sunucunuzu bilgilendirerek sipariş durumunu güncellemenizi sağlar.

Test ortamı (Sandbox) nasıl kullanılır?

Ödeme sağlayıcıları genellikle ayrı bir Sandbox API anahtarı sağlar. Canlıya geçmeden önce tüm senaryoları bu anahtarlarla test etmelisiniz.

Ödeme Entegrasyonlarında Performans Optimizasyonu

Ödeme süreçleri, kullanıcı deneyimini doğrudan etkileyen kritik işlemlerdir. Özellikle yüksek trafikli e-ticaret sitelerinde, API isteklerinin neden olduğu gecikmeler "sepeti terk etme" oranlarını artırabilir. Performansı artırmak için şu stratejileri uygulayabilirsiniz:

  • Bağlantı Havuzlama (Connection Pooling): Her ödeme isteğinde yeni bir TCP bağlantısı kurmak yerine, cURL seçeneklerinde CURLOPT_TCP_KEEPALIVE kullanarak mevcut bağlantıları yeniden kullanın.
  • Asenkron İşlemler: Ödeme onaylandıktan sonra veritabanı kayıtları, fatura oluşturma veya e-posta gönderimi gibi süreçleri ana işlem akışından ayırın. Bu görevleri Redis veya RabbitMQ gibi bir kuyruk yönetimi sistemi üzerinden arka planda çalıştırın.
  • Timeout Ayarları: API yanıtını sonsuza kadar beklemek yerine, CURLOPT_TIMEOUT ve CURLOPT_CONNECTTIMEOUT parametrelerini makul seviyelerde (örneğin 5-10 saniye) tutarak uygulamanızın kilitlenmesini engelleyin.
// Performans odaklı cURL yapılandırması
$ch = curl_init($apiUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_TCP_KEEPALIVE, 1);
// ... diğer ayarlar

Gelişmiş Hata Ayıklama (Debugging) ve Loglama

Ödeme sistemlerinde yaşanan hatalar genellikle "sessiz" gerçekleşir. Kullanıcıya sadece "İşlem başarısız" demek yerine, arka planda detaylı loglar tutmak, sorunun kaynağını bulmanızı sağlar. PHP'de hata ayıklama için şu yaklaşımı izleyin:

  1. Ham İstek ve Yanıt Logları: API'ye gönderdiğiniz JSON verisini ve gelen yanıtı, hassas verileri (kart numarası, CVV vb.) maskeleyerek günlük dosyalarına kaydedin.
  2. HTTP Durum Kodlarını İzleme: Sadece 200 OK yanıtına odaklanmayın; 400 (Bad Request), 401 (Unauthorized) ve 429 (Too Many Requests) gibi hataları ayrı ayrı ele alın.
  3. Monolog Kullanımı: PHP projelerinde standart hale gelen Monolog kütüphanesi ile loglarınızı farklı kanallara (dosya, Slack, Sentry) yönlendirin.
// Hata ayıklama için basit bir loglama örneği
function logPaymentError($message, $context = []) {
    $logEntry = sprintf("[%s] HATA: %s | Veri: %s\n", date('Y-m-d H:i:s'), $message, json_encode($context));
    file_put_contents('logs/payment_errors.log', $logEntry, FILE_APPEND);
}

// Kullanım örneği
if ($httpCode !== 200) {
    logPaymentError("API Yanıt Hatası", ['code' => $httpCode, 'response' => $response]);
}

Üretim Ortamına Geçiş (Deployment) Kontrol Listesi

Canlı ortama geçmeden önce, sisteminizin dayanıklılığını doğrulamak için şu kontrol listesini tamamlamanız önerilir:

Kontrol Noktası Açıklama
SSL/TLS Sürümü Sunucunuzun TLS 1.2 veya 1.3 kullandığından emin olun.
API Anahtarları Canlı anahtarların .env dosyası gibi güvenli bir yerde tutulduğunu doğrulayın.
Webhook Erişilebilirliği Webhook URL'nizin dış dünyaya açık ve HTTPS protokolünde olduğunu test edin.
Hata Yönetimi Kullanıcıya teknik detay göstermeden, kullanıcı dostu hata mesajları döndürün.
Önemli Not: Canlı ortama geçiş yaparken, ödeme sağlayıcınızın "Canlı Mod" (Live Mode) anahtarlarını kullanmaya başladığınızda, test verilerinin (kart numaraları vb.) sisteminizde kalmadığından emin olmak için veritabanını temizlemeyi unutmayın.

Sonuç

PHP ile RESTful API tabanlı ödeme sistemi entegrasyonu, dikkatli bir planlama ve yüksek güvenlik bilinci gerektirir. Bu rehberde, temel API iletişiminden Webhook doğrulama yöntemlerine kadar kritik adımları inceledik. Bir sonraki adım olarak, ödeme sağlayıcınızın dokümantasyonunu derinlemesine inceleyerek 3D Secure entegrasyonu ve iade süreçlerini projenize dahil edebilirsiniz.

Sorumluluk Reddi: Bu makale eğitim amaçlıdır. Ödeme sistemleri entegrasyonu sırasında oluşabilecek finansal kayıplardan veya güvenlik açıklarından kullanıcı sorumludur. Üretim ortamına geçmeden önce PCI-DSS standartlarına tam uyum sağladığınızdan emin olun ve profesyonel güvenlik denetimleri yaptırın.
Bu yazıya tepkinizi paylaşın:
Deniz Arslan

On yıllık içerik üretim deneyimiyle karmaşık süreçleri herkesin anlayabileceği pratik rehberlere dönüştürüyorum. Günlük yaşamı kolaylaştıran çözümler üzerine uzmanlaşmış bir editörüm.

Yorumlar (0)

Yorum Yaz