My stack: Laravel & stripephp
Scenario: There is an open invoice which is already generated for a subscription. Stripe invoice ID (in_1PVBjnSE4D7cjIupbEfXsQ4w).
I want to achieve the following
step 1 – create an url for the customer to pay for the invoice generated.
step 2 – customer pays for invoice ID (in_1PVBjnSE4D7cjIupbEfXsQ4w).
step 3 – after payment customer should be redirected back to redirect url.
Problem: redirect is working but invoice in question is not paid. but instead a new invoice for the same amount is charged.
What I have been trying: I am trying to create a stripe session which help in redirect. but seems i am not able to direct stripe system to pay for specific invoice.
here is my controller code which generates the stripe session.
public function createCheckoutSession(Request $request, $invoiceId)
{
$firmId = session('firmdatas.id');
$firmData = Firmregistration::findOrFail($firmId);
$invoice = FirmInvoices::findOrFail($invoiceId);
$stripeObj = new StripeStripeClient(config('services.stripe.secret'));
$subscription = $stripeObj->subscriptions->retrieve($invoice->stripe_subscription_id);
try {
$session = $stripeObj->checkout->sessions->create([
'payment_method_types' => ['card'],
'line_items' => [[
'price_data' => [
'currency' => 'usd',
'product_data' => [
'name' => 'Invoice Payment',
],
'unit_amount' => $invoice->amount_due,
],
'quantity' => 1,
]],
'subscription_data' => [
'items' => [
['plan' => $subscription->items->data[0]->id], // Assuming only one item in the subscription
],
],
'mode' => 'payment',
'customer' => $firmData->stripe_id,
'payment_intent_data' => [
'description' => "Payment for Invoice #{$invoice->number}",
'metadata' => [
'invoice_id' => $invoice->invoice_id,
],
],
'success_url' => route('admin.subscription.invoice.paymentsuccess', [
'invoiceid' => $invoice->invoice_id,
'amount_paid' => $invoice->amount_due, // Stripe will update the actual amount paid after payment
'receipt_url' => '', // Placeholder, will be updated below
]),
'cancel_url' => route('admin.subscription.view'),
]);
// Redirect to the Checkout Session URL
return redirect()->away($session->url);
} catch (Exception $e) {
Log::error('Error creating Stripe Checkout Session: ' . $e->getMessage());
return view('errors.500');
}
}
Above I am trying to pass the subscription, or invoice id.. nothing seems to work. specific invoice is not paid.
Please advise.