सामग्री पर जाएँ
iRoamly Shop

Webhook नोटिफ़िकेशन

अपने ऐप्लिकेशन में QR कोड डिलीवरी और रिन्यूअल के नतीजे पाने के लिए Webhooks का इस्तेमाल करें।

Webhook नोटिफ़िकेशन

परिचय

अपने ऐप्लिकेशन में QR कोड डिलीवरी और रिन्यूअल के नतीजे पाने के लिए Webhooks का इस्तेमाल करें।

Webhook क्या है?

iRoamly QR कोड डिलीवरी और रिन्यूअल के नतीजों के लिए Webhook सूचनाएँ भेजता है। हर Webhook HTTPS का इस्तेमाल करता है और उसमें JSON पेलोड होता है। Webhooks का इस्तेमाल इनके लिए करें:

  • रिडेम्पशन कोड कन्वर्ट होने या सीधी QR कोड खरीद पूरी होने के बाद QR कोड की जानकारी प्राप्त करें।
  • Webhook के ज़रिए रिन्यूअल के परिणाम प्राप्त करें: रिन्यूअल QR कोड तैयार होने पर esim.renewal.success, अपस्ट्रीम रिन्यूअल ऑर्डर विफल होने पर esim.renewal.failed।

अगर आपका एंडपॉइंट 2xx स्टेटस के साथ जवाब नहीं देता, तो iRoamly कुल मिलाकर 5 बार तक डिलीवरी की कोशिश करता है: पहली तुरंत, फिर 30 सेकंड, 2 मिनट, 3 मिनट और 5 मिनट बाद दोबारा।

Webhook प्राप्त करने के चरण

इन चरणों से आप अपने ऐप में रियल-टाइम इवेंट प्राप्त करना शुरू कर सकते हैं:

  • अनुरोध प्राप्त करने के लिए एक लोकल एंडपॉइंट बनाएँ
  • iRoamly Shop डैशबोर्ड में डेवलपर > Webhook नोटिफ़िकेशन के अंतर्गत अपना Webhook एंडपॉइंट रजिस्टर करें

1. अनुरोध प्राप्त करने के लिए एक लोकल एंडपॉइंट बनाएँ

अपने लोकल ऐप्लिकेशन में, एक नया रूट बनाएँ जो POST अनुरोध स्वीकार कर सके।

उदाहरण के लिए, आप Next.js पर एक API रूट जोड़ सकते हैं:

typescript
import type { NextApiRequest, NextApiResponse } from 'next';

export default (req: NextApiRequest, res: NextApiResponse) => {
  if (req.method === 'POST') {
    const payload = req.body;
    console.log(payload);
    res.status(200);
  }
};

इवेंट मिलने पर, iRoamly को यह बताने के लिए कि इवेंट सफलतापूर्वक डिलीवर हो गया, आपको HTTP 200 OK के साथ जवाब देना चाहिए।

2. अपना डेवलपमेंट Webhook एंडपॉइंट रजिस्टर करें

iRoamly Shop डैशबोर्ड में अपना सार्वजनिक रूप से एक्सेस किया जा सकने वाला HTTPS URL रजिस्टर करें।

आप ngrok जैसे टूल से अपने localhost सर्वर तक एक टनल बना सकते हैं।

डैशबोर्ड का Webhook नोटिफ़िकेशन पेज, जिसमें “नया Webhook” पैनल खुला है: Webhook URL फ़ील्ड और सक्षम / अक्षम स्थिति

3. जाँचें कि आपका Webhook एंडपॉइंट ठीक से काम कर रहा है

यह जाँचने के लिए कि आपके Webhook एंडपॉइंट को इवेंट मिल रहा है, कोई टेस्ट रिडेम्पशन कोड QR कोड में कन्वर्ट करें या सीधे QR कोड खरीदें।

Webhook नोटिफ़िकेशन

इवेंट प्रकार

सपोर्टेड इवेंट प्रकारों और उनके पेलोड की सूची।

इवेंट प्रकारकब भेजा जाता हैनोट
esim.qrcodeकोई रिडेम्पशन कोड QR कोड में कन्वर्ट हो गया है, या कोई सीधी QR कोड खरीद पूरी हो गई है।कोई बदलाव नहीं। isrenew हमेशा 0 होता है।
esim.renewal.successरिन्यूअल सफल हो गया है और रिन्यूअल कोड का QR कोड तैयार है।नया। रिन्यूअल अब esim.qrcode नहीं भेजते।
esim.renewal.failedअपस्ट्रीम ऑर्डर न दिए जा सकने के कारण रिन्यूअल विफल हो गया है।नया। केवल अपस्ट्रीम ऑर्डर विफल होने पर भेजा जाता है।

डिलीवरी

हर इवेंट एक ही तरीके से डिलीवर होता है: इवेंट को सब्सक्राइब करने वाले हर एंडपॉइंट पर JSON बॉडी के साथ एक POST अनुरोध। कोई भी 2xx रिस्पॉन्स डिलीवर माना जाता है; अन्यथा दोबारा कोशिश की जाती है, कुल मिलाकर 5 बार तक (पहली तुरंत, फिर 30 सेकंड, 2 मिनट, 3 मिनट और 5 मिनट बाद दोबारा)। हर अनुरोध में ये हेडर होते हैं:

हेडरविवरणप्रकार
X-Webhook-Eventइवेंट प्रकार: esim.qrcode, esim.renewal.success या esim.renewal.failed।String
X-Webhook-Deliveryडिलीवरी ID।String
X-Webhook-Timestampअनुरोध साइन होने का समय, Unix सेकंड में।String
X-Webhook-Signaturesha256= के बाद रॉ अनुरोध बॉडी का hex HMAC-SHA256।String
X-Webhook-Signature-V2v1= के बाद "{timestamp}.{body}" का hex HMAC-SHA256। सीक्रेट रोटेशन के दौरान इसमें कॉमा से अलग किए गए कई v1= मान होते हैं।String

सिग्नेचर जाँचने का तरीका जानने के लिए Webhook अनुरोध सत्यापित करें देखें।

esim.qrcode

eSIM QR कोड से जुड़ी जानकारी, जो eSIM QR कोड रिडीम करने या खरीदने के बाद लौटाई जाती है।

नमूना अनुरोध बॉडी

json
{
	"code": 0,
	"data": {
		"activation_code": "CD112885573C49DDA42F64C905B925F4",
		"code": "UtTpoKCe769u2tt",
		"create_at": "2025-09-01 11:34:30",
		"isrenew": 0,
		"order_id": "ESIM202509021134343282",
		"plan_name": "Japan-eSIM-3GB-15 Days-Daily",
		"qrcode": "https://www.iroamly.com/qrcode/20250901/xSQfryvOWo0QUhsGcbpeTm9wWYfGu9BQ.png",
		"qrcode_content": "LPA:1$rsp1.cmlink.com$CD352885573C49DDA42F64C905B925F4",
		"sm_dp_address": "rsp1.cmlink.com"
	},
	"event_type": "esim.qrcode"
	}
Webhook नोटिफ़िकेशन

esim.renewal.success

रिन्यूअल सफल होने पर भेजा जाता है: अपस्ट्रीम प्रदाता के रिन्यूअल ऑर्डर का डाउनलोड विवरण लौटाते ही, सिस्टम रिन्यूअल कोड के लिए QR कोड जनरेट करता है और उसकी status 2 (रिडीम हो गया) हो जाती है।

अनुरोध हेडर

X-Webhook-Event:esim.renewal.success

हर इवेंट की तरह, इस अनुरोध में भी X-Webhook-Delivery, X-Webhook-Timestamp, X-Webhook-Signature और X-Webhook-Signature-V2 होते हैं (इवेंट प्रकार देखें)।

नमूना अनुरोध बॉडी

json
{
	"code": 0,
	"data": {
		"activation_code": "CD112885573C49DDA42F64C905B925F4",
		"code": "RnB7xTq2Lm9pQaZ",
		"create_at": "2026-10-28 09:12:41",
		"download_url": "LPA:1$rsp1.cmlink.com$CD352885573C49DDA42F64C905B925F4",
		"iccid": "8944501234567890123",
		"iscouldrenewal": 1,
		"isrenew": 1,
		"plan_name": "Japan-eSIM-3GB-15 Days-Daily",
		"qrcode": "https://www.iroamly.com/qrcode/20261028/xSQfryvOWo0QUhsGcbpeTm9wWYfGu9BQ.png",
		"qrcode_content": "LPA:1$rsp1.cmlink.com$CD352885573C49DDA42F64C905B925F4",
		"renew_order_id": "TG202610280912410001",
		"renewal_father_code": "UtTpoKCe769u2tt",
		"sm_dp_address": "rsp1.cmlink.com"
	},
	"event_type": "esim.renewal.success"
}

फ़ील्ड

फ़ील्डविवरणप्रकार
codeहमेशा 0।Int
event_typeesim.renewal.successString
data.codeइस रिन्यूअल के लिए जनरेट किया गया नया रिडीम कोड। इसे QR कोड क्वेरी करें (qrcodeQuery) के साथ, या फिर से रिन्यू करने के लिए इस्तेमाल करें।String
data.renewal_father_codeमूल (पैरेंट) रिडीम कोड जिसे रिन्यू किया गया।String
data.renew_order_idअपस्ट्रीम रिन्यूअल ऑर्डर ID।String
data.plan_nameरिन्यूअल प्लान का नाम।String
data.qrcodeQR कोड इमेज URL।String
data.qrcode_contentLPA स्ट्रिंग; इसे सीधे इम्पोर्ट किया जा सकता है।String
data.sm_dp_addressSM-DP+ पता।String
data.activation_codeएक्टिवेशन कोड।String
data.iccidICCID। खाली हो सकता है।String
data.download_urlअपस्ट्रीम प्रदाता द्वारा लौटाई गई डाउनलोड स्ट्रिंग।String
data.create_atबनाए जाने का समय: सर्वर का समय, YYYY-MM-DD HH:mm:ss फ़ॉर्मैट में।String
data.isrenewहमेशा 1।Int
data.iscouldrenewalक्या नया रिडीम कोड फिर से रिन्यू किया जा सकता है: 1 - रिन्यू किया जा सकता है 2 - रिन्यू नहीं किया जा सकता 3 - समाप्तInt
Webhook नोटिफ़िकेशन

esim.renewal.failed

रिन्यूअल विफल होने पर भेजा जाता है: अपस्ट्रीम प्रदाता रिन्यूअल ऑर्डर का जवाब 0000 के अलावा किसी अन्य कोड से देता है, या प्रदाता को भेजा गया अनुरोध विफल हो जाता है।

(नोट: अपस्ट्रीम प्रदाता से कॉलबैक न आने या देर से आने पर यह इवेंट ट्रिगर नहीं होता। एक टाइमआउट सेट करें और कोड क्वेरी करने का विकल्प अपनाएँ — रिन्यूअल इवेंट संभालना देखें।)

अनुरोध हेडर

X-Webhook-Event:esim.renewal.failed

हर इवेंट की तरह, इस अनुरोध में भी X-Webhook-Delivery, X-Webhook-Timestamp, X-Webhook-Signature और X-Webhook-Signature-V2 होते हैं (इवेंट प्रकार देखें)।

नमूना अनुरोध बॉडी

json
{
	"code": -1,
	"data": {
		"code": "RnB7xTq2Lm9pQaZ",
		"create_at": "2026-10-28 09:12:41",
		"error_msg": "TuGe_RenewOrderEx RespCode: 9999",
		"isrenew": 1,
		"plan_name": "Japan-eSIM-3GB-15 Days-Daily",
		"renewal_father_code": "UtTpoKCe769u2tt"
	},
	"event_type": "esim.renewal.failed"
}

फ़ील्ड

फ़ील्डविवरणप्रकार
codeहमेशा -1।Int
event_typeesim.renewal.failedString
data.codeइस प्रयास के लिए जनरेट किया गया रिन्यूअल कोड। यह प्रोविज़न नहीं हुआ और इसका कोई QR कोड नहीं है।String
data.renewal_father_codeमूल (पैरेंट) रिडीम कोड जिसे रिन्यू किया जाना था।String
data.plan_nameरिन्यूअल प्लान का नाम।String
data.error_msgसमस्या निवारण के लिए अपस्ट्रीम प्रदाता द्वारा लौटाई गई त्रुटि।String
data.create_atबनाए जाने का समय: सर्वर का समय, YYYY-MM-DD HH:mm:ss फ़ॉर्मैट में।String
data.isrenewहमेशा 1।Int
Webhook नोटिफ़िकेशन

रिन्यूअल और esim.qrcode

रिन्यूअल अब esim.qrcode के रूप में डिलीवर नहीं होते; यह इवेंट QR कोड कन्वर्ज़न और सीधी QR कोड खरीद के लिए भेजा जाता है। esim.qrcode पेलोड की तुलना में:

  • event_type और X-Webhook-Event हेडर esim.renewal.success या esim.renewal.failed होते हैं, और isrenew 1 होता है।
  • data.code रिन्यूअल से बना नया रिडीम कोड है; जिस कोड को रिन्यू किया गया, वह data.renewal_father_code है।
  • esim.renewal.success में renew_order_id, renewal_father_code, iscouldrenewal, download_url और iccid जुड़ते हैं, और इसमें order_id नहीं होता।
  • विफल रिन्यूअल की सूचना esim.renewal.failed से दी जाती है, जिसमें शीर्ष-स्तरीय code -1 होता है और अपस्ट्रीम त्रुटि data.error_msg में होती है।
Webhook नोटिफ़िकेशन

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

नए एंडपॉइंट डिफ़ॉल्ट रूप से तीनों इवेंट के लिए सब्सक्राइब होते हैं। मौजूदा एंडपॉइंट को esim.renewal.success और esim.renewal.failed अपने आप मिलते हैं — किसी बदलाव की ज़रूरत नहीं है।

Webhook नोटिफ़िकेशन

रिन्यूअल इवेंट संभालना

  • अपने हैंडलर को idempotent बनाएँ। दोबारा कोशिश में एक ही इवेंट एक से अधिक बार डिलीवर हो सकता है, इसलिए X-Webhook-Delivery या event_type + data.code के आधार पर डुप्लिकेट हटाएँ, और पहले से प्रोसेस किए गए इवेंट को अनदेखा करें।
  • टाइमआउट का विकल्प रखें। अगर उचित समय के भीतर न esim.renewal.success आता है और न esim.renewal.failed, तो रिन्यूअल को विफल मानने के बजाय क्वेरी API (जैसे QR कोड क्वेरी करें) से कोड क्वेरी करें।
  • रिफ़ंड तय करने के लिए esim.renewal.failed का इस्तेमाल न करें। यह केवल बताता है कि अपस्ट्रीम ऑर्डर विफल हुआ; क्रेडिट वापस होंगे या नहीं और कब, यह अलग से तय होता है, इसलिए इस इवेंट के आधार पर अपने ग्राहकों को रिफ़ंड न दें।
Webhook नोटिफ़िकेशन

Webhook अनुरोध सत्यापित करें

Webhook अनुरोधों पर iRoamly सिग्नेचर सत्यापित करें।

iRoamly सिग्नेचर कैसे सत्यापित करें?

iRoamly सिग्नेचर Webhook अनुरोध के X-Webhook-Signature हेडर में भेजा जाता है, sha256= के बाद hex-एन्कोडेड सिग्नेचर के रूप में। सिग्नेचर HMAC-SHA256 एल्गोरिदम से बनाया जाता है, जिसमें Webhook सीक्रेट कुंजी के रूप में और रॉ अनुरोध बॉडी (बिल्कुल जैसी मिली, किसी भी JSON पार्सिंग से पहले) संदेश के रूप में इस्तेमाल होती है।

नमूना Webhook हेडर

json
{
'X-Webhook-Signature': 'sha256=dd7bdd2cf1f6bac6e171c6c508c157b7cd3cc1fd196394277fb59ba0bdd9b87b'
}

आप अपना Webhook सीक्रेट डैशबोर्ड में डेवलपर > Webhook नोटिफ़िकेशन के अंतर्गत पा सकते हैं।

डैशबोर्ड का Webhook नोटिफ़िकेशन पेज: URL और साइनिंग सीक्रेट (दिखाएँ) के साथ Webhook एंडपॉइंट, और डिलीवरी इतिहास

सिग्नेचर जनरेट करने के लिए, आप निम्नलिखित कोड स्निपेट का इस्तेमाल कर सकते हैं:

typescript
import * as crypto from 'crypto';

  generateSignature(payload: string, secret: string): string {
    const computedSignature = crypto
      .createHmac('sha256', secret)
      .update(payload)
      .digest('hex');
    return 'sha256=' + computedSignature;
  }

ऊपर दिए कोड स्निपेट में, payload रॉ अनुरोध बॉडी है, और secret Webhook सीक्रेट है। सत्यापन पूरा करने के लिए बस जनरेट किए गए सिग्नेचर (sha256= प्रीफ़िक्स सहित) की तुलना X-Webhook-Signature हेडर के मान से करें।

टाइमस्टैम्प वाला सिग्नेचर (X-Webhook-Signature-V2)

हर अनुरोध में X-Webhook-Signature-V2 भी होता है: v1= के बाद उसी Webhook सीक्रेट से {timestamp}.{body} का hex-एन्कोडेड HMAC-SHA256 — यानी X-Webhook-Timestamp हेडर का मान, एक बिंदु, और रॉ अनुरोध बॉडी।

Webhook सीक्रेट रोटेट करने के बाद, पुराना सीक्रेट 24 घंटे तक मान्य रहता है। इस अवधि में X-Webhook-Signature अब भी पुराने सीक्रेट से साइन होता है, और X-Webhook-Signature-V2 में हर सीक्रेट का एक मान होता है, कॉमा से अलग (v1=<old>,v1=<new>): अगर कोई भी मान मेल खाता है, तो अनुरोध स्वीकार करें।