metaseller/tinkoff-invest-api-v2-php 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

metaseller/tinkoff-invest-api-v2-php

Composer 安装命令:

composer require metaseller/tinkoff-invest-api-v2-php

包简介

Unofficial PHP SDK for T-Invest API v2

README 文档

README

Unofficial PHP SDK for T-Invest API v2

Документация T-Invest Api для разработчиков доступна по ссылке: https://developer.tbank.ru/invest/api

Коммьюнити разработчиков в Telegram: https://t.me/joinchat/VaW05CDzcSdsPULM

PS: До переименования, Т-Банк и Т-Инвестиции назывались "Тинькофф-банк" и "Тинькофф-Инвестиции", нейминги репозиториев, классов и методов пока сохранены в "старом стиле".

PSS: На основе данной библиотеки написан на PHP робот-покупателя для T-Инвестиций metaseller/tinkoff-robot-buyer, который реализует две стратегии: (1) - постоянная покупка с заданной скоростью на заданный аккаунт/портфель лотов выбранного ETF. (2) - Автоматическое управление и ребалансировка счета в соответствии с настройками, автоматическое поддержание баланса стоимости акций/облигаций, автоматическая парковка и распарковка свободный средств в денежные фонды.

Введение

Поскольку T-Invest API v2 в настоящее время позиционируется как gRPC-интерфейс для взаимодействия с торговой платформой Т-Инвестиции, то первое, что нам понадобится - это документация по gRPC:

  1. Quick start with PHP -> https://grpc.io/docs/languages/php/quickstart/
  2. Basic tutorials -> https://grpc.io/docs/languages/php/basics/

Структура текущего репозитория:

etc - Директория, которая содержит сертификаты для подключения к сервису с использованием SSL
examples - Директория с примерами подключения к сервису и выполнением простейших запросов
library - Это фактически копия репозитория https://opensource.tbank.ru/invest/invest-contracts
library/src/docs/contracts - Директория, которая содержит proto файлы
src/models - Директория, которая содержит сгенерированные через protoc модели

Требования для установки

Для начала работы нам потребуется:

  • PHP 7.1 или новее (я делал и тестировал на php 7.4 / Ubuntu 18.04.5)
  • PECL, Composer

ВАЖНО: Данный репозиторий содержит уже сгенерированные из proto файлов модели. Содержимое директории library/src/docs/contracts не используется.

Если Вы хотите генерировать модели самостоятельное, то вам необходимо:

  1. Установить protoc
  2. Собрать плагин grpc_php_plugin (см https://grpc.io/docs/languages/php/basics/#setup)
  3. Вызвать что-нибудь типа:
sudo protoc --proto_path=~/contracts_dir/ --php_out=~/models_dic/ --grpc_out=~/models_dir/ --plugin=protoc-gen-grpc=./grpc_php_plugin ~/contracts_dir/*

подставив нужные вам директории.

Далее нам понадобится расширение grps.so для PHP (https://cloud.google.com/php/grpc).

sudo pecl install grpc

а после не забываем в php.ini добавить

extension=grpc.so

А если вам необходимо логгировать исполнение, то можно также добавить в php.ini

grpc.grpc_verbosity=debug
grpc.grpc_trace=all,-polling,-polling_api,-pollable_refcount,-timer,-timer_check
grpc.log_filename=/var/log/grpc.log

Само собой не забыть

sudo touch /var/log/grpc.log
sudo chmod 666 /var/log/grpc.log

Устанавливаем через composer

PS: Если вы планируете использовать в проекте, разработанном на Yii2 Framework, то можно воспользоваться оберткой metaseller/tinkoff-invest-api-v2-yii2.

Ну либо устанавливаем SDK через composer

$ composer require metaseller/tinkoff-invest-api-v2-php 

ну или

$ git clone git@github.com:metaseller/tinkoff-invest-api-v2-php.git .
composer update

прописываем свой T-Invest API v2 token

$ vim examples/example.php
/**
 * Ваш токен доступа к API
 *
 * @see https://developer.tbank.ru/invest/intro/intro/token
 */
$token = 't.ZEbUT................................................7dA';

и тестируем:

$ php examples/example.php

Тестовые примеры

Можно использовать фабрику создания клиентов доступа к сервисам Tinkoff Invest Api V2

/**
 * Ваш токен доступа к API
 *
 * @see https://developer.tbank.ru/invest/intro/intro/token
 */
$token = '<Your Tinkoff Invest Account Token>';
$tinkoff_api = TinkoffClientsFactory::create($token);

/**
 * Создаем экземпляр запроса информации об аккаунте к сервису
 *
 * Запрос не принимает никаких параметров на вход
 */
$request = new GetInfoRequest();

/**
 * @var GetInfoResponse $response - Получаем ответ, содержащий информацию о пользователе
 */
list($response, $status) = $tinkoff_api->usersServiceClient->GetInfo($request)->wait();

/** Выводим полученную информацию */
var_dump(['user_info' => [
    'prem_status' => $response->getPremStatus(),
    'qual_status' => $response->getQualStatus(),
    'qualified_for_work_with' => $response->getQualifiedForWorkWith(),
]]);

/**
 * @var GetInfoResponse $response - Получаем ответ, содержащий информацию о пользователе
 */
list($response, $status) = $tinkoff_api->usersServiceClient->GetInfo($request)->wait();

/** Выводим полученную информацию */
var_dump(['user_info' => [
    'prem_status' => $response->getPremStatus(),
    'qual_status' => $response->getQualStatus(),
    'qualified_for_work_with' => $response->getQualifiedForWorkWith(),
]]);

Либо создавать клиенты доступа к сервисам напрямую:

/**
 * Ваш токен доступа к API
 *
 * @see https://developer.tbank.ru/invest/intro/intro/token
 */
$token = '<Your Tinkoff Invest Account Token>';

/**
 * Создаем экземпляр подключения к сервису, используя {@link UsersServiceClient}
 */
$user_service_client = new UsersServiceClient(ClientConnection::getHostname(), ClientConnection::getOptions($token));

/**
 * Создаем экземпляр запроса информации об аккаунте к сервису
 *
 * Запрос не принимает никаких параметров на вход
 */
$request = new GetInfoRequest();

/**
 * @var GetInfoResponse $response - Получаем ответ, содержащий информацию о пользователе
 */
list($response, $status) = $user_service_client->GetInfo($request)->wait();

/** Выводим полученную информацию */
var_dump(['user_info' => [
    'prem_status' => $response->getPremStatus(),
    'qual_status' => $response->getQualStatus(),
    'qualified_for_work_with' => $response->getQualifiedForWorkWith(),
]]);

Простенький пример подключения и чтения данных из Stream на основе MarketDataStreamClient (Стакан заявок по тикеру FB на глубину 10)

/**
 * Ваш токен доступа к API
 *
 * @see https://developer.tbank.ru/invest/intro/intro/token
 */
$token = '<Your Tinkoff Invest Account Token>';

/** Пример получения обновляемого через Stream ({@link MarketDataStreamServiceClient}) стакана по тикеру SBER */

$factory = TinkoffClientsFactory::create($token);

/**
 * Пример получения справочника всех Shares инструментов
 *
 * PS: Само собой, если вам нужен только один инструмент, разумнее использовать метод GetInstrumentBy
 */

$instruments_request = new InstrumentsRequest();
$instruments_request->setInstrumentStatus(InstrumentStatus::INSTRUMENT_STATUS_ALL);

/** @var SharesResponse $response */
list($response, $status) = $factory->instrumentsServiceClient->Shares($instruments_request)
    ->wait();

/** @var Instrument[] $instruments_dict */
$instruments_dict = $response->getInstruments();

/**
 * Находим в справочнике (коль он у нас весь есть) нужный нам инструмент
 */
foreach ($instruments_dict as $instrument) {
    if ($instrument->getTicker() === 'SBER') {
        $meta_instrument = $instrument;

        break;
    }
}

if (empty($meta_instrument)) {
    echo('Instrument not found');

    die();
}

/** Создаем подписку на данные {@link MarketDataRequest}, конкретно по {@link SubscribeOrderBookRequest} по FIGI инструмента SBER */
$subscription = (new MarketDataRequest())
    ->setSubscribeOrderBookRequest(
        (new SubscribeOrderBookRequest())
            ->setSubscriptionAction(SubscriptionAction::SUBSCRIPTION_ACTION_SUBSCRIBE)
            ->setInstruments([
                (new OrderBookInstrument())
                    ->setFigi($meta_instrument->getFigi())
                    ->setDepth(10)
            ])
    );

$stream = $factory->marketDataStreamServiceClient->MarketDataStream();
$stream->write($subscription);

/** В цикле получаем данные от сервера */

/** @var MarketDataResponse $market_data_response */
while ($market_data_response = $stream->read()) {
    if ($orderbook = $market_data_response->getOrderbook()) {
        /** @var Order[] $asks */
        $asks = $orderbook->getAsks();

        /** @var Order[] $bids */
        $bids = $orderbook->getBids();

        foreach ($asks as $ask) {
            $price = $ask->getPrice()
                    ->getUnits() + $ask->getPrice()
                    ->getNano() / pow(10, 9)
            ;

            echo 'ASK ' . $price . ' - ' . $ask->getQuantity() . PHP_EOL;
        }

        foreach ($bids as $bid) {
            $price = $bid->getPrice()
                    ->getUnits() + $bid->getPrice()
                    ->getNano() / pow(10, 9)
            ;

            echo 'BID ' . $price . ' - ' . $bid->getQuantity() . PHP_EOL;
        }

        echo 'Orderbook response finished' . PHP_EOL . PHP_EOL;
    }
}

$stream->cancel();

Обновления

  • Вер. 0.5.4 от 2026-06-02.

~ Обновление контрактов до версии 1.49

  • Вер. 0.5.3 от 2026-04-01.

~ Обновление контрактов до версии 1.48

  • Вер. 0.5.2 от 2026-02-10.

~ Переключение на новый репозиторий T-Invest (https://opensource.tbank.ru/invest/invest-contracts/-/tree/master) и обновление контрактов до версии 1.44 из этого репозитория

~ Добавлена DTO Quantity (https://github.com/metaseller/tinkoff-invest-api-v2-php/blob/main/src/dto/Quantity.php)

~ Доработаны классы-провайдеры данных

  • Вер. 0.5.1 от 2026-01-20.

~ Поднята версия библиотеки grpc/grpc (https://github.com/grpc/grpc) до версии ^1.74. Необходимо обновить.

~ Поднята версия библиотеки google/protobuf (https://github.com/protocolbuffers/protobuf) до версии ^3.25.1. Необходимо обновить.

Справочная информация:

Обновление grpc.so:

sudo pecl upgrade grpc

Обновление protoc (Если вы самостоятельно обновляете библиотеку из контрактов):

Можно воспользоваться скриптом https://gist.github.com/Eitol/c12b3102ba872a365461d101650d319b#file-install_protobuf-sh)

Пересборка grpc_php_plugin (Если вы самостоятельно обновляете библиотеку из контрактов): (https://grpc.io/docs/languages/php/basics/#setup)

cd ~
git clone --recurse-submodules --depth 1 --shallow-submodules https://github.com/grpc/grpc
cd grpc
mkdir -p cmake/build
pushd cmake/build
cmake ../..
make protoc grpc_php_plugin
popd
  • Вер. 0.4.24 от 2025-12-18.

~ Добавлен унифицированный класс DTO Цены/Количества (https://github.com/metaseller/tinkoff-invest-api-v2-php/blob/main/src/dto/Price.php)

~ Добавлены новые классы-хелперы ArrayHelper, NumbersHelper, InstrumentsHelper.

~ Переделана логика работы провайдера InstrumentsProvider, исправлены некоторые ошибки в работе

~ Добавлены новые провайдеры данных MarketDataProvider и PortfolioProvider

~ Добавлен метод обработки, вывода ошибки исполнения запроса к API в модели TinkoffClientsFactory

  • Вер. 0.4.23 от 2025-11-11.

~ Обновлены контракты. PR от Andrey Veprikov.

  • Вер. 0.4.22 от 2025-09-07.

~ Обновлены контракты и сертификаты. PR от Andrey Veprikov.

  • Вер. 0.4.21 от 2025-09-07.

~ Обновлены контракты. PR от Andrey Veprikov:

Новый домен API подписан сертификатом Минцифры, в связи с этим:

Обновлены корневые сертификаты в /etc/roots.pem. 
Взят актуальный https://curl.se/ca/cacert.pem и в него добавлены два сертификата от Минцифры (корневой и промежуточный).
Добавлен сертификат домена API /etc/invest-public-api_tbank_ru.pem.
Удалён сертификат старого домена API /etc/tinkoff_ru.pem.
Обновлены соответствующие константы.
Есть два варианта научить среду принимать новый сертификат:

1) Использовать на уровне проекта через переменную окружения:
putenv("SSL_CERT_FILE=/vendor/metaseller/tinkoff-invest-api-v2-php/etc/roots.pem");
2) Обновить системные сертификаты и использовать глобально.

metaseller/tinkoff-invest-api-v2-php 适用场景与选型建议

metaseller/tinkoff-invest-api-v2-php 是一款 基于 HTML 开发的 Composer 扩展包,目前已累计 6.81k 次下载、GitHub Stars 达 25, 最近一次更新时间为 2022 年 01 月 24 日, 在 PHP 生态内属于活跃度较高的组件。

它主要适用于以下技术方向: 「php」 「tinkoff」 「t-invest」 「t-investments」 「invest api sdk」 「T-Invest API PHP SDK」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。

我们在过去多个企业项目中使用过 metaseller/tinkoff-invest-api-v2-php 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 metaseller/tinkoff-invest-api-v2-php 我们能提供哪些服务?
定制开发 / 二次开发

基于 metaseller/tinkoff-invest-api-v2-php 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 6.81k
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 25
  • 点击次数: 4
  • 依赖项目数: 2
  • 推荐数: 0

GitHub 信息

  • Stars: 25
  • Watchers: 6
  • Forks: 7
  • 开发语言: HTML

其他信息

  • 授权协议: Apache-2.0
  • 更新时间: 2022-01-24