Stripe Webhook 不捕获产品数据/元数据

发布于 2025-01-10 07:44:20 字数 4340 浏览 4 评论 0原文

我想使用stripe支付链接系统,支付方式可以是卡/钱包

我不想使用结账按钮系统,因为支付不是动态的

一旦支付成功(自动订阅或手动结账)我需要发送激活码到用户的电子邮件。明年,当费用从卡中自动扣除时,我需要再次生成激活密钥并在下一年发送相同的激活密钥。

我看到 Stripe 付款 webhook 中有很多事件,我使用了 charge.succeeded 事件侦听器,它确实向我发送了对象(粘贴在下面)。

我这里有一个问题。如果我依赖此 charge.succeeded 对象,我找不到有关购买哪种产品的信息。我的系统中有很多产品

响应已用户提供的电子邮件,但我无法在 charge.succeeded 对象中获取产品详细信息。我已在付款链接页面中提供了元数据信息,如下所示。我还提供了产品中的元数据以及每个定价中的元数据

在此处输入图像描述

我使用此链接 - https://buy.stripe.com/test_28o3cn6hC5bgdoIcMM 测试卡号:4242 4242 4242 4242 任何日期和 CVV 号码都可以。

Webhook 响应在此处捕获 - https://docs.google.com/spreadsheets/d/1RjnFnjHvs9ca8tIPoRiNHFUph_npm5pVK2S15wVllzI/edit?usp=sharing

非常感谢任何帮助

{
  "id": "evt_1KWzCbHpIo9Nhh5aYEv7XlY8",
  "object": "event",
  "api_version": "2017-12-14",
  "created": 1645777861,
  "data": {
    "object": {
      "id": "ch_1KWzCaHpIo9Nhh5atK09dpaO",
      "object": "charge",
      "amount": 100,
      "amount_captured": 100,
      "amount_refunded": 0,
      "application": null,
      "application_fee": null,
      "application_fee_amount": null,
      "balance_transaction": "txn_1KWzCaHpIo9Nhh5anEebLs4X",
      "billing_details": {
        "address": {
          "city": null,
          "country": "IN",
          "line1": null,
          "line2": null,
          "postal_code": null,
          "state": null
        },
        "email": "[email protected]",
        "name": "CARDNAME",
        "phone": null
      },
      "calculated_statement_descriptor": "XXXXXXXXXXX",
      "captured": true,
      "created": 1645777860,
      "currency": "inr",
      "customer": "cus_LDQ2DBhL2VkPOH",
      "description": "Subscription creation",
      "destination": null,
      "dispute": null,
      "disputed": false,
      "failure_code": null,
      "failure_message": null,
      "fraud_details": {
      },
      "invoice": "in_1KWzCYHpIo9Nhh5ammBkFvU1",
      "livemode": false,
      "metadata": {
      },
      "on_behalf_of": null,
      "order": null,
      "outcome": {
        "network_status": "approved_by_network",
        "reason": null,
        "risk_level": "normal",
        "risk_score": 58,
        "seller_message": "Payment complete.",
        "type": "authorized"
      },
      "paid": true,
      "payment_intent": "pi_1KWzCYHpIo9Nhh5aj6Xgl3tS",
      "payment_method": "pm_1KWzCXHpIo9Nhh5aADMKyWPc",
      "payment_method_details": {
        "card": {
          "brand": "visa",
          "checks": {
            "address_line1_check": null,
            "address_postal_code_check": null,
            "cvc_check": "pass"
          },
          "country": "US",
          "exp_month": 2,
          "exp_year": 2022,
          "fingerprint": "MxtsbEBU2BmJbOn4",
          "funding": "credit",
          "installments": null,
          "last4": "4242",
          "network": "visa",
          "three_d_secure": null,
          "wallet": null
        },
        "type": "card"
      },
      "receipt_email": null,
      "receipt_number": null,
      "receipt_url": "https://pay.stripe.com/receipts/acct_1BhpF1HpIo9Nhh5a/ch_1KWzCaHpIo9Nhh5atK09dpaO/rcpt_LDQ2FDPK6fwsEyBOISiDCItSv8JeNbl",
      "refunded": false,
      "refunds": {
        "object": "list",
        "data": [

        ],
        "has_more": false,
        "total_count": 0,
        "url": "/v1/charges/ch_1KWzCaHpIo9Nhh5atK09dpaO/refunds"
      },
      "review": null,
      "shipping": null,
      "source": null,
      "source_transfer": null,
      "statement_descriptor": null,
      "statement_descriptor_suffix": null,
      "status": "succeeded",
      "transfer_data": null,
      "transfer_group": null
    }
  },
  "livemode": false,
  "pending_webhooks": 1,
  "request": {
    "id": "req_QzrolSFU0OA7D7",
    "idempotency_key": "228c5670-85ea-4047-9f9f-9d1e519ffc2c"
  },
  "type": "charge.succeeded"
}

I want to use stripe payment link system, The payment method can be Card/Wallet

I dont want to use checkout button system, since the payment isnt dynamic

Once the payment is successful (auto subscription or manual checkout) I need to send the activation code to the users email. The next year when the charge is auto debited from card I need to generate the activation key again and send the same for the next year.

I see there are many events in the Stripe payment webhooks, I have used charge.succeeded event listener and it does send me the object (pasted below).

I have one issue here. If I rely on this charge.succeeded object I find no information on which product the purchase is made. There are many products in my system

The response have user supplied email but there is no way I product details in the charge.succeeded object. I have supplied the metadata info in the payment link page as below. I have also supplied the metadata in products as well as metadata in the every pricings

enter image description here

I use this link - https://buy.stripe.com/test_28o3cn6hC5bgdoIcMM
Test card number: 4242 4242 4242 4242
and any dates and CVV number would work.

Webhook responses are captured here - https://docs.google.com/spreadsheets/d/1RjnFnjHvs9ca8tIPoRiNHFUph_npm5pVK2S15wVllzI/edit?usp=sharing

Any help is greatly appreciated

{
  "id": "evt_1KWzCbHpIo9Nhh5aYEv7XlY8",
  "object": "event",
  "api_version": "2017-12-14",
  "created": 1645777861,
  "data": {
    "object": {
      "id": "ch_1KWzCaHpIo9Nhh5atK09dpaO",
      "object": "charge",
      "amount": 100,
      "amount_captured": 100,
      "amount_refunded": 0,
      "application": null,
      "application_fee": null,
      "application_fee_amount": null,
      "balance_transaction": "txn_1KWzCaHpIo9Nhh5anEebLs4X",
      "billing_details": {
        "address": {
          "city": null,
          "country": "IN",
          "line1": null,
          "line2": null,
          "postal_code": null,
          "state": null
        },
        "email": "[email protected]",
        "name": "CARDNAME",
        "phone": null
      },
      "calculated_statement_descriptor": "XXXXXXXXXXX",
      "captured": true,
      "created": 1645777860,
      "currency": "inr",
      "customer": "cus_LDQ2DBhL2VkPOH",
      "description": "Subscription creation",
      "destination": null,
      "dispute": null,
      "disputed": false,
      "failure_code": null,
      "failure_message": null,
      "fraud_details": {
      },
      "invoice": "in_1KWzCYHpIo9Nhh5ammBkFvU1",
      "livemode": false,
      "metadata": {
      },
      "on_behalf_of": null,
      "order": null,
      "outcome": {
        "network_status": "approved_by_network",
        "reason": null,
        "risk_level": "normal",
        "risk_score": 58,
        "seller_message": "Payment complete.",
        "type": "authorized"
      },
      "paid": true,
      "payment_intent": "pi_1KWzCYHpIo9Nhh5aj6Xgl3tS",
      "payment_method": "pm_1KWzCXHpIo9Nhh5aADMKyWPc",
      "payment_method_details": {
        "card": {
          "brand": "visa",
          "checks": {
            "address_line1_check": null,
            "address_postal_code_check": null,
            "cvc_check": "pass"
          },
          "country": "US",
          "exp_month": 2,
          "exp_year": 2022,
          "fingerprint": "MxtsbEBU2BmJbOn4",
          "funding": "credit",
          "installments": null,
          "last4": "4242",
          "network": "visa",
          "three_d_secure": null,
          "wallet": null
        },
        "type": "card"
      },
      "receipt_email": null,
      "receipt_number": null,
      "receipt_url": "https://pay.stripe.com/receipts/acct_1BhpF1HpIo9Nhh5a/ch_1KWzCaHpIo9Nhh5atK09dpaO/rcpt_LDQ2FDPK6fwsEyBOISiDCItSv8JeNbl",
      "refunded": false,
      "refunds": {
        "object": "list",
        "data": [

        ],
        "has_more": false,
        "total_count": 0,
        "url": "/v1/charges/ch_1KWzCaHpIo9Nhh5atK09dpaO/refunds"
      },
      "review": null,
      "shipping": null,
      "source": null,
      "source_transfer": null,
      "statement_descriptor": null,
      "statement_descriptor_suffix": null,
      "status": "succeeded",
      "transfer_data": null,
      "transfer_group": null
    }
  },
  "livemode": false,
  "pending_webhooks": 1,
  "request": {
    "id": "req_QzrolSFU0OA7D7",
    "idempotency_key": "228c5670-85ea-4047-9f9f-9d1e519ffc2c"
  },
  "type": "charge.succeeded"
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

烙印 2025-01-17 07:44:20

我在 Stripe 中使用 webhook 解决方案时遇到了类似的问题。尽管我在产品中定义了元数据,但它并未发货,即 JSON 中的元数据为空。

就我而言,解决方案是使用价格的元数据(在产品中定义)。为此,只需单击 Stripe 网站上产品页面上的价格部分...

在此处输入图像描述

...并在价格页面上定义元数据。

输入图像描述这里

还有另一个有趣的帖子https://stackoverflow.com/a/69117489/10849985 显示是否提供元数据取决于事件,即链接到 webhook 的某些事件包含它,其他事件则不包含它。

I have had a similar problem when using a webhook solution in Stripe. Although I had defined meta data in the product it was not shipped, i.e. metadata in JSON was empty.

In my case the solution has been to use the meta data of the price instead (which is defined within the product). For this, just click price section on product page on Stripe website...

enter image description here

...and define meta data on the price page.

enter image description here

There is another interesting post https://stackoverflow.com/a/69117489/10849985 showing that it is event-depending if meta data is provided or not, i.e. some events linked to the webhook inlcude it, others not.

千秋岁 2025-01-17 07:44:20

当您的客户打开付款链接时,将在后台生成结账会话。因此,您应该收听 checkout.session.completed 事件,并从 line_items 属性。

a Checkout Session will be generated under the hood when your customer opens a Payment Link. Therefore, you should listen to the checkout.session.completed events, and get the product data from the line_items property of the Checkout Session object.

忘年祭陌 2025-01-17 07:44:20

对我来说,问题是我将价格和产品对象合并在一起,这会用价格对象的空元数据覆盖产品上的元数据。

为了解决这个问题,我只是确保元数据正在接收来自产品对象的值

    const product = await stripe.products.list();
    const price = await stripe.prices.list();
    const productData = product.data.map((productData, index) => {
      return { 
        ...productData, 
        ...price.data[index], 
        quantity: 1, 
        addedToCart: false,
        metadata: productData.metadata };
    });

For me the issue was that I was merging the price and products objects together which was overwriting the metadata on the product with the empty metadata of the price object.

To fix this I just made sure the metadata was receiving the values from the product obj

    const product = await stripe.products.list();
    const price = await stripe.prices.list();
    const productData = product.data.map((productData, index) => {
      return { 
        ...productData, 
        ...price.data[index], 
        quantity: 1, 
        addedToCart: false,
        metadata: productData.metadata };
    });
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文