【问题标题】:Rest API webshop checkout architectureRest API 网店结账架构
【发布时间】:2021-12-07 16:56:01
【问题描述】:

我正在构建一个网上商店结帐页面,但遇到了一个问题 - 我如何确定用户确实付款了?

堆栈: Quarkus + Angular

我在结帐页面中集成了 Stripe 付款方式。每次打开结帐页面时,我都会从后端获得 Stripe Intent。然后,在用户输入卡信息并单击“支付”后,我在前端收到一条来自条纹的响应“好的,用户已支付!”,然后我在我的服务器上调用一个 PUBLIC 端点(从前端),我说好的,用户已付款,确认订单。

我如何确定客户确实付款了?他只需调用我的 PUBLIC 服务器端点并确认订单,我就不会知道条带付款实际上从未发生过。

我的猜测是,也许我可以打电话给条带服务器并问:“嘿,真的有使用这种条带意图完成的付款吗?

这里的最佳做法是什么,我应该如何实施确认订单部分?

【问题讨论】:

  • 请提供足够的代码,以便其他人更好地理解或重现问题。

标签: stripe-payments checkout rest webshop


【解决方案1】:

您可能希望监听相关的 webhook 事件,而不是等待来自客户端的回调。在客户端,客户可以在回调执行之前关闭浏览器窗口或退出应用程序。

你可以参考 https://stripe.com/docs/payments/accept-a-payment?platform=web&ui=elements#web-post-payment 了解要监听的事件。

您还可以在此处更详细地阅读 webhook: https://stripe.com/docs/webhooks

【讨论】:

    【解决方案2】:

    当您使用 Stripe API 时,您可以启动 Checkout Session。当您启动它时,它将返回该会话的对象。在该对象中,您可以访问结帐 ID

    首先你像这样开始一个结帐会话

    curl https://api.stripe.com/v1/checkout/sessions \
      -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: \
      -d success_url="https://example.com/success" \
      -d cancel_url="https://example.com/cancel" \
      -d "payment_method_types[0]"=card \
      -d "line_items[0][price]"=price_H5ggYwtDq4fbrJ \
      -d "line_items[0][quantity]"=2 \
      -d mode=payment
    

    之后你会得到一个结果,类似于

    {
      "id": "cs_test_EHNhgisbBCZj4HfTaFiSyoLPLYr1qNPmHeVmZw0BRNDVRYWeAppSFrMt",
      "object": "checkout.session",
      "after_expiration": null,
      "allow_promotion_codes": null,
      "amount_subtotal": null,
      "amount_total": null,
      "automatic_tax": {
        "enabled": false,
        "status": null
      },
      "billing_address_collection": null,
      "cancel_url": "https://example.com/cancel",
      "client_reference_id": null,
      "consent": null,
      "consent_collection": null,
      "currency": null,
      "customer": null,
      "customer_details": null,
      "customer_email": null,
      "expires_at": 1634799676,
      "livemode": false,
      "locale": null,
      "metadata": {},
      "mode": "payment",
      "payment_intent": "pi_1Dpavq2eZvKYlo2Co0uGctWr",
      "payment_method_options": {},
      "payment_method_types": [
        "card"
      ],
      "payment_status": "unpaid",
      "phone_number_collection": {
        "enabled": false
      },
      "recovered_from": null,
      "setup_intent": null,
      "shipping": null,
      "shipping_address_collection": null,
      "submit_type": null,
      "subscription": null,
      "success_url": "https://example.com/success",
      "total_details": null,
      "url": "https://checkout.stripe.com/pay/..."
    }
    

    这个对象中最重要的两个属性是

    • 身份证
    • 网址

    ID 是会话的唯一标识符,您应该将用户重定向到要付款的 URL。

    付款后,您可以查看 Checkout Session 并检查状态

    curl https://api.stripe.com/v1/checkout/sessions/cs_test_EHNhgisbBCZj4HfTaFiSyoLPLYr1qNPmHeVmZw0BRNDVRYWeAppSFrMt \
      -u sk_test_4eC39HqLyjWDarjtT1zdp7dc:
    

    导致此示例响应

    {
      "id": "cs_test_EHNhgisbBCZj4HfTaFiSyoLPLYr1qNPmHeVmZw0BRNDVRYWeAppSFrMt",
      "object": "checkout.session",
      "after_expiration": null,
      "allow_promotion_codes": null,
      "amount_subtotal": null,
      "amount_total": null,
      "automatic_tax": {
        "enabled": false,
        "status": null
      },
      "billing_address_collection": null,
      "cancel_url": "https://example.com/cancel",
      "client_reference_id": null,
      "consent": null,
      "consent_collection": null,
      "currency": null,
      "customer": null,
      "customer_details": null,
      "customer_email": null,
      "expires_at": 1634799676,
      "livemode": false,
      "locale": null,
      "metadata": {},
      "mode": "payment",
      "payment_intent": "pi_1Dpavq2eZvKYlo2Co0uGctWr",
      "payment_method_options": {},
      "payment_method_types": [
        "card"
      ],
      "payment_status": "unpaid",
      "phone_number_collection": {
        "enabled": false
      },
      "recovered_from": null,
      "setup_intent": null,
      "shipping": null,
      "shipping_address_collection": null,
      "submit_type": null,
      "subscription": null,
      "success_url": "https://example.com/success",
      "total_details": null,
      "url": null
    }
    

    如您所见,您拥有payment_status 属性 - 使用此属性,您可以检查用户是否真的付费。

    您也可以使用webhooks,但我更喜欢我的示例

    祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-04
      • 1970-01-01
      • 2015-09-26
      • 2014-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-26
      相关资源
      最近更新 更多