ವಿಕಾಸಕರಿಂದ ಕೇಳುವ ವೆಬ್ಹುಕ್ ಮಾದರಿಗಳು ಹೆಚ್ಚು.
ಒಂದು ವಿಶ್ವಾಸಾರ್ಹ ವೆಬ್ಹುಕ್ ಹ್ಯಾಂಡ್ಲರ್ ಕ್ರಮವಾಗಿ ನಾಲ್ಕು ವಿಷಯಗಳನ್ನು ಮಾಡುತ್ತದೆ: ಕಚ್ಚಾ ಶರೀರದ ವಿರುದ್ಧ ಸಹಿಯನ್ನು ಪರಿಶೀಲಿಸಿ (ನೋಡ್ನಲ್ಲಿ webhooks.verify, ಇತರಲ್ಲಿ ದಾಖಲೆಗೊಳಿತ HMAC), ಘಟನೆ ಐಡ್ನ ಮೂಲಕ ಡಿಡ್ಯೂಪ್ ಮಾಡಿ, ಕೆಲಸವನ್ನು ಹಿನ್ನೋಟ ಕ್ಯೂಗೆ ಸೇರಿಸಿ, ಮತ್ತು 200 ಅನ್ನು ಹಿಂತಿರುಗಿಸಿ. ದೀರ್ಘಕಾಲದ ಕೆಲಸವು ಕಾರ್ಮಿಕರಲ್ಲಿ ನಡೆಯುತ್ತದೆ, ಪುನರಾವೃತ್ತಗಳು ಮತ್ತು ಕ್ಯೂ ಹಂತದಲ್ಲಿ ಐಡೆಂಪೊಟೆನ್ಸಿ. ವಿಫಲವಾದ ಘಟನೆ ಇಲ್ಲದ ಕಾರಣ, ಶ್ರೇಣೀಬದ್ಧವಾದ ಸ್ವೀಪ್ ಪಾವತಿಯನ್ನು ಕಾಯುವ ಕೆಲಸಗಳನ್ನು ಸಮಯ ಮಿತಿಯೊಳಗೆ ಕಟ್ಟಿ ಹಾಕುತ್ತದೆ ಮತ್ತು ಅವುಗಳನ್ನು ಪುನಃ ಸಮೀಕರಿಸುತ್ತದೆ.
ನೀವು ಪ್ರಾರಂಭಿಸುವ ಮೊದಲು.
- ನಿಮ್ಮ ಡ್ಯಾಶ್ಬೋರ್ಡ್ನಿಂದ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತಿರುವ ಏಜೆಂಟ್ ಪ್ರೊಫೈಲ್ ಮತ್ತು ಸಹಿ ರಹಸ್ಯ (ಸೆಟಿಂಗ್ಗಳು - ವೆಬ್ಹುಕ್ಸ್).
- ಕಚ್ಚಾ-ಶರೀರ ಪ್ರವೇಶವಿರುವ ವೆಬ್ ಫ್ರೇಮ್ವರ್ಕ್ -
express.rawಸಹಿತ ಎಕ್ಸ್ಪ್ರೆಸ್, ಫಾಸ್ಟ್ಎಪಿ, ಫ್ಲಾಸ್ಕ್, ಇತ್ಯಾದಿ. ಸ್ವಾಯತ್ತ-ಪಾರ್ಸಿಂಗ್ JSON ಮಧ್ಯಂತರವು ಸಹಿ ಪರಿಶೀಲನೆಯನ್ನು ಮುರಿಯುತ್ತದೆ. - ಊರ ಕೆಲಸದ ಸಾಲು: BullMQ (Node) ಅಥವಾ Celery/arq (Python). ವೆಬ್ಹುಕ್ 200 ಶೀಘ್ರವಾಗಿ ಹಿಂತಿರುಗಿಸುತ್ತದೆ ಮತ್ತು ಸಾಲು ನಿಧಾನವಾದ ಕೆಲಸವನ್ನು ನಿರ್ವಹಿಸುತ್ತದೆ.
- ಅಪ್ಸರ್ಟ್ ಪ್ರಿಮಿಟಿವ್ಗಳೊಂದಿಗೆ ಡೇಟಾಬೇಸ್ (Postgres ಕೆಲಸ ಮಾಡುತ್ತದೆ; Redis SET NX ಕೂಡ ಚಿಕ್ಕ ಅವಧಿಯ ಡಿಡ್ಯೂಪ್ಗಾಗಿ ಕೆಲಸ ಮಾಡುತ್ತದೆ).
- ಒಂದು ಸಾರ್ವಜನಿಕ HTTPS ಅಂತಿಮ ಬಿಂದುವು - ಅಭಿವೃದ್ಧಿಯಲ್ಲಿ, ngrok ಅಥವಾ ನಿಯೋಜನೆ ಪೂರ್ವದೃಶ್ಯ. ಕಳುಹಿಸುವವರು ಖಾಸಗಿ URL ಗೆ ಒದಗಿಸುವುದಿಲ್ಲ.
ಕೈಹಾಕುವಿಕೆ ಪರಿಶೀಲಿಸಿ.
The signature is HMAC-SHA256 over {t}.{rawBody} with your webhook secret, hex-encoded, in the X-Blockchain0x-Signature header (t=<unix>,v1=<hex>), inside a 5-minute replay window. In Node, webhooks.verify from @blockchain0x/node does it and returns a discriminated union; in other languages compute the same HMAC and compare in constant time. Raw-body access matters: if the bytes you sign locally differ from the bytes that arrived, it fails.
import express from "express";
import { webhooks } from "@blockchain0x/node";
const app = express();
// Raw body so the HMAC matches the exact bytes on the wire.
app.use(express.raw({ type: "application/json" }));
app.post("/webhooks/payment", (req, res) => {
const result = webhooks.verify({
headers: req.headers,
rawBody: req.body, // Buffer, raw bytes
secret: process.env.BLOCKCHAIN0X_WEBHOOK_SECRET!,
});
// Discriminated union: branch on ok, no try/catch.
if (!result.ok) return res.status(400).json({ code: result.code });
// result.eventType / result.eventId are now set.
handleEvent(result);
res.status(200).send("ok");
});import hmac, hashlib, os, time
from flask import request
SECRET = os.environ["BLOCKCHAIN0X_WEBHOOK_SECRET"].encode()
# In Node, webhooks.verify does this. In Python, verify by hand against the
# documented algorithm: HMAC-SHA256 over "{t}.{rawBody}", 300s replay window.
def verify_signature(raw_body: bytes) -> bool:
sig = request.headers.get("X-Blockchain0x-Signature", "")
ts = request.headers.get("X-Blockchain0x-Timestamp", "")
parts = dict(p.split("=", 1) for p in sig.split(",") if "=" in p)
t, v1 = parts.get("t", ts), parts.get("v1", sig)
want = hmac.new(SECRET, t.encode() + b"." + raw_body, hashlib.sha256).hexdigest()
return hmac.compare_digest(want, v1) and abs(time.time() - int(t)) <= 300ಹ್ಯಾಂಡ್ಲರ್ ಅನ್ನು ಐಡೆಂಪೊಟೆಂಟ್ ಮಾಡಿ.
Webhooks retry on any non-2xx response, and the same event will arrive multiple times under load even when nothing has gone wrong. Dedupe on the event's id using a database upsert. If the row already exists, skip; if it does not, insert and proceed. Postgres makes this a single statement.
// Pseudocode for a Postgres-backed dedupe table. Replace with your DB of choice.
async function processEventOnce(eventId: string, body: object) {
// INSERT ... ON CONFLICT DO NOTHING returns rowCount === 0 on duplicate.
const inserted = await db.query(
"INSERT INTO webhook_events(id) VALUES ($1) ON CONFLICT DO NOTHING",
[eventId],
);
if (inserted.rowCount === 0) return; // Already processed.
await handleEvent(body);
}async def process_event_once(event_id: str, body: dict):
# INSERT ... ON CONFLICT DO NOTHING returns 0 rows on duplicate.
inserted = await db.execute(
"INSERT INTO webhook_events (id) VALUES ($1) ON CONFLICT DO NOTHING",
event_id,
)
if inserted == "INSERT 0 0": # asyncpg-style status
return # Already processed.
await handle_event(body)ಎನ್ಕ್ಯೂ ಮಾಡಿ ಮತ್ತು 200 ಶೀಘ್ರವಾಗಿ ಹಿಂತಿರುಗಿಸಿ.
ವೆಬ್ಹುಕ್ ಅಂತಿಮ ಬಿಂದುವು ಒಂದು ಸೆಕೆಂಡಿನೊಳಗೆ ಪ್ರತಿಕ್ರಿಯಿಸಬೇಕು. ಯಾವುದೇ ನಿಧಾನವಾದವು ಸಮಯ ಮಿತಿಗಳನ್ನು ಮತ್ತು ಪುನರಾವೃತ್ತಗಳನ್ನು ಆಹ್ವಾನಿಸುತ್ತದೆ. ಮಾದರಿ: ಪರಿಶೀಲಿಸಿ, ಎನ್ಕ್ಯೂ ಮಾಡಿ, ಪ್ರತಿಕ್ರಿಯಿಸಿ. ಕ್ಯೂ ಪುನರಾವೃತ್ತಗಳು, ಗಣನೀಯ ಹಿಂಬಾಲಣೆ ಮತ್ತು ತನ್ನದೇ ಆದ ಐಡಂಪೊಟೆನ್ಸಿಯೊಂದಿಗೆ ಕಾರ್ಯನಿರ್ವಹಿಸುವ ಕಾರ್ಮಿಕದಲ್ಲಿ ನಿಜವಾದ ವಿತರಣೆಯನ್ನು ನಿರ್ವಹಿಸುತ್ತದೆ. BullMQ ಮತ್ತು Celery ಎರಡೂ ಪ್ರತಿ-ಕೆಲಸದ ID ಅನ್ನು ಬೆಂಬಲಿಸುತ್ತವೆ, ಇದು ಒಂದೇ ಘಟನೆಗೆ ಪುನಃ ಎನ್ಕ್ಯೂ ಮಾಡುವುದನ್ನು ತಡೆಯುತ್ತದೆ.
// Express handler: verify, enqueue, return 200 fast.
import { Queue } from "bullmq";
import { webhooks } from "@blockchain0x/node";
const paymentQueue = new Queue("payments");
app.post(
"/webhooks/payment",
express.raw({ type: "application/json" }),
async (req, res) => {
const result = webhooks.verify({
headers: req.headers,
rawBody: req.body,
secret: process.env.BLOCKCHAIN0X_WEBHOOK_SECRET!,
});
if (!result.ok) return res.status(400).json({ code: result.code });
await paymentQueue.add(result.eventType, { raw: req.body.toString() }, {
jobId: result.eventId, // Idempotency key.
removeOnComplete: true,
attempts: 5,
backoff: { type: "exponential", delay: 1000 },
});
res.status(200).send("ok");
},
);
// Worker file:
import { Worker } from "bullmq";
new Worker("payments", async (job) => {
await handleEvent(job.data);
});# Flask handler enqueues to Celery (or arq) and returns 200 quickly.
from celery import Celery
from flask import request
celery = Celery("payments", broker=os.environ["REDIS_URL"])
@celery.task(bind=True, max_retries=5)
def handle_payment_event(self, event_type, raw):
try:
process_event_once(event_type, raw)
except Exception as exc:
raise self.retry(exc=exc, countdown=2 ** self.request.retries)
@app.post("/webhooks/payment")
def webhook():
raw = request.get_data()
if not verify_signature(raw):
abort(401)
event_id = request.headers.get("X-Blockchain0x-Event-Id", "")
event_type = request.headers.get("X-Blockchain0x-Event-Type", "")
handle_payment_event.apply_async(args=[event_type, raw.decode()], task_id=event_id)
return "ok", 200arq Python ಬದಿಯಲ್ಲಿ ಒಂದೇ ರೂಪವನ್ನು ಅನುಸರಿಸುತ್ತದೆ - ನಿರ್ಧಾರಾತ್ಮಕ ಕೆಲಸ id ನೊಂದಿಗೆ ಕಾರ್ಯವನ್ನು ನೋಂದಾಯಿಸಿ ಮತ್ತು ಕ್ಯೂ ಪುನರಾವೃತ್ತಗಳನ್ನು ನಿರ್ವಹಿಸಲು ಬಿಡಿ. ಮುಖ್ಯ ನಿರ್ಬಂಧವೆಂದರೆ.enqueue ಸ್ವತಃ ವೇಗವಾಗಿ ಇರಬೇಕು (Redis ಗೆ ಒಬ್ಬರ ಸುತ್ತು); ದೂರದ ಕರೆಗಳಲ್ಲಿ ವೆಬ್ಹುಕ್ ಅನ್ನು ನಿರ್ಬಂಧಿಸಬೇಡಿ.
ಊರಕ್ಕೆ ಬರುವ ಪಾವತಿಯನ್ನು ನಿರ್ವಹಿಸಿ.
ವಿಫಲವಾದ ವೆಬ್ಹುಕ್ ಇಲ್ಲ - ಖರೀದಿದಾರನು ತ್ಯಜಿಸಿದರೆ, ಯಾವುದೇ ಘಟನೆ ಬರುವುದಿಲ್ಲ, ಮತ್ತು ಏಜೆಂಟ್ 'awaiting_payment' ನಲ್ಲಿ ಅಡಗಿಸುತ್ತದೆ. ಆದ್ದರಿಂದ ನೀವು ಇದನ್ನು ಸ್ವತಃ ಗುರುತಿಸಿ: ಬಹಳಷ್ಟು ಸಮಯ ಕಾಯುವ ಕೆಲಸಗಳ ಮೇಲೆ ನಿಯೋಜಿತ ಸ್ವೀಪ್ ಅನ್ನು ನಿರ್ವಹಿಸಿ, ಅದು ವಾಸ್ತವವಾಗಿ ನೆಲೆಸಿದರೆ transactions.get ನೊಂದಿಗೆ ಚೈನ್ ವಿರುದ್ಧ ಸಮೀಕರಿಸಿ, ನಂತರ ಹಿಡಿದ ಸಂಪತ್ತನ್ನು ಬಿಡುಗಡೆ ಮಾಡಿ, ಕೆಲಸವನ್ನು ಅಂತಿಮವಾಗಿ ಬಿಲ್ಲು ಬಾಕಿ ಇರುವ ರಾಜ್ಯಕ್ಕೆ ಕಳುಹಿಸಿ, ಮತ್ತು (ಅನುವಾಗ) ಬಳಕೆದಾರರಿಗೆ ಫಲಿತಾಂಶವನ್ನು ಮೇಲ್ಮಟ್ಟಕ್ಕೆ ತರುತ್ತದೆ.
async function sweepStaleAwaitingPayment() {
for (const job of await findJobsAwaitingPaymentOlderThan("1h")) {
// Reconcile against the chain before giving up.
const tx = job.txHash ? await client.transactions.get(job.txHash) : null;
if (tx) { markJobPaid(job.id); continue; } // It actually settled.
// 1. Release any held resources tied to the job.
releaseHeldResources(job.id);
// 2. Move it out of 'awaiting_payment' into a terminal 'unpaid' state.
markJobUnpaid(job.id);
// 3. (Optional) Notify the user, with a fresh payment link.
notifyUser(job.userId, { template: "agent_payment_unpaid", jobId: job.id });
}
}# Run on a schedule - there is no failure webhook to wait for.
def sweep_stale_awaiting_payment():
for job in find_jobs_awaiting_payment_older_than("1h"):
tx = client.transactions.get(job["tx_hash"]) if job.get("tx_hash") else None
if tx:
mark_job_paid(job["id"]) # It actually settled.
continue
release_held_resources(job["id"])
mark_job_unpaid(job["id"])
notify_user(job["user_id"], template="agent_payment_unpaid", job_id=job["id"])ಘಟನೆಗಳನ್ನು ಬಿಟ್ಟುಕೊಡುವ ಅಥವಾ ನಕಲಿಸುವ ಐದು ತಪ್ಪುಗಳು.
ಹಸ್ತಾಕ್ಷರವನ್ನು ದೃಢೀಕರಿಸುವ ಮೊದಲು ಶರೀರವನ್ನು ಪಾರ್ಸಿಂಗ್ ಮಾಡುವುದು
HMAC ಅನ್ನು ಕಳುಹಿಸುವವರು ಸಹಿ ಮಾಡಿದ ಕಚ್ಚಾ ಬೈಟ್ಸ್ ಮೇಲೆ ಲೆಕ್ಕಹಾಕಬೇಕು. ನಿಮ್ಮ ಫ್ರೇಮ್ವರ್ಕ್ ನಿಮ್ಮ ಹ್ಯಾಂಡ್ಲರ್ ಕಾರ್ಯನಿರ್ವಹಿಸುವ ಮೊದಲು JSON ಅನ್ನು ಸ್ವಯಂ-ಪಾರ್ಸ್ ಮಾಡಿದರೆ, ನೀವು ಸ್ಥಳೀಯವಾಗಿ ಸಹಿ ಮಾಡಿದ ಬೈಟ್ಸ್ ಕಳುಹಿಸುವವರು ಸಹಿ ಮಾಡಿದ ಬೈಟ್ಸ್ ಗೆ ಹೊಂದುವುದಿಲ್ಲ (ವಿಭಿನ್ನ ಶ್ವಾಸಕೋಶ, ಕೀ ಆದೇಶ, ಎನ್ಕೋಡಿಂಗ್) ಮತ್ತು ಪ್ರತಿಯೊಂದು ಸಹಿ ಅಮಾನ್ಯವಾಗಿ ಕಾಣುತ್ತದೆ. ಕಚ್ಚಾ ಶರೀರವನ್ನು ಸ್ವೀಕರಿಸಲು ಮಾರ್ಗವನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಿ (Express: express.raw, Flask: request.get_data), ಮೊದಲಿಗೆ ಪರಿಶೀಲಿಸಿ, ನಂತರ ಪಾರ್ಸ್ ಮಾಡಿ.
ವೆಬ್ಹುಕ್ ಹ್ಯಾಂಡ್ಲರ್ ಒಳಗೆ ವಾಸ್ತವ ಕಾರ್ಯವನ್ನು ಮಾಡುವುದು
Webhooks ತೀವ್ರ ಪುನರಾಯಣ ನೀತಿಗಳನ್ನು ಹೊಂದಿವೆ. ನಿಮ್ಮ ಹ್ಯಾಂಡ್ಲರ್ ಕಾರ್ಯವನ್ನು ಒದಗಿಸಲು 30 ಸೆಕೆಂಡುಗಳನ್ನು ತೆಗೆದುಕೊಂಡರೆ, ಕಳುಹಿಸುವವರ ಟೈಮ್ಔಟ್ ಕಾರ್ಯಗತಗೊಳ್ಳುತ್ತದೆ ಮತ್ತು ವೆಬ್ಹುಕ್ ಪುನಃ ಕಳುಹಿಸಲಾಗುತ್ತದೆ - ಈಗ ನೀವು ಒಂದೇ ಪಾವತಿಗೆ ಎರಡು ವಿತರಣೆಯನ್ನು ಹೊಂದಿದ್ದೀರಿ. ಯಾವಾಗಲೂ: ಪರಿಶೀಲಿಸಿ, ಎನ್ಕ್ಯೂ ಮಾಡಿ, 2xx ಅನ್ನು ಹಿಂತಿರುಗಿಸಿ. ವಾಸ್ತವಿಕ ಕೆಲಸವು ಅಗತ್ಯವಿರುವಷ್ಟು ಕಾಲ ತೆಗೆದುಕೊಳ್ಳಬಹುದಾದ ಹಿನ್ನೆಲೆ ಕೆಲಸಗಾರನಲ್ಲಿ ನಡೆಯುತ್ತದೆ.
ವ್ಯವಹಾರ ತತ್ವವನ್ನು ಸಂವಹನ ಮಾಡಲು HTTP ಸ್ಥಿತಿಯನ್ನು ಬಳಸುವುದು
ನಿಮ್ಮ ಹ್ಯಾಂಡ್ಲರ್ ಬಳಕೆದಾರವು ನಿಮ್ಮ ವ್ಯವಸ್ಥೆಯಲ್ಲಿ ಇನ್ನಿಲ್ಲದಾಗ 4xx ಅನ್ನು ಹಿಂತಿರುಗಿಸುತ್ತಿದ್ದರೆ, ಕಳುಹಿಸುವವರು ಅದನ್ನು 'ಅಮಾನ್ಯ ವಿನಂತಿ' ಎಂದು ಪರಿಗಣಿಸುತ್ತಾರೆ ಮತ್ತು ಪುನರಾವೃತ್ತವನ್ನು ನಿಲ್ಲಿಸುತ್ತಾರೆ. ಅದೇ ಪರಿಸ್ಥಿತಿಗೆ 5xx ಅನ್ನು ಹಿಂತಿರುಗಿಸಿದರೆ, ಕಳುಹಿಸುವವರು ಶಾಶ್ವತವಾಗಿ ಪುನರಾವೃತ್ತ ಮಾಡುತ್ತಾರೆ ಮತ್ತು ನಿಮ್ಮ ಕ್ಯೂ ತುಂಬುತ್ತದೆ. ನೀವು ಘಟನೆವನ್ನು ಸುರಕ್ಷಿತವಾಗಿ ಉಳಿಸಿರುವಾಗ (ಅಥವಾ ಅದನ್ನು ನಕಲಿ ಎಂದು ಗುರುತಿಸಿದಾಗ) 200 ಅನ್ನು ಹಿಂತಿರುಗಿಸಿ; ವ್ಯಾಪಾರ ನಿರ್ಧಾರಗಳನ್ನು ವ್ಯಕ್ತಪಡಿಸಲು ಕ್ಯೂ ಲಾಜಿಕ್ ಅನ್ನು ಬಳಸಿರಿ, HTTP ಸ್ಥಿತಿಯನ್ನು ಅಲ್ಲ.
ಘಟನೆ ID ಬದಲಾಗಿ ಪೇಲೋಡ್ ಹ್ಯಾಶ್ನಲ್ಲಿ ಐಡೆಂಪೊಟೆನ್ಸಿ
ಒಂದು ಏಜೆಂಟ್ಗಾಗಿ ಎರಡು ವಿಭಿನ್ನ ಘಟನೆಗಳು (payment.received ಮತ್ತು ನಂತರ payment.sent) ವಿಭಿನ್ನ ಶರೀರಗಳನ್ನು ಹೊಂದಿವೆ ಮತ್ತು ನ್ಯಾಯಸಮ್ಮತವಾಗಿ ಪ್ರತ್ಯೇಕ ಪ್ರಕ್ರಿಯೆಗಳನ್ನು ಅಗತ್ಯವಿದೆ. ನಿಮ್ಮ ಡಿಡ್ಯೂಪ್ ಶರೀರ ಹ್ಯಾಶ್ನಲ್ಲಿ ಇದ್ದರೆ, ನೀವು ಅವುಗಳಲ್ಲಿ ಒಂದನ್ನು ಬಿಟ್ಟುಹೋಗಬಹುದು. X-Blockchain0x-Event-Id (ಪ್ರತಿ ವಿತರಣೆಗೆ ವಿಶಿಷ್ಟ) ಮೇಲೆ ಡಿಡ್ಯೂಪ್ ಮಾಡಿ, ಮತ್ತು ಘಟನೆ ಪ್ರಕಾರ ನಿಮ್ಮ ಹ್ಯಾಂಡ್ಲರ್ ಏನು ಮಾಡುತ್ತದೆ ಎಂಬುದನ್ನು ನಿರ್ಧರಿಸಲು ಬಿಡಿ.
ಬೇರೆ ದೃಢೀಕರಣ ಘಟನೆ ನಿರೀಕ್ಷಿಸುತ್ತಿದೆ
ಕಳುಹಿಸಲಾದ ಘಟನೆಗಳು payment.received, payment.sent, wallet.deployed, ಮತ್ತು webhook.test - ಪ್ರತ್ಯೇಕ ದೃಢೀಕರಣ ಘಟನೆ ಇಲ್ಲ. ವರ್ಗಾವಣೆ ಬ್ಲಾಕ್ನಲ್ಲಿ ಇರುವಾಗ payment.received ಕಾರ್ಯಗತಗೊಳ್ಳುತ್ತದೆ, ಇದು ನಿಮ್ಮ ಬಹಳಷ್ಟು ಕೆಲಸಕ್ಕಾಗಿ ಸಂಕೇತವಾಗಿದೆ. ದುಬಾರಿ ಅಥವಾ ಹಿಂದಿರುಗಿಸಲಾಗದದ್ದಾದರೆ, transactions.get ಅನ್ನು ಪೋಲ್ ಮಾಡಿ ಮತ್ತು ನಿಮ್ಮದೇ ಆದ ದೃಢೀಕರಣ ತಳಹದಿ ಅನ್ನು ಅನ್ವಯಿಸಿ; ಅಸ್ತಿತ್ವದಲ್ಲಿಲ್ಲದ ಘಟನೆಯಿಗಾಗಿ ಕಾಯಬೇಡಿ.
ಒಂದು ಬಾರಿ ವೆಬ್ಹುಕ್ಸ್ ಬಲವಾದವು.
ವೆಬ್ಹುಕ್ಗಳು ಕಠಿಣ ಭಾಗವಾಗಿದೆ. ಮೇಲಿನ ನಾಲ್ಕು ಮಾದರಿಗಳು ಕಾರ್ಯಗತಗೊಳಿಸಿದಾಗ, ಉಳಿದ ಕೆಲಸವು ಬಹಳಷ್ಟು ಕಾರ್ಯಾಚರಣಾತ್ಮಕವಾಗಿದೆ: ವಿಫಲ ಮಾರ್ಗಗಳನ್ನು ವ್ಯಾಯಾಮ ಮಾಡುವ ಪರೀಕ್ಷಾ ಪರಿಸರ, ಮೇಲ್ಮಟ್ಟದ ಏಜೆಂಟ್ ನಿಮ್ಮ ಹ್ಯಾಂಡ್ಲರ್ ಅನ್ನು ಪ್ರವಾಹಗೊಳಿಸುವುದಿಲ್ಲ ಎಂದು ಖರ್ಚು ನಿಯಂತ್ರಣ, ಮತ್ತು ಅಂತಿಮ ಭದ್ರತಾ ಪರಿಶೀಲನೆ.
ನಿಜವಾದ ಹಣವಿಲ್ಲದೆ ಏಜೆಂಟ್ ಪಾವತಿಗಳನ್ನು ಪರೀಕ್ಷಿಸಿ
ಪ್ರಾಂಪ್ಟ್ ಇಂಜೆಕ್ಷನ್ ಅನ್ನು ಸಹನೆ ಮಾಡುವ ಏಜೆಂಟ್ ಖರ್ಚು ನಿಯಂತ್ರಣಗಳನ್ನು ಹೊಂದಿಸಿ
ಜೀವಂತವಾಗುವ ಮೊದಲು ನಿಮ್ಮ ಏಜೆಂಟ್ ವಾಲೆಟ್ ಅನ್ನು ಸುರಕ್ಷಿತಗೊಳಿಸಿ
docs.blockchain0x.com ನಲ್ಲಿ ಸಂಪೂರ್ಣ ಉಲ್ಲೇಖ. ವೆಬ್ಹುಕ್ ಶಬ್ದಕೋಶ: ಪಾವತಿ ಆದೇಶ. ಉತ್ಪನ್ನ ಮೇಲ್ಮಟ್ಟ: ಪಾವತಿ API.