我正在使用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,签名
答案 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