使用PHP对接印度尼西亚股票市场API 实时数据、IPO和K线(Kline)的PHP对接方案

2 阅读4分钟

一、基础配置

首先,您需要从 StockTV 获取 API Key,并设置基础请求函数。所有 API 请求都必须包含 key 参数。

<?php
// StockTV API 配置
define('STOCKTV_API_KEY', 'YOUR_API_KEY_HERE'); // 请替换为实际Key
define('STOCKTV_BASE_URL', 'https://api.stocktv.top');

/**
 * 通用 API 请求函数
 * @param string $endpoint API 路径
 * @param array $params 查询参数
 * @return array
 */
function stocktvApiRequest($endpoint, $params = []) {
    $params['key'] = STOCKTV_API_KEY; // 必需参数
    
    $url = STOCKTV_BASE_URL . $endpoint . '?' . http_build_query($params);
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 生产环境建议启用
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    
    $response = curl_exec($ch);
    if ($response === false) {
        return ['error' => 'CURL Error: ' . curl_error($ch)];
    }
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    
    $decoded = json_decode($response, true);
    if (json_last_error() !== JSON_ERROR_NONE) {
        return ['error' => 'JSON Decode Error'];
    }
    return $decoded;
}
?>

二、印度尼西亚股票核心接口

关键信息:根据文档描述,StockTV 支持印度尼西亚的股票行情数据。在文档的“使用说明”部分提到支持“印度、马来西亚、印度尼西亚、美国、日本、韩国...”等国家。在接口返回的示例中,明确显示了 countryId: 48 对应的国家是“Indonesia”。因此,对接印度尼西亚股票时,核心参数 countryId 应为 48

以下是针对印度尼西亚市场的主要接口:

1. 市场列表接口

功能:获取印度尼西亚交易所的股票列表,包含实时行情、基本面和技术指标数据。 接口GET /stock/stocks

<?php
function getIndonesiaStockList($page = 1, $pageSize = 50) {
    $endpoint = '/stock/stocks';
    $params = [
        'countryId' => 48, // 印度尼西亚
        'page' => $page,
        'pageSize' => $pageSize,
    ];
    return stocktvApiRequest($endpoint, $params);
}

// 使用示例
$result = getIndonesiaStockList(1, 5);
if (isset($result['code']) && $result['code'] == 200) {
    echo "印度尼西亚股票列表 (第1页):\n";
    foreach ($result['data']['records'] as $stock) {
        echo "  {$stock['name']} ({$stock['symbol']}): 最新价 {$stock['last']},涨跌 {$stock['chgPct']}%\n";
    }
} else {
    echo "请求失败: " . ($result['message'] ?? '未知错误');
}
?>

返回数据结构:与马来西亚接口类似,包含 id (PID), name, symbol, last, chgPct, volume, open (是否开市) 等关键字段。

2. 查询股票接口

功能:通过PID、名称或代码精确查询印度尼西亚股票。由于接口返回全球匹配结果,需根据 flagcountryId 自行筛选。 接口GET /stock/queryStocks

<?php
function queryIndonesiaStock($pid = null, $symbol = null, $name = null) {
    $endpoint = '/stock/queryStocks';
    $params = [];
    if ($pid) $params['id'] = $pid;
    if ($symbol) $params['symbol'] = $symbol;
    if ($name) $params['name'] = $name;
    
    $result = stocktvApiRequest($endpoint, $params);
    // 筛选印度尼西亚股票 (假设flag为'ID',或countryId为48)
    if (isset($result['code']) && $result['code'] == 200 && is_array($result['data'])) {
        $result['data'] = array_filter($result['data'], function($stock) {
            return ($stock['countryId'] ?? 0) == 48; // 或检查 $stock['flag'] == 'ID'
        });
    }
    return $result;
}
?>

3. 获取K线数据接口

功能:获取指定印度尼西亚股票的历史K线数据,用于图表和技术分析。这是分析历史走势的核心接口接口GET /stock/kline

<?php
function getIndonesiaStockKline($pid, $interval = 'P1D') {
    $endpoint = '/stock/kline';
    $params = [
        'pid' => $pid,      // 从市场列表接口获取的股票PID
        'interval' => $interval,
    ];
    return stocktvApiRequest($endpoint, $params);
}

// 使用示例:获取某印尼股票的日K线
$klineData = getIndonesiaStockKline(12345, 'P1D'); // 12345为示例PID
if (isset($klineData['code']) && $klineData['code'] == 200) {
    $klines = $klineData['data'];
    if (!empty($klines)) {
        $latest = end($klines);
        $time = date('Y-m-d', $latest['time'] / 1000);
        echo "最新日K线 ({$time}): 开{$latest['open']}, 高{$latest['high']}, 低{$latest['low']}, 收{$latest['close']}, 成交量{$latest['volume']}\n";
    }
}
?>

interval 参数说明(同其他市场):

  • PT5M, PT15M, PT1H, PT5H:分钟/小时线
  • P1D, P1W, P1M:日线、周线、月线

4. 获取市场指数接口

功能:获取印度尼西亚市场的主要指数行情,如雅加达综合指数。 接口GET /stock/indices

<?php
function getIndonesiaIndices() {
    $endpoint = '/stock/indices';
    $params = ['countryId' => 48];
    return stocktvApiRequest($endpoint, $params);
}
?>

5. 获取IPO新股日历接口

功能:获取印度尼西亚市场的新股发行和上市信息。 接口GET /stock/getIpo

<?php
function getIndonesiaIpo($type = null) {
    $endpoint = '/stock/getIpo';
    $params = ['countryId' => 48];
    if (in_array($type, [1, 2])) {
        $params['type'] = $type; // 1=未上市, 2=已上市
    }
    return stocktvApiRequest($endpoint, $params);
}
?>

6. 获取涨跌排行榜接口

功能:获取印度尼西亚市场的实时涨幅榜、跌幅榜等。 接口GET /stock/updownList

<?php
function getIndonesiaStockRank($type = 1) {
    $endpoint = '/stock/updownList';
    $params = [
        'countryId' => 48,
        'type' => $type, // 1涨幅榜 2跌幅榜 3涨停榜 4跌停榜
    ];
    return stocktvApiRequest($endpoint, $params);
}
?>

三、实时数据推送 (WebSocket)

对于实时行情,文档推荐使用WebSocket接口,这是获取低延迟数据的最佳方式。

连接地址wss://ws-api.stocktv.top/connect?key=YOUR_API_KEY

工作原理

  1. 使用上述地址建立WebSocket长连接。
  2. 连接成功后,发送订阅消息(具体JSON格式需参考客服提供的详细协议),指定要订阅的印度尼西亚股票的pid
  3. 服务器将持续推送订阅股票的实时行情。
  4. 需定期发送心跳消息以保持连接。

返回数据示例(来自文档):

{
  "pid": "992844",
  "last_numeric": "0.68",
  "pc": "0.000",
  "pcp": "0.00",
  "volume": "3672800",
  "type": 1
}

PHP实现建议:PHP实现WebSocket客户端通常需借助ratchet/pawl等库。由于实现较为复杂且依赖具体业务逻辑,此处不提供完整代码,但核心流程如上。文档中提供了前端和Java的Demo可供参考。

四、完整对接流程与注意事项

  1. 获取API Key:这是所有请求的前提。
  2. 确定国家ID:对接印度尼西亚,countryId 固定为 48
  3. 数据需求与接口匹配
    • 获取股票列表/监控:使用/stock/stocks (设countryId=48)。
    • 查询单只股票:使用/stock/queryStocks,并筛选结果。
    • 获取历史K线:使用/stock/kline,需先获得股票的pid
    • 获取实时推送必须使用WebSocket
    • 获取市场指数/IPO/排行榜:使用相应接口,并设countryId=48
  4. 核心参数
    • countryId48
    • pid:股票的唯一标识,用于K线、WebSocket订阅等操作。
  5. 错误处理:务必检查API返回的code字段,200表示成功。
  6. 性能建议:避免高频HTTP轮询。对多只股票进行实时监控时,应使用WebSocket接口。

通过上述接口,您可以全面对接印度尼西亚股票的实时行情、历史数据、市场指数等信息。请根据您的具体业务场景组合使用。如有关于特定接口参数或返回字段的进一步问题,可随时提出。