Refundácie a chargebacky
Notifikácie o refundácii a spore z každého obchodu sa dekódujú do výsledku ResultType::Refund a ukladajú sa ako plnohodnotný PurchaseRefund:
| Obchod | Notifikácia | Uloží sa ako |
|---|---|---|
| Apple | REFUND, REVOKE | Jedna refundácia na každú refundovanú transakciu (kľúčovaná podľa jej transactionId) — refundácia aktuálneho obdobia predplatného prepne aj Subscription na Refunded |
| RTDN o zrušení predplatného, notifikácia o stornovanom nákupe | Refundácia — zrušené predplatné alebo storno jeho poslednej objednávky ho prepne na Refunded; čiastočné storno podľa množstva ponechá nákup v stave Completed | |
| Stripe | charge.refunded | Jedna refundácia na platbu (kľúčovaná podľa PaymentIntent), ktorej cena je priebežne vrátený súčet — nie úplne refundovaná platba ponechá nákup v stave Completed |
| Stripe | charge.dispute.created | Chargeback kľúčovaný podľa id sporu |
| Stripe | charge.dispute.closed s výsledkom won | Ten istý záznam chargebacku sa zvráti a prepojený nákup sa obnoví (PurchaseCompleted) — len nákup, ktorý balík uložil; nový nikdy nevznikne |
| Stripe | Otázky (warning_*), charge.dispute.updated | Len audit — nič sa nezmení |
handle() uloží refundáciu idempotentne, prepojí ju s pôvodným nákupom (párovaným podľa poskytovateľa a identifikátora transakcie alebo identifikátora u poskytovateľa), prepne tento nákup na Status::Refunded a spustí PurchaseRefunded, pri sporoch ChargebackReceived. Refundácia aktuálneho obdobia predplatného — transakcie Apple, v ktorej predplatné práve je, alebo jeho poslednej objednávky v Google — a zrušené predplatné Google prepnú na Refunded aj Subscription, takže prestane byť aktívne; refundácia staršieho obdobia ho nechá tak. Každá refundovaná transakcia Apple má vlastný PurchaseRefund, takže refundácie dvoch období sú dva záznamy a dve udalosti; refunded_at refundácie Apple je jej revocationDate. Čiastočná refundácia (platba v Stripe, ktorá nie je refundovaná celá, čiastočné storno podľa množstva v Google) sa uloží a spustí PurchaseRefunded, nákup však ponechá v stave Completed:
use RoundlyConsulting\Purchases\Models\PurchaseRefund;
$purchase->refunds; // HasMany<PurchaseRefund>
$purchase->status; // Status::Refunded once a refund is matched
PurchaseRefund::chargebacks()->get(); // disputes only
$refund->chargeback; // bool
$refund->reason; // ?string
$refund->price; // ?Money — the refunded amount
$refund->refunded_at; // ?Carbon
$refund->purchase; // the Purchase it reverses, when matchedreason obsahuje to, čo nahlási obchod — pole reason zo Stripe, typ notifikácie Apple, typ refundácie alebo názov notifikácie Google. Pomerná refundácia Apple zaznamená len vrátenú časť; odvolanie cez Family Sharing nezaznamená žiadnu sumu.
Refundácie Stripe sú priebežný súčet
Všetky refundácie jednej platby v Stripe zdieľajú jeden PurchaseRefund kľúčovaný podľa jej PaymentIntent a jeho cena je kumulatívna suma amount_refunded danej platby. Každá ďalšia čiastočná refundácia znova spustí PurchaseRefunded s novým súčtom, nie so sumou tejto refundácie — $event->refund->price preto naprieč udalosťami nikdy nesčítavajte; čítajte ho ako „doteraz vrátené“. Záznam refundácie Apple predstavuje jednu refundovanú transakciu, záznam Google jednu stornovanú objednávku.
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.