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) Жаль. Я думал там полноценный СБП (в столовке просто видел). Тот кто натянет полноценный СБП на свои терминалы озолотится.
|
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