我一直在开发一个可以选择购买高级版本的小应用程序。它适用于自动接受或拒绝的测试卡。然而,慢卡带来了问题。该应用程序会说购买正在等待(期望的行为),但在购买恢复后,即使购买仍在等待,它也会像购买已收费一样,提供高级版本的访问权限,直到购买被拒绝或在他们之前应该有访问权限(不良行为)。由此产生的另一个问题是,如果他们有溢价,我会在本地保存,所以即使他们得到几分钟,应用程序也会像他们终生拥有一样。我想过每次打开应用程序时检查恢复购买,所以它取消了尚未付款的人的高级特权,但它带来了通过离线和不阻止任何人使用来避免它的问题一张缓慢的、不断下降的卡,以不断获得溢价。我主要只是想知道我的代码是否有问题,或者恢复的购买是否应该像这样,即使他们正在等待付款。
我试过查看
purchaseDetailsList
是否包含不止一次恢复购买(没有)。我还在两个 if 语句之外有 _iap.completePurchase(purchaseDetails)
,等待购买是否等待完成,但这没有改变。最后,我通过完全摆脱恢复功能来尝试冰雹玛丽,看看我是否需要的只是purchaseDetails.status == PurchaseStatus.purchased
。它不是。
InAppPurchase _iap = InAppPurchase.instance;
bool _available = true;
List<ProductDetails> _products = [];
List <PurchaseDetails> _purchases = [];
StreamSubscription? _subscription;
BuildContext? contextReference;
void _initialize() async {
_available = await _iap.isAvailable();
if(_available){
_subscription = _iap.purchaseStream.listen((data) => setState(() {
HandlePurchases(data);
}));
List<Future> futures = [_getProducts(), _getPastPurchases()];
await Future.wait(futures);
}
}
Future<void> _getProducts() async {
ProductDetailsResponse response = await _iap.queryProductDetails(Set.from([premiumEditionID]));
if (response.notFoundIDs.isNotEmpty) {
print("Can't Find ID");
}
setState(() {
_products = response.productDetails;
});
}
Future<void> _getPastPurchases() async {
//await Future.delayed(const Duration(milliseconds: 1500));
await _iap.restorePurchases(applicationUserName: null);
}
void HandlePurchases(List<PurchaseDetails> purchaseDetailsList){
purchaseDetailsList.forEach((PurchaseDetails purchaseDetails) async {
if (purchaseDetails.status == PurchaseStatus.error) {
PopUp("Error with Purchase");
}
else if (purchaseDetails.status == PurchaseStatus.pending) {
PopUp("Purchase is Pending");
}
else if (purchaseDetails.status == PurchaseStatus.purchased) {
PurchasePremium(true);
if (purchaseDetails.pendingCompletePurchase) {
await _iap.completePurchase(purchaseDetails);
}
}
else if(purchaseDetails.status == PurchaseStatus.restored) {
PurchasePremium(false);
if (purchaseDetails.pendingCompletePurchase){
await _iap.completePurchase(purchaseDetails);
}
}
else if (purchaseDetails.status == PurchaseStatus.canceled) {
PopUp("Purchase was Cancelled");
}
});
}
void PurchasePremium(bool firstPurchase){
setState(() {
if(contextReference != null || firstPurchase == false) {
if(firstPurchase){
Navigator.pop(contextReference!);
}
hasPremium = true;
prefs?.put('premium', true);
if(firstPurchase) {
ScaffoldMessenger.of(contextReference!).showSnackBar(
SnackBar(
content: Text(
"Thank you for your purchase! You now have premium!",
style: GoogleFonts.raleway(
),
),
),
);
}
}
});
}
void PopUp(String text){
setState(() {
if(contextReference != null) {
Navigator.pop(contextReference!);
ScaffoldMessenger.of(contextReference!).showSnackBar(
SnackBar(
content: Text(
text,
style: GoogleFonts.raleway(
),
),
),
);
}
});
}