Stripe - 支付订单错误:无法向没有活动卡的客户收费

Posted

技术标签:

【中文标题】Stripe - 支付订单错误:无法向没有活动卡的客户收费【英文标题】:Stripe - Pay order error : Cannot charge a customer that has no active card 【发布时间】:2021-09-19 02:33:11 【问题描述】:

我正在使用 Stripe 的 API 来支付订单。

我的计划大致如下:

    使用 Stripe 元素创建支付表单

    通过使用 PaymentIntent 然后创建 PaymentMethod 进行卡身份验证(3d 安全安全 SCA)。

    创建客户对象,我将付款方式附加到该对象,并将其定义为默认值

$customer = $this->stripeConnector->updateCustomer($customer->id, [
     'invoice_settings' => [
          'default_payment_method' => $paymentMethod->id,
        ],
   ]);
    创建订阅或单次付款。

通常它工作正常。

但不适用于订单。 我按照文档创建 Order Object:https://stripe.com/docs/api/orders/create 与订单项和关联的客户

我按照以下文档付款https://stripe.com/docs/api/orders/pay

所以,只需传递 Order id(因为客户已经与订单关联)。

但我有以下错误:无法向没有有效卡的客户收费

为什么?以及如何“激活”客户卡?

这是我拥有的客户数据示例:


  "id": "cus_JocNLLNhqHuOD6",
  "object": "customer",
  "address": 
    "city": "paris",
    "country": "FR",
    "line1": "5 rue pompidou",
    "line2": null,
    "postal_code": "75000",
    "state": null
  ,
  "balance": 0,
  "created": 1625758082,
  "currency": null,
  "default_source": null,
  "delinquent": false,
  "description": null,
  "discount": null,
  "email": "admin@mail.fr",
  "invoice_prefix": "D46F6A15",
  "invoice_settings": 
    "custom_fields": null,
    "default_payment_method": "pm_1JAz8uGgCQgXBLKX2hoxLQHr",
    "footer": null
  ,
  "livemode": false,
  "metadata": 
  ,
  "name": "admin admin",
  "next_invoice_sequence": 1,
  "phone": null,
  "preferred_locales": [
    "fr"
  ],
  "shipping": null,
  "tax_exempt": "none"

我的 PaymentMethod 响应:


  "id": "pm_1JAz8uGgCQgXBLKX2hoxLQHr",
  "object": "payment_method",
  "billing_details": 
    "address": 
      "city": null,
      "country": null,
      "line1": null,
      "line2": null,
      "postal_code": null,
      "state": null
    ,
    "email": null,
    "name": "qsvsf",
    "phone": null
  ,
  "card": 
    "brand": "visa",
    "checks": 
      "address_line1_check": null,
      "address_postal_code_check": null,
      "cvc_check": "pass"
    ,
    "country": "US",
    "exp_month": 5,
    "exp_year": 2025,
    "fingerprint": "oV7uH07M2JEz7jQm",
    "funding": "credit",
    "generated_from": null,
    "last4": "4242",
    "networks": 
      "available": [
        "visa"
      ],
      "preferred": null
    ,
    "three_d_secure_usage": 
      "supported": true
    ,
    "wallet": null
  ,
  "created": 1625758080,
  "customer": "cus_JocNLLNhqHuOD6",
  "livemode": false,
  "metadata": 
  ,
  "type": "card"

查看有关 Order 对象付款的文档,我想知道是否应该改用“源”选项,因此使用 Source 对象而不是 PaymentMethod。但问题是,Source Object 已被弃用,取而代之的是 PaymentMethod 以支持 3d 安全,所以我必须使用它。

【问题讨论】:

当您创建付款方式时,它的结果类型属性是什么? stripe.com/docs/api/payment_methods/… 这是“卡片”类型属性。我用 PaymentMethod 响应更新了我的第一篇文章 嗯。您是否仔细检查过,当您创建并支付订单时,您是否也在测试/沙盒环境中? 是的,它很好地使用了测试环境,不用担心。此外,如果我切换使用 Source 对象而不是 PaymentMethod 来提供卡,它可以工作,但我不再需要使用 Source 对象,因为它已被弃用并且不支持 SCA 3d 安全身份验证。我们有义务通过 PaymentMethod。不知道有没有额外的选项可以放在某个地方,很奇怪 添加了详细答案,您正在使用 Orders,这是一个已弃用的 API,仅支持 Customer 上的 sources 参数,不支持 PaymentMethods。 【参考方案1】:

Orders 是一个早已弃用的 Stripe API,因此我建议您放弃它,转而使用 PaymentIntents 或一次性发票。

由于它是一个遗留 API,它仅适用于 Cards/Sources 而不是 PaymentMethods。

现在,您的集成正在将 PaymentMethod 附加到您的客户。

Orders 不会查找客户的 PaymentMethods,而是查找客户的 sources: 参数。

订单也不支持 SCA,因此如果支付需要身份验证,那只会显示为拒绝,并且不会为您提供 PaymentIntents 为您提供的身份验证生命周期功能。

这就是为什么当您将“源”对象保存在客户的source: 下时,它会按您所说的那样工作。

正确的方法是放弃使用已弃用的 Card/Source 对象和 Orders API,并集成 PaymentMethods(您已经集成)和 PaymentIntents 或 Invoices 或 CheckoutSessions。

【讨论】:

真的吗?太糟糕了......但突然之间,我还能使用与 Sku 对象关联的 Product 对象吗?我的意思是,如果我创建一个产品对象“T 恤”,以及与该产品关联的几个 Sku 对象,具有不同的颜色和尺寸、库存,那么我是否可以将这些 sku 与 Invoice、PaymentMethod 或 PaymentIntent 一起用作“订单项” ? 不建议使用 SKU,但建议使用价格,您可以从产品中创建价格。然后,您可以使用该价格在客户上创建一个 InvoiceItem,并通过电子邮件将发票发送给客户。 “托管发票页面”支持 SCA。或者为该客户创建一个 CheckoutSession(作为您网站上的支付页面),它也支持 SCA。 所以如果我理解正确的话,不再由 Stripe 来管理库存和产品项目,而是由我们在自己的数据库中做所有事情,并在付款时计算一切都靠我们自己? 是的,这是正确的,因为订单已被弃用,您将在应用程序端处理库存/库存/等

以上是关于Stripe - 支付订单错误:无法向没有活动卡的客户收费的主要内容,如果未能解决你的问题,请参考以下文章

Stripe 无法在 webview 中进行支付错误

如何通过 Stripe.com 向客户收取特定卡的费用

无法使用 Stripe 支付模块在“DOMWindow”上执行“postMessage”

“未捕获的类型错误:在 angularJS/NodeJS 中使用条带支付方法 Stripe.charges.create() 时无法读取未定义的属性‘创建’”

条带支付中没有此类令牌错误

Asp.Net - Stripe 支付意图在本地工作,但在线出现错误 502