캐셔 트레이딩 툴킷
- Subscribe
- 구독 생성
- 구독 상태 확인
- 구독 기준일
- 은행 카드신용 카드 업데이트
- 신용 카드 삭제스트라이프 웹후크 처리
- 정의 웹훅 이벤트웹훅 이벤트 정의
- 구독 실패 인보이스 충전
- 환불 처리PDF 인보이스 생성
소개
Laravel Cashier는 Stripe's 및 Braintree's의 유료 구독 서비스에 액세스할 수 있는 직관적이고 원활한 인터페이스를 제공합니다. 거의 골치 아픈 유료 구독 코드를 처리할 수 있습니다. 기본적인 구독 관리 기능 외에도 Cashier는 쿠폰, 구독 교환, 구독 "수량", 취소 유예 기간 및 PDF 송장 생성에 대한 도움을 드릴 수 있습니다.
.xconfiguration을 읽는 것이 좋습니다.{참고} "일회성" 청구만 필요하고 구독을 제공하지 않는 경우 Cashier를 사용하면 안 됩니다. Stripe 및 Braintree SDK를 사용하는 것이 좋습니다. Cashiergrading Cashier 례 기존 버전에서 최신 버전의 계산원으로 업그레이드하면
캐시어 업그레이드 안내서 First먼저 프로젝트 종속성에 Stripe의 Cashier 패키지를 추가하세요.
composer require laravel/cashier
Database migrationCashier를 사용하기 전에 데이터베이스를 준비해야 합니다. . 계산원은users
테이블에 몇 개의 열을 추가하고 모든 고객의 구독을 보관할 새subscriptions
테이블을 만들어야 합니다.Schema::table('users', function ($table) { $table->string('stripe_id')->nullable()->collation('utf8mb4_bin'); $table->string('card_brand')->nullable(); $table->string('card_last_four', 4)->nullable(); $table->timestamp('trial_ends_at')->nullable(); }); Schema::create('subscriptions', function ($table) { $table->increments('id'); $table->unsignedInteger('user_id'); $table->string('name'); $table->string('stripe_id')->collation('utf8mb4_bin'); $table->string('stripe_plan'); $table->integer('quantity'); $table->timestamp('trial_ends_at')->nullable(); $table->timestamp('ends_at')->nullable(); $table->timestamps(); });
마이그레이션 파일이 설정되면 , Artisan의마이그레이션
명령을 실행하세요.청구 가능 모델다음으로 모델 정의에
청구 가능
특성을 추가하세요. 이 특성은 구독 생성, 쿠폰 사용, 신용 카드 정보 업데이트와 같은 일반적인 결제 작업을 수행하는 여러 가지 방법을 제공합니다. 구성 파일services.php
에서 Stripe의 키를 구성하십시오. Stripe 공식 웹사이트의 개인 제어판에서 이러한 Stripe API 키 정보를 얻을 수 있습니다:use Laravel\Cashier\Billable;class User extends Authenticatable{ use Billable; }
BraintreeBraintree Notes
Stripe와 Braintree에서 구현하는 Cashier의 기능은 대부분 동일합니다. 둘 다 신용카드를 통한 구독 결제 기능을 제공하며, Braintree는 PayPal을 통한 결제도 추가로 지원합니다. 그러나 Braintree에는 Stripe 또는 Braintree를 사용하기로 결정하기 전에 다음 사항을 고려해야 합니다.
- Braintree는 PayPal을 지원하지만 Stripe은 지원하지 않습니다.
- Braintree는
increment
및decrement
메서드를 지원하지 않습니다. 이는 Cashier 제한이 아니라 Braintree 제한입니다.increment
和decrement
方法,这是 Braintree 的限制,而不是 Cashier 限制。 - Braintree 不支持基于百分比的折扣。这是 Braintree 的限制,而不是 Cashier 限制。
Composer
首先,将 Braintree 的 Cashier 包添加到您项目的依赖项中:
'stripe' => [ 'model' => App\User::class, 'key' => env('STRIPE_KEY'), 'secret' => env('STRIPE_SECRET'), ],
信用卡优惠计划
在使用 Cashier 之前,你需要首先在 Braintree 控制面板中定义一个
plan-credit
折扣。这个折扣会根据用户选择的支付选项匹配合适的折扣比例,比如选择年付或者月付。在 Braintree 控制面板中配置的折扣总额可以随意填写,Cashier 会在每次使用优惠券的时候根据您的配置来覆盖该默认值。由于 Braintree 不支持使用订阅频率来匹配折扣比例,所以这个优惠券是必需的。
数据库迁移
开始使用 Cashier 之前,需要 准备数据库。Cashier 需要在您的数据库
users
表中新增几个列,以及创建一个新的subscriptions
表来存储客户的订阅信息:composer require "laravel/cashier-braintree":"~2.0"
一旦迁移文件建立好后,运行 Artisan 的
migrate
命令。Billable 模型
然后,添加
Billable
Trait 到你的模型定义中: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->unsignedInteger('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(); });
API Keys
紧接着,您应该在
services.php
文件中配置以下选项:use Laravel\Cashier\Billable; class User extends Authenticatable{ use Billable; }
最后,您必须向
AppServiceProvider
服务提供者的boot
方法中,添加以下的 Braintree SDK 调用:'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'), ],
货币配置
Cashier 使用美元(USD)作为默认货币。您可以通过在服务提供者的
Braintree는 백분율 기반 할인을 지원하지 않습니다. 이는 Cashier 제한이 아닌 Braintree 제한입니다.boot
方法中调用Cashier::useCurrency
方法来更改默认的货币。这个useCurrency
Composer먼저 프로젝트 종속성에 Braintree의 Cashier 패키지를 추가하세요.\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를 사용하기 전에 먼저 Braintree 제어판에서
plan-credit
할인을 정의해야 합니다. 이 할인은 연간 결제, 월 결제 등 사용자가 선택한 결제 옵션에 따라 적절한 할인 비율을 일치시킵니다.Braintree 제어판에서 구성한 총 할인 금액은 원하는 대로 입력할 수 있으며, Cashier는 쿠폰을 사용할 때마다 구성에 따라 기본값을 덮어씁니다. Braintree는 할인율 일치를 위한 구독 빈도 사용을 지원하지 않으므로 이 쿠폰이 필요합니다.🎜🎜데이터베이스 마이그레이션🎜🎜Cashier를 사용하기 전에 데이터베이스를 준비해야 합니다. 계산원은 데이터베이스의users
테이블에 몇 가지 새로운 열을 추가하고 고객의 구독 정보를 저장할 새subscriptions
테이블을 생성해야 합니다. 🎜use Laravel\Cashier\Cashier; Cashier::useCurrency('eur', '€');
🎜마이그레이션 파일이 생성이 완료되면 Artisan의migration
명령을 실행하세요. 🎜🎜🎜청구 가능 모델 🎜🎜그런 다음 모델 정의에청구 가능
특성을 추가하세요. 🎜$user = User::find(1); $user->newSubscription('main', 'premium')->create($stripeToken);
🎜🎜API Keys🎜🎜다음으로services.php
파일에서 다음 옵션을 구성해야 합니다: 🎜$user->newSubscription('main', 'monthly')->create($stripeToken, [ 'email' => $email, ]);
🎜마지막으로AppServiceProvider
를 구성해야 합니다. code> code> 서비스 공급자의boot
메소드에 다음 Braintree SDK 호출을 추가합니다: 🎜$user->newSubscription('main', 'monthly') ->withCoupon('code') ->create($stripeToken);
🎜🎜🎜🎜통화 구성
🎜Cashier는 미국 달러(USD)를 기본 통화로 사용합니다. 서비스 제공자의boot
메소드에서Cashier::useCurrency
메소드를 호출하여 기본 통화를 변경할 수 있습니다.useCurrency
메소드는 통화 및 통화 기호라는 두 개의 문자열 매개변수를 허용합니다: 🎜if ($user->subscribed('main')) { // }
🎜🎜🎜🎜🎜🎜🎜Subscribe🎜🎜🎜🎜🎜🎜🎜구독 만들기
구독을 만들려면 먼저 일반적으로
AppUser
의 인스턴스인 Billable 모델 인스턴스를 가져와야 합니다. 모델 인스턴스를 얻은 후에는newSubscription
메서드를 사용하여 모델에 대한 구독을 생성할 수 있습니다.AppUser
的一个实例。一旦您获取了模型实例,您可以使用newSubscription
方法创建模型的订阅: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); }
newSubscription
方法的第一个参数应该是订阅的名称。如果您的应用程序只提供一个订阅,那么您可以将其设置为main
orprimary
。第二个参数是用户订阅的 Stripe / Braintree 计划。这个值应该与 Stripe 或 Braintree 中的标识符对应。create
方法接受一个 Stripe 信用卡 / 源令牌,它将开始订阅,并使用客户 ID 和其他相关的账单信息更新数据库。用户其他的详细信息
如果您想要指定用户其他的详细信息,您可以通过将它们作为第二个参数传递给
create
方法:if ($user->subscription('main')->onTrial()) { // }
要了解更多关于 Stripe 或 Braintree 支持的额外字段,请查看 Stripe 的 内容创建客户文档 或对应的 Braintree 文档。
优惠券
如果您想在创建订阅时使用优惠券,您可以使用
withCoupon
方法:if ($user->subscribedToPlan('monthly', 'main')) { // }
检查订阅状态
一旦用户在您的应用程序订阅了,您可以使用各种方便的方法轻松地检查他们的订阅状态。首先,如果用户有一个激活的订阅,那么
subscribed
的方法将返回true
,即使订阅当前处于试用阶段:if ($user->subscription('main')->recurring()) { // }
这个
subscribed
方法还可以在 路由中间件 使用,允许您根据用户的订阅状态对路由和控制器进行访问:if ($user->subscription('main')->cancelled()) { // }
如果您想要确定用户是否仍然处于试用阶段,您可以使用
onTrial
方法。这个方法对于向用户显示他们仍然处于试用期的警告是很有用的:if ($user->subscription('main')->onGracePeriod()) { // }
基于给定的 Stripe / Braintree 计划 ID,可以使用
subscribedToPlan
方法来确定用户是否订阅了该计划。在本例中,我们将确定用户的main
订阅是否激活了monthly
计划:if ($user->subscription('main')->ended()) { // }
recurring
$user = App\User::find(1); $user->subscription('main')->swap('provider-plan-id');
newSubscription
메서드의 첫 번째 매개변수는 구독. 애플리케이션이 하나의 구독만 제공하는 경우기본
또는기본
으로 설정할 수 있습니다. 두 번째 매개변수는 사용자가 가입한 Stripe/Braintree 계획입니다. 이 값은 Stripe 또는 Braintree의 식별자와 일치해야 합니다.create
메소드는 구독을 시작하고 고객 ID 및 기타 관련 청구 정보로 데이터베이스를 업데이트하는 Stripe 신용 카드/소스 토큰을 허용합니다. 🎜🎜사용자 추가 세부정보
🎜추가 사용자 세부정보를 지정하려면 해당 세부정보를 두 번째 매개변수로 전달하면 됩니다.create
메소드: 🎜$user->subscription('main') ->skipTrial() ->swap('provider-plan-id');
🎜Stripe 또는 Braintree에서 지원하는 추가 필드에 대해 자세히 알아보려면 Stripe의 를 확인하세요. 콘텐츠 고객 문서 생성 또는 해당 Braintree 문서. 🎜🎜쿠폰
🎜구독 생성 시 쿠폰을 사용하려면withCoupon
을 사용하세요. 방법:🎜$user = User::find(1); $user->subscription('main')->incrementQuantity(); // 对当前的订阅量加5... $user->subscription('main')->incrementQuantity(5); $user->subscription('main')->decrementQuantity(); // 对当前的订阅量减5... $user->subscription('main')->decrementQuantity(5);
🎜🎜🎜🎜 사용자가 앱을 구독하시면 다양하고 편리한 방법으로 구독상태를 쉽게 확인하실 수 있습니다. 첫째, 사용자에게 활성 구독이 있는 경우 구독이 현재 평가판인 경우에도subscribed
의 메서드는true
를 반환합니다. 🎜$user->subscription('main')->updateQuantity(10);
🎜Thissubscribed< /code> > 메소드는 라우팅 미들웨어에도 사용할 수 있으며 사용자의 구독 상태에 따라 경로 및 컨트롤러에 액세스할 수 있습니다. 🎜
$user->subscription('main')->noProrate()->updateQuantity(10);
🎜 사용자가 아직 평가판 단계에 있는지 확인하려면onTrial
메소드. 이 방법은 사용자에게 아직 평가판 기간임을 알리는 경고를 표시하는 데 유용합니다. 🎜public function taxPercentage() { return 20; }
🎜주어진 Stripe/Braintree 계획 ID를 기반으로subscribedToPlan
방법을 사용하여 사용자가 요금제에 가입되어 있습니다. 이 예에서는 사용자의기본
구독에월별
요금제가 활성화되어 있는지 확인합니다. 🎜$user->subscription('main')->syncTaxPercentage();
🎜반복
방법을 사용하여 확인할 수 있습니다. 사용자가 현재 이미 구독 중이고 더 이상 평가판 단계가 아닌 경우: 🎜use App\User;use Carbon\Carbon; $user = User::find(1); $anchor = Carbon::parse('first day of next month'); $user->newSubscription('main', 'premium') ->anchorBillingCycleOn($anchor->startOfDay()) ->create($stripeToken);
🎜🎜취소된 구독 상태
사용자가 한 번 구독했지만 구독을 취소했는지 확인하려면
cancelled
메서드를 사용하면 됩니다.cancelled
方法:$user->subscription('main')->cancel();
您还可以确定用户是否已经取消了订阅,但是仍然处于订阅的「宽限期」,直到订阅完全过期为止。例如,如果用户在 3 月 5 日取消了原定于 3 月 10 日到期的订阅,那么用户将在 3 月 10 日之前进行「宽限期」。请注意,在此期间
subscribed
方法仍然返回true
:if ($user->subscription('main')->onGracePeriod()) { // }
如果要确定用户取消订阅的时间是否已不在其 “宽限期” 内,可以使用
ended
方法:$user->subscription('main')->cancelNow();
修改订阅计划
用户在您的应用程序中订阅了之后,他们可能会偶尔想要更改一个新的订阅计划。要将一个用户切换到一个新的订阅,需将订阅计划的标识符传递给
swap
方法:$user->subscription('main')->resume();
如果用户在试用期,试用期的期限会被保留。另外,如果订阅的数量存在「份额」,那么该份额也将保持。
如果你想在更改用户订阅计划的时候取消用户当前订阅的试用期,可以使用
skipTrial
方法:$user = User::find(1);$user->newSubscription('main', 'monthly') ->trialDays(10) ->create($stripeToken);
订阅量
{注意} 订阅量仅由 Cashier 的 Stripe 支持。Braintree 没有一个对应于 Stripe 的「数量」的特性。
有些时候订阅是会受「数量」影响的。举个例子,你的应用程序的付费方式可能是每个账户 / 月。你可以使用
incrementQuantity
和decrementQuantity
方法轻松地增加或减少你的订阅量:use Carbon\Carbon;$user->newSubscription('main', 'monthly') ->trialUntil(Carbon::now()->addDays(10)) ->create($stripeToken);
或者,你可以使用
updateQuantity
方法设定一个特定的数量:if ($user->onTrial('main')) { // } if ($user->subscription('main')->onTrial()) { // }
noProrate
方法可用于更新订阅的数量,而不会对收费进行定价:$user = User::create([ // Populate other user properties... 'trial_ends_at' => now()->addDays(10), ]);
要获得更多关于订阅量的信息,请参考 Stripe 文档.
订阅税额
在计费模式上实现
taxPercentage
方法,并且返回一个 0 到 100 不超过 2 位小数的数字,用来指定用户在订阅中支付的税率百分比。if ($user->onTrial()) { // 用户在他们的试用期内... }
taxPercentage
方法使你能够在模型的基础上应用税率,这对于一个跨越多个国家和税率的用户群可能有帮助。{注意}
taxPercentage
if ($user->onGenericTrial()) { // 用户在他们「一般」试用期... }
또한 사용자가 구독을 취소했는지 확인할 수도 있습니다. 그러나 구독이 완전히 만료될 때까지 여전히 구독의 "유예 기간"에 있습니다. 예를 들어, 사용자가 3월 10일에 만료될 예정인 구독을 3월 5일에 취소하는 경우 사용자에게는 3월 10일까지 '유예 기간'이 제공됩니다. 이 기간 동안subscribed
메소드는 여전히true
를 반환합니다.$user = User::find(1); $user->newSubscription('main', 'monthly')->create($stripeToken);
사용자가 구독을 취소한 시간이 더 이상 " 유예 기간"인 경우 < code>종료 방법을 사용할 수 있습니다:$user->createAsStripeCustomer();
🎜🎜🎜구독 계획 수정
🎜사용자가 앱을 구독한 후 때때로 새로운 구독 계획으로 변경하고 싶을 수도 있습니다. 사용자를 새 구독으로 전환하려면 구독 계획 식별자를swap
메소드에 전달하세요. 🎜$cards = $user->cards();
🎜사용자가 평가판 기간에 있는 경우 평가판 기간이 유지됩니다. 또한, 구독 횟수에 대한 '공유'가 있는 경우 해당 공유도 유지됩니다. 🎜🎜사용자의 구독 계획을 변경할 때 사용자의 현재 구독의 평가판 기간을 취소하려면skipTrial
메서드를 사용할 수 있습니다: 🎜$card = $user->defaultCard();
🎜< /a>🎜🎜구독
🎜{참고} 구독은 Cashier's Stripe에서만 지원됩니다. Braintree에는 Stripe에 해당하는 "수량" 기능이 없습니다. 🎜🎜🎜가끔 구독이 "수량"에 영향을 받는 경우가 있습니다. 예를 들어 앱에 계정당 월 10달러가 청구될 수 있습니다.
incrementQuantity
및decrementQuantity
메서드를 사용하여 구독을 쉽게 늘리거나 줄일 수 있습니다. 🎜if ($user->hasCardOnFile()) { // }
🎜 또는updateQuantity
메서드를 사용하여 설정할 수도 있습니다. 특정 수량: 🎜$user->updateCard($stripeToken);
🎜noProrate
메소드를 사용하면 요금을 책정하지 않고 구독 수량을 업데이트할 수 있습니다. 🎜$user->updateCardFromStripe();
🎜구독 수량에 대한 자세한 내용은 스트라이프 문서.🎜🎜🎜🎜구독 세액
🎜 청구 모드에서taxPercentage
메소드를 구현하고 세율을 지정하기 위해 소수점 이하 2자리 이하로 0에서 100 사이의 숫자를 반환합니다. 사용자가 구독료를 지불하는 것입니다. 🎜foreach ($user->cards() as $card) { $card->delete(); }
🎜taxPercentage
방법을 사용하면 모델 기반으로 세율을 적용할 수 있으며, 이는 여러 국가 및 세율에 걸쳐 있는 사용자 기반에 도움이 될 수 있습니다. 🎜🎜{참고}
taxPercentage
방법은 유료 구독 모델에만 적용됩니다. 요금을 사용하여 "일회성" 요금을 부과하는 경우 동시에 세율을 수동으로 지정해야 합니다. 🎜🎜🎜🎜세율 동기화
taxPercentage
메서드에서 반환된 하드코딩된 값을 변경할 때 사용자의 기존 구독에 대한 세율 설정은 변경되지 않습니다. 반환된taxPercentage
값으로 기존 구독에 대한 세율을 업데이트하려면 사용자의 구독 인스턴스에서syncTaxPercentage
메서드를 호출해야 합니다.taxPercentage
方法返回的硬编码值时,用户的任何现有订阅的税率设置将保持不变。如果要用返回的taxPercentage
值更新现有订阅的税率,应在用户的订阅实例上调用syncTaxPercentage
方法:$user->deleteCards();
订阅锚定日期
{注意} Cashier 中只有 Stripe 支持修改订阅锚定日期。
默认情况下,计费周期锚定是创建订阅的日期,如果使用试用期,则是试用结束的日期。如果要修改账单锚定日期,可以使用
anchorBillingCycleOn
方法:Route::post( 'stripe/webhook', '\Laravel\Cashier\Http\Controllers\WebhookController@handleWebhook' );
有关管理订阅计费周期的详细信息,请参阅 Stripe 计费周期文档
取消订阅
在用户订阅上调用
cancel
方法用来取消订阅:protected $except = [ 'stripe/*', ];
当一个订阅被取消时,Cashier 将会自动在你的数据库中设置
ends_at
列。这个列经常被用来获悉subscribed
字段何时应该开始返回false
。例如,如果客户在 3 月 1 日取消订阅,但是订阅计划直到 3 月 5 日才结束,subscribed
方法将会继续返回true
一直到 3 月 5 日。你可以使用
onGracePeriod
方法确定用户是否确定订阅,但是仍然存在一个「宽限期」:<?php namespace App\Http\Controllers; use Laravel\Cashier\Http\Controllers\WebhookController as CashierController; class WebhookController extends CashierController{ /** * Handle invoice payment succeeded. * * @param array $payload * @return \Symfony\Component\HttpFoundation\Response */ public function handleInvoicePaymentSucceeded($payload) { // 此处处理事件 } }
如果你想马上取消订阅,请在用户的订阅中调用
cancelNow
方法:Route::post( 'stripe/webhook', '\App\Http\Controllers\WebhookController@handleWebhook' );
恢复订阅
如果一个用已经取消订阅,你可以在你希望恢复它的时候使用
resume
Route::post( 'stripe/webhook', '\Laravel\Cashier\Http\Controllers\WebhookController@handleWebhook' );
구독 앵커 날짜
{참고} Cashier의 Stripe만 수정을 지원합니다. 구독 기준일.
기본적으로 결제 주기는 구독이 생성된 날짜를 기준으로 하며, 평가판 기간을 사용하는 경우 평가판 종료 날짜를 기준으로 합니다. 청구 기준 날짜를 수정하려면anchorBillingCycleOn
메서드를 사용하면 됩니다.Route::post( 'braintree/webhook', '\Laravel\Cashier\Http\Controllers\WebhookController@handleWebhook' );
구독 청구 주기 관리에 대한 자세한 내용은 스트라이프 청구 주기 문서취소 구독
구독을 취소하려면 사용자 구독에서cancel
메소드를 호출하세요.protected $except = [ 'braintree/*', ];
구독이 취소되면 Cashier가 자동으로 데이터베이스 코드에🎜ends_at
를 설정합니다. 열. 이 열은subscribed
필드가false
반환을 시작해야 하는 시기를 아는 데 자주 사용됩니다. 예를 들어 고객이 3월 1일에 구독을 취소했지만 구독 요금제가 3월 5일까지 종료되지 않는 경우subscribed
메소드는 3월 5일까지 계속해서true
를 반환합니다.onGracePeriod
메소드를 사용하여 사용자가 구독할 것이 확실하지만 여전히 "유예 기간"이 있는지 확인할 수 있습니다. 🎜<?php namespace App\Http\Controllers; use Braintree\WebhookNotification; use Laravel\Cashier\Http\Controllers\WebhookController as CashierController; class WebhookController extends CashierController{ /** * Handle a new dispute. * * @param \Braintree\WebhookNotification $webhook * @return \Symfony\Component\HttpFoundation\Responses */ public function handleDisputeOpened(WebhookNotification $webhook) { // 此处处理时事件... } }
🎜구독을 즉시 취소하려면 < code>cancelNow 사용자 구독 방법: 🎜Route::post( 'braintree/webhook', '\Laravel\Cashier\Http\Controllers\WebhookController@handleWebhook' );
🎜🎜🎜🎜구독 재개< /h3>🎜구독이 취소된 경우 구독을 재개하고 싶을 때
resume
메소드를 사용할 수 있습니다. 사용자 🎜반드시🎜 유예 기간 내에 있어야 구독을 재개할 수 있습니다. 🎜// Stripe 接收分为单位的费用... $stripeCharge = $user->charge(100); // Braintree 接收美元为单位的费用... $user->charge(1);
🎜 사용자가 구독을 취소했다가 유예 기간 전에 재개하는 경우 즉시 요금이 청구되지 않습니다. 대신 구독이 다시 활성화되며 원래 결제 프로세스에 따라 다시 결제해야 합니다. 🎜🎜🎜🎜🎜🎜🎜🎜평가판 구독🎜🎜🎜🎜🎜🎜🎜신용카드로 구독
고객에게 평가판 기간을 제공하고 동시에 결제 수단 정보를 수집하려면 구독 생성 시
trialDays
메소드를 사용해야 합니다.trialDays
方法:$user->charge(100, [ 'custom_option' => $value, ]);
该方法会在数据库订阅记录上设置订阅期结束时间,以便告知 Sripe / Braintree 在此之前不要计算用户的账单信息。
{注意} 如果顾客没有在试用期结束前取消订阅,订阅会被自动结算,所以你应该确保告知你的用户他们的试用结束期。
trialUntil
方法允许提供DateTime
实例指定试用结束期:try { $response = $user->charge(100); } catch (Exception $e) { // }
你可以使用用户实例的
onTrial
方法或者订阅实例的onTrial
方法判断用户是否处于试用期。下面两个示例等价:// Stripe 接收分为单位的费用... $user->invoiceFor('One Time Fee', 500); // Braintree 接收美元为单位的费用... $user->invoiceFor('One Time Fee', 5);
非信用卡订阅
如果你不想在提供试用期的时候收集用户支付方式信息,只需设置用户记录的
trial_ends_at
列为期望的试用期结束日期即可,这通常在用户注册期间完成:$user->invoiceFor('Stickers', 500, [ 'quantity' => 50, ], [ 'tax_percent' => 21, ]);
{注意} 确保已添加
trial_ends_at
日期修改器 到模型定义。Cashier 把这种类型的引用称为「一般体验」,因为它没有关联任何已存在的订阅。如果当前的日期没有超过
trail_ends_at
值,User
实例的onTrial
方法将会返回true
:$user->invoiceFor('One Time Fee', 500, [ 'description' => 'your invoice description here', ]);
如果你希望明确的知道用户处于「一般」试用期,并且还未创建实际的订阅,那么你可以使用
onGenericTrial
方法:$stripeCharge = $user->charge(100); $user->refund($stripeCharge->id);
如果你准备给用户创建实际的订阅,通常你可以使用
newSubsription
方法:$invoices = $user->invoices(); // 结果包含处理中的发票... $invoices = $user->invoicesIncludingPending();
客户
创建客户
有时,您可能希望在未订阅的情况下创建 Stripe 客户。您可以使用
createAsStripeCustomer
方法完成此操作:<table> @foreach ($invoices as $invoice) <tr> <td>{{ $invoice->date()->toFormattedDateString() }}</td> <td>{{ $invoice->total() }}</td> <td><a href="/user/invoice/{{ $invoice->id }}">Download</a></td> </tr> @endforeach </table>
一旦在 Stripe 中创建了客户,您可以稍后开始订阅。
{提示} 在 Braintree 中创建客户使用的是
createAsBraintreeCustomer
方法。银行卡
接收信用卡
可计费模型实例上的
cards
方法返回LaravelCashierCard
实例的集合:use Illuminate\Http\Request; Route::get('user/invoice/{invoice}', function (Request $request, $invoiceId) { return $request->user()->downloadInvoice($invoiceId, [ 'vendor' => 'Your Company', 'product' => 'Your Product', ]); });
要检索默认卡,可以使用
이 방법은 데이터베이스에 구독을 기록합니다. 구독 기간의 끝을 설정하여 그때까지 사용자의 청구 정보를 계산하지 않도록 Sripe/Braintree에 지시합니다.defaultCard
rrreee{참고} 평가판이 종료되기 전에 고객이 취소하지 않으면 구독이 자동으로 청구되므로 사용자에게 평가판 종료를 알려야 합니다.
trialUntil
메서드를 사용하면DateTime
인스턴스를 제공하여 평가판 종료 기간을 지정할 수 있습니다.rrreeeonTrial
을 사용할 수 있습니다 사용자 인스턴스의 메서드 또는 구독 인스턴스의onTrial
메서드는 사용자가 평가판 기간에 있는지 여부를 결정합니다. 다음 두 가지 예는 동일합니다. 🎜rrreee🎜🎜🎜🎜🎜비신용카드 구독 🎜🎜 평가판 기간을 제공할 때 사용자 결제 방법 정보를 수집하지 않으려면 사용자 기록의trial_ends_at
열을 원하는 평가판 종료 날짜로 설정하세요. 이는 일반적으로 사용자 등록 중에 수행됩니다. 🎜 rrreee🎜{참고} 모델 정의에
🎜Cashier는 이러한 유형의 견적을 기존 구독과 연결되지 않기 때문에 "일반 경험"이라고 부릅니다. 현재 날짜가trial_ends_at
날짜 수정자를 추가했는지 확인하세요. 🎜trail_ends_at
값을 초과하지 않는 경우User
인스턴스의onTrial
메서드는true
를 반환합니다. 🎜rrreee 🎜 사용자가 "일반" 평가판 기간에 있고 아직 실제 구독을 생성하지 않았음을 명시적으로 알고 싶다면onGenericTrial
메서드를 사용할 수 있습니다. 🎜rrreee🎜 사용자를 위한 실제 구독을 생성합니다. 일반적으로newSubsription
메소드를 사용할 수 있습니다: 🎜rrreee🎜🎜🎜🎜고객
🎜🎜🎜🎜🎜고객 만들기🎜🎜때때로 다음을 원할 수도 있습니다. 구독 없이 Stripe 고객을 생성하세요.createAsStripeCustomer
메소드를 사용하여 이 작업을 수행할 수 있습니다. 🎜rrreee🎜Stripe에서 고객이 생성되면 나중에 구독을 시작할 수 있습니다. 🎜🎜{Tip} Braintree에서 고객을 생성하려면
🎜🎜🎜createAsBraintreeCustomer
메소드를 사용하세요. 🎜🎜은행 카드
🎜🎜🎜🎜🎜신용카드 받기🎜🎜청구 가능한 모델 인스턴스의cards
메소드는LaravelCashierCard<를 반환합니다. / 코드 모음> 인스턴스: 🎜rrreee🎜기본 카드를 검색하려면
defaultCard
메서드를 사용할 수 있습니다. 🎜rrreee🎜🎜🎜🎜🎜🎜카드 번호가 파일에 있는지 확인하세요
rrreeehasCardOnFile
메소드를 사용하여 고객의 계정에 신용카드가 저장되어 있는지 확인할 수 있습니다:hasCardOnFile
方法检查客户是否在其帐户上储存了信用卡:更新信用卡
rrreeeupdateCard
方法可用于更新用户的信用卡信息,该方法接受一个 Stripe 令牌并设置一个新的信用卡作为默认支付源:将您的卡信息与客户的默认卡信息进行 Stripe 同步,可以使用
rrreeeupdateCardFromStripe
方法:删除信用卡
要删除卡,应首先使用
rrreeecards
方法检索客户的卡。然后,可以调用要删除的卡实例上的delete
方法:{注意} 如果要删除默认卡,请确保使用
updateCardFromStripe
方法将新的默认卡与数据库同步。
rrreeedeleteCards
方法将删除应用程序存储的用户的所有卡信息:{注意} 如果用户已有订阅,则应考虑阻止他们删除最后剩余的付款方式。
处理 Stripe Webhooks
Stripe 和 Braintree 都可以通过 webhook 通知应用各种各样的事件。要处理 Stripe webhook,需要定义一个 Cashier 的 webhook 控制器的路由。这个控制器可以处理所有进入 webhook 的请求并将他们分发到合适的控制器方法中:
rrreee{注意} 一旦注册了路由,确保在您的 Stripe 控制面板配置了 webhook URL。
默认情况下,这个控制器将会自动对支付失败次数过多(这个次数可以在 Stripe 设置中定义)的订阅进行取消;此外,我们很快会发现,你可以扩展这个控制器去处理任何你想要处理的 webhook 事件。
{注意} 请确保使用 Cashier 的 webhook 验签 中间件来保护传入请求。
Webhooks & CSRF 保护
因为 Stripe webhooks 需要绕过 Laraval 的 CSRF 保护,请确保在你的
VerifyCsrfToken
中间件含有 URI ,或者将其置于web
rrreeeUpdate Credit CardupdateCard
메소드는 사용자의 신용카드 정보를 업데이트하는 데 사용할 수 있습니다. 이 메소드는 다음을 허용합니다. Stripe 토큰을 만들고 새 신용 카드를 기본 결제로 설정합니다. 출처: 🎜rrreee🎜Stripe에서 카드 정보를 고객의 기본 카드 정보와 동기화하려면updateCardFromStripe
방법을 사용할 수 있습니다: 🎜rrreee🎜< a name="deleting-credit-cards">🎜🎜< div name="cf7a10" data-unique="cf7a10">🎜🎜Delete Credit Card🎜🎜카드를 삭제하려면 먼저 <를 사용하여 고객의 카드를 검색해야 합니다. code>카드 메소드. 그런 다음 삭제하려는 카드 인스턴스에서delete
메소드를 호출할 수 있습니다. 🎜rrreee🎜{Note} 기본 카드를 삭제하려면
🎜updateCardFromStripe를 사용해야 합니다.
메소드를 사용하여 새 카드를 업데이트합니다. 기본 카드는 데이터베이스와 동기화됩니다. 🎜deleteCards
메소드는 애플리케이션에 저장된 모든 사용자 카드 정보를 삭제합니다. 🎜rrreee🎜{참고} 사용자가 이미 구독을 갖고 있는 경우 이를 방지하는 것을 고려해야 합니다. 마지막 남은 결제 수단을 삭제하지 마세요. 🎜
🎜🎜🎜🎜Stripe Webhooks 처리
🎜Stripe 및 Braintree Webhook를 통해 다양한 이벤트를 애플리케이션에 알릴 수 있습니다. Stripe 웹훅을 처리하려면 Cashier의 웹훅 컨트롤러에 대한 경로를 정의해야 합니다. 이 컨트롤러는 웹훅으로 들어오는 모든 요청을 처리하고 이를 적절한 컨트롤러 메소드로 전달합니다: 🎜rrreee🎜{참고} 경로가 등록되면 웹훅 URL이 Stripe 제어판에 구성되어 있는지 확인하세요. 🎜
🎜기본적으로 이 컨트롤러는 결제 실패 횟수가 너무 많은 구독을 자동으로 취소합니다(이 숫자는 Stripe 설정에서 정의할 수 있음). 또한 이 컨트롤 핸들러를 확장하여 모든 웹훅을 처리할 수 있음을 곧 알게 될 것입니다. 당신이 원하는 이벤트. 🎜🎜{참고} 들어오는 요청을 보호하려면 Cashier의 웹훅 서명 확인 미들웨어를 반드시 사용하세요. 🎜
🎜웹훅 및 CSRF 보호
🎜Stripe 웹훅은 Laraval의 CSRF 보호를 우회해야 하므로 반드시 추가하세요.VerifyCsrfToken
미들웨어에 URI가 포함되어 있거나web
미들웨어 그룹 외부에 배치: 🎜rrreee🎜🎜🎜🎜🎜🎜웹훅 이벤트 핸들러 정의
Cashier는 결제 실패에 대해 자동으로 구독을 취소하지만 처리하려는 다른 Stripe 웹훅 이벤트가 있는 경우 웹훅 컨트롤러를 확장할 수 있습니다. 메소드 이름은 Cashier가 기대하는 규칙과 일치해야 합니다. 더 구체적으로 말하면 Stripe 웹훅을 처리하려는 메소드 앞에는
rrreeehandle
및 이름 "camelCase"가 붙어야 합니다. 예를 들어invoice.payment_succeeded
의 웹훅을 처리하려면 컨트롤러에handleInvoicePaymentSucceeded
메서드를 추가해야 합니다.handle
和 「驼峰」 名为前缀。举例来说,如果你希望处理invoice.payment_succeeded
的 webhook,你应该在控制器添加handleInvoicePaymentSucceeded
方法:接下来,在
rrreeeroutes/web.php
文件中定义 Cashier 控制器的路由:订阅失败
如果用户的信用卡过期怎么办?不用担心 - Cashier 包含了一个 Webhook 控制器可以轻松为你取消用户的订阅。正如上文所述,你需要做的只是将路由指向控制器:
rrreee就是这样!失败的支付将会被控制器捕获并处理,该控制器会在 Stripe 判断订阅失败后(通常尝试支付失败 3 次及以上)取消用户的订阅。
Webhook 验签
为了保护 Webhook,你需要使用 Stripe 的 webhook 签名。为了方便起见,Cashier 包含一个中间件,用于验证传入 Stripe webhook 的请求是否有效。
如果要启用 Webhook 验证,请确保在
services
配置文件中设置了stripe.webhook.secret
的值。 Webhook 的secret
可以从 Stripe 用户控制面板中找到。处理 Braintree Webhooks
Stripe 和 Braintree 都可以通过 webhooks 通知应用各种各样的事件。要处理 Braintree webhooks,需要定义一个 Cashier webhook 控制器的路由。这个控制器可以处理所有传入 webhook 的请求并将它们分发到合适的路由器方法中:
rrreee{注意} 一旦注册了路由,确保在 Braintree 控制器面板配置了 webhook URL。
默认情况下,这个控制器将会自动对支付失败次数过多(这个次数可以在 Braintree 设置中定义)的订阅进行取消;此外,我们很快会发现,你可以扩展这控制器去处理任何你想要处理的 webhook 事件。
Webhooks & CSRF 保护
因为 Braintree webhooks 需要绕过 Laravel 的 CSRF 保护,请确保在你的
Next,VerifyCsrfToken
中间件列表中含有 URI ,或者将其置于web
rrreeeroutes/ web .php
파일에서 Cashier 컨트롤러의 경로를 정의합니다:구독 실패🎜🎜사용자의 신용카드가 만료되면 어떻게 되나요? 걱정하지 마세요. Cashier에는 사용자를 대신하여 쉽게 구독을 취소할 수 있는 웹훅 컨트롤러가 포함되어 있습니다. 위에서 언급했듯이 컨트롤러에 경로를 지정하기만 하면 됩니다. 🎜rrreee🎜 그게 다입니다! 실패한 결제는 컨트롤러에 의해 캡처 및 처리되며, Stripe에서 구독이 실패했다고 판단한 후(보통 3번 이상의 결제 시도 실패) 사용자의 구독을 취소합니다. 🎜🎜🎜🎜🎜🎜웹훅 서명 확인🎜🎜웹훅을 보호하려면 Stripe의 웹훅 시그니처 🎜. 편의를 위해 Cashier에는 Stripe 웹후크에 전달된 요청이 유효한지 확인하는 미들웨어가 포함되어 있습니다. 🎜🎜웹훅 인증을 활성화하려면services
구성 파일에stripe.webhook.secret
값이 설정되어 있는지 확인하세요. 웹훅의비밀
은 Stripe 사용자 제어판에서 찾을 수 있습니다. 🎜🎜🎜🎜🎜Braintree 웹훅 처리
🎜Stripe와 Braintree는 모두 웹훅을 사용할 수 있습니다. 다양한 이벤트를 애플리케이션에 알립니다. Braintree 웹훅을 처리하려면 Cashier 웹훅 컨트롤러에 대한 경로를 정의해야 합니다. 이 컨트롤러는 들어오는 모든 웹훅 요청을 처리하고 이를 적절한 라우터 메소드로 전달합니다. 🎜rrreee🎜{참고} 경로가 등록되면 Braintree 컨트롤러 패널에 웹훅 URL이 구성되어 있는지 확인하세요. 🎜
🎜기본적으로 이 컨트롤러는 결제 실패 횟수가 너무 많은 구독을 자동으로 취소합니다(이 숫자는 Braintree 설정에서 정의할 수 있음). 또한 이 제어 핸들러를 확장하여 모든 결제를 처리할 수 있음을 곧 알게 될 것입니다. 당신이 원하는 웹훅 이벤트. 🎜🎜웹훅 및 CSRF 보호
🎜Braintree 웹훅은 Laravel의 CSRF 보호를 우회해야 하므로에 이를 추가하세요. verifyCsrfToken
미들웨어 목록에 URI를 포함하거나web
미들웨어 그룹 외부에 배치합니다: 🎜rrreee🎜🎜🎜🎜🎜🎜웹훅 이벤트 핸들러 정의
Cashier는 결제 실패에 대해 자동으로 구독을 취소하지만, 처리하려는 다른 Braintree 웹훅 이벤트가 있는 경우 웹훅 컨트롤러를 확장할 수 있습니다. 메소드 이름은 Cashier가 기대하는 규칙과 일치해야 합니다. 보다 구체적으로 Braintree 웹훅을 처리하려는 메소드 앞에는
rrreeehandle
및 이름 "camelCase"가 붙어야 합니다. 예를 들어dispute_opened
웹훅을 처리하려면 컨트롤러에handleDisputeOpened
메서드를 추가해야 합니다.handle
和「驼峰」名为前缀。举例来说,如果你希望处理dispute_opened
这个 webhook,你应该在控制器添加handleDisputeOpened
方法:订阅失败
如果用户的信用卡过期怎么办?不用担心 - Cashier 包含了一个 Webhook 控制器可以轻松为你取消用户的订阅。只需要将路由指向控制器中:
rrreee就是这样!失败的支付将会被控制器捕获和处理,该控制器会在 Braintree 判断订阅失败后(通常尝试支付失败 3 次及以上)取消用户的订阅。 不要忘记:在你的 Braintree 控制器面板中配置 webhook URI。
一次性支付
简单支付
{注意} 当使用 Stripe 时,
charge
方法接收你想支付于 应用程序使用的货币的最小单位 的金额。然而,当使用 Braintree 时,你应该将全部的美元金额传入charge
方法:如果你想对订阅客户的信用卡收取「一次性」费用,可以在可计费模型实例上使用
rrreeecharge
方法:
rrreeecharge
方法接受一个数组作为它的第二个参数,允许你创建支付时将任何你想要的选项传递给底层的 Stripe / Braintree 。 有关在创建支付时可用的选项,请参阅 Stripe 或 Braintree 文档:如果支付失败,
charge
rrreee구독 실패사용자의 신용카드가 만료되면 어떻게 되나요? 걱정하지 마세요. Cashier에는 사용자를 대신하여 쉽게 구독을 취소할 수 있는 웹훅 컨트롤러가 포함되어 있습니다. 컨트롤러에 경로를 지정하기만 하면 됩니다. 🎜rrreee🎜그게 다입니다! 실패한 결제는 컨트롤러에 의해 캡처 및 처리되며, Braintree가 구독이 실패했다고 판단한 후(일반적으로 3번 이상의 결제 시도 실패) 사용자의 구독을 취소합니다. 잊지 마세요: Braintree 컨트롤러 패널에서 웹훅 URI를 구성하세요. 🎜🎜🎜🎜🎜일회성 결제
🎜🎜🎜🎜🎜간편결제🎜🎜🎜🎜🎜{참고} Stripe 사용 시
🎜구독자의 신용 카드에 "일회성" 수수료를 청구하려면 청구 모델 인스턴스의charge
방식으로 원하는 결제가 가능합니다 <애플리케이션에서 사용하는 최소 통화 단위금액입니다. 하지만 Braintree를 사용할 때는 전체 달러 금액을charge
메소드에 전달해야 합니다. 🎜charge
메소드 사용에서 그렇게 할 수 있습니다: 🎜rrreee🎜charge
메소드는 두 번째 매개변수로 배열을 허용하므로 무엇으로든 결제를 생성할 수 있습니다. 옵션이 기본 Stripe/Braintree에 전달되기를 원합니다. 결제를 생성할 때 사용할 수 있는 옵션은 Stripe 또는 Braintree 문서를 참조하세요. 🎜rrreee🎜결제가 실패하면charge
메소드에서 예외가 발생합니다. 결제가 성공하면 이 메소드는 전체 Stripe / Braintree 응답을 반환합니다: 🎜rrreee🎜🎜🎜🎜🎜🎜수수료 및 송장
때로는 일회성 수수료를 지불해야 할 수도 있고 고객에게 PDF 파일 형식의 영수증을 제공할 수 있도록 수수료 송장을 생성해야 할 수도 있습니다.
rrreeeinvoiceFor
메소드를 사용하면 이 작업을 수행할 수 있습니다. 예를 들어 고객에게 $5.00의 "일회성 수수료"를 청구합니다.invoiceFor
方法可以让你做到这一点。 例如,向客户开具 5.00 美元的「一次性费用」发票:该发票会立即通过用户信用卡支付。
rrreeeinvoiceFor
方法接收一个数组作为第三个参数,允许你在创建支付时将任何你想要的选项传递给底层的 Stripe / Braintree :如果你使用 Braintree 作为你的账单提供者,你在调用
rrreeeinvoiceFor
方法时必须包含description
选项:{注意}
invoiceFor
方法将会创建 Stripe 发票,该发票将会在支付失败后重试。如果你不想失败后重试,你需要在第一次支付失败后调用 Stripe API 关闭它。关于退款
如果您需要处理退款,您可以使用
rrreeerefund
方法。此方法接受 Stripe charge ID 作为其唯一参数:发票
您可以使用
rrreeeinvoices
方法轻松获取账单模型的发票数组:当列出客户发票清单时,可以使用发票辅助函数来显示相关的发票信息。例如,您可能希望在表格中列出每张发票,从而方便客户下载它们:
rrreee生成 PDF 发票
在路由或控制器中,使用
청구서는 사용자의 신용 카드로 즉시 지급됩니다.downloadInvoice
rrreeeinvoiceFor
메소드는 세 번째 매개변수로 배열을 수신하여 결제 생성 시 기본 Stripe/Braintree에 원하는 옵션을 전달할 수 있습니다. {Note}invoiceFor
메서드는 Stripe Invoice를 생성합니다. , 결제 실패 후 재시도됩니다. 실패 후 재시도를 원하지 않는 경우 첫 번째 결제 실패 후 Stripe API를 호출하여 종료해야 합니다.🎜🎜환불 정보🎜🎜환불을 처리해야 하는 경우 다음을 사용할 수 있습니다.환불
방법. 이 메소드는 Stripe 청구 ID를 유일한 매개변수로 허용합니다: 🎜rrreee🎜🎜🎜🎜Invoices
🎜 청구 모델의 송장 배열은invoices
메소드를 사용하여 쉽게 얻을 수 있습니다: 🎜rrreee🎜고객 송장 목록을 나열할 때 송장 도우미 기능을 사용하여 관련 송장 정보를 표시할 수 있습니다. 예를 들어 고객이 더 쉽게 다운로드할 수 있도록 각 송장을 표에 나열할 수 있습니다. 🎜rrreee🎜🎜🎜🎜🎜PDF 송장 생성🎜🎜라우트 또는 컨트롤러에서downloadInvoice
메소드를 사용하여 송장의 PDF 다운로드를 생성하세요. 이 방법은 브라우저에 대한 적절한 HTTP 다운로드 응답을 자동으로 생성합니다. 🎜rrreee🎜이 기사는 🎜LearnKu.com🎜 웹사이트에 처음 게시되었습니다. 🎜🎜