178 lines
7.0 KiB
PHP
178 lines
7.0 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\Enums\Environment;
|
|
use Apoloz\AlfaBank\Sbp\SbpConnector;
|
|
use Apoloz\AlfaBank\Sbp\Data\QrCodeRequestData;
|
|
use Apoloz\AlfaBank\Sbp\Requests\GetQrCodeRequest;
|
|
use Apoloz\AlfaBank\Requests\NominalAccounts\Identification\GetUnidentifiedTransactionsRequest;
|
|
use Apoloz\AlfaBank\Requests\NominalAccounts\Identification\IdentifyTransactionRequest;
|
|
use Apoloz\AlfaBank\Requests\NominalAccounts\Identification\GetIdentifyStatusRequest;
|
|
use Apoloz\AlfaBank\Data\NominalAccounts\Identification\IdentifyRequestData;
|
|
use Apoloz\AlfaBank\Data\NominalAccounts\Identification\AmountDistributionData;
|
|
use Apoloz\AlfaBank\Data\NominalAccounts\Payouts\DigestSignatureData;
|
|
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";
|