varxpay/sdk

Official PHP SDK for VarxPay Payment Gateway API

Maintainers

Package info

gitlab.com/KravaDima/varxpaysdk

Issues

pkg:composer/varxpay/sdk

Statistics

Installs: 3

Dependents: 0

Suggesters: 0

Stars: 0

1.0.0 2026-01-11 21:49 UTC

This package is auto-updated.

Last update: 2026-03-11 20:36:32 UTC


README

Офіційний PHP SDK для інтеграції з платіжним шлюзом VarxPay.

PHP Version License

📋 Вимоги

  • PHP 8.1 або вище
  • Composer
  • Guzzle HTTP Client ^7.0

📦 Встановлення

Через Composer

composer require varxpay/sdk

⚙️ Конфігурація

Основне використання (без фреймворку)

<?php

require_once 'vendor/autoload.php';

use VarxPay\VarxPayClient;

$client = new VarxPayClient(
    publicKey: 'your_public_key',
    privateKey: 'your_private_key',
    baseUrl: 'https://varxpay.com'
);

Laravel

  1. Опублікуйте конфігурацію:
php artisan vendor:publish --tag=varxpay-config
  1. Додайте змінні оточення в .env:
VARXPAY_PUBLIC_KEY=your_public_key
VARXPAY_PRIVATE_KEY=your_private_key
VARXPAY_BASE_URL=https://varxpay.com
  1. Використання через Facade або Dependency Injection:
<?php

use VarxPay\Laravel\Facades\VarxPay;
use VarxPay\VarxPayClient;

// Через Facade
$response = VarxPay::createInvoice('100.00', 'ORDER-123', 'Оплата замовлення');

// Через DI
class PaymentController extends Controller
{
    public function create(VarxPayClient $client)
    {
        $response = $client->createInvoice('100.00', 'ORDER-123');
        return redirect($response->getPaymentUrl());
    }
}

Symfony

  1. Зареєструйте bundle в config/bundles.php:
<?php

return [
    // ...
    VarxPay\Symfony\VarxPayBundle::class => ['all' => true],
];
  1. Створіть конфігурацію config/packages/varxpay.yaml:
varxpay:
    public_key: '%env(VARXPAY_PUBLIC_KEY)%'
    private_key: '%env(VARXPAY_PRIVATE_KEY)%'
    base_url: '%env(VARXPAY_BASE_URL)%'
    http_options:
        timeout: 30
        connect_timeout: 10
  1. Додайте змінні оточення в .env:
VARXPAY_PUBLIC_KEY=your_public_key
VARXPAY_PRIVATE_KEY=your_private_key
VARXPAY_BASE_URL=https://varxpay.com
  1. Використання через Dependency Injection:
<?php

use VarxPay\VarxPayClient;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;

class PaymentController extends AbstractController
{
    public function create(VarxPayClient $client): Response
    {
        $response = $client->createInvoice('100.00', 'ORDER-123');
        return $this->redirect($response->getPaymentUrl());
    }
}

🚀 Використання

Створення інвойсу

<?php

use VarxPay\VarxPayClient;
use VarxPay\Exception\ApiException;

$client = new VarxPayClient(
    publicKey: 'your_public_key',
    privateKey: 'your_private_key',
    baseUrl: 'https://varxpay.com'
);

try {
    // Простий спосіб
    $response = $client->createInvoice(
        amount: '100.50',
        orderId: 'ORDER-' . time(),
        description: 'Оплата замовлення #12345'
    );

    if ($response->isSuccess()) {
        // Редірект клієнта на сторінку оплати
        header('Location: ' . $response->getPaymentUrl());
        exit;
    } else {
        echo 'Помилка: ' . $response->getError();
    }
} catch (ApiException $e) {
    echo 'API помилка: ' . $e->getMessage();
    echo 'HTTP код: ' . $e->getHttpStatusCode();
}

Створення інвойсу з розширеними параметрами

<?php

use VarxPay\VarxPayClient;
use VarxPay\DTO\CreateInvoiceRequest;

$client = new VarxPayClient(
    publicKey: 'your_public_key',
    privateKey: 'your_private_key',
    baseUrl: 'https://varxpay.com'
);

// Створення запиту з повним контролем
$request = new CreateInvoiceRequest(
    publicKey: 'your_public_key',
    amount: '250.00',
    orderId: 'ORDER-12345',
    description: 'Підписка на місяць',
    currency: 'USDT',
    action: 'pay',
    version: 1
);

$response = $client->createInvoiceFromRequest($request);

Обробка Callback (Webhook)

VarxPay надсилає callback на вашу callback URL при зміні статусу платежу.

<?php

use VarxPay\CallbackHandler;
use VarxPay\DTO\Callback;
use VarxPay\Exception\SignatureException;

// Створення обробника з приватним ключем
$handler = new CallbackHandler('your_private_key');

// Або через клієнт
// $handler = $client->createCallbackHandler();

try {
    // Обробка POST запиту від VarxPay
    $callback = $handler->handleFromRequest();
    
    // Перевірка статусу
    if ($callback->isApproved()) {
        // Платіж успішний!
        $orderId = $callback->getOrderReference(); // ваш order_id
        $invoiceId = $callback->getOrderId();      // VarxPay invoice UID
        $amount = $callback->getAmount();
        
        // Оновіть статус замовлення в вашій БД
        updateOrderStatus($orderId, 'paid');
        
    } elseif ($callback->isDeclined()) {
        // Платіж відхилено
        updateOrderStatus($callback->getOrderReference(), 'failed');
        
    } elseif ($callback->isPending()) {
        // Платіж в очікуванні
        updateOrderStatus($callback->getOrderReference(), 'pending');
    }
    
    // Відповідь для VarxPay (HTTP 200)
    http_response_code(200);
    echo json_encode(['status' => 'ok']);
    
} catch (SignatureException $e) {
    // Невалідний підпис - можлива атака!
    http_response_code(403);
    echo json_encode(['error' => 'Invalid signature']);
    
} catch (\Exception $e) {
    http_response_code(500);
    echo json_encode(['error' => 'Internal error']);
}

Обробка Callback в Laravel

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use VarxPay\CallbackHandler;
use VarxPay\Exception\SignatureException;

class VarxPayCallbackController extends Controller
{
    public function __construct(
        private CallbackHandler $callbackHandler
    ) {}
    
    public function handle(Request $request)
    {
        try {
            $callback = $this->callbackHandler->handle(
                $request->all()
            );
            
            if ($callback->isApproved()) {
                // Оновити замовлення
                Order::where('order_id', $callback->getOrderReference())
                    ->update(['status' => 'paid']);
            }
            
            return response()->json(['status' => 'ok']);
            
        } catch (SignatureException $e) {
            return response()->json(['error' => 'Invalid signature'], 403);
        }
    }
}

Обробка Callback в Symfony

<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use VarxPay\CallbackHandler;
use VarxPay\Exception\SignatureException;

class VarxPayCallbackController extends AbstractController
{
    #[Route('/webhook/varxpay', name: 'varxpay_callback', methods: ['POST'])]
    public function callback(Request $request, CallbackHandler $handler): JsonResponse
    {
        try {
            $payload = json_decode($request->getContent(), true);
            $callback = $handler->handle($payload);
            
            if ($callback->isApproved()) {
                // Обробка успішного платежу
            }
            
            return new JsonResponse(['status' => 'ok']);
            
        } catch (SignatureException $e) {
            return new JsonResponse(['error' => 'Invalid signature'], 403);
        }
    }
}

📊 Структура Callback

Callback від VarxPay містить наступні дані:

ПолеТипОпис
orderIdstringУнікальний ID інвойсу VarxPay
merchantAccountstringСлаг компанії
orderReferencestringВаш order_id
amountstringСума платежу
currencystringВалюта (USDT)
emailstringEmail клієнта (якщо є)
processingDatestringДата обробки (Y-m-d H:i:s)
transactionStatusstringСтатус: Approved, Declined, Pending
last4stringОстанні 4 символи адреси відправника
signaturestringПідпис для верифікації

🔐 Генерація підпису

Підпис генерується за формулою:

base64_encode(sha1($privateKey . $dataJson . $privateKey, true))

Де $dataJson - це JSON рядок без пробілів (використовуйте json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)).

SDK автоматично генерує та перевіряє підписи.

⚠️ Обробка помилок

SDK використовує виключення для повідомлення про помилки:

<?php

use VarxPay\Exception\VarxPayException;
use VarxPay\Exception\ApiException;
use VarxPay\Exception\SignatureException;
use VarxPay\Exception\ConfigurationException;

try {
    $response = $client->createInvoice('100.00', 'ORDER-123');
} catch (ApiException $e) {
    // Помилка API запиту
    echo $e->getMessage();
    echo $e->getHttpStatusCode();
    echo $e->getApiErrorMessage();
} catch (ConfigurationException $e) {
    // Помилка конфігурації
} catch (SignatureException $e) {
    // Помилка підпису
} catch (VarxPayException $e) {
    // Загальна помилка SDK
}

Коди помилок API

ПомилкаОпис
Invalid ActionНевірний тип дії (має бути "pay")
Order ID already existorder_id вже існує для цієї компанії
Invalid signatureНевалідний підпис запиту
Company not foundpublic_key не знайдено
Company is inactiveКомпанія деактивована

📁 Структура SDK

sdk/
├── src/
│   ├── VarxPayClient.php         # Головний клієнт
│   ├── CallbackHandler.php       # Обробник callback
│   ├── DTO/
│   │   ├── CreateInvoiceRequest.php
│   │   ├── CreateInvoiceResponse.php
│   │   └── Callback.php
│   ├── Exception/
│   │   ├── VarxPayException.php
│   │   ├── ApiException.php
│   │   ├── SignatureException.php
│   │   └── ConfigurationException.php
│   ├── Signature/
│   │   ├── SignatureGenerator.php
│   │   └── SignatureValidator.php
│   ├── Laravel/
│   │   ├── VarxPayServiceProvider.php
│   │   └── Facades/
│   │       └── VarxPay.php
│   └── Symfony/
│       ├── VarxPayBundle.php
│       ├── VarxPayExtension.php
│       └── Configuration.php
├── config/
│   └── varxpay.php              # Laravel конфігурація
├── composer.json
└── README.md

🧪 Тестування

# Встановлення залежностей для розробки
composer install --dev

# Запуск тестів
./vendor/bin/phpunit

📝 Ліцензія

MIT License. Дивіться LICENSE для деталей.

🤝 Підтримка

📌 Версії

v1.0.0

  • Перша стабільна версія
  • Створення інвойсів
  • Обробка callback
  • Інтеграція з Laravel та Symfony