Проверка физических и юридических лиц при помощи интеграции с сервисом проверки Femida

26 0

Одной из проблем для компаний является проверка клиентов и контрагентов на благонадежность. Можно реализовать этот процесс вручную, а можно автоматизировать процесс, ускорив его и минимизировав человеческий фактор. 

Сервис Femida предоставляет свой API для решения этой задачи. В отчете компания получает полный анализ по финансовой и правовой благонадежности проверяемого, а так же негативные факторы по специализациям. 

Цели и задачи

Цель: Разработать механизм получения данных через API Femida.
Виды ответов сервиса:

  • Строчный - ответ приходит в виде строки данных формата json.
  • PDF - в ответ на запрос API возвращает документ в формате PDF.

Задачи:

  1. Создать функцию post-запроса.
  2. Получить ответ от сервиса интеграции.
  3. Расшифровать данные полученные в двух видах (строчный, PDF).

Этапы реализации

1. Доступ к API

Для доступа к API Femida, перед началом работы, необходимо запросить токен, отправив в сервис связку логин/пароль. В ответе приходит токен и его "время жизни". В дальнейшем, полученный токен должен передаваться в Header каждого запроса по ключу Authorization:

 var httpRequest = WebRequest.Create(url) as HttpWebRequest;  
 httpRequest.Method = "POST";  
 httpRequest.Headers["Authorization"] = token;  
 httpRequest.ContentType = "application/json";  
          
 using (var streamWriter = new StreamWriter(httpRequest.GetRequestStream()))  
 {  
	 streamWriter.Write(json);  
 }

В Postman, передача токена, выглядит следующим образом:

2. Получение ответа и создание версии документа или десериализация json

Если в ответ на запрос приходят json-данные, то следующим шагом десериализуем их до объекта и заполняем необходимые свойства:

var rosinfoJson = Counterparty.PublicFunctions.Module.PostRequest("isTerrorist", token, args);
if (Regex.IsMatch(rosinfoJson, pattern, RegexOptions.IgnoreCase))  
{  
	var rosinfoInfo = Counterparty.PublicFunctions.Module.DesirializeJsonForRosInfo(rosinfoJson);  
	if (rosinfoInfo.is_terrorist == 1)  
		app.RosInfo = RosInfo.Yes;  
	else if (rosinfoInfo.is_terrorist == 0)  
		app.RosInfo = RosInfo.No;  
	else  
		app.RosInfo = null;  
}

Если же в ответ на запрос приходит PDF, закодированный в поток байт, то необходимо записать его в версию документа:

using (var httpResponse = (HttpWebResponse)httpRequest.GetResponse())  
	using (var responseStream = httpResponse.GetResponseStream())  
{
	if (!information.HasVersions || 
	information.LastVersion.Modified < Calendar.Now.AddDays(-1))  
	{  
		information.CreateVersionFrom(responseStream, "pdf");  
		information.Save();  
		Logger.Debug("[+] Added version from post request");  
	}  
}

Проблемы и их решение

В ходе разработки возникали некоторые трудности, которые были решены следующими способами: 

  1. Если данные, переданные в сервис проверки были заполнены неверно, источник не ответил или данная проверка не приобретена; Femida возвращает ответ, в котором кодирует ошибку. Всего таких ответов может быть четыре: 
  • Источник не ответил (-1), 
  • Проверка не куплена (-2), 
  • Недостаточно входных данных (-3),
  • Не найден (-4). 
var highrisksJson = Counterparty.PublicFunctions.Module.PostRequest("isInBlackList", token, args); if (Regex.IsMatch(highrisksJson, pattern, RegexOptions.IgnoreCase))  
{  
	var highrisksInfo = Counterparty.PublicFunctions.Module.DesirializeJsonForHighRisks(highrisksJson);  
	if (highrisksInfo.is_in_blacklist == 1)  
		app.HighRisks = HighRisks.Yes;  
	else if (highrisksInfo.is_in_blacklist == 0)  
		app.HighRisks = HighRisks.No;  
	else if (highrisksInfo.is_in_blacklist == -3)  
		app.HighRisks = HighRisks.NoData;  
	else  
		app.HighRisks = HighRisks.NoAnswer;  
}
  1. Если запрос пришел некорректным, закончилось действие связки логин/пароль или сервис не может предоставить ответ - он возвращает код ошибки. Проблема решается включением проверки на правильность структуры ответа.
var login = settings.Logincentrvd;  
var password = settings.Passwordcentrvd;  
var tokenJson = FemidaAccessTokenRequest(login, password);  
int number;  
if (tokenJson == "403")  
	return "[!] Ошибка (403): Истек срок действия логин/пароль.";  
if (tokenJson == "500")  
	return "[!] Ошибка (500): Внутренняя ошибка сервера Femida.API";  
if (int.TryParse(tokenJson, out number))  
	return string.Format("[!] Ошибка ({0})", tokenJson);  
var tokenInfo = DesirializeJsonForAPIFemidaToken(tokenJson);  
return tokenInfo.token;
string pattern = @"^{.*}$";
var scoringJson = Counterparty.PublicFunctions.Module.PostRequest("getLegalScoring", token, scoringArgs);
if (Regex.IsMatch(scoringJson, pattern, RegexOptions.IgnoreCase))  
{
	// проверка Scoring
}
  1. Ответ на запрос PDF-отчета имеет смысл вынести в асинхронный обработчик для ускорения процесса работы с точки зрения пользовательского интерфейса. 

Итог

В этой статье было рассмотрено, как при помощи внедрения автоматизированных процессов можно добиться сокращения затраты ресурсов на исполнение поставленных задач. 

Пока комментариев нет.

Авторизуйтесь, чтобы написать комментарий