Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 条带支付始终成功,并且无法更改paymentIntent的金额_Javascript_Php_Laravel_Stripe Payments - Fatal编程技术网

Javascript 条带支付始终成功,并且无法更改paymentIntent的金额

Javascript 条带支付始终成功,并且无法更改paymentIntent的金额,javascript,php,laravel,stripe-payments,Javascript,Php,Laravel,Stripe Payments,为了在我的Laravel应用程序中实现Stripe,我苦苦挣扎了很长一段时间,但我遇到了很多问题。我确实以某种方式实现了逻辑,但我无法或不知道如何发送当前订单总额以创建paymentIntent,所有付款都以默认金额500存储,设置在控制器中。我必须提到,在stripe成功响应后,当前订单应存储在数据库中,其中包含用户发货详细信息,这些信息在第一个表单中找到,所有订购的产品都存储在会话中。为了更好地理解,让我给你看看 这是一个视图(revieworder.blade.php),其中我有两个表单,

为了在我的Laravel应用程序中实现Stripe,我苦苦挣扎了很长一段时间,但我遇到了很多问题。我确实以某种方式实现了逻辑,但我无法或不知道如何发送当前订单总额以创建paymentIntent,所有付款都以默认金额500存储,设置在控制器中。我必须提到,在stripe成功响应后,当前订单应存储在数据库中,其中包含用户发货详细信息,这些信息在第一个表单中找到,所有订购的产品都存储在会话中。为了更好地理解,让我给你看看

这是一个视图(revieworder.blade.php),其中我有两个表单,一个包含用户的发货详细信息,一个是条带付款表单,以及会话中的购物车产品列表:

<ul class="list-group mb-3">
    <?php $total = 0 ?>
    @if(session('cart'))
        @foreach(session('cart') as $id => $details)
        <?php $total += $details['price'] * $details['quantity'] ?>
            <li class="list-group-item d-flex justify-content-between lh-condensed">
                <img src="../img/{{ $details['image'] }}" alt="{{ $details['name'] }}" width="60" height="60">
                <div>
                    <h6 class="my-0">{{ $details['name'] }}</h6>
                    <small class="text-muted">{{ __('Quantity') }}: {{ $details['quantity'] }}</small><br>
                    <small class="text-muted">{{ __('Unit price') }}: {{ $details['price'] }} RON</small>
                </div>
                <span class="text-muted">{{ $details['price'] * $details['quantity'] }} RON</span>
            </li>
        @endforeach
    @endif
    <li class="list-group-item d-flex justify-content-between">
        <span>Total (RON)</span>
        <strong id="total">{{ $total.' RON' }}</strong>
    </li>
</ul>


<form id="payment-form">
     @csrf
     <div id="card-element"><!--Stripe.js injects the Card Element--></div>
     <button id="submit" class="submit-id">
          <div class="spinner hidden" id="spinner"></div>
          <span id="button-text">Pay now</span>
      </button>
      <p id="card-error" role="alert"></p>
      <p class="result-message hidden">
      </p>
</form>

<script>
//Stripe script
var stripe = Stripe("pk_test_XXX");

// The items the customer wants to buy
var purchase = {
  items: [{id: "prod"}]   //sessions cart
};
console.log(purchase);

var elements = stripe.elements();

    var style = {
      base: { //some styling },
      invalid: {
        fontFamily: 'Arial, sans-serif',
        color: "#fa755a"
      }
    };

    var card = elements.create("card", { style: style });
    // Stripe injects an iframe into the DOM
    card.mount("#card-element");

    card.on("change", function (event) {
      // Disable the Pay button if there are no card details in the Element
      document.querySelector("button").disabled = event.empty;
      document.querySelector("#card-error").textContent = event.error ? event.error.message : "";
    });
// Disable the button until we have Stripe set up on the page
document.getElementsByClassName("submit-id").disabled = true;

$('#payment-form').submit(function(){
    fetch("{{ url(app()->getLocale().'/revieworder') }}", {
    method: "POST",
    headers: {
        "Content-Type": "application/json",
        'X-CSRF-TOKEN': "{{ csrf_token() }}"
    },
    body: JSON.stringify(purchase)
    })
    .then(function(data) {
        $('#payment-form').submit(function(event) {
        event.preventDefault();
        // Complete payment when the submit button is clicked
        payWithCard(stripe, card, data.clientSecret);
        });
    });

    // Calls stripe.confirmCardPayment
    var payWithCard = function(stripe, card, clientSecret) {
    loading(true);
    stripe
        .confirmCardPayment(clientSecret, {
        payment_method: {
            card: card
        }
        })
        .then(function(result) {
        if (result.error) {
            // Show error to your customer
            showError(result.error.message);
        } else {
            // The payment succeeded!
            // The order should be stored in the database
            orderComplete(result.paymentIntent.id);
        }
        });
    };

    // Shows a success message when the payment is complete
    var orderComplete = function(paymentIntentId) {
    loading(false);
    document
        .querySelector(".result-message a")
        .setAttribute(
        "href",
        "https://dashboard.stripe.com/test/payments/" + paymentIntentId
        );
    document.querySelector(".result-message").classList.remove("hidden");
    document.getElementsByClassName("submit-id").disabled = true;
    };

    // Show the customer the error from Stripe if their card fails to charge
    var showError = function(errorMsgText) {
    loading(false);
    var errorMsg = document.querySelector("#card-error");
    errorMsg.textContent = errorMsgText;
    setTimeout(function() {
        errorMsg.textContent = "";
    }, 4000);
    };

    // Show a spinner on payment submission
    var loading = function(isLoading) {
    if (isLoading) {
        // Disable the button and show a spinner
        document.getElementsByClassName("submit-id").disabled = true;
        document.querySelector("#spinner").classList.remove("hidden");
        document.querySelector("#button-text").classList.add("hidden");
    } else {
        document.getElementsByClassName("submit-id").disabled = false;
        document.querySelector("#spinner").classList.add("hidden");
        document.querySelector("#button-text").classList.remove("hidden");
    }
    };
});

</script>
所以,其中一个问题是,每当我开始支付订单时,无论我通过什么信用卡号码,它总是成功,这是一个主要缺陷。第二个,我需要传递当前订单的总数,否则所有订单的总数将为500,默认值。我试图将会话购物车项目传递给获取,但没有成功。即使我不能将所有物品从购物车发送到目的地,至少总价格应该是相应的

如果我有什么不清楚的地方,请告诉我。如果你能给我提些建议,我将不胜感激。谢谢大家!


**编辑:

在确认之前,您可以通过API()更新PaymentIntent
金额(在服务器端或客户端)。如果发送此消息时遇到错误,请共享该错误的详细信息


你需要说更多关于“它总是成功的”以及您提出的具体要求。您没有说明如何使用Stripe.js。您应该使用Stripe提供的测试成功和失败案例。如果您得到的结果与指定的结果不同,您需要提供更多详细信息,说明您正在做什么,以及您预期的结果。

如果您正在进行测试stripe的环境您有两个信用卡号码:第一个总是成功的,另一个总是失败的。请阅读文档以了解这些号码对您来说是什么。无论我插入的是哪一个,它总是成功的,即使它是一个随机号码,您也不会听到stripe的响应。您总是会收到响应从他们那里:在json中你有反馈(成功与否)@LelioFaieta fetch函数只发送金额和货币,没有关于卡的信息,因此作为响应收到的所有响应体的状态都是OK。据我所知,fetch负责支付。我遵循了文档中的所有步骤,不知道会有什么错误。我从官方文档中实现了Stripe,一个nd在一开始,它向创建paymentIntent的控制器发送一个post请求,在页面加载之后。因此,我将fetch和第二个承诺打包在一个jquery函数中,以便仅在提交支付表单
$('#支付表单').submit(函数(){}时发送数据
。也许这就是我错的地方。测试所有三张测试卡,一张成功拒绝支付的测试卡总是给出200 OK POST/v1/payment\u意向您具体使用了哪张测试卡,以及您是如何使用的?您是否确认了支付意向?如果您创建的支付意向没有
确认=true
,则请求st应该成功,是的,因为在您确认之前不会进行任何付款尝试。如果您发送
confirm=true
payment\u method=pm\u card\u charged
您应该会收到402个错误。
public function create(){
        \Stripe\Stripe::setApiKey('sk_test_XXX');  

        header('Content-Type: application/json');
        try {
            $json_str = file_get_contents('php://input');
            $json_obj = json_decode($json_str);
            
            $paymentIntent = \Stripe\PaymentIntent::create([
                'amount' => "500",
                'currency' => 'ron',
            ]);
            $output = [
                'clientSecret' => $paymentIntent->client_secret,
            ];
            echo json_encode($output);
        } catch (Error $e) {
            http_response_code(500);
            echo json_encode(['error' => $e->getMessage()]);
        }
    }