Asp.net web api 从.NET Web API访问Google Play Android开发者API

Asp.net web api 从.NET Web API访问Google Play Android开发者API,asp.net-web-api,google-api,google-api-dotnet-client,Asp.net Web Api,Google Api,Google Api Dotnet Client,以下是我正在使用的代码,对于本例进行了简化: Public PackageName As String = "com.yourdomain.app" Public InAppPurchaseProductID As String = "com.yourdomain.app.subscriptionXYZ" Public PublicLicenseKey As String = "YOUR_LONG_ENCODED_LICENSE_KEY" Public ConsolePrivateKeyCert

以下是我正在使用的代码,对于本例进行了简化:

Public PackageName As String = "com.yourdomain.app"
Public InAppPurchaseProductID As String = "com.yourdomain.app.subscriptionXYZ"
Public PublicLicenseKey As String = "YOUR_LONG_ENCODED_LICENSE_KEY"
Public ConsolePrivateKeyCertificateData As Byte() 'method for reading p12 file contents left out for simplicity
Public ConsoleCertificate As X509Certificate2 = New X509Certificate2(ConsolePrivateKeyCertificateData, "notasecret", X509KeyStorageFlags.MachineKeySet Or X509KeyStorageFlags.Exportable)
Public ConsoleServiceAccountEmail As String = "console-generated-account-here@developer.gserviceaccount.com"
Public ConsoleApplicationName As String = "I just realized this may be my issue. Not sure what this value should be!"

Public Function VerifySubscriptionReceipt(ByRef expirationDate As DateTime,
                                          ByRef purchaseDate As DateTime,
                                          token As String,
                                          purchasedProductID As String,
                                          signature As String,
                                          rawJSONData As String) As Boolean?

    'First: basic check to verify the receipt matches the product you will deliver
    If Not purchasedProductID = InAppPurchaseProductID Then
        Return Nothing
    End If

    'Second: verify receipt signature
    Dim rkp As RsaKeyParameters = CType(PublicKeyFactory.CreateKey(Convert.FromBase64String(PublicLicenseKey)), RsaKeyParameters)
    Dim rsaParams As New RSAParameters
    rsaParams.Modulus = rkp.Modulus.ToByteArrayUnsigned
    rsaParams.Exponent = rkp.Exponent.ToByteArrayUnsigned
    Dim rsaProvider As New RSACryptoServiceProvider
    rsaProvider.ImportParameters(rsaParams)

    If Not rsaProvider.VerifyData(Encoding.UTF8.GetBytes(rawJSONData), CryptoConfig.MapNameToOID("SHA1"), Convert.FromBase64String(signature)) Then
        Return Nothing
    End If

    'Third: check subscription status
    Dim result As SubscriptionPurchase
    Dim serviceInitializer As New AndroidPublisherService.Initializer With
        {
            .HttpClientInitializer = New ServiceAccountCredential(New ServiceAccountCredential.Initializer(ConsoleServiceAccountEmail) With
                                                                  {
                                                                      .Scopes = New String() {"https://www.googleapis.com/auth/androidpublisher"}
                                                                  }.FromCertificate(ConsoleCertificate)),
            .ApplicationName = ConsoleApplicationName
        }

    Using service As New AndroidPublisherService(serviceInitializer)

        '*** Error thrown on this line. Google returning 403 Forbidden ***
        result = service.Purchases.Get(PackageName, InAppPurchaseProductID, token).Execute

    End Using

    If Not result.AutoRenewing.HasValue And
            result.ValidUntilTimestampMsec.HasValue And
            result.InitiationTimestampMsec.HasValue Then
        Throw New KeyNotFoundException("The subscription does not appear to be valid. (token: " & token & ")")
    End If

    expirationDate = New DateTime(result.ValidUntilTimestampMsec.Value)
    purchaseDate = New DateTime(result.InitiationTimestampMsec.Value)

    Return result.AutoRenewing.Value

End Function
因此,在查看示例的代码时,我意识到可能的问题是我不知道
ConsoleApplicationName
应该是什么。我曾经尝试过使用谷歌开发者控制台上的“项目名称”和“项目ID”,但都没有效果


代码一直运行,直到Google返回403异常。

这篇相关文章解决了我的403错误问题:

它现在正在工作。至于ConsoleApplicationName,我甚至不确定它是否是必填字段。可能会被完全忽略。这个值似乎并不重要


我必须说,谷歌不可能让这件事变得更令人困惑,或者记录得更糟糕。但它最终还是起作用了

我同意,尽管有很多关于各种Google API的文档,但确实感觉有点零碎,很难确定进行oauth2身份验证和端到端请求的所有适当步骤。如果你有任何进一步的运气,请告诉我。嗨,我不是这个API的专家(我实际上从未使用过它),但我绝对是谷歌API的.NET客户端库的人:)重新升级OAuth 2.0协议-我建议你阅读以下页面-。你能详细介绍一下签名过程吗?同时,我会联系谷歌Play Android开发者API的所有者。你也应该看看这个页面:谢谢你回复我。我想我在客户端库方面取得了一些进展。我认为安装过程的一个建议是Google.api.Auth应该设置为nuget依赖项。大多数情况下,我认为android publisher库的文档需要很多帮助。它似乎在服务帐户和Web帐户之间来回跳跃,而让它从头到尾跟踪每个选项并给出两者的用例则更为有用。在我的例子中,我想我发现我需要使用服务帐户。我还没有做过很多测试,但是假设我现在可以通过客户端库调用Get/Cancel来访问购买状态API,这就解决了上面的第3个问题。不过,我找不到任何关于Android商店返回的验证签名格式的文档。它只是公共许可证密钥,我可以进行基本的字符串比较吗?还是使用公钥对订单数据进行某种类型的散列?我的计划是首先以某种方式验证签名,然后与客户端库检查状态,如果两者都好,则交付产品。听起来不错?@peleyal我使用的代码似乎在本地的开发机器上工作,但在Windows Azure上不工作,因为行
var certificate=new X509Certificate2(@“key.p12”,“notasecret”,X509keystargeFlags.Exportable)抛出一个错误。经过一些研究,我发现在Azure上,我必须使用
x509keystrageflags.MachineKeySet
。但是我得到了以下错误: