Доброго времени суток! Пытаюсь с API ПриватБанка (Украина) получить данные по выписке счета.
Сделал все по инструкцииhttps://api.privatbank.ua/api-privat24/rest-fiz.html
Пробовал три варианта отправки с 1С
//Вариант 1
Сервер = "api.privatbank.ua";
//ТекстXML = "d:\Data.xml";
ssl = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение(Сервер,,,,,5,ssl);
ЗаголовокHTTP = Новый Соответствие();
ЗаголовокHTTP.Вставить("Content-type", "text/xml; charset=utf-8");
Запрос = Новый HTTPЗапрос("/p24api/rest_fiz", ЗаголовокHTTP);
Запрос.УстановитьТелоИзСтроки(ТекстXML);
ОтветОтСоединения = Соединение.ОтправитьДляОбработки(Запрос);
Ответ = ОтветОтСоединения.ПолучитьТелоКакСтроку("UTF-8");
Сообщить(Ответ);
Соединение = Неопределено;
//Вариант 2
Попытка
WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
WinHttp.Option(2,"utf-8");
WinHttp.Open("POST","https://api.privatbank.ua/p24api/rest_fiz",0);
WinHttp.setRequestHeader("Content-type", "text/xml; charset=utf-8");
//ПараметрыПОСТ = "rwID=" + СокрЛП(НомерНакладной);
WinHttp.Send(ТекстXML);
ТекстОтвета = WinHttp.ResponseText();
Исключение
КонецПопытки;
//Вариант 3
Адрес = "https://api.privatbank.ua/p24api/rest_fiz";
Попытка
XMLHTTP = GetCOMObject("", "Microsoft.XMLHTTP");
XMLHTTP.Open("POST", Адрес, Ложь); //POST
XMLHTTP.SetRequestHeader("Content-Type", "text/xml; charset=utf-8");
//XMLHTTP.SetRequestHeader("Content-Charset", "utf-8");
XMLHTTP.Send(ТекстXML);
Сообщить(ТекстОтвета);
Исключение
КонецПопытки;
Но каждый из них возвращает мне:
"<error>Content is not allowed in prolog.</error>"
Тех поддержка проверила xml файл, сказала с ним все нормально и это я не правильно делаю запрос.
Код приведенный выше работает для новой почты, а тут беда какая то. Подскажите куда копать
Сделал все по инструкции
Пробовал три варианта отправки с 1С
//Вариант 1
Сервер = "api.privatbank.ua";
//ТекстXML = "d:\Data.xml";
ssl = Новый ЗащищенноеСоединениеOpenSSL();
Соединение = Новый HTTPСоединение(Сервер,,,,,5,ssl);
ЗаголовокHTTP = Новый Соответствие();
ЗаголовокHTTP.Вставить("Content-type", "text/xml; charset=utf-8");
Запрос = Новый HTTPЗапрос("/p24api/rest_fiz", ЗаголовокHTTP);
Запрос.УстановитьТелоИзСтроки(ТекстXML);
ОтветОтСоединения = Соединение.ОтправитьДляОбработки(Запрос);
Ответ = ОтветОтСоединения.ПолучитьТелоКакСтроку("UTF-8");
Сообщить(Ответ);
Соединение = Неопределено;
//Вариант 2
Попытка
WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
WinHttp.Option(2,"utf-8");
WinHttp.Open("POST","https://api.privatbank.ua/p24api/rest_fiz",0);
WinHttp.setRequestHeader("Content-type", "text/xml; charset=utf-8");
//ПараметрыПОСТ = "rwID=" + СокрЛП(НомерНакладной);
WinHttp.Send(ТекстXML);
ТекстОтвета = WinHttp.ResponseText();
Исключение
КонецПопытки;
//Вариант 3
Адрес = "https://api.privatbank.ua/p24api/rest_fiz";
Попытка
XMLHTTP = GetCOMObject("", "Microsoft.XMLHTTP");
XMLHTTP.Open("POST", Адрес, Ложь); //POST
XMLHTTP.SetRequestHeader("Content-Type", "text/xml; charset=utf-8");
//XMLHTTP.SetRequestHeader("Content-Charset", "utf-8");
XMLHTTP.Send(ТекстXML);
Сообщить(ТекстОтвета);
Исключение
КонецПопытки;
Но каждый из них возвращает мне:
"<error>Content is not allowed in prolog.</error>"
Тех поддержка проверила xml файл, сказала с ним все нормально и это я не правильно делаю запрос.
Код приведенный выше работает для новой почты, а тут беда какая то. Подскажите куда копать
По теме из базы знаний
- Планы запросов - это просто! Разбор оптимизаций запросов PostgreSQL на живых примерах
- Спецификация JSON:API 1.0
- Postgres как предчувствие. Вычисляем процент импортозамещения в режиме Highload от 1С
- Распространённые ошибки при установке PostgreSQL для 1С и реализация их устранения в продуктах компании Postgres Professional
- Опыт оптимизации 1С на PostgreSQL
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Shurik1C,
я бы поработал с первым вариантом
Рассуждаем.
Соединение - вроде есть.
Заголовок - вроде тоже.
дальше,
мне лично не нравится.
я бы попробовал переделать
ПутьКФайлу - это физический путь к файлику который передаем, судя по всему "d:\Data.xml"
я бы поработал с первым вариантом
Рассуждаем.
Соединение - вроде есть.
Заголовок - вроде тоже.
дальше,
Запрос = Новый HTTPЗапрос("/p24api/rest_fiz", ЗаголовокHTTP);
Запрос.УстановитьТелоИзСтроки(ТекстXML);
ОтветОтСоединения = Соединение.ОтправитьДляОбработки(Запрос);
Ответ = ОтветОтСоединения.ПолучитьТелоКакСтроку("UTF-8");
мне лично не нравится.
я бы попробовал переделать
параметрЗапроса = "/p24api/rest_fiz";
ФайлРезультата = ПолучитьИмяВременногоФайла();
Соединение.ОтправитьДляОбработки(ПутьКФайлу, ПараметрЗапроса, ФайлРезультата, ЗаголовокHTTP);
// после этого у нас должен возникнуть ответ в файле резултата, прочитаем его
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(ФайлРезультата);
Пока Чтение.Прочитать() Цикл
... и т.д.
ПоказатьПутьКФайлу - это физический путь к файлику который передаем, судя по всему "d:\Data.xml"
(6) Shurik1C, ну значит оно уходит, и все таки обрабатывается.
попробуй поиграться с заголовками. Убери вообще этот типконтента.
А есть документация на API ? или методом тыка ?
///
документацию увидел, но что-то там ни слова про заголовки нет, и ни одного примера, кроме самого этого файла ((
попробуй поиграться с заголовками. Убери вообще этот типконтента.
А есть документация на API ? или методом тыка ?
///
документацию увидел, но что-то там ни слова про заголовки нет, и ни одного примера, кроме самого этого файла ((
(7) Boneman,
Из документации только это:https://api.privatbank.ua/api-privat24/rest-fiz.html
Тех поддержка не очень общительна, только по имейлу и все :(
Пробовал с доп заголовками, пробовал и без них вообще
В "документации" смущает поле "signature". Хешировать нужно самому как то или они сами это делают или как с этим быть? :( Тех поддержка упорно морозится на этот вопрос
///
про заголовки сказала тех.под. тот единственный раз когда удалось с ними связаться
Из документации только это:
Тех поддержка не очень общительна, только по имейлу и все :(
Пробовал с доп заголовками, пробовал и без них вообще
В "документации" смущает поле "signature". Хешировать нужно самому как то или они сами это делают или как с этим быть? :( Тех поддержка упорно морозится на этот вопрос
///
про заголовки сказала тех.под. тот единственный раз когда удалось с ними связаться
(10) Shurik1C, поле сигнатура таки вовсе не пароль.
У вас уже получилось? Сам щас мучаюсь.
Сигнатура запроса рассчитывется следующим образом (PHP):
$sign=sha1(md5($data.$password));
$data - содержимое тега <data> данного запроса;
$password - личный пароль мерчанта, полученный им при регистрации, находится в меню настроек мерчанта (Напр: 3A90E5J0f6OUIfqN1Qu59gYrjDgDblfL)
$sign=sha1(md5($data.$password));
$data - содержимое тега <data> данного запроса;
$password - личный пароль мерчанта, полученный им при регистрации, находится в меню настроек мерчанта (Напр: 3A90E5J0f6OUIfqN1Qu59gYrjDgDblfL)
У вас уже получилось? Сам щас мучаюсь.
(10) Shurik1C, Добрый день! Помогите пожалуйста, мне тоже ошибку пишет "Content is not allowed in prolog."
Вот мой код:
<?php
$txn_sum = $_POST['sum'];
$link = 'https://api.privatbank.ua/p24api/pay_pb';
$id = 114361;
$password = 'FceMx1hC0b34leXHD602EimM37Wk3iSu';
$data = '
<data>
<oper>cmt</oper>
<wait>90</wait>
<test>1</test>
<payment id="1234567">
<prop name="b_card_or_acc" value="5168757295077574"/>
<prop name="amt" value="'.$txn_sum.'" />
<prop name="ccy" value="UAH" />
<prop name="details" value="test%20merch%20not%20active"/>
</payment>
</data>';
$sign=sha1(md5($data.$password));
$xml_form = '<?xml version="1.0" encoding="UTF-8"?>
<request version="1.0">
<merchant>
<id>'.$id.'</id>
<signature>'.$sign.'</signature>
</merchant>'.$data.'
</request>';
//echo $xml_form;
/************************/
$xml_form = simplexml_load_string($xml_form);
//print_r($xml_form);
$ch = curl_init();//инициализация curl
$postfields = array(
'xml' => $xml_form
);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_URL, $link);//адрес запроса
curl_setopt($ch, CURLOPT_TIMEOUT, 90);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);// Ожидание ответа сервера
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER["HTTP_USER_AGENT"]);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml'));
curl_setopt($ch, CURLOPT_POSTFIELDS,$postfields);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
$result = curl_multi_getcontent ($ch);
$info=curl_getinfo($ch);
//var_dump($result);
//var_dump($info);
curl_close($ch);
print_r($result);
?>
Вот мой код:
<?php
$txn_sum = $_POST['sum'];
$link = 'https://api.privatbank.ua/p24api/pay_pb';
$id = 114361;
$password = 'FceMx1hC0b34leXHD602EimM37Wk3iSu';
$data = '
<data>
<oper>cmt</oper>
<wait>90</wait>
<test>1</test>
<payment id="1234567">
<prop name="b_card_or_acc" value="5168757295077574"/>
<prop name="amt" value="'.$txn_sum.'" />
<prop name="ccy" value="UAH" />
<prop name="details" value="test%20merch%20not%20active"/>
</payment>
</data>';
$sign=sha1(md5($data.$password));
$xml_form = '<?xml version="1.0" encoding="UTF-8"?>
<request version="1.0">
<merchant>
<id>'.$id.'</id>
<signature>'.$sign.'</signature>
</merchant>'.$data.'
</request>';
//echo $xml_form;
/************************/
$xml_form = simplexml_load_string($xml_form);
//print_r($xml_form);
$ch = curl_init();//инициализация curl
$postfields = array(
'xml' => $xml_form
);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_URL, $link);//адрес запроса
curl_setopt($ch, CURLOPT_TIMEOUT, 90);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);// Ожидание ответа сервера
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER["HTTP_USER_AGENT"]);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml'));
curl_setopt($ch, CURLOPT_POSTFIELDS,$postfields);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
$result = curl_multi_getcontent ($ch);
$info=curl_getinfo($ch);
//var_dump($result);
//var_dump($info);
curl_close($ch);
print_r($result);
?>
проверяйте передаваемый файл на наличие BOM
http://stackoverflow.com/a/4570015
Как вариант - сначала получить текст из файла, и отослать его как строку.
Как вариант - сначала получить текст из файла, и отослать его как строку.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот