---
title: "Stripe — Purchases for Laravel | Roundly"
description: "Overujte podpisy webhookov Stripe natívne, mapujte udalosti platieb, predplatného, faktúr a sporov a čítajte REST objekty."
url: https://roundly-consulting.com/sk/open-source/navody/purchases-for-laravel/stripe
language: sk
---

[Všetky balíky](https://roundly-consulting.com/sk/open-source.md)

[Purchases for Laravel](https://roundly-consulting.com/sk/open-source/navody/purchases-for-laravel.md)

# Stripe

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:

```php
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');                 // Invoice
```

## Podporované 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, kľúčovaný podľa faktúry, s PaymentIntent, ktorý ju uhradil, ako transaction\_id (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.

## Jednorazové faktúry a ich refundácie

Jednorazová faktúra uložená z invoice.paid je kľúčovaná podľa faktúry (in\_…) a ako transaction\_id nesie PaymentIntent, ktorý ju uhradil — preto sa s ňou prepoja jej udalosti charge.refunded a charge.dispute.\*, ktoré uvádzajú PaymentIntent, a prepnú ju na Refunded. PaymentIntent sa vezme zo staršieho poľa payment\_intent faktúry, ak ho má (null — faktúra zaplatená mimo Stripe — ponechá identifikátor faktúry), inak z GET /v1/invoice\_payments?invoice=…&status=paid (API od 2025-03-31, pri viacerých platbách vyhrá tá s is\_default), na čo je tiež potrebný PURCHASES\_STRIPE\_SECRET. Obe vyhľadania v Invoice Payments API prebehnú počas overenia webhooku, aj so zapnutou frontou: chybová odpoveď Stripe alebo nedostupný Stripe ukončí požiadavku chybou 500, takže Stripe udalosť doručí znova. Ich identifikátory pochádzajú z podpísanej udalosti, nikdy od klienta.

## 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 — ten má prednosť, keď prídu oba — alebo PaymentIntent zo vstupu payment\_intent; praktické na stránke po úspešnom presmerovaní. Webhook routa prijíma len podpísané udalosti, preto ho volajte z vlastnej routy:

```php
// 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
```

Chybný identifikátor odmietne ešte pred volaním Stripe a ten, ktorý posiela, zakóduje do cesty. Identifikátor, ktorý Stripe odmietne s 4xx, je VerificationException, kým odmietnutý kľúč, limit požiadaviek či výpadok zostanú RequestException — pozrite Callbacky z klienta.

## Š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 kryptomien](https://roundly-consulting.com/sk/podporte-nas.md)

Odoslaním daru súhlasíte s našimi [podmienkami prijímania darov](https://roundly-consulting.com/sk/podmienky-darov.md).

[Podporte našu open-source prácu (otvorí sa v novej karte)](https://donate.stripe.com/dRmeVe8FX5PF1Qd9pXcEw00) [Pridajte sa k nám na Patreone (otvorí sa v novej karte)](https://www.patreon.com/cw/roundly)

## 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.

[Ponuka do 48 hodín](https://roundly-consulting.com/sk/kontakt.md) [Prezrieť všetky balíky](https://roundly-consulting.com/sk/open-source/navody/purchases-for-laravel.md)
