客户没有与ID相关联的来源

时间:2017-01-08 16:13:04

标签: swift stripe-payments

查看条带测试trasactions时,我一直收到以下错误:

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

我调用api的快速代码如下:

    @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 个答案:

答案 0 :(得分:5)

使用Stripe CheckoutStripe.js创建卡片令牌后,您可以将其发送到您使用它通过API创建客户的服务器。该卡与该客户“保存”,然后您可以在将来收费。如果您想向同一客户添加另一张卡,您可以使用创建卡API传递新令牌并添加该卡。

创建charge时,您会在customer参数中传递客户ID(cus_XXX)以对默认卡收费。如果您想要为特定卡收费,您可以将source参数中的卡ID(card_YYY)与客户一起传递。

目前,您正在尝试传递不受支持的客户ID和卡令牌。您需要先将该卡保存在客户上,然后在source参数中传递新卡ID,如上所述。