我们正在准备一个firebase触发器来处理Android的实时开发人员通知,我们必须使用Google Play Developer API来了解用户订阅的详细信息.因此,我们在Google Play控制台中关联了firebase服务帐户,并授予了必要的访问权限.
我们使用谷歌的nodejs库为googleapis(github链接)编写了一段代码,如下所示:
return google.auth.getClient({
  keyFile: path.join(__dirname, './service-account.json'),
  scope: 'https://www.googleapis.com/auth/androidpublisher'
}) .then((client) => {
  const androidpublisher = google.androidpublisher({
    version: 'v3',
    auth: client
  });
  const params = {
    packageName: ANDROID_PACKAGE_NAME,
    subscriptionId: ANDROID_SUBSCRIPTIONID,
    token: token
  };
  return androidpublisher.purchases.subscriptions.get(params)
  .then(res => {
    console.log(`The response is ${res.data}`);
    return null;
  })
  .catch(error => {
    console.error(error);
  });
});
但它返回一个错误状态:'无效的凭据',我对此有点失落.我已经使用curl测试了API和授权令牌,它也显示了401错误响应.
我不确定我的流程是否正确,有人能给我任何建议吗?
google-api node.js google-play-developer-api android-inapp-purchase google-cloud-functions
我已经浏览了Play计费库 https://developer.android.com/google/play/billing/billing_library_overview。 您必须在三天内确认所有购买。如果未正确确认购买,将导致这些购买被退款。该过程没有明确说明如何确认购买。这就是我尝试过的方法吗?提前致谢
@Override
 public void onPurchasesUpdated(BillingResult billingResult, @Nullable List<Purchase> purchases) {
        if(billingResult.getResponseCode()== BillingClient.BillingResponseCode.OK&&purchases!=null){
            Toast.makeText(this, "Purchase Successful", Toast.LENGTH_SHORT).show();
            for(Purchase purchase:purchases){
                handlePurchase(purchase);
            }
        }else if(billingResult.getResponseCode()== BillingClient.BillingResponseCode.USER_CANCELED){
            Toast.makeText(this, "Purchase Cancelled", Toast.LENGTH_SHORT).show();
        }else if(billingResult.getResponseCode()== BillingClient.BillingResponseCode.ITEM_ALREADY_OWNED){
            Toast.makeText(this, "Already Purchased", Toast.LENGTH_SHORT).show();
        } else{
            Toast.makeText(this, billingResult.getDebugMessage(), Toast.LENGTH_SHORT).show();
        }
    //in handlePurchase()
 if(!purchase.isAcknowledged())
{ 
          AcknowledgePurchaseParams acknowledgePurchaseParams
                    = AcknowledgePurchaseParams.newBuilder()
                    .setPurchaseToken(purchase.getPurchaseToken())
                    .setDeveloperPayload(purchase.getDeveloperPayload())
                    .build();
            client.acknowledgePurchase(acknowledgePurchaseParams, new AcknowledgePurchaseResponseListener() {
                @Override
                public void onAcknowledgePurchaseResponse(BillingResult billingResult) {
                    if(billingResult.getResponseCode()== BillingClient.BillingResponseCode.OK){
                        Toast.makeText(RemoveAdsActivity.this, "Purchase Acknowledged", Toast.LENGTH_SHORT).show();
                    }
                }
            });
        }
android in-app-purchase in-app-billing android-inapp-purchase
Google带来了入门价格的想法(https://support.google.com/googleplay/android-developer/answer/140504?hl=en).
我的问题与其API有关.我无法通过Purchases.subscriptions找到如何获取相关信息的方式(https://developers.google.com/android-publisher/api-ref/purchases/subscriptions/get)
即使我购买了入门价格的订阅,我向Google Play Developer API询问了有关该订阅的信息,但我只看到了全价.
即使是inappproduct/get也没有关于某些产品的介绍价格的任何信息.
你知道如何获得合适的价格吗?谢谢
我使用的是Google Play结算库2.0.3(implementation 'com.android.billingclient:billing:2.0.3'),它在大多数情况下都可以正常运行,但是对于某些用户,原因未知,querySkuDetailsAsync() method occasionally fails with BillingResponseCode.ERROR (6) error code... 
有人知道吗?除了“ API操作期间发生致命错误”之外,其他任何地方都未说明此错误的原因。谁能说出为什么会这样吗?
编辑: 我正在使用文档中的方法(https://developer.android.com/google/play/billing/billing_library_overview):
public interface QuerySkuDetailsListener {
        void onSuccess(List<SkuDetails> skuDetailsList);
        void onErrorProductsHaveDifferentTypes();
        void onBillingClientError(int error_code);
    }
    public void querySkuDetails(final QuerySkuDetailsListener querySkuDetailsListener, final Product... products) {
        if (products.length < 1) {
            //ERROR_NO_PRODUCTS_TO_QUERY
            throw new NullPointerException();
        }
        String querySkuType = products[0].getSkuType();
        SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
        List<String> skuList = new ArrayList<>();
        for (Product product : products) {
            skuList.add(product.getSku());
            if (!product.getSkuType().equals(querySkuType)) {
                //ERROR_SKU_TYPE_CANT_BE_DIFFERENT
                querySkuDetailsListener.onErrorProductsHaveDifferentTypes();
                return; …android response in-app-billing android-inapp-purchase play-billing-library
当我使用“慢速测试卡,几分钟后批准”时,Android 的实时开发人员通知会起作用。我通过 pub/sub 在我的服务器上收到两个通知。一种是当购买已完成并且其中包含令牌和订单时的消费状态:0 时。第二个通知,在它被消费后,带有 token 和 order ,其中有消费状态:1。正是我想要和期望的。
但是,当我使用“测试卡,始终批准”购买相同的一次性消费品时,我根本没有收到任何“实时开发人员通知”。
我是唯一经历过这种行为的人吗?这是设计使然吗?如何随时收到通知?
android in-app-purchase in-app-billing google-cloud-pubsub android-inapp-purchase
我已经实现in-app purchase了subscription产品,它工作正常.我为每种产品设定了1个月的订阅,并在1个月后续订.
现在我的问题是有没有办法获得更新的产品清单和续订日期?
谷歌是否提供任何类型的服务或活动,通过这些服务或活动我们可以了解更新.
我不确切知道bug的位置,我认为它在Play商店,但我猜它可能是Google Play服务.
基本上,手机上有帐户X和Y的用户将使用帐户X在我的应用程序上进行应用程序内购买.然后我将分阶段推出更新,并且将该应用程序安装为帐户X的用户突然将获得帐户Y的更新,应用程序将无法识别已购买的应用内商品.
我与其他开发人员讨论了类似的应用内模型,他们遇到了同样的错误.
我在哪里提交该bug?
谢谢.
android in-app-purchase google-play google-play-services android-inapp-purchase
我现在正在使用新的Play Billing Library
基本上,我按照文档查询要购买的可用项目
 SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
            params.setSkusList(skuList).setType(itemType);
            mBillingClient.querySkuDetailsAsync(params.build(),
                    new SkuDetailsResponseListener() {
                        @Override
                        public void onSkuDetailsResponse(int responseCode,
                                                         List<SkuDetails> skuDetailsList) {
                            listener.onSkuDetailsResponse(responseCode, skuDetailsList);
                        }
但是,responseCode为0,列表也为空.但我检查了BillingSetupFinished是否成功.提供给SkuDetailsParams.Builder的skuList不为空,skuList(sku_id)中的值也与Google Play控制台上指定的产品ID相同.
有谁知道原因?谢谢!!
android android-billing android-inapp-purchase play-billing-library
该示例应用程序是在谷歌开发者指南是指有一个名为方法verifyValidSignature(),看起来像这样的BillingManager类:
/**
 * Verifies that the purchase was signed correctly for this developer's public key.
 *
 * Note: It's strongly recommended to perform such check on your backend since hackers can
 * replace this method with "constant true" if they decompile/rebuild your app.
 */
private boolean verifyValidSignature(String signedData, String signature) {
    try {
        return Security.verifyPurchase(BASE_64_ENCODED_PUBLIC_KEY, signedData, signature);
    } catch (IOException e) {
        Log.e(TAG, "Got an exception trying to validate a purchase: " …android in-app-purchase in-app-billing android-billing android-inapp-purchase
我正在使用 Google 的应用内结算。(版本 2.2.0)
我在应用程序类中使用以下代码开始计费连接:
billingClient = BillingClient.newBuilder(Application.getInstance()).setListener(this).enablePendingPurchases().build()
billingClient.startConnection(this)
使用上述代码成功连接计费服务。
但我观察到市场上的一个问题,即 onBillingServiceDisconnected()在几秒钟内被多次调用。根据我们的内部分析,大约 13% 的用户在 5 秒内收到了 2 个或更多 onBillingServiceDisconnected() 调用。正如谷歌文档所建议的那样,我尝试使用billingClient.startConnection(this)重新连接 onBillingServiceDisconnected() 内的服务 ,之后服务再次连接,但又断开连接。
如此多的用户如此频繁的服务中断背后的原因可能是什么?
它也会导致付款问题吗?
payment android in-app-purchase in-app-billing android-inapp-purchase