Php 条纹/Laravel“;该客户没有附加的付款来源或默认付款方式。”;

Php 条纹/Laravel“;该客户没有附加的付款来源或默认付款方式。”;,php,laravel,stripe-payments,laravel-cashier,Php,Laravel,Stripe Payments,Laravel Cashier,这里有很多人都有同样的问题,除了我在这里找到的关于Stripe API这个问题的所有帖子都来自一个不推荐的Stripe版本,代码似乎已经完全改变了,所以他们的付款方式附件对我来说不起作用。我几乎一字不差地直接从Laravel出纳文档中获得了代码 目前,它在客户端看起来是这样的 <script src="https://js.stripe.com/v3/"></script> <script> window.addEventLis

这里有很多人都有同样的问题,除了我在这里找到的关于Stripe API这个问题的所有帖子都来自一个不推荐的Stripe版本,代码似乎已经完全改变了,所以他们的付款方式附件对我来说不起作用。我几乎一字不差地直接从Laravel出纳文档中获得了代码

目前,它在客户端看起来是这样的

    <script src="https://js.stripe.com/v3/"></script>
    <script>
        window.addEventListener('load', function() {
            const stripe = Stripe('mystripekey');

            const elements = stripe.elements();
            const cardElement = elements.create('card');

            cardElement.mount('#card-element');

            const cardHolderName = document.getElementById('card-holder-name');
            const cardButton = document.getElementById('card-button');
            const clientSecret = cardButton.dataset.secret;

            cardButton.addEventListener('click', async (e) => {
                const { setupIntent, error } = await stripe.confirmCardSetup(
                    clientSecret, {
                        payment_method: {
                            card: cardElement,
                            billing_details: { name: cardHolderName.value }
                        }
                    }
                );
                if (error) {
                    // Display "error.message" to the user...
                } else {
                    alert("it works");
                    $("#paymentForm").submit();
                }
            });
        });
    </script>
@endsection

@section('content')
    <div class="mt-5 border border-secondary rounded container w-25">
        <h3 class="mt-3 text-left font-weight-bold">Upgrade Account</h3>
        {!! Form::open(['action' => 'PaymentController@paymentLeadUser', 'method' => 'POST', 'id' => 'paymentForm']) !!}
            @csrf
                <input value="user_premium" type="hidden">
                <label for="card-holder-name">Card Holder Name:</label>
                <input id="card-holder-name" class="w-100 mb-3" name="card-holder-name" type="text">
                <!-- Stripe Elements Placeholder -->
                <div id="card-element" class="form-control"></div>

                <button id="card-button" class="my-4 btn btn-primary"data-secret="{{ $intent->client_secret }}">
                    Upgrade to Premium
                </button>
        {!! Form::close() !!}
    </div>
@endsection

addEventListener('load',function()){
常量stripe=stripe('mystripekey');
常量元素=stripe.elements();
const cardElement=elements.create('card');
挂载(“#卡元素”);
const CANDERNAME=document.getElementById('card-holder-name');
const cardButton=document.getElementById('card-button');
const clientSecret=cardButton.dataset.secret;
cardButton.addEventListener('click',async(e)=>{
const{setupIntent,error}=wait stripe.confirmCardSetup(
客户机密{
付款方式:{
卡片:cardElement,
账单详细信息:{name:cardingname.value}
}
}
);
如果(错误){
//向用户显示“错误消息”。。。
}否则{
警惕(“它起作用”);
$(“#paymentForm”).submit();
}
});
});
@端部
@节(“内容”)
升级帐户
{!!Form::open(['action'=>'PaymentController@paymentLeadUser“,”方法“=>”发布“,”id“=>”支付表单“])
@csrf
持卡人姓名:
升级到高级
{!!Form::close()!!}
@端部
我的控制器有这个代码

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Auth;

class PaymentController extends Controller
{
    public function __construct() {
        $this->middleware('auth');
    }

    public function paymentPage() {
        $user = Auth::user();
        $data = [

            'intent' => $user->createSetupIntent()

        ];

        return view('payment')->with($data);
    }

    public function paymentLeadUser(Request $request) {
        $user = auth()->user();
        $paymentMethod = $request->payment_method;

        $user->newSubscription('default', 'plan_id')->create($paymentMethod);

        return redirect('/userlanding')->with('success', 'User has subscribed successfully!');
    }
}

用代码调试这一点有点棘手,因为Laravel将Stripe的许多API抽象出来。基于此处的错误,问题在于您尝试订阅计划的客户没有附加有效的PaymentMethod。您应该能够在仪表板中确认这一点。另外,在代码中添加一些日志,以确认
$paymentMethod
今天不是空的,并且该卡已连接到客户(如果没有将SetupIntent配置为保存卡,则可能没有连接到该卡),直到Laravel隐藏为止,我翻阅了Stripe的全部文档并重新格式化了代码,现在情况更好了,因为我只收到了一个错误日志,上面写着:“收到未知参数:对象、账单详细信息、卡、创建、livemode、类型”。我将更新帖子以显示新代码。它还创建了一个客户,开始付款,然后在服务器代码失败时取消付款。@Nathan您使用的是哪个版本的laravel和laravel出纳?