orensymrak
03.08.22 — 21:21
Пытаюсь изучить внедрение API сбера в 1С для начала пока, что во внешней обработке дабы пройти всю этапность, и только потом внедрять в конфу.
Написав вот такой код, следуя инструкции Сбера для получения токена:
Функция ПолучитьКодированнуюСтроку(Логин, Пароль) Строка = Логин+":"+Пароль; Поток = Новый ПотокВПамяти; Запись = Новый ЗаписьДанных(Поток, КодировкаТекста.UTF8); Запись.ЗаписатьСимволы(Строка); Запись.Закрыть(); ДвоичныеДанные = Поток.ЗакрытьИПолучитьДвоичныеДанные(); Возврат Base64Строка(ДвоичныеДанные); КонецФункции &НаКлиенте Процедура Попытка2(Команда) ssl = Новый ЗащищенноеСоединениеOpenSSL( Новый СертификатКлиентаФайл("D:***сертификат***.p12", "***пароль***"), Новый СертификатыУдостоверяющихЦентровОС); Соединение = Новый HTTPСоединение("api.sberbank.ru",8443,,,,5,ssl,Ложь); rqUID = Строка(Новый УникальныйИдентификатор()); rqUID = СтрЗаменить(rqUID, "-",""); Логин = "*******-***-****-*******";// ClientId Пароль = "*******-***-****-*******";// SecretId Base64Логин = "Basic "+ПолучитьКодированнуюСтроку(Логин, Пароль); Заголовки = Новый Соответствие(); Заголовки.Вставить("authorization",Base64Логин); Заголовки.Вставить("accept","application/json"); Заголовки.Вставить("content-type","application/x-www-form-urlencoded"); Заголовки.Вставить("rqUID", rqUID); Запрос = Новый HTTPЗапрос("/prod/tokens/v2/oauth",Заголовки); Запрос.УстановитьТелоИзСтроки("{ ""grant_type"":""client_credentials"" , ""scope"" : ""https%3A%2F%2Fapi.sberbank.ru%2Forder.create""}"); Ответ = Соединение.ОтправитьДляОбработки(Запрос); СписокДоковПоФН = Ответ.ПолучитьТелоКакСтроку(); Сообщить(rqUID); КонецПроцедуры
Вылетает ошибка:
{"httpCode":"400", "httpMessage":"Bad Request", "moreInformation":"invalid_request"}
Разъяснение Сбера: В теле запроса ошибка в параметре grant_type
Однако по инструкции указано что в параметр тела grant_type установить client_credentials
А до этого всегда ловил ошибку 500, но после добавления в заголовки параметров accept и content-type начало выдавать ошибку 400.
Может ли кто подсказать, где у меня ошибка, либо можете направить на рабочий код получения токена, далее и создание QR кода на оплату.
arsik
1 — 03.08.22 — 21:34
(0) Мануал или ссылку на него выложи.
orensymrak
2 — 03.08.22 — 22:13
Lexandr
3 — 04.08.22 — 08:37
Может не полагаться на строку вбитую вручную? А то будешь три дня искать, где там запятая не по фэншую.
Запись = Новый ЗаписьJSON; Запись.УстановитьСтроку(); ЗаписатьJSON(Запись, СтруктураАтрибутов); Результат = Запись.Закрыть(); Запрос.УстановитьТелоИзСтроки.УстановитьТелоИзСтроки(Результат);
arsik
4 — 04.08.22 — 09:56
(2) Ну так там же описано тело в примере. И оно не json
«grant_type=client_credentials&scope=https%3A%2F%2Fapi.sberbank.ru%2Forder.create»
orensymrak
5 — 04.08.22 — 09:58
(3) в таком режиме падает в 500 ошибку, хотя очень странно ведь тело с параметрами такое же получается
(4) установил тело в "grant_type=client_credentials&scope=https%3A%2F%2Fapi.sberbank.ru%2Forder.create" и ошибка другая {"httpCode":"400", "httpMessage":"Bad Request", "moreInformation":"unauthorized_client"}
arsik
6 — 04.08.22 — 10:00
(5) Ну значит ты не авторизировался. Разбирайся с Base64Логин = «Basic «+ПолучитьКодированнуюСтроку(Логин, Пароль);
Lexandr
7 — 04.08.22 — 10:07
СтрокаАвторизации = ПолучитьBase64СтрокуИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзСтроки(""+Имя+":"+Пароль,КодировкаТекста.UTF8,Ложь));
ЗаголовокHTTP.Вставить("Authorization", "Basic "+СтрокаАвторизации);
arsik
8 — 04.08.22 — 10:18
(5) А где «x-ibm-client-id»?
orensymrak
9 — 04.08.22 — 10:20
(7) точно такая же строка получилась и соответствующая ошибка 400
(6) подозрение в том что эта ошибка указана именно в запросе «httpMessage»:»Bad Request»
Да и вроде по строению строки по инструкции все правильно
orensymrak
10 — 04.08.22 — 10:20
(8) а его я не могу найти в личном кабинете)))
orensymrak
11 — 04.08.22 — 11:45
(8) тем более судя по инструкции данный заголовок не обязательный…
orensymrak
12 — 04.08.22 — 12:06
(8) Разобрался с ошибкой оказалось в Base64Логин присутствовал символ переноса строки, ошибка с авторизацией ушла, появилась новая))
{"httpCode":"400", "httpMessage":"Bad Request", "moreInformation":"invalid_scope"}
Пробовал
Запрос.УстановитьТелоИзСтроки(«grant_type=client_credentials&scope=https://api.sberbank.ru/order.create»);
и так
Запрос.УстановитьТелоИзСтроки("grant_type=client_credentials&scope=https%3A%2F%2Fapi.sberbank.ru%2Forder.create");
Все равно ругается на scope, либо есть подозрение, что я вовсе не тот скоуп пытаюсь использовать
orensymrak
13 — 04.08.22 — 12:14
и с этим моментом разобрался)))
в инструкции имеются не точности — не правильный скоуп…
Необходимый был:
Запрос.УстановитьТелоИзСтроки(«grant_type=client_credentials&scope=https://api.sberbank.ru/qr/order.create»);
и токен получен….
Кир Пластелинин
14 — 04.08.22 — 12:14
(12) тоже в свое время знатно поломал голову — почему авторизация не проходила
токен для нужного скоупа получен?
orensymrak
15 — 04.08.22 — 12:29
(14) да
{«access_token»:»*******»,»expires_in»:»60″,»scope»:»https://api.sberbank.ru/qr/order.create»,»session_state»:»********»,»token_type»:»bearer»}
токен выдан для того скоупа который я запрашивал, а сберовцы в инструкции писали что скоуп должен быть: https://api.sberbank.ru/order.create и вылетало в ошибку не верного скоупа, возможно просто для моей учетки нет доступа для этого скоупа — не отрицаю.
Кир Пластелинин
16 — 04.08.22 — 12:34
(15) если что, то полную интеграцию со сбером прописывал. если вопросы будут. благо перешли на Райф, т.к. у них и поддержка адекватней и api-шка попроще. не без минусов конечно
orensymrak
17 — 04.08.22 — 12:40
(16) вопросов и так куча) это второй раз когда использую API, до этого только с ОФД запрашивал данные (там в разы проще). Был бы рад наглядному примеру поэтапности действий.
Пока в голове только этапность:
-получить токен
-создать заказ на QR -статус оплаты Нужна методика в коде))
Кир Пластелинин
18 — 04.08.22 — 12:52
(17) уже косяк в логике. получение токена на скоуп создания заказа, создание заказа, получение токена на скоуп статуса заказа, получение статуса заказа. к тому же жизнь токена емнп 60 сек. плюс для подстраховки сделал «технические» документы, где все инфа от сбера аккумулировалась с привязкой к документу оплаты
Кир Пластелинин
19 — 04.08.22 — 12:54
+ (18) там для возвратов дс исходная инфа как я помню требуется помимо id заказа.
orensymrak
20 — 04.08.22 — 12:59
(18) (19) ну технические доки я тоже планировал делать, но мне пока что хочется пройти весь этап получения оплаты, чтобы уже из этого развивать внедрение в магазинах своих. Можно получить как то эту интеграцию на эти этапности, чтобы не ломать голову что оказывается там символ переноса есть…
Кир Пластелинин
21 — 04.08.22 — 13:13
(20) первое предложение в (17). и, если планируется возврат ДС через СБП, то сразу учитывать этот момент на этапе планирования
Кир Пластелинин
22 — 04.08.22 — 13:13
+(21) т.е. в (18)
Aswed
23 — 04.08.22 — 13:54
(0)
ЗначенияРеквизитов = ПолучитьЗначенияРеквизитов(ДокументОплаты, ДокументЗаказа, "Номер,Дата,СуммаДокумента,Организация,ПодразделениеКомпании"); АдресЗапроса = "prod/qr/order/v3/creation"; ВремяДаты = ?(СтрДлина(Формат(ТекущаяДата(), "ДЛФ=T")) = 7, "0", "") + Формат(ТекущаяДата(), "ДЛФ=T"); rq_tm = Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd") + "T" + ВремяДаты + "Z"; ВремяДаты = ?(СтрДлина(Формат(ЗначенияРеквизитов.Дата, "ДЛФ=T")) = 7, "0", "") + Формат(ЗначенияРеквизитов.Дата, "ДЛФ=T"); order_create_date = Формат(ЗначенияРеквизитов.Дата, "ДФ=yyyy-MM-dd") + "T" + ВремяДаты + "Z"; description = "Оплата по документу " + ТипЗнч(ДокументЗаказа) + " №" + ЗначенияРеквизитов.Номер + " от " + ЗначенияРеквизитов.Дата; //!!!!! тут переделать по типу документа order_params_type = ""; СоставЗаказа = ПолучитьТоварыИУслуги(ДокументЗаказа); Для Каждого СтрТоварУслуга Из СоставЗаказа Цикл НаименованиеНоменклатуры = СтрЗаменить(Строка(СтрТоварУслуга.Номенклатура), "", ""); СтруктураПараметровТ = Новый Структура; СтруктураПараметровТ.Вставить("position_name", НаименованиеНоменклатуры); СтруктураПараметровТ.Вставить("position_count", 1); СтруктураПараметровТ.Вставить("position_sum", СтрТоварУслуга.Сумма * 100); СтруктураПараметровТ.Вставить("position_description", НаименованиеНоменклатуры); JSON_Т = ОбработатьПараметрыЗапроса(СтруктураПараметровТ, "ЧРД=.; ЧГ="); order_params_type = ?(ПустаяСтрока(order_params_type), JSON_Т, order_params_type + "," + JSON_Т); КонецЦикла; СтруктураПараметров = Новый Структура; СтруктураПараметров.Вставить("rq_uid", СтрЗаменить(Новый УникальныйИдентификатор, "-", "")); СтруктураПараметров.Вставить("rq_tm", rq_tm); СтруктураПараметров.Вставить("member_id", НастройкиПодключения.MemberId); СтруктураПараметров.Вставить("order_number", ЗначенияРеквизитов.Номер); СтруктураПараметров.Вставить("order_create_date", order_create_date); СтруктураПараметров.Вставить("order_params_type", "[" + order_params_type + "]"); СтруктураПараметров.Вставить("id_qr", НастройкиПодключения.TerminalID); СтруктураПараметров.Вставить("order_sum", ЗначенияРеквизитов.СуммаДокумента * 100); СтруктураПараметров.Вставить("currency", "643"); СтруктураПараметров.Вставить("description", description); СтруктураПараметров.Вставить("sbp_member_id", "100000000111"); JSON = ОбработатьПараметрыЗапроса(СтруктураПараметров, "ЧРД=.; ЧГ="); JSON = СтрЗаменить(JSON, """[", "["); JSON = СтрЗаменить(JSON, "]""", "]"); СтруктураРезультата = ВызватьPOSTЗапрос(АдресЗапроса, JSON, "/qr/order.create", "OrderCreateQrRq", НастройкиПодключения);КонецПроцедуры Готовый блок получения заказа в СБП Сбера.
Если нужен ни СБП а Плати QR то там ещё один параметр надо передавать.
orensymrak
24 — 04.08.22 — 14:02
(23) Спасибо буду разбираться)
orensymrak
25 — 04.08.22 — 14:50
(23) а можно приложить и вложенные процедуры/функции типа ОбработатьПараметрыЗапроса и т.д.?)))
orensymrak
26 — 05.08.22 — 11:34
(21) (23) Подскажите, сформировал структуру тела, сделал с нее json, но не понимаю как это засунуть в тело запроса, с токен стало понятно, что указывать надо не json тело, а на запрос создание qr тут же уже структура.
Кир Пластелинин
27 — 05.08.22 — 12:03
(26)
#Область ФормированиеJSONСтруктурыДляТелаЗапроса JSON_Структура_Тело = ПодготовитьТелоЗапроса_OrderCreateQr(ВходныеДанные["ВидОплатыПоQR"], rqUID, rqTm, ДополнительныеПараметры, Результат_Заказ_ПлатиQR_СБП_Сбербанк); ЗаписьJSON = Новый ЗаписьJSON; ЗаписьJSON.УстановитьСтроку(); ЗаписатьJSON(ЗаписьJSON, JSON_Структура_Тело); ТелоHTTPЗапроса = ЗаписьJSON.Закрыть(); Результат["ТелоЗапроса"] = ТелоHTTPЗапроса; #КонецОбласти #Область ИнициализацияHTTPЗапроса Заголовки = Новый Соответствие; Заголовки.Вставить("Authorization", СформироватьАвторизационныеДанные_BearerScheme(token)); Заголовки.Вставить("RqUID" , rqUID); Заголовки.Вставить("Content-Type" , "application/json"); Заголовки.Вставить("accept" , "application/json"); HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса, Заголовки); HTTPЗапрос.УстановитьТелоИзСтроки(ТелоHTTPЗапроса,, ИспользованиеByteOrderMark.НеИспользовать); #КонецОбласти
Кир Пластелинин
28 — 05.08.22 — 12:04
+(27) это на создание заказа
orensymrak
29 — 05.08.22 — 15:07
(28) то ли пятница) то ли так жарко, что мозги плывут)
Не понимаю, почему ругается
{«httpCode»:»400″,»httpMessage»:»Bad Request»,»moreInformation»:»Body of the request is not valid according to json schema»}
ДатаДокумента = Дата("04.08.2022 15:00:00");
НомерЗаказа = "МВУТ-000005";
rq_uid = СтрЗаменить(НОвый УникальныйИдентификатор(),"-","");
ВремяДаты = ?(СтрДлина(Формат(ТекущаяДата(), "ДЛФ=T")) = 7, "0", "") + Формат(ТекущаяДата(), "ДЛФ=T");
rq_tm = Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd") + "T" + ВремяДаты + "Z";
member_id = "******";
order_number = НомерЗаказа;
ВремяДаты = ?(СтрДлина(Формат(ДатаДокумента, "ДЛФ=T")) = 7, "0", "") + Формат(ДатаДокумента, "ДЛФ=T");
order_create_date = Формат(ДатаДокумента, "ДФ=yyyy-MM-dd") + "T" + ВремяДаты + "Z";
order_params_type = "";ПолучитьСоставДокумента(НомерЗаказа);
Для Каждого СтрТоварУслуга Из СоставЗаказа Цикл
НаименованиеНоменклатуры = СтрЗаменить(Строка(СтрТоварУслуга.Номенклатура), "", "");
НаименованиеХарактеристики = СтрЗаменить(Строка(СтрТоварУслуга.Характеристика), "", "");
НаименованиеДляПередачи = НаименованиеНоменклатуры+" ("+НаименованиеХарактеристики+")";СтруктураПараметровТ = Новый Структура;
СтруктураПараметровТ.Вставить("position_name", НаименованиеДляПередачи);
СтруктураПараметровТ.Вставить("position_count", СтрТоварУслуга.Количество);
СтруктураПараметровТ.Вставить("position_sum", СтрТоварУслуга.Сумма*100);
СтруктураПараметровТ.Вставить("position_description", НаименованиеДляПередачи);JSON_Т = ОбработатьПараметрыЗапроса(СтруктураПараметровТ);
order_params_type = ?(ПустаяСтрока(order_params_type), JSON_Т, order_params_type + "," + JSON_Т);КонецЦикла;
СтруктураПараметровТела = Новый Структура;
СтруктураПараметровТела.Вставить("rq_uid", rq_uid);
СтруктураПараметровТела.Вставить("rq_tm", rq_tm);
СтруктураПараметровТела.Вставить("member_id", member_id);
СтруктураПараметровТела.Вставить("order_number", order_number);
СтруктураПараметровТела.Вставить("order_create_date", order_create_date);
СтруктураПараметровТела.Вставить("order_params_type", "[" + order_params_type + "]");
//СтруктураПараметровТела.Вставить("id_qr", "1000100051"); // неизвестная переменная
СтруктураПараметровТела.Вставить("order_sum", 399500);
СтруктураПараметровТела.Вставить("currency", "643");
СтруктураПараметровТела.Вставить("description", "Оплата клиентом розничного чека №"+НомерЗаказа+"");
СтруктураПараметровТела.Вставить("scope", "https://api.sberbank.ru/qr/order.create");Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
Запись.ЗаписатьНачалоОбъекта();
Для каждого Значение Из СтруктураПараметровТела Цикл
Запись.ЗаписатьИмяСвойства(Значение.Ключ);
Запись.ЗаписатьЗначение(Значение.Значение);
КонецЦикла;
Запись.ЗаписатьКонецОбъекта();
JSON = Запись.Закрыть();
JSON = СтрЗаменить(JSON, """[", "[");
JSON = СтрЗаменить(JSON, "]""", "]");// получение токена с авторизацией
ssl = Новый ЗащищенноеСоединениеOpenSSL(
Новый СертификатКлиентаФайл("*****", "****"),
Новый СертификатыУдостоверяющихЦентровОС);Соединение = Новый HTTPСоединение("api.sberbank.ru",8443,,,,5,ssl,Ложь);
Заголовки = Новый Соответствие();
Заголовки.Вставить("authorization", "Bearer "+токен);
Заголовки.Вставить("accept","application/json");
Заголовки.Вставить("content-type","application/x-www-form-urlencoded");
Заголовки.Вставить("rqUID", ИдентификаторЗапросаТокена);JSON = СтрЗаменить(JSON, "rn", "");
JSON = СтрЗаменить(JSON, "rn", "");
JSON = СтрЗаменить(JSON, "", "");Запрос = Новый HTTPЗапрос("/prod/qr/order/v3/creation",Заголовки);
//Запрос.УстановитьТелоИзСтроки("grant_type=client_credentials&scope=https://api.sberbank.ru/qr/order.create"); // , ""scope"" : ""https%3A%2F%2Fapi.sberbank.ru%2Forder.create""
Запрос.УстановитьТелоИзСтроки(JSON,,ИспользованиеByteOrderMark.НеИспользовать);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
СписокДоковПоФН = Ответ.ПолучитьТелоКакСтроку();
Кир Пластелинин
30 — 05.08.22 — 16:24
(29) «СтруктураПараметровТела.Вставить(«order_params_type», «[» + order_params_type + «]»);» и » JSON = СтрЗаменить(JSON, «»»[«, «[«);» это что еще за чушь?
с чего там будет application/x-www-form-urlencoded?
Кир Пластелинин
31 — 05.08.22 — 16:24
и да. передача товарной корзины вообще не обязательна. к тому же они в итоге нигде не отображается
Кир Пластелинин
32 — 05.08.22 — 16:27
неужели трудно все сделать по https://api.developer.sber.ru/product/PlatiQR/doc/v1/8024874223 ? там даже примеры есть итогового тела. загоните свое сформированное тело в какой-нибудь онлайн json редактор или в notepad++ и сравните
Галахад
33 — 05.08.22 — 16:32
(32) 1С само умеет форматировать JSON, не обязательно искать что-то внешнее.
Кир Пластелинин
34 — 05.08.22 — 16:48
(33) я эт к тому написал, что бы человек сравнил свое тело с эталонным
orensymrak
35 — 05.08.22 — 17:49
(34) Где это найти «id_qr»? (для операции «QR-код СБП»: tid (Уникальный идентификатор терминала).) (если из за него конечно ругательства)
Весь ЛК облазил.
+ скоуп в этом случае где указывается? я в структуру тела уже пробовал засунуть.
+ убрал формирование товарных позиций и добавил sbp_member_id пока ошибка та же
orensymrak
36 — 05.08.22 — 18:03
(32)
сравнил свое тело с примером, явных отличий не увидел, кроме добавленного скоупа и sbp_member_id, ну и не понятно где брать id_qr
{
"rq_uid": "13bec0923259410f947c143fea58d55d",
"rq_tm": "2022-08-05T17:58:13Z",
"member_id": "00001652",
"order_number": "123456",
"order_create_date": "2022-08-04T15:00:00Z",
"id_qr": "2f618d9c-f22f-4e50-9bd5-ce5db7027397",
"order_sum": 399500,
"currency": "643",
"description": "Оплата клиентом розничного чека №123456",
"scope": "https://api.sberbank.ru/qr/order.create",
"sbp_member_id": "100000000111"
}
Кир Пластелинин
37 — 08.08.22 — 08:05
(36) ОписаниеТелаЗапроса.Вставить(«id_qr», «»); // string(36): Идентификатор устройства, на котором сформирован заказ.
// Правила заполнения: // для операции "QR-код Продавца": IdQR (Уникальный идентификатор устройства в системе "Плати QR"); // для операции "QR-код СБП": tid (Уникальный идентификатор терминала). эта данные сам Сбер предоставляет
orensymrak
38 — 10.08.22 — 11:37
(37) Только получил id_qr от сбера, но вылетала все равно ошибка, и просто удалил указание скоупа, все заработало, получил все необходимые данные.
И запрос статус успешно произвел.
Отсюда вопросы: судя по тому что есть действия с неоплаченными заказами их необходимо будет постоянно удалять или они со временем автоматически аннулируются сами?
и я правильно понял, что для каждого скоупа необходим запрос отдельного токена?
создание — свой токен
статус — свой токен
отмена/возврат — свой токен и т.д.
Кир Пластелинин
39 — 10.08.22 — 11:54
(38) 1. вот почему и отсылал к сравнению сформированного тела и эталона.
2. вот хз — есть ли срок жизни заказа у Сбера или нет. но сервис для отмены неоплаченных заказов у них тоже был
3. да. на каждую область. более того. полученный токен имеет срок жизни (60 сек.). поэтому нужно сразу закладывать момент, что при каждом чихе сперва придется получить токен и потом выполнять операцию. даже если она повторяется через какой то промежуток времени, ибо есть шанс не успеть в рамках жизни токена.
orensymrak
40 — 10.08.22 — 16:01
(39) для полного понимания))
RqUID (Уникальный идентификатор запроса) используется в каждом запросе, вопрос таков в пределах одного заказа идентификатор должен быть одинаковый?
в каждом запросе есть идентификатор в заголовке и в теле, так вот в пределах запроса одинаковый и/или не важно какой запрос идентификатор должен быть одинаковый в любом из запросов
ИЛИ же )))
в заголовке и теле он должен быть одинаковый а в различных запросах разный (создание заказа — один, а при проверке статуса — другой)
Даже пишу запутанно, т.к. не понимаю как строить структуру интеграции с участием этого идентификатора
Кир Пластелинин
41 — 10.08.22 — 16:23
(40) RqUID в заголовках и rq_uid в теле — это один и тот же id. я туда guid пропихивал, в котором удалял «-«, т.к. ограничение по длине в 32 символа + ограничения шаблона. этот id уникален должен быть уникален для запроса. т.е. получение токена — один id, последующее создание заказа — другой id
stone-w1987
42 — 16.08.22 — 10:30
Доброго дня токен с трудом получили, но при создании заказа 401 Unauthorized Not registered to plan
Хотя все по инструкции…
Кир Пластелинин
43 — 16.08.22 — 10:55
(42) могу только предположить, что не подключили api оплат по qr для своего приложения в личном кабинете для пространства организации.
stone-w1987
44 — 16.08.22 — 11:05
спасибо за совет, тема новая … инструкции …
Кир Пластелинин
45 — 16.08.22 — 11:43
(44) не все так прозрачно описано в документации конечно и в каких то непонятных ситуациях лучше в саппорт писать. но вот общение с ними полный рандом и ппц, если речь идет про сервис оплат по QR. порой быстро и адекватно отвечают, а порой чуть ли не прямым текстом приходится писать «перечитайте исходный вопрос» и вот только тогда соизволят предоставить ответ на поставленный вопрос. а вот поддержка интернет-эквайринга от них оставила только положительные впечатления.
stone-w1987
46 — 17.08.22 — 21:13
Добого всем, после обращения в тех поддержку появилась новая ошибка, спасибо за поддержку
Body of the request is not valid according to json schema
Кир Пластелинин
47 — 18.08.22 — 08:10
(46) ну черным по белому написано же, что структура json некорректна. открываем два окна: в одном эталонное из документации, в другом собственноручно сформированное. смотрим и делаем вывода. читаем внимательней документацию
stone-w1987
48 — 19.08.22 — 19:13
Запросы получились, всем спасибо)
dchumak
49 — 09.09.22 — 11:30
(42)
[401 Unauthorized Not registered to plan]
Добрый день. Как решили такую проблему? Что-то неправильно в запросе, или настройки в личном кабиненте?
Кир Пластелинин
50 — 09.09.22 — 12:55
(49) проверьте в лк, что подписали свое приложение на нужные API
arsik
51 — 09.09.22 — 13:03
(44) Нафига все это? Вроде у сбера сейчас прошивки для эквайринговых терминалов поддерживают СБП. Там даже делать ничего не надо в софте. Подключаешь его в 1С как обычный эквайринговый терминал.
dchumak
52 — 09.09.22 — 13:28
(51)
[поддерживают СБП]
это не СБП, а SberQR.
Там только в 3 банках можно оплачивать.
Урезанная реализация.
arsik
53 — 09.09.22 — 13:34
(52) Жаль. Я думал там полноценный СБП (в столовке просто видел). Тот кто натянет полноценный СБП на свои терминалы озолотится.
|
nixxel 0 / 0 / 0 Регистрация: 15.07.2013 Сообщений: 13 |
||||||||
|
1 |
||||||||
|
26.07.2016, 13:42. Показов 11531. Ответов 5 Метки нет (Все метки)
Здравствуйте. Возник вопрос при использовании API Сбербанка.
Вот код отпавк:
Логин и пароль верные же… Может кто-то сталкивался с подобным? Добавлено через 19 часов 16 минут
__________________ 0 |
|
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
26.07.2016, 13:42 |
|
5 |
|
2 / 2 / 3 Регистрация: 02.08.2012 Сообщений: 36 |
|
|
26.07.2016, 15:04 |
2 |
|
В чем проблема была? 0 |
|
0 / 0 / 0 Регистрация: 15.07.2013 Сообщений: 13 |
|
|
27.07.2016, 11:33 [ТС] |
3 |
|
Нужно было внимательно читать документацию… И у них пример не рабочий был, нужно было еще поля добавить. 0 |
|
55 / 55 / 21 Регистрация: 01.03.2016 Сообщений: 594 |
|
|
17.08.2016, 00:41 |
4 |
|
nixxel, дайте ссылку на это апи 0 |
|
0 / 0 / 0 Регистрация: 15.07.2013 Сообщений: 13 |
|
|
17.08.2016, 08:59 [ТС] |
5 |
|
53ifbb, после заключения договора вам его дадут. 0 |
|
55 / 55 / 21 Регистрация: 01.03.2016 Сообщений: 594 |
|
|
17.08.2016, 18:57 |
6 |
|
nixxel, Это эквайринг ? 0 |
После регистрации в системе эквайринга Сбербанка и получив доступ к тестовой среде, можно приступить к интеграции с интернет-магазином. Рассмотрим примеры основных обращений к REST API Сбербанка с помощью PHP CURL.
В примерах указаны URL для тестовой среды, после перехода в боевой режим, их нужно заменить на https://securepayments.sberbank.ru/
1
Онлайн оплата
При данном методе деньги клиента списываются сразу. Клиент добавляет товары в корзину, оформляет заказ, на этапе оплаты нужно сделать запрос в платежный шлюз на register.do.
Описание одностадийной оплаты, подробнее о передаче корзины.
$vars = array(); $vars['userName'] = 'логин'; $vars['password'] = 'пароль'; /* ID заказа в магазине */ $vars['orderNumber'] = '123'; /* Корзина для чека (необязательно) */ $cart = array( array( 'positionId' => 1, 'name' => 'Название товара', 'quantity' => array( 'value' => 1, 'measure' => 'шт' ), 'itemAmount' => 1 * (1000 * 100), 'itemCode' => '123456', 'tax' => array( 'taxType' => 0, 'taxSum' => 0 ), 'itemPrice' => 1000 * 100, ) ); $vars['orderBundle'] = json_encode( array( 'cartItems' => array( 'items' => $cart ) ), JSON_UNESCAPED_UNICODE ); /* Сумма заказа в копейках */ $vars['amount'] = 1000 * 100; /* URL куда клиент вернется в случае успешной оплаты */ $vars['returnUrl'] = 'http://example.com/success/'; /* URL куда клиент вернется в случае ошибки */ $vars['failUrl'] = 'http://example.com/error/'; /* Описание заказа, не более 24 символов, запрещены % + r n */ $vars['description'] = 'Заказ №' . $order_id . ' на example.com'; $ch = curl_init('https://3dsec.sberbank.ru/payment/rest/register.do?' . http_build_query($vars)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $res = curl_exec($ch); curl_close($ch);
PHP
Ответ будет в формате JSON, в котором содержатся ID платежа в банке и URL куда отправить клиента для оплаты.
{ "errorCode":"0", "orderId":"70906e55-7114-41d6-8332-4609dc6590f4", "formUrl":"https://3dsec.sberbank.ru/payment/merchants/test/payment_ru.html?mdOrder=70906e55-7114-41d6-8332-4609dc6590f4" }
TEXT
Далее обработаем ответ, и перенаправим клиента:
$res = json_decode($res, JSON_OBJECT_AS_ARRAY); if (empty($res['orderId'])){ /* Возникла ошибка: */ echo $res['errorMessage']; } else { /* Успех: */ /* Тут нужно сохранить ID платежа в своей БД - $res['orderId'] */ /* Перенаправление клиента на страницу оплаты */ header('Location: ' . $res['formUrl'], true); /* Или на JS */ echo '<script>document.location.href = "' . $res['formUrl'] . '"</script>'; }
PHP
В случае успешной оплаты, клиент вернется на страницу returnUrl. В адрес добавятся ID платежа полученный ранее:
http://example.com/success/?orderId=70906e55-7114-41d6-8332-4609dc6590f4&lang=ru
Также будет и в случаи ошибки (failUrl):
http://example.com/error/?orderId=70906e55-7114-41d6-8332-4609dc6590f4&lang=ru
2
Двухстадийная оплата
В этом методе деньги клиента холдируются (замораживаются), после этого магазин должен подтвердить платеж или его отменить. Описание на https://developer.sberbank.ru/doc/v1/acquiring/rest-requests2pay
Регистрация платежа отличается только методом registerPreAuth.do.
$vars = array(); $vars['userName'] = 'логин'; $vars['password'] = 'пароль'; /* ID заказа в магазине */ $vars['orderNumber'] = '123'; /* Корзина для чека (необязательно) */ $cart = array( array( 'positionId' => 1, 'name' => 'Название товара', 'quantity' => array( 'value' => 1, 'measure' => 'шт' ), 'itemAmount' => 1 * (1000 * 100), 'itemCode' => '123456', 'tax' => array( 'taxType' => 0, 'taxSum' => 0 ), 'itemPrice' => 1000 * 100, ) ); $vars['orderBundle'] = json_encode( array( 'cartItems' => array( 'items' => $cart ) ), JSON_UNESCAPED_UNICODE ); /* Сумма заказа в копейках */ $vars['amount'] = 1000 * 100; /* URL куда клиент вернется в случае успешной оплаты */ $vars['returnUrl'] = 'http://example.com/success/'; /* URL куда клиент вернется в случае ошибки */ $vars['failUrl'] = 'http://example.com/error/'; /* Описание заказа, не более 24 символов, запрещены % + r n */ $vars['description'] = 'Заказ №' . $order_id . ' на example.com'; $ch = curl_init('https://3dsec.sberbank.ru/payment/rest/registerPreAuth.do?' . http_build_query($vars)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $res = curl_exec($ch); curl_close($ch);
PHP
Если запрос возвращает ошибку, то возможно в вашем аккаунте отключены двухстадийные платежи, включить их можно через службу поддержки.
После оплаты, платеж подтверждается методом deposit.do.
В этом методе сумма платежа может быть меньше исходной, в таком случаи остаток вернется клиенту.
$vars = array(); $vars['userName'] = 'логин'; $vars['password'] = 'пароль'; /* Номер заказа в платежной системе */ $vars['orderId'] = '70906e55-7114-41d6-8332-4609dc6590f4'; /* Сумма платежа в копейках, Если указать 0, то завершение произойдет на всю сумму. */ $vars['amount'] = 1000 * 100; /* Если в первом запросе была передана корзина, то её нужно продублировать */ $cart = array( array( 'positionId' => 1, 'name' => 'Название товара', 'quantity' => array( 'value' => 1, 'measure' => 'шт' ), 'itemAmount' => 1000 * 100, 'itemCode' => '123456', 'tax' => array( 'taxType' => 0, 'taxSum' => 0 ), 'itemPrice' => 1000 * 100, ) ); $vars['depositItems'] = json_encode( array( 'items' => $cart ), JSON_UNESCAPED_UNICODE ); $ch = curl_init('https://3dsec.sberbank.ru/payment/rest/deposit.do?' . http_build_query($vars)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $res = curl_exec($ch); curl_close($ch); $res = json_decode($res, JSON_OBJECT_AS_ARRAY); if (!empty($res['errorCode'])) { echo $res['errorMessage']; } else { echo 'Оплата завершена'; }
PHP
3
Информация о платеже
Методы getOrderStatus.do и getOrderStatusExtended.do возвращают данные о платеже.
$vars = array(); $vars['userName'] = 'логин'; $vars['password'] = 'пароль'; $vars['orderId'] = '70906e55-7114-41d6-8332-4609dc6590f4'; $ch = curl_init('https://3dsec.sberbank.ru/payment/rest/getOrderStatusExtended.do?' . http_build_query($vars)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $res = curl_exec($ch); curl_close($ch); $res = json_decode($res, JSON_OBJECT_AS_ARRAY); print_r($res);
PHP
Результат
Array
(
[errorCode] => 0
[errorMessage] => Успешно
[orderNumber] => 123
[orderStatus] => 1
[actionCode] => 0
[actionCodeDescription] =>
[amount] => 1000
[currency] => 643
[date] => 1540207733683
[orderDescription] => Заказ №123 на example.com
[ip] => 192.168.27.138
[merchantOrderParams] => Array()
[attributes] => Array(
[0] => Array(
[name] => mdOrder
[value] => 70906e55-7114-41d6-8332-4609dc6590f4
)
)
[cardAuthInfo] => Array(
[expiration] => 201912
[cardholderName] => CARDHOLDER NAME
[approvalCode] => 123456
[pan] => 411111XXXXXX1111
)
[authDateTime] => 1540207881419
[terminalId] => 123456
[authRefNum] => 111111111111
[paymentAmountInfo] => Array(
[paymentState] => APPROVED
[approvedAmount] => 1000
[depositedAmount] => 0
[refundedAmount] => 0
)
[bankInfo] => Array(
[bankName] => TEST CARD
[bankCountryCode] => RU
[bankCountryName] => Россия
)
)
Выведем информацию на странице:
<?php $orderStatus = array( 0 => 'Заказ зарегистрирован, но не оплачен', 1 => 'Предавторизованная сумма захолдирована (для двухстадийных платежей)', 2 => 'Проведена полная авторизация суммы заказа', 3 => 'Авторизация отменена', 4 => 'По транзакции была проведена операция возврата', 5 => 'Инициирована авторизация через ACS банка-эмитента', 6 => 'Авторизация отклонена', ); ?> Статус: <?php echo $orderStatus[$res['orderStatus']]; ?> Сумма регистрации: <?php echo $res['paymentAmountInfo']['approvedAmount'] / 100; ?> р. Сумма списания: <?php echo $res['paymentAmountInfo']['depositedAmount'] / 100; ?> р. Сумма возврата: <?php echo $res['paymentAmountInfo']['refundedAmount'] / 100; ?> р. Дата: <?php echo date('d.m.Y H:i:s', $res['date'] / 1000); ?> Карта: <?php echo $res['cardAuthInfo']['pan']; ?>, <?php echo $res['cardAuthInfo']['expiration']; ?>, <?php echo $res['cardAuthInfo']['cardholderName']; ?> Банк: <?php echo $res['bankInfo']['bankName']; ?>, <?php echo $res['bankInfo']['bankCountryName']; ?>
PHP
4
Отмена оплаты
Для запроса отмены оплаты заказа используется reverse.do. Функция отмены доступна в течение ограниченного времени после оплаты, точные сроки необходимо уточнять в Банке.
$vars = array(); $vars['userName'] = 'логин'; $vars['password'] = 'пароль'; $vars['orderId'] = '70906e55-7114-41d6-8332-4609dc6590f4'; $ch = curl_init('https://3dsec.sberbank.ru/payment/rest/reverse.do?' . http_build_query($vars)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $res = curl_exec($ch); curl_close($ch); $res = json_decode($res, JSON_OBJECT_AS_ARRAY); if (!empty($res['errorCode'])) { echo $res['errorMessage']; } else { echo 'Оплата отменена'; }
PHP
5
Возврат средств
Вызвав метод refund.do, средства будут возвращены плательщику. Система позволяет возвращать средства более одного раза, но в общей сложности не более первоначальной суммы списания.
// Сумма возврата. $sum = 500; $vars = array(); $vars['userName'] = 'логин'; $vars['password'] = 'пароль'; $vars['orderId'] = '70906e55-7114-41d6-8332-4609dc6590f4'; $vars['amount'] = $sum * 100; $ch = curl_init('https://3dsec.sberbank.ru/payment/rest/refund.do?' . http_build_query($vars)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $res = curl_exec($ch); curl_close($ch); $res = json_decode($res, JSON_OBJECT_AS_ARRAY); if (!empty($res['errorCode'])) { echo $res['errorMessage']; } else { echo $sum . 'р. возвращены плательщику'; }
PHP
03.08.22 — 21:21
Пытаюсь изучить внедрение API сбера в 1С для начала пока, что во внешней обработке дабы пройти всю этапность, и только потом внедрять в конфу.
Написав вот такой код, следуя инструкции Сбера для получения токена:
Функция ПолучитьКодированнуюСтроку(Логин, Пароль) Строка = Логин+":"+Пароль; Поток = Новый ПотокВПамяти; Запись = Новый ЗаписьДанных(Поток, КодировкаТекста.UTF8); Запись.ЗаписатьСимволы(Строка); Запись.Закрыть(); ДвоичныеДанные = Поток.ЗакрытьИПолучитьДвоичныеДанные(); Возврат Base64Строка(ДвоичныеДанные); КонецФункции &НаКлиенте Процедура Попытка2(Команда) ssl = Новый ЗащищенноеСоединениеOpenSSL( Новый СертификатКлиентаФайл("D:***сертификат***.p12", "***пароль***"), Новый СертификатыУдостоверяющихЦентровОС); Соединение = Новый HTTPСоединение("api.sberbank.ru",8443,,,,5,ssl,Ложь); rqUID = Строка(Новый УникальныйИдентификатор()); rqUID = СтрЗаменить(rqUID, "-",""); Логин = "*******-***-****-*******";// ClientId Пароль = "*******-***-****-*******";// SecretId Base64Логин = "Basic "+ПолучитьКодированнуюСтроку(Логин, Пароль); Заголовки = Новый Соответствие(); Заголовки.Вставить("authorization",Base64Логин); Заголовки.Вставить("accept","application/json"); Заголовки.Вставить("content-type","application/x-www-form-urlencoded"); Заголовки.Вставить("rqUID", rqUID); Запрос = Новый HTTPЗапрос("/prod/tokens/v2/oauth",Заголовки); Запрос.УстановитьТелоИзСтроки("{ ""grant_type"":""client_credentials"" , ""scope"" : ""https%3A%2F%2Fapi.sberbank.ru%2Forder.create""}"); Ответ = Соединение.ОтправитьДляОбработки(Запрос); СписокДоковПоФН = Ответ.ПолучитьТелоКакСтроку(); Сообщить(rqUID); КонецПроцедуры
Вылетает ошибка:
{«httpCode»:»400″, «httpMessage»:»Bad Request», «moreInformation»:»invalid_request»}
Разъяснение Сбера: В теле запроса ошибка в параметре grant_type
Однако по инструкции указано что в параметр тела grant_type установить client_credentials
А до этого всегда ловил ошибку 500, но после добавления в заголовки параметров accept и content-type начало выдавать ошибку 400.
Может ли кто подсказать, где у меня ошибка, либо можете направить на рабочий код получения токена, далее и создание QR кода на оплату.
1 — 03.08.22 — 21:34
(0) Мануал или ссылку на него выложи.
2 — 03.08.22 — 22:13
3 — 04.08.22 — 08:37
Может не полагаться на строку вбитую вручную? А то будешь три дня искать, где там запятая не по фэншую.
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
ЗаписатьJSON(Запись, СтруктураАтрибутов);
Результат = Запись.Закрыть();
Запрос.УстановитьТелоИзСтроки.УстановитьТелоИзСтроки(Результат);
4 — 04.08.22 — 09:56
(2) Ну так там же описано тело в примере. И оно не json
«grant_type=client_credentials&scope=https%3A%2F%2Fapi.sberbank.ru%2Forder.create»
5 — 04.08.22 — 09:58
(3) в таком режиме падает в 500 ошибку, хотя очень странно ведь тело с параметрами такое же получается
(4) установил тело в «grant_type=client_credentials&scope=https%3A%2F%2Fapi.sberbank.ru%2Forder.create» и ошибка другая {«httpCode»:»400″, «httpMessage»:»Bad Request», «moreInformation»:»unauthorized_client»}
6 — 04.08.22 — 10:00
(5) Ну значит ты не авторизировался. Разбирайся с Base64Логин = «Basic «+ПолучитьКодированнуюСтроку(Логин, Пароль);
7 — 04.08.22 — 10:07
СтрокаАвторизации = ПолучитьBase64СтрокуИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзСтроки(«»+Имя+»:»+Пароль,КодировкаТекста.UTF8,Ложь));
ЗаголовокHTTP.Вставить(«Authorization», «Basic «+СтрокаАвторизации);
8 — 04.08.22 — 10:18
(5) А где «x-ibm-client-id»?
9 — 04.08.22 — 10:20
(7) точно такая же строка получилась и соответствующая ошибка 400
(6) подозрение в том что эта ошибка указана именно в запросе «httpMessage»:»Bad Request»
Да и вроде по строению строки по инструкции все правильно
10 — 04.08.22 — 10:20
(8) а его я не могу найти в личном кабинете)))
11 — 04.08.22 — 11:45
(8) тем более судя по инструкции данный заголовок не обязательный…
12 — 04.08.22 — 12:06
(8) Разобрался с ошибкой оказалось в Base64Логин присутствовал символ переноса строки, ошибка с авторизацией ушла, появилась новая))
{«httpCode»:»400″, «httpMessage»:»Bad Request», «moreInformation»:»invalid_scope»}
Пробовал
Запрос.УстановитьТелоИзСтроки(«grant_type=client_credentials&scope=https://api.sberbank.ru/order.create»);
и так
Запрос.УстановитьТелоИзСтроки(«grant_type=client_credentials&scope=https%3A%2F%2Fapi.sberbank.ru%2Forder.create»);
Все равно ругается на scope, либо есть подозрение, что я вовсе не тот скоуп пытаюсь использовать
13 — 04.08.22 — 12:14
и с этим моментом разобрался)))
в инструкции имеются не точности — не правильный скоуп…
Необходимый был:
Запрос.УстановитьТелоИзСтроки(«grant_type=client_credentials&scope=https://api.sberbank.ru/qr/order.create»);
и токен получен….
14 — 04.08.22 — 12:14
(12) тоже в свое время знатно поломал голову — почему авторизация не проходила
токен для нужного скоупа получен?
15 — 04.08.22 — 12:29
(14) да
{«access_token»:»*******»,»expires_in»:»60″,»scope»:»https://api.sberbank.ru/qr/order.create»,»session_state»:»********»,»token_type»:»bearer»}
токен выдан для того скоупа который я запрашивал, а сберовцы в инструкции писали что скоуп должен быть: https://api.sberbank.ru/order.create и вылетало в ошибку не верного скоупа, возможно просто для моей учетки нет доступа для этого скоупа — не отрицаю.
16 — 04.08.22 — 12:34
(15) если что, то полную интеграцию со сбером прописывал. если вопросы будут. благо перешли на Райф, т.к. у них и поддержка адекватней и api-шка попроще. не без минусов конечно
17 — 04.08.22 — 12:40
(16) вопросов и так куча) это второй раз когда использую API, до этого только с ОФД запрашивал данные (там в разы проще). Был бы рад наглядному примеру поэтапности действий.
Пока в голове только этапность:
-получить токен
-создать заказ на QR
-статус оплаты
Нужна методика в коде))
18 — 04.08.22 — 12:52
(17) уже косяк в логике. получение токена на скоуп создания заказа, создание заказа, получение токена на скоуп статуса заказа, получение статуса заказа. к тому же жизнь токена емнп 60 сек. плюс для подстраховки сделал «технические» документы, где все инфа от сбера аккумулировалась с привязкой к документу оплаты
19 — 04.08.22 — 12:54
+ (18) там для возвратов дс исходная инфа как я помню требуется помимо id заказа.
20 — 04.08.22 — 12:59
(18) (19) ну технические доки я тоже планировал делать, но мне пока что хочется пройти весь этап получения оплаты, чтобы уже из этого развивать внедрение в магазинах своих. Можно получить как то эту интеграцию на эти этапности, чтобы не ломать голову что оказывается там символ переноса есть…
21 — 04.08.22 — 13:13
(20) первое предложение в (17). и, если планируется возврат ДС через СБП, то сразу учитывать этот момент на этапе планирования
22 — 04.08.22 — 13:13
+(21) т.е. в (18)
23 — 04.08.22 — 13:54
(0)
ЗначенияРеквизитов = ПолучитьЗначенияРеквизитов(ДокументОплаты, ДокументЗаказа, «Номер,Дата,СуммаДокумента,Организация,ПодразделениеКомпании»);
АдресЗапроса = «prod/qr/order/v3/creation»;
ВремяДаты = ?(СтрДлина(Формат(ТекущаяДата(), «ДЛФ=T»)) = 7, «0», «») + Формат(ТекущаяДата(), «ДЛФ=T»);
rq_tm = Формат(ТекущаяДата(), «ДФ=yyyy-MM-dd») + «T» + ВремяДаты + «Z»;
ВремяДаты = ?(СтрДлина(Формат(ЗначенияРеквизитов.Дата, «ДЛФ=T»)) = 7, «0», «») + Формат(ЗначенияРеквизитов.Дата, «ДЛФ=T»);
order_create_date = Формат(ЗначенияРеквизитов.Дата, «ДФ=yyyy-MM-dd») + «T» + ВремяДаты + «Z»;
description = «Оплата по документу » + ТипЗнч(ДокументЗаказа) + » №» + ЗначенияРеквизитов.Номер + » от » + ЗначенияРеквизитов.Дата; //!!!!! тут переделать по типу документа
order_params_type = «»;
СоставЗаказа = ПолучитьТоварыИУслуги(ДокументЗаказа);
Для Каждого СтрТоварУслуга Из СоставЗаказа Цикл
НаименованиеНоменклатуры = СтрЗаменить(Строка(СтрТоварУслуга.Номенклатура), «», «»);
СтруктураПараметровТ = Новый Структура;
СтруктураПараметровТ.Вставить(«position_name», НаименованиеНоменклатуры);
СтруктураПараметровТ.Вставить(«position_count», 1);
СтруктураПараметровТ.Вставить(«position_sum», СтрТоварУслуга.Сумма * 100);
СтруктураПараметровТ.Вставить(«position_description», НаименованиеНоменклатуры);
JSON_Т = ОбработатьПараметрыЗапроса(СтруктураПараметровТ, «ЧРД=.; ЧГ=»);
order_params_type = ?(ПустаяСтрока(order_params_type), JSON_Т, order_params_type + «,» + JSON_Т);
КонецЦикла;
СтруктураПараметров = Новый Структура;
СтруктураПараметров.Вставить(«rq_uid», СтрЗаменить(Новый УникальныйИдентификатор, «-«, «»));
СтруктураПараметров.Вставить(«rq_tm», rq_tm);
СтруктураПараметров.Вставить(«member_id», НастройкиПодключения.MemberId);
СтруктураПараметров.Вставить(«order_number», ЗначенияРеквизитов.Номер);
СтруктураПараметров.Вставить(«order_create_date», order_create_date);
СтруктураПараметров.Вставить(«order_params_type», «[» + order_params_type + «]»);
СтруктураПараметров.Вставить(«id_qr», НастройкиПодключения.TerminalID);
СтруктураПараметров.Вставить(«order_sum», ЗначенияРеквизитов.СуммаДокумента * 100);
СтруктураПараметров.Вставить(«currency», «643»);
СтруктураПараметров.Вставить(«description», description);
СтруктураПараметров.Вставить(«sbp_member_id», «100000000111»);
JSON = ОбработатьПараметрыЗапроса(СтруктураПараметров, «ЧРД=.; ЧГ=»);
JSON = СтрЗаменить(JSON, «»»[«, «[«);
JSON = СтрЗаменить(JSON, «]»»», «]»);
СтруктураРезультата = ВызватьPOSTЗапрос(АдресЗапроса, JSON, «/qr/order.create», «OrderCreateQrRq», НастройкиПодключения);КонецПроцедуры
Готовый блок получения заказа в СБП Сбера.
Если нужен ни СБП а Плати QR то там ещё один параметр надо передавать.
24 — 04.08.22 — 14:02
(23) Спасибо буду разбираться)
25 — 04.08.22 — 14:50
(23) а можно приложить и вложенные процедуры/функции типа ОбработатьПараметрыЗапроса и т.д.?)))
26 — 05.08.22 — 11:34
(21) (23) Подскажите, сформировал структуру тела, сделал с нее json, но не понимаю как это засунуть в тело запроса, с токен стало понятно, что указывать надо не json тело, а на запрос создание qr тут же уже структура.
27 — 05.08.22 — 12:03
(26)
#Область ФормированиеJSONСтруктурыДляТелаЗапроса
JSON_Структура_Тело = ПодготовитьТелоЗапроса_OrderCreateQr(ВходныеДанные[«ВидОплатыПоQR»],
rqUID,
rqTm,
ДополнительныеПараметры,
Результат_Заказ_ПлатиQR_СБП_Сбербанк);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, JSON_Структура_Тело);
ТелоHTTPЗапроса = ЗаписьJSON.Закрыть();
Результат[«ТелоЗапроса»] = ТелоHTTPЗапроса;
#КонецОбласти
#Область ИнициализацияHTTPЗапроса
Заголовки = Новый Соответствие;
Заголовки.Вставить(«Authorization», СформироватьАвторизационныеДанные_BearerScheme(token));
Заголовки.Вставить(«RqUID» , rqUID);
Заголовки.Вставить(«Content-Type» , «application/json»);
Заголовки.Вставить(«accept» , «application/json»);
HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса, Заголовки);
HTTPЗапрос.УстановитьТелоИзСтроки(ТелоHTTPЗапроса,, ИспользованиеByteOrderMark.НеИспользовать);
#КонецОбласти
28 — 05.08.22 — 12:04
+(27) это на создание заказа
29 — 05.08.22 — 15:07
(28) то ли пятница) то ли так жарко, что мозги плывут)
Не понимаю, почему ругается
{«httpCode»:»400″,»httpMessage»:»Bad Request»,»moreInformation»:»Body of the request is not valid according to json schema»}
ДатаДокумента = Дата("04.08.2022 15:00:00");
НомерЗаказа = "МВУТ-000005";
rq_uid = СтрЗаменить(НОвый УникальныйИдентификатор(),"-","");
ВремяДаты = ?(СтрДлина(Формат(ТекущаяДата(), "ДЛФ=T")) = 7, "0", "") + Формат(ТекущаяДата(), "ДЛФ=T");
rq_tm = Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd") + "T" + ВремяДаты + "Z";
member_id = "******";
order_number = НомерЗаказа;
ВремяДаты = ?(СтрДлина(Формат(ДатаДокумента, "ДЛФ=T")) = 7, "0", "") + Формат(ДатаДокумента, "ДЛФ=T");
order_create_date = Формат(ДатаДокумента, "ДФ=yyyy-MM-dd") + "T" + ВремяДаты + "Z";
order_params_type = "";ПолучитьСоставДокумента(НомерЗаказа);
Для Каждого СтрТоварУслуга Из СоставЗаказа Цикл
НаименованиеНоменклатуры = СтрЗаменить(Строка(СтрТоварУслуга.Номенклатура), "", "");
НаименованиеХарактеристики = СтрЗаменить(Строка(СтрТоварУслуга.Характеристика), "", "");
НаименованиеДляПередачи = НаименованиеНоменклатуры+" ("+НаименованиеХарактеристики+")";СтруктураПараметровТ = Новый Структура;
СтруктураПараметровТ.Вставить("position_name", НаименованиеДляПередачи);
СтруктураПараметровТ.Вставить("position_count", СтрТоварУслуга.Количество);
СтруктураПараметровТ.Вставить("position_sum", СтрТоварУслуга.Сумма*100);
СтруктураПараметровТ.Вставить("position_description", НаименованиеДляПередачи);JSON_Т = ОбработатьПараметрыЗапроса(СтруктураПараметровТ);
order_params_type = ?(ПустаяСтрока(order_params_type), JSON_Т, order_params_type + "," + JSON_Т);КонецЦикла;
СтруктураПараметровТела = Новый Структура;
СтруктураПараметровТела.Вставить("rq_uid", rq_uid);
СтруктураПараметровТела.Вставить("rq_tm", rq_tm);
СтруктураПараметровТела.Вставить("member_id", member_id);
СтруктураПараметровТела.Вставить("order_number", order_number);
СтруктураПараметровТела.Вставить("order_create_date", order_create_date);
СтруктураПараметровТела.Вставить("order_params_type", "[" + order_params_type + "]");
//СтруктураПараметровТела.Вставить("id_qr", "1000100051"); // неизвестная переменная
СтруктураПараметровТела.Вставить("order_sum", 399500);
СтруктураПараметровТела.Вставить("currency", "643");
СтруктураПараметровТела.Вставить("description", "Оплата клиентом розничного чека №"+НомерЗаказа+"");
СтруктураПараметровТела.Вставить("scope", "https://api.sberbank.ru/qr/order.create");Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
Запись.ЗаписатьНачалоОбъекта();
Для каждого Значение Из СтруктураПараметровТела Цикл
Запись.ЗаписатьИмяСвойства(Значение.Ключ);
Запись.ЗаписатьЗначение(Значение.Значение);
КонецЦикла;
Запись.ЗаписатьКонецОбъекта();
JSON = Запись.Закрыть();
JSON = СтрЗаменить(JSON, """[", "[");
JSON = СтрЗаменить(JSON, "]""", "]");// получение токена с авторизацией
ssl = Новый ЗащищенноеСоединениеOpenSSL(
Новый СертификатКлиентаФайл("*****", "****"),
Новый СертификатыУдостоверяющихЦентровОС);Соединение = Новый HTTPСоединение("api.sberbank.ru",8443,,,,5,ssl,Ложь);
Заголовки = Новый Соответствие();
Заголовки.Вставить("authorization", "Bearer "+токен);
Заголовки.Вставить("accept","application/json");
Заголовки.Вставить("content-type","application/x-www-form-urlencoded");
Заголовки.Вставить("rqUID", ИдентификаторЗапросаТокена);JSON = СтрЗаменить(JSON, "rn", "");
JSON = СтрЗаменить(JSON, "rn", "");
JSON = СтрЗаменить(JSON, "", "");Запрос = Новый HTTPЗапрос("/prod/qr/order/v3/creation",Заголовки);
//Запрос.УстановитьТелоИзСтроки("grant_type=client_credentials&scope=https://api.sberbank.ru/qr/order.create"); // , ""scope"" : ""https%3A%2F%2Fapi.sberbank.ru%2Forder.create""
Запрос.УстановитьТелоИзСтроки(JSON,,ИспользованиеByteOrderMark.НеИспользовать);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
СписокДоковПоФН = Ответ.ПолучитьТелоКакСтроку();
30 — 05.08.22 — 16:24
(29) «СтруктураПараметровТела.Вставить(«order_params_type», «[» + order_params_type + «]»);» и » JSON = СтрЗаменить(JSON, «»»[«, «[«);» это что еще за чушь?
с чего там будет application/x-www-form-urlencoded?
31 — 05.08.22 — 16:24
и да. передача товарной корзины вообще не обязательна. к тому же они в итоге нигде не отображается
32 — 05.08.22 — 16:27
неужели трудно все сделать по https://api.developer.sber.ru/product/PlatiQR/doc/v1/8024874223 ? там даже примеры есть итогового тела. загоните свое сформированное тело в какой-нибудь онлайн json редактор или в notepad++ и сравните
33 — 05.08.22 — 16:32
(32) 1С само умеет форматировать JSON, не обязательно искать что-то внешнее.
34 — 05.08.22 — 16:48
(33) я эт к тому написал, что бы человек сравнил свое тело с эталонным
35 — 05.08.22 — 17:49
(34) Где это найти «id_qr»? (для операции «QR-код СБП»: tid (Уникальный идентификатор терминала).) (если из за него конечно ругательства)
Весь ЛК облазил.
+ скоуп в этом случае где указывается? я в структуру тела уже пробовал засунуть.
+ убрал формирование товарных позиций и добавил sbp_member_id пока ошибка та же
36 — 05.08.22 — 18:03
(32)
сравнил свое тело с примером, явных отличий не увидел, кроме добавленного скоупа и sbp_member_id, ну и не понятно где брать id_qr
{
«rq_uid»: «13bec0923259410f947c143fea58d55d»,
«rq_tm»: «2022-08-05T17:58:13Z»,
«member_id»: «00001652»,
«order_number»: «123456»,
«order_create_date»: «2022-08-04T15:00:00Z»,
«id_qr»: «2f618d9c-f22f-4e50-9bd5-ce5db7027397»,
«order_sum»: 399500,
«currency»: «643»,
«description»: «Оплата клиентом розничного чека №123456»,
«scope»: «https://api.sberbank.ru/qr/order.create»,
«sbp_member_id»: «100000000111»
}
37 — 08.08.22 — 08:05
(36) ОписаниеТелаЗапроса.Вставить(«id_qr», «»); // string(36): Идентификатор устройства, на котором сформирован заказ.
// Правила заполнения:
// для операции «QR-код Продавца»: IdQR (Уникальный идентификатор устройства в системе «Плати QR»);
// для операции «QR-код СБП»: tid (Уникальный идентификатор терминала).
эта данные сам Сбер предоставляет
38 — 10.08.22 — 11:37
(37) Только получил id_qr от сбера, но вылетала все равно ошибка, и просто удалил указание скоупа, все заработало, получил все необходимые данные.
И запрос статус успешно произвел.
Отсюда вопросы: судя по тому что есть действия с неоплаченными заказами их необходимо будет постоянно удалять или они со временем автоматически аннулируются сами?
и я правильно понял, что для каждого скоупа необходим запрос отдельного токена?
создание — свой токен
статус — свой токен
отмена/возврат — свой токен и т.д.
39 — 10.08.22 — 11:54
(38) 1. вот почему и отсылал к сравнению сформированного тела и эталона.
2. вот хз — есть ли срок жизни заказа у Сбера или нет. но сервис для отмены неоплаченных заказов у них тоже был
3. да. на каждую область. более того. полученный токен имеет срок жизни (60 сек.). поэтому нужно сразу закладывать момент, что при каждом чихе сперва придется получить токен и потом выполнять операцию. даже если она повторяется через какой то промежуток времени, ибо есть шанс не успеть в рамках жизни токена.
40 — 10.08.22 — 16:01
(39) для полного понимания))
RqUID (Уникальный идентификатор запроса) используется в каждом запросе, вопрос таков в пределах одного заказа идентификатор должен быть одинаковый?
в каждом запросе есть идентификатор в заголовке и в теле, так вот в пределах запроса одинаковый и/или не важно какой запрос идентификатор должен быть одинаковый в любом из запросов
ИЛИ же )))
в заголовке и теле он должен быть одинаковый а в различных запросах разный (создание заказа — один, а при проверке статуса — другой)
Даже пишу запутанно, т.к. не понимаю как строить структуру интеграции с участием этого идентификатора
41 — 10.08.22 — 16:23
(40) RqUID в заголовках и rq_uid в теле — это один и тот же id. я туда guid пропихивал, в котором удалял «-«, т.к. ограничение по длине в 32 символа + ограничения шаблона. этот id уникален должен быть уникален для запроса. т.е. получение токена — один id, последующее создание заказа — другой id
42 — 16.08.22 — 10:30
Доброго дня токен с трудом получили, но при создании заказа 401 Unauthorized Not registered to plan
Хотя все по инструкции…
43 — 16.08.22 — 10:55
(42) могу только предположить, что не подключили api оплат по qr для своего приложения в личном кабинете для пространства организации.
44 — 16.08.22 — 11:05
спасибо за совет, тема новая … инструкции …
45 — 16.08.22 — 11:43
(44) не все так прозрачно описано в документации конечно и в каких то непонятных ситуациях лучше в саппорт писать. но вот общение с ними полный рандом и ппц, если речь идет про сервис оплат по QR. порой быстро и адекватно отвечают, а порой чуть ли не прямым текстом приходится писать «перечитайте исходный вопрос» и вот только тогда соизволят предоставить ответ на поставленный вопрос. а вот поддержка интернет-эквайринга от них оставила только положительные впечатления.
46 — 17.08.22 — 21:13
Добого всем, после обращения в тех поддержку появилась новая ошибка, спасибо за поддержку
Body of the request is not valid according to json schema
47 — 18.08.22 — 08:10
(46) ну черным по белому написано же, что структура json некорректна. открываем два окна: в одном эталонное из документации, в другом собственноручно сформированное. смотрим и делаем вывода. читаем внимательней документацию
48 — 19.08.22 — 19:13
Запросы получились, всем спасибо)
49 — 09.09.22 — 11:30
(42)
[401 Unauthorized Not registered to plan]
Добрый день. Как решили такую проблему? Что-то неправильно в запросе, или настройки в личном кабиненте?
50 — 09.09.22 — 12:55
(49) проверьте в лк, что подписали свое приложение на нужные API
51 — 09.09.22 — 13:03
(44) Нафига все это? Вроде у сбера сейчас прошивки для эквайринговых терминалов поддерживают СБП. Там даже делать ничего не надо в софте. Подключаешь его в 1С как обычный эквайринговый терминал.
52 — 09.09.22 — 13:28
(51)
[поддерживают СБП]
это не СБП, а SberQR.
Там только в 3 банках можно оплачивать.
Урезанная реализация.
arsik
53 — 09.09.22 — 13:34
(52) Жаль. Я думал там полноценный СБП (в столовке просто видел). Тот кто натянет полноценный СБП на свои терминалы озолотится.
Информация о статусе сервера обновлена только что.
Проверить снова
Что делать, если сайт недоступен?
Api.sberbank.ru не работает сегодня июнь 2023?
Узнайте, работает ли Api.sberbank.ru в нормальном режиме или есть проблемы сегодня
Статус Api.sberbank.ru : нет сбоя
0 комментариев
Сообщить о сбое в соцсетях:
Api.sberbank.ru сбои за последние 24 часа
Не работает Api.sberbank.ru?
Не открывается, не грузится, не доступен, лежит или глючит?
Самые частые проблемы Api.sberbank.ru
Не определены.
Что делать, если сайт API.SBERBANK.RU недоступен?
Если API.SBERBANK.RU работает, однако вы не можете получить доступ к сайту или отдельной его странице, попробуйте одно из возможных решений:
Кэш браузера.
Чтобы удалить кэш и получить актуальную версию страницы, обновите в браузере страницу с помощью комбинации клавиш Ctrl + F5.
Блокировка доступа к сайту.
Очистите файлы cookie браузера и смените IP-адрес компьютера.
Антивирус и файрвол.
Проверьте, чтобы антивирусные программы (McAfee, Kaspersky Antivirus или аналог) или файрвол, установленные на ваш компьютер — не блокировали доступ к API.SBERBANK.RU.
DNS-кэш.
Очистите DNS-кэш на вашем компьютере и повторите попытку доступа на сайт.
Смотреть видео-инструкцию ↓
VPN и альтернативные службы DNS.
VPN: например, мы рекомендуем NordVPN.
Альтернативные DNS: OpenDNS или Google Public DNS.
Плагины браузера.
Например, расширение AdBlock вместе с рекламой может блокировать содержимое сайта. Найдите и отключите похожие плагины для исследуемого вами сайта.
Сбой драйвера микрофона
Быстро проверить микрофон: Тест Микрофона.
Форум пользователей Api.sberbank.ru
Подсказки? Разочарования? Обсуждаем проблемы сервиса с другими посетителями сайта:
Чат с регистрацией
идентификация не требуется
комментарии с нецензурной лексикой и оскорблениями удаляются
[Sber|Request URL] https://securepayments.sberbank.ru/payment/rest/register.do [Sber|Request headers] {content-type: application/x-www-form-urlencoded} [Sber|RawRequest] {orderNumber: test, amount: 15100, returnUrl: https://test.ru/return.html, pageView: MOBILE, userName: T2**********0-api, password: T2**********0} [Sber|RawResponse] 200 | {"errorCode":"5","errorMessage":"Access denied"} [Sber|RawResponse] {"errorCode":"5","errorMessage":"Access denied"} [Sber|Response] RegisterResponse(errorCode: 5, errorMessage: Access denied, orderId: null, formUrl: null, externalParams: null)
В чем может быть проблема? Логин/пароль отправляю корректный
| Код ответа | Расшифровка кода ответа | Сообщение на платёжной странице |
|---|---|---|
| -20010 | Транзакция отклонена по причине того, что размер платежа превысил установленные лимиты Банком-эмитентом. | Операция отклонена. Обратитесь в банк, выпустивший карту. |
| -9000 | Состояние начала транзакции. | Операция отклонена. Обратитесь в магазин. |
| -2101 | Блокировка по e-mail | Операция отклонена. Обратитесь в магазин. |
| -2020 | Получен неверный ECI. Код выставляется в том случае, если пришедший в PaRes ECI не соответствует допустимому значению для данной МПС. Правило работает только для MasterCard (01,02) и Visa (05,06), где значения в скобках — допустимые для МПС. | Операция отклонена. Обратитесь в банк, выпустивший карту. |
| -2019 | PARes от эмитента содержит iReq, вследствие чего платёж был отклонён. | Операция отклонена. Обратитесь в банк, выпустивший карту. |
| -2018 | Directory server Visa или MasterCard либо недоступен, либо в ответ на запрос вовлечённости карты (VeReq) пришла ошибка связи. Это ошибка взаимодействия платёжного шлюза и серверов МПС по причине технических неполадок на стороне последних. | Операция отклонена. Обратитесь в банк, выпустивший карту. |
| -2017 | Отклонено. Статус PARes-а не «Y». | Операция отклонена. Обратитесь в магазин. |
| -2016 | Банк-эмитент не смог определить, является ли карта 3dsecure. | Операция отклонена. Обратитесь в банк, выпустивший карту. |
| -2015 | VERes от DS содержит iReq, вследствие чего платёж был отклонён. | Операция отклонена. Обратитесь в банк, выпустивший карту. |
| -2013 | Исчерпаны попытки оплаты. | Операция отклонена. Проверьте введённые данные, достаточность средств на карте и повторите операцию. |
| -2012 | Данная операция не поддерживается. | Операция отклонена. Обратитесь в банк, выпустивший карту. |
| -2011 | Банк-эмитент не смог провести авторизацию 3dsecure-карты. | Операция отклонена. Обратитесь в банк, выпустивший карту. |
| -2010 | Несовпадение XID. | Операция отклонена. Обратитесь в магазин. |
| -2007 | Истёк срок, отведённый на ввод данных карты с момента регистрации платежа (таймаут по умолчанию — 20 минут; продолжительность сессии может быть указана при регистрации заказа; если у мерчанта установлена привилегия «Нестандартная продолжительность сессии», то берётся период, указанный в настройках мерчанта). | Истёк срок ожидания ввода данных. |
| -2006 | Означает, что эмитент отклонил аутентификацию (3DS авторизация не пройдена). | Операция невозможна. Аутентификация держателя карты завершена неуспешно. |
| -2005 | Означает, что мы не смогли проверить подпись эмитента, то есть PARes был читаемый, но подписан неверно. | Операция отклонена. Обратитесь в банк, выпустивший карту. |
| -2003 | Блокировка по порту. | Операция отклонена. Обратитесь в магазин. |
| -2002 |
Примечание: имеется в виду либо лимиты Банка-эквайера на дневной оборот Магазина, либо лимиты Магазина на оборот по одной карте, либо лимит Магазина по одной операции. | Операция отклонена. Обратитесь в магазин. |
| -2001 | Транзакция отклонена по причине того, что IP-адрес Клиента внесён в чёрный список. | Операция отклонена. Обратитесь в магазин. |
| -2000 | Транзакция отклонена по причине того, что карта внесена в чёрный список. | Операция отклонена. Обратитесь в магазин. |
| -100 | Не было попыток оплаты. | — |
| 0 | Платёж успешно прошёл. | — |
| 1 | Для успешного завершения транзакции требуется подтверждение личности. В случае интернет-транзакции (соот-но и в нашем) невозможно, поэтому считается как declined. | Операция отклонена. Обратитесь в банк, выпустивший карту. |
| 5 | Отказ сети проводить транзакцию. | Операция отклонена. Обратитесь в банк, выпустивший карту. |
| 15 | МПС не смогла определить эмитента карты. | Ошибка проведения платежа. Попробуйте позднее. Если данная ошибка возникла повторно, обратитесь в Ваш банк для разъяснения причин. Телефон банка должен быть указан на обратной стороне карты. |
| 53 | Карты не существует в системах процессинга. | Операция отклонена. Обратитесь в магазин. |
| 81 | DECLINED_BY_PINPROC | Операция отклонена. Обратитесь в банк, выпустивший карту. |
| 100 | Ограничение по карте (Банк эмитент запретил интернет транзакции по карте). | Операция отклонена. Обратитесь в банк, выпустивший карту. |
| 101 | Истёк срок действия карты. | Операция отклонена. Проверьте введённые данные, достаточность средств на карте и повторите операцию. |
| 103 | Нет связи с Банком-Эмитентом. Торговой точке необходимо связаться с банком-эмитентом. | Операция отклонена. Обратитесь в банк, выпустивший карту. |
| 104 | Попытка выполнения операции по счёту, на использование которого наложены ограничения. | Операция отклонена. Обратитесь в банк, выпустивший карту. |
| 106 | Превышено допустимое число попыток ввода ПИН. Вероятно карта временно заблокирована. | Операция отклонена. Обратитесь в магазин. |
| 107 | Следует обратиться к Банку-Эмитенту. | Операция отклонена. Обратитесь в банк, выпустивший карту. |
| 109 | Неверно указан идентификатор продавца/терминала или АСС заблокирован на уровне процессинга. | Операция отклонена. Обратитесь в магазин. |
| 110 | Неверно указана сумма транзакции. | Операция отклонена. Обратитесь в магазин. |
| 111 | Неверный номер карты. | Операция отклонена. Обратитесь в банк, выпустивший карту. |
| 116 | Сумма транзакции превышает доступный остаток средств на выбранном счёте. | Операция отклонена. Проверьте введённые данные, достаточность средств на карте и повторите операцию. |
| 118 | Сервис не разрешён (отказ от эмитента). | Операция отклонена. Обратитесь в банк, выпустивший карту. |
| 119 | Транзакция незаконна. | Операция отклонена. Обратитесь в банк, выпустивший карту. |
| 120 | Отказ в проведении операции — транзакция не разрешена эмитентом. Код ответа платёжной сети — 57. Причины отказа необходимо уточнять у эмитента. | Операция отклонена. Обратитесь в банк, выпустивший карту. |
| 121 | Предпринята попытка выполнить транзакцию на сумму, превышающую дневной лимит, заданный банком-эмитентом. | Операция отклонена. Обратитесь в банк, выпустивший карту. |
| 123 | Превышен лимит на число транзакций: клиент выполнил максимально разрешённое число транзакций в течение лимитного цикла и пытается провести ещё одну. | Операция отклонена. Обратитесь в банк, выпустивший карту. |
| 125 | Неверный номер карты. Подобная ошибка может означать ряд вещей: Попытка возврата на сумму, больше холда, попытка возврата нулевой суммы. Для AmEx — неверно указан срок действия карты. | Операция отклонена. Проверьте введённые данные, достаточность средств на карте и повторите операцию. |
| 208 | Карта утеряна. | Операция отклонена. Обратитесь в магазин. |
| 209 | Превышены ограничения по карте. | Операция отклонена. Обратитесь в магазин. |
| 400 | Реверсал обработан. | — |
| 902 | Ограничение по карте (Владелец карты пытается выполнить транзакцию, которая для него не разрешена). | Операция отклонена. Обратитесь в банк, выпустивший карту. |
| 903 | Предпринята попытка выполнить транзакцию на сумму, превышающую лимит, заданный банком-эмитентом. | Операция отклонена. Обратитесь в банк, выпустивший карту. |
| 904 | Ошибочный формат сообщения с точки зрения банка эмитента. | Операция отклонена. Обратитесь в банк, выпустивший карту. |
| 907 | Нет связи с Банком, выпустившим Вашу карту. Для данного номера карты не разрешена авторизация в режиме stand-in (этот режим означает, что эмитент не может связаться с платёжной сетью и поэтому транзакция возможна либо в оффлайне с последующей выгрузкой в бэк офис, либо она будет отклонена). | Нет связи с банком. Повторите позже. |
| 909 | Невозможно провести операцию (Ошибка функционирования системы, имеющая общий характер. Фиксируется платёжной сетью или банком-эмитентом). | Операция отклонена. Обратитесь в банк, выпустивший карту. |
| 910 | Банк-эмитент недоступен. | Нет связи с банком. Повторите позже. |
| 913 | Неверный формат сообщения (Неправильный формат транзакции с точки зрения сети). | Операция отклонена. Обратитесь в банк, выпустивший карту. |
| 914 | Не найдена транзакция (когда посылается завершение или reversal или refund). | Операция отклонена. Обратитесь в магазин. |
| 999 | Отсутствует начало авторизации транзакции. Отклонено по фроду или ошибка 3dsec. После получения этого кода ответа дальнейшие попытки проведения платежа отклоняются. | Операция отклонена. Обратитесь в магазин. |
| 1001 | Пусто (Выставляется в момент регистрации транзакции, т.е. когда еще по транзакции не было введено данных карт). | Не получен ответ от банка. Повторите позже. |
| 2002 | Неверная операция. | Операция отклонена. Обратитесь в магазин. |
| 2003 | SSL (Не 3d-Secure/SecureCode) транзакции запрещены Магазину. | Операция отклонена. Обратитесь в магазин. |
| 2004 | Оплата через SSL без ввода CVС2 запрещена. | Операция отклонена. Обратитесь в магазин. |
| 2005 | Платёж не соответствует условиям правила проверки по 3ds. | Операция отклонена. Обратитесь в магазин. |
| 2006 | Однофазные платежи запрещены. | Операция отклонена. Обратитесь в магазин. |
| 2008 | Транзакция ещё не завершена. | Операция отклонена. Обратитесь в магазин. |
| 2009 | Сумма возврата превышает сумму оплаты. | Операция отклонена. Обратитесь в магазин. |
| 2014 | Ошибка выполнения 3DS-правила. | Операция отклонена. Обратитесь в магазин. |
| 2015 | Ошибка выполнения правила выбора терминала (правило некорректно). | Операция отклонена. Обратитесь в магазин. |
| 2016 | Мерчант не имеет разрешения на 3-D Secure, необходимое для проведения платежа. | Операция отклонена. Обратитесь в магазин. |
| 2023 | Очередь на запросов на обработку в процессинг превысила допустимый лимит. | Ошибка проведения платежа. Попробуйте позднее. |
| 4005 | Заказ отклонён продавцом. | Отклонено продавцом. |
| 71015 | Введены неправильные параметры карты. | Операция отклонена. Проверьте введённые данные, достаточность средств на карте и повторите операцию. |
| 151018 | Таймаут в процессинге. Не удалось отправить. | Не получен ответ от банка. Повторите позже. |
| 151019 | Таймаут в процессинге. Удалось отправить, но не получен ответ от банка. | Не получен ответ от банка. Повторите позже. |
| 341014 | Код отказа РБС. | Операция отклонена. Обратитесь в магазин. |
