我收到的步骤正确验证用户的Android应用程式内订阅?(Am I getting the step

2019-06-18 03:52发布

我在做,不需要用户帐户/登录一个应用程序,并允许用户购买订阅。 我想使用谷歌Play开发人员API来验证用户是否有购买的/积极认购。 从所有的文档,我已经收集了以下步骤。

他们是正确的,你可以回答他们的两个问题?

  1. 创建服务帐户在谷歌API控制台。
  2. 保存,是给我(在哪里?肯定不是我的代码/在设备上的私有密钥此示例代码提示)
  3. 使用谷歌API客户端库的Java与私钥创建并签署JWT(如何? 该文档给我这个 ,但是这不是Java代码......我该怎么办呢?)
  4. 构建一个访问令牌的请求,并获得访问API
  5. 应用程序现在可以发送一个GET请求,API找出用户是否具有订阅
  6. 当访问令牌期满,回到步骤3。

另外,我有一个Web服务,虽然我什么都不知道Web服务或Web服务编程......我只知道,足以知道,它可能是必要在这里使用。

编辑:这些步骤是不正确的。 见下面的正确的步骤我的答案。 但是,请注意,这仅适用于使用服务帐户(因为我不想要求用户必须明确允许API访问)

Answer 1:

事实证明,我的步骤是不正确的。 我花了几个星期摸不着头脑,它似乎并没有在其他地方记录。 别客气:

  1. 创建的Web应用程序的帐户谷歌API控制台 。 把任何网站作为一个“重定向URI”; 没关系,因为你不会真的使用它。 当您创建帐户,你会得到一个客户端ID和客户端密钥。

  2. 在您的计算机上的浏览器去https://accounts.google.com/o/oauth2/auth?scope=https://www.googleapis.com/auth/androidpublisher&response_type=code&access_type=offline&redirect_uri=[YOUR REDIRECT URI]&client_id=[YOUR CLIENT ID]并允许访问提示时。

  3. 看在地址栏中。 在URI结束时,你输入的本来将是你刷新令牌。 它看起来像1/....您需要在下一步这种“代码”。 刷新令牌永不过期。

  4. 通过将转换该“代码”发送“刷新令牌” https://accounts.google.com/o/oauth2/token?client_id=[YOUR CLIENT ID]&client_secret=[YOUR CLIENT SECRET]&code=[CODE FROM PREVIOUS STEP]&grant_type=authorization_code&redirect_uri=[YOUR REDIRECT URI] 。 您可以保存就在你的程序中产生的价值; 它不会过期,除非明确撤销。 ( 这一步@BrianWhite插入-见注释 )请确保您使用POST(由Gintas插入)。

  5. 在代码中,发送HttpPost请求https://accounts.google.com/o/oauth2/token与BasicNameValuePairs "grant_type","refresh_token" "client_id",[YOUR CLIENT ID] "client_secret",[YOUR CLIENT SECRET]"refresh_token",[YOUR REFRESH TOKEN] 。 举一个例子看这里 。 你需要做一个单独的线程,可能使用的AsyncTask。 这将返回一个JSONObject。

  6. 获得从返回的JSONObject访问令牌。 举一个例子看这里 。 您将需要得到字符串“的access_token”。 访问令牌到期1小时。

  7. 在代码中,发送HTTPGET请求https://www.googleapis.com/androidpublisher/v1/applications/[YOUR APP'S PACKAGE NAME]/subscriptions/[THE ID OF YOUR PUBLISHED SUBSCRIPTION FROM YOUR ANDROID DEVELOPER CONSOLE]/purchases/[THE PURCHASE TOKEN THE USER RECEIVES UPON PURCHASING THE SUBSCRIPTION]?accesstoken="[THE ACCESS TOKEN FROM STEP 4]" 举一个例子看这里 。



Answer 2:

.NET用户:我希望这个答案的人节省一吨的悲痛。

作为@Christophe Fondacci 2015年指出,接受的解决方案几年前伟大的工作。 现在是2017年和进程还远远没有更加方便快捷

我用例是验证应用内订阅,我的手机应用程序发送订阅购买信息到我的REST风格的服务器,这反过来与谷歌以验证订阅购买。

该战略是创建将代表您的操作服务帐户。

  1. 登录到您的谷歌游戏开发控制台 ,然后单击您要设置的应用程序。
  2. 访问设置 - > API访问权限
  3. 服务帐户 ,打了创建服务帐户按钮。
  4. 随着2017年1月的出现在建立服务帐户方向的对话框。 该对话框将带您到谷歌API控制台; 从那里,

    A)单击创建服务帐户

    B)创建服务帐户名是有道理的。 由于我们感兴趣的是获得Android发布服务,我选择了“发行”。

    C)对于角色,只是选择一些 - 你可以改变这一点。

    d)选择“提供新的私钥”,并选择 .NET实现P12。 不要失去这个文件!

5)现在你和#4完成后,你会看到你的新服务帐户中列出; 点击“允许访问”来启用它。

6)链接“查看权限”上点击。 你应该根据你的需要和API修改权限。

为了验证应用内购买,请访问Cog->更改权限,使全球“可视性”和“管理订单”的权限。

OK此时你已经配置了谷歌的结束一切。 现在设置你的服务器到服务器的东西。 我建议创建一个.net控制台应用程序来测试您的实现,然后卸载它需要的地方。

1)的NuGet添加Android发布客户端库

PM> Install-Package Google.Apis.AndroidPublisher.v2

2)P12文件添加到您的项目根

3)变更P12属性,以便“建设行动”是“内容”和“复制到输出目录”,以“是否有更新的复制”。

4)实施这样的事情来测试你的访问和微调。

using System.Threading.Tasks;
using System.Security.Cryptography.X509Certificates;
using Google.Apis.Services;
using Google.Apis.Auth.OAuth2;
using Google.Apis.AndroidPublisher.v2;
...
public Task<SubscriptionPurchase> GetSubscriptionPurchase(string packageName, string productId, string purchaseToken)
{
    var certificate = new X509Certificate2(
                    "{{your p12 file name}}",
                    "{{ your p12 secret }}",
                    X509KeyStorageFlags.Exportable
                );
    var credentials = new ServiceAccountCredential(
            new ServiceAccountCredential.Initializer("{{ your service account email }}")
            {
                Scopes = new[] { AndroidPublisherService.Scope.Androidpublisher }
            }.FromCertificate(certificate))
            ;

    var service = new AndroidPublisherService(new BaseClientService.Initializer()
    {
        HttpClientInitializer = credentials,
        ApplicationName = "my server app name",
    });
    return service.Purchases.Subscriptions.Get(packageName, productId, purchaseToken).ExecuteAsync();
}

祝你好运,希望这可以帮助别人。

资料来源:

使用OAuth 2.0服务器到服务器应用程序

.NET客户端库Google.Apis.AndroidPublisher.v2



Answer 3:

如果你像我一样,想做到这一点在PHP中,这里是如何做到这一点的方法...感谢卡林娜的答案,我花了三天的工作它是如何工作:)。

开始:

  1. 去谷歌开发者控制台https://console.developers.google.com/并创建一个Web应用程序 。 把“developers.google.com/oauthplayground'as一个‘重定向URI’; 您将使用在步骤2,当您创建帐户,你会得到一个客户端ID和客户端密钥。 请确保您有谷歌Play Android开发者API添加。

  2. 转到谷歌的oauth2操场https://developers.google.com/oauthplayground/ 。 这个伟大的工具是为接下来的几天你最好的朋友。 现在去设置:确保使用您自己的OAuth认证设置。 只有这样,你可以在下面的表格您的客户端ID客户端密钥填写。

  3. 谷歌的oauth2操场返回步骤1 选择和授权的API填写在输入字段范围https://www.googleapis.com/auth/androidpublisher 。 我无法找到的谷歌Play Android开发者API列表,也许他们会在以后添加一段时间。 打AUTORIZE的API。 做下面的事情授权。

  4. 谷歌的oauth2操场转到步骤2 交易授权代码标记 。 如果一切顺利,你会看到一个授权码开始/ 4。 如果事情didnt顺利检查右侧的错误消息。 现在你按“刷新访问令牌”。 复制刷新令牌......它将开始/ 1 ...

  5. 现在,你总是可以得到一个访问令牌! 这里是如何:

     $url ="https://accounts.google.com/o/oauth2/token"; $fields = array( "client_id"=>"{your client id}", "client_secret"=>"{your client secret}", "refresh_token"=>"{your refresh token 1/.....}", "grant_type"=>"refresh_token" ); $ch = curl_init($url); //set the url, number of POST vars, POST data curl_setopt($ch, CURLOPT_POST,count($fields)); curl_setopt($ch, CURLOPT_POSTFIELDS, $fields); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //execute post $lResponse_json = curl_exec($ch); //close connection curl_close($ch); 

现在你有一个访问令牌万岁...的JSON看起来就像这样:

"access_token" : "{the access token}",  "token_type" : "Bearer",  "expires_in" : 3600

最后,你准备好要问谷歌的东西! 这里是如何做到这一点:

$lAccessToken = "{The access token you got in}" ;
$lPackageNameStr = "{your apps package name com.something.something}";
$lURLStr =  "https://www.googleapis.com/androidpublisher/v1.1/applications/$lPackageNameStr/subscriptions/$pProductIdStr/purchases/$pReceiptStr";

$curl = curl_init($lURLStr);

curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
$curlheader[0] = "Authorization: Bearer " . $lAccessToken;
curl_setopt($curl, CURLOPT_HTTPHEADER, $curlheader);

$json_response = curl_exec($curl);
curl_close($curl);

$responseObj = json_decode($json_response,true);

该JSON返回包含两个时间戳,该initiationTimestampMsecvalidUntilTimestampMsec时间的订阅是有效的。 两者都是的毫秒的NR添加到日期1/1/1970!



Answer 4:

我不知道在2012年,但在2015年,你不应该手工做这些步骤。 我有一个非常艰难的时间来寻找文件,所以我在这里发帖的情况下,它可以帮助任何人。

  1. 你应该只能查询应用程序内从您的服务器为了安全起见采购否则你可以信任没有任何购买过程中的2点结束。

现在,在服务器端(我想你仍然可以使用相同的代码从您的应用程序,如果你绝对需要),包括google-api-services-androidpublisher客户端库到您的项目(见https://developers.google.com / API的客户端库/ JAVA的/ apis / androidpublisher / V1 )

正如你所说,你需要一个P12文件的服务帐户(客户端库只接受P12文件)。

然后将下面的代码将验证并得到很好的购买信息:

    HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
    JsonFactory jsonFactory = new JacksonFactory();

    List<String> scopes = new ArrayList<String>();
    scopes.add(AndroidPublisherScopes.ANDROIDPUBLISHER);

    Credential credential = new GoogleCredential.Builder().setTransport(httpTransport).setJsonFactory(jsonFactory)
            .setServiceAccountId(googleServiceAccountId)
            .setServiceAccountPrivateKeyFromP12File(new File(googleServicePrivateKeyPath))
            .setServiceAccountScopes(scopes).build();
    AndroidPublisher publisher = new AndroidPublisher.Builder(httpTransport, jsonFactory, credential).build();
    AndroidPublisher.Purchases purchases = publisher.purchases();
    final Get request = purchases.get(packageName, productId, token);
    final SubscriptionPurchase purchase = request.execute();

    // Do whatever you want with the purchase bean

在Java客户端的认证信息可以在这里找到: https://developers.google.com/identity/protocols/OAuth2ServiceAccount



Answer 5:

我可能误解了你的问题,但我看不到你要使用你引用得到了应用内结算的Android应用程序工作的链接的一个原因。 这页是大有帮助:

http://developer.android.com/guide/google/play/billing/index.html

您可以尝试演示应用程序,他们包括:(地下城- http://developer.android.com/guide/google/play/billing/billing_integrate.html#billing-download )。 使用产品(一次性购买),而不是订阅,但你应该能够修改,以测试你想要的东西。

我认为最关键的,对你来说,会是他们的样本中提供restoreTransactions方法,看看是否谷歌Play帐户中有你的应用程序的任何订阅:

@Override
public void onRestoreTransactionsResponse(RestoreTransactions request, int responseCode) {
    if (responseCode == BillingVars.OK) {                        
        // Update the shared preferences so that we don't perform a RestoreTransactions again.
        // This is also where you could save any existing subscriptions/purchases the user may have.
        SharedPreferences prefs = getSharedPreferences(my_prefs_file, Context.MODE_PRIVATE);
        SharedPreferences.Editor edit = prefs.edit();
        edit.putBoolean(DB_INITIALIZED, true);
        edit.commit();
    } else {
        Log.e(TAG, "RestoreTransactions error: " + responseCode);
    }
}


Answer 6:

如果有人具有公认的帖子最后一步的问题(#7),我发现?access_token= ,而不是工作的?accessToken=

太糟糕了,堆栈溢出不会让我作出这样的评论直接给线程...



Answer 7:

当你有一个Web服务,您的应用程序可以调用,我会建议安全地存储在服务器上你的私钥。 你应该看看尽可能多的应用程序内的东西转移到服务电话,有可能,看到这个链接 。 我实现了应用程序内订阅,但它是之前API的这一部分是出于。 我必须做我自己的登记和安全性验证,但它看起来是这样的API做了大部分的那对你来说,使用OAuth,虽然它看起来像你仍然负责存储订阅请求/验证。

当它谈论签约的智威汤逊与现有的库,但会出现为您提供链接到一个Java库,一个Python库和PHP库 - 这取决于你的Web服务或服务器组件是用(我的是C#,所以我使用的RSACryptoServiceProvider)来验证签名的购买。 他们使用JSON对象数据的实际传输。



文章来源: Am I getting the steps right for verifying a user's Android in-app subscription?