Пример интеграции оплаты Laravel Stripe

Платежный шлюз Laravel Stripe заработал репутацию простого в использовании как для разработчиков, так и для владельцев магазинов. Благодаря отличной совместимости с Laravel, Stripe стал основным платежным шлюзом для магазинов электронной коммерции Laravel.

Спрос на платформы на основе Saas растет день ото дня, и в настоящее время создание системы на основе подписки является универсальный. Поэтому, чтобы упростить работу с серверной частью, такой как Laravel, нам действительно нужны некоторые пакеты, которые помогут нам создавать масштабируемые, защищаемые и надежные веб-приложения, которые работают с платежными системами.

Что такое платежный шлюз

Платежные шлюзы являются важным операционным компонентом любого магазина электронной коммерции.

Он дополняет механизм оплаты любого магазина электронной коммерции и позволяет пользователям без проблем совершать онлайн-платежи.

В этом отношении у владельцев магазинов действительно нет особого выбора, поскольку верхний уровень платежных шлюзов состоит из несколько имен, включая Stripe и PayPal.

Обе эти платформы предоставляют простые, безопасные и быстрые платежные услуги и в основном рекомендуются большинством владельцев магазинов.

Пример оплаты Laravel Stripe

Благодаря множеству функций и простой интеграции платежного шлюза Stripe в Laravel многие агентства по разработке пришли к выбору Stripe в качестве варианта платежного шлюза по умолчанию для всех магазинов электронной коммерции, которые они разрабатывают для своих клиентов.

Laravel Cashier упрощает интеграцию платежного шлюза, такого как Stripe. Итак, давайте посмотрим, как мы можем интегрировать Stripe в Laravel в системе на основе подписки.

Мы будем использовать пакет Cashier для интеграции Stripe Payment Gateway в Laravel.

Другой важной причиной популярности Stripe является то, что он принимает все всемирно принятые кредитные и дебетовые карты, что облегчает сбор платежей со всего мира.

Короче говоря, Stripe предоставляет полное решение для требований к обработке онлайн-платежей для магазинов электронной коммерции на базе Laravel.

Давайте сначала установим и настроим Laravel.

Шаг 1. Установите и настройте Laravel.

Введите следующую команду.

 laravel new stripesub 

Перейдите в папку проекта и откройте проект в редакторе. Я использую VSCode.

 cd stripesub && code. 

Установите зависимости js с помощью следующей команды.

 npm install 

Установите пакет Cashier для зависимостей Stripe.

 composer require laravel/cashier 

Также создайте платформу аутентификации.

 php artisan make: auth 

Шаг 2: Создание необходимых миграций базы данных

Перед использованием Cashier мы ‘ Мне также нужно подготовить базу данных.

Нам нужно добавить несколько столбцов в вашу таблицу пользователей и создать новые подписки и планы для хранения всех подписок наших клиентов.

Итак, сначала перейдите к create_users_table.php и добавьте следующую схему.

 $ table-> string ('stripe_id') -> nullable () -> collation ('utf8mb4_bin'); $ table-> string ('card_brand') -> nullable (); $ table-> строка  ('card_last_four', 4) -> nullable (); $ table-> timestamp ('trial_ends_at') -> nullable (); 

Теперь ваша схема выглядит так.

 public function up () {Schema :: create ('users', function (Blueprint $ table) {$ table-> increments ('id'); $ table-> string ('name'); $ table  -> string ('email') -> unique (); $ table-> timestamp ('email_verified_at') -> nullable (); $ table-> string ('пароль'); $ table-> string ('stripe_id'  ) -> nullable () -> сопоставление ('utf8mb4_bin'); $ table-> string ('card_brand') -> nullable (); $ table-> string ('card_last_four', 4) -> nullable (); $  таблица-> отметка времени (  'trial_ends_at') -> nullable ();  $ table-> запомнитьToken ();  $ table-> отметки времени ();  });} 

Теперь создайте еще два файла миграции.

 php artisan make: migration create_subscriptions_tablephp artisan make: migration create_plans_table 

Теперь напишите схему для обоих файлов.

Сначала добавьте следующую схему в файл create_subscriptions_table.php.

 public function up () {Schema:  : create ('подписки', функция (Blueprint $ table) {$ table-> increments ('id'); $ table-> unsignedInteger ('user_id'); $ table-> string ('name'); $ table-  > строка ('stripe_id') -> сопоставление ('utf8mb4_bin'); $ table-> string ('stripe_plan'); $ table-> integer ('количество'); $ table-> timestamp ('trial_ends_at') ->  nullable (); $ table-> timestamp ('end_at') -> nullable (); $ table-> timestamps ();});  } 

Напишите следующую схему внутри файла create_plans_table.php .

 public function up () {Schema :: create (  'планы', функция (Blueprint $ table) {$ table-> increments ('id'); $ table-> string ('name'); $ table-> string ('slug') -> unique (); $;  таблица-> строка ('stripe_plan'); $ table-> float ('стоимость'); $ table-> text ('description') -> nullable (); $ table-> timestamps ();});  } 

Сохраните файл, перейдите в терминал и перенесите таблицы.

 php artisan migrate 

Теперь добавьте два плана вручную на таблица планов выглядит следующим образом.

Шаг 3. Получение и установка ключей API Stripe

Во-первых, вам необходимо создать учетную запись на Stripe. Вы можете сделать это здесь. Затем после входа в свою учетную запись вы увидите тестовую панель управления.

Теперь нажмите ссылку Developers на левой боковой панели. В подменю вы можете найти пункт API-ключи . Щелкните этот элемент, и вы будете перенаправлены на эту страницу.

Здесь вы можете найти Публикуемый ключ или Stripe Key и Секретный ключ.

Вам нужно добавить их ключи внутри файла .env в нашем проекте.

//.envSTRIPE_KEY = ваш ключ здесьSTRIPE_SECRET = ваш секрет здесь 

Наконец , вам следует настроить свой ключ Stripe в файле конфигурации services.php . Вы можете получить свои ключи API Stripe из панели управления Stripe.

//services.php'stripe '=> [' model '=> App  User :: class,' key '=>  env ('STRIPE_KEY'), 'secret' => env ('STRIPE_SECRET'),], 

Кроме того, вам необходимо добавить Billable Trait в User.php

//User.phpuse Laravel  Cashier  Billable; класс User расширяет Authenticatable {use Billable;} 

Шаг 4 : Создание планов на панели инструментов Stripe

Вы можете создать план через Laravel, но это займет некоторое время, и наш девиз — принимать платеж через Stripe. Итак, мы создадим планы вручную на Stripe Dashboard.

Сначала перейдите по ссылке Billing >> Products , и прямо сейчас доступных продуктов нет. Итак, нам нужно создать два продукта. Здесь продукты означают планы. Итак, мы создадим два плана.

  1. Базовый
  2. Профессиональный

Создайте и назначьте значения так же, как мы присвоили значения в таблице Планы в нашем приложении Laravel. После создания двух планов ваши продукты выглядят следующим образом.

Шаг 5. Отображение планов во внешнем интерфейсе

Сначала определите маршруты для нашего приложения внутри routes >> web.php файл.

//web.phpRoute :: group (['middleware' => 'auth'], function () {Route :: get ('/home', 'HomeController @ index'  ) -> name ('home'); Route :: get ('/sizes', 'PlanController @ index') -> name ('sizes.index');}); 

Мы использовали промежуточное ПО аутентификации для защиты маршрутов, связанных с оплатой и домом.

Теперь создайте модель Plan.php и PlanController.php файл

 php artisan make: model Planphp artisan make: controller PlanController 

Определите метод индекса внутри PlanController .

//PlanController.phpuse App  Plan; общедоступная функция index () {$ plan = Plan :: all ();  return view ('планы. index ', compact (' sizes '));} 

Теперь внутри папки resources >> views создайте одну папку с именем планы и внутри этой папки создайте один файл с именем index.blade.php . Напишите следующий код.

 @extends ('layouts.app') @ section ('content') 
Планы
    @foreach ($ планы как $ plan)
  • {{$ plan-> name}}
    $ {{number_format ($ plan-> cost, 2)}} в месяц
    {{$ plan-> description}}
    Выбрать
  • @endforeach
@endsection

Теперь зарегистрируйте одного пользователя в приложении Laravel и перейдите по этому URL-адресу:

Вы найдете такие планы.

Шаг 6. Покажите план

Итак, когда пользователь выбирает план, нам нужно перенаправить его на определенную страницу плана.

Определить один дополнительный маршрут в файле routes >> web.php .

//web.phpRoute :: group (['middleware' => 'auth'],  function () {Route :: get ('/home', 'HomeController @ index') -> имя ('дом');  Route :: get ('/планы', 'PlanController @ index') -> имя ('планы.index');  Route :: get ('/plan/{plan}', 'PlanController @ show') -> name ('sizes.show');}); 

Теперь по умолчанию RouteModelBinding работает с идентификатором модели. Но мы не будем передавать идентификатор, чтобы показать конкретный план, вместо этого мы передадим slug. Поэтому нам нужно определить его внутри модели Plan.php .

  Php//Plan.phpnamespace App; используйте Illuminate  Database  Eloquent  Model;  класс Plan расширяет модель {protected $ fillable = ['name', 'slug', 'stripe_plan', 'cost', 'description'];  общедоступная функция getRouteKeyName () {return 'slug';  }} 

Здесь мы определили функцию с именем getRouteKeyName.

Итак, на основе этой функции теперь мы можем получать запись на основе слага, а не на основе идентификатора. Вот почему мы взяли поле slug как уникальное поле в базе данных.

Теперь определите функцию show () внутри Файл PlanController.php .

//PlanController. phppublic function show (Plan $ plan, Request $ request) {return view ('plan.show', compact ('plan'));} 

Следующим шагом является создание файла представления с именем show.blade.php в папке ресурсы >> просмотры >> планы . Добавьте следующий код в файл show.blade.php .

 @extends ('layouts.app') @ section ('content') 
{{ $ plan-> name}}
@endsection

Теперь мы отобразим форму оплаты на этой странице.

Шаг 7. Отображение формы оплаты

Для этого Например, я использую элемент карты. Вы можете найти его в официальной документации Stripe. Он надежно собирает конфиденциальные данные о картах с помощью Elements, наших готовых компонентов пользовательского интерфейса.

Теперь нам нужно включить внешние файлы JS в наш проект. Для этого нам нужно изменить файл resources >> views >> layout >> app.blade.php .

         {{config (  'app.name', 'Laravel')}}             @yield ('content')      @yield ('scripts')    

Здесь мы определили одну ссылку навигации под названием планы , а также добавить один раздел для скриптов. Итак, теперь мы можем добавлять Javascript для каждой страницы с помощью директивы @yield.

Следующим шагом является запись элемента Card внутри файл show.blade.php .

 @extends ('layout. app ') @ section (' content ') 

С вас будет взиматься плата в размере {{number_format ($ plan-> cost, 2)}} долларов США за план {{$ plan-> name}}

@csrf
@ endsection @ section ('scripts') //Создаем a Stripe client.var stripe = Stripe ('{{env ("STRIPE_KEY")}}');//Создаем экземпляр Elements. var elements = stripe.elements ();//Пользовательский стиль можно передать параметрам, когда создание элемента .//(Обратите внимание, что в этой демонстрации используется более широкий набор стилей, чем в приведенном ниже руководстве.) var style = {base: {color: '# 32325d', lineHeight: '18px', fontFamily: '"Helvetica Neue" , Helvetica, sans-serif ', fontSmoothing:' antialiased ', fontSize:' 16px ',' :: placeholder ': {color:' # aab7c4 '}}, недопустимо: {color:' # fa755a ', iconColor:' # fa755a '}};//Создаем экземпляр карты Element.var card = elements.create (' card ', {style: style});//Добавляем экземпляр Элемент card в элемент `card-element`
.card.mount ('# card-element');//Обработка ошибок проверки в реальном времени из элемента card.card.addEventListener ('change', function (event) {var displayError = document.getElementById ('ошибки карты'); если (event.error) {displayError.textContent = event.error.message; } еще {displayError.textContent = ''; }});//Обработка отправки формы. Var form = document.getElementById ('payment-form'); form.addEventListener ('submit', function (event) {event.preventDefault (); stripe.createToken (card). then (function (result) {if (result.error) {//Сообщаем пользователю, если произошла ошибка. var errorElement = document.getElementById ('card-errors'); errorElement.textContent = result.error.message;} else {//Отправляем токен на ваш сервер. stripeTokenHandler (result. токен); }});});//Отправляем форму с идентификатором токена. Function stripeTokenHandler (token) {//Вставляем идентификатор токена в форму, чтобы он был отправлен на сервер var form = document.getElementById ('payment-form '); var hiddenInput = document.createElement ('ввод'); hiddenInput.setAttribute ('тип', 'скрытый'); hiddenInput.setAttribute ('имя', 'stripeToken'); hiddenInput.setAttribute ('значение', token.id); form.appendChild (hiddenInput); //Отправка формы form.submit ();} @endsection

Здесь мы использовали элемент Card и Javascript для отображения формы.

Теперь добавьте ссылку на эту страницу в файле index.blade.php .

//index.blade.php  Выбрать  

Итак, это будет перенаправлен на страницу следующим образом.

Итак, мы необходимо ввести следующие данные. Вы можете ввести данные, как показано ниже.

  1. Номер карты: 4242 4242 4242 4242
  2. Срок действия Дата: 21.10 или как хотите из будущего сегодняшнего дня
  3. CVC: без разницы вам нравится
  4. Zipcode: все, что вам нравится

Это фиктивные детали, но эти детали обычно используется в учетной записи песочницы для проверки приложения.

Сейчас ничего не произойдет, потому что нам нужно определить действие формы для хранения данных в таблицах базы данных. Итак, давайте определим маршрут публикации.

Шаг 8: Сохраните подписки и примите оплату

Определите окончательный маршрут внутри Файл web.php .

//web.phpRoute :: group (['middleware' => 'auth'], function () {Route ::  get ('/home', 'HomeController @ index') -> name ('home'); Route :: get ('/sizes', 'PlanController @ index') -> name ('plan.index'); Маршрут  :: get ('/plan/{plan}', 'PlanController @ show') -> name ('sizes.show'); Route :: post ('/subscription', 'SubscriptionController @ create') -> name (  'subscription.create');}); 

Мы определили маршрут POST для подписок. Теперь создайте SubscriptionController с помощью следующей команды.

 php artisan make: controller SubscriptionController 

Теперь добавьте маршрут POST внутри show.blade.php при отправке данных на сервер.

//show.blade.php 

Внутри этого контроллера нам нужно определить одну функцию с именем create ().

  php//SubscriptionController. phpnamespace App  Http  Controllers; используйте Illuminate  Http  Request; используйте App  Plan; класс SubscriptionController расширяет Controller {public function create (Request $ request, Plan $ plan) {$ plan = Plan :: findOrFail ($ request-> get  ('строить планы'));  $ request-> user () -> newSubscription ('main', $ plan-> stripe_plan) -> create ($ request-> stripeToken);  return redirect () -> route ('home') -> with ('success', 'Ваш план успешно подписан');  }} 

Здесь мы создаем подписку для зарегистрированного пользователя и взимаем с него плату.

Во-первых, мы должны получить план в соответствии с идентификатором. Затем нам нужно передать этот план функции newSubscription () и создать подписку.

Итак, у нас есть использовали метод subscribedToPlan () признака Billable и передали первый параметр plan и второй параметр main.

Мы создаем новую подписку, если платеж произведен успешно тогда он будет перенаправлен на домашнюю страницу с сообщением об успешном завершении.

Напишите следующий код внутри файла home.blade.php .

 @extends ('layouts.app') @ section ('content') 
@if (session () -> get ('success'))
{{session () -> get ('success')}}
@endif
Панель управления
@if (session ('status')) @endif Добро пожаловать в Личный кабинет
@endsection

Итак, если все конфигурации верны, вам следует перейти к любому из планов и попробовать подписаться на план. Если вы выполняете перенаправление на домашнюю страницу, то вы почти закончили.

Вы можете видеть, что одна запись в базе данных внутри таблицы subscriptions есть.

Таблица вашего пользователя также была обновлена, так как вы можете видеть, что некоторые детали полей обновлено.

Вы также можете проверить панель инструментов Stripe. Поскольку мы подписались на Профессиональный план 50 долларов США.

Шаг 9: Настройки безопасности

Теперь нам нужно иметь в виду одну вещь: если пользователь уже подписан на один план, то нам нужно, чтобы пользователь помешать выбрать этот план. Итак, нам нужно добавить одно условие на кнопку выбора.

Итак, добавьте условие внутри index.blade.php файл.

 @if (! auth () -> user () -> subscribedToPlan ($ plan-> stripe_plan, 'main'))  Выберите  @endif 

Также нам нужно добавить условие внутри функции show () файла PlanController.php .

//Функция PlanController.phppublic show (Plan $ plan,  Request $ request) {if ($ request-> user () -> subscribedToPlan ($ plan-> stripe_plan, 'main')) {return redirect () -> route ('home') -> with ('успех',  'Вы уже подписались на план');} return view ('plan.show', compact ('plan'));} 

Кроме того, нам нужно сделать то же самое внутри Метод create () в SubscriptionController.

//Функция SubscriptionController.phppublic create (Request $ request, Plan $ plan) {if ($ request-> user () -  > subscribedToPlan ($ plan-> stripe_plan, 'main')) {return redirect () -> route ('home') -> with ('success', 'Вы уже подписались на план');} $ plan = Plan  :: findOrFail ($ request-> get ('plan')); $ request-> user () -> новая подписка  ('main', $ plan-> stripe_plan) -> create ($ request-> stripeToken);  return redirect () -> route ('home') -> with ('success', 'Ваш план успешно подписан');} 

Сохраните файл, и теперь все готово. Я помещаю весь код этого примера интеграции Laravel Stripe Payment Gateway на Github.

Наконец, статья Laravel 6 Stripe Payment Example окончена. Есть еще очень много вещей, которые мы можем сделать с этим проектом. Но для базового понимания этого достаточно. Спасибо.

Код Github

Оцените статью
nanomode.ru
Добавить комментарий