diadoc / diadocapi-docs

HTTP API documentation - http://api-docs.diadoc.ru/
41 stars 90 forks source link

Подпись входящего документооборота #1007

Closed Leznevskiy closed 1 year ago

Leznevskiy commented 1 year ago

нужно реализовать подпись документов через отпечаток сертификата электронной подписи. такой вопрос, какие методы использовать какая последовательность, читаю гит, половина методов устарела, половина исчезла, никакой точной информации как по api подписать документ - нет!

death-mouse commented 1 year ago

Лично мы у себя реализовали для исходящих. В начале используем PrepareDocumentsToSign, формируем такой фот json

{
    "BoxId": "$1",
    "DraftDocuments": [
        {
            "DocumentId": {
                "MessageId": "$2",
                "EntityId": "$3"
            },
            "ExtendedSigner": [
                {
                    "BoxId": "$1",
                    "SignerCertificateThumbprint": "$4"
                }
            ]
        }
    ]
}

В ответ получаем данные, которые нужно подписать, лежать в Content и запоминаем PatchedContentId. Подписываем сертификатом данные которые лежали в Content и запоминаем их. Далее используем метод PostMessagePatch. Формируем такой вот запрос

{
    "BoxId": "$1",
    "MessageId": "$2",
    "Signatures": [
        {
            "ParentEntityId": "$3",
            "Signature": "Base64String подписи, файла который получился в результате подписания данных полученных из PrepareDocumentsToSign",
            "PatchedContentId": "PatchedContentId которые получили из PrepareDocumentsToSign",
        }
    ]
}

Отправляем и все документ подписан. Но у нас реализовано, что в начале просто отправляем документ без подписи. Он получает статус "Требуется подписать и отправить"

Leznevskiy commented 1 year ago

мне для входящего нужно, там наверное схема другая

death-mouse commented 1 year ago

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

<UniversalTransferDocumentBuyerTitle
                        AcceptanceDate="$4" DocumentCreator="$1"
                        OperationContent="$3" xmlns=""
                        xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                        <ContentOperCode TotalCode="$2"/>
                        <Signers>
                            <SignerReference BoxId="$5" CertificateThumbprint="$6"/>
                        </Signers>
                    </UniversalTransferDocumentBuyerTitle>

Методом POST, отправляем запрос на GenerateTitleXml с заполнением query параметров GenerateTitleXml?boxId={uri.var.boxId}&documentTypeNamedId={uri.var.documentTypeNamedId}&documentFunction={uri.var.function}&documentVersion={uri.var.documentVersion}&titleIndex=1&letterId={uri.var.messageId}&documentId={uri.var.entityId}

Получаем титул покупателя, его подписываем

Далее формируем запрос

{
    "BoxId": "$1",
    "MessageId": "$2",
    "RecipientTitles": [
        {
            "ParentEntityId": "$3",
            "SignedContent": {
                "Content": "$4",
                "Signature": "$5"
            }
        }
    ]
}

И отправляем его на V3/PostMessagePatch.

Все документ подписан.