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 (અથવા legacy ડિલિવરી માટે તમારા org-સ્તરના webhook secret) વડે કી કરાયેલ HMAC-SHA256 છે:

  • X-ThunderPhone-Signature-V2: t=<unix seconds>,v1=<hex> timestamp, method, path અને query, તેમજ raw body પર સહી કરે છે. આની ચકાસણી કરો અને એવા વિનંતીઓ નકારી કાઢો જેમનું t તમારી ઘડિયાળ કરતાં 5 મિનિટથી વધુ દૂર હોય, જેથી કૅપ્ચર કરેલી વિનંતી પછીથી ફરી ચલાવી ન શકાય. ફરી પ્રયાસો મોકલાય ત્યારે તેમની પર ફરીથી સહી કરવામાં આવે છે.
  • X-ThunderPhone-Signature માત્ર raw body પર સહી કરે છે. હાલના verifiers કાર્યરત રહે તે માટે તે હજી પણ અપરિવર્તિત રીતે મોકલવામાં આવે છે.

પગલાં

  1. કોઈપણ પાર્સિંગ પહેલાં હેડર, મેથડ, રૉ પાથ અને ક્વેરી, તથા રૉ બોડી વાંચો.
  2. તમારા સિક્રેટ સાથે <t>\n<METHOD>\n<path and query>\n<body> નો હેક્સ HMAC-SHA256 ગણો.
  3. જો t 300 સેકન્ડથી વધુ સમયથી અલગ હોય અથવા કોન્સ્ટન્ટ-ટાઇમ સરખામણીમાં પરિણામ v1 સાથે મેળ ખાતું ન હોય, તો રિક્વેસ્ટ નકારી કાઢો.

બોડીઝ કેનોનિકલ JSON સિરિયલાઇઝેશન છે (સૉર્ટ કરેલી કીઝ, કોમ્પેક્ટ સેપરેટર્સ), અને અમે મોકલીએ છીએ તે જ બાઇટ્સ પર સહી કરીએ છીએ. વેરિફિકેશન માર્ગદર્શિકામાં ચોક્કસ સહી કરેલી સ્ટ્રિંગ, એક કાર્યકારી ઉદાહરણ, SDK વગરનો કોડ અને લેગસી હેડર છે.

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 વેબહૂક એક જ સમકાલીન પ્રયાસ છે જેમાં કોઈ પુનઃપ્રયાસ નથી, સિવાય કે ફોન-કૉલ telephony.incoming રૂપરેખાંકન વિનિમય, જેને એક વાર ફરી પ્રયાસ કરવામાં આવે છે.

પુનઃપ્રયાસ

દરેક ઇવેન્ટનો તરત જ એક વાર પ્રયાસ કરવામાં આવે છે. કોઈપણ 2xx પ્રતિસાદ ડિલિવરીની પુષ્ટિ કરે છે. અન્ય કોઈપણ પરિણામમાં (non-2xx, કનેક્શન ભૂલ, સમયસમાપ્તિ), અમે પ્રથમ પ્રયાસ પછી 1 મિનિટ, 5 મિનિટ, 30 મિનિટ, 2 કલાક, 6 કલાક, 12 કલાક અને 24 કલાકે ફરી પ્રયાસ કરીએ છીએ — 24 કલાકમાં કુલ 8 પ્રયાસો. જો દરેક પ્રયાસ નિષ્ફળ જાય, તો ડિલિવરી બંધ થાય છે અને એન્ડપૉઇન્ટને વેબહૂક એન્ડપૉઇન્ટ્સમાં status="failing" તરીકે ચિહ્નિત કરવામાં આવે છે; અમે તમારી સંસ્થાના માલિકો અને એડમિન્સને ઇમેઇલ કરીએ છીએ અને તેને ડેશબોર્ડમાં બતાવીએ છીએ. પેલોડ સ્થાયી રીતે સ્વીકારવામાં આવે કે તરત 2xx પરત કરો; અસિંક્રોનસ રીતે પ્રક્રિયા કરો. એન્ડપૉઇન્ટ ટેસ્ટ APIમાંથી ટેસ્ટ મોકલણોને પ્રથમ પ્રયાસ પછી લગભગ એક મિનિટે એક પુનઃપ્રયાસ મળે છે અને તે એન્ડપૉઇન્ટની સ્થિતિ ક્યારેય બદલતા નથી.

ક્રમ

ડિલિવરી ક્રમ શક્ય તેટલો જાળવવામાં આવે છે. વ્યવહારમાં અમે ઇવેન્ટ્સ ઉત્સર્જિત થાય તે ક્રમમાં ડિલિવર કરીએ છીએ, પરંતુ નિષ્ફળતા પર પુનઃપ્રયાસો ક્રમ બદલી શકે છે. હંમેશાં call_id / ઑબ્જેક્ટ id દ્વારા ડિડુપ્લિકેટ કરો અને સમાધાન કરો.

ડુપ્લિકેટ્સ

ડિલિવરી ઓછામાં ઓછી એક વખત છે: જે પ્રતિસાદ અમે ક્યારેય જોયો નથી તે પછીનો પુનઃપ્રયાસ ઇવેન્ટની ડુપ્લિકેટ બનાવી શકે છે. દરેક પુનઃપ્રયાસમાં સમાન event_id હોય છે, તેથી પ્રક્રિયા કરેલ ids સંગ્રહિત કરો અને પુનરાવર્તનો છોડો. event_id એન્ડપોઇન્ટ્સ વચ્ચે પણ શેર થાય છે — સમાન ઇવેન્ટ માટે સબ્સ્ક્રાઇબ કરેલા બે એન્ડપોઇન્ટ્સને સમાન event_id મળે છે.

સમયસમાપ્તિઓ

એન્ડપૉઇન્ટ ડિલિવરીમાં પ્રતિ પ્રયાસ 30 સેકન્ડની સમયસમાપ્તિ હોય છે. લેગસી પાથ પર, લાઇવ કૉલના વર્તનને નિયંત્રિત કરતી અવરોધક વિનંતીઓ — telephony.incoming / web.incoming રૂપરેખાંકન વિનિમય — ફોન કૉલના પ્રથમ પ્રયાસ માટે 10 સેકન્ડ સુધી અને તેના એક પુનઃપ્રયાસ સહિત સમગ્ર વિનિમય માટે 13 સેકન્ડ સુધી, તેમજ વિજેટ સત્ર માટે 10 સેકન્ડ સુધી મર્યાદિત છે. ધીમો પ્રતિસાદ કૉલ ઉપાડવામાં વિલંબ કરે છે, તેથી થોડા સેકન્ડમાં જવાબ આપવાનો પ્રયાસ કરો. વેબહૂક-મોડ ટૂલ ડિસ્પૅચ મૂળભૂત રીતે 20 સેકન્ડ આપે છે, અને ટૂલ ઘોષણાઓ ટોચના સ્તરનું timeout સેટ કરી શકે છે.

સ્રોત IPs

આઉટબાઉન્ડ વેબહૂક્સ 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 રાખો (અથવા ઉમેરો) — આ વિનંતી/પ્રતિસાદ વિનિમયો માત્ર લેગસી પાથ પર ચાલે છે.


સંબંધિત