android-inapp-billing-v3耗材采购问题
我正在使用kotlin编写的android应用程序。现在可以购买了,付款完成后会进入成功页面。 但是,当同一用户第二次购买时,该应用程序直接进入成功页面,无需任何付款和购买流程。 我想让应用程序要求付款时,用户每次点击付款按钮。请帮忙解决这个问题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 =
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
onProductPurchased中进行消费
bp
是否为null,您将其创建为late init,否则将其设置为null活动
或共享首选项
片段中使用此库
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()