Android 找不到订阅。应用内购买
我在项目中实施应用内购买时遇到了一个问题 当我测试我的应用程序时,它总是无法启动订阅。但游戏控制台中有订阅。我有一个真实ID的订阅 这是我的密码:Android 找不到订阅。应用内购买,android,kotlin,billing,in-app,Android,Kotlin,Billing,In App,我在项目中实施应用内购买时遇到了一个问题 当我测试我的应用程序时,它总是无法启动订阅。但游戏控制台中有订阅。我有一个真实ID的订阅 这是我的密码: private var billingClient: BillingClient? = null onPurchaseUpdate: override fun onPurchasesUpdated(billingResult: BillingResult, purchases: MutableList<Purchase>?) {
private var billingClient: BillingClient? = null
onPurchaseUpdate:
override fun onPurchasesUpdated(billingResult: BillingResult, purchases: MutableList<Purchase>?) {
if (billingResult.responseCode == BillingClient.BillingResponseCode.OK && purchases != null){
handlePurchase(purchases[0])
}
else if (billingResult.responseCode == BillingClient.BillingResponseCode.ITEM_ALREADY_OWNED){
val queryAlreadyPurchasesResult = billingClient!!.queryPurchases(SUBS)
val alreadyPurchases = queryAlreadyPurchasesResult.purchasesList
if (alreadyPurchases != null){
handlePurchase(alreadyPurchases[0])
}
}
else if (billingResult.responseCode == BillingClient.BillingResponseCode.USER_CANCELED){
Toast.makeText(this@MainActivity, "Purchase Canceled!", Toast.LENGTH_SHORT).show()
}
else{
Toast.makeText(this@MainActivity, "Error: ${billingResult.debugMessage}", Toast.LENGTH_SHORT).show()
}
}
private fun handlePurchase(purchases: Purchase){
if (purchases.purchaseState == Purchase.PurchaseState.PURCHASED){
val consumeParams = ConsumeParams.newBuilder()
.setPurchaseToken(purchases.purchaseToken)
.build()
billingClient!!.consumeAsync(consumeParams) { billingResult, outToken ->
if (billingResult.responseCode == BillingClient.BillingResponseCode.OK){
Toast.makeText(this@MainActivity, "Purchase Success!", Toast.LENGTH_SHORT).show()
}
}
}
}
private fun subscribe(){
if (billingClient!!.isReady){
initiatePurchase()
}
else{
billingClient = BillingClient.newBuilder(this)
.enablePendingPurchases()
.setListener(this)
.build()
billingClient!!.startConnection(object: BillingClientStateListener{
override fun onBillingServiceDisconnected() {
Toast.makeText(this@MainActivity, "Service Disconnected", Toast.LENGTH_SHORT).show()
}
override fun onBillingSetupFinished(billingResult: BillingResult) {
if (billingResult.responseCode == BillingClient.BillingResponseCode.OK){
initiatePurchase()
}
else{
Toast.makeText(this@MainActivity, "Error: ${billingResult.debugMessage}", Toast.LENGTH_SHORT).show()
}
}
})
}
}
private fun initiatePurchase(){
val skuList: MutableList<String> = ArrayList()
skuList.add(Constans.SUBS_ID)
val params = SkuDetailsParams.newBuilder()
params.setSkusList(skuList).setType(SUBS)
val billingResult = billingClient!!.isFeatureSupported(BillingClient.FeatureType.SUBSCRIPTIONS)
if (billingResult.responseCode == BillingClient.BillingResponseCode.OK){
billingClient!!.querySkuDetailsAsync(params.build(), object: SkuDetailsResponseListener{
override fun onSkuDetailsResponse(billingResult: BillingResult, skuDetailsList: MutableList<SkuDetails>?) {
if (billingResult.responseCode == BillingClient.BillingResponseCode.OK){
if (skuDetailsList != null && skuDetailsList.isNotEmpty()){
val flowParams = BillingFlowParams.newBuilder()
.setSkuDetails(skuDetailsList[0])
.build()
billingClient!!.launchBillingFlow(this@MainActivity, flowParams)
}
else{
Toast.makeText(this@MainActivity, "Item not Found!", Toast.LENGTH_SHORT).show()
}
}
else{
Toast.makeText(this@MainActivity, "Error: ${billingResult.debugMessage}", Toast.LENGTH_SHORT).show()
}
}
})
}
else{
Toast.makeText(this@MainActivity, "Sorry Subscription not Supported. Please Update Play Store", Toast.LENGTH_SHORT).show()
}
}
订阅乐趣:
override fun onPurchasesUpdated(billingResult: BillingResult, purchases: MutableList<Purchase>?) {
if (billingResult.responseCode == BillingClient.BillingResponseCode.OK && purchases != null){
handlePurchase(purchases[0])
}
else if (billingResult.responseCode == BillingClient.BillingResponseCode.ITEM_ALREADY_OWNED){
val queryAlreadyPurchasesResult = billingClient!!.queryPurchases(SUBS)
val alreadyPurchases = queryAlreadyPurchasesResult.purchasesList
if (alreadyPurchases != null){
handlePurchase(alreadyPurchases[0])
}
}
else if (billingResult.responseCode == BillingClient.BillingResponseCode.USER_CANCELED){
Toast.makeText(this@MainActivity, "Purchase Canceled!", Toast.LENGTH_SHORT).show()
}
else{
Toast.makeText(this@MainActivity, "Error: ${billingResult.debugMessage}", Toast.LENGTH_SHORT).show()
}
}
private fun handlePurchase(purchases: Purchase){
if (purchases.purchaseState == Purchase.PurchaseState.PURCHASED){
val consumeParams = ConsumeParams.newBuilder()
.setPurchaseToken(purchases.purchaseToken)
.build()
billingClient!!.consumeAsync(consumeParams) { billingResult, outToken ->
if (billingResult.responseCode == BillingClient.BillingResponseCode.OK){
Toast.makeText(this@MainActivity, "Purchase Success!", Toast.LENGTH_SHORT).show()
}
}
}
}
private fun subscribe(){
if (billingClient!!.isReady){
initiatePurchase()
}
else{
billingClient = BillingClient.newBuilder(this)
.enablePendingPurchases()
.setListener(this)
.build()
billingClient!!.startConnection(object: BillingClientStateListener{
override fun onBillingServiceDisconnected() {
Toast.makeText(this@MainActivity, "Service Disconnected", Toast.LENGTH_SHORT).show()
}
override fun onBillingSetupFinished(billingResult: BillingResult) {
if (billingResult.responseCode == BillingClient.BillingResponseCode.OK){
initiatePurchase()
}
else{
Toast.makeText(this@MainActivity, "Error: ${billingResult.debugMessage}", Toast.LENGTH_SHORT).show()
}
}
})
}
}
private fun initiatePurchase(){
val skuList: MutableList<String> = ArrayList()
skuList.add(Constans.SUBS_ID)
val params = SkuDetailsParams.newBuilder()
params.setSkusList(skuList).setType(SUBS)
val billingResult = billingClient!!.isFeatureSupported(BillingClient.FeatureType.SUBSCRIPTIONS)
if (billingResult.responseCode == BillingClient.BillingResponseCode.OK){
billingClient!!.querySkuDetailsAsync(params.build(), object: SkuDetailsResponseListener{
override fun onSkuDetailsResponse(billingResult: BillingResult, skuDetailsList: MutableList<SkuDetails>?) {
if (billingResult.responseCode == BillingClient.BillingResponseCode.OK){
if (skuDetailsList != null && skuDetailsList.isNotEmpty()){
val flowParams = BillingFlowParams.newBuilder()
.setSkuDetails(skuDetailsList[0])
.build()
billingClient!!.launchBillingFlow(this@MainActivity, flowParams)
}
else{
Toast.makeText(this@MainActivity, "Item not Found!", Toast.LENGTH_SHORT).show()
}
}
else{
Toast.makeText(this@MainActivity, "Error: ${billingResult.debugMessage}", Toast.LENGTH_SHORT).show()
}
}
})
}
else{
Toast.makeText(this@MainActivity, "Sorry Subscription not Supported. Please Update Play Store", Toast.LENGTH_SHORT).show()
}
}
启动采购乐趣:
override fun onPurchasesUpdated(billingResult: BillingResult, purchases: MutableList<Purchase>?) {
if (billingResult.responseCode == BillingClient.BillingResponseCode.OK && purchases != null){
handlePurchase(purchases[0])
}
else if (billingResult.responseCode == BillingClient.BillingResponseCode.ITEM_ALREADY_OWNED){
val queryAlreadyPurchasesResult = billingClient!!.queryPurchases(SUBS)
val alreadyPurchases = queryAlreadyPurchasesResult.purchasesList
if (alreadyPurchases != null){
handlePurchase(alreadyPurchases[0])
}
}
else if (billingResult.responseCode == BillingClient.BillingResponseCode.USER_CANCELED){
Toast.makeText(this@MainActivity, "Purchase Canceled!", Toast.LENGTH_SHORT).show()
}
else{
Toast.makeText(this@MainActivity, "Error: ${billingResult.debugMessage}", Toast.LENGTH_SHORT).show()
}
}
private fun handlePurchase(purchases: Purchase){
if (purchases.purchaseState == Purchase.PurchaseState.PURCHASED){
val consumeParams = ConsumeParams.newBuilder()
.setPurchaseToken(purchases.purchaseToken)
.build()
billingClient!!.consumeAsync(consumeParams) { billingResult, outToken ->
if (billingResult.responseCode == BillingClient.BillingResponseCode.OK){
Toast.makeText(this@MainActivity, "Purchase Success!", Toast.LENGTH_SHORT).show()
}
}
}
}
private fun subscribe(){
if (billingClient!!.isReady){
initiatePurchase()
}
else{
billingClient = BillingClient.newBuilder(this)
.enablePendingPurchases()
.setListener(this)
.build()
billingClient!!.startConnection(object: BillingClientStateListener{
override fun onBillingServiceDisconnected() {
Toast.makeText(this@MainActivity, "Service Disconnected", Toast.LENGTH_SHORT).show()
}
override fun onBillingSetupFinished(billingResult: BillingResult) {
if (billingResult.responseCode == BillingClient.BillingResponseCode.OK){
initiatePurchase()
}
else{
Toast.makeText(this@MainActivity, "Error: ${billingResult.debugMessage}", Toast.LENGTH_SHORT).show()
}
}
})
}
}
private fun initiatePurchase(){
val skuList: MutableList<String> = ArrayList()
skuList.add(Constans.SUBS_ID)
val params = SkuDetailsParams.newBuilder()
params.setSkusList(skuList).setType(SUBS)
val billingResult = billingClient!!.isFeatureSupported(BillingClient.FeatureType.SUBSCRIPTIONS)
if (billingResult.responseCode == BillingClient.BillingResponseCode.OK){
billingClient!!.querySkuDetailsAsync(params.build(), object: SkuDetailsResponseListener{
override fun onSkuDetailsResponse(billingResult: BillingResult, skuDetailsList: MutableList<SkuDetails>?) {
if (billingResult.responseCode == BillingClient.BillingResponseCode.OK){
if (skuDetailsList != null && skuDetailsList.isNotEmpty()){
val flowParams = BillingFlowParams.newBuilder()
.setSkuDetails(skuDetailsList[0])
.build()
billingClient!!.launchBillingFlow(this@MainActivity, flowParams)
}
else{
Toast.makeText(this@MainActivity, "Item not Found!", Toast.LENGTH_SHORT).show()
}
}
else{
Toast.makeText(this@MainActivity, "Error: ${billingResult.debugMessage}", Toast.LENGTH_SHORT).show()
}
}
})
}
else{
Toast.makeText(this@MainActivity, "Sorry Subscription not Supported. Please Update Play Store", Toast.LENGTH_SHORT).show()
}
}
private fun initiatePurchase(){
val skuList:MutableList=ArrayList()
skuList.add(Constans.SUBS_ID)
val params=skutailsparams.newBuilder()
参数设置列表(skuList).setType(SUB)
val billingResult=billingClient!!.isFeatureSupported(billingClient.FeatureType.SUBSCRIPTIONS)
if(billingResult.responseCode==BillingClient.BillingResponseCode.OK){
billingClient!!.querySkuDetailsAsync(params.build(),对象:SkuDetailsResponseListener{
覆盖fun onSkuDetailsResponse(billingResult:billingResult,skuDetailsList:MutableList?){
if(billingResult.responseCode==BillingClient.BillingResponseCode.OK){
if(skuDetailsList!=null&&skuDetailsList.isNotEmpty()){
val flowParams=BillingFlowParams.newBuilder()
.setsku详细信息(skuDetailsList[0])
.build()
billingClient!!.launchBillingFlow(this@MainActivity,flowParams)
}
否则{
Toast.makeText(this@MainActivity,“找不到项目!”,Toast.LENGTH\u SHORT.show()
}
}
否则{
Toast.makeText(this@MainActivity,“Error:${billingResult.debugMessage}”,Toast.LENGTH_SHORT.show()
}
}
})
}
否则{
Toast.makeText(this@MainActivity,“抱歉,不支持订阅。请更新Play Store”,Toast.LENGTH\u SHORT.show()
}
}
我总是看到消息“未找到项目”
有什么不对劲?提前谢谢