- Implement H2H authentication service for secure client authentication - Add new examples for authorization code flow and H2H auth service - Include example for generating client secret - Update core connector and token request functionality - Enhance README with new features Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
106 lines
4.4 KiB
PHP
106 lines
4.4 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
|
||
$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
|
||
$auth = AlfaBank::auth(
|
||
'client_id', 'client_secret', 'https://callback',
|
||
'transport.crt', 'transport.key'
|
||
);
|
||
$auth->refreshToken('saved_refresh_token_from_db');
|
||
|
||
// --- ЭТАП 1: Создание Бенефициара (Контрагента) ---
|
||
echo "1. Регистрация бенефициара...\n";
|
||
|
||
$beneficiaryData = new CreateBeneficiaryRequestData(
|
||
type: 'FL_RESIDENT',
|
||
countryOfTaxResidence: 'RU',
|
||
addresses: AddressData::collect([
|
||
['type' => 'REGISTRATION_ADDRESS', 'address' => 'г. Москва, ул. Ленина 1', 'country' => 'RU']
|
||
], DataCollection::class),
|
||
digestSignatures: DigestSignatureData::collect([
|
||
[
|
||
'base64Encoded' => CmsSigner::sign('Data to sign', $signCert, $signKey),
|
||
'signatureType' => 'cms'
|
||
]
|
||
], DataCollection::class),
|
||
name: 'Иванов Иван Иванович',
|
||
inn: '771234567890'
|
||
);
|
||
|
||
$response = $baas->send(new CreateBeneficiaryRequest($beneficiaryData));
|
||
$beneficiaryId = $response->dto()->requestId; // В некоторых версиях API возвращается UUID
|
||
echo "Бенефициар создан. ID запроса: $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";
|
||
}
|