使用 Flutter 确认购买

2024-04-28

扑动的in_app_purchase插件已更新至版本0.3.0,将 Google Play 库迁移到2.0.3.
根据 Google Play Library v2,所有购买都必须在 3 天内(测试订单为 5 分钟)内得到确认,否则将被自动取消。
在最新的提交中in_app_purchase,一种称为acknowledgePurchase被添加到BillingClient班级。 然而,当前记录的应用内购买方式是通过InAppPurchaseConnection.instance它不提供任何确认购买的方法。

一个通用的实现in_app_purchase看起来像这样:

// Listening for new purchases
final Stream purchaseUpdates = InAppPurchaseConnection.instance.purchaseUpdatedStream;
StreamSubscription<List<PurchaseDetails>> _subscription = purchaseUpdates.listen((purchases) {
    _handlePurchaseUpdates(purchases);
});

// Product Details
ProductDetailsResponse _productDetailsResponse = await InAppPurchaseConnection.instance.queryProductDetails(this.productIDs.toSet());

// Past Purchases
QueryPurchaseDetailsResponse _purchaseDetailsResponse = await InAppPurchaseConnection.instance.queryPastPurchases();

// Making an nonConsumable purchase
PurchaseParam param = PurchaseParam(
    productDetails: productDetails,
    applicationUserName: null,
    sandboxTesting: sandboxTesting
);
InAppPurchaseConnection.instance.buyNonConsumable(purchaseParam: param);

购买并验证后,产品就会交付。但是,我们如何在监听新购买的同时确认新购买,并在获取过去购买列表的同时确认旧购买(如果未确认)呢?


我也在寻找解决方案,看起来发行说明中对此进行了描述。https://pub.dev/packages/in_app_purchase#-changelog-tab- https://pub.dev/packages/in_app_purchase#-changelog-tab-

例如,在获取过去的购买时:


// at top class level (i.e. App wrapper)
InAppPurchaseConnection.enablePendingPurchases();

// inside class handling the purchases
final InAppPurchaseConnection _connection = InAppPurchaseConnection.instance;

// example use

final QueryPurchaseDetailsResponse purchaseResponse = await _connection.queryPastPurchases();

if (purchaseResponse.error != null) {
  // (handle error)
} else {
  // (purge local store)

  await Future.forEach<PurchaseDetails>(
      purchaseResponse.pastPurchases, (purchaseDetails) async {
          if (await _verifyPurchase(purchaseDetails)) {
            await //(insert purchase to local store);

            final pending = Platform.isIOS
                ? purchaseDetails.pendingCompletePurchase
                : !purchaseDetails.billingClientPurchase.isAcknowledged;

            if (pending) {
              await _connection.completePurchase(purchaseDetails);
            }
          }
        }
    );
}

以前,步_connection.competePurchase原本只适用于 iOS,现在 Android 也需要它。

purchaseDetails.pendingCompletePurchase如果需要完成购买(iOS 和 Android),则为 true。

purchaseDetails.billingClientPurchase.isAcknowledged添加了对 Android 的额外检查以确保completePurchase需要时执行。

0.3.0

“billing_client_wrappers”的其他更新: 对PurchaseWrapper 的更新:添加developerPayload、purchaseState 和isAcknowledged 字段。

“InAppPurchaseConnection”的更新: [重大更改]:InAppPurchaseConnection.completePurchase 现在返回 Future 而不是 Future。 API 中还添加了新的可选参数 {StringdeveloperPayload}。在 Android 上,此 API 不再抛出异常,而是确认购买。如果在 Android 上 3 天内未完成购买,用户将获得退款。

[重大更改]:InAppPurchaseConnection.consumePurchase 现在返回 Future 而不是 Future。 API 中还添加了新的可选参数 {StringdeveloperPayload}。 新的布尔字段pendingCompletePurchase 已添加到PurchaseDetails 类中。它可以用作是否在购买时调用 InAppPurchaseConnection.completePurchase 的指示符。

[重大更改]:在 InAppPurchaseConnection 中添加了enablePendingPurchases。在 Android 上初始化 InAppPurchaseConnection 时,应用程序必须调用此方法。有关详细信息,请参阅启用待定购买。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Flutter 确认购买 的相关文章

  • 图像识别后如何在vuforia sdk ImageTarget中显示布局而不是茶壶模型

    如果图像在 qualcomm vuforia sdk 中被识别 我们如何在布局中显示简单的文本 即 Hello 我正在使用 ImageTarget 的 qualcomm vuforia sdk 示例 现在它在识别图像后显示一个茶壶 我是增强
  • 在 Android 中通过蓝牙接收音频

    我想创建一个能够接收音频流的 Android 应用程序 我想过使用 A2DP 配置文件 但似乎 Android 不支持 A2DP 接收器 看起来有很多人正在寻找这个问题的解决方案 但是接收普通的比特流 然后在应用程序中将数据转换为音频呢 我
  • 停止在列表视图中滚动

    我的活动中有一个列表视图和一个图像按钮 当我单击图像按钮时 我想转到列表中的特定位置 我通过调用列表上的 setSelection intposition 来实现此目的 当用户滑动列表视图然后单击图像按钮时会出现问题 列表将转到指定位置但继
  • Android Wear - 在没有 WearableListenerService 的情况下从 Wear 接收消息?

    我正在开发一款适用于 Android Wear 的应用程序 它可以在手机上启动活动 一切都很好 但我不想依赖手机上不断运行的后台服务来接收此消息 理想情况下 我会让 WearableListenerService 与应用程序同时启动 并保持
  • 我无法从 Android 模拟器中删除日语 IME

    我已经多次看到这个问题 但答案总是 从 语言和键盘设置 菜单中取消选中 IME 问题是那里没有复选框 选择菜单 自定义区域设置 en US 菜单 设置 语言和键盘 选择语言 选择 英语 美国 菜单 设置 语言和键盘 日语输入法是唯一的输入法
  • Android - 在通知栏中使用外部个人资料图像,如 Facebook

    我知道您可以在推送通知参数中发送信息 例如消息 标题 图像 URL 等 Facebook 如何在通知区域中显示您的个人资料图片和消息 我想在通知区域中使用外部图像 因此当您将其下拉时 您会看到带有消息的个人资料图像 现在 我的仅显示可绘制文
  • 如何在Android Studio中安装android 6.0.1模拟器?

    我在我的 Android 模拟器上遇到这个问题E Surface getSlotFromBufferLocked 未知缓冲区 0xab7519c0 https stackoverflow com questions 33046375 e s
  • 如何使用android ndk r9b为Android编译FFMPEG

    我想设计一个Android应用程序 可以通过FFMPEG命令播放和编辑视频 但我不知道如何在Android上使用FFMPEG 我尝试过从Google搜索到的许多方法 但它们太旧了 无法实现 现在 FFMPEG的最新版本是2 1 1 Andr
  • 温度转换 2 字节

    我很难转换两个字节的温度 我有一个控制单元 温度传感器 我可以在其中获取两个字节的温度消息 1 示例 message 40 25 LSBYTE 40 MSBYTE 25 0 03125 C bit temperature 25C seen
  • 带有可点击区域的 Android 图像

    我需要建议如何在 Android 下实现以下功能 我需要一个表示类似于图形 来自离散数学 的图像 具有顶点和边缘 我可以在其中单击每个顶点或边缘并触发不同的操作 请告诉我如何实现这一目标 也许与imagebuttons 或另一种表示此功能的
  • Android Studio 1.0 在 dexDebug 或 dexRelease 上构建失败

    我最近从 Android Studio 0 9 2 升级到 1 0 包括 Gradle 插件版本 1 0 0 并且在构建项目时遇到问题 每当我构建时 我都会在 dexDebug 或 dexRelease 步骤中收到以下异常 UNEXPECT
  • 如何在 Google 地图中创建自定义地图?

    我正在尝试创建一个包含我家地图的 Google 地图应用程序 卧室 浴室 厨房等 使用 GPS 我会找到我现在在家里的位置 并尝试获取到我卧室的方向 步行距离 您可以使用Google的API来获取方向 我需要知道的是 如何添加我家的自定义地
  • android中ScrollView中的图像

    在我的应用程序中 我想放置一个 png 文件 并且希望它在横向和纵向模式下都被视为滚动图像 请建议代码或示例 要使您的 Imageview 在高度不适合时滚动 您可以在 xml 中的 ScrollView 内添加一个 ImageView 并
  • 如何从 SD 卡中删除文件

    我正在创建一个文件作为电子邮件的附件发送 现在我想在发送电子邮件后删除图像 有没有办法删除文件 我努力了myFile delete 但它没有删除该文件 我在 Android 上使用此代码 因此编程语言是 Java 使用通常的 Android
  • Android:列表视图崩溃

    我正在使用 android listview 并且它工作得很好 我的实现如下 ListView listview ListView findViewById R id list setListAdapter new ArrayAdapter
  • AAR 可以包含传递依赖吗? [复制]

    这个问题在这里已经有答案了 现在我有一个库项目 比如项目 Foo 它依赖于像 OkHttp 这样的库 现在 Foo 有一个 Maven 构建步骤 可以生成 AAR 并将其推送到公共位置 现在假设我有项目 B 我们将其称为 Bar Bar是一
  • 如何在给定的纬度和经度处使用标记/覆盖项目启动地图意图?

    我有一个纬度和经度 我想打开以该点为中心的谷歌地图 所以我使用以下代码 Intent intent new Intent android content Intent ACTION VIEW Uri parse geo lat lng st
  • 无法查询 ContentResolver 以从 my_downloads 获取下载文件的名称,但在 all_downloads 中工作正常

    我的应用程序设置为激活一次具有扩展名的文件 myappdata被打开 它通过这个意图过滤器来实现这一点
  • Android,Volley请求,响应阻塞主线程

    使用 Volley 处理较大响应时会发生一些不好的事情 String url AppHelper DOMAIN service pages profile update json this infoTextView setText getS
  • 如何在 Flutter 中对 RaisingButton 的颜色进行动画处理?

    我有一个RaisedButton 我想要animate它的颜色来自green to red 反之亦然 每次用户单击它时 这怎么能做到呢 您可以使用AnimatedContainer https api flutter dev flutter

随机推荐

  • 数据包丢失和数据包重复

    我试图找出数据包丢失和数据包重复问题之间的区别 有谁知道 数据包重复 是什么意思 和TCP检测到丢失时重传数据包一样吗 No In TCP 数据包 的传递是可靠的 我认为在这种情况下术语数据应该更好 因为它是面向流的协议 数据包丢失和重复是
  • iOS 滑块默认缩略图的大小?

    iOS 滑块的 默认 缩略图的确切尺寸 宽度 高度 是多少 是否有一些聪明的方法可以将其从系统 XCode iOS 中引诱出来 I tried int thumbWidth slider currentThumbImage size wid
  • res.cookie未在浏览器中设置cookie

    我目前正在尝试使用 React 客户端设置 Node Express 应用程序以与之交互 我设置了护照来处理 JWT 身份验证 当用户登录时 我验证电子邮件 密码 然后我设置cookie res cookie jwt token httpO
  • ViewModel 中的 MediaElement.play()

    我正在努力解决以下问题 我正在使用 MVVM 模式构建 WP8 应用程序 我的 view xaml 中有一个媒体元素 并且在 viewmodel cs 中有控制该媒体元素的逻辑 例如 播放 停止 暂停和音量 如何使用绑定从我的视图模型在此媒
  • 表“DBNAME.hibernate_sequence”不存在

    我有一个使用 spring data jpa 的 Spring Boot 2 0 1 RELEASE 应用程序
  • 为什么express服务器接收到的前端数据是未定义的?

    我目前正在开发社交媒体 Mern Stack React 应用程序 我使用 Node js 和 Express 作为我的后端服务 还使用 mongoose 来存储我的数据 并使用 axios 和 redux thunk 将后端连接到前端 到
  • TFS 2008 在编辑时自动检出代码

    我正在开发一个已添加到 TFS 服务器的 Visual Studio 2008 项目 我不确定为 TFS 配置了哪些设置和策略 这是由单独的部门而不是开发人员完成的 每次我对代码文件进行编辑时 都会自动检出该文件 无需自己显式检出代码文件
  • Xamarin.Android 应用程序仅在干净编译时找到启动器活动

    我有一个Xamarin Android标记为 MainLauncher 的活动称为 Login 当我第一次按 F5 时 应用程序在模拟器中正常启动 然后我停下来 进行一些代码更改 再次按 F5 我可以看到应用程序在模拟器中启动 当我收到以下
  • 从目标中包含/排除整个组

    我的项目有一个包含数百个文件的组 组织成几十个两级子组 该组中的文件本身经常被更改 我希望这些文件包含在某些目标中 但不包含在其他目标中 在 Xcode 3 x 中 每次更改组后 我只需获取有关组本身的信息 转到 目标 选项卡 然后 重新
  • Android Studio - 无法识别的 VM 选项“MaxPermSize=256m”

    我刚刚在 Elementary OS 0 3 Freya 上安装了 Android Studio 并使用终端运行它 然而 在我第一次启动时 显示一条错误消息 Gradle 测试 项目刷新失败 无法启动守护进程 这个问题可能是由 守护进程的配
  • 在 vs code 中连接到 Azure Devops 私有 NuGet

    我们有一个私人NuGet喂养 它一直与Visual Studio 我们的开发人员通过他们的联系Azure帐户与私人提要 我想在迁移到 VS Code 时保留相同的功能 使用找到的文档here https learn microsoft co
  • 连接 2 个控制器并可以访问第二个控制器中的第一个控制器属性

    我对角镖有疑问 1 个用于触发作用域的 html 文件和 2 个控制器类 索引 html subCtrl 用户名 第一控制器 Controller selector mainController publishAs mainCtrl cla
  • 纹理openGl。 C++、qt

    我试图用草纹理覆盖我的地形 由高度图制成 但它没有按预期工作 我什至无法在简单的 GL QUAD 上获取纹理 结果是多色网络 void GLWidget initializeGL glEnable GL TEXTURE 2D 在 QGLwi
  • 实体框架中的级联更新

    我有以下涉及 2 个类的场景 public class Parent Key public int Id get set Other properties here public virtual IList
  • 在本地主机(Chrome 和 FF)上,过期时间少于 1 年时未设置 cookie

    我在本地主机上遇到问题 并且在Chrome and Firefox not Edge 这段代码可以正常工作 并且会设置 cookie HttpPost public ActionResult Change string val var co
  • Jprofiler Linux 上的远程分析。如何更改探查器数据文件的路径

    我正在 Linux 盒子上运行 java java 6 应用程序并进行其他设置 agentpath home myuser jprofiler bin linux x64 libjprofilerti so nowait 端口 7777 在
  • 基于另一个属性的地幔属性类别?

    如何使用 Github Mantle 根据同一类中的另一个属性来选择属性类 或者在更坏的情况下 JSON 对象的另一部分 例如 如果我有一个像这样的对象 content mention text some text created at 1
  • VS2012 单元测试:如何更改 TestResults 文件夹的位置

    我将所有单元测试项目都放在解决方案文件夹下的一个文件夹中 并且希望将 TestResults 文件夹放在与测试项目相同的文件夹中 而不是放在解决方案目录中 我发现这可以通过测试设置文件来完成 如何在VS 2010中指定单元测试结果的位置 h
  • 更新 mtl 后找不到模块“Control.Monad.State”

    我想用Control Monad Except模块 但结果发现我有一个过时的 mtl 包 它导致了导入错误 我有一个过时的模块Control Monad Error 所以我做了 sudo cabal install mtl 并且安装了2 2
  • 使用 Flutter 确认购买

    扑动的in app purchase插件已更新至版本0 3 0 将 Google Play 库迁移到2 0 3 根据 Google Play Library v2 所有购买都必须在 3 天内 测试订单为 5 分钟 内得到确认 否则将被自动取