2012-02-11 12 views
22

मुझे हमेशा लगता है कि txn_id आईपीएन संदेश के साथ भेजा गया अद्वितीय है। पेपैल दिशानिर्देश इस विचार का समर्थन करते हैं - https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_admin_IPNIntroपेपैल आईपीएन अद्वितीय पहचानकर्ता

डुप्लिकेट आईपीएन संदेशों से बचें। जांचें कि आपने आईपीएन संदेश में लौटाई गई लेनदेन आईडी द्वारा पहचाने गए लेनदेन को पहले ही संसाधित नहीं किया है। आपको फ़ाइल या डेटाबेस में आईपीएन संदेशों द्वारा लौटाए गए लेनदेन आईडी को स्टोर करने की आवश्यकता हो सकती है ताकि आप डुप्लिकेट की जांच कर सकें। यदि पेपैल द्वारा भेजी गई लेनदेन आईडी एक डुप्लिकेट है, तो आपको इसे फिर से संसाधित नहीं करना चाहिए।

हालांकि मुझे पता चला कि पेपैल के ई-चेक भुगतान आईपीएन को एक ही लेनदेन आईडी के साथ दो बार भेजा जाता है। एक बार payment_status के साथ शुरुआती भुगतान के दौरान "लंबित" के रूप में और फिर कुछ दिनों के बाद जब eCheck वास्तव में payment_status के साथ "पूर्ण" के रूप में प्रक्रिया करता है।

मैं दोनों लेनदेन को स्टोर करना चाहता हूं, लेकिन फिर भी डुप्लिकेट संग्रहीत करना टालना चाहूंगा। आईपीएन में एक और क्षेत्र है जिसे ipn_track_id कहा जाता है और यह दोनों लेनदेन के लिए अलग है, लेकिन मुझे इसके अस्पष्ट विवरण को छोड़कर, इसके लिए प्रलेखन नहीं मिल रहा है:

आंतरिक; केवल एमटीएस और डीटीएस

कोई अन्य व्यक्ति आईपीएन संदेशों की पहचान करने के लिए ipn_track_id का उपयोग कर रहा है?

+4

तार्किक रूप से यह एक लेनदेन है इसलिए समान txn_id। (प्राथमिक) कुंजी में payment_status जोड़ना हल करेगा, है ना? दस्तावेज़ शायद पढ़ा जाना चाहिए: एक ही स्थिति के लिए एक txn_id फिर से संसाधित नहीं किया जाना चाहिए। – rene

+0

यह समझ में आता है, सुझाव के लिए धन्यवाद। – arnaslu

+1

यह ध्यान देने योग्य है कि आपको केवल उस लेनदेन को संसाधित करना चाहिए जहां पेपल्स आईपीएन दिशानिर्देशों के अनुसार pay_status = "पूरा" हो। –

उत्तर

31

ipn_track_id का उपयोग नहीं किया जाना चाहिए; मुख्य रूप से क्योंकि यह केवल आंतरिक उपयोग के लिए है जैसा कि कहा गया है, और क्योंकि यह प्रत्येक आईपीएन संदेश के लिए अद्वितीय है।
txn_id प्रत्येक लेनदेन, नहीं प्रत्येक IPN संदेश के लिए अद्वितीय है।

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

छद्म कोड:

If not empty txn_id and txn_type = web_accept and payment_status = Completed 
    // New payment received; completed. May have been a transaction which was pending earlier. 
    Update database set payment_status = Completed and txn_id = $_POST['txn_id'] 

If not empty txn_id and txn_type = web_accept and payment_status = Pending 
    // New payment received; completed 
    Update database set payment_status = Pending and payment_reason = $_POST['pending_reason'] and txn_id = $_POST['txn_id'] 

आप https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_html_IPNandPDTVariables#id08CTB0S055Z

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

दस्तावेज में पेपैल के नोट के लिए: पेपैल अलग-अलग आईपीएन मैसेज भेज सकता है अगर उसे डिलीवरी के दौरान त्रुटियों का सामना करना पड़ता है। उदाहरण के लिए, जब भी पेपैल पोस्ट का आईपीएन डेटा होता है, तो आपकी स्क्रिप्ट के लिए उचित HTTP/1.1 200 ओके HTTP स्थिति प्रतिक्रिया वापस करने की आवश्यकता होती है।
यदि आप एक HTTP/1.1 200 ओके प्रतिक्रिया नहीं लौटाते हैं, तो पेपैल एक ही डेटा को प्रति इंडिविडल आईपीएन संदेश के 16 गुणा तक भेज देगा।

नोट: एक विक्रेता की लेनदेन आईडी एक खरीदार के ट्रांसक्शन आईडी से अलग है, क्योंकि वे दो अलग-अलग कार्रवाइयां (एक डेबिट, एक क्रेडिट) हैं।

8

ipn_track_id पुनरावर्ती भुगतान के लिए अद्वितीय नहीं है। कम से कम किस्त योजना के लिए यह नहीं है। जब ग्राहक किश्त योजना बनाते हैं और यदि आपकी योजना के चेकआउट पर पहला भुगतान होता है तो आपको उसी IPn_track_id (उदाहरण bellow) के साथ 2 आईपीएन संदेश प्राप्त होंगे।

पहला नोटिफ़िकेशन "recurring_payment_profile_created" पहला भुगतान "recurring_payment"

योजना IPN

[txn_type] => recurring_payment_profile_created 
[recurring_payment_id] => I-57UAPHFJ3SBY 
[product_name] => Risk-Free Trial 
[time_created] => 06:24:39 Aug 15, 2013 PDT 
[ipn_track_id] => bdd94fdee935a 

पहले भुगतान IPN

[txn_type] => recurring_payment 
[mc_gross] => 10.95 
[shipping] => 0.00 
[product_type] => 1 
[time_created] => 06:24:39 Aug 15, 2013 PDT 
[ipn_track_id] => bdd94fdee935a 
+0

यह! यह बेहद महत्वपूर्ण है और इसे अपने दस्तावेज में स्पष्ट रूप से सूचीबद्ध किया जाना चाहिए। आवर्ती भुगतान के लिए अद्वितीय होने पर इसे भरोसा नहीं किया जा सकता है। –

2

बनाया नहीं सभी IPN संदेश होते एक $ _POST ['txn_id'], तो अगर आप पूरी तरह से che एक txn_id के लिए ck, आप अंततः आईपीएन संदेशों को लॉग इन नहीं कर सकते हैं जहां उनमें यह कुंजी नहीं है।

1

मेरी पीएचपी API कॉल में, मैं इन क्षेत्रों का उपयोग करें और मेरे डेटाबेस में संग्रहीत: (डेटाबेस से

custom=xxxx 

(या invoice=ZZZZZZ)

तब, जब अपने पृष्ठ IPN प्राप्त करता है, यह जाँच करनी चाहिए) यदि custom=xxxx या आदि ...

-1

आईपीएन लेनदेन अद्वितीय हैं, और लेनदेन जो भुगतान को बदलते हैं, एक नया txn_id उत्पन्न करेंगे। उदाहरण के लिए धनवापसी, इसलिए एक ही खरीद से संबंधित सभी txn_id को स्टोर करना एक अच्छा विचार है। अभी तक मुझे नहीं पता कि धनवापसी के अलावा अन्य लेनदेन एक नया txn_id उत्पन्न करते हैं, संभवतः उलट भी करते हैं।

+0

"आईपीएन लेनदेन" जैसी कोई चीज़ नहीं है। ओपी के प्रदर्शन के रूप में, पेपैल की लेनदेन आईडी विशिष्ट रूप से आईपीएन संदेशों की पहचान करने का एक तरीका नहीं है। – Dai

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