Если вам необходимо организовать прием платежей на сайте, то Яндекс Касса будет отличным решением. Простота подключения, легкость в освоении личного кабинета и низкие проценты – это то, что отличает Яндекс кассу (сегодня уже ЮКассу) от других агрегаторов платежей.
UPDATE: Скрипт полностью рабочий и совместим с ЮKassa.
Помимо этого, Яндекс касса дарит подарки своим клиентам:
- 5 000 рублей на контекстную рекламу;
- 8 000 рублей на Яндекс облако;
- 3 месяца рекламы на Яндекс картах;
- Скидка 20% на Яндекс трекер;
- 1 500 рублей на такси и доставку.
Я считаю что для бизнеса это реально лучшее предложение.
Подготовительные работы
В данной статье мы рассмотрим как настроить прием платежей через Яндекс кассу на своем сайте с помощью PHP.
- Подготавливаем сайт к подключению Яндекс кассы: как подготовить сайт к подключению;
- Переходим на сайт Яндекс кассы (ЮKassa) и регистрируемся: https://yookassa.ru/ процесс регистрации простой и понятный;
- Заполняем анкету подключения магазина;
- Переходим в раздел интеграция -> ключи API и копируем секретный ключ;
- В шапке кабинета копируем SHOP ID

Теперь у нас есть данные для подключения по API к Яндекс кассе. Существует несколько методов приема оплаты на сайте, мы рассмотрим самый распространенный.
Платежи мы будем принимать в качестве пополнения баланса личного кабинета с отправкой чеков через онлайн – кассу.
- Скачиваем библиотеку для работы с Яндекс кассой: https://github.com/yoomoney/yookassa-sdk-php , распаковываем и заливаем папку “lib” к себе на хостинг;
- На странице оплаты создаем форму оплаты:
<form class="form" method="POST" action="pay.php">
<input type="email" name="email" value="" placeholder="E-mail плательщика" required>
<input type="text" name="userid" value="" placeholder="ID плательщика" required>
<input type="text" name="sum" value="" placeholder="Сумма пополнения" required>
<button type="submit">Пополнить баланс</button>
</form>
- name=”email” – для отправки чека;
- name=”userid” – для идентификации плательщика;
- name=”sum” – сумма пополнения.
Данные будут отправляться на обработчик pay.php
3. Создаем базу данных и импортируем следующую таблицу:
-- phpMyAdmin SQL Dump
-- version 4.6.6deb5
-- https://www.phpmyadmin.net/
--
-- Хост: localhost
-- Время создания: Май 06 2020 г., 11:45
-- Версия сервера: 5.7.28-0ubuntu0.18.04.4
-- Версия PHP: 7.2.24-0ubuntu0.18.04.1
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
--
-- База данных: `yakassa_base`
--
-- --------------------------------------------------------
--
-- Структура таблицы `pay`
--
CREATE TABLE `pay` (
`id` int(11) NOT NULL,
`user_id` text NOT NULL,
`pay_sum` text NOT NULL,
`pay_date` datetime NOT NULL,
`pay_key` text NOT NULL,
`pay_status` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- Индексы сохранённых таблиц
--
--
-- Индексы таблицы `pay`
--
ALTER TABLE `pay`
ADD PRIMARY KEY (`id`);
--
-- AUTO_INCREMENT для сохранённых таблиц
--
--
-- AUTO_INCREMENT для таблицы `pay`
--
ALTER TABLE `pay`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=41;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
4. Создаем обработчик pay.php для создания платежа:
<?
$pay_date = date("Y-m-d H:i:s"); // Получаем дату и время
$pay_status = "pending"; // Устанавливаем стандартный статус платежа
$connection = mysqli_connect('localhost', 'ЛОГИН', 'ПАРОЛЬ', 'БАЗА') or die(mysqli_error($connection)); // Подключаемся к базе данных
// Подключаем библиотеку Я.Кассы
require $_SERVER['DOCUMENT_ROOT'].'/lib/autoload.php';
use YooKassa\Client;
$client = new Client();
$client->setAuth('ИД МАГАЗИНА', 'Секретный ключ API');
// Создаем платеж
$idempotenceKey = uniqid('', true); // Генерируем ключ идемпотентности
$payment = $client->createPayment(
array(
"amount" => array(
"value" => $_POST['sum'], // Сумма платежа
"currency" => "RUB" // Валюта платежа
),
"confirmation" => array(
"type" => "redirect",
"return_url" => "https://site.com/money" // Куда отправлять пользователя после оплаты
),
"capture" => true, // Платеж в один этап
"receipt" => array(
"customer" => array(
"email" => $_POST['email'],
),
"items" => array(
array(
"description" => "Описание услуги",
"quantity" => "1.00", // Количество
"amount" => array(
"value" => $_POST['sum'],
"currency" => "RUB"
),
"tax_system_code" => "2", // Налогообложение
"vat_code" => "2",
"payment_mode" => "full_prepayment", // Полный платеж
"payment_subject" => "service" // Услуга
)
)
)
),
uniqid('', true)
);
// Получаем ссылку на оплату
$confirmationUrl = $payment->getConfirmation()->getConfirmationUrl();
// Получаем платежный ключ
$pay_key = $payment->getid();
// Сохраняем данные платежа в базу
$status_pay = mysqli_query($connection, "INSERT INTO `pay` (`user_id`, `pay_sum`, `pay_date`, `pay_key`, `pay_status`) VALUES ('".$_POST['userid']."', '".$_POST['sum']."', '".$pay_date."', '".$pay_key."', '".$pay_status."')");
// Отправляем пользователя на страницу оплаты
header('Location: '.$confirmationUrl);
?>
На данном этапе пользователь производит оплату и возвращается на страницу https://site.com/money. Теперь нам необходимо проверить статус оплаты и зачислить средства на его баланс.
5. Создаем файл check_pay.php для проверки статуса платежей:
<?
$connection = mysqli_connect('localhost', 'ЛОГИН', 'ПАРОЛЬ', 'БАЗА') or die(mysqli_error($connection)); // Подключаемся к базе данных
// Подключаем библиотеку Я.Кассы
require $_SERVER['DOCUMENT_ROOT'].'/lib/autoload.php';
use YooKassa\Client;
$client = new Client();
$client->setAuth('ИД МАГАЗИНА', 'Секретный ключ API');
// Проверяем статус оплаты
$pay_status = mysqli_query($connection, "SELECT * FROM `pay` WHERE `pay_status` = 'pending'");
// Получаем список платежей циклом
while ($row = mysqli_fetch_assoc($pay_status)) {
$paymentId = $row['pay_key']; // Получаем ключ платежа
$payment = $client->getPaymentInfo($paymentId); // Получаем информацию о платеже
$pay_check = $payment->getstatus(); // Получаем статус оплаты
// Если платеж прошел, то обновляем статус платежа
if ($pay_check == 'waiting_for_capture' or $pay_check == 'succeeded') {
// Обновляем статус платежа
mysqli_query($connection, "UPDATE pay SET pay_status = '".$pay_check."' WHERE pay_key = '".$row['pay_key']."'");
// Обновляем баланс пользователя (настраивайте под свои нужды)
mysqli_query($connection, "UPDATE таблица_пользователей SET баланс_пользователя = баланс_пользователя + '".$row['pay_sum']."' WHERE ИД_пользователя = '".$row['user_id']."'");
}
}
?>
6. С помощью планировщика делаем проверку платежей раз в минуту:

wget -q -O - https://site.com/check_pay.php > /dev/null 2>&1
Теперь наш скрипт check_pay.php ежеминутно будет проверять статус платежей и при успешной транзакции пополнять баланс пользователя.
На этом техническая часть подключения к Яндекс кассе закончена, теперь вам необходимо отправить сайт на проверку и проверить работоспособность платежей на своем сайте.
Если у вас возникнут трудности с подключением Яндекс кассы к сайту, пишите мне в телеграм или в комментарии к данной статье.
9 комментариев
Денис, спасибо!
Будут вопросы, обращайтесь!
Большое спасибо за подробную инструкцию! Очень помогло!
Здравствуйте! Как сделать тоже самое для автоматической отправки емаил человеку?
Как сохранять емаил в базе данных?
Добавить в скрипт отправку письма допустим с помощью функции mail() и после емайл сохранять в базу данных с помощью INSERT
привет! не получается передать payment_method. т.е. прописываю в нем “type” => “bank_card” (ну или передачей с формы), но выдает все способы платежа. В чем ошибка может быть?
А какую ошибку выдает?
Ошибку не выдавал, просто переходил на страницу со всеми способами оплаты. Поддержка отписала, что неправильно передавал параметр
“payment_method_data” => array(
“type” => “bank_card”,
),
я, из какого-то их примера назвал его “payment_method” => …
В настройках кассы эти методы одобрены?