Существующий метод публикации значений в API
Согласно документации API, форма должна быть размещена на URL API (method = "POST" и action = "API_URL") с некоторыми полями ввода и полем токена клиента. API обрабатывает и затем публикует ответ на файл callback.php на моем сервере (исправлено - не может изменить его). Страница перенаправляется на URL-адрес API и затем возвращается в callback.php. Я могу получить доступ к опубликованным значениям, используя $_POST
в этом файле. Это все о существующем методе, и он отлично работает.
Пост на стороне сервера, чтобы скрыть токен клиента
Из соображений безопасности я пытаюсь опубликовать сообщение со стороны сервера.
Проблема
Обратного вызова не происходит (код внутри файла callback.php не выполняется).
После того, как cURL усердно пытался опубликовать в API и получить обратный вызов, я понял, что на моем сервере установлен open_basedir, из-за чего CURLOPT_FOLLOWLOCATION
. Я обнаружил следующий код, который, кажется, может выполнить публикацию, даже если safe_mode
равен On
или open_basedir
, при условии, что
мы вообще знаем, где будем
перенаправлен на
Пожалуйста, пройдите через код ниже и скажите мне, что здесь подразумевается под if we know generally where we'll be redirected to
. Это URL, куда API будет перенаправлен после завершения обработки? Тогда да, я знаю, он должен отправить обратный вызов в файл callback.php на моем сервере, но этого не происходит.
: -
function curl($url, $postVars)
{
$go = curl_init($url);
curl_setopt ($go, CURLOPT_URL, $url);
curl_setopt($go, CURLOPT_VERBOSE, 1);
//follow on location problems
if (ini_get('open_basedir') == '' && (ini_get('safe_mode')== 'Off'))
{
curl_setopt ($go, CURLOPT_FOLLOWLOCATION, $l);
$syn = curl_exec($go);
if(curl_error($go))
return false;
}
else
$syn = curl_redir_exec($go, $postVars);
curl_close($go);
return $syn;
}
function curl_redir_exec($ch, $postVars)
{
static $curl_loops = 0;
static $curl_max_loops = 20;
if ($curl_loops++>= $curl_max_loops)
{
$curl_loops = 0;
return FALSE;
}
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postVars);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
$data = curl_exec($ch);
if(curl_error($ch))
return false;
list($header, $data) = explode("\n\r", $data, 2);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$redirect_page = "[0-9]*.html";
$base_redirect = "http://example.com/";
if ($http_code == 301 || $http_code == 302)
{
$matches = array();
$pregs = eregi($redirect_page, $data, $matches);
$new_url = $base_redirect . $matches[0];
if (!$new_url)
{
//couldn't process the url to redirect to
$curl_loops = 0;
return $data;
}
curl_setopt($ch, CURLOPT_URL, $new_url);
return curl_redir_exec($ch, $postVars);
}
else
{
$curl_loops=0;
return $data;
}
}
При запуске кода он входит в условие, где $http_code
не является ни 301
, ни 302
(в моем случае это 200
). И печать данных $ дает следующее: -
HTTP/1.1 200 OK Date: Wed, 01 Sep 2010 10:02:44 GMT Server: Apache/2 X-Powered-By: PHP/5.2.11 Content-Length: 0 Connection: close Content-Type: text/html
Помощь
Помогите мне, ребята ..
Какие-нибудь изменения в коде необходимы?
CURL не будет работать в моем случае? (Это асинхронный API - он запускает обратный вызов, когда он сделан. Исходный запрос не получает возвращаемого значения в такой настройке.)
Спасибо
Sandeepan