客户没有与ID关联的链接源

4

在查看Stripe测试交易时,我一直收到以下错误:

{
  "error": {
    "type": "invalid_request_error",
    "message": "Customer cus_9tW8Cf0Xvm9lRv does not have a linked source with ID tok_19Zj5rAANnhOmz4ex3ri2jtW.",
    "param": "source",
    "code": "missing"
  }
}

我调用API的Swift代码如下:

    @IBAction func payButtonWasPressed() {
        stripeCard = STPCardParams()

        let expirationDate = self.cardExpiryTextField.text!.components(separatedBy: "/")
        let expMonth = UInt(expirationDate[0])
        let expYear = UInt(expirationDate[1])

        stripeCard.number = self.cardNumberTextField.text
        stripeCard.cvc = self.cardCVVTextField.text
        stripeCard.expMonth = expMonth!
        stripeCard.expYear = expYear!

        STPAPIClient.shared().createToken(withCard: stripeCard, completion: { (token, error) -> Void in

            if error != nil {
                self.handleError(error! as NSError)
                return
            } 

            self.chargeUsingToken(token!)
        })
    }

    func handleError(_ error: NSError) {
        UIAlertView(title: "Please Try Again",
                    message: error.localizedDescription,
                    delegate: nil,
                    cancelButtonTitle: "OK").show()

    }

    func chargeUsingToken(_ token: STPToken) {

        let URL = "https://splitterstripeserver.herokuapp.com/charge"
        let params = ["source": token.tokenId,
                      "stripe_token": token.tokenId,
                      "amount": total] as [String : Any]

        let manager = AFHTTPSessionManager()
        manager.post(URL, parameters: params, success: { (operation, responseObject) -> Void in

            if let response = responseObject as? [String: String] {
                UIAlertView(title: response["status"],
                    message: response["message"],
                    delegate: nil,
                    cancelButtonTitle: "OK").show()
            }

        }) { (operation, error) -> Void in
            self.handleError(error as NSError)
        }
    }

我正在使用在 stripe github 上找到的示例后端。

在我的应用程序中,我收到一个弹出窗口,显示“请求失败:需要付款(402)”。我尝试了很多不同的方法,但似乎无法获得成功的响应。我看不出自己做错了什么,需要一个新的视角。任何帮助都将是极好的。谢谢。

1个回答

8
使用 Stripe CheckoutStripe.js 创建卡令牌后,将其发送到服务器,在那里您可以使用它来通过 API 创建客户。该卡将与该客户一起“保存”,您随后可以在未来向其收费。如果您想将另一张卡添加到同一个客户中,则可以使用创建卡片 API 来传递新令牌并添加该卡。
当您创建 收费 时,将在 customer 参数中传递客户 ID (cus_XXX) 以收取默认卡的款项。如果您希望收取特定卡的款项,则需要同时传递卡片 ID (card_YYY) 和客户 ID。
目前,您正在尝试传递客户 ID 和卡令牌,但这不受支持。您需要首先将该卡保存到客户端,然后按照上述方式传递新卡 ID 到 source 参数中。

这似乎是个不好的设计。并不是所有的客户都会想要把他们的卡详情保存在一个,坦白说,不太知名的支付平台上。-- 一个一次性的令牌应该是可以收费的,并与客户关联。 - Adambean
@Adambean 我不太同意。您始终可以收取一次性令牌,然后稍后将其附加到客户的费用中:https://stripe.com/docs/api/charges/update#update_charge-customer - koopajah
如果允许的话,为什么不在创建时将费用与客户关联呢?这将把交易要求的数量从2减少到1。我想不出在收费发生后允许此操作但在其发生期间不允许的好理由。 - Adambean

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接