PHP Класс для приёма платежей через Тинькофф банк

Кстати говоря, Вы можете сделать заказ у разработчика которого вы сейчас читаете, по любым вопросам с администрированием серверов, а также сайтами. Я помогу в любой задаче, оплата почасовая. Можете обратиться в Telegram для быстрой обратной связи, либо на почту которая на странице "Обо мне".

Дата публикации: 30.12.2017
Дата обновления: 18.12.2021

tinkoff-bank-php-neatek-class-payments-integration

Некая вводная информация

PHP класс для приёма платежей от Тинькофф банка позволит вам в разы сократить время на подключение и полный разбор всей документации Тинькофф банка и свою разработку скриптов которые будут обрабатывать платежи.

Также хочу выделить хорошую и быструю поддержку банка, как обычную поддержку, так и техническую — способная адекватно и чётко ответить на ваши вопросы, а также решить некие проблемы связанные с использованием АПИ банка.

Однако в процессе ярой разработки у АПИ вылетела 500 ошибка, что позволила мне посмотреть как и что работает. Ознакомиться с данной информацией вы можете здесь — https://pastebin.com/fhLNhYS0, В основном Jettyspringframework (Java)

Говоря о рекуррентных платежах, при подключении вас попросят:

  1. При оформлении оплаты и выбора тарифа, клиент должен понимать, что оформляет  подписку.
  2. Это должно указываться на сайте или должна быть техническая возможность выбора оформления подписки/рекуррентных платежей.
  3. Также должна присутствовать политика возврата (условия и сроки) и процедура принятия обращений клиентов.

При тестировании тест-кейсов в личном кабинете не используйте рекуррентные платежи. Сумма в чеке 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);
    }
}

В принципе всё.

Кстати говоря, Вы можете сделать заказ у разработчика которого вы сейчас читаете, по любым вопросам с администрированием серверов, а также сайтами. Я помогу в любой задаче, оплата почасовая. Можете обратиться в Telegram для быстрой обратной связи, либо на почту которая на странице "Обо мне".

Что такое абстрактный класс в PHP?

Как заставить PHP работать быстрее, еще до того как создать продукт, несколько правил

Тернарный оператор в PHP — Как его использовать?

Авторизация через соц. сети Вконтакте, Фейсбук, Одноклассники, Google+ в один клик

Robokassa — Класс для работы с регулярными платежами