c# - purchase.products.get 忽略 productId 值并在 ProductPurchase 中返回 null
问题描述
我正在向google Android Publisher api发出请求,以检查提供的应用内购买的 purchaseToken 是否正确。第一个问题是产品 ID 被忽略,我可以输入任何内容作为参数。只有包名和购买令牌需要正确。其次,为什么 ProductPurchase 中的 productId 和 purchaseToken 为空。我想检查提供的 purchaseToken 是否与 productId 匹配。当 productId 可以是任何东西并且它没有作为响应返回时,我如何检查这对于特定的应用内购买 productId 是否有效?
private static Task<ProductPurchase> GetInAppPurchase(string packageName, string productId, string purchaseToken)
{
GoogleCredential credential;
using (Stream stream = new FileStream(@"api.json", FileMode.Open, FileAccess.Read, FileShare.Read))
{
credential = GoogleCredential.FromStream(stream);
}
string[] scopes = {
AndroidPublisherService.Scope.Androidpublisher
};
credential = credential.CreateScoped(scopes);
BaseClientService.Initializer initializer = new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = "My Application"
};
AndroidPublisherService service = new AndroidPublisherService(initializer);
return service.Purchases.Products.Get(packageName, productId, purchaseToken).ExecuteAsync();
}
private static void TestGooglePlayPurchaseApi()
{
string packageName = "validPackageName";
string productId = "validOrInvalidProductName";
string purchaseToken = "validPurchaseToken";
ProductPurchase purchase = GetInAppPurchase(packageName, productId, purchaseToken).Result;
Console.WriteLine("Kind: " + purchase.Kind);
Console.WriteLine("Quantity: " + purchase.Quantity);
Console.WriteLine("AcknowledgementState: " + purchase.AcknowledgementState!);
Console.WriteLine("ConsumptionState: " + purchase.ConsumptionState!);
Console.WriteLine("DeveloperPayload: " + purchase.DeveloperPayload);
Console.WriteLine("ETag: " + purchase.ETag);
Console.WriteLine("OrderId: " + purchase.OrderId);
Console.WriteLine("ProductId: " + purchase.ProductId);
Console.WriteLine("PurchaseState: " + purchase.PurchaseState!);
Console.WriteLine("PurchaseToken: " + purchase.PurchaseToken);
Console.WriteLine("PurchaseType: " + purchase.PurchaseType!);
Console.WriteLine("RegionCode: " + purchase.RegionCode);
Console.WriteLine("PurchaseTimeMillis: " + purchase.PurchaseTimeMillis);
Console.WriteLine("ObfuscatedExternalAccountId: " + purchase.ObfuscatedExternalAccountId);
Console.WriteLine("ObfuscatedExternalProfileId: " + purchase.ObfuscatedExternalProfileId);
}
这就是我正在接受的:
Kind: androidpublisher#productPurchase
Quantity:
AcknowledgementState: 1
ConsumptionState: 1
DeveloperPayload: {"developerPayload":"","is_free_trial":false,"has_introductory_price_trial":false,"is_updated":false,"accountId":""}
ETag:
OrderId: YYY.XXXX-XXXX-XXXX-XXXXX
ProductId:
PurchaseState: 0
PurchaseToken:
PurchaseType: 0
RegionCode: PL
PurchaseTimeMillis: 1601915754698
ObfuscatedExternalAccountId:
ObfuscatedExternalProfileId:
为什么 ProductId 为空?
解决方案
如果您的数据库中只有一项,它将为空。很奇怪,但它就是这样。添加相同类别的第二个项目,您将开始获得适当的值作为响应。
推荐阅读
- php - 带有 Gmail SMTP 的 PHPMailer 6 联系表
- android - 如何更新选项菜单项图标?
- html - 比视口更宽的 div
- graphql - 在 Apollo Server 中调用另一个解析器的最佳方式是什么?
- cron - 厨师食谱中的多个 cron 作业
- c - 如何修复我的 `itoa` 实现,使其不打印反向输出?
- java - 在 Java 中使用 .hasNextInt() 进行一些简单的异常处理有问题吗?
- django - 在 Ubuntu 16.04 中使用 Django send_mail 从 office365 发送电子邮件时出现 SMTPSenderRefused 错误?
- python - 当特定文件夹更改时在 Jenkins 中构建触发器
- angular - 如何在Angular中将对象数组映射到formarray