除非我错过了什么,否则我看不到任何收银员包装器来提供付款意图的创建,这存在吗?
虽然 Cashier v10 添加了一些内容来处理 SCA,但它对我不起作用,因为我通过字体端元素处理付款详细信息,因此重定向到新route
很混乱。
我需要按照本指南处理它 https://stripe.com/docs/payments/payment-intents/migration
这需要创建如下所示的付款意图:
$intent = StripePaymentIntent::create([
'payment_method' => $json_obj->payment_method_id,
'amount' => 1099,
'currency' => 'gbp',
'confirmation_method' => 'manual',
'confirm' => true,
]);
我当然可以直接从 Stripe sdk 执行此操作,如下所示,但鉴于我可能会添加更多功能,这些功能可能会利用 Cashier 的其他功能,这将使通过 Cashier 处理所有内容时保持更干净。
我可以通过收银员创建付款意图还是错过了付款意图?如果是这样,如何?还是我应该以不同的方式处理这个问题?
进一步调查后,答案是
LaravelCashierBillable->charge($amount,$method,$options)
方法在幕后进行StripePaymentIntent::create($options)
。
有一些事项需要注意:
- 默认情况下,选项
confirmation_method
将设置为automatic
,confirm
设置为true
- 将设置
currency
选项,并将使用出纳默认货币 amount
选项将根据传入$amount
进行设置,payment_method
选项将根据传入$method
进行设置。- 通过在
$options
参数中传递等效值,都可以用替换覆盖这些值
最后,如果您需要 SCA(我确实这样做了(,那么您必须捕获一个LaravelCashierExceptionsPaymentActionRequired
异常,并为此重定向到内置Cashier
页面,或者通过您的 API 请求在前端处理它。
我不是收银员用户,但它看起来像是 Stripe Billing 的接口,因此它主要处理与计费相关的原语。 据我所知,它确实在引擎盖下使用了PaymentIntents(用于验证需要身份验证的发票付款(,但没有直接公开PaymentIntent的创建。
收银员文档建议在需要身份验证时将集成重定向到"付款页面":https://laravel.com/docs/5.8/billing#payments-requiring-additional-confirmation(对于付款意图处于状态requires_action
的情况(
对于直接创建PaymentIntents,stripe-php API库将是正确的方法。
扩展 Laravel\Cashier\Billable Traits; 和拉拉维尔\收银员\关注\执行费用; 并使用它代替用户模型中的默认计费特征
<?php
namespace AppTraitsStripe;
use LaravelCashierConcernsManagesCustomer;
use LaravelCashierConcernsManagesInvoices;
use LaravelCashierConcernsManagesPaymentMethods;
use LaravelCashierConcernsManagesSubscriptions;
use AppTraitsStripeCustomPerformCharges as PerformsCharges;
trait CustomBillable
{
use ManagesCustomer;
use ManagesInvoices;
use ManagesPaymentMethods;
use ManagesSubscriptions;
use PerformsCharges;
}
trait CustomPerformCharges
{
use PerformsCharges;
public function authorize(int $amount): Payment
{
if (!$this->hasStripeId()) {
throw new BadRequestException(__('User is not a stripe customer'));
}
$paymentMethod = $this->defaultPaymentMethod();
$options = [
'capture_method' => 'manual'
];
return $this->charge($amount, $paymentMethod, $options);
}
public function capture(int $amount, string $paymentIntent): void
{
$intent = StripePaymentIntent::retrieve($paymentIntent, $this->stripeOptions());
$intent->capture(['amount_to_capture' => $amount]);
}
}
注意:现在可以创建付款意图(使用 Laravel 10.x 检查(
这是官方文档的链接:https://laravel.com/docs/10.x/billing#creating-payment-intents
复制以下历史目的
您可以通过在可计费模型实例上调用支付方法来创建新的 Stripe 支付意向。调用此方法将创建包装在LaravelCashierPayment
实例中的付款意向:
use IlluminateHttpRequest;
Route::post('/pay', function (Request $request) {
$payment = $request->user()->pay(
$request->get('amount')
);
return $payment->client_secret;
});
创建付款意向后,可以将客户端密码返回到应用程序的前端,以便用户可以在其浏览器中完成付款。