Описание сервиса

Система IntellectMoney предоставляет сервис API Кошельков (https://api.intellectmoney.ru/walletapi/WalletApiService.asmx), который позволяет осуществлять следующие операции над кошельками/пользователями:

  1. Добавлять сервис поставщика (далее “Агент“) в систему IntellectMoney (на стадии разработки)

  2. Осуществлять привязку пользователя к системе IntellectMoney

  3. Производить идентификацию добавленного пользователя

  4. Осуществлять отвязку пользователя от системе IntellectMoney

  5. Запрашивать баланс пользователя

  6. Совершать перевод между пользователями


В качестве API выставляется веб сервис, работающий по SOAP протоколу. Все методы сервиса работают в асинхронном режиме. Это означает следующее:


Все методы API, кроме методов возвращающих состояние выполнения операции, имеют в качестве параметра цифровую подпись. Это гарантирует что сообщение не было изменено злоумышленниками при транспортировке и однозначно идентифицирует сервис.  Более подробно алгоритм шифрования ЦП будет рассмотрен на более поздних этапах работы по API. Методы возвращающие результат не имеют цифровой подписи, в целях уменьшения нагрузки на API.

Структура возвращаемого сервисом результата

Здесь приводится пример структуры результата, который возвращают методы сервиса (API).


Заголовок ответа:

HTTP/1.1 200 OK

Content-Type: text/xml; charset=utf-8

Content-Length: length

Тело ответа:

<?xml version="1.0" encoding="utf-8"?>

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">

 <soap:Body>

   <UserRegistrationResponse xmlns="http://tempuri.org/">

     <UserRegistrationResult>

       <Status>

         <OperationStatus>ToProcess or InProccess or Success or Error</OperationStatus>

         <Error>string</Error>

       </Status>

       <OperationId>int</OperationId>

       <Data>T</Data>

     </UserRegistrationResult>

   </UserRegistrationResponse>

 </soap:Body>

</soap:Envelope>

Тег Status содержит два параметра. Статус операции (OperationStatus) и сообщение с расшифровкой ошибки.


Операция может находится в следующих статусах

Тег OperationId - Это идентификатор операции. Его предоставляет сервис. Он должен быть уникальным в рамках сервиса. Так как API асинхронный, то этот идентификатор, поможет избежать ошибочного дублирования операций. По данному идентификатору так же можно получить состояние операции, результат операции.

Тег Data содержит результат операции. Может быть разных типов, в зависимости от метода. Именно этот параметр интересует, если Status = Success.

Регистрация Агента в системе IntellectMoney

Чтобы начать пользоваться доступными методами API необходимо пройти регистрацию в системе IntelletMoney. Для регистрации Агента в системе IntellectMoney потребуются PGP ключи, которые можно сгенерировать с помощью утилиты, доступной по адресу https://intellectmoney.ru/common/walletapi/PgpKeysGeneratorPackage.exe

Утилита представляет собой окно с 2-мя полями ввода

В поле идентификатор указывается идентификатор агента (участвует в формировании имени файла)

В поле пароль указывается секретное слово, которое участвует при генерации ключей

Ни идентификатор, ни пароль хранить нигде не требуется.

После генерации ключей Агент производит регистрацию сервиса с помощью метода API (на стадии разработки), или передает регистрационные данные и публичный ключ в на почту ts@intellectmoney.ru

Список параметров, необходимых для регистрации Агента:

После чего сервис получает свой уникальный идентификатор - serviceId

Регистрация пользователя в системе IntellectMoney

Для регистрации нового пользователя в системе IntellectMoney Агент перенаправляет пользователя на страницу регистрации https://intellectmoney.ru/ru/registration/personal/ со следующими параметрами:

Все параметры, передаваемые на страницу регистрации пользователя могут быть пустыми, кроме параметра serviceId.

Пример url адреса с параметрами, на который необходимо отправить пользователя для прохождения регистрации: https://intellectmoney.ru/ru/registration/personal/?serviceId=29393&email=test@service.ru&firstName=Ivanov&serviceUserKey=2939393

Описание методов API

Идентификация пользователя

Метод UserIdentification

Список параметров:

Результат: в теге Data возвращается тип UserIdentificationState. В данном случае он говорит о том, выполнена операция или нет, а не прошла ли она идентификацию. Об успешности идентификации следует узнавать по полю Status

Тело ответа:

<?xml version="1.0" encoding="utf-8"?>

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">

 <soap:Body>

   <UserRegistrationResponse xmlns="http://tempuri.org/">

     <UserRegistrationResult>

       <Status>

         <OperationStatus>ToProcess or InProccess or Success or Error</OperationStatus>

         <Error>string</Error>

       </Status>

       <OperationId>int</OperationId>

       <Data>UserIdentificationState</Data>

     </UserRegistrationResult>

   </UserRegistrationResponse>

 </soap:Body>

</soap:Envelope>


Метод проверки результата идентификации пользователя

Метод UserIdentificationState

Список параметров:

Результат: в теге Data возвращается тип UserIdentificationState.

Тело ответа:

<?xml version="1.0" encoding="utf-8"?>

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">

 <soap:Body>

   <UserRegistrationResponse xmlns="http://tempuri.org/">

     <UserRegistrationResult>

       <Status>

         <OperationStatus>ToProcess or InProccess or Success or Error</OperationStatus>

         <Error>string</Error>

       </Status>

       <OperationId>int</OperationId>

       <Data>UserIdentificationState</Data>

     </UserRegistrationResult>

   </UserRegistrationResponse>

 </soap:Body>

</soap:Envelope>

Метод осуществляющий привязку пользователя

Метод UserBind

Список параметров:

Результат: в теге Data возвращается булевский тип. В данном случае он говорит о том, выполнена операция или еще нет. Об успешности привязки следует узнавать по полю Status.

Тело ответа:

<?xml version="1.0" encoding="utf-8"?>

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">

 <soap:Body>

   <UserRegistrationResponse xmlns="http://tempuri.org/">

     <UserRegistrationResult>

       <Status>

         <OperationStatus>ToProcess or InProccess or Success or Error</OperationStatus>

         <Error>string</Error>

       </Status>

       <OperationId>int</OperationId>

       <Data>bool</Data>

     </UserRegistrationResult>

   </UserRegistrationResponse>

 </soap:Body>

</soap:Envelope>

Метод проверки результата привязки пользователя

Метод UserBindState

Список параметров:

Результат: в теге Data возвращается булевский тип. В данном случае он говорит о том, выполнена операция или еще нет. Об успешности привязки следует узнавать по полю Status.

Тело ответа:

<?xml version="1.0" encoding="utf-8"?>

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">

 <soap:Body>

   <UserRegistrationResponse xmlns="http://tempuri.org/">

     <UserRegistrationResult>

       <Status>

         <OperationStatus>ToProcess or InProccess or Success or Error</OperationStatus>

         <Error>string</Error>

       </Status>

       <OperationId>int</OperationId>

       <Data>bool</Data>

     </UserRegistrationResult>

   </UserRegistrationResponse>

 </soap:Body>

</soap:Envelope>

Метод осуществляющий отвязку

Метод UserUnbind

Список параметров:

Результат: в теге Data возвращается булевский тип. В данном случае он говорит о том, выполнена операция или еще нет. Об успешности привязки следует узнавать по полю Status.

Тело ответа:

<?xml version="1.0" encoding="utf-8"?>

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">

 <soap:Body>

   <UserRegistrationResponse xmlns="http://tempuri.org/">

     <UserRegistrationResult>

       <Status>

         <OperationStatus>ToProcess or InProccess or Success or Error</OperationStatus>

         <Error>string</Error>

       </Status>

       <OperationId>int</OperationId>

       <Data>bool</Data>

     </UserRegistrationResult>

   </UserRegistrationResponse>

 </soap:Body>

</soap:Envelope>

Метод проверки результата отвязки пользователя

Метод UserUnbindState

Список параметров:

Результат: в теге Data возвращается булевский тип. В данном случае он говорит о том, выполнена операция или еще нет. Об успешности привязки следует узнавать по полю Status.

Тело ответа:

<?xml version="1.0" encoding="utf-8"?>

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">

 <soap:Body>

   <UserRegistrationResponse xmlns="http://tempuri.org/">

     <UserRegistrationResult>

       <Status>

         <OperationStatus>ToProcess or InProccess or Success or Error</OperationStatus>

         <Error>string</Error>

       </Status>

       <OperationId>int</OperationId>

       <Data>bool</Data>

     </UserRegistrationResult>

   </UserRegistrationResponse>

 </soap:Body>

</soap:Envelope>

Запрос баланса пользователя

Метод UserGetBalance

Список параметров:

Результат: тег Data в случае State == Success содержит сумму остатка по счету на текущий момент и валюту счета.

Тело ответа:

<?xml version="1.0" encoding="utf-8"?>

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">

 <soap:Body>

   <UserRegistrationResponse xmlns="http://tempuri.org/">

     <UserRegistrationResult>

       <Status>

         <OperationStatus>ToProcess or InProccess or Success or Error</OperationStatus>

         <Error>string</Error>

       </Status>

       <OperationId>int</OperationId>

       <Data>

<Money>

  <Amount>decimal</Amount>

  <Currency>RUB or TST</Currency>

</Money>

     </Data>

     </UserRegistrationResult>

   </UserRegistrationResponse>

 </soap:Body>

</soap:Envelope>

Метод проверки результата запроса соcтояния счета

Метод UserGetBalanceState

Список параметров:

Результат: тег Data в случае State == Success содержит сумму остатка по счету на текущий момент и валюту счета.

Тело ответа:

<?xml version="1.0" encoding="utf-8"?>

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">

 <soap:Body>

   <UserRegistrationResponse xmlns="http://tempuri.org/">

     <UserRegistrationResult>

       <Status>

         <OperationStatus>ToProcess or InProccess or Success or Error</OperationStatus>

         <Error>string</Error>

       </Status>

       <OperationId>int</OperationId>

       <Data>

<Money>

  <Amount>decimal</Amount>

  <Currency>RUB or TST</Currency>

</Money>

     </Data>

     </UserRegistrationResult>

   </UserRegistrationResponse>

 </soap:Body>

</soap:Envelope>

Операция совершения перевода

Метод UserPay

Список параметров:

Результат: в теге Data возвращается булевский тип. В данном случае он говорит о том, выполнена операция или еще нет. Об успешности привязки следует узнавать по полю Status.

Тело ответа:

<?xml version="1.0" encoding="utf-8"?>

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">

 <soap:Body>

   <UserRegistrationResponse xmlns="http://tempuri.org/">

     <UserRegistrationResult>

       <Status>

         <OperationStatus>ToProcess or InProccess or Success or Error</OperationStatus>

         <Error>string</Error>

       </Status>

       <OperationId>int</OperationId>

       <Data>bool</Data>

     </UserRegistrationResult>

   </UserRegistrationResponse>

 </soap:Body>

</soap:Envelope>

Метод проверки результата операции перевода

Метод UserPayState

Список параметров:

Результат: в теге Data возвращается булевский тип. В данном случае он говорит о том, выполнена операция или еще нет. Об успешности привязки следует узнавать по полю Status.

Тело ответа:

<?xml version="1.0" encoding="utf-8"?>

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">

 <soap:Body>

   <UserRegistrationResponse xmlns="http://tempuri.org/">

     <UserRegistrationResult>

       <Status>

         <OperationStatus>ToProcess or InProccess or Success or Error</OperationStatus>

         <Error>string</Error>

       </Status>

       <OperationId>int</OperationId>

       <Data>bool</Data>

     </UserRegistrationResult>

   </UserRegistrationResponse>

 </soap:Body>

</soap:Envelope>

Формирование подписи запроса

Подпись формируется по алгоритму:

  1. Получаем MD5 хеш строки “serviceId={0}::serviceOperationId={1}”

  2. Переводим MD5 хеш в верхний регистр.

  3. Полученный хеш подписываем приватным ключем

  4. Полученную подпись передаем в параметре sign

Описание типов

UserIdentificationState

{

       None, //необработан

       Process, //в процессе

       Success //идентифицирован

}

Пример на php


Чтобы использовать php для запросов к API для начала нужно установить gnupg библиотеку. Затем сформировать ключи БЕЗ ПАРОЛЯ. Приватный и публичный ключ генерируются без парольной защиты. Можно использовать утилиту Kleopatra - Gpg4Win.

<?php

$operationId = <номер операции>;

$serviceId = <номер сервиса>;

$user['bindKey'] = <ключ привязки пользователя>;


$md5 = strtoupper(md5("serviceId=$serviceId::serviceOperationId= $operationId")); 


$ascii = file_get_contents(__DIR__ . '/private.asc');

$start = strpos($ascii, '-----BEGIN PGP PRIVATE KEY BLOCK-----');

$end = strpos($ascii, '-----END PGP PRIVATE KEY BLOCK----')+34;


$key = substr($ascii, $start, ($end-$start)); 


$res = gnupg_init();

$info = gnupg_import($res,$key);

gnupg_addsignkey($res,$info['fingerprint']);

$signed = gnupg_sign($res, $md5);


if($err = gnupg_geterror($res)){

var_dump($err);

}


$data = array(

'operationId' => $operationId,

'serviceId' => $serviceId,

'bindKey' => $user['bindKey'],

'sign' => $signed

);


$balans = sendApiRequest('UserGetBalance', $data);


function sendApiRequest($method_name, array $data) {

       $ch = curl_init();

       curl_setopt($ch, CURLOPT_URL, 'https://api.intellectmoney.ru/walletapi/WalletApiService.asmx/' . $method_name);

       curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));

       curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

       curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

       curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

       $r = curl_exec($ch);

       curl_close($ch);

       return $r;

   }