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ə):

json
{
  "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.

Stripe hadisəni imza ilə çatdırır: birinci cəhd uğursuz olur, Stripe təkrar edir, ikincisi yoxlamadan, təkrarların silinməsindən və saxlanmadan keçir
Stripe hadisəni imza ilə çatdırır: birinci cəhd uğursuz olur, Stripe təkrar edir, ikincisi yoxlamadan, təkrarların silinməsindən və saxlanmadan keçir

Hansı hadisələr lazımdır

HadisəNə vaxt gəlirMağaza nə edir
checkout.session.completedmüştəri Checkout-u tamamladıpayment_status paid-dirsə, sifariş PAID olur
checkout.session.async_payment_succeededgecikməli ödəniş üsulu nəhayət ödənildisifariş PAID olur
checkout.session.async_payment_failedgecikməli ödəniş keçmədimüştəriyə bildirmək
checkout.session.expiredsessiya ödənişsiz başa çatdısifarişi azad etmək (istəyə görə)
payment_intent.succeededPaymentIntent ö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.

Express-də qəbuledici: xam gövdə və imza