mirror of
https://github.com/GitJournal/GitJournal.git
synced 2025-07-01 20:43:20 +08:00
Handle IAP of products
We were only handling subscriptions properly
This commit is contained in:
24
lib/iap.dart
24
lib/iap.dart
@ -72,18 +72,12 @@ class InAppPurchases {
|
|||||||
var iapConn = InAppPurchaseConnection.instance;
|
var iapConn = InAppPurchaseConnection.instance;
|
||||||
var dtNow = DateTime.now().toUtc();
|
var dtNow = DateTime.now().toUtc();
|
||||||
|
|
||||||
if (Platform.isIOS) {
|
|
||||||
var verificationData = await iapConn.refreshPurchaseVerificationData();
|
|
||||||
var dt = await getExpiryDate(verificationData.serverVerificationData, "");
|
|
||||||
var isPro = dt != null ? dt.isAfter(DateTime.now()) : false;
|
|
||||||
|
|
||||||
return SubscriptionStatus(isPro, dt);
|
|
||||||
} else if (Platform.isAndroid) {
|
|
||||||
var response = await iapConn.queryPastPurchases();
|
var response = await iapConn.queryPastPurchases();
|
||||||
for (var purchase in response.pastPurchases) {
|
for (var purchase in response.pastPurchases) {
|
||||||
var dt = await getExpiryDate(
|
var dt = await getExpiryDate(
|
||||||
purchase.verificationData.serverVerificationData,
|
purchase.verificationData.serverVerificationData,
|
||||||
purchase.productID);
|
purchase.productID,
|
||||||
|
_isPurchase(purchase));
|
||||||
if (dt == null || !dt.isAfter(dtNow)) {
|
if (dt == null || !dt.isAfter(dtNow)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -91,22 +85,21 @@ class InAppPurchases {
|
|||||||
}
|
}
|
||||||
return SubscriptionStatus(false, dtNow);
|
return SubscriptionStatus(false, dtNow);
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const base_url = 'https://us-central1-gitjournal-io.cloudfunctions.net';
|
const base_url = 'https://us-central1-gitjournal-io.cloudfunctions.net';
|
||||||
const ios_url = '$base_url/IAPIosVerify';
|
const ios_url = '$base_url/IAPIosVerify';
|
||||||
const android_url = '$base_url/IAPAndroidVerify';
|
const android_url = '$base_url/IAPAndroidVerify';
|
||||||
|
|
||||||
Future<DateTime> getExpiryDate(String receipt, String sku) async {
|
Future<DateTime> getExpiryDate(
|
||||||
|
String receipt, String sku, bool isPurchase) async {
|
||||||
assert(receipt.isNotEmpty);
|
assert(receipt.isNotEmpty);
|
||||||
|
|
||||||
var body = {
|
var body = {
|
||||||
'receipt': receipt,
|
'receipt': receipt,
|
||||||
"sku": sku,
|
"sku": sku,
|
||||||
'pseudoId': Settings.instance.pseudoId,
|
'pseudoId': Settings.instance.pseudoId,
|
||||||
|
'is_purchase': isPurchase,
|
||||||
};
|
};
|
||||||
Log.i("getExpiryDate ${json.encode(body)}");
|
Log.i("getExpiryDate ${json.encode(body)}");
|
||||||
|
|
||||||
@ -150,9 +143,16 @@ Future<SubscriptionStatus> verifyPurchase(PurchaseDetails purchase) async {
|
|||||||
var dt = await getExpiryDate(
|
var dt = await getExpiryDate(
|
||||||
purchase.verificationData.serverVerificationData,
|
purchase.verificationData.serverVerificationData,
|
||||||
purchase.productID,
|
purchase.productID,
|
||||||
|
_isPurchase(purchase),
|
||||||
);
|
);
|
||||||
if (dt == null || !dt.isAfter(DateTime.now())) {
|
if (dt == null || !dt.isAfter(DateTime.now())) {
|
||||||
return SubscriptionStatus(false, dt);
|
return SubscriptionStatus(false, dt);
|
||||||
}
|
}
|
||||||
return SubscriptionStatus(true, dt);
|
return SubscriptionStatus(true, dt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Checks if it is a subscription or a purchase
|
||||||
|
bool _isPurchase(PurchaseDetails purchase) {
|
||||||
|
var sku = purchase.productID;
|
||||||
|
return !sku.contains('monthly') && !sku.contains('_sub_');
|
||||||
|
}
|
||||||
|
@ -162,6 +162,7 @@ class _PurchaseWidgetState extends State<PurchaseWidget> {
|
|||||||
_handleIAPError(purchaseDetails.error);
|
_handleIAPError(purchaseDetails.error);
|
||||||
return;
|
return;
|
||||||
} else if (purchaseDetails.status == PurchaseStatus.purchased) {
|
} else if (purchaseDetails.status == PurchaseStatus.purchased) {
|
||||||
|
Log.i("Verifying purchase sub");
|
||||||
var subStatus = await verifyPurchase(purchaseDetails);
|
var subStatus = await verifyPurchase(purchaseDetails);
|
||||||
if (subStatus.isPro) {
|
if (subStatus.isPro) {
|
||||||
_deliverProduct(subStatus);
|
_deliverProduct(subStatus);
|
||||||
|
Reference in New Issue
Block a user