代号一 IAP 在 Android 上失败

Codename one IAP Fails on Android

我们一直在开发一款以应用购买为中心的应用。
我已经按照这里的指南进行操作;

https://www.codenameone.com/blog/intro-to-in-app-purchase.html

并按以下方式实施采购;

public static boolean brought(String sku) {
    try{
        boolean brought = Purchase.getInAppPurchase().wasPurchased(sku);
        return brought;
    }catch(Exception e){
    }
    return false;//error
}

public static void buy(String sku){
    Purchase.getInAppPurchase().purchase(sku);
}

已使用 google 播放正确设置购买,但当 "Buy dialog" 完成后,应用程序崩溃并显示以下 error/stack 跟踪(取自 google 播放安慰);

java.lang.RuntimeException:  
  at android.app.ActivityThread.deliverResults (ActivityThread.java:3736)
  at android.app.ActivityThread.handleSendResult (ActivityThread.java:3779)
  at android.app.ActivityThread.access00 (ActivityThread.java:157)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1406)
  at android.os.Handler.dispatchMessage (Handler.java:102)
  at android.os.Looper.loop (Looper.java:148)
  at android.app.ActivityThread.main (ActivityThread.java:5459)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:728)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:618)
Caused by: java.lang.IllegalArgumentException: 
  at com.codename1.payments.v3.Security.generatePublicKey (Security.java:90)
  at com.codename1.payments.v3.Security.verifyPurchase (Security.java:67)
  at com.codename1.payments.v3.IabHelper.handleActivityResult (IabHelper.java:480)
  at com.codename1.impl.android.CodenameOneActivity.onActivityResult (CodenameOneActivity.java:537)
  at android.app.Activity.dispatchActivityResult (Activity.java:6470)
  at android.app.ActivityThread.deliverResults (ActivityThread.java:3732)
Caused by: com.codename1.impl.android.util.Base64DecoderException: 
  at com.codename1.impl.android.util.Base64.decode (Base64.java:546)
  at com.codename1.impl.android.util.Base64.decode (Base64.java:474)
  at com.codename1.impl.android.util.Base64.decode (Base64.java:420)
  at com.codename1.payments.v3.Security.generatePublicKey (Security.java:80)

然后在购买后拨打

Purchase.getInAppPurchase().wasPurchased(sku)

似乎锁定了应用程序并冻结了 UI,日志中没有任何错误。

我相当确定这曾经有效,因为我们过去使用过它。

确保您已将 android.licenseKey 构建提示设置为来自 google 播放控制台的正确字符串。当我们尝试从 Google 解析 base64 值以验证购买时,会触发此异常。 如果您只是将其设置为空白值或有一个额外的字符可能会失败。