三星In app Purchase(IAP)商品添加位置及购买实现咨询
Iap6Helper 消耗型商品接入操作指南
商品信息配置位置
- 你计划接入的两个消耗型商品SKU,直接在
ItemDefine.java中定义即可,这是Iap6Helper官方Sample约定的商品常量管理类,不需要额外新建配置类。 - 配置时注意SKU字符串必须和你在应用后台(如Google Play Console)创建的商品ID完全一致,参考配置代码:
public class ItemDefine { // 替换为你自己后台配置的真实商品ID public static final String SKU_ITEM_A = "item_a_sku_id"; public static final String SKU_ITEM_B = "item_b_sku_id"; // 统一维护消耗型商品列表,初始化SDK时直接传入即可 public static final List<String> CONSUMABLE_SKUS = Arrays.asList(SKU_ITEM_A, SKU_ITEM_B); }
导完依赖后的必做初始化步骤
你当前导入模块、添加完依赖后,需要先完成SDK初始化才能触发购买逻辑,按顺序执行以下操作:
- 在主Activity或自定义Application的
onCreate生命周期中初始化IAP连接,传入当前上下文、之前定义的SKU列表、连接状态回调:
// 初始化IAP服务连接 Iap6Helper.getInstance().init(this, ItemDefine.CONSUMABLE_SKUS, new IapConnectCallback() { @Override public void onConnectSuccess() { // 服务连接成功后才可调用购买、查询接口 } @Override public void onConnectFailed(int code, String msg) { // 可在此处做重连逻辑或给用户提示 } });
- 注册全局购买结果监听,处理支付成功、失败、取消的回调,注意消耗型商品支付完成、权益发放后必须调用消耗接口,否则用户无法重复购买:
Iap6Helper.getInstance().setPurchaseListener(new PurchaseCallback() { @Override public void onPurchaseSuccess(Purchase purchase) { // 建议先将订单信息传到自有服务端做合法性校验,避免恶意破解 String sku = purchase.getSku(); if (ItemDefine.SKU_ITEM_A.equals(sku)) { // 发放item a对应权益,如虚拟货币、道具 } else if (ItemDefine.SKU_ITEM_B.equals(sku)) { // 发放item b对应权益 } // 校验通过、权益发放完成后,调用消耗接口完结订单 Iap6Helper.getInstance().consumeAsync(purchase, new ConsumeCallback() { @Override public void onConsumeSuccess(String sku) { // 消耗成功,流程结束 } @Override public void onConsumeFailed(String sku, int code, String msg) { // 消耗失败可做重试,避免用户已付款未到账 } }); } @Override public void onPurchaseFailed(int code, String msg) { // 支付失败,给用户弹出对应提示即可 } @Override public void onPurchaseCancel() { // 用户主动取消支付,无需特殊处理 } });
- 在承载购买逻辑的Activity的
onDestroy生命周期中释放SDK连接,避免内存泄漏:
@Override protected void onDestroy() { super.onDestroy(); Iap6Helper.getInstance().release(); }
点击触发购买流程的实现
给两个商品对应的购买控件(按钮、商品卡片)绑定点击事件,点击时先判断IAP服务是否连接成功,再传入对应SKU调用购买方法即可:
// item a购买按钮点击逻辑 findViewById(R.id.btn_buy_item_a).setOnClickListener(v -> { if (!Iap6Helper.getInstance().isConnected()) { Toast.makeText(this, "支付服务加载中,请稍后重试", Toast.LENGTH_SHORT).show(); return; } Iap6Helper.getInstance().launchPurchase(ItemDefine.SKU_ITEM_A); }); // item b购买按钮点击逻辑 findViewById(R.id.btn_buy_item_b).setOnClickListener(v -> { if (!Iap6Helper.getInstance().isConnected()) { Toast.makeText(this, "支付服务加载中,请稍后重试", Toast.LENGTH_SHORT).show(); return; } Iap6Helper.getInstance().launchPurchase(ItemDefine.SKU_ITEM_B); });
注意事项
- 测试支付前需要将测试账号加入后台的许可证测试名单,否则会出现支付报错
- 不要在IAP服务未连接状态下调用购买接口,会直接触发失败
- 订单校验建议放在服务端完成,不要在客户端本地做签名校验,容易被破解
- 如果出现消耗失败的情况,下次SDK初始化时会自动返回未消耗的订单,重新走权益发放+消耗逻辑即可,不会出现丢单
内容的提问来源于stack exchange,提问作者Raben
相关产品推荐
相关产品推荐

