...
✅ WEB і WordPress новини, теми, плагіни. Тут ми ділимося порадами і кращими рішеннями для сайтів.

Інтеграція платіжного шлюзу PayPal у Laravel

29

Нещодавно я опублікував статтю про інтеграцію PayPal Payment Gateway у PHP. У цій статті один із наших читачів запитав про інтеграцію платіжного шлюзу PayPal у Laravel. Хоча Laravel побудований з використанням PHP, вони мають свої власні стандарти, яких слід дотримуватися. Ви повинні налаштувати свій звичайний PHP-код відповідно до потоку Laravel. У цій статті я покажу вам, як приймати оплату на вашому веб-сайті Laravel за допомогою API PayPal Rest.

PayPal – одна з найбільш надійних торгових марок, яка приймає онлайн-платежі. PayPal пропонує різні способи інтеграції своєї платіжної системи у веб-додатки. Однією з послуг є PayPal Rest API, який ми використаємо для цього підручника. Для початку вам спочатку потрібно взяти ідентифікатор клієнта та секрет клієнта.

Перейдіть до свого облікового запису розробника PayPal і ввійдіть у нього. На інформаційній панелі розробника натисніть меню «Мої програми та облікові дані». Потім натисніть кнопку "Створити додаток" у розділі REST API apps.

Дотримуйтесь вказівок, і ви отримаєте свою пісочницю та діючі облікові дані. Наразі скопіюйте ідентифікатор клієнта та секрет клієнта режиму пісочниці.

Інтеграція платіжного шлюзу PayPal у Laravel

Базове налаштування в 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. Будь ласка, поділіться своїми думками та пропозиціями в розділі коментарів нижче.

Пов’язані статті

Джерело запису: artisansweb.net

Цей веб -сайт використовує файли cookie, щоб покращити ваш досвід. Ми припустимо, що з цим все гаразд, але ви можете відмовитися, якщо захочете. Прийняти Читати далі