【问题标题】:Is it possible to pass custom data to stripe checkout?是否可以将自定义数据传递给条带结帐?
【发布时间】:2021-10-01 15:37:54
【问题描述】:

我正在关注带有服务器集成的 Stripe Checkout 文档:https://stripe.com/docs/payments/checkout/server

示例中的代码运行良好,但我遇到的问题是在购买完成后无法跟踪用户或他们的订单。

我有一个 webhook 设置,当付款完成时,Stripe 会 ping。但来自 Stripe 的响应会话除了名称、描述和图像外,不包含有关订购产品的信息。我可以使用产品名称来查询数据库,但我更喜欢 ID 或 slug 之类的。

$app->post("/stripe-pingback", function(Request $request, Response $response, array $args) {
    \Stripe\Stripe::setApiKey("xxxxx");

    // You can find your endpoint's secret in your webhook settings
    $endpoint_secret = 'xxxxx';

    $payload = $request->getBody();
    $sig_header = isset($_SERVER['HTTP_STRIPE_SIGNATURE']) ? $_SERVER['HTTP_STRIPE_SIGNATURE'] : null;
    $event = null;

    try {
        $event = \Stripe\Webhook::constructEvent($payload, $sig_header, $endpoint_secret);
    } catch(\UnexpectedValueException $e) {
        // Invalid payload
        http_response_code(400); // PHP 5.4 or greater
        exit();
    } catch(\Stripe\Error\SignatureVerification $e) {
        // Invalid signature
        http_response_code(400); // PHP 5.4 or greater
        exit();
    }

    // Handle the checkout.session.completed event
    if ($event->type == 'checkout.session.completed') {
        $session = $event->data->object;
        var_dump($session);

        // Possible to get custom data from session?
        $customer = $session->customer;
        $customerEmail = $session->customer_email;

        // Fulfill the purchase...
        $this->db->insertAudioPurchase();
    }

    http_response_code(200); // PHP 5.4 or greater
});

是否可以将 ID 与 Stripe 可以 ping 回的结帐请求一起传递以允许我查找订单并生成下载链接?

【问题讨论】:

  • 说真的,我不明白为什么您希望从结帐会话中知道的最重要的数据,例如“我的用户支付了什么费用”,却留给了 Stripe 的其他流程或解决方法。

标签: php stripe-payments


【解决方案1】:

编辑: metadata 现在可以 exist on the Session object。尽管您可能需要使用更新的 API 版本才能进行设置。

metadata 尚不存在于 Session 对象中,因此您不能使用它。

您可以使用client_reference_id 字段在您的会话中存储一些自定义数据。请注意,内容必须是唯一的。 Have a look here.

【讨论】:

  • 谢谢。这带来了一个问题,因为我没有客户的唯一 ID。购买过程不需要注册。并且只需要用户在条带结账时提供的电子邮件地址。也许通过使用密钥加密数据来生成 ID,并在结帐成功时对其进行解密以获得购买所需的信息?
  • 我想多了。我可以把产品塞进去。
  • Stripe 'Session' 现在有一个元数据属性:stripe.com/docs/api/checkout/sessions/…。奇怪的是,分配的元数据不会出现在 Stripe Web 管理界面中,但它确实会回到我的 webhook。
  • 你可以在哪个 webhook 中看到它?我尝试了 payment_intent.succeeded 没有任何成功。
  • payment_intent.succeeded 描述了一个 PaymentIntent。你可能想要checkout.session.completed:stripe.com/docs/api/events/…
【解决方案2】:

您可以使用键 metadata 传递一个数组。付款完成后,Stripe 将返回您发送的该字段。

你只需要以这种格式传递。

"metadata": {}

虽然,我用它来创建用户和保存卡片。但是,我在结帐时没有使用它,但似乎您几乎可以通过每个 API 传递它。

来自Stripe Doc

可更新的 Stripe 对象(包括 Account、Charge、Customer、PaymentIntent、Refund、Subscription 和 Transfer)具有元数据参数。您可以使用此参数将键值数据附加到这些 Stripe 对象。

元数据可用于存储有关对象的其他结构化信息。例如,您可以将系统中的用户全名和相应的唯一标识符存储在 Stripe Customer 对象上。 Stripe 不使用元数据(例如,不用于授权或拒绝收费),除非您选择向他们展示,否则您的用户不会看到元数据。

【讨论】:

  • 看来你不能,根据这个问题stackoverflow.com/questions/55744094/…
  • 事实上你可以。但是您需要使用 session.PaymentIntentData.Metadata 字段,而不是 session.Metadata
  • @Softlion 谢谢!我挣扎了一天,只收到了空的元数据。
【解决方案3】:

我不知道您是否找到了解决方案,但这是我的解决方案。 我使用了支付意图数据并插入到这个元数据中,这是我对 stackoverflow 的第一个帮助。 我正在从两天内搜索解决方案,仅此而已。所以我想帮你。

Stripe Docs 不是那么清晰和有用

                    payment_intent_data: {
                        metadata: {
                            key1 : val1,
                            ke2  : val2,
                            key3 : val3,
                        }
                    },

【讨论】:

    【解决方案4】:
    checkout_session = stripe.checkout.Session.create(
                customer_email='foo@bar.bar',
                success_url=domain_url + 'success?session_id={CHECKOUT_SESSION_ID}',
                cancel_url=domain_url + 'cancel/',
                payment_method_types=['card'],
                mode='subscription',
                locale='pl',
                line_items=[
                    {
                        'price': 'price_*****************',
                        'quantity': 1,
                    }
                ],
                subscription_data={'metadata':{'someKeyHere': 'your session variable data'}}
            )
    

    【讨论】:

      猜你喜欢
      • 2013-05-07
      • 1970-01-01
      • 2018-07-18
      • 1970-01-01
      • 2020-02-04
      • 2021-01-17
      • 2012-02-09
      • 2017-04-12
      • 1970-01-01
      相关资源
      最近更新 更多