Інтеграція платіжного шлюзу PayPal у Laravel
Нещодавно я опублікував статтю про інтеграцію PayPal Payment Gateway у PHP. У цій статті один із наших читачів запитав про інтеграцію платіжного шлюзу PayPal у Laravel. Хоча Laravel побудований з використанням PHP, вони мають свої власні стандарти, яких слід дотримуватися. Ви повинні налаштувати свій звичайний PHP-код відповідно до потоку Laravel. У цій статті я покажу вам, як приймати оплату на вашому веб-сайті Laravel за допомогою API PayPal Rest.
PayPal – одна з найбільш надійних торгових марок, яка приймає онлайн-платежі. PayPal пропонує різні способи інтеграції своєї платіжної системи у веб-додатки. Однією з послуг є PayPal Rest API, який ми використаємо для цього підручника. Для початку вам спочатку потрібно взяти ідентифікатор клієнта та секрет клієнта.
Перейдіть до свого облікового запису розробника PayPal і ввійдіть у нього. На інформаційній панелі розробника натисніть меню «Мої програми та облікові дані». Потім натисніть кнопку "Створити додаток" у розділі REST API apps.
Дотримуйтесь вказівок, і ви отримаєте свою пісочницю та діючі облікові дані. Наразі скопіюйте ідентифікатор клієнта та секрет клієнта режиму пісочниці.
Базове налаштування в 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
Я перевів валюту "USD". Користувач може змінити його відповідно до вимог.
Давайте визначимо маршрути, які нам знадобляться на наступних кроках.
routes / 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
- Інтеграція шлюзового платіжного шлюзу в Laravel
- Інтеграція PayKun Payment Gateway у Laravel