- خانه
- 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 است.
فیلدها
| فیلد | تایپ | الزامی | توضیح |
|---|---|---|---|
config | ZarinpalConfig | بله | خصوصی. یک بار در سازنده برای تعیین baseUrl خوانده میشود؛ شناسه پذیرنده در هر درخواست دوباره خوانده میشود. |
baseUrl | string | بله | خصوصی و یکبار استخراجشده: 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 روی یک خاصیت تعریفنشده ظاهر میشود.
نمونه کد
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;
}فیلدها
| فیلد | تایپ | الزامی | توضیح |
|---|---|---|---|
merchantId | string | بله | شناسه پذیرنده زرینپال شما. رشته خالی باعث پرتاب PaymentValidationError از سازنده میشود. |
sandbox | boolean | اختیاری | وقتی true باشد آداپتور از https://sandbox.zarinpal.com/pg استفاده میکند، در غیر این صورت https://payment.zarinpal.com/pg. آتوریتی سندباکس با S و پروداکشن با A شروع میشود. |
logger | PaymentLogger | اختیاری | در کانفیگ پذیرفته میشود اما آداپتور هرگز آن را نمیخواند. رویدادهای چرخه حیات را از لاگری که به سازنده UnoPay دادهاید عبور دهید. |
نمونه کد
const adapter = new ZarinpalAdapter({
merchantId: process.env.ZARINPAL_MERCHANT_ID!,
sandbox: process.env.NODE_ENV !== 'production',
});