Google Play商店应用内结算

时间:2014-09-08 11:40:27

标签: android google-play

我最近开发了一款应用程序,我很快会将其放在Google Play商店中。在这个应用程序中,我计划添加一个应用程序内购买,一旦购买,允许用户更改颜色设置(背景和文本)。

我意识到每次运行应用程序时都不需要检查Google Play商店,特别是如果已经进行了购买。如果用户在使用应用程序时没有GPRS / Wifi,也可能会导致问题!

因此我考虑创建一个共享首选项,作为检查用户是否已购买应用内购买的条件。

还有其他方式可能更安全吗?正如我所读,共享偏好可以很容易地改变。

任何意见或建议都将不胜感激。

1 个答案:

答案 0 :(得分:1)

您可以使用ProGuard

或者,您可以使用共享首选项或数据库中的某些加密文本以安全的方式保存购买状态。因此操纵它会变得更加困难。

加密示例:

加密:

 MCrypt mcrypt = new MCrypt();
 String encrypted = MCrypt.bytesToHex(mcrypt.encrypt("Text to Encrypt"));

解密:

MCrypt mcrypt = new MCrypt();
String decrypted = new String(mcrypt.decrypt(encrypted));

Mcrypt.java

public class MCrypt {

    private String iv = "fedcba9876543210";//Dummy iv (CHANGE IT!)
    private IvParameterSpec ivspec;
    private SecretKeySpec keyspec;
    private Cipher cipher;
    private String SecretKey = "0123456789abcdef";//Dummy secretKey (CHANGE IT!)

    public MCrypt() {
        ivspec = new IvParameterSpec(iv.getBytes());

        keyspec = new SecretKeySpec(SecretKey.getBytes(), "AES");

        try {
            cipher = Cipher.getInstance("AES/CBC/NoPadding");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        }
    }

    public byte[] encrypt(String text) throws Exception {
        if (text == null || text.length() == 0) throw new Exception("Empty string");

        byte[] encrypted = null;

        cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);

        encrypted = cipher.doFinal(padString(text).getBytes());
        try { 
            encrypted = android.util.Base64.encode(encrypted, android.util.Base64.NO_PADDING);
        } catch (NoClassDefFoundError e) {
        }

        return encrypted;
    }

    public byte[] decrypt(String code) throws Exception {
        if (code == null || code.length() == 0) throw new Exception("Empty string");

        byte[] decrypted = null;

        cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);

        try { 
            decrypted = cipher.doFinal(android.util.Base64.decode(code, android.util.Base64.NO_PADDING));
        } catch (NoClassDefFoundError e) {
        }
        return decrypted;
    }



    private static String padString(String source) {
        char paddingChar = ' ';
        int size = 16;
        int x = source.length() % size;
        int padLength = size - x;

        for (int i = 0; i < padLength; i++) {
            source += paddingChar;
        }

        return source;
    }
}

<强>参考:

128 bit encryption