gpt4 book ai didi

c# - 处理 charge.refund webhook 时 Stripe.Net 发票属性为 NULL

转载 作者:行者123 更新时间:2023-12-03 20:57:01 28 4
gpt4 key购买 nike

我正在使用 Stripe.Net 来处理付款。当我开始测试“charge.refund”webhook 时,我在后面的代码中得到 NULL 发票属性,但发票值存在于 Stripe webhook 事件中,并且我确认发票也存在仪表板。

注意到 Stripe.Net 中的版本和配置的 webhook API 不同。

仪表板 Webhook API 版本:2017-08-15

Stripe.Net版本:16.12.0.0(支持2018-02-06)。

这是 Stripe webhook 事件

enter image description here

这是中断代码(charge.Invoice.SubscriptionId 中断为空引用)

enter image description here

以前有人遇到过这个问题吗?

谢谢

最佳答案

查看source code for the Stripe.Mapper<T>.MapFromJson

// the ResponseJson on a list method is the entire list (as json) returned from stripe.
// the ObjectJson is so we can store only the json for a single object in the list on that entity for
// logging and/or debugging
public static T MapFromJson(string json, string parentToken = null, StripeResponse stripeResponse = null)
{
var jsonToParse = string.IsNullOrEmpty(parentToken) ? json : JObject.Parse(json).SelectToken(parentToken).ToString();

var result = JsonConvert.DeserializeObject<T>(jsonToParse);

// if necessary, we might need to apply the stripe response to nested properties for StripeList<T>
ApplyStripeResponse(json, stripeResponse, result);

return result;
}

public static T MapFromJson(StripeResponse stripeResponse, string parentToken = null)
{
return MapFromJson(stripeResponse.ResponseJson, parentToken, stripeResponse);
}

private static void ApplyStripeResponse(string json, StripeResponse stripeResponse, object obj)
{
if (stripeResponse == null)
{
return;
}

foreach (var property in obj.GetType().GetRuntimeProperties())
{
if (property.Name == nameof(StripeResponse))
{
property.SetValue(obj, stripeResponse);
}
}

stripeResponse.ObjectJson = json;
}

使用 JSON.Net 反序列化 JSON,

事实是 StripeCharge.Invoice property is marked with [JsonIgnore] attribute

#region Expandable Invoice

/// <summary>
/// ID of the invoice this charge is for if one exists.
/// </summary>
public string InvoiceId { get; set; }

[JsonIgnore]
public StripeInvoice Invoice { get; set; }

[JsonProperty("invoice")]
internal object InternalInvoice
{
set
{
StringOrObject<StripeInvoice>.Map(value, s => this.InvoiceId = s, o => this.Invoice = o);
}
}
#endregion

最后如何 InternalInvoice属性通过StringOrObject<T>映射

StringOrObject<StripeInvoice>.Map(value, s => this.InvoiceId = s, o => this.Invoice = o);

在类定义中可以看到

internal static class StringOrObject<T>
where T : StripeEntityWithId
{
public static void Map(object value, Action<string> updateId, Action<T> updateObject)
{
if (value is JObject)
{
T item = ((JToken)value).ToObject<T>();
updateId(item.Id);
updateObject(item);
}
else if (value is string)
{
updateId((string)value);
updateObject(null);
}
}
}

如果传递的值是string ,它将设置 Invoice对象属性为 null

else if (value is string)
{
updateId((string)value);
updateObject(null);
}

因此,您描述的行为是根据显示的数据和代码设计的。

您可能需要提取 InvoiceId并尝试检索它(发票)以便使用其成员。

关于c# - 处理 charge.refund webhook 时 Stripe.Net 发票属性为 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51458690/

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