Пример платежного шлюза Laravel Cashier Braintree

В этом руководстве мы увидим учебное пособие по Laravel Cashier Braintree Payment Gateway с примером. Мы создадим платформу на основе подписки, в которой пользователь может выбрать план, и в соответствии с этим с него будет взиматься плата. Мы используем Braintree для этой демонстрации, и мы обсудим полосу в следующем уроке. Итак, мы построим простой платежный шлюз, в котором пользователь может взимать плату в соответствии с выбранным планом. Это простая в использовании система, и для этого нам нужно создать учетную запись разработчика в Braintree. Итак, если вы еще не создали, перейдите по этой ссылке.

Laravel Cashier Braintree Payment Gateway

Интегрировать платеж шлюз в любом веб-приложении раньше было очень сложной задачей. Но в настоящее время доступно множество SDK для работы, поэтому легко интегрировать любой платежный шлюз в любое веб-приложение. Теперь вы можете найти здесь официальную документацию Laravel для интеграции Braintree.

Предостережения для Braintree

Для многих операций реализации функции Cashier в Stripe и Braintree одинаковы. Обе службы обеспечивают выставление счетов по подписке с помощью кредитных карт, но Braintree также поддерживает платежи через PayPal. Мы не будем использовать Paypal в этом примере. Однако в Braintree также отсутствуют некоторые функции, поддерживаемые Stripe. Решая использовать Stripe или Braintree, вы должны помнить следующее:

  • Braintree поддерживает PayPal, а Stripe — нет.
  • Braintree не поддерживает методы увеличения и уменьшения в подписках. Это ограничение Braintree, а не ограничение кассы.
  • Braintree не поддерживает процентные скидки. Это ограничение Braintree, а не ограничение кассы.

Давайте начнем этот небольшой проект с установки Laravel Framework.

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

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

 Новая подписка laravel 

Теперь войдите в папку проекта и настройте базу данных в файле .env .

 DB_CONNECTION = mysqlDB_HOST = 127.0.0.1DB_PORT = 3306DB_DATABASE = subscriptionDB_USERNAME = rootDB_PASSWORD = root 

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

 npm install 

Скомпилируйте файлы CSS и JS.

 npm run dev 

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

 php artisan make: auth 

Шаг 2: Установите и настройте пакет Braintree

Следующим шагом является установка Пакет Laravel Cashier . Итак, давайте установим это.

 composer require "laravel/cashier-braintree": "~ 2. 0 "

Следующим шагом является регистрация поставщика услуг Laravel Cashier CashierServiceProvider в вашем config/app.php файл конфигурации.

 ... Laravel  Cashier  CashierServiceProvider :: class, ... 

Теперь нам нужно создать и изменить миграции базы данных.

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

 Schema :: table ('users'  , функция ($ table) {$ table-> string ('braintree_id') -> nullable (); $ table-> string ('paypal_email') -> nullable (); $ table-> string ('card_brand') -  > nullable (); $ table-> string ('card_last_four') -> nullable (); $ table-> timestamp ('trial_ends_at') -> nullable ();}); 

Итак наш последний файл create_users_table.php выглядит так, как показано ниже.

  phpuse Illuminate  Support  Facades  Schema; используйте Illuminate  Database  Schema  Blueprint; используйте  Illuminate  Database  Migrations  Migration; класс CreateUsersTable расширяет Migration {/** * Выполнить  е миграции.  * * @return void */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 (  'braintree_id') -> nullable (); $ table-> string ('paypal_email') -> nullable (); $ table-> string ('card_brand') -> nullable (); $ table-> string ('card_last_four  ') -> nullable (); $ table-> timestamp (' trial_ends_at ') -> nullable (); $ table-> запомнитьToken (); $ table-> timestamps ();});  }/** * Отменить миграции.  * * @return void */public function down () {Schema :: dropIfExists ('users');  }} 

Также нам нужно создать еще два файла миграции. Чтобы создать файлы, нажмите следующие команды.

 php artisan make: migration create_plans_tablephp artisan make: migration create_subscriptions_table 

Теперь напишите в нем следующие схемы.

  php//create_subscriptions_table.phpuse Illuminate  Support  Facades  Schema; используйте Illuminate  Database  Schema  Blueprint; используйте Illuminate  Database  Migrations  Migration; класс CreateSubsriptionsTable расширяет Migration {/** *  Запустите миграции. * * @return void */public function up () {Schema :: create ('subsriptions', function (Blueprint $ table) {$ table-> increments ('id'); $ table-> integer ('user_id')  ; $ table-> string ('name'); $ table-> string ('braintree_id'); $ table-> string ('braintree_plan'); $ table-> integer ('количество'); $ table-> отметка времени  ('trial_ends_at') -> nullable (); $ table-> timestamp ('nds_at ') -> nullable (); $ table-> timestamps ();});  }/** * Отменить миграции.  * * @return void */public function down () {Schema :: dropIfExists ('subriptions');  }} 

А ниже представлена ​​схема таблицы планы .

  php//create_plans_table.phpuse Illuminate  Support  Facades   Schema; используйте Illuminate  Database  Schema  Blueprint; используйте Illuminate  Database  Migrations  Migration; class CreatePlansTable extends Migration {/** * Запустите миграции.  * * @return void */public function up () {Schema :: create ('планы', функция (Blueprint $ table) {$ table-> increments ('id'); $ table-> string ('name')  ; $ table-> string ('slug') -> unique (); $ table-> string ('braintree_plan'); $ table-> float ('стоимость'); $ table-> text ('description') -  > nullable (); $ table-> timestamps ();});  }/** * Отменить миграции.  * * @return void */public function down () {Schema :: dropIfExists ('планы');  }} 

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

 php artisan migrate 

Он создаст таблицы.

Теперь добавьте оплачиваемую черту внутри Модель User.php .

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

Шаг 3. Возьмите и добавьте ключи API для Braintree

Теперь, если вы еще не создали учетную запись разработчика в Braintree, создайте ее.

После этого вы будете перенаправлены на панель управления, а затем перейдите к Учетная запись >> Мой пользователь и щелкните ссылку Просмотреть авторизации . в разделе Ключи API, Ключи токенизации, Ключи шифрования .

После нажатия ссылки Просмотр авторизации вы будете перенаправлены на страницу ключей API песочницы.

Теперь вам нужно нажать Просмотр внутри таблицы, и теперь вы можете видеть следующие ключи и данные.

  1. Ваш открытый ключ
  2. Ваш закрытый ключ
  3. Ваша среда
  4. Ваш идентификатор продавца

Вам необходимо добавить эти ключи в свой .env файл.

 BRAINTREE_ENV = sandboxBRAINTREE_MERCHANT_ID = ваш продавец idBRAINTREE_PUBLIC_KEY = ваш открытый ключ BRAINTREE_PRIVATE_KEY = ваш закрытый ключ 

Следующим шагом вы должны настроить следующие параметры внутри вашего services.php .

//services.php'braintree '=> [' model '=> App  User :: class,' environment '=> env (' BRAINTREE_ENV  '),' merchant_id '=> env (' BRAINTREE_MERCHANT_ID '),' public_key '=> env (' BRAINTREE_PUBLIC_KEY '),' private_key '=> env (' BRAINTREE_PRIVATE_KEY '),], 

Затем вы должны добавить следующие вызовы SDK Braintree в метод загрузки вашего AppServiceProvider.

//AppServiceProvider.phpuse Braintree_Configuration; общедоступная функция boot () {Braintree_Configuration :: environment (env ('BRAINTREE_ENV'));  Braintree_Configuration :: merchantId (env ('BRAINTREE_MERCHANT_ID'));  Braintree_Configuration :: publicKey (env ('BRAINTREE_PUBLIC_KEY'));  Braintree_Configuration :: privateKey (env ('BRAINTREE_PRIVATE_KEY'));} 

Вы также можете установить валюту. По умолчанию используется доллар ($).

Валюту по умолчанию можно изменить, вызвав метод Cashier :: useCurrency из загрузки метод одного из ваших поставщиков услуг. В нашем случае мы использовали AppServiceProvider. Метод useCurrency принимает два строковых параметра: валюта и символ валюты.

//AppServiceProvider.phpuse Laravel  Cashier  Cashier; Cashier :: useCurrency ('  eur ',' € '); 

Шаг 4. Создайте планы на панели инструментов Braintree

Теперь для этого примера мы создадим только два плана. Вы можете создать в соответствии с вашими требованиями. Вы можете найти планы на панели инструментов на левой боковой панели.

Я создал два плана.

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

Также вам понадобится для добавления планов вручную в таблицу планов внутри MySQL.

Убедитесь, что оба плана имеют те же имена, что и на панели управления MySQL и Braintree.

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

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

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

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

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

 php artisan make: model Planphp artisan make: controller PlanController 

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

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

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

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

Сохраните файл и перейдите по URL-адресу: http://subscription.test/plans. Если вы еще не зарегистрировались, зарегистрируйте одного пользователя в нашем приложении.

Вы увидите что-то вроде этого.

Итак, мы успешно отобразили планы из базы данных. Теперь следующий шаг — когда пользователь выбирает план, вы перенаправляетесь на страницу, с которой с пользователя может взиматься плата за этот план.

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

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

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

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

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

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

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

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

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

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

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

Итак, здесь мы отобразим форму оплаты.

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

Для отображения Форма оплаты, мы будем использовать Drop-in UI. Вы можете найти полную документацию здесь. Мы используем версию 2 интерфейса Drop-in. Есть версия 3, но давайте остановимся на версии 2 для этого примера. Теперь мы реализуем конфигурацию на стороне клиента.

Настройте контейнер, и откуда пользовательский интерфейс Drop-in будет добавлять одноразовый номер метода оплаты. Обязательно замените CLIENT_AUTHORIZATION на созданный вами токен клиента.

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

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

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

Кроме того, нам нужно получить токен клиента для авторизации. Итак, мы получим этот токен из Backend с помощью запроса AJAX.

Итак, определите один маршрут внутри файла web.php .

//web.phpRoute :: group (['middleware' => 'auth'], function () {Route :: get ('/home', 'HomeController @ index') -> name ('home');  Route :: get ('/sizes', 'PlanController @ index') -> name ('sizes.index'); Route :: get ('/plan/{plan}', 'PlanController @ show') -> имя  ('plan.show'); Route :: get ('/braintree/token', 'BraintreeTokenController @ index') -> name ('token');}); 

Создать новый Контроллер вызвал BraintreeTokenController с помощью следующей команды.

 php artisan make: controller BraintreeTokenController 

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

  php//BraintreeTokenController.phpnamespace App  Http  Controllers; использовать Illuminate  Http  Request; использовать Braintree_ClientToken; класс BraintreeTokenController расширяет Controller {public  функция index () {return response () -  > json (['data' => ['token' => Braintree_ClientToken :: generate ()]]);  }} 

Функция index () возвращает ClientToken в файл Clientside JS, и теперь мы можем авторизовать наше приложение Laravel с помощью учетной записи разработчика Braintree.

Итак, напишите окончательный код внутри файла show.blade.php .

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

@ endsection @ section ('скрипты') jQuery.ajax ({url: "{{route ('token')}}",}) .done (function (res) { braintree.setup (res.data.token, 'dropin', {контейнер: 'dropin-container', onReady: function () {jQuery ('# payment-button'). removeClass ('d-none')}}) ; }); @endsection

Итак, когда документ загружен, мы отправим запрос Ajax на сервер Laravel и получим токен аутентификации клиента. Из этого токена включенный js сгенерирует форму оплаты. Мы определили форму следующим образом.

 

@csrf


Также напишите Javascript следующим образом.

 @section ('scripts')    jQuery.ajax ({url:" {{route ('token')}} ",  }) .done (function (res) {braintree.setup (res.data.token, 'dropin', {container: 'dropin-container', onReady: function () {jQuery ('# payment-button'). removeClass  ('d-none')}});});  @endsection 

Итак, когда запрос завершится успешно, он вернет токен, и мы используем этот токен для создания Форма оплаты. Форма выглядит так.

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

  1. Номер карты: 4242 4242 4242 4242
  2. Срок годности: 21.10 или как угодно

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

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

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

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

  php//web.phpRoute :: get ('/', function () {return view ('welcome');}  ); Auth :: routes (); Route :: group (['middleware' => 'auth'], function () {Route :: get ('/home', 'HomeController @ index') -> name ('  home '); Route :: get ('/sizes ',' PlanController @ index ') -> name (' sizes.index '); Route :: get ('/plan/{plan} ',' PlanController @ show '  ) -> name ('plan.show'); Route :: get ('/braintree/token', 'BraintreeTokenController @ index') -> name ('token'); Route :: post ('/subscription', '  SubscriptionController @ create ') -> name (' subscription.create ');}); 

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

 php artisan make: controller SubscriptionController 

Внутри этого контроллера нам нужно определить одну функцию с именем 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-> braintree_plan) -> create ($ request-> payment_method_nonce);  return redirect () -> route ('home') -> with ('success', 'Ваш план успешно подписан');  }} 

Сначала мы должны получить план в соответствии с идентификатором. Затем нам нужно передать этот план функции subscribedToPlan ().

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

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

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

 @extends ('layouts.app')  @section ('content') 
@if (session () -> get ( 'success'))
{{session () -> get ('success')}}
@endif
Панель управления
@if (session ('status')) @endif Вы вошли в систему!
@endsection

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

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

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

Внутри панели управления вы можете увидеть, что там есть объем продаж и транзакций. Итак, наше руководство по Laravel Cashier Braintree Payment Gateway с примером почти завершено.

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

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

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

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

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

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

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

//SubscriptionController.phppublic функция create (Request $ request, Plan $ plan) {if ($ request-> user () -> subscribedToPlan ($ plan-> braintree_plan, '  main ')) {return redirect () -> route (' домой ');  } $ plan = Plan :: findOrFail ($ request-> get ('план'));  $ request-> user () -> newSubscription ('main', $ plan-> braintree_plan) -> create ($ request-> payment_method_nonce);  return redirect () -> route ('home') -> with ('success', 'Ваш план успешно подписан');} 

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

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

Код Github

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