【问题标题】:android-inapp-billing-v3 consumable product Purchase issueandroid-inapp-billing-v3 消耗品购买问题
【发布时间】:2018-12-30 16:19:25
【问题描述】:

我正在为我的 kotlin 编写的 android 应用程序使用 android-inapp-billing-v3。现在可以进行购买了,付款完成后进入成功页面。 但是,当同一用户第二次购买时,应用程序直接进入成功页面,无需任何支付和购买过程。 我想让应用程序在每次用户点击支付按钮时都要求付款。请帮忙解决这个问题。

class ProductActivity : AppCompatActivity(), BillingProcessor.IBillingHandler {


    var ProductID = ""
    var ProductName = ""
    var ProductDes = ""
    var ProductImage = 0
    var ProductPrice = ""
    val googleKey = "fdsfdsfsddfdsfsfdfs"
    lateinit private var bp: BillingProcessor

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_product)

        val bundle: Bundle = intent.extras
        ProductID = bundle.getString("ProductID")
        ProductName = bundle.getString("ProductName")
        ProductDes = bundle.getString("ProductDes")
        ProductImage = bundle.getInt("ProductImage")
        ProductPrice = bundle.getString("ProductPrice")


    bp = BillingProcessor(this, googleKey, this)
    bp.consumePurchase(ProductID)

    btn_pay.setOnClickListener {


        bp.purchase(this, ProductID)
        }



    }

    override fun onResume() {
        super.onResume()
        val internetStatus:Boolean = ConnectivityUtils.isConnected(this)
        if (internetStatus==true) {

        }
        else {
            val msg = getString(R.string.need_internet_for_service)
            finish()
        }
    }


    override fun onBillingInitialized() {

    }

    override fun onPurchaseHistoryRestored() {


    }

    override fun onProductPurchased(productId: String, details: TransactionDetails?) {

        val intent = Intent(this, SearchQponActivity::class.java)
        intent.putExtra("ProductID", ProductID)
        startActivity(intent)
    }

    override fun onBillingError(errorCode: Int, error: Throwable?) {

    }



    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        if (!bp.handleActivityResult(requestCode, resultCode, data))
            super.onActivityResult(requestCode, resultCode, data)
    }

    override fun onDestroy() {
        if (bp!=null)
            bp.release()
        super.onDestroy()
    }
}

【问题讨论】:

  • 在您的onProductPurchased()购买后立即使用该产品

标签: android kotlin in-app-purchase product billing


【解决方案1】:

嗯,我正在为我当前的应用程序使用这个库,并且我使用警报对话框来确认购买或订阅。

这个库有很多错误(打开issues 页面以确保这一点)。

我在使用这个库时遇到了类似的问题,并以警告对话框和一个布尔值 isConfirmedPurchasing 结束它。

在我看来,这可能是因为:

  • 您正在消费在onCreate 购买的物品,这似乎不是每次活动开始时消费物品的正确方式
  • 看起来这个库在启动时会触发方法onProductPurchased,如果是这样,那么您在此分数中的代码将运行。

提示:

  1. 不要在onCreate中消耗物品,在onProductPurchased购买后进行
  2. 您无需检查bp 是否为空,您将其创建为后期初始化,否则使其可为空
  3. activityshared preferences范围内保存确认状态
  4. 将购买的物品存放在某处。
  5. 确保您没有在 fragment 中使用此库

我创建了一个测试应用程序并在 beta 测试中发布了它,然后我重构了您的代码并用来检查它是如何工作的(使用我的密钥和 ids ofc)。

我想这就是你想要的:

您产品的数据类:

data class MyProduct(
    val id: String,
    val mame: String,
    val des: String,
    val image: Int,
    val price: String
)

活动:

class ProductActivity : AppCompatActivity(), BillingProcessor.IBillingHandler {

private val googleKey = "your_google_key"
private val keyProductId = "productID"
private var isConfirmedPurchasing = false

private lateinit var bp: BillingProcessor
private lateinit var myProduct: MyProduct

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_product)

    bp = BillingProcessor(this, googleKey, this)


    intent.extras?.let { bundle -> 
        with (bundle) {
            myProduct = MyProduct(
                    getString("productID"),
                    getString("productName"),
                    getString("productDes"),
                    getInt("productImage"),
                    getString("productPrice")
            )
        }
    }


    btn_pay.setOnClickListener {
        createAlertDialog(this) {
            isConfirmedPurchasing = true
            purchase(myProduct.id)
        }
    }

}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    if (!bp.handleActivityResult(requestCode, resultCode, data)) {
        super.onActivityResult(requestCode, resultCode, data)
    }
}

override fun onDestroy() {
    bp.release()
    super.onDestroy()
}

override fun onProductPurchased(productId: String, details: TransactionDetails?) {
    isConfirmedPurchasing = false
    bp.consumePurchase(myProduct.id)
    finishPurchaseWorkflow(productId)
}

override fun onBillingInitialized() {
    Log.d("Tag", "BillingProcessor was initialized and it's ready to purchase")
    bp.consumePurchase(myProduct.id)
}

override fun onPurchaseHistoryRestored() {
    Log.d("Tag", "requested PRODUCT ID was successfully purchased")
}

override fun onBillingError(errorCode: Int, error: Throwable?) {
    Log.e("Tag", "errorCode: $errorCode, error: $error")
    isConfirmedPurchasing = false
}

private fun purchase(id: String) {
    if (isConfirmedPurchasing) {
        bp.purchase(this, id)
    }
}

private fun finishPurchaseWorkflow(googleProductId: String) {
    val intent = Intent(this, SearchQponActivity::class.java)
    intent.putExtra(keyProductId, googleProductId)
    startActivity(intent)
}

private fun createAlertDialog(
        context: Context,
        title: String? = "Are you sure?",
        message: String? = null,
        buttonPos: String = "Yes",
        buttonNeg: String = "No",
        action: () -> Unit
): AlertDialog {
    return AlertDialog.Builder(context)
            .setTitle(title)
            .setMessage(message)
            .setNegativeButton(buttonNeg) { dialog, _ -> dialog.cancel() }
            .setPositiveButton(buttonPos) { dialog, _ -> action(); dialog.cancel() }
            .show()
    }
}

【讨论】:

    猜你喜欢
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    相关资源
    最近更新 更多