مرجع خطاها

کدهای خطای 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> برمی‌گردد.

برای سازگاری با نسخه‌های قبلی، در همه خطاها <code>status_code</code> برابر -1 و <code>errors</code> برابر true باقی مانده است. فقط در خطای اعتبارسنجی (<code>VALIDATION_ERROR</code>) فیلد <code>errors</code> به‌جای true فهرست خطای هر فیلد را دارد.
{
  "message": "هیچ مشترکی با این شناسه مستعار (alias) در این سرویس وجود ندارد.",
  "status_code": -1,
  "error_code": "ALIAS_NOT_FOUND",
  "data": { "alias": "customer-42" },
  "errors": true
}

خطاهای درخواست، دسترسی و حساب

HTTPerror_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> برمی‌گردد.

HTTPerror_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> می‌آیند. ارسال به تاپیک گزارش جداگانه برای هر مشترک ندارد.

پیش از این، اگر حتی یک شناسه نامعتبر در send-group-message بود، کل درخواست با خطای 422 رد می‌شد. اکنون گیرندگان معتبر پیام را دریافت می‌کنند و هزینه فقط برای همان‌ها کسر می‌شود.
{
  "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": ["فیلد عنوان الزامی است"]
  }
}
Ctrl+I