> ## 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.

# एक्सप्रेस एडाप्टर

> अपने एक्सप्रेस ऐप राउटर प्रोजेक्ट के साथ डोडो पेमेंट्स को एकीकृत करने के लिए हमारे एक्सप्रेस एडाप्टर का उपयोग करना सीखें। चेकआउट, ग्राहक पोर्टल, वेबहुक और सुरक्षित वातावरण सेटअप को कवर करता है।

<CardGroup cols={2}>
  <Card title="Checkout Handler" icon="cart-shopping" href="#checkout-route-handler">
    अपने Express ऐप में Dodo Payments चेकआउट को एकीकृत करें।
  </Card>

  <Card title="Customer Portal" icon="user" href="#customer-portal-route-handler">
    ग्राहकों को सदस्यताओं और विवरणों का प्रबंधन करने की अनुमति दें।
  </Card>

  <Card title="Webhooks" icon="bell" href="#webhook-route-handler">
    Dodo Payments webhook घटनाओं को प्राप्त और संसाधित करें।
  </Card>
</CardGroup>

## स्थापना

<Steps>
  <Step title="Install the package">
    अपने प्रोजेक्ट रूट में निम्न कमांड चलाएँ:

    ```bash theme={null}
    npm install @dodopayments/express
    ```
  </Step>

  <Step title="Set up environment variables">
    अपने प्रोजेक्ट रूट में एक <code>.env</code> फ़ाइल बनाएं:

    ```env expandable theme={null}
    DODO_PAYMENTS_API_KEY=your-api-key
    DODO_PAYMENTS_WEBHOOK_KEY=your-webhook-secret
    DODO_PAYMENTS_ENVIRONMENT="test_mode" or "live_mode"
    DODO_PAYMENTS_RETURN_URL=your-return-url
    ```

    <Warning>
      अपनी <code>.env</code> फ़ाइल या रहस्यों को संस्करण नियंत्रण में कभी भी कमिट न करें।
    </Warning>
  </Step>
</Steps>

## रूट हैंडलर उदाहरण

<Tabs>
  <Tab title="Checkout Handler">
    <Info>
      इस हैंडलर का उपयोग अपने Express ऐप में Dodo Payments चेकआउट एकीकृत करने के लिए करें। यह स्थिर (GET), गतिशील (POST), और सेशन (POST) भुगतान फ्लो का समर्थन करता है।
    </Info>

    <CodeGroup>
      ```typescript Express Route Handler expandable theme={null}
      import { checkoutHandler } from '@dodopayments/express';

      app.get('/api/checkout', checkoutHandler({
          bearerToken: process.env.DODO_PAYMENTS_API_KEY,
          returnUrl: process.env.DODO_PAYMENTS_RETURN_URL,
          environment: process.env.DODO_PAYMENTS_ENVIRONMENT,
          type: "static"
      }))

      app.post('/api/checkout', checkoutHandler({
          bearerToken: process.env.DODO_PAYMENTS_API_KEY,
          returnUrl: process.env.DODO_PAYMENTS_RETURN_URL,
          environment: process.env.DODO_PAYMENTS_ENVIRONMENT,
          type: "dynamic"
      }))

      app.post('/api/checkout', checkoutHandler({
          bearerToken: process.env.DODO_PAYMENTS_API_KEY,
          returnUrl: process.env.DODO_PAYMENTS_RETURN_URL,
          environment: process.env.DODO_PAYMENTS_ENVIRONMENT,
          type: "session"
      }))
      ```
    </CodeGroup>

    <CodeGroup>
      ```curl Static Checkout Curl example expandable theme={null}
      curl --request GET \
      --url 'https://example.com/api/checkout?productId=pdt_fqJhl7pxKWiLhwQR042rh' \
      --header 'User-Agent: insomnia/11.2.0' \
      --cookie mode=test
      ```
    </CodeGroup>

    <CodeGroup>
      ```curl Dynamic Checkout Curl example expandable theme={null}
      curl --request POST \
      --url https://example.com/api/checkout \
      --header 'Content-Type: application/json' \
      --header 'User-Agent: insomnia/11.2.0' \
      --cookie mode=test \
      --data '{
      "billing": {
        "city": "Texas",
        "country": "US",
        "state": "Texas",
        "street": "56, hhh",
        "zipcode": "560000"
      },
      "customer": {
        "email": "test@example.com",
        	"name": "test"
      },
      "metadata": {},
      "payment_link": true,
        "product_id": "pdt_QMDuvLkbVzCRWRQjLNcs",
        "quantity": 1,
        "billing_currency": "USD",
        "discount_codes": ["IKHZ23M9GQ"],
        "return_url": "https://example.com",
        "trial_period_days": 10
      }'
      ```
    </CodeGroup>

    <CodeGroup>
      ```curl Checkout Session Curl example expandable theme={null}
      curl --request POST \
      --url https://example.com/api/checkout \
      --header 'Content-Type: application/json' \
      --header 'User-Agent: insomnia/11.2.0' \
      --cookie mode=test \
      --data '{
      "product_cart": [
        {
          "product_id": "pdt_QMDuvLkbVzCRWRQjLNcs",
          "quantity": 1
        }
      ],
      "customer": {
        "email": "test@example.com",
        "name": "test"
      },
      "return_url": "https://example.com/success"
      }'
      ```
    </CodeGroup>
  </Tab>

  <Tab title="Customer Portal Handler">
    <Info>
      इस हैंडलर का उपयोग ग्राहकों को Dodo Payments ग्राहक पोर्टल के माध्यम से उनकी सदस्यताओं और विवरणों का प्रबंधन करने की अनुमति देने के लिए करें।
    </Info>

    <CodeGroup>
      ```typescript Express Route Handler expandable theme={null}
      import { CustomerPortal } from "@dodopayments/express";

      app.get('/api/customer-portal', CustomerPortal({
          bearerToken: process.env.DODO_PAYMENTS_API_KEY,
          environment: process.env.DODO_PAYMENTS_ENVIRONMENT,
      }))
      ```
    </CodeGroup>

    <CodeGroup>
      ```curl Customer Portal Curl example expandable theme={null}
      curl --request GET \
      --url 'https://example.com/api/customer-portal?customer_id=cus_9VuW4K7O3GHwasENg31m&send_email=true' \
      --header 'User-Agent: insomnia/11.2.0' \
      --cookie mode=test
      ```
    </CodeGroup>
  </Tab>

  <Tab title="Webhook Handler">
    <Info>
      इस हैंडलर का उपयोग अपने Express ऐप में Dodo Payments webhook घटनाओं को सुरक्षित रूप से प्राप्त और संसाधित करने के लिए करें।
    </Info>

    <CodeGroup>
      ```typescript Express Route Handler expandable theme={null}
      import { Webhooks } from "@dodopayments/express";

      app.post('/api/webhook',Webhooks({
          webhookKey: process.env.DODO_PAYMENTS_WEBHOOK_KEY,
          onPayload: async (payload) => {
              // handle the payload
          },
          // ... other event handlers for granular control
      }))
      ```
    </CodeGroup>
  </Tab>
</Tabs>

## चेकआउट रूट हैंडलर

<Info>
  Dodo Payments आपके वेबसाइट में भुगतान एकीकृत करने के लिए तीन प्रकार के भुगतान फ्लो का समर्थन करता है, यह एडेप्टर सभी प्रकार के भुगतान फ्लो का समर्थन करता है।
</Info>

* **स्थिर भुगतान लिंक:** त्वरित, बिना कोड के भुगतान संग्रह के लिए तुरंत साझा करने योग्य URL।
* **गतिशील भुगतान लिंक:** API या SDKs का उपयोग करके कस्टम विवरण के साथ प्रोग्रामेटिक रूप से भुगतान लिंक उत्पन्न करें।
* **चेकआउट सत्र:** पूर्व-निर्धारित उत्पाद कार्ट और ग्राहक विवरण के साथ सुरक्षित, अनुकूलन योग्य चेकआउट अनुभव बनाएं।

<AccordionGroup>
  <Accordion title="स्थिर चेकआउट (GET)">
    ### समर्थित क्वेरी पैरामीटर

    <ParamField query="productId" type="string" required>
      उत्पाद पहचानकर्ता (उदा., <code>?productId=pdt\_nZuwz45WAs64n3l07zpQR</code>)।
    </ParamField>

    <ParamField query="quantity" type="integer">
      उत्पाद की मात्रा।
    </ParamField>

    <ParamField query="fullName" type="string">
      ग्राहक का पूरा नाम।
    </ParamField>

    <ParamField query="firstName" type="string">
      ग्राहक का पहला नाम।
    </ParamField>

    <ParamField query="lastName" type="string">
      ग्राहक का अंतिम नाम।
    </ParamField>

    <ParamField query="email" type="string">
      ग्राहक का ईमेल पता।
    </ParamField>

    <ParamField query="country" type="string">
      ग्राहक का देश।
    </ParamField>

    <ParamField query="addressLine" type="string">
      ग्राहक की पता पंक्ति।
    </ParamField>

    <ParamField query="city" type="string">
      ग्राहक का शहर।
    </ParamField>

    <ParamField query="state" type="string">
      ग्राहक का राज्य/प्रांत।
    </ParamField>

    <ParamField query="zipCode" type="string">
      ग्राहक का ज़िप/डाक कोड।
    </ParamField>

    <ParamField query="disableFullName" type="boolean">
      पूरा नाम फ़ील्ड को अक्षम करें।
    </ParamField>

    <ParamField query="disableFirstName" type="boolean">
      पहला नाम फ़ील्ड को अक्षम करें।
    </ParamField>

    <ParamField query="disableLastName" type="boolean">
      अंतिम नाम फ़ील्ड को अक्षम करें।
    </ParamField>

    <ParamField query="disableEmail" type="boolean">
      ईमेल फ़ील्ड को अक्षम करें।
    </ParamField>

    <ParamField query="disableCountry" type="boolean">
      देश फ़ील्ड को अक्षम करें।
    </ParamField>

    <ParamField query="disableAddressLine" type="boolean">
      पता पंक्ति फ़ील्ड को अक्षम करें।
    </ParamField>

    <ParamField query="disableCity" type="boolean">
      शहर फ़ील्ड को अक्षम करें।
    </ParamField>

    <ParamField query="disableState" type="boolean">
      राज्य फ़ील्ड को अक्षम करें।
    </ParamField>

    <ParamField query="disableZipCode" type="boolean">
      ज़िप कोड फ़ील्ड को अक्षम करें।
    </ParamField>

    <ParamField query="paymentCurrency" type="string">
      भुगतान मुद्रा निर्दिष्ट करें (उदा., <code>USD</code>)।
    </ParamField>

    <ParamField query="showCurrencySelector" type="boolean">
      मुद्रा चयनकर्ता दिखाएं।
    </ParamField>

    <ParamField query="paymentAmount" type="integer">
      भुगतान राशि निर्दिष्ट करें (उदा., <code>1000</code> \$10.00 के लिए)।
    </ParamField>

    <ParamField query="showDiscounts" type="boolean">
      छूट फ़ील्ड दिखाएं।
    </ParamField>

    <ParamField query="metadata_*" type="string">
      कोई भी क्वेरी पैरामीटर जो <code>metadata\_</code> से शुरू होता है, उसे मेटाडेटा के रूप में पास किया जाएगा।
    </ParamField>

    <Warning>
      यदि <code>productId</code> गायब है, तो हैंडलर 400 प्रतिक्रिया लौटाता है। अमान्य क्वेरी पैरामीटर भी 400 प्रतिक्रिया देते हैं।
    </Warning>

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

    स्थिर चेकआउट चेकआउट URL के साथ JSON प्रतिक्रिया लौटाता है:

    ```json theme={null}
    {
      "checkout_url": "https://checkout.dodopayments.com/..."
    }
    ```
  </Accordion>

  <Accordion title="Dynamic Checkout (POST)">
    * POST रिक्वेस्ट में पैरामीटर को JSON बॉडी के रूप में भेजें।
    * यह एक बार और आवर्ती दोनों भुगतान का समर्थन करता है।
    * पूरी सूची के लिए समर्थित POST बॉडी फ़ील्ड्स की, देखें:
      * [Request body for a One Time Payment Product](https://docs.dodopayments.com/api-reference/payments/post-payments)
      * [Request body for a Subscription Product](https://docs.dodopayments.com/api-reference/subscriptions/post-subscriptions)

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

    गतिशील चेकआउट चेकआउट URL के साथ JSON प्रतिक्रिया लौटाता है:

    ```json theme={null}
    {
      "checkout_url": "https://checkout.dodopayments.com/..."
    }
    ```
  </Accordion>

  <Accordion title="Checkout Sessions (POST)">
    चेकआउट सेशंस एक अधिक सुरक्षित, होस्टेड चेकआउट अनुभव प्रदान करते हैं जो एक बार की खरीद और सदस्यताओं दोनों के लिए पूर्ण भुगतान प्रवाह को संभालते हैं जिसमें पूर्ण अनुकूलन नियंत्रण होता है।

    अधिक जानकारी और समर्थित फ़ील्ड की पूरी सूची के लिए [चेकआउट सत्र एकीकरण गाइड](https://docs.dodopayments.com/developer-resources/checkout-session) देखें।

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

    चेकआउट सत्र चेकआउट URL के साथ JSON प्रतिक्रिया लौटाते हैं:

    ```json theme={null}
    {
      "checkout_url": "https://checkout.dodopayments.com/session/..."
    }
    ```
  </Accordion>
</AccordionGroup>

## ग्राहक पोर्टल रूट हैंडलर

ग्राहक पोर्टल रूट हैंडलर आपको अपने एक्सप्रेस एप्लिकेशन में डोडो पेमेंट्स ग्राहक पोर्टल को सहजता से एकीकृत करने की अनुमति देता है।

### क्वेरी पैरामीटर

<ParamField query="customer_id" type="string" required>
  पोर्टल सेशन के लिए ग्राहक आईडी (उदा., <code>?customer\_id=cus\_123</code>)।
</ParamField>

<ParamField query="send_email" type="boolean">
  यदि <code>true</code> सेट किया गया है, तो ग्राहक को पोर्टल लिंक के साथ ईमेल भेजता है।
</ParamField>

<Warning>
  यदि <code>customer\_id</code> गायब है तो 400 लौटाता है।
</Warning>

## वेबहुक रूट हैंडलर

* **विधि:** केवल POST अनुरोधों का समर्थन किया जाता है। अन्य विधियाँ 405 लौटाती हैं।
* **हस्ताक्षर सत्यापन:** <code>webhookKey</code> का उपयोग करके वेबहुक हस्ताक्षर की पुष्टि करता है। यदि सत्यापन विफल होता है तो 401 लौटाता है।
* **पेलोड मान्यता:** Zod के साथ मान्य किया गया। अमान्य पेलोड के लिए 400 लौटाता है।
* **त्रुटि प्रबंधन:**
  * 401: अमान्य हस्ताक्षर
  * 400: अमान्य पेलोड
  * 500: सत्यापन के दौरान आंतरिक त्रुटि
* **इवेंट रूटिंग:** पेलोड प्रकार के आधार पर उपयुक्त इवेंट हैंडलर को कॉल करता है।

### समर्थित Webhook ईवेंट हैंडलर

<CodeGroup>
  ```typescript Typescript expandable theme={null}
  onPayload?: (payload: WebhookPayload) => Promise<void>;
  onPaymentSucceeded?: (payload: WebhookPayload) => Promise<void>;
  onPaymentFailed?: (payload: WebhookPayload) => Promise<void>;
  onPaymentProcessing?: (payload: WebhookPayload) => Promise<void>;
  onPaymentCancelled?: (payload: WebhookPayload) => Promise<void>;
  onRefundSucceeded?: (payload: WebhookPayload) => Promise<void>;
  onRefundFailed?: (payload: WebhookPayload) => Promise<void>;
  onDisputeOpened?: (payload: WebhookPayload) => Promise<void>;
  onDisputeExpired?: (payload: WebhookPayload) => Promise<void>;
  onDisputeAccepted?: (payload: WebhookPayload) => Promise<void>;
  onDisputeCancelled?: (payload: WebhookPayload) => Promise<void>;
  onDisputeChallenged?: (payload: WebhookPayload) => Promise<void>;
  onDisputeWon?: (payload: WebhookPayload) => Promise<void>;
  onDisputeLost?: (payload: WebhookPayload) => Promise<void>;
  onSubscriptionActive?: (payload: WebhookPayload) => Promise<void>;
  onSubscriptionOnHold?: (payload: WebhookPayload) => Promise<void>;
  onSubscriptionRenewed?: (payload: WebhookPayload) => Promise<void>;
  onSubscriptionPlanChanged?: (payload: WebhookPayload) => Promise<void>;
  onSubscriptionCancelled?: (payload: WebhookPayload) => Promise<void>;
  onSubscriptionFailed?: (payload: WebhookPayload) => Promise<void>;
  onSubscriptionExpired?: (payload: WebhookPayload) => Promise<void>;
  onSubscriptionUpdated?: (payload: WebhookPayload) => Promise<void>;
  onLicenseKeyCreated?: (payload: WebhookPayload) => Promise<void>;
  onAbandonedCheckoutDetected?: (payload: WebhookPayload) => Promise<void>;
  onAbandonedCheckoutRecovered?: (payload: WebhookPayload) => Promise<void>;
  onDunningStarted?: (payload: WebhookPayload) => Promise<void>;
  onDunningRecovered?: (payload: WebhookPayload) => Promise<void>;
  onCreditAdded?: (payload: WebhookPayload) => Promise<void>;
  onCreditDeducted?: (payload: WebhookPayload) => Promise<void>;
  onCreditExpired?: (payload: WebhookPayload) => Promise<void>;
  onCreditRolledOver?: (payload: WebhookPayload) => Promise<void>;
  onCreditRolloverForfeited?: (payload: WebhookPayload) => Promise<void>;
  onCreditOverageCharged?: (payload: WebhookPayload) => Promise<void>;
  onCreditManualAdjustment?: (payload: WebhookPayload) => Promise<void>;
  onCreditBalanceLow?: (payload: WebhookPayload) => Promise<void>;
  ```
</CodeGroup>

***

## LLM के लिए प्रॉम्प्ट

```
आप एक विशेषज्ञ एक्सप्रेस.js डेवलपर सहायक हैं। आपका कार्य उपयोगकर्ता को अपने मौजूदा एक्सप्रेस.js प्रोजेक्ट में @dodopayments/express एडाप्टर को एकीकृत करने के लिए मार्गदर्शन करना है।

@dodopayments/express एडाप्टर डोडो पेमेंट्स के चेकआउट, ग्राहक पोर्टल, और वेबहुक कार्यक्षमताओं के लिए रूट हैंडलर प्रदान करता है, जिसे सीधे एक्सप्रेस ऐप में प्लग करने के लिए डिज़ाइन किया गया है।

पहले, आवश्यक पैकेज स्थापित करें। उपयोगकर्ता के प्रोजेक्ट के लिए उपयुक्त पैकेज प्रबंधक का उपयोग करें (npm, yarn, या bun):

npm install @dodopayments/express

---

यहाँ आपको अपनी प्रतिक्रिया को कैसे संरचना करनी चाहिए:

1. उपयोगकर्ता से पूछें कि वे कौन सी कार्यक्षमताएँ एकीकृत करना चाहते हैं।

"@dodopayments/express एडाप्टर के कौन से भागों को आप अपने प्रोजेक्ट में एकीकृत करना चाहेंगे? आप निम्नलिखित में से एक या अधिक चुन सकते हैं:

- चेकआउट रूट हैंडलर (उत्पाद चेकआउट को संभालने के लिए)
- ग्राहक पोर्टल रूट हैंडलर (ग्राहक सब्सक्रिप्शन/विवरण प्रबंधित करने के लिए)
- वेबहुक रूट हैंडलर (डोडो पेमेंट्स वेबहुक घटनाओं को प्राप्त करने के लिए)
- सभी (तीनों को एकीकृत करें)"

---

2. उपयोगकर्ता के चयन के आधार पर, प्रत्येक चुनी गई कार्यक्षमता के लिए विस्तृत एकीकरण चरण प्रदान करें।

---

**यदि चेकआउट रूट हैंडलर चुना गया है:**

**उद्देश्य**: यह हैंडलर विभिन्न प्रकार के चेकआउट प्रवाह का प्रबंधन करता है। सभी चेकआउट प्रकार (स्थिर, गतिशील, और सत्र) चेकआउट URL के साथ JSON प्रतिक्रियाएँ लौटाते हैं ताकि प्रोग्रामेटिक हैंडलिंग की जा सके।

**एकीकरण**:
अपने एक्सप्रेस ऐप में स्थिर (GET), गतिशील (POST), और चेकआउट सत्र (POST) के लिए रूट बनाएं।

import { checkoutHandler } from '@dodopayments/express';

app.get('/api/checkout', checkoutHandler({
  bearerToken: process.env.DODO_PAYMENTS_API_KEY,
  returnUrl: process.env.DODO_PAYMENTS_RETURN_URL,
  environment: process.env.DODO_PAYMENTS_ENVIRONMENT,
  type: "static"
}));

app.post('/api/checkout', checkoutHandler({
  bearerToken: process.env.DODO_PAYMENTS_API_KEY,
  returnUrl: process.env.DODO_PAYMENTS_RETURN_URL,
  environment: process.env.DODO_PAYMENTS_ENVIRONMENT,
  type: "dynamic"
}));

// चेकआउट सत्र के लिए
app.post('/api/checkout', checkoutHandler({
  bearerToken: process.env.DODO_PAYMENTS_API_KEY,
  returnUrl: process.env.DODO_PAYMENTS_RETURN_URL,
  environment: process.env.DODO_PAYMENTS_ENVIRONMENT,
  type: "session"
}));

कॉन्फ़िग विकल्प:

    bearerToken: आपका डोडो पेमेंट्स API कुंजी (DODO_PAYMENTS_API_KEY पर्यावरण चर में संग्रहीत करने की सिफारिश की जाती है)।

    returnUrl (वैकल्पिक): सफल चेकआउट के बाद उपयोगकर्ता को पुनर्निर्देशित करने के लिए URL।

    environment: "test_mode" या "live_mode"

    type: "static" (GET), "dynamic" (POST), या "session" (POST)

GET (स्थिर चेकआउट) क्वेरी पैरामीटर की अपेक्षा करता है:

    productId (आवश्यक)

    quantity, ग्राहक फ़ील्ड (fullName, email, आदि), और मेटाडेटा (metadata_*) वैकल्पिक हैं।

    लौटाता है: {"checkout_url": "https://checkout.dodopayments.com/..."}

POST (गतिशील चेकआउट) भुगतान विवरण (एक बार या सब्सक्रिप्शन) के साथ JSON बॉडी की अपेक्षा करता है। पूर्ण POST स्कीमा के लिए दस्तावेज़ देखें:

    एक बार के भुगतान: https://docs.dodopayments.com/api-reference/payments/post-payments

    सब्सक्रिप्शन: https://docs.dodopayments.com/api-reference/subscriptions/post-subscriptions

    लौटाता है: {"checkout_url": "https://checkout.dodopayments.com/..."}

POST (चेकआउट सत्र) - (अनुशंसित) एक अधिक अनुकूलन योग्य चेकआउट अनुभव। चेकआउट_url के साथ JSON लौटाता है: पैरामीटर JSON बॉडी के रूप में भेजे जाते हैं। एक बार और आवर्ती भुगतान दोनों का समर्थन करता है। लौटाता है: {"checkout_url": "https://checkout.dodopayments.com/session/..."}। समर्थित फ़ील्ड की पूरी सूची के लिए देखें:

  चेकआउट सत्र एकीकरण गाइड: https://docs.dodopayments.com/developer-resources/checkout-session

यदि ग्राहक पोर्टल रूट हैंडलर चुना गया है:

उद्देश्य: यह रूट ग्राहकों को डोडो पेमेंट्स पोर्टल के माध्यम से अपने सब्सक्रिप्शन प्रबंधित करने की अनुमति देता है।

एकीकरण:

import { CustomerPortal } from "@dodopayments/express";

app.get('/api/customer-portal', CustomerPortal({
  bearerToken: process.env.DODO_PAYMENTS_API_KEY,
  environment: process.env.DODO_PAYMENTS_ENVIRONMENT,
}));

क्वेरी पैरामीटर:

    customer_id (आवश्यक): जैसे, ?customer_id=cus_123

    send_email (वैकल्पिक): यदि true है, तो ग्राहक को पोर्टल लिंक ईमेल किया जाता है।

यदि customer_id गायब है तो 400 लौटाता है।

यदि वेबहुक रूट हैंडलर चुना गया है:

उद्देश्य: डोडो पेमेंट्स से आने वाली वेबहुक घटनाओं को संसाधित करना ताकि आपके ऐप में घटनाएँ ट्रिगर की जा सकें।

एकीकरण:

import { Webhooks } from "@dodopayments/express";

app.post('/api/webhook', Webhooks({
  webhookKey: process.env.DODO_PAYMENTS_WEBHOOK_KEY,
  onPayload: async (payload) => {
    // सामान्य पेलोड को संभालें
  },
  // आप नीचे प्रत्येक इवेंट प्रकार के लिए भी बारीकी से नियंत्रित हैंडलर प्रदान कर सकते हैं
}));

विशेषताएँ:

    केवल POST विधि की अनुमति है - अन्य 405 लौटाते हैं।

    हस्ताक्षर सत्यापन webhookKey का उपयोग करके किया जाता है। यदि अमान्य है तो 401 लौटाता है।

    Zod-आधारित पेलोड मान्यता। यदि अमान्य स्कीमा है तो 400 लौटाता है।

    सभी हैंडलर असिंक्रोनस फ़ंक्शन हैं।

समर्थित वेबहुक इवेंट हैंडलर:

आप निम्नलिखित में से कोई भी हैंडलर पास कर सकते हैं:

    onPayload

    onPaymentSucceeded

    onPaymentFailed

    onPaymentProcessing

    onPaymentCancelled

    onRefundSucceeded

    onRefundFailed

    onDisputeOpened, onDisputeExpired, onDisputeAccepted, onDisputeCancelled, onDisputeChallenged, onDisputeWon, onDisputeLost

    onSubscriptionActive, onSubscriptionOnHold, onSubscriptionRenewed, onSubscriptionPlanChanged, onSubscriptionCancelled, onSubscriptionFailed, onSubscriptionExpired, onSubscriptionUpdated

    onLicenseKeyCreated

    onAbandonedCheckoutDetected, onAbandonedCheckoutRecovered

    onDunningStarted, onDunningRecovered

    onCreditAdded, onCreditDeducted, onCreditExpired, onCreditRolledOver, onCreditRolloverForfeited, onCreditOverageCharged, onCreditManualAdjustment, onCreditBalanceLow

पर्यावरण वेरिएबल सेटअप:

सुनिश्चित करें कि इन पर्यावरण वेरिएबल्स को अपने प्रोजेक्ट में परिभाषित करें:

DODO_PAYMENTS_API_KEY=your-api-key
DODO_PAYMENTS_WEBHOOK_KEY=your-webhook-secret
DODO_PAYMENTS_ENVIRONMENT="test_mode" या "live_mode"
DODO_PAYMENTS_RETURN_URL=your-return-url

इन्हें अपने कोड के अंदर इस प्रकार उपयोग करें:

process.env.DODO_PAYMENTS_API_KEY
process.env.DODO_PAYMENTS_WEBHOOK_SECRET

सुरक्षा नोट: संस्करण नियंत्रण में सीक्रेट्स को कमिट न करें। .env फाइलों का उपयोग स्थानीय रूप से करें और डिप्लॉयमेंट वातावरण में सीक्रेट्स मैनेजर्स (जैसे, AWS, Vercel, Heroku, आदि) का उपयोग करें।
```
