Handle IAP of products

We were only handling subscriptions properly
This commit is contained in:
Vishesh Handa
2020-09-01 10:29:50 +02:00
parent 822607ba18
commit b3bdb8657c
2 changed files with 21 additions and 20 deletions

View File

@ -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_');
}

View File

@ -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);