Files
alfa-bank-sdk/examples/21_laravel_tinker_sbp_identification.php
Anatoliy Poloz b15d29f8e9 fix(formating)
2026-01-28 03:36:26 +03:00

180 lines
6.9 KiB
PHP

<?php
declare(strict_types=1);
/**
* Laravel Tinker: SBP QR → Номинальный счёт → Идентификация
*
* Использование:
* docker compose exec php-fpm php artisan tinker
* >>> 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";