magdv / diadoc-php

MIT License
5 stars 6 forks source link

Отправка документов #2

Closed Djag07 closed 10 months ago

Djag07 commented 1 year ago

Добрый день! Подскажите пожалуйста, как используя ваш api можно отправить документ в письме контрагенту или хотя бы положить его на полку? Я не могу найти соответствующие методы загрузки документа в Диадок, которые были в либе, которую вы брали за основу. Заранее спасибо и простите за беспокойство.

denis-korolev commented 1 year ago

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

Можно ссылку на метод из этой документации? https://developer.kontur.ru/Docs/diadoc-api/index.html

Djag07 commented 1 year ago

Добрый день! Я имею в виду например метод ShelfUpload https://developer.kontur.ru/Docs/diadoc-api/http/ShelfUpload.html

Мне нужно загружать документы и отправлять через Diadoc. У вашего коллеги были методы generateSignedContentFromFile и ShelfUpload. Они позволяют либо положить документ "на полку", а уже потом работать с ним (например, прикреплять к письму), либо непосредственно получать содержимое файла и аттачить его к письму.

denis-korolev commented 1 year ago

Да, понял. Нашел сейчас о чем разговор. ShelfUpload - этот метод не реализован. В протофайле есть описание, сгененрирован даже php класс для него. generateSignedContentFromFile - в работе он пока мне нужен был и там была какая - то зависимость для подписывания файла, она мне была не нужна. Пришлось от нее избавиться.

Сегодня я не могу заняться добавлением данных методов. Можете вы сами его добавить если срочно. Если нет, то могу на выходных заняться данным вопросом.

Djag07 commented 1 year ago

Было бы классно, если бы вы добавили. Мне нужнее generateSignedContentFromFile все же. Удобнее отправлять документы сразу же, минуя хранение "на полке". Я планирую использовать ваш api в работе и не хочется внедряться в чужой код) По поводу метода с подписыванием действительно все сложно. Я просто закомментил $signedContent->setSignature($this->signerProvider->sign($content)); в методе generateSignedContent по сути отключив тем самым подпись контента.

denis-korolev commented 1 year ago

Обновил библиотеку, добавил новый тег. Я не смог нормально проверить как работает подписание, т.к. надо очень хитро настроить openssl чтобы поддерживался формат по ГОСТу Загрузка на полку должна работать, мне выдало 200, большего АПИ диадока не умеет возвращать Подписание будет работать, если у вас настроен OpenSsl.

Если надо уметь отключать подписание , то скажите, добавлю костыль

Djag07 commented 1 year ago

Спасибо за помощь! Если вы планируете поддерживать библиотеку в дальнейшем и, возможно, обновлять, то добавьте, пожалуйста, отключение подписания. Если нет, я сам могу добавить.

Djag07 commented 1 year ago

У меня еще есть небольшой вопрос. У вашего коллеги в классе MessageToPost были методы добавления документов к письму (например addSupplementaryAgreements и другие), правда и версия protobuf была более старая. Как в вашей либе можно прикрепить аттач? В MessageToPost вижу только геттеры и сеттеры.

denis-korolev commented 1 year ago

addSupplementaryAgreements - надо ссылку на документацию, где этот метод описан. Может он просто устаревший и потому в новой версии отсутствует. Вообще эта либа была мною скопирована для нужд проекта, я использую лишь несколько методов, все остальное я даже не проверял на работоспособность.

Еще у меня вопрос - если использовать generateSignedContentFromFile без пописи, то диадок нормально принимает данные? Не ругается?

Мы планировали использовать дидадок, но потом переключились на https://kontur.ru/logistika Это новый сервис и немного более адекватный. Так что может Вам не нужен ДИАДОК?

Djag07 commented 1 year ago

Почитал еще раз документацию. Действительно, структура SupplementaryAgreementAttachment считается устаревшей. Сейчас рекомендуется генерировать аттачи через универсальный как-будто бы DocumentAttachment.

По вопросу - у меня задача не отправлять документы контрагентам, очевидно, что они не отправятся без подписи, а просто сохранять сообщение с аттачем в исходящих при отправке. А потом кто-то уже будет их подписывать вручную в диадоке и отправлять. Поэтому в данном случае реализация подписи избыточна. Диадок не ругается.

По третьему моменту - к сожалению задача именно с Диадоком интеграцию настроить. Тем более, что компания не транспортная.

denis-korolev commented 1 year ago

Посмотрите файл MessageTest там тестируется метод для отправки сообщений. В него можно прикреплять просто файл, может он поможет. Файл не подписанный. Сам по себе метод метод generateSignedContent без подписи не делает ничего. Он просто создает объект с контентом. Так что не вижу смысла его как - то править, если просто не нужна подпись.

        $postObject = new MessageToPost();
        $postObject->setFromBoxId(getenv(ConfigNames::FROM_BOX_ID));
        $postObject->setToBoxId(getenv(ConfigNames::TO_BOX_ID));

        $xml = file_get_contents(dirname(__DIR__, 1) . DIRECTORY_SEPARATOR . 'files' . DIRECTORY_SEPARATOR . 'ECN.xml');

        $content = new SignedContent();
        $content->setContent($xml);

        $attachment = new DocumentAttachment();
        $attachment->setSignedContent($content);
        $attachment->setTypeNamedId(DocumentType::name(DocumentType::LogisticsWaybill));

        $postObject->setDocumentAttachments([$attachment]);

        /** @var \Diadoc\Proto\Events\Message $response */
        $response = $api->getApi()->postMessage($postObject);