Как интегрировать платежный шлюз PayPal в Laravel

Приветствуем любителей Laravel, добро пожаловать на сайт web-icon.com.ua. Здесь, в этом посте, я расскажу вам, как интегрировать платежный шлюз PayPal в Laravel.

Настройка PayPal в приложении

Сначала я установлю SDK PayPal с помощью composer.

composer require paypal/rest-api-sdk-php

Перейдите на сайт https://developer.paypal.com, чтобы создать учетную запись продавца, для того чтобы переводить или принимать средства на свой счет.Затем мне нужно войти в режим разработчика PayPal, создать новую учетную запись sandbox и получить некоторые ключи, такие как client_id и ключ для тестирования этой интеграции.

Вы также можете создать учетную запись покупателя, чтобы купить что-то у какого-то продавца.

Я создал как торговые, так и покупательские тестовые счета.

Вам нужно будет создать новое приложение, чтобы получить client_id и секретные ключи.

После создания приложения увидите client_id и секретные ключи.

Скопируйте их и вставьте их в свой файл .env для обеспечения безопасности.

PAYPAL_CLIENT_ID=
PAYPAL_SECRET=
PAYPAL_MODE=sandbox

Затем я создам новый файл paypal.php в каталоге \config.

Поместите следующий код в файл

env('PAYPAL_CLIENT_ID',''),

    'secret' => env('PAYPAL_SECRET',''),

    'settings' => array(

        'mode' => env('PAYPAL_MODE','sandbox'),

        'http.ConnectionTimeOut' => 30,

        'log.LogEnabled' => true,

        'log.FileName' => storage_path() . '/logs/paypal.log',

        'log.LogLevel' => 'ERROR'

    ),

];

 

Форма оплаты PayPal

Вы можете добавить любую форму, какую хотите, для демонстрационных целей, у меня есть только одно поле для ввода, чтобы ввести сумму и кнопка, чтобы отправить форму.

 

PayPal Payment Controller

Я создам новый контроллер для управления всеми материалами PHP, связанными с PayPal.

Вышеупомянутая команда создаст новый контроллер в /app/http/Controllers с именем PaymentController

Сначала я инициализирую конфигурацию и настройки PayPal в функции _construct.

public function __construct()
    {
        /** PayPal api context **/

        $paypal_conf = \Config::get('paypal');

        $this->_api_context = new ApiContext(new OAuthTokenCredential(

            $paypal_conf['client_id'],

            $paypal_conf['secret'])

        );

        $this->_api_context->setConfig($paypal_conf['settings']);

     }

Итак, теперь, когда какая-то сумма вводится в форму и при нажатии кнопки «Оплатить с помощью PayPal» выполняется следующая функциональность: 

public function payWithpaypal(Request $request)
    {
        $payer = new Payer();
        $payer->setPaymentMethod('paypal');
        $item_1 = new Item();
        $item_1->setName('Item 1') /** item name **/
            ->setCurrency('USD')
            ->setQuantity(1)
            ->setPrice($request->get('amount')); /** unit price **/
        $item_list = new ItemList();
        $item_list->setItems(array($item_1));
        $amount = new Amount();
        $amount->setCurrency('USD')
            ->setTotal($request->get('amount'));
        $transaction = new Transaction();
        $transaction->setAmount($amount)
            ->setItemList($item_list)
            ->setDescription('Your transaction description');
        $redirect_urls = new RedirectUrls();
        $redirect_urls->setReturnUrl(URL::route('status')) /** Specify return URL **/
            ->setCancelUrl(URL::route('status'));
        $payment = new Payment();
        $payment->setIntent('Sale')
            ->setPayer($payer)
            ->setRedirectUrls($redirect_urls)
            ->setTransactions(array($transaction));
        /** dd($payment->create($this->_api_context));exit; **/
        try {
            $payment->create($this->_api_context);

        } catch (\PayPal\Exception\PPConnectionException $ex) {

            if (\Config::get('app.debug')) {
                \Session::put('error', 'Connection timeout');
                return Redirect::route('paywithpaypal');
            } else {
                \Session::put('error', 'Some error occur, sorry for inconvenient');
                return Redirect::route('paywithpaypal');
            }
        }
        foreach ($payment->getLinks() as $link) {
            if ($link->getRel() == 'approval_url') {
                $redirect_url = $link->getHref();
                break;
            }
        }
        /** add payment ID to session **/
        Session::put('paypal_payment_id', $payment->getId());
        if (isset($redirect_url)) {
            /** redirect to paypal **/
            return Redirect::away($redirect_url);
        }
        \Session::put('error', 'Unknown error occurred');
        return Redirect::route('paywithpaypal');
    }

В приведенной выше функции терминология типа Payer, Item - все из SDK PayPal, поэтому позвольте мне объяснить эти термины из официальной документации PayPal.

Payer

Ресурс, представляющий Плательщика, который проводит платеж. Для платежей по счету PayPal задайте способ оплаты «paypal».

$payer = new Payer();

$payer->setPaymentMethod("paypal");

 

Item

Информация о товаре (необязательно) Позволяет указать информацию,

$item_1 = new Item();

        $item_1->setName('Item 1') /** item name **/
            ->setCurrency('USD')
            ->setQuantity(1)
            ->setPrice($request->get('amount')); /** unit price **/

        $item_list = new ItemList();

        $item_list->setItems(array($item_1));

 

Amount Сумма

Позволяет указать сумму платежа. Вы также можете указать дополнительные данные, такие как доставка, налог.

$amount = new Amount();

    $amount->setCurrency('USD')

        ->setTotal($request->get('amount'));

 

Transaction Сделка

Сделка определяет договор платежа - за что платеж и кто его выполняет.

$transaction = new Transaction();

    $transaction->setAmount($amount)
        ->setItemList($item_list)
        ->setDescription('Your transaction description');

 

RedirectUrls Перенаправление URL-адресов

Укажите URL-адреса, на которые покупатель должен пере направиться после утверждения / отмены платежа.

$redirect_urls = new RedirectUrls();

    $redirect_urls->setReturnUrl(URL::route('status')) /** Specify return URL **/
        ->set

 

Payment Оплата

Ресурс оплаты; создайте один, используя вышеуказанные типы и намерения, установленные для «продажи»,

$payment = new Payment();

    $payment->setIntent('Sale')
        ->setPayer($payer)
        ->setRedirectUrls($redirect_urls)
        ->setTransactions(array($transaction));

 

create() Создать платеж

Создайте платеж, вызвав метод «create», передав ему действительный apiContext. (см. Bootstrap.php для получения дополнительной информации об ApiContext). Объект возврата содержит состояние и URL-адрес, на который покупатель должен быть перенаправлен для утверждения платежа

$payment->create($this->_api_context);

 

getPaymentStatus() Статус оплаты PayPal

После того, как платеж сделан, мы должны сообщить пользователю, является ли платеж успешным или нет. После обработки платежа выполняется следующая функциональность.

public function getPaymentStatus()
    {
        /** Get the payment ID before session clear **/
        $payment_id = Session::get('paypal_payment_id');

        /** clear the session payment ID **/
        Session::forget('paypal_payment_id');

        if (empty(Input::get('PayerID')) || empty(Input::get('token'))) {

            \Session::put('error', 'Payment failed');
            return Redirect::route('/');
        }
        $payment = Payment::get($payment_id, $this->_api_context);
        $execution = new PaymentExecution();
        $execution->setPayerId(Input::get('PayerID'));

        /**Execute the payment **/
        $result = $payment->execute($execution, $this->_api_context);

        if ($result->getState() == 'approved') {

            \Session::put('success', 'Payment success');
            return Redirect::route('/');

        }

        \Session::put('error', 'Payment failed');
        return Redirect::route('/');

    }

 

Статус одобрения

Определите, одобрил ли пользователь платеж или нет.

if (isset ($ _ GET ['success']) && $ _GET ['success'] == 'true') {

Получите объект платежа, отправив идентификатор платежа. Идентификатор платежа был ранее сохранен в сеансе.

$payment = Payment::get($payment_id, $this->_api_context);

 

Выполнение платежа

Объект PaymentExecution включает информацию, необходимую для оплаты PayPal. Плательщик добавляет к параметрам запроса запрос, когда пользователь перенаправляется с PayPal обратно на ваш сайт.

 $execution = new PaymentExecution();

    $execution->setPayerId(Input::get('PayerID'));

    /**Execute the payment **/

    $result = $payment->execute($execution, $this->_api_context);

 

И, наконец, если результат платежа будет успешным, я покажу сообщение об успешном завершении или сообщение об ошибке, если платеж не удастся.

if ($result->getState() == 'approved') {

        \Session::put('success', 'Payment success');

        return Redirect::route('/');

    }

    \Session::put('error', 'Payment failed');

    return Redirect::route('/');

 

Cохраню сообщения в сеансе и покажу их в представлении.

На этом все, спасибо за внимание! Если есть вопросы по платежному шлюзу PayPal, с радостью отвечу в комментариях.

visibility 415 май 2018
php
share

Обсуждение

Похожие статьи

Как перенести WordPress на новый домен?

Приветствую тебя, дорогой читатель. Сегодня мы решили разместить краткое руководство по переносу Ваш...

visibility 201
insert_comment 0
share

Добавляем на сайт лайки Вконтакте, Facebook, Google+ и кнопку Твитнуть

Инструкция по установки на свой сайт кнопок like от популярных социальных сетей. Обычно все пользов...

visibility 238
insert_comment 0
share

Сборщики проектов Gulp и Grunt

Обзор сборщиков проектов Gulp и Grunt, преимущества, плагины, что выбрать лучше?

visibility 231
insert_comment 0
share
send