navneetrai/laravel-subscription

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 是一个简单的 Laravel 5 库,用于创建订阅计费和处理服务器通知。它主要面向美国、英国和加拿大等国家的用户,在这些国家 StripePaypal Payments Pro 不可用。

如果您想处理非周期性支付,可以使用 Omnipay 进行一次性支付和代币计费。

支持的服务

该库支持 Paypal 和信用卡处理器 2CheckoutPayFastCCNow。很快还将实现更多服务。

包含的服务实现

  • Paypal
  • 2Checkout
  • PayFast
  • CCNow
  • 更多即将到来!

安装

将 laravel-subscription 添加到您的 composer.json 文件

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

使用 composer 安装此包。

$ composer update

注册包

在 config/app.php 文件中的 providers 数组内注册服务提供者

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

在 config/app.php 文件中的 aliases 数组内添加别名

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

配置

配置 laravel-subscription 有两种方式。

选项 1

使用 artisan 命令为包创建配置文件

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

选项 2

在 config 目录中手动创建配置文件 config/subscription.php 并将以下代码放入其中。

<?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'=>''
    ],
  ]

];

凭证

将您的凭证添加到 config/subscription.php(根据您选择的配置选项)

使用

基本用法

只需按照以下步骤操作,您就能获取处理器

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

获取处理器信息

您可以通过以下方式获取任何处理器的基本信息

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

$info = $processor->info();

返回的值是一个 ProcessorInfo 对象。您可以在该处理器上调用 getNamegetLogogetUrl 方法来显示处理器名称、Logo 和网站 URL。

为了使 getLogo 方法正常工作,您需要使用以下命令将包资产复制到您的项目中

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

完成订阅

一旦您有了处理器对象,就可以调用

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

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

完成方法将重定向到源处理器,以便您的用户可以完成他的支付。

$id 是您的唯一订单 ID。 $product$consumer 分别是实现了 SubscriptionProductContractSubscriptionConsumerContract 的对象。

SubscriptionProductContractSubscriptionConsumerContract 的基本实现已以 Classes\SubscriptionProductClasses\SubscriptionConsumer 的形式包含在源代码中。

处理处理器通知

您可以通过将它们分别转发到 ipnpdt 函数来处理处理器通知和处理器购物车返回数据。

这两个函数只接受一个输入,即请求数据数组,并返回 TransactionResult 对象。

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()]); 
		}
	}   
}

请记住,IPN 通知通常通过 POST 传递。因此,您应该为处理 IPN 通知的任何路由添加 POST 方法并删除 csrf 检查。