stripe Subscriptions payment lets you accept payment for your member subscription service. step by step Integrate Recurring Payment using Stripe Checkout with Billing.
Integrate Recurring Payment using Stripe Checkout with Billing
stripe Subscriptions Payment Gateway Integration in PHP Example with demo & php code for online payment. stripe recurring payments php Before getting started to integrate Stripe Subscription payment API in PHP, take a look at the files structure for stripe recurring payments.
stripe recurring payments php
stripe-recurring-payments-php/
├── init.php
├── success.php
├── index.php
├── cancel.php
├── Service/
├── Service/StripeService.php
├── ajax-endpoint/
├── webhook-ep/
├── webhook-ep/capture-response.php
About Stripe recurring payment example
Generate Stripe Test API Keys
in stripe subscription api, first of all need the test API keys data. Step 1: Login to your Stripe account and then Go to “Developers » API” keys page. Simple here Go to API keys & get a Publishable key and Secret key.
Install Stripe PHP Library
First of all you can free Install the PHP library via Composer.
composer require stripe/stripe-php
Download Stripe PHP Library
Onther Way to Download the Stripe PHP library from Github code available: stripe recurring payments php
Step 1 : Create products and pricing plans
lib/Config.php
step 2 : Create checkout session
first of all Create Stripe Subscription Form.
index.php
Checkout - www.pakainfo.com Best reference suitable for beginners to experts.
$20 / month
assets/js/stripe.js
var createCheckoutSession = function(planId) { var plan = { plan_id: planId }; var data = new FormData(); data.append( "plan", JSON.stringify( plan ) ); return fetch("ajax-endpoint/create-checkout-session.php", { method: "POST", body: data }).then(function(result) { console.log(result); return result.json(); }); }; // Handle any errors returned from Checkout var handleResult = function(result) { if (result.error) { var displayError = document.getElementById("error-message"); displayError.textContent = result.error.message; } };
step 3: Create Checkout Session
ajax-endpoint/create-checkout-session.php
plan_id; $session = $stripeService->createCheckoutSession($planId); echo json_encode($session); ?>
Service/StripeService.php
Config::PRODUCT_NAME, 'type' => Config::PRODUCT_TYPE, ]); return $product; } public function createPlan() { $plan = \Stripe\Plan::create([ 'amount' => 250, 'currency' => 'usd', 'interval' => 'month', 'product' => ['name' => Config::PRODUCT_NAME], ]); return $plan; } public function createCheckoutSession($planId) { $session = \Stripe\Checkout\Session::create([ 'payment_method_types' => ['card'], 'subscription_data' => [ 'items' => [[ 'plan' => $planId, ]], ], 'success_url' => 'https://localhost/stripe-checkout/success.php?session_id={CHECKOUT_SESSION_ID}', 'cancel_url' => 'https://localhost/stripe-checkout/cancel.php', ]); return $session; } public function getStripeResponse() { $body = @file_get_contents('php://input'); $event_json = json_decode($body); return $event_json; } } ?>
step 4 : Subscription life cycle and events
webhook-ep/capture-finalresults.php
getStripeResponse(); $stripePayment = new StripePayment(); if(!empty($finalresults)) { switch($finalresults->type) { case "invoice.payment_succeeded": $userDefineDt["id"] = $finalresults->data->object->id; $userDefineDt["invoice_status"] = $finalresults->data->object->status; $stripePayment->updateInvoiceStatus($userDefineDt); break; case "invoice.payment_failed": $userDefineDt["id"] = $finalresults->data->object->id; $userDefineDt["invoice_status"] = $finalresults->data->object->status; $stripePayment->updateInvoiceStatus($userDefineDt); break; case "customer.created": $userDefineDt = array(); $userDefineDt["customer_id"] = $finalresults->data->object->id; $userDefineDt["customer_email"] = $finalresults->data->object->email; $stripePayment->insertCustomer($userDefineDt); break; case "customer.subscription.created": $userDefineDt = array(); $userDefineDt["id"] = $finalresults->data->object->id; $userDefineDt["customer_id"] = $finalresults->data->object->customer; $userDefineDt["subscription_plan"] = $finalresults->data->object->plan->id; $userDefineDt["subscription_interval"] = $finalresults->data->object->plan->interval_count . " " .$finalresults->data->object->plan->interval; $userDefineDt["subscription_status"] = $finalresults->data->object->status; $userDefineDt["current_period_start"] = date("Y-m-d H:i:s", $finalresults->data->object->current_period_start); $userDefineDt["current_period_end"] = date("Y-m-d H:i:s", $finalresults->data->object->current_period_end); $userDefineDt["subscription_created_date"] = date("Y-m-d H:i:s", $finalresults->data->object->created); $stripePayment->insertSubscription($userDefineDt); break; case "customer.subscription.updated": $userDefineDt = array(); $userDefineDt["id"] = $finalresults->data->object->id; $userDefineDt["subscription_status"] = $finalresults->data->object->status; $stripePayment->updateSubscription($userDefineDt); break; case "invoice.created": $userDefineDt = array(); $userDefineDt["id"] = $finalresults->data->object->id; $userDefineDt["subscription_id"] = $finalresults->data->object->subscription; $userDefineDt["invoice_number"] = $finalresults->data->object->number; $userDefineDt["customer_id"] = $finalresults->data->object->customer; $userDefineDt["billing_email"] = $finalresults->data->object->customer_email; $userDefineDt["currency"] = $finalresults->data->object->currency; $userDefineDt["invoice_status"] = $finalresults->data->object->status; $userDefineDt["invoice_created_date"] = date("Y-m-d H:i:s", $finalresults->data->object->created); $i = 0; foreach($finalresults->data->object->lines->data as $data) { $userDefineDt["invoice_items"][$i]["amount"] = $data->amount; $userDefineDt["invoice_items"][$i]["currency"] = $data->currency; $userDefineDt["invoice_items"][$i]["quantity"] = $data->quantity; $userDefineDt["invoice_items"][$i]["description"] = $data->description; $i++; } $stripePayment->insertInvoice($userDefineDt); break; case "invoice.finalized": $userDefineDt["id"] = $finalresults->data->object->id; $userDefineDt["invoice_finalized_date"] = date("Y-m-d H:i:s", $finalresults->data->object->finalized_at); $userDefineDt["invoice_status"] = $finalresults->data->object->status; $stripePayment->updateInvoice($userDefineDt); break; } } ?>
lib/StripePayment.php
ds = new DataSource(); } public function insertCustomer($customer) { $insertQuery = "INSERT INTO tbl_customer(customer_id, email) VALUES (?, ?) "; $userArgDataVal = array( $customer["customer_id"], $customer["customer_email"], ); $userArgTp = "ss"; $this->ds->insert($insertQuery, $userArgTp, $userArgDataVal); } public function insertSubscription($charge_subs) { $insertQuery = "INSERT INTO tbl_subscription(subscription_id, customer_id, subscription_plan, subscription_interval, current_period_start, current_period_end, subscription_status, subscription_created_date) VALUES (?, ?, ?, ?, ?, ?, ?, ?) "; $userArgDataVal = array( $charge_subs["id"], $charge_subs["customer_id"], $charge_subs["subscription_plan"], $charge_subs["subscription_interval"], $charge_subs["current_period_start"], $charge_subs["current_period_end"], $charge_subs["subscription_status"], $charge_subs["subscription_created_date"], ); $userArgTp = "ssssssss"; $this->ds->insert($insertQuery, $userArgTp, $userArgDataVal); } public function insertInvoice($invoice) { $insertQuery = "INSERT INTO tbl_invoice(invoice_number, subscription_id, invoice_id, customer_id, billing_email, currency, invoice_status, invoice_created_date) VALUES (?, ?, ?, ?, ?, ?, ?, ?) "; $userArgDataVal = array( $invoice["invoice_number"], $invoice["subscription"], $invoice["id"], $invoice["customer_id"], $invoice["billing_email"], $invoice["currency"], $invoice["invoice_status"], $invoice["invoice_created_date"], ); $userArgTp = "ssssssss"; $inserId = $this->ds->insert($insertQuery, $userArgTp, $userArgDataVal); if(!empty($inserId)) { $this->insertInvoiceItem($invoice["invoice_items"], $inserId); } } public function insertInvoiceItem($invoiceItem, $invoiceMasterId) { $insertQuery = "INSERT INTO tbl_invoice_items(invoice_master_id, description, quantity, amount, currency) VALUES (?, ?, ?, ?, ?) "; $userArgDataVal = array( $invoiceMasterId, $invoiceItem[0]["description"], $invoiceItem[0]["quantity"], $invoiceItem[0]["amount"], $invoiceItem[0]["currency"], ); $userArgTp = "issss"; $this->ds->insert($insertQuery, $userArgTp, $userArgDataVal); } public function updateInvoice($invoice) { $query = "UPDATE tbl_invoice SET invoice_finalized_date = ?, invoice_status = ? WHERE invoice_id = ?"; $userArgDataVal = array( $invoice["invoice_finalized_date"], $invoice["invoice_status"], $invoice["id"] ); $userArgTp = "sss"; $this->ds->execute($query, $userArgTp, $userArgDataVal); } public function updateInvoiceStatus($invoice) { $query = "UPDATE tbl_invoice SET invoice_status = ? WHERE invoice_id = ?"; $userArgDataVal = array( $invoice["invoice_status"], $invoice["id"] ); $userArgTp = "ss"; $this->ds->execute($query, $userArgTp, $userArgDataVal); } public function updateSubscription($charge_subs) { $query = "UPDATE tbl_subscription SET subscription_status = ? WHERE subscription_id = ?"; $userArgDataVal = array( $charge_subs["subscription_status"], $charge_subs["id"] ); $userArgTp = "ss"; $this->ds->execute($query, $userArgTp, $userArgDataVal); } } ?>
Also Read : Stripe API Subscriptions With Plan Coupon And Discounts Using PHP
step : 5 Test Card Details for stripe recurring payments php
Expiration date : 10/2022
CVC number : 989 (Any random number)
- 4242424242424242 – Visa
- 4000056655665556 – Visa (debit)
- 5555555555554444 – Mastercard
- 5200828282828210 – Mastercard (debit)
- 378282246310005 – American Express
- 6011111111111117 – Discover