На сегодняшний день Яндекс.Касса — это один из самых популярных мерчантов для подключения оплаты на любом сайте. Касса позволяет принимать платежи с помощью банковских карт и Яндекс.Денег, а так же подключить онлайн-кассу.
Если у вас интернет-магазин на одной из популярных CMS, то подключить оплату с помощью Яндекс.Кассы не представит каких-либо проблем. На официальном сайте представлено большое количество готовых модулей для различных CMS, фреймворков и даже мессенджеров. Но что если касса нужна для сайта-каталога без корзины, или например, для сайта-лендинга. В этом случае нужно будет интегрировать Яндекс.Кассу с помощью API.
Прием оплаты на сайте со старой версией API был организован, как и у большинства мерчантов, с помощью HTML-формы, отправляющей данные вместе с пользователем на платежный шлюз. На данный момент старая версия API функционирует, и в ближайшее время прекращать его работу не планируется, как сообщает поддержка Яндекс.Кассы. Но все же в документации рекомендуется перейти на новую версию, о чем сигнализирует предупреждение в красной рамке.
Мы конечно же рассмотрим интеграцию Яндекс.Кассы c новой версией API на PHP.
Содержание [Скрыть]
Для начала необходимо зарегистрироваться на сайте kassa.yandex.ru или авторизоваться с существующим логином и паролем от Яндекс.Почты.
Для получения боевого API-ключа необходимо предоставить документы и подписать договор. Но для начала разработки можно воспользоваться тестовыми ключами, которые после успешного тестирования можно заменить на боевые. Для этого создайте тестовый магазин нажав в верхнем меню Все магазины → Создать тестовый магазин.
Введите URL-адрес сайта и нажмите «Добавить», после чего, перед вами откроется окно с уже полученными ключами.
Если это не произошло, то необходимо выбрать все в том же верхнем меню «Все магазины» вновь добавленный сайт, и перейти в раздел «Ключи API» в левом меню.
В этом примере создадим форму, в которую пользователь будет самостоятельно вводить номер заказа, сумму, телефон и 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 необходимо создать так называемый объект платежа отправив в сервис Яндекс.Кассы сумму и ссылку по которой вернется пользователь на исходный сайт. В ответ касса отдает объект платежа, в котором содержится ссылка на платежный шлюз. В отправленных данных так же можно указать дополнительные параметры, например описание, где мы и будем указывать данные пользователя и заказа.
Для работы с платежами по 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-уведомления.
Включите, те уведомления, сообщения о которых вам необходимо получать. Например 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
.