Написать пост

Как мы реализовали подпись документов с помощью ЭЦП для площадки на Bitrix

Аватарка пользователя Дмитрий Талызин

Как мы внедрили инструмент для заверения документов электронной подписью на сайте с движком Bitrix. Код — внутри.

В этой статье подробно расскажем, как мы технически реализовали возможность подписания документов для проведения аукционов на онлайн-площадке в сфере недропользования. И, конечно, поделимся фрагментами кода.

Наша команда INDEXIS в 2022 году выпустила проект NEDRARU.RU на системе «1С-Битрикс». Эта онлайн-площадка позволяет купить, продать, сдать в аренду участок недр или месторождение, а также найти надежных поставщиков и подрядчиков.

Как работает система подписания документов на портале

На портале во время проведения аукционов участвуют 3 стороны: портал, создатель аукциона и участник аукциона. У любого пользователя, который зарегистрировался на сайте как владелец объекта, есть возможность создать аукцион по опубликованному им объекту на продажу или аренду.

Для юридического проведения аукционов между площадкой, создателем аукциона и участниками аукциона необходимо, чтобы все стороны подписали документы посредством электронной цифровой подписи (ЭЦП). Создателю и участнику аукциона необходимо заранее самостоятельно оформить ЭЦП в любом аккредитованном удостоверяющем центре.

Документы для аукциона подписываются на сайте аккредитованного удостоверяющего центра (далее — «Сервис»).

Как мы выбирали удостоверяющий центр

Мы обратились в несколько аккредитованных удостоверяющих центров. Как оказалось, не все центры готовы заниматься интеграцией своего инструментария во внешние сервисы, так как это не их профильная услуга. Нашим предложением заинтересовались коллеги в «Инфотекс Интернет Траст». Для сотрудничества с нами сервис выделил опытного специалиста. Мы остались довольны, смогли оперативно и качественно реализовать все задачи:

  1. Автоматическая регистрация пользователя в сервисе «Инфотекс Интернет Траст» с передачей данных о нем с портала.
  2. Передача документов на подпись с портала и формирование ссылки на подпись для участников.
  3. Получение статуса подписи (прошла успешно / не подписан) с сервиса «Инфотекс Интернет Траст» на портал.

Описание технической части процесса

Мы провели интеграцию с сервисом через создание клиентской части на PHP в «1С-Битрикс». Клиентская часть взаимодействует с сервисом по API.
Работа с сервисом «Инфотекс Интернет Траст» состоит из двух частей:

  1. Взаимодействие с API саморегистрации пользователей для проверки и регистрации новых пользователей на портале «Инфотекс Интернет Траст».
  2. Взаимодействие с API передачи документов.

Оба API выполнены в архитектурном стиле REST и описаны по спецификации OpenAPI. Отличие между ними — в типе аутентификации. В первом случае для проверки запросов используется идентификатор вашей организации, выданный сервисом. Во втором — полноценный токен, возвращаемый с сервера «Инфотекс Интернет Траст» посредством передачи пары логин-пароль.

Сервис предоставляет разработчикам краткие сценарии использования основных функций, описание API, а также адрес dev-площадки для тестирования.

Для обмена с API в рамках PHP можно использовать клиентскую библиотеку curl. В «1С-Битрикс» мы использовали встроенный класс httpclient.

Рассмотрим процесс поэтапно.

Регистрация пользователей с портала в сервисе «Инфотекс Интернет Траст»

Первоначально наша задача состояла в регистрации пользователей с портала в сервисе «Инфотекс Интернет Траст».

Регистрация происходит посредством создания заявки на регистрацию путем передачи персональных данных пользователя и открытой части ключа электронной подписи.

Формируем на /api/v2/b2b-requests post-запрос вида:

			$httpClient = new HttpClient(
["waitResponse" => true]
);
$httpClient->setHeader('Content-Type', 'application/json', true);

$query = \Bitrix\Main\Web\Json::encode([
"sourceId" => "#ID#",
"regionCode" => $userFields["REGION"],
"requestSourcesIds" => [
"#ID#"
],
"organization" => [
'inn' => $userFields["UF_INN"]
],
"certificateBase64" => base64_encode(file_get_contents($_SERVER["DOCUMENT_ROOT"] . $filePath)),
"certificateOwner" => [
"fullName" => [
"firstName" => $userFields["NAME"],
"lastName" => $userFields["LAST_NAME"],
],
"phone" => $userFields["PERSONAL_PHONE"]
]
]);

$response = $httpClient->post(
$this->apiUrlReg."/api/v2/b2b-requests",
$query
);
		

Где sourceId — уникальный идентификатор нашей организации, выдаваемый «Инфотекс Интернет Траст», а certificateBase64 — открытая часть ключа подписи пользователя в формате Base64.

В requestSourcesIds аналогично передаем наш идентификатор, чтобы зарегистрированный пользователь сразу появился в нашем списке контрагентов на сайте «Инфотекс Интернет Траст».

Остальные поля — это просто соответствующие данные пользователя.

При корректно заполненной информации в ответе в поле ["data"]["orderId"]; получаем id нашей заявки по регистрации.

2. Проверка заявки на регистрацию

Далее мы можем проверить статус нашей заявки на регистрацию через get-запрос вида:

			$response = $httpClient->get(
$this->apiUrlReg . "/api/v2/b2b-requests/".$orderId."/status"
);
		

Где orderId — это id нашей заявки, полученной на предыдущем шаге.

После успешной регистрации пользователя можно приступать к работе с документами через второе API.

3. Работа с документами через API: получение токена

Здесь наша задача состоит в получении токена, который потребуется для всех дальнейших операций, передав пару логин-пароль по адресу /api/auth/login/.

Для этого формируем запрос к серверу:

			$httpClient = new HttpClient(
["waitResponse" => true]
);
$httpClient->setHeader('Content-Type', 'application/json', true);

$query = \Bitrix\Main\Web\Json::encode([
"username" => $this->keyData["LOGIN"],
"password" => $this->keyData["PASSWORD"],
]);
$response = $httpClient->post(
$this->apiUrl . "/api/auth/login/",
$query
);
		

В ответе с сервера в поле token получаем токен. Далее ставим его в заголовок всех наших будущих запросов:

			$httpClient->setHeader(‘Authorization’, ‘Bearer ‘ . $this->token, true);
		

4.Работа с документами через API: отправка документов на подпись

Чтобы отправить документы на подпись, нам необходимо получить уникальный идентификатор пользователя, зарегистрированного нами в «Инфотекс Интернет Траст».

Он входит в список наших контрагентов, поэтому мы можем получить этот идентификатор запросом поиска по контрагентам:

			$query = http_build_query([
"limit" => 1,
"offset" => 0,
"search" => $searchStirng,
"extend" => "users",
]);

$response = $httpClient->get(
$this->apiUrl . "/api/contractor?" . $query
);
		

Где $searchStirng — это ИНН нашего пользователя.

Теперь отправляем документы на подпись запросом на /api/workflow.

			foreach ($arDocs as $arDoc) {
$documents[] = [
"title" => $arDoc["NAME"],
"path" => $arDoc["NAME"] . ";" . base64_encode(file_get_contents($_SERVER["DOCUMENT_ROOT"] . $arDoc["PATH"])),
"type" => "B2B_UNFORMALIZED_SIGN",
"externalId" => $arDoc["ID"],
];
}

$query = \Bitrix\Main\Web\Json::encode([
"title" => "Документы аукциона на подпись",
"documents" => $documents,
"contractorRecipients" => $contractorRecipients
]);

$response = $httpClient->post(
$this->apiUrl . " /api/workflow",
$query
);
		

Документы, как и открытая часть ключа, передаются в формате base64.

Дополнительно нам понадобится параметр contractorRecipients. Параметр представляет собой массив с идентификаторами пользователей, которым отправляются документы.

Используем наш идентификатор, полученный на предыдущем шаге.

В результате получаем id операции в поле id.

По id мы формируем ссылку на сайт вида https://b2b.iitrust.ru/workflow/#ID_Операции#.

По этой ссылке будет происходить подписание документов в сервисе «Инфотекс Интернет Траст».

Основная работа завершена.

5. Работа с документами через API: подпись документов

Теперь мы можем передать эту ссылку стороне, отправляющей документы на подпись (в нашем случае — оператору ).

В интерфейсе «Инфотекс Интернет Траст» по нажатию кнопки «Отправить на подписание» происходит передача документов принимающей стороне (пользователю, которого мы зарегистрировали).

Страница подписания для нее также становится доступна по используемой ранее ссылке https://b2b.iitrust.ru/workflow/#ID_Операции#.

Отслеживать состояние процесса подписания со стороны сайта (подписано, аннулировано, отправлено и др.) мы можем запросом на /api/workflow/.

			$response = $httpClient->get(
$this->apiUrl . "/api/workflow/" . $operationID . "/"
);
		

Где $operationID — это id нашей операции. В поле state вернется ее текущий статус.

На этом техническая часть по настройке подписания документов при помощи ЭЦП завершена.

Наш клиент получил реализованный под ключ проект. Теперь проводить сделки по купле-продаже и аренде участков недр или месторождений стало удобнее и проще.

Если есть вопросы, пишите в комментариях.

Следите за новыми постами
Следите за новыми постами по любимым темам
3К открытий3К показов