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

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

27 июня 2020 PHP

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

Если у вас интернет-магазин на одной из популярных 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 необходимо создать так называемый объект платежа отправив в сервис Яндекс.Кассы сумму и ссылку по которой вернется пользователь на исходный сайт. В ответ касса отдает объект платежа, в котором содержится ссылка на платежный шлюз. В отправленных данных так же можно указать дополнительные параметры, например описание, где мы и будем указывать данные пользователя и заказа.

Для работы с платежами по 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' => 'http://polisevice.cd83348.tmweb.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

?>

<?php
    use YandexCheckout\Model\Notification\NotificationSucceeded;

    try {
      $notification = ($requestBody['event'] === NotificationEventType::PAYMENT_SUCCEEDED)
        ? new NotificationSucceeded($requestBody)
        : new NotificationWaitingForCapture($requestBody);
    } catch (Exception $e) {
        // Обработка ошибок при неверных данных
    }
?>

<?php
	// Получите объект платежа
    $payment = $notification->getObject();
	
	if($payment["event"] == 'payment.succeeded') {
		// Отправка сообщения
		$mailTo = "info@site.ru"; // Ваш e-mail
		$subject = "Письмо с сайта"; // Тема сообщения
		
		$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.

Остались вопросы по статье? Задайте их прямо сейчас!
Похожие записи
Яндекс почта со своим доменом

Если вы делегировали свой домен на DNS-сервера Яндекс, то Яндекс автоматически внесет нужные записи для работы сервиса «Почта для домена» и вам останется лишь добавить сайт в Яндекс.Коннект. В другом случае вам необходимо добавить DNS-записи самостоятельно. Как это сделать мы и Читать далее

Как настроить DNS хостинг Яндекс

Вы можете использовать DNS-сервера Яндекса для своего домена абсолютно бесплатно. К тому же при их использовании Яндекс автоматически внесет нужные записи для работы сервиса «Почта для домена». Как настроить Яндекс DNS-хостинг рассмотрим в этой статье. Для начала необходимо авторизоваться с Читать далее

PHP классы, объекты, методы

Абсолютно любой предмет из нашей жизни мы можем описать по его характеристикам и состоянию, а так же воздействовать на это состояние. Например, ваш автомобиль имеет определенный цвет, марку, двигатель и т.д. Кроме того он может ехать, стоять, набирать или сбавлять Читать далее

Удалить значение из массива на PHP

Удалить значение из массива по ключу на PHP довольно простая задача, но вот когда необходимо удалить элемент массива именно по значению, то тут возникают небольшие сложности. Вроде бы банальная задача, но придется воспользоваться небольшой хитростью. В этой статье рассмотрим как Читать далее

Создание чат-бота для Viber

В этой статье рассмотрим как создать простого чат-бота для Viber, который будет принимать и отправлять сообщения в чат. Шаг 1 Итак, для начала необходимо зарегистрироваться в сервисе Viber Admin Panel по этой ссылке. Шаг 2 Создаём бота. Для этого заполняем Читать далее

Регулярные выражения PHP: preg_match, preg_split, preg_replace

Регулярные выражения - это мощный алгоритм сопоставления с образцом, который может быть выполнен в одном выражении. Регулярные выражения используют арифметические операторы, такие как (+, -, ^) для создания сложных выражений. Регулярные выражения помогают вам выполнять такие задачи, как проверка адресов Читать далее

Добавить комментарий

*

code