web-dev-qa-db-fra.com

Obtenir des informations de Paypal après une transaction

Je souhaite créer une transaction simple sur mon site Web. Après la transaction, je souhaite que Paypal redirige l'utilisateur vers un emplacement de mon site et que Paypal me fournisse des détails permettant d'utiliser PHP pour l'analyser et leur envoyer le lien vers leur achat. Je ne suis pas sûr de ce que notify_url fait? Merci

24
jmasterx

Paypal fonctionne comme ceci:

Vous avez un formulaire avec un bouton "acheter". Lorsque vous cliquez dessus, il envoie des informations (produit, prix, nom de votre compte, etc.) à Paypal.

L'acheteur accepte alors de vous payer et lorsque la transaction est terminée, Paypal envoie un "IPN" (notification de paiement instantanée) à votre URL de notification - il envoie POST les données à cette URL pour que votre serveur les traite. Vous répondez à Paypal pour lui demander s’il a envoyé les données POST (plutôt qu’un imposteur) et s’il répond ensuite qu’il s’agit d’une transaction réelle, vous pouvez transmettre le produit au client. Notez que tout cela se passe en arrière-plan lorsque votre acheteur est toujours "sur" le site Web de Paypal.

Il existe une dernière étape facultative, à savoir que Paypal renvoie l'acheteur sur votre site Web. Dans ce cas, ils renvoient l'acheteur vers votre URL de "retour" et ils peuvent (éventuellement) renvoyer les données de la transaction à nouveau (ils appellent ce PDT). Et vous pouvez à nouveau vérifier avec Paypal s'il s'agit d'une transaction valide et fournir un téléchargement, etc. à ce stade.

Le problème le plus difficile que personne n’explique, c’est que le acheteur ne soit pas redirigé vers votre URL de notification. c'est-à-dire que le "visiteur" de l'URL de notification de votre site Web est Paypal, pas l'acheteur, donc cela ne se produit pas dans le cadre de la session de votre acheteur. Si vous souhaitez conserver une session dans les trois parties de ce processus, vous devez créer un moyen de suivre l'acheteur dans votre formulaire et le transmettre à Paypal dans un champ du formulaire appelé "personnalisé". Ces données vous sont renvoyées dans les données IPN et PDT, et vous pouvez les utiliser pour rétablir une connexion avec la session utilisateur d'origine.

Vous devez vraiment implémenter à la fois IPN et PDT - en cas d'échec de la messagerie IPN, vous disposez de PDT en tant que sauvegarde. Et si l'utilisateur ferme son navigateur Web avant d'être redirigé vers votre page PDT, vous avez alors envoyé un courrier électronique IPN en tant que sauvegarde.

Recherchez sur IPN et PDT et vous trouverez beaucoup d’informations. Paypal possède également une documentation complète et des exemples de scripts.

57
Jason Williams

Notify URL devrait conduire au script qui enregistre les données renvoyées par Paypal, telles que:

   /** Fetch order from Paypal (IPN reply)
    * @return int received ID of inserted row if received correctly, 0 otherwise
    */
   function FetchOrder()
   {
   $transactionID=$_POST["txn_id"];
   $item=$_POST["item_name"];
   $amount=$_POST["mc_gross"];
   $currency=$_POST["mc_currency"];
   $datefields=explode(" ",$_POST["payment_date"]);
   $time=$datefields[0];
   $date=str_replace(",","",$datefields[2])." ".$datefields[1]." ".$datefields[3];
   $timestamp=strtotime($date." ".$time);
   $status=$_POST["payment_status"];
   $firstname=$_POST["first_name"];
   $lastname=$_POST["last_name"];
   $email=$_POST["payer_email"];
   $custom=$_POST["option_selection1"];
   if ($transactionID AND $amount)
      {
      // query to save data
      return $this->insertID;
      }
   else
      {
      return 0;
      }
   }

Vous pouvez également choisir de vérifier une commande ultérieurement:

/** Verify Paypal order (IPN)
    * Paypal returns VERIFIED or INVALID on request
    * @return bool verified 1 if verified, 0 if invalid
    */
   function VerifyOrder()
   {
   $_POST["cmd"]="_notify-validate";
   $ch=curl_init();
   curl_setopt($ch,CURLOPT_HEADER,0);
   curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
   curl_setopt($ch,CURLOPT_USERAGENT,"your agent - replace");
   curl_setopt($ch,CURLOPT_URL,"https://www.Paypal.com/cgi-bin/webscr");
   curl_setopt($ch,CURLOPT_POST, 1);
   foreach ($_POST as $key=>$value)
      {
      $string.="&".$key."=".urlencode(stripslashes($value));
      }
   curl_setopt($ch, CURLOPT_POSTFIELDS, $string);
   $result=curl_exec($ch);
   if ($result=="VERIFIED") return 1;
   else return 0;
   }
6
dusoft
$tx=$_REQUEST['tx'];

$Paypal_url='https://www.Paypal.com/cgi-bin/webscr?cmd=_notify-synch&tx='.$tx.'&at=token here';

$curl = curl_init($Paypal_url);

$data = array(

"cmd" => "_notify-synch",

"tx" => $tx,

"at" => "token here"


);                                                                    

$data_string = json_encode($data); 

curl_setopt ($curl, CURLOPT_HEADER, 0);

curl_setopt ($curl, CURLOPT_POST, 1);

curl_setopt ($curl, CURLOPT_POSTFIELDS, $data_string);

curl_setopt ($curl, CURLOPT_SSL_VERIFYPEER, 0);

curl_setopt ($curl, CURLOPT_RETURNTRANSFER, 1);

curl_setopt ($curl, CURLOPT_SSL_VERIFYHOST, 1);

$headers = array (

'Content-Type: application/x-www-form-urlencoded',

'Host: www.Paypal.com',

'Connection: close'

);

curl_setopt ($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);

curl_setopt ($curl, CURLOPT_HTTPHEADER, $headers);

$response = curl_exec($curl);

$lines = explode("\n", $response);

$keyarray = array();

if (strcmp ($lines[0], "SUCCESS") == 0) {

for ($i=1; $i<count($lines);$i++){

list($key,$val) = explode("=", $lines[$i]);

$keyarray[urldecode($key)] = urldecode($val);

}


$first_name=$keyarray['first_name'];

$last_name=$keyarray['last_name'];

$payment_status=$keyarray['payment_status'];

$business=$keyarray['business'];

$payer_email=$keyarray['payer_email'];

$payment_gross=$keyarray['payment_gross'];

$mc_currency=$keyarray['mc_currency']; 

}
2
krishana singh

Lors de l'analyse de la réponse PDT, j'utilise parse_str . Comme le corps de la réponse est encodé en url, il suffit de remplacer les sauts de ligne par des esperluettes - comme ceci

$result = curl_exec($ch);    
//replace the breaks with '&'
$r_string = str_replace("\n", "&", $result);
//parse the response into a key->value array
                    parse_str($r_string, $this->details);
                    if(!isset($this->details['SUCCESS'])){
                 //the "SUCCESS" or "FAIL" response is the first key   
    return FALSE;
                    }
                    else{
//the values of the response are now in an array
                        return TRUE;

                    }

en fonction de l'application, vous pouvez même omettre le deuxième paramètre ($ this-> details) et les valeurs sont définies en tant que variables globales. 

0
Ethan