PHP-библиотека для работы с API Диадок (protobuf + HTTP), совместимая с PHP 7.1.
За основу взят модуль magdv/diadoc-php.
В рамках этого репозитория выполнены ключевые доработки:
- перевод авторизации на OpenID Connect (Authorization Code Flow) вместо устаревшего
DiadocAuth//Authenticate; - добавлен
Bearer-заголовок и обработка жизненного циклаaccess_token/refresh_token; - добавлено проактивное и реактивное обновление токена (refresh);
- обновлены примеры, тестовая обвязка и конфигурация окружения;
- добавлен локальный тестовый OAuth-сервер для сценария CLI + браузер.
Механизм авторизации актуальный на 14.04.2026
Документация API Диадок:
- PHP
>=7.1.3(проект тестируется на7.1.33); - расширения
ext-curl,ext-json; composer;- для генерации классов из proto: установленный
protoc.
composer install<?php
declare(strict_types=1);
require __DIR__ . '/vendor/autoload.php';
use MagDv\Diadoc\DiadocApi;
$clientId = 'ваш-client_id';
$clientSecret = 'ваш-client_secret';
$redirectUri = 'https://ваше-приложение/oauth/callback';
$api = new DiadocApi(
$clientId,
$clientSecret,
'https://diadoc-api.kontur.ru/' // или тестовый URL
);
// 1) Получить URL входа и отправить пользователя в браузер:
$loginUrl = $api->buildAuthorizationUrl($redirectUri, 'state-value', null);
// 2) В обработчике callback после редиректа с ?code=...:
// $api->exchangeAuthorizationCode($_GET['code'], $redirectUri);
// 3) Или восстановить ранее сохраненную сессию:
// $api->setOAuthSession($accessToken, $refreshToken, $expiresAtUnix);
$orgList = $api->getMyOrganizations();
echo $orgList->getOrganizations()[0]->getOrgId();Пример в .env.example.
Основные переменные:
OAUTH_CLIENT_ID—client_idприложения из кабинета интегратора;OAUTH_CLIENT_SECRET—client_secretприложения;OAUTH_IDENTITY_URL— URL identity-провайдера (обычноhttps://identity.kontur.ru);DIADOC_URL— базовый URL API Диадок (prod / staging / test);OAUTH_REDIRECT_URI— redirect для OAuth callback (для локального теста по умолчаниюhttp://127.0.0.1:8765/oauth/callback);ORG_ID,FROM_BOX_ID,TO_BOX_ID— данные для интеграционных тестов.
Опционально (ручная подстановка токенов):
DIADOC_ACCESS_TOKENDIADOC_REFRESH_TOKENDIADOC_ACCESS_EXPIRES_AT(unix timestamp)
В проекте есть docker-compose.yml с сервисами:
cli— запуск скриптов, smoke и интеграционных проверок;oauth-test(профильoauth) — встроенный PHP-сервер для получения OAuth-токена через браузер.
docker compose run --rm cli composer installdocker compose --profile oauth up --build oauth-testПосле запуска откройте в браузере:
http://127.0.0.1:8765/
Важно:
- в кабинете интегратора должен быть зарегистрирован ровно тот же
redirect_uri, что иOAUTH_REDIRECT_URI; - для локального сценария по умолчанию:
http://127.0.0.1:8765/oauth/callback.
После успешного callback сервер:
- сохраняет OAuth-сессию в
var/oauth_last_session.json; - сохраняет кэш-сессию в
var/*.cache(формат совместим сtests/helpers/ApiClient.php).
Проверяет:
- PHP/расширения;
- синтаксис
src/иphpProto/; - автозагрузку;
- базовый protobuf roundtrip;
- критичные конструкторы/хелперы.
Запуск:
docker compose run --rm cli composer run test:compatПример проверки чтения контрагентов:
docker compose run --rm cli php -r "require 'vendor/autoload.php'; use Test\helpers\ApiClient; \$api = (new ApiClient())->getApi(); \$orgId = getenv('ORG_ID'); \$counteragents = \$api->getCountragentsV2(\$orgId); echo 'totalCount=' . \$counteragents->getTotalCount() . PHP_EOL;"Если приходит Organization ... is not found, обновите ORG_ID значением из getMyOrganizations() текущего пользователя в той же среде (DIADOC_URL).
Полезные команды:
composer run generate-proto— генерация PHP-классов изproto/;composer run test:compat— smoke-проверка совместимости.
Поток работы:
- Обновить/добавить схемы в
proto/; - Выполнить
composer run generate-proto; - Проверить сгенерированный код в
phpProto/; - Обновить использование новых полей/методов в
src/.