2010-03-12 10 views
21

मैं अपनी वेब साइट पर एक साधारण लेनदेन बनाना चाहता हूं जहां व्यक्ति के लेन-देन पूरा होने के बाद, मैं पेपैल को उपयोगकर्ता को अपनी साइट पर किसी स्थान पर जाने के लिए रीडायरेक्ट करना चाहता हूं और मैं चाहता हूं कि पेपैल मुझे प्रदान करे विवरण के साथ मैं PHP को इसका विश्लेषण करने के लिए उपयोग कर सकता हूं और उन्हें अपनी खरीद के लिंक को ईमेल कर सकता हूं। मुझे यकीन नहीं है कि notify_url क्या करता है? धन्यवादलेनदेन के बाद पेपैल से जानकारी प्राप्त करें

उत्तर

55

पेपैल इस तरह काम करता है:

आप एक "खरीदें" बटन के साथ एक रूप है। जब इसे क्लिक किया जाता है, तो यह पेपैल को जानकारी (उत्पाद, मूल्य, आपका खाता नाम इत्यादि) भेजता है।

खरीदार तब भुगतान करने के लिए सहमत होता है जब लेनदेन पूरा हो जाता है, पेपैल आपके यूआरएल को सूचित करने के लिए "आईपीएन" (तत्काल भुगतान अधिसूचना) भेजता है - यह आपके सर्वर को प्रक्रिया के लिए उस यूआरएल में पोस्ट डेटा भेजता है। आप पेपैल से यह पूछने के लिए जवाब देते हैं कि क्या उन्होंने POST डेटा भेजा है (एक प्रेरक के बजाए) और यदि वे जवाब देते हैं कि यह वास्तविक लेनदेन है, तो आप उत्पाद को ग्राहक को छोड़ सकते हैं। ध्यान दें कि यह सब पृष्ठभूमि में होता है जबकि आपका खरीदार अभी भी पेपैल वेबसाइट पर "पर" है।

अंतिम वैकल्पिक चरण है, जो कि पेपैल खरीदार को आपकी वेबसाइट पर लौटाता है। इस मामले में, वे खरीदार को आपके "रिटर्न" यूआरएल पर वापस भेजते हैं, और वे लेनदेन डेटा को दोबारा पास कर सकते हैं (वे इस पीडीटी को कॉल करते हैं)। और यदि आप एक वैध लेनदेन है और उस बिंदु पर एक डाउनलोड आदि प्रदान करते हैं तो आप फिर से पेपैल से जांच सकते हैं।

सबसे मुश्किल बात यह है कि कोई भी बताता है कि खरीदार आपके अधिसूचना यूआरएल पर रीडायरेक्ट नहीं होता है। यानी आपकी वेबसाइट के अधिसूचना यूआरएल में "विज़िटर" पेपैल है, खरीदार नहीं है, इसलिए यह आपके खरीदार के सत्र के हिस्से के रूप में नहीं होता है। यदि आप इस प्रक्रिया के तीन हिस्सों में एक सत्र जारी रखना चाहते हैं, तो आपको अपने फॉर्म में खरीदार को ट्रैक करने का साधन बनाना होगा, और "कस्टम" नामक फॉर्म के क्षेत्र में पेपैल को पास करना होगा। यह डेटा आपको आईपीएन और पीडीटी डेटा में वापस भेज दिया गया है, और आप इसे मूल उपयोगकर्ता सत्र के साथ कनेक्शन को दोबारा स्थापित करने के लिए उपयोग कर सकते हैं।

आपको वास्तव में आईपीएन और पीडीटी दोनों को लागू करने की आवश्यकता है - यदि आईपीएन ईमेल विफल रहता है तो आपके पास बैकअप के रूप में पीडीटी है। और यदि उपयोगकर्ता आपके पीडीटी पृष्ठ पर रीडायरेक्ट किए जाने से पहले अपने वेब ब्राउज़र को बंद कर देता है, तो आपने बैकअप के रूप में एक आईपीएन ईमेल भेजा है।

आईपीएन और पीडीटी पर खोजें और आपको बहुत सारी जानकारी मिल जाएगी। PayPal में पूर्ण प्रलेखन और उदाहरण स्क्रिप्ट भी हैं।

+0

शायद मैं गलतफहमी कर रहा हूं, लेकिन मैंने सोचा कि यह या तो है या।मैंने सोचा कि आप या तो अपने व्यापारी प्रोफाइल, या आईपीएन पर पीडीटी कर सकते हैं, लेकिन दोनों नहीं। क्या आप मुझे दिखा सकते हैं कि एक ही समय में पीडीटी और आईपीएन दोनों को कैसे सेटअप किया जाए? – Volomike

+0

@ वोलोमाइक: पिछले दो पैराग्राफ पढ़ें [यहां (पेपैल)] (https://cms.paypal.com/uk/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_admin_IPNIntro) और अन्य SO उत्तर जैसे [यह एक] (http://stackoverflow.com/questions/2836779/paypal-ipn-vs-pdt) –

+0

@ जेसनविल्लियम्स लिंक टूटा हुआ लगता है। –

6

सूचित यूआरएल स्क्रिप्ट है कि इस तरह के रूप में पेपैल से दिए गए डेटा, बचाता है करने के लिए नेतृत्व करना चाहिए:

/** 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; 
     } 
    } 

तुम भी बाद में एक सत्यापित करने के लिए चुन सकते हैं:

/** 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

पीडीटी प्रतिक्रिया को पार्स करते समय मैं parse_str का उपयोग कर रहा हूं। यूआरएल इनकोडिंग यह आवेदन आप भी दूसरा पैरामीटर ($ this-> विवरण बाहर छोड़ सकते हैं पर निर्भर करता है इस

$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; 

        } 

तरह ampersands- साथ पंक्ति विराम की जगह का मामला है के बाद से प्रतिक्रिया का मुख्य भाग है) और मान वैश्विक चर के रूप में सेट हैं।

संबंधित मुद्दे