>> include 'examples/21_laravel_tinker_sbp_identification.php' */ use Apoloz\AlfaBank\Core\AlfaBankConnector; use Apoloz\AlfaBank\Core\AlfaConfig; use Apoloz\AlfaBank\Data\NominalAccounts\Identification\AmountDistributionData; use Apoloz\AlfaBank\Data\NominalAccounts\Identification\IdentifyRequestData; use Apoloz\AlfaBank\Enums\Environment; use Apoloz\AlfaBank\Requests\NominalAccounts\Identification\GetIdentifyStatusRequest; use Apoloz\AlfaBank\Requests\NominalAccounts\Identification\GetUnidentifiedTransactionsRequest; use Apoloz\AlfaBank\Requests\NominalAccounts\Identification\IdentifyTransactionRequest; use Apoloz\AlfaBank\Sbp\Data\QrCodeRequestData; use Apoloz\AlfaBank\Sbp\Requests\GetQrCodeRequest; use Apoloz\AlfaBank\Sbp\SbpConnector; use Spatie\LaravelData\DataCollection; echo "=== SBP QR → Номинальный счёт → Идентификация (Tinker) ===\n\n"; // ============================================================================= // КОНФИГУРАЦИЯ // ============================================================================= $nominalAccountNumber = '40702810601880001584'; // Номинальный счёт из sandbox $beneficiaryId = 'your-beneficiary-id-here'; // ID бенефициара (получить из списка) $amount = '15000'; // 150.00 RUB в копейках echo "Номинальный счёт: $nominalAccountNumber\n"; echo 'Сумма: ' . number_format($amount / 100, 2) . " RUB\n\n"; // ============================================================================= // ШАГ 1: Генерация SBP QR // ============================================================================= echo "=== ШАГ 1: Генерация SBP QR кода ===\n"; try { // SBP Connector $sbpConfig = new AlfaConfig( baseUrl: Environment::SBP_SANDBOX->value, certificatePath: config('alfa-bank.sbp.certificate_path'), privateKeyPath: config('alfa-bank.sbp.private_key_path'), caBundlePath: config('alfa-bank.sbp.ca_bundle'), signingPrivateKeyPath: config('alfa-bank.sbp.signing_private_key_path') ); $sbp = new SbpConnector($sbpConfig, config('alfa-bank.sbp.key_name_alias')); $orderNumber = 'ORDER-' . uniqid(); $qrResponse = $sbp->send(new GetQrCodeRequest( new QrCodeRequestData( termNo: config('alfa-bank.sbp.terminal_no'), qrcType: '02', // Dynamic QR amount: $amount, currency: 'RUB', paymentPurpose: "Пополнение счета $nominalAccountNumber", orderNumber: $orderNumber, messageID: 'sbp-' . uniqid(), qrTtl: '60' ) )); $qrData = $qrResponse->dto(); if ($qrData->ErrorCode !== 0) { echo "❌ Ошибка генерации QR: {$qrData->message}\n"; return; } echo "✅ QR код сгенерирован!\n"; echo " Order: $orderNumber\n"; echo " QRC ID: {$qrData->qrcId}\n"; echo " Payload: {$qrData->payload}\n\n"; // ============================================================================= // ШАГ 2: Получение неидентифицированных пополнений // ============================================================================= echo "=== ШАГ 2: Поиск неидентифицированных пополнений ===\n"; echo "(После оплаты клиентом через SBP)\n\n"; $baas = app(AlfaBankConnector::class); // Получаем список $unidentifiedResponse = $baas->send( new GetUnidentifiedTransactionsRequest($nominalAccountNumber, limit: 5) ); $transactions = $unidentifiedResponse->dto()->items; echo 'Найдено транзакций: ' . count($transactions) . "\n\n"; if (count($transactions) === 0) { echo "⚠️ Нет неидентифицированных пополнений\n"; return; } // Показываем список foreach ($transactions as $i => $tx) { echo " [$i] ID: {$tx->id}\n"; echo " Сумма: {$tx->amount} RUB\n"; echo " Назначение: {$tx->purpose}\n"; echo " Плательщик: {$tx->payer?->name}\n\n"; } // Берём первую для примера $transaction = $transactions[0]; echo "✅ Выбрана транзакция: {$transaction->id} ({$transaction->amount} RUB)\n\n"; // ============================================================================= // ШАГ 3: Идентификация (привязка к бенефициару) // ============================================================================= echo "=== ШАГ 3: Идентификация платежа ===\n"; if (empty($beneficiaryId) || $beneficiaryId === 'your-beneficiary-id-here') { echo "⚠️ Укажите правильный beneficiaryId!\n"; echo " Получите список бенефициаров через:\n"; echo " >>> \$baas->send(new GetBeneficiariesRequest())->dto()\n"; return; } $identifyData = new IdentifyRequestData( transactionId: $transaction->id, accountNumber: $nominalAccountNumber, amountDistribution: DataCollection::create([ new AmountDistributionData( beneficiaryId: $beneficiaryId, amount: $transaction->amount ), ], AmountDistributionData::class) ); $identifyResponse = $baas->send( new IdentifyTransactionRequest($transaction->id, $identifyData) ); $result = $identifyResponse->dto(); echo "✅ Запрос создан!\n"; echo " Identify ID: {$result->identifyId}\n"; echo " Статус: {$result->status}\n\n"; // ============================================================================= // ШАГ 4: Проверка статуса // ============================================================================= echo "=== ШАГ 4: Проверка статуса ===\n"; $statusResponse = $baas->send( new GetIdentifyStatusRequest($result->identifyId) ); $status = $statusResponse->dto(); echo "Текущий статус: {$status->status}\n\n"; echo "=== РЕЗУЛЬТАТ ===\n"; echo "✅ SBP QR: {$qrData->payload}\n"; echo "✅ Транзакция: {$transaction->id}\n"; echo "✅ Бенефициар: $beneficiaryId\n"; echo "✅ Сумма: {$transaction->amount} RUB\n"; echo "✅ Статус идентификации: {$status->status}\n"; } catch (\Exception $e) { echo "\n❌ Ошибка: {$e->getMessage()}\n"; echo 'Класс: ' . get_class($e) . "\n"; } echo "\n=== Готово ===\n";