Пример подключения Яндекс кассы на PHP (ЮKassa)

Если вам необходимо организовать прием платежей на сайте, то Яндекс Касса будет отличным решением. Простота подключения, легкость в освоении личного кабинета и низкие проценты – это то, что отличает Яндекс кассу (сегодня уже ЮКассу) от других агрегаторов платежей.

UPDATE: Скрипт полностью рабочий и совместим с ЮKassa.

Помимо этого, Яндекс касса дарит подарки своим клиентам:

  • 5 000 рублей на контекстную рекламу;
  • 8 000 рублей на Яндекс облако;
  • 3 месяца рекламы на Яндекс картах;
  • Скидка 20% на Яндекс трекер;
  • 1 500 рублей на такси и доставку.

Я считаю что для бизнеса это реально лучшее предложение.

Подготовительные работы

В данной статье мы рассмотрим как настроить прием платежей через Яндекс кассу на своем сайте с помощью PHP.

  1. Подготавливаем сайт к подключению Яндекс кассы: как подготовить сайт к подключению;
  2. Переходим на сайт Яндекс кассы (ЮKassa) и регистрируемся: https://yookassa.ru/ процесс регистрации простой и понятный;
  3. Заполняем анкету подключения магазина;
  4. Переходим в раздел интеграция -> ключи API и копируем секретный ключ;
  5. В шапке кабинета копируем SHOP ID

Теперь у нас есть данные для подключения по API к Яндекс кассе. Существует несколько методов приема оплаты на сайте, мы рассмотрим самый распространенный.

Платежи мы будем принимать в качестве пополнения баланса личного кабинета с отправкой чеков через онлайн – кассу.

  1. Скачиваем библиотеку для работы с Яндекс кассой: https://github.com/yoomoney/yookassa-sdk-php , распаковываем и заливаем папку “lib” к себе на хостинг;
  2. На странице оплаты создаем форму оплаты:
<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 комментариев
  1. Здравствуйте! Как сделать тоже самое для автоматической отправки емаил человеку?
    Как сохранять емаил в базе данных?

    1. Добавить в скрипт отправку письма допустим с помощью функции mail() и после емайл сохранять в базу данных с помощью INSERT

  2. привет! не получается передать payment_method. т.е. прописываю в нем “type” => “bank_card” (ну или передачей с формы), но выдает все способы платежа. В чем ошибка может быть?

  3. Ошибку не выдавал, просто переходил на страницу со всеми способами оплаты. Поддержка отписала, что неправильно передавал параметр
    “payment_method_data” => array(
    “type” => “bank_card”,
    ),
    я, из какого-то их примера назвал его “payment_method” => …

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *