glsv / diadoc-api
用于操作 diadoc.ru 的 API
v0.4.0
2023-02-10 14:57 UTC
Requires
- php: >=7.4.0
- ext-json: *
- ext-mbstring: *
- guzzlehttp/guzzle: ^7.5
Requires (Dev)
- phpunit/phpunit: ^9.5
README
为使用 api-docs.diadoc.ru 的 API 提供包装。
- 通过登录名和密码自行获取和存储令牌来发送 API 请求;
- 通过处理以 DTO(数据传输对象)形式表示的命令和执行结果来规范化使用;
安装
composer require glsv/diadoc-api
依赖
- PHP 7.4+
- guzzlehttp/guzzle
使用
使用库的通用逻辑
// Сервис аутентификации
$authenticator = new PasswordAuthenticator($login, $passwd);
// API с передачей в него настрок и зависимостей
$api = new DiadocClientApi($baseUrl, $developer_key, $authenticator);
// Сформировать запрос на конкретную функцию.
// Инициализация всех обязательных свойств запроса производится через конструктор
$request = new GetDocumentRequest($boxId, $messageId, $entityId);
// Создать объект команды с передачей API и созданного запроса
$command = new GetDocumentCommand($api, $request);
// Выполнить команду
$result = $command->execute();
在 $result 中将返回实现 Glsv\DiadocApi\interfaces\ApiResponseInterface
接口的对象
ApiResponseInterface 实现了 3 个方法
- isError(): bool
- getError(): string
- getData(): array
因此,可以通过这些方法检查请求是否成功执行。如果没有,则获取错误消息。
如果请求成功执行,则通过 getData()
方法获取结果。getData()
的内容取决于请求类型。返回数据的格式需要查看 Diadoc 文档。
1. 获取文档(元数据)
<?php
use Glsv\DiadocApi\services\PasswordAuthenticator;
use Glsv\DiadocApi\DiadocClientApi;
use Glsv\DiadocApi\requests\GetDocumentRequest;
use Glsv\DiadocApi\commands\GetDocumentCommand;
$baseUrl = 'https://diadoc-api.kontur.ru';
// Your login and passwd in diadoc.ru
$login = 'user@yourdomain.com';
$passwd = 'passwd';
$developer_key = 'gl-a05289f6-408f-4ece-9670-xxxxxx';
$boxId = '4fb9ac6ec32e40579a106fdb0092aea6';
$messageId = 'dc7e1be3-4d22-4c6b-89ce-6df3186e1c56';
$documenId = 'ec164dfb-bc95-442f-8f60-e34ee51e5c16';
$authenticator = new PasswordAuthenticator($login, $passwd);
$api = new DiadocClientApi($baseUrl, $developer_key, $authenticator);
$request = new GetDocumentRequest($boxId, $messageId, $entityId);
$res = (new GetDocumentCommand($api, $request))->execute();
print_r($res);
结果
返回结果为 SuccessResponse
或 ErrorResponse
对象,这两个对象都实现了 Glsv\DiadocApi\interfaces\ApiResponseInterface
接口。可以通过 getData()
方法获取 Diadoc 原始响应数据的数组形式。
Diadoc 返回数据的格式: developer.kontur.ru/Docs/diadoc-api/proto/Document.html
Glsv\DiadocApi\responses\SuccessResponse Object
(
[data:protected] => Array
(
[MessageId] => dc7e1be3-4d22-4c6b-89ce-6df3186e1c57
[EntityId] => ec164dfb-bc95-442f-8f60-e34ee51e5c15
[CreationTimestampTicks] => 638060933238601247
[CounteragentBoxId] => 51082e19b28d4ffcb0f974431444ae03@diadoc.ru
[DocumentType] => AcceptanceCertificate
/////////////////////////
// Другие атрибуты response
/////////////////////////
[DocflowStatus] => Array
(
[PrimaryStatus] => Array
(
[Severity] => Success
[StatusText] => Подписан контрагентом
)
)
[MessageIdGuid] => dc7e1be3-4d22-4c6b-89ce-6df3186e1c57
[EntityIdGuid] => ec164dfb-bc95-442f-8f60-e34ee51e5c15
[CreationTimestamp] => 2022-12-08T10:48:43.8601247Z
)
)
2. 获取打印的签名文档形式
<?php
use Glsv\DiadocApi\services\PasswordAuthenticator;
use Glsv\DiadocApi\DiadocClientApi;
use Glsv\DiadocApi\requests\GeneratePrintFormRequest;
use Glsv\DiadocApi\commands\GeneratePrintFormCommand;
$baseUrl = 'https://diadoc-api.kontur.ru';
// Your login and passwd in diadoc.ru
$login = 'user@yourdomain.com';
$passwd = 'passwd';
$developer_key = 'gl-a05289f6-408f-4ece-9670-xxxxxx';
$boxId = '4fb9ac6ec32e40579a106fdb0092aea6';
$messageId = 'dc7e1be3-4d22-4c6b-89ce-6df3186e1c56';
$documenId = 'ec164dfb-bc95-442f-8f60-e34ee51e5c16';
$authenticator = new PasswordAuthenticator($login, $passwd);
$api = new DiadocClientApi($baseUrl, $developer_key, $authenticator);
$request = new GeneratePrintFormRequest($boxId, $messageId, $entityId);
$res = (new GeneratePrintFormCommand($api, $request))->execute();
print_r($res);
结果
返回结果为 SuccessFileResponse
或 ErrorResponse
对象,这两个对象都实现了 Glsv\DiadocApi\interfaces\ApiResponseInterface
接口。
在成功执行的情况下,SuccessFileResponse->getData() 返回一个包含单个 FileDto()
元素的数组 FileDto
包含文件的 base64 编码内容,名称和 contentType。
Glsv\DiadocApi\responses\SuccessFileResponse Object
(
[fileDto:protected] => Glsv\DiadocApi\dto\FileDto Object
(
[binaryData] => Содержимое файла в base64
[filename] => 4fb9ac6e-c32e-4057-9a10-6fdb0092aea5.ec164dfb-bc95-442f-8f60-e34ee51e5c15.638061937254976253_ru_.pdf
[contentType] => application/pdf
)
)