Added grace period for purchase ack

pull/170/head
M66B 6 years ago
parent 5cb70bd22a
commit 800feaeb68

@ -78,7 +78,8 @@ public class ActivityBilling extends ActivityBase implements PurchasesUpdatedLis
static final String ACTION_PURCHASE = BuildConfig.APPLICATION_ID + ".ACTION_PURCHASE"; static final String ACTION_PURCHASE = BuildConfig.APPLICATION_ID + ".ACTION_PURCHASE";
static final String ACTION_PURCHASE_CHECK = BuildConfig.APPLICATION_ID + ".ACTION_PURCHASE_CHECK"; static final String ACTION_PURCHASE_CHECK = BuildConfig.APPLICATION_ID + ".ACTION_PURCHASE_CHECK";
final static long MAX_SKU_CACHE_DURATION = 24 * 3600 * 1000L; // milliseconds private final static long MAX_SKU_CACHE_DURATION = 24 * 3600 * 1000L; // milliseconds
private final static long MAX_SKU_NOACK_DURATION = 24 * 3600 * 1000L; // milliseconds
@Override @Override
@SuppressLint("MissingSuperCall") @SuppressLint("MissingSuperCall")
@ -352,9 +353,11 @@ public class ActivityBilling extends ActivityBase implements PurchasesUpdatedLis
try { try {
query.remove(purchase.getSku()); query.remove(purchase.getSku());
boolean purchased = (purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED);
long time = purchase.getPurchaseTime(); long time = purchase.getPurchaseTime();
Log.i("IAB SKU=" + purchase.getSku() + " purchased=" + purchased + " time=" + new Date(time)); Log.i("IAB SKU=" + purchase.getSku() +
" purchased=" + isPurchased(purchase) +
" valid=" + isPurchaseValid(purchase) +
" time=" + new Date(time));
//if (new Date().getTime() - purchase.getPurchaseTime() > 3 * 60 * 1000L) { //if (new Date().getTime() - purchase.getPurchaseTime() > 3 * 60 * 1000L) {
// consumePurchase(purchase); // consumePurchase(purchase);
@ -362,15 +365,12 @@ public class ActivityBilling extends ActivityBase implements PurchasesUpdatedLis
//} //}
for (IBillingListener listener : listeners) for (IBillingListener listener : listeners)
if (purchased && purchase.isAcknowledged()) if (isPurchaseValid(purchase))
listener.onPurchased(purchase.getSku()); listener.onPurchased(purchase.getSku());
else else
listener.onPurchasePending(purchase.getSku()); listener.onPurchasePending(purchase.getSku());
if (!purchased) if (isPurchased(purchase)) {
continue;
if (getSkuPro().equals(purchase.getSku())) {
byte[] decodedKey = Base64.decode(getString(R.string.public_key), Base64.DEFAULT); byte[] decodedKey = Base64.decode(getString(R.string.public_key), Base64.DEFAULT);
KeyFactory keyFactory = KeyFactory.getInstance("RSA"); KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(new X509EncodedKeySpec(decodedKey)); PublicKey publicKey = keyFactory.generatePublic(new X509EncodedKeySpec(decodedKey));
@ -378,15 +378,16 @@ public class ActivityBilling extends ActivityBase implements PurchasesUpdatedLis
sig.initVerify(publicKey); sig.initVerify(publicKey);
sig.update(purchase.getOriginalJson().getBytes()); sig.update(purchase.getOriginalJson().getBytes());
if (sig.verify(Base64.decode(purchase.getSignature(), Base64.DEFAULT))) { if (sig.verify(Base64.decode(purchase.getSignature(), Base64.DEFAULT))) {
if (getSkuPro().equals(purchase.getSku())) {
if (purchase.isAcknowledged()) {
Log.i("IAB valid signature"); Log.i("IAB valid signature");
if (getSkuPro().equals(purchase.getSku())) {
if (isPurchaseValid(purchase)) {
editor.putBoolean("pro", true); editor.putBoolean("pro", true);
editor.putLong(getSkuPro() + ".cached", new Date().getTime()); editor.putLong(purchase.getSku() + ".cached", new Date().getTime());
} else
acknowledgePurchase(purchase, 0);
} }
if (!purchase.isAcknowledged())
acknowledgePurchase(purchase, 0);
}
} else { } else {
Log.w("IAB invalid signature"); Log.w("IAB invalid signature");
editor.putBoolean("pro", false); editor.putBoolean("pro", false);
@ -455,7 +456,7 @@ public class ActivityBilling extends ActivityBase implements PurchasesUpdatedLis
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ActivityBilling.this); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ActivityBilling.this);
SharedPreferences.Editor editor = prefs.edit(); SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("pro", true); editor.putBoolean("pro", true);
editor.putLong(getSkuPro() + ".cached", new Date().getTime()); editor.putLong(purchase.getSku() + ".cached", new Date().getTime());
editor.apply(); editor.apply();
for (IBillingListener listener : listeners) for (IBillingListener listener : listeners)
@ -477,6 +478,16 @@ public class ActivityBilling extends ActivityBase implements PurchasesUpdatedLis
}); });
} }
private boolean isPurchased(Purchase purchase) {
return (purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED);
}
private boolean isPurchaseValid(Purchase purchase) {
return (isPurchased(purchase) &&
(purchase.isAcknowledged() ||
purchase.getPurchaseTime() + MAX_SKU_NOACK_DURATION > new Date().getTime()));
}
private void reportError(BillingResult result, String stage) { private void reportError(BillingResult result, String stage) {
String message; String message;
if (result == null) if (result == null)

Loading…
Cancel
Save