2010-05-17 17 views
1

J'applique PayPal IPN & PDT. Après un certain temps de tête au bac à sable, IPN fonctionne bien et PDT renvoie les bonnes données $ _GET. La mise en œuvre est la suivante:Malheurs d'intégration PayPal: PDT se bloque sur le retour au site

  • passe ID utilisateur sous forme de PayPal
  • utilisateur achète le produit et déclenche IPN qui met à jour la base de données pour l'ID d'utilisateur donné
  • PDT retourne ID de transaction lorsque l'utilisateur revient au site
  • la page de retour dit « s'il vous plaît attendez » et répétez-Ajax-chèques pour le statut de transaction
  • l'utilisateur est redirigé vers la page réussite/échec

Tout fonctionne bien, sauf que lorsque vous utilisez le code PHP prêt PayPal pour PDT pour faire un retour POST, la page se bloque. L'utilisateur ne revient jamais sur mon site. Je ne reçois pas un statut d'échec, juste rien. La chose amusante est qu'une fois l'erreur inconnue se produit, mon domaine de test ne répond plus pendant une courte période.

Le code (PHP): https://www.paypal.com/us/cgi-bin/webscr?cmd=p/xcl/rec/pdt-code-outside

Si je commente le republier, tout cela fonctionne très bien. Je suis capable de cerner le problème une fois que le code entre dans la boucle while {}. Malheureusement, je n'ai pas assez d'expérience pour écrire un remplacement de zéro pour le code de PayPal, donc j'apprécierais vraiment toutes les idées sur ce qui pourrait être faux. Le retour POST va à ssl: //www.sandbox.paypal.com, et j'utilise le code du bouton et un jeton d'autorisation qui ont tous été créés via un compte de test sandbox.

Merci d'avance.

MISE À JOUR:

Je l'ai réduit le problème à cette ligne: $line = fgets($fp, 1024);

Il se bloque tout simplement et je ne sais pas pourquoi.

Répondre

1

RESOLU:

Le passage à cURL permet de résoudre tous les problèmes. Voici le code dans le cas où quelqu'un vient par cela et est aussi désespérée que j'étais:

// Prepare data 
$req = 'cmd=_notify-synch'; 
$tx_token = $_GET['tx']; 
$auth_token = '<-- your token (sandbox or live) -->'; 
$req .= '&tx='.$tx_token.'&at='.$auth_token; 
// Post back to PayPal to validate 
$c = curl_init('https://www.sandbox.paypal.com/cgi-bin/webscr'); // SANDBOX 
curl_setopt($c, CURLOPT_POST, true); 
curl_setopt($c, CURLOPT_POSTFIELDS, $req); 
curl_setopt($c, CURLOPT_RETURNTRANSFER, true); 
$contents = curl_exec($c); 
$response_code = curl_getinfo($c, CURLINFO_HTTP_CODE); 
curl_close($c); 
if(!$contents || $response_code != 200) { 
    // HTTP error or bad response, do something 
} else { 
    // Check PayPal verification (FAIL or SUCCESS) 
    $status = substr($contents, 0, 4); 
    if($status == 'FAIL') { 
     // Do fail stuff 
    } elseif($status == 'SUCC') { 
     // Do success stuff 
    } 
} 

Techniquement, le substr() ne vérifie pas la « réussite », mais « SUCC ». Cependant, étant donné que seuls "SUCCESS" ou "FAIL" sont des valeurs possibles, cela n'a pas d'importance.

Ce même code fonctionne également pour IPN, avec les modifications mineures évidentes.