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 curlCliente 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'];
?>