2010-04-16 9 views
2

J'utilise PayPal 'acheter maintenant' sur mon site pour vendre des produits. Étant donné que je garde une trace du nombre d'unités en stock pour chaque produit dans une base de données MySQL et que je souhaite automatiser le suivi des stocks dans le système, j'utilise la fonctionnalité Instant Payment Notification de PayPal pour me signaler qu'un achat a été effectué. terminé. Lorsque Paypal indique à mon gestionnaire qu'un achat valide a été effectué, le script met à jour ma base de données MySQL en soustrayant '1' de l'inventaire du produit acheté.Paypal IPN Handler pour Panier

J'ai joint mon code PHP IPN ci-dessous qui fonctionne avec succès avec Paypal acheter maintenant des boutons (un achat à la fois). Ma question est la suivante: Je souhaite remplacer les boutons «acheter maintenant» par les boutons «ajouter au panier» de PayPal afin que les clients puissent acheter plus d'un produit à la fois. Je ne sais pas comment je dois modifier mon code ci-dessous pour le laisser boucler tous les articles achetés et mettre à jour ma base de données en conséquence. Toute aide serait grandement appréciée!

Le code:

// Paypal POSTs HTML FORM variables to this page 
// we must post all the variables back to paypal exactly unchanged and add an extra parameter cmd with value _notify-validate 

// initialise a variable with the requried cmd parameter 
$req = 'cmd=_notify-validate'; 

// go through each of the POSTed vars and add them to the variable 
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"; 

// In a live application send it back to www.paypal.com 
// but during development you will want to uswe the paypal sandbox 

// comment out one of the following lines 

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

// or use port 443 for an SSL connection 
//$fp = fsockopen ('ssl://www.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) { 


     $item_name = stripslashes($_POST['item_name']); 
     $item_number = $_POST['item_number']; 
     $item_id = $_POST['custom']; 
     $payment_status = $_POST['payment_status']; 
     $payment_amount = $_POST['mc_gross'];   //full amount of payment. payment_gross in US 
     $payment_currency = $_POST['mc_currency']; 
     $txn_id = $_POST['txn_id'];     //unique transaction id 
     $receiver_email = $_POST['receiver_email']; 
     $payer_email = $_POST['payer_email']; 
     $size = $_POST['option_selection1']; 
     $item_id = $_POST['item_id']; 
     $business = $_POST['business']; 



     if ($payment_status == 'Completed') { 
// UPDATE THE DATABASE  


     } 

Répondre

0

On ne sait pas ce que vous demandez. J'ai écrit un auditeur IPN PayPal pour Website Payment Pro. J'ai commencé par regarder ici PayPal Documentation: IPN Sample Code puis en changeant le code comme j'avais besoin. S'il vous plaît ajouter quelques détails à votre question.

+0

Merci beaucoup pour la réponse, Christopher! J'ai légèrement modifié ma question pour espérer être un peu plus clair. J'ai regardé le lien que vous avez fourni et cela m'a l'air très utile ... mais, et peut-être que je comprends mal, ce script ne traiterait qu'un élément à la fois, n'est-ce pas? Et s'il s'agissait d'une vérification d'un panier (les boutons "Ajouter au panier" de PayPal) avec 4 articles différents? Je me demande ce qu'il faut changer avec ce code pour accommoder cela. – kimmothy16

1

Il vous sera probablement plus facile de collecter tous les ID d'article dans un ID de commande, puis d'envoyer cet ID de commande avec votre POST à ​​PayPal. Une fois que l'IPN revient avec vos coordonnées, vérifiez et calculez que la somme totale de tous les articles dans l'ID de la commande correspond à la somme que l'IPN a déclaré avoir été payée.

Interrogez votre base de données pour l'ID de la commande et obtenez tous les ID d'article qui y sont connectés, puis réduisez le numéro de stock pour chacun des ID d'article.

Espérons que ça aide. C'est juste une façon de le faire!