رویدادهای وبهوک
نسخه پیشانتشار v1، منتشرشده در 2026-09-14. این صفحه به شکل API متعهد است،
نه به تاریخ مشخصی. دقیقاً همان چیزی را میسازیم که اینجا مستند شده است. شکل API تا
2026-10-14 هنوز ممکن است تغییر کند؛ پس از آن، تغییرات از نسخهبندی و پایداری پیروی میکنند.
این بنر با راهاندازی هر مسیر، صفحه به صفحه برداشته میشود. تا وقتی اینجاست، بر اساس قرارداد پیادهسازی کنید و فرض کنید آن مسیر هنوز قابل فراخوانی نیست.
تحویل
به محض اینکه رویداد را ذخیره کردید، 2xx برگردانید و پردازش را بعد از آن انجام دهید. پردازشگر
کُند به timeout میانجامد، و timeout به تلاش دوباره.
تأیید امضا
امضا را روی بایتهای خام و پیش از تجزیه JSON تأیید کنید. سریالسازی دوباره ترتیب کلیدها و
فاصلهها را تغییر میدهد و امضا هرگز مطابقت نخواهد داشت. از compare_digest استفاده کنید، نه ==.
اگر اندپوینت شما احراز هویت خودش را لازم دارد
برخی شرکا نمیتوانند POST بدون احراز هویت بپذیرند. ممکن است درگاه یا WAF یک بانک، پیش از آنکه
درخواست اصلاً به برنامه برسد، توکن bearer یا کلید API بخواهد. امضای ما ثابت میکند محتوای رویداد
از طرف ما آمده است، اما قاعده زیرساخت شما را برآورده نمیکند.
میتوانید مجموعهای از هدرها به ما بدهید تا آنها را عیناً به هر تحویل اضافه کنیم:
یک توکن bearer ساده هم کار میکند. این هم فقط یک هدر Authorization است، مثل هر هدر دیگری.
آدرس وبهوک و این توکن هر دو در پنل شما هستند. فقط آدرس بازگشت (return URL) به دست ما میرسد، چون همین آدرس تعیین میکند مرورگر یک مشتری واقعی در میانه ثبتنام به کجا فرستاده شود.
چیزی که اصالت را ثابت میکند همچنان امضاست. هدرهای شما درخواست را از دروازه خودتان عبور
میدهند؛ X-ParsChat-Signature به شما میگوید بدنه واقعاً از ماست. حتی وقتی احراز هویت خودتان
موفق بود، امضا را تأیید کنید. در غیر این صورت، کسی که توکن شما را به دست آورده میتواند
رویدادهای جعلی برایتان بفرستد.
پشتیبانی نمیشود: mTLS. اگر زیرساخت شما گواهی کلاینت را الزامی میکند، پیش از یکپارچهسازی به ما اطلاع دهید. این کار به جای تغییر تنظیمات، نیازمند پیادهسازی در سمت ما است.
یک گیرنده کامل
X-ParsChat-Delivery در تلاشهای دوباره یک رویداد ثابت میماند. آن را ذخیره کنید و شناسه
تحویلی را که قبلاً پردازش کردهاید نادیده بگیرید. این کار وقتی پاسخ 2xx شما در مسیر گم شود و ما
رویدادی را که پردازش کرده بودید دوباره بفرستیم، رفتار شما را درست نگه میدارد.
یک رویداد آزمایشی برای خودتان بفرستید
پیش از آنکه منتظر ترافیک واقعی بمانید، از ما بخواهید هر وقت خواستید رویدادی برایتان بفرستیم:
این یک تحویل واقعی است، نه شبیهسازی: با secret شما امضا میشود، هدرهای سفارشی شما را دارد، و با همان زمانبندی هر رویداد دیگری دوباره تلاش میشود. بنابراین تأیید امضا و قواعد فایروال شما را میآزماید، نه فقط اینکه نام میزبان شما resolve میشود یا نه.
فیلد data آن "test": true دارد تا پردازشگر شما بتواند آن را کنار بگذارد و از روی آن گفتگو نسازد.
فراخوانی به محض صفشدن رویداد 202 برمیگرداند؛ این ثابت نمیکند اندپوینت شما آن را پذیرفته
است. delivery_id را در گزارش تحویل (پایینتر) جستجو کنید تا ببینید واقعاً چه پاسخی دادهاید.
پاسخ 422 یعنی هنوز هیچ آدرس وبهوکی برای حساب شما تنظیم نشده است. ابتدا آن را در پنل پارسچت
تنظیم کنید.
تلاش دوباره
هر پاسخی غیر از 2xx، از جمله timeout، با فاصلهگذاری فزاینده (backoff) دوباره تلاش میشود:
۶ تلاش در حدود یک ساعت.
پس از آن، تحویل به صف نامههای مرده (dead-letter) میرود و در پنل دیده میشود، تا به جای کشف یک شکاف بیصدا، ببینید چه چیزی شکست خورده است.
تلاش دوباره را تنها تور ایمنی خود ندانید. پس از آخرین تلاش، رویداد بهطور خودکار دوباره فرستاده نمیشود. برای پر کردن شکافها از API مصرف استفاده کنید.
گزارش تحویل
وقتی رویدادی که انتظارش را داشتید هرگز نرسید، این گزارش پاسخ میدهد: آیا واقعاً آن را فرستادید؟
delivery_id همان مقداری است که در بدنه رویداد میرسد، پس میتوانید هر ردیف گزارش را با چیزی که
دریافت کردهاید یا نکردهاید تطبیق دهید.
هنگام اشکالزدایی، last_status_code و last_error جفت مفیدی هستند: یک 502 که
next_attempt_at آن مقدار دارد گذراست و خودبهخود درست میشود، اما شش 500 که به
dead_lettered ختم شده، شکافی است که خودتان باید پر کنید.
تنظیمات خود را بررسی کنید
فقطخواندنی است، پس میتوانید تنظیمات خود را از داخل کد بررسی کنید بیآنکه بتوانید تغییرش دهید. secret هرگز برگردانده نمیشود، فقط اینکه تنظیم شده یا نه.
پوشش رویداد
همه رویدادها شکل بیرونی یکسانی دارند:
schema_version از semver پیروی میکند. فیلدها بدون افزایش نسخه major اضافه میشوند، پس
فیلدهایی را که نمیشناسید نادیده بگیرید. هیچ فیلدی بدون نسخه major جدید و اطلاعرسانی حذف یا
تغییرکاربری نمیشود.
انواع رویداد
message.generating و is_typing دو واقعیت متفاوتاند. اولی یعنی هوش مصنوعی در حال نوشتن است،
دومی یعنی یک اپراتور انسانی در حال تایپ است. شاید بخواهید آنها را متفاوت نمایش دهید.
محتوای کامل همه رویدادها: مرجع رویدادهای وبهوک.
انواع پیام
پیوستها به صورت رویدادهای عادی message با type غیرمتنی میرسند، هرگز به صورت رویداد جداگانه:
text · voice · image · video · multimedia · document · poll · form · template
چهار فیلدی که توضیح لازم دارند
external_id: کلید idempotency شما
اگر پیامی با external_id ای بفرستید که قبلاً استفاده کردهاید، پیام تکراری نمیسازیم.
از آن استفاده کنید تا تلاش دوباره بیخطر باشد.
reply_to_id: پاسخهای رشتهای
message_id پارسچتی پیامی که این پیام به آن پاسخ میدهد، تا بتوانید پیام نقلقولشده را نمایش دهید.
وقتی پیام پاسخ نیست، null است.
markdown_content: قالببندی غنی
وقتی محتوا قالببندی دارد مقدار میگیرد. text همان نسخه ساده باقی میماند، پس میتوانید از هر دو
استفاده کنید: markdown در نمای گفتگوی غنی، و متن ساده در اعلان یا جایگزین پیامکی. هر کدام ممکن است
null باشد، پس هرگز فرض نکنید هر دو وجود دارند.
form_data: پاسخهای ساختاریافته فرم
فهرستی از {type, situation, key, value}، که وقتی type برابر form است وجود دارد.
فرمها فقط مخصوص اینستاگرام نیستند. مشتریای که از طریق ابزارک (ویجت) وصل میشود همین شکل را تولید میکند.