未加星标

[ Laravel 5.3 文档 ] 官方包 ―― Laravel Cashier

字体大小 | |
[开发(php) 所属分类 开发(php) | 发布者 店小二04 | 时间 2016 | 作者 红领巾 ] 0人收藏点击收藏
1、简介

Laravel Cashier为通过Stripe实现订阅支付服务提供了一个优雅的流式接口。它封装了几乎所有你恐惧编写的样板化的订阅支付代码。除了基本的订阅管理外,Cashier 还支持处理优惠券、订阅升级/替换、订阅“数量”、取消宽限期,甚至生成PDF发票。

注:如果你只需要一次性支付,并不提供订阅,就不应该使用 Cashier,而是直接使用 Stripe 和Braintree SDK。

2、配置 Stripe Composer

首先,添加 Cashier 包到 composer.json 文件并运行 composer update 命令:

"laravel/cashier": "~7.0" 服务提供者

接下来,在 config/app.php 配置文件中注册服务提供者: Laravel\Cashier\CashierServiceProvider 。

数据库迁移

使用 Cashier 之前,我们需要准备好数据库。我们需要添加一个字段到 users 表,还要创建新的 subscriptions 表来处理所有用户订阅:

Schema::table('users', function ($table) {
$table->string('stripe_id')->nullable();
$table->string('card_brand')->nullable();
$table->string('card_last_four')->nullable();
$table->timestamp('trial_ends_at')->nullable();
});
Schema::create('subscriptions', function ($table) {
$table->increments('id');
$table->integer('user_id');
$table->string('name');
$table->string('stripe_id');
$table->string('stripe_plan');
$table->integer('quantity');
$table->timestamp('trial_ends_at')->nullable();
$table->timestamp('ends_at')->nullable();
$table->timestamps();
});

创建好迁移后,只需简单运行 migrate 命令,相应修改就会更新到数据库。

Billable 模型

接下来,添加 Billable trait 到 User 模型类,这个trait提供了多个方法以便执行常用支付任务,例如创建订阅、使用优惠券以及更新信用卡信息:

use Laravel\Cashier\Billable;
class User extends Authenticatable
{
use Billable;
} API Key

最后,在配置文件 config/services.php 中配置 Stripe 的key,你可以在Stripe官网个人中心的控制面板中获取这些Stripe API key信息:

'stripe' => [
'model' => App\User::class,
'secret' => env('STRIPE_API_SECRET'),
], Braintree Braintree 注意事项

对于很多操作,Stripe 和 Braintree 实现的 Cashier 功能都是一样的,两者都提供了通过信用卡进行订阅支付的功能,但是 Braintree 还支持通过 PayPal 支付。不过,Braintree 也缺失一些 Stripe 支持的功能,在决定使用 Stripe 还是 Braintree 之前,需要考虑以下几点:

Braintree 支持 PayPal 而 Stripe 不支持; Braintree 不支持 increment 和 decrement 方法,这个是Braintree 级别的限制,不是 Cashier 级别的; Braintree 不支持基于百分比的折扣,这个也是 Braintree 级别的限制,不是 Cashier 级别的 Composer

首先,添加针对 Braintree 的 Cashier扩展包到 composer.json 文件并运行 composer update 命令:

"laravel/cashier-braintree": "~2.0" 服务提供者

接下来,在配置文件 config/app.php 中注册服务提供者 Laravel\Cashier\CashierServiceProvider 。

计划信用优惠券

在使用基于 Braintree 的 Cashier 之前,需要在 Braintree 的控制面板中定义一个 plan-credit 折扣,这个折扣将会用于从年到月或者从月到年支付的优惠额度比例分配。

配置在 Braintree 控制面板中的这个折扣值可以是你希望的任何值,Cashier 将会在每次使用优惠券的时候通过自定义的值来重写这个默认定义的值。该优惠券之所以是必须的是因为 Braintree 不支持本地根据订阅时长进行优惠额度的按比例分配。

数据库迁移

使用 Cashier 之前,需要准备好数据库。我们需要添加额外的字段到 users 表并创建一个新的 subscriptions 表用于存放所有用户订阅:

Schema::table('users', function ($table) {
$table->string('braintree_id')->nullable();
$table->string('paypal_email')->nullable();
$table->string('card_brand')->nullable();
$table->string('card_last_four')->nullable();
$table->timestamp('trial_ends_at')->nullable();
});
Schema::create('subscriptions', function ($table) {
$table->increments('id');
$table->integer('user_id');
$table->string('name');
$table->string('braintree_id');
$table->string('braintree_plan');
$table->integer('quantity');
$table->timestamp('trial_ends_at')->nullable();
$table->timestamp('ends_at')->nullable();
$table->timestamps();
});

迁移被创建之后,只需要执行Artisan命令 migrate 即可。

Billable模型

接下来,添加 Billable trait到模型定义:

use Laravel\Cashier\Billable;
class User extends Authenticatable
{
use Billable;
} API Key

接下来,需要在配置文件 services.php 中配置如下选项:

'braintree' => [
'model' => App\User::class,
'environment' => env('BRAINTREE_ENV'),
'merchant_id' => env('BRAINTREE_MERCHANT_ID'),
'public_key' => env('BRAINTREE_PUBLIC_KEY'),
'private_key' => env('BRAINTREE_PRIVATE_KEY'),
],

然后你需要在服务提供者 AppServiceProvider 的 boot 方法中添加对 Braintree SDK 的调用:

\Braintree_Configuration::environment(config('services.braintree.environment'));
\Braintree_Configuration::merchantId(config('services.braintree.merchant_id'));
\Braintree_Configuration::publicKey(config('services.braintree.public_key'));
\Braintree_Configuration::privateKey(config('services.braintree.private_key')); 货币 配置

Cashier 默认货币是美元(USD),你可以在某个服务提供者的 boot 方法中通过调用 Cashier::useCurrency 方法来更改默认的货币, useCurrency 方法接收两个字符串参数:货币及货币符号:

use Laravel\Cashier\Cashier;
Cashier::useCurrency('eur', ''); 3、订阅 创建订阅

要创建一个订阅,首先要获取一个账单模型的实例,通常是 App\User 的实例。获取到该模型实例之后,你可以使用 newSubscription 方法来创建该模型的订阅:

$user = User::find(1);
$user->newSubscription('main', 'monthly')->create($creditCardToken);

第一个传递给 newSubscription 方法的参数是该订阅的名字,如果应用只有一个订阅,可以将其称作 main 或 primary ,第二个参数用于指定用户订阅的 Stripe/Braintree计划,该值对应 Stripe 或 Braintree 中相应计划的 id。

create 方法会自动创建这个 Stripe 订阅,同时更新数据库中 Stripe 的客户 ID(即 users 表中的 stripe_id )和其它相关的账单信息。

额外的用户信息

如果你想要指定额外的客户信息,你可以将其作为第二个参数传递给 create 方法:

$user->newSubscription('main', 'monthly')->create($creditCardToken, [
'email' => $email,
]);

要了解更多 Stripe 支持的字段,可以查看 Stripe 关于 创建消费者的文档 或者相应的 Braintree文档 。

优惠券

如果你想要在创建订阅的时候使用优惠券,可以使用 withCoupon 方法:

$user->newSubscription('main', 'monthly')
->withCoupon('code')
->create($creditCardToken); 检查订阅状态

用户订阅你的应用后,你可以使用各种便利的方法来简单检查订阅状态。首先,如果用户有一个有效的订阅,则 subscribed 方法返回 true ,即使订阅现在处于试用期:

if ($user->subscribed('main')) {
//
}

subscribed 方法还可以用于路由中间件,基于用户订阅状态允许你对路由和控制器的访问进行过滤:

public function handle($request, Closure $next){
if ($request->user() && ! $request->user()->subscribed('main')) {
// This user is not a paying customer...
return redirect('billing');
}
return $next($request);
}

如果你想要判断一个用户是否还在试用期,可以使用 onTrial 方法,该方法对于还处于试用期的用户显示警告信息很有用:

if ($user->->subscription('main')->onTrial()) {
//
}

subscribedToPlan 方法可用于判断用户是否基于 Stripe/Braintree ID 订阅了给定的计划,在本例中,我们会判断用户的 main 订阅是否订阅了 monthly 计划:

本文开发(php)相关术语:php代码审计工具 php开发工程师 移动开发者大会 移动互联网开发 web开发工程师 软件开发流程 软件开发工程师

分页:12
转载请注明
本文标题:[ Laravel 5.3 文档 ] 官方包 ―― Laravel Cashier
本站链接:http://www.codesec.net/view/483306.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 开发(php) | 评论(0) | 阅读(33)