gpt4 book ai didi

Laravel 收银员在卡更新后重新尝试待处理发票

转载 作者:行者123 更新时间:2023-12-04 17:54:37 32 4
gpt4 key购买 nike

我正在使用 Laravel 5.3 和 Cashier。如果客户更新了他们的卡详细信息,我如何检查是否有待处理的发票并要求 Stripe 重新尝试在新卡上收费?目前,我已经在 Stripe 仪表板中设置了尝试设置。但据我了解,如果客户更新了他们的银行卡详细信息,Stripe 不会自动尝试向客户收费,而是等待下一个尝试日期再试一次。这就是为什么我想在客户更新卡后立即手动尝试向客户收取未决发票的费用。我阅读了 Cashier 文档和 Github 页面,但此处未涵盖这种情况。

$user->updateCard($token);
// Next charge customer if there is a pending invoice

谁能帮帮我。

最佳答案

在测试并与 Stripe 支持人员交谈后,我发现了 Laravel Cashier 中当前使用的 updateCard() 方法的问题。

使用当前的 updateCard() 方法,卡片被添加到源列表中,然后将新卡片设置为 default_source。此方法的结果有 2 个结果:

  1. 尽管最近的一张卡片被设置为 default_source

  2. ,但仍有多张卡片被添加到列表中
  3. 使用此方法更新卡片时,如果有任何未支付的发票(即处于past_due 状态的发票),它们不会自动收费。

为了让 stripe 重新尝试对处于 past_due 状态的所有发票向客户收费,需要传递 source 参数。所以我创建了一个类似这样的新方法:

public function replaceCard($token)
{
$customer = $this->asStripeCustomer();
$token = StripeToken::retrieve($token, ['api_key' => $this->getStripeKey()]);
// If the given token already has the card as their default source, we can just
// bail out of the method now. We don't need to keep adding the same card to
// a model's account every time we go through this particular method call.
if ($token->card->id === $customer->default_source) {
return;
}
// Just pass `source: tok_xxx` in order for the previous default source
// to be deleted and any unpaid invoices to be retried
$customer->source = $token;
$customer->save();
// Next we will get the default source for this model so we can update the last
// four digits and the card brand on the record in the database. This allows
// us to display the information on the front-end when updating the cards.
$source = $customer->default_source
? $customer->sources->retrieve($customer->default_source)
: null;
$this->fillCardDetails($source);
$this->save();
}

我创建了一个 Pull request对于这个添加。由于直接编辑 Billable 文件进行任何更改并不是一个好主意,如果这没有被添加到 Cashier,那么您可以在 Controller 文件中使用以下内容直接从那里执行此操作:

$user = Auth::User();

$customer = $user->asStripeCustomer();
$token = StripeToken::retrieve($token, ['api_key' => config('services.stripe.secret')]);

if (!($token->card->id === $customer->default_source)) {
$customer->source = $token;
$customer->save();
// Next synchronise user's card details and update the database
$user->updateCardFromStripe();
}

关于Laravel 收银员在卡更新后重新尝试待处理发票,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41427928/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com