Как добавить новую платежную систему ?

Платежных систем много и появляются новые или старые обновляют API.
Если Вы решите добавить, то это памятка для Вас.
Разберем на примере фрикассы.

Создайте папку с названием платежной системы в src\component\donate ,
В них создайте два файла route.php и pay.php с содержимым
PHP:
<?php

$routes = [
    [
        //Метод POST/GET
        "method"  => "POST",

        // Адрес
        // В разделе донат, пользователь будет выбирать платежную систему, через которую осуществить пожертвование.
        // Когда пользователь нажмет "Далее", будет отправлен запрос, для получения ссылки на сайт платежной системы.
        // Рекомендую оставить как есть, только заменить freekassa на название платежки.
        "pattern" => "/donate/transfer/freekassa/createlink",

        // Файл, в которой будет вызвана функция из call
        // Название файла, с классом и методом, где реализовано получение ссылки.
        "file"    => "pay.php",

        //Функция, которая обработкает когда прийдет запрос
        // В данной функции будет вызван класс freekassa из файла pay.php (что указан выше).
       // В классе freekassa будет вызван метод create_link()
       // Тут мы просто указали, имя класса и метода для получения ссылки платежки.
       // Рекомендую изменить название freekassa, на название платежной системы.
        "call"    => function() {
            (new freekassa())->create_link();
        },
    ],

   // Этот роутер для приема информации от платежной системы
    [
        // Метод получения информации, или GET или POST. Уже зависит от настройки в самой платежной системе.
        "method"  => "GET",

        // Адрес для уведомления от платежной системы, после зачисления доната.
        // В данном случае указывайте так ВАШСАЙТ.КОМ/donate/transfer/freekassa
        // Рекомендуется заменить freekassa на название вашей платежной системы
        "pattern" => "/donate/transfer/freekassa",
   
       // Файл реализации логики класса и метода transfer, где будет идти зачисление Донат Бонусов пользователю в личный кабинет.
        "file"    => "pay.php",

        // Название класса и метода, который будет срабатывать в случае, когда придет уведомление от платежки.
        // Рекомендуется заменить freekassa на название вашей платежной системы
        "call"    => function() {
            (new freekassa())->transfer();
        },
    ],
];
Если подвести итог, Вам нужно просто написать там название своей платежной системы вместо freekassa.


Теперь файл pay.php , где реализация всей логики.
Тут должно быть реализованы в классе freekassa два метода create_link и transfer
PHP:
<?php

use Ofey\Logan22\component\alert\board;
use Ofey\Logan22\component\lang\lang;
use Ofey\Logan22\model\donate\donate;
use Ofey\Logan22\model\user\auth\auth;

class freekassa {

    //Включена/отключена платежная система
    private static bool $enable = true;

    public static function isEnable(): bool{
       return self::$enable;
    }

    /**
     * Конфигурация
     * project_id - ID проекта
     * secret1 - секретный ключ №1
     * secret2 - секретный ключ №2
     */
    private $merchant_id      = 12345;
    private $secret_key_1     = '#######';
    private $secret_key_2     = '#######';
    private $currency_default = 'RUB';

    /*
     * Список IP адресов, от которых может прити уведомление от платежной системы.
     */
    private $allowIP = [
        '168.119.157.136',
        '168.119.60.227',
        '138.201.88.124',
        '178.154.197.79',
        '136.243.38.147',
        '136.243.38.149',
        '136.243.38.150',
        '136.243.38.151',
        '136.243.38.189',
        '136.243.38.108',
    ];

    /**
     * @return void
     * Проверка IP адреса
     */
    function allowIP(): void {
        if(!in_array($_SERVER['REMOTE_ADDR'], $this->allowIP)) {
            die("Forbidden: Your IP is not in the list of allowed");
        }
    }

    /**
     * @return void
     * Генерируем ссылку для перехода на сайт оплаты
     */
    function create_link(): void {
        // Проверка чтоб пользователь был авторизован, если нет
        // отправим ему сообщение -> https://github.com/Cannabytes/SphereWeb/blob/master/src/component/lang/package/ru.php#L303
 
        auth::get_is_auth() ?: board::notice(false, lang::get_phrase(234));
        filter_input(INPUT_POST, 'count', FILTER_VALIDATE_INT) ?: board::notice(false, "Введите сумму цифрой");

        $donate = include 'src/config/donate.php';
        $order_amount = $_POST['count'] * $donate['coefficient']['RUB'];
        $merchant_id = $this->merchant_id;
        $order_id = auth::get_email();
        $secret_word = $this->secret_key_1;
        $currency = $this->currency_default;
        $sign = md5($merchant_id . ':' . $order_amount . ':' . $secret_word . ':' . $currency . ':' . $order_id);
        $params = [
            'm'         => $merchant_id,
            'oa'        => (string)$order_amount,
            "currency"  => $currency,
            's'         => $sign,
            'o'         => $order_id,
            'us_userid' => auth::get_id(),
        ];
        echo "https://pay.freekassa.ru/?" . http_build_query($params);
    }

    //Получение информации об оплате
    function transfer(): void {
        $this->allowIP();

        $user_id = $_REQUEST['us_userid'];
        $amount = $_REQUEST['AMOUNT'];
        $MERCHANT_ID = $_REQUEST['MERCHANT_ID'];
        $MERCHANT_ORDER_ID = $_REQUEST['MERCHANT_ORDER_ID'];

        $sign = md5($MERCHANT_ID . ':' . $_REQUEST['AMOUNT'] . ':' . $this->secret_key_2 . ':' . $MERCHANT_ORDER_ID);

        if($sign != $_REQUEST['SIGN']){
            die('wrong sign');
        }

        // donate::currency необходима для конвертации валюты
        // к примеру пользователь оплатил в долларах, рубля, евро, гривне
        // мы используем внутренний курс, чтоб выдать N количество Донат Бонусов.
        $amount = donate::currency($amount, $_REQUEST['currency']);
        // auth::change_donate_point непосредственно зачисление в личный кабинет пользователю донат бонусов.
        auth::change_donate_point($user_id, $amount);
     
        echo 'YES';
    }
}

Отлично, теперь у Вас всё работает. Пробуйте проверяйте.

Если у Вас какие либо трудности, могу порекомендовать обратиться к тем кто занимается интеграцией с платжеными системами.
 
Последнее редактирование:
Тема была изменена, произведена доработка.
Теперь достаточно просто разместить файл с классом платежной системой, в html ничего дописывать не нужно.
 
Можно глупый вопрос? В настройках самой фрикассы указывать url оповещения мойсайт.ру/src/component/donate/freekassa/route.php? А url успешной\неудачной оплаты какие? Тоже на роутер кидать, или сделать отдельно ок.html и bad.html?
 
Назад
Сверху Снизу