✅ Nowości, motywy, wtyczki WEB i WordPress. Tutaj dzielimy się wskazówkami i najlepszymi rozwiązaniami dla stron internetowych.

Integracja bramki płatności PayPal w Laravel

139

Niedawno opublikowałem artykuł na temat integracji PayPal Payment Gateway w PHP. W tym artykule jeden z naszych czytelników zapytał o integrację bramki płatności PayPal w Laravel. Chociaż Laravel jest zbudowany przy użyciu PHP, ma własne standardy, których należy przestrzegać. Musisz dostosować swój zwykły kod PHP zgodnie z przepływem Laravel. W tym artykule pokażę Ci, jak zaakceptować płatności na swojej stronie Laravel za pomocą PayPal Rest API.

PayPal to jedna z najbardziej zaufanych marek akceptujących płatności online. PayPal udostępnia różne sposoby integracji swojego systemu płatności z aplikacjami internetowymi. Jedną z usług jest PayPal Rest API, którego użyjemy w tym samouczku. Aby rozpocząć, musisz najpierw pobrać identyfikator klienta i klucz klienta.

Przejdź do swojego konta programisty PayPal i zaloguj się do niego. W panelu programisty kliknij menu „Moje aplikacje i dane logowania". Następnie kliknij przycisk „Utwórz aplikację” w sekcji Aplikacje REST API.

Postępuj zgodnie z instrukcjami, aby uzyskać dostęp do piaskownicy i poświadczeń na żywo. Na razie skopiuj identyfikator klienta i klucz klienta trybu piaskownicy.

Integracja bramki płatności PayPal w Laravel

Podstawowa konfiguracja w Laravel do akceptowania płatności przez PayPal

Kiedy klienci dokonują płatności w Twojej witrynie, musisz przechowywać szczegóły płatności do późniejszego wykorzystania. Utwórz tabelę „płatności” w bazie danych, aby przechowywać szczegóły płatności. Utwórz migrację dla tabeli „płatności” za pomocą polecenia:

php artisan make:migration create_payments_table

Otwórz plik migracji i zmodyfikuj kolumny w następujący sposób.

<?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();
    });
}

Wykonaj powyższą migrację za pomocą poniższego polecenia.

php artisan migrate

To polecenie utworzy w Twojej bazie danych tabelę „płatności”. Następnie utwórz model odpowiadający tabeli „płatności”.

php artisan make:model Payment

Następnie dodaj poświadczenia PayPal w swoim .envpliku.

PAYPAL_CLIENT_ID=PASTE_HERE_CLIENT_ID
PAYPAL_CLIENT_SECRET=PASTE_HERE_CLIENT_SECRET
PAYPAL_CURRENCY=USD

Wyczyść pamięć podręczną konfiguracji za pomocą polecenia:

php artisan config:cache

Przekazałem walutę „USD”. Użytkownik może to zmienić zgodnie z wymaganiami.

Zdefiniujmy trasy, których będziemy potrzebować w kolejnych krokach.

trasy/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');

Integracja bramki płatności PayPal w Laravel

Zintegrowanie API bramek płatności w aplikacji to dość skomplikowana sprawa. Na szczęście biblioteka Omnipay ułatwiła życie programistom. Omnipay to najpopularniejsza biblioteka przetwarzania płatności dla PHP. Daje łatwy i czysty kod do integracji różnych bramek płatności. Zainstaluj bibliotekę Omnipay za pomocą polecenia:

composer require league/omnipay omnipay/paypal

Teraz utwórz kontroler PaymentControlleri zdefiniuj metody wymienione w pliku trasy.

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.';
    }
  
}

W powyższym kontrolerze pobieramy kwotę z formularza HTML i wysyłamy użytkownika do PayPal do zapłaty. Po pomyślnej płatności przechowujemy wszystkie szczegóły transakcji w tabeli „płatności”.

Na koniec utwórz plik blade o nazwie payment.blade.phpi dodaj w nim poniższy kod.

<form action="{{ url('charge') }}" method="post">
    <input type="text" name="amount" />
    {{ csrf_field() }}
    <input type="submit" name="submit" value="Pay Now">
</form>

Kiedy prześlemy ten formularz, kontrola przechodzi do chargefunkcji w PaymentControlleri kontroler przetwarza resztę przepływu płatności.

Wyślij informacje o produkcie do PayPal

W poprzednich krokach wysyłamy kwotę do zapłaty na PayPal. Możesz również wysłać informacje o produkcie. Użytkownik może zobaczyć te szczegóły produktu na stronie płatności przed dokonaniem płatności.

Aby wysłać informacje o produkcie, musisz przekazać tablicę ‘items’ do purchasemetody w następujący sposób.

$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();

Tutaj przekazuję statycznie szczegóły produktu. Powinieneś nadać mu dynamikę w zależności od produktu.

Mam nadzieję, że dowiedziałeś się o integracji bramki płatności PayPal w Laravel. Podziel się swoimi przemyśleniami i sugestiami w sekcji komentarzy poniżej.

Powiązane artykuły

Źródło nagrywania: artisansweb.net

Ta strona korzysta z plików cookie, aby poprawić Twoje wrażenia. Zakładamy, że nie masz nic przeciwko, ale możesz zrezygnować, jeśli chcesz. Akceptuję Więcej szczegółów