Skip to content

Cliente PHP de DV-NET ​

Este es el cliente PHP oficial para integrar con la DV-NET Merchant API. Proporciona acceso conveniente a todos los endpoints de la API, gestiona la firma de solicitudes y mapea las respuestas a Objetos de Transferencia de Datos (DTOs) en PHP.

Requisitos ​

Si no proporciona su propio cliente HTTP, esta biblioteca incluye un cliente simple integrado basado en cURL.

Instalación ​

Puede instalar el cliente mediante Composer:
composer require dv-net/php-client

Primeros pasos ​

Inicialización básica del cliente ​

Para empezar a usar el cliente, necesita su host de la API de comercios y su clave de API.

php
<?php  
require 'vendor/autoload.php';

use DvNet\PhpClient\MerchantClient;  
use DvNet\PhpClient\Exceptions\DvNetException;

// Reemplace con su host y clave de API reales  
$host = '[https://your-merchant-api.dv-net.com](https://your-merchant-api.dv-net.com)';  
$apiKey = 'your_merchant_api_key_goes_here';

try {  
// Inicializar el cliente  
// Opcionalmente puede pasar su propio cliente HTTP PSR-18 y fábricas PSR-17  
$client = new MerchantClient($host, $apiKey);

    // --- Ejemplo: Obtener las monedas disponibles ---  
    $currenciesResponse = $client->getCurrencies();

    echo "Se obtuvieron correctamente " . count($currenciesResponse->getCurrencies()) . " monedas:\n";

    foreach ($currenciesResponse->getCurrencies() as $currency) {  
        echo "- " . $currency->getName() . " (" . $currency->getTicker() . ")\n";  
    }  
      
    // --- Ejemplo: Obtener saldos de cuenta ---  
    $balancesResponse = $client->getProcessingWalletBalances();  
    foreach ($balancesResponse->getProcessingWallets() as $walletBalance) {  
        echo "Saldo para " . $walletBalance->getCurrencyShort()->getTicker() . ": " . $walletBalance->getAsset()->getAmount() . "\n";  
    }

} catch (DvNetException $e) {  
// Capture la excepción base para todos los errores del cliente  
echo "Error de API: " . $e->getMessage() . "\n";

    // También puede capturar excepciones más específicas:  
    // \DvNet\PhpClient\Exceptions\DvNetInvalidRequestException  
    // \DvNet\PhpClient\Exceptions\DvNetNetworkException  
    // \DvNet\PhpClient\Exceptions\DvNetServerException  
}

Manejo de webhooks ​

La biblioteca incluye un WebhookMapper para analizar fácilmente los webhooks entrantes de DV-NET en DTOs estructurados.

php
<?php  
require 'vendor/autoload.php';

use DvNet\\PhpClient\\WebhookMapper;  
use DvNet\\PhpClient\\Dto\\WebhookMapper\\ConfirmedWebhookResponse;  
use DvNet\\PhpClient\\Dto\\WebhookMapper\\UnconfirmedWebhookResponse;  
use DvNet\\PhpClient\\Dto\\WebhookMapper\\WithdrawalWebhookResponse;  
use DvNet\\PhpClient\\Exceptions\\DvNetInvalidWebhookException;

// 1. Obtener el cuerpo bruto de la solicitud  
$requestBody = file_get_contents('php://input');

// 2. (Recomendado) Verificar la firma  
// Ver: /integration/webhook-signature-verification.md  
// $signature = $_SERVER['HTTP_X_SIGNATURE_SHA256'];  
// $secret = 'your_webhook_secret_key';  
// if (!MerchantUtilsManager::verifySignature($requestBody, $signature, $secret)) {  
//    http_response_code(401);  
//    echo 'Firma no válida';  
//    exit;  
// }

// 3. Mapear el payload del webhook  
$mapper = new WebhookMapper();

try {  
$webhook = $mapper->map($requestBody);

    // 4. Manejar el webhook según su tipo  
    if ($webhook instanceof ConfirmedWebhookResponse) {  
        // Se ha confirmado un depósito  
        $tx = $webhook->getTransaction();  
        echo "Gestionando transacción confirmada: " . $tx->getTxid() . " por " . $tx->getAmount() . " " . $tx->getCurrency();  
          
    } elseif ($webhook instanceof UnconfirmedWebhookResponse) {  
        // Ha llegado un nuevo depósito sin confirmar  
        $wallet = $webhook->getWallet();  
        echo "Gestionando transacción sin confirmar para la billetera: " . $wallet->getAddress();  
          
    } elseif ($webhook instanceof WithdrawalWebhookResponse) {  
        // Se ha procesado un retiro  
        $withdrawal = $webhook->getWithdrawal();  
        echo "Gestionando retiro: " . $withdrawal->getId() . " con estado " . $withdrawal->getStatus();  
    }  
      
    // Enviar una respuesta 200 OK a DV-NET  
    http_response_code(200);  
    echo "OK";

} catch (DvNetInvalidWebhookException $e) {  
// La carga útil no era JSON válido o no era un tipo de webhook reconocido  
http_response_code(400);  
echo "Datos de webhook no válidos: " . $e->getMessage();  
}

Gestión de excepciones ​

Todas las excepciones lanzadas por el cliente extienden la clase base DvNet\PhpClient\Exceptions\DvNetException.

  • DvNetInvalidRequestException: Se lanza para errores 4xx (p. ej., parámetros incorrectos, fallo de autenticación).
  • DvNetServerException: Se lanza para errores 5xx en el lado del servidor.
  • DvNetNetworkException: Se lanza para fallos de cURL u otros fallos a nivel de red.
  • DvNetInvalidResponseDataException: Se lanza si la respuesta del servidor no es JSON válido o no puede mapearse.
  • DvNetInvalidWebhookException: Lanzada por WebhookMapper para cargas útiles no válidas.

Licencia ​

Este SDK se distribuye bajo la Licencia MIT.