السلام عليكم ورحمة الله وبركاته

https://github.com/ahmedsaoud31/payfort-php

  • المكتبة [1] كُتبت ضمن مشروع خاص عملت عليه، فقمت بتعديلها لتصلح للاستخدام العام وطرحها لمن أراد استخدام البوابة في عمليات الدفع الإلكترونية.

  • المكتبة خاصة ببوابة الدفع [2] Payfort وهي بوابة لحلول الدفع الإلكترونية في الشرق الأوسط وتدعم بعض الدول العربية منها (السعودية ومصر والأردن وعمان ولبنان والإمارات المُتحدة)

المكتبة خاصة للغة PHP وتتعامل مع الـ API الخاص بالبوابة عبر [3] Merchant Page 2.0

يُمكنك تهيئة المكتبة عبر composer أو بتضمين الملف بشكل مباشر، ويُمكنك استخدامها مع اطارات كـ Laravel والعمل بشكل مباشر عبر تضمينها من خلال composer أو بشكل مباشر .

لتهيئة المكتبة من خلال composer نفذ الأمر التالي من شاشة الأوامر/الطرفية وأنت داخل مجلد المشروع:

composer require ahmedsaoud31/payfort-php dev-master

أو من خلال تعديل ملف composer.json

{
    "require": {
        "ahmedsaoud31/payfort-php": "dev-master"
    }
}

ثم نفذ الأمر التالي عبر شاشة الأوامر/الطرفية:

composer update

لاستخدام المكتبة قم بتضمين ملف التحميل التلقائي للفئات autoload.php كالتالي:

<?php
require 'vendor/autoload.php';

use Payfort\Payfort;

$payfort = new Payfort;

ولتضمين المكتبة بشكل مباشر استخدم

<?php
require 'path/to/Payfort.php';

use Payfort\Payfort;

$payfort = new Payfort;

لضبط الإعدادات الخاصة بالبوابة قم بالتعديل على الملفpath/to/config.php لضبط كافة الإعدادات الخاصة بالبيئة الإختبارية Sandbox والبيئة الفعلية Live.

لاجراء عملية دفع عبر البوابة يجب عليك تفعيل TLS v1.2 ومكتبة CURL وضبط شهادة الموقع https (من غير الضروري توقيع الشهادة في البيئة التجريبية)

أولاً: عليك تكوين نموذج بالبيانات (اسم صاحب البطاقة ورقم البطاقة وتاريخ الإنتهاء والرقم التأكيدي)

<form role="form" id="gatawayForm" method="POST" action="#">
    <input type="hidden" name="card_holder_name" value="">
    <input type="hidden" name="card_number" value="">
    <input type="hidden" name="card_security_code" value="">
    <input type="hidden" name="expiry_date" value="">
</form>
  • قبل ارسال النموذج لبوابة الدفع عليك ارسال طلب للخادم الخاص بك واستلام البيانات المُعادة من الدالة getFormData وتضمينها في النموذج في الأعلى باستخدام لغة javaScipt وضبط الـ action للنموذج من القيمة host المُعادة من نفس الدالة.

  • ملف استدعاء دالة getFormData على الخادم يكون على النحو التالي:

    $payfort = new Payfort;
    $result = $payfort->setMerchantReference('ABc123')
                    ->setLanguage('en')
                    ->getFormData();
    
  • وداخل ملف معالجة الطلب المُعاد من البوابة والذي يتم ضبطه في الإعدادات return_url سيكون كود الدفع كالتالي:

    $result = $payfort->setCardHolderName('Ahmed')
                        ->setCustomerEmail('ahmedsaoud31@gmail.com')                            ->setCurrency('USD')
                        ->setAmount(100)
                        ->pay();
    
    if(!isset($payfort->response)){
        echo 'Call payment gataway error!';
    }
    
    if(isset($payfort->response->{'3ds_url'})){
        header('Location: '.$payfort->response->{'3ds_url'});
    }
    
    if($result->pay){
        echo 'Success';
    }else{
        echo 'Failed';
    }
    
  • للتحويل من البيئة التجريبية للبيئة الفعلية أثناء وقت الشغيل يُمكنك التبديل من خلال الدالة setLive وتأخذ قيمة منطقية true للتبديل للبيئة الفعلية وfalse للتبديل للبيئة التجريبية -سيتم تجاهل التي تم ضبطها في ملف الإعدادات عند استخدام تلك الدالة للكائن الحالي المطبقة عليه-

    $payfort->setLive(false)
            ->...
    
  • ضبط بعض الاعدادت أثناء وقت الشغيل:

    $payfort->setLive($data)
            ->setCommand($data)
            ->setServiceCommand($data)
            ->setMerchantReference($data)
            ->setLanguage($data)
            ->setRememberMe($data)
            ->setExpiryDate($data)
            ->setCardNumber($data)
            ->setCardSecurityCode($data)
            ->setReturnUrl($data)
            ->setCustomerIP($data)
            ->setCardHolderName($data)
            ->setCustomerEmail($data)
            ->setCurrency($data)
            ->setAmount($data)
            ->pay();
    

[1] https://github.com/ahmedsaoud31/payfort-php

[2] https://www.payfort.com

[3] https://testfort.payfort.com/api/docs/merchant-page-two/build/index.html

[4] https://testfort.payfort.com/api

@SamirEmile