2011-04-08 6 views
1

MISE À JOUR 1:vraiment confus au sujet des paiements paypal

écriture $res à un fichier texte renvoie juste le mot VERIFIED:

<?php 
/* 
mysql_connect("localhost", "user", "password") or die(mysql_error()); 
mysql_select_db("PayPal") or die(mysql_error()); 
*/ 

// read the post from PayPal system and add 'cmd' 
$req = 'cmd=_notify-validate'; 
foreach ($_POST as $key => $value) { 
$value = urlencode(stripslashes($value)); 
$req .= "&$key=$value"; 
} 
// post back to PayPal system to validate 
$header = "POST /cgi-bin/webscr HTTP/1.0\r\n"; 
$header .= "Content-Type: application/x-www-form-urlencoded\r\n"; 
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n"; 

$fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30); 

if (!$fp) { 
// HTTP ERROR 
} else { 
fputs ($fp, $header . $req); 
while (!feof($fp)) { 
$res = fgets ($fp, 1024); 
if (strcmp ($res, "VERIFIED") == 0) { 

$ourFileName = "payment_successful.txt"; 
$ourFileHandle = fopen($ourFileName, 'w') or die("can't open file"); 
fwrite($ourFileHandle, $res); 
fclose($ourFileHandle); 


} 

else if (strcmp ($res, "INVALID") == 0) { 

$ourFileName = "payment_failed.txt"; 
$ourFileHandle = fopen($ourFileName, 'w') or die("can't open file"); 
fwrite($ourFileHandle, $res); 
fclose($ourFileHandle); 

} 
} 
fclose ($fp); 
} 
?> 

QUESTION ORIGINAL:

je l'IPN suivante (Script Instant Payment), qui fonctionne, c'est-à-dire qu'il crée un fichier réussi en cas de succès et un fichier en échec en cas d'échec. Est-ce que paypal renvoie des valeurs de poste au fichier IPN pour que je puisse déterminer quel paiement a été effectué ou quel paiement a échoué?

Si oui, comment accéder à ces valeurs? Si non, comment puis-je savoir quel paiement a été accepté ou refusé?

C'est le script dans le fichier IPN J'ai actuellement:

<?php 
// read the post from PayPal system and add 'cmd' 
$req = 'cmd=_notify-validate'; 
foreach ($_POST as $key => $value) { 
$value = urlencode(stripslashes($value)); 
$req .= "&$key=$value"; 
} 
// post back to PayPal system to validate 
$header = "POST /cgi-bin/webscr HTTP/1.0\r\n"; 
$header .= "Content-Type: application/x-www-form-urlencoded\r\n"; 
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n"; 

$fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30); 

if (!$fp) { 
// HTTP ERROR 
} else { 
fputs ($fp, $header . $req); 
while (!feof($fp)) { 
$res = fgets ($fp, 1024); 
if (strcmp ($res, "VERIFIED") == 0) { 

$ourFileName = "payment_successful.txt"; 
$ourFileHandle = fopen($ourFileName, 'w') or die("can't open file"); 
fclose($ourFileHandle); 

} 

else if (strcmp ($res, "INVALID") == 0) { 

$ourFileName = "payment_failed.txt"; 
$ourFileHandle = fopen($ourFileName, 'w') or die("can't open file"); 
fclose($ourFileHandle); 

} 
} 
fclose ($fp); 
} 
?> 
+0

de Nevermind, je compris ce que paypal est de retour. – oshirowanen

Répondre

3

Vous avez la réponse dans votre script générique. Paypal renverra le mot VERIFIED ou INVALID dans la chaîne.

Une bonne astuce consiste à écrire la valeur de $ res dans votre journal et vous verrez le résultat retourné juste à la fin.

Assurez-vous également d'utiliser le bac à sable pour les tests.

Il y a également un forum à http://x.com (combien ont-ils payé pour ce domaine?)

FWIW, IPN de Paypal est un PITA.

+0

Est-il possible d'écrire le contenu de $ res dans le fichier en cours de création, car je pense qu'il serait difficile d'écho le contenu car c'est une page initiée par paypal. – oshirowanen

+0

vous ne pouvez pas faire écho le contenu, ou mieux, vous pouvez mais qui s'en soucie? La transaction IPN est server2server donc seul le serveur verra l'écho, vous devrez l'écrire dans un fichier journal ou dans une base de données, faites attention que PayPal IPN vous envoie des données de façon UNIQUE et que vous voulez récupérer les données de la même façon: PayPal envoyer à vous var1 = res1 & var2 = res2 & var3 = res3, vous ne pouvez pas les renvoyer comme var2 = res2 & var1 = res1 & var3 = res3, vous devez respecter l'ordre ... AFAIK quand j'ai écrit mon propre IPN j'ai eu beaucoup de problèmes avec ça, cause me semble que $ _POST [] ne respecte pas l'ordre de données donc j'ai lu directement php: // entrée – MiPnamic

+0

@MiPnamic, j'ai écrit le contenu de $ res dans un fichier, et il contient juste le mot VARIFIED.Je ne comprends pas comment savoir quel paiement paypal confirme via le fichier IPN ci-dessus, donc je peux mettre à jour le bon enregistrement dans ma base de données. J'ai mis à jour la question ci-dessus pour montrer le code actuel qui écrit les données dans $ res dans un fichier texte. – oshirowanen

0

Salut, je mis en œuvre le mien cette façon

foreach ($_POST as $key => $value) 
{ 
    $data[$key] = $value; 
} 

faire un '<pre>' écho .print_r ($ data, true). '</pre>';

produirait quelque chose comme ceci:

cmd=_notify-validate 
test_ipn=1 
payment_type=echeck 
payment_date=22:21:28 Mar 24, 2011 PDT 
payment_status=Completed 
address_status=confirmed 
payer_status=verified 
first_name=John 
last_name=Smith 
[email protected] 
payer_id=TESTBUYERID01 
address_name=John+Smith 
address_country=United+States 
address_country_code=US 
address_zip=95131 
address_state=CA 
address_city=San+Jose 
address_street=123%2C+any+street 
[email protected] 
[email protected] 
receiver_id=TESTSELLERID1 
residence_country=US 
item_name=something 
item_number=AK-1234 
quantity=1 
shipping=3.04 
tax=2.02 
mc_currency=USD 
mc_fee=0.44 
mc_gross=12.34 
txn_type=web_accept 
txn_id=28325521 
notify_version=2.1 
custom=xyz123 
invoice=abc1234 
charset=windows-1252 
verify_sign=AFcWxV21C7fd0v3bYYYRCpSSRl31AM3F5ODR-2hb2fIsWPHepIEPzAwg