Laravel PayPal
Fork
This is a fork of Srmklive/laravel-paypal. The plan is to make it more enhanced and agile., (*1)
- Introduction
- Installation
- Configuration
-
Usage
- [Express Checkout] (#usage-express-checkout)
- [SetExpressCheckout] (#usage-ec-setexpresscheckout)
- [GetExpressCheckoutDetails] (#usage-ec-getexpresscheckoutdetails)
- [DoExpressCheckoutPayment] (#usage-ec-doexpresscheckoutpayment)
- [RefundTransaction] (#usage-ec-refundtransaction)
- [CreateBillingAgreement] (#usage-ec-createbillingagreement)
- [CreateRecurringPaymentsProfile] (#usage-ec-createrecurringprofile)
- [GetRecurringPaymentsProfileDetails] (#usage-ec-getrecurringprofiledetails)
- [UpdateRecurringPaymentsProfile] (#usage-ec-updaterecurringprofile)
- [ManageRecurringPaymentsProfileStatus] (#usage-ec-managerecurringprofile)
- [Adaptive Payments] (#usage-adaptive-payments)
- Handling PayPal IPN
- Support
, (*2)
Introduction
Laravel plugin For Processing Payments Through Paypal. Using this plugin you can process or refund payments and handle IPN (Instant Payment Notification) from PayPal in your Laravel application., (*3)
Currently only PayPal Express Checkout, Adaptive Payments API & In-Context Checkout Is Supported., (*4)
, (*5)
Installation
- Use following command to install:
composer require saleemepoch/paypal
- Add the service provider to your $providers array in config/app.php file like:
'saleemepoch\PayPal\Providers\PayPalServiceProvider' // Laravel 5
saleemepoch\PayPal\Providers\PayPalServiceProvider::class // Laravel 5.1 or greater
* Add the alias to your $aliases array in config/app.php file like:
'PayPal' => 'saleemepoch\PayPal\Facades\PayPal' // Laravel 5
'PayPal' => saleemepoch\PayPal\Facades\PayPal::class // Laravel 5.1 or greater
- Run the following command to publish configuration:
php artisan vendor:publish
Configuration
- After installation, you will need to add your paypal settings. Following is the code you will find in config/paypal.php, which you should update accordingly.
return [
'mode' => 'sandbox', // Can only be 'sandbox' Or 'live'. If empty or invalid, 'live' will be used.
'sandbox' => [
'username' => '',
'password' => '',
'secret' => '',
'certificate' => '',
/*
If using In-Context Checkout uncomment the following line. Otherwise,
leave it commented and it will use the default gateway: https://www.sandbox.paypal.com
*/
//'gateway_url' => 'https://www.sandbox.paypal.com/checkoutnow/',
],
'live' => [
'username' => '',
'password' => '',
'secret' => '',
'certificate' => '',
/*
If using In-Context Checkout uncomment the following line. Otherwise,
leave it commented and it will use the default gateway: https://www.sandbox.paypal.com
*/
//'gateway_url' => 'https://www.paypal.com/checkoutnow/',
],
'payment_action' => 'Sale', // Can Only Be 'Sale', 'Authorization', 'Order'
'currency' => 'USD',
'notify_url' => '', // Change this accordingly for your application.
];
In-Context Checkout
Apart from changing the gateway (as mentioned above), remember to also include required JS without which In-Context wouldn't work., (*6)
Clic here for more info: https://developer.paypal.com/docs/classic/express-checkout/in-context/integration/, (*7)
Usage
PayPal::setProvider('express_checkout'); // To use PayPal Express Checkout API (Used by default)
PayPal::setProvider('adaptive_payments'); // To use PayPal Adaptive Payments API
, (*8)
Express Checkout
$data = [];
$data['items'] = [
[
'name' => 'Product 1',
'price' => 9.99
],
[
'name' => 'Product 2',
'price' => 4.99
]
];
$data['invoice_id'] = 1;
$data['invoice_description'] = "Order #$data[invoice_id] Invoice";
$data['return_url'] = url('/payment/success');
$data['cancel_url'] = url('/cart');
$total = 0;
foreach($data['items'] as $item) {
$total += $item['price'];
}
$data['total'] = $total;
* SetExpressCheckout, (*9)
```
$response = PayPal::getProvider()->setExpressCheckout($data);
// Use the following line when creating recurring payment profiles (subscriptions)
$response = PayPal::getProvider()->setExpressCheckout($data, true);
// This will redirect user to PayPal
return redirect($response['paypal_link']);
```
* GetExpressCheckoutDetails, (*10)
```
$response = PayPal::getProvider()->getExpressCheckoutDetails($token);
```
* DoExpressCheckoutPayment, (*11)
```
// Note that 'token', 'PayerID' are values returned by PayPal when it redirects to success page after successful verification of user's PayPal info.
$response = PayPal::getProvider()->doExpressCheckoutPayment($data, $token, $PayerID);
```
* RefundTransaction, (*12)
```
$response = PayPal::getProvider()->refundTransaction($transactionid);
```
* CreateBillingAgreement, (*13)
```
// The $token is the value returned from SetExpressCheckout API call
$response = PayPal::getProvider()->createBillingAgreement($token);
```
* CreateRecurringPaymentsProfile, (*14)
```
// The $token is the value returned from SetExpressCheckout API call
$startdate = Carbon::now()->toAtomString();
$profile_desc = !empty($data['subscription_desc']) ?
$data['subscription_desc'] : $data['invoice_description'];
$data = [
'PROFILESTARTDATE' => $startdate,
'DESC' => $profile_desc,
'BILLINGPERIOD' => 'Month', // Can be 'Day', 'Week', 'SemiMonth', 'Month', 'Year'
'BILLINGFREQUENCY' => 12, // set 12 for monthly, 52 for yearly
'AMT' => 10, // Billing amount for each billing cycle
'CURRENCYCODE' => 'USD', // Currency code
'TRIALBILLINGPERIOD' => 'Day', // (Optional) Can be 'Day', 'Week', 'SemiMonth', 'Month', 'Year'
'TRIALBILLINGFREQUENCY' => 10, // (Optional) set 12 for monthly, 52 for yearly
'TRIALTOTALBILLINGCYCLES' => 1, // (Optional) Change it accordingly
'TRIALAMT' => 0, // (Optional) Change it accordingly
];
$response = PayPal::getProvider()->createRecurringPaymentsProfile($data, $token);
```
* GetRecurringPaymentsProfileDetails, (*15)
```
$response = PayPal::getProvider()->getRecurringPaymentsProfileDetails($profileid);
```
* UpdateRecurringPaymentsProfile, (*16)
```
$response = PayPal::getProvider()->updateRecurringPaymentsProfile($data, $profileid);
```
* ManageRecurringPaymentsProfileStatus, (*17)
```
// Cancel recurring payment profile
$response = PayPal::getProvider()->cancelRecurringPaymentsProfile($profileid);
// Suspend recurring payment profile
$response = PayPal::getProvider()->suspendRecurringPaymentsProfile($profileid);
// Reactivate recurring payment profile
$response = PayPal::getProvider()->reactivateRecurringPaymentsProfile($profileid);
```
, (*18)
Handling PayPal IPN
You can also handle Instant Payment Notifications from PayPal.
Suppose you have set IPN URL to http://example.com/ipn/notify/ in PayPal. To handle IPN you should do the following:, (*19)
-
First add the ipn/notify tp your routes file:, (*20)
Route::post('ipn/notify','PayPalController@postNotify'); // Change it accordingly in your application
-
Open App\Http\Middleware\VerifyCsrfToken.php and add your IPN route to $excluded routes variable., (*21)
'ipn/notify'
-
Then in the controller where you are handling IPN, do the following:, (*22)
// Put this above controller definition
use saleemepoch\PayPal\Traits\IPNResponse As PayPalIPN;
// Then add the following before function declaration
use PayPalIPN;
-
The above step saves the PayPal IPN response as ipn in session. Following is the code you can change to your own requirements for handling IPN:, (*23)
/**
* Retrieve IPN Response From PayPal
*
* @param \Illuminate\Http\Request $request
*/
public function postNotify(Request $request)
{
$post = [];
$request_params = $request->all();
foreach ($request_params as $key=>$value)
$post[$key] = $value;
$post['cmd'] = '_notify-validate';
$response = $this->verifyIPN($post);
session([
'ipn' => $response
]);
}
, (*24)
Support
This plugin only supports Laravel 5 or greater.
* In case of any issues, kindly create one on the Issues section.
* If you would like to contribute:
* Fork this repository.
* Implement your features.
* Generate pull request., (*25)