Anjlab内购库支付成功后onProductPurchased未调用问题排查
onProductPurchased未触发的问题 我之前做内购开发时也踩过类似的坑,结合anjlab这个库的运行机制,大概率是下面几个原因导致的,你可以逐一排查:
1. onActivityResult未传递回调给BillingProcessor
你的onActivityResult方法只调用了父类实现,但没有把支付结果传递给BillingProcessor实例——这是最常见的问题。库需要通过这个方法接收系统返回的支付完成回调,才能触发onProductPurchased。
修改后的代码应该是这样:
@Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { // 先让BillingProcessor处理回调,处理不了再交给父类 if (!bp.handleActivityResult(requestCode, resultCode, data)) { super.onActivityResult(requestCode, resultCode, data); } }
这里的bp是你初始化的BillingProcessor实例,要确保它是Activity的全局成员变量,能在onActivityResult中访问到。
2. BillingProcessor初始化不完整
检查你的初始化代码,是否正确传入了IBillingHandler(也就是你的PlusActivity本身),并且调用了initialize()方法。比如:
private BillingProcessor bp; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 替换成你的License Key bp = new BillingProcessor(this, "YOUR_GOOGLE_PLAY_LICENSE_KEY", this); bp.initialize(); }
如果初始化时没传入当前Activity作为回调处理者,或者漏了调用initialize(),库就无法把购买结果回调到你的onProductPurchased方法。
3. 未主动恢复已购买商品状态
有时候支付成功后可能因为网络延迟、系统异常等原因,onProductPurchased没及时触发。这种情况下,你需要在Activity启动时主动检查用户已购买的商品,确保状态被正确识别:
@Override protected void onResume() { super.onResume(); if (bp != null) { bp.loadOwnedPurchasesFromGoogle(); } }
这个方法会拉取用户在Google Play的购买记录,如果发现有未处理的购买,会自动触发onProductPurchased回调。
4. 商品ID或License Key配置错误
确认代码中使用的productId和Google Play控制台里配置的完全一致(大小写敏感),同时License Key也没有复制错误。如果这些配置不对,库无法正确验证购买结果,自然不会触发回调。
5. 测试环境的特殊情况
如果你用测试账号进行购买,要确保已经在Google Play控制台添加了该测试账号,且测试商品处于“激活”状态。另外,测试支付后偶尔需要等待几秒,甚至重启App才能触发回调,这是Google测试环境的正常现象。
最后记得在Activity销毁时释放资源,避免内存泄漏:
@Override public void onDestroy() { if (bp != null) { bp.release(); } super.onDestroy(); }
内容的提问来源于stack exchange,提问作者RGS

