Помогите с POST запросом

1. Shurik1C 22.05.15 11:15 Сейчас в теме
Доброго времени суток! Пытаюсь с 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 файл, сказала с ним все нормально и это я не правильно делаю запрос.
Код приведенный выше работает для новой почты, а тут беда какая то. Подскажите куда копать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. Boneman 298 22.05.15 17:27 Сейчас в теме
(1) Shurik1C,
я бы поработал с первым вариантом
Рассуждаем.
Соединение - вроде есть.
Заголовок - вроде тоже.
дальше,
Запрос = Новый HTTPЗапрос("/p24api/rest_fiz", ЗаголовокHTTP);
Запрос.УстановитьТелоИзСтроки(ТекстXML);
ОтветОтСоединения = Соединение.ОтправитьДляОбработки(Запрос);
Ответ = ОтветОтСоединения.ПолучитьТелоКакСтроку("UTF-8"); 

мне лично не нравится.
я бы попробовал переделать
 
параметрЗапроса = "/p24api/rest_fiz";
ФайлРезультата = ПолучитьИмяВременногоФайла();
Соединение.ОтправитьДляОбработки(ПутьКФайлу, ПараметрЗапроса, ФайлРезультата, ЗаголовокHTTP);
// после этого у нас должен возникнуть ответ в файле резултата, прочитаем его
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(ФайлРезультата);
Пока Чтение.Прочитать() Цикл
... и т.д.


Показать

ПутьКФайлу - это физический путь к файлику который передаем, судя по всему "d:\Data.xml"
6. Shurik1C 22.05.15 17:55 Сейчас в теме
(4) Boneman,

отправляются, но возвращается все равно:

<?xml version="1.0"?>
<error>Content is not allowed in prolog.</error>
7. Boneman 298 22.05.15 17:59 Сейчас в теме
(6) Shurik1C, ну значит оно уходит, и все таки обрабатывается.
попробуй поиграться с заголовками. Убери вообще этот типконтента.
А есть документация на API ? или методом тыка ?

///

документацию увидел, но что-то там ни слова про заголовки нет, и ни одного примера, кроме самого этого файла ((
8. Shurik1C 22.05.15 18:08 Сейчас в теме
(7) Boneman,

Из документации только это: https://api.privatbank.ua/api-privat24/rest-fiz.html

Тех поддержка не очень общительна, только по имейлу и все :(
Пробовал с доп заголовками, пробовал и без них вообще
В "документации" смущает поле "signature". Хешировать нужно самому как то или они сами это делают или как с этим быть? :( Тех поддержка упорно морозится на этот вопрос

///

про заголовки сказала тех.под. тот единственный раз когда удалось с ними связаться
9. Boneman 298 22.05.15 18:12 Сейчас в теме
(8) Shurik1C, а ну кстати да,
там же четко написано, как сформировать,
там же пароль на систему.

Я почему-то подумал, что содержимое файла банк у вас проверил, и типа все пучком должно работать.
Если сигнатуру никто не вводил, надо ее делать
10. Shurik1C 22.05.15 18:16 Сейчас в теме
(9) Boneman,

В поле сигнатура я записываю пароль клиента. А файл действительно проверил банк, я его отправлял им на проверку, т.к. думал что где-то ошибся!
11. A-tomic 04.07.15 16:39 Сейчас в теме
(10) Shurik1C, поле сигнатура таки вовсе не пароль.

Сигнатура запроса рассчитывется следующим образом (PHP):
$sign=sha1(md5($data.$password));
$data - содержимое тега <data> данного запроса;
$password - личный пароль мерчанта, полученный им при регистрации, находится в меню настроек мерчанта (Напр: 3A90E5J0f6OUIfqN1Qu59gYrjDgDblfL)


У вас уже получилось? Сам щас мучаюсь.
12. Paha123 24.12.15 12:35 Сейчас в теме
(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);

?>
13. maestro_voln 04.10.16 10:47 Сейчас в теме
(10) Shurik1C, Вам удалось решить эту проблему? Если да то подскажите как.
2. Shurik1C 22.05.15 17:05 Сейчас в теме
3. ditp 91 22.05.15 17:12 Сейчас в теме
проверяйте передаваемый файл на наличие BOM

http://stackoverflow.com/a/4570015

Как вариант - сначала получить текст из файла, и отослать его как строку.
5. Shurik1C 22.05.15 17:54 Сейчас в теме
(3) ditp,

я уже проверял, левых символов нет:(
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот