- خانه
- کلاسهای خطا
مرجع API
کلاسهای خطا
پنج کلاس، چهار کد، یک ریشه. PaymentError ریشه است؛ بقیه مقدار code خود را ثابت تعیین میکنند.
classPaymentError
کلاس پایه تمام خطاهایی که SDK تولید میکند. برای گرفتن هر چیزی که UnoPay پرتاب میکند این را بگیرید.
export class PaymentError extends Error {
public code: string;
public cause?: unknown;
constructor(message: string, code: string, cause?: unknown);
}فیلدها
| فیلد | تایپ | الزامی | توضیح |
|---|---|---|---|
code | string | بله | یک رشته پایدار و قابلپردازش ماشینی. زیرکلاسها مقدار خود را ثابت تعیین میکنند؛ کلاس پایه مستقیماً ADAPTER_NOT_FOUND هم پرتاب میکند. |
cause | unknown | اختیاری | خطای زیربنایی یا داده خام درگاه. GatewayProviderError متن پاسخ را اینجا نگه میدارد؛ GatewayNetworkError خطای fetch را. |
name | string | بله | در سازنده روی this.constructor.name تنظیم میشود، بنابراین instanceof پس از وراثت هم کار میکند. |
خطاها
PaymentError— بهطور مستقیم با کد ADAPTER_NOT_FOUND، وقتی کلید درگاه در آبجکت adapters پاسدادهشده به سازنده وجود ندارد.
نمونه کد
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 برمیگردد.
نمونه کد
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 هیچ تلاش مجددی انجام نمیدهد. یک خطای شبکه یعنی یک فراخوانی ناموفق و مسئولیت تلاش مجدد بر عهده کد شماست.
نمونه کد
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 هستند.
نمونه کد
// 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' | بله | همیشه دقیقاً همین رشته. |
cause | unknown | اختیاری | داده خام درگاه. در پاسخ غیر ۲xx این متن بدنه پاسخ است؛ در رد تجاری، JSON پارسشده. |
خطاها
UnoPay.createPayment— هر خطای غیر PaymentError که آداپتور پرتاب کند را در خود میپیچد. نمونههایی که خودشان PaymentError هستند بدون تغییر عبور میکنند.UnoPay.verifyCallback— همان قاعده پیچیدن که در createPayment وجود دارد.ZarinpalAdapter.createPayment— وقتی کد پاسخ request.json برابر ۱۰۰ نباشد. پیام متن درگاه را حمل میکند و cause کل پاسخ را.src/http.ts— در هر وضعیت HTTP غیر ۲xx، که cause برابر متن پاسخ تنظیم میشود.
پرداخت ردشده در زمان وریفای این خطا نیست. متد verifyCallback مقدار isSuccessful برابر false همراه errorReason برمیگرداند. گرفتن این خطا را برای خطاهای انتقال و تجاری نگه دارید.
نمونه کد
try {
await unopay.createPayment('zarinpal', request);
} catch (err) {
if (err instanceof GatewayProviderError) {
console.error('Gateway rejected:', err.message, err.cause);
}
}