Question

Je teste l'intégration d'un site Web à Paypal, en utilisant les paiements Web Variables standard et HTML.

Je l'ai écrit un simple script PHP pour gérer les notifications IPN.

Selon le documentation Paypal , le serveur répond Paypal avec un simple ' verified ' ou ' Infirme réponse,

une fois que vous ping les données reçues de retour à Paypal.

Dans mon gestionnaire, je fais une affaire comparaison de chaînes sensible pour ces deux mots-clés, si l'un de ces mots-clés connus ne se trouve pas, alors il est traité comme une erreur.

<?php
  $fp = fsockopen ($socket_url, 80, $errno, $errstr, 10);

  if (!$fp){
     // SOCKET ERROR
     return false;
  }
  else {
         fputs ($fp, $header . $req);
         $is_ok = false;

         while (!feof($fp)) {
             $res = fgets ($fp, 1024);

             if (strcmp("VERIFIED",$this->ipn_response)==0) {
                //do something ...
             }
             // if the IPN POST was 'INVALID'
             else if (strcmp ($res, "INVALID") == 0) {
                 fclose ($fp);
                 return false;
             }
             else {
                echo "Unknown response from Paypal: $res";
                fclose ($fp);
                return false;
            }
         }

         fclose ($fp);
         return true;
   }
?>

Mon message d'erreur indique que je reçois une réponse 'HTTP / 1.1 200 OK' de Paypal.

  

réponse inconnue de Paypal:   'HTTP / 1.1 200 OK'

a-t-API PayPal changé, ou que je fais quelque chose de mal?

Était-ce utile?

La solution

La réponse de PayPal est dans le corps de la réponse HTTP. Vous devez traiter les en-têtes HTTP avant de pouvoir obtenir le corps. Ou, alternativement, continuez à lire des lignes jusqu'à ce que vous trouviez une ligne vide, et la ligne suivante sera le corps.

Autres conseils

Désolé, ma réponse originale était vraiment mal formulée:)

fgets est en train de lire seulement la ligne par ligne, la première ligne étant la réponse HTTP. Votre code ne donne jamais l'occasion de continuer à lire, même si, comme vous « erreur out » après la première ligne est traitée.

Je serais enclin à remplacer votre boucle while avec quelque chose comme:

    while (!feof($fp)) {
         $res = trim(fgets($fp, 1024));

         if (strcmp($res, "VERIFIED")==0) {
            //do something ...
         }
         else if (strcmp($res, "INVALID") == 0) {
             fclose ($fp);
             return false;
         }
     }

Comme dit @ Mike, vous avez à lire tout le corps - dans votre cas, vous êtes juste tester si VERIFIED ou INVALID apparaît dans les 1024 premiers octets de la réponse, ce qui est probablement l'en-tête

.

Par ailleurs, vous n'avez pas besoin d'utiliser fsockopen(), la plupart des gens parce que PayPal fournit un exemple en utilisant pour que cela fonctionne dans les anciennes installations de la boîte. CURL ou file_get_contents avec un contexte HTTP POST fera le travail très bien, voici un exemple que je Codé pour cadre phunction PHP :

public static function PayPal($email, $status = 'Completed', $sandbox = false)
{
    if (preg_match('~^(?:.+[.])?paypal[.]com$~', gethostbyaddr($_SERVER['REMOTE_ADDR'])) > 0)
    {
        $url = ($sandbox !== true) ? '' : '.sandbox';
        $result = self::CURL('https://www' . $url . '.paypal.com/cgi-bin/webscr/', array_merge(array('cmd' => '_notify-validate'), $_POST), 'POST');

        if ($result == 'VERIFIED')
        {
            $email = strlen($email) * strcasecmp($email, $_POST['receiver_email']);
            $status = strlen($status) * strcasecmp($status, $_POST['payment_status']);

            if (($email == 0) && ($status == 0))
            {
                return true;
            }
        }
    }

    return false;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top