diadoc / diadocsdk-csharp

Official Diadoc SDK for C#
MIT License
35 stars 64 forks source link

Ошибка при подписании УПД от имени получателя через C#. #645

Open ypavlovabko opened 4 years ago

ypavlovabko commented 4 years ago

Здравствуйте. Я пытаюсь в C# подписать УПД (получатель). Вроде бы иду по инструкции, по не понимаю, какие именно параметры нужно задать в функции GenerateRecipientTitleXml. Вот такой код:

public void SignUPD(Diadoc.Api.Proto.Documents.Document documentDiadoc) { Diadoc.Api.Proto.Invoicing.Signers.ExtendedSignerDetails signerDetails = new Diadoc.Api.Proto.Invoicing.Signers.ExtendedSignerDetails(); signerDetails.FirstName = GetSignatureFirstName(sertificate.Subject); signerDetails.Inn = INN; signerDetails.Patronymic = GetSignatureLastName(sertificate.Subject); signerDetails.Surname = GetSignatureSurName(sertificate.Subject); signerDetails.JobTitle = GetSignatureTitle(sertificate.Subject); signerDetails.RegistrationCertificate = String.Empty; signerDetails.SignerOrganizationName = GetOrganizationName(sertificate.Subject);

        signerDetails.SignerType = Diadoc.Api.Proto.Invoicing.Signers.SignerType.LegalEntity;
        signerDetails.SignerPowers = Diadoc.Api.Proto.Invoicing.Signers.SignerPowers.PersonDocumentedOperation; 
        signerDetails.SignerStatus = Diadoc.Api.Proto.Invoicing.Signers.SignerStatus.SellerEmployee;

        Diadoc.Api.Proto.Invoicing.Signers.ExtendedSigner signer = new Diadoc.Api.Proto.Invoicing.Signers.ExtendedSigner();
        signer.SignerCertificate = sertificate.RawData;
        signer.SignerCertificateThumbprint = sertificate.Thumbprint;

        signer.SignerDetails = signerDetails;

        Diadoc.Api.Proto.Invoicing.UniversalTransferDocumentBuyerTitleInfo title = new Diadoc.Api.Proto.Invoicing.UniversalTransferDocumentBuyerTitleInfo();
        title.OperationCode = "Вид";
        title.AddSigner(signer);
        title.OperationContent = "Без претензий";
        title.DocumentCreator = GetOrganizationName(sertificate.Subject);

        Diadoc.Api.Proto.Events.GeneratedFile generatedFile = api.GenerateRecipientTitleXml(token, boxid, documentDiadoc.MessageId, documentDiadoc.EntityId, Diadoc.Api.XmlSerializerExtensions.SerializeToXml(title));

На последней строке выдает ошибку: {"BaseUrl=https://diadoc-api.kontur.ru, PathAndQuery=/GenerateRecipientTitleXml?boxId=bd2a4bace1fa4518bd82f40e3654d57f%40diadoc.ru&senderTitleMessageId=d9035ad0-0d28-466b-a8bf-a9910a8552dd&senderTitleAttachmentId=3bfe0736-249b-486d-ba8d-0ea90e280609&documentVersion, AdditionalMessage=Invalid data UserContractData:\r\nLine: 2, Position: 2, /UniversalTransferDocumentBuyerTitleInfo[1]: The 'UniversalTransferDocumentBuyerTitleInfo' element is not declared., StatusCode=BadRequest, DiadocErrorCode: Http.BadRequest"}

alexxxwam commented 4 years ago

попробуйте указать первым тег UniversalTransferDocumentBuyerTitle и передавать версию 820_05_01_01 при генерации

demions commented 4 years ago

Diadoc.Api.Proto.Invoicing.UniversalTransferDocumentBuyerTitleInfo - класс protobuf для упд 155 и укд 189, т.е. сериализовать в xml его нельзя. Его используют в методе GenerateUniversalTransferDocumentXmlForBuyer (только для упд 155 и укд).

ЕМНИП для упд 155 в сдк нет xml классов титула покупателя, мы просто используем метод выше. Можно самому сгенерить класс утилитой. Для упд 820 есть другой класс, сериализуемый в xml, который можно использовать с кодом выше: Diadoc.Api.DataXml.Utd820.UniversalTransferDocumentBuyerTitle. Его заполнять примерно теми же данными, только в свои классы из этого неймспейса.