UnoPayv1.0.0
  1. خانه
  2. وریفای کال‌بک

مفاهیم پایه

وریفای کال‌بک

UnoPay نمی‌داند فریم‌ورک چیست. سه فیلد می‌خواهد: متد HTTP، پارامترهای کوئری و بدنه پارس‌شده. تخت کردن با شماست؛ وریفای با آن.

زرین‌پال GET می‌فرستد

کال‌بک یک GET با Authority و Status در کوئری‌استرینگ است، پس در همه تب‌های پایین body برابر {} است. بیشتر PSPهای بانکی به‌جای آن فرم POST می‌فرستند؛ برای آن‌ها فرم را پارس کنید و نتیجه را به‌عنوان body بدهید.

callback.ts ts
app.get('/api/payment/callback', async (req, res) => {
  const result = await unopay.verifyCallback('zarinpal', {
    method: req.method,
    query: req.query as Record<string, string>,
    body: {},
  });

  return res
    .status(result.isSuccessful ? 200 : 400)
    .send(result.isSuccessful ? 'Paid ' + result.transactionId : result.errorReason);
});

برای درگاه‌هایی که فرم POST می‌فرستند

بیشتر PSPهای بانکی در ماتریس — به‌پرداخت ملت، سامان کیش، سداد، پارسیان و بقیه — با فرم HTML POST کال‌بک می‌زنند. UnoPay مقادیر پارس‌شده را می‌خواهد، پس خودتان تبدیل کنید.

form-callback.ts ts
// Native Web Request, form POST callback (Behpardakht shape).
const form = await request.formData();
const body: Record<string, string> = {};
for (const [k, v] of form.entries()) body[k] = String(v);

const result = await unopay.verifyCallback('mellat', {
  method: request.method,          // 'POST'
  query: Object.fromEntries(new URL(request.url).searchParams.entries()),
  body,                            // RefId, ResCode, SaleOrderId, SaleReferenceId
});

method وقتی مهم می‌شود که آداپتور خودتان را بنویسید. آداپتور داخلی زرین‌پال آن را نادیده می‌گیرد چون زرین‌پال همیشه با GET کال‌بک می‌زند.

تخت کردن کد شماست، پس مراقبش باشید

فریم‌ورکی که برای بدنه غایب به شما undefined بدهد، CallbackRequest را برآورده نمی‌کند. {} بدهید و کوئری را cast کنید — بیشتر فریم‌ورک‌ها آن را شل‌تر از چیزی که اینترفیس می‌خواهد تایپ می‌کنند.