Подтверждение платежа

Шаги для подтверждения (захвата) платежа

В этом разделе мы рассмотрим, как подтвердить (или захватить) платеж, который был ранее создан. Этот процесс обычно выполняется после того, как заказ подтвержден, и продавец готов забрать средства с клиента.

Вызов метода для захвата платежа

Для захвата платежа необходимо указать идентификатор платежа.

Используйте метод capturePayment для захвата средств с карты клиента. Метод отправит запрос на сервер Yookassa и вернет обновленную информацию о платеже.

import { YookassaService } from 'nestjs-yookassa';
 
@Injectable()
export class PaymentService {
	constructor(private readonly yookassaService: YookassaService) {}
 
	async capturePayment() {
		const paymentId = '123456'
 
		const capturedPayment = await this.yookassaService.capturePayment(paymentId);
 
		return capturedPayment
	}
}

Обработка ответа от API

Ответ от Yookassa после захвата платежа содержит информацию о платеже, включая его обновлённый статус, сумму и другие важные данные. Пример ответа:

{
	"id": "32f3dce3-e775-424f-a265-4e1e86e3db08",  // Идентификатор платежа
	"status": "pending", // Статус платежа
	"amount": {
		"value": "100.00", // Сумма платежа
		"currency": "RUB" // Валюта платежа
	},
	"income_amount": {
		"value": "96.50",  // Сумма, фактически полученная магазином (с учетом комиссии)
		"currency": "RUB"  // Валюта фактически полученной суммы
	},
	"description": "Test payment", // Описание платежа
	"recipient": {
		"account_id": "1234567", // Идентификатор аккаунта получателя (магазина)
		"gateway_id": "1234567" // Идентификатор шлюза получателя
	},
	"payment_method": {
		"type": "yoo_money", // Тип метода оплаты
		"id": "32f3dce3-e775-424f-a265-4e1e86e3db08", // Идентификатор метода платежа
		"saved": false, // Флаг, указывающий, сохранены ли данные карты (если применимо)
		"status": "inactive" // Статус метода оплаты
		"title": "YooMoney wallet 111111111111111", // Название способа оплаты
		"account_number": "111111111111111" // Номер счета, с которого был произведен платеж
	},
	"captured_at": "2025-01-17T11:45:09.367Z", // Дата и время захвата платежа
	"created_at": "2025-01-17T11:38:48.411Z", // Дата и время создания платежа
	"test": true, // Флаг, показывающий, что это тестовый платеж (не реальный).
	"refunded_amount": {
		"value": "0.00", // Сумма возврата
		"currency": "RUB" // Валюта суммы возврата
	},
	"paid": true,  // Платеж был произведен (true - да)
	"refundable": true,  // Платеж можно вернуть (true - да)
	"metadata": {
		"order_id": "12345678" // Дополнительные метаданные, предоставленные при создании платежа (например, ID заказа).
	}
}

Если платеж успешно захвачен, вы получите информацию с обновленным статусом платежа и временем захвата. В случае ошибки будет выброшено исключение с описанием ошибки.

Возможные статусы платежа

  • pending — Платеж ожидает обработки.
  • waiting_for_capture — Платеж ожидает захвата средств.
  • succeeded — Платеж успешно завершен.
  • canceled — Платеж был отменен.

Возможные ошибки

При попытке захватить платеж, который ещё не был подтвержден или оплачен, может возникнуть ошибка. Пример ошибки:

{
	"statusCode": 400,
	"message": "Incorrect payment_id. Payment doesn't exist or access denied. Specify the payment ID created in your store."
}

Эта ошибка возникает, когда пытаются подтвердить или захватить платеж, который ещё не был оплачен. Убедитесь, что вы выполняете захват платежа только после того, как он будет подтвержден и средства будут зарезервированы.