<?php
// get_usdmxn.php
// Coloca aquí tu token obtenido en Banxico
define('BANXICO_TOKEN', 'TU_TOKEN_AQUI');// Serie para tipo de cambio (verificar en Banxico): ejemplo SF43718 (Tipo de cambio FIX)
define('SERIE_ID', 'SF43718');// Cache file y tiempo en segundos
define('CACHE_FILE', __DIR__ . '/cache_usdmxn.json');define('CACHE_TTL', 300); // 5 minutos
header('Content-Type: application/json; charset=utf-8');
// Leer cache si existe y no expiró
if (file_exists(CACHE_FILE)) { $cache = json_decode(file_get_contents(CACHE_FILE), true);
if ($cache && isset($cache['timestamp']) && (time() - $cache['timestamp'] < CACHE_TTL)) { echo json_encode($cache['data']);
exit;
}
}
// Construir URL de Banxico (oportuno = datos más recientes)
$url = "https://www.banxico.org.mx/SieAPIRest/service/v1/series/" . urlencode(SERIE_ID) . "/datos/oportuno";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Bmx-Token: ' . BANXICO_TOKEN,
'Accept: application/json'
]);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
$response = curl_exec($ch);
$err = curl_error($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($response === false || $code >= 400) { http_response_code(500);
echo json_encode(['error' => 'Error al consultar Banxico', 'details' => $err ?: "HTTP $code"]);
exit;
}
// Parsear respuesta
$parsed = json_decode($response, true);
if (!$parsed || !isset($parsed['bmx']['series'][0]['datos'][0]['dato'])) { http_response_code(500);
echo json_encode(['error' => 'Formato inesperado de respuesta de Banxico', 'raw' => $parsed]);
exit;
}
$dato = $parsed['bmx']['series'][0]['datos'][0]['dato']; // valor en string
$fecha = $parsed['bmx']['series'][0]['datos'][0]['fecha'] ?? null;
$result = [
'rate' => $dato,
'date' => $fecha,
'source' => 'Banxico',
'fetched_at' => date('c')];
// Guardar en cache
file_put_contents(CACHE_FILE, json_encode(['timestamp' => time(), 'data' => $result]));
echo json_encode($result);