条带化-付款成功,但出现错误“没有这样的payment_intent:pm_1Gyj0uD3zt5RrIg0lSfDPKOO”

时间:2020-06-27 18:46:43

标签: javascript c# stripe-payments

我的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”

任何人都能看到我在这里失踪吗?

我创建了一个关联帐户,但仍然出现相同的错误。

1 个答案:

答案 0 :(得分:2)

您的代码正在调用PaymentIntent确认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);