2025, Oct 16 23:31
Stripe subscription में PaymentIntent से confirmation_secret पर माइग्रेशन
Stripe के Basil अपडेट में invoice–PaymentIntent संबंध बदला। latest_invoice.confirmation_secret expand कर फ्रंटएंड भुगतान पुष्टि करें और AttributeError से बचें।
Stripe में सदस्यता बनाते समय और फ्रंटएंड पर प्रारंभिक भुगतान की पुष्टि करते हुए, कई डेवलपर पहली इनवॉइस के जरिए PaymentIntent का client_secret निकालते हैं। यदि आप latest_invoice.payment_intent को expand कर रहे हैं और फिर भी payment_intent पर AttributeError मिल रहा है, तो आप हाल ही के एक ब्रेकिंग बदलाव से टकरा रहे हैं।
समस्या को ट्रिगर करने वाला उदाहरण
यह सदस्यता payment_behavior को default_incomplete पर सेट करके बनाई गई है और expand में नवीनतम इनवॉइस पर मौजूद PaymentIntent को लक्षित किया गया है। इसके बाद payment_intent.client_secret तक पहुंचने का प्रयास विफल हो जाता है।
import stripe
stripe.api_key = 'sk_test_...'
unit_price = 'price_...'
plan_sub = stripe.Subscription.create(
    customer=acct_user.id,
    items=[{'price': unit_price}],
    payment_behavior='default_incomplete',
    expand=['latest_invoice.payment_intent'],
)
secret_for_ui = plan_sub.latest_invoice.payment_intent.client_secret
असल में क्या बदला है और क्यों
Stripe ने एक बड़ा API अपडेट (Basil) जारी किया है, जिसने इनवॉइस और पेमेंट्स के संबंध को बदल दिया है। stripe-python SDK नवीनतम API संस्करण का अनुसरण करता है, इसलिए वर्तमान SDK का उपयोग करना मतलब है कि आप इसी नए API व्यवहार पर हैं। Basil में, एक इनवॉइस और एकल PaymentIntent के बीच सीधा संबंध हटा दिया गया है ताकि एक ही इनवॉइस पर कई आंशिक भुगतान संभव हो सकें। नतीजतन, नए बनाए गए ऑब्जेक्ट्स पर latest_invoice.payment_intent अब मौजूद नहीं होता, भले ही आप उसे expand करें—यही कारण है कि AttributeError दिखाई देता है।
Stripe के changelog में इस बदलाव और माइग्रेशन का तरीका समझाया गया है। इनवॉइस पर मौजूद PaymentIntent से client_secret लेने के बजाय, अब आपको इनवॉइस से सीधे नया confirmation_secret पढ़ना चाहिए। सामान्य changelog यहां देखें: docs.stripe.com/changelog और इस परिवर्तन की विशेष प्रविष्टि यहां: Basil changelog। नए प्रॉपर्टी का विवरण यहां उपलब्ध है: Invoice.confirmation_secret।
समाधान और फ्रंटएंड के लिए secret कैसे प्राप्त करें
PaymentIntent के स्थान पर इनवॉइस से confirmation_secret माँगें। सदस्यता बनाते समय latest_invoice.confirmation_secret को expand करें, फिर लौटे हुए ऑब्जेक्ट से इसे पढ़कर फ्रंटएंड पर उपयोग करें।
plan_sub = stripe.Subscription.create(
    customer=acct_user.id,
    items=[{'price': unit_price}],
    payment_behavior='default_incomplete',
    expand=['latest_invoice.confirmation_secret'],
)
ui_token = plan_sub.latest_invoice.confirmation_secret
इससे आपको वह टोकन मिल जाएगा जिसकी ज़रूरत क्लाइंट पर भुगतान फ्लो पूरा करने के लिए होती है।
यह क्यों महत्वपूर्ण है
सदस्यता से जुड़े भुगतान प्रवाह अक्सर पहली ही चार्ज पर निर्भर होते हैं। यदि आपका कोड मानता है कि latest_invoice के नीचे एक PaymentIntent मौजूद है, तो Basil API पर यह टूट जाएगा। confirmation_secret पर माइग्रेट करने से आपकी इंटीग्रेशन कई आंशिक भुगतानों के समर्थन के अनुरूप हो जाती है और रनटाइम त्रुटियों से बचाती है, जबकि फ्रंटएंड पर पुष्टि करने की प्रक्रिया बिना बाधा जारी रहती है।
निष्कर्ष
यदि आप payment_behavior को default_incomplete पर रखकर सदस्यताएँ बना रहे हैं और क्लाइंट-साइड पुष्टि के लिए secret चाहिए, तो latest_invoice.payment_intent को expand करना बंद करें और latest_invoice.confirmation_secret को expand करना शुरू करें। Stripe के changelog पर नज़र बनाए रखें—खासतौर पर Basil जैसी प्रमुख रिलीज़ पर—ताकि ब्रेकिंग बदलाव समय रहते दिखें और आपके भुगतान प्रवाह स्थिर रहें।
यह लेख StackOverflow पर प्रश्न (लेखक: Br0k3nS0u1) और koopajah के उत्तर पर आधारित है।