Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Диадок создание формализованного сообщения 
:(
    Опции темы
des1roer
  Дата 28.9.2016, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 31.7.2014

Репутация: нет
Всего: нет



использую

http://api-docs.diadoc.ru/ru/latest/...d_invoice.html

кроме как этой доки инфы не найдешь. думал вдруг кто делал интеграцию своими силами. Есть рабочие примеры?

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

полный код что есть


Код

using Diadoc.Api;
using Diadoc.Api.Cryptography;
using Diadoc.Api.Proto.Events;
using Diadoc.Api.Proto.Invoicing;
using NLog;
using System;
using System.IO;
using System.Security.Cryptography.X509Certificates;
 
namespace diadoc_cnsl
{
    class Program
    {
        private static Logger logger = LogManager.GetCurrentClassLogger(); //log
        // URL веб-сервиса Диадок
        private const string DefaultApiUrl = "https://diadoc-api.kontur.ru";
 
        // идентификатор клиента
        private const string DefaultClientId = "11111111111111";
 
        // Для использования Диадок требуются:
        // 1. Крипто-API, предоставляемое операционной системой (доступно через класс WinApiCrypt)
        // 2. Экземпляр класса DiadocApi, проксирующий работу с веб-сервисом Диадок
        private static WinApiCrypt Crypt = new WinApiCrypt();
        public static readonly DiadocApi Api = new DiadocApi(
                DefaultClientId,
                DefaultApiUrl,
                Crypt);
 
        // Логин для авторизации на сервере Диадок
 
        private const string DefaultLogin = "11111111111111";
 
        // Пароль для авторизации на сервере Диадок
        private const string DefaultPassword = "111111111111";
 
        // Имя файла, содержимое которого будет отправлено через Диадок
        const string FileToSendName = "C:\\out_list.csv";
        private static byte[] ReadFileContent(string fName)
        {
            using (var file = new FileStream(fName, FileMode.Open))
            {
                var buffer = new MemoryStream();
                var data = new byte[4000];
                int count;
                while ((count = file.Read(data, 0, data.Length)) > 0)
                {
                    buffer.Write(data, 0, count);
                }
                return buffer.ToArray();
            }
        }
 
        // Файл с данными сертификата, который следует использовать для подписи
        private const string FileWithCertName = "D:\\c#_proj\\diadoc\\cert\\cer.cer";
 
        public static void PostLargeNonformalized(string DefaultFromBoxId, string DefaultToBoxId)
        {
            // Для использования Диадок требуются:
            // 1. крипто-API, предоставляемое операционной системой (доступно через класс WinApiCrypt)
            // 2. экземпляр класса DiadocApi, проксирующий работу с веб-сервисом Диадок
            var crypt = new WinApiCrypt();
            var api = new DiadocApi(
                DefaultClientId,                            // идентификатор клиента
                DefaultApiUrl,                              // URL веб-сервиса Диадок
                crypt);
 
            // Можно использовать либо аутентификацию по логину/паролю, либо по сертификату
            var authToken = api.Authenticate(DefaultLogin, DefaultPassword);
 
            // Для отправки комплекта документов через Диадок требуется подготовить структуру MessageToPost,
            // которая и будет содержать отправляемый комплект документов
            var message = new MessageToPost
            {
                // GUID ящика отправителя
                FromBoxId = DefaultFromBoxId,
                // GUID ящика получателя
                ToBoxId = DefaultToBoxId
            };
 
            // Читаем содержимое отправляемого файла
            var content = ReadFileContent(FileToSendName);
 
            // Загружаем отправляемый файл на "полку" (на сервер временного хранения файлов Диадок)
            var uploadedFileShelfName = api.UploadFileToShelf(authToken, content);
 
            // Для того, чтобы подписать файл, требуется сертификат
            var certContent = ReadFileContent(FileWithCertName);
            var cert = new X509Certificate2(certContent);
 
            // Подписываем содержимое файла
            var signature = crypt.Sign(content, cert.RawData);
 
            // Формируем структуру для представления неформализованного (с точки зрения Диадока) документа
            var attachment = new NonformalizedAttachment
            {
                Comment = "Комментарий к отправляемому документу",  // Комментарий к отправляемому документу
                FileName = new FileInfo(FileToSendName).Name,       // Протокол обмена с Диадок требует наличия имени файла (без пути!)
                NeedRecipientSignature = false,                     // Требуется ли подпись получателя
                DocumentDate = DateTime.Now.ToShortDateString(),    // Дата составления документа
                DocumentNumber = "123",                             // Номер документа
                CustomDocumentId = "",                                  // Строковый идентификатор документа (если требуется связать документы в пакете)
                SignedContent = new SignedContent
                {
                    NameOnShelf = uploadedFileShelfName,            // Имя файла, ранее загруженного на "полку"
                    Signature = signature                           // Подпись к отправляемому содержимому
                }
            };
 
            // Документ подготовлен к отправке. Добавляем его в отправляемое сообщение
            message.AddAttachment(attachment);
 
            // Отправляем подготовленный комплект документов через Диадок
            var response = api.PostMessage(authToken, message);
 
            // При необходимости можно обработать ответ сервера (например, можно получить 
            // и сохранить для последующей обработки идентификатор сообщения)
            Console.Out.WriteLine("Message was successfully sent.");
            Console.Out.WriteLine("The message ID is: " + response.MessageId);
        }
 
 
        private static GeneratedFile GenerateinvoiceXml(string authToken)
        {
            var certContent = ReadFileContent(FileWithCertName);
 
            var signer = new Signer
            {
                SignerCertificate = certContent
            };
 
            var content = new InvoiceInfo()
            {
                // заполняем согласно структуре InvoiceInfo
                InvoiceDate = DateTime.Now.ToString(),                    // дата СФ
                InvoiceNumber = "aaa",                  // номер СФ
                Signer = signer,
                Total = "1000"
            };
            return Api.GenerateInvoiceXml(authToken, content);
        }
 
        // отправка счета-фактуры
        private static void SendInvoiceXml(string authToken, string box, string tobox)
        {
            var fileToSend = GenerateinvoiceXml(authToken);
 
            var messageAttachment = new XmlDocumentAttachment
            {
                SignedContent = new SignedContent //файл подписи
                {
                    Content = fileToSend.Content,
                    Signature = new byte[0] //подпись отправителя
                }
            };
 
            var messageToPost = new MessageToPost
            {
                FromBoxId = box,
                ToBoxId = tobox,
                Invoices = { messageAttachment }
            };
 
            Api.PostMessage(authToken, messageToPost); //см. "Как авторизоваться в системе"
        }
 
        //получение подтверждения оператора, формирование и отправка извещения о получении подтверждения
        /*
        private void GetInvoiceConfirmationAndSendInvoiceReceipt(string authToken)
        {
            var invoiceDocument = "fkfkjfjkj";
            var boxId = "идентификатор ящика отправителя";
            var signer = new Signer
            {
                SignerCertificate = new byte[0] ,
                SignerCertificateThumbprint = "отпечаток сертификата",
                SignerDetails =
                {
                        FirstName = "Имя",
                        Surname = "Фамилия",
                        Patronymic = "Отчество",
                        Inn = "ИНН",
                        JobTitle = "Должность",
                        SoleProprietorRegistrationCertificate = "Св-во о регистрации ИП"
                }
            };
 
            //получение подтверждения оператора
            var invoiceConfirmation = Api.GetMessage(authToken, boxId, invoiceDocument.MessageId, invoiceDocument.EntityId);
 
            //формирование извещения о получении подтверждения
            var invoiceReceipt = Api.GenerateInvoiceDocumentReceiptXml(authToken, invoiceDocument.MessageId, invoiceConfirmation.AttachmentId, signer);
 
            //отправка извещения
            var messagePatchToPost = new MessagePatchToPost
            {
                BoxId = boxId,
                MessageId = invoiceDocument.MessageId,
                ReceiptAttachment =
                {
                        new ReceiptAttachment
                        {
                                ParentEntityId = invoiceDocument.EntityId,
                                SignedContent = new SignedContent //файл подписи
                                {
                                        Content = invoiceDocument.Content,
                                        Signature = new byte[0] //подпись продавца
                                }
                        }
                }
            };
 
            Api.PostMessagePatch(authToken, messagePatchToPost);
        }*/
 
        static void Main(string[] args)
        {
            try //попытка подключения
            {
                // Можно использовать либо аутентификацию по логину/паролю, либо по сертификату
                var authTokenLogin = Api.Authenticate(DefaultLogin, DefaultPassword); // по паре логин/пароль
 
                //получаем свою организацию
                var all = Api.GetOrganizationsByInnKpp("111111111", "1111111111");
 
                // Console.WriteLine(all);
                // Console.WriteLine(all.Organizations[0].OrgId);
                string box = all.Organizations[0].Boxes[0].BoxId;
                //uuid организации
                string myOrgId = all.Organizations[0].OrgId;
                //все контрагенты
                var cntrs = Api.GetCounteragents(authTokenLogin, myOrgId, null, null);
                string cntr_id = cntrs.Counteragents[0].IndexKey; //уникальный ключ для метода GetCounteragents(1,2,3,cntr_id)
                string orgId = cntrs.Counteragents[0].Organization.OrgId; //ид чужой организации
                var cntr = Api.GetCounteragent(authTokenLogin, myOrgId, orgId); //весь контрагент
                string tobox = cntr.Organization.Boxes[0].BoxId;
 
                SendInvoiceXml(authTokenLogin, box, tobox);
                //PostLargeNonformalized(box, tobox);
                Console.WriteLine(tobox);
                Console.Read();
            }
            catch (Exception e)
            {
                logger.Debug("Except{0}", e, null);
                Console.Read();
            }
        }
    }
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1098 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.