Paypal IPN retour HTTP / 1.1 200 OK
-
25-09-2019 - |
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?
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;
}