Java >> Java-zelfstudie >  >> Java

Hoe u de aankoop van een gebruiker voor een niet-verbruiksproduct kunt verifiëren bij het starten van de app

Ik heb zojuist in-app-facturering ingesteld met behulp van google play-facturering met aidl. Bij een succesvolle aankoop wordt de premiumfunctie geactiveerd via een boolean. Maar nadat de app is gesloten en opnieuw is gestart, verdwijnt de premiumfunctie. d.w.z. de boolean keert terug naar false. Ik zou graag willen weten hoe ik ervoor kan zorgen dat de boolean waar blijft nadat de app is gelanceerd, zolang premium is gekocht.

Op MainActivity

    public class MainActivity extends AppCompatActivity {

public static boolean proFeature = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

}

Op InAppBilling-activiteit

    public class InAppBilling extends Activity implements IabBroadcastReceiver.IabBroadcastListener {
private static final String TAG = ".InAppBilling";

IabHelper mHelper;
boolean premiumFeature = false;
static final String SKU_PREMIUM = "android.test.purchased";
static final int RC_REQUEST = 10001;
IabBroadcastReceiver mBroadcastReceiver;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.test_lay);

}

    IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
    @Override
    public void onQueryInventoryFinished(IabResult result, Inventory inv) {
        Log.d(TAG, "Query inventory finished.");

        if (mHelper == null) return;

        if (result.isFailure()) {
            complain("Failed to query inventory: " + result);
            return;
        }

        Log.d(TAG, "Query inventory was successful.");

        Purchase premiumPurchase = inv.getPurchase(SKU_PREMIUM);
        premiumFeature = (premiumPurchase != null && verifyDeveloperPayload(premiumPurchase));
        Log.d(TAG, "User is " + (premiumFeature ? "PREMIUM" : "NOT PREMIUM"));

        updateUi();
        setWaitScreen(false);
        Log.d(TAG, "Initial inventory query finished; enabling main UI.");
    }
};

    IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
    @Override
    public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
        Log.d(TAG, "Purchase finished: " + result + ", purchase: " + purchase);

        if (mHelper == null) return;

        if (result.isFailure()) {
            complain("Error purchasing: " + result);
            setWaitScreen(false);
            return;
        }
        if (!verifyDeveloperPayload(purchase)) {
            complain("Error purchasing. Authenticity verification failed.");
            setWaitScreen(false);
            return;
        }

        Log.d(TAG, "Purchase successful.");

        if (purchase.getSku().equals(SKU_PREMIUM)) {
            // bought the premium upgrade!
            Log.d(TAG, "Purchase is premium upgrade. Congratulating user.");
            alert("Thank you for upgrading to premium!");
            premiumFeature = true;
            updateUi();
            setWaitScreen(false);
        }

    }
};

    public void updateUi(){
    button.setVisibility(premiumFeature ? View.GONE : View.VISIBLE);
    if (premiumFeature){
        MainActivity.proFeature = true;
    }else{
    MainActivity.proFeature = false;
    }
}

Antwoord

Pas in de luisteraar voor het voltooien van je aankoop de onderstaande code aan om de waarde op te slaan in gedeelde voorkeur.

       if (purchase.getSku().equals(SKU_PREMIUM)) {
            // bought the premium upgrade!
            Log.d(TAG, "Purchase is premium upgrade. Congratulating user.");
            alert("Thank you for upgrading to premium!");
            premiumFeature = true;
            
            SharedPreferences sharedPref = context.getSharedPreferences(
                  "my_sp", Context.MODE_PRIVATE);
            sharedPref.edit().putBoolean("isPremium, premiumFeature).commit();

            updateUi();
            setWaitScreen(false);
        }

En haal bij het opnieuw starten van de app deze waarde weer uit de gedeelde voorkeur.

SharedPreferences sharedPref = context.getSharedPreferences(
                      "my_sp", Context.MODE_PRIVATE);
premiumFeature = sharedPref.getBoolean("isPremium, false);

Update(19 februari 2022):

  • Zoals @Shazniq al zei:het is altijd goed om die gegevens, samen met gebruikersprofielgegevens, voor de veiligheid op de server op te slaan. Dus bij elke lancering van de app kunt u de details verifiëren. Je moet je eigen logica toepassen om het te verifiëren wanneer je het nodig hebt.

Java-tag