[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Отправка данных методом POST из php-скрипта
Страницы: 1, 2
hieronym
Пытаюсь сделать скрипт для отправки данных на сайт банка Авангард.
Обработка данных банком производится по адресу https://www.avangard.ru/iacq/post
Если отправлять данные из html-формы, то данные обрабатываются, если данные неполные, то сайт банка выдает ошибку "Ошибка в процессе оплаты!".
Эту же ошибку банк выдаст, если просто зайти в браузере по адресу https://www.avangard.ru/iacq/post , поскольку никаких данных не передано.

Но у меня такая задача:
1. принять данные от пользователя
2. обработать их и передать в переменную $data
3. передать данные, находящиеся в переменной $data на адрес https://www.avangard.ru/iacq/pos методом POST

Я нашел в сети образец скрипта, подставил в него свои данные, но в ответ не вижу ни отклика банка о корректном приеме данных, ни сообщения об ошибке, только пустой экран. По всей видимости, что-то я прописал некорректно... Был бы благодарен за помощь!
Вот скрипт по передаче банку Авангард данных методом POST:

[php]

$data=$_POST["email"]; // для примера в переменную дата вводится адрес электронной почты, который получен этим скриптом из html-формы

$fp = fsockopen("www.avangard.ru", 80, $errno, $errstr, 10); // открываю связь с хостом
$out = "POST iacq/post/ HTTP/1.1\n"; // указываю путь к вызываемому файлу на сервере банка
$out .= "Host: https://www.avangard.ru/\n"; //адрес хоста банка
$out .= "Referer: mysite.ru/\n"; // адрес моего сайта
$out .= "User-Agent: Opera\n"; // браузер
$out .= "Content-Type: application/x-www-form-urlencoded\n";
$out .= "Content-Length: ".strlen($data)."\n\n";
$out .= $data."\n\n";
fputs($fp, $out);
fclose($fp);
[/php]


Собственное предположение: может при открытии соединения не тот порт нужно открывать, но какой я не знаю, т.к. напрямую из html-формы все работает ОК? Или я должен что-то прописать, чтобы увидеть отклик банка?
AllesKlar
Цитата
Собственное предположение: может при открытии соединения не тот порт нужно открывать, но какой я не знаю, т.к. напрямую из html-формы все работает ОК? Или я должен что-то прописать, чтобы увидеть отклик банка?


Нет, просто нужно ПОНИМАТЬ, что ты делаешь.

Ты не поверишь, но ты открывал СОКЕТ.
Ты уверен, что ты этого хотел? smile.gif

Как говорил наш профессор в универе: "Нажимать кнопки можно научить и обезьяну. Программист должен понимать суть происходящего внутри."

Этот ужас сотри, почитай про curl, тебе с ним проще будет

_____________
[продано копирайтерам]
hieronym
Да уж...
Но у меня простой код и я спросил всего-лишь, где может быть ошибка...
Изучи весь PHP, еще можно и так ответить, но без помощи профи в указании на ошибки, это сделать сложно. Поэтому все-же надеюсь не на отмашку, а на конкретный разбор моего кода.
waldicom
Цитата (hieronym @ 16.03.2014 - 13:05)
но в ответ не вижу ни отклика банка о корректном приеме данных, ни сообщения об ошибке, только пустой экран

Это потому что вы данные отослали, а ответ не считываете. Это можно сделать с помощью, например, fgets()

Вот тут пример: http://de1.php.net/manual/de/function.fsockopen.php

_____________
Свои мозги еще никто не отменял.
Телепатов нету.
AllesKlar
hieronym
Ок, ссори, чагойт я сегодня в ударе.

Если хочешь всеж с сокетами, то waldicom ответил, это то, что нужно.


_____________
[продано копирайтерам]
hieronym
Спасибо, добавил, но теперь скрипт что-то пытается получить, но останавливается по тайм-ауту в 30 секунд. Просьба, прочитайте задачу и подскажите, скорее всего, что-то с адресами напутано.

Вот теперь какой скрипт:

[php]

$data=$_POST["email"]; // для примера в переменную дата вводится адрес электронной почты, который получен этим скриптом из html-формы

$fp = fsockopen("www.avangard.ru", 80, $errno, $errstr, 10); // открываю связь с хостом
$out = "POST iacq/post/ HTTP/1.1\n"; // указываю путь к вызываемому файлу на сервере банка
$out .= "Host: https://www.avangard.ru/\n"; //адрес хоста банка
$out .= "Referer: mysite.ru/\n"; // адрес моего сайта
$out .= "User-Agent: Opera\n"; // браузер
$out .= "Content-Type: application/x-www-form-urlencoded\n";
$out .= "Content-Length: ".strlen($data)."\n\n";
$out .= $data."\n\n";
fputs($fp, $out);
fgets($fp,300);
fclose($fp);
[/php]
hieronym
Еще посмотрел примеров, добавил в скрипт команду write, теперь опять пустой экран, но так быть не должно. Что-то с адресами прописал не так, посмотрите, плз:

[php]
$data=$_POST["email"]; // для примера в переменную дата вводится адрес электронной почты, который получен этим скриптом из html-формы

$fp = fsockopen("www.avangard.ru", 80, $errno, $errstr, 10); // открываю связь с хостом
$out = "POST iacq/post/ HTTP/1.1\n"; // указываю путь к вызываемому файлу на сервере банка
$out .= "Host: https://www.avangard.ru/\n"; //адрес хоста банка
$out .= "Referer: mysite.ru/\n"; // адрес моего сайта
$out .= "User-Agent: Opera\n"; // браузер
$out .= "Content-Type: application/x-www-form-urlencoded\n";
$out .= "Content-Length: ".strlen($data)."\n\n";
$out .= $data."\n\n";
fputs($fp, $out);
fwrite($fp, $out);
while($gets=fgets($fp,2048))
{
print $gets;
}


fclose($fp);
AllesKlar
hieronym
POST подразумивает пары имя=значение.
У тебя нет имени для POST параметра.


Цитата
$data=$_POST["email"]


Для чего ты повторяешь 2 раза одну и туже команду?

fputs($fp, $out);
fwrite($fp, $out);


Цитата
Но у меня простой код и я спросил всего-лишь, где может быть ошибка...


Я тебе написал, чо без понимания механизма, нельзя его использовать.
То, что ты делаешь, это "пальцем в небо".

У тебя задача - отправить POST и принять ответ.
Зачем через сокеты?
Напиши на ассемблере, это круче.

Вот, простейший пример с curl
Все ясно, понятно, по полкам.

if( $curl = curl_init() ) {
curl_setopt($curl, CURLOPT_URL, 'http://mysite.ru/receiver.php');
curl_setopt($curl, CURLOPT_RETURNTRANSFER,true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, "a=4&b=7");
$out = curl_exec($curl);
echo $out;
curl_close($curl);
}


_____________
[продано копирайтерам]
zelenuy
hieronym
А разве https:// находится на 80 порту huh.gif
Цитата
https://www.avangard.ru
hieronym
Замечание справедливое, только я случайно сюда не вписал, а так все ок, в работающем примере есть и имя и значение. Подработал скрипт, теперь выдает ошибку, вот ошибка:

HTTP/1.1 404 Not Found Date: Sun, 16 Mar 2014 13:29:19 GMT Server: Apache Content-Type: text/html; charset=UTF-8 X-Powered-By: Servlet/2.5 JSP/2.1 Content-Length: 1214 Backend: www-39
Error 404--Not Found
From RFC 2068 Hypertext Transfer Protocol -- HTTP/1.1:
10.4.5 404 Not Found

The server has not found anything matching the Request-URI. No indication is given of whether the condition is temporary or permanent.

If the server does not wish to make this information available to the client, the status code 403 (Forbidden) can be used instead. The 410 (Gone) status code SHOULD be used if the server knows, through some internally configurable mechanism, that an old resource is permanently unavailable and has no forwarding address.

А вот скрипт:

<?php

//$db = mysql_connect("localhost","root",""); // Логин и пароль от базы данных
//mysql_select_db("u272069984_hieronym",$db); //Имя базы данных

//echo "<PRE>";
//print_r ($_POST);
//echo "</PRE>"



$data="amount=".$_POST["amount"];

$fp = fsockopen("www.avangard.ru", 80, $errno, $errstr, 10);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
$out = "POST /iacq/post/ HTTP/1.1\n";
$out .= "Host: www.avangard.ru\n";
$out .= "Referer: www.avangard.ru/\n";
$out .= "User-Agent: Opera\n";
$out .= "Content-Type: application/x-www-form-urlencoded\n";
$out .= "Content-Length: ".strlen($data)."\n\n";
$out .= $data."\n\n";
fwrite($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 2048);
}
fclose($fp);
}


Может эта ошибка как-то может подсказать, в чем проблема?
Повторюсь - данные отправляются на адрес https://www.avangard.ru/iacq/post
Если просто тупо ввести этот адрес в браузере, и то сайт откликается, пишет ошибку, что платеж не прошел...
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.