Boîte à outils de trading de caissier
- S'abonner
- Créer un abonnement
- Vérifier l'état de l'abonnement
- Date d'ancrage de l'abonnement Gestion des Webhooks Stripe
- Définir Événements Webhook
- Traitement des Webhooks Braintree
- Échec de l'abonnement
- Charge unique
- "Recharge simple"
Introduction
Laravel Cashier fournit une interface intuitive et fluide pour accéder aux services d'abonnement payants de Stripe's et Braintree's. Il peut gérer des codes d’abonnement payants qui vous donnent presque mal à la tête. En plus de fournir une gestion de base des abonnements, Cashier peut vous aider avec les coupons, les abonnements d'échange, les « quantités » d'abonnement, les délais de grâce d'annulation et même générer des factures PDF.
{Remarque} Si vous avez juste besoin d'un paiement « unique » et que vous ne proposez pas d'abonnement, vous ne devriez pas utiliser Cashier. Il est recommandé d'utiliser les SDK Stripe et Braintree.
Mise à niveau de Cashier
Avant de passer d'une ancienne version à la dernière version de Cashier, il est recommandé de lire le Guide de mise à niveau de Cashier.
Configuration
Stripe
Composer
Tout d'abord, ajoutez le package Cashier de Stripe aux dépendances de votre projet :
composer require laravel/cashier
Migration de base de données
Avant d'utiliser Cashier, vous devez préparer la base de données. Cashier doit ajouter quelques colonnes à votre table
users
et créer une nouvelle tablesubscriptions
pour contenir tous les abonnements de vos clients :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 的
migrate
命令。Billable 模型
接下来,添加
Billable
Trait 到您的模型定义。这个 Trait 提供了多个方法以便执行常用支付任务,例如创建订阅、使用优惠券以及更新信用卡信息:use Laravel\Cashier\Billable;class User extends Authenticatable{ use Billable; }
API Keys
最后,在配置文件
services.php
'stripe' => [ 'model' => App\User::class, 'key' => env('STRIPE_KEY'), 'secret' => env('STRIPE_SECRET'), ],
Une fois les fichiers de migration créés, exécutez Commandemigrate
de l'artisan.Modèle facturableEnsuite, ajoutez le traitBillable
à la définition de votre modèle. Cette fonctionnalité fournit plusieurs méthodes pour effectuer des tâches de paiement courantes, telles que la création d'abonnements, l'utilisation de coupons et la mise à jour des informations de carte de crédit :composer require "laravel/cashier-braintree":"~2.0"
Clés APIEnfin, Configurez la clé de Stripe dans le fichier de configurationservices.php
. Vous pouvez obtenir ces informations sur la clé de l'API Stripe dans le panneau de contrôle personnel du site officiel de Stripe : 🎜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(); });
🎜🎜🎜🎜🎜🎜🎜Braintree🎜🎜🎜.Braintree Notes
Dans de nombreux cas, Stripe et Braintree implémentent les fonctions de caisse de la même manière. Tous deux fournissent la fonction de paiement d'abonnement par carte de crédit, et Braintree prend également en charge le paiement via PayPal. Mais Braintree manque également de certaines fonctionnalités prises en charge par Stripe. Avant de décider d'utiliser Stripe ou Braintree, vous devez considérer les points suivants :
- Braintree prend en charge PayPal, mais pas Stripe.
- Braintree ne prend pas en charge les méthodes
increment
etdecrement
, il s'agit d'une limitation de Braintree, pas d'une limitation de Cashier.increment
和decrement
方法,这是 Braintree 的限制,而不是 Cashier 限制。 - Braintree 不支持基于百分比的折扣。这是 Braintree 的限制,而不是 Cashier 限制。
Composer
首先,将 Braintree 的 Cashier 包添加到您项目的依赖项中:
use Laravel\Cashier\Billable; class User extends Authenticatable{ use Billable; }
信用卡优惠计划
在使用 Cashier 之前,你需要首先在 Braintree 控制面板中定义一个
plan-credit
折扣。这个折扣会根据用户选择的支付选项匹配合适的折扣比例,比如选择年付或者月付。在 Braintree 控制面板中配置的折扣总额可以随意填写,Cashier 会在每次使用优惠券的时候根据您的配置来覆盖该默认值。由于 Braintree 不支持使用订阅频率来匹配折扣比例,所以这个优惠券是必需的。
数据库迁移
开始使用 Cashier 之前,需要 准备数据库。Cashier 需要在您的数据库
users
表中新增几个列,以及创建一个新的subscriptions
表来存储客户的订阅信息:'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'), ],
一旦迁移文件建立好后,运行 Artisan 的
migrate
命令。Billable 模型
然后,添加
Billable
Trait 到你的模型定义中:\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'));
API Keys
紧接着,您应该在
services.php
文件中配置以下选项:use Laravel\Cashier\Cashier; Cashier::useCurrency('eur', '€');
最后,您必须向
AppServiceProvider
服务提供者的boot
方法中,添加以下的 Braintree SDK 调用:$user = User::find(1); $user->newSubscription('main', 'premium')->create($stripeToken);
货币配置
Cashier 使用美元(USD)作为默认货币。您可以通过在服务提供者的
Braintree ne prend pas en charge les remises basées sur un pourcentage. Il s'agit d'une limitation de Braintree, pas d'une limitation de Cashier.boot
方法中调用Cashier::useCurrency
方法来更改默认的货币。这个useCurrency
ComposerTout d'abord, ajoutez le package Cashier de Braintree aux dépendances de votre projet :$user->newSubscription('main', 'monthly')->create($stripeToken, [ 'email' => $email, ]);
Plan de réduction sur carte de créditAvant d'utiliser Cashier, vous devez d'abord définir un
plan-crédit
de réduction dans le panneau de configuration Braintree. Cette remise correspondra au taux de remise approprié en fonction de l'option de paiement sélectionnée par l'utilisateur, comme le paiement annuel ou le paiement mensuel.Le montant total de la remise configuré dans le panneau de contrôle Braintree peut être renseigné comme vous le souhaitez, et Cashier écrasera la valeur par défaut en fonction de votre configuration à chaque fois qu'un coupon est utilisé. Ce coupon est requis car Braintree ne prend pas en charge l'utilisation de la fréquence d'abonnement pour correspondre aux ratios de remise.🎜🎜Migration de base de données🎜🎜Avant de commencer à utiliser Cashier, vous devez préparer la base de données. Le caissier doit ajouter quelques nouvelles colonnes à la tableusers
de votre base de données, ainsi que créer une nouvelle tablesubscriptions
pour stocker les informations d'abonnement de vos clients : 🎜$user->newSubscription('main', 'monthly') ->withCoupon('code') ->create($stripeToken);
🎜Une fois la migration effectuée Le fichier est créé. Une fois terminé, exécutez la commandemigrate
d'Artisan. 🎜🎜🎜Modèle facturable 🎜🎜Ensuite, ajoutez le traitBillable
à la définition de votre modèle : 🎜if ($user->subscribed('main')) { // }
🎜🎜Clés API🎜🎜Ensuite, vous devez configurer les options suivantes dans le fichierservices.php
: 🎜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); }
🎜Enfin, vous devez configurer leAppServiceProvider code> code> Dans la méthode
boot
du fournisseur de services, ajoutez l'appel suivant du SDK Braintree : 🎜if ($user->subscription('main')->onTrial()) { // }
🎜🎜🎜🎜Configuration des devises
🎜Le caissier utilise le dollar américain (USD) comme devise par défaut. Vous pouvez modifier la devise par défaut en appelant la méthodeCashier::useCurrency
dans la méthodeboot
du fournisseur de services. La méthodeuseCurrency
accepte deux paramètres de chaîne : la devise et le symbole monétaire : 🎜if ($user->subscribedToPlan('monthly', 'main')) { // }
🎜🎜🎜🎜🎜🎜🎜Subscribe🎜🎜🎜🎜🎜🎜🎜Créer un abonnement
Pour créer un abonnement, vous devez d'abord obtenir une instance de modèle Facturable, qui est généralement une instance de
AppUser
. Une fois que vous avez obtenu l'instance du modèle, vous pouvez créer un abonnement au modèle en utilisant la méthodenewSubscription
:AppUser
的一个实例。一旦您获取了模型实例,您可以使用newSubscription
方法创建模型的订阅:if ($user->subscription('main')->recurring()) { // }
newSubscription
方法的第一个参数应该是订阅的名称。如果您的应用程序只提供一个订阅,那么您可以将其设置为main
orprimary
。第二个参数是用户订阅的 Stripe / Braintree 计划。这个值应该与 Stripe 或 Braintree 中的标识符对应。create
方法接受一个 Stripe 信用卡 / 源令牌,它将开始订阅,并使用客户 ID 和其他相关的账单信息更新数据库。用户其他的详细信息
如果您想要指定用户其他的详细信息,您可以通过将它们作为第二个参数传递给
create
方法:if ($user->subscription('main')->cancelled()) { // }
要了解更多关于 Stripe 或 Braintree 支持的额外字段,请查看 Stripe 的 内容创建客户文档 或对应的 Braintree 文档。
优惠券
如果您想在创建订阅时使用优惠券,您可以使用
withCoupon
方法:if ($user->subscription('main')->onGracePeriod()) { // }
检查订阅状态
一旦用户在您的应用程序订阅了,您可以使用各种方便的方法轻松地检查他们的订阅状态。首先,如果用户有一个激活的订阅,那么
subscribed
的方法将返回true
,即使订阅当前处于试用阶段:if ($user->subscription('main')->ended()) { // }
这个
subscribed
方法还可以在 路由中间件 使用,允许您根据用户的订阅状态对路由和控制器进行访问:$user = App\User::find(1); $user->subscription('main')->swap('provider-plan-id');
如果您想要确定用户是否仍然处于试用阶段,您可以使用
onTrial
方法。这个方法对于向用户显示他们仍然处于试用期的警告是很有用的:$user->subscription('main') ->skipTrial() ->swap('provider-plan-id');
基于给定的 Stripe / Braintree 计划 ID,可以使用
subscribedToPlan
方法来确定用户是否订阅了该计划。在本例中,我们将确定用户的main
订阅是否激活了monthly
计划:$user = User::find(1); $user->subscription('main')->incrementQuantity(); // 对当前的订阅量加5... $user->subscription('main')->incrementQuantity(5); $user->subscription('main')->decrementQuantity(); // 对当前的订阅量减5... $user->subscription('main')->decrementQuantity(5);
recurring
$user->subscription('main')->updateQuantity(10);
Le premier paramètre de la méthodenewSubscription
doit être le nom de l'abonnement. Si votre application ne propose qu'un seul abonnement, vous pouvez le définir surmain
ouprimary
. Le deuxième paramètre est le forfait Stripe/Braintree auquel l'utilisateur est abonné. Cette valeur doit correspondre à un identifiant dans Stripe ou Braintree. La méthodecreate
accepte une carte de crédit/jeton source Stripe, qui démarrera l'abonnement et mettra à jour la base de données avec l'identifiant client et d'autres informations de facturation pertinentes. 🎜🎜Détails supplémentaires de l'utilisateur
🎜Si vous souhaitez spécifier des détails supplémentaires sur l'utilisateur, vous pouvez le faire en les transmettant comme deuxième paramètre transmis à la méthodecreate
: 🎜$user->subscription('main')->noProrate()->updateQuantity(10);
🎜Pour en savoir plus sur Stripe ou sur les champs supplémentaires pris en charge par Braintree, consultez le de Stripe. Contenu Créer un document client ou le document Braintree correspondant. 🎜🎜Coupon
🎜Si vous souhaitez utiliser un coupon lors de la création d'un abonnement, vous pouvez utiliser lewithCoupon
méthode :🎜public function taxPercentage() { return 20; }
🎜🎜🎜🎜 Vérifiez l'état de l'abonnement 🎜🎜 une fois que l'utilisateur est dans votre app Abonné, vous pouvez facilement vérifier l'état de leur abonnement en utilisant diverses méthodes pratiques. Premièrement, si l'utilisateur a un abonnement actif, alors les méthodes desubscribe
renverronttrue
même si l'abonnement est actuellement en cours d'essai : 🎜$user->subscription('main')->syncTaxPercentage();
🎜Cesubscribe< /code> > La méthode peut également être utilisée dans un middleware de routage, vous permettant d'accéder aux routes et aux contrôleurs en fonction du statut d'abonnement de l'utilisateur : 🎜
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);
🎜 Si vous souhaitez déterminer si l'utilisateur est toujours en phase d'essai, vous pouvez utiliseronTrial
méthode. Cette méthode est utile pour afficher un avertissement à l'utilisateur indiquant qu'il est toujours en période d'essai : 🎜$user->subscription('main')->cancel();
🎜En fonction d'un identifiant de plan Stripe / Braintree donné, la méthodesubscribeToPlan
peut être utilisée pour déterminer si le l'utilisateur est abonné au forfait. Dans cet exemple, nous déterminerons si l'abonnementprincipal
de l'utilisateur a le forfaitmensuel
activé : 🎜if ($user->subscription('main')->onGracePeriod()) { // }
🎜La méthoderécurrente
peut être utilisée pour déterminer si l'utilisateur est actuellement déjà abonné et n'est plus en phase d'essai : 🎜$user->subscription('main')->cancelNow();
🎜🎜Statut de l'abonnement annulé
Pour déterminer si l'utilisateur était une fois abonné, mais a annulé son abonnement, vous pouvez utiliser la méthode
annulé
:cancelled
方法:$user->subscription('main')->resume();
您还可以确定用户是否已经取消了订阅,但是仍然处于订阅的「宽限期」,直到订阅完全过期为止。例如,如果用户在 3 月 5 日取消了原定于 3 月 10 日到期的订阅,那么用户将在 3 月 10 日之前进行「宽限期」。请注意,在此期间
subscribed
方法仍然返回true
:$user = User::find(1);$user->newSubscription('main', 'monthly') ->trialDays(10) ->create($stripeToken);
如果要确定用户取消订阅的时间是否已不在其 “宽限期” 内,可以使用
ended
方法:use Carbon\Carbon;$user->newSubscription('main', 'monthly') ->trialUntil(Carbon::now()->addDays(10)) ->create($stripeToken);
修改订阅计划
用户在您的应用程序中订阅了之后,他们可能会偶尔想要更改一个新的订阅计划。要将一个用户切换到一个新的订阅,需将订阅计划的标识符传递给
swap
方法:if ($user->onTrial('main')) { // } if ($user->subscription('main')->onTrial()) { // }
如果用户在试用期,试用期的期限会被保留。另外,如果订阅的数量存在「份额」,那么该份额也将保持。
如果你想在更改用户订阅计划的时候取消用户当前订阅的试用期,可以使用
skipTrial
方法:$user = User::create([ // Populate other user properties... 'trial_ends_at' => now()->addDays(10), ]);
订阅量
{注意} 订阅量仅由 Cashier 的 Stripe 支持。Braintree 没有一个对应于 Stripe 的「数量」的特性。
有些时候订阅是会受「数量」影响的。举个例子,你的应用程序的付费方式可能是每个账户 / 月。你可以使用
incrementQuantity
和decrementQuantity
方法轻松地增加或减少你的订阅量:if ($user->onTrial()) { // 用户在他们的试用期内... }
或者,你可以使用
updateQuantity
方法设定一个特定的数量:if ($user->onGenericTrial()) { // 用户在他们「一般」试用期... }
noProrate
方法可用于更新订阅的数量,而不会对收费进行定价:$user = User::find(1); $user->newSubscription('main', 'monthly')->create($stripeToken);
要获得更多关于订阅量的信息,请参考 Stripe 文档.
订阅税额
在计费模式上实现
taxPercentage
方法,并且返回一个 0 到 100 不超过 2 位小数的数字,用来指定用户在订阅中支付的税率百分比。$user->createAsStripeCustomer();
taxPercentage
方法使你能够在模型的基础上应用税率,这对于一个跨越多个国家和税率的用户群可能有帮助。{注意}
taxPercentage
$cards = $user->cards();
Vous pouvez également déterminer si l'utilisateur a annulé son abonnement, mais est toujours dans le « délai de grâce » de l'abonnement jusqu'à l'expiration complète de l'abonnement. Par exemple, si un utilisateur annule le 5 mars un abonnement qui devait expirer le 10 mars, l'utilisateur bénéficiera d'un « délai de grâce » jusqu'au 10 mars. Veuillez noter que la méthodesubscribe
renvoie toujourstrue
pendant cette période :$card = $user->defaultCard();
Si vous souhaitez déterminer si l'heure à laquelle l'utilisateur a annulé l'abonnement n'est plus dans son " période de grâce", vous pouvez utiliser la méthode < code>terminée :if ($user->hasCardOnFile()) { // }
🎜🎜🎜Modifier le plan d'abonnement< /h3>🎜Une fois que les utilisateurs se sont abonnés à votre application, ils peuvent parfois souhaiter passer à un nouveau plan d'abonnement. Pour faire basculer un utilisateur vers un nouvel abonnement, transmettez l'identifiant du forfait d'abonnement à la méthode
swap
: 🎜$user->updateCard($stripeToken);
🎜Si l'utilisateur est en période d'essai, la durée de la période d'essai est conservée. De plus, s'il existe une « part » pour le nombre d'abonnements, cette part sera également maintenue. 🎜🎜Si vous souhaitez annuler la période d'essai de l'abonnement actuel de l'utilisateur lors du changement de plan d'abonnement de l'utilisateur, vous pouvez utiliser la méthodeskipTrial
: 🎜$user->updateCardFromStripe();
🎜< /a>🎜🎜Abonnements
🎜{Note} Les abonnements ne sont pris en charge que par Cashier's Stripe. Braintree n'a pas de fonctionnalité « quantité » qui correspond à Stripe. 🎜🎜🎜Parfois, l'abonnement sera affecté par la "quantité". Par exemple, votre application peut être facturée par compte 10 $/mois. Vous pouvez facilement augmenter ou diminuer votre abonnement en utilisant les méthodes
incrementQuantity
etdecrementQuantity
: 🎜foreach ($user->cards() as $card) { $card->delete(); }
🎜 Alternativement, vous pouvez le définir en utilisant la méthodeupdateQuantity
A quantité spécifique : 🎜$user->deleteCards();
🎜 La méthodenoProrate
peut être utilisée pour mettre à jour la quantité d'un abonnement sans facturer les frais : 🎜Route::post( 'stripe/webhook', '\Laravel\Cashier\Http\Controllers\WebhookController@handleWebhook' );
🎜Pour plus d'informations sur les quantités d'abonnement, veuillez vous référer à Documentation Stripe.🎜🎜🎜🎜Montant de la taxe d'abonnement
🎜implémentez la méthodetaxPercentage
sur le mode de facturation et renvoyez un nombre de 0 à 100 avec pas plus de 2 décimales pour spécifier le pourcentage de taxe que les utilisateurs paient sur leur abonnement. 🎜protected $except = [ 'stripe/*', ];
🎜 La méthodetaxPercentage
vous permet d'appliquer des taux d'imposition sur une base de modèle, ce qui peut être utile pour une base d'utilisateurs couvrant plusieurs pays et taux d'imposition. 🎜🎜{Note} La méthode
taxPercentage
s'applique uniquement aux modèles d'abonnement payants. Si vous utilisez des frais pour effectuer des frais « uniques », vous devez en même temps spécifier manuellement le taux de taxe. 🎜🎜🎜🎜Synchroniser le pourcentage de taxe
Lors de la modification de la valeur codée en dur renvoyée par la méthode
taxPercentage
, les paramètres de taux de taxe pour tous les abonnements existants de l'utilisateur resteront inchangés. Si vous souhaitez mettre à jour le taux de taxe d'un abonnement existant avec la valeurtaxPercentage
renvoyée, vous devez appeler la méthodesyncTaxPercentage
sur l'instance d'abonnement de l'utilisateur :taxPercentage
方法返回的硬编码值时,用户的任何现有订阅的税率设置将保持不变。如果要用返回的taxPercentage
值更新现有订阅的税率,应在用户的订阅实例上调用syncTaxPercentage
方法:<?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) { // 此处处理事件 } }
订阅锚定日期
{注意} Cashier 中只有 Stripe 支持修改订阅锚定日期。
默认情况下,计费周期锚定是创建订阅的日期,如果使用试用期,则是试用结束的日期。如果要修改账单锚定日期,可以使用
anchorBillingCycleOn
方法:Route::post( 'stripe/webhook', '\App\Http\Controllers\WebhookController@handleWebhook' );
有关管理订阅计费周期的详细信息,请参阅 Stripe 计费周期文档
取消订阅
在用户订阅上调用
cancel
方法用来取消订阅:Route::post( 'stripe/webhook', '\Laravel\Cashier\Http\Controllers\WebhookController@handleWebhook' );
当一个订阅被取消时,Cashier 将会自动在你的数据库中设置
ends_at
列。这个列经常被用来获悉subscribed
字段何时应该开始返回false
。例如,如果客户在 3 月 1 日取消订阅,但是订阅计划直到 3 月 5 日才结束,subscribed
方法将会继续返回true
一直到 3 月 5 日。你可以使用
onGracePeriod
方法确定用户是否确定订阅,但是仍然存在一个「宽限期」:Route::post( 'braintree/webhook', '\Laravel\Cashier\Http\Controllers\WebhookController@handleWebhook' );
如果你想马上取消订阅,请在用户的订阅中调用
cancelNow
方法:protected $except = [ 'braintree/*', ];
恢复订阅
如果一个用已经取消订阅,你可以在你希望恢复它的时候使用
resume
<?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) { // 此处处理时事件... } }
Date d'ancrage de l'abonnement
{Remarque} Seul Stripe dans Cashier prend en charge la modification la date de référence de la souscription.
Par défaut, le cycle de facturation est ancré à la date de création de l'abonnement, ou si vous utilisez une période d'essai, à la date de fin de l'essai. Si vous souhaitez modifier la date d'ancrage de facturation, vous pouvez utiliser la méthodeanchorBillingCycleOn
:Route::post( 'braintree/webhook', '\Laravel\Cashier\Http\Controllers\WebhookController@handleWebhook' );
Pour plus d'informations sur la gestion des cycles de facturation des abonnements, voir Document du cycle de facturation StripeAnnuler abonnement
Appelez la méthodecancel
sur l'abonnement utilisateur pour annuler l'abonnement :// Stripe 接收分为单位的费用... $stripeCharge = $user->charge(100); // Braintree 接收美元为单位的费用... $user->charge(1);
Lorsqu'un abonnement est annulé, Cashier définira automatiquement🎜Vous pouvez utiliser la méthodeends_at dans votre code de base de données> colonne. Cette colonne est souvent utilisée pour savoir quand un champ
subscribe
doit commencer à renvoyerfalse
. Par exemple, si le client annule son abonnement le 1er mars, mais que le plan d'abonnement ne se termine que le 5 mars, la méthodesubscriber
continuera à renvoyertrue
jusqu'au 5 mars.onGracePeriod
pour déterminer si l'utilisateur est sûr de s'abonner, mais il y a toujours un "délai de grâce" : 🎜$user->charge(100, [ 'custom_option' => $value, ]);
🎜Si vous souhaitez annuler l'abonnement immédiatement, veuillez appeler < code>annulerMaintenant dans l'abonnement de l'utilisateur Méthode : 🎜try { $response = $user->charge(100); } catch (Exception $e) { // }
🎜🎜🎜🎜Reprendre les abonnements< /h3>🎜Si l'on utilise L'abonnement a été annulé, vous pouvez utiliser la méthode
resume
lorsque vous souhaitez le reprendre. Les utilisateurs 🎜doivent🎜 être encore dans leur délai de grâce avant de pouvoir reprendre leur abonnement : 🎜// Stripe 接收分为单位的费用... $user->invoiceFor('One Time Fee', 500); // Braintree 接收美元为单位的费用... $user->invoiceFor('One Time Fee', 5);
🎜Si un utilisateur a annulé son abonnement puis le reprend avant son délai de grâce, il ne sera pas facturé immédiatement. Au lieu de cela, leur abonnement sera réactivé et ils devront payer à nouveau selon le processus de paiement initial. 🎜🎜🎜🎜🎜🎜🎜🎜Abonnement d'essai🎜🎜🎜🎜🎜🎜🎜Abonnez-vous par carte bancaire
Si vous souhaitez offrir une période d'essai à vos clients et collecter en même temps les informations sur les moyens de paiement, alors vous devez utiliser la méthode
trialDays
lors de la création de l'abonnement :trialDays
方法:$user->invoiceFor('Stickers', 500, [ 'quantity' => 50, ], [ 'tax_percent' => 21, ]);
该方法会在数据库订阅记录上设置订阅期结束时间,以便告知 Sripe / Braintree 在此之前不要计算用户的账单信息。
{注意} 如果顾客没有在试用期结束前取消订阅,订阅会被自动结算,所以你应该确保告知你的用户他们的试用结束期。
trialUntil
方法允许提供DateTime
实例指定试用结束期:$user->invoiceFor('One Time Fee', 500, [ 'description' => 'your invoice description here', ]);
你可以使用用户实例的
onTrial
方法或者订阅实例的onTrial
方法判断用户是否处于试用期。下面两个示例等价:$stripeCharge = $user->charge(100); $user->refund($stripeCharge->id);
非信用卡订阅
如果你不想在提供试用期的时候收集用户支付方式信息,只需设置用户记录的
trial_ends_at
列为期望的试用期结束日期即可,这通常在用户注册期间完成:$invoices = $user->invoices(); // 结果包含处理中的发票... $invoices = $user->invoicesIncludingPending();
{注意} 确保已添加
trial_ends_at
日期修改器 到模型定义。Cashier 把这种类型的引用称为「一般体验」,因为它没有关联任何已存在的订阅。如果当前的日期没有超过
trail_ends_at
值,User
实例的onTrial
方法将会返回true
:<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>
如果你希望明确的知道用户处于「一般」试用期,并且还未创建实际的订阅,那么你可以使用
onGenericTrial
方法:use Illuminate\Http\Request; Route::get('user/invoice/{invoice}', function (Request $request, $invoiceId) { return $request->user()->downloadInvoice($invoiceId, [ 'vendor' => 'Your Company', 'product' => 'Your Product', ]); });
如果你准备给用户创建实际的订阅,通常你可以使用
rrreeenewSubsription
方法:客户
创建客户
有时,您可能希望在未订阅的情况下创建 Stripe 客户。您可以使用
rrreeecreateAsStripeCustomer
方法完成此操作:一旦在 Stripe 中创建了客户,您可以稍后开始订阅。
{提示} 在 Braintree 中创建客户使用的是
createAsBraintreeCustomer
方法。银行卡
接收信用卡
可计费模型实例上的
rrreeecards
方法返回LaravelCashierCard
实例的集合:要检索默认卡,可以使用
Cette méthode enregistrera l'abonnement dans la base de données. Définissez une heure de fin de période d'abonnement sur l'application pour indiquer à Sripe/Braintree de ne pas calculer les informations de facturation de l'utilisateur d'ici là.defaultCard
rrreee{Note} Les abonnements sont automatiquement facturés si le client n'annule pas avant la fin de l'essai, vous devez donc vous assurer d'informer vos utilisateurs de la fin de leur essai.
La méthodetrialUntil
permet de spécifier la période de fin d'essai en fournissant une instanceDateTime
:rrreeeVous pouvez utiliser leonTrial
méthode de l'instance utilisateur ou La méthodeonTrial
de l'instance d'abonnement détermine si l'utilisateur est en période d'essai. Les deux exemples suivants sont équivalents : 🎜rrreee🎜🎜🎜🎜🎜Abonnement sans carte de crédit 🎜🎜 Si vous ne souhaitez pas collecter d'informations sur le mode de paiement de l'utilisateur lorsque vous proposez une période d'essai, définissez simplement la colonnetrial_ends_at
de l'enregistrement utilisateur sur la date de fin d'essai souhaitée, ce qui est généralement effectué lors de l'enregistrement de l'utilisateur : 🎜 rrreee🎜{Note} Assurez-vous d'avoir ajouté le modificateur de date
🎜Cashier qualifie ce type de devis d'"expérience générique" car il n'est associé à aucun abonnement existant. Si la date actuelle ne dépasse pas la valeurtrial_ends_at
à la définition du modèle. 🎜trail_ends_at
, la méthodeonTrial
de l'instanceUser
renverratrue
: 🎜rrreee🎜 Si vous souhaitez savoir explicitement que l'utilisateur est en période d'essai "générale" et n'a pas encore créé d'abonnement proprement dit, alors vous pouvez utiliser la méthodeonGenericTrial
: 🎜rrreee🎜Si vous êtes va créer un abonnement réel pour l'utilisateur, généralement Vous pouvez utiliser la méthodenewSubsription
: 🎜rrreee🎜🎜🎜🎜Clients
🎜🎜🎜🎜🎜Création de clients🎜🎜Parfois, vous pouvez souhaitez créer des clients Stripe sans abonnement. Vous pouvez le faire en utilisant la méthodecreateAsStripeCustomer
: 🎜rrreee🎜Une fois le client créé dans Stripe, vous pourrez ultérieurement démarrer un abonnement. 🎜🎜{Astuce} Pour créer un client dans Braintree, utilisez la méthode
🎜🎜🎜createAsBraintreeCustomer
. 🎜🎜Cartes bancaires
🎜🎜🎜🎜🎜Recevoir une carte de crédit🎜🎜La méthodecards
sur une instance de modèle facturable renvoieLaravelCashierCard< / Une collection d'instances de code> : 🎜rrreee🎜Pour récupérer la carte par défaut, vous pouvez utiliser la méthode
defaultCard
🎜rrreee🎜🎜🎜🎜🎜🎜 ;Assurez-vous que le numéro de carte est enregistré
Vous pouvez vérifier si le client a une carte de crédit stockée sur son compte en utilisant la méthode
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
rrreeeMettre à jour la carte de crédit La méthodeupdateCard
peut être utilisée pour mettre à jour les informations de la carte de crédit de l'utilisateur. Cette méthode accepte un jeton Stripe et définit une nouvelle carte de crédit comme paiement par défaut. Source : 🎜rrreee🎜Pour que Stripe synchronise les informations de votre carte avec les informations de carte par défaut du client, vous pouvez utiliser la méthodeupdateCardFromStripe
: 🎜rrreee🎜< a name="deleting-credit-cards">🎜🎜< div name="cf7a10" data-unique="cf7a10">🎜🎜Supprimer une carte de crédit🎜🎜Pour supprimer une carte, vous devez d'abord récupérer les cartes du client à l'aide du < méthode code>cartes. Vous pouvez ensuite appeler la méthodedelete
sur l'instance de carte que vous souhaitez supprimer : 🎜rrreee🎜{Note} Si vous souhaitez supprimer la carte par défaut, assurez-vous d'utiliser le
🎜updateCardFromStripe Méthode
pour mettre à jour la nouvelle carte La carte par défaut est synchronisée avec la base de données. La méthode 🎜deleteCards
supprimera toutes les informations de carte de l'utilisateur stockées par l'application : 🎜rrreee🎜{Note} Si l'utilisateur a déjà un abonnement, vous devriez envisager de les empêcher de supprimer le dernier mode de paiement restant. 🎜
🎜🎜🎜🎜Gestion des webhooks Stripe
🎜Stripe et Braintree Les applications peuvent être informées de divers événements via des webhooks. Pour gérer les webhooks Stripe, vous devez définir un itinéraire vers le contrôleur de webhook de Cashier. Ce contrôleur gère toutes les requêtes entrant dans le webhook et les envoie à la méthode de contrôleur appropriée : 🎜rrreee🎜{Note} Une fois la route enregistrée, assurez-vous que l'URL du webhook est configurée dans votre panneau de configuration Stripe. 🎜
🎜Par défaut, ce contrôleur annulera automatiquement les abonnements qui ont trop de paiements échoués (ce nombre peut être défini dans les paramètres de Stripe, de plus, nous découvrirons bientôt que vous pouvez étendre ce gestionnaire de contrôle pour gérer n'importe quel webhook) ; les événements que vous souhaitez. 🎜🎜{Remarque} Veuillez vous assurer d'utiliser le middleware de vérification de signature webhook de Cashier pour protéger les demandes entrantes. 🎜
🎜Webhooks et protection CSRF
🎜Étant donné que les webhooks Stripe doivent contourner la protection CSRF de Laraval, assurez-vous de l'ajouter votre middlewareVerifyCsrfToken
contient un URI, ou placez-le en dehors du groupe de middlewareweb
: 🎜rrreee🎜🎜🎜🎜🎜🎜Définir les gestionnaires d'événements Webhook
Cashier se désabonne automatiquement en cas d'échec de paiement, mais si vous souhaitez gérer d'autres événements Webhook Stripe, vous pouvez étendre le contrôleur Webhook. Les noms de vos méthodes doivent correspondre à la convention attendue par Cashier, plus précisément, la méthode que vous souhaitez gérer le webhook Stripe doit être préfixée par
rrreeehandle
et "camelCase" le nom. Par exemple, si vous souhaitez gérer le webhook deinvoice.payment_succeeded
, vous devez ajouter la méthodehandleInvoicePaymentSucceeded
dans le contrôleur :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 保护,请确保在你的
Ensuite, dansVerifyCsrfToken
中间件列表中含有 URI ,或者将其置于web
rrreeeroutes/ web Définissez l'itinéraire du contrôleur de caisse dans le fichier .php
:Échec de l'abonnement🎜🎜Que se passe-t-il si la carte de crédit de l'utilisateur expire ? Ne vous inquiétez pas, Cashier comprend un contrôleur de webhook qui peut facilement désabonner les utilisateurs pour vous. Comme mentionné ci-dessus, il vous suffit de pointer l'itinéraire vers le contrôleur : 🎜rrreee🎜 Et voilà ! Les paiements échoués seront capturés et traités par le contrôleur, qui annulera l'abonnement de l'utilisateur une fois que Stripe aura déterminé que l'abonnement a échoué (généralement 3 tentatives de paiement infructueuses ou plus). 🎜🎜🎜🎜🎜🎜Vérification de la signature du Webhook🎜🎜Pour protéger le Webhook, vous devez utiliser Signatures webhook de Stripe 🎜. Pour plus de commodité, Cashier inclut un middleware qui vérifie que les requêtes transmises au webhook Stripe sont valides. 🎜🎜Si vous souhaitez activer l'authentification webhook, assurez-vous que la valeur destripe.webhook.secret
est définie dans le fichier de configurationservices
. Lesecret
du webhook peut être trouvé à partir du panneau de contrôle utilisateur Stripe. 🎜🎜🎜🎜🎜Gestion des webhooks Braintree
🎜Stripe et Braintree peuvent tous deux utiliser des webhooks Notifier les applications de divers événements. Pour gérer les webhooks Braintree, vous devez définir un itinéraire vers le contrôleur de webhook Cashier. Ce contrôleur gère toutes les requêtes de webhook entrantes et les envoie à la méthode de routeur appropriée : 🎜rrreee🎜{Note} Une fois la route enregistrée, assurez-vous que l'URL du webhook est configurée dans le panneau du contrôleur Braintree. 🎜
🎜Par défaut, ce contrôleur annulera automatiquement les abonnements qui ont trop de paiements échoués (ce nombre peut être défini dans les paramètres de Braintree de plus, nous découvrirons bientôt que vous pouvez étendre ce gestionnaire de contrôle pour gérer n'importe quel type de paiement) ; événements webhook souhaités. 🎜🎜Webhooks et protection CSRF
🎜Étant donné que les webhooks Braintree doivent contourner la protection CSRF de Laravel, assurez-vous de l'ajouter à votreVerifyCsrfToken< /code> Incluez l'URI dans la liste des middlewares ou placez-le en dehors du groupe de middlewares
web
: 🎜rrreee🎜🎜🎜🎜🎜🎜Définir le gestionnaire d'événements Webhook
Le caissier se désabonne automatiquement en cas d'échec de paiement, mais si vous souhaitez gérer d'autres événements Webhook Braintree, vous pouvez étendre le contrôleur Webhook. Les noms de vos méthodes doivent correspondre à la convention attendue par Cashier, plus précisément, la méthode que vous souhaitez gérer le webhook Braintree doit être préfixée par
rrreeehandle
et "camelCase" le nom. Par exemple, si vous souhaitez gérer le webhookdispute_opened
, vous devez ajouter la méthodehandleDisputeOpened
à votre contrôleur :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Échec de l'abonnementEt si la carte de crédit de l'utilisateur expire ? Ne vous inquiétez pas, Cashier comprend un contrôleur de webhook qui peut facilement désabonner les utilisateurs pour vous. Pointez simplement l'itinéraire dans le contrôleur : 🎜rrreee🎜C'est tout ! Les paiements échoués seront capturés et traités par le contrôleur, qui annulera l'abonnement de l'utilisateur une fois que Braintree aura déterminé que l'abonnement a échoué (généralement 3 tentatives de paiement échouées ou plus). N'oubliez pas : configurez l'URI du webhook dans votre panneau de contrôleur Braintree. 🎜🎜🎜🎜🎜Paiement unique
🎜🎜🎜🎜🎜Paiement simple🎜🎜🎜🎜🎜{Note} Lors de l'utilisation de Stripe, la méthode
🎜Si vous souhaitez facturer des frais « uniques » sur la carte de crédit de l'abonné, vous pouvez le faire dans Utilisez la méthodecharge
accepte le paiement que vous souhaitez à réaliser en< La plus petite unité monétaire utilisée par l'applicationMontant. Cependant, lorsque vous utilisez Braintree, vous devez transférer la totalité du montant en dollars dans la méthodecharge
: 🎜charge
sur l'instance du modèle de facturation : 🎜rrreee🎜 La méthodecharge
accepte un tableau comme deuxième paramètre, vous permettant de créer un paiement avec n'importe quel vous souhaitez que les options soient transmises au Stripe/Braintree sous-jacent. Consultez la documentation Stripe ou Braintree pour les options disponibles lors de la création d'un paiement : 🎜rrreee🎜La méthodecharge
lèvera une exception si le paiement échoue. Si le paiement réussit, cette méthode renverra la réponse complète de Stripe / Braintree : 🎜rrreee🎜🎜🎜🎜🎜🎜Frais et factures
Parfois, vous devrez peut-être payer des frais uniques et également générer une facture de frais afin de pouvoir fournir des reçus au format de fichier PDF à vos clients. La méthode
rrreeeinvoiceFor
vous permet de le faire. Par exemple, facturez à un client des « frais uniques » de 5,00 $ :invoiceFor
方法可以让你做到这一点。 例如,向客户开具 5.00 美元的「一次性费用」发票:该发票会立即通过用户信用卡支付。
rrreeeinvoiceFor
方法接收一个数组作为第三个参数,允许你在创建支付时将任何你想要的选项传递给底层的 Stripe / Braintree :如果你使用 Braintree 作为你的账单提供者,你在调用
rrreeeinvoiceFor
方法时必须包含description
选项:{注意}
invoiceFor
方法将会创建 Stripe 发票,该发票将会在支付失败后重试。如果你不想失败后重试,你需要在第一次支付失败后调用 Stripe API 关闭它。关于退款
如果您需要处理退款,您可以使用
rrreeerefund
方法。此方法接受 Stripe charge ID 作为其唯一参数:发票
您可以使用
rrreeeinvoices
方法轻松获取账单模型的发票数组:当列出客户发票清单时,可以使用发票辅助函数来显示相关的发票信息。例如,您可能希望在表格中列出每张发票,从而方便客户下载它们:
rrreee生成 PDF 发票
在路由或控制器中,使用
La facture est immédiatement payée sur la carte de crédit de l'utilisateur. La méthodedownloadInvoice
rrreeeinvoiceFor
reçoit un tableau comme troisième paramètre, vous permettant de transmettre toutes les options que vous souhaitez au Stripe/Braintree sous-jacent lors de la création du paiement : {Note} La méthodeinvoiceFor
créera une facture Stripe , qui sera réessayé après l'échec du paiement. Si vous ne souhaitez pas réessayer après un échec, vous devez appeler l'API Stripe pour la fermer après l'échec du premier paiement.🎜🎜À propos des remboursements🎜🎜Si vous devez traiter un remboursement, vous pouvez utiliser Méthode deremboursement
. Cette méthode accepte l'ID de charge Stripe comme seul paramètre : 🎜rrreee🎜🎜🎜🎜Factures
🎜 Vous Le tableau de factures du modèle de facturation peut être facilement obtenu en utilisant la méthodefactures
: 🎜rrreee🎜Lors de la liste d'une liste de factures clients, vous pouvez utiliser la fonction d'aide à la facture pour afficher les informations de facture pertinentes. Par exemple, vous souhaiterez peut-être répertorier chaque facture dans un tableau pour permettre aux clients de les télécharger plus facilement : 🎜rrreee🎜🎜🎜🎜🎜Générer une facture PDF🎜🎜Dans une route ou un contrôleur, utilisez la méthodedownloadInvoice
pour générer un téléchargement PDF d'une facture. Cette méthode générera automatiquement une réponse de téléchargement HTTP appropriée au navigateur : 🎜rrreee🎜Cet article a été publié pour la première fois sur le site Web 🎜LearnKu.com🎜. 🎜🎜