|
ROBOKASSA. Описание интерфейсов
Оглавление
Общее описание
Интерфейсы сервиса ROBOKASSA предоставляют возможность получения Клиентом сервиса
(магазином) средств от Покупателя в предпочитаемой им электронной валюте в заданном
им количестве (объеме).
Покупатель выбирает в он-лайн магазине Клиента товар, магазин подсчитывает сумму
Заказа в предпочитаемой Продавцом валюте и посылает запрос к серверу, на котором расположен
сервис ROBOKASSA. Система возвращает серверу Клиента
html код формы выбора валюты оплаты или кнопки оплаты, который используется на странице
его сайта.
Покупатель выбирает на сайте Клиента или на странице Сервиса ROBOKASSA валюту
платежа и приступает к платежу, нажав на кнопку оплаты. Сразу после оплаты Заказа
Покупателем в выбранной им валюте производится конвертация полученных средств в
валюту, предпочитаемую Продавцом и исходящий платеж в этой валюте на его счет в
соответствующей платежной системе, указанный при регистрации.
После завершения операции в зависимости от ее исхода Покупатель перенаправляется
на страницу исполненного платежа (в случае если он осуществил оплату), либо на страницу
неисполненного (если он отказался от оплаты).
Сервис ROBOKASSA построен таким образом, что, в отличие от случая "подключения"
непосредственно к серверу платежной системы, отпадает необходимость в усиленной
защите данных в процессе обмена. Для интеграции кассы в сайт магазина
или сайт предоставляющий платный доступ к контенту, нет необходимости
в установлении исходящих SSL соединений, подключении дополнительных компонент на
сервере Клиента и т.п. В этом заключено главное преимущество применения системы
ROBOKASSA.
Номер счета Клиента (магазина) на который будет поступать оплата товаров и/или услуг
Продавца защищен от изменения, он задается только один раз - в момент регистрации
Продавца в Сервисе. Это позволяет избежать одновременно и краж выручки посторонними
лицами и любых злоупотреблений с денежными средствами со стороны обслуживающего
персонала магазина.
Нежелательна возможность самостоятельной инициализации процедуры оплаты (путем ввода
url с параметрами), иначе говоря, прежде чем пользователь станет оплачивать товар
магазин должен сформировать у себя запись о начале процедуры оплаты (Заказ), определить
требуемую сумму и отправить пользователя на оплату именно этого Заказа, с конкретной
суммой. Реализовано это путем формирования MD5-контрольной суммы (подписи) параметров
счета, и добавления подписи в URL системы, куда перенаправляется Покупатель для
оплаты заказа. Подпись формируется по параметрам счета и паролю#1 магазина (устанавливается
в интерфейсе администрирования).
Продавец может узнать у системы ROBOKASSA состояние операции оплаты,
а также действующие в системе курсы обмена. Для этого используются XML интерфейсы,
описанные в соответствующем разделе данного документа.
После оплаты обменный пункт отправляет сообщение магазину путем вызова ResultURL
и передачей ему методом GET/POST/email параметров совершенного платежа, а также
подписи, сформированной по параметрам оплаченного Заказа и паролю №2 магазина.
Запросы к XML-интерфейсам, информирующим о состоянии обменной операции, производятся
с указанием контрольной суммы, сформированной по параметрам запроса + пароль#2 магазина.
Примечание: Если не оговорено конкретно, понятия входящий/исходящий подразумеваются
относительно системы ROBOKASSA.
Состав сервиса ROBOKASSA
Регистрационные данные Продавца
Online регистрация
Продавец (владелец магазина или сервиса) должен указать логин (далее sMerchantLogin), пароль для входа в Личный кабинет,
e-mail адрес для связи и восстановления пароля и внести в форму он-лайн регистрации следующие данные:
- язык общения с администратором магазина;
- наименование магазина;
- e-mail адрес администратора магазина для связи;
- e-mail адрес технической поддержки магазина;
- пароль 1 (далее sMerchantPass1, используется интерфейсом инициализации оплаты);
- пароль 2 (далее sMerchantPass2, используется интерфейсом оповещения о платеже, XML-интерфейсах);
- Result URL (используется интерфейсом оповещения о платеже);
- POST/GET/email метод отсылки данных в Result URL;
- Success URL (используется в случае успешного проведения платежа);
- POST/GET метод отсылки данных в Success URL;
- Fail URL (используется в случае отказа проведения платежа);
- POST/GET метод отсылки данных в Fail URL;
- валюту, которую желает получать;
- аккаунт в выбранной валюте, на который будут перечисляться средства.
Изменение регистрационной информации
После активации мерчанта изменение любых данных будет невозможно.
Интерфейс оплаты
Код встраиваемой кассы со списком возможных валют оплаты
При использовании JScript-кода в HTML-тексте в качестве источника HTML-кода
выводится окошко кассы с выбором сумм в различных валютах. Пример JScript-кода:
Для этого запрос приведенного формата отправляется методом GET на URL: https://merchant.roboxchange.com/Handler/MrchSumPreview.ashx,
а результатом является изображенная на иллюстрации форма.
Параметры запроса (метод POST либо GET):
MrchLogin=sMerchantLogin&
OutSum=nOutSum&
InvId=nInvId&
Desc=sInvDesc&
SignatureValue=sSignatureValue
IncCurrLabel=sIncCurrLabel&
Culture=sCulture&
Encoding=sEncoding
[&shpa=yyy&shpb=xxx...-пользовательские_параметры_начинающиеся_с_SHP_в_сумме_до_2048_знаков]
- sMerchantLogin
-
- login магазина в обменном пункте(обязательный параметр)
- nOutSum
-
- требуемая к получению сумма(обязательный параметр).
Формат представления числа - разделитель точка.
Сумма должна быть указана в той валюте, которая была указана при регистрации магазина,
как валюта текущего баланса Продавца или как электронная валюта, в которой будет получать средства Продавец.
Например, если стоимость товаров у вас на сайте указана в долларах, а валюта Продавца рубли,
то при выставлении счёта к оплате вам необходимо указывать уже пересчитанную сумму из долларов в рубли.
- nInvId
-
- номер счета в магазине (должен быть уникальным для магазина). Может принимать значения от 1 до 2147483647 (2^31-1).
Если содержит пустое значение, вовсе не указан, либо равен "0", то при создании операции ей будет автоматически
присвоен уникальный номер счета. Рекомендуется использовать данную возможность только
в очень простых магазинах, где не требуется какого-либо контроля.
- sInvDesc
-
- описание покупки, можно использовать только символы английского или русского алфавита,
цифры и знаки препинания. Максимальная длина 100 символов.
- sSignatureValue
-
- контрольная сумма MD5(обязательный параметр) - строка представляющая собой 32-разрядное число в 16-ричной
форме и любом регистре (всего 32 символа 0-9, A-F). Формируется по строке, содержащей
следующие параметры, разделенные ':', с добавлением sMerchantPass1 - (устанавливается через интерфейс администрирования):
sMerchantLogin:nOutSum:nInvId:sMerchantPass1[:пользовательские параметры, в отсортированном алфавитном порядке]
При инициализации оплаты, вы можете передать дополнительные параметры, которые необходимы для работы вашего магазина.
Переданные дополнительные параметры будут возвращены скриптам магазина по Result Url, Success Url и Fail Url.
Наименование дополнительных параметров должно ОБЯЗАТЕЛЬНО начинаться с "SHP" в любом регистре.
Например: Shp_item, SHP_1, ShpEmail, shp_oplata, ShpClientId и т.д.
При инициализации оплаты, каждый из передаваемых дополнительных параметров, ОБЯЗАТЕЛЬНО должен быть включён в подсчёт контрольной сумы (MD5).
Например, если переданы пользовательские параметры shpb=xxx и shpa=yyy, то подпись формируется из строки:
sMerchantLogin:nOutSum:nInvId:sMerchantPass1:shpa=yyy:shpb=xxx
При проверке контрольной сумы (MD5) в скриптах магазина по Result Url, Success Url и Fail Url также необходимо учитывать
полученные дополнительные параметры при подсчёте контрольной сумы (MD5). См. соответствующие разделы документации.
- sIncCurrLabel
-
- предлагаемая валюта платежа. Пользователь может изменить ее в процессе оплаты.
Доступные значения для параметра IncCurrLabel - метки валют, вы можете взять в своем Личном кабинете на странице регистрации,
из таблицы "Список доступных способов оплаты и валют" в левой колонке "Метка валюты"
Другой способ получения этой информации описан в разделе: XML интерфейсы. Интерфейс получения списка валют.
Однако он доступен только активным мерчантам (продавцам).
- sCulture
-
- опционально, язык общения с клиентом. Значения: en, ru. Если не установлен - берется
язык региональных установок браузера.
- sEncoding
-
- кодировка, в которой возвращается HTML-код кассы. По умолчанию: windows-1251.
Инициализация оплаты
Магазин отправляет пользователя по данному адресу для произведения им оплаты. Предварительно
магазин должен у себя запомнить счет (номер, сумма, дата формирования).
URL: https://merchant.roboxchange.com/Index.aspx
Параметры запроса (метод POST либо GET):
MrchLogin=sMerchantLogin&
OutSum=nOutSum&
InvId=nInvId&
Desc=sInvDesc&
SignatureValue=sSignatureValue
IncCurrLabel=sIncCurrLabel&
Email=sEmail&
Culture=sCulture
[&shpa=yyy&shpb=xxx...-пользовательские_параметры_начинающиеся_с_SHP_в_сумме_до_2048_знаков]
- sMerchantLogin
-
- login магазина в обменном пункте(обязательный параметр)
- nOutSum
-
- требуемая к получению сумма.
Если параметр не указан (пустая строка), то пользователю предоставляется возможность ввести сумму самостоятельно.
Формат представления числа - разделитель точка.
Сумма должна быть указана в той валюте, которая была указана при регистрации магазина,
как валюта текущего баланса Продавца или как электронная валюта, в которой будет получать средства Продавец.
Например, если стоимость товаров у вас на сайте указана в долларах, а валюта Продавца рубли,
то при выставлении счёта к оплате вам необходимо указывать уже пересчитанную сумму из долларов в рубли.
- nInvId
-
- номер счета в магазине (должен быть уникальным для магазина). Может принимать значения от 1 до 2147483647 (2^31-1).
Если содержит пустое значение, вовсе не указан, либо равен "0", то при создании операции ей будет автоматически
присвоен уникальный номер счета. Рекомендуется использовать данную возможность только
в очень простых магазинах, где не требуется какого-либо контроля.
- sInvDesc
-
- описание покупки, можно использовать только символы английского или русского алфавита,
цифры и знаки препинания. Максимальная длина 100 символов.
- sSignatureValue
-
- контрольная сумма MD5(обязательный параметр) - строка представляющая собой 32-разрядное число в 16-ричной
форме и любом регистре (всего 32 символа 0-9, A-F). Формируется по строке, содержащей
следующие параметры, разделенные ':', с добавлением sMerchantPass1 - (устанавливается через интерфейс администрирования):
sMerchantLogin:nOutSum:nInvId:sMerchantPass1[:пользовательские параметры, в отсортированном алфавитном порядке]
При инициализации оплаты, вы можете передать дополнительные параметры, которые необходимы для работы вашего магазина.
Переданные дополнительные параметры будут возвращены скриптам магазина по Result Url, Success Url и Fail Url.
Наименование дополнительных параметров должно ОБЯЗАТЕЛЬНО начинаться с "SHP" в любом регистре.
Например: Shp_item, SHP_1, ShpEmail, shp_oplata, ShpClientId и т.д.
При инициализации оплаты, каждый из передаваемых дополнительных параметров, ОБЯЗАТЕЛЬНО должен быть включён в подсчёт контрольной сумы (MD5).
Например, если переданы пользовательские параметры shpb=xxx и shpa=yyy, то подпись формируется из строки:
sMerchantLogin:nOutSum:nInvId:sMerchantPass1:shpa=yyy:shpb=xxx
При проверке контрольной сумы (MD5) в скриптах магазина по Result Url, Success Url и Fail Url также необходимо учитывать
полученные дополнительные параметры при подсчёте контрольной сумы (MD5). См. соответствующие разделы документации.
- sIncCurrLabel
-
- предлагаемая валюта платежа. Пользователь может изменить ее в процессе оплаты.
Доступные значения для параметра IncCurrLabel - метки валют, вы можете взять из своем Личном кабинете на странице регистрации,
из таблицы "Список доступных способов оплаты и валют" в левой колонке "Метка валюты"
Другой способ получения этой информации описан в разделе: XML интерфейсы. Интерфейс получения списка валют.
Однако он доступен только активным мерчантам (продавцам).
- sEmail
-
- e-mail пользователя. Пользователь может изменить его в процессе оплаты.
- sCulture
-
- опционально, язык общения с клиентом. Значения: en, ru. Если не установлен - берется
язык региональных установок браузера.
Покупатель отправляется на сайт оплату ROBOKASSA, после чего платеж в выбранной
Продавцом валюте перечисляется (поступает) на его счет в выбранной им платежной
системе. Промежуток времени между "началом операции" - "получением оплаты системой
ROBOKASSA" ограничено одним часом, время завершения операции не ограничено.
После оплаты сам Покупатель не заинтересован в затормаживании операции (ожидание
завершения операции вполне можно прекратить через сутки).
Оповещение об оплате (ResultURL)
В случае успешного проведения оплаты робот системы проводит запрос по Result URL,
с указанием следующих параметров (методом, выбранным в настройках):
OutSum=nOutSum&
InvId=nInvId&
SignatureValue=sSignatureValue
[&пользовательские_параметры]
Если в настройках в качестве метода отсылки данных был выбран Email, то в случае успешного проведения оплаты робот системы отправит вам сообщение на email,
указанный в качестве ResultURL, с указанием параметров, указанных выше.
- nOutSum
-
-полученная сумма. Сумма будет передана в той валюте, которая была указана при регистрации магазина.
Формат представления числа - разделитель точка.
- nInvId
-
- номер счета в магазине
- sSignatureValue
-
- контрольная сумма MD5 - строка представляющая собой 32-разрядное число в 16-ричной
форме и любом регистре (всего 32 символа 0-9, A-F). Формируется по строке, содержащей
некоторые параметры, разделенные ':', с добавлением sMerchantPass2 - (устанавливается
через интерфейс администрирования) т.е. nOutSum:nInvId:sMerchantPass2[:пользовательские параметры, в отсортированном порядке]
К примеру если при инициализации операции были переданы пользовательские параметры shpb=xxx
и shpa=yyy то подпись формируется из строки ...:sMerchantPass2:shpa=yyy:shpb=xxx
Скрипт, находящийся по Result URL должен проверить правильность контрольной суммы
и соответствия суммы платежа ожидаемой сумме. При формировании строки подписи учтите
формат представления суммы (в строку при проверке подписи вставляйте именно полученное
значение, без какого-либо форматирования).
Данный запрос производится после получения денег, однако, до того как пользователь
сможет перейти на Success URL. Перед скриптом магазина, расположенным по Success
URL обязательно отрабатывает скрипт запроса к Result URL.
Факт успешности сообщения магазину об исполнении операции определяется по результату,
возвращаемому системе. Результат должен содержать "OKnMerchantInvId", т.е.
для счета #5 должен быть возвращен текст "OK5".
В случае невозможности связаться со скриптом по адресу Result URL (связь прерывается
по time-out-у либо по отсутствию DNS-записи, либо получен не ожидаемый ответ) на
e-mail адрес технической поддержки магазина отправляется письмо и запрос Result URL считается
завершенным успешно. В случае систематического отсутствия связи между серверами магазина
и сервисом лучше использовать метод определения оплаты с применением интерфейсов
XML, а самый желательный и защищенный способ - совмещенный.
Переадресация пользователя при успешной оплате (SuccessURL)
В случае успешного исполнения платежа Покупатель может перейти по данному адресу.
Методом, выбранным при регистрации, будут переданы следующие параметры ("чек" об оплате):
OutSum=nOutSum&
InvId=nInvId&
SignatureValue=sSignatureValue&
Culture=sCulture
[&пользовательские_параметры]
- nOutSum
-
-полученная сумма. Сумма будет передана в той валюте, которая была указана при регистрации магазина.
Формат представления числа - Разделитель точка.
- nInvId
-
- номер счета в магазине
- sSignatureValue
-
- контрольная сумма MD5 - строка представляющая собой 32-разрядное число в 16-ричной
форме и любом регистре (всего 32 символа 0-9, A-F). Формируется по строке, содержащей
некоторые параметры, разделенные ':', с добавлением sMerchantPass1 (указывается
при регистрации) т.е. nOutSum:nInvId:sMerchantPass1[:пользовательские параметры, в отсортированном порядке].
К примеру если при инициализации операции были переданы пользовательские
параметры shpb=xxx и shpa=yyy то подпись формируется из строки ...:sMerchantPass1:shpa=yyy:shpb=xxx
- sCulture
-
- язык общения с клиентом, выбранный при инициализации оплаты. Значения: en, ru.
Переход пользователя по данному адресу с корректными параметрами (соответствия CRC)
означает, что платеж по реквизитам Продавца выполнен успешно. Сервис несет финансовую
ответственность перед Продавцом в соответствии с Соглашением за достоверность такого
подтверждения.
Однако для дополнительной защиты желательно, чтобы факт оплаты платежа проверялся
скриптом исполняемым при переходе на Result URL, или путем запроса XML-интерфейса
о результате данной платежной операции, и только при реальном наличии счета с номером
nMerchantInvId в БД магазина.
Переадресация пользователя при отказе от оплаты (FailURL)
В случае отказа от исполнения платежа Покупатель перенаправляется по данному адресу.
Для того, чтобы Продавец мог разблокировать заказанный товар на складе при отказе
от его оплаты методом, выбранным при регистрации, будут переданы параметры:
OutSum=nOutSum&
InvId=nInvId&
Culture=sCulture
[&пользовательские_параметры]
- nOutSum
-
-полученная сумма. Сумма будет передана в той валюте, которая была указана при регистрации магазина.
Формат представления числа - Разделитель точка.
- nInvId
-
- номер счета в магазине
- sCulture
-
- язык общения с клиентом, выбранный при инициализации оплаты. Значения: en, ru.
Переход пользователя по данному адресу вообще говоря не означает окончательного
отказа Покупателя от оплаты, нажав кнопку "Back" в браузере он может вернуться на
страницы ROBOKASSA. Поэтому в случае блокировки товара на складе под заказ для
его разблокировки желательно проверять факт отказа от платежа запросом запроса XML-интерфейса
о результате данной платежной операции используя в запросе номер счета nMerchantInvId
имеющийся в БД магазина (Продавца).
XML интерфейсы
Общая информация
Внимание! Описание устаревших XML интерфейсов находится здесь.
Запросы к интерфейсам можно отправлять методом HTTP GET или HTTP POST, либо их можно использовать как методы XML web-сервиса:
Ответ на запрос, переданный методом HTTP GET/POST, возвращается в формате XML-документа. Документ имеет следующую структуру:
<...>
integer
string
<...>
Запрошенные данные (возвращаются только в случае успешного выполнения запроса)
Required data
Элемент Result содержит информацию о результате выполнения запроса:
- Code
- - результат выполнения запроса. В случае успешного выполнения - 0, в противном случае код ошибки. Если во время выполнения запроса произошла ошибка, то в ответе не будет содержаться дополнительных элементов с запрашиваемыми данными
- Description
- - текстовое описание результата выполнения запроса
Общие коды ошибок, которые могут возвращаться всеми запросами:
- 2 - информация о магазине с таким MerchantLogin не найдена или магазин не активирован
- 1000 - внутренняя ошибка сервиса
Интерфейс получения списка валют
- Описание:
- Возвращает список валют, доступных для оплаты заказов данного магазина
- Название метода:
- GetCurrencies
- URL для запросов HTTP GET/POST:
- https://merchant.roboxchange.com/WebService/Service.asmx/GetCurrencies
Параметры запроса:
- MerchantLogin
- - логин магазина, строка
- Language
- - язык для локализованных значений в ответе (названий валют, методов оплаты и т.д.). Возможные значения: ru - русский, en - английский
- Пример запроса методом HTTP GET:
- https://merchant.roboxchange.com/WebService/Service.asmx/GetCurrencies?MerchantLogin=demo&Language=ru
Формат ответа для запросов HTTP GET/POST:
integer
string
...
...
Описание возвращаемых данных:
- Groups
- - группы валют, могут использоваться для более удобного отображения валют в пользовательском интерфейсе
-
- Параметры группы:
- Code
- - код группы
- Description
- - текстовое описание группы
- Items
- - валюты, входящие в группу
-
- Параметры валюты:
- Label
- - код валюты
- Name
- - наименование валюты
Коды ошибок, специфичные для этого интерфейса:
Интерфейс получения списка доступных способов оплаты
- Описание:
- Возвращает список способов оплаты, доступных покупателям данного магазина
- Название метода:
- GetPaymentMethods
- URL для запросов HTTP GET/POST:
- https://merchant.roboxchange.com/WebService/Service.asmx/GetPaymentMethods
Параметры запроса:
- MerchantLogin
- - логин магазина, строка
- Language
- - язык для локализованных значений в ответе (названий валют, методов оплаты и т.д.). Возможные значения: ru - русский, en - английский
- Пример запроса методом HTTP GET:
- https://merchant.roboxchange.com/WebService/Service.asmx/GetPaymentMethods?MerchantLogin=demo&Language=ru
Формат ответа для запросов HTTP GET/POST:
Описание возвращаемых данных:
- Methods
- - доступные способы оплаты
-
- Параметры способа оплаты:
- Code
- - код способа оплаты
- Description
- - текстовое описание способа оплаты
Коды ошибок, специфичные для этого интерфейса:
Интерфейс получения курсов валют и расчета суммы для оплаты
- Описание:
- Позволяет рассчитать сумму, которую должен будет заплатить клиент
- Название метода:
- GetRates
- URL для запросов HTTP GET/POST:
- https://merchant.roboxchange.com/WebService/Service.asmx/GetRates
Параметры запроса:
- MerchantLogin
- - логин магазина, строка
- IncCurrLabel
- - код валюты, для которой нужно произвести расчет суммы к оплате. Если оставить этот параметр пустым, расчет будет произведен для всех доступных валют
- OutSum
- - сумма, которую хочет получить магазин. Исходя из этой суммы и текущих курсов валют для каждой валюты с в списке будет расчитана сумма, которую должен будет заплатить клиент
- Language
- - язык для локализованных значений в ответе (названий валют, методов оплаты и т.д.). Возможные значения: ru - русский, en - английский
- Пример запроса методом HTTP GET:
- https://merchant.roboxchange.com/WebService/Service.asmx/GetRates?MerchantLogin=demo&IncCurrLabel=&OutSum=10.45&Language=ru
Формат ответа для запросов HTTP GET/POST:
integer
string
...
...
Описание возвращаемых данных:
- Groups
- - группы валют, могут использоваться для более удобного отображения валют в пользовательском интерфейсе
-
- Параметры группы:
- Code
- - код группы
- Description
- - текстовое описание группы
- Items
- - валюты, входящие в группу
-
- Параметры валюты:
- Label
- - код валюты
- Name
- - наименование валюты
- Rate
-
- IncSum
- - сумма, которую должен будет заплатить пользователь
Коды ошибок, специфичные для этого интерфейса:
Интерфейс получения состояния оплаты счета
- Описание:
- Возвращает детальную информацию о текущем состоянии и реквизитах оплаты.
Необходимо помнить, что операция инициируется не в момент ухода пользователя на
оплату, а позже - после подтверждения его платежных реквизитов, т.е. вы вполне можете
не находить операцию, которая по вашему мнению уже должна начаться.
- Название метода:
- OpState
- URL для запросов HTTP GET/POST:
- https://merchant.roboxchange.com/WebService/Service.asmx/OpState
Параметры запроса:
- MerchantLogin
- - логин магазина, строка
- InvoiceID
- - номер счета магазина, целое число
- Signature
- контрольная сумма MD5 - строка, представляющая собой 16-разрядное число в hex-формате и любом регистре (всего 32 символа 0-9, A-F). Формируется по строке, содержащей все обязательные параметры, разделенные «:», с добавлением MerchantPass2 (указывается при регистрации) т.е. MerchantLogin:InvoiceID:MerchantPass2
- Пример запроса методом HTTP GET:
- https://merchant.roboxchange.com/WebService/Service.asmx/OpState?MerchantLogin=demo&InvoiceID=1932809606&Signature=9e2bf657364d25acf5905b4ac4f50e39
Формат ответа для запросов HTTP GET/POST:
integer
string
integer
datetime
datetime
string
decimal
string
string
string
string
decimal
Описание возвращаемых данных:
- State
- - текущее состояние оплаты
-
- Code
- - код текущего состояния операции оплаты счета. Возможные значения:
-
-
5 - операция только инициализирована, деньги от покупателя не получены.
Состояние ввода денег. Это означает, что от пользователя ещё не поступила оплата по выставленному ему счёту
или платёжная система, через которую пользователь совершает оплату, ещё не подтвердила факт оплаты.
Либо (при оплате смс-сообщениями) оплата поступили частично, и система ожидает прихода оставшейся суммы.
-
10 - операция отменена, деньги от покупателя не были получены.
Оплата не была произведена. Покупатель отказался от оплаты или не совершил платежа, и операция отменилась по истечении времени ожидания.
Либо платёж был совершён после истечения времени ожидания.
В случае возникновения спорных моментов по запросу от продавца или покупателя,
операция будет перепроверена службой поддержки и в зависимости от результата может быть переведена в другое состояние.
-
50 - деньги от покупателя получены, производится зачисление денег на счет магазина.
Состояние вывода денег. Это означает, что операция перешла в состояние зачисления средств на счёт (кошелёк) продавца.
В этом статусе платёж может задержаться на некоторое время.
В случае невозможности оповестить магазин о зачисление денег по Result Url (url недоступен или ваш скрипт неверно формирует ответ) задержка составит около 5 минут.
Если платёж «висит» в этом состоянии уже долго (более 20 минут), то значит возникла проблема с зачислением средств продавцу.
-
60 - деньги после получения были возвращены покупателю.
Полученные от покупателя средства возвращены на его счёт (кошелёк), с которого совершалась оплата.
-
80 - исполнение операции приостановлено.
Внештатная остановка. Это означает, что произошла внештатная ситуация в процессинге операции (недоступны платежные интерфейсы в системе, из которой, в которую совершался платёж и т.д.)
Либо операция была приостановлена системой безопасности.
Операции находящиеся в этом состоянии, разбираются нашей службой поддержки в ручном режиме.
-
100 - операция выполнена, завершена успешно.
Платёж проведён успешно, деньги зачислены на счёт (кошелёк) продавца, уведомление об успешном платеже отправлено продавцу.
- RequestDate
- - дата/время ответа на запрос (*)
- StateDate
- - дата/время последнего изменения состояния операции (*)
- Info
- - информация об операции оплаты счета
-
- IncCurrLabel
- - валюта, которой платил клиент
- IncSum
- - сумма, уплаченная клиентом, в единицах валюты IncCurrLabel
- IncAccount
- - аккаунт клиента в платежной системе, через которую производилась оплата
- PaymentMethod
- - способ оплаты, выбранный клиентом
-
- Code
- - код способа оплаты
- Description
- - текстовое описание
- OutCurrLabel
- - валюта, в которой получает средства магазин
- OutSum
- - сумма, зачисленная на счет магазина, в единицах валюты OutCurrLabel
* Формат данных типа дата/время
Дата/время передаются в формате, рекомендованном стандартом ISO 8601 (YYYY-MM-DDThh:mm:ss.fffffffZZZZZ), где:
- YYYY - год, 4 цифры
- MM - месяц, 2 цифры
- DD - день месяца, 2 цифры (от 01 до 31)
- T – латинский символ «T» в верхнем регистре
- hh - часы, 2 цифры (24-часовой формат, от 00 до 23)
- mm - минуты, 2 цифры (от 00 до 59)
- ss - секунды, 2 цифры (от 00 до 59)
- fffffff – от 1 до 7 цифр дробной части секунд
- ZZZZZ - описатель временной зоны, может принимать значения:
- +hh:mm или -hh:mm – смещение относительно UTC (показывает, что указано локальное время, которое на данное число часов и минут опережает или отстает от UTC)
- символ «Z» (должен быть в верхнем регистре), означает, что момент времени представлен в UTC зоне (эквивалентно +00:00 и -00:00)
Пример: 2010-02-11T16:07:11.6973153+03:00
Коды ошибок, специфичные для этого интерфейса:
- 1 - неверная цифровая подпись запроса
- 3 - информация об операции с таким InvoiceID не найдена
Описание методов построения магазинов
Простейший магазин без формирования уникального номера счета.
Такой магазин не может как-либо контролировать процесс и вам скорее всего придется
самостоятельно отправлять товар.
Основная схема работы магазина:
- сформировав подпись, вы направляете пользователя на оплату,
используя JScript-код кассы, в результате чего на странице появляется касса с выбором валюты оплаты,
либо ссылку на оплату.
- пользователь, выбрав валюту, и нажав кнопку "оплатить" попадает на страницы ROBOKASSA,
и производит оплату (на кошелек магазина при этом поступают средства в вашей валюте).
- по окончании процесса на email-адрес оператора магазина посылается сообщение о произведенной
операции, а пользователь перенаправляется по скрипту, находящемуся по адресу SuccessURL.
Вашему SuccessURL скрипту передаются те же параметры, что и при инициализации оплаты.
На этой странице вы можете расположить текст вида "В ближайшее время оператор отошлет вам
купленный товар".
Либо можете расположить сам товар, в случае, если ваш скрипт получает переданные ему параметры и
проверяет правильность подписи. В противном случае пользователь может самостоятельно, без оплаты,
перейти на этот URL.
Для формирования/проверки подписи используется алгоритм MD5, встроенный в языки
Perl и PHP, на ASP используется COM-объект.
Если вы имеете в магазине несколько товаров либо несколько товаров с одинаковой ценой,
то для их идентификации используйте пользовательские параметры - параметры магазина, начинающиеся с префикса 'shp'.
Пользовательские параметры передаются наряду с другими в момент инициализации оплаты и должны быть учтены при формировании подписи.
При регистрации:
- "Result URL" - email-адрес оператора магазина, метод отправки данных - email,
- "Success URL" - адрес страницы с товаром, куда отправится пользователь после оплаты,
метод отправки данных не имеет значения
- "Fail URL" - адрес вашего магазина, метод отправки данных не имеет значения
Магазин, формирующий уникальный номер счета, но без формирования запросов
Схема работы магазина следующая:
- скрипт магазина сформировав уникальный номер счета и сформировав подпись
направляет пользователя на оплату, используя JScript-код кассы, либо URL калькулятора.
- после оплаты, ROBOKASSA уведомляет магазин о том, что платеж совершен, вызывая скрипт,
находящийся по адресу ResultURL - скрипту передаются параметры платежа, подписанные
ROBOKASSA с использованием пароля#2. Скрипт, указанному заказу устанавливает в БД магазина состояние "оплачено".
Если в момент оповещение между ROBOKASSA и магазином отсутствует связь - администратору
магазина отправляется email-сообщение.
- после оплаты, и после сообщения магазину, пользователь перенаправляется по скрипту,
находящемуся по адресу SuccessURL - скрипту передаются те же параметры, но подписанные
с использованием пароля#1. Скрипт анализирует данные, сверяет их с данными,
ранее полученными скриптом ResultURL (однако, магазин может вовсе и не использовать
скрипт ResultURL, полагаясь только на данные SuccessURL) и выдает товар.
Для формирования/проверки подписи используется алгоритм MD5, встроенный в языки
Perl и PHP, на ASP используется COM-объект.
Вы можете вовсе не формировать сверять подпись, если считаете это уместным уровнем
безопасности. В таком случае скрипт ResultURL должен сверять корректность данных
только по ip-адресу и URL скрипта
ResultURL не должен быть известен третьим лицам. SuccessURL при этом должен лишь
брать состояние заказа, устанавливаемое скриптом ResultURL и в случае состояние
"оплачено" выдавать товар.
Магазин с применением всех интерфейсов
В случае если конфигурация вашего сервера позволяет производить исходящие http и
https запросы на сервер ROBOKASSA, то вы можете дополнительно усложнить ваш
магазин, используя XML-интерфейсы.
Они позволяют предварительно считывать курсы обмена ROBOKASSA, список принимаемых валют.
Что значительно расширяет ваши возможности по построению удобного пользовательского
интерфейса вашего сайта.
Также вы можете в любой момент времени проверить состояние оплаты вашего заказа
- большая стабильность, повышенная безопасность. К примеру, ваша система может не
использовать ResultURL, а скрипт SuccessURL перед выдачей товара может проверять
состояние оплаты заказа непосредственно у ROBOKASSA.
Методы формирования страниц отправки на оплату
Как можно увидеть из спецификации интерфейсов при отправке пользователя на оплату
магазин должен сформировать уникальный (в пределах магазина) номер счета, по которому
будет производиться последующий контроль операции оплаты.
С этим связано несколько особенностей.
Если вы, например, резервируете товар на складе под каждый номер счета,
то может сложиться такая ситуация, что вскоре некоторая часть товара окажется зарезервированной,
но не оплаченной.
Поэтому если кнопка оплаты находится в таких местах, где пользователь еще
не готов покупать, а может лишь пробовать процесс - ввод конкретного номера счета
явно нежелателен.
Вариант 1 - не указывайте номера счета - при этом в момент инициализации операции оплаты
будет сформирован уникальный счет. Естественно вы не сможете тогда контролировать
операцию оплаты по номеру счета - вы его просто не знаете, однако для определения
принадлежности платежа к заказу вы можете использовать пользовательские параметры SHPxxx=yyy,
где xxx и yyy - произвольные строки.
Например, вы формируете в магазине заказ, резервируете под него товар и сохраняете.
Этот заказ вы передаете пользовательским параметром при инициализации операции оплаты.
В этом случае товар будет резервироваться только раз при формировании заказа и
сохраняется возможность произвести несколько попыток эго оплаты.
Вариант 2 - при нажатии на кнопку "оплатить" пользователь реально будет переходить
на ваш скрипт, который уже и будет формировать уникальный номер счета, запоминать
его, и перенаправлять пользователя на оплату этого счета.
Это естественные ограничения, однако, о них необходимо знать и помнить.
Примеры
Perl
Формирование URL переадресации пользователя на оплату
# connect standard module for building MD5-signs
use Digest::MD5 qw(md5_hex);
# your registration data
my $mrh_login = "test"; ### your login here
my $mrh_pass1 = "securepass1"; ### merchant pass1 here
# order properties
my $inv_id = 5; ### shop's invoice number
### (unique for shop's lifetime)
my $inv_desc = "desc"; ### invoice desc
my $out_summ = "5.12"; ### invoice summ
# build CRC value
my $crc =
md5_hex("$mrh_login:$out_summ:$inv_id:$mrh_pass1");
# build URL
my $url = "https://merchant.roboxchange.com/Index.aspx?MrchLogin=$mrh_login&".
"OutSum=$out_summ&InvId=$inv_id&Desc=$inv_desc&SignatureValue=$crc";
# print URL if you need
print "Content-type: text/html\n\n";
print "Payment link";
Получение уведомления об исполнении операции (ResultURL)
# as a part of ResultURL script
# connect standard module for building MD5-signs
use Digest::MD5 qw(md5_hex);
# define function for retrieval http-paratemters
sub http_Prm;
# your registration data
my $mrh_pass2 = "securepass2"; ### merchant pass2 here
# load parameters
my %q = http_Prm();
# loaded parameters: $q{OutSum}, $q{InvId}, $q{SignatureValue}
$q{crc} =~ s/([a-z])/uc "$1"/eg; # force uppercase
# build own CRC
my $my_crc = md5_hex("$q{OutSum}:$q{InvId}:$mrh_pass2");
$my_crc =~ s/([a-z])/uc "$1"/eg; # force uppercase
# define the correctness state
my $is_correct = ($my_crc eq $q{SignatureValue} ? 1 : 0);
if (!$is_correct)
{
print "Content-type: text/html\n\nbad sign\n";
die "incorrect sign passed";
}
# OK state
# print OK signature
print "Content-type: text/html\n\nOK$q{InvId}\n";
# perform some action (change order state to paid)
exit();
# just function to load http parameters, you can use own
sub http_Prm
{
my %query;
{
# POST params
my ($q_sz, $i, @q, @cmd);
my $l = $ENV{'CONTENT_LENGTH'};
my $qtext = "";
while ($l>0)
{ $l-=sysread(STDIN, $qtext, $l, length($qtext)); }
@q = split("&", $qtext);
$q_sz = scalar(@q);
for($i=0; $i<$q_sz; $i++)
{
@cmd = split("=", $q[$i]);
$cmd[1] =~ s/\+/ /g;
$cmd[1] =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
$query{$cmd[0]} = $cmd[1];
}
}
{
# GET params
my ($q_sz, $i, $qtext, @q, @cmd);
$qtext = $ENV{'QUERY_STRING'};
@q = split("&", $qtext);
$q_sz = scalar(@q);
for($i=0; $i<$q_sz; $i++)
{
@cmd = split("=", $q[$i]);
$cmd[1] =~ s/\+/ /g;
$cmd[1] =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
$query{$cmd[0]} = $cmd[1];
}
}
return %query;
}
Проверка параметров в скрипте завершения операции (SuccessURL)
# as a part of SuccessURL script
# connect standard module for building MD5-signs
use Digest::MD5 qw(md5_hex);
# define function for retrieval http-paratemters
sub http_Prm;
# your registration data
my $mrh_pass1 = "securepass1"; ### merchant pass1 here
# load parameters
my %q = http_Prm();
# loaded parameters: $q{OutSum}, $q{InvId}, $q{SignatureValue}
$q{crc} =~ s/([a-z])/uc "$1"/eg; # force uppercase
# build own CRC
my $my_crc = md5_hex("$q{OutSum}:$q{InvId}:$mrh_pass1");
$my_crc =~ s/([a-z])/uc "$1"/eg; # force uppercase
# define the correctness state
my $is_correct = ($my_crc eq $q{SignatureValue} ? 1 : 0);
if (!$is_correct)
{
print "Content-type: text/html\n\nbad sign\n";
die "incorrect sign passed";
}
# you can check here, that resultURL was called
# (for better security)
# OK, payment proceeds
print "Content-type: text/html\n\n";
echo "Thank you for using our service\n";
exit();
# just function to load http parameters, you can use own
sub http_Prm
{
my %query;
{
# POST params
my ($q_sz, $i, @q, @cmd);
my $l = $ENV{'CONTENT_LENGTH'};
my $qtext = "";
while ($l>0)
{ $l-=sysread(STDIN, $qtext, $l, length($qtext)); }
@q = split("&", $qtext);
$q_sz = scalar(@q);
for($i=0; $i<$q_sz; $i++)
{
@cmd = split("=", $q[$i]);
$cmd[1] =~ s/\+/ /g;
$cmd[1] =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
$query{$cmd[0]} = $cmd[1];
}
}
{
# GET params
my ($q_sz, $i, $qtext, @q, @cmd);
$qtext = $ENV{'QUERY_STRING'};
@q = split("&", $qtext);
$q_sz = scalar(@q);
for($i=0; $i<$q_sz; $i++)
{
@cmd = split("=", $q[$i]);
$cmd[1] =~ s/\+/ /g;
$cmd[1] =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
$query{$cmd[0]} = $cmd[1];
}
}
return %query;
}
PHP
Формирование URL переадресации пользователя на оплату
// your registration data
$mrh_login = "test"; // your login here
$mrh_pass1 = "securepass2"; // merchant pass1 here
// order properties
$inv_id = 5; // shop's invoice number
// (unique for shop's lifetime)
$inv_desc = "desc"; // invoice desc
$out_summ = "5.12"; // invoice summ
// build CRC value
$crc = md5("$mrh_login:$out_summ:$inv_id:$mrh_pass1");
// build URL
$url = "https://merchant.roboxchange.com/Index.aspx?MrchLogin=$mrh_login&".
"OutSum=$out_summ&InvId=$inv_id&Desc=$inv_desc&SignatureValue=$crc";
// print URL if you need
echo "Payment link";
Получение уведомления об исполнении операции (ResultURL)
// as a part of ResultURL script
// your registration data
$mrh_pass2 = "securepass2"; // merchant pass2 here
// HTTP parameters:
$out_summ = $_REQUEST["OutSum"];
$inv_id = $_REQUEST["InvId"];
$crc = $_REQUEST["SignatureValue"];
// HTTP parameters: $out_summ, $inv_id, $crc
$crc = strtoupper($crc); // force uppercase
// build own CRC
$my_crc = strtoupper(md5("$out_summ:$inv_id:$mrh_pass2"));
if (strtoupper($my_crc) != strtoupper($crc))
{
echo "bad sign\n";
exit();
}
// print OK signature
echo "OK$inv_id\n";
// perform some action (change order state to paid)
Проверка параметров в скрипте завершения операции (SuccessURL)
// as a part of SuccessURL script
// your registration data
$mrh_pass1 = "securepass1"; // merchant pass1 here
// HTTP parameters:
$out_summ = $_REQUEST["OutSum"];
$inv_id = $_REQUEST["InvId"];
$crc = $_REQUEST["SignatureValue"];
$crc = strtoupper($crc); // force uppercase
// build own CRC
$my_crc = strtoupper(md5("$out_summ:$inv_id:$mrh_pass1"));
if (strtoupper($my_crc) != strtoupper($crc))
{
echo "bad sign\n";
exit();
}
// you can check here, that resultURL was called
// (for better security)
// OK, payment proceeds
echo "Thank you for using our service\n";
ASP - JScript
Формирование URL переадресации пользователя на оплату
// get ASPHash.dll file from "Code examples -> ASP"
// install ASPHash.GenHash COM-object first: regsvr32 ASPHash.dll
// your registration data
var mrh_login = "test"; // your login here
var mrh_pass1 = "securepass1"; // merchant pass1 here
// order properties
var inv_id = 5; // shop's invoice number
// (unique for shop's lifetime)
var inv_desc = "desc"; // invoice desc
var out_summ = "5.12"; // invoice summ
// build CRC value
var h = new ActiveXObject("ASPHash.GenHash");
var crc = h.MD5(mrh_login+":"+out_summ+":"+inv_id+":"+
mrh_pass1);
// build URL
var url = "https://merchant.roboxchange.com/Index.aspx?MrchLogin="+mrh_login+"&"+
"OutSum="+out_summ+"&InvId="+inv_id+
"&Desc="+inv_desc+"&SignatureValue="+crc;
// print URL if you need
Response.Write("Payment link");
Получение уведомления об исполнении операции (ResultURL)
// get ASPHash.dll file from "Code examples -> ASP"
// install ASPHash.GenHash COM-object first: regsvr32 ASPHash.dll
// as a part of ResultURL script
// your registration data
var mrh_pass2 = "securepass2"; // merchant pass2 here
// HTTP parameters: out_summ, inv_id, crc
var out_summ = Request.QueryString("OutSum").Item;
var inv_id = Request.QueryString("InvId").Item;
var crc = Request.QueryString("SignatureValue").Item;
// build own CRC
var h = new ActiveXObject("ASPHash.GenHash");
var my_crc = h.MD5(out_summ+":"+inv_id+":"+mrh_pass2);
if (my_crc.toUpperCase() != crc.toUpperCase())
{
Response.Write("bad sign\n");
Response.End();
}
// print OK signature
Response.Write("OK"+inv_id+"\n");
// perform some action (change order state to paid)
Проверка параметров в скрипте завершения операции (SuccessURL)
// get ASPHash.dll file from "Code examples -> ASP"
// install ASPHash.GenHash COM-object first: regsvr32 ASPHash.dll
// as a part of SuccessURL script
// your registration data
var mrh_pass1 = "securepass1"; // merchant pass1 here
// HTTP parameters:
var out_summ = Request.QueryString("OutSum").Item;
var inv_id = Request.QueryString("InvId").Item;
var crc = Request.QueryString("SignatureValue").Item;
// build own CRC
var h = new ActiveXObject("ASPHash.GenHash");
var my_crc = h.MD5(out_summ+":"+inv_id+":"+mrh_pass1);
if (my_crc.toUpperCase() != crc.toUpperCase())
{
Response.Write("bad sign\n");
Response.End();
}
// you can check here, that resultURL was called
// (for better security)
// OK, payment proceeds
Response.Write("Thank you for using our service\n");
ASP.NET
Формирование URL переадресации пользователя на оплату
using System;
using System.Text;
using System.Globalization;
using System.Security.Cryptography;
public partial class Init : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
// your registration data
string sMrchLogin = "test";
string sMrchPass1 = "securepass1";
// order properties
decimal nOutSum = 5.12M;
int nInvId = 5;
string sDesc = "desc";
string sOutSum = nOutSum.ToString("0.00", CultureInfo.InvariantCulture);
string sCrcBase = string.Format("{0}:{1}:{2}:{3}",
sMrchLogin, sOutSum, nInvId, sMrchPass1);
// build CRC value
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
byte[] bSignature = md5.ComputeHash(Encoding.ASCII.GetBytes(sCrcBase));
StringBuilder sbSignature = new StringBuilder();
foreach (byte b in bSignature)
sbSignature.AppendFormat("{0:x2}", b);
string sCrc = sbSignature.ToString();
// LinkButtonPay is System.Web.UI.WebControls.LinkButton;
LinkButtonPay.Text = "Payment link";
// build URL
LinkButtonPay.PostBackUrl = "https://merchant.roboxchange.com/Index.aspx?" +
"MrchLogin=" + sMrchLogin +
"&OutSum=" + sOutSum +
"&InvId=" + nInvId +
"&Desc=" + sDesc +
"&SignatureValue=" + sCrc;
}
}
Получение уведомления об исполнении операции (ResultURL)
using System;
using System.Web;
using System.Text;
using System.Globalization;
using System.Security.Cryptography;
public partial class Result : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
// your registration data
string sMrchPass2 = "securepass2";
// HTTP parameters
string sOutSum = GetPrm("OutSum");
string sInvId = GetPrm("InvId");
string sCrc = GetPrm("SignatureValue");
string sCrcBase = string.Format("{0}:{1}:{2}",
sOutSum, sInvId, sMrchPass2);
// build own CRC
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
byte[] bSignature = md5.ComputeHash(Encoding.ASCII.GetBytes(sCrcBase));
StringBuilder sbSignature = new StringBuilder();
foreach (byte b in bSignature)
sbSignature.AppendFormat("{0:x2}", b);
string sMyCrc = sbSignature.ToString();
if (sMyCrc.ToUpper() != sCrc.ToUpper())
{
Response.Write("bad sign");
return;
}
Response.Write(string.Format("OK{0}", sInvId));
// perform some action (change order state to paid)
}
private string GetPrm(string sName)
{
string sValue;
sValue = HttpContext.Current.Request.Form[sName] as string;
if (string.IsNullOrEmpty(sValue))
sValue = HttpContext.Current.Request.QueryString[sName] as string;
if (string.IsNullOrEmpty(sValue))
sValue = String.Empty;
return sValue;
}
}
Проверка параметров в скрипте завершения операции (SuccessURL)
using System;
using System.Web;
using System.Text;
using System.Globalization;
using System.Security.Cryptography;
public partial class Success : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
// your registration data
string sMrchPass1 = "securepass1";
// HTTP parameters
string sOutSum = GetPrm("OutSum");
string sInvId = GetPrm("InvId");
string sCrc = GetPrm("SignatureValue");
string sCrcBase = string.Format("{0}:{1}:{2}",
sOutSum, sInvId, sMrchPass1);
// build own CRC
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
byte[] bSignature = md5.ComputeHash(Encoding.ASCII.GetBytes(sCrcBase));
StringBuilder sbSignature = new StringBuilder();
foreach (byte b in bSignature)
sbSignature.AppendFormat("{0:x2}", b);
string sMyCrc = sbSignature.ToString();
if (sMyCrc.ToUpper() != sCrc.ToUpper())
{
Response.Write("bad sign");
return;
}
// you can check here, that ResultURL was called
// (for better security)
// OK, payment proceeds
Response.Write("Thank you for using our service");
}
private string GetPrm(string sName)
{
string sValue;
sValue = HttpContext.Current.Request.Form[sName] as string;
if (string.IsNullOrEmpty(sValue))
sValue = HttpContext.Current.Request.QueryString[sName] as string;
if (string.IsNullOrEmpty(sValue))
sValue = String.Empty;
return sValue;
}
}
|