Flutter In App 购买(订阅)三天后自动退款

Ani*_*lil 9 in-app-purchase flutter

我已经集成了 flutter in_app_purchase订阅(android),但它总是在 3 天后自动退款

我正在使用下面的代码进行颤振订阅。我在代码中找不到实际问题,请帮助我在这段代码中遗漏了什么

在此输入图像描述

    导入'dart:异步';
    导入 'dart:io';
    导入“包:flutter/material.dart”;
    导入'包:url_launcher/url_launcher.dart';
    导入'包:in_app_purchase / in_app_purchase.dart';
    导入 'util/ConsumableStore.dart';
    
    
    const bool _kAutoConsume = true;
    
    const String _kConsumableId = '消耗品';
    const List _kProductIds = ['订阅_项目', '购买_项目'];
    
    类 StoreScreenNew 扩展 StatefulWidget {
      @覆盖
      _StoreScreenState createState() => _StoreScreenState();
    }
    
    类 _StoreScreenState 扩展状态 {
      最终 InAppPurchaseConnection _connection = InAppPurchaseConnection.instance;
      流订阅>_订阅;
      列表_notFoundIds = [];
      列表_产品=[];
      列表_购买=[];
      布尔_isAvailable = false;
      布尔_purchasePending = false;
      布尔_加载=真;
      字符串_queryProductError;
      布尔_isConnected = false;
      String 商店名称 = "";
    
      @覆盖
      无效初始化状态(){
        checkInternet().then((onValue) {
          设置状态((){
            _isConnected = onValue;
          });
        });
        流购买更新 =
            InAppPurchaseConnection.instance.purchaseUpdatedStream;
        _subscription = buyUpdated.listen((purchaseDetailsList) {
          _listenToPurchaseUpdated(购买详情列表);
        }, onDone: () {
          _订阅.取消();
        }, onError: (错误) {
          // 在这里处理错误。
        });
        initStoreInfo();
        super.initState();
      }
    
      未来 checkInternet() 异步 {
        尝试 {
          最终结果=await InternetAddress.lookup('google.com');
          if (result.isNotEmpty && result[0].rawAddress.isNotEmpty) {
            返回Future.value(true);
          } 别的 {
            返回Future.value(false);
          }
        } on SocketException catch (_) {
          返回Future.value(false);
        }
      }
    
      未来 initStoreInfo() 异步 {
        如果(平台.isIOS){
          商店名称 = "iTunes";
        } 别的 {
          商店名称 = "Play 商店";
        }
    
        最终 bool isAvailable = wait _connection.isAvailable();
        如果(!可用){
          设置状态((){
            _isAvailable = isAvailable;
            _产品= [];
            _购买=[];
            _notFoundIds = [];
            _purchasePending = false;
            _加载=假;
          });
          返回;
        }
    
        产品详细信息响应 产品详细信息响应 =
            等待 _connection.queryProductDetails(_kProductIds.toSet());
        if (productDetailResponse.error != null) {
          设置状态((){
            _queryProductError = ProductDetailResponse.error.message;
            _isAvailable = isAvailable;
            _products=productDetailResponse.productDetails;
            _购买=[];
            _notFoundIds = 产品详细信息响应.notFoundIDs;
            _purchasePending = false;
            _加载=假;
          });
          返回;
        }
    
        如果(productDetailResponse.productDetails.isEmpty){
          设置状态((){
            _queryProductError = null;
            _isAvailable = isAvailable;
            _products=productDetailResponse.productDetails;
            _购买=[];
            _notFoundIds = 产品详细信息响应.notFoundIDs;
            _purchasePending = false;
            _加载=假;
          });
          返回;
        }
    
        最终 QueryPurchaseDetailsResponse 购买响应 =
            等待 _connection.queryPastPurchases();
        if (purchaseResponse.error!= null) {
          // 处理查询过去的购买错误..
        }
        最终列表verifiedPurchases = [];
        for (PurchaseDetails buy in buyResponse.pastPurchases) {
          如果(等待_verifyPurchase(购买)){
            verifyPurchases.add(购买);
          }
        }
        设置状态((){
          _isAvailable = isAvailable;
          _products=productDetailResponse.productDetails;
          _purchases = 已验证的购买;
          _notFoundIds = 产品详细信息响应.notFoundIDs;
          _purchasePending = false;
          _加载=假;
        });
      }
    
      @覆盖
      无效处置(){
        _订阅.取消();
        超级.dispose();
      }
    
      @覆盖
      小部件构建(BuildContext上下文){
        列表栈=[];
        如果(_queryProductError == null){
          堆栈.添加(
            列表显示(
              孩子们: [
                _buildConnectionCheckTile(),
                _buildProductList(),
                添加隐私(),
                添加链接()
              ],
            ),
          );
        } 别的 {
          堆栈.添加(中心(
            孩子:文本(_queryProductError),
          ));
        }
        如果(_purchasePending){
          堆栈.添加(
            堆(
              孩子们: [
                不透明度(
                  不透明度:0.3,
                  子: const ModalBarrier(可关闭: false,颜色: Colors.grey),
                ),
                中心(
                  子:CircularProgressIndicator(),
                ),
              ],
            ),
          );
        }
    
        返回MaterialApp(
          主页: 脚手架(
            应用栏:应用栏(
                背景颜色:Theme.of(context).primaryColor,
                自动暗示领先:真,
                标题:文本('PRO',
                    样式:Theme.of(context).textTheme.headline5),
                前导:图标按钮(
                  图标:图标(Icons.arrow_back),
                  onPressed: () => Navigator.pop(context, false),
                )),
            主体:_isConnected
                ?堆(
                    孩子们:堆栈,
                  )
                : 中心(
                    子项:列(
                        mainAxisAlignment:MainAxisAlignment.center,
                        crossAxisAlignment:CrossAxisAlignment.center,
                        孩子们: [
                        大小框(
                          高度:10,
                        ),
                        容器(
                            边距:EdgeInsets.all(20),
                            孩子:文本(
                              “检查您的互联网连接,然后重试。”,
                              文本对齐:文本对齐.center,
                              样式:TextStyle(颜色:Colors.black45,字体大小:26),
                            ))
                      ])),
          ),
        );
      }
    
      卡_buildConnectionCheckTile() {
        如果(_加载){
          return Card(child: ListTile(title: const Text('尝试连接...')));
        }
        最终小部件 storeHeader = ListTile(
          前导: Icon(_isAvailable ? Icons.check : Icons.block,
              颜色:_有货吗?Colors.green : ThemeData.light().errorColor),
          标题:文字(
              '商店是 ' + (_isAvailable ? '可用' : '不可用') + '.'),
        );
        最终列表子项 = [
          !_可用吗?商店标题:容器()
        ];
    
        如果(!_isAvailable){
          儿童.addAll([
            除法器(),
            列表图块(
              title: Text('未连接',
                  样式: TextStyle(颜色: ThemeData.light().errorColor)),
              副标题:const Text(
                  “无法连接到支付处理器。该应用程序配置正确吗?有关说明,请参阅示例自述文件。'),
            ),
          ]);
        }
        返回卡(子项:列(子项:子项));
      }
    
      卡_buildProductList() {
        如果(_加载){
          退卡(
              孩子:(ListTile(
                  领先:CircularProgressIndicator(),
                  title: Text('正在获取产品...'))));
        }
        如果(!_isAvailable){
          返回卡();
        }
        最终 ListTile 产品标题 = ListTile(
          标题:文字(
            '可用选项',
            样式:TextStyle(字体大小:20),
          ),
          
        );
        列出产品列表 = [];
        如果(_notFoundIds.isNotEmpty){
          产品列表.add(ListTile(
              title: Text('[${_notFoundIds.join(", ")}] 未找到',
                  样式: TextStyle(颜色: ThemeData.light().errorColor)),
              字幕:文本(
                  '这个应用程序需要特殊配置才能运行。请参阅 example/README.md 了解说明。')));
        }
    
     
        地图购买 =
            Map.fromEntries(_purchases.map((PurchaseDetails 购买) {
          如果(购买.pendingCompletePurchase){
            InAppPurchaseConnection.instance.completePurchase(购买);
          }
          return MapEntry(purchase.productID,purchase);
        }));
        产品列表.addAll(_产品.map(
          (产品详细信息产品详细信息){
            购买详情 previousPurchase = 购买[productDetails.id];
    
            返回容器(
              装饰:BoxDecoration(
                borderRadius: BorderRadius.circular(10),
                颜色: 颜色.白色,
                盒子阴影:[
                  BoxShadow(颜色: Colors.grey, spreadRadius: 1),
                ],
              ),
              边距:EdgeInsets.all(5),
              填充:EdgeInsets.all(10),
              子项:列(
                孩子们: [
                  文本(
                    产品详细信息.标题,
                    文本对齐:文本对齐.center,
                    样式:文本样式(
                        字体大小:14,
                        fontWeight:FontWeight.bold,
                        颜色:
                            先前购买!= null ?颜色.绿色 : 颜色.黑色),
                  ),
                  大小框(
                    高度:10,
                  ),
                  除法器(),
                  大小框(
                    高度:10,
                  ),
                  文本(
                    产品详细信息.描述,
                    文本对齐:文本对齐.左,
                  ),
                  大小框(
                    高度:20,
                  ),
                  除法器(),
                  容器(
                      对齐:Alignment.bottomRight,
                      孩子:以前的购买!= null
                          ?容器(
                              填充:const EdgeInsets.all(10.0),
                              装饰: new BoxDecoration(
                                形状:BoxShape.圆形,
                                颜色: 颜色.绿色,
                              ),
                              孩子:图标(
                                图标.检查,
                                尺寸:30,
                                颜色: 颜色.白色,
                              ))
                          : 扁平按钮(
                              孩子:文本(
                                产品详情.价格,
                                样式:TextStyle(字体大小:18),
                              ),
                              颜色:颜色.绿色[800],
                              文本颜色:颜色.白色,
                              按下时:() {
                                购买参数 购买参数 = 购买参数(
                                    产品详细信息: 产品详细信息,
                                    应用程序用户名:空,
                                    沙箱测试:假);
                                if (productDetails.id == _kConsumableId) {
                                  _connection.buyConsumable(
                                      购买参数: 购买参数,
                                      自动消费:_kAutoConsume || 平台.isIOS);
                                } 别的 {
                                  _connection.buyNonConsumable(
                                      购买参数:购买参数);
                                }
                              },
                            ))
                ],
              ),
            );
     
          },
        ));
    
        退卡(
            边距:EdgeInsets.all(10),
            海拔:0,
            子项:列(
              孩子们: [
                    产品标题,
                    除法器(),
                  ] +
                  产品列表,
            ));
      }
     
      无效 showPendingUI() {
        设置状态((){
          _purchasePending = true;
        });
      }
    
      void DeliverProduct(PurchaseDetails buyDetails) async {
         
        if (purchaseDetails.productID == _kConsumableId) {
          等待 ConsumableStore.save(purchaseDetails.purchaseID);
          App.setPurchasesStatus(true);
          设置状态((){
            _purchasePending = false;
          });
        } 别的 {
          设置状态((){
            _purchases.add(购买详情);
            _purchasePending = false;
          });
        }
      }
    
      无效handleError(IAPError错误){
        设置状态((){
          _purchasePending = false;
        });
      }
    
      未来 _verifyPurchase(PurchaseDetails 购买详情) {
       
        返回Future.value(true);
      }
    
      void _handleInvalidPurchase(PurchaseDetails 购买详细信息) {
       
      }
    
      void _listenToPurchaseUpdated(列出购买详情列表) {
        buyDetailsList.forEach((PurchaseDetails buyDetails) async {
          if (purchaseDetails.status == PurchaseStatus.pending) {
            showPendingUI();
          } 别的 {
            if (purchaseDetails.status == PurchaseStatus.error) {
              处理错误(purchaseDetails.error);
            } else if (purchaseDetails.status == PurchaseStatus.purchased) {
              bool valid = wait _verifyPurchase(purchaseDetails);
              如果(有效){
                交付产品(购买详情);
              } 别的 {
                _handleInvalidPurchase(购买详情);
                返回;
              }
            }
            如果(平台.isAndroid){
              if (!_kAutoConsume && buyDetails.productID == _kConsumableId) {
                等待 InAppPurchaseConnection.instance
                    .consumePurchase(购买详情);
              }
            }
            如果(purchaseDetails.pendingCompletePurchase){
              等待 InAppPurchaseConnection.instance
                  .completePurchase(购买详情);
            }
          }
        });
      }
     
    }

Don*_*nki 9

确保您正在调用断点

InAppPurchaseConnection.instance.completePurchase(purchase);
Run Code Online (Sandbox Code Playgroud)

也许在调用之前发生了一些事情。

也许在两者之间调用了 dispose() 。