android-inapp-billing-v3耗材采购问题

android-inapp-billing-v3耗材采购问题,android,kotlin,in-app-purchase,product,billing,Android,Kotlin,In App Purchase,Product,Billing,我正在使用kotlin编写的android应用程序。现在可以购买了,付款完成后会进入成功页面。 但是,当同一用户第二次购买时,该应用程序直接进入成功页面,无需任何付款和购买流程。 我想让应用程序要求付款时,用户每次点击付款按钮。请帮忙解决这个问题 class ProductActivity : AppCompatActivity(), BillingProcessor.IBillingHandler { var ProductID = "" var ProductName =

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

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()
    }
}

嗯,我正在为我的当前应用程序使用此库,并使用“警报”对话框确认购买或订阅

这个库有很多bug(请打开页面确认)

我在这个库中遇到了类似的问题,最后出现了警报对话框和一个布尔值
isconfiredpurchasing

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

  • 您正在
    onCreate
    中消费已购买的商品,在活动的每一期中消费商品似乎不是一种正确的方式
  • 看起来此库在启动时激发了方法
    onProductPurchased
    ,如果是这样,则此分数内的代码将运行
提示:

  • 不要在onCreate中消费物品,请在购买后在
    onProductPurchased中进行消费
  • 您不需要检查
    bp
    是否为null,您将其创建为late init,否则将其设置为null
  • 将确认状态保存在
    活动
    共享首选项
  • 把买来的东西存放在某处
  • 确保您没有在
    片段中使用此库
  • 我创建了一个测试应用程序,并在beta测试中发布了它,然后我重构了您的代码,并用它来检查它是如何工作的(使用我的密钥和ID 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()
        }
    }
    
    活动:

    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()
        }
    }
    

    在您的
    onProductPurchased()