В этом руководстве мы увидим учебное пособие по Laravel Cashier Braintree Payment Gateway с примером. Мы создадим платформу на основе подписки, в которой пользователь может выбрать план, и в соответствии с этим с него будет взиматься плата. Мы используем Braintree для этой демонстрации, и мы обсудим полосу в следующем уроке. Итак, мы построим простой платежный шлюз, в котором пользователь может взимать плату в соответствии с выбранным планом. Это простая в использовании система, и для этого нам нужно создать учетную запись разработчика в Braintree. Итак, если вы еще не создали, перейдите по этой ссылке.
- Laravel Cashier Braintree Payment Gateway
- Предостережения для Braintree
- Шаг 1: Установите и настройте Laravel
- Шаг 2: Установите и настройте пакет Braintree
- Шаг 3. Возьмите и добавьте ключи API для Braintree
- Шаг 4. Создайте планы на панели инструментов Braintree
- Шаг 5. Отображение планов во внешнем интерфейсе
- Шаг 6. Покажите план
- Шаг 7. Отображение формы оплаты
- Шаг 8: Сохраните детали плана
- Шаг 9: Настройки безопасности
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 песочницы.
Теперь вам нужно нажать Просмотр внутри таблицы, и теперь вы можете видеть следующие ключи и данные.
- Ваш открытый ключ
- Ваш закрытый ключ
- Ваша среда
- Ваш идентификатор продавца
Вам необходимо добавить эти ключи в свой .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
Теперь для этого примера мы создадим только два плана. Вы можете создать в соответствии с вашими требованиями. Вы можете найти планы на панели инструментов на левой боковой панели.
Я создал два плана.
- Basic
- Профессиональный
Также вам понадобится для добавления планов вручную в таблицу планов внутри 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')@endsectionПланы@foreach ($ планы как $ plan)
- @endforeach
Сохраните файл и перейдите по 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')@endsection{{ $ plan-> name}}
Итак, здесь мы отобразим форму оплаты.
Шаг 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')@ 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{{$ plan-> name}}@csrf
Итак, когда документ загружен, мы отправим запрос 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
Итак, когда запрос завершится успешно, он вернет токен, и мы используем этот токен для создания Форма оплаты. Форма выглядит так.
Итак, нам нужно чтобы ввести две детали. Вы можете ввести данные, как показано ниже.
- Номер карты: 4242 4242 4242 4242
- Срок годности: 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')@endsection@if (session () -> get ( 'success')){{session () -> get ('success')}}@endifПанель управления@if (session ('status')){{session ( 'status')}}@endif Вы вошли в систему!
Итак, если все конфигурации верны, то вам следует перейти к любому из планов и попробуйте подписаться на план. Если вы выполняете перенаправление на домашнюю страницу, значит, вы почти закончили.
Вы можете видеть, что одна запись в базе данных находится внутри таблицы 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