最近在开发自己的一款新产品 言叶,上架到谷歌商店之后有国外用户反馈想要使用谷歌支付,于是我准备为自己的应用集成谷歌结算以允许用户进行内购付款。
之前我完全没用集成过谷歌支付,从寻找到的一些资料来看,谷歌结算的开发方式已经做了调整,新的开发方式比之前使用 AIDL 开发要简单一些。
1、客户端集成
1.1 文档资料
对于客户端集成,官方文档已经给了比较详尽的说明,这里对应的文档资料提供一下:
- 库集成文档《将 Google Play 结算库集成到您的应用中》,链接:https://developer.android.google.cn/google/play/billing/integrate
虽然文档集成说明很详细但是有时候我们需要知道具体的某些类及其字段的含义,类文档可以参考:
- 类说明文档:https://developer.android.google.cn/reference/com/android/billingclient/api/package-summary
1.2 集成的一些细节
既然谷歌官方文档介绍的已经比较详细了,这里我只对自己集成的时候一些细节设计介绍一下。
1. 依赖隔离
记得之前集成了购买的功能的话,安装 APK 的时候会提示你 “需要谷歌服务才能使用”,所以我在开发的时候提前做了准备。我希望的是,只在国外版本加入 Gooogle billing 依赖,可以在打包的时候进行配置,而国内版本不加入谷歌结算的依赖。因此,在应用 module 之外,我们需要加一个为谷歌支付使用的模块。此模块只用来处理谷歌结算业务,其依赖如下:
dependencies {
// billing
compileOnly "com.android.billingclient:billing:3.0.0"
compileOnly "com.android.billingclient:billing-ktx:3.0.0"
// ...
}
这里我使用了 compileOnly 进行依赖,这样是否打入谷歌结算库只要在主工程模块进行配置即可。另外,在代码中通过反射获取类的方式来判断是否加入了谷歌结算依赖:
private fun isGoogleDependencyAdded(): Boolean = try {
Class.forName("com.android.billingclient.api.BillingClient")
true
} catch (e: ClassNotFoundException) {
false
}
此外,我们需要保证在主工程中不直接引用谷歌结算库的类。因此,我们需要对谷歌结算库的类进行包装,
data class SkuDetailsWrapper(val skuDetails: SkuDetails) {
/** Get the product id */
fun getProductId(): String = skuDetails.sku
/** Get sku price */
fun getPrice(): String = skuDetails.price
/** Launch billing flow */
fun launch(activity: Activity, onSuccess: () -> Unit, onFailed: (msg: String) -> Unit) {
BillingManager.instance.launchBillingFlow(activity, skuDetails, onSuccess, onFailed)
}
}
/** Purchase wrapper */
data class PurchaseWrapper(val purchase: Purchase) {
fun getPackageName(): String = purchase.packageName
fun getPurchaseToken(): String = purchase.purchaseToken
fun isAcknowledged(): Boolean = purchase.isAcknowledged
fun getOrderId(): String = purchase.orderId
/** Get google goods id */
fun getGoogleGoodsId(): String = purchase.sku
/** Is given product was purchased */
fun isPurchased():