- خانه
- وریفای کالبک
مفاهیم پایه
وریفای کالبک
UnoPay نمیداند فریمورک چیست. سه فیلد میخواهد: متد HTTP، پارامترهای کوئری و بدنه پارسشده. تخت کردن با شماست؛ وریفای با آن.
کالبک یک GET با Authority و Status در کوئریاسترینگ است، پس در همه تبهای پایین body برابر {} است. بیشتر PSPهای بانکی بهجای آن فرم POST میفرستند؛ برای آنها فرم را پارس کنید و نتیجه را بهعنوان body بدهید.
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);
});
fastify.get('/api/payment/callback', async (request, reply) => {
const result = await unopay.verifyCallback('zarinpal', {
method: request.method,
query: request.query as Record<string, string>,
body: {},
});
return reply
.code(result.isSuccessful ? 200 : 400)
.send({ ok: result.isSuccessful, ref: result.transactionId, reason: result.errorReason });
});
import type { NextRequest } from 'next/server';
export async function GET(req: NextRequest) {
const url = new URL(req.url);
const query = Object.fromEntries(url.searchParams.entries());
const result = await unopay.verifyCallback('zarinpal', {
method: 'GET',
query,
body: {},
});
return Response.json(
{ ok: result.isSuccessful, ref: result.transactionId },
{ status: result.isSuccessful ? 200 : 400 },
);
}
app.get('/api/payment/callback', async (c) => {
const query = Object.fromEntries(new URL(c.req.url).searchParams.entries());
const result = await unopay.verifyCallback('zarinpal', {
method: c.req.method,
query,
body: {},
});
return c.json(
{ ok: result.isSuccessful, ref: result.transactionId },
result.isSuccessful ? 200 : 400,
);
});
export default {
async fetch(request: Request): Promise<Response> {
const url = new URL(request.url);
const query = Object.fromEntries(url.searchParams.entries());
const result = await unopay.verifyCallback('zarinpal', {
method: request.method,
query,
body: {},
});
return new Response(result.isSuccessful ? 'ok' : String(result.errorReason), {
status: result.isSuccessful ? 200 : 400,
headers: { 'content-type': 'text/plain; charset=utf-8' },
});
},
};
برای درگاههایی که فرم POST میفرستند
بیشتر PSPهای بانکی در ماتریس — بهپرداخت ملت، سامان کیش، سداد، پارسیان و بقیه — با فرم HTML POST کالبک میزنند. UnoPay مقادیر پارسشده را میخواهد، پس خودتان تبدیل کنید.
// 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 کنید — بیشتر فریمورکها آن را شلتر از چیزی که اینترفیس میخواهد تایپ میکنند.