【问题标题】:Must provide source or customer using laravel必须使用 laravel 提供来源或客户
【发布时间】:2021-11-29 07:18:19
【问题描述】:

我是这个网站的新手,我通过laravel 使用stripe 支付错误,我配置了我的cartalyst/stripe-laravel 包,但它给了我错误must provide source or customer.,我不知道哪里出错了,和错误是什么意思。

CheckoutController.php

public function store(Request $request)
    {
        //dd($request->all());
        try {
            $charge = Stripe::charges()->create([
                'amount' => Cart::total() / 100,
                'currency' => 'CAD',
                'source' => $request->stripeToken,
                'description' => 'Order',
                'receipt_email' => $request->email,
                'metadata' => [
                    //'contents' => $contents,
                    //'quantity' => Cart::instance('default')->count(),
                ],
            ]);

        return back()->with('success_message', 'Thank you! Your payment has been successfully accepted!');
        } catch (Exception $e) {

        }
    }

checkout.blade.php

<form action="{{ route('checkout.store') }}"  method="post" id="payment-form">
                                    @csrf                    
                                    <div class="form-group">
                                        <div class="card-header">
                                            <label for="card-element">
                                                Enter your credit card information
                                            </label>
                                        </div>
                                        <div class="card-body">
                                            <div id="card-element">
                                            <!-- A Stripe Element will be inserted here. -->
                                            </div>
                                            <!-- Used to display form errors. -->
                                            <div id="card-errors" role="alert"></div>
                                            <input type="hidden" name="plan" value="" />
                                        </div>
                                    </div>
                                    <div class="card-footer">
                                    <button
                                    id="card-button"
                                    class="btn btn-dark"
                                    type="submit"
                                    data-secret="{{ $intent }}"
                                    > Pay </button>
                                    </div>
                                </form>
                            </div>
<script src="https://js.stripe.com/v3/"></script>
    <script>
        // Custom styling can be passed to options when creating an Element.
        // (Note that this demo uses a wider set of styles than the guide below.)

        var style = {
            base: {
                color: '#32325d',
                lineHeight: '18px',
                fontFamily: '"Helvetica Neue", Helvetica, sans-serif',
                fontSmoothing: 'antialiased',
                fontSize: '16px',
                '::placeholder': {
                    color: '#aab7c4'
                },
            },
            invalid: {
                color: '#fa755a',
                iconColor: '#fa755a'
            }
        };
    
        const stripe = Stripe('{{ $stripe_key }}', { locale: 'en' }); // Create a Stripe client.
        const elements = stripe.elements(); // Create an instance of Elements.
        const cardElement = elements.create('card', { style: style }); // Create an instance of the card Element.
        const cardButton = document.getElementById('card-button');
        const clientSecret = cardButton.dataset.secret;
    
        cardElement.mount('#card-element'); // Add an instance of the card Element into the `card-element` <div>.
    
        // Handle real-time validation errors from the card Element.
        cardElement.addEventListener('change', function(event) {
            var displayError = document.getElementById('card-errors');
            if (event.error) {
                displayError.textContent = event.error.message;
            } else {
                displayError.textContent = '';
            }
        });
    
        // Handle form submission.
        var form = document.getElementById('payment-form');
    
        form.addEventListener('submit', function(event) {
            event.preventDefault();
        
        // Disable the submit button to prevent repeated clicks
        document.getElementById('complete-order').disabled = true;

        
    
        stripe.handleCardPayment(clientSecret, cardElement, {
                payment_method_data: {
                    //billing_details: { name: cardHolderName.value }
                }
            })
            .then(function(result) {
                console.log(result);
                if (result.error) {
                    // Inform the user if there was an error.
                    var errorElement = document.getElementById('card-errors');
                    errorElement.textContent = result.error.message;
                } else {
                    console.log(result);
                    form.submit();
                }
            });
        });
    </script>

.env

STRIPE_KEY=pk_test_p7FbGbClL...............
STRIPE_SECRET=sk_test_PcR.............

services.php

'stripe' => [
        'model' => App\User::class,
        'key' => env('STRIPE_KEY'),
        'secret' => env('STRIPE_SECRET'),
    ],

【问题讨论】:

  • 令牌和费用已被弃用,您应该改用 PaymentMethods 和 PaymentIntents。与新的 PaymentIntents API 构建集成允许您的集成处理动态支付、支持身份验证方案(例如 3D Secure)并帮助满足全球不断发展的支付法规(例如强客户身份验证)。您可以在此处了解有关实施 PaymentIntents 的更多信息:stripe.com/docs/payments/payment-intents 或实施使用 PaymentIntents 的 Stripe Checkout:stripe.com/docs/payments/checkout

标签: php laravel stripe-payments


【解决方案1】:

当您尝试创建没有客户或来源标识符的收费请求时,Stripe 返回此错误,但根据您的代码,您尝试访问名为 $request-&gt;stripeToken 的变量,但它也未定义。

这是你可以做的:

  • 选项 #1

    在您的环境中定义条带令牌并在收费请求中设置它

    .env

    STRIPE_TOKEN=XXXXXXXX
    

    控制器

    public function store(Request $request)
        {
            //dd($request->all());
            try {
                $charge = Stripe::charges()->create([
                    'amount' => Cart::total() / 100,
                    'currency' => 'CAD',
                    'source' => env("STRIPE_TOKEN", "somedefaultvalue"),
                    'description' => 'Order',
                    'receipt_email' => $request->email,
                    'metadata' => [
                        //'contents' => $contents,
                        //'quantity' => Cart::instance('default')->count(),
                    ],
                ]);
    
            return back()->with('success_message', 'Thank you! Your payment has been successfully accepted!');
            } catch (Exception $e) {
    
            }
        }
    
  • 选项 #2

    定义客户而不是来源。为此,您首先需要创建一个客户而不是条带,然后将客户 ID 传递给计费请求: 您可以通过您使用的库中的客户创建方法创建客户(https://cartalyst.com/manual/stripe/2.0#create-a-customer

    然后它将返回一个客户数组。在控制器方法中使用 "id" 键作为客户标识符:

    public function store(Request $request)
        {
            //dd($request->all());
            try {
                $customer = $stripe->customers()->create([
                    'email' => 'john@doe.com',
                ]);
                $charge = Stripe::charges()->create([
                    'amount' => Cart::total() / 100,
                    'currency' => 'CAD',
                    'customer' => $customer['id'],
                    'description' => 'Order',
                    'receipt_email' => $request->email,
                    'metadata' => [
                        //'contents' => $contents,
                        //'quantity' => Cart::instance('default')->count(),
                    ],
                ]);
    
            return back()->with('success_message', 'Thank you! Your payment has been successfully accepted!');
            } catch (Exception $e) {
    
            }
        }
    

【讨论】:

    猜你喜欢
    • 2016-03-28
    • 2017-07-18
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    • 2016-01-03
    • 2019-03-31
    • 2021-08-26
    相关资源
    最近更新 更多