méthode existante de valeurs affichant API
Selon la documentation de l'API, un formulaire doit être affiché à l'URL de l'API (méthode = "POST" et action = "API_URL") avec des champs de saisie et un champ de jeton client. L'API traite et affiche ensuite la réponse à un fichier callback.php sur mon serveur (corrigé - impossible de le modifier). La page redirige vers l'URL de l'API, puis revient à callback.php. Je peux accéder aux vals affichés en utilisant $_POST
dans ce fichier. C'est tout à propos de la méthode existante et ça fonctionne bien.Impossible de suivre un emplacement (URL) en utilisant cURL quand open_basedir est défini - rappel de l'API ne
poste côté serveur pour cacher le jeton client
Pour des raisons de sécurité, je suis en train de poster cette fois côté serveur.
Le problème
Callback ne se produit pas (code à l'intérieur fichier callback.php ne pas exécuter). Après un arrêt brutal avec cURL pour publier sur l'API et recevoir un rappel, j'ai réalisé que open_basedir est défini dans mon serveur en raison de laquelle CURLOPT_FOLLOWLOCATION
. J'ai trouvé le code suivant qui semble être en mesure d'accomplir l'affichage même si safe_mode
est On
ou open_basedir
est défini, à condition que
général, nous savons où nous serons redirigés vers
S'il vous plaît passez le code ci-dessous et dites-moi ce que l'on entend ici par if we know generally where we'll be redirected to
. Est-ce l'URL vers laquelle l'API redirigera après la fin du traitement? Alors oui je sais, il doit envoyer un rappel à un fichier callback.php sur mon serveur, mais ce n'est pas le cas. : -
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;
}
}
Sur l'exécution du code, il entre dans la conditon où $http_code
est ni 301
ni 302
(il est 200
dans mon cas). Et l'impression des données de $ donne les éléments suivants: -
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
Aide
me aider les gars ..
Tout changement de code à ce besoin?
Est-ce que cURL ne fonctionnera pas dans mon cas? (Il est une API asynchrone -.. Il déclenche le rappel quand il est fait la demande initiale ne reçoit pas une valeur de retour dans ce genre de configuration)
Merci Sandeepan
Si quelqu'un peut m'aider avec une méthode autre que cURL, vérifiez ma question http://stackoverflow.com/questions/3609157/callback-from-api-not-happening-after-posting -parameters-to-api-url-de-server-s –