forked from apoloz/alfa-bank-sdk
93 lines
3.6 KiB
PHP
93 lines
3.6 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
require_once __DIR__ . '/../vendor/autoload.php';
|
||
|
||
use Apoloz\AlfaBank\AlfaBank;
|
||
use Apoloz\AlfaBank\Enums\Environment;
|
||
use Apoloz\AlfaBank\Requests\NominalAccounts\Beneficiaries\GetBeneficiariesRequest;
|
||
|
||
/**
|
||
* Authorization Code Flow (H2H) Example
|
||
*
|
||
* Сценарий: Обмен полученного в браузере кода на токены и дальнейшая работа через refresh_token.
|
||
*/
|
||
|
||
// 1. Конфигурация
|
||
$config = [
|
||
// CERTIFICATES:
|
||
// Production: You generated `private.key` and sent CSR to bank. Bank sent back `client.cer`.
|
||
// Sandbox: Bank sent you these via email/portal.
|
||
'cert' => __DIR__ . '/certs/client.cer',
|
||
'key' => __DIR__ . '/certs/private.key',
|
||
|
||
// APP CREDENTIALS (OAUTH2):
|
||
// From: Developer Portal -> Your App -> Settings/Keys
|
||
// Note: If you don't have client_secret, generate it using `14_generate_client_secret.php`
|
||
'client_id' => getenv('ALFA_BAAS_CLIENT_ID'),
|
||
'client_secret' => getenv('ALFA_BAAS_CLIENT_SECRET'),
|
||
|
||
// REDIRECT URI:
|
||
// Must match exactly what you entered in Developer Portal for this App.
|
||
'redirect_uri' => 'https://your-app.com/callback',
|
||
|
||
// BUSINESS DATA:
|
||
// From your Contract or Internet Bank. Not related to Auth directly.
|
||
'account_number' => '40702810...',
|
||
];
|
||
|
||
// 2. Инициализация коннектора
|
||
$baas = AlfaBank::baas(
|
||
certificatePath: $config['cert'],
|
||
privateKeyPath: $config['key'],
|
||
environment: Environment::SANDBOX
|
||
);
|
||
// ВАЖНО: Мы пока НЕ вызываем login()!
|
||
|
||
try {
|
||
// --- СЦЕНАРИЙ А: Первый вход (у нас есть только код из браузера) ---
|
||
// Ссылка для получения кода: https://baas.alfabank.ru/oidc/authorize?response_type=code&client_id=...
|
||
|
||
$authCode = 'code_from_browser_url'; // <-- Вставьте сюда код
|
||
|
||
if ($authCode) {
|
||
echo "Обмениваем код на токены...\n";
|
||
$tokenData = $baas->authWithCode($authCode, $config['redirect_uri']);
|
||
|
||
echo "Access Token получен!\n";
|
||
echo 'Refresh Token: ' . $tokenData->refresh_token . "\n";
|
||
echo "(Сохраните refresh_token в базу данных)\n\n";
|
||
}
|
||
|
||
// --- СЦЕНАРИЙ Б: Повторный вход (у нас есть сохраненный refresh_token) ---
|
||
$savedRefreshToken = 'your_saved_refresh_token_from_db';
|
||
|
||
if ($savedRefreshToken) {
|
||
echo "Обновляем сессию по Refresh Token...\n";
|
||
$tokenData = $baas->refreshToken($savedRefreshToken);
|
||
|
||
echo 'Сессия обновлена. Новый Access Token действует ' . $tokenData->expires_in . " сек.\n";
|
||
if ($tokenData->refresh_token) {
|
||
echo 'Пришел новый Refresh Token (сохраните его): ' . $tokenData->refresh_token . "\n";
|
||
}
|
||
}
|
||
|
||
// 3. Выполняем защищенный запрос (например, список бенефициаров)
|
||
// Коннектор уже авторизован (внутри updateAccessToken/authWithCode вызывается authenticate())
|
||
|
||
echo "Запрашиваем список...\n";
|
||
$response = $baas->send(new GetBeneficiariesRequest(
|
||
accountNumber: $config['account_number'],
|
||
type: 'FL_RESIDENT'
|
||
));
|
||
|
||
echo 'Успешно! Найдено: ' . count($response->dto()->beneficiaries) . "\n";
|
||
|
||
} catch (\Exception $e) {
|
||
echo 'Ошибка: ' . $e->getMessage() . "\n";
|
||
if (method_exists($e, 'getResponse')) {
|
||
echo 'Body: ' . $e->getResponse()->body() . "\n";
|
||
}
|
||
}
|