2015-12-16 9 views
8

पर पेपैल एकीकरण मैं https://developer.paypal.com/docs/api/ पढ़ने के बाद पेपैल प्रवाह घटना को थोड़ा गलत समझ रहा हूं। मैं अपनी साइट पर एक्सप्रेस चेकआउट और क्रेडिट कार्ड भुगतान को एकीकृत करना चाहता हूं। मैं बिना किसी फ्लास्क एक्सटेंशन के Flask और paypalrestsdk का उपयोग कर रहा हूं। मेरे ऐप सेफ्लास्क एप्लिकेशन

यहाँ है कुछ अंश:

@app.route('/', methods=['GET']) 
def index(): 
    # Page with but form, price/quantity/name values 
    # are stored in hidden fields, "Buy now" acts as submit 
    return render_template('index.html') 

@app.route('/payment/paypal', methods=['POST']) 
def payment_paypal(): 
    # Here I am creating dict with required params 
    payment_template = { 
     'intent': 'sale', 
     'payer': {'payment_method': 'paypal'}, 
     'redirect_urls': { 
      'return_url': url_for('payment_paypal_execute'), 
      'cancel_url': url_for('payment_paypal_error') 
     }, 
     ...... 
    } 

    payment = paypalrestsdk.Payment(payment) 

    if payment.create(): 
     print('Payment "{}" created successfully'.format(payment.id)) 

     for link in payment.links: 
      if link.method == "REDIRECT": 
       redirect_url = str(link.href) 
       print('Redirect for approval: {}'.format(redirect_url)) 
       return redirect(redirect_urls) 

@app.route('/payment/paypal/execute', methods=['GET']) 
def payment_paypal_execute(): 
    payer_id = request.args.get('payerId') 
    payment_id = request.args.get('paymentId') 
    token = request.args.get('token') 

    pending_payment = PayPalPayment.query.filter_by(token=token).filter_by(state='created').first_or_404() 

    try: 
     payment = paypalrestsdk.Payment.find(pending_payment.payment_id) 
    except paypalrestsdk.exceptions.ResourceNotFound as ex: 
     print('Paypal resource not found: {}'.format(ex)) 
     abort(404) 

    if payment.execute({"payer_id": payer_id}): 
     pending_payment.state = payment.state 
     pending_payment.updated_at = datetime.strptime(payment.update_time, "%Y-%m-%dT%H:%M:%SZ") 
     db.session.commit() 
     return render_template('payment/success.html', payment_id=payment.id, state=payment.state) 

    return render_template('payment/error.html', payment_error=payment.error, step='Finallizing payment') 

यह है ठीक काम करता है, बटन payment उपयोगकर्ता अनुमोदन पृष्ठ पर पुनः निर्देशित (राज्य created के साथ) को सफलतापूर्वक बना लिया पर क्लिक करने के बाद। वहां वह "पुष्टि करें" पर क्लिक करें ... और जब मैं return_url निर्दिष्ट करता हूं, तो मैं कभी भी अपने आवेदन पर वापस नहीं आया, घटना! अर्थात। आवेदन को कभी सूचित नहीं किया जा सकता था कि खरीदार ने अनुमोदित भुगतान किया है और इसे अपने डेटाबेस में अपडेट किया जाना चाहिए और उस व्यक्ति को नया लाइसेंस भेजा जाना चाहिए।

समस्याएं:

  1. मैं कुछ pyhtonrestsdk का उपयोग कर कॉलबैक परिभाषित करने के लिए जिस तरह से नहीं मिल रहा। यह कैसे करना है?

  2. भले ही मैं कॉलबैक जोड़ रहा हूं (मैंने शुद्ध जावास्क्रिप्ट बटन कोड का उपयोग करके एक्सप्रेस चेकआउट एम्बेड करने का प्रयास किया) data-callback के साथ मेरा आवेदन नहीं कहा गया था। मुझे संदेह है क्योंकि दूरस्थ सर्वर http://127.0.0.1/payment/paypal/success

  3. उपयोगकर्ता "पुष्टि" पर क्लिक करने के तुरंत बाद पेपैल पुष्टिकरण के साथ विंडो बंद कर सकता था, इसलिए मैं किसी भी तरह से ब्राउज़र पुनर्निर्देशन पर भरोसा नहीं कर सका।

अंत में, मुझे संदेह है कि मुझे पेपैल वर्कफ़्लो स्पष्ट नहीं है, लेकिन मुझे डेवलपर पोर्टल पर ईवेंट के बारे में अधिक जानकारी नहीं मिली।

+0

जब मैं रीडायरेक्ट करने का प्रयास करता हूं तो मुझे कुछ अजीब सीओआरएस त्रुटि मिल रही है। "अनुरोधित संसाधन पर paypal.sandbox.com नहीं 'एक्सेस-कंट्रोल-अनुमति-उत्पत्ति' हेडर लोड करने में असमर्थ है।" – shell

उत्तर

2

सामान्य रूप से, शैतान विवरण में छुपाता है। मेरा मुख्य मुद्दा निम्न था: पेपैल मुझे मेरे आवेदन पर रीडायरेक्ट नहीं करता है, लेकिन मैंने पाया कि यह मुझे URL (पुष्टि के बाद) को यूआरएल पर रीडायरेक्ट करता है जो https://sandbox.paypal.com/ जैसा क्वेरी स्ट्रिंग के वांछित पैरामीटर के साथ दिखता है। अर्थात। redirect_urls अपेक्षित काम करता है, बस मुझे गलत होस्ट पर रीडायरेक्ट करता है।

इसके बाद मुझे याद आया कि url_forसंबंधित लिंक उत्पन्न करता है। तो बस जोड़ा गया कीवर्ड _external=True मुझे सभी आवश्यक तर्कों के साथ अपने आवेदन पर रीडायरेक्ट कर दिया गया है और भुगतान सफलतापूर्वक पुष्टि और निष्पादित किया गया है।

आईई। सही redirect_urls को अवरुद्ध कर देगा लगता है:

'redirect_urls': { 
    'return_url': url_for('payment_paypal_execute', _external=True), 
    'cancel_url': url_for('payment_paypal_error', _external=True) 
} 

अंत में मैं कार्यप्रवाह निम्नलिखित है:

  1. खोला / (index) जो बटन Pay with PayPal है यह प्रपत्र अंदर छवि बटन है। इस बटन फॉर्म के अलावा, छुपे हुए फ़ील्ड में राशि, उत्पाद का नाम और मात्रा है (वास्तव में यदि यह अच्छा विचार नहीं है क्योंकि हम उपयोगकर्ता पर भरोसा नहीं कर सकते हैं, इसलिए मैं केवल product_license_type_id संग्रहीत करता हूं जो डीबी में संग्रहीत होता है और इसमें उत्पाद के बारे में सभी आवश्यक जानकारी होती है)।

  2. एक बार इसे क्लिक किया गया POST 'भुगतान/पेपैल' (paypal_create) पर फॉर्म जहां सभी फ़ील्ड भरने के साथ ऑब्जेक्ट Payment बनाएं।यदि payment.create कॉल सफलतापूर्वक समाप्त हुआ है तो यह payment_id और state (पेपैल वर्कफ़्लो से संबंधित ये फ़ील्ड, वास्तव में मैं अपने ऐप से संबंधित अन्य फ़ील्ड को संग्रहीत कर रहा हूं) के साथ अपने डेटाबेस में रिकॉर्ड भी बनाता हूं।

  3. पेपैल पक्ष पर भुगतान किए जाने के बाद, आवेदन payment.links सूची के लिए प्रतिक्रिया में देखें। हम rel == 'approval_url' के साथ एक और method == 'REDIRECT' समीक्षा शिपिंग पता करना चाहते हैं और flask.redirect(found_link)

  4. पेपैल साइट खरीदार पर वापसी 'स्वीकृत करें' क्लिक करना चाहिए, और उसके बाद वह तुरंत क्वेरी स्ट्रिंग में मानकों का पालन करते हुए redirect_urls.return_url पुनः निर्देशित किया जाएगा:, tokenPayerID, paymentId

  5. एक बार वापस पुनर्निर्देशित आप क्वेरी स्ट्रिंग (ध्यान में रखना - यह केस-संवेदी है) से इस पैरामीटर मिलना चाहिए, पेपैल एपीआई (payment = paypalrestsdk.Payment.find(payment_id)) का उपयोग कर भुगतान पाते हैं और यह (payment.execute({"payer_id": payer_id}):) को अंतिम रूप देने।

  6. जब भुगतान को अंतिम रूप दिया गया तो approved पर भुगतान की स्थिति बदल दी गई।

  7. ....

  8. लाभ!

युपीडी: आप आप में "AutoRedirect" को चालू करने खाता प्राथमिकताओं और कई साइटों में एक खाते एकीकृत करने के लिए उपयुक्त इस दृष्टिकोण को बेचने की जरूरत नहीं है।

+0

दूसरी टिप्पणी के लिए खेद है, लेकिन जब मैं रीडायरेक्ट करने का प्रयास करता हूं तो चरण 3 पर मुझे "paypal.sandbox.com no 'access-control-Allow-Origin' लोड करने में असमर्थता मिलती है। मैं स्थानीय रूप से फ्लास्क चला रहा हूं। क्या यह आपके लिए हुआ? – shell

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