如何在Windows 10应用中实施应用内购买? [英] How to Implement In-App Purchases in Windows 10 Apps?
问题描述
我想将应用内购买集成到我的Windows通用应用中。在编码之前,我先做以下事情。
-
在
-
如果不返回任何内容,则很有可能在
WindowsStoreProxy.xml
中出错。我建议您创建自己的WindowsStoreProxy.xml
并使用CurrentAppSimulator.ReloadSimulatorAsync
方法读取它,如下所示:var文件=等待Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(@ Testing\WindowsStoreProxy.xml);
等待CurrentAppSimulator.ReloadSimulatorAsync(file);
-
对我来说,使用
C:\Users中的默认值user<用户名> \AppData\Local\Packages\<应用程序包文件夹> \LocalState\Microsoft\Windows Store\ApiData\WindowsStoreProxy.xml
不起作用,但是一个简单的更改已经解决了问题:我更改了此部分< LicenseInformation>
< App>
< IsActive> true< / IsActive>
< IsTrial> true< / IsTrial>
< / App>
< / LicenseInformation>
到此:
<许可证信息>
< App>
< IsActive> true< / IsActive>
< IsTrial> false< / IsTrial>
< / App>
< / LicenseInformation>
(因此
IsTrial
设置为false。 ..) -
现在我也想提一下,这有点奇怪,因为默认情况下是
WindowsStoreProxy.xml
没有为我的应用内购买定义产品。因此,对于我的 RemoveAds,正确的WindowsStoreProxy.xml
如下所示:<?xml version = 1.0 encoding = utf-16吗?
< CurrentApp>
< ListingInformation>
< App>
< AppId> 00000000-0000-0000-0000-000000000000< / AppId>
< LinkUri> http://apps.microsoft.com/webpdp/app/00000000-0000-0000-0000-000000000000< / LinkUri>
< CurrentMarket> zh-CN< / CurrentMarket>
< AgeRating> 3< / AgeRating>
< MarketData xml:lang = zh-CN>
< Name> AppName< / Name>
< Description> AppDescription< / Description>
< Price> 1.00< / Price>
< CurrencySymbol> $< / CurrencySymbol>
< CurrencyCode> USD< / CurrencyCode>
< / MarketData>
< / App>
< Product ProductId = RemoveAds LicenseDuration = 1 ProductType = Durable>
< MarketData xml:lang = zh-CN>
< Name> RemoveAds< / Name>
< Price> 1.00< / Price>
< CurrencySymbol> $< / CurrencySymbol>
< CurrencyCode> USD< / CurrencyCode>
< / MarketData>
< / Product>
< / ListingInformation>
< LicenseInformation>
< App>
< IsActive> true< / IsActive>
< IsTrial> false< / IsTrial>
< / App>
< Product ProductId = 1>
< IsActive> true< / IsActive>
< / Product>
< / LicenseInformation>
< ConsumableInformation>
<产品ProductId = RemoveAds TransactionId = 10000000-0000-0000-0000-000000000000 Status =有效 />
< / ConsumableInformation>
< / CurrentApp>
-
我要指出的另一件事是
CurrentAppSimulator具有两个参数的.RequestProductPurchaseAsync
已过时。省略true参数,您将得到PurchaseResults
实例作为结果,该实例包含ReceiptXML
属性中的收据。
I want to integrate in-app purchasing in my windows universal app. I do the following thing before coding.
Make App on Windows Dev Center
Add products with details in IAPs section and submit to Store as you can see in Image
- After that I use the following code in my app to get list of products of In-App purchasing and button to purchase product. I also used
CurrentApp
instead ofCurrentAppSimulator
in my code but it goes in exception.
private async void RenderStoreItems()
{
picItems.Clear();
try
{
//StoreManager mySM = new StoreManager();
ListingInformation li = await CurrentAppSimulator.LoadListingInformationAsync();
System.Diagnostics.Debug.WriteLine(li);
foreach (string key in li.ProductListings.Keys)
{
ProductListing pListing = li.ProductListings[key];
System.Diagnostics.Debug.WriteLine(key);
string status = CurrentAppSimulator.LicenseInformation.ProductLicenses[key].IsActive ? "Purchased" : pListing.FormattedPrice;
string imageLink = string.Empty;
picItems.Add(
new ProductItem
{
imgLink = key.Equals("BaazarMagzine101") ? "block-ads.png" : "block-ads.png",
Name = pListing.Name,
Status = status,
key = key,
BuyNowButtonVisible = CurrentAppSimulator.LicenseInformation.ProductLicenses[key].IsActive ? false : true
}
);
}
pics.ItemsSource = picItems;
}
catch (Exception e)
{
System.Diagnostics.Debug.WriteLine(e.ToString());
}
}
private async void ButtonBuyNow_Clicked(object sender, RoutedEventArgs e)
{
Button btn = sender as Button;
string key = btn.Tag.ToString();
if (!CurrentAppSimulator.LicenseInformation.ProductLicenses[key].IsActive)
{
ListingInformation li = await CurrentAppSimulator.LoadListingInformationAsync();
string pID = li.ProductListings[key].ProductId;
string receipt = await CurrentAppSimulator.RequestProductPurchaseAsync(pID, true);
System.Diagnostics.Debug.WriteLine(receipt);
// RenderStoreItems();
}
}
I also Associate my app with Store and my app package is same as in MS Dev Center App as you can see in Image
When I run my app and click on Buy button, I got this dialogue box as you can see in Image after that I did not get receipt data from Store.
If I'm doing wrong then Please give me proper guide to implement the In-app purchase and test that In-app purchase in my laptop device.
I also had this issue and the problem was in the WindowsStoreProxy.xml
file.
Solution in short
By default in the WindowsStoreProxy.xml
the IsTrial
is set to true and in that mode in-app purchases do not seem to work. When I changed it to false it started to work for me.
Solution a little bit longer
So first of all here we are talking about the simulation of an In-App Purchase in development time (by using the
CurrentAppSimulator
class). In that case you need aWindowsStoreProxy.xml
file. It’s described hereNow the window you showed is opened by the
CurrentAppSimulator.RequestProductPurchaseAsync
line. It basically controls the return value of a Windows Runtime native method (which is very strange for me… I think it’s not intentional by Microsoft… something else should be done there), but if you let it returnS_OK
that basically is the case when the user paid for the in-App Purchase.When it returns nothing then with very high probability something in the
WindowsStoreProxy.xml
is wrong. I suggest you to create your ownWindowsStoreProxy.xml
and read it with theCurrentAppSimulator.ReloadSimulatorAsync
method like this:var file = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(@"Testing\WindowsStoreProxy.xml"); await CurrentAppSimulator.ReloadSimulatorAsync(file);
For me using the default one from
C:\Users\<username>\AppData\Local\Packages\<app package folder>\LocalState\Microsoft\Windows Store\ApiData\WindowsStoreProxy.xml
did not work, but a single change already solved the problem: I changed this part<LicenseInformation> <App> <IsActive>true</IsActive> <IsTrial>true</IsTrial> </App> </LicenseInformation>
To this:
<LicenseInformation> <App> <IsActive>true</IsActive> <IsTrial>false</IsTrial> </App> </LicenseInformation>
(So
IsTrial
was set to false...)Now at this point I also would like to mention that this was a little bit strange, since in in the default
WindowsStoreProxy.xml
there was no Product defined for my In-App Purchase. So for my "RemoveAds" a properWindowsStoreProxy.xml
would be something like this:<?xml version="1.0" encoding="utf-16" ?> <CurrentApp> <ListingInformation> <App> <AppId>00000000-0000-0000-0000-000000000000</AppId> <LinkUri>http://apps.microsoft.com/webpdp/app/00000000-0000-0000-0000-000000000000</LinkUri> <CurrentMarket>en-US</CurrentMarket> <AgeRating>3</AgeRating> <MarketData xml:lang="en-US"> <Name>AppName</Name> <Description>AppDescription</Description> <Price>1.00</Price> <CurrencySymbol>$</CurrencySymbol> <CurrencyCode>USD</CurrencyCode> </MarketData> </App> <Product ProductId="RemoveAds" LicenseDuration="1" ProductType="Durable"> <MarketData xml:lang="en-US"> <Name>RemoveAds</Name> <Price>1.00</Price> <CurrencySymbol>$</CurrencySymbol> <CurrencyCode>USD</CurrencyCode> </MarketData> </Product> </ListingInformation> <LicenseInformation> <App> <IsActive>true</IsActive> <IsTrial>false</IsTrial> </App> <Product ProductId="1"> <IsActive>true</IsActive> </Product> </LicenseInformation> <ConsumableInformation> <Product ProductId="RemoveAds" TransactionId="10000000-0000-0000-0000-000000000000" Status="Active" /> </ConsumableInformation> </CurrentApp>
Another thing I would like to point out is that the
CurrentAppSimulator.RequestProductPurchaseAsync
with two parameter is obsolete. Leave the true parameter out and you getPurchaseResults
instance as the result, which contains the receipt in theReceiptXML
property.
这篇关于如何在Windows 10应用中实施应用内购买?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!