You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于.NET MAUI的医疗应用集成Stripe Tap to Pay SDK技术咨询

.NET MAUI集成Stripe Tap to Pay SDK分步指南

由于Stripe官方暂未提供针对.NET MAUI的Tap to Pay SDK直接支持,我们需要通过平台原生SDK封装+MAUI跨平台调用的方式实现集成,以下是具体步骤:

前提准备

  • 已注册Stripe账号并启用Tap to Pay权限(医疗类项目需额外确认Stripe合规审核要求)
  • 本地已配置完整的.NET MAUI开发环境(支持Android API 24+、iOS 15.0+)
  • 了解基础的MAUI平台特定代码编写逻辑

1. 平台原生SDK集成

Android平台(Platforms/Android)

  • 添加Stripe Android SDK依赖:打开Module级build.gradle,在dependencies块中加入:

    implementation 'com.stripe:stripe-android:20.12.+'
    

    请替换为Stripe Android SDK的最新稳定版本。

  • 配置权限与清单:修改AndroidManifest.xml,添加必要权限:

    <uses-permission android:name="android.permission.NFC" />
    <uses-feature android:name="android.hardware.nfc" android:required="true" />
    
  • 封装原生服务类:创建TapToPayService.cs,实现Stripe Tap to Pay核心逻辑:

    using Android.App;
    using Android.Content;
    using Com.Stripe.Android.TapToPay;
    using Com.Stripe.Android.Core;
    
    namespace YourAppName.Platforms.Android;
    
    public class TapToPayService : ITapToPayService
    {
        private TapToPaySdk? _tapToPaySdk;
        private Activity? _currentActivity;
    
        public void Initialize(Activity activity, string publishableKey)
        {
            _currentActivity = activity;
            var stripeContext = new StripeContext.Builder(activity)
                .SetPublishableKey(publishableKey)
                .Build();
            _tapToPaySdk = new TapToPaySdk(stripeContext);
        }
    
        public async Task StartPaymentAsync(string paymentIntentClientSecret)
        {
            if (_tapToPaySdk == null || _currentActivity == null)
                throw new InvalidOperationException("Tap to Pay SDK未初始化");
    
            var options = new TapToPaySessionOptions.Builder(paymentIntentClientSecret)
                .Build();
    
            var callback = new TapToPayCallback();
            _tapToPaySdk.StartSession(_currentActivity, options, callback);
            await callback.TaskCompletionSource.Task;
        }
    
        private class TapToPayCallback : Java.Lang.Object, ITapToPaySessionCallback
        {
            public TaskCompletionSource<bool> TaskCompletionSource { get; } = new();
    
            public void OnSessionCanceled() => TaskCompletionSource.SetResult(false);
            public void OnSessionCompleted() => TaskCompletionSource.SetResult(true);
            public void OnSessionError(Java.Lang.Exception error) => TaskCompletionSource.SetException(new Exception(error.Message));
        }
    }
    

iOS平台(Platforms/iOS)

  • 添加Stripe iOS SDK:通过NuGet安装Stripe.iOS包,或在Podfile中添加依赖后执行pod install:

    pod 'Stripe', '~> 23.0'
    
  • 配置Info.plist权限:添加NFC使用描述:

    <key>NFCReaderUsageDescription</key>
    <string>支持Tap to Pay支付功能,读取银行卡信息</string>
    
  • 封装原生服务类:创建TapToPayService.cs,调用Stripe iOS的Tap to Pay控制器:

    using Foundation;
    using Stripe;
    using UIKit;
    
    namespace YourAppName.Platforms.iOS;
    
    public class TapToPayService : ITapToPayService
    {
        private UIViewController? _currentViewController;
    
        public void Initialize(UIViewController viewController, string publishableKey)
        {
            _currentViewController = viewController;
            STPPaymentConfiguration.SharedConfiguration.PublishableKey = publishableKey;
        }
    
        public async Task StartPaymentAsync(string paymentIntentClientSecret)
        {
            if (_currentViewController == null)
                throw new InvalidOperationException("当前视图控制器未设置");
    
            var tapToPayController = await STPTapToPayController.CreateWithPaymentIntentClientSecretAsync(
                paymentIntentClientSecret,
                _currentViewController,
                new TapToPayDelegate()
            );
    
            await _currentViewController.PresentViewControllerAsync(tapToPayController, true);
        }
    
        private class TapToPayDelegate : STPTapToPayControllerDelegate
        {
            public override void TapToPayControllerDidCancel(STPTapToPayController controller) => controller.DismissViewController(true, null);
            public override void TapToPayControllerDidComplete(STPTapToPayController controller) => controller.DismissViewController(true, null);
            public override void TapToPayController(STPTapToPayController controller, NSError error)
            {
                controller.DismissViewController(true, null);
                // 自定义错误处理逻辑
            }
        }
    }
    

2. 跨平台共享层实现

  • 定义服务接口:在共享项目中创建ITapToPayService.cs:

    public interface ITapToPayService
    {
        void Initialize(object platformContext, string publishableKey);
        Task StartPaymentAsync(string paymentIntentClientSecret);
    }
    
  • 注册依赖注入:在MauiProgram.cs中添加平台服务注册:

    builder.Services.AddSingleton<ITapToPayService>(sp =>
    {
        #if ANDROID
            return new Platforms.Android.TapToPayService();
        #elif IOS
            return new Platforms.iOS.TapToPayService();
        #else
            throw new NotImplementedException("当前平台不支持Tap to Pay");
        #endif
    });
    

3. 业务逻辑调用

在共享项目的ViewModel或页面中注入ITapToPayService,并调用支付流程:

public class PaymentViewModel : ObservableObject
{
    private readonly ITapToPayService _tapToPayService;
    private readonly string _publishableKey = "你的Stripe发布密钥";

    public PaymentViewModel(ITapToPayService tapToPayService)
    {
        _tapToPayService = tapToPayService;
        // 初始化服务(传入平台上下文)
        var platformContext = Platform.CurrentActivity ?? Platform.GetCurrentUIViewController();
        _tapToPayService.Initialize(platformContext, _publishableKey);
    }

    [RelayCommand]
    public async Task StartTapToPay()
    {
        try
        {
            // 从后端获取PaymentIntent的ClientSecret(禁止前端生成)
            var clientSecret = await GetPaymentIntentClientSecretFromBackend();
            await _tapToPayService.StartPaymentAsync(clientSecret);
            // 支付成功后的业务逻辑
        }
        catch (Exception ex)
        {
            // 支付异常处理
        }
    }

    private async Task<string> GetPaymentIntentClientSecretFromBackend()
    {
        // 调用后端API生成并返回ClientSecret
        return string.Empty;
    }
}

关键注意事项

  • PaymentIntent生成:必须在后端服务器生成PaymentIntent并返回ClientSecret,禁止在前端硬编码密钥或生成PaymentIntent。
  • 合规性:医疗类项目需确保符合PCI DSS及当地医疗支付合规要求,Stripe Tap to Pay已简化PCI合规流程,但仍需确认业务场景的合规性。
  • 测试流程:使用Stripe测试卡号(如4242 4242 4242 4242,任意过期日期、CVC)进行功能测试,确保NFC功能正常。

内容的提问来源于stack exchange,提问作者Walsh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 15:27:14