WEB и WordPress новости, темы, плагины. Здесь мы делимся советами и лучшими решениями для сайтов.

Интеграция платежного шлюза PayPal в Laravel

620

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

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

Перейдите в свою учетную запись разработчика PayPal и войдите в нее. На панели инструментов разработчика щелкните меню «Мои приложения и учетные данные». Затем нажмите кнопку «Создать приложение» в разделе приложений REST API.

Следуйте инструкциям по подсказке, и вы получите свою песочницу и действующие учетные данные. А пока скопируйте идентификатор клиента и секрет клиента режима песочницы.

Интеграция платежного шлюза 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

Я перешел в валюту «доллар США». Пользователь может изменить его в соответствии с требованиями.

Определим маршруты, которые нам понадобятся в следующих шагах.

маршруты / 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 для улучшения вашего опыта. Мы предполагаем, что вы согласны с этим, но вы можете отказаться, если хотите. Принимаю Подробнее