navneetrai / laravel-subscription
Laravel 5.2 订阅计费管理器
Requires
- php: >=7.0
Requires (Dev)
- mockery/mockery: ^0.9.4
- orchestra/testbench: ~3.2
- phpunit/phpunit: ~4.0
README
laravel-subscription 是一个简单的 Laravel 5 库,用于创建订阅计费和处理服务器通知。它主要面向美国、英国和加拿大等国家的用户,在这些国家 Stripe、Paypal Payments Pro 不可用。
如果您想处理非周期性支付,可以使用 Omnipay 进行一次性支付和代币计费。
支持的服务
该库支持 Paypal 和信用卡处理器 2Checkout、PayFast 和 CCNow。很快还将实现更多服务。
包含的服务实现
- 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
对象。您可以在该处理器上调用 getName
、getLogo
和 getUrl
方法来显示处理器名称、Logo 和网站 URL。
为了使 getLogo
方法正常工作,您需要使用以下命令将包资产复制到您的项目中
$ php artisan vendor:publish --provider="Userdesk\Subscription\SubscriptionServiceProvider"
完成订阅
一旦您有了处理器对象,就可以调用
$processor = Subscription::processor($proc); $processor->complete($id, $product, $consumer);
完成方法将重定向到源处理器,以便您的用户可以完成他的支付。
$id
是您的唯一订单 ID。 $product
和 $consumer
分别是实现了 SubscriptionProductContract
和 SubscriptionConsumerContract
的对象。
SubscriptionProductContract
和 SubscriptionConsumerContract
的基本实现已以 Classes\SubscriptionProduct
和 Classes\SubscriptionConsumer
的形式包含在源代码中。
处理处理器通知
您可以通过将它们分别转发到 ipn
和 pdt
函数来处理处理器通知和处理器购物车返回数据。
这两个函数只接受一个输入,即请求数据数组,并返回 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 检查。