Некая вводная информация
PHP класс для приёма платежей от Тинькофф банка позволит вам в разы сократить время на подключение и полный разбор всей документации Тинькофф банка и свою разработку скриптов которые будут обрабатывать платежи.
Также хочу выделить хорошую и быструю поддержку банка, как обычную поддержку, так и техническую — способная адекватно и чётко ответить на ваши вопросы, а также решить некие проблемы связанные с использованием АПИ банка.
Однако в процессе ярой разработки у АПИ вылетела 500 ошибка, что позволила мне посмотреть как и что работает. Ознакомиться с данной информацией вы можете здесь — https://pastebin.com/fhLNhYS0, В основном Jetty, springframework (Java)
Говоря о рекуррентных платежах, при подключении вас попросят:
- При оформлении оплаты и выбора тарифа, клиент должен понимать, что оформляет подписку.
- Это должно указываться на сайте или должна быть техническая возможность выбора оформления подписки/рекуррентных платежей.
- Также должна присутствовать политика возврата (условия и сроки) и процедура принятия обращений клиентов.
При тестировании тест-кейсов в личном кабинете не используйте рекуррентные платежи. Сумма в чеке Receipt.Amount высчитывается как Price * Quantity. Запросы все посылаются через POST CURL запрос указывать Content-Type Json очень важно, также и отправлять через json_encode
Перейдём к готовому классу PHP
Принцип использования класса:
1. Создаете файл tinkoff.params.php, желательно подключить базу через PDO.
<?php use NeatekTinkoff\NeatekTinkoff\NeatekTinkoff; require_once 'tinkoff.class.php'; $tinkoff = new NeatekTinkoff( array( array( 'TerminalKey' => '', // Терминал 'Password' => '', // Пароль ), array( // Подключение к БД через PDO 'db_name' => '', 'db_host' => '', 'db_user' => '', 'db_pass' => '', ), ) );
2. Создаете index.php для перекидывания на платёж, только уберите SetRecurrent() если не нужны рекуррентные платежи.
<?php require_once 'tinkoff.params.php'; $tinkoff->AddMainInfo( array( 'OrderId' => 1, // Не будет работать при подключении к БД, будет автоматически ставиться свой номер заказа из базы данных, рекомендуется всегда оставлять значение = 1 при использовании PDO DB 'Description' => 'Описание заказа до 250 символов', // Описание заказа 'Language' => 'ru', // Язык интерфейса Тинькофф ) ); $tinkoff->SetRecurrent(); // Указать что рекуррентный платёж, можно не указывать $tinkoff->AddItem( array( 'Name' => 'Название товара 128 символов', // Максимум 128 символов 'Price' => 100, // В копейках "Quantity" => (float) 1.00, // Вес или количество "Tax" => "none", // В чеке НДС ) ); $tinkoff->SetOrderEmail('neatek@icloud.com'); // Обязательно указать емайл //$tinkoff->SetOrderMobile('+79999999999'); // Установить мобильный телефон $tinkoff->SetTaxation('usn_income'); // Тип налогообложения //$tinkoff->DeleteItem(0); // Можно удалить товар по индексу $tinkoff->Init(); // Инициализация заказа, и запись в БД если прописаны настройки $tinkoff->doRedirect(); // Переадресация на оплату заказа
Далее пользователь оплачивает заказ, и после чего идёт от банка уведомление на наш скрипт, который ниже об успешном платеже.
3. Обработка нотификаций (уведомлений)
<?php require_once 'tinkoff.params.php'; $tinkoff->getResultResponse(); // Ответ на нотификации
4. Рекуррентные платежи, можете указать что угодно здесь.
<?php require_once 'tinkoff.params.php'; $recurrents = $tinkoff->getLatestForRecurrent(); if (!empty($recurrents)) { foreach ($recurrents as $column => $client) { /** * Params for Init * */ $params = array( // Сумма всех Items.Amount 'Amount' => (string)$client['Amount'], // Номер заказа берется из DB 'OrderId' => (string)$client['order_id'], // из DB 'Description' => $client['Description'], ); $params['DATA'] = (object) array( 'Email' => $client['Email'], ); $params['Receipt'] = (object) array( // Береться из DB 'Email' => $client['Email'], // Налогообложение 'Taxation' => 'usn_income', // С предметами в чеке, можно добавить что вам нужно 'Items' => array( (object) array( 'Name' => 'Описание товара 128 символов', 'Price' => $client['Amount'], "Quantity" => 1.00, // Amount = Price * Quantity "Amount" => $client['Amount'], "Tax" => "none", ), ), ); /** * Charge - повторый платёж * */ $tinkoff->Charge($tinkoff->Init($params, '[Automatic]'), $client); } }
В принципе всё.
Подробнее познакомиться с PHP Классом для API банка Tinkoff
https://github.com/neatek/Tinkoff-PHP-Class