Формулировка проблемы: для реализации задач мобильного клиента необходимо реализовать методы API для подписывания документов с помощью ЭЦП.
Решение: необходимо реализовать следующие методы API:
Данный метод используется для подписывания документа (кнопкой "Подписать").
URL нового метода: rest/api/docflow/sign.
Тип запроса: POST.
Метод принимает следующие строковые параметры (FormParam):
documentID - идентификатор подписываемого
документа (обяз.);
rawdata - Base64 закодированные
подписываемые данные (обяз.);
signdata - Base64 закодированная строка с
подписью (обяз., если включена настройка "Требовать ключ
и сертификат");
certificate - Base64 закодированная строка
с сертификатом (обяз., если включена настройка "Требовать
ключ и сертификат");
certID - идентификатор сертификата (обяз.,
если включена настройка "Требовать ключ и
сертификат", получается в методе
sign/verificationkey);
locale - локаль пользователя,
ru/en/kz (не обяз., по умолчанию
ru).
Пример передаваемых данных
{
documentID=23288475-1393-474a-9849-6c1d6600a0dd&
rawdata=gs65nEDW1GxiEoj22XoJ6QPwWUM%3D&
signdata=MIIOAwIBAzCCDb0GCSqGSIb3DQEHAaCC2qMIAwgAYJKoZIhvcNAQcBoIAEggW&
certificate=5qLrhfFWNcHT%2BVEMvA%2BgUvYk956seA+wgNqniukCz8TyGTv8AMo4v8aW&
certID=610466d0-cae8-11e5-b48c-001e8726c38d
}
Метод возвращает успешность (подпись документа с ЭЦП):
{
"errorCode": 0,
"errorMessage": "Данные сохранены"
}
либо неуспешность выполнения (errorCode != 0, errorMessage - сообщение об ошибке).
Альтернативные потоки событий.
Альтернативный поток №1. Не передан параметр
documentID. Сервер возвращает ошибку с
сообщением:
{
"errorCode": 13,
"errorMessage": "Не передан параметр documentID"
}
Альтернативный поток №2. Передан некорректный параметр
documentID. Сервер возвращает ошибку с
сообщением:
{
"errorCode": 13,
"errorMessage": "Передан некорректный параметр documentID"
}
Альтернативный поток №3. Не передан параметр
rawdata. Сервер возвращает ошибку с сообщением:
{
"errorCode": 13,
"errorMessage": "Не передан параметр rawdata"
}
Альтернативный поток №4. При наличии требования ключа и
сертификата не передан параметр signdata.
Сервер возвращает ошибку с сообщением:
{
"errorCode": 13,
"errorMessage": "Не передан параметр signdata"
}
Альтернативный поток №5. При наличии требования ключа и
сертификата и параметра signdata не передан
параметр certificate. Сервер возвращает ошибку
с сообщением:
{
"errorCode": 13,
"errorMessage": "Не передан параметр certificate"
}
Альтернативный поток №6. При наличии требования ключа и
сертификата и параметра signdata не передан
параметр certID. Сервер возвращает ошибку с
сообщением:
{
"errorCode": 13,
"errorMessage": "Не передан параметр certID"
}
Альтернативный поток №7. Параметр rawdata не
соответствует текущим подписываемым данным документа. Сервер
возвращает ошибку с сообщением:
{
"errorCode": 13,
"errorMessage": "Передан некорректный параметр rawdata"
}
Альтернативный поток №8. Параметр signdata не
соответствует текущим подписываемым данным документа. Сервер
возвращает ошибку с сообщением:
{
"errorCode": 13,
"errorMessage": "Передан некорректный параметр signdata"
}
Кроме того, возможен вывод ошибки, если сертификат в период между прохождением верификации и непосредственно подписью стал просроченным, отозванным, либо не может быть проверен, стал недоступен центр сертификации, не найдена цепочка корневых сертификатов.
Аналогично, возможен вывод ошибки, если в период между получением подписываемых данных и непосредственно подписью эти самые подписываемые данные были изменены.
Данный метод используется для подписывания документа при согласовании / утверждении / ознакомлении.
URL дорабатываемого метода:
rest/api/workflow/finish_process.
Тип запроса: POST.
Метод принимает следующие строковые параметры (FormParam):
procInstID - идентификатор процесса (обяз.,
поле procInstID в описании работы, например
из метода
/rest/api/workflow/works/list/%user_id%);
signal - название сигнала (обяз.,
получается в методе
rest/api/workflow/process_info);
comment - текст комментария (не обяз.);
Примечание.
Наличие данного параметра должно игнорироваться для процесса "ознакомление".
addSignature - необходимо ли добавить
подпись (true/ false, по умолчанию false);
rawdata - Base64 закодированные
подписываемые данные (обяз., если включена настройка
"Требовать ли подпись", получаются в методе
rest/api/workflow/process_info);
signdata - Base64 закодированная строка с
подписью (обяз., если включена настройка "Требовать ключ
и сертификат");
certificate - Base64 закодированная строка
с сертификатом (обяз., если включена настройка "Требовать
ключ и сертификат");
certID - идентификатор сертификата (обяз.,
если включена настройка "Требовать ключ и
сертификат", получается в методе
sign/verificationkey);
locale - локаль пользователя,
ru/en/kz (не обяз., по умолчанию
ru).
Пример передаваемых данных
procInstID=8f228927-2183-4fc8-9f87-b421bf63efc4& signal=got_agree& addSignature=true& rawdata=74PFr9hyqFhqnsoYRAhf91qcVmU%3D& signdata=MIIOAwIBAzCCIb3DQEHAaCCDa4Egg2qMIAwgAYJKoZIhvcNAQcBoIAEggW& certificate=5qLrhfFWNO0G05ij%252F69956seA%2BwgNGpqniukCz8TyGTv8AMo4v8aW& certID=610466d0-cae8-11e5-b48c-001e8726c38d
Метод возвращает успешность выполнения (завершение работы по процессу с подписью ЭЦП):
{
"errorCode": "0",
"errorMessage": "Данные сохранены"
}
либо неуспешность выполнения (errorCode != 0, errorMessage - сообщение об ошибке).
Альтернативные потоки событий.
Альтернативный поток №1. Тип процесса требует наличие подписи, при
этом не передан параметр addSignature. Сервер
возвращает ошибку с сообщением:
{
"errorCode": "13",
"errorMessage": "Данный тип процесса требует подписи"
}
Для дальнейших альтернативных потоков считаем, что тип процесса
требует подписи и что передан параметр
addSignature.
Альтернативный поток №2. Не передан параметр
rawdata. Сервер возвращает ошибку с сообщением:
{
"errorCode": "13",
"errorMessage": "Не передан параметр rawdata"
}
Альтернативный поток №3. При наличии требования ключа и
сертификата не передан параметр signdata.
Сервер возвращает ошибку с сообщением:
{
"errorCode": "13",
"errorMessage": "Не передан параметр signdata"
}
Альтернативный поток №4. При наличии требования ключа и
сертификата и параметра signdata не передан
параметр certificate. Сервер возвращает ошибку
с сообщением:
{
"errorCode": "13",
"errorMessage": "Не передан параметр certificate"
}
Альтернативный поток №5. При наличии требования ключа и
сертификата и параметра signdata не передан
параметр certID. Сервер возвращает ошибку с
сообщением:
{
"errorCode": "13",
"errorMessage": "Не передан параметр certID"
}
Альтернативный поток №6. Параметр rawdata не
соответствует текущим подписываемым данным документа. Сервер
возвращает ошибку с сообщением:
{
"errorCode": "13",
"errorMessage": "Передан некорректный параметр rawdata"
}
Альтернативный поток №7. Параметр signdata не
соответствует текущим подписываемым данным документа. Сервер
возвращает ошибку с сообщением:
{
"errorCode": "13",
"errorMessage": "Передан некорректный параметр signdata"
}
Альтернативный поток №8. Параметр certificate
не является сертификатом. Сервер возвращает ошибку с сообщением:
{
"errorCode": "13",
"errorMessage": "Передан некорректный параметр certificate"
}
Кроме того, возможен вывод ошибки, если сертификат в период между прохождением верификации и непосредственно подписью стал просроченным, отозванным, либо не может быть проверен, стал недоступен центр сертификации, не найдена цепочка корневых сертификатов.
Аналогично, возможен вывод ошибки, если в период между получением подписываемых данных и непосредственно подписью эти самые подписываемые данные были изменены.