如何在Xamarin Android中验证应用内购买?

时间:2019-01-10 18:29:54

标签: c# android xamarin xamarin.android in-app-purchase

我正在使用https://www.nuget.org/packages/Plugin.InAppBilling上的Xamarin Android和Plugin.InAppBilling。我已经在项目中成功集成了插件,并且能够购买和使用测试产品。

现在我要验证购买。插件有此文档https://jamesmontemagno.github.io/InAppBillingPlugin/SecuringPurchases.html

什么是DependencyService以及如何获取signedData签名以传递给InAppBillingSecurity.VerifyPurchase方法?此问题表明它不需要DependencyService https://github.com/jamesmontemagno/InAppBillingPlugin/issues/203

在同一文档中也提到将游戏商店公钥放在下面的行中。那么我应该直接将密钥分为三个部分并粘贴到XOR_key1,XOR_key2和XOR_key3的位置吗?


    const string key1 = @"XOR_key1";
    const string key2 = @"XOR_key2";
    const string key3 = @"XOR_key3";  


我很困惑,没有找到任何实时示例或分步指南。谁能帮助我理解这一点?

检查我的代码的附件图片。购买后,它将返回大量参数,但不会返回signedData,签名

enter image description here

1 个答案:

答案 0 :(得分:2)

Dependency Service允许您从.NET Standard共享项目中调用平台特定的代码。

Plugin.InAppBilling已经创建了要在每个平台上实现的接口,因此您要做的就是在每个平台项目中实现LoginAysnc接口。界面中只有一种方法:

IInAppBillingVerifyPurchase

因此,基本上在每个平台项目中,您都需要添加如下所示的类文件:

Task<bool> VerifyPurchase(string signedData, string signature, string productId = null, string transactionId = null);

以上内容直接来自您链接的文档。您会看到将密钥分为三部分仅与Android有关,因此存在编译器指令,以便密钥转换的代码只能在Android上运行(确保您拥有[assembly: Dependency (typeof (InAppBillingVerify))] namespace YourPlatformProjectNameSpace { public class InAppBillingVerify : IInAppBillingVerifyPurchase { const string key1 = @"XOR_key1"; const string key2 = @"XOR_key2"; const string key3 = @"XOR_key3"; public Task<bool> VerifyPurchase(string signedData, string signature) { #if __ANDROID__ var key1Transform = Plugin.InAppBilling.InAppBillingImplementation.InAppBillingSecurity.TransformString(key1, 1); var key2Transform = Plugin.InAppBilling.InAppBillingImplementation.InAppBillingSecurity.TransformString(key2, 2); var key3Transform = Plugin.InAppBilling.InAppBillingImplementation.InAppBillingSecurity.TransformString(key3, 3); return Task.FromResult(Plugin.InAppBilling.InAppBillingImplementation.InAppBillingSecurity.VerifyPurchase(key1Transform + key2Transform + key3Transform, signedData, signature)); #else return Task.FromResult(true); #endif } } } {{3 }}(对于Android项目)。对于iOS和UWP,所有操作都返回true。这对UWP很好(请参见下文),但对于iOS,您可能需要解析__ANDROID__。验证后再看回来。

如果我正在阅读正确链接的文档,则插件应调用signedData方法。然后在插件中,VerifyPurchase方法的参数值是(来自您链接的文档):

VerifyPurchase

因此,在iOS上,签名的数据将为“以64位基本编码形式的字符串形式的完整收据”,而签名将为空。

在Android上,签名的数据将是“从Google返回的购买数据”,而签名将是从Google返回的数据签名。

在UWP上,您最好不要执行任何操作,而是从此方法返回true,因为UWP不会将任何内容传递给此方法。

有关处理Android密钥的更多讨论,请参见symbol defined in the project properties

编辑:因此,看来您需要将实现iOS signedData: Full Receipt as a string in Base 64 Encoding signature: Always empty string Android signedData: Purchase Data returned from Google signature: Data Signature returned from Google UWP No additional authentication is provided. 的类传递给IInAppBillingVerifyPurchase方法,以使PurchaseAsync方法成为称为,例如:

VerifyPurchase

并添加var verify = new Verify(); //try to purchase item // Here is where you pass in the class that implements IInAppBillingVerifyPurchase.VerifyPurchase method var purchase = await CrossInAppBilling.Current.PurchaseAsync(productId, ItemType.InAppPurchase, "apppayload", verify); if(purchase == null) { //Not purchased, may also throw excpetion to catch } else { //Purchased! } 类:

Verify