Gu铆a del Desarrollador - API v2

La API REST de Portal Central te permite conectar aplicaciones externas directamente con nuestro motor centralizado de validaci贸n de transacciones cripto. De esta forma, puedes integrar pagos blockchain y conciliaciones de Binance Pay en tus aplicaciones m贸viles, plataformas de comercio electr贸nico y backends personalizados sin depender de plugins CMS.

Caracter铆sticas Principales

  • Aislamiento de Seguridad: Las llaves API y credenciales de Binance Pay se configuran y resuelven en el servidor del Portal Central.
  • Firma Criptogr谩fica HMAC: Todas las peticiones viajan firmadas con hash SHA-256 para impedir cualquier falsificaci贸n.
  • Ambientes Aislados: Credenciales y colas independientes para modo de pruebas (Sandbox) y modo productivo.
  • Notificaciones por Webhook: Recepci贸n as铆ncrona de confirmaci贸n de dep贸sitos mediante webhooks seguros.

Seguridad y Autenticaci贸n HMAC-SHA256

Toda comunicaci贸n entrante a la API v2 es firmada mediante una firma digital sim茅trica utilizando el **Client Secret** obtenido en el panel de control. El secreto nunca debe viajar en la cabecera ni en el cuerpo de la petici贸n.

Cabeceras Requeridas

Header Tipo Descripci贸n
x-hbpv-client-id String El Client ID asignado a tu aplicaci贸n (e.g. cli_...).
x-hbpv-ts Integer Timestamp Unix actual en segundos (e.g. 1782390123). Tolerancia de 300 segundos.
x-hbpv-nonce String UUID o cadena 煤nica aleatoria por petici贸n para mitigar ataques de repetici贸n.
x-hbpv-sign String Firma HMAC-SHA256 calculada en formato hexadecimal.

Esquema de Construcci贸n de Firma

Concatena los siguientes campos exactos con saltos de l铆nea (\n):

        StringData = HTTP_METHOD + "\n" + REST_ROUTE + "\n" + TIMESTAMP + "\n" + NONCE + "\n" + SHA256(BODY)

Referencia de Endpoints API v2

Todos los paths de endpoint deben ser concatenados a la URL base de tu portal.

POST Crear Sesi贸n de Checkout (v2 Server-to-Server)

/wp-json/hbpv/v2/checkout/create-session

Genera un token de sesi贸n din谩mico y retorna una checkout_url limpia para procesar compras variables, carritos e integraciones personalizadas.

Cuerpo de Petici贸n (JSON):
{
  "order_id": "ORDEN-2026-9901",
  "amount": 125.50,
  "currency": "USDT",
  "customer_email": "comprador@ejemplo.com",
  "allowed_methods": ["binance", "multichain"],
  "webhook_url": "https://mi-tienda.com/webhook.php",
  "redirect_url": "https://mi-tienda.com/order_success.php?order=ORDEN-2026-9901"
}
Respuesta Exitosa (JSON):
{
  "ok": true,
  "session_token": "sess_8f9a2b3c4d5e6f7a8b9c",
  "checkout_url": "https://paywik.io/pay/session/sess_8f9a2b3c4d5e6f7a8b9c",
  "amount": 125.50,
  "currency": "USDT",
  "expires_at": "2026-07-24T18:30:00Z"
}

GET Consultar Redes Habilitadas

/api/mcrv/v2/networks

Retorna la lista de todas las redes blockchain (TRC20, BEP20, etc.) habilitadas globalmente en Portal Central.

Respuesta Exitosa (JSON):
{
      "ok": true,
      "networks": [
        "TRC20",
        "BEP20"
      ]
    }

GET Consultar Billeteras del Comercio

/api/mcrv/v2/wallets

Retorna la lista completa de billeteras de destino p煤blicas y redes autorizadas para el comercio. Ideal para no tener que hardcodear billeteras locales en tus integraciones.

Respuesta Exitosa (JSON):
{
      "ok": true,
      "wallets": [
        {
          "currency": "USDT",
          "network": "BEP20",
          "address": "0xfddaddbf6ffdc48abbe099a3507964677337bdda"
        }
      ]
    }

POST Crear Validaci贸n Multichain

/api/mcrv/v2/validate

Inicia la validaci贸n on-chain remota de dep贸sitos blockchain.

Cuerpo de Petici贸n (JSON):
  • order_id * (string): ID de orden interna.
  • client_wallet (string): Billetera del cliente pagador.
  • dest_wallet * (string): Billetera de recepci贸n.
  • currency * (string): Token a validar (ej: USDT, USDC).
  • network * (string): Blockchain (ej: BEP20, TRC20).
  • amount * (float): Monto exacto.

POST Crear Validaci贸n Binance Pay

/api/hbpv/v2/remote/validate

Crea un job de validaci贸n para transacciones C2C por c贸digo de nota.

Cuerpo de Petici贸n (JSON):
  • order_id * (string): ID de orden interna.
  • note_code (string - Opcional): C贸digo de nota de 6 d铆gitos. Si se omite, se generar谩 de forma autom谩tica y 煤nica.
  • amount * (float): Monto neto.
  • currency * (string): S铆mbolo de moneda.

GET Consultar Estado de Job

/api/mcrv/v2/status/{job_id}

Retorna los datos completos y el estado actual de conciliaci贸n del job.

GET Listar Transacciones / Jobs

/api/hbpv/v2/transactions

Consulta el historial completo de jobs de validaci贸n creados por tu cuenta con soporte para filtros. (Tambi茅n disponible en /api/mcrv/v2/transactions).

Par谩metros Query (URL Parameters):
  • type (string): Filtrar por tipo (multichain, binance_personal, o all por defecto).
  • status (string): Filtrar por estado (done para aprobadas, failed para rechazadas, queued, processing, o all por defecto).
  • environment (string): Filtrar por ambiente (sandbox, production, o all por defecto).
  • limit (int): Cantidad m谩xima de registros (por defecto 20, max 100).
  • offset (int): Salto para paginaci贸n (por defecto 0).

Webhooks y Notificaciones Outbound

Los webhooks te permiten reaccionar inmediatamente a los cambios de estado sin necesidad de polling. Portal Central despacha un POST HTTP al detectar el fin del flujo.

Payload JSON de Notificaci贸n

        {
          "event": "job.updated",
          "type": "multichain",
          "job_id": 1827,
          "order_id": "ORDER-10029",
          "status": "done",
          "amount": 4.00,
          "currency": "USDT",
          "txid": "0x990645bfddaddbf6ffdc48abbe099a3507964677337bdda",
          "matched": true,
          "timestamp": 1782390123
        }

Ejemplo en PHP (Nativo)

        <?php
        $clientId = 'cli_a5e9...';
        $apiSecret = 'tu_api_secret_segura';
        $endpoint = 'https://paywik.io/api/mcrv/v2/validate';
        $route = '/mcrv/v2/validate';

        $payload = [
            'order_id'      => 'EX-88910',
            'client_wallet' => '0x64573246fC58AA90060318B690526fBcdC15Fa3A',
            'dest_wallet'   => '0xfddaddbf6ffdc48abbe099a3507964677337bdda',
            'currency'      => 'USDT',
            'network'       => 'BEP20',
            'amount'        => 4.00
        ];

        $jsonBody = json_encode($payload);
        $bodyHash = hash('sha256', $jsonBody);
        $timestamp = time();
        $nonce = bin2hex(random_bytes(8));

        $sigData = "POST\n" . $route . "\n" . $timestamp . "\n" . $nonce . "\n" . $bodyHash;
        $signature = hash_hmac('sha256', $sigData, $apiSecret);

        $ch = curl_init($endpoint);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonBody);
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            'Content-Type: application/json',
            "x-hbpv-client-id: $clientId",
            "x-hbpv-ts: $timestamp",
            "x-hbpv-nonce: $nonce",
            "x-hbpv-sign: $signature"
        ]);

        $response = curl_exec($ch);
        curl_close($ch);
        print_r(json_decode($response, true));
        ?>

Ejemplo en Node.js

        const crypto = require('crypto');
        const axios = require('axios');

        const clientId = 'cli_a5e9...';
        const apiSecret = 'tu_api_secret_segura';
        const endpoint = 'https://paywik.io/api/mcrv/v2/validate';
        const route = '/mcrv/v2/validate';

        const payload = {
          order_id: 'EX-88910',
          client_wallet: '0x64573246fC58AA90060318B690526fBcdC15Fa3A',
          dest_wallet: '0xfddaddbf6ffdc48abbe099a3507964677337bdda',
          currency: 'USDT',
          network: 'BEP20',
          amount: 4.00
        };

        const jsonBody = JSON.stringify(payload);
        const bodyHash = crypto.createHash('sha256').update(jsonBody).digest('hex');
        const timestamp = Math.floor(Date.now() / 1000);
        const nonce = crypto.randomBytes(8).toString('hex');

        const sigData = `POST\n${route}\n${timestamp}\n${nonce}\n${bodyHash}`;
        const signature = crypto.createHmac('sha256', apiSecret).update(sigData).digest('hex');

        axios.post(endpoint, payload, {
          headers: {
            'Content-Type': 'application/json',
            'x-hbpv-client-id': clientId,
            'x-hbpv-ts': timestamp.toString(),
            'x-hbpv-nonce': nonce,
            'x-hbpv-sign': signature
          }
        }).then(res => console.log(res.data));