Простая интеграция Яндекс.Кассы на PHP - Web-Global

Простая интеграция Яндекс.Кассы на PHP

11.03.2022 176
Поделиться:

На сегодняшний день Яндекс.Касса — это один из самых популярных мерчантов для подключения оплаты на любом сайте. Касса позволяет принимать платежи с помощью банковских карт и Яндекс.Денег, а так же подключить онлайн-кассу.

Если у вас интернет-магазин на одной из популярных CMS, то подключить оплату с помощью Яндекс.Кассы не представит каких-либо проблем. На официальном сайте представлено большое количество готовых модулей для различных CMS, фреймворков и даже мессенджеров. Но что если касса нужна для сайта-каталога без корзины, или например, для сайта-лендинга. В этом случае нужно будет интегрировать Яндекс.Кассу с помощью API.

Модули Яндекс.Кассы

Прием оплаты на сайте со старой версией API был организован, как и у большинства мерчантов, с помощью HTML-формы, отправляющей данные вместе с пользователем на платежный шлюз. На данный момент старая версия API функционирует, и в ближайшее время прекращать его работу не планируется, как сообщает поддержка Яндекс.Кассы. Но все же в документации рекомендуется перейти на новую версию, о чем сигнализирует предупреждение в красной рамке.

Старая версия API

Мы конечно же рассмотрим интеграцию Яндекс.Кассы c новой версией API на PHP.

Содержание [Скрыть]

Получение API-ключа

Для начала необходимо зарегистрироваться на сайте kassa.yandex.ru или авторизоваться с существующим логином и паролем от Яндекс.Почты.

Для получения боевого API-ключа необходимо предоставить документы и подписать договор. Но для начала разработки можно воспользоваться тестовыми ключами, которые после успешного тестирования можно заменить на боевые. Для этого создайте тестовый магазин нажав в верхнем меню Все магазины → Создать тестовый магазин.

Создание тестового магазина

Введите URL-адрес сайта и нажмите «Добавить», после чего, перед вами откроется окно с уже полученными ключами.

Добавление сайта

Если это не произошло, то необходимо выбрать все в том же верхнем меню «Все магазины» вновь добавленный сайт, и перейти в раздел «Ключи API» в левом меню.

Ключи API

HTML-форма

В этом примере создадим форму, в которую пользователь будет самостоятельно вводить номер заказа, сумму, телефон и e-mail, но это все условно, и в вашем случае эти данные могут передаваться автоматически, например в скрытом поле <input type="hidden" name="sum" value="100">

<form id="kassa-form" action="/kassa/pay.php" method="POST">
    <input type="text" name="order" required placeholder="Номер заказа">
    <input type="number" step="0.01" min="1.0" name="sum" required placeholder="Сумма заказа">
    <input type="tel" name="phone" required placeholder="Ваш телефон">
    <input type="email" name="email" required placeholder="Ваш E-mail">
    <input type="submit" name="submit" value="Оплатить">
</form>

Создание платежа

В новой версии API необходимо создать так называемый объект платежа отправив в сервис Яндекс.Кассы сумму и ссылку по которой вернется пользователь на исходный сайт. В ответ касса отдает объект платежа, в котором содержится ссылка на платежный шлюз. В отправленных данных так же можно указать дополнительные параметры, например описание, где мы и будем указывать данные пользователя и заказа.

аренда sony playstation

Для работы с платежами по API Яндекс.Кассы на PHP существует уже готовая библиотека, которую можно скачать здесь.

Скачиваем и разархивируем из архива папку lib. Для всех файлов обработчика я сделал отдельную папку kassa. Туда и добавляем папку lib. Там же создайте файл pay.php. Именно на него будут приходить данные с формы и в нем будет создаваться объект платежа. Далее по полученной ссылке пользователь будет переадресован на оплату в Яндекс.Кассу. Для пользователя это будет происходить практически незаметно. Не забудьте указать ваш секретный ключ и идентификатор магазина полученные ранее в $client->setAuth.

<?
require __DIR__ . '/lib/autoload.php';
use YandexCheckout\Client;
$order = $_POST["order"];
$sum = $_POST["sum"];
$phone = $_POST["phone"];
$email = $_POST["email"];
?>
<?if(!empty($order) && !empty($sum) && !empty($phone) && !empty($email)) {
    $description = 'Заказ № '.$order.' Тел.: '.$phone.' E-mail: '.$email;
    $client = new Client();
    $client->setAuth('<Идентификатор магазина>', '<Секретный ключ>');
    $payment = $client->createPayment(
        array(
            'amount' => array(
                'value' => $sum,
                'currency' => 'RUB',
            ),
            'confirmation' => array(
                'type' => 'redirect',
                'return_url' => 'https://it-blog.ru/',
            ),
            'capture' => true,
            'description' => $description,
        ),
        uniqid('', true)
    );
    header('Location: ' . $payment["confirmation"]["confirmation_url"]);
    ?>
    <p>Сейчас вы будете перенаправлены на страницу оплаты, если этого не произошло нажмите на ссылку ниже:</p>
    <p><a href="<?=$payment["confirmation"]["confirmation_url"];?>">Оплатить</a></p>
<?} else {?>
<p>Произошла ошибка. Попробуйте еще раз.</p>
<?}?>

Обработчик получает данные переданные из формы методом POST, и если они существуют, то создает объект платежа, и переадресовывает пользователя по полученной ссылке из объекта. Если что-то идет не так, то выводятся ошибки или предлагается перейти на оплату по ссылке самостоятельно.

Протестировать платеж можно с помощью тестовых карт, например 5555555555554444. В качестве срока действия укажите любую дату (но больше текущей) и любой CVC-код.

Получение уведомления о платеже

После оплаты в личном кабинете, в разделе «Операции» вы можете увидеть полные данные платежа.

История платежей

Чтобы получать мгновенные оповещения, например на E-mail, то необходим обработчик, к которому Яндекс.Касса будет обращаться при каком-либо платежном событии. Для настройки уведомлений перейдите в раздел Интеграция → HTTP-уведомления.

HTTP-уведомления

Включите, те уведомления, сообщения о которых вам необходимо получать. Например payment.succeeded возникает при успешно проведенном платеже. Уведомления можно передавать только на сайт с установленным SSL-сертификатом. Создайте в папке kassa файл mail.php.

<?php
require __DIR__ . '/lib/autoload.php';
// Получите данные из POST-запроса от Яндекс.Кассы
$source = file_get_contents('php://input');
$requestBody = json_decode($source, true);
// Создайте объект класса уведомлений в зависимости от события
// NotificationSucceeded, NotificationWaitingForCapture,
// NotificationCanceled,  NotificationRefundSucceeded
use YandexCheckout\Model\Notification\NotificationSucceeded;
use YandexCheckout\Model\Notification\NotificationWaitingForCapture;
use YandexCheckout\Model\NotificationEventType;
use YandexCheckout\Model\PaymentStatus;
try {
  $notification = ($requestBody['event'] === NotificationEventType::PAYMENT_SUCCEEDED)
    ? new NotificationSucceeded($requestBody)
    : new NotificationWaitingForCapture($requestBody);
} catch (Exception $e) {
    // Обработка ошибок при неверных данных
}
// Получите объект платежа
$payment = $notification->getObject();
if($payment->getStatus() === PaymentStatus::SUCCEEDED) {
    // Отправка сообщения
    $mailTo = "info@site.ru"; // Ваш e-mail
    $subject = "На сайте совершен платеж"; // Тема сообщения
    // Сообщение
    $message = "Платеж на сумму: " . $payment->amount->value . "<br/>";
    $message .= "Детали платежа: " . $payment->description . "<br/>";
    
    $headers= "MIME-Version: 1.0\r\n";
    $headers .= "Content-type: text/html; charset=utf-8\r\n";
    $headers .= "From: info@site.ru <info@site.ru>\r\n";
    
    mail($mailTo, $subject, $message, $headers);
}
?>

В случае успешно проведенного платежа, Яндекс.Касса будет обращаться к этому скрипту, который отправит E-mail сообщение. Данные об объекте платежа содержатся в переменной $payment.