Leyla sifarişi ödəyib dərhal vərəqi bağladı: «Təşəkkürlər» səhifəsi heç açılmadı. Serveriniz pulun çatdığını necə biləcək? Brauzerdən yox, Stripe-dan: Stripe özü serverinizə sorğu göndərir — webhook. Bu dərsdə Express-də webhook qəbuledicisi quracağıq: heç kimin «ödənişi» saxtalaşdıra bilməməsi üçün imzanı yoxlayacağıq, sifarişi RabbitMQ üçün hadisə ilə birlikdə bir tranzaksiyada PAID edəcəyik, təkrarlara və hadisələrin qarışıq sırasına dözəcəyik və hər şeyi öz kompüterimizdə Stripe CLI ilə yoxlamağı öyrənəcəyik.
Webhook-lar niyə lazımdır
Ödənişdə çox şey sizin sorğunuzdan kənarda baş verir: müştəri 3-D Secure kodunu daxil edir, bank ödənişi sonra təsdiqləyir, siz Dashboard-dan pulu qaytarırsınız, müştəri ödənişə etiraz edir. Stripe-dan hər saniyə «bəs, ödəndi?» soruşmaq israfçılıqdır. Webhook əksinədir: nəsə baş verəndə Stripe özü sizin ünvana hadisənin (event) təsviri ilə HTTP POST sorğusu göndərir. Bənzətmə: bankdan «hesabınıza köçürmə daxil oldu» SMS-i göndərənin «mən ödədim» sözündən etibarlıdır.
Hadisə belə görünür (qısaldılmış şəkildə):
{
"id": "evt_1Rk4ZtAb",
"object": "event",
"type": "checkout.session.completed",
"created": 1789000000,
"livemode": false,
"data": {
"object": {
"id": "cs_test_a1B2c3",
"object": "checkout.session",
"payment_status": "paid",
"amount_total": 5000,
"currency": "azn",
"client_reference_id": "42"
}
}
}id unikaldır (təkrarları onunla ayırd edirlər), type nə baş verdiyini bildirir, data.object-də isə obyektin özü durur — burada Checkout Session.
Hansı hadisələr lazımdır
| Hadisə | Nə vaxt gəlir | Mağaza nə edir |
|---|---|---|
checkout.session.completed | müştəri Checkout-u tamamladı | payment_status paid-dirsə, sifariş PAID olur |
checkout.session.async_payment_succeeded | gecikməli ödəniş üsulu nəhayət ödənildi | sifariş PAID olur |
checkout.session.async_payment_failed | gecikməli ödəniş keçmədi | müştəriyə bildirmək |
checkout.session.expired | sessiya ödənişsiz başa çatdı | sifarişi azad etmək (istəyə görə) |
payment_intent.succeeded | PaymentIntent ödənildi (041-ci dərs) | öz ödəniş formanız olanda sifariş PAID |
Checkout üçün sessiya hadisələrini götürürük: onlarda sizin client_reference_id və metadata gəlir. payment_intent.succeeded-də isə payment_intent_data.metadata ötürməyincə sessiyanın metadata-sı olmur. Yalnız lazım olan hadisələrə abunə olun: Stripe hər şeyi dinləməyi məsləhət görmür.