gpt4 book ai didi

android - 来自 C#/.NET 服务的 Google Play Android Developer API - (400) 错误请求

转载 作者:太空狗 更新时间:2023-10-29 15:54:01 26 4
gpt4 key购买 nike

我正在尝试使用 Google API .NET 客户端库从我的 ASP.NET 网络服务器访问购买状态 API,这是使用 Purchase API v1.1 的推荐方式.然而,Authorization page此 API 建议直接向 Google 的 OAuth2 页面发出网络请求,而不是使用相应的客户端库。

好的,我尝试了这两种方法以及我能想象到的所有变化,它们都导致“远程服务器返回错误:(400) 错误请求。”。

现在我已经做了什么来达到我的观点。首先,我在授权页面的创建 API 控制台项目下完成了所有第 1-8 步。接下来,我按照那里的描述生成了一个刷新 token 。在刷新 token 生成过程中,我选择了与我用来发布我的 Android 应用程序(现在处于已发布的测试版状态)相同的 Google 帐户。

接下来,我创建了一个控制台 C# 应用程序,用于在 Visual Studio 中进行测试(可能是控制台应用程序出了问题?)并尝试使用此代码(在某些 Google API 示例中找到)调用 Purchase API:

    private static void Main(string[] args)
{
var provider =
new WebServerClient(GoogleAuthenticationServer.Description)
{
ClientIdentifier = "91....751.apps.googleusercontent.com",
ClientSecret = "wRT0Kf_b....ow"
};
var auth = new OAuth2Authenticator<WebServerClient>(
provider, GetAuthorization);

var service = new AndroidPublisherService(
new BaseClientService.Initializer()
{
Authenticator = auth,
ApplicationName = APP_NAME
});

var request = service.Inapppurchases.Get(
PACKAGE_NAME, PRODUCT_ID, PURCHASE_TOKEN);
var purchaseState = request.Execute();

Console.WriteLine(JsonConvert.SerializeObject(purchaseState));
}

private static IAuthorizationState GetAuthorization(WebServerClient client)
{
IAuthorizationState state =
new AuthorizationState(
new[] {"https://www.googleapis.com/auth/androidpublisher"})
{
RefreshToken = "4/lWX1B3nU0_Ya....gAI"
};

// below is my redirect URI which I used to get a refresh token
// I tried with and without this statement
state.Callback = new Uri("https://XXXXX.com/oauth2callback/");

client.RefreshToken(state); // <-- Here we have (400) Bad request
return state;
}

然后我尝试使用此代码获取访问 token (我在这里找到它:Google Calendar API - Bad Request (400) Trying To Swap Code For Access Token):

    public static string GetAccessToken()
{
var request = WebRequest.Create(
"https://accounts.google.com/o/oauth2/token");
request.Method = "POST";
var postData =
string.Format(
@"code={0}&client_id={1}&client_secret={2}&redirect_uri={3}&grant_type=authorization_code",
// refresh token I got from browser
// also tried with Url encoded value
// 4%2FlWX1B3nU0_Yax....gAI
"4/lWX1B3nU0_Yax....gAI",
// ClientID from Google APIs Console
"919....1.apps.googleusercontent.com",
// Client secret from Google APIs Console
"wRT0Kf_bE....w",
// redirect URI from Google APIs Console
// also tried Url encoded value
// https%3A%2F%2FXXXXX.com%2Foauth2callback%2F
"https://XXXXX.com/oauth2callback/");

byte[] byteArray = Encoding.UTF8.GetBytes(postData);
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = byteArray.Length;
using (var dataStream = request.GetRequestStream())
{
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();
}
try
{
// request.GetResponse() --> (400) Bad request again!
using (var response = request.GetResponse())
{
using (var dataStream = response.GetResponseStream())
{
using (var reader = new StreamReader(dataStream))
{
var responseFromServer = reader.ReadToEnd();
var jsonResponse = JsonConvert.DeserializeObject<OAuth2Response>(responseFromServer);
return jsonResponse.access_token;
}
}
}
}
catch (Exception ex) { var x = ex; }
return null;
}

所以,总结我所有的长篇故事:

  1. 是否可以使用上述任一方法从 C# 控制台应用程序(无需用户交互)通过 OAuth2 授权?
  2. 我仔细检查了重定向 URI(因为我在 stackoverflow 上看到了很多讨论的问题)和其他参数,如 ClientID 和 ClientSecret。在上面的代码中,我还能做错什么?
  3. 我是否需要在刷新 token 中对斜杠进行 URL 编码(我看到使用客户端库的第一种方法做到了)?
  4. 实现我的最终目标(从 ASP.NET 网络服务器购买 API 访问权限)的推荐方法是什么?

最佳答案

我会尽力回答您的最后一个问题。如果您访问自己的数据帐户,则无需在 oAuth2 中使用客户端 ID。让我们使用服务帐户访问 Google Play API。

  1. Google Developer Console 中创建一个服务帐户 > 你的项目 > APIs and auth > Credentials > 创建一个新 key 。您将下载一个 p12 key 。
  2. 创建一个 C# 项目。您可以选择控制台应用程序。
  3. Google.Apis.androidpublisher. Nuget 安装 google play api 库.您可以在 Google APIs Client Library for .NET 中找到 dotnet 的其他库
  4. 在 API 访问中将 google api 项目与您的 google play 帐户相关联

  5. 验证并尝试查询信息。我会尝试列出所有 inapp 项目。您可以更改以获取购买状态

    String serviceAccountEmail = "your-mail-in-developer-console@developer.gserviceaccount.com";

    var certificate = new X509Certificate2(@"physical-path-to-your-key\key.p12", "notasecret", X509KeyStorageFlags.Exportable);

    ServiceAccountCredential credential = new ServiceAccountCredential(
    new ServiceAccountCredential.Initializer(serviceAccountEmail)
    {
    Scopes = new[] { "https://www.googleapis.com/auth/androidpublisher" }
    }.FromCertificate(certificate));


    var service = new AndroidPublisherService(
    new BaseClientService.Initializer()
    {
    HttpClientInitializer = credential,
    ApplicationName = "GooglePlay API Sample",
    });
    // try catch this function because if you input wrong params ( wrong token) google will return error.
    var request = service.Inappproducts.List("your-package-name");
    var purchaseState = request.Execute();

    // var request = service.Purchases.Products.Get(
    //"your-package-name", "your-inapp-item-id", "purchase-token"); get purchase'status



    Console.WriteLine(JsonConvert.SerializeObject(purchaseState));

关于android - 来自 C#/.NET 服务的 Google Play Android Developer API - (400) 错误请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17861063/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com