如何验证应用内购买的 Android 服务器端 Java?

Posted

技术标签:

【中文标题】如何验证应用内购买的 Android 服务器端 Java?【英文标题】:How to validate in-app-purchase Android server side Java? 【发布时间】:2019-03-21 13:35:41 【问题描述】:

我遵循了这个教程:https://medium.com/@infinitesimal_/doing-android-purchase-validation-api-v3-in-java-5c46fc837368

但我不能让它工作!我能得到的只有这个:


  "code" : 401,
  "errors" : [ 
    "domain" : "androidpublisher",
    "message" : "The current user has insufficient permissions to perform the requested operation.",
    "reason" : "permissionDenied"
   ],
  "message" : "The current user has insufficient permissions to perform the requested operation."

这是我的java代码:

    HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();    

    JacksonFactory jsonFactory = JacksonFactory.getDefaultInstance();        
    String applicationName = "My App";       
    String packageName = "com.my.package";
    final Set<String> scopes = Collections.singleton(AndroidPublisherScopes.ANDROIDPUBLISHER);
    GoogleCredential credential = new GoogleCredential.Builder()                    
        .setTransport(httpTransport)                        
        .setJsonFactory(jsonFactory)                    
        .setServiceAccountId("myAccoutId")                     
        .setServiceAccountScopes(scopes)                    
        .setServiceAccountPrivateKeyFromP12File(
          new File("/my/path"))                    
        .build();

    AndroidPublisher pub = new AndroidPublisher.Builder
            (httpTransport, jsonFactory, credential)                     
            .setApplicationName(applicationName)                    
            .build();            
        final AndroidPublisher.Purchases.Products.Get get = 
            pub.purchases()
            .products()                    
            .get(packageName, "name", "transactionId"); 
        final ProductPurchase purchase = get.execute();            
        System.out.println("Found google purchase item " + purchase.toPrettyString());

我创建了一个服务帐户并赋予了所有者角色。我去了谷歌播放控制台,在用户和权限中我也让这个服务帐户成为管理员。

【问题讨论】:

您解决了这个问题吗?你能分享你的解决方案吗?谢谢。 对不起,尝试了很多,但我无法解决这个问题。我使用交易 ID 进行了简单的验证。它有所帮助,但仍然存在一些问题。 该代码在服务帐户创建后 2 天生效,请试一试。 已弃用已回答的方法现在使用此方法***.com/a/57943483/5232267 【参考方案1】:

我们使用了相同的示例,并进行了一系列更改以使其正常工作:

    使用包名代替应用程序名:将.setApplicationName(applicationName)替换为.setApplicationName(packageName)

    我们使用 JSON 密钥代替 P12: GoogleCredential credential = GoogleCredential.fromStream(IOUtils.toInputStream(jsonCert));

jsonCert 是 JSON 密钥(服务帐户 -> 选择帐户 -> 创建密钥)看起来像


"type": "service_account",
"project_id": "api-xxx",
"private_key_id": "xxx",
"private_key": "your_private_key",
"client_email": "api-server-service-account@api-xxx.iam.gserviceaccount.com",
"client_id": "xxx",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://accounts.google.com/o/oauth2/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/api-server-service-account%40api-xxx.iam.gserviceaccount.com"
;

更新:根据@Q Locker,Google 在创建服务帐户后可能需要一些时间(在@Q Locker 的情况下最多需要 2 天)。

【讨论】:

【参考方案2】:

Dmitry Bogdanovich 的回答没有帮助。

服务帐户创建不会立即生效,在我的情况下,我等了不到 2 天才使其生效。

【讨论】:

以上是关于如何验证应用内购买的 Android 服务器端 Java?的主要内容,如果未能解决你的问题,请参考以下文章

Firebase iOS SDK 如何执行其应用内购买验证?

iOS中应用内购买的服务器端验证最佳实践

在服务器端验证 Mac OS X 的耗材应用内购买

Firebase Firestore + Cloud Function 服务器端验证应用内购买收据(Swift + NodeJS)

Android应用内购买服务器签名验证使用php OpenSSL

Firebase Firestore +云功能服务器端验证应用内购买收据(Swift + NodeJS)