ThunderPhone 2.0 आता लाइव्ह आहे.स्वतःच सुरू करा—2¢/मिनिटपासून.घोषणा वाचा

Webhooks

वेबहुक्सचा आढावा

ThunderPhone रिअल-टाइम इव्हेंट्स कसे वितरित करते, स्वाक्षऱ्या कशा पडताळायच्या आणि लेगसी व एंडपॉइंट-आधारित वितरण मॉडेल्सची तुलना कशी होते.

ThunderPhone कॉलदरम्यान घडणाऱ्या घटनांवर तुमच्या सर्व्हरला HTTP POST विनंत्या पाठवते — इनबाउंड कॉल सुरू होतो, कॉल संपतो, ग्रेडिंग रन पूर्ण होते, अलर्ट ट्रिगर होतो, इत्यादी. दोन वितरण मॉडेल आहेत:

इव्हेंट्स कॅटलॉग मधील सूचीबद्ध सर्व इव्हेंट प्रकार webhook एंडपॉइंट्सद्वारे वितरित केले जातात. सहा कॉल-लाइफसायकल इव्हेंट्स (telephony.incoming, telephony.complete, telephony.tool, web.incoming, web.complete, web.tool) देखील लेगसी सिंगल-URL webhook वर पाठवले जातात — तुमच्याकडे लेगसी URL आणि जुळणारा एंडपॉइंट दोन्ही असल्यास, तुम्हाला इव्हेंट दोन्ही मार्गांवर मिळतो. अवरोधक वर्तन (telephony.incoming / web.incoming कॉन्फिगरेशन एक्सचेंज आणि webhook-मोडमधील टूल डिस्पॅच) केवळ लेगसी मार्गावर असते; प्रत्येक एंडपॉइंट वितरण ही फायर-अँड-फरगेट सूचना असते.

पेलोड स्वरूप

एंडपॉइंट वितरण हे data, event_id, आणि type असलेले JSON ऑब्जेक्ट असते:

{
  "data": {
    "call_id": 987654321,
    "from_number": "+14155550199",
    "to_number": "+15551234567"
  },
  "event_id": "3f6b2ad0-1c9e-4a57-9f2b-8f6f0f9d2f11",
  "type": "telephony.incoming"
}

event_id प्रत्येक उत्सर्जित इव्हेंटसाठी अद्वितीय असते. ते पुनःप्रयत्नांमध्ये आणि इव्हेंट प्राप्त करणाऱ्या प्रत्येक एंडपॉइंटवर एकसारखे असते — त्यावर डी-डुप्लिकेशन करा.

लेगसी सिंगल-URL webhook समान type आणि data पाठवते, परंतु event_id शिवाय:

{
  "type": "telephony.incoming",
  "data": { "call_id": 987654321, "from_number": "+14155550199", "to_number": "+15551234567" }
}

नेटवर्कवर, प्रत्येक बॉडी कॅनॉनिकली सिरिअलाइझ केली जाते — की वर्णानुक्रमाने क्रमबद्ध, व्हाइटस्पेस नसलेली, UTF-8. या दस्तऐवजांमधील सुंदर स्वरूपातील उदाहरणे केवळ वाचनीयतेसाठी आहेत.

इव्हेंट प्रकारांची आणि पेलोड फील्ड्सची संपूर्ण यादी पाहण्यासाठी इव्हेंट्स कॅटलॉग पहा.

स्वाक्षरी पडताळणी

प्रत्येक विनंतीमध्ये दोन स्वाक्षऱ्या असतात. दोन्ही endpoint च्या secret ने HMAC-SHA256 की केलेल्या असतात (किंवा legacy वितरणांसाठी तुमच्या संस्थास्तरीय webhook secret ने):

  • X-ThunderPhone-Signature-V2: t=<unix seconds>,v1=<hex> टाइमस्टॅम्प, पद्धत, पथ व क्वेरी आणि रॉ बॉडीवर स्वाक्षरी करते. ही तपासा आणि ज्या विनंत्यांमधील t तुमच्या घड्याळापेक्षा 5 मिनिटांपेक्षा जास्त फरकाचा आहे त्या नाकारा, जेणेकरून पकडलेली विनंती नंतर पुन्हा पाठवता येणार नाही. रिट्राय पाठवताना त्यांवर पुन्हा स्वाक्षरी केली जाते.
  • X-ThunderPhone-Signature फक्त रॉ बॉडीवर स्वाक्षरी करते. विद्यमान पडताळक कार्यरत राहावेत म्हणून ती अजूनही बदल न करता पाठवली जाते.

पायऱ्या

  1. कोणतेही parsing करण्यापूर्वी header, method, raw path आणि query, तसेच raw body वाचा.
  2. तुमच्या secret सह <t>\n<METHOD>\n<path and query>\n<body> चे hex HMAC-SHA256 गणना करा.
  3. t 300 सेकंदांपेक्षा जास्त फरकाने दूर असल्यास किंवा constant-time तुलनेत परिणाम v1 शी जुळत नसल्यास विनंती नाकारा.

Bodies हे canonical JSON serialization (क्रमबद्ध keys, compact separators) आहेत आणि आम्ही पाठवतो तेच bytes नेमके sign करतो. सत्यापन मार्गदर्शक मध्ये अचूक signed string, कार्य केलेले उदाहरण, SDK शिवायचा code आणि legacy header आहे.

Python (Flask)
from flask import Flask, abort, request
from thunderphone import verify_signature
 
app = Flask(__name__)
 
@app.post("/thunderphone-webhook")
def handle():
    query = request.query_string.decode()
    if not verify_signature(
        request.headers.get("X-ThunderPhone-Signature-V2"),
        secret=WEBHOOK_SECRET,
        method=request.method,
        path=request.path + (f"?{query}" if query else ""),
        body=request.get_data(),  # raw bytes
    ):
        abort(401)
    event = request.get_json()
    # dispatch on event["type"] …
    return "", 204
Node.js (Express)
import express from "express";
import { verifySignature } from "@thunderphone/sdk";
 
const app = express();
app.post(
  "/thunderphone-webhook",
  express.raw({ type: "application/json" }),
  (req, res) => {
    const ok = verifySignature({
      header: req.header("X-ThunderPhone-Signature-V2"),
      secret: process.env.WEBHOOK_SECRET,
      method: req.method,
      path: req.originalUrl,
      body: req.body,
    });
    if (!ok) return res.sendStatus(401);
    const event = JSON.parse(req.body.toString("utf8"));
    // dispatch on event.type …
    res.sendStatus(204);
  },
);

वितरण अर्थविषयक नियम

हे नियम एंडपॉइंट वितरणांना लागू होतात. लेगसी सिंगल-URL webhook हा पुनःप्रयत्नांशिवाय एक समकालिक प्रयत्न असतो, अपवाद म्हणजे फोन-कॉल telephony.incoming कॉन्फिगरेशन एक्सचेंज, ज्याचा एकदा पुनःप्रयत्न केला जातो.

पुनःप्रयत्न

प्रत्येक इव्हेंटचा त्वरित एकदा प्रयत्न केला जातो. कोणताही 2xx प्रतिसाद वितरण स्वीकारल्याची पुष्टी करतो. इतर कोणत्याही परिणामावर (non-2xx, कनेक्शन त्रुटी, कालबाह्यता) आम्ही पहिल्या प्रयत्नानंतर 1 मिनिट, 5 मिनिटे, 30 मिनिटे, 2 तास, 6 तास, 12 तास आणि 24 तासांनी पुनःप्रयत्न करतो — 24 तासांमध्ये एकूण 8 प्रयत्न. प्रत्येक प्रयत्न अयशस्वी झाल्यास, वितरण थांबते आणि एंडपॉइंटला webhook endpoints मध्ये status="failing" म्हणून चिन्हांकित केले जाते; आम्ही तुमच्या संस्थेच्या मालकांना आणि प्रशासकांना ईमेल पाठवतो आणि ते डॅशबोर्डमध्ये दाखवतो. payload कायमस्वरूपी स्वीकारला जाताच 2xx परत करा; असमकालिकपणे प्रक्रिया करा. एंडपॉइंट चाचणी API कडून केलेल्या चाचणी पाठवण्यांना पहिल्या प्रयत्नानंतर सुमारे एक मिनिटाने एक पुनःप्रयत्न मिळतो आणि ते एंडपॉइंटची स्थिती कधीही बदलत नाहीत.

क्रमवारी

वितरण क्रमवारी सर्वोत्तम-प्रयत्न तत्त्वावर असते. प्रत्यक्षात आम्ही इव्हेंट उत्सर्जित होतात त्या क्रमाने वितरित करतो, परंतु अपयश झाल्यास पुनःप्रयत्नांमुळे क्रम बदलू शकतो. नेहमी call_id / ऑब्जेक्ट id द्वारे डुप्लिकेट काढून टाका आणि पडताळणी करा.

डुप्लिकेट

वितरण किमान-एकदा असते: आम्हाला न दिसलेल्या प्रतिसादानंतरचा पुनःप्रयत्न एखादा इव्हेंट डुप्लिकेट करू शकतो. प्रत्येक पुनःप्रयत्नात समान event_id असतो, म्हणून प्रक्रिया केलेले id साठवा आणि पुनरावृत्ती वगळा. event_id एंडपॉइंट्समध्येही सामायिक असतो — त्याच इव्हेंटची सदस्यता घेतलेल्या दोन एंडपॉइंट्सना समान event_id मिळतो.

कालबाह्यता

एंडपॉइंट वितरणांसाठी प्रत्येक प्रयत्नाला 30 सेकंदांची कालबाह्यता असते. लेगसी मार्गावर, थेट कॉलचे वर्तन नियंत्रित करणाऱ्या ब्लॉकिंग विनंत्या — telephony.incoming / web.incoming कॉन्फिगरेशन एक्सचेंज — फोन कॉलच्या पहिल्या प्रयत्नासाठी 10 सेकंदांपर्यंत आणि त्याच्या एका पुनःप्रयत्नासह संपूर्ण एक्सचेंजसाठी 13 सेकंदांपर्यंत, तसेच विजेट सत्रासाठी 10 सेकंदांपर्यंत मर्यादित असतात. धीमा प्रतिसाद कॉल उचलण्यास विलंब करतो, म्हणून काही सेकंदांत उत्तर देण्याचे उद्दिष्ट ठेवा. Webhook-मोड tool dispatch मध्ये डीफॉल्टनुसार 20 सेकंदांची परवानगी असते आणि टूल घोषणांमध्ये उच्च-स्तरीय timeout सेट करता येतो.

स्रोत IP

आउटबाउंड webhooks ThunderPhone च्या क्लाउड IP श्रेणीतून येतात. तुमच्या फायरवॉलला अनुमतीसूची आवश्यक असल्यास, सपोर्टशी संपर्क साधा आणि आम्ही सध्याच्या श्रेणी सामायिक करू.

लेगसी आणि एंडपॉइंट-आधारित webhooks यांपैकी निवडणे

वैशिष्ट्यलेगसी (/v1/webhook)एंडपॉइंट्स (/v1/developer/webhook-endpoints)
URL ची संख्याप्रत्येक संस्थेसाठी 1प्रत्येक संस्थेसाठी अनेक
इव्हेंट कव्हरेजफक्त telephony.* / web.*सर्व 10 इव्हेंट प्रकार
इव्हेंट फिल्टर—प्रत्येक एंडपॉइंटसाठी
पुनःप्रयत्नफोन-कॉल कॉन्फिगरेशन एक्सचेंजसाठी एक वगळता नाही24 तासांत 8 प्रयत्न
एन्व्हलपtype + datatype + data + event_id
सिक्रेट रोटेशनएकमेव सिक्रेट बदलतेप्रत्येक एंडपॉइंटसाठी सिक्रेट
हटवल्याशिवाय अक्षम कराPUT /v1/webhook सह {"url": ""}status=disabled
स्थिती दृश्यमानता—active / disabled / failing
ब्लॉकिंग कॉन्फिगरेशन एक्सचेंजहोय (telephony.incoming / web.incoming)कधीही नाही — फक्त सूचना
यासाठी सर्वोत्तमडायनॅमिक कॉल कॉन्फिगरेशनउत्पादनातील इव्हेंट वापर

नवीन एकत्रीकरणांनी एंडपॉइंट-आधारित webhooks द्वारे इव्हेंट वापरावेत. फक्त कॉल उचलतानाच्या वेळी तुम्ही कॉल डायनॅमिकरीत्या कॉन्फिगर करत असल्यास किंवा webhook-मोड टूल डिस्पॅच वापरत असल्यास लेगसी URL ठेवा (किंवा जोडा) — त्या विनंती/प्रतिसाद देवाणघेवाणी फक्त लेगसी मार्गावर चालतात.


संबंधित