【问题标题】:Accepting payments in Xamarin Forms with Stripe's Payment Intent API使用 Stripe 的 Payment Intent API 接受 Xamarin 表单中的付款
【发布时间】:2020-09-07 11:59:30
【问题描述】:

我已经使用 Stripe.net 在我的后端实现了支付,现在我有一个用 Xamarin 编写的移动客户端,我想用它来批准信用卡支付。 但我在网上找到的所有示例都使用 Charge API。 我在后端使用 PaymentIntentAPI,这会根据请求返回客户端密码。

我的问题是:如何使用 Stripe.net 包和 PaymentIntent API 确认付款?

这是在android上使用java的方法:

 stripe = new Stripe(
                    context,
                    PaymentConfiguration.getInstance(context).getPublishableKey()
            );
            stripe.confirmPayment(this, confirmParams);

在 dotnet 中使用旧的费用 API,它是如何完成的:

 StripeConfiguration.SetApiKey("pk_test_xxxxxxxxxxxxxxxxx");

var tokenOptions = new StripeTokenCreateOptions()
{
    Card = new StripeCreditCardOptions()
    {
        Number = cardNumber,
        ExpirationYear = cardExpYear,
        ExpirationMonth = cardExpMonth,
        Cvc = cardCVC
    }
};

var tokenService = new StripeTokenService();
StripeToken stripeToken = tokenService.Create(tokenOptions);

【问题讨论】:

  • 您是否设法找到了一个可行的解决方案,我遇到了同样的问题。只是在寻找 Binding 或 Stripe.js 上的哪种方式......我对此一无所知!
  • 嗨,我成功地采用了不同的方法。我尝试为 iOS 和 Android 创建 xamarin 绑定,但没有成功,并且使用 Stripe.net 包,我不能因为它不允许这样做,根据我通过电子邮件联系的条带开发人员。所以,我所做的是,通过我的后端,我创建了一个剃须刀页面,该页面提供 javascript 条带信用卡输入,并带有适当的费用信息,然后我在我的 Xamarin 应用程序的 web 视图中以安全的方式调用此页面,并带有身份验证令牌

标签: c# xamarin.forms stripe-payments


【解决方案1】:

方法取决于您的要求。如果您打算仅接受美国和加拿大卡,那么最简单的方法是按照本指南中的说明确认 PaymentIntent 服务器端:

https://stripe.com/docs/payments/without-card-authentication

要点是您在客户端收集信用卡信息(最好使用我们的客户端库之一对详细信息进行标记),然后像调用 Charges API 一样调用 PaymentIntents API:

            var options = new PaymentIntentCreateOptions
            {
              Amount = 1099,
              Currency = "usd",
              PaymentMethodId = request.PaymentMethodId,

              // A PaymentIntent can be confirmed some time after creation,
              // but here we want to confirm (collect payment) immediately.
              Confirm = true,

              // If the payment requires any follow-up actions from the
              // customer, like two-factor authentication, Stripe will error
              // and you will need to prompt them for a new payment method.
              ErrorOnRequiresAction = true,
            };

            paymentIntent = service.Create(options);

这里的关键参数是:

  • Confirm:需要设置为true,以便立即处理付款。
  • ErrorOnRequiresAction:需要设置为 true 以防止支付进入需要某种形式的身份验证(例如 3D 安全)的状态

如果 SCA 和全球监管要求是一个问题。然后,您需要找到一种方法来确认支付客户端,以便用户可以在需要时验证支付。目前,不幸的是,对于 Cordova、React Native 和 Xamarin 等混合移动技术,可用的集成路径非常有限。一般来说,您可以采取两种途径:

在 WebView 中运行 Stripe.js

这将允许您使用此处描述的所有方法:https://stripe.com/docs/js,并遵循我们接受付款的默认集成路径:https://stripe.com/docs/payments/accept-a-payment。对于 Xamarin 方面的事情,一个好的起点是官方 WebView 示例:https://docs.microsoft.com/en-us/samples/xamarin/xamarin-forms-samples/workingwithwebview/

搭建通往 Stripe 原生 iOS 和 Android SDK 的桥梁

这比在 WebView 中运行 Stripe.js 稍微复杂一些,但可能会更高效,并提供更精致的用户体验。通过这种方法,您将使用此处概述的方法构建到 Stripe 的 Android 和 iOS SDK 的桥梁:https://devblogs.microsoft.com/xamarin/binding-ios-swift-libraries/ (iOS)、https://docs.microsoft.com/en-us/xamarin/android/platform/binding-java-library/ (Android)

【讨论】:

  • 我尝试在webview中调用stripe,但是脚本无法显示。但是在桌面上运行相同的 html 和 js 脚本时,会显示条带支付,但会显示一条消息,指出无法进行自动完成,因为环境不受信任
  • 我查看了条带库,它不是 Swift 而是 Objective-c,我有什么困惑吗?我希望我的原因是绑定 swift 库看起来要简单得多
  • Stripe 的 iOS SDK 适用于 Swift 和 Objective-C。我建议针对您在将 Stripe 集成到 Xamarin 应用程序时遇到的特定问题提出新问题。
  • 嗨,我采用了 Webview 的方法,但是对于卡身份验证后的重定向,有没有办法在 webview 中处理呢?我的意思是这样的:stripe.com/docs/js/payment_intents/confirm_ideal_payment
【解决方案2】:

好的,既然我真的很难让它工作,我想在这里和你们分享,也许它对像我这样被卡住的人有用,基本上你需要从你的用户那里收集信用卡详细信息一个常规的 xamarin 表单,然后使用以下代码使用信用卡详细信息确认支付意图:

  • 首先按照条带文档中的说明在您的后端服务器上创建一个 paymentIntent,然后将 paymentIntent Id 和客户端密码返回给您的 xamarin 表单应用。
  • 创建一个 paymentIntentConfirmOptions

 var paymentConfirmOptions = new PaymentIntentConfirmOptions
                {
                    ClientSecret = createPaymentIntentResponse.ClientSecret,
                    Expand = new List<string> { "payment_method" },
                    PaymentMethodData = new PaymentIntentPaymentMethodDataOptions
                    {
                        Type = "card",
                        BillingDetails = new    PaymentIntentPaymentMethodDataBillingDetailsOptions
                        {
                            // Add Extra Info                            
                        }
                    },
                    ReturnUrl = "payments-example://stripe-redirect"
                };
  • 在 PaymentIntentConfirmOptions 中设置信用卡选项:

paymentConfirmOptions.AddExtraParam("payment_method_data[card][number]", "1234567890353543");
                paymentConfirmOptions.AddExtraParam("payment_method_data[card][exp_month]", "12");
                paymentConfirmOptions.AddExtraParam("payment_method_data[card][exp_year]", "23");
                paymentConfirmOptions.AddExtraParam("payment_method_data[card][cvc]", "123");
  • 然后确认付款: var result = await paymentIntentService.ConfirmAsync(PaymentIntentId, paymentConfirmOptions);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    • 2021-08-24
    • 2020-02-19
    • 2013-04-25
    • 2021-06-12
    相关资源
    最近更新 更多