微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 Stripe API 确认 Apple Pay 付款

如何解决如何使用 Stripe API 确认 Apple Pay 付款

所以几天后,我终于能够在今天早上创建令牌以及付款方式和付款意图设置。现在我对如何使用 Apple Pay 实际确认付款感到困惑,在非 Apple Pay 结账流程中,我有这个功能

func paymentContext(_ paymentContext: STPPaymentContext,didCreatePaymentResult paymentResult: STPPaymentResult,completion: @escaping STPPaymentStatusBlock) {
        guard let paymentIntentClientSecret = paymentIntentClientSecret else {
            return;
        }
        // Collect card details
        
        
        let paymentIntentParams = STPPaymentIntentParams(clientSecret: paymentIntentClientSecret)
        paymentIntentParams.configure(with: paymentResult)
        
        
        // Submit the payment
        let paymentHandler = STPPaymentHandler.shared()
        paymentHandler.confirmPayment(paymentIntentParams,with: self) { (status,paymentIntent,error) in
            switch (status) {
            case .Failed:
                self.displayFailureAlert(title: "Payment Failed",message: "There was an error trying to complete the payment,please try again later.")
                self.paymentInProgress = false
                break
            case .canceled:
                self.displayCancelleDalert(title: "Payment Canceled",message: "The payment has been cancelled.")
                self.paymentInProgress = false
                break
            case .succeeded:
                self.displaySuccessAlert(title: "Payment Succeeded",message: "The payment was successful!")
                self.paymentInProgress = false
                break
            @unkNown default:
                fatalError()
                break
            }
        }
    }

这很好用。 STPApplePayContext 中的参数与 STPPaymentContext 中的参数略有不同,我无法对其使用完全相同的功能。这是我用于 Apple Pay 结账的功能

func applePayContext(_ context: STPApplePayContext,didCreatePaymentMethod paymentMethod: STPPaymentMethod,paymentinformation: PKPayment,completion: @escaping STPIntentClientSecretCompletionBlock) {
    guard let paymentIntentClientSecret = paymentIntentClientSecret else {
        return;
    }

    let paymentIntentParams = STPPaymentIntentParams(clientSecret: paymentIntentClientSecret)
    
    
    let error = NSError()
    completion(paymentIntentClientSecret,error)
    
}

这就是我到目前为止所做的一切,我尝试执行 STPapiclient.shared.confirmPaymentIntent(with:) 但没有任何改变,有什么建议吗?

解决方法

基本上你需要关注the instructions starting at step 7 of Stripe's documentation

具体来说,您需要在您的服务器上创建一个 Payment Intent,将其客户端密钥传递给您的应用,然后按如下方式实现委托方法:

extension CheckoutViewController {
    func applePayContext(_ context: STPApplePayContext,didCreatePaymentMethod paymentMethod: STPPaymentMethod,paymentInformation: PKPayment,completion: @escaping STPIntentClientSecretCompletionBlock) {
        let clientSecret = ... // Retrieve the PaymentIntent client secret from your backend (see Server-side step above)
        // Call the completion block with the client secret or an error
        completion(clientSecret,error);
    }

    func applePayContext(_ context: STPApplePayContext,didCompleteWith status: STPPaymentStatus,error: Error?) {
          switch status {
        case .success:
            // Payment succeeded,show a receipt view
            break
        case .error:
            // Payment failed,show the error
            break
        case .userCancellation:
            // User cancelled the payment
            break
        @unknown default:
            fatalError()
        }
    }
}

另见 the documentation for STPApplePayContext,它给出了简化的高级指令:

  1. 使用描述付款请求(金额、行项目、所需送货信息等)的 PKPaymentRequest 初始化此类
  2. 调用presentApplePayOnViewController:completion:显示Apple Pay表并开始付款过程3(可选):如果您需要响应用户更改其送货信息/送货方式,请实施可选的委托方法
  3. 当用户点击“购买”时,此类使用您在 applePayContext:didCreatePaymentMethod:completion: 委托方法中提供的 PaymentIntent 来完成支付
  4. 在支付完成/错误并解除工作表后,此类会在 applePayContext:didCompleteWithStatus: 委托方法中通知您
,

您将在成功处理程序中使用 retrievePaymentIntent 获得付款响应,调用此函数后您将获得所有与付款相关的信息,您也可以使用 Strip API 获取带有交易 ID 的数据。

func applePayContext(_ context: STPApplePayContext,error: Error?) {
        switch status {
        case .success:
            // Payment succeeded,show a receipt view
            context.apiClient.retrievePaymentIntent(withClientSecret: clientSecret) { (paymentIntent,error) in
                
                print(paymentIntent?.allResponseFields ?? "")
            }
            break
        case .error:
            // Payment failed,show the error
            break
        case .userCancellation:
            // User cancelled the payment
            break
        @unknown default:
            fatalError()
        }
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。