在 Stripe 中更新信用卡

问题描述

我尝试了一些解决方案,但无法创建正确的表单来更新信用卡。 我创建了一个特殊页面来管理信用卡更新。

另外,我想了解什么时候自动续订您的信用卡已过期或“失败”,会发生什么?订阅是否继续进行 X 次尝试?

现在,我的代码如下:

控制器

    public function setupPayment(){
            return view('update-card',[
                'intent' => Auth::user()->createSetupIntent()
            ]);
        }
        public function updateExistingCreditCard(Request $request){
            
            $key = \config('services.stripe.secret');
            $stripe = new \Stripe\StripeClient($key);
            
            $this->validate($request,[
                'address' => 'nullable','name' => 'nullable'
            ]);
            
            $user = Cashier::findBillable(Auth::user()->stripe_id);
            //$user = Auth::user()->asstripeCustomer();
    
            if($user->hasDefaultPaymentMethod()){
                
                $stripe->customers->updateSource(
                    $user->stripe_id,$user->id,['name' => 'Jenny Rosen']
                );
                
                return redirect()->back()->with('success','Update.');
                
            }
            
            return redirect()->back()->with('danger','Error.');
            
        }

HTML

<form id="payment-form" action="{{ route('update.new.credit.card') }}" method="POST">
    @csrf
    <div class="row">

        <div class="col-lg-6">

            <div class="card">
                <div class="card-header">
                    {{ __('Update Card') }}
                </div>

                <div class="card-body">

                    <input id="card-holder-name" type="text">

                    <!-- Stripe Elements Placeholder -->
                    <div id="card-element"></div>

                    <button id="card-button" data-secret="{{ $intent->client_secret }}">
                        Update Payment Method
                    </button>

                </div>
            </div>

        </div>


    </div>
</form>
    const stripe = Stripe('{{ config('cashier.key') }}');

    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) {
            document.getElementById('card-button').disabled = false
        } else {
            let token = document.createElement('input')
            
            token.setAttribute('type','hidden')
            token.setAttribute('name','token')
            token.setAttribute('value',setupIntent.payment_method)

            form.appendChild(token)

            form.submit();
        }
    });


更新

在这个新代码中,通过插入元数据字段,它们被正确更新,所以我猜代码是正确的。我可能对传递给更新卡并将其认给客户的参数有误。

$stripeCustomer = Auth::user()->asstripeCustomer();
        $paymentMethod = $stripe->customers->retrieve($stripeCustomer->id)->invoice_settings->default_payment_method;

        if(Auth::user()->hasDefaultPaymentMethod()){
            
            $stripe->customers->update($stripeCustomer->id,[
                ['invoice_settings' => ['default_payment_method' => $paymentMethod]]
            ]);
            
            return redirect()->back()->with('success','Update.');
            
        }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)