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
| Parametre | Açıklama |
|---|---|
order_id | Sipariş numarası |
status | success |
session_id | Checkout 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
| Parametre | Açıklama |
|---|---|
order_id | Sipariş numarası |
status | failed |
message | Hata 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 });
});