Integracja bramki płatności PayPal w Laravel
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.
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 .env
pliku.
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 PaymentController
i 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.php
i 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 charge
funkcji w PaymentController
i 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 purchase
metody 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
- Integracja bramki płatności Authorize.Net w Laravel
- Integracja Stripe Payment Gateway w Laravel
- Integracja PayKun Payment Gateway w Laravel