Tutorial/PHP 同 Laravel

喺 PHP 同 Laravel 攞匯率

用 Laravel HTTP 客戶端、bearer 認證、有限逾時同埋新鮮度欄位,攞埋快取實時匯率。

ERexchangerate.dev·Jul 17, 2026·6 分鐘閱讀

一個細細嘅 Laravel 服務就可以call exchangerate.dev、拒絕錯誤回應,仲可以將完整嘅匯率觀測快取 60 秒。密鑰放喺設定入面,同匯率一齊回傳 sourcemarket_sessiondata_updated_at

Key points
用 Laravel HTTP 客戶端嘅 bearer 認證、逾時同 throw()
快取完整成功嘅回應 60 秒,穩穩陣陣咁留喺 Free 每分鐘 12 次請求嘅限制之內。
密鑰保存喺 config/services.php,透過 EXCHANGERATE_API_KEY 讀取,唔好寫入應用程式碼度。
要精確計算金額就要用十進制程式庫。

整一個有快取嘅匯率服務

服務用基礎貨幣同排好序嘅代碼,整一個穩定嘅快取鍵。throw() 會喺 Laravel 寫入快取之前就執行,所以錯誤唔會變成匯率資料。

php · app/Services/ExchangeRateService.phpcopy
<?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();
        });
    }
}

喺原始碼之外設定密鑰

php · config/services.php and .envcopy
// config/services.php
'exchangerate' => [
    'key' => env('EXCHANGERATE_API_KEY'),
],

// .env (never commit the real value)
EXCHANGERATE_API_KEY=exr_live_...

讀取匯率同觀測欄位

call $service->latest("USD", ["EUR", "GBP"]),再讀 $result["rates"]["EUR"]。同時要保留 $result["source"]$result["market_session"]$result["data_updated_at"]

唔好將錯誤快取成匯率
401 即係密鑰或者標頭錯誤,429 即係超出咗請求限制。畀個請求失敗啦,適時退避,舊觀測就淨係可以連同原本更新時間一齊保留。
  • 整快取鍵之前,要先將貨幣代碼排好序。
  • 設定有限嘅 HTTP 逾時。
  • 讀取同快取 JSON 之前要call throw。
  • 淨係四捨五入最終金額,唔好處理 API 匯率。
ER
exchangerate.dev
為用緊外匯數據嘅開發者而設嘅整合指南。

延伸閱讀

Guide一次過攞歷史外匯時間序列閱讀 Reference點讀 source 同 market_session閱讀 Guide指示性匯率同可執行匯率閱讀
更多比較Fixer vs exchangerate.devOpen Exchange Rates vs exchangerate.devCurrencylayer vs exchangerate.dev
學習Reading source and market_session in your pipelineIndicative vs executable FX rates: what a rates API actually gives youECB reference rates, explained
即時匯率EUR/USDGBP/USDUSD/JPY