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

Xamarin iOS使用Plugin.InAppBiling插件获取base64格式购买收据方法

iOS Plugin.InAppBilling 获取receipt-data问题解答

关于verify是否等同于receipt-data的判断

该理解不正确。
你代码中通过DependencyService.Get<IInAppBillingVerifyPurchase>()获取的verify是Plugin.InAppBilling预留的、供开发者自行实现购买验证逻辑的回调接口实例,不属于插件返回的购买凭证数据。如果你没有在对应平台项目中注册该接口的实现,DependencyService.Get返回结果默认就是null,和你需要的receipt-data没有关联。

iOS平台获取base64编码receipt-data的方案

iOS的应用内购买receipt是系统级存储的凭证,不需要通过PurchaseAsync的返回值获取,购买成功后直接从应用的NSBundle中读取即可,可通过以下两种方式实现:

方式1:通过条件编译直接读取(适合MAUI项目)

在共享代码的购买成功分支添加iOS专属逻辑:

else if (purchase.State == PurchaseState.Purchased)
{
    if (Device.RuntimePlatform == Device.iOS)
    {
        #if IOS
        var receiptUrl = Foundation.NSBundle.MainBundle.AppStoreReceiptUrl;
        if (receiptUrl != null && File.Exists(receiptUrl.Path))
        {
            var receiptData = Foundation.NSData.FromFile(receiptUrl.Path);
            string receiptBase64 = receiptData.GetBase64EncodedString(Foundation.NSDataBase64EncodingOptions.None);
            // 此处receiptBase64即为所需的base64编码凭证
        }
        #endif
    }
    return true;
}

方式2:通过依赖服务读取(适合Xamarin.Forms项目)

  1. 共享项目中定义凭证读取接口
public interface IIosReceiptService
{
    string GetBase64Receipt();
}
  1. iOS项目中实现接口并注册依赖
using Foundation;
using System.IO;
using Xamarin.Forms;
// 替换为你的iOS项目实际命名空间
[assembly: Dependency(typeof(YourAppName.iOS.IosReceiptService))]
namespace YourAppName.iOS
{
    public class IosReceiptService : IIosReceiptService
    {
        public string GetBase64Receipt()
        {
            var receiptUrl = NSBundle.MainBundle.AppStoreReceiptUrl;
            if (receiptUrl == null || !File.Exists(receiptUrl.Path))
            {
                // 沙箱环境首次购买无凭证时可在这里调用SKReceiptRefreshRequest刷新凭证
                return string.Empty;
            }
            var receiptData = NSData.FromFile(receiptUrl.Path);
            return receiptData.GetBase64EncodedString(NSDataBase64EncodingOptions.None);
        }
    }
}
  1. 购买成功后在共享代码中调用
else if (purchase.State == PurchaseState.Purchased)
{
    if (Device.RuntimePlatform == Device.iOS)
    {
        var receiptService = DependencyService.Get<IIosReceiptService>();
        string base64Receipt = receiptService?.GetBase64Receipt() ?? string.Empty;
        // 后续对base64Receipt进行验证等处理
    }
    return true;
}

注意事项

沙箱测试环境下如果读取到空的receipt,可调用SKReceiptRefreshRequest主动刷新系统存储的购买凭证后再读取即可。

内容的提问来源于stack exchange,提问作者장주명

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 14:27:02