Un pequeño servicio Laravel puede llamar a exchangerate.dev, rechazar errores HTTP y guardar una observación completa durante 60 segundos. Mantén la clave en configuración y devuelve source, market_session y data_updated_at.
Puntos clave
Usa el cliente HTTP con bearer, timeout y
throw().Almacena la respuesta correcta completa durante 60 segundos para no salir del límite Free de 10 solicitudes por minuto.
Mantén la clave en
config/services.php mediante EXCHANGERATE_API_KEY, no en el código de la aplicación.Usa una biblioteca decimal cuando necesites aritmética exacta.
Crea un servicio FX con caché
El servicio forma una clave estable con la base y los símbolos. throw() se ejecuta antes de que Laravel escriba una respuesta fallida en caché.
<?php
namespace App\Services;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Http;
final class ExchangeRateService
{
public function latest(string $base, array $symbols): array
{
sort($symbols);
$symbolList = implode(',', $symbols);
$cacheKey = "fx:latest:{$base}:{$symbolList}";
return Cache::remember($cacheKey, now()->addSeconds(60), function () use (
$base,
$symbolList,
): array {
return Http::acceptJson()
->withToken(config('services.exchangerate.key'))
->timeout(5)
->get(
"https://api.exchangerate.dev/v1/latest/{$base}",
['symbols' => $symbolList],
)
->throw()
->json();
});
}
}Configura la clave fuera del código
// config/services.php
'exchangerate' => [
'key' => env('EXCHANGERATE_API_KEY'),
],
// .env (never commit the real value)
EXCHANGERATE_API_KEY=exr_live_...Lee el tipo y sus campos de observación
Llama a $service->latest("USD", ["EUR", "GBP"]) y lee $result["rates"]["EUR"]. Conserva $result["source"], $result["market_session"] y $result["data_updated_at"].
No almacenes errores como tipos
Un 401 indica una clave o cabecera incorrecta. Un 429 indica exceso de solicitudes. Deja que fallen y conserva cualquier observación anterior solo con su hora original.
- Ordena los símbolos antes de formar la clave.
- Define un timeout.
- Ejecuta throw antes de guardar JSON.
- Redondea el monto final, no el tipo.
ER
exchangerate.dev
Guías de integración para desarrolladores que trabajan con datos FX.
