payment_intent.payment_failed 事件 Python 的 Stripe 结帐会话中的自定义元数据

custom metadata in Stripe checkout session for payment_intent.payment_failed event Python

我想在 payment_intent.payment_failed 事件中获取用户 ID,而 client_refrence_id 不在来自条带的 payment_failed 事件中的请求数据中。我试过 metadata={'user_id': user_id} 但这也没有显示在请求数据中。也试过这个 subscription_data.metadata = {"metadata": {"bar": "BAR", }}, 但它显示语法错误 "SyntaxError:表达式不能包含赋值,也许你的意思是“==”? 即使我这样做 (==) 它说 SyntaxError: positional argument follows keyword argument 这是我的代码:

            checkout_session = stripe.checkout.Session.create(
                client_reference_id=user_id,
                # metadata={'user_id': user_id},
                subscription_data.metadata = {"metadata": {"bar": "BAR", }},
                success_url="success_url",
                cancel_url="cancel_url",
                payment_method_types=["card"],
                mode="subscription",
                line_items=[
                    {
                        "price": price_id,
                        "quantity": 1,
                    }
                ],
            )

这是我的 webhook 代码

def webhook_received(self):
        payload = request.data
        endpoint_secret = 'my_secret_key'
        sig_header = request.headers.get('stripe-signature')

        try:
            event = stripe.Webhook.construct_event(
                payload, sig_header, endpoint_secret
            )
            data = event['data']
        except:
            pass
        event_type = event['type']
        if event_type == 'checkout.session.completed':
            self.handle_checkout_session(data)
        elif event_type == 'payment_intent.payment_failed':
            self.saving_failed_subscription_data(data)
        return "success" 

为了在 在 Python 中创建结帐会话时将元数据传递给订阅,您需要使用嵌套字典而不是点表示法。因此,在您的情况下,您可以像这样修改结帐会话的创建:

checkout_session = stripe.checkout.Session.create(
                client_reference_id=user_id,
                # metadata={'user_id': user_id},
                # subscription_data.metadata = {"metadata": {"bar": "BAR", }}, <-- won't work
                # This should work to get data to invoice/subscription
                 subscription_data = {
                  "metadata": {"user_id": user_id}
                 },
              # This will get the metadata on to the related payment_intent
                payment_intent_data={
                  "metadata": {"user_id": user_id}
                },
                success_url="success_url",
                cancel_url="cancel_url",
                payment_method_types=["card"],
                mode="subscription",
                line_items=[
                    {
                        "price": price_id,
                        "quantity": 1,
                    }
                ],
            )


对于 Stripe API 允许您操作的任何嵌套属性的 Python 到 post 数据,这种使用字典的方法是必需的。

Create a Session docs 有一长串值得回顾的可配置参数,现在您已经掌握了如何附加嵌套数据的语法。