【问题标题】:Stripe - Payment goes through but get ERROR HERE "No such payment_intent: pm_1Gyj0uD3zt5RrIg0lSfDPKOO"Stripe - 付款通过,但在此处出现错误“没有这样的 payment_intent:pm_1Gyj0uD3zt5RrIg0lSfDPKOO”
【发布时间】:2020-10-18 04:52:47
【问题描述】:

我的 javascript 中有这个:

<script>

var stripe = Stripe('pk_test_51Gv0ngD3zt5RrIg0XQiKHaK7TOAqzju9yps8jJB2Gch6ksmG4FSnqgyWLv3Qld2EkNHgAb30PLKduYGBuYtZe71A0066dp27DB');
var elements = stripe.elements();
// Custom styling can be passed to options when creating an Element.
var style = {
    base: {
        // Add your base input styles here. For example:
        fontSize: '16px',
        color: '#32325d',
    },
};

// Create an instance of the card Element.
var card = elements.create('card', {
    hidePostalCode: true, style: style });

// Add an instance of the card Element into the `card-element` <div>.
card.mount('#card-element');

var form = document.getElementById('payment-form');

form.addEventListener('submit', function (event) {
    // We don't want to let default form submission happen here,
    // which would refresh the page.
    event.preventDefault();

    stripe.createPaymentMethod({
        type: 'card',
        card: card,
        billing_details: {
            // Include any additional collected billing details.
            name: 'Jenny Rosen',
        },
    }).then(stripePaymentMethodHandler);
});

function stripePaymentMethodHandler(result) {
    if (result.error) {
        // Show error in payment form
    } else {
        $.ajax({
            headers: { 'Content-Type': 'application/json' },
            method: 'POST',
            url: "/PayStripe",
            data: JSON.stringify({
                payment_method_id: result.paymentMethod.id,
            }),
            success: function (json) {
                handleServerResponse(json);
            }
        });
    }
}

function handleServerResponse(response) {
    if (response.error) {
        // Show error from server on payment form
    } else if (response.requires_action) {
        // Use Stripe.js to handle required card action
        stripe.handleCardAction(
            response.payment_intent_client_secret
        ).then(handleStripeJsResult);
    } else {
        // Show success message
    }
}

function handleStripeJsResult(result) {
    if (result.error) {
        // Show error in payment form
    } else {
        // The card action has been handled
        // The PaymentIntent can be confirmed again on the server
        fetch('/pay', {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify({ payment_intent_id: result.paymentIntent.id })
        }).then(function (confirmResult) {
            return confirmResult.json();
        }).then(handleServerResponse);
    }
}


</script>

这是我的 HomeController:

 public ActionResult PayStripe(string payment_method_id)
    {

        StripeConfiguration.ApiKey = "sk_test_51Gv0ngD3zt5RrIg0KmTYo92QYmujb9Gp3dv8zz7fOJYjbLna3gRPOkHzZMSVMISHNgmPSrSncUtKL2DS86R4DEJI00mVv9GusU";
        var paymentIntentService = new PaymentIntentService();
        PaymentIntent paymentIntent = null;

        try
        {
            if (payment_method_id != "") { 
                // Create the PaymentIntent
                var createOptions = new PaymentIntentCreateOptions
                {
                    PaymentMethod = payment_method_id,
                    Amount = 1099,
                    Currency = "gbp",
                    ConfirmationMethod = "manual",
                    Confirm = true,
                };
                paymentIntent = paymentIntentService.Create(createOptions);
            }
            if (payment_method_id != "")
            {
                var confirmOptions = new PaymentIntentConfirmOptions { };
                paymentIntent = paymentIntentService.Confirm(
                    payment_method_id,
                    confirmOptions
                ); <-- ERROR HERE "No such payment_intent: pm_1Gyj0uD3zt5RrIg0lSfDPKOO"
            }
        }
        catch (StripeException e)
        {
            return Json(new { error = e.StripeError.Message });
        }
        return generatePaymentResponse(paymentIntent);
        

    }

此处出现错误“没有这样的支付意图:pm_1Gyj0uD3zt5RrIg0lSfDPKOO”

任何人都可以看到我在这里缺少什么吗?

我创建了一个 Connected 帐户,但仍然遇到同样的错误。

【问题讨论】:

    标签: javascript c# stripe-payments


    【解决方案1】:

    您的代码正在调用 PaymentIntent Confirm API,但您传递的是 PaymentMethod id (pm_123) 作为第一个参数,而不是 PaymentIntent id pi_123,这就是您收到该错误的原因。相反,您需要确保在 confirmOptions 中传递 PaymentMethod id,并将 PaymentIntent id 作为第一个参数。

    与此相关的是,您的代码正在创建一个 PaymentIntent,但同时也传递了Confirm = true,这意味着您已经在确认它。在你试图重新确认它之后,这真的没有意义。确认时应传递 PaymentMethod id。

    如果您想在一次调用中创建并确认 PaymentIntent,您可以这样做:

    var options = new PaymentIntentCreateOptions
    {
        PaymentMethod = payment_method_id,
        Amount = 1099,
        Currency = "gbp",
        ConfirmationMethod = "manual",
        PaymentMethod = payment_method_id,
        Confirm = true,
    };
    var paymentIntent = paymentIntentService.Create(options);
    

    【讨论】:

    • ...很好的答案。我投了赞成票 1. 想知道为什么将确认方法设置为手动?如果你把它拿出来,这张卡仍然会被扣款。
    • 是的,我只是镜像了他们的代码,但我绝对不鼓励任何人使用这种方法,自动确认要好得多,但在这种情况下,这并不重要,因为确认是服务器端的
    猜你喜欢
    • 2017-03-13
    • 2020-01-21
    • 1970-01-01
    • 2017-10-19
    • 2016-05-22
    • 1970-01-01
    • 2016-08-18
    • 2020-01-02
    • 1970-01-01
    相关资源
    最近更新 更多