gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:03:49 25 4
gpt4 key购买 nike

这应该很容易,但我卡住了。我已经使用成功发布我的站点 JSON 的服务 (ChargeBee) 设置了一个 webhook。这是我要绑定(bind)的模型:

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”外,所有内容都具有约束力,它是 null。问题是“内容”会根据触发的事件类型而改变。例如,对于“客户创建”事件,它可能是这样的:

 "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"
}

我只需要将这些复杂对象绑定(bind)到某种类型。字符串不工作。绑定(bind)后,我可以使用 event_type 属性轻松检查它是否是我要处理的事件,并将其反序列化为适当的自定义类型。

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

我是否需要自定义模型 Binder 之类的东西?有没有更简单的方法?

也许有人可以制作一个 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"
}

除非我弄错了,否则我认为模型绑定(bind)器无法处理这种情况。据我所知,它需要预定义的类型并且不能处理可变性或动态的东西。如果我错了,请纠正我。不管怎样,我稍后会用完整的代码示例来回答这个问题,但现在我已经放弃了纯模型绑定(bind)方法并正在读取 Request.InputStream 以获取我需要的 JSON 数据。然后,根据模型绑定(bind)器没有问题的 event_type,我将反序列化为我的预定义类型。只是我以前从来没有真正需要手动从请求中挑选一些东西;我一直使用模型 Binder 。

最佳答案

这就是我想要实现的目标。 Request.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
}
}

关于c# - ASP.NET MVC 5 - JSON -(动态?)模型绑定(bind) - REST 服务 - Webhooks - Chargebee,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31490290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com