Skip to content

Commit

Permalink
Change subscription flow
Browse files Browse the repository at this point in the history
  • Loading branch information
driesvints committed Aug 15, 2022
1 parent 3934377 commit aa679dc
Show file tree
Hide file tree
Showing 3 changed files with 97 additions and 7 deletions.
14 changes: 13 additions & 1 deletion src/Concerns/InteractsWithPaymentBehavior.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,19 @@ trait InteractsWithPaymentBehavior
*
* @var string
*/
protected $paymentBehavior = StripeSubscription::PAYMENT_BEHAVIOR_ALLOW_INCOMPLETE;
protected $paymentBehavior = StripeSubscription::PAYMENT_BEHAVIOR_DEFAULT_INCOMPLETE;

/**
* Set any new subscription as incomplete when created.
*
* @return $this
*/
public function defaultIncomplete()
{
$this->paymentBehavior = StripeSubscription::PAYMENT_BEHAVIOR_DEFAULT_INCOMPLETE;

return $this;
}

/**
* Allow subscription changes even if payment fails.
Expand Down
58 changes: 55 additions & 3 deletions src/Subscription.php
Original file line number Diff line number Diff line change
Expand Up @@ -527,9 +527,29 @@ public function updateQuantity($quantity, $price = null)
])->save();

if ($this->hasIncompletePayment()) {
(new Payment(
$stripeSubscription->latest_invoice->payment_intent
))->validate();
try {
(new Payment(
$stripeSubscription->latest_invoice->payment_intent
))->validate();
} catch (IncompletePayment $e) {
if ($e->payment->requiresConfirmation()) {
$e->payment->confirm();

$stripeSubscription = $this->asStripeSubscription(['latest_invoice.payment_intent']);

$this->fill([
'stripe_status' => $stripeSubscription->status,
])->save();

if ($this->hasIncompletePayment()) {
(new Payment(
$stripeSubscription->latest_invoice->payment_intent
))->validate();
}
} else {
throw $e;
}
}
}

return $this;
Expand Down Expand Up @@ -883,6 +903,38 @@ public function addPrice($price, $quantity = 1, array $options = [])
])->save();
}

$stripeSubscription = $this->asStripeSubscription(['latest_invoice.payment_intent']);

$this->fill([
'stripe_status' => $stripeSubscription->status,
])->save();

if ($this->hasIncompletePayment()) {
try {
(new Payment(
$stripeSubscription->latest_invoice->payment_intent
))->validate();
} catch (IncompletePayment $e) {
if ($e->payment->requiresConfirmation()) {
$e->payment->confirm();

$stripeSubscription = $this->asStripeSubscription(['latest_invoice.payment_intent']);

$this->fill([
'stripe_status' => $stripeSubscription->status,
])->save();

if ($this->hasIncompletePayment()) {
(new Payment(
$stripeSubscription->latest_invoice->payment_intent
))->validate();
}
} else {
throw $e;
}
}
}

return $this;
}

Expand Down
32 changes: 29 additions & 3 deletions src/SubscriptionBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
use Laravel\Cashier\Concerns\HandlesTaxes;
use Laravel\Cashier\Concerns\InteractsWithPaymentBehavior;
use Laravel\Cashier\Concerns\Prorates;
use Laravel\Cashier\Exceptions\IncompletePayment;
use Stripe\PaymentMethod as StripePaymentMethod;
use Stripe\Subscription as StripeSubscription;

class SubscriptionBuilder
Expand Down Expand Up @@ -259,9 +261,33 @@ public function create($paymentMethod = null, array $customerOptions = [], array
$subscription = $this->createSubscription($stripeSubscription);

if ($subscription->hasIncompletePayment()) {
(new Payment(
$stripeSubscription->latest_invoice->payment_intent
))->validate();
try {
(new Payment(
$stripeSubscription->latest_invoice->payment_intent
))->validate();
} catch (IncompletePayment $e) {
if ($paymentMethod && $e->payment->requiresConfirmation()) {
$e->payment->confirm([
'payment_method' => $paymentMethod instanceof StripePaymentMethod
? $paymentMethod->id
: $paymentMethod,
]);

$stripeSubscription = $subscription->asStripeSubscription(['latest_invoice.payment_intent']);

$subscription->fill([
'stripe_status' => $stripeSubscription->status,
])->save();

if ($subscription->hasIncompletePayment()) {
(new Payment(
$stripeSubscription->latest_invoice->payment_intent
))->validate();
}
} else {
throw $e;
}
}
}

return $subscription;
Expand Down

0 comments on commit aa679dc

Please sign in to comment.