PHP code example of tigusigalpa / vtb-id-php

1. Go to this page and download the library: Download tigusigalpa/vtb-id-php library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

tigusigalpa / vtb-id-php example snippets


// Успешная авторизация
Route::get('/auth/vtb/success', function () {
    $user = session('vtbid_user');
    
    // Здесь создайте/обновите пользователя в БД
    // и авторизуйте его в системе
    
    dd($user); // Для тестирования
})->name('vtbid.success');

// Ошибка авторизации
Route::get('/auth/vtb/error', function () {
    $error = session('error');
    return redirect('/login')->with('error', $error);
})->name('vtbid.error');

// config.php
return [
    'client_id' => 'your_client_id',
    'client_secret' => 'your_client_secret',
    'redirect_uri' => 'https://your-domain.com/callback.php',
];


Tigusigalpa\VTBID\VTBIDClient;

session_start();

$config = ate();
$_SESSION['vtbid_state'] = $state;

$authUrl = $client->getAuthorizationUrl($state);

header('Location: ' . $authUrl);
exit;


Tigusigalpa\VTBID\VTBIDClient;
use Tigusigalpa\VTBID\Exceptions\VTBIDException;

session_start();

$config = �рка state
if (!$code || !isset($_SESSION['vtbid_state']) || $_SESSION['vtbid_state'] !== $state) {
    die('Invalid request');
}

unset($_SESSION['vtbid_state']);

try {
    // Получение токена
    $tokenData = $client->getAccessToken($code);
    
    // Получение данных пользователя
    $userData = $client->getUserData($tokenData['access_token']);
    
    // Сохранение в сессию
    $_SESSION['vtbid_access_token'] = $tokenData['access_token'];
    $_SESSION['vtbid_refresh_token'] = $tokenData['refresh_token'] ?? null;
    $_SESSION['vtbid_user'] = $userData->toArray();
    
    // Перенаправление на главную
    header('Location: /dashboard.php');
    exit;
    
} catch (VTBIDException $e) {
    die('Ошибка авторизации: ' . $e->getMessage());
}


session_start();

if (!isset($_SESSION['vtbid_user'])) {
    header('Location: /login.php');
    exit;
}

$user = $_SESSION['vtbid_user'];

return redirect()->route('vtbid.redirect');

use Tigusigalpa\VTBID\VTBIDClient;
use Tigusigalpa\VTBID\Exceptions\VTBIDException;

// Через Dependency Injection
public function __construct(protected VTBIDClient $vtbid)
{
}

// Или через Facade
use Tigusigalpa\VTBID\Facades\VTBID;

// Получение URL для авторизации
$state = VTBID::generateState();
session(['vtbid_state' => $state]);
$authUrl = VTBID::getAuthorizationUrl($state);

return redirect($authUrl);

// Обработка callback
try {
    $tokenData = VTBID::getAccessToken($code);
    // $tokenData содержит: access_token, refresh_token, expires_in, token_type
    
    $userData = VTBID::getUserData($tokenData['access_token']);
    
    // Доступ к данным пользователя
    echo $userData->name;
    echo $userData->surname;
    echo $userData->email;
    echo $userData->getFullName(); // Фамилия Имя Отчество
    
} catch (VTBIDException $e) {
    Log::error('VTB ID Error: ' . $e->getMessage());
}

try {
    $refreshToken = session('vtbid_refresh_token');
    $newTokenData = VTBID::refreshAccessToken($refreshToken);
    
    session([
        'vtbid_access_token' => $newTokenData['access_token'],
        'vtbid_refresh_token' => $newTokenData['refresh_token'] ?? null,
    ]);
} catch (VTBIDException $e) {
    // Токен истек или невалиден
}

try {
    $accessToken = session('vtbid_access_token');
    VTBID::revokeToken($accessToken, 'access_token');
    
    session()->forget(['vtbid_access_token', 'vtbid_refresh_token', 'vtbid_user']);
} catch (VTBIDException $e) {
    Log::error('Failed to revoke token: ' . $e->getMessage());
}

// Проверка авторизации
if (vtbid_authenticated()) {
    $user = vtbid_user();
    $token = vtbid_access_token();
}

$userData->getFullName(); // Возвращает "Фамилия Имя Отчество"
$userData->toArray(); // Преобразует в массив
$userData->getRawData(); // Возвращает исходные данные от API

public function up()
{
    Schema::table('users', function (Blueprint $table) {
        $table->string('vtb_id')->nullable()->unique()->after('id');
        $table->string('surname')->nullable()->after('name');
        $table->string('patronymic')->nullable()->after('surname');
        $table->string('phone')->nullable()->after('email');
    });
}

protected $fillable = [
    'name',
    'surname',
    'patronymic',
    'email',
    'phone',
    'vtb_id',
    'password',
];

use App\Models\User;
use Illuminate\Support\Facades\Auth;

Route::get('/auth/vtb/success', function () {
    $vtbUser = session('vtbid_user');
    
    $user = User::updateOrCreate(
        ['vtb_id' => $vtbUser['sub']],
        [
            'name' => $vtbUser['name'],
            'surname' => $vtbUser['surname'],
            'patronymic' => $vtbUser['patronymic'],
            'email' => $vtbUser['email'],
            'phone' => $vtbUser['mainMobilePhone'],
        ]
    );
    
    Auth::login($user, true);
    
    return redirect('/dashboard');
})->name('vtbid.success');

public function __construct(array $config = [])

public function getAuthorizationUrl(?string $state = null): string

public function generateState(): string

public function getAccessToken(string $code): array

[
    'access_token' => '...',
    'refresh_token' => '...',
    'expires_in' => 3600,
    'token_type' => 'Bearer'
]

public function refreshAccessToken(string $refreshToken): array

public function getUserData(string $accessToken): VTBIDUser

public function revokeToken(string $token, string $tokenTypeHint = 'access_token'): bool

use Tigusigalpa\VTBID\Facades\VTBID;

$authUrl = VTBID::getAuthorizationUrl();
$state = VTBID::generateState();
$tokenData = VTBID::getAccessToken($code);
$userData = VTBID::getUserData($accessToken);
$newTokenData = VTBID::refreshAccessToken($refreshToken);
VTBID::revokeToken($token);

protected $routeMiddleware = [
    'vtbid.auth' => \Tigusigalpa\VTBID\Middleware\VTBIDAuthenticated::class,
];

Route::middleware(['vtbid.auth'])->group(function () {
    Route::get('/profile', function () {
        return view('profile', ['user' => vtbid_user()]);
    });
});


Tigusigalpa\VTBID\VTBIDClient;
use Tigusigalpa\VTBID\Exceptions\VTBIDException;

session_start();

$config = try {
        $client->revokeToken($_SESSION['vtbid_access_token']);
    } catch (VTBIDException $e) {
        // Логирование ошибки
        error_log('Failed to revoke token: ' . $e->getMessage());
    }
}

// Очистка сессии
session_destroy();

header('Location: /login.php');
exit;


Tigusigalpa\VTBID\VTBIDClient;
use Tigusigalpa\VTBID\Exceptions\VTBIDException;

session_start();

$config = a = $client->refreshAccessToken($_SESSION['vtbid_refresh_token']);
        
        $_SESSION['vtbid_access_token'] = $newTokenData['access_token'];
        $_SESSION['vtbid_refresh_token'] = $newTokenData['refresh_token'] ?? $_SESSION['vtbid_refresh_token'];
        
        echo "Токен обновлен успешно!";
    } catch (VTBIDException $e) {
        echo "Ошибка обновления токена: " . $e->getMessage();
        header('Location: /login.php');
        exit;
    }
}


// callback.php с сохранением в БД
ID\Exceptions\VTBIDException;

session_start();

$config = | !isset($_SESSION['vtbid_state']) || $_SESSION['vtbid_state'] !== $state) {
    die('Invalid request');
}

unset($_SESSION['vtbid_state']);

try {
    $tokenData = $client->getAccessToken($code);
    $userData = $client->getUserData($tokenData['access_token']);
    
    // Подключение к БД
    $pdo = new PDO('mysql:host=localhost;dbname=myapp', 'username', 'password');
    
    // Поиск или создание пользователя
    $stmt = $pdo->prepare("
        INSERT INTO users (vtb_id, name, surname, patronymic, email, phone, created_at, updated_at)
        VALUES (:vtb_id, :name, :surname, :patronymic, :email, :phone, NOW(), NOW())
        ON DUPLICATE KEY UPDATE
            name = :name,
            surname = :surname,
            patronymic = :patronymic,
            email = :email,
            phone = :phone,
            updated_at = NOW()
    ");
    
    $stmt->execute([
        'vtb_id' => $userData->sub,
        'name' => $userData->name,
        'surname' => $userData->surname,
        'patronymic' => $userData->patronymic,
        'email' => $userData->email,
        'phone' => $userData->mainMobilePhone,
    ]);
    
    $userId = $pdo->lastInsertId() ?: $pdo->query("SELECT id FROM users WHERE vtb_id = '{$userData->sub}'")->fetchColumn();
    
    // Сохранение в сессию
    $_SESSION['user_id'] = $userId;
    $_SESSION['vtbid_access_token'] = $tokenData['access_token'];
    $_SESSION['vtbid_user'] = $userData->toArray();
    
    header('Location: /dashboard.php');
    exit;
    
} catch (VTBIDException $e) {
    die('Ошибка авторизации: ' . $e->getMessage());
} catch (PDOException $e) {
    die('Ошибка БД: ' . $e->getMessage());
}

use Tigusigalpa\VTBID\VTBIDClient;
use Tigusigalpa\VTBID\Exceptions\VTBIDException;

Route::get('/custom/vtb/login', function (VTBIDClient $vtbid) {
    $state = $vtbid->generateState();
    session(['vtbid_state' => $state]);
    return redirect($vtbid->getAuthorizationUrl($state));
});

Route::get('/custom/vtb/callback', function (Request $request, VTBIDClient $vtbid) {
    $code = $request->input('code');
    $state = $request->input('state');
    
    if (!$code || session('vtbid_state') !== $state) {
        return redirect()->route('login')->with('error', 'Invalid request');
    }
    
    try {
        $tokenData = $vtbid->getAccessToken($code);
        $userData = $vtbid->getUserData($tokenData['access_token']);
        
        // Ваша логика
        
        return redirect()->route('dashboard');
    } catch (VTBIDException $e) {
        return redirect()->route('login')->with('error', $e->getMessage());
    }
});

use Tigusigalpa\VTBID\Exceptions\VTBIDException;

public function register()
{
    $this->renderable(function (VTBIDException $e, $request) {
        \Log::error('VTB ID Exception', [
            'message' => $e->getMessage(),
            'code' => $e->getCode(),
        ]);

        if ($request->expectsJson()) {
            return response()->json([
                'error' => 'vtb_id_error',
                'message' => $e->getMessage(),
            ], 400);
        }

        return redirect()->route('login')
            ->with('error', 'Ошибка VTB ID: ' . $e->getMessage());
    });
}

namespace App\Http\Middleware;

use Closure;
use Tigusigalpa\VTBID\Facades\VTBID;
use Tigusigalpa\VTBID\Exceptions\VTBIDException;

class RefreshVTBIDToken
{
    public function handle(Request $request, Closure $next)
    {
        if (!session()->has('vtbid_access_token')) {
            return redirect()->route('vtbid.redirect');
        }

        $expiresAt = session('vtbid_token_expires_at');
        
        if ($expiresAt && now()->addMinutes(5)->greaterThan($expiresAt)) {
            $refreshToken = session('vtbid_refresh_token');
            
            if ($refreshToken) {
                try {
                    $newTokenData = VTBID::refreshAccessToken($refreshToken);
                    
                    session([
                        'vtbid_access_token' => $newTokenData['access_token'],
                        'vtbid_refresh_token' => $newTokenData['refresh_token'] ?? $refreshToken,
                        'vtbid_token_expires_at' => now()->addSeconds($newTokenData['expires_in'] ?? 3600),
                    ]);
                } catch (VTBIDException $e) {
                    session()->forget(['vtbid_access_token', 'vtbid_refresh_token']);
                    return redirect()->route('vtbid.redirect');
                }
            }
        }

        return $next($request);
    }
}

// Проверяйте email_verified
if (!$vtbUser['email_verified']) {
    return redirect()->back()
        ->with('warning', 'Email не подтвержден');
}

// Логируйте попытки авторизации
\Log::info('VTB ID login attempt', [
    'vtb_id' => $vtbUser['sub'],
    'email' => $vtbUser['email'],
]);

'secure' => env('SESSION_SECURE_COOKIE', true),
'http_only' => true,
'same_site' => 'lax',

>>> config('vtbid.client_id')
=> "your_client_id"

>>> app(Tigusigalpa\VTBID\VTBIDClient::class)
=> Tigusigalpa\VTBID\VTBIDClient {#...}

>>> route('vtbid.redirect')
=> "http://your-domain.test/auth/vtb/redirect"
bash
composer 
bash
php artisan vendor:publish --tag=vtbid-config
json
{
    "repositories": [
        {
            "type": "path",
            "url": "./packages/vtb-id-php"
        }
    ],
    "
bash
composer 
bash
composer vendor:publish --tag=vtbid-config
bash
composer 
bash
php artisan migrate

/
├── vendor/
├── config.php
├── login.php
├── callback.php
├── dashboard.php
├── logout.php
└── composer.json
bash
php artisan config:cache
php artisan route:cache
bash
php artisan tinker
bash
php artisan route:list | grep vtb
bash
composer dump-autoload
php artisan config:clear
php artisan cache:clear