【问题标题】:Stripe retrieve the good price IDStripe 检索好价格 ID
【发布时间】:2022-01-12 12:14:03
【问题描述】:

我用 Stripe 设置了我的商店。您可以购买优质产品和不同尺寸的产品。它运作良好,直到我必须向卖家发送一封电子邮件,其中包含一些信息,如购买的产品名称、产品尺寸(product.nickname)、客户信息等。我的问题是我无法获得这个“昵称”。

据我在 Stripe 中了解,您有一些产品可以有不同的价格。对我来说,我有一个有 3 个价格的产品。每个价格都有自己的 ID 和“标签”(根据我在请求中看到的 Stripe 称为“昵称”)。当我想检索此 ID 以获取特定昵称(如果大小的名称)时,问题就来了。出于某种原因,为所选产品返回的 ID 与来自 Stripe Dashboard 的 ID 不同。每次我购买新商品时,都会返回此 ID 更改。

在我的 WebhooksController 中定义创建:

case event.type
when 'checkout.session.completed'
              session = event.data.object
              @order = Stripe::Checkout::Session.retrieve({ id: session.id, expand: ["line_items", "customer"]})
    OrderMailer.order_mail(@order).deliver
end
render json: { message: 'success' }

在我的 order_mail.html.erb 中:

<% @order.line_items.data.each do |line| %>
<%= line %>
<% end %>

谁能解释一下为什么 webhook 中返回的 line_item ID 与 Stripe 仪表板 ID 不同?以及如何获取和显示邮件中所选价格的昵称?

这是我得到的&lt;%= line %&gt;

{ "id": "li_1K41JPFE4oPSz5YO98K2r2CW", "object": "item", "amount_subtotal": 4000, "amount_total": 4000, "currency": "eur", "description": "Soleil Levant", "price": { "id": "price_1K41JPFE4oPSz5YORWdXXGuT", "object": "price", "active": false, "billing_scheme": "per_unit", "created": 1638874459, "currency": "eur", "livemode": false, "lookup_key": null, "metadata": { }, "nickname": null, "product": "prod_KjUHP8uALE6aZI", "recurring": null, "tax_behavior": "unspecified", "tiers_mode": null, "transform_quantity": null, "type": "one_time", "unit_amount": 4000, "unit_amount_decimal": "4000" }, "quantity": 1 } 

如果我的价格合适:

https://api.stripe.com/v1/prices/price_1JxC8kFE4oPSz5YOc391IZ9I\
  -u sk_test_51JbmGvFE4oPSz5YOsl0JTTEi0quapEwPBXQsQRbRXPdr38hSiyVDPs9LnkH4nHCGXqwoYjOTnHoH6FtIC4EP32pr00KHIxFlLp:

我知道了:

{
  "id": "price_1JxC8kFE4oPSz5YOc391IZ9I",
  "object": "price",
  "active": true,
  "billing_scheme": "per_unit",
  "created": 1637247786,
  "currency": "eur",
  "livemode": false,
  "lookup_key": null,
  "metadata": {
    "nickname": "S"
  },
  "nickname": "S",
  "product": "prod_KcR0HgpfzldOj8",
  "recurring": null,
  "tax_behavior": "unspecified",
  "tiers_mode": null,
  "transform_quantity": null,
  "type": "one_time",
  "unit_amount": 4000,
  "unit_amount_decimal": "4000"
}

【问题讨论】:

    标签: ruby-on-rails stripe-payments


    【解决方案1】:

    你正在做的应该工作:

    • 首先,使用nickname: "foobar" 创建一个Price,假设它的ID 是"price_abc"
    • 然后,创建一个 Checkout Session 并在其中设置 line_items[0].price: "price_abc"
    • 稍后,您使用expand: ["line_items"] 检索结帐会话。如果您查看checkout.line_items.data[].price,您会发现一个包含您要查找的内容的对象:{ id: "price_abc", nickname: "foobar", … }。请注意,您可以在Stripe documentation here 中看到line_items.data 对象的结构。

    因此,您需要在创建结帐会话时仔细检查您是否使用了正确的价格 ID,并且您正在查看 checkout.line_items.data[].price 以找到价格的 idnickname

    【讨论】:

    • 问题是我不对“price_abc”手动操作,因为这是客户的选择,我无法通过 API 获得。我能得到它的唯一方法是当我执行 Stripe::Price.retrieve('price_abc').nickname 时。似乎 Stripe 创建了一些价格和产品的实例。付款成功后,将其存档。
    • 您需要在创建结帐会话时传递您的价格 ID,如下所示:Stripe::Checkout::Session.create({ line_items: [ { price: "price_1JxC8kFE4oPSz5YOc391IZ9I" } ], add_other_parameters_here })。然后,您将能够在检索 Checkout Session 时获得此价格及其昵称。
    • 它不会改变。在我的 OrdersController 创建中,我得到了 @session = Stripe::Checkout::Session.create({ payment_method_types: ['card'], line_items: [{ name: Stripe::Product.retrieve(@composition.product).name, images: [Stripe::Product.retrieve(@composition.product).images.first], price: @composition_id, amount: @composition.unit_amount, currency: 'eur', quantity: '1' }], success_url: thanks_purchase_url, cancel_url: fails_purchase_url })
    • 我建议使用新的 Checkout(这里是 migration guide),您只需像我在之前的评论中显示的那样传递价格 ID。
    • 似乎来自 Stripe 的 Payment_intent 创建了一个 Product 和 Price 的实例,然后继续收费,然后完成会话。最后,它将这个会话变成了一个存档的会话。我不知道为什么他们不能将所有信息都放在请求中。每个人都应该更容易。此外,拥有您想要购买的产品尺寸等信息更合乎逻辑......
    猜你喜欢
    • 2021-05-19
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-14
    相关资源
    最近更新 更多