在 Stripe Customer 对象 C# 中访问元数据时遇到问题

Posted

技术标签:

【中文标题】在 Stripe Customer 对象 C# 中访问元数据时遇到问题【英文标题】:Having trouble accessing Metadata in Stripe Customer Object C# 【发布时间】:2021-03-31 13:24:24 【问题描述】:

我正在尝试创建一个解决方案,允许我将 Stripe 和 Discord 链接在一起,以便 Discord 机器人在用户停止支付订阅费用时自动踢出用户。我现在正在研究该框架,并尝试自学如何使用可用的免费选项来导航条带 API,以便于测试。我的第一个测试只是确保我可以将 Discord 用户名作为元数据存储在每个客户对象中,然后根据需要使用该元数据让 Discord 机器人运行 kick 命令。

但是,我似乎无法获取每个客户的元数据,以便可以将其作为字符串发送到 Discord 机器人。

对于我的测试,我为产品设置了一个简单的结帐会话,并通过扩展结帐会话成功访问了客户对象,但是在尝试访问元数据时出现错误

“无法将类型 'System.Collections.Generic.Dictionary' 隐式转换为 'string”。

我认为我需要使用多级选项来扩展不同的对象,但我似乎得到了与上面相同的错误。我已经把代码sn-p贴在下面了。

var options = new SessionGetOptions();
options.AddExpand("customer");

var service = new SessionService();
Session session = service.Get("checkout_session_id", options);

Customer customer = session.Customer;

string customer2 = customer.Metadata; 

我可能遗漏了一些简单的东西,但我终生无法弄清楚它是什么。

【问题讨论】:

错误本身说明了问题所在。条带中的元数据是 Dictionary<string, string> 类型,而您正试图分配给 string 变量。修复 string customer2 = customer.Metadata; 行并通过 key 从 c# Dictionary 读取必要的元数据值 谢谢,我知道这很简单。 【参考方案1】:

感谢Pirate's comment 我找到了解决方案,并在下面添加了代码。

var options = new SessionGetOptions();
options.AddExpand("customer");

var service = new SessionService();
Session session = service.Get("checkoutsession_id", options);

Customer customer = session.Customer;
var customer2 = customer.Metadata;
string discord = customer2.ElementAt(0).Value;

【讨论】:

这很好用,但您也可以使用metadata["keyname"] 获得比使用ElementAt(0) 更好的语义表示【参考方案2】:

您可以在保存到var 时按名称键访问metadata

        var service = new CustomerService();
        var options = new CustomerCreateOptions 
            Email = "test@example.com",
            Description = "Example customer",
        ;
        options.AddExtraParam("metadata[user_id]", "cooluser123");
        Customer customer = service.Create(options);

        var cust = service.Get(customer.Id);
        var metadata = cust.Metadata;
        Console.WriteLine("Metadata['user_id']: " + metadata["user_id"]);

【讨论】:

以上是关于在 Stripe Customer 对象 C# 中访问元数据时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

如何从 C# 中的 Stripe Subscription 对象中检索产品信息?

如何在 PHP Codeception 中模拟 Stripe 类

Stripe - 向现有客户添加新卡

为啥 Stripe checkout Webhooks 会将 customer_email 发送为 null?

导轨。我在 Stripe::Customer.retrieve("cus_XYZ") 控制台中看不到我的计划订阅

Stripe Checkout 会话中的试用期