当前位置: 首页 > 知识库问答 >
问题:

条纹上的“无此类付款意图:(空)”

庞书
2023-03-14

我最近将Stripe iOS SDK和API从2019-05-16版本更新为最新版本。以前,我的代码在Charges API上运行良好,但现在PaymentIntent出现了问题。

我使用Stripe Connect和自定义帐户,同时创建单独的费用和转账。

问题是,当我尝试进行初始付款时,我没有收到这样的付款意图:(null)错误。但实际上,正在创建付款意图。付款“不完整”和“PaymentIntent status:requires_payment_method”。

另一方面,如果我手动替换从MyAPIClient.swift/createCustomerKey方法传递到CheckoutViewController.swift/paymentContext(didCreatePaymentResult)方法的(clientSecret),用另一个来自先前不完整收费的clientSecret密钥,它都可以正常工作并且付款成功。

我可以确认clientSecret密钥是否正确地从我的服务器(Firebase Cloud函数)传递到客户端,然后从MyAPIClient传递到CheckoutViewController——请参阅下面代码中的print()。我还仔细检查了前端和后端的API键。

以下是我的后端代码:

const stripe = require('stripe')(functions.config().stripe.token);

exports.createPaymentIntentForStripeAccount = functions.https.onRequest((req, res) => {

    const uid = req.body.uid;
    const amount = req.body.amount;
    const currency = req.body.currency;
    const customer_id = req.body.customer_id;
    const transfer_group = req.body.transfer_group;

    return stripe.paymentIntents.create({
        amount: amount,
        currency: currency,
        customer: customer_id,
        transfer_group: transfer_group,
        capture_method: "manual",
    }).then(function(paymentIntent) {
        const clientSecret = paymentIntent.client_secret;
        res.status(200).json(clientSecret);
    });

});

客户端:

// MyAPIClient

    func createPaymentIntent(amount: Int, bookingID: String, completion: @escaping ((Result<String>) -> Void)) {

        let url = self.baseURL.appendingPathComponent("createPaymentIntentForStripeAccount")
        let transfer_group = bookingID.components(separatedBy: "/").last!
        let params: [String: Any] = [
            "uid": UserService.currentUserProfile!.uid,
            "customer_id": UserService.currentUserProfile!.stripe_customer_id!,
            "amount": amount,
            "transfer_group": transfer_group,
            "currency": "USD"
            ]

        Alamofire.request(url, method: .post, parameters: params)
            .validate(statusCode: 200..<300)
            .responseString { responseString in
                switch responseString.result {
                case .success(let clientSecret):
                    print(clientSecret)
                    completion(.success(clientSecret))
                case .failure(let error):
                    completion(.failure(error))
                }
        }
    }


// CheckoutViewController

    func paymentContext(_ paymentContext: STPPaymentContext, didCreatePaymentResult paymentResult: STPPaymentResult, completion: @escaping STPPaymentStatusBlock) {

        MyAPIClient.sharedClient.createPaymentIntent(amount: self.paymentContext.paymentAmount, bookingID: self.bookingRef.url) { result in
            switch result {
            case .success(let clientSecret):
                let paymentIntentParams = STPPaymentIntentParams(clientSecret: clientSecret)
                paymentIntentParams.configure(with: paymentResult)
                print(clientSecret)
                STPPaymentHandler.shared().confirmPayment(withParams: paymentIntentParams, authenticationContext: paymentContext) { status, paymentIntent, error in
                    switch status {
                    case .succeeded:
                        completion(.success, nil)
                    case .failed:
                        completion(.error, error)
                    case .canceled:
                        completion(.userCancellation, nil)
                    @unknown default:
                        completion(.error, nil)
                    }
                }
            case .failure(let error):
                print("Failed to create a Payment Intent: \(error)")
                completion(.error, error)
                break
            }
        }
    }

任何建议或反馈都将受到欢迎和不胜感激。

非常感谢。

共有1个答案

公羊雅达
2023-03-14

上面的代码在双引号中产生clientSecret,导致一个看起来像“pi_xxx_secret_xxx”的键,这当然不起作用。

我应该在服务器端解析JSON后转义额外的引号,或者在客户端删除它们。例如:

completion(.success(clientSecret.replacingOccurrences(of: "\"", with: ""))
 类似资料:
  • 使用此方法确认付款意图时,我收到以下错误

  • 我正在为一个在线购物网站实施stripe,该网站在“余额”系统上运行,用户在该系统中输入他们想在交易余额中存入的金额,并提交信用卡信息进行存款。 我不知道如何避免在付款确认时进行两次连续的api调用stripe:一次使用html表单中的存款当前值更新付款金额,一次确认付款意图。 以下是我理解的限制条件: Stripe需要创建一个支付意图,以便用他们的信用卡表单填充iframe 为了简化存款体验,我

  • 我正在尝试使用PaymentIntent执行带区支付。我在stripe网站上读到了以下内容(链接) 在服务器上使用金额和货币创建PaymentIntent。始终要决定在服务器端(一个受信任的环境)而不是客户端收取多少费用。这就防止了恶意客户能够自行选择价格。 我不明白如何决定在服务器端收取多少费用。我的应用程序有一系列的项目要买,每一个项目都有价格应用程序是一个市场和价格清单在客户端,所以我决定多

  • 我想每30天用Stripe卡重复充值,金额会波动。 从文件中我得知,如果有可能卡需要3DS,我们应该使用源,所以我切换到源;) 从源对象条带.js检索中,我查看参数来决定是创建需要3DS还是正常卡充电的源对象。 使用JS,我得到了将设置为可选或必需的源对象。当我使用以下命令检索源代码后,它被设置为可选:,它看起来像这样: 我把它附在客户身上,然后充电。我猜意味着我可以稍后再给卡充电… 当我创建了一

  • 我们是一家小型初创企业,大约两个月前开始。我们使用Stripe作为主要支付处理器,同时使用PayPal作为次要选项。 我们的计划是每月订阅,每月从$ 5到$ 25不等。我们的付款表单当前收集用户的姓名,CC,到期日期和CVC安全代码。 第一个月后,我们开始注意到用户的定期付款在 Stripe 上开始失败。我们不知道为什么会发生这种情况。如果第一笔付款成功,为什么未来的订阅付款会失败?到目前为止,我

  • 对不起,我对编码很陌生,所以我不知道很多缩写/速记的东西。所以我正在使用React和C#尝试使用Stripe来处理付款,我已经到了取回、和付款方式Id的地步,但是当我运行代码时: 我得到了一个错误: 没有这样的支付意图。这是一个404,用于/v1/payment\u intent/confirm 我猜这意味着支付意图实际上没有被创建,因为它也没有出现在Stripe仪表板上。我不知道该怎么解决这个问