> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dodopayments.com/llms.txt
> Use this file to discover all available pages before exploring further.

# सदस्यता एकीकरण गाइड

> यह गाइड आपको अपने वेबसाइट में डोडो पेमेंट्स सदस्यता उत्पाद को एकीकृत करने में मदद करेगी।

## पूर्वापेक्षाएँ

डोडो पेमेंट्स API को एकीकृत करने के लिए, आपको आवश्यकता होगी:

* एक डोडो पेमेंट्स व्यापारी खाता
* डैशबोर्ड से API क्रेडेंशियल्स (API कुंजी और वेबहुक गुप्त कुंजी)

पूर्वापेक्षाओं पर अधिक विस्तृत गाइड के लिए, इस [अनुभाग](/developer-resources/integration-guide#dashboard-setup) की जांच करें।

## API एकीकरण

### चेकआउट सत्र

Use Checkout Sessions to sell subscription products with a secure, hosted checkout. Pass your subscription product in `product_cart` and redirect customers to the returned `checkout_url`.

<Tip>
  **Mixed Checkout**: आप एक ही चेकआउट सत्र में subscription उत्पादों को एक-बार के उत्पादों के साथ मिला सकते हैं। यह सेटअप शुल्क के साथ subscription, हार्डवेयर बंडल्स के साथ SaaS, और अन्य उपयोग-मामलों को सक्षम करता है। उदाहरणों के लिए [Checkout Sessions guide](/developer-resources/checkout-session) देखें।
</Tip>

<Tabs>
  <Tab title="Node.js SDK">
    ```javascript theme={null}
    import DodoPayments from 'dodopayments';

    const client = new DodoPayments({
      bearerToken: process.env.DODO_PAYMENTS_API_KEY,
      environment: 'test_mode', // defaults to 'live_mode'
    });

    async function main() {
      const session = await client.checkoutSessions.create({
        product_cart: [
          { product_id: 'prod_subscription_monthly', quantity: 1 }
        ],
        // Optional: configure trials for subscription products
        subscription_data: { trial_period_days: 14 },
        customer: {
          email: 'subscriber@example.com',
          name: 'Jane Doe',
        },
        return_url: 'https://example.com/success',
      });

      console.log(session.checkout_url);
    }

    main();
    ```
  </Tab>

  <Tab title="Python SDK">
    ```python theme={null}
    import os
    from dodopayments import DodoPayments

    client = DodoPayments(
        bearer_token=os.environ.get("DODO_PAYMENTS_API_KEY"),
        environment="test_mode",  # defaults to "live_mode"
    )

    session = client.checkout_sessions.create(
        product_cart=[
            {"product_id": "prod_subscription_monthly", "quantity": 1}
        ],
        subscription_data={"trial_period_days": 14},  # optional
        customer={
            "email": "subscriber@example.com",
            "name": "Jane Doe",
        },
        return_url="https://example.com/success",
    )

    print(session.checkout_url)
    ```
  </Tab>

  <Tab title="REST API">
    ```javascript theme={null}
    const response = await fetch('https://test.dodopayments.com/checkouts', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'Authorization': `Bearer ${process.env.DODO_PAYMENTS_API_KEY}`
      },
      body: JSON.stringify({
        product_cart: [
          { product_id: 'prod_subscription_monthly', quantity: 1 }
        ],
        subscription_data: { trial_period_days: 14 }, // optional
        customer: {
          email: 'subscriber@example.com',
          name: 'Jane Doe'
        },
        return_url: 'https://example.com/success'
      })
    });

    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`);
    }

    const session = await response.json();
    console.log(session.checkout_url);
    ```
  </Tab>
</Tabs>

### API प्रतिक्रिया

निम्नलिखित प्रतिक्रिया का एक उदाहरण है:

```json theme={null}
{
  "session_id": "cks_Gi6KGJ2zFJo9rq9Ukifwa",
  "checkout_url": "https://test.checkout.dodopayments.com/session/cks_Gi6KGJ2zFJo9rq9Ukifwa"
}
```

ग्राहक को `checkout_url` पर रीडायरेक्ट करें।

### Webhooks

सब्सक्रिप्शन को एकीकृत करते समय, आपको सब्सक्रिप्शन जीवनचक्र को ट्रैक करने के लिए वेबहुक प्राप्त होंगे। ये वेबहूक आपको सब्सक्रिप्शन स्थितियों और भुगतान परिदृश्यों को प्रभावी ढंग से प्रबंधित करने में मदद करते हैं।

अपना वेबहुक एंडपॉइंट सेट अप करने के लिए, कृपया हमारे [विस्तृत इंटीग्रेशन गाइड](/developer-resources/integration-guide#implementing-webhooks) का पालन करें।

#### सब्सक्रिप्शन इवेंट प्रकार

निम्नलिखित वेबहूक इवेंट्स सब्सक्रिप्शन स्थिति परिवर्तनों को ट्रैक करते हैं:

1. **`subscription.active`** - सब्सक्रिप्शन सफलतापूर्वक सक्रिय है।
2. **`subscription.updated`** - सब्सक्रिप्शन ऑब्जेक्ट अपडेट किया गया था (किसी भी फ़ील्ड में बदलाव पर फायर होता है)।
3. **`subscription.on_hold`** - असफल रिन्यूअल के कारण सब्सक्रिप्शन होल्ड पर है।
4. **`subscription.failed`** - मैंडेट निर्माण के दौरान सब्सक्रिप्शन निर्माण विफल रहा।
5. **`subscription.renewed`** - अगली बिलिंग अवधि के लिए सब्सक्रिप्शन का नवीनीकरण किया गया।

विश्वसनीय सब्सक्रिप्शन जीवनचक्र प्रबंधन के लिए, हम इन सब्सक्रिप्शन इवेंट्स को ट्रैक करने की सिफारिश करते हैं।

<Tip>
  समय पर सब्सक्रिप्शन परिवर्तनों के बारे में सूचनाएं प्राप्त करने के लिए `subscription.updated` का उपयोग करें, API के बिना पोलिंग के अपने एप्लिकेशन की स्थिति को समकालिक रखने के लिए।
</Tip>

#### भुगतान परिदृश्य

**सफल भुगतान प्रवाह**

जब एक भुगतान सफल होता है, तो आपको निम्नलिखित वेबहूक प्राप्त होंगे:

1. `subscription.active` - सब्सक्रिप्शन सक्रियण को सूचित करता है
2. `payment.succeeded` - प्रारंभिक भुगतान की पुष्टि करता है:
   * तत्काल बिलिंग के लिए (0 परीक्षण दिन): 2-10 मिनट के भीतर अपेक्षित
   * परीक्षण दिनों के लिए: जब भी वह समाप्त होता है
3. `subscription.renewed` - अगले चक्र के लिए भुगतान कटौती और नवीनीकरण को इंगित करता है। (मूल रूप से, जब भी सब्सक्रिप्शन उत्पादों के लिए भुगतान कटौती होती है, आपको `subscription.renewed` वेबहूक `payment.succeeded` के साथ मिल जाएगा)

**भुगतान विफलता परिदृश्यों**

1. सब्सक्रिप्शन विफलता

* `subscription.failed` - मैंडेट बनाने में असमर्थता के कारण सब्सक्रिप्शन निर्माण विफल।
* `payment.failed` - असफल भुगतान बताता है।

2. सब्सक्रिप्शन होल्ड पर

* `subscription.on_hold` - असफल रिन्यूअल भुगतान या प्लान परिवर्तन शुल्क के कारण सब्सक्रिप्शन होल्ड पर है।
* जब एक सब्सक्रिप्शन होल्ड पर जाता है, तो यह स्वचालित रूप से नवीनीकरण नहीं करेगा जब तक कि भुगतान विधि अपडेट नहीं की जाती।

<Info>**सर्वोत्तम अभ्यास**: कार्यान्वयन को सरल बनाने के लिए, हम सब्सक्रिप्शन जीवनचक्र प्रबंधन के लिए मुख्यतः सब्सक्रिप्शन इवेंट्स को ट्रैक करने की सलाह देते हैं।</Info>

<Tip>
  `error_code`/`error_message` को पढ़ने, पुनः प्रयास कब करें का निर्णय लेने और ग्राहकों को विफलताओं को दर्शाने का पूरा वॉकथ्रू देखने के लिए, [भुगतान विफलताओं को संभालें](/developer-resources/handle-payment-failures) देखें।
</Tip>

#### `subscription.failed` बनाम `subscription.on_hold`

ये दो इवेंट्स भ्रमित करना आसान हैं, लेकिन इन्हें बहुत अलग तरीके से संभालने की आवश्यकता है:

| इवेंट                  | कब फायर होता है                                                                             | स्थिति    | पुनः प्राप्त करने योग्य? | क्या करें                                                                                                                     |
| ---------------------- | ------------------------------------------------------------------------------------------- | --------- | ------------------------ | ----------------------------------------------------------------------------------------------------------------------------- |
| `subscription.failed`  | सब्सक्रिप्शन **निर्माण** के समय **प्रारंभिक** मैंडेट नहीं बनाया जा सका                      | `failed`  | **नहीं — टर्मिनल**       | एक्सेस न दें। ग्राहक को एक नई भुगतान विधि के साथ **नया** सब्सक्रिप्शन शुरू करने के लिए कहें।                                  |
| `subscription.on_hold` | पहले से ही सक्रिय सब्सक्रिप्शन पर **रिन्यूअल** भुगतान (या प्लान-परिवर्तन शुल्क) विफल हो गया | `on_hold` | **हां**                  | भुगतान विधि को अपडेट करके पुनः प्राप्त करें; नीचे [होल्ड वाले सब्सक्रिप्शन को संभालना](#handling-subscription-on-hold) देखें। |

<Warning>
  `subscription.failed` टर्मिनल है — सब्सक्रिप्शन पुनः सक्रिय नहीं किया जा सकता। ग्राहक को एक नया सब्सक्रिप्शन बनाना होगा। जब यह इवेंट फायर होता है, तो कभी भी अधिकार न दें।
</Warning>

### होल्ड पर सब्सक्रिप्शन को संभालना

जब कोई सब्सक्रिप्शन `on_hold` स्थिति में प्रवेश करता है, तो उसे पुनः सक्रिय करने के लिए भुगतान विधि अपडेट करनी होगी। यह खंड निम्नलिखित पर चर्चा करता है कि सब्सक्रिप्शन कब होल्ड पर जाते हैं और उन्हें कैसे संभालें।

#### सब्सक्रिप्शन कब होल्ड पर जाते हैं

एक सब्सक्रिप्शन होल्ड पर तब जाता है जब:

* **रिन्यूअल भुगतान विफल हो जाता है**: अपर्याप्त धनराशि, समाप्त कार्ड, या बैंक अस्वीकृति के कारण स्वत: नवीनीकरण शुल्क विफल हो जाता है
* **प्लान परिवर्तन शुल्क विफल होता है**: प्लान अपग्रेड/डाउनग्रेड के दौरान तत्काल शुल्क विफल हो जाता है
* **भुगतान विधि प्राधिकरण विफल होता है**: आवर्ती शुल्क के लिए भुगतान विधि को अधिकृत नहीं किया जा सकता

<Warning>
  `on_hold` स्थिति में सब्सक्रिप्शन स्वचालित रूप से नवीनीकरण नहीं करेगा। सब्सक्रिप्शन को पुनः सक्रिय करने के लिए आपको भुगतान विधि को अपडेट करना होगा।
</Warning>

#### होल्ड से सब्सक्रिप्शन को पुनः सक्रिय करना

`on_hold` स्थिति से सब्सक्रिप्शन को पुनः सक्रिय करने के लिए, भुगतान विधि अपडेट API का उपयोग करें। यह स्वचालित रूप से:

1. शेष बकाया के लिए एक शुल्क बनाता है
2. शुल्क के लिए एक चालान उत्पन्न करता है
3. नए भुगतान विधि का उपयोग करके भुगतान को संसाधित करता है
4. सफल भुगतान होने पर सब्सक्रिप्शन को `active` स्थिति में पुनः सक्रिय करता है

<Steps>
  <Step title="Handle subscription.on_hold webhook">
    जब आपको `subscription.on_hold` वेबहूक प्राप्त होता है, तो अपने एप्लिकेशन की स्थिति अपडेट करें और ग्राहक को सूचित करें:

    ```javascript theme={null}
    // Webhook handler
    app.post('/webhooks/dodo', async (req, res) => {
      const event = req.body;
      
      if (event.type === 'subscription.on_hold') {
        const subscription = event.data;
        
        // Update subscription status in your database
        await updateSubscriptionStatus(subscription.subscription_id, 'on_hold');
        
        // Notify customer to update payment method
        await sendEmailToCustomer(subscription.customer_id, {
          subject: 'Payment Required - Subscription On Hold',
          message: 'Your subscription is on hold. Please update your payment method to continue service.'
        });
      }
      
      res.json({ received: true });
    });
    ```
  </Step>

  <Step title="Update payment method">
    जब ग्राहक अपनी भुगतान विधि अपडेट करने के लिए तैयार हों, तो भुगतान विधि अपडेट API को कॉल करें:

    <CodeGroup>
      ```javascript Node.js theme={null}
      // Update with new payment method
      const response = await client.subscriptions.updatePaymentMethod(subscriptionId, {
        type: 'new',
        return_url: 'https://example.com/return'
      });

      // For on_hold subscriptions, a charge is automatically created
      if (response.payment_id) {
        console.log('Charge created for remaining dues:', response.payment_id);
        // Redirect customer to response.payment_link to complete payment
      }
      ```

      ```python Python theme={null}
      # Update with new payment method
      response = client.subscriptions.update_payment_method(
          subscription_id=subscription_id,
          type="new",
          return_url="https://example.com/return"
      )

      # For on_hold subscriptions, a charge is automatically created
      if response.payment_id:
          print("Charge created for remaining dues:", response.payment_id)
          # Redirect customer to response.payment_link to complete payment
      ```
    </CodeGroup>

    <Info>
      यदि ग्राहक के पास सहेजी गई भुगतान विधियाँ हैं, तो आप मौजूदा भुगतान विधि आईडी का भी उपयोग कर सकते हैं:

      ```javascript theme={null}
      await client.subscriptions.updatePaymentMethod(subscriptionId, {
        type: 'existing',
        payment_method_id: 'pm_abc123'
      });
      ```
    </Info>
  </Step>

  <Step title="Monitor webhook events">
    भुगतान विधि अपडेट करने के बाद, इन वेबहूक इवेंट्स की निगरानी करें:

    1. **`payment.succeeded`** - शेष बकाया के लिए शुल्क सफल रहा
    2. **`subscription.active`** - सब्सक्रिप्शन पुनः सक्रिय किया गया है

    ```javascript theme={null}
    if (event.type === 'payment.succeeded') {
      const payment = event.data;
      
      // Check if this payment is for an on_hold subscription
      if (payment.subscription_id) {
        // Wait for subscription.active webhook to confirm reactivation
      }
    }

    if (event.type === 'subscription.active') {
      const subscription = event.data;
      
      // Update subscription status in your database
      await updateSubscriptionStatus(subscription.subscription_id, 'active');
      
      // Restore customer access
      await restoreCustomerAccess(subscription.customer_id);
      
      // Notify customer of successful reactivation
      await sendEmailToCustomer(subscription.customer_id, {
        subject: 'Subscription Reactivated',
        message: 'Your subscription has been reactivated successfully.'
      });
    }
    ```
  </Step>
</Steps>

### नमूना सब्सक्रिप्शन इवेंट पेलोड

***

| प्रॉपर्टी     | प्रकार | आवश्यक | विवरण                                                                               |
| ------------- | ------ | ------ | ----------------------------------------------------------------------------------- |
| `business_id` | string | हां    | व्यवसाय के लिए अद्वितीय पहचानकर्ता                                                  |
| `timestamp`   | string | हां    | घटना के घटित होने की समय-सीमा (आवश्यक रूप से वह समय नहीं जब इसे वितरित किया गया था) |
| `type`        | string | हां    | घटना का प्रकार। देखें [इवेंट प्रकार](#event-types)                                  |
| `data`        | object | हां    | मुख्य डेटा पेलोड। देखें [डेटा ऑब्जेक्ट](#data-object)                               |

## सब्सक्रिप्शन प्लान बदलना

आप परिवर्तन प्लान API endpoint का उपयोग करके सब्सक्रिप्शन प्लान को अपग्रेड या डाउनग्रेड कर सकते हैं। यह आपको सब्सक्रिप्शन के उत्पाद, मात्रा को संशोधित करने और प्ररेटीकरण को संभालने की अनुमति देता है।

<Card title="Change Plan API Reference" icon="arrows-rotate" href="/api-reference/subscriptions/change-plan">
  सब्सक्रिप्शन प्लान बदलने के बारे में विस्तृत जानकारी के लिए, कृपया हमारी चेंज प्लान API डोक्यूमेंटेशन देखें।
</Card>

### प्ररेटीकरण विकल्प

सब्सक्रिप्शन प्लान बदलते समय, आपके पास तात्कालिक शुल्क को संभालने के लिए दो विकल्प हैं:

#### 1. `prorated_immediately`

* वर्तमान बिलिंग चक्र में शेष समय के आधार पर प्रोरटेड राशि की गणना करता है
* पुराने और नए प्लान के बीच केवल अंतर के लिए ग्राहक से शुल्क लेता है
* परीक्षण अवधि के दौरान, यह उपयोगकर्ता को तुरंत नए प्लान पर स्विच करेगा, ग्राहक से तुरंत शुल्क लेगा

#### 2. `full_immediately`

* नए प्लान के लिए ग्राहक से पूरा सब्सक्रिप्शन राशि का शुल्क लेता है
* पिछले प्लान से शेष समय या क्रेडिट्स को नजरअंदाज करता है
* जब आप बिलिंग चक्र को रीसेट करना चाहते हैं या प्ररेटीकरण की परवाह किए बिना पूरी राशि चार्ज करना चाहते हैं, तो यह उपयोगी है

#### 3. `difference_immediately`

* अपग्रेड करते समय, ग्राहक से तुरंत दोनों प्लान्स की राशि के अंतर का शुल्क लिया जाता है।
* उदाहरण के लिए, यदि वर्तमान प्लान $30 है और ग्राहक $80 में अपग्रेड करता है, तो उनसे तुरंत \$50 का शुल्क लिया जाता है।
* डाउनग्रेड करते समय, वर्तमान प्लान का अप्रयुक्त राशि आंतरिक क्रेडिट के रूप में जोड़ी जाती है और स्वचालित रूप से भविष्य के सब्सक्रिप्शन नवीनीकरणों में लागू होती है।
* उदाहरण के लिए, यदि वर्तमान प्लान $50 है और ग्राहक $20 प्लान पर स्विच करता है, तो शेष \$30 क्रेडिट के रूप में सहेजा जाता है और अगले बिलिंग चक्र में लागू होता है।

### व्यवहार

* जब आप इस API का उपयोग करते हैं, तो डोडो पेमेंट्स आपके चयनित प्ररेटीकरण विकल्प के आधार पर तुरंत एक शुल्क आरंभ करता है
* यदि प्लान परिवर्तन एक डाउनग्रेड है और आप `prorated_immediately` उपयोग करते हैं, तो क्रेडिट्स स्वचालित रूप से गणना की जाएगी और सब्सक्रिप्शन के क्रेडिट बैलेंस में जोड़ी जाएगी। ये क्रेडिट्स उस सब्सक्रिप्शन के लिए विशिष्ट होते हैं और केवल उसी सब्सक्रिप्शन के भविष्य के आवर्ती भुगतान को ऑफसेट करने के लिए उपयोग किए जाएंगे
* `full_immediately` विकल्प क्रेडिट गणनाओं को बायपास करता है और पूरी नई योजना की राशि का शुल्क लेता है

<Tip>
  **अपने प्ररेटीकरण विकल्प को ध्यान से चुनें**: अप्रयुक्त समय को ध्यान में रखते हुए उचित बिलिंग के लिए `prorated_immediately` का उपयोग करें, या वर्तमान बिलिंग चक्र की परवाह किए बिना पूर्ण नई योजना की राशि चार्ज करने के लिए `full_immediately` का उपयोग करें।
</Tip>

### चार्ज प्रोसेसिंग

* प्लान परिवर्तन पर आरंभ किया गया तात्कालिक शुल्क सामान्यतः 2 मिनट से कम समय में प्रोसेसिंग पूर्ण कर लेता है
* यदि यह तत्काल शुल्क किसी कारण असफल होता है, तो सब्सक्रिप्शन को स्वतः होल्ड पर कर दिया जाता है जब तक कि समस्या हल न हो जाए

## ऑन-डिमांड सब्सक्रिप्शन

<Info>
  ऑन-डिमांड सब्सक्रिप्शंस आपको ग्राहकों से लचीले तरीके से शुल्क लेने की अनुमति देते हैं, न कि केवल एक निश्चित अनुसूची पर। यह सुविधा सभी खातों के लिए उपलब्ध है।
</Info>

**एक ऑन-डिमांड सब्सक्रिप्शन बनाने के लिए:**

एक ऑन-डिमांड सब्सक्रिप्शन बनाने के लिए, [POST /subscriptions](/api-reference/subscriptions/post-subscriptions) API endpoint का उपयोग करें और अपने अनुरोध बॉडी में `on_demand` फ़ील्ड शामिल करें। यह आपको बिना तत्काल शुल्क या एक कस्टम शुरुआती मूल्य सेट किए बिना भुगतान विधि को अधिकृत करने की अनुमति देता है।

**एक ऑन-डिमांड सब्सक्रिप्शन चार्ज करने के लिए:**

बाद के चार्ज के लिए, [POST /subscriptions/{subscription_id}/charge](/api-reference/subscriptions/create-charge) endpoint का उपयोग करें और उस लेन-देन के लिए ग्राहक से शुल्क लेने की राशि निर्दिष्ट करें।

<Note>
  आवश्यक चरण-दर-चरण गाइड के लिए—जिसमें अनुरोध/प्रतिक्रिया उदाहरण, सुरक्षित पुनः प्रयास नीतियाँ, और वेबहूक हैंडलिंग शामिल हैं— देखें <a href="/developer-resources/ondemand-subscriptions">ऑन-डिमांड सब्सक्रिप्शंस गाइड</a>।
</Note>

## संबंधित API संदर्श

<CardGroup cols={2}>
  <Card title="Create Subscription" icon="code" href="/api-reference/subscriptions/post-subscriptions">
    सब्सक्रिप्शन उत्पाद बनाने और सब्सक्रिप्शन जीवनचक्र प्रबंधन के लिए API संदर्श
  </Card>

  <Card title="Change Subscription Plan" icon="arrows-rotate" href="/api-reference/subscriptions/change-plan">
    प्ररेटीकरण विकल्पों के साथ सब्सक्रिप्शन प्लान को अपग्रेड, डाउनग्रेड, या बदलने के लिए API संदर्श
  </Card>

  <Card title="Update Payment Method" icon="credit-card" href="/api-reference/subscriptions/update-payment-method">
    होल्ड पर सब्सक्रिप्शंस को पुनः सक्रिय करने के लिए API संदर्श
  </Card>

  <Card title="Patch Subscription" icon="pen" href="/api-reference/subscriptions/patch-subscriptions">
    सब्सक्रिप्शन विवरणों और कॉन्फ़िगरेशन को अपडेट करने के लिए API संदर्श
  </Card>
</CardGroup>
