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