Ben kendi php yazılımımdan örnek vereyim. Fiziki pos sistemini bilmiyorum ama mantığı kullanabilirsiniz. Neticede bir düğmeye basılacak ve size ödeme başarılı veya başarısız bilgisi dönecek, birebir aynı süreç.
Ben sayfamda payment_form() kullanarak ödeme formunu başlatıyorum. Bu fonksiyon env veya db'den aktif driver'a bakıyor ve payment_form_paytr, payment_form_iyzico veya payment_form_faketr gibi ayrı bir fonksiyonu çağırıyor. Asıl işi yapan bu fonksiyonlar. Bunları dökümanlardaki hazır kodları kullanarak yazıyorsun.
Bir de işin sonuç kısmı var, burası sağlayıcıdan sağlayıcıya değişebiliyor. Örn paytr sonradan callback url'ye istek atıyor, callback dosyasında kodu inline yazmak yerine ben "payment.success" ve "payment.error" hooklarını tetikliyorum. Fake formdaki success ve error düğmeleriyle de doğrudan post ile bu hookları tetikleyerek fake bir api süreci taklit ediyorum. Ödeme sonrası mail gönderimi, abonelik işlemleri, sipariş durum güncelleme işlemleri yani kodun kendisi ödeme sürecinden veya aktif driver'dan habersiz, sadece bu hookları dinliyor. Böylece fake bir ödeme formu üzerinden istediğim gibi geliştiriyorum. Paytr veya iyzico kullanmak istersem de sadece env değişikliğiyle mümkün oluyor. İleride başka bir entegrasyon gerekirse, sadece 1 adet dosya yazmam yeterli. Bu sistemi yz ile 10 dakikada kurarsınız, yıllarca rahat edersiniz
Buradaki mantık kodu ödeme sağlayıcısından bağımsız olarak yazmanız, bu şekilde yaptığınızda gerçek entegrasyonları daha sonra da yapabilirsiniz. Şuanki geliştirme sürecinizi baltalamaz. Kod yazmanız lazımken bağkur araştırıyorsunuz mesela

Müşteri gelir, hangi firmayı kullanıyor, döküman alır size iletir, 1 adet dosya yazarsınız. Olay kapanır.