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

在Xamarin Forms中集成Stripe Apple Pay:找不到STPApplePayContext类求助

解决Xamarin.Forms中Stripe集成Apple Pay找不到STPApplePayContext的问题

我来帮你排查这个问题,找不到STPApplePayContext通常和库版本、命名空间或者绑定完整性有关,咱们一步步来梳理解决方案:


1. 先确认库的版本是否达标

STPApplePayContext是Stripe iOS SDK在v19.0+版本才引入的封装类,如果你用的Xamarin绑定库(不管是官方的Xamarin.Stripe.iOS NuGet还是自己编译的iOS Bindings)对应的Stripe iOS SDK版本低于这个,自然找不到这个类。

  • 如果用的是官方NuGet包:打开NuGet包管理器,搜索Xamarin.Stripe.iOS,更新到最新稳定版,然后清理解决方案、还原NuGet包,重启Visual Studio试试。
  • 如果是自己编译的自定义绑定:检查你用来生成绑定的Stripe iOS SDK框架版本,确保是v19.0以上的,重新编译绑定库并替换项目中的引用。

2. 检查命名空间是否正确

在Xamarin的绑定库中,STPApplePayContext通常在Stripe命名空间下,而不是你代码里的StripeSdk或者Stripe_ApplePay。试试在代码顶部添加:

using Stripe;

然后再尝试引用STPApplePayContext,看看能不能找到。

3. 自定义绑定库需检查ApiDefinition完整性

如果你是自己手动编译的iOS Bindings(而非官方NuGet),可能绑定过程中漏掉了STPApplePayContext的定义。需要打开绑定项目的ApiDefinition.cs文件,添加以下绑定代码(如果没有的话):

// STPApplePayContext 类绑定
[BaseType(typeof(NSObject))]
interface STPApplePayContext
{
    [Export("initWithPaymentRequest:delegate:")]
    IntPtr Constructor(PKPaymentRequest paymentRequest, ISTPApplePayContextDelegate @delegate);

    [Export("presentApplePayOnViewController:")]
    void PresentApplePay(UIViewController viewController);

    [Export("cancelPayment")]
    void CancelPayment();
}

// 对应的Delegate协议绑定
[Protocol, Model]
[BaseType(typeof(NSObject))]
interface ISTPApplePayContextDelegate
{
    [Export("applePayContext:didCreatePaymentMethod:paymentInformation:completion:")]
    void DidCreatePaymentMethod(STPApplePayContext context, STPPaymentMethod paymentMethod, PKPayment paymentInformation, Action<STPError> completion);

    [Export("applePayContext:didCompleteWithStatus:error:")]
    void DidComplete(STPApplePayContext context, STPPaymentStatus status, NSError error);
}

添加后重新编译绑定库,再替换到你的Xamarin项目中。

4. 临时替代方案:直接使用原生Apple Pay API

如果暂时无法解决STPApplePayContext的问题,可以绕开这个封装类,直接用Apple Pay的原生PKPaymentAuthorizationViewController结合Stripe的Token API来实现支付,你的代码已经创建了_paymentRequest,可以这样修改Pay()方法:

public bool Pay()
{
    // 检查支付请求是否有效
    if (!PKPaymentAuthorizationViewController.CanMakePaymentsUsingNetworks(_paymentNetworks))
    {
        // 提示用户无法使用Apple Pay
        return false;
    }

    var paymentAuthVC = new PKPaymentAuthorizationViewController(_paymentRequest);
    paymentAuthVC.Delegate = new ApplePayAuthorizationDelegate();
    // 获取当前ViewController并弹出支付界面
    var currentVC = UIApplication.SharedApplication.KeyWindow.RootViewController;
    currentVC.PresentViewController(paymentAuthVC, true, null);
    return true;
}

// 实现Apple Pay授权的Delegate
private class ApplePayAuthorizationDelegate : PKPaymentAuthorizationViewControllerDelegate
{
    public override void DidAuthorizePayment(PKPaymentAuthorizationViewController controller, PKPayment payment, Action<PKPaymentAuthorizationStatus> completion)
    {
        // 将Apple Pay的令牌转换为Stripe Token
        var tokenParams = new STPTokenParams();
        tokenParams.ApplePayToken = payment.Token;

        STPAPIClient.SharedClient.CreateToken(tokenParams, (token, error) =>
        {
            if (error != null)
            {
                // 令牌创建失败,提示用户
                completion(PKPaymentAuthorizationStatus.Failure);
                return;
            }

            // 拿到Stripe Token后,调用你的后端API发起支付
            // 比如用token.Id创建PaymentIntent
            // ...你的支付逻辑...

            completion(PKPaymentAuthorizationStatus.Success);
        });
    }

    public override void DidFinish(PKPaymentAuthorizationViewController controller)
    {
        // 关闭支付界面
        controller.DismissViewController(true, null);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 14:27:48