以
com.android.billingclient:billing:4.0.0
版本介绍:
1,准备 Google play 开发者账号。
2,创建应用内商品(商品id,商品描述,定价)。
3,应用为发布状态之后,在 app 里面才能执行支付等操作。
就算是开发内测阶段,也必须上传一个 apk,审核通过到发布状态。
private val purchasesUpdatedListener = PurchasesUpdatedListener { billingResult, purchases ->
if (billingResult.responseCode == BillingClient.BillingResponseCode.OK && purchases != null) {
handPurchase(skuType, purchases)
} else if (billingResult.responseCode == BillingClient.BillingResponseCode.USER_CANCELED) {
PayManager.doCallBack("pay_cancel", false)
ToastUtil.showShort(
ContextUtils.appContext,
ContextUtils.appContext.getString(R.string.vip_pay_no)
} else {
handError(billingResult.responseCode, null)
private val connListener = object : BillingClientStateListener {
override fun onBillingSetupFinished(connResult: BillingResult) {
if (connResult.responseCode == BillingClient.BillingResponseCode.OK) {
reConnectionCount = 0
checkPurchasesAsync(BillingClient.SkuType.INAPP)
checkPurchasesAsync(BillingClient.SkuType.SUBS)
override fun onBillingServiceDisconnected() {
if (reConnectionCount < 3) {
reConnectionCount++
billingClient.startConnection(this)
private val billingClient by lazy {
BillingClient.newBuilder(ContextUtils.appContext)
.setListener(purchasesUpdatedListener)
.enablePendingPurchases()
.build()
fun init() {
billingClient.startConnection(connListener)
这一步挺重要的。用户支付完成了,还必须得调用方法去确认。只有确认成功之后,才能真正到账,否则3天之后,会执行退款处理,测试阶段只有5分钟。
private fun checkPurchasesAsync(skuType: String, callBack: ((Int, Any?) -> Unit)? = null) {
billingClient.queryPurchasesAsync(skuType) { purchasesQueryResult, purchaseList ->
if (purchasesQueryResult.responseCode == BillingClient.BillingResponseCode.OK && !purchaseList.isNullOrEmpty()) {
handPurchase(skuType, purchaseList)
callBack?.invoke(purchasesQueryResult.responseCode, null)
private fun handPurchase(skuType: String?, purchases: List<Purchase>) {
for (purchase in purchases) {
if (purchase.purchaseState == Purchase.PurchaseState.PURCHASED) {
if (skuType == BillingClient.SkuType.INAPP) {
val consumeParams = ConsumeParams.newBuilder()
.setPurchaseToken(purchase.purchaseToken)
.build()
billingClient.consumeAsync(consumeParams) { consumeResult, _ ->
if (consumeResult.responseCode == BillingClient.BillingResponseCode.OK) {
PayManager.doCallBack("pay_success", true)
} else {
handError(consumeResult.responseCode, null)
} else if (skuType == BillingClient.SkuType.SUBS) {
if (!purchase.isAcknowledged) {
val acknowledgePurchaseParams = AcknowledgePurchaseParams.newBuilder()
.setPurchaseToken(purchase.purchaseToken)
.build()
billingClient.acknowledgePurchase(acknowledgePurchaseParams) { acknowledgeResult ->
if (acknowledgeResult.responseCode == BillingClient.BillingResponseCode.OK) {
PayManager.doCallBack("pay_success", true)
} else {
handError(acknowledgeResult.responseCode, null)
} else {
PayManager.doCallBack("pay_success", true)
} else {
handError(purchase.purchaseState, null)
fun pay(activity: Activity, skuInfo: String?) {
var skuInfo = "{\"productId\":\"inapp_moth1\",\"type\":\"inapp\"}";
val skuJo = JSONObject(skuInfo)
val skuId = skuJo.optString("productId")
skuType = skuJo.optString("type")
checkPurchasesAsync(skuType) { _, _ ->
val params = SkuDetailsParams.newBuilder()
.setSkusList(arrayListOf(skuId))
.setType(skuType)
billingClient.querySkuDetailsAsync(params.build()) { skuQueryResult, skuDetailsList ->
if (skuQueryResult.responseCode == BillingClient.BillingResponseCode.OK && !skuDetailsList.isNullOrEmpty()) {
val skuDetail = skuDetailsList!![0]
val flowParams = BillingFlowParams.newBuilder()
.setSkuDetails(skuDetail)
.build()
val payResult = billingClient.launchBillingFlow(activity, flowParams)
} else {
handError(skuQueryResult.responseCode, null)
附一个支付过程可能出现的错误码:
1,测试的时候,安装 Google 三件套,不知道怎么安装的,可以安装一个 YouTube。也可以参考 三件套
2,允许应用在后台弹窗界面权限。
3,如果提示:“目前还无法在您所在的国家/地区购买Google Play中的内容”,解决方案:
- 改要购买商品的账号的地址,改成符合的。具体操作:网页登录你的google账户:在设置里面,把你的地址改成美国或其他支持的国家,然后清除 app 内 google play 的数据,重新进入,重新选择地区(刚才你修改的地区),选完之后会提示你切换到美国的商店,然后再添加付款信息,这样就万事大吉了,之后就可以正常支付了。
- 修改你的应用,要发布在哪些国家。添加上你的国家就行了。
4,就算是开发阶段,也必须提交内测审核到发布状态,才可以正常测试支付。
5,找时机,查询检查待确认订单,否则3天后会自动退款的。
6,因为测试支付必须要到发布状态,所以建议传个白包,修改成自己的包名签名发布。
官方接入地址以 com.android.billingclient:billing:4.0.0 版本介绍:一,准备工作1,准备 Google play 开发者账号。2,创建应用内商品(商品id,商品描述,定价)。3,应用为发布状态之后,在 app 里面才能执行支付等操作。就算是开发内测阶段,也必须上传一个 apk,审核通过到发布状态。二,集成1,连接 Google Play 服务 private val purchasesUpdatedListener = PurchasesUpd
最近看群聊,一位兄弟去面试安卓SDK岗位,面试时候被问到了google play结算流程。这位兄弟平时主要是负责国内的SDK渠道,海外SDK基本是没有了解。
结果面试过程一脸尴尬,面完后在群里也分享了一下面试过程,正好最近公司要更新一下google play 结算库 4.0,顺便我做个分享,希望群里哪位兄弟能看见 。
了解一下最近几个版本结算库的变化
Google Play 结算库 4.0 版 (2021-05-18)
当前最新版本,变更内容
添加了 BillingClient.queryPurc
implementation 'com.android.billingclient:billing:2.0.3'
2.初始化,购买后会回调onPurchasesUpdated 方法 并调用消耗 方法
//init
private BillingClient billingClient;
private SkuDetails mSkuDetails;...
https://developer.android.com/google/play/billing/getting-ready
https://developer.android.com/google/play/billing/integrate
一、创建空安卓库工程
应用gradle文件添加依赖
dependencies {
def billing_version = "4.0.0"
implementati
这里要接入的是google应用内支付
1.在app模块下的build.gradle模块下引入最新版本google billing 4.0版本,顺便引入google服务,如下
implementation 'com.google.android.gms:play-services-wallet:19.0.0'
implementation 'com.android.support:appcompat-v7:24.1.1'
implementation 'com.android.b
创建的时候选择Web application
Authorized redirect URIs,需要填写,后面会用到,随便填一个,后面可以修改
OAuth consent screen 的Test Users中添加Google Play Console账户
创建Service accounts
设置Acess里设置,App permissions中添加对应的App,Access permissions中勾选Manag
目前谷歌支付相关的文章并不多, 并且也大都写的很杂, 在接入过程中难免踩了一些坑, 这里做个总结, 把内购相关配置到支付接入的整个流程都写上来, 方便需要接入内购的开发者少踩一些坑, 闲话就不多说了, 开始.
在准备配置应用及内购信息之前, 先需要创建谷歌开发者账号, 并绑定海外银行卡(visa卡)等. 这里不再赘述. 梯子自备
1. 创建应用
点击创建应用,填写...