Меню

Api sberbank ru ошибка

   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 Сбербанка.
Как сказано у них в документации нужно отправить POST запрос с данными. Но в результате мне приходит ошибка

PHP
1
{"errorCode":"5","errorMessage":"Доступ запрещён"}

Вот код отпавк:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$userName = "name"; 
$password = "pass";
$orderNumber = md5(uniqid(rand(),1));
$amount = 99000;
$returnUrl = "http://site.com/?succes";
 $curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'https://3dsec.sberbank.ru/payment/rest/register.do');
curl_setopt($curl, CURLOPT_RETURNTRANSFER,true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, 'amount='.$amount.'&currency=810&language=ru&orderNumber='.$orderNumber.'&returnUrl='.$returnUrl.'&jsonParams={"orderNumber":'.$orderNumber.'}&pageView=DESKTOP&expirationDate
=2014-09-08T14:14:14&merchantLogin=merch_child');
$out = curl_exec($curl);
echo $out;
curl_close($curl);

Логин и пароль верные же… Может кто-то сталкивался с подобным?
П.С. в поддержу их написал, но что-то они молчат

Добавлено через 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

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Api ms win crt studio l1 1 0 dll ошибка как исправить
  • Api ms win crt string l1 1 0 dll ошибка как исправить