Package Data | |
---|---|
Maintainer Username: | srmklive |
Maintainer Contact: | srmk@outlook.com (Raza Mehdi) |
Package Create Date: | 2015-10-05 |
Package Last Update: | 2024-09-11 |
Home Page: | https://laravel-paypal-demo.srmk.info/ |
Language: | PHP |
License: | MIT |
Last Refreshed: | 2024-12-17 03:04:31 |
Package Statistics | |
---|---|
Total Downloads: | 2,415,666 |
Monthly Downloads: | 75,133 |
Daily Downloads: | 2,992 |
Total Stars: | 1,059 |
Total Watchers: | 31 |
Total Forks: | 319 |
Total Open Issues: | 4 |
By using this plugin you can process or refund payments and handle IPN (Instant Payment Notification) from PayPal in your Laravel application.
Currently only PayPal Express Checkout API Is Supported.
Demo Application: https://laravel-paypal-demo.srmk.info/
Github repo https://github.com/srmklive/laravel-paypal-demo
This package uses the classic paypal express checkout. Refer to this link on how to create API credentials:
https://developer.paypal.com/docs/classic/api/apiCredentials/#create-an-api-signature
composer require srmklive/paypal:~1.0
$providers
array in config/app.php
file like:Srmklive\PayPal\Providers\PayPalServiceProvider::class
$aliases
array in config/app.php
file like:'PayPal' => Srmklive\PayPal\Facades\PayPal::class
php artisan vendor:publish --provider "Srmklive\PayPal\Providers\PayPalServiceProvider"
return [
'mode' => 'sandbox', // Can only be 'sandbox' Or 'live'. If empty or invalid, 'live' will be used.
'sandbox' => [
'username' => env('PAYPAL_SANDBOX_API_USERNAME', ''),
'password' => env('PAYPAL_SANDBOX_API_PASSWORD', ''),
'secret' => env('PAYPAL_SANDBOX_API_SECRET', ''),
'certificate' => env('PAYPAL_SANDBOX_API_CERTIFICATE', ''),
'app_id' => 'APP-80W284485P519543T', // Used for testing Adaptive Payments API in sandbox mode
],
'live' => [
'username' => env('PAYPAL_LIVE_API_USERNAME', ''),
'password' => env('PAYPAL_LIVE_API_PASSWORD', ''),
'secret' => env('PAYPAL_LIVE_API_SECRET', ''),
'certificate' => env('PAYPAL_LIVE_API_CERTIFICATE', ''),
'app_id' => '', // Used for Adaptive Payments API
],
'payment_action' => 'Sale', // Can only be 'Sale', 'Authorization' or 'Order'
'currency' => 'USD',
'notify_url' => '', // Change this accordingly for your application.
'locale' => '', // force gateway language i.e. it_IT, es_ES, en_US ... (for express checkout only)
'validate_ssl' => true, // Validate SSL when creating api client.
];
.env.example
and .env
#PayPal Setting & API Credentials - sandbox
PAYPAL_SANDBOX_API_USERNAME=
PAYPAL_SANDBOX_API_PASSWORD=
PAYPAL_SANDBOX_API_SECRET=
PAYPAL_SANDBOX_API_CERTIFICATE=
#PayPal Setting & API Credentials - live
PAYPAL_LIVE_API_USERNAME=
PAYPAL_LIVE_API_PASSWORD=
PAYPAL_LIVE_API_SECRET=
PAYPAL_LIVE_API_CERTIFICATE=
Following are some ways through which you can access the paypal provider:
// Import the class namespaces first, before using it directly
use Srmklive\PayPal\Services\ExpressCheckout;
use Srmklive\PayPal\Services\AdaptivePayments;
$provider = new ExpressCheckout; // To use express checkout.
$provider = new AdaptivePayments; // To use adaptive payments.
// Through facade. No need to import namespaces
$provider = PayPal::setProvider('express_checkout'); // To use express checkout(used by default).
$provider = PayPal::setProvider('adaptive_payments'); // To use adaptive payments.
You can override PayPal API configuration by calling setApiCredentials
method:
$provider->setApiCredentials($config);
By default the currency used is USD
. If you wish to change it, you may call setCurrency
method to set a different currency before calling any respective API methods:
$provider->setCurrency('EUR')->setExpressCheckout($data);
By default only a specific set of parameters are used for PayPal API calls. However, if you wish specify any other additional parameters you may call the addOptions
method before calling any respective API methods:
$options = [
'BRANDNAME' => 'MyBrand',
'LOGOIMG' => 'https://example.com/mylogo.png',
'CHANNELTYPE' => 'Merchant'
];
$provider->addOptions($options)->setExpressCheckout($data);
Warning: Any parameters should be referenced accordingly to the API call you will perform. For example, if you are performing SetExpressCheckout
, then you must provide the parameters as documented by PayPal for SetExpressCheckout
to addOptions
method.
$data = [];
$data['items'] = [
[
'name' => 'Product 1',
'price' => 9.99,
'qty' => 1
],
[
'name' => 'Product 2',
'price' => 4.99,
'qty' => 2
]
];
$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']*$item['qty'];
}
$data['total'] = $total;
//give a discount of 10% of the order amount
$data['shipping_discount'] = round((10 / 100) * $total, 2);
SetExpressCheckout
$response = $provider->setExpressCheckout($data);
// Use the following line when creating recurring payment profiles (subscriptions)
$response = $provider->setExpressCheckout($data, true);
// This will redirect user to PayPal
return redirect($response['paypal_link']);
GetExpressCheckoutDetails
$response = $provider->getExpressCheckoutDetails($token);
DoExpressCheckoutPayment
// Note that 'token', 'PayerID' are values returned by PayPal when it redirects to success page after successful verification of user's PayPal info.
$response = $provider->doExpressCheckoutPayment($data, $token, $PayerID);
RefundTransaction
$response = $provider->refundTransaction($transactionid);
// To issue partial refund, you must provide the amount as well for refund:
$response = $provider->refundTransaction($transactionid, 9.99);
CreateBillingAgreement
// The $token is the value returned from SetExpressCheckout API call
$response = $provider->createBillingAgreement($token);
DoReferenceTransaction
// The $token is the value returned from CreateBillingAgreement API call
// $action Can be Order, Sale or Authorization
// $amount to withdraw from the given BillingAgreement defaults to $. To overwrite use $provider->addOptions
$response = $provider->doReferenceTransaction($token,$action,$amount);
GetTransactionDetails
// The $token is the value returned from doReferenceTransaction API call
$response = $provider->getTransactionDetails($token);
CreateRecurringPaymentsProfile
// 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' => 1, //
'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 = $provider->createRecurringPaymentsProfile($data, $token);
GetRecurringPaymentsProfileDetails
$response = $provider->getRecurringPaymentsProfileDetails($profileid);
UpdateRecurringPaymentsProfile
$response = $provider->updateRecurringPaymentsProfile($data, $profileid);
ManageRecurringPaymentsProfileStatus
// Cancel recurring payment profile
$response = $provider->cancelRecurringPaymentsProfile($profileid);
// Suspend recurring payment profile
$response = $provider->suspendRecurringPaymentsProfile($profileid);
// Reactivate recurring payment profile
$response = $provider->reactivateRecurringPaymentsProfile($profileid);
To use adaptive payments, you must set the provider to use Adaptive Payments:
PayPal::setProvider('adaptive_payments');
// Change the values accordingly for your application
$data = [
'receivers' => [
[
'email' => 'johndoe@example.com',
'amount' => 10,
'primary' => true,
],
[
'email' => 'janedoe@example.com',
'amount' => 5,
'primary' => false
]
],
'payer' => 'EACHRECEIVER', // (Optional) Describes who pays PayPal fees. Allowed values are: 'SENDER', 'PRIMARYRECEIVER', 'EACHRECEIVER' (Default), 'SECONDARYONLY'
'return_url' => url('payment/success'),
'cancel_url' => url('payment/cancel'),
];
$response = $provider->createPayRequest($data);
// The above API call will return the following values if successful:
// 'responseEnvelope.ack', 'payKey', 'paymentExecStatus'
Next, you need to redirect the user to PayPal to authorize the payment
$redirect_url = $provider->getRedirectUrl('approved', $response['payKey']);
return redirect($redirect_url);
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:
First add the ipn/notify
tp your routes file:
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.
'ipn/notify'
Write the following code in the function where you will parse IPN response:
/**
* Retrieve IPN Response From PayPal
*
* @param \Illuminate\Http\Request $request
*/
public function postNotify(Request $request)
{
// Import the namespace Srmklive\PayPal\Services\ExpressCheckout first in your controller.
$provider = new ExpressCheckout;
$request->merge(['cmd' => '_notify-validate']);
$post = $request->all();
$response = (string) $provider->verifyIPN($post);
if ($response === 'VERIFIED') {
// Your code goes here ...
}
}
SetExpressCheckout
API call in following format:// Always update the code below accordingly to your own requirements.
$data = [];
$data['items'] = [
[
'name' => "Monthly Subscription",
'price' => 0,
'qty' => 1,
],
];
$data['subscription_desc'] = "Monthly Subscription #1";
$data['invoice_id'] = 1;
$data['invoice_description'] = "Monthly Subscription #1";
$data['return_url'] = url('/paypal/ec-checkout-success?mode=recurring');
$data['cancel_url'] = url('/');
$total = 0;
foreach ($data['items'] as $item) {
$total += $item['price'] * $item['qty'];
}
$data['total'] = $total;
//give a discount of 10% of the order amount
$data['shipping_discount'] = round((10 / 100) * $total, 2);
SetExpressCheckout
.GetExpressCheckoutDetails
.CreateRecurringPaymentsProfile
$amount = 9.99;
$description = "Monthly Subscription #1";
$response = $provider->createMonthlySubscription($token, $amount, $description);
// To create recurring yearly subscription on PayPal
$response = $provider->createYearlySubscription($token, $amount, $description);
This plugin only supports Laravel 5.1 or greater.