Интеграция платежного шлюза PayPal в Laravel
Недавно я опубликовал статью об интеграции PayPal Payment Gateway в PHP. В этой статье один из наших читателей спросил об интеграции платежного шлюза PayPal в Laravel. Хотя Laravel построен с использованием PHP, у них есть свои стандарты, которым нужно следовать. Вы должны настроить свой простой PHP-код в соответствии с потоком Laravel. В этой статье я покажу вам, как принимать платежи на вашем веб-сайте Laravel с помощью API PayPal Rest.
PayPal – один из самых надежных брендов, принимающих онлайн-платежи. PayPal предоставляет различные способы интеграции своей платежной системы в веб-приложения. Одна из услуг – PayPal Rest API, которую мы будем использовать в этом руководстве. Для начала вам сначала нужно получить свой идентификатор клиента и секрет клиента.
Перейдите в свою учетную запись разработчика PayPal и войдите в нее. На панели инструментов разработчика щелкните меню «Мои приложения и учетные данные». Затем нажмите кнопку «Создать приложение» в разделе приложений REST API.
Следуйте инструкциям по подсказке, и вы получите свою песочницу и действующие учетные данные. А пока скопируйте идентификатор клиента и секрет клиента режима песочницы.
Базовая настройка в Laravel для приема платежей через PayPal
Когда клиенты производят оплату на вашем веб-сайте, вам необходимо сохранить платежные реквизиты для последующего использования. Создайте таблицу «платежей» в базе данных для хранения деталей платежа. Создайте миграцию для таблицы платежей с помощью команды:
php artisan make:migration create_payments_table
Откройте файл миграции и измените столбцы следующим образом.
<?php
...
...
public function up()
{
Schema::create('payments', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('payment_id');
$table->string('payer_id');
$table->string('payer_email');
$table->float('amount', 10, 2);
$table->string('currency');
$table->string('payment_status');
$table->timestamps();
});
}
Выполните указанную выше миграцию, используя команду ниже.
php artisan migrate
Эта команда создаст в вашей базе данных таблицу платежей. Затем создайте модель, соответствующую таблице «платежей».
php artisan make:model Payment
После этого добавьте учетные данные PayPal в свой .env
файл.
PAYPAL_CLIENT_ID=PASTE_HERE_CLIENT_ID
PAYPAL_CLIENT_SECRET=PASTE_HERE_CLIENT_SECRET
PAYPAL_CURRENCY=USD
Очистите кеш конфигурации с помощью команды:
php artisan config:cache
Я перешел в валюту «доллар США». Пользователь может изменить его в соответствии с требованиями.
Определим маршруты, которые нам понадобятся в следующих шагах.
маршруты / web.php
<?php
...
...
Route::get('payment', 'PaymentController@index');
Route::post('charge', 'PaymentController@charge');
Route::get('paymentsuccess', 'PaymentController@payment_success');
Route::get('paymenterror', 'PaymentController@payment_error');
Интеграция платежного шлюза PayPal в Laravel
Интегрировать API платежных шлюзов в приложение довольно сложно. К счастью, библиотека Omnipay облегчила жизнь разработчикам. Omnipay – самая популярная библиотека обработки платежей для PHP. Это простой и понятный код для интеграции различных платежных шлюзов. Установите библиотеку Omnipay с помощью команды:
composer require league/omnipay omnipay/paypal
Теперь создайте контроллер PaymentController
и определите методы, упомянутые в файле маршрута.
php artisan make:controller PaymentController
PaymentController.php
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
use OmnipayOmnipay;
use AppPayment;
class PaymentController extends Controller
{
public $gateway;
public function __construct()
{
$this->gateway = Omnipay::create('PayPal_Rest');
$this->gateway->setClientId(env('PAYPAL_CLIENT_ID'));
$this->gateway->setSecret(env('PAYPAL_CLIENT_SECRET'));
$this->gateway->setTestMode(true); //set it to 'false' when go live
}
public function index()
{
return view('payment');
}
public function charge(Request $request)
{
if($request->input('submit'))
{
try {
$response = $this->gateway->purchase(array(
'amount' => $request->input('amount'),
'currency' => env('PAYPAL_CURRENCY'),
'returnUrl' => url('paymentsuccess'),
'cancelUrl' => url('paymenterror'),
))->send();
if ($response->isRedirect()) {
$response->redirect(); // this will automatically forward the customer
} else {
// not successful
return $response->getMessage();
}
} catch(Exception $e) {
return $e->getMessage();
}
}
}
public function payment_success(Request $request)
{
// Once the transaction has been approved, we need to complete it.
if ($request->input('paymentId') && $request->input('PayerID'))
{
$transaction = $this->gateway->completePurchase(array(
'payer_id' => $request->input('PayerID'),
'transactionReference' => $request->input('paymentId'),
));
$response = $transaction->send();
if ($response->isSuccessful())
{
// The customer has successfully paid.
$arr_body = $response->getData();
// Insert transaction data into the database
$isPaymentExist = Payment::where('payment_id', $arr_body['id'])->first();
if(!$isPaymentExist)
{
$payment = new Payment;
$payment->payment_id = $arr_body['id'];
$payment->payer_id = $arr_body['payer']['payer_info']['payer_id'];
$payment->payer_email = $arr_body['payer']['payer_info']['email'];
$payment->amount = $arr_body['transactions'][0]['amount']['total'];
$payment->currency = env('PAYPAL_CURRENCY');
$payment->payment_status = $arr_body['state'];
$payment->save();
}
return "Payment is successful. Your transaction id is: ". $arr_body['id'];
} else {
return $response->getMessage();
}
} else {
return 'Transaction is declined';
}
}
public function payment_error()
{
return 'User is canceled the payment.';
}
}
В указанном выше контроллере мы берем сумму из HTML-формы и отправляем пользователя в PayPal для оплаты. После успешного платежа мы сохраняем все детали транзакции в таблице «платежи».
Наконец, создайте блейд-файл с именем payment.blade.php
и добавьте в него код ниже.
<form action="{{ url('charge') }}" method="post">
<input type="text" name="amount" />
{{ csrf_field() }}
<input type="submit" name="submit" value="Pay Now">
</form>
Когда мы отправляем эту форму, управление переходит к charge
функции в, PaymentController
а контроллер обрабатывает остальной поток платежей.
Отправить информацию о продукте в PayPal
На предыдущих шагах мы отправляли сумму для оплаты через PayPal. Вы также можете отправить информацию о продукте. Пользователь может увидеть эти сведения о продукте на странице оплаты до совершения платежа.
Чтобы отправить информацию о продукте, вам необходимо передать массив items в purchase
метод следующим образом.
$response = $this->gateway->purchase(array(
'amount' => $request->input('amount'),
'items' => array(
array(
'name' => 'Course Subscription',
'price' => $request->input('amount'),
'description' => 'Get access to premium courses.',
'quantity' => 1
),
),
'currency' => env('PAYPAL_CURRENCY'),
'returnUrl' => url('paymentsuccess'),
'cancelUrl' => url('paymenterror'),
))->send();
Здесь я передаю детали продукта статически. Вы должны сделать его динамичным в зависимости от вашего продукта.
Надеюсь, вы узнали об интеграции платежного шлюза PayPal в Laravel. Пожалуйста, поделитесь своими мыслями и предложениями в разделе комментариев ниже.
Статьи по Теме
- Интеграция платежного шлюза Authorize.Net в Laravel
- Интеграция платежного шлюза Stripe в Laravel
- Интеграция платежного шлюза PayKun в Laravel