backappspace/laravel-conekta-cashier

laravel-conekta-cashier 为 Laravel 提供了使用 Conketa 收费订阅的接口。(Backappspace Cashier 的分支)

dev-master / 2.0.x-dev 2019-04-03 16:09 UTC

This package is auto-updated.

Last update: 2024-09-29 05:45:27 UTC


README

Build Status StyleCI

image

Stripe 的 Laravel Cashier 到 Conekta 的迁移 Laravel Cashier

请注意,Laravel Cashier 的最新版本支持 Laravel 5.6.* 和 5.7.*

Laravel Cashier

简介

Laravel Cashier 为 Conekta 的订阅计费服务提供了一个表达性、流畅的接口。它处理了您害怕编写的几乎所有样板订阅计费代码。除了基本的订阅管理外,Cashier 还可以处理优惠券、交换订阅、订阅“数量”、取消宽限期,甚至生成发票 PDF。

配置

Composer

首先,将 Cashier 包添加到您的 composer.json 文件

"backappspace/conekta-cashier" (We are using Conekta 4.0.4)

服务提供者

接下来,在您的 app 配置文件中注册 Backappspace\ConektaCashier\CashierServiceProvider

迁移

在开始使用 Cashier 之前,我们需要向您的数据库中添加几个列。别担心,您可以使用 conekta-cashier:table Artisan 命令创建一个迁移来添加必要的列。例如,要将列添加到用户表中,请使用 php artisan conekta-cashier:table users。一旦迁移被创建,只需运行 migrate 命令。

模型设置

接下来,将 Billable 特性和适当的日期修改器添加到您的模型定义中

use Backappspace\ConektaCashier\Billable;
use Backappspace\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', 'Backappspace\ConektaCashier\WebhookController@handleWebhook');

就是这样!失败的交易将由控制器捕获和处理。在三次失败支付尝试后,控制器将取消客户的订阅。此示例中的conekta/webhook URI仅用于示例。您需要在Conekta设置中配置URI。

处理其他 Conketa Webhooks

如果您要处理额外的Conekta webhook事件,只需扩展Webhook控制器即可。您的方法名称应与Cashier的预期约定相一致,具体来说,方法应以前缀handle开头,并带有您希望处理的Conekta webhook名称。例如,如果您希望处理invoice.payment_succeeded webhook,您应在控制器中添加一个handleInvoicePaymentSucceeded方法。

class WebhookController extends Backappspace\ConektaCashier\WebhookController {

	public function handleInvoicePaymentSucceeded($payload)
	{
		// Handle The Event
	}

}

注意:除了更新数据库中的订阅信息外,Webhook控制器还将通过Conekta API取消订阅。

待办事项

  • 当Conekta有发票支持时,添加发票支持。