2010-09-01 15 views
2

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

+0

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 –

Répondre

0

Vous devriez vérifier ce que l'URL était cURL demandé (echo $ new_url;)