کدهای خطای API ارسال پوش؛ معنی هر خطا و حذف توکن نامعتبر
معنی error_code و HTTP status وبسرویسهای ارسال پوشفا را ببینید و بفهمید چه زمانی توکن منقضی یا subscriber_id ناموجود را از پایگاه داده خود حذف کنید.
ساختار پاسخ خطا
همه خطاهای وبسرویسهای ارسال و سایر مسیرهای <code>/api/webservices</code> قالب یکسانی دارند. وضعیت HTTP دسته خطا را نشان میدهد و فیلد <code>error_code</code> علت دقیق را. در کد خود فقط بر اساس HTTP status و <code>error_code</code> تصمیم بگیرید؛ متن <code>message</code> برای نمایش به انسان است و ممکن است تغییر کند. در خطاهای مربوط به مخاطب، شناسه مشکلدار در <code>data</code> برمیگردد.
{
"message": "هیچ مشترکی با این شناسه مستعار (alias) در این سرویس وجود ندارد.",
"status_code": -1,
"error_code": "ALIAS_NOT_FOUND",
"data": { "alias": "customer-42" },
"errors": true
}
خطاهای درخواست، دسترسی و حساب
| HTTP | error_code | علت | اقدام پیشنهادی |
|---|---|---|---|
| 422 | VALIDATION_ERROR | فیلدی ناقص یا نامعتبر است؛ مثلاً title خالی است، subscriber_id قالب UUID ندارد، subscriber_id و fcm_token همزمان ارسال شدهاند یا last_visit عملگر یا تاریخ نامعتبر (مثلاً تاریخ شمسی) دارد. خطای هر فیلد در <code>errors</code> آمده است. | ورودی را اصلاح کنید و دوباره بفرستید. |
| 401 | INVALID_API_KEYS | api_public_key و api_private_key با هیچ سرویسی مطابقت ندارند. | کلیدها را دوباره از پنل همین سرویس کپی کنید؛ تکرار درخواست بدون اصلاح فایدهای ندارد. |
| 403 | ACCOUNT_BLOCKED | حساب کاربری مالک سرویس مسدود است. | با پشتیبانی پوشفا تماس بگیرید. |
| 403 | SERVICE_INACTIVE | سرویس غیرفعال است؛ معمولاً چون دامنهای به آن اختصاص داده نشده است. | در پنل یک دامنه به سرویس اختصاص دهید. |
| 403 | IP_NOT_ALLOWED | IP سرور شما در فهرست IPهای مجاز وبسرویس این سرویس نیست. | IP سرور را در تنظیمات سرویس اضافه کنید یا درخواست را از سرور مجاز بفرستید. |
| 403 | COLLAPSE_ID_DISABLED | قابلیت collapse_id توسط مدیر پوشفا غیرفعال شده است. | collapse_id را از درخواست حذف کنید. |
| 403 | LAST_VISIT_TRACKING_DISABLED | only_last_device یا شرط last_visit ارسال شده، اما ثبت آخرین بازدید برای این سرویس خاموش است. | ثبت آخرین بازدید را در تنظیمات سرویس روشن کنید یا only_last_device و last_visit را نفرستید. |
| 422 | INVALID_SEND_TIME | زمان ارسال زمانبندیشده قابل استفاده نیست. | time را به تاریخ میلادی با قالب Y-m-d H:i و ساعت تهران (Asia/Tehran)، برای زمانی بعد از اکنون بفرستید. زمان گذشته یا همین لحظه پیش از ثبت پیام و کسر اعتبار رد میشود. |
| 402 | INSUFFICIENT_BALANCE | اعتبار کیف پول برای حداکثر هزینه این ارسال کافی نیست. | کیف پول را شارژ کنید و دوباره بفرستید. |
| 429 | RATE_LIMIT_EXCEEDED | تعداد درخواستهای شما در بازه زمانی کوتاه بیش از حد مجاز است. | با فاصله و Backoff دوباره تلاش کنید؛ سرآیند Retry-After زمان انتظار را مشخص میکند. |
| 500 | INTERNAL_ERROR | خطای غیرمنتظره در سرور پوشفا رخ داده است. | کمی بعد دوباره تلاش کنید و اگر تکرار شد به پشتیبانی اطلاع دهید. |
خطاهای مخاطب: Subscriber ID، توکن، Alias و تاپیک
این خطاها یعنی درخواست سالم است اما مقصد قابل ارسال نیست. در ارسال تکی، شناسه مشکلدار و نوع آن (<code>subscriber_id</code> یا <code>fcm_token</code>) در <code>data</code> برمیگردد.
| HTTP | error_code | یعنی چه | با شناسه چه کنید |
|---|---|---|---|
| 404 | SUBSCRIBER_NOT_FOUND | این subscriber_id در این سرویس وجود ندارد: اشتباه است، متعلق به سرویس دیگری است، یا مشترک حذف شده است (حذف از پنل، ادغام پروفایلها یا پاکسازی خودکار پروفایلهای بدون Push). | شناسه را از پایگاه داده خود حذف کنید. اگر کاربر دوباره به سایت یا اپ برگردد، SDK شناسه معتبر او را برمیگرداند. |
| 404 | FCM_TOKEN_NOT_FOUND | این توکن در این سرویس ثبت نیست: اشتباه است، با توکن جدیدتری جایگزین شده (چرخش توکن)، یا پروفایل آن حذف شده است. | توکن را حذف کنید و برای این مخاطب از subscriber_id استفاده کنید که با چرخش توکن تغییر نمیکند. |
| 410 | PUSH_TOKEN_EXPIRED | مشترک وجود دارد، اما Firebase توکن Push او را منقضی یا نامعتبر اعلام کرده است؛ مثلاً کاربر اجازه اعلان را لغو کرده، دادههای مرورگر را پاک کرده یا اپ را حذف کرده است. | اگر fcm_token فرستادهاید آن را حذف کنید. subscriber_id را میتوانید نگه دارید، اما تا فعالشدن دوباره Push به آن ارسال نکنید؛ وضعیت را با وبسرویس subscribers/state بررسی کنید. |
| 422 | PUSH_NOT_SUBSCRIBED | پروفایل مشترک وجود دارد، اما هنوز اجازه دریافت اعلان نداده و توکن Push ندارد. | شناسه را حذف نکنید؛ پس از پذیرش اعلان توسط کاربر قابل ارسال میشود. |
| 404 | ALIAS_NOT_FOUND | هیچ مشترکی در این سرویس با این alias ثبت نشده است. | مقدار alias را بررسی کنید و مطمئن شوید setUserAliasID یا وبسرویس alias/set برای این کاربر اجرا شده است. |
| 404 | CUSTOM_ALIAS_NOT_FOUND | هیچ مشترکی شناسه سفارشی با این label و value ندارد. | label و values را بررسی کنید و مطمئن شوید addAlias یا وبسرویس aliases/add اجرا شده است. |
| 404 | TOPIC_NOT_FOUND | تاپیکی با این UUID در این سرویس وجود ندارد. | UUID تاپیک را از پنل همین سرویس بردارید. |
| 422 | NO_ACTIVE_PUSH_SUBSCRIPTION | مقصد (alias، شناسه سفارشی یا تاپیک) وجود دارد، اما هیچ دستگاه آن عضویت Push فعال ندارد. | مقصد را حذف نکنید؛ بعداً دوباره تلاش کنید یا از کانال دیگری مانند پیامک استفاده کنید. |
| 422 | NO_MATCHING_DEVICE | دستگاه فعال وجود دارد، اما با فیلتر device یا platform درخواست مطابقت ندارد. | فیلتر را تغییر دهید یا حذف کنید. |
| 422 | LAST_VISIT_CONDITION_NOT_MET | مخاطب یا دستگاه فعال وجود دارد، اما روز آخرین بازدیدش با شرط last_visit درخواست نمیخواند یا هنوز بازدیدی از او ثبت نشده است. در خطای کل درخواست، شرط اعمالشده همراه تاریخ محاسبهشده در data.last_visit برمیگردد. | شناسه را حذف نکنید؛ این فقط نتیجه شرط انتخابی شماست. شرط را تغییر دهید یا بدون last_visit بفرستید. |
| 429 | FREQUENCY_CAP_REACHED | همه گیرندگان به سقف Frequency Cap این سرویس رسیدهاند. | پس از پایان بازه سقف دوباره بفرستید یا سقف را در تنظیمات سرویس تغییر دهید. |
| 422 | NO_VALID_RECIPIENTS | در ارسال چندگیرندهای هیچ گیرندهای قابل ارسال نبود و علت رد گیرندهها یکسان نبود. | علت هر شناسه را در <code>data.rejected_recipients</code> ببینید و طبق همین جدول عمل کنید. |
چه زمانی توکن یا شناسه را حذف کنم؟
خلاصه تصمیم برای کدهایی که به خود مخاطب مربوطاند. کدهای خطای درخواست، دسترسی و موجودی هیچوقت دلیل حذف مخاطب نیستند.
| کد | اگر fcm_token فرستادهاید | اگر subscriber_id فرستادهاید |
|---|---|---|
| FCM_TOKEN_NOT_FOUND | حذف کنید؛ برای ارسالهای بعدی subscriber_id را ذخیره کنید. | — |
| SUBSCRIBER_NOT_FOUND | — | حذف کنید. |
| PUSH_TOKEN_EXPIRED | حذف کنید. | نگه دارید، اما تا فعالشدن دوباره Push ارسال نکنید. |
| INVALID_PUSH_TOKEN | حذف کنید. | نگه دارید، اما تا ثبت توکن معتبر جدید ارسال نکنید. |
| PUSH_NOT_SUBSCRIBED | — | نگه دارید؛ پس از پذیرش اعلان قابل ارسال میشود. |
| NO_MATCHING_DEVICE، LAST_VISIT_CONDITION_NOT_MET، FREQUENCY_CAP_REACHED | نگه دارید. | نگه دارید. |
ارسال به چند گیرنده: موفقیت جزئی و rejected_recipients
در send-group-message و send-group-lite-message با <code>subscriber_ids</code> یا <code>fcm_tokens</code>، و در send-via-subscriber-id، هر شناسه جداگانه بررسی میشود. پیام برای شناسههای معتبر در صف ارسال قرار میگیرد، پاسخ HTTP 200 است و شناسههای ردشده همراه با <code>error_code</code> هر کدام در <code>data.rejected_recipients</code> برمیگردند. فیلد <code>data.recipients</code> نشان میدهد برای هر شناسه کدام <code>notification_id</code> ساخته شده است. اگر هیچ شناسهای قابل ارسال نباشد درخواست رد میشود: وقتی همه شناسهها به یک علت رد شده باشند همان کد و HTTP status برمیگردد (مثلاً 404 با <code>SUBSCRIBER_NOT_FOUND</code>) و در غیر این صورت <code>NO_VALID_RECIPIENTS</code>. در send-via-alias هم مقدارهایی از <code>values</code> که مشترکی ندارند یا مشترک فعال ندارند با نوع <code>alias_value</code> در <code>rejected_recipients</code> گزارش میشوند. اگر شرط اختیاری <code>last_visit</code> را بفرستید، این شرط هم برای هر شناسه یا مقدار جداگانه بررسی میشود و موارد فاقد شرط با کد <code>LAST_VISIT_CONDITION_NOT_MET</code> در <code>rejected_recipients</code> میآیند. ارسال به تاپیک گزارش جداگانه برای هر مشترک ندارد.
{
"message": "notification queued for send successfully",
"status_code": 1,
"data": {
"notification_ids": ["9b2e0c0e-5c1f-4a39-9d55-0d6c1e2f7a10"],
"recipients": [
{
"recipient": "f1444a41-b3af-4e30-8655-9a70de1e0915",
"type": "subscriber_id",
"notification_id": "9b2e0c0e-5c1f-4a39-9d55-0d6c1e2f7a10"
}
],
"rejected_recipients": [
{
"recipient": "0c7d9f2a-6a1e-4b6e-9c3a-2f5e8d7a6b10",
"type": "subscriber_id",
"error_code": "SUBSCRIBER_NOT_FOUND"
},
{
"recipient": "3e8a1b6c-7d2f-4d7f-8a9b-1c2d3e4f5a60",
"type": "subscriber_id",
"error_code": "PUSH_TOKEN_EXPIRED"
}
]
},
"errors": false
}
ناموفقشدن پس از پذیرش (failure_code)
پاسخ 200 یعنی پیام در صف ارسال قرار گرفته است، نه اینکه حتماً تحویل شده باشد. اگر Firebase بعداً ارسال را رد کند، وضعیت اعلان در check-notification-status و در وبهوک تحویل به <code>failed</code> تغییر میکند و فیلد <code>failure_code</code> علت را مشخص میکند. توکنی که Firebase منقضی اعلام کند در پوشفا غیرفعال میشود و ارسال بعدی به همان مخاطب از همان ابتدا خطای <code>PUSH_TOKEN_EXPIRED</code> میگیرد.
| failure_code | علت | اقدام پیشنهادی |
|---|---|---|
| PUSH_TOKEN_EXPIRED | Firebase توکن را ثبتنشده یا منقضی اعلام کرده است. | fcm_token را حذف کنید؛ subscriber_id را نگه دارید اما تا فعالشدن دوباره Push ارسال نکنید. |
| INVALID_PUSH_TOKEN | Firebase قالب توکن را نامعتبر میداند. | fcm_token را حذف کنید. |
| FIREBASE_AUTH_ERROR | اعتبارنامه Firebase سرویس معتبر نیست یا توکن متعلق به پروژه Firebase دیگری است. | تنظیمات Firebase و Service Account سرویس را بررسی کنید؛ توکن را حذف نکنید. |
| MESSAGE_REJECTED | Firebase محتوای پیام را نپذیرفته است؛ مثلاً حجم یا قالب داده نامعتبر است. | محتوا و additional_data را کوتاهتر یا اصلاح کنید. |
| INSUFFICIENT_BALANCE | در لحظه ارسال (مثلاً در ارسال زمانبندیشده) اعتبار کیف پول کافی نبوده است. | کیف پول را شارژ کنید و دوباره بفرستید. |
| SEND_FAILED | سایر خطاهای ارسال، از جمله خطای موقت Firebase که پس از تلاش مجدد هم برطرف نشده است. | دوباره ارسال کنید؛ توکن را حذف نکنید. |
نمونه خطای اعتبارسنجی
در <code>VALIDATION_ERROR</code> فیلد <code>errors</code> برای هر فیلد نامعتبر فهرست پیامها را دارد.
{
"message": "فیلد عنوان الزامی است",
"status_code": -1,
"error_code": "VALIDATION_ERROR",
"data": [],
"errors": {
"title": ["فیلد عنوان الزامی است"]
}
}