103 lines
4.3 KiB
PHP
103 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 Apoloz\AlfaBank\Utils\CmsSigner;
|
|
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";
|
|
}
|