You can follow this video:
https://www.youtube.com/watch?v=GVrbVXLfFzw&t
Step # 01 :
Create PayPal account:
https://developer.paypal.com/
By creating an account there will be two options as shown in the video. One is the sandbox account option and the other one is the Live account option. If you want to test or working in a development then you should create sandbox account and if you are working on a live server then you will use live option.
Now after creating new app, you can see your client id and secrect id.
Step # 02 :
Now add these above client id and secrect id in your .env file.
Step # 03 :
Now let's add a model and migration and connect to your database:
php artisan make:model Payment -m
Schema::create('payments', function (Blueprint $table) {
$table->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();
});
php artisan migrate
Step # 04 :
Now let's install a package that we are going to use to integrate PayPal api into our application:
composer require league/omnipay omnipay/paypal
Step # 05 :
Now let's make a controller :
php artisan make:controller PaymentController
This will be our controller code :
<?php
namespace App\Http\Controllers;
use App\Models\Payment;
use Illuminate\Http\Request;
use Omnipay\Omnipay;
class PaymentController extends Controller
{
private $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);
}
public function pay(Request $request)
{
try {
$response = $this->gateway->purchase(array(
'amount' => $request->amount,
'currency' => env('PAYPAL_CURRENCY'),
'returnUrl' => url('success'),
'cancelUrl' => url('error')
))->send();
if ($response->isRedirect()) {
$response->redirect();
}
else{
return $response->getMessage();
}
} catch (\Throwable $th) {
return $th->getMessage();
}
}
public function success(Request $request)
{
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()) {
$arr = $response->getData();
$payment = new Payment();
$payment->payment_id = $arr['id'];
$payment->payer_id = $arr['payer']['payer_info']['payer_id'];
$payment->payer_email = $arr['payer']['payer_info']['email'];
$payment->amount = $arr['transactions'][0]['amount']['total'];
$payment->currency = env('PAYPAL_CURRENCY');
$payment->payment_status = $arr['state'];
$payment->save();
return "Payment is Successfull. Your Transaction Id is : " . $arr['id'];
}
else{
return $response->getMessage();
}
}
else{
return 'Payment declined!!';
}
}
public function error()
{
return 'User declined the payment!';
}
}
Step # 06 :
Now let's make make routes :
Route::get('/', [HomeController::class, 'index']);
Route::post('pay', [PaymentController::class, 'pay'])->name('payment');
Route::get('success', [PaymentController::class, 'success']);
Route::get('error', [PaymentController::class, 'error']);
You are good to go, now you can easily use the route in your checkout form.
I hope it will be helpful!
Comment below if you face any issue.
Thanks!
Top comments (3)
you saved my day. thank you very much!
It works fine, I have a question, Its getting an ID only from
'transactionReference' => $request->input('paymentId')
Where can i find the product items in the
$response
?please resopnd.
Thanks.