Форум

diadoc api

Цитировать

Недавно появилась задача написать приложение для diadoc используя diadoc api. Что задача как задача. И так приступаем. Для авторизации в системе необходимо (авторизацию будем проводить через  токен usb) и еще  код разработчика. На сайте написано для получения ключа разработчика отправьте заявку и т. д. Хорошо отправил и тишина................. Через 3 дня перезванивают и говорят что совсем недавно у нас доступ в api стал ПЛАТНЫМ ! Ого  первая сложность.   Кое как вопрос о оплатой решили. Ну вроде все накидал кое что тестирую...  Вопрос плёвый работа с подразделениями ( получить id подразделения) . Тех поддержка отвечает плати деньги. Ну в общем без них обошелся. Но с таким Сервисом по (еврейски ) я столкнулся впервые.  А теперь рассмотрим авторизацию поближе  не через логи и пароль а через токен ключ.  В качестве примера я использовал тестовое консольное приложение

Цитировать

параметры регистрации   я реализовал через  внешний xml файл настроек

// URL веб-сервиса Диадок

private const string DefaultApiUrl = "https://diadoc-api.kontur.ru";

 

// идентификатор клиента

private const string DefaultClientId = "-78н8978-34345-вапук-ук-45ty4g54g54gt4";//преславутый ключ разработчика (изменен по понятным соображениям)

private static string myId = loadXmlbasic("config.xml", "//configure/idcorporation"); //id компаниии

private static string keysert = loadXmlbasic("config.xml", "//configure/keysert");//отпечаток сертификата

public static ConsoleContext model = new ConsoleContext();

public static WinApiCrypt Crypt = new WinApiCrypt();

public static DiadocApi Api = new DiadocApi(DefaultClientId, DefaultApiUrl, Crypt);

public static string Boxid =  Api.GetBox("b55453444-cfewrtt7-4df1c-b3ew8-234r34f342f").BoxId;//ящик получателя

public static string mybox = Api.GetBox(myId).BoxId;// мой ящик

Цитировать

метод формирования накладной путем загрузки в парсер diodoc api  версия документов v.5.01 не поддерживается

 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();

}

}

 

//формируем xml через парс invoce

private static GeneratedFile GenerateinvoiceXml(string authToken, byte[] name)

{

//  var invoce = Api.ParseInvoiceXml(name);//под 5.01 не подходит

var invoce = Api.ParseUniversalTransferDocumentSellerTitleXml(name);

InvoiceItem itm = new InvoiceItem();

AdditionalInfo infdoc;

 

var signer = new Signer

{

SignerCertificate = model.CurrentCert.RawData

};

 

var seller = new OrganizationInfo()

{

Address = invoce.Seller.Address,

Name = invoce.Seller.OrgName,

BankAccountNumber = invoce.Seller.BankAccountNumber,

BankId = invoce.Seller.BankId,

BankName = invoce.Seller.BankName,

Department = invoce.Seller.Department,

Inn = invoce.Seller.Inn,

Kpp = invoce.Seller.Kpp,

Okdp = invoce.Seller.Okdp,

Okopf = invoce.Seller.Okopf,

Okpo = invoce.Seller.Okpo

 

 

 

};

var burer = new OrganizationInfo()

{

Address = invoce.Buyer.Address,

Name = invoce.Buyer.OrgName,

BankAccountNumber = invoce.Buyer.BankAccountNumber,

BankId = invoce.Buyer.BankId,

BankName = invoce.Buyer.BankName,

Department = invoce.Buyer.Department,

Inn = invoce.Buyer.Inn,

Kpp = invoce.Buyer.Kpp,

Okdp = invoce.Buyer.Okdp,

Okopf = invoce.Buyer.Okopf,

Okpo = invoce.Buyer.Okpo

};

var content = new InvoiceInfo()

{

// заполняем согласно структуре InvoiceInfo

//компания получатель

Buyer = new DiadocOrganizationInfo()

{

 

BoxId = Boxid,

OrgInfo = burer

 

},

//компания отправитель

Seller = new DiadocOrganizationInfo()

{

 

BoxId = myId,

OrgInfo = seller

 

 

},

Shipper = new ShipperOrConsignee() {   OrgInfo = burer ,  SameAsSellerOrBuyer = true },

Consignee = new ShipperOrConsignee() { OrgInfo = burer},

Currency = invoce.Currency,

InvoiceDate = invoce.DocumentDate ,                    // дата СФ

InvoiceNumber = invoce.DocumentNumber,                  // номер СФ

Signer = signer,

Total = invoce.InvoiceTable.Total,                          // сумма всего

Vat = invoce.InvoiceTable.Vat,

Version = InvoiceFormatVersion.v5_02 //указываем версию

 

 

 

 

 

};

//информация о товаре

for (int r = 0; r < invoce.InvoiceTable.Items.Count; r++)

{

 

itm.Product = invoce.InvoiceTable.Items[r].Product;

 

itm.Subtotal =  invoce.InvoiceTable.Items[r].Subtotal;

itm.Price = invoce.InvoiceTable.Items[r].Price;

itm.Quantity = invoce.InvoiceTable.Items[r].Quantity;

itm.Vat = invoce.InvoiceTable.Items[r].Vat;

itm.SubtotalWithVatExcluded = invoce.InvoiceTable.Items[r].SubtotalWithVatExcluded;

for (int w = 0; w < invoce.AdditionalInfoId.AdditionalInfo.Count;)

{

infdoc = new AdditionalInfo()

{

Id = invoce.AdditionalInfoId.AdditionalInfo[w++].Id,

Value = invoce.AdditionalInfoId.AdditionalInfo[w++].Value

 

};

itm.AdditionalInfos.Add(infdoc);//метод заполнения для 5.02

 

}

 

 

content.Items.Add(itm);

 

}

 

//   Console.WriteLine("кло-во Items "+content.Items.Count);

return Api.GenerateInvoiceXml(authToken, content);

//  return Api.GenerateUniversalTransferDocumentXmlForSeller(u)

}

 

Цитировать

а вот тут сама авторизация

 

 

//тут авторизируемся через токен  по условию

 

Console.WriteLine("{0}", DateTime.Now);

model.CurrentCert = FindCertificate(keysert); //передаем  в модель работаем по отпечатку сертификата

if (model.CurrentCert != null)  // далее по условию

{

var authToken = model.CurrentToken = Api.Authenticate(model.CurrentCert.RawData);

model.ClearAuthenticationContext();

System.Console.WriteLine("Аутентификация пройдена. Сертификат: " + CertificateToString(model.CurrentCert));

 

}

else

{

System.Console.WriteLine("Аутентификация не пройдена: не найден сертификат");

}

 

Загруженные файлы: