ThunderPhone 2.0 ਹੁਣ ਲਾਈਵ ਹੈ।ਸੈਲਫ਼-ਸਰਵਿਸ—2¢/ਮਿੰਟ ਤੋਂਐਲਾਨ ਪੜ੍ਹੋ

Webhooks

ਵੈੱਬਹੁੱਕਸ ਸੰਖੇਪ ਜਾਣਕਾਰੀ

ThunderPhone ਰੀਅਲ-ਟਾਈਮ ਇਵੈਂਟ ਕਿਵੇਂ ਡਿਲੀਵਰ ਕਰਦਾ ਹੈ, ਸਿਗਨੇਚਰਾਂ ਦੀ ਪੁਸ਼ਟੀ ਕਿਵੇਂ ਕਰਨੀ ਹੈ, ਅਤੇ ਲੈਗੇਸੀ ਤੇ ਐਂਡਪੌਇੰਟ-ਆਧਾਰਿਤ ਡਿਲੀਵਰੀ ਮਾਡਲਾਂ ਦੀ ਤੁਲਨਾ ਕਿਵੇਂ ਹੁੰਦੀ ਹੈ।

ThunderPhone ਤੁਹਾਡੇ ਸਰਵਰ ਨੂੰ HTTP POST ਬੇਨਤੀਆਂ ਭੇਜਦਾ ਹੈ ਜਦੋਂ ਕਾਲ ਦੌਰਾਨ ਕੁਝ ਹੁੰਦਾ ਹੈ — ਇਨਬਾਊਂਡ ਕਾਲ ਸ਼ੁਰੂ ਹੁੰਦੀ ਹੈ, ਕਾਲ ਸਮਾਪਤ ਹੁੰਦੀ ਹੈ, ਗ੍ਰੇਡਿੰਗ ਰਨ ਪੂਰਾ ਹੁੰਦਾ ਹੈ, ਅਲਰਟ ਚੱਲਦਾ ਹੈ, ਆਦਿ। ਇੱਥੇ ਦੋ ਡਿਲਿਵਰੀ ਮਾਡਲ ਹਨ:

ਇਵੈਂਟ ਕੈਟਾਲੌਗ ਵਿੱਚ ਸਾਰੇ 10 ਇਵੈਂਟ ਕਿਸਮਾਂ ਵੈੱਬਹੁੱਕ ਐਂਡਪੌਇੰਟਾਂ ਰਾਹੀਂ ਡਿਲਿਵਰ ਕੀਤੀਆਂ ਜਾਂਦੀਆਂ ਹਨ। ਛੇ ਕਾਲ-ਲਾਈਫਸਾਈਕਲ ਇਵੈਂਟ (telephony.incoming, telephony.complete, telephony.tool, web.incoming, web.complete, web.tool) ਵੀ ਲੈਗੇਸੀ ਸਿੰਗਲ-URL ਵੈੱਬਹੁੱਕ ਨੂੰ ਭੇਜੇ ਜਾਂਦੇ ਹਨ — ਜੇ ਤੁਹਾਡੇ ਕੋਲ ਲੈਗੇਸੀ URL ਅਤੇ ਮੇਲ ਖਾਂਦਾ ਐਂਡਪੌਇੰਟ ਦੋਵੇਂ ਹਨ, ਤਾਂ ਤੁਸੀਂ ਇਵੈਂਟ ਦੋਵੇਂ ਮਾਰਗਾਂ 'ਤੇ ਪ੍ਰਾਪਤ ਕਰਦੇ ਹੋ। ਬਲਾਕਿੰਗ ਵਿਹਾਰ (telephony.incoming / web.incoming ਕੌਂਫਿਗਰੇਸ਼ਨ ਅਦਲਾ-ਬਦਲ ਅਤੇ ਵੈੱਬਹੁੱਕ-ਮੋਡ ਟੂਲ ਡਿਸਪੈਚ) ਸਿਰਫ਼ ਲੈਗੇਸੀ ਮਾਰਗ 'ਤੇ ਹੁੰਦਾ ਹੈ; ਹਰੇਕ ਐਂਡਪੌਇੰਟ ਡਿਲਿਵਰੀ ਫਾਇਰ-ਐਂਡ-ਫਰਗੇਟ ਸੂਚਨਾ ਹੁੰਦੀ ਹੈ।

ਪੇਲੋਡ ਫਾਰਮੈਟ

ਐਂਡਪੌਇੰਟ ਡਿਲਿਵਰੀਆਂ 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 ਵੈੱਬਹੁੱਕ ਉਹੀ type ਅਤੇ data ਭੇਜਦਾ ਹੈ, ਪਰ event_id ਤੋਂ ਬਿਨਾਂ:

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

ਵਾਇਰ 'ਤੇ, ਹਰੇਕ ਬਾਡੀ ਕੈਨੋਨਿਕਲ ਤਰੀਕੇ ਨਾਲ ਸੀਰੀਅਲਾਈਜ਼ ਹੁੰਦੀ ਹੈ — ਕੁੰਜੀਆਂ ਅੱਖਰਕ੍ਰਮ ਅਨੁਸਾਰ ਕ੍ਰਮਬੱਧ, ਕੋਈ ਵ੍ਹਾਈਟਸਪੇਸ ਨਹੀਂ, UTF-8। ਇਨ੍ਹਾਂ ਡੌਕਸ ਵਿੱਚ ਸੁਚੱਜੇ ਤਰੀਕੇ ਨਾਲ ਫਾਰਮੈਟ ਕੀਤੀਆਂ ਉਦਾਹਰਨਾਂ ਸਿਰਫ਼ ਪੜ੍ਹਨਯੋਗਤਾ ਲਈ ਹਨ।

ਇਵੈਂਟ ਕਿਸਮਾਂ ਅਤੇ ਪੇਲੋਡ ਫੀਲਡਾਂ ਦੀ ਪੂਰੀ ਸੂਚੀ ਲਈ ਇਵੈਂਟ ਕੈਟਾਲੌਗ ਵੇਖੋ।

ਦਸਤਖ਼ਤ ਤਸਦੀਕ

ਹਰ ਬੇਨਤੀ ਵਿੱਚ X-ThunderPhone-Signature ਹੈਡਰ ਵਿੱਚ ਕੱਚੇ ਬੇਨਤੀ ਬਾਡੀ ਉੱਤੇ ਇੱਕ HMAC-SHA256 ਦਸਤਖ਼ਤ ਹੁੰਦਾ ਹੈ। ਸਾਈਨਿੰਗ ਕੁੰਜੀ ਐਂਡਪੌਇੰਟ ਦਾ secret ਹੁੰਦਾ ਹੈ (ਜਾਂ ਪੁਰਾਣੀਆਂ ਡਿਲਿਵਰੀਆਂ ਲਈ ਤੁਹਾਡੀ ਸੰਸਥਾ-ਪੱਧਰੀ ਵੈੱਬਹੁੱਕ secret)।

ਕਦਮ

  1. ਕਿਸੇ ਵੀ ਪਾਰਸਿੰਗ ਤੋਂ ਪਹਿਲਾਂ ਕੱਚਾ ਬੇਨਤੀ ਬਾਡੀ ਪੜ੍ਹੋ।
  2. hmac_sha256(secret, body).hexdigest() ਦੀ ਗਣਨਾ ਕਰੋ।
  3. X-ThunderPhone-Signature ਹੈਡਰ ਨਾਲ ਸਥਿਰ ਸਮੇਂ ਵਿੱਚ ਤੁਲਨਾ ਕਰੋ।

ਅਸੀਂ ਬਿਲਕੁਲ ਉਹੀ ਬਾਈਟਾਂ ਸਾਈਨ ਕਰਦੇ ਹਾਂ ਜੋ ਅਸੀਂ ਭੇਜਦੇ ਹਾਂ, ਅਤੇ ਉਹ ਬਾਈਟਾਂ ਕੈਨੋਨਿਕਲ JSON ਸੀਰੀਅਲਾਈਜ਼ੇਸ਼ਨ ਹੁੰਦੀਆਂ ਹਨ (ਕ੍ਰਮਬੱਧ ਕੁੰਜੀਆਂ, ਸੰਖੇਪ ਵੱਖਰੇਕਰਨ)। ਇਸ ਲਈ ਕੱਚੇ ਬਾਡੀ ਦੇ ਮੁਕਾਬਲੇ ਤਸਦੀਕ ਹਮੇਸ਼ਾਂ ਕੰਮ ਕਰਦੀ ਹੈ — ਅਤੇ ਜੇ ਤੁਹਾਡਾ ਫ੍ਰੇਮਵਰਕ ਤੁਹਾਨੂੰ ਸਿਰਫ਼ ਪਾਰਸ ਕੀਤਾ JSON ਦਿੰਦਾ ਹੈ, ਤਾਂ ਇਸ ਨੂੰ ਕ੍ਰਮਬੱਧ ਕੁੰਜੀਆਂ ਅਤੇ ਸੰਖੇਪ ਵੱਖਰੇਕਰਨ ਨਾਲ ਦੁਬਾਰਾ ਸੀਰੀਅਲਾਈਜ਼ ਕਰਨ ਨਾਲ ਇੱਕੋ ਜਿਹੀਆਂ ਬਾਈਟਾਂ ਬਣਦੀਆਂ ਹਨ। ਦੋਵੇਂ ਤਰੀਕੇ ਤਸਦੀਕ ਗਾਈਡ ਵਿੱਚ ਸ਼ਾਮਲ ਹਨ।

Python
import hmac
import hashlib
 
def verify_signature(body: bytes, signature: str, secret: str) -> bool:
    expected = hmac.new(
        secret.encode("utf-8"),
        body,
        hashlib.sha256,
    ).hexdigest()
    return hmac.compare_digest(expected, signature or "")
 
# Example Flask handler
from flask import Flask, request, abort
app = Flask(__name__)
 
@app.post("/thunderphone-webhook")
def handle():
    body = request.get_data()
    sig = request.headers.get("X-ThunderPhone-Signature", "")
    if not verify_signature(body, sig, WEBHOOK_SECRET):
        abort(401)
    event = request.get_json()
    # dispatch on event["type"] …
    return "", 204
Node.js (Express)
import crypto from "node:crypto";
import express from "express";
 
function verifySignature(body, signature, secret) {
  const expected = crypto
    .createHmac("sha256", secret)
    .update(body)
    .digest("hex");
  if (!signature || expected.length !== signature.length) return false;
  return crypto.timingSafeEqual(
    Buffer.from(expected),
    Buffer.from(signature),
  );
}
 
const app = express();
app.post(
  "/thunderphone-webhook",
  express.raw({ type: "application/json" }),
  (req, res) => {
    const sig = req.header("X-ThunderPhone-Signature") || "";
    if (!verifySignature(req.body, sig, process.env.WEBHOOK_SECRET)) {
      return res.sendStatus(401);
    }
    const event = JSON.parse(req.body.toString("utf8"));
    // dispatch on event.type …
    res.sendStatus(204);
  },
);

ਡਿਲਿਵਰੀ ਅਰਥ-ਵਿਧੀ

ਇਹ ਅਰਥ-ਵਿਧੀਆਂ ਐਂਡਪੌਇੰਟ ਡਿਲਿਵਰੀਆਂ 'ਤੇ ਲਾਗੂ ਹੁੰਦੀਆਂ ਹਨ। ਪੁਰਾਣਾ ਸਿੰਗਲ-URL ਵੈੱਬਹੁੱਕ ਬਿਨਾਂ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ਾਂ ਦੇ ਇੱਕ ਸਿੰਗਲ ਸਮਕਾਲੀ ਯਤਨ ਹੈ।

ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ਾਂ

ਹਰ ਇਵੈਂਟ ਦਾ ਤੁਰੰਤ ਇੱਕ ਵਾਰ ਯਤਨ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। ਕੋਈ ਵੀ 2xx ਜਵਾਬ ਡਿਲਿਵਰੀ ਦੀ ਪੁਸ਼ਟੀ ਕਰਦਾ ਹੈ। ਕਿਸੇ ਵੀ ਹੋਰ ਨਤੀਜੇ ਉੱਤੇ (ਗੈਰ-2xx, ਕਨੈਕਸ਼ਨ ਗਲਤੀ, ਟਾਈਮਆਊਟ) ਅਸੀਂ ਪਹਿਲੇ ਯਤਨ ਤੋਂ ਬਾਅਦ 1 ਮਿੰਟ, 5 ਮਿੰਟ, 30 ਮਿੰਟ, 2 ਘੰਟੇ, 6 ਘੰਟੇ, 12 ਘੰਟੇ ਅਤੇ 24 ਘੰਟੇ 'ਤੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰਦੇ ਹਾਂ — 24 ਘੰਟਿਆਂ ਵਿੱਚ 8 ਯਤਨ। ਜੇ ਹਰ ਯਤਨ ਅਸਫਲ ਹੋ ਜਾਂਦਾ ਹੈ, ਤਾਂ ਡਿਲਿਵਰੀ ਰੁਕ ਜਾਂਦੀ ਹੈ ਅਤੇ ਐਂਡਪੌਇੰਟ ਨੂੰ ਵੈੱਬਹੁੱਕ ਐਂਡਪੌਇੰਟਾਂ ਵਿੱਚ status="failing" ਵਜੋਂ ਚਿੰਨ੍ਹਿਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। ਜਦੋਂ ਹੀ ਪੇਲੋਡ ਟਿਕਾਊ ਤੌਰ 'ਤੇ ਸਵੀਕਾਰ ਹੋਵੇ, 2xx ਵਾਪਸ ਕਰੋ; ਅਸਮਕਾਲੀ ਢੰਗ ਨਾਲ ਪ੍ਰਕਿਰਿਆ ਕਰੋ।

ਕ੍ਰਮਬੱਧਤਾ

ਡਿਲਿਵਰੀ ਕ੍ਰਮਬੱਧਤਾ ਸਭ ਤੋਂ ਵਧੀਆ ਯਤਨ ਦੇ ਆਧਾਰ 'ਤੇ ਹੈ। ਅਭਿਆਸ ਵਿੱਚ ਅਸੀਂ ਇਵੈਂਟਾਂ ਨੂੰ ਉਹਨਾਂ ਦੇ ਨਿਕਲਣ ਦੇ ਕ੍ਰਮ ਵਿੱਚ ਡਿਲਿਵਰ ਕਰਦੇ ਹਾਂ, ਪਰ ਅਸਫਲਤਾ ਹੋਣ 'ਤੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ਾਂ ਕ੍ਰਮ ਬਦਲ ਸਕਦੀਆਂ ਹਨ। ਹਮੇਸ਼ਾ call_id / ਆਬਜੈਕਟ id ਰਾਹੀਂ ਡੁਪਲੀਕੇਟ ਹਟਾਓ ਅਤੇ ਮਿਲਾਨ ਕਰੋ।

ਡੁਪਲੀਕੇਟ

ਡਿਲਿਵਰੀ ਘੱਟੋ-ਘੱਟ-ਇੱਕ-ਵਾਰ ਹੈ: ਉਸ ਜਵਾਬ ਤੋਂ ਬਾਅਦ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼, ਜੋ ਅਸੀਂ ਕਦੇ ਨਹੀਂ ਦੇਖਿਆ, ਕਿਸੇ ਇਵੈਂਟ ਦੀ ਡੁਪਲੀਕੇਟ ਬਣਾ ਸਕਦੀ ਹੈ। ਹਰ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਵਿੱਚ ਉਹੀ event_id ਹੁੰਦਾ ਹੈ, ਇਸ ਲਈ ਪ੍ਰਕਿਰਿਆ ਕੀਤੀਆਂ id ਸਟੋਰ ਕਰੋ ਅਤੇ ਦੁਹਰਾਵੇ ਛੱਡੋ। event_id ਐਂਡਪੌਇੰਟਾਂ ਵਿਚਕਾਰ ਵੀ ਸਾਂਝਾ ਹੁੰਦਾ ਹੈ — ਇੱਕੋ ਇਵੈਂਟ ਲਈ ਸਬਸਕ੍ਰਾਈਬ ਕੀਤੇ ਦੋ ਐਂਡਪੌਇੰਟਾਂ ਨੂੰ ਉਹੀ event_id ਮਿਲਦਾ ਹੈ।

ਟਾਈਮਆਊਟ

ਐਂਡਪੌਇੰਟ ਡਿਲਿਵਰੀਆਂ ਵਿੱਚ ਹਰ ਯਤਨ ਲਈ 30 ਸਕਿੰਟ ਦਾ ਟਾਈਮਆਊਟ ਹੁੰਦਾ ਹੈ। ਪੁਰਾਣੇ ਪਾਥ 'ਤੇ, ਲਾਈਵ ਕਾਲ ਵਿਹਾਰ ਨੂੰ ਨਿਯੰਤਰਿਤ ਕਰਨ ਵਾਲੀਆਂ ਬਲੌਕਿੰਗ ਬੇਨਤੀਆਂ — telephony.incoming / web.incoming ਕਨਫਿਗਰੇਸ਼ਨ ਅਦਲਾ-ਬਦਲੀ — 10 ਸਕਿੰਟ ਬਾਅਦ ਟਾਈਮਆਊਟ ਹੋ ਜਾਂਦੀਆਂ ਹਨ, ਪਰ ਹੌਲਾ ਜਵਾਬ ਕਾਲ ਚੁੱਕਣ ਵਿੱਚ ਦੇਰੀ ਕਰਦਾ ਹੈ, ਇਸ ਲਈ ਕੁਝ ਸਕਿੰਟਾਂ ਦੇ ਅੰਦਰ ਜਵਾਬ ਦੇਣ ਦਾ ਟੀਚਾ ਰੱਖੋ। ਵੈੱਬਹੁੱਕ-ਮੋਡ ਟੂਲ ਡਿਸਪੈਚ ਮੂਲ ਰੂਪ ਵਿੱਚ 20 ਸਕਿੰਟ ਦੀ ਇਜਾਜ਼ਤ ਦਿੰਦਾ ਹੈ, ਅਤੇ ਟੂਲ ਘੋਸ਼ਣਾਵਾਂ ਉੱਚ-ਪੱਧਰੀ timeout ਸੈੱਟ ਕਰ ਸਕਦੀਆਂ ਹਨ।

ਸਰੋਤ IP

ਆਊਟਬਾਊਂਡ ਵੈੱਬਹੁੱਕ ThunderPhone ਦੀ ਕਲਾਉਡ IP ਰੇਂਜ ਤੋਂ ਆਉਂਦੇ ਹਨ। ਜੇ ਤੁਹਾਡੇ ਫਾਇਰਵਾਲ ਨੂੰ ਅਲਾਊਲਿਸਟ ਦੀ ਲੋੜ ਹੈ, ਤਾਂ ਸਹਾਇਤਾ ਨਾਲ ਸੰਪਰਕ ਕਰੋ ਅਤੇ ਅਸੀਂ ਮੌਜੂਦਾ ਰੇਂਜਾਂ ਸਾਂਝੀਆਂ ਕਰਾਂਗੇ।

ਪੁਰਾਣੇ ਅਤੇ ਐਂਡਪੌਇੰਟ-ਅਧਾਰਿਤ ਵੈੱਬਹੁੱਕਾਂ ਵਿੱਚੋਂ ਚੋਣ

ਵਿਸ਼ੇਸ਼ਤਾਪੁਰਾਣਾ (/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)ਕਦੇ ਨਹੀਂ — ਸਿਰਫ਼ ਸੂਚਨਾਵਾਂ
ਸਭ ਤੋਂ ਵਧੀਆ ਲਈਡਾਇਨਾਮਿਕ ਕਾਲ ਕਨਫਿਗਰੇਸ਼ਨਪ੍ਰੋਡਕਸ਼ਨ ਵਿੱਚ ਇਵੈਂਟ ਵਰਤੋਂ

ਨਵੇਂ ਇੰਟੀਗ੍ਰੇਸ਼ਨਾਂ ਨੂੰ ਐਂਡਪੌਇੰਟ-ਅਧਾਰਿਤ ਵੈੱਬਹੁੱਕਾਂ ਰਾਹੀਂ ਇਵੈਂਟ ਵਰਤਣੇ ਚਾਹੀਦੇ ਹਨ। ਪੁਰਾਣਾ URL ਕੇਵਲ ਤਦੋਂ ਰੱਖੋ (ਜਾਂ ਜੋੜੋ) ਜੇ ਤੁਸੀਂ ਕਾਲ ਚੁੱਕਣ ਵੇਲੇ ਕਾਲਾਂ ਨੂੰ ਡਾਇਨਾਮਿਕ ਤੌਰ 'ਤੇ ਕਨਫਿਗਰ ਕਰਦੇ ਹੋ ਜਾਂ ਵੈੱਬਹੁੱਕ-ਮੋਡ ਟੂਲ ਡਿਸਪੈਚ ਵਰਤਦੇ ਹੋ — ਉਹ ਬੇਨਤੀ/ਜਵਾਬ ਅਦਲਾ-ਬਦਲੀਆਂ ਸਿਰਫ਼ ਪੁਰਾਣੇ ਪਾਥ 'ਤੇ ਚਲਦੀਆਂ ਹਨ।


ਸੰਬੰਧਿਤ