dinkbit / conekta-cashier
Dinkbit Cashier为使用Conkta在Laravel中收取订阅费用提供了一个接口。
Requires
- php: >=5.4.0
- conekta/conekta-php: ~2.0.4
- illuminate/filesystem: 5.0.*|5.1.*|5.2.*|5.3.*|5.4.*|5.5.*
- illuminate/support: 5.0.*|5.1.*|5.2.*|5.3.*|5.4.*|5.5.*
- nesbot/carbon: ~1.0
- symfony/http-kernel: ~2.6|~3.0
Requires (Dev)
- illuminate/routing: ~5.0
- illuminate/view: ~5.0
- mockery/mockery: 0.9.*
- phpunit/phpunit: 4.0.*
README
Stripe Laravel Cashier到Conekta的移植
请注意,Laravel Cashier的最新版本支持Laravel 5+,如果您需要Laravel 4的实现,请查看1.0分支。
Laravel Cashier
简介
Laravel Cashier提供了一个表达式丰富的接口,用于访问Conekta的订阅计费服务。它处理了您在编写订阅计费代码时可能遇到的几乎所有模板代码。除了基本的订阅管理外,Cashier还可以处理优惠券、交换订阅、订阅“数量”、取消宽限期,甚至可以生成发票PDF。
配置
Composer
首先,将Cashier包添加到您的composer.json
文件中
"dinkbit/conekta-cashier": "~2.0" (For Conekta 1.0.0 PHP-SDK 2.0)
服务提供者
接下来,在您的app
配置文件中注册Dinkbit\ConektaCashier\CashierServiceProvider
。
迁移
在使用Cashier之前,我们需要在数据库中添加几个列。不用担心,您可以使用conekta-cashier:table
Artisan命令来创建一个迁移,以添加必要的列。例如,要将列添加到用户表中,请使用php artisan conekta-cashier:table users
。一旦创建迁移,只需运行migrate
命令。
模型设置
接下来,将Billable
特质和适当的日期修改器添加到您的模型定义中
use Dinkbit\ConektaCashier\Billable;
use Dinkbit\ConektaCashier\Contracts\Billable as BillableContract;
class User extends Eloquent implements BillableContract {
use Billable;
protected $dates = ['trial_ends_at', 'subscription_ends_at'];
}
Conekta密钥
最后,在您的services.php
配置文件中设置您的Conekta密钥
'conekta' => [
'model' => 'User',
'secret' => env('CONEKTA_API_SECRET'),
],
或者您也可以将其存储在您的启动文件或服务提供者中,例如AppServiceProvider
User::setConektaKey('conekta-key');
订阅计划
一旦您有一个模型实例,您就可以轻松地将该用户订阅到给定的Conekta计划
$user = User::find(1);
$user->subscription('monthly')->create($creditCardToken);
您还可以扩展订阅试用期。
$subscription = $user->subscription('monthly')->create($creditCardToken);
$user->extendTrial(Carbon::now()->addMonth());
subscription
方法将自动创建Conekta订阅,并将Conekta客户ID和其他相关计费信息更新到数据库中。如果您的计划在Conekta中配置了试用期,试用期结束日期也将自动设置在用户记录上。
如果您的计划在Conekta中未配置试用期,您必须在订阅后手动设置试用期结束日期
$user->trial_ends_at = Carbon::now()->addDays(14);
$user->save();
指定其他用户详细信息
如果您希望指定其他客户详细信息,您可以通过将它们作为create
方法的第二个参数传递来实现
$user->subscription('monthly')->create($creditCardToken, [
'email' => $email, 'name' => 'Joe Doe'
]);
有关Conekta支持的额外字段的更多信息,请参阅Conekta的客户创建文档。
单次收费
如果您希望对已订阅客户的信用卡进行一次性收费,请使用charge
方法
$user->charge(100);
charge
方法接受您希望收取的金额,以货币的最小单位表示。例如,上面的示例将收取100分,即1.00美元。
charge
方法接受一个数组作为其第二个参数,允许您将任何选项传递给底层的Conekta收费创建
$user->charge(100, [
'card' => $token,
]);
如果 charge
方法失败,将返回 false
。这通常表明充值被拒绝
if ( ! $user->charge(100))
{
// The charge was denied...
}
如果充值成功,该方法将返回完整的 Conekta 响应。
交换订阅
要将用户切换到新的订阅,请使用 swap
方法
$user->subscription('premium')->swap();
如果用户处于试用状态,试用将保持正常。此外,如果订阅存在“数量”,该数量也将保持不变。
取消订阅
取消订阅就像散步一样简单
$user->subscription()->cancel();
当订阅被取消时,Cashier 会自动将数据库中的 subscription_ends_at
列设置为。该列用于确定何时 subscribed
方法应开始返回 false
。例如,如果客户于 3 月 1 日取消了订阅,但订阅原定于 3 月 5 日结束,则 subscribed
方法将继续返回 true
直到 3 月 5 日。
恢复订阅
如果用户已取消订阅,您希望恢复,请使用 resume
方法
$user->subscription('monthly')->resume($creditCardToken);
如果用户在订阅完全到期之前取消订阅并恢复订阅,他们不会立即被收费。他们的订阅将被重新激活,并且他们将在原始计费周期内被收费。
检查订阅状态
要验证用户是否已订阅您的应用程序,请使用 subscribed
命令
if ($user->subscribed())
{
//
}
subscribed
方法非常适合作为 路由中间件
public function handle($request, Closure $next)
{
if ($request->user() && ! $request->user()->subscribed())
{
return redirect('billing');
}
return $next($request);
}
您还可以使用 onTrial
方法确定用户是否仍在试用期内(如果适用)
if ($user->onTrial())
{
//
}
要确定用户曾经是活跃的订阅者,但已取消订阅,您可以使用 cancelled
方法
if ($user->cancelled())
{
//
}
您还可以确定用户是否已取消订阅,但仍处于“宽限期”直到订阅完全到期。例如,如果用户在 3 月 5 日取消了原定于 3 月 10 日结束的订阅,则用户将在 3 月 10 日之前处于“宽限期”。注意,在此期间 subscribed
方法仍返回 true
。
if ($user->onGracePeriod())
{
//
}
可以使用 everSubscribed
方法确定用户是否曾订阅过您应用程序中的任何计划
if ($user->everSubscribed())
{
//
}
可以使用 onPlan
方法确定用户是否根据其 ID 订阅了特定计划
if ($user->onPlan('monthly'))
{
//
}
处理失败付款
如果客户的信用卡过期怎么办?不用担心 - Cashier 包含一个可以轻松取消客户订阅的 Webhook 控制器。只需将路由指向该控制器即可
Route::post('conekta/webhook', 'Dinkbit\ConektaCashier\WebhookController@handleWebhook');
就这些!失败的支付将被捕获并由控制器处理。控制器将在三次失败的支付尝试后取消客户的订阅。此示例中的 conekta/webhook
URI 仅用于示例。您需要配置您的 Conekta 设置中的 URI。
处理其他Conekta Webhooks
如果您需要处理额外的 Conekta webhook 事件,只需扩展 Webhook 控制器。您的方法名称应与 Cashier 预期的约定相对应,具体来说,方法应以前缀 handle
和您希望处理的 Conekta webhook 的名称开头。例如,如果您希望处理 invoice.payment_succeeded
webhook,则应向控制器添加 handleInvoicePaymentSucceeded
方法。
class WebhookController extends Dinkbit\ConektaCashier\WebhookController {
public function handleInvoicePaymentSucceeded($payload)
{
// Handle The Event
}
}
注意:除了在数据库中更新订阅信息外,Webhook 控制器还将通过 Conekta API 取消订阅。
待办事项
- 当 Conekta 提供时,添加发票支持。