网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
这里主要记录了内购的集成过程,语言:Kotlin
===========================================================
dependencies {
…
implementation ‘com.android.billingclient:billing:1.2’
}
需要使用Google Play 内购功能,必须添加权限,否则无法支付。
网络及其他必要权限自行添加就好了。
private var billingClient: BillingClient = BillingClient.newBuilder(context).setListener { responseCode: Int, purchases: MutableList? ->
if (responseCode == BillingClient.BillingResponse.OK && purchases != null) {
// TODO 支付完成
} else if (responseCode == BillingClient.BillingResponse.USER_CANCELED) {
// Handle an error caused by a user cancelling the purchase flow.
// TODO 用户取消了支付
} else if (responseCode == BillingClient.BillingResponse.ITEM_ALREADY_OWNED) {
// Handle an error caused by a user cancelling the purchase flow.
// TODO 商品已经购买过(重复购买了此商品,如果需要支持重复购买,需要将商品购买成功后消费掉)
} else {
// Handle any other error codes.
}
}.build()
在使用支付功能之前,首先要连接Google Play Service,确保当前状态支付是可用的,此操作对于国内用户来说是需要梯子的,但是对于国外的用户,就不用操心了,毕竟我们开发Google Play主要还是给国外用户使用。
billingClient.startConnection(object : BillingClientStateListener {
override fun onBillingSetupFinished(@BillingClient.BillingResponse billingResponseCode: Int) {
// 连接成功
if (billingResponseCode == BillingClient.BillingResponse.OK) {
// The billing client is ready. You can query purchases here.
// 5. Query for in-app product details.
// 5. 查询商品详情
// 6. 支付商品
} else {
// TODO 连接失败
}
}
// 连接断开
override fun onBillingServiceDisconnected() {
// Try to restart the connection on the next request to
// Google Play by calling the startConnection() method.
}
})
商品信息需要将带有内购权限的apk上传到GooglePlayConsole后,添加内购商品,设置商品ID,待商品生效后,移动端通过商品ID来查询商品的详细信息。
val params = SkuDetailsParams.newBuilder().apply {
setSkusList(ArrayList().apply {
add(“要查询的商品ID”) // 可以单个查询也可以多个查询
}).setType(BillingClient.SkuType.INAPP)
}
billingClient.querySkuDetailsAsync(params.build()) { responseCode, skuDetailsList ->
Logger.d(“responseCode = $responseCode skuDetailsList = ${skuDetailsList?.size}”)
// responseCode 为响应码
// skuDetailsList 为查询的商品信息列表
}
skuDetails
为查询到的商品信息
// 唤起GooglePay支付
val flowParams = BillingFlowParams.newBuilder()
.setSkuDetails(skuDetails)
.build()
billingClient.launchBillingFlow(activity, flowParams)
支付成功后,会在初始化的监听接口回调支付结果,包含必要的支付结果信息。
Google的商品默认是单次消费的,即只能购买一次,如果需求是可以多次购买的,比如充值等需求,那么就需要在支付成功后将购买的商品消费掉。
billingClient.consumeAsync(purchaseToken){ responseCode: Int, purchaseToken: String ->
}
- purchaseToken : 支付成功后返回的支付令牌
如果支付成功后没有立即消费,需要后续手动消费掉,则先要查询未消费的商品,有同步方法和异步方法:
// 查询历史购买 同步
val purchasesResult: Purchase.PurchasesResult = billingClient.queryPurchases(BillingClient.SkuType.INAPP)
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
0884)]
[外链图片转存中…(img-EOjUCRpx-1715502140885)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!