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

101 lines
4.3 KiB
PHP

<?php
declare(strict_types=1);
require_once __DIR__ . '/../vendor/autoload.php';
use Apoloz\AlfaBank\AlfaBank;
use Apoloz\AlfaBank\Data\NominalAccounts\Beneficiaries\AddressData;
use Apoloz\AlfaBank\Data\NominalAccounts\Beneficiaries\CreateBeneficiaryRequestData;
use Apoloz\AlfaBank\Data\NominalAccounts\Payouts\DigestSignatureData;
use Apoloz\AlfaBank\Data\NominalAccounts\Payouts\PayoffRequestData;
use Apoloz\AlfaBank\Data\NominalAccounts\Payouts\PayoutRequisiteData;
use Apoloz\AlfaBank\Data\NominalAccounts\Payouts\RecipientData;
use Apoloz\AlfaBank\Requests\NominalAccounts\Beneficiaries\CreateBeneficiaryRequest;
use Apoloz\AlfaBank\Requests\NominalAccounts\Beneficiaries\ScoreBeneficiaryRequest;
use Apoloz\AlfaBank\Requests\NominalAccounts\Payouts\CreatePayoffRequest;
use Spatie\LaravelData\DataCollection;
/**
* ПОЛНЫЙ ЖИЗНЕННЫЙ ЦИКЛ НОМИНАЛЬНОГО СЧЕТА
* Сценарий: Регистрация контрагента -> Верификация -> Выплата
*/
// 1. Инициализация SDK
// Сертификаты (Transport Certs):
// Получены от банка (Sandbox) или сгенерированы вами и активированы банком (Production).
$baas = AlfaBank::baas(
certificatePath: 'transport.crt',
privateKeyPath: 'transport.key'
);
// Данные для подписи (в реальном приложении загружаются из защищенного хранилища)
$signCert = file_get_contents('signing.crt');
$signKey = file_get_contents('signing.key');
try {
// Auth: Nominal Accounts require H2H Flow
// client_id: Из Портала разработчика
// client_secret: Из Портала разработчика (глаз) или сгенерирован через SDK (examples/14_generate_client_secret.php)
$auth = AlfaBank::auth(
'client_id', 'client_secret', 'https://callback',
'transport.crt', 'transport.key'
);
$auth->refreshToken('saved_refresh_token_from_db');
// --- ЭТАП 1: Создание Бенефициара (Контрагента) ---
$benData = new CreateBeneficiaryRequestData(
type: 'FL_RESIDENT',
countryOfTaxResidence: 'RU',
name: 'Иванов Иван',
addresses: AddressData::collect([
new AddressData('REGISTRATION_ADDRESS', 'Moscow', 'RU'),
])
);
// Автоматическая подпись
$benData->sign($baas->getSigner());
$response = $baas->send(new CreateBeneficiaryRequest($benData));
$beneficiaryId = $response->dto()->id;
echo "Beneficiary Created: $beneficiaryId\n";
// --- ЭТАП 2: Идентификация Входящего Платежа ---
// После создания банк должен проверить бенефициара
echo '2. Запуск верификации (скоринга)...';
$baas->send(new ScoreBeneficiaryRequest($beneficiaryId));
echo "Скоринг инициирован.\n";
// --- ЭТАП 3: Выплата (Payoff) ---
// Когда бенефициар проверен, можно делать выплату
echo '3. Создание выплаты...';
$payoffData = new PayoffRequestData(
type: 'PAYMENT_ORDER',
accountNumber: '40702810...', // Ваш номинальный счет
recipient: new RecipientData(
name: 'Иванов Иван Иванович',
inn: '771234567890'
),
payoutRequisite: new PayoutRequisiteData(
type: 'ACCOUNT',
accountNumber: '40817810...', // Личный счет Иванова
bik: '044525593'
),
amount: '1000.50',
purpose: 'Выплата по договору комиссии',
digestSignatures: DigestSignatureData::collect([
[
'base64Encoded' => '...', // Здесь должна быть подпись тела выплаты
'signatureType' => 'cms',
],
], DataCollection::class)
);
$payoffResponse = $baas->send(new CreatePayoffRequest($payoffData));
echo 'Выплата создана. ID: ' . $payoffResponse->dto()->payoffId . "\n";
} catch (\Exception $e) {
echo 'Ошибка: ' . $e->getMessage() . "\n";
}