Integração de gateway de pagamento PayPal no Laravel
Recentemente publiquei um artigo sobre Integração de gateway de pagamento PayPal em PHP. Nesse artigo, um de nossos leitores perguntou sobre a integração do gateway de pagamento PayPal no Laravel. Embora o Laravel seja construído usando PHP, eles têm seus próprios padrões a seguir. Você tem que ajustar seu código PHP simples de acordo com o fluxo do Laravel. Neste artigo, mostrarei como aceitar pagamento em seu site Laravel usando a API Rest do PayPal.
PayPal é uma das marcas mais confiáveis para aceitar pagamentos online. O PayPal oferece diferentes maneiras de integrar seu sistema de pagamento em aplicativos da web. Um dos serviços é o PayPal Rest API, que usaremos neste tutorial. Para começar, primeiro você precisa obter seu ID e segredo do cliente.
Vá para sua conta de desenvolvedor do PayPal e faça login nela. No painel do desenvolvedor, clique no menu ‘Meus aplicativos e credenciais’. Em seguida, clique no botão ‘Criar aplicativo’ na seção de aplicativos da API REST.
Siga as etapas conforme solicitado e você obterá sua sandbox e credenciais ao vivo. Por enquanto, copie o ID do cliente e o segredo do cliente do modo sandbox.
Configuração básica no Laravel para aceitar pagamento usando PayPal
Quando os clientes fazem o pagamento em seu site, você precisa armazenar os detalhes do pagamento para uso posterior. Crie uma tabela de ‘pagamentos’ no banco de dados para armazenar os detalhes do pagamento. Crie uma migração para a tabela de ‘pagamentos’ usando o comando:
php artisan make:migration create_payments_table
Abra o arquivo de migração e modifique as colunas conforme a seguir.
<?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();
});
}
Execute a migração acima usando o comando abaixo.
php artisan migrate
Este comando criará uma tabela de ‘pagamentos’ em seu banco de dados. A seguir, crie um modelo correspondente à tabela de ‘pagamentos’.
php artisan make:model Payment
Depois disso, adicione as credenciais do PayPal em seu .env
arquivo.
PAYPAL_CLIENT_ID=PASTE_HERE_CLIENT_ID
PAYPAL_CLIENT_SECRET=PASTE_HERE_CLIENT_SECRET
PAYPAL_CURRENCY=USD
Limpe o cache de configuração usando o comando:
php artisan config:cache
Eu passei a moeda ‘USD’. O usuário pode alterá-lo de acordo com os requisitos.
Vamos definir as rotas que vamos exigir nas próximas etapas.
rotas / 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');
Integração de gateway de pagamento PayPal no Laravel
Integrar a API de gateways de pagamento no aplicativo é algo bastante complexo. Felizmente, a biblioteca Omnipay facilitou a vida do desenvolvedor. Omnipay é a biblioteca de processamento de pagamentos mais popular para PHP. Ele fornece um código fácil e limpo para a integração de diferentes gateways de pagamento. Instale a biblioteca Omnipay usando o comando:
composer require league/omnipay omnipay/paypal
Agora, crie um controlador PaymentController
e defina os métodos mencionados no arquivo de rota.
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.';
}
}
No controlador acima, pegamos o valor do formulário HTML e enviamos um usuário ao PayPal para pagamento. No pagamento bem-sucedido, armazenamos todos os detalhes da transação na tabela de ‘pagamentos’.
Finalmente, crie um arquivo blade chamado payment.blade.php
e adicione o código abaixo nele.
<form action="{{ url('charge') }}" method="post">
<input type="text" name="amount" />
{{ csrf_field() }}
<input type="submit" name="submit" value="Pay Now">
</form>
Quando enviamos este formulário, o controle vai para a charge
função no PaymentController
e o controlador processa o fluxo de pagamento restante.
Envie informações do produto para o PayPal
Nas etapas anteriores, estamos enviando o valor a pagar no PayPal. Você também pode enviar informações sobre o produto. O usuário pode ver os detalhes desses produtos na página de pagamento antes de fazer um pagamento.
Para enviar as informações do produto, você precisa passar a matriz ‘itens’ para o purchase
método a seguir.
$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();
Aqui estou passando os detalhes do produto estaticamente. Você deve torná-lo dinâmico dependendo do seu produto.
Espero que você conheça a integração do gateway de pagamento PayPal no Laravel. Por favor, compartilhe seus pensamentos e sugestões na seção de comentários abaixo.
Artigos relacionados
- Authorize.Net Payment Gateway Integração no Laravel
- Integração do Stripe Payment Gateway no Laravel
- Integração de gateway de pagamento PayKun no Laravel