Git Product home page Git Product logo

mdlpclient's Introduction

Честный знак. ИС «Маркировка». МДЛП

MDLP REST API Client v3.05 .NET Framework 4.62 Code Coverage Unit tests Code quality NuGet

MDLP API client logo

Протокол обмена интерфейсного уровня: PDF
Список реализованных методов: TXT

Инструкция по быстрому старту

  1. Прочитайте эту инструкцию, чтобы настроить окружение для работы с API: PDF
  2. Регистрация тестовой электронной подписи УКЭП в деталях описана тут.

Как использовать REST API-клиент

  1. Установить провайдер КриптоПро: http://cryptopro.ru/products/cryptopro-csp
  2. Запросить в техподдержке «Честного знака» доступ к тестовому стенду API: http://api.stage.mdlp.crpt.ru
  3. Добавить в hosts строчку с IP-адресом тестового стенда:
185.196.171.27 api.stage.mdlp.crpt.ru
  1. Добавить в проект Nuget-пакет: https://www.nuget.org/packages/MdlpApiClient
  2. Завести себе тестовый УКЭП по этой инструкции.
  3. Проверить вызовы API по документу «Быстрый старт».

Авторизация тестовым участником

Клиент для API называется MdlpClient (МДЛП — Мониторинг Движения Лекарственных Препаратов). По умолчанию клиент работает с адресом тестовой системы.

Почти все методы работы с API требуют авторизации. Для авторизации используются классы credentials. Для авторизации пользователя-нерезидента (логин и пароль) используется NonResidentCredentials. Для резидента (авторизация с помощью сертификата ГОСТ) — соответственно, ResidentCredentials.

При запуске конструктора клиент просто сохраняет указанные credentials, но не устанавливает соединение. Установка соединения и авторизация происходит при вызове любого метода API:

// клиент пока никуда не коннектится
var client = new MdlpClient(credentials: new NonResidentCredentials
{
    ClientID = "01db16f2-9a4e-4d9f-b5e8-c68f12566fd5",
    ClientSecret = "9199fe04-42c3-4e81-83b5-120eb5f129f2",
    UserID = "starter_resident_1",
    Password = "password"
});

// тут будет установлено соединение и выполнен запрошенный метод API:
var doc = client.GetDocumentMetadata("60786bb4-fcb5-4587-b703-d0147e3f9d1c");
Console.WriteLine($"Код документа: {doc.DocumentID}");
Console.WriteLine($"Код запроса: {doc.RequestID}");

Чтобы трассировать все http-запросы и ответы, можно установить свойство Tracer:

client.Tracer = Console.WriteLine;
При выполнении вышеприведенного кода трассировка выглядит так:
// Authenticate
-> POST http://api.stage.mdlp.crpt.ru/api/v1/auth
headers: {
  X-ApiMethodName = Authenticate
  Accept = application/json, text/json, text/x-json, text/javascript, application/xml, text/xml
  Content-type = application/json
}
body: {
  "client_id": "01db16f2-9a4e-4d9f-b5e8-c68f12566fd5",
  "client_secret": "9199fe04-42c3-4e81-83b5-120eb5f129f2",
  "user_id": "starter_resident_1",
  "auth_type": "PASSWORD"
}

<- OK 200 (OK) http://api.stage.mdlp.crpt.ru/api/v1/auth
timings: {
  started: 2020-04-22 20:22:12
  elapsed: 00:00:00.1971392
}
headers: {
  Connection = keep-alive
  X-XSS-Protection = 1; mode=block
  Pragma = no-cache
  X-Frame-Options = DENY
  X-Content-Type-Options = nosniff
  X-Application-Context = authentication-service-frontend:8095
  Strict-Transport-Security = max-age=15768000
  Content-Length = 47
  Cache-Control = no-cache, no-store, max-age=0, must-revalidate
  Content-Type = application/json;charset=UTF-8
  Date = Wed, 22 Apr 2020 17:22:12 GMT
  Expires = 0
  Server = nginx/1.14.0
}
body: {
  "code": "7c08d5f3-4a0c-4a71-b123-638533b4612c"
}

// GetToken
-> POST http://api.stage.mdlp.crpt.ru/api/v1/token
headers: {
  X-ApiMethodName = GetToken
  Accept = application/json, text/json, text/x-json, text/javascript, application/xml, text/xml
  Content-type = application/json
}
body: {
  "code": "7c08d5f3-4a0c-4a71-b123-638533b4612c",
  "password": "password"
}

<- OK 200 (OK) http://api.stage.mdlp.crpt.ru/api/v1/token
timings: {
  started: 2020-04-22 20:22:12
  elapsed: 00:00:00.2673376
}
headers: {
  Connection = keep-alive
  X-XSS-Protection = 1; mode=block
  Pragma = no-cache
  X-Frame-Options = DENY
  X-Content-Type-Options = nosniff
  X-Application-Context = authentication-service-frontend:8095
  Strict-Transport-Security = max-age=15768000
  Content-Length = 63
  Cache-Control = no-cache, no-store, max-age=0, must-revalidate
  Content-Type = application/json;charset=UTF-8
  Date = Wed, 22 Apr 2020 17:22:13 GMT
  Expires = 0
  Server = nginx/1.14.0
}
body: {
  "token": "9189625f-2bea-4cf9-a36d-2c827b08d276",
  "life_time": 30
}

// GetDocumentMetadata
-> GET http://api.stage.mdlp.crpt.ru/api/v1/documents/60786bb4-fcb5-4587-b703-d0147e3f9d1c
headers: {
  X-ApiMethodName = GetDocumentMetadata
  Authorization = token 9189625f-2bea-4cf9-a36d-2c827b08d276
  Accept = application/json, text/json, text/x-json, text/javascript, application/xml, text/xml
}

<- OK 200 (OK) http://api.stage.mdlp.crpt.ru/api/v1/documents/60786bb4-fcb5-4587-b703-d0147e3f9d1c
timings: {
  started: 2020-04-22 20:22:12
  elapsed: 00:00:00.5673959
}
headers: {
  Transfer-Encoding = chunked
  Connection = keep-alive
  X-Application-Context = mdlp-api-document-front
  X-Content-Type-Options = nosniff
  X-XSS-Protection = 1; mode=block
  Pragma = no-cache
  X-Frame-Options = DENY
  Strict-Transport-Security = max-age=15768000
  Cache-Control = no-cache, no-store, max-age=0, must-revalidate
  Content-Type = application/json;charset=UTF-8
  Date = Wed, 22 Apr 2020 17:22:13 GMT
  Expires = 0
  Server = nginx/1.14.0
}
body: {
  "request_id": "528700e0-f967-4ddb-995d-5c6c7b73bcc9",
  "document_id": "60786bb4-fcb5-4587-b703-d0147e3f9d1c",
  "date": "2020-04-07 07:55:33",
  "processed_date": "2020-04-07 07:55:33",
  "sender": "00000000100928",
  "receiver": "00000000100930",
  "sys_id": "9dedee17-e43a-47f1-910e-3a88ff6bc81b",
  "doc_type": 607,
  "doc_status": "PROCESSED_DOCUMENT",
  "file_uploadtype": 2,
  "sender_sys_id": "6f6fa779-b637-4234-9117-8ac4c1a9a81c",
  "version": "1.34"
}

mdlpclient's People

Contributors

yallie avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

mdlpclient's Issues

Tracing should display duration

Looks like RestSharp now converts all request parameters to strings.
So the Stopwatch parameter is lost.
Let's use Environment.TickCount to measure the duration.

702 Posting

Добрый вечер.

Планируется ли реализации 702.xsd схемы? Ее добавили не меняя версии пакета 1.35

GetDocument error 404. Ticket #SR00497874

Запрашиваю входящие документы.
Беру первый попавшийся документ из списка.
Запрашиваю текст документа, получаю ответ 404 not found:

// Authenticate
-> POST http://api.stage.mdlp.crpt.ru/api/v1/auth
headers: {
  X-ApiMethodName = Authenticate
  Accept = application/json, text/json, text/x-json, text/javascript, application/xml, text/xml
  Content-type = application/json
}
body: {
  "client_id": "01db16f2-9a4e-4d9f-b5e8-c68f12566fd5",
  "client_secret": "9199fe04-42c3-4e81-83b5-120eb5f129f2",
  "user_id": "starter_resident_1",
  "auth_type": "PASSWORD"
}

<- OK 200 (OK) http://api.stage.mdlp.crpt.ru/api/v1/auth
timings: {
  started: 2020-05-15 16:51:52
  elapsed: 00:00:00.1280896
}
headers: {
  Connection = keep-alive
  X-XSS-Protection = 1; mode=block
  Pragma = no-cache
  X-Frame-Options = DENY
  X-Content-Type-Options = nosniff
  Strict-Transport-Security = max-age=15768000
  Content-Length = 47
  Cache-Control = no-cache, no-store, max-age=0, must-revalidate
  Content-Type = application/json
  Date = Fri, 15 May 2020 13:51:53 GMT
  Expires = 0
  Server = nginx/1.14.0
}
body: {
  "code": "7fc9db18-0cd4-457e-bd8f-41db8fc77f15"
}

// GetToken
-> POST http://api.stage.mdlp.crpt.ru/api/v1/token
headers: {
  X-ApiMethodName = GetToken
  Accept = application/json, text/json, text/x-json, text/javascript, application/xml, text/xml
  Content-type = application/json
}
body: {
  "code": "7fc9db18-0cd4-457e-bd8f-41db8fc77f15",
  "password": "password"
}

<- OK 200 (OK) http://api.stage.mdlp.crpt.ru/api/v1/token
timings: {
  started: 2020-05-15 16:51:53
  elapsed: 00:00:00.2599388
}
headers: {
  Connection = keep-alive
  X-XSS-Protection = 1; mode=block
  Pragma = no-cache
  X-Frame-Options = DENY
  X-Content-Type-Options = nosniff
  Strict-Transport-Security = max-age=15768000
  Content-Length = 63
  Cache-Control = no-cache, no-store, max-age=0, must-revalidate
  Content-Type = application/json
  Date = Fri, 15 May 2020 13:51:53 GMT
  Expires = 0
  Server = nginx/1.14.0
}
body: {
  "token": "10d895c1-4b1b-447c-8208-16f693814fab",
  "life_time": 60
}

// GetIncomeDocuments
-> POST http://api.stage.mdlp.crpt.ru/api/v1/documents/income
headers: {
  X-ApiMethodName = GetIncomeDocuments
  Authorization = token 10d895c1-4b1b-447c-8208-16f693814fab
  Accept = application/json, text/json, text/x-json, text/javascript, application/xml, text/xml
  Content-type = application/json
}
body: {
  "filter": {
    "processed_date_from": "1920-05-15 16:51:52",
    "doc_type": 607,
    "doc_status": "PROCESSED_DOCUMENT"
  },
  "start_from": 0,
  "count": 1
}

<- OK 200 (OK) http://api.stage.mdlp.crpt.ru/api/v1/documents/income
timings: {
  started: 2020-05-15 16:51:52
  elapsed: 00:00:00.5594190
}
headers: {
  Transfer-Encoding = chunked
  Connection = keep-alive
  X-Application-Context = mdlp-api-document-front
  X-Content-Type-Options = nosniff
  X-XSS-Protection = 1; mode=block
  Pragma = no-cache
  X-Frame-Options = DENY
  Strict-Transport-Security = max-age=15768000
  Cache-Control = no-cache, no-store, max-age=0, must-revalidate
  Content-Type = application/json;charset=UTF-8
  Date = Fri, 15 May 2020 13:51:53 GMT
  Expires = 0
  Server = nginx/1.14.0
}
body: {
  "documents": [
    {
      "request_id": "f09e4684-0309-47ed-b1bf-6745e1d6aaa7",
      "document_id": "ad3da204-872b-4169-92b4-438e72b99249",
      "date": "2020-04-29 00:34:19",
      "processed_date": "2020-04-29 00:34:19",
      "sender": "00000000100928",
      "receiver": "00000000100930",
      "sys_id": "9dedee17-e43a-47f1-910e-3a88ff6bc81b",
      "doc_type": 607,
      "doc_status": "PROCESSED_DOCUMENT",
      "file_uploadtype": 2,
      "sender_sys_id": "6f6fa779-b637-4234-9117-8ac4c1a9a81c",
      "version": "1.34"
    }
  ],
  "total": 671
}

// GetDocumentText
-> GET http://api.stage.mdlp.crpt.ru/api/v1/documents/download/ad3da204-872b-4169-92b4-438e72b99249
headers: {
  X-ApiMethodName = GetDocumentText
  Authorization = token 10d895c1-4b1b-447c-8208-16f693814fab
  Accept = application/json, text/json, text/x-json, text/javascript, application/xml, text/xml
}

<- ERROR 404 (NotFound) http://api.stage.mdlp.crpt.ru/api/v1/documents/download/ad3da204-872b-4169-92b4-438e72b99249
timings: {
  started: 2020-05-15 16:51:53
  elapsed: 00:00:00.0556727
}
headers: {
  Connection = keep-alive
  X-Application-Context = mdlp-api-document-front
  X-Content-Type-Options = nosniff
  X-XSS-Protection = 1; mode=block
  Pragma = no-cache
  X-Frame-Options = DENY
  Strict-Transport-Security = max-age=15768000
  Content-Length = 118
  Cache-Control = no-cache, no-store, max-age=0, must-revalidate
  Content-Type = application/json;charset=UTF-8
  Date = Fri, 15 May 2020 13:51:53 GMT
  Expires = 0
  Server = nginx/1.14.0
}
body: {
  "error_description": "Ошибка при выполнении операции: запись не найдена"
}

Update XSD to v1.35

Появились новые схемы документов: 220/221, 254, 300 и др.
Паспорта процессов: PDF v1.35.
Описание XSD-схем: PDF v1.35.
Архив с XSD-схемами: 7ZIP v1.35

Extend x509cert search methods

Добрый день, спасибо за отличную библиотеку. Не очень понял только с поиском сертификатов для подписи. Ищется user_id в subject и thumbprint сертификата. В рабочей системе никак не изменить ни одно из трех значений, как и не задать сертификат для подключения явно.

Вижу пути решения:

  1. свойство MdlpApiClient.MdlpClient.UserCertificate сделать public
  2. добавить параметр x509Certificate в методы Authenticate() класса ResidentCredentials

Unit test report is not uploaded

When tests fail, the report is not generated or not uploaded.
It should be generated and uploaded regardless of the outcome.
For the failed tests, the report is even more important.

DateTime serialization format

There are DateTime and Date properties, but .NET doesn't have a separate Date type.
Different methods require different date/time serialization formats.
Perhaps even different DTO properties of the same API method.

Conflict: GetBranches/GetWarehouses and GetOutcomeDocuments/GetIncomeDocuments.
DateHandler.UnixTime works for GetBranches, but doesn't work for GetIncomeDocuments.
DateHandler.ISO8601DateTime works for GetIncomeDocuments, but not GetBranches.

Connection issue

Добрый день. Где-то неделю назад перестал подключаться:

MdlpApiClient.MdlpException
HResult=0x80131500
Message=The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.
Source=MdlpApiClient
StackTrace:
at MdlpApiClient.MdlpClient.ThrowOnFailure(IRestResponse response)
at MdlpApiClient.MdlpClient.Execute[T](IRestRequest request, String apiMethodName)
at MdlpApiClient.MdlpClient.Post[T](String url, Object body, Parameter[] parameters, String apiMethodName)
at MdlpApiClient.MdlpClient.Authenticate(String clientId, String clientSecret, String userId, String authType)
at MdlpApiClient.ResidentCredentials.Authenticate(MdlpClient apiClient)
at MdlpApiClient.CredentialsAuthenticator.Authenticate(IRestClient client, IRestRequest request)
at RestSharp.RestClient.Execute(IRestRequest request, String httpMethod, Func`3 getResponse)
at RestSharp.RestClient.Execute(IRestRequest request)
at RestSharp.RestClient.Execute[T](IRestRequest request)
at MdlpApiClient.MdlpClient.Execute[T](IRestRequest request, String apiMethodName)
at MdlpApiClient.MdlpClient.Post[T](String url, Object body, Parameter[] parameters, String apiMethodName)
at MdlpApiClient.MdlpClient.Authenticate(String clientId, String clientSecret, String userId, String authType)
at MdlpApiClient.ResidentCredentials.Authenticate(MdlpClient apiClient)
at MdlpConnect.Program.Main(String[] args) in \MdlpConnect\MdlpConnect\Program.cs:line 25

Inner Exception 1:
WebException: The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.

Inner Exception 2:
AuthenticationException: The remote certificate is invalid according to the validation procedure.

Сертификат в порядке. Подключение к вэб-версии через него работает. Буду признателен за любые идеи

ошибка подключения.

Доброго дня! Пробую использовать Вашу библиотеку.

        GostCryptoHelpers.DefaultStoreLocation = StoreLocation.CurrentUser;

        MdlpClient client = new MdlpClient(credentials: new ResidentCredentials
        {
            ClientID = "39b7f3ed-719b-4deb-9f96-6a12bf1611c2",
            ClientSecret = "576f7780-b1ad-468c-94b0-4af45a152d16",
            UserID = "d5e50bffbb934104d269ea8d8540959cf8050659",

        }, baseUrl: "http://api.sb.mdlp.crpt.ru/api/v1/");

        client.Tracer = Console.WriteLine;

при этом выскакивает ошибка:

найден_сертификат

хотя, с этими же параметрами в Posmen-е удаётся получить код авторизации, а затем и токен, правда отработать запрос с токеном не получается :-(
Get_code

не подскажете, в чём может быть проблема?

416 схема Order_Details is read only

Добрый вечер, спасибо за вашу работу!

Необходимо отправить 416 документ, делаю так:

            Documents doc = new Documents
            //416
            {
                Version = "1.35",
                Receive_Order = new Receive_Order
                {
                    Subject_Id = "00000000151840",
                    Shipper_Id = "00000000000290",
                    Operation_Date = DateTime.Now,
                    Doc_Num = "6893219-30",
                    Doc_Date = "18.08.2020",
                    Receive_Type = Receive_Type_Enum.Item1,
                    Source = Source_Type.Item1,
                    Contract_Type = Contract_Type_Enum.Item1, 
                    
                    Order_Details = new System.Collections.ObjectModel.Collection<Receive_OrderOrder_DetailsUnion>
                    {
                        new Receive_OrderOrder_DetailsUnion
                        {
                            Sgtin = "046071552100304097238557409",
                            Cost = 1628.58m,
                            Vat_Value = 148.05m
                        },
                    }
                }
            };

Order_Details установить не могу, так как свойство только для чтения.
То же самое и в 701 Accept -> Order_Details -> Sgtin только для чтения:

                Accept = new Accept
                {
                    Operation_Date = DateTime.Now,
                    Action_Id = 701,
                    Order_Details = new AcceptOrder_Details
                    {
                        Sgtin = new Collection<string>(sgtins)
                    }
                }

252 - Refusal_Receiver.Order_Details так же.
Где-то еще встречал свойства только для чтения, которые должны заполняться. Редактировал MdlpApiClient.Xsd.cs, убирал private set. Я что-то не понимаю?

Могли бы Вы выложить исходники 1.4.1? Как можно сгенерировать MdlpApiClient.Xsd.cs на основе xsd схем? Спасибо.

Set default XSD schema version

При загрузке XML-документов версия схемы обязательна.
Но значения по умолчанию у нее нет.
Если создать документ и сериализовать его в XML, там будет пусто.
Пускай сериализатор автоматом добавляет номер версии из константы.

Adjustable delays between method executions

Проблема: задержки между вызовами методов иногда меняются.
Нужно иметь возможность их настраивать в прикладном коде, не меняя версию библиотеки.

SendDocument doesn't work, ticket SR00524559

Похоже, опять проблема на тестовом стенде.
При отсылке документа задержка в 1 минуту, потом ошибка 404 Not Found.
Техподдержка отвечает:

Попробуйте использовать GTIN 04607028394287, который числится
как ЛП участника starter_resident1 в документации, в пункте 9.1.3.

Попробовал, не помогло.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.