Jednotný výsledok
Každý poskytovateľ mapuje svoj natívny payload na RoundlyConsulting\Purchases\Contracts\ProviderResult, takže kód aplikácie napíšete raz a funguje pre Apple, Google aj Stripe:
| Metóda | Vracia | Popis |
|---|---|---|
provider() | string | Pôvodný poskytovateľ: apple, google alebo stripe. |
type() | ResultType | Purchase, Subscription, Refund, Notification alebo Unknown. |
providerId() | string | Identifikátor, podľa ktorého sa záznam uloží. |
transactionId() | ?string | Identifikátor transakcie. |
status() | Status | Normalizovaný stav naprieč poskytovateľmi. |
name() | ?string | Názov produktu alebo predplatného. |
productId() | ?string | Identifikátor produktu / SKU. |
price() | ?Money | Zaplatená suma, ak ju obchod poskytuje. |
activeFrom() | ?CarbonInterface | Začiatok predplatného. |
trialEndsAt() | ?CarbonInterface | Koniec skúšobného obdobia. |
endsAt() | ?CarbonInterface | Koniec alebo expirácia predplatného. |
items() | list<ResultItem> | Položky. |
refundReason() | ?string | Dôvod refundácie pri výsledku typu Refund. |
isChargeback() | bool | Spor (chargeback), nie dobrovoľná refundácia. |
occurredAt() | ?CarbonInterface | Kedy sa to podľa poskytovateľa stalo — created udalosti Stripe, signedDate notifikácie Apple, eventTimeMillis notifikácie Google alebo okamih, keď stav nahlásilo API obchodu; null, ak nie je známy. |
raw() | array | Pôvodný dekódovaný payload obchodu. |
Čítanie výsledku
use RoundlyConsulting\Purchases\Enum\ResultType;
use RoundlyConsulting\Purchases\Facades\Purchases;
$result = Purchases::result('apple', $request);
$result->provider(); // 'apple'
$result->type(); // ResultType::Subscription
$result->status(); // Status::Completed
$result->status()->isActive(); // true for Completed and InGracePeriod
$result->providerId(); // the id the record is keyed on
$result->price(); // RoundlyConsulting\Money\Money|null
$result->endsAt(); // ?CarbonInterface
$result->raw(); // array — the decoded store payload
if ($result->type() === ResultType::Refund && $result->isChargeback()) {
// a dispute, not a voluntary refund
}GenericResult
GenericResult je konkrétna readonly implementácia, ktorú vracia každý vstavaný poskytovateľ — a ktorú má vracať aj váš vlastný. Povinné sú len provider, type, providerId a status; ostatné má predvolene null, prázdne pole alebo false:
use RoundlyConsulting\Money\Money;
use RoundlyConsulting\Purchases\DataTransferObjects\ResultItem;
use RoundlyConsulting\Purchases\Enum\ResultType;
use RoundlyConsulting\Purchases\Enum\Status;
use RoundlyConsulting\Purchases\Results\GenericResult;
$result = new GenericResult(
provider: 'stripe',
type: ResultType::Subscription,
providerId: 'sub_123',
status: Status::Completed,
transactionId: 'sub_123',
name: 'pro',
productId: 'price_pro',
price: Money::ofMinor(1999, 'USD'),
activeFrom: now(),
trialEndsAt: null,
endsAt: now()->addMonth(),
items: [new ResultItem('Pro plan', 'price_pro', Money::ofMinor(1999, 'USD'))],
raw: $payload,
refundReason: null,
chargeback: false,
);Položky sú DTO ResultItem: ResultItem(string $name, ?string $providerId = null, ?Money $price = null, int $quantity = 1). Hodnoty Status a ResultType opisuje sekcia Enumy a výnimky.
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.