Volver a Inicio

Ejemplo PHP

Integra la API de ReciGo en tu aplicación PHP usando cURL.

Requisitos

PHP 7.4+ con extensión cURL habilitada.

# Verificar si cURL está habilitado
php -m | grep curl

Cliente de API

Crea una clase reutilizable para interactuar con la API de ReciGo:

ReciGoClient.php
<?php

class ReciGoClient
{
    private $apiKey;
    private $baseUrl = 'https://api.recigo.es/v1';

    public function __construct($apiKey)
    {
        if (empty($apiKey)) {
            throw new Exception('API key es requerida');
        }
        $this->apiKey = $apiKey;
    }

    /**
     * Realiza una petición HTTP a la API
     */
    private function request($method, $endpoint, $data = null)
    {
        $url = $this->baseUrl . $endpoint;

        $headers = [
            'X-API-Key: ' . $this->apiKey,
            'Content-Type: application/json',
        ];

        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

        if ($method === 'POST') {
            curl_setopt($ch, CURLOPT_POST, true);
            if ($data !== null) {
                curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
            }
        }

        $response = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        $curlError = curl_error($ch);

        curl_close($ch);

        if ($curlError) {
            throw new Exception('cURL Error: ' . $curlError);
        }

        $responseData = json_decode($response, true);

        if ($httpCode >= 400) {
            $errorMessage = $responseData['message'] ?? 'Error desconocido';
            throw new Exception("ReciGo API Error ($httpCode): $errorMessage");
        }

        return $responseData;
    }

    /**
     * Estima el precio de un trabajo
     */
    public function estimatePrice($data)
    {
        return $this->request('POST', '/pricing/estimate', $data);
    }

    /**
     * Crea un nuevo trabajo
     */
    public function createJob($data)
    {
        return $this->request('POST', '/jobs', $data);
    }

    /**
     * Consulta el estado de un trabajo
     */
    public function getJobStatus($jobId)
    {
        return $this->request('GET', "/jobs/$jobId");
    }
}

?>

Ejemplo 1: Estimación de Precio

estimate_price.php
<?php

require_once 'ReciGoClient.php';

$apiKey = getenv('RECIGO_API_KEY');
$recigo = new ReciGoClient($apiKey);

try {
    $estimate = $recigo->estimatePrice([
        'size' => 'L',
        'pickup' => [
            'address' => 'Calle Gran Vía 1, Madrid',
            'floor' => 3,
            'has_elevator' => false,
        ],
        'dropoff' => [
            'address' => 'Calle Alcalá 100, Madrid',
            'floor' => 1,
            'has_elevator' => true,
        ],
    ]);

    echo "Estimación de precio:\n";
    echo "  Total cliente: €" . $estimate['total_customer_pays_eur'] . "\n";
    echo "  Precio base: €" . $estimate['base_price_eur'] . "\n";
    echo "  Comisión: €" . $estimate['platform_fee_eur'] . "\n";
    echo "  Distancia: " . $estimate['calculation_breakdown']['distance_km'] . " km\n";

} catch (Exception $e) {
    echo "Error: " . $e->getMessage() . "\n";
}

?>

Ejemplo 2: Crear Trabajo Completo

create_job.php
<?php

require_once 'ReciGoClient.php';

$apiKey = getenv('RECIGO_API_KEY');
$recigo = new ReciGoClient($apiKey);

try {
    // Paso 1: Estimar precio (opcional)
    echo "Estimando precio...\n";
    $estimate = $recigo->estimatePrice([
        'size' => 'L',
        'pickup' => ['address' => 'Calle Gran Vía 1, Madrid'],
        'dropoff' => ['address' => 'Calle Alcalá 100, Madrid'],
    ]);
    echo "Precio estimado: €" . $estimate['total_customer_pays_eur'] . "\n\n";

    // Paso 2: Crear el trabajo
    echo "Creando trabajo...\n";
    $job = $recigo->createJob([
        'external_reference' => 'listing-12345',
        'title' => 'Mover sofá de 2 plazas',
        'description' => 'Sofá gris en buen estado',
        'size' => 'L',
        'pickup' => [
            'address' => 'Calle Gran Vía 1, Madrid',
            'floor' => 3,
            'has_elevator' => false,
        ],
        'dropoff' => [
            'address' => 'Calle Alcalá 100, Madrid',
            'floor' => 1,
            'has_elevator' => true,
        ],
        'customer_phone' => '+34612345678',
        'photos' => [
            'https://mi-plataforma.com/images/sofa1.jpg',
            'https://mi-plataforma.com/images/sofa2.jpg',
        ],
    ]);

    echo "\n✅ Trabajo creado exitosamente:\n";
    echo "  Job ID: " . $job['job_id'] . "\n";
    echo "  Estado: " . $job['status'] . "\n";
    echo "  SMS enviado: " . ($job['sms_sent'] ? 'Sí' : 'No') . "\n";
    echo "  Deep Link: " . $job['deep_link_url'] . "\n";
    echo "  Precio: €" . $job['pricing']['total_customer_pays_eur'] . "\n";

} catch (Exception $e) {
    echo "❌ Error: " . $e->getMessage() . "\n";
}

?>

Ejemplo 3: Consultar Estado del Trabajo

check_status.php
<?php

require_once 'ReciGoClient.php';

function checkJobStatus($jobId)
{
    $apiKey = getenv('RECIGO_API_KEY');
    $recigo = new ReciGoClient($apiKey);

    try {
        $status = $recigo->getJobStatus($jobId);

        echo "Estado del trabajo $jobId:\n";
        echo "  Estado actual: " . $status['status'] . "\n";
        echo "  Referencia externa: " . ($status['external_reference'] ?? 'N/A') . "\n";
        echo "  Creado: " . $status['created_at'] . "\n";
        echo "  Actualizado: " . $status['updated_at'] . "\n\n";

        // Mensajes según el estado
        $statusMessages = [
            'draft' => '⏳ El cliente aún no ha completado el pago',
            'posted' => '✅ El trabajo está publicado',
            'accepted' => '🚗 Un transportista ha aceptado el trabajo',
            'completed' => '🎉 El trabajo ha sido completado',
            'cancelled' => '❌ El trabajo ha sido cancelado',
        ];

        $message = $statusMessages[$status['status']] ?? 'Estado desconocido';
        echo $message . "\n";

        return $status;

    } catch (Exception $e) {
        echo "❌ Error: " . $e->getMessage() . "\n";
        return null;
    }
}

// Reemplaza con tu job_id real
checkJobStatus('550e8400-e29b-41d4-a716-446655440000');

?>

Ejemplo 4: Integración con WordPress

Ejemplo de cómo integrar la API en un plugin de WordPress:

recigo-delivery-plugin.php
<?php
/**
 * Plugin Name: ReciGo Delivery Integration
 * Description: Integración con ReciGo para crear trabajos de entrega
 * Version: 1.0.0
 */

require_once plugin_dir_path(__FILE__) . 'ReciGoClient.php';

// Shortcode para mostrar formulario de entrega
add_shortcode('recigo_delivery_form', 'recigo_delivery_form_shortcode');

function recigo_delivery_form_shortcode()
{
    ob_start();
    ?>
    <form id="recigo-delivery-form" method="post">
        <input type="text" name="title" placeholder="Título" required>
        <textarea name="description" placeholder="Descripción" required></textarea>
        <select name="size" required>
            <option value="">Seleccionar tamaño</option>
            <option value="S">Pequeño (S)</option>
            <option value="M">Mediano (M)</option>
            <option value="L">Grande (L)</option>
            <option value="XL">Extra Grande (XL)</option>
        </select>
        <input type="text" name="pickup_address" placeholder="Dirección de recogida" required>
        <input type="text" name="dropoff_address" placeholder="Dirección de entrega" required>
        <input type="tel" name="customer_phone" placeholder="+34612345678" required>
        <button type="submit" name="create_delivery">Crear Entrega</button>
    </form>
    <?php
    return ob_get_clean();
}

// Manejar el formulario
add_action('init', 'handle_recigo_delivery_form');

function handle_recigo_delivery_form()
{
    if (!isset($_POST['create_delivery'])) {
        return;
    }

    try {
        $apiKey = get_option('recigo_api_key');
        $recigo = new ReciGoClient($apiKey);

        $job = $recigo->createJob([
            'external_reference' => 'wp-' . uniqid(),
            'title' => sanitize_text_field($_POST['title']),
            'description' => sanitize_textarea_field($_POST['description']),
            'size' => sanitize_text_field($_POST['size']),
            'pickup' => [
                'address' => sanitize_text_field($_POST['pickup_address']),
            ],
            'dropoff' => [
                'address' => sanitize_text_field($_POST['dropoff_address']),
            ],
            'customer_phone' => sanitize_text_field($_POST['customer_phone']),
        ]);

        // Guardar en custom post type
        wp_insert_post([
            'post_type' => 'recigo_delivery',
            'post_status' => 'publish',
            'post_title' => $job['job_id'],
            'meta_input' => [
                '_recigo_job_id' => $job['job_id'],
                '_recigo_status' => $job['status'],
                '_recigo_deep_link' => $job['deep_link_url'],
            ],
        ]);

        wp_redirect(add_query_arg([
            'recigo_success' => '1',
            'job_id' => $job['job_id'],
        ]));
        exit;

    } catch (Exception $e) {
        wp_die('Error: ' . $e->getMessage());
    }
}

// Página de configuración
add_action('admin_menu', 'recigo_add_admin_menu');

function recigo_add_admin_menu()
{
    add_options_page(
        'ReciGo Settings',
        'ReciGo',
        'manage_options',
        'recigo-settings',
        'recigo_settings_page'
    );
}

function recigo_settings_page()
{
    if (isset($_POST['recigo_api_key'])) {
        update_option('recigo_api_key', sanitize_text_field($_POST['recigo_api_key']));
        echo '<div class="updated"><p>Configuración guardada</p></div>';
    }

    $apiKey = get_option('recigo_api_key', '');
    ?>
    <div class="wrap">
        <h1>ReciGo Settings</h1>
        <form method="post">
            <table class="form-table">
                <tr>
                    <th><label for="recigo_api_key">API Key</label></th>
                    <td>
                        <input type="text" id="recigo_api_key" name="recigo_api_key"
                               value="<?php echo esc_attr($apiKey); ?>"
                               class="regular-text">
                    </td>
                </tr>
            </table>
            <?php submit_button(); ?>
        </form>
    </div>
    <?php
}

?>

Manejo de Errores

error_handling.php
<?php

require_once 'ReciGoClient.php';

function createJobWithErrorHandling()
{
    $apiKey = getenv('RECIGO_API_KEY');
    $recigo = new ReciGoClient($apiKey);

    try {
        $job = $recigo->createJob([
            'title' => 'Mover sofá',
            'description' => 'Sofá de 2 plazas',
            'size' => 'L',
            'pickup' => ['address' => 'Calle Gran Vía 1, Madrid'],
            'dropoff' => ['address' => 'Calle Alcalá 100, Madrid'],
            'customer_phone' => '+34612345678',
        ]);

        return [
            'success' => true,
            'job' => $job,
        ];

    } catch (Exception $e) {
        $errorMessage = $e->getMessage();

        // Manejo específico de errores
        if (strpos($errorMessage, 'validation_error') !== false) {
            return [
                'success' => false,
                'error' => 'Los datos proporcionados son inválidos',
                'details' => $errorMessage,
            ];
        }

        if (strpos($errorMessage, 'unauthorized') !== false || strpos($errorMessage, '401') !== false) {
            return [
                'success' => false,
                'error' => 'API key inválida o faltante',
                'details' => $errorMessage,
            ];
        }

        if (strpos($errorMessage, 'rate_limit_exceeded') !== false || strpos($errorMessage, '429') !== false) {
            return [
                'success' => false,
                'error' => 'Demasiadas solicitudes, intenta más tarde',
                'details' => $errorMessage,
            ];
        }

        if (strpos($errorMessage, 'geocoding_failed') !== false || strpos($errorMessage, '422') !== false) {
            return [
                'success' => false,
                'error' => 'Una o más direcciones no son válidas',
                'details' => $errorMessage,
            ];
        }

        // Error genérico
        return [
            'success' => false,
            'error' => 'Ocurrió un error al crear el trabajo',
            'details' => $errorMessage,
        ];
    }
}

// Ejemplo de uso
$result = createJobWithErrorHandling();

if ($result['success']) {
    echo "✅ Trabajo creado: " . $result['job']['job_id'] . "\n";
} else {
    echo "❌ Error: " . $result['error'] . "\n";
    if (isset($result['details'])) {
        echo "   Detalles: " . $result['details'] . "\n";
    }
}

?>

Variables de Entorno

Usa vlucas/phpdotenv para cargar variables de entorno:

composer require vlucas/phpdotenv
.env
# ReciGo API Configuration
RECIGO_API_KEY=recigo_live_abc123...
load_env.php
<?php

require 'vendor/autoload.php';

use Dotenv\Dotenv;

$dotenv = Dotenv::createImmutable(__DIR__);
$dotenv->load();

// Acceder a la variable
$apiKey = $_ENV['RECIGO_API_KEY'];

?>

Más Ejemplos