Ana içeriğe geç

Webhooks

Webhook'lar, ödeme olayları gerçekleştiğinde Paylox'un sizin sunucunuza bildirim göndermesidir. Ödeme tamamlandığında, iade yapıldığında veya başarısız olduğunda anında haberdar olursunuz.

Akış

Yönlendirme Parametreleri

Başarılı Ödeme

https://yoursite.com/payment/success?order_id=ORD-xxx&status=success&session_id=ses_xxx
ParametreAçıklama
order_idSipariş numarası
statussuccess
session_idCheckout session ID

Başarısız Ödeme

https://yoursite.com/payment/fail?order_id=ORD-xxx&status=failed&session_id=ses_xxx&message=Yetersiz+bakiye
ParametreAçıklama
order_idSipariş numarası
statusfailed
messageHata mesajı

Doğrulama

Zorunlu

Callback URL'ine gelen parametrelere doğrudan güvenmeyin. Kötü niyetli bir kişi bu URL'i elle oluşturabilir. Mutlaka API'den doğrulayın:

GET /api/v1/payment/status/{order_id}?session_id=ses_xxx

Doğrulama Örnekleri

Node.js (Express)

app.get("/payment/success", async (req, res) => {
const { order_id, session_id } = req.query;

const response = await fetch(
`https://api.jetcheckout.com/api/v1/payment/status/${order_id}?session_id=${session_id}`
);
const data = await response.json();

if (data.success && data.status === "completed") {
await updateOrderStatus(order_id, "paid");
res.render("payment-success", { order_id });
} else {
res.render("payment-error", { message: "Odeme dogrulanamadi" });
}
});

Python (Django)

def payment_success(request):
order_id = request.GET.get("order_id")
session_id = request.GET.get("session_id")

resp = requests.get(
f"https://api.jetcheckout.com/api/v1/payment/status/{order_id}",
params={"session_id": session_id}
)
data = resp.json()

if data.get("success") and data.get("status") == "completed":
Order.objects.filter(ref=order_id).update(status="paid")
return render(request, "payment_success.html")
else:
return render(request, "payment_error.html")

İdempotent İşleme

Aynı callback birden fazla kez gelebilir. Handler'ınız idempotent olmalıdır:

app.get("/payment/success", async (req, res) => {
const { order_id, session_id } = req.query;

const order = await Order.findOne({ ref: order_id });
if (order.status === "paid") {
return res.render("payment-success", { order_id });
}

const data = await verifyPayment(order_id, session_id);
if (data.success && data.status === "completed") {
await Order.updateOne({ ref: order_id }, { status: "paid" });
}

res.render("payment-success", { order_id });
});