UnoPayv1.0.0
  1. خانه
  2. کلاس‌های خطا

مرجع API

کلاس‌های خطا

پنج کلاس، چهار کد، یک ریشه. PaymentError ریشه است؛ بقیه مقدار code خود را ثابت تعیین می‌کنند.

classPaymentError

کلاس پایه تمام خطاهایی که SDK تولید می‌کند. برای گرفتن هر چیزی که UnoPay پرتاب می‌کند این را بگیرید.

export class PaymentError extends Error {
  public code: string;
  public cause?: unknown;
  constructor(message: string, code: string, cause?: unknown);
}

فیلدها

فیلدتایپالزامیتوضیح
codestringبلهیک رشته پایدار و قابل‌پردازش ماشینی. زیرکلاس‌ها مقدار خود را ثابت تعیین می‌کنند؛ کلاس پایه مستقیماً ADAPTER_NOT_FOUND هم پرتاب می‌کند.
causeunknownاختیاریخطای زیربنایی یا داده خام درگاه. GatewayProviderError متن پاسخ را اینجا نگه می‌دارد؛ GatewayNetworkError خطای fetch را.
namestringبلهدر سازنده روی this.constructor.name تنظیم می‌شود، بنابراین instanceof پس از وراثت هم کار می‌کند.

خطاها

  • PaymentError — به‌طور مستقیم با کد ADAPTER_NOT_FOUND، وقتی کلید درگاه در آبجکت adapters پاس‌داده‌شده به سازنده وجود ندارد.

نمونه کد

PaymentError.tsts
try {
  await unopay.createPayment('zarinpal', request);
} catch (err) {
  if (err instanceof PaymentError) {
    console.error(err.code, err.message, err.cause);
  }
}
classPaymentValidationError

SDK ورودی را پیش از تماس با درگاه یا به‌جای آن رد کرده است.

export class PaymentValidationError extends PaymentError {
  constructor(message: string, cause?: unknown);
}

فیلدها

فیلدتایپالزامیتوضیح
code'VALIDATION_ERROR'بلههمیشه دقیقاً همین رشته.

خطاها

  • ZarinpalAdapter constructor — وقتی config.merchantId خالی یا falsy باشد.
  • ZarinpalAdapter.verifyCallback — وقتی Authority هم در query و هم در body نباشد، یا وقتی amount غایب یا NaN باشد. هر دو بررسی پیش از فراخوانی شبکه انجام می‌شوند.
نکته

README پکیج می‌گوید این خطا شامل amount <= 0 است. چنین نیست. در هیچ‌جای سورس اعتبارسنجی amount در createPayment وجود ندارد؛ مبلغ صفر یا منفی به درگاه می‌رسد و به‌صورت GatewayProviderError برمی‌گردد.

نمونه کد

PaymentValidationError.tsts
try {
  new ZarinpalAdapter({ merchantId: '' });
} catch (err) {
  if (err instanceof PaymentValidationError) {
    // err.code === 'VALIDATION_ERROR'
  }
}
classGatewayNetworkError

درخواست هرگز پاسخ HTTP تولید نکرد: خطای DNS، قطع اتصال، یا خاتمه پس از ۱۰ ثانیه.

export class GatewayNetworkError extends PaymentError {
  constructor(message: string, cause?: unknown);
}

فیلدها

فیلدتایپالزامیتوضیح
code'NETWORK_ERROR'بلههمیشه دقیقاً همین رشته.

خطاها

  • src/http.ts — هر رد شدن fetch و هر AbortError که کنترلر زمان‌بندی تولید کند. GatewayProviderError عمداً بدون تغییر دوباره پرتاب می‌شود تا به‌اشتباه خطای شبکه برچسب نخورد.
نکته

زمان‌بندی در src/http.ts روی ۱۰۰۰۰ میلی‌ثانیه ثابت است و از بیرون قابل تنظیم نیست: مقدار HttpOptions.timeoutMs در ماژولی قرار دارد که src/index.ts هرگز آن را دوباره صادر نمی‌کند.

نکته

SDK هیچ تلاش مجددی انجام نمی‌دهد. یک خطای شبکه یعنی یک فراخوانی ناموفق و مسئولیت تلاش مجدد بر عهده کد شماست.

نمونه کد

GatewayNetworkError.tsts
try {
  await unopay.createPayment('zarinpal', request);
} catch (err) {
  if (err instanceof GatewayNetworkError) {
    await retryWithBackoff(() => unopay.createPayment('zarinpal', request));
  }
}
classInvalidSignatureError

برای آداپتورهایی که امضای درگاه را اعتبارسنجی می‌کنند رزرو شده است. صادر شده و آماده است، اما در کد نسخه ۱٫۰٫۰ هرگز پرتاب نمی‌شود.

export class InvalidSignatureError extends PaymentError {
  constructor(message: string, cause?: unknown);
}

فیلدها

فیلدتایپالزامیتوضیح
code'INVALID_SIGNATURE'بلههمیشه دقیقاً همین رشته.
نکته

امروز هیچ‌چیز در src این کلاس را پرتاب نمی‌کند. زرین‌پال به‌جای امضا با استعلام آتوریتی احراز هویت می‌کند، پس آداپتور آن هرگز به این خطا نمی‌رسد. اگر آداپتور خودتان را می‌نویسید باز هم آن را بگیرید — دقیقاً برای همین است.

نکته

از آن برای اعلام مبلغ ردشده یا آتوریتی ناهماهنگ استفاده نکنید. آن‌ها به‌ترتیب ValidationError و isSuccessful برابر false هستند.

نمونه کد

InvalidSignatureError.tsts
// In your own adapter:
if (!isValidSignature(raw, req.secret)) {
  throw new InvalidSignatureError('Callback signature mismatch');
}
classGatewayProviderError

درگاه پاسخ داد و پاسخ موفق نبود. این رایج‌ترین خطایی است که مدیریت می‌کنید.

export class GatewayProviderError extends PaymentError {
  constructor(message: string, cause?: unknown);
}

فیلدها

فیلدتایپالزامیتوضیح
code'PROVIDER_ERROR'بلههمیشه دقیقاً همین رشته.
causeunknownاختیاریداده خام درگاه. در پاسخ غیر ۲xx این متن بدنه پاسخ است؛ در رد تجاری، JSON پارس‌شده.

خطاها

  • UnoPay.createPayment — هر خطای غیر PaymentError که آداپتور پرتاب کند را در خود می‌پیچد. نمونه‌هایی که خودشان PaymentError هستند بدون تغییر عبور می‌کنند.
  • UnoPay.verifyCallback — همان قاعده پیچیدن که در createPayment وجود دارد.
  • ZarinpalAdapter.createPayment — وقتی کد پاسخ request.json برابر ۱۰۰ نباشد. پیام متن درگاه را حمل می‌کند و cause کل پاسخ را.
  • src/http.ts — در هر وضعیت HTTP غیر ۲xx، که cause برابر متن پاسخ تنظیم می‌شود.
نکته

پرداخت ردشده در زمان وریفای این خطا نیست. متد verifyCallback مقدار isSuccessful برابر false همراه errorReason برمی‌گرداند. گرفتن این خطا را برای خطاهای انتقال و تجاری نگه دارید.

نمونه کد

GatewayProviderError.tsts
try {
  await unopay.createPayment('zarinpal', request);
} catch (err) {
  if (err instanceof GatewayProviderError) {
    console.error('Gateway rejected:', err.message, err.cause);
  }
}