ASP.. NET MVC 5 - JSON -(动态?)模型绑定- REST服务- Webhooks - Charge

本文关键字:REST 模型 绑定 服务 Charge Webhooks 动态 MVC NET JSON ASP | 更新日期: 2023-09-27 18:03:17

这应该很容易,但我卡住了。我已经建立了一个webhook的服务(ChargeBee),是成功发布我的网站JSON。这是我试图绑定的模型:

public class ChargeBeeWebhookModel
{
    public string id { get; set; }
    public string occurred_at { get; set; }
    public string source { get; set; }
    public string @object { get; set; }        
    public string content { get; set; }
    public string event_type { get; set; }
    public string webhook_status { get; set; }
}

所有内容都是绑定的,除了"content",它是空的。问题在于"内容"将根据触发的事件类型而改变。例如,对于"customer created"事件:

 "customer": {
        "id": "8avVGOkx8U1MX",
        "first_name": "Benjamin",
        "last_name": "Ross",
        "email": "Benjamin@test.com",
        "auto_collection": "on",
        "created_at": 1317407411,
        "object": "customer",
        "card_status": "valid",
        "payment_method": {
            "object": "payment_method",
            "type": "card",
            "gateway": "chargebee",
            "reference_id": "tok_KyVr8xPHl5BSx1",
            "status": "valid"
        },
        "account_credits": 0
    },
    "card": {
        "customer_id": "8avVGOkx8U1MX",
        "status": "valid",
        "gateway": "chargebee",
        "iin": "411111",
        "last4": "1111",
        "card_type": "visa",
        "expiry_month": 1,
        "expiry_year": 2016,
        "object": "card",
        "masked_number": "************1111"
    }

我只需要将这些复杂对象绑定到某种类型。绳子坏了。一旦它被绑定,我就可以很容易地检查它是否是我想要使用event_type属性处理的事件,并将其反序列化为适当的自定义类型。

我该怎么做?我觉得我错过了一些很简单的东西。据我所知,Chargebee不会让我为每种类型的事件使用不同的URL,这是我认为最有意义的。这是一个URL,我必须绑定许多可能的响应。

我需要一个自定义模型绑定器或其他东西吗?有更简单的方法吗?

也许有人可以做一个ChargeBee标签?

谢谢每一个人。


编辑:


按照请求,这是示例请求的样子:

Headers
POST HTTP/1.1
Host:********.ngrok.io //(obviously I commented this out)
Authorization: Basic cGF0cmlvdGN5YmVybmV0aWNzZHJvbmVtYXN0ZXI6c3VuZGV2aWxjb2NvYXJhZ2luZ2J1bGw=
Content-Type: application/json; charset=utf-8
User-Agent: ChargeBee
Body
{
    "id": "ev_3Nl8ERLPElBCRU6",
    "occurred_at": 1341167306,
    "source": "admin_console",
    "object": "event",
    "content": {
        "subscription": {
            "id": "3Nl8ERLPElBCGl1",
            "plan_id": "basic",
            "plan_quantity": 1,
            "status": "future",
            "start_date": 1341772105,
            "trial_start": 1341772105,
            "trial_end": 1344450505,
            "created_at": 1341167305,
            "has_scheduled_changes": false,
            "object": "subscription",
            "addons": [{
                "id": "data_usage",
                "quantity": 1,
                "object": "addon"
            }],
            "due_invoices_count": 0
        },
        "customer": {
            "id": "3Nl8ERLPElBCGl1",
            "first_name": "Benjamin",
            "last_name": "Ross",
            "email": "Benjamin@test.com",
            "auto_collection": "on",
            "created_at": 1341167305,
            "object": "customer",
            "card_status": "valid",
            "payment_method": {
                "object": "payment_method",
                "type": "card",
                "reference_id": "3Nl8ERLPElBCGl1",
                "status": "valid"
            }
        }
    },
    "event_type": "subscription_created",
    "webhook_status": "not_configured"
}
除非我弄错了,我只是认为模型绑定器不能处理这种情况。它需要预定义的类型,不能处理可变性或动态的东西,据我所知。如果我说错了,请纠正我。无论如何,稍后我将用一个完整的代码示例回答这个问题,但现在我已经抛弃了纯模型绑定方法,正在阅读Request。InputStream获取我需要的JSON数据。然后,根据event_type(模型绑定器没有问题),我将其反序列化为预定义类型。只是我从来没有真正需要手动从请求中选择一些东西;我一直使用模型绑定器

ASP.. NET MVC 5 - JSON -(动态?)模型绑定- REST服务- Webhooks - Charge

这是我想要实现的。请求。InputStream是可行的方法;我开始尝试手动做到这一点,但幸运的是,ChargeBee有一个官方的。net库(不像Mandrill)为我做这一切:

    [HttpPost]
    [BasicAuthentication(username: "x", password: "y", BasicRealm = "z")]
    public HttpStatusCodeResult ChargeBeeWebhook()
    {
        if (ModelState.IsValid)
        {          
            Event chargeBeeEvent = new Event(Request.InputStream);
            EventTypeEnum? eventType = chargeBeeEvent.EventType;
            Event.EventContent eventContent = chargeBeeEvent.Content;
            if (eventType == EventTypeEnum.SubscriptionCreated)
            {
                Subscription subscription = eventContent.Subscription;
                Customer customer = eventContent.Customer;
                // more stuff
            }          
            return new HttpStatusCodeResult(200);
        }
        else
        {
            return new HttpStatusCodeResult(400); // bad request
        }
    }

好的,下面应该可以工作。不要为内容传递Javascript对象,而是使用JSON。对对象进行字符串化,并将其结果设置为content。这样在你的控制器中,content的值将是一个字符串