UnoPayv1.0.0
  1. خانه
  2. ZarinpalAdapter

مرجع API

ZarinpalAdapter

REST API نسخه ۴ زرین‌پال، هر دو اندپوینت، و انتخاب سندباکس در سازنده. این همچنین پیاده‌سازی مرجع برای شکل یک آداپتور خوب است.

classZarinpalAdapter

تنها درگاه کاملاً پیاده‌سازی‌شده که با REST API نسخه ۴ زرین‌پال صحبت می‌کند. هم‌زمان مرجعی برای شکل درست یک آداپتور است.

export class ZarinpalAdapter implements GatewayAdapter {
  constructor(config: ZarinpalConfig);
  createPayment(request: PaymentRequest): Promise<PaymentResult>;
  verifyCallback(request: CallbackRequest): Promise<VerificationResult>;
}

اندپوینت‌ها

  • POST {baseUrl}/v4/payment/request.json — متد createPayment. بدنه شامل merchant_id، amount که از قبل به ریال است، description، callback_url و کل آبجکت metadata است.
  • POST {baseUrl}/v4/payment/verify.json — متد verifyCallback. بدنه شامل merchant_id، amount تبدیل‌شده با toRials و authority است.

فیلدها

فیلدتایپالزامیتوضیح
configZarinpalConfigبلهخصوصی. یک بار در سازنده برای تعیین baseUrl خوانده می‌شود؛ شناسه پذیرنده در هر درخواست دوباره خوانده می‌شود.
baseUrlstringبلهخصوصی و یک‌بار استخراج‌شده: sandbox.zarinpal.com/pg یا payment.zarinpal.com/pg.

خطاها

  • PaymentValidationError — از سازنده وقتی merchantId فalsy باشد، و از verifyCallback وقتی Authority یا مبلغ عددی غایب باشد.
  • GatewayProviderError — از createPayment وقتی کد پاسخ درخواست ۱۰۰ نباشد. کل پاسخ به‌عنوان cause پیوست می‌شود.
  • GatewayNetworkError — از کمکی تابع request هنگام رد شدن fetch یا خاتمه ۱۰ ثانیه‌ای.
نکته

موفقیت در وریفای کد ۱۰۰ یا ۱۰۱ است. زرین‌پال وقتی همان آتوریتی دوباره وریفای شود کد ۱۰۱ می‌دهد، پس موفق دانستن آن باعث idempotent شدن کال‌بک تکراری می‌شود نه یک هشدار کاذب.

نکته

در وریفای مبلغ با toRials و بر اساس واحدی که از خود کال‌بک گرفته می‌شود تبدیل می‌شود. زرین‌پال واحدی نمی‌فرستد، پس پیش‌فرض IRR اعمال می‌شود. همان واحدی را بفرستید که در زمان create استفاده کردید وگرنه وریفای روی بررسی مبلغ شکست می‌خورد.

نکته

در زمان ساخت، هر دو فیلد transactionId و providerToken مقدار آتوریتی را حمل می‌کنند، و در زمان وریفای transactionId مقدار ref_id را. یک نام فیلد، دو معنای متفاوت در چرخه حیات.

نکته

بدنه پاسخ با request<any> پارس می‌شود، پس هیچ شکلی از پاسخ بررسی نمی‌شود. تغییر پاسخ زرین‌پال به‌جای خطای تایپ‌شده، به‌صورت TypeError روی یک خاصیت تعریف‌نشده ظاهر می‌شود.

نمونه کد

ZarinpalAdapter.tsts
import { UnoPay, ZarinpalAdapter } from 'unopay';

const unopay = new UnoPay({
  zarinpal: new ZarinpalAdapter({
    merchantId: process.env.ZARINPAL_MERCHANT_ID!,
    sandbox: true,
  }),
});

const payment = await unopay.createPayment('zarinpal', {
  amount: 50000,
  currency: 'IRT',
  callbackUrl: 'https://yoursite.com/api/payment/callback',
  metadata: { description: 'Order #1024' },
});

return Response.redirect(payment.redirectUrl, 302);
interfaceZarinpalConfig

پیکربندی ZarinpalAdapter. سه فیلد، که تنها یکی از آن‌ها الزامی است.

export interface ZarinpalConfig {
  merchantId: string;
  sandbox?: boolean;
  logger?: PaymentLogger;
}

فیلدها

فیلدتایپالزامیتوضیح
merchantIdstringبلهشناسه پذیرنده زرین‌پال شما. رشته خالی باعث پرتاب PaymentValidationError از سازنده می‌شود.
sandboxbooleanاختیاریوقتی true باشد آداپتور از https://sandbox.zarinpal.com/pg استفاده می‌کند، در غیر این صورت https://payment.zarinpal.com/pg. آتوریتی سندباکس با S و پروداکشن با A شروع می‌شود.
loggerPaymentLoggerاختیاریدر کانفیگ پذیرفته می‌شود اما آداپتور هرگز آن را نمی‌خواند. رویدادهای چرخه حیات را از لاگری که به سازنده UnoPay داده‌اید عبور دهید.

نمونه کد

ZarinpalConfig.tsts
const adapter = new ZarinpalAdapter({
  merchantId: process.env.ZARINPAL_MERCHANT_ID!,
  sandbox: process.env.NODE_ENV !== 'production',
});