繁体   English   中英

Stripe Checkout Session 用于订阅,webhook 错误

[英]Stripe Checkout Session for Subscription, error on webhook

我正在为我的基于订阅的产品价格创建一个条带结帐 session,如下所示。

$request->user()->createOrGetStripeCustomer();
$array = [
    'customer' => $request->user()->stripe_id,
    'payment_method_types' => ['card'],
    'line_items' => [[
        'price' => $plan->stripe_plan,
        'quantity' => 1,
    ]],
    'mode' => 'subscription',
    'success_url' => route('success'),
    'cancel_url' => route('cancel'),
];
\Stripe\Stripe::setApiKey('sk_test_KEY');
$session = \Stripe\Checkout\Session::create($array);

在视图中,我将用户重定向到结帐页面,如下所示:

<script src="https://js.stripe.com/v3/"></script>
<script>
var stripe = Stripe('pk_test_KEY');
stripe.redirectToCheckout({sessionId: '{{$session->id}}'}).then(function (result) {});
</script>

一切正常,除了 webhook 没有被注册,它会抛出一个错误:

Undefined index: name
Level
ERROR
Exception
{
    "class": "ErrorException",
    "message": "Undefined index: name",
    "code": 0,
    "file": "/home/adm/public_html/vendor/laravel/cashier/src/Http/Controllers/WebhookController.php:79",
    "trace": [
        "/home/adm/public_html/vendor/laravel/cashier/src/Http/Controllers/WebhookController.php:79",
        "/home/adm/public_html/vendor/laravel/cashier/src/Http/Controllers/WebhookController.php:48",
        "/home/adm/public_html/vendor/laravel/framework/src/Illuminate/Routing/Controller.php:54",
        "/home/adm/public_html/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php:45",

我查了WebhookController.php:79 ,基本上没有什么需要索引name 这是WebhookController.php的片段:

protected function handleCustomerSubscriptionUpdated(array $payload)
{
    if ($user = $this->getUserByStripeId($payload['data']['object']['customer'])) {
        $data = $payload['data']['object'];

        $user->subscriptions->filter(function (Subscription $subscription) use ($data) {
            return $subscription->stripe_id === $data['id'];
        })->each(function (Subscription $subscription) use ($data) {
            if (
                isset($data['status']) &&
                $data['status'] === StripeSubscription::STATUS_INCOMPLETE_EXPIRED
            ) {
                $subscription->items()->delete();
                $subscription->delete();

                return;
            }

            // Plan...
            $subscription->stripe_plan = $data['plan']['id'] ?? null;

            // Quantity...
            $subscription->quantity = $data['quantity'];

            // Trial ending date...
            if (isset($data['trial_end'])) {
                $trialEnd = Carbon::createFromTimestamp($data['trial_end']);

                if (! $subscription->trial_ends_at || $subscription->trial_ends_at->ne($trialEnd)) {
                    $subscription->trial_ends_at = $trialEnd;
                }
            }

It's probably because you didn't use Laravel Cashier to create the Checkout Session and the Laravel webhook controller expects values that you didn't provide. 具体来说,Cashier 期望 Session 的元数据中有一个name属性。

由于您根本没有元数据,因此该行失败了。

您应该考虑使用 Cashier 创建 Checkout Session,或者编写自己的 webhook 处理程序代码并且根本不使用 Cashier。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM