Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

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

...

  • @id_ComplexReserve - номер авторизуемой командировки, предназначен для выгрузки при помощи метода SOAP API GetReservationDetails

  • @id_Authorization - идентификатор уровня авторизации, нужно передавать обратно при вызове метода согласования

  • @hash - подпись запроса для проверки целостности, следует передавать обратно при вызове метода согласования

...

Далее мы видим в списке авторизующих лиц такую запись:

...

После того, как подпись согласующего лица на первом уровне была получена, осуществляется обращение ко внешней системе через API в рамках настроенного выше процесса:

...

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

...

В указанном примере мы видим параметры, которые Кортеос передал во внешнюю систему, далее их следует использовать в веб-сервисе согласования.

Пример полученных в callback данных:

Code Block
languagejson
{ 
  "id_Complex": 766711, 
  "hash": "74829afd1d451bb43b3c5d299bd5411c", 
  "id_Auth": 417303 
}
Info

После получения данного уведомления можно выгрузить детали командировки при помощи метода API: Универсальный метод выгрузки заказа или командировки

Веб-сервис для согласования

Для согласования используется веб-сервис: /PortableViews/ModComplexAuthViews/API/ComplexAuthAPI.asmx

WSDL: https://jv3.corteos.ru/PortableViews/ModComplexAuthViews/API/ComplexAuthAPI.asmx?WSDL

В сервис необходимо передать следующие поля:

...

  • id_Authorization - int, первичный ключ согласования, получаем из коллбэка на авторизацию(см. выше)

  • IsSucceed - bool, статус согласования, true - согласовать, false - отклонить

  • Comment - string, текстовое пояснение к операции, будет выведено в деталях командировки в таблице согласований

  • Hash - string, подпись запроса, также получаем из коллбэка(см.выше)

В ответе на этот запрос мы получаем XML такого вида:

Code Block
languagexml
<ComplexAuthAPIResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="https://corteos.ru/" id_ComplexReserve="766711" State="Finished" AuthorizationSucceed="true">
  <ComplexReserveName>Тест авторизации</ComplexReserveName>
</ComplexAuthAPIResponse>

В случае ошибки согласования мы получим SOAP Exception:

Code Block
JavelinBL2.Exceptions.UserFriendlyException: В настоящий момент по данной командировке авторизация не проводится, поэтому Вы не можете её авторизовать.

Внешний вид таблицы согласований для согласованной через API командировки:

...

Использование веб-сервиса из мода Авторизация командировок через API

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

"Авторизация командировок через API"(ModExternalAuth)

в методе мода Авторизации командировок через API есть такие параметры, которые надо заменить следующим образом:

  • int id_ComplexReserve - тут передаем не id_ComplexReserve, а id_Auth из коллбэка

  • bool authorize - true или false - согласовать или отклонить

  • string hash - должен быть в специальном формате, “COMPLEXAUTH-{оригинальных хэш}”, в этом случае пойдет обращение к методу сложной авторизации

Реализация данного сценария к коде ModExternalAuth

Code Block
languagec#
Match m = Regex.Match(hash, "COMPLEXAUTH-(.+)", RegexOptions.IgnoreCase);
if (m.Success)
{
     var svc = new ComplexAuthWS.ComplexAuthAPI();
     svc.Url = CurrentWebSite.CurrentEnvironment.CurrentWebSiteUrl + "/PortableViews/ModComplexAuthViews/API/ComplexAuthAPI.asmx";
     svc.Authorize(id_Authorization: id_ComplexReserve, IsSucceed: authorize, Comment: authorize ? "согласовано" : "не согласовано", Hash: m.Groups[1].Value);
     return "ok";
}

Веб-сервис для получения списка командировок, по которым была запрошена авторизация в заданный период 08.02.2022

Для получения списка необходимо использовать веб-сервис: YourDomain/PortableViews/ModComplexAuthViews/API/ComplexAuthAPI.asmx

WSDL: YourDomain/PortableViews/ModComplexAuthViews/API/ComplexAuthAPI.asmx?WSDL

Метод: YourDomain/PortableViews/ModComplexAuthViews/API/ComplexAuthAPI.asmx?op=GetComplexReservesByStartAuth

Параметры:

  • string Token – токен клиента

  • DateTime dateFrom – дата “с“ периода

  • DateTime dateTo – дата “по“ периода

Вопросы:

Expand
titleПОЧЕМУ ПУСТОЙ ОТВЕТ ПРИ ЗАПРОСЕ С АГЕНТСКИМ ТОКЕНОМ?

Это клиентское api, поэтому для работы необходимо использовать клиентский токен

Expand
titleКАК ПОД АГЕНТОМ ПОЛУЧИТЬ СПИСОК КОМАНИДРОВОК?
  1. Получить токен для агента

  2. Получить клиентский контекст под агентом

  3. Отправить запрос

Пример запроса:

Expand
titleПример запроса
Code Block
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:cor="https://corteos.ru/">
   <soapenv:Header>
      <cor:AuthHeader>
         <cor:Token>190e4bf1-****-****-971a-7e7e2dbeb415</cor:Token>
      </cor:AuthHeader>
   </soapenv:Header>
   <soapenv:Body>
      <cor:GetComplexReservesByStartAuth>
         <cor:dateFrom>2021-11-26T10:00:00</cor:dateFrom>
         <cor:dateTo>2021-11-26T15:00:00</cor:dateTo>
      </cor:GetComplexReservesByStartAuth>
   </soapenv:Body>
</soapenv:Envelope>
Image AddedImage Added

Пример ответа:

Expand
titleПример ответа
Code Block
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Body>
      <GetComplexReservesByStartAuthResponse xmlns="https://corteos.ru/">
         <GetComplexReservesByStartAuthResult>
            <ComplexAuth id_ComplexReserve="774417" id_Authorization="419901" Hash="61b5b5e65a8bf191f6ac83eee6c54e97"/>
            <ComplexAuth id_ComplexReserve="774417" id_Authorization="419902" Hash="e4446c6dfd71775907d927c60b2c004e"/>
         </GetComplexReservesByStartAuthResult>
      </GetComplexReservesByStartAuthResponse>
   </soap:Body>
</soap:Envelope>
Image Added

Пример ошибки:

Expand
titleПример ошибки авторизации
Code Block
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Body>
      <soap:Fault>
         <faultcode>soap:Server</faultcode>
         <faultstring>System.Web.Services.Protocols.SoapException: Серверу не удалось обработать запрос. ---> System.Exception: Авторизация по токену
Ошибка при получении контроллера бизнес-логики:
Токен 190e4bf1-****-****-971a-7e7e2dbeb415 не найден в системе, необходимо пройти авторизацию повторно.

   в JavelinView3.Base.WebServices.BaseV3WebService.GetBLController(Guid token, Boolean createNewInstance) в C:\Projects\jv3\JavelinView3.Base\WebServices\_Common\Code\BaseWebService.cs:строка 291
   в JavelinView3.Base.WebServices.BaseV3WebService.GetBLController(Guid token, Boolean createNewInstance) в C:\Projects\jv3\JavelinView3.Base\WebServices\_Common\Code\BaseWebService.cs:строка 348
   в JavelinView3.Base.WebServices.BaseV3WebService.TryAuthFromHeaders(Boolean createNewControllerInstance) в C:\Projects\jv3\JavelinView3.Base\WebServices\_Common\Code\BaseWebService.cs:строка 199
   в ModComplexAuth.PortableViews.ModComplexAuthViews.API.ComplexAuthAPI.GetComplexReservesByStartAuth(DateTime dateFrom, DateTime dateTo) в C:\Projects\jv3\ModComplexAuth\PortableViews\ModComplexAuthViews\API\ComplexAuthAPI.asmx.cs:строка 81
   --- Конец трассировки внутреннего стека исключений ---</faultstring>
         <detail/>
      </soap:Fault>
   </soap:Body>
</soap:Envelope>
Image Added