时间:2021-07-15 | 标签: | 作者:Q8 | 来源:Google Developers网络
小提示:您能找到这篇{将 Google Play 结算库集成到您的应用中}绝对不是偶然,我们能帮您找到潜在客户,解决您的困扰。如果您对本页介绍的将 Google Play 结算库集成到您的应用中内容感兴趣,有相关需求意向欢迎拨打我们的服务热线,或留言咨询,我们将第一时间联系您! |
< ">重要提示:如果您的应用当前使用AIDL来集成Google Play结算系统,请参阅从AIDL迁移到Google Play结算库的迁移指南,大致了解从AIDL迁移到Google Play结算库时需要执行的步骤。 < ">本主题介绍了如何将Google Play结算库集成到您的应用中以开始销售商品。在阅读本主题之前,请确保您已按照做好准备中的步骤提前设置了Google Play配置。 < ">本主题包含一些代码示例,它们基于GitHub上的官方示例应用。如需查看您在集成时可使用的示例应用和其他资源的完整列表,请参阅其他资源。 < ">购买交易的生命周期 < ">下面是一次性购买或订阅的典型购买流程。 < ">向用户展示他们可以购买什么。 < ">启动购买流程,以便用户接受购买交易。 < ">在您的服务器上验证购买交易。 < ">向用户提供内容,并确认内容已传送给用户。还可以选择性地将商品标记为已消费,以便用户可以再次购买商品。 < ">订阅会自动续订,直到被取消。订阅可处于下面这几种状态: < ">活跃:用户信誉良好,可享用订阅内容。 < ">已取消:用户已取消订阅,但在到期前仍可享用订阅内容。 < ">处于宽限期:用户遇到了付款问题,但仍可享用订阅内容,同时Google会重新尝试通过相应的付款方式扣款。 < ">暂时保留:用户遇到了付款问题,不能再享用订阅内容,同时Google会重新尝试通过相应的付款方式扣款。 < ">已暂停:用户暂停了其订阅,在恢复之前不能享用订阅内容。 < ">已到期:用户已取消且不能再享用订阅内容。用户在订阅到期时会被视为流失。 < ">购买令牌和订单ID < ">Google Play使用购买令牌和订单ID跟踪商品和交易。 < ">购买令牌是一个字符串,表示买家对Google Play上的商品的权利。它表明Google用户有权使用由SKU表示的特定商品。您可以将购买令牌与Google Play Developer API一起使用。 < ">订单ID是一个字符串,表示Google Play上的财务交易。此字符串会包含在通过电子邮件发送给买家的收据中。您可以在销售和付款报告中使用订单ID来管理退款。 < ">每当发生财务交易时,系统都会创建订单ID。只有当用户完成购买流程时,系统才会生成购买令牌。 < ">对于一次性商品,每次购买交易都会创建一个新的购买令牌。大多数购买交易还会生成一个新的订单ID。这条规则有一种例外情况,那就是不向用户收取任何费用时,如促销代码中所述。 < ">对于订阅,首次购买交易会创建一个购买令牌和一个订单ID。对于每个连续的结算周期,购买令牌将保持不变,但系统会发放一个新的订单ID。升级、降级、替换和重新注册都会创建新的购买令牌和订单ID。 < ">关于订阅,请注意以下几点: < ">订阅升级、降级和其他订阅购买流程会生成购买令牌,这些令牌必须替换之前的购买令牌。您必须使出现在Google Play Developer API的linkedPurchaseToken字段中的购买令牌无效。如需了解详情,请参阅正确实现linkedPurchaseToken以防止重复订阅。 < ">订阅续订的订单号包含一个额外的整数,它表示具体是第几次续订。例如,初始订阅的订单ID可能是GPA.1234-5678-9012-34567,后续订单ID是GPA.1234-5678-9012-34567..0(第一次续订)、GPA.1234-5678-9012-34567..1(第二次续订),依此类推。 < ">注意:如果用户在购买应用内商品时没有应付款项(如在订阅的免费试订期内),则会生成金额为0美元的订单ID。例如,当用户取消订阅时,订阅将保持有效状态,直到结算周期结束。如果用户决定重新注册,则其帐号中会有一些余额。在这种情况下,系统会创建一个新的购买令牌,创建一个金额为0美元的订单ID,并在余额扣完后续订。 < ">错误处理 < ">Google Play结算库会以BillingResult的形式返回错误。BillingResult包含一个BillingResponseCode,它用于对您的应用可能会遇到的与结算相关的错误进行分类。例如,如果您收到SERVICE_DISCONNECTED错误代码,则您的应用应重新初始化与Google Play的连接。此外,BillingResult还包含一条调试消息,它对于在开发过程中诊断错误很有用。 < ">连接到Google Play < ">与Google Play结算系统集成的第一步是将该库添加到您的应用中并初始化连接。 < ">添加Google Play结算库依赖项 < ">注意:如果您已经按照做好准备指南中的说明操作,那么就已经添加了必要的依赖项,现在可以转到下一部分。 < ">将Google Play结算库依赖项添加到应用的build.gradle文件中,如下所示: < ">dependencies{ < ">def billing_version="3.0.0" < ">implementation"com.android.billingclient:billing:$billing_version" < ">} < ">如果您使用的是Kotlin,Play结算库KTX模块包含了Kotlin扩展程序和协程支持,可让您在使用Google Play结算库时编写惯用的Kotlin代码。如需将这些扩展程序包含在项目中,请将以下依赖项添加到应用的build.gradle文件中,如下所示: < ">dependencies{ < ">def billing_version="3.0.0" < ">implementation"com.android.billingclient:billing-ktx:$billing_version" < ">} < ">初始化BillingClient < ">添加对Google Play结算库的依赖关系后,您需要初始化BillingClient实例。BillingClient是Google Play结算库与应用的其余部分之间进行通信的主接口。BillingClient为许多常见的结算操作提供了方便的方法,既有同步方法,又有异步方法。 < ">如需创建BillingClient,请使用newBuilder()。为了接收有关购买交易的更新,您还必须调用setListener(),并传递对PurchasesUpdatedListener的引用。此监听器可接收应用中所有购买交易的更新。 < ">KOTLIN < ">private val purchasesUpdateListener= < ">PurchasesUpdatedListener{billingResult,purchases-> < ">//To be implemented in a later section. < ">} < ">private var billingClient=BillingClient.newBuilder(activity) < ">.setListener(purchasesUpdatedListener) < ">.enablePendingPurchases() < ">.build() < ">JAVA < ">private PurchasesUpdatedListener purchasesUpdatedListener=new PurchasesUpdatedListener(){ < "> Override < ">public void onPurchasesUpdated(BillingResult billingResult,List<Purchase>purchases){ < ">//To be implemented in a later section. < ">} < ">}; < ">private BillingClient billingClient=BillingClient.newBuilder(activity) < ">.setListener(purchasesUpdatedListener) < ">.enablePendingPurchases() < ">.build(); < ">与Google Play建立连接 < ">创建BillingClient后,您需要与Google Play建立连接。 < ">如需连接到Google Play,请调用startConnection()。连接过程是异步进行的,因此您必须实现BillingClientStateListener,以便在客户端的设置完成后且它准备好发出进一步的请求时接收回调。 < ">此外,您还必须实现重试逻辑,以处理与Google Play失去连接的问题。如需实现重试逻辑,请替换onBillingServiceDisconnected()回调方法,并确保BillingClient先调用startConnection()方法以重新连接到Google Play,然后再发出进一步的请求。 < ">以下示例演示了如何启动连接并测试它是否已准备就绪可供使用: < ">KOTLIN < ">billingClient.startConnection(object:BillingClientStateListener{ < ">override fun onBillingSetupFinished(billingResult:BillingResult){ < ">if(billingResult.responseCode==BillingResponseCode.OK){ < ">//The BillingClient is ready.You can query purchases here. < ">} < ">} < ">override fun onBillingServiceDisconnected(){ < ">//Try to restart the connection on the next request to < ">//Google Play by calling the startConnection()method. < ">} < ">}) < ">JAVA < ">billingClient.startConnection(new BillingClientStateListener(){ < "> Override < ">public void onBillingSetupFinished(BillingResult billingResult){ < ">if(billingResult.getResponseCode()==BillingResponseCode.OK){ < ">//The BillingClient is ready.You can query purchases here. < ">} < ">} < "> Override < ">public void onBillingServiceDisconnected(){ < ">//Try to restart the connection on the next request to < ">//Google Play by calling the startConnection()method. < ">} < ">}); < ">注意:强烈建议您实现自己的连接重试逻辑并替换onBillingServiceDisconnected()方法。请确保在执行任何方法时都与BillingClient保持连接。 < ">展示可供购买的商品 < ">与Google Play建立连接后,您就可以查询可售的商品并将其展示给用户了。如需向Google Play查询应用内商品详情,请调用querySkuDetailsAsync()。在将商品展示给用户之前,查询SKU详情是非常重要的一步,因为查询会返回本地化的商品信息。对于订阅,请确保您的商品展示符合所有Play政策。 < ">调用querySkuDetailsAsync()时,应传递SkuDetailsParams的实例,用于指定在Google Play管理中心创建的商品ID字符串的列表以及SkuType。SkuType可以是SkuType.INAPP(针对一次性商品),也可以是SkuType.SUBS(针对订阅)。 < ">为了处理该异步操作的结果,您还必须指定实现SkuDetailsResponseListener接口的监听器。然后,您可以替换onSkuDetailsResponse(),该方法会在查询完成时通知监听器,如以下示例所示: < ">KOTLIN < ">fun querySkuDetails(){ < ">val skuList=ArrayList<String>() < ">skuList.add("premium_upgrade") < ">skuList.add("gas") < ">val params=SkuDetailsParams.newBuilder() < ">params.setSkusList(skuList).setType(SkuType.INAPP) < ">withContext(Dispatchers.IO){ < ">billingClient.querySkuDetailsAsync(params.build()){billingResult,skuDetailsList-> < ">//Process the result. < ">} < ">} < ">} < ">JAVA < ">List<String>skuList=new ArrayList<>(); < ">skuList.add("premium_upgrade"); < ">skuList.add("gas"); < ">SkuDetailsParams.Builder params=SkuDetailsParams.newBuilder(); < ">params.setSkusList(skuList).setType(SkuType.INAPP); < ">billingClient.querySkuDetailsAsync(params.build(), < ">new SkuDetailsResponseListener(){ < "> Override < ">public void onSkuDetailsResponse(BillingResult billingResult, < ">List<SkuDetails>skuDetailsList){ < ">//Process the result. < ">} < ">}); < ">Google Play结算库会将查询结果存储在SkuDetails对象的List中。您随后可以对该列表中的每个SkuDetails对象调用各种方法,以查看应用内商品的相关信息,如其价格或说明。如需查看可用的商品详情,请参阅SkuDetails类中的方法列表。 < ">在提供待售商品之前,检查用户是否尚未拥有该商品。如果用户的消耗型商品仍在他们的商品库中,他们必须先消耗掉该商品,然后才能再次购买。 < ">在提供订阅之前,验证用户是否尚未订阅。 < ">注意:有些Android设备安装的可能是旧版Google Play商店应用,不支持订阅等某些商品类型。在您的应用进入结算流程之前,您可以调用isFeatureSupported()以确定设备是否支持您要销售的商品。如需查看可支持的商品类型的列表,请参阅BillingClient.FeatureType。 < ">启动购买流程 < ">如需从应用发起购买请求,请从应用的主线程调用launchBillingFlow()方法。此方法接受对BillingFlowParams对象的引用,该对象包含通过调用querySkuDetailsAsync()获取的相关SkuDetails对象。如需创建BillingFlowParams对象,请使用BillingFlowParams.Builder类。 < ">KOTLIN < ">//An activity reference from which the billing flow will be launched. < ">val activity:Activity=...; < ">//Retrieve a value for"skuDetails"by calling querySkuDetailsAsync(). < ">val flowParams=BillingFlowParams.newBuilder() < ">.setSkuDetails(skuDetails) < ">.build() < ">val responseCode=billingClient.launchBillingFlow(activity,flowParams).responseCode < ">JAVA < ">//An activity reference from which the billing flow will be launched. < ">Activity activity=...; < ">//Retrieve a value for"skuDetails"by calling querySkuDetailsAsync(). < ">BillingFlowParams billingFlowParams=BillingFlowParams.newBuilder() < ">.setSkuDetails(skuDetails) < ">.build(); < ">int responseCode=billingClient.launchBillingFlow(activity,billingFlowParams).getResponseCode(); < ">//Handle the result. < ">launchBillingFlow()方法会返回BillingClient.BillingResponseCode中列出的几个响应代码之一。请务必检查此结果,以确保在启动购买流程时没有错误。BillingResponseCode为OK表示成功启动。 < ">成功调用launchBillingFlow()后,系统会显示Google Play购买屏幕。图1显示了订阅的购买屏幕: 图1.Google Play购买屏幕显示了可供购买的订阅。 < ">Google Play会调用onPurchasesUpdated(),以将购买操作的结果传送给实现PurchasesUpdatedListener接口的监听器。您可以在初始化客户端时使用setListener()方法指定监听器。 < ">您必须实现onPurchasesUpdated()来处理可能的响应代码。以下示例展示了如何替换onPurchasesUpdated(): < ">KOTLIN < ">override fun onPurchasesUpdated(billingResult:BillingResult,purchases:List<Purchase>?){ < ">if(billingResult.responseCode==BillingResponseCode.OK&&purchases!=null){ < ">for(purchase in purchases){ < ">handlePurchase(purchase) < ">} < ">}else if(billingResult.responseCode==BillingResponseCode.USER_CANCELED){ < ">//Handle an error caused by a user cancelling the purchase flow. < ">}else{ < ">//Handle any other error codes. < ">} < ">} < ">JAVA < ">Override < ">void onPurchasesUpdated(BillingResult billingResult,List<Purchase>purchases){ < ">if(billingResult.getResponseCode()==BillingResponseCode.OK < ">&&purchases!=null){ < ">for(Purchase purchase:purchases){ < ">handlePurchase(purchase); < ">} < ">}else if(billingResult.getResponseCode()==BillingResponseCode.USER_CANCELED){ < ">//Handle an error caused by a user cancelling the purchase flow. < ">}else{ < ">//Handle any other error codes. < ">} < ">} < ">如果成功购买商品,系统会显示Google Play购买成功屏幕,类似于图2。 图2.Google Play的购买成功屏幕。 < ">如果成功购买商品,系统还会生成购买令牌,它是一个唯一标识符,表示用户及其所购应用内商品的商品ID。您的应用可以在本地存储购买令牌,不过我们建议您将令牌传递到安全的后端服务器,您随后可以在该服务器上验证购买交易及防范欺诈行为。下一部分对此过程进行了详细说明。 < ">用户还会收到包含交易收据的电子邮件,其中包含订单ID或交易的唯一ID。用户每次购买一次性商品时,都会收到包含唯一订单ID的电子邮件。此外,用户最初购买订阅时以及后续定期自动续订时,也会收到这样的电子邮件。您可以在Google Play管理中心内使用订单ID来管理退款。 < ">处理购买交易 < ">用户完成购买交易后,您的应用需要处理该购买交易。在大多数情况下,您的应用会通过PurchasesUpdatedListener收到购买交易的通知。但在某些情况下,您的应用通过调用BillingClient.queryPurchases()得知购买交易,如提取购买交易中所述。 < ">您的应用应按以下方式处理购买交易: < ">验证购买交易。 < ">向用户提供内容,并确认内容已传送给用户。还可以选择性地将商品标记为已消费,以便用户可以再次购买商品。 < ">如需验证购买交易,请先检查购买交易的状态是否为PURCHASED。如果购买交易的状态为PENDING,则您应按照处理待处理的交易中的说明处理购买交易。对于通过onPurchaseUpdated()或queryPurchases接收的购买交易,您应在应用授予权利之前进一步验证购买交易以确保其合法性。如需了解如何正确验证购买交易,请参阅在授予权利前验证购营口做推广买交易。 < ">一旦您验证了购买交易,您的应用就可以向用户授予权利了。授予权利后,您的应用必须确认购买交易。此确认会告知Google Play您已授予购买权。 < ">注意:如果您在三天内未确认购买交易,用户会自动收到退款,并且Google Play会撤消该购买交易。 < ">注意:使用2.0之前的Google Play结算库版本时,不需要确认。 < ">授予权利并确认购买交易的流程取决于购买的是非消耗型商品、消耗型商品,还是订阅。 < ">对于消耗型商品,consumeAsync()方法满足确认要求,并且表明您的应用已授予用户权利。此外,通过此方法,您的应用可让一次性商品可供再次购买。 < ">如需表明某件一次性商品已被消耗,请调用consumeAsync()并添加Google Play应在用户重新购买时提供的购买令牌。您还必须传递一个实现ConsumeResponseListener接口的对象。该对象用于处理消耗操作的结果。您可以替换onConsumeResponse()方法,Google Play结算库会在消耗操作完成时调用该方法。 < ">以下示例展示了如何使用关联的购买令牌来消耗商品: < ">KOTLIN < ">fun handlePurchase(purchase:Purchase){ < ">//Purchase retrieved from BillingClient#queryPurchases or your PurchasesUpdatedListener. < ">val purchase:Purchase=...; < ">//Verify the purchase. < ">//Ensure entitlement was not already granted for this purchaseToken. < ">//Grant entitlement to the user. < ">val consumeParams= < ">ConsumeParams.newBuilder() < ">.setPurchaseToken(purchase.getPurchaseToken()) < ">.build() < ">billingClient.consumeAsync(consumeParams,{billingResult,outToken-> < ">if(billingResult.responseCode==BillingResponseCode.OK){ < ">//Handle the success of the consume operation. < ">} < ">}) < ">} < ">JAVA < ">void handlePurchase(Purchase purchase){ < ">//Purchase retrieved from BillingClient#queryPurchases or your PurchasesUpdatedListener. < ">Purchase purchase=...; < ">//Verify the purchase. < ">//Ensure entitlement was not already granted for this purchaseToken. < ">//Grant entitlement to the user. < ">ConsumeParams consumeParams= < ">ConsumeParams.newBuilder() < ">.setPurchaseToken(purchase.getPurchaseToken()) < ">.build(); < ">ConsumeResponseListener listener=new ConsumeResponseListener(){ < "> Override < ">public void onConsumeResponse(BillingResult billingResult,String purchaseToken){ < ">if(billingResult.getResponseCode()==BillingResponseCode.OK){ < ">//Handle the success of the consume operation. < ">} < ">} < ">}; < ">billingClient.consumeAsync(consumeParams,listener); < ">} < ">注意:由于消耗请求偶尔会失败,因此您必须检查安全的后端服务器,确保所有购买令牌都未被使用过,这样您的应用就不会针对同一购买交易多次授予权利。或者,您的应用也可以等到您收到Google Play发来的成功消耗响应后再授予权利。如果您选择在Google Play发来成功消耗响应之前不让用户消耗所购商品,那么您必须非常小心,在消耗请求发出后时刻跟踪相应商品。 < ">如需确认非消耗型商品的购买交易,请使用结算库中的BillingClient.acknowledgePurchase()或Google Play Developer API中的Product.Purchases.Acknowledge。在确认购买交易之前,您的应用应使用Google Play结算库中的isAcknowledged()方法或Google Play Developer API中的acknowledgementState字段检查该购买交易是否已经过确认。 < ">以下示例展示了如何使用Google Play结算库来确认购买交易: < ">KOTLIN < ">val client:BillingClient=... < ">val acknowledgePurchaseResponseListener:AcknowledgePurchaseResponseListener=... < ">fun handlePurchase(){ < ">if(purchase.purchaseState===PurchaseState.PURCHASED){ < ">if(!purchase.isAcknowledged){ < ">val acknowledgePurchaseParams=AcknowledgePurchaseParams.newBuilder() < ">.setPurchaseToken(purchase.purchaseToken) < ">val ackPurchaseResult=withContext(Dispatchers.IO){ < ">client.acknowledgePurchase(acknowledgePurchaseParams.build()) < ">} < ">} < ">} < ">} < ">JAVA < ">BillingClient client=... < ">AcknowledgePurchaseResponseListener acknowledgePurchaseResponseListener=... < ">void handlePurchase(Purchase purchase){ < ">if(purchase.getPurchaseState()==PurchaseState.PURCHASED){ < ">if(!purchase.isAcknowledged()){ < ">AcknowledgePurchaseParams acknowledgePurchaseParams= < ">AcknowledgePurchaseParams.newBuilder() < ">.setPurchaseToken(purchase.getPurchaseToken()) < ">.build(); < ">client.acknowledgePurchase(acknowledgePurchaseParams,acknowledgePurchaseResponseListener); < ">} < ">} < ">} < ">订阅的处理方式与非消耗型商品类似。您可以使用Google Play结算库中的BillingClient.acknowledgePurchase()危机公关手册或Google Play Developer API中的Purchases.Subscriptions.Acknowledge确认订阅。所有初始订阅购买交易都需要确认。订阅续订不需要确认。如需详细了解订阅何时需要确认,请参阅销售订阅内容主题。 < ">提取购买交易 < ">使用PurchasesUpdatedListener监听购买交易更新不足以确保您的应用会处理所有购买交易。有时您的应用可能不知道用户进行的部分购买交易。在下面这几种情况下,您的应用可能会跟踪不到或不知道购买交易: < ">在购买过程中出现网络问题:用户成功购买了商品并收到了Google的确认消息,但他们的设备在通过PurchasesUpdatedListener收到购买交易的通知之前失去了网络连接。 < ">多台设备:用户在一台设备上购买了一件商品,然后在切换设备时期望看到该商品。 < ">处理在您的应用外进行的购买交易:某些购买交易(如促销活动兑换)可能会在您的应用外进行。 < ">为了处理这些情况,请确保您的应用在onResume()和onCreate()方法中调用BillingClient.queryPurchases(),以确保所有购买交易都得到成功处理,如处理购买交易中所述。 < ">处理在您的应用外进行的购买交易 < ">某些购买交易(如促销活动兑换)可能发生在您的应用外。当用户在您的应用外进行购买交易时,他们希望您的应用显示应用内消息,或使用某种通知机制告知用户应用已正确接收并处理该购买交易。下面是一些可接受的机制: < ">显示应用内弹出式消息。 < ">将消息传送到应用内消息箱,并清楚地指出应用内消息箱中有新消息。 < ">使用操作系统通知消息。 < ">请注意,当您的应用识别出购买交易时,它有可能处于任何状态。甚至有可能在用户进行购买交易时根本没有安装您的应用。无论应用处于什么状态,用户都希望在继续使用应用时收到其所购商品。 < ">无论用户进行购买交易时应用处于什么状态,您都必须检测购买交易。不过,在一些例外情况下,不立即通知用户已收到商品或许是可以接受的。例如: < ">当用户在玩游戏时,显示消息可能会让用户分心。在这种情况下,必须待游戏结束后再通知用户。 < ">在出现过场动画时,显示消息可能会让用户分心。在这种情况下,必须待过场动画结束后再通知用户。 < ">当用户在游戏中学习初始教程和进行用户设置时。我们建议您在新用户打开游戏后立即将奖励通知用户,或在用户进行初始设置期间通知他们。不过,您也可以等到用户正式进入游戏环节时再通知用户。 < ">在斟酌何时以及如何通知用户在您的应用外进行的购买交易时,一定要把用户放在心上。如果用户没有立即收到通知,他们可能会感到困惑,并且可能会停止使用您的应用,与用户支持团队联系,或在社交媒体上抱怨。 < ">处理待处理的交易 < ">注意:只有Google Play结算库2.0及更高版本支持待处理的交易。 < ">注意:其他付款方式不可用于订阅购买交易。 < ">Google Play支持待处理的交易,即从用户发起购买交易到购买交易的付款方式得到处理期间需要执行一个或多个额外步骤的交易。在Google通知您已通过用户的付款方式成功扣款之前,您的应用不得授予对这些类型的购买交易的权利。 < ">例如,用户可以选择现金作为付款方式来创建应用内商品的PENDING购买交易。然后,用户可以选择在一家实体店完成交易,并通过通知和电子邮件收到一个代码。当用户到达实体店时,他们可以在收银员处兑换该代码并用现金支付。Google随后会通知您和用户已收到现金。您的应用随后就可以授予用户权利了。 < ">如要启用“待处理的购买交易”功能,请在初始化应用期间调用enablePendingPurchases()。 < ">当您的应用通过PurchasesUpdatedListener或由于调用queryPurchases()而收到新的购买交易时,使用getPurchaseState()方法确定购买交易的状态是PURCHASED还是PENDING。请注意,只有在状态为PURCHASED时,您才能授予权利。如果您的应用在用户完成购买交易时正在运行,系统会再次调用PurchasesUpdatedListener,并且PurchaseState现在为PURCHASED。此时,您的应用可以使用处理一次性购买的标准方法处理购买交易。此外,您的应用还应在其onResume()和onCreate()方法中调用queryPurchases(),以处理您的应用未在运行时过渡到PURCHASED状态的购买交易。 < ">注意:只有在状态为PURCHASED时,您才能确认购买交易。当购买交易处于PENDING状态时,您不能确认。 < ">您的应用还可以通过监听OneTimeProductNotifications,将实时开发者通知与待处理的购买交易一起使用。当购买交易从PENDING过渡到PURCHASED时,您的应用会收到ONE_TIME_PRODUCT_PURCHASED通知。如果购买交易被取消,您的应用会收到ONE_TIME_PRODUCT_CANCELED通知。如果客户没有在规定的时间范围内完成付款,就会发生这种情况。当收到这些通知时,您可以使用Google Play Developer API,该API包含Purchases.products的PENDING状态。 < ">注意:待处理的交易可由许可测试人员进行测试。除了两张测试信用卡之外,许可测试人员还可以使用两种测试付款方式,以测试在几分钟后自动完成或取消的延迟付款方式。在测试您的应用时,您应验证您的应用是否不会在用户使用这两种付款方式中的任意一种购买后立即授予权利或确认购买交易。使用自动完成的测试付款方式购买时,您应验证您的应用是否会在购买完成后授予权利并确认购买交易。 |
上一篇:域名转入阿里云操作教程
下一篇:配置阿里云OSS云存储
基于对传统行业渠道的理解,对互联网行业的渠道我们可以下这样一个定义:一切...
小米应用商店的后台操作和苹果是比较相似的,因为都能填写100字符关键词,允许...
小米的规则目前是在变更中的,但是根据经验小米的搜索排名评分的高低是个很重...
为了恰饭,有时候是要接入一些广告的,所以FB也专门有一个广告的SDK,这就是A...
在 2018 年于旧金山举行的游戏开发者大会上,Amazon Web Services (AWS) 曾宣布,目前世...
关于Facebook Audience Network如何收款的问题,其实官方已经给了详细的步骤。本文主要...
本文介绍了Audience Network对广告载体的质量检查,以及它重点广告形式需要注意的问...
随着iOS开发,作为开发者或公司需要针对iOS App开发涉及的方方面面作出对应的信息...
Facebook和谷歌对出海企业广告渠道都很熟悉,但事实上,在国外还有一些渠道也很...
卖家从做号的第1分钟开始,就一定要想好变现路径是什么?一定要以变现为目的去...
小提示:您应该对本页介绍的“将 Google Play 结算库集成到您的应用中”相关内容感兴趣,若您有相关需求欢迎拨打我们的服务热线或留言咨询,我们尽快与您联系沟通将 Google Play 结算库集成到您的应用中的相关事宜。
关键词:将,Google,Play,结算库集成到