根据您提供的文档,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;
}
?>
二、实时行情数据对接
文档显示印度国家的 countryId 为 14。我们可以获取市场列表、涨跌榜,以及通过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');
?>
重要注意事项
- 获取Key:所有API调用都必须在查询参数中加上
key=您的Key,文档中明确说明需要“联系我们获取key”。 - 国家ID:对接印度市场,
countryId参数固定为14。 - 实时性:
- HTTP接口(如市场列表、涨跌榜)的数据有短暂延迟,适用于非极低延迟场景。
- 真正的实时数据必须通过WebSocket接口 (
wss://ws-api.stocktv.top/connect) 获取,这需要维护一个长连接并处理订阅和心跳。
- PID与Symbol:大部分接口(如K线)使用股票的唯一
pid作为标识,而不是交易代码symbol。pid可以从市场列表或查询接口的id字段获取。 - 错误处理:生产环境中务必添加完善的错误处理、重试机制和日志记录。
- 频率限制:文档未明确说明API调用频率限制,但建议合理控制请求频率,避免过度调用。对于实时数据,优先使用WebSocket。
此PHP对接方案涵盖了您要求的印度股票实时数据(通过HTTP和WebSocket)、IPO新股日历以及K线数据。请根据实际业务需求进行测试和调整。对于WebSocket的完整实现,建议详细咨询StockTV客服获取具体的订阅协议文档。