C# 条纹“;没有此类付款”;MVC内核错误

C# 条纹“;没有此类付款”;MVC内核错误,c#,asp.net-core-mvc,stripe-payments,C#,Asp.net Core Mvc,Stripe Payments,我试图在我的MVC核心项目中实现Stripe,但得到了这个错误:“没有这样的支付方式:pm_xxx”。我想接受同步付款。我做错什么了吗?我已经能够将错误跟踪到paymentIntentService创建函数,错误显示在部分视图中 Html: //对Stripe.js的引用 变异条带; var orderData={ 项目:[{id:“prod_IFwyjFBhip0bTF”}], 货币:“美元” }; //禁用按钮,直到我们在页面上设置了条带 document.querySelector(“按钮

我试图在我的MVC核心项目中实现Stripe,但得到了这个错误:“没有这样的支付方式:pm_xxx”。我想接受同步付款。我做错什么了吗?我已经能够将错误跟踪到paymentIntentService创建函数,错误显示在部分视图中

Html:

//对Stripe.js的引用 变异条带; var orderData={ 项目:[{id:“prod_IFwyjFBhip0bTF”}], 货币:“美元” }; //禁用按钮,直到我们在页面上设置了条带 document.querySelector(“按钮”).disabled=true; 获取(“/stripe key”) .然后(函数(结果){ 返回result.json(); }) .then(功能(数据){ 返回设置元素(数据); }) .then(函数({stripe,card,clientSecret}){ document.querySelector(“按钮”).disabled=false; var form=document.getElementById(“付款单”); 表单。addEventListener(“提交”,函数(事件){ event.preventDefault(); 支付(条纹、卡片、客户机密); }); }); 变量setupElements=函数(数据){ 条带=条带(data.publishableKey); /*------设置要在签出表单中使用的条带元素------*/ var elements=stripe.elements(); 变量样式={ 基数:{ 颜色:“32325d”, fontFamily:“新赫尔维蒂卡”,赫尔维蒂卡,无衬线, 字体平滑:“抗锯齿”, 字体大小:“16px”, “::占位符”:{ 颜色:“aab7c4” } }, 无效:{ 颜色:“fa755a”, iconColor:#fa755a“ } }; var card=elements.create(“card”,{style:style}); 卡式安装(“卡式元件”); 警报(data.clientSecret);//测试 返回{ 条纹:条纹, 卡片:卡片, clientSecret:data.clientSecret }; }; var handleAction=函数(clientSecret){ stripe.handleCardAction(clientSecret).then(函数(数据){ if(data.error){ 淋浴错误(“您的卡未通过身份验证,请重试”); }else if(data.paymentIntent.status==“需要确认”){ 取回(“/pay”{ 方法:“张贴”, 标题:{ “内容类型”:“应用程序/json” }, 正文:JSON.stringify({ paymentIntentId:data.paymentIntent.id }) }) .然后(函数(结果){ 返回result.json(); }) .then(函数(json){ if(json.error){ 淋浴错误(json.error); }否则{ 订单完成(clientSecret); } }); } }); }; /* *收集卡的详细信息并支付订单费用 */ var pay=功能(条带、卡){ 更改加载状态(true); //收集卡的详细信息并创建PaymentMethod 条纹 .createPaymentMethod(“卡”,卡) .然后(函数(结果){ if(result.error){ 淋浴错误(result.error.message); }否则{ orderData.paymentMethodId=result.paymentMethod.id; 返回fetch(“/pay”{ 方法:“张贴”, 标题:{ “内容类型”:“应用程序/json” }, 正文:JSON.stringify(orderData) }); } }) .然后(函数(结果){ 返回result.json(); }) .然后(功能(响应){ if(response.error){ 淋浴ROR(响应错误); }else if(response.requireAction){ //请求身份验证 手工过滤(response.clientSecret); }否则{ orderComplete(response.clientSecret); } }); }; /*------支付后帮助------*/ /*付款完成时显示成功/错误消息*/ var orderComplete=函数(clientSecret){ stripe.retrievePaymentIntent(clientSecret).then(函数(结果){ var paymentIntent=result.paymentIntent; var paymentIntentJson=JSON.stringify(paymentIntent,null,2); document.querySelector(“.sr付款单”).classList.add(“隐藏”); document.querySelector(“pre”).textContent=paymentIntentJson; document.querySelector(“.sr result”).classList.remove(“hidden”); setTimeout(函数(){ document.querySelector(“.sr result”).classList.add(“expand”); }, 200); changeLoadingState(false); }); }; var BREATHROR=函数(errorMsgText){ changeLoadingState(false); var errorMsg=document.querySelector(“.sr字段错误”); errorMsg.textContent=errorMsgText; setTimeout(函数(){ errorMsg.textContent=“”; }, 4000); }; //在提交付款时显示微调器 var changeLoadingState=函数(isLoading){ 如果(孤岛加载){ document.querySelector(“按钮”).disabled=true; document.querySelector(“微调器”).classList.remove(“隐藏”); document.querySelector(“按钮文本”).classList.add(“隐藏”); }否则{ document.querySelector(“按钮”).disabl
    <link rel="stylesheet" href="~/css/payment_client_global.css" />
<section>
    <form id="payment-form" class="sr-payment-form">
        <div class="sr-combo-inputs-row">
            <div class="sr-input sr-card-element" id="card-element"></div>
        </div>
        <div class="sr-field-error" id="card-errors" role="alert"></div>
        <button id="submit">
            <div class="spinner hidden" id="spinner"></div>
            <span id="button-text">Pay</span><span id="order-amount"></span>
        </button>
    </form>
    <div class="sr-result hidden">
        <p>Payment completed<br /></p>
        <pre>
        <code></code>
          </pre>
    </div>
</section>

<script>
    // A reference to Stripe.js
    var stripe;

    var orderData = {
        items: [{ id: "prod_IFwyjFBhip0bTF" }],
        currency: "usd"
    };

    // Disable the button until we have Stripe set up on the page
    document.querySelector("button").disabled = true;

    fetch("/stripe-key")
        .then(function (result) {
            return result.json();
        })
        .then(function (data) {
            return setupElements(data);
        })
        .then(function ({ stripe, card, clientSecret }) {
            document.querySelector("button").disabled = false;

            var form = document.getElementById("payment-form");
            form.addEventListener("submit", function (event) {
                event.preventDefault();
                pay(stripe, card, clientSecret);
            });
        });

    var setupElements = function (data) {
        stripe = Stripe(data.publishableKey);
        /* ------- Set up Stripe Elements to use in checkout form ------- */
        var elements = stripe.elements();
        var style = {
            base: {
                color: "#32325d",
                fontFamily: '"Helvetica Neue", Helvetica, sans-serif',
                fontSmoothing: "antialiased",
                fontSize: "16px",
                "::placeholder": {
                    color: "#aab7c4"
                }
            },
            invalid: {
                color: "#fa755a",
                iconColor: "#fa755a"
            }
        };

        var card = elements.create("card", { style: style });
        card.mount("#card-element");
        alert(data.clientSecret); //TEST
        return {
            stripe: stripe,
            card: card,
            clientSecret: data.clientSecret
        };
    };

    var handleAction = function (clientSecret) {
        stripe.handleCardAction(clientSecret).then(function (data) {
            if (data.error) {
                showError("Your card was not authenticated, please try again");
            } else if (data.paymentIntent.status === "requires_confirmation") {
                fetch("/pay", {
                    method: "POST",
                    headers: {
                        "Content-Type": "application/json"
                    },
                    body: JSON.stringify({
                        paymentIntentId: data.paymentIntent.id
                    })
                })
                    .then(function (result) {
                        return result.json();
                    })
                    .then(function (json) {
                        if (json.error) {
                            showError(json.error);
                        } else {
                            orderComplete(clientSecret);
                        }
                    });
            }
        });
    };

    /*
     * Collect card details and pay for the order
     */
    var pay = function (stripe, card) {
        changeLoadingState(true);

        // Collects card details and creates a PaymentMethod
        stripe
            .createPaymentMethod("card", card)
            .then(function (result) {
                if (result.error) {
                    showError(result.error.message);
                } else {
                    orderData.paymentMethodId = result.paymentMethod.id;

                    return fetch("/pay", {
                        method: "POST",
                        headers: {
                            "Content-Type": "application/json"
                        },
                        body: JSON.stringify(orderData)
                    });
                }
            })
            .then(function (result) {
                return result.json();
            })
            .then(function (response) {
                if (response.error) {
                    showError(response.error);
                } else if (response.requiresAction) {
                    // Request authentication
                    handleAction(response.clientSecret);
                } else {
                    orderComplete(response.clientSecret);
                }
            });
    };

    /* ------- Post-payment helpers ------- */

    /* Shows a success / error message when the payment is complete */
    var orderComplete = function (clientSecret) {
        stripe.retrievePaymentIntent(clientSecret).then(function (result) {
            var paymentIntent = result.paymentIntent;
            var paymentIntentJson = JSON.stringify(paymentIntent, null, 2);

            document.querySelector(".sr-payment-form").classList.add("hidden");
            document.querySelector("pre").textContent = paymentIntentJson;

            document.querySelector(".sr-result").classList.remove("hidden");
            setTimeout(function () {
                document.querySelector(".sr-result").classList.add("expand");
            }, 200);

            changeLoadingState(false);
        });
    };

    var showError = function (errorMsgText) {
        changeLoadingState(false);
        var errorMsg = document.querySelector(".sr-field-error");
        errorMsg.textContent = errorMsgText;
        setTimeout(function () {
            errorMsg.textContent = "";
        }, 4000);
    };

    // Show a spinner on payment submission
    var changeLoadingState = function (isLoading) {
        if (isLoading) {
            document.querySelector("button").disabled = true;
            document.querySelector("#spinner").classList.remove("hidden");
            document.querySelector("#button-text").classList.add("hidden");
        } else {
            document.querySelector("button").disabled = false;
            document.querySelector("#spinner").classList.add("hidden");
            document.querySelector("#button-text").classList.remove("hidden");
        }
    };
</script>
    [Route("/pay")]
public class ConfirmPaymentController : Controller
{
    public IActionResult Index([FromBody] ConfirmPaymentRequest request)
    {
        var paymentIntentService = new PaymentIntentService();
        PaymentIntent paymentIntent = null;

        try
        {
            if (request.PaymentMethodId != null)
            {
                // Create the PaymentIntent
                var createOptions = new PaymentIntentCreateOptions
                {
                    Amount = 1099,
                    Currency = "cad",

                    ConfirmationMethod = "manual",
                    PaymentMethodTypes = new List<string> { "card" },
                    PaymentMethod = request.PaymentMethodId,
                    Confirm = true,
                };
                paymentIntent = paymentIntentService.Create(createOptions);
            }
            else if (request.PaymentIntentId != null)
            {
                var confirmOptions = new PaymentIntentConfirmOptions { };
                paymentIntent = paymentIntentService.Confirm(
                    request.PaymentIntentId,
                    confirmOptions
                );
            }
        }
        catch (StripeException e)
        {
            return Json(new { error = e.StripeError.Message });
        }
        return generatePaymentResponse(paymentIntent);
    }

    [HttpGet]
    [Route("/stripe-key")]
    public JsonResult StripeKey()
    {
        return new JsonResult(new StripeKeyResponse("[my pk_test here]"));
    }

    private IActionResult generatePaymentResponse(PaymentIntent intent)
    {
        // Note that if your API version is before 2019-02-11, 'requires_action'
        // appears as 'requires_source_action'.
        if (intent.Status == "requires_action" &&
            intent.NextAction.Type == "use_stripe_sdk")
        {
            // Tell the client to handle the action
            return Json(new
            {
                requires_action = true,
                payment_intent_client_secret = intent.ClientSecret
            });
        }
        else if (intent.Status == "succeeded")
        {
            // The payment didn’t need any additional actions and completed!
            // Handle post-payment fulfillment
            return Json(new { success = true });
        }
        else
        {
            // Invalid status
            return StatusCode(500, new { error = "Invalid PaymentIntent status" });
        }
    }
}