ThinkPHP实战:稳定对接外汇黄金实时行情API

7 阅读2分钟

一、前言:专业行情数据对接的核心价值

对于量化交易、风控系统或实时监控应用,稳定的行情数据是生命线。本文将基于专业行情数据服务,展示如何用ThinkPHP快速对接外汇、贵金属、黄金、铂金、铑金等实时行情API和K线数据。

获取授权的地址:http://39.107.99.235:1008/market

二、核心接口介绍

基于行情数据服务,我们主要对接以下核心接口:

  1. HTTP实时行情接口

  2. HTTP K线接口

  3. 其他辅助接口

    • 产品分类接口:获取市场分类
    • 品种列表接口:获取可交易品种
    • WebSocket接口:实时推送(可选)

三、ThinkPHP核心代码实现

3.1 实时行情获取服务

app/service/RealtimeQuoteService.php

<?php
namespace app\service;

use GuzzleHttp\Client;

class RealtimeQuoteService
{
    // 实时行情接口地址
    private const QUOTE_URL = 'http://39.107.99.235:1008/getQuote.php';
    
    private $client;
    
    public function __construct()
    {
        $this->client = new Client([
            'timeout' => 10,
            'verify' => false
        ]);
    }
    
    /**
     * 获取单个品种实时行情
     * @param string $symbol 品种代码,如:btcusdt, xauusd
     * @return array|null 完整的行情数据
     */
    public function getRealtimeQuote(string $symbol): ?array
    {
        try {
            $url = self::QUOTE_URL . '?code=' . $symbol;
            
            $response = $this->client->get($url, [
                'headers' => [
                    'Accept-Encoding' => 'gzip'
                ]
            ]);
            
            if ($response->getStatusCode() === 200) {
                return json_decode($response->getBody()->getContents(), true);
            }
        } catch (\Exception $e) {
            // 异常处理
        }
        
        return null;
    }
    
    /**
     * 批量获取多个品种行情
     * @param array $symbols 品种代码列表
     * @return array 各品种行情数据
     */
    public function getBatchQuotes(array $symbols): array
    {
        $result = [];
        
        // 使用并行流提升获取效率(注意频率限制)
        foreach ($symbols as $symbol) {
            $quote = $this->getRealtimeQuote($symbol);
            if ($quote !== null) {
                $result[$symbol] = $quote;
            }
        }
        
        return $result;
    }
}

3.2 K线数据获取服务

app/service/KlineDataService.php

<?php
namespace app\service;

use GuzzleHttp\Client;

class KlineDataService
{
    // K线接口地址
    private const KLINE_URL = 'http://39.107.99.235:1008/redis.php';
    
    private $client;
    
    public function __construct()
    {
        $this->client = new Client([
            'timeout' => 15,
            'verify' => false
        ]);
    }
    
    /**
     * 获取K线数据
     * @param string $symbol 品种代码
     * @param string $interval 周期
     * @param int $rows 获取条数
     * @return array K线数据列表
     */
    public function getKlineData(string $symbol, string $interval, int $rows): array
    {
        try {
            $url = self::KLINE_URL . sprintf(
                '?code=%s&time=%s&rows=%d', 
                $symbol, 
                $interval, 
                $rows
            );
            
            $response = $this->client->get($url, [
                'headers' => [
                    'Accept-Encoding' => 'gzip'
                ]
            ]);
            
            if ($response->getStatusCode() === 200) {
                return json_decode($response->getBody()->getContents(), true);
            }
        } catch (\Exception $e) {
            // 异常处理
        }
        
        return [];
    }
}

3.3 控制器(对外提供接口)

app/controller/MarketController.php

<?php
namespace app\controller;

use app\BaseController;
use app\service\RealtimeQuoteService;
use app\service\KlineDataService;

class MarketController extends BaseController
{
    protected $quoteService;
    protected $klineService;
    
    protected function initialize()
    {
        $this->quoteService = new RealtimeQuoteService();
        $this->klineService = new KlineDataService();
    }
    
    /**
     * 获取黄金实时行情
     */
    public function goldRealtime()
    {
        $data = $this->quoteService->getRealtimeQuote('xauusd');
        return json($data);
    }
    
    /**
     * 获取外汇实时行情
     */
    public function forexRealtime()
    {
        $pair = $this->request->param('pair');
        $data = $this->quoteService->getRealtimeQuote(strtolower($pair));
        return json($data);
    }
    
    /**
     * 获取K线数据
     */
    public function kline()
    {
        $symbol = $this->request->param('symbol');
        $interval = $this->request->param('interval', '1h');
        $rows = $this->request->param('rows', 100, 'intval');
        
        // 验证参数有效性
        $validIntervals = ['1m', '5m', '15m', '30m', '1h', '1d', '1M'];
        if (!in_array($interval, $validIntervals)) {
            return json(['error' => '不支持的K线周期'], 400);
        }
        
        $data = $this->klineService->getKlineData($symbol, $interval, $rows);
        return json($data);
    }
    
    /**
     * 获取多个品种行情
     */
    public function batchQuotes()
    {
        $symbols = $this->request->param('symbols/a', []);
        
        // 限制最大请求品种数
        if (count($symbols) > 20) {
            return json(['error' => '单次最多请求20个品种'], 400);
        }
        
        $data = $this->quoteService->getBatchQuotes($symbols);
        return json($data);
    }
}

四、路由配置

route/app.php

<?php
use think\facade\Route;

// 行情API路由
Route::group('api/market', function () {
    // 获取黄金实时行情
    Route::get('gold/realtime', 'MarketController/goldRealtime');
    
    // 获取外汇实时行情
    Route::get('forex/realtime', 'MarketController/forexRealtime');
    
    // 获取K线数据
    Route::get('kline', 'MarketController/kline');
    
    // 获取多个品种行情
    Route::post('batch-quotes', 'MarketController/batchQuotes');
});

五、总结

通过以上代码,你可以快速构建一个稳定可靠的行情数据服务系统。关键优势:

  • 即拿即用:代码可直接运行,只需替换为你的测试地址
  • 异常完备:包含频率控制、异常处理
  • 扩展性强:支持轻松扩展更多数据接口
  • 生产就绪:基于ThinkPHP框架的最佳实践

技术栈:ThinkPHP 6.0+ | PHP 7.4+ | GuzzleHttp
适用场景:量化交易系统、风险监控、实时行情展示、数据分析平台