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

4 阅读4分钟

根据您提供的文档,StockTV API提供了全面的股票数据接口,以下是针对印度股票市场,专注于实时数据、IPO和K线(Kline)的PHP对接方案。

一、基础配置

在使用任何API前,需要联系StockTV获取Key,并设置为常量。

<?php
// StockTV API 配置
define('STOCKTV_API_KEY', '您从StockTV获取的Key'); // 请替换
define('STOCKTV_BASE_URL', 'https://api.stocktv.top');

/**
 * 发起 HTTP GET 请求的通用函数
 * @param string $endpoint API路径
 * @param array $params 查询参数数组
 * @return array 解码后的JSON数据
 */
function stocktvApiRequest($endpoint, $params = []) {
    $params['key'] = STOCKTV_API_KEY; // 所有请求都必须包含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); // 生产环境建议改为true
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    
    if ($response === false) {
        return ['error' => 'CURL请求失败'];
    }
    
    $decoded = json_decode($response, true);
    
    if (json_last_error() !== JSON_ERROR_NONE) {
        return ['error' => 'JSON解析失败: ' . json_last_error_msg()];
    }
    
    return $decoded;
}
?>

二、实时行情数据对接

文档显示印度国家的 countryId14。我们可以获取市场列表、涨跌榜,以及通过WebSocket获取实时推送。

1. 获取印度市场股票列表

此接口用于分页获取指定国家(印度)的股票列表,包含实时价格、涨跌幅、交易量等。

<?php
/**
 * 获取印度股票市场列表
 * @param int $page 页码
 * @param int $pageSize 每页数量
 * @return array
 */
function getIndiaStockList($page = 1, $pageSize = 50) {
    $endpoint = '/stock/stocks';
    $params = [
        'countryId' => 14, // 印度
        'page' => $page,
        'pageSize' => $pageSize,
    ];
    return stocktvApiRequest($endpoint, $params);
}

// 使用示例
$stockList = getIndiaStockList(1, 20);
if (isset($stockList['code']) && $stockList['code'] == 200) {
    echo "获取到 " . count($stockList['data']['records']) . " 条印度股票记录\n";
    foreach ($stockList['data']['records'] as $stock) {
        echo "股票: {$stock['name']} ({$stock['symbol']}),最新价: {$stock['last']},涨跌幅: {$stock['chgPct']}%\n";
    }
} else {
    echo "请求失败: " . ($stockList['message'] ?? '未知错误');
}
?>

2. 获取实时涨跌排行榜

此接口获取印度市场的实时涨幅榜、跌幅榜、涨停榜、跌停榜。

<?php
/**
 * 获取印度股票涨跌排行榜
 * @param int $type 榜单类型:1涨幅榜 2跌幅榜 3涨停榜 4跌停榜
 * @return array
 */
function getIndiaUpDownList($type = 1) {
    $endpoint = '/stock/updownList';
    $params = [
        'countryId' => 14, // 印度
        'type' => $type,
    ];
    return stocktvApiRequest($endpoint, $params);
}

// 使用示例:获取涨幅榜
$topGainers = getIndiaUpDownList(1);
if (isset($topGainers['code']) && $topGainers['code'] == 200) {
    echo "印度股票涨幅榜 TOP 5:\n";
    $count = 0;
    foreach ($topGainers['data'] as $stock) {
        if ($count >= 5) break;
        echo sprintf("%s: %.2f%%\n", $stock['name'], $stock['chgPct']);
        $count++;
    }
}
?>

3. WebSocket 实时行情推送 (核心)

对于真正实时的数据,文档推荐使用WebSocket连接,这比HTTP轮询更高效、实时。

文档中提供了前端Demo,这里提供PHP的WebSocket客户端实现思路。您需要联系客服获取测试域名和WebSocket地址。

<?php
// 注意:PHP实现WebSocket客户端通常需要额外的库,如 ratchet/pawl
// 以下是使用 `ratchet/pawl` 库的示例概念

// 首先通过Composer安装: composer require ratchet/pawl
/*
require __DIR__ . '/vendor/autoload.php';

use Ratchet\Client\WebSocket;
use Ratchet\RFC6455\Messaging\MessageInterface;

function connectStockTVWebSocket() {
    $wsUrl = "wss://ws-api.stocktv.top/connect?key=" . STOCKTV_API_KEY;
    
    \Ratchet\Client\connect($wsUrl)->then(function(WebSocket $conn) {
        echo "已连接到WebSocket服务器\n";
        
        // 连接成功后,需要发送订阅消息来订阅特定的股票代码
        // 文档中提到发送消息的格式,但具体订阅协议需参考客服提供的详细文档
        // 假设订阅股票PID为7310的实时数据
        $subscribeMsg = json_encode([
            'action' => 'subscribe',
            'pids' => ['7310', '17976'] // 要订阅的股票PID列表
        ]);
        $conn->send($subscribeMsg);
        
        // 处理接收到的消息
        $conn->on('message', function(MessageInterface $msg) use ($conn) {
            $data = json_decode($msg->getPayload(), true);
            // 数据格式参考文档中的WebSocket返回值
            if (isset($data['pid'])) {
                echo "实时推送 - PID: {$data['pid']}, 最新价: {$data['last_numeric']}, 涨跌额: {$data['pc']}, 成交量: {$data['turnover_numeric']}\n";
            }
        });
        
        // 定时发送心跳保持连接 (根据文档要求)
        $conn->on('close', function($code = null, $reason = null) {
            echo "连接关闭 ({$code} - {$reason})\n";
        });
        
        // 简易心跳,每30秒发送一次
        $heartbeatInterval = 30;
        $lastHeartbeat = time();
        $conn->on('message', function() use (&$lastHeartbeat) {
            $lastHeartbeat = time();
        });
        
        // 简单的心跳维护循环(在实际应用中应使用事件循环)
        while (true) {
            if ((time() - $lastHeartbeat) > $heartbeatInterval) {
                $conn->send(''); // 发送空消息作为心跳
                $lastHeartbeat = time();
            }
            usleep(100000); // 0.1秒
        }
        
    }, function (\Exception $e) {
        echo "连接失败: {$e->getMessage()}\n";
    });
}

// connectStockTVWebSocket(); // 运行WebSocket客户端
*/
?>

关键点:WebSocket连接地址为 wss://ws-api.stocktv.top/connect?key=您的Key,连接后需发送订阅指令并维持心跳。具体订阅的消息格式和更多细节,需要参考客服提供的WebSocket详细协议。

三、IPO新股日历数据对接

此接口获取印度市场的IPO信息,包括即将上市和已上市的新股。

<?php
/**
 * 获取印度IPO新股日历
 * @param int $type 1=未上市 2=已上市 (非必填,默认全部)
 * @return array
 */
function getIndiaIpoCalendar($type = null) {
    $endpoint = '/stock/getIpo';
    $params = [
        'countryId' => 14, // 印度
    ];
    if ($type !== null && in_array($type, [1, 2])) {
        $params['type'] = $type;
    }
    return stocktvApiRequest($endpoint, $params);
}

// 使用示例
$ipoData = getIndiaIpoCalendar(1); // 获取即将上市的IPO
if (isset($ipoData['code']) && $ipoData['code'] == 200 && !empty($ipoData['data'])) {
    echo "印度近期IPO信息:\n";
    foreach ($ipoData['data'] as $ipo) {
        $listingDate = date('Y-m-d', $ipo['ipoListing']);
        echo "公司: {$ipo['company']},交易所: {$ipo['exchange']},发行价: {$ipo['ipoPrice']},上市日期: {$listingDate}\n";
    }
} else {
    echo "暂无IPO数据或请求失败。\n";
}
?>

四、K线 (Kline) 数据对接

此接口获取指定股票的K线数据,支持多种时间间隔。

<?php
/**
 * 获取股票K线数据
 * @param int $pid 股票产品ID (从市场列表接口获取)
 * @param string $interval 时间间隔: PT5M, PT15M, PT1H, PT5H, P1D, P1W, P1M
 *                          (5分钟, 15分钟, 1小时, 5小时, 1天, 1周, 1月)
 * @return array
 */
function getStockKline($pid, $interval = 'PT1H') {
    $endpoint = '/stock/kline';
    $params = [
        'pid' => $pid,
        'interval' => $interval,
    ];
    return stocktvApiRequest($endpoint, $params);
}

// 使用示例:假设某印度股票的PID为7310
$klineData = getStockKline(7310, 'PT1H'); // 获取1小时K线
if (isset($klineData['code']) && $klineData['code'] == 200 && !empty($klineData['data'])) {
    echo "股票PID: 7310 的1小时K线数据 (最新5条):\n";
    $dataSlice = array_slice($klineData['data'], 0, 5);
    foreach ($dataSlice as $bar) {
        $time = date('Y-m-d H:i:s', $bar['time'] / 1000);
        echo "时间: {$time}, 开: {$bar['open']}, 高: {$bar['high']}, 低: {$bar['low']}, 收: {$bar['close']}, 成交量: {$bar['volume']}\n";
    }
}
?>

K线时间间隔参数详解

  • PT5M: 5分钟
  • PT15M: 15分钟
  • PT1H: 1小时
  • PT5H: 5小时
  • P1D: 1日
  • P1W: 1周
  • P1M: 1月

五、综合示例与注意事项

完整流程示例

假设您要监控某只印度股票并获取其IPO信息、实时价格和K线。

<?php
// 1. 获取Key (从配置或环境变量)
$apiKey = getenv('STOCKTV_API_KEY') ?: STOCKTV_API_KEY;

// 2. 搜索或列表找到目标股票的PID (例如:Reliance Industries)
// 可以使用【查询股票】接口,或从市场列表遍历
function searchIndianStock($symbol) {
    $result = stocktvApiRequest('/stock/queryStocks', ['symbol' => $symbol]);
    // 注意:需从结果中筛选 countryId=14 的印度股票
    return $result;
}

// 3. 获取该股票的实时信息(通过HTTP接口,非实时)
$stockInfo = getIndiaStockList(1, 100); // 获取第一页寻找目标
// 或通过WebSocket订阅其PID获取实时推送

// 4. 获取印度市场今日IPO
$todayIpos = getIndiaIpoCalendar(1);

// 5. 获取该股票的日K线
$dailyKline = getStockKline(目标PID, 'P1D');
?>

重要注意事项

  1. 获取Key:所有API调用都必须在查询参数中加上 key=您的Key,文档中明确说明需要“联系我们获取key”。
  2. 国家ID:对接印度市场,countryId 参数固定为 14
  3. 实时性
    • HTTP接口(如市场列表、涨跌榜)的数据有短暂延迟,适用于非极低延迟场景。
    • 真正的实时数据必须通过WebSocket接口 (wss://ws-api.stocktv.top/connect) 获取,这需要维护一个长连接并处理订阅和心跳。
  4. PID与Symbol:大部分接口(如K线)使用股票的唯一 pid 作为标识,而不是交易代码 symbolpid 可以从市场列表或查询接口的 id 字段获取。
  5. 错误处理:生产环境中务必添加完善的错误处理、重试机制和日志记录。
  6. 频率限制:文档未明确说明API调用频率限制,但建议合理控制请求频率,避免过度调用。对于实时数据,优先使用WebSocket。

此PHP对接方案涵盖了您要求的印度股票实时数据(通过HTTP和WebSocket)、IPO新股日历以及K线数据。请根据实际业务需求进行测试和调整。对于WebSocket的完整实现,建议详细咨询StockTV客服获取具体的订阅协议文档。