|
СБП и API Сбербанка | ☑ | ||
---|---|---|---|---|
0
orensymrak
03.08.22
✎
21:21
|
Пытаюсь изучить внедрение API сбера в 1С для начала пока, что во внешней обработке дабы пройти всю этапность, и только потом внедрять в конфу.
Написав вот такой код, следуя инструкции Сбера для получения токена:
Вылетает ошибка: {"httpCode":"400", "httpMessage":"Bad Request", "moreInformation":"invalid_request"} Разъяснение Сбера: В теле запроса ошибка в параметре grant_type Однако по инструкции указано что в параметр тела grant_type установить client_credentials А до этого всегда ловил ошибку 500, но после добавления в заголовки параметров accept и content-type начало выдавать ошибку 400. Может ли кто подсказать, где у меня ошибка, либо можете направить на рабочий код получения токена, далее и создание QR кода на оплату. |
|||
1
arsik
гуру
03.08.22
✎
21:34
|
(0) Мануал или ссылку на него выложи.
|
|||
2
orensymrak
03.08.22
✎
22:13
|
||||
3
Lexandr
04.08.22
✎
08:37
|
Может не полагаться на строку вбитую вручную? А то будешь три дня искать, где там запятая не по фэншую.
Запись = Новый ЗаписьJSON; Запись.УстановитьСтроку(); ЗаписатьJSON(Запись, СтруктураАтрибутов); Результат = Запись.Закрыть(); Запрос.УстановитьТелоИзСтроки.УстановитьТелоИзСтроки(Результат); |
|||
4
arsik
гуру
04.08.22
✎
09:56
|
(2) Ну так там же описано тело в примере. И оно не json
"grant_type=client_credentials&scope=https%3A%2F%2Fapi.sberbank.ru%2Forder.create" |
|||
5
orensymrak
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
arsik
гуру
04.08.22
✎
10:00
|
(5) Ну значит ты не авторизировался. Разбирайся с Base64Логин = "Basic "+ПолучитьКодированнуюСтроку(Логин, Пароль);
|
|||
7
Lexandr
04.08.22
✎
10:07
|
СтрокаАвторизации = ПолучитьBase64СтрокуИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзСтроки(""+Имя+":"+Пароль,КодировкаТекста.UTF8,Ложь));
ЗаголовокHTTP.Вставить("Authorization", "Basic "+СтрокаАвторизации); |
|||
8
arsik
гуру
04.08.22
✎
10:18
|
(5) А где "x-ibm-client-id"?
|
|||
9
orensymrak
04.08.22
✎
10:20
|
(7) точно такая же строка получилась и соответствующая ошибка 400
(6) подозрение в том что эта ошибка указана именно в запросе "httpMessage":"Bad Request" Да и вроде по строению строки по инструкции все правильно |
|||
10
orensymrak
04.08.22
✎
10:20
|
(8) а его я не могу найти в личном кабинете)))
|
|||
11
orensymrak
04.08.22
✎
11:45
|
(8) тем более судя по инструкции данный заголовок не обязательный...
|
|||
12
orensymrak
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
orensymrak
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
orensymrak
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
orensymrak
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
orensymrak
04.08.22
✎
12:59
|
(18) (19) ну технические доки я тоже планировал делать, но мне пока что хочется пройти весь этап получения оплаты, чтобы уже из этого развивать внедрение в магазинах своих. Можно получить как то эту интеграцию на эти этапности, чтобы не ломать голову что оказывается там символ переноса есть...
|
|||
21
Кир Пластелинин
04.08.22
✎
13:13
|
(20) первое предложение в (17). и, если планируется возврат ДС через СБП, то сразу учитывать этот момент на этапе планирования
|
|||
22
Кир Пластелинин
04.08.22
✎
13:13
|
+(21) т.е. в (18)
|
|||
23
Aswed
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
orensymrak
04.08.22
✎
14:02
|
(23) Спасибо буду разбираться)
|
|||
25
orensymrak
04.08.22
✎
14:50
|
(23) а можно приложить и вложенные процедуры/функции типа ОбработатьПараметрыЗапроса и т.д.?)))
|
|||
26
orensymrak
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
orensymrak
05.08.22
✎
15:07
|
(28) то ли пятница) то ли так жарко, что мозги плывут)
Не понимаю, почему ругается {"httpCode":"400","httpMessage":"Bad Request","moreInformation":"Body of the request is not valid according to json schema"}
|
|||
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
orensymrak
05.08.22
✎
17:49
|
(34) Где это найти "id_qr"? (для операции "QR-код СБП": tid (Уникальный идентификатор терминала).) (если из за него конечно ругательства)
Весь ЛК облазил. + скоуп в этом случае где указывается? я в структуру тела уже пробовал засунуть. + убрал формирование товарных позиций и добавил sbp_member_id пока ошибка та же |
|||
36
orensymrak
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
orensymrak
10.08.22
✎
11:37
|
(37) Только получил id_qr от сбера, но вылетала все равно ошибка, и просто удалил указание скоупа, все заработало, получил все необходимые данные.
И запрос статус успешно произвел. Отсюда вопросы: судя по тому что есть действия с неоплаченными заказами их необходимо будет постоянно удалять или они со временем автоматически аннулируются сами? и я правильно понял, что для каждого скоупа необходим запрос отдельного токена? создание - свой токен статус - свой токен отмена/возврат - свой токен и т.д. |
|||
39
Кир Пластелинин
10.08.22
✎
11:54
|
(38) 1. вот почему и отсылал к сравнению сформированного тела и эталона.
2. вот хз - есть ли срок жизни заказа у Сбера или нет. но сервис для отмены неоплаченных заказов у них тоже был 3. да. на каждую область. более того. полученный токен имеет срок жизни (60 сек.). поэтому нужно сразу закладывать момент, что при каждом чихе сперва придется получить токен и потом выполнять операцию. даже если она повторяется через какой то промежуток времени, ибо есть шанс не успеть в рамках жизни токена. |
|||
40
orensymrak
10.08.22
✎
16:01
|
(39) для полного понимания))
RqUID (Уникальный идентификатор запроса) используется в каждом запросе, вопрос таков в пределах одного заказа идентификатор должен быть одинаковый? в каждом запросе есть идентификатор в заголовке и в теле, так вот в пределах запроса одинаковый и/или не важно какой запрос идентификатор должен быть одинаковый в любом из запросов ИЛИ же ))) в заголовке и теле он должен быть одинаковый а в различных запросах разный (создание заказа - один, а при проверке статуса - другой) Даже пишу запутанно, т.к. не понимаю как строить структуру интеграции с участием этого идентификатора |
|||
41
Кир Пластелинин
10.08.22
✎
16:23
|
(40) RqUID в заголовках и rq_uid в теле - это один и тот же id. я туда guid пропихивал, в котором удалял "-", т.к. ограничение по длине в 32 символа + ограничения шаблона. этот id уникален должен быть уникален для запроса. т.е. получение токена - один id, последующее создание заказа - другой id
|
|||
42
stone-w1987
16.08.22
✎
10:30
|
Доброго дня токен с трудом получили, но при создании заказа 401 Unauthorized Not registered to plan
Хотя все по инструкции... |
|||
43
Кир Пластелинин
16.08.22
✎
10:55
|
(42) могу только предположить, что не подключили api оплат по qr для своего приложения в личном кабинете для пространства организации.
|
|||
44
stone-w1987
16.08.22
✎
11:05
|
спасибо за совет, тема новая ... инструкции ...
|
|||
45
Кир Пластелинин
16.08.22
✎
11:43
|
(44) не все так прозрачно описано в документации конечно и в каких то непонятных ситуациях лучше в саппорт писать. но вот общение с ними полный рандом и ппц, если речь идет про сервис оплат по QR. порой быстро и адекватно отвечают, а порой чуть ли не прямым текстом приходится писать "перечитайте исходный вопрос" и вот только тогда соизволят предоставить ответ на поставленный вопрос. а вот поддержка интернет-эквайринга от них оставила только положительные впечатления.
|
|||
46
stone-w1987
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
stone-w1987
19.08.22
✎
19:13
|
Запросы получились, всем спасибо)
|
|||
49
dchumak
09.09.22
✎
11:30
|
(42)
[401 Unauthorized Not registered to plan] Добрый день. Как решили такую проблему? Что-то неправильно в запросе, или настройки в личном кабиненте? |
|||
50
Кир Пластелинин
09.09.22
✎
12:55
|
(49) проверьте в лк, что подписали свое приложение на нужные API
|
|||
51
arsik
гуру
09.09.22
✎
13:03
|
(44) Нафига все это? Вроде у сбера сейчас прошивки для эквайринговых терминалов поддерживают СБП. Там даже делать ничего не надо в софте. Подключаешь его в 1С как обычный эквайринговый терминал.
|
|||
52
dchumak
09.09.22
✎
13:28
|
(51)
[поддерживают СБП] это не СБП, а SberQR. Там только в 3 банках можно оплачивать. Урезанная реализация. |
|||
53
arsik
гуру
09.09.22
✎
13:34
|
(52) Жаль. Я думал там полноценный СБП (в столовке просто видел). Тот кто натянет полноценный СБП на свои терминалы озолотится.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |