Poskytovateľ Stripe (id stripe) overuje podpisy webhookov natívne — HMAC-SHA256 nad t.payload z hlavičky Stripe-Signature, porovnanie v konštantnom čase a konfigurovateľná tolerancia časovej pečiatky — a REST objekty číta s pripnutou verziou API:
use RoundlyConsulting\Purchases\Providers\Stripe\Stripe;
$stripe = app(Stripe::class);
$event = $stripe->notification($request); // verifies Stripe-Signature, returns StripeEvent
$event->type; // EventType, e.g. EventType::InvoicePaid
$event->object; // array — the event's data.object
$stripe->paymentIntent('pi_123'); // PaymentIntent
$stripe->subscription('sub_123'); // Subscription
$stripe->session('cs_123'); // CheckoutSession
$stripe->invoice('in_123'); // InvoicePodporované udalosti
| Udalosť Stripe | Výsledok | Stav | Suma |
|---|---|---|---|
payment_intent.succeeded | Purchase (pri úhrade faktúry len audit) | Vlastný stav intentu | amount |
payment_intent.payment_failed | Purchase (pri úhrade faktúry len audit) | Failed | amount |
checkout.session.completed | Purchase kľúčovaný podľa PaymentIntent (režim payment; režimy subscription a setup len audit) | Completed pri payment_status paid alebo no_payment_required, inak Pending | amount_total |
invoice.paid | Purchase pri jednorazovej faktúre (faktúry predplatného len audit) | Completed | amount_paid |
invoice.payment_failed | Purchase pri jednorazovej faktúre (faktúry predplatného len audit) | Failed | amount_due |
customer.subscription.created / .updated / .deleted | Subscription | Podľa stavu predplatného | — |
charge.refunded | Refund | Refunded, pri čiastočnej refundácii Completed | amount_refunded |
charge.dispute.created | Refund (chargeback) | Refunded | amount |
charge.dispute.closed | Won: ten istý chargeback sa zvráti a uložený nákup sa obnoví; lost: chargeback zostáva | Completed pri won | amount |
| charge.dispute.updated, otázky, nenamapované udalosti | Informatívne — len audit, nikdy sa neuplatní | — | — |
Stavy predplatného
| Stav predplatného v Stripe | Stav |
|---|---|
| trialing, active | Completed |
| past_due | InGracePeriod |
| incomplete | Pending |
| paused, unpaid | OnHold |
| canceled, incomplete_expired | Canceled |
Platby za predplatné sa neukladajú ako nákupy: Checkout v režime subscription alebo setup a faktúra predplatného sa len zaznamenajú do auditu a stav predplatného určujú jeho vlastné udalosti customer.subscription.*. Tie nesú začiatok a koniec aktuálneho obdobia a koniec skúšobného obdobia; cenu nenesú. Len do auditu sa zaznamená aj PaymentIntent, ktorý uhrádza akúkoľvek faktúru — obnova patrí k svojmu predplatnému a jednorazová faktúra sa už raz uložila z invoice.paid.
Ktorú faktúru PaymentIntent uhrádza
Od verzie API 2025-03-31 (vrátane pripnutej 2026-05-27.dahlia) PaymentIntent už neuvádza, ktorú faktúru uhrádza, preto sa balík pri udalosti payment_intent.* bez poľa invoice opýta Invoice Payments API v Stripe (GET /v1/invoice_payments). Na to potrebuje PURCHASES_STRIPE_SECRET: bez neho sa taká udalosť odmietne (VerificationException, routa vráti 400, takže ju Stripe zopakuje), namiesto hádania — odhad by každú obnovu uložil ako nový jednorazový nákup.
Spory
Spor je chargeback len dovtedy, kým sú peniaze preč: otázka (warning_*) ani charge.dispute.updated nič nezmenia a prehratý spor zostane jediným chargebackom zaznamenaným pri charge.dispute.created (kľúčovaným podľa id sporu). Spor uzavretý ako vyhraný aktualizuje ten istý záznam a obnoví refundovaný nákup, s ktorým bol prepojený (PurchaseCompleted) — vlastné údaje o platbe sa zachovajú a obnoví sa len nákup, ktorý balík uložil: vyhraný spor platby, z ktorej nikdy nevznikol Purchase (napríklad obnovy predplatného), žiadny nevytvorí a nič nespustí.
Callbacky z klienta
Stripe::callback() načíta Checkout Session zo vstupu session_id alebo PaymentIntent zo vstupu payment_intent — praktické na stránke po úspešnom presmerovaní:
// GET /checkout/success?session_id=cs_123
$session = app(Stripe::class)->callback($request); // CheckoutSession (PaymentIntent for ?payment_intent=pi_123)
$session->paymentStatus; // 'paid'
$session->amountTotal; // ?Money
$session->subscription; // ?string — the subscription id, for subscription checkoutsŠpeciálne meny
Sumy sa čítajú v najmenšej jednotke meny Stripe a preškálujú sa tam, kde sa Stripe odchyľuje od ISO 4217 — ISK a UGX prichádzajú s dvoma desatinnými miestami, MGA bez nich (StripeAmount::SCALE_EXCEPTIONS). Float alebo zlomková suma v reťazci sa odmietne, nikdy sa neoreže.
Prejavte lásku k open source
Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.
Ďalšie spôsoby podpory vrátane kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
Chcete to zabudovať do svojho produktu?
Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.