navneetrai/laravel-subscription

Subscription Billing manager for Laravel 5.2

v1.1.2-beta 2017-06-06 17:49 UTC

README

Build Status Coverage Status Total Downloads Latest Stable Version Latest Unstable Version License

laravel-subscription is a simple laravel 5 library for creating subscription billing and handling server notifications. It is primarily meant for people outside countries like US, UK and Canada where Stripe, Paypal Payments Pro are not available.

If you want to handle non-recurring payments, you can use Omnipay for one-time payments and token billing.

Supported services

The library supports Paypal and credit card processors 2Checkout, PayFast and CCNow. More services will be implemented soon.

Included service implementations:

  • Paypal
  • 2Checkout
  • PayFast
  • CCNow
  • more to come!

Installation

Add laravel-subscription to your composer.json file:

"require": {
  "navneetrai/laravel-subscription": "^1.0"
}

Use composer to install this package.

$ composer update

Registering the Package

Register the service provider within the providers array found in config/app.php:

'providers' => [
  // ...
  
  Userdesk\Subscription\SubscriptionServiceProvider::class,
]

Add an alias within the aliases array found in config/app.php:

'aliases' => [
  // ...
  
  'Subscription'     => Userdesk\Subscription\Facades\Subscription::class,
]

Configuration

There are two ways to configure laravel-subscription.

Option 1

Create configuration file for package using artisan command

$ php artisan vendor:publish --provider="Userdesk\Subscription\SubscriptionServiceProvider"

Option 2

Create configuration file manually in config directory config/subscription.php and put there code from below.

<?php
return [ 
  
  /*
  |--------------------------------------------------------------------------
  | Subscription Config
  |--------------------------------------------------------------------------
  */

  /*
  |--------------------------------------------------------------------------
  | Subscription Services
  |--------------------------------------------------------------------------
  |
  | This file is for storing the credentials for subscription services such
  | as Paypal, CCNow, PayFast, 2Checkout, and others. This file provides a sane
  | default location for this type of information, allowing packages
  | to have a conventional place to find your various credentials.
  |
  */
  'services' => [
    'paypal'=>[
      'email'=>'', 
      'logo'=>'',
      'auth'=>''
    ],
  ]

];

Credentials

Add your credentials to config/subscription.php (depending on which option of configuration you choose)

Usage

Basic usage

Just follow the steps below and you will be able to get a processor:

$paypal = Subscription::processor('Paypal');

Getting Processor Informationation

You can get basic Information for any processor by:

$processor = Subscription::processor($proc);

$info = $processor->info();

The value returned is a ProcessorInfo object. You can call getName, getLogo and getUrl methods on this processor to display Processor Name, Logo and Website Url for display purposes.

For getLogo method to work correctly you'll need to copy package assets to your project using

$ php artisan vendor:publish --provider="Userdesk\Subscription\SubscriptionServiceProvider"

Completing Subscription

Once you have the processor object you can call:

$processor = Subscription::processor($proc);

$processor->complete($id, $product, $consumer);

Complete method redirects to source processor so that your user can complete his payment.

$id is your unique Order ID. $product and $consumer are objects implementing SubscriptionProductContract and SubscriptionConsumerContract respectively.

A basic implementation of SubscriptionProductContract and SubscriptionConsumerContract are included with source in form of Classes\SubscriptionProduct and Classes\SubscriptionConsumer respectively.

Handling Processor Notifications

You can handle Processor Notifications and Processor Cart Return Data by forwarding them to ipn and pdt functions respectively.

Both these function excpects only one input with request data as array and returns TransactionResult object.

public function cartComplete(Request $request, $proc){
	$processor = Subscription::processor($proc);
	try{
		$result = $processor->pdt($request->all());
	}catch(TransactionException $exception){
		Log::error($exception->getMessage());	
	}
	
	if(!empty($result)){
		$cartId = $result->getId();
	  	if(!empty($cartId)){
	  		$action = $result->getAction();    
			if($action=='signup'){
				//Handle successful Signup
			}
		}else{
			Log::error('Cart Not Found For PDT', ['proc'=>$proc, 'data'=>$request->all()]);	
		}
	}
}
public function handleIpn(Request $request, $proc){
	$processor = Subscription::processor($proc);
	try{
	  	$result = $processor->ipn($request->all());
	}catch(Userdesk\Subscription\Exceptions\TransactionException $exception){
	  	//Handle Exceptions
	  	Log::error($exception->getMessage());  
	}

	if(!empty($result)){
	  	$cartId = $result->getId();
	  	if(!empty($cartId)){
		    $action = $result->getAction();        

		    if($action=='signup'){
		      //Handle Signup Code
		    }else if($action=='payment'){          
		      $transactionId = $result->getIdent();
		      $amount = $result->getAmount();
		      //Handle successful payments
		    }else if($action=='refund'){          
		      $transactionId = $result->getIdent();
		      $amount = $result->getAmount();
		      //Handle refunds
		    }else if($action=='cancel'){
		      //Handle cancellations;
		    }
		}else{
		    Log::error('Cart Not Found For IPN', ['proc'=>$proc, 'data'=>$request->all()]); 
		}
	}   
}

It is important to remember that IPN notifications are generally delivered via POST. So, you should add post method and remove csrf check for any route handling ipn notifications.