paycryptoone/paycrypto-payouts-php-client

PHP client for PayCrypto payouts API v1

Maintainers

Package info

github.com/PayCryptoOne/paycrypto-payouts-php-client

pkg:composer/paycryptoone/paycrypto-payouts-php-client

Statistics

Installs: 3

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

1.0.0 2026-05-11 11:23 UTC

This package is auto-updated.

Last update: 2026-05-11 11:25:26 UTC


README

Клиент Guzzle для API выплат PayCrypto: базовый URL по умолчанию https://api.paycrypto.one/api/v1/ (в нём уже есть /api/v1), дальше относительные пути payout/.... Авторизация: Authorization: Bearer sk_payout_*; мастер-пароль при создании выплаты — заголовок X-Payout-Master-Password или поле masterPassword в теле.

Установка

С Packagist (предпочтительно), пакет paycryptoone/paycrypto-payouts-php-client:

composer require paycryptoone/paycrypto-payouts-php-client

Локально из клона:

git clone https://github.com/PayCryptoOne/paycrypto-payouts-php-client.git
cd paycrypto-payouts-php-client
composer install

Инициализация

<?php

use PayCrypto\Payouts\Client\PayoutClient;

$client = new PayoutClient(
    getenv('PAYCRYPTO_PAYOUT_API_KEY'),
    getenv('PAYCRYPTO_PAYOUT_BASE_URL') ?: 'https://api.paycrypto.one/api/v1/'
);

Примеры по endpoint-ам

Семантика currency и to_currency

amount всегда в валюте currency. Если to_currency не передан или совпадает с currency, конвертации нет. Если to_currency другой — сумма пересчитывается в to_currency по курсам из базы (через USD). Пример: amount = 0.01, currency = USD, to_currency = LTC — к получателю уйдёт эквивалент 0,01 USD в LTC.

network и address должны соответствовать итоговой монете (to_currency при конвертации, иначе currency). С баланса кошелька списывается монета фактической выплаты.

POST /payout/services — список сервисов выплат

$services = $client->services();
var_dump($services['data']);

POST /payout/calc — расчет комиссии и суммы

Вариант 1: без конвертации

$calcDirect = $client->calc([
    'amount' => '10',
    'address' => 'TNVq3iEcaGWbbsR34MTdg1JMTxvYFU8Qir',
    'currency' => 'USDT',
    'network' => 'TRON',
]);
var_dump($calcDirect['data']);

Вариант 2: с приоритетом сети

$calcWithPriority = $client->calc([
    'amount' => '25',
    'address' => '0x1111111111111111111111111111111111111111',
    'currency' => 'USDT',
    'network' => 'ETH',
    'priority' => 'high',
]);
var_dump($calcWithPriority['data']);

Вариант 3: сумма в USD, выплата в USDT

$calcConvert = $client->calc([
    'amount' => '100',
    'address' => 'TNVq3iEcaGWbbsR34MTdg1JMTxvYFU8Qir',
    'currency' => 'USD',
    'to_currency' => 'USDT',
    'network' => 'TRON',
]);
var_dump($calcConvert['data']);

POST /payout — создание выплаты

Вариант 1: master password вторым аргументом

$created = $client->createPayout([
    'amount' => '0.01',
    'address' => 'TNVq3iEcaGWbbsR34MTdg1JMTxvYFU8Qir',
    'currency' => 'USDT',
    'network' => 'TRON',
    'order_id' => 'order_'.time(),
],
getenv('PAYCRYPTO_PAYOUT_MASTER_PASSWORD')
);
var_dump($created['data']);

Вариант 2: сумма в USD, выплата в USDT

$createdConvert = $client->createPayout([
    'amount' => '150',
    'address' => '0x1111111111111111111111111111111111111111',
    'currency' => 'USD',
    'to_currency' => 'USDT',
    'network' => 'ETH',
    'order_id' => 'order_convert_'.time(),
],
getenv('PAYCRYPTO_PAYOUT_MASTER_PASSWORD')
);
var_dump($createdConvert['data']);

Вариант 3: masterPassword в теле

$createdLegacy = $client->createPayout([
    'amount' => '5',
    'address' => 'TNVq3iEcaGWbbsR34MTdg1JMTxvYFU8Qir',
    'currency' => 'USDT',
    'network' => 'TRON',
    'order_id' => 'order_body_mp_'.time(),
    'masterPassword' => getenv('PAYCRYPTO_PAYOUT_MASTER_PASSWORD'),
]);
var_dump($createdLegacy['data']);

POST /payout/info — информация по выплате

$info = $client->info('00000000-0000-4000-8000-000000000001');
var_dump($info['data']);

POST /payout/list — история выплат

Вариант 1: без фильтров

$historyAll = $client->list();
var_dump($historyAll['data']);

Вариант 2: фильтр по датам

$historyWithDates = $client->list([
    'date_from' => '2026-05-01 00:00:00',
    'date_to' => '2026-05-08 23:59:59',
]);
var_dump($historyWithDates['data']);

Вариант 3: пагинация по cursor

$page1 = $client->list();
$nextCursor = $page1['data']['paginate']['nextCursor'] ?? null;
if ($nextCursor) {
    $page2 = $client->list(['cursor' => $nextCursor]);
    var_dump($page2['data']);
}

POST /payout/resend — повтор webhook

$resent = $client->resend('00000000-0000-4000-8000-000000000001');
var_dump($resent['data']);

Обработка ошибок

use PayCrypto\Payouts\Client\PayoutApiException;

try {
    $client->services();
} catch (PayoutApiException $e) {
    var_dump($e->statusCode, $e->getMessage(), $e->responseBody);
}

Webhook

use PayCrypto\Payouts\Client\Webhook;

$ok = Webhook::verify($decodedJsonArray, $webhookSecretFromSettings);
if (!$ok) {
    throw new RuntimeException('Invalid payout webhook sign');
}

Тесты

composer test

Живой API (расширенные сценарии)

composer test:live выполняет scripts/live-api.php: реальные HTTP-запросы при заданном PAYCRYPTO_PAYOUT_API_KEY (см. .env.example).

Поведение такое же, как у Node-клиента: безопасные шаги всегда; выплата и повторный create с тем же order_id только при PAYCRYPTO_PAYOUT_LIVE_WITHDRAW=1 и PAYCRYPTO_PAYOUT_MASTER_PASSWORD. Скрипт composer e2e при заданном мастер-пароле всегда создаёт одну реальную выплату (короткий сценарий).

composer test:live

Скрипты

composer smoke
composer e2e

Переменные окружения см. .env.example.

Если composer и php не установлены локально, можно из каталога пакета:

docker run --rm --add-host=host.docker.internal:host-gateway -v "$PWD":/app -w /app \
  -e PAYCRYPTO_PAYOUT_BASE_URL=http://host.docker.internal:3002/api/v1/ \
  -e PAYCRYPTO_PAYOUT_API_KEY=... \
  composer:2 run test:live

Для полного прогона с выплатой добавь в docker run переменные -e PAYCRYPTO_PAYOUT_LIVE_WITHDRAW=1 -e PAYCRYPTO_PAYOUT_MASTER_PASSWORD=....