Toady I will discuss about Paypal payment API to integrate with Laravel 5.2 . Paypal has an official payment SDK to work with PHP. Let's see how we can work with this SDK and make payment in Larvel.
- Install Paypal SDK via Composer
"require": { ..... "paypal/rest-api-sdk-php": "*" },====== You can also use this command:
composer require paypal/rest-api-sdk-php
Update your dependencies:
composer update
Now your Paypal SDK is ready to integrate in your project.
2. Configure Paypal
Add a config file for paypal: app/config/paypal.php
<?php return array( // set your paypal credential 'client_id' => 'ASd9cKHWY_XiF-aaBKmbqI0woJgz6mzjDxkssKvrCNdSbX24oPlN0f0EaeTZ0Alw6YAeu_fjw', 'secret' => 'EHsKdK-GLOI0PhIo2iXMqWepORHkCOVhgHkXniMY6JvlanQOSvyDeGPokZfwgKDpYMi0qRfZe', /** * SDK configuration */ 'settings' => array( /** * Available option 'sandbox' or 'live' */ 'mode' => 'sandbox', /** * Specify the max request time in seconds */ 'http.ConnectionTimeOut' => 300, /** * Whether want to log to a file */ 'log.LogEnabled' => true, /** * Specify the file that want to write on */ 'log.FileName' => storage_path() . '/logs/paypal.log', /** * Available option 'FINE', 'INFO', 'WARN' or 'ERROR' * * Logging is most verbose in the 'FINE' level and decreases as you * proceed towards ERROR */ 'log.LogLevel' => 'FINE' ), );
To get your client_id and secret key, login to your paypal/sandbox. Setup in app/controllers/PaypalController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use Config; use Session; use Redirect; use PayPal\Rest\ApiContext; use PayPal\Auth\OAuthTokenCredential; use PayPal\Api\Amount; use PayPal\Api\Details; use PayPal\Api\Item; use PayPal\Api\ItemList; use PayPal\Api\Payer; use PayPal\Api\Payment; use PayPal\Api\RedirectUrls; use PayPal\Api\ExecutePayment; use PayPal\Api\PaymentExecution; use PayPal\Api\Transaction; class PaypalController extends BaseController { private $_api_context; public function __construct() { // setup PayPal api context $paypal_conf = Config::get('paypal'); $this->_api_context = new ApiContext(new OAuthTokenCredential($paypal_conf['client_id'], $paypal_conf['secret'])); $this->_api_context->setConfig($paypal_conf['settings']); } }
3.Add two routes for processing Paypal checkout
// Payment routes
Route::get('payment', array(
'as' => 'payment',
'uses' => 'PaypalController@postPayment',
));
// this is after make the payment, PayPal redirect back to your site
Route::get('payment/status', array(
'as' => 'payment.status',
'uses' => 'PaypalController@getPaymentStatus',
));
Update the controller file and add this method for submitting the form or checkout shopping cart: app/controllers/PaypalController.php
public function postPayment()
{
$payer = new Payer();
$payer->setPaymentMethod('paypal');
$item_1 = new Item();
$item_1->setName('Item 1') // item name
->setCurrency('AUD')
->setQuantity(1)
->setPrice('150'); // unit price
$item_2 = new Item();
$item_2->setName('Item 2')
->setCurrency('AUD')
->setQuantity(2)
->setPrice('10');
// add item to list
$item_list = new ItemList();
$item_list->setItems(array($item_1, $item_2));
$amount = new Amount();
$amount->setCurrency('AUD')
->setTotal(170);
$transaction = new Transaction();
$transaction->setAmount($amount)
->setItemList($item_list)
->setDescription('description');
$redirect_urls = new RedirectUrls();
$redirect_urls->setReturnUrl(route('payment.status')) // Specify return URL
->setCancelUrl(route('payment.status'));
$payment = new Payment();
$payment->setIntent('Sale')
->setPayer($payer)
->setRedirectUrls($redirect_urls)
->setTransactions(array($transaction));
try {
$payment->create($this->_api_context);
} catch (\PayPal\Exception\PPConnectionException $ex) {
if (\Config::get('app.debug')) {
echo "Exception: " . $ex->getMessage() . PHP_EOL;
$err_data = json_decode($ex->getData(), true);
exit;
} else {
die('Some error occur, sorry for inconvenient');
}
}
foreach($payment->getLinks() as $link) {
if($link->getRel() == 'approval_url') {
$redirect_url = $link->getHref();
break;
}
}
// add payment ID to session
Session::put('paypal_payment_id', $payment->getId());
if(isset($redirect_url)) {
// redirect to paypal
return redirect($redirect_url);
}
return redirect()->route('home')
->with('error', 'Unknown error occurred');
}
Add this Method for post checkout option with payment status
public function getPaymentStatus(Request $request)
{
// Get the payment ID before session clear
$payment_id = Session::get('paypal_payment_id');
// clear the session payment ID
Session::forget('paypal_payment_id');
if(empty($request->input('PayerID')) || empty($request->input('token'))){
return redirect()->route('home')->with('info', 'Payment failed');
}
$payment = Payment::get($payment_id, $this->_api_context);
// PaymentExecution object includes information necessary
// to execute a PayPal account payment.
// The payer_id is added to the request query parameters
// when the user is redirected from paypal back to your site
$execution = new PaymentExecution();
$execution->setPayerId($request->input('PayerID'));
//Execute the payment
$result = $payment->execute($execution, $this->_api_context);
if ($result->getState() == 'approved') { // payment made
dd($result); // Use this data to work as you need
// return Redirect::route('home')
// ->with('info', 'Payment success');
}
return Redirect::route('home')
->with('info', 'Payment failed');
}
You can get this code on Github. Click here. If you have any question, please comment bellow.

No comments:
Post a Comment