2010-03-12 12 views
21

Je veux créer une transaction simple sur mon site Web où, après la transaction de la personne terminée, je veux que paypal redirige l'utilisateur pour aller à un endroit sur mon site et je veux que PayPal me fournisse avec des détails afin que je puisse utiliser PHP pour l'analyser et leur envoyer le lien pour leur achat. Je ne suis pas sûr de ce que notify_url fait? MerciObtenir des informations de PayPal après une transaction

Répondre

55

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 des données POST à ​​cette URL pour votre serveur à traiter. Vous répondez à PayPal pour demander s'ils ont envoyé les données POST (plutôt qu'un imposteur) et s'ils répondent alors qu'il s'agit d'une transaction réelle, vous pouvez remettre le produit au client. Notez que tout cela se passe en arrière-plan pendant que votre acheteur est encore "sur" le site 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 à votre URL de retour, et ils peuvent (de nouveau) renvoyer les données de transaction (ils appellent ce PDT). Et vous pouvez vérifier à nouveau avec Paypal s'il s'agit d'une transaction valide et fournir un téléchargement, etc à ce moment-là.

Le bit le plus difficile que personne n'explique est que l'acheteur n'est pas redirigé vers votre URL de notification. c'est-à-dire que le "visiteur" de l'URL de notification de votre site Web est PayPal, et non l'acheteur, donc cela ne se produit pas dans le cadre de la session de votre acheteur. Si vous souhaitez persister une session à travers 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 l'utiliser pour rétablir une connexion avec la session utilisateur d'origine.

Vous avez vraiment besoin d'implémenter IPN et PDT - si l'email IPN échoue alors vous avez PDT comme une sauvegarde. Et si l'utilisateur ferme son navigateur Web avant de le rediriger vers votre page PDT, vous avez envoyé un e-mail IPN en tant que sauvegarde.

Recherche sur IPN et PDT et vous trouverez beaucoup d'informations. PayPal ont également une documentation complète et des exemples de scripts.

+0

Peut-être que je suis un malentendu, mais je pensais que c'est soit/ou.Je pensais que vous pouvez avoir PDT sur votre profil marchand, ou IPN, mais pas les deux. Pouvez-vous me montrer comment configurer à la fois PDT et IPN en même temps? – Volomike

+0

@Volomike: Lisez les deux derniers paragraphes [ici (paypal)] (https://cms.paypal.com/uk/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_admin_IPNIntro) et d'autres réponses SO comme [this un] (http://stackoverflow.com/questions/2836779/paypal-ipn-vs-pdt) –

+0

@JasonWilliams Le lien semble cassé. –

6

Notify URL doit 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 plus tard:

/** 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; 
    } 
2
$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']; 

} 
0

Lors de l'analyse de la réponse PDT, j'utilise parse_str. Puisque le corps de la réponse est encodée au format URL, il est juste une question de remplacer les sauts de ligne avec ampersands- comme celui-ci

$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 laisser le second paramètre ($ this-> détails) et les valeurs sont définies en tant que variables globales.

Questions connexes