Integrazione del gateway di pagamento PayPal in Laravel
Recentemente ho pubblicato un articolo sull’integrazione del gateway di pagamento PayPal in PHP. In quell’articolo, uno dei nostri lettori ha chiesto di integrare il gateway di pagamento PayPal in Laravel. Sebbene Laravel sia costruito utilizzando PHP, hanno i propri standard da seguire. Devi modificare il tuo semplice codice PHP secondo il flusso di Laravel. In questo articolo, ti mostro come accettare pagamenti sul tuo sito web Laravel utilizzando PayPal Rest API.
PayPal è uno dei marchi più affidabili per accettare pagamenti online. PayPal offre diversi modi per integrare il proprio sistema di pagamento nelle applicazioni web. Uno dei servizi è PayPal Rest API che utilizzeremo per questo tutorial. Per iniziare, devi prima prendere il tuo ID cliente e il tuo segreto cliente.
Vai al tuo account sviluppatore PayPal e accedi ad esso. Nella dashboard dello sviluppatore, fai clic sul menu "Le mie app e credenziali". Quindi fare clic sul pulsante "Crea app" nella sezione delle app dell’API REST.
Segui i passaggi come richiesto e otterrai la sandbox e le credenziali live. Per ora, copia l’ID client e il segreto client della modalità sandbox.
Configurazione di base in Laravel per accettare pagamenti tramite PayPal
Quando i clienti effettuano il pagamento sul tuo sito web, devi memorizzare i dettagli di pagamento per un uso successivo. Crea una tabella "pagamenti" nel database per memorizzare i dettagli del pagamento. Crea una migrazione per la tabella "pagamenti" utilizzando il comando:
php artisan make:migration create_payments_table
Aprire il file di migrazione e modificare le colonne come segue.
<?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();
});
}
Eseguire la migrazione precedente utilizzando il comando seguente.
php artisan migrate
Questo comando creerà una tabella "pagamenti" nel tuo database. Quindi, crea un modello corrispondente alla tabella "pagamenti".
php artisan make:model Payment
Successivamente, aggiungi le credenziali PayPal nel tuo .env
file.
PAYPAL_CLIENT_ID=PASTE_HERE_CLIENT_ID
PAYPAL_CLIENT_SECRET=PASTE_HERE_CLIENT_SECRET
PAYPAL_CURRENCY=USD
Svuota la cache di configurazione usando il comando:
php artisan config:cache
Ho superato la valuta "USD". L’utente può modificarlo secondo i requisiti.
Definiamo i percorsi di cui avremo bisogno nei prossimi passi.
route/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');
Integrazione del gateway di pagamento PayPal in Laravel
L’integrazione dell’API dei gateway di pagamento nell’applicazione è una cosa piuttosto complessa. Fortunatamente, la libreria Omnipay ha semplificato la vita degli sviluppatori. Omnipay è la libreria di elaborazione dei pagamenti più popolare per PHP. Fornisce un codice semplice e pulito per l’integrazione di diversi gateway di pagamento. Installa la libreria Omnipay usando il comando:
composer require league/omnipay omnipay/paypal
Ora, crea un controller PaymentController
e definisci i metodi menzionati nel file di route.
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.';
}
}
Nel controller sopra, prendiamo l’importo dal modulo HTML e inviamo un utente a PayPal per il pagamento. Se il pagamento è andato a buon fine, memorizziamo tutti i dettagli della transazione nella tabella "pagamenti".
Infine, crea un file blade chiamato payment.blade.php
e aggiungi il codice di seguito.
<form action="{{ url('charge') }}" method="post">
<input type="text" name="amount" />
{{ csrf_field() }}
<input type="submit" name="submit" value="Pay Now">
</form>
Quando inviamo questo modulo, il controllo va alla charge
funzione PaymentController
e il controller elabora il flusso di pagamento rimanente.
Invia le informazioni sul prodotto a PayPal
Nei passaggi precedenti, stiamo inviando l’importo da pagare su PayPal. Potresti anche voler inviare informazioni sul prodotto. L’utente può vedere questi dettagli del prodotto nella pagina di pagamento prima di effettuare un pagamento.
Per inviare le informazioni sul prodotto, è necessario passare l’array "items" al purchase
metodo come segue.
$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();
Qui sto passando i dettagli del prodotto in modo statico. Dovresti renderlo dinamico a seconda del tuo prodotto.
Spero che tu sappia dell’integrazione del gateway di pagamento PayPal in Laravel. Per favore condividi i tuoi pensieri e suggerimenti nella sezione commenti qui sotto.
articoli Correlati
- Integrazione del gateway di pagamento Authorize.Net in Laravel
- Integrazione del gateway di pagamento Stripe in Laravel
- Integrazione del gateway di pagamento PayKun in Laravel