@whireless

Как правильно на JS получить обьект успешного платежа от YooKassa?

Всем привет, не могу до конца разобраться с интеграцией YooKassa на сайт (задача получить на сервере обьект успешного платежа) -

1) Пробовал виджет из 'Готовых решений', оплаты проходят, но не приходят уведомления на сервер об успешных платежах, поддержка в итоге вообще говорит что при таком способе уведомления тупо на почту приходят, а не в виде POST-запросов на сервер, как это указано в API Юкассы было.

2) Пробовал через библеотеку @a2seven/yoo-checkout, но так и не разобрался с ней, как корректно делать, и судя по всему, она не может сделать так, чтобы мне на сервер возвращался обьект с информацией о прошедшем платеже.

3) Есть ещё способ через cURL вроде, но с cURL никогда не работал.

Способы с использованием PHP и Python естественно не подходят, т.к. не знаком с этими языками и сервер куда надо чтобы приходил обьект успешного платежа стоит у меня на Node.js
  • Вопрос задан
  • 1459 просмотров
Пригласить эксперта
Ответы на вопрос 2
pLavrenov
@pLavrenov
Разработка сайтов
Сервер на Ноде не отличается от сервера на PHP, при проведении платежа сервер юкассы толкает POST запрос на твой сервер, тебе надо указать при формировании запроса на оплату куда именно надо отправлять этот запрос (от провайдера к провайдеру может немного отличаться процесс но в целом у всех одинаковый)
Ответ написан
@IlyaBursh
В Юкасса, ты можешь создать тестовые платежи без регистрации по ИП.
Вот пример через библиотеку @a2seven/yoo-checkout, на javascript
в этом примере(создание оплаты в телеграмм боте) будет:
1)база данных UserModel от Mongodb
2)функция создания платежа createPayment yoo-checkout
3)функция проверки платежа getPayment yoo-checkout
4)ctx - Telegraf

const YOO_KASSA_CONFIG = {
  shopId: 'id в аккаунте Юкасса' ,
  secretKey: 'ключ в аккаунте Юкасса',
  isTest: true, // Установите в false, чтобы использовать реальную среду
};
const yooKassa = new YooCheckout(YOO_KASSA_CONFIG);
bot.command('pay', async (ctx) => {
  const userId = String(ctx.message.from.id)
  const user = await UserModel.findOne({ userId: userId });
  try {
    const orderId = Math.floor(Math.random() * (10000))  + Date.now();//уникальный Id заказа
    const orderAmount = 100; // Сумма платежа в копейках (например, 100 рублей = 10000 копеек)
    const description = userId + 'совершил успешный платеж'; // Описание платежа
    const createPayload = {
      amount: {
        value: orderAmount,
        currency: 'RUB',
      },
      payment_method_data: {
        type: 'bank_card',
      },
      confirmation: {
        type: 'redirect',
        return_url: 'https://qna.habr.com/q/1264078', // URL для перенаправления пользователя после успешной оплаты
      },
      capture:true,// моментальное потверждение заказа, без ручного принятия на стороне Юкасса
      description:description, // описание в Юкасса о этом платеже
    };
    // Создание платежа в Юkassa
    const payment  = await yooKassa.createPayment(createPayload, orderId);
    // Сохраните информацию о платеже или заказе, чтобы затем проверить его статус
//что бы не создавать второе поле в моей базе данных я записал id в statusPay
     user.statusPay=payment.id
    user.save()
     
     // Получение URL для оплаты из объекта платежа
    const paymentUrl = payment.confirmation.confirmation_url;
    // Отправка пользователю ссылки для оплаты
    ctx.reply(`Чтобы оплатить заказ №${orderId}, перейдите по ссылке: ${paymentUrl}`);
  } catch (error) {
    // Обработка ошибок
    console.error('Error creating payment:', error);
    ctx.reply('Произошла ошибка при создании платежа. Попробуйте позже.');
  }
});
bot.command('status', async (ctx) => {
  const userId = String(ctx.message.from.id)
  const username= await (ctx.message.chat.username)
  const user = await UserModel.findOne({ userId: userId });
  try {
    // Здесь получите paymentId из базы данных или памяти вашего приложения.
    const paymentId = user.statusPay;
    // Получение информации о платеже из Юkassa
    const paymentInfo = await yooKassa.getPayment(paymentId);

    // Обработка информации о статусе платежа
    if(paymentInfo.status==='succeeded'){
      ctx.reply(`${paymentInfo.status}, ${username ?? 'друг'} спасибо за оплату нашего бота!`)
      user.statusPay=paymentInfo.status
      user.save()
    } else{
      ctx.reply(`Статус платежа №${paymentId}: ${paymentInfo.status}`);
      user.statusPay=paymentInfo.status
      user.save()
    }
  } catch (e) {
    console.log(`ошибка в функции статуса платежа`, e);
    ctx.reply('Создайте платеж!');
  }
});


Код не совершенен и есть пару ошибок, но общий принцип из него можно взять.
Надеюсь чем то помог.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы