C# 尝试使用ASP.NET MVC和C为条带设置web钩子#

C# 尝试使用ASP.NET MVC和C为条带设置web钩子#,c#,asp.net-mvc,stripe-payments,webhooks,stripe-subscriptions,C#,Asp.net Mvc,Stripe Payments,Webhooks,Stripe Subscriptions,我已经实现了一些前端代码,当用户单击checkout按钮时,他们会被重定向到一个条带页面,在那里他们可以输入他们的卡支付详细信息。代码有一个成功的URL和一个失败的URL。如果客户输入有效的付款详细信息-他们被重定向到成功的URL,我需要更新我的数据库,以确保我的后端知道该特定用户已付款,现在可以查看订阅的内容。我正试图设置网络挂钩,以便做到这一点,所以我知道,如果用户已支付,取消等 using System; using System.IO; using Microsoft.AspNetCor

我已经实现了一些前端代码,当用户单击checkout按钮时,他们会被重定向到一个条带页面,在那里他们可以输入他们的卡支付详细信息。代码有一个成功的URL和一个失败的URL。如果客户输入有效的付款详细信息-他们被重定向到成功的URL,我需要更新我的数据库,以确保我的后端知道该特定用户已付款,现在可以查看订阅的内容。我正试图设置网络挂钩,以便做到这一点,所以我知道,如果用户已支付,取消等

using System;
using System.IO;
using Microsoft.AspNetCore.Mvc;
using Stripe;

namespace workspace.Controllers
{
    [Route("api/[controller]")]
    public class StripeWebHook : Controller
{
    // You can find your endpoint's secret in your webhook settings
    const string secret = "whsec_...";

    [HttpPost]
    public async Task<IActionResult> Index()
    {
        var json = await new StreamReader(HttpContext.Request.Body).ReadToEndAsync();

        try
        {
            var stripeEvent = EventUtility.ConstructEvent(json,
                Request.Headers["Stripe-Signature"], secret);

            // Handle the checkout.session.completed event
            if (stripeEvent.Type == Events.CheckoutSessionCompleted)
            {
                var session = stripeEvent.Data.Object as Checkout.Session;

                // Fulfill the purchase...
                HandleCheckoutSession(session);
            }
            else
            {
                return Ok()
            }
        }
        catch (StripeException e)
        {
            return BadRequest();
        }
    }
}
}
使用系统;
使用System.IO;
使用Microsoft.AspNetCore.Mvc;
使用条纹;
命名空间工作区.控制器
{
[路由(“api/[控制器]”)]
公共类StripeWebHook:控制器
{
//您可以在webhook设置中找到端点的秘密
const string secret=“whsec_…”;
[HttpPost]
公共异步任务索引()
{
var json=wait new StreamReader(HttpContext.Request.Body).ReadToEndAsync();
尝试
{
var stripeEvent=EventUtility.ConstructEvent(json,
请求标题[“条带签名”],机密);
//处理checkout.session.completed事件
if(stripeEvent.Type==Events.CheckoutSessionCompleted)
{
var session=stripeEvent.Data.Object作为Checkout.session;
//完成购买。。。
HandleCheckoutSession(session);
}
其他的
{
返回Ok()
}
}
捕获(条带异常e)
{
返回请求();
}
}
}
}
然而,当尝试实现这个时,我会出错,因为我认为上面提供的自定义代码使用.NET核心,而我使用的是完整的.NET框架


有没有办法解决这个问题,或者我做错了什么?

这在我的Asp.net Framework 4.7中有效,请尝试下面的webhook代码

    [HttpPost]
   [Route("api/[controller]/webhook")]
    public async Task<HttpResponseMessage> ProcessRequest()
    {

        var json = await new StreamReader(HttpContext.Current.Request.InputStream).ReadToEndAsync();
        try
        {
            var stripeEvent = EventUtility.ParseEvent(json);

            // Handle the event
            if (stripeEvent.Type == Events.PaymentIntentSucceeded)
            {
                var paymentIntent = stripeEvent.Data.Object as PaymentIntent;
                // Then define and call a method to handle the successful payment intent.
                // handlePaymentIntentSucceeded(paymentIntent);
            }
            else if (stripeEvent.Type == Events.PaymentMethodAttached)
            {
                var paymentMethod = stripeEvent.Data.Object as PaymentMethod;
                // Then define and call a method to handle the successful attachment of a PaymentMethod.
                // handlePaymentMethodAttached(paymentMethod);
            }
            // ... handle other event types
            else
            {
                // Unexpected event type
                Console.WriteLine("Unhandled event type: {0}", stripeEvent.Type);
            }
            return Request.CreateResponse(HttpStatusCode.OK);
        }
        catch (StripeException e)
        {
            return Request.CreateResponse(HttpStatusCode.BadRequest);
        }

        //Modification and Saving Data
   
      }
[HttpPost]
[路由(“api/[controller]/webhook”)]
公共异步任务ProcessRequest()
{
var json=wait new StreamReader(HttpContext.Current.Request.InputStream).ReadToEndAsync();
尝试
{
var stripeEvent=EventUtility.ParseEvent(json);
//处理事件
if(stripeEvent.Type==Events.PaymentIntentSucceed)
{
var paymentIntent=stripeEvent.Data.Object作为paymentIntent;
//然后定义并调用一个方法来处理成功的支付意图。
//HandlePaymentIntent成功(paymentIntent);
}
else if(stripeEvent.Type==Events.PaymentMethodAttached)
{
var paymentMethod=stripeEvent.Data.Object作为paymentMethod;
//然后定义并调用一个方法来处理PaymentMethod的成功附件。
//附加的HandlePaymentMethod(付款方式);
}
//…处理其他事件类型
其他的
{
//意外事件类型
WriteLine(“未处理的事件类型:{0}”,stripeEvent.type);
}
返回Request.CreateResponse(HttpStatusCode.OK);
}
捕获(条带异常e)
{
返回请求.CreateResponse(HttpStatusCode.BadRequest);
}
//修改和保存数据
}

添加此webhook后,您可以通过此链接在本地进行测试

jeremyo,如果可能,您是否可以分享您遇到的错误?如果没有它们,我们将无法准确地提供解决方案。抱歉,这并不是说我每个人都有错误,更重要的是,一旦用户提交了成功的付款,我如何使用stripe创建Webhook?jeremyo,好的,为此,我将首先查看您为创建签出会话而创建的端点。想必你已经建造好了。webhook端点非常相似。我首先复制粘贴端点代码以创建签出会话。然后,将端点位置更改为相关的位置(例如,条带webhook),并再次检查端点是否可以接受POST请求。在此,您可以使用以下指南在本地测试webhook端点: