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