在做應用開發的時候難免想賺點夥食費什麼的,也就是所謂的收費應用。Windows8裡頭的收費有應用收費和應用內收費
應用收費很簡單在應用發布的‘銷售詳細’時候設定國家然後設定金額就行如
然後就等待使用者點擊購買吧,當然你也可以添加試用功能。
當你選擇的是應用收費的話,你可以在程式中取到當前應用的License(存有應用的相關資訊)這裡面可以判斷當前應用是否處於試用狀態已經認證有效日期。
如果你想添加應用內收費的話,需要在上傳的時候聲明,就是在'進階功能'哪兒如
這裡面的產品ID不要亂輸入應是字串而且是唯一的(相對於這個應用)因為在代碼中要更具這個產品ID來取相關資訊。
當你添加產品ID的時候需要在提要哪兒有一段說明。
好了應用在商店發布的配置已經完成,當程式在調試的時候我們無法擷取到剛剛在上面填寫的所以在開發的時候應該使用CurrentAppSimulator對象。
以下是MSDN的描述
直到應用程式在 Windows 儲存列表中,CurrentApp 對象在應用程式中不起作用。當您開發應用程式時,請使用 CurrentAppSimulator 測試應用程式的授權和應用中擷取。測試應用程式之後,將其提交 Windows Store 之前,將 CurrentAppSimulator 的執行個體替換為 CurrentApp。如果使用CurrentAppSimulator ,您的應用程式將通不過身分識別驗證。
注意 當使用類比時,在 WindowsStoreProxy.xml 中描述應用程式的初始允許狀態。更改許可證狀態的 CurrentAppSimulator 方法(如通過買一個許可證或處理常式內採購)只能更新記憶體中的對象的許可證狀態。不更改 WindowsStoreProxy.xml 內容。當再次啟動應用程式時,許可證狀態還原到 WindowsStoreProxy.xml 中所述。
CurrentAppSimulator 對象從 %userprofile%\appdata\local\packages\<package-moniker>\localstate\microsoft\Windows Store\Apidata 檔案夾中的 WindowsStoreProxy.xml 檔案擷取其資料。您必須為在 CurrentAppSimulator 屬性要類比的方案配置此檔案。
大致的意思是使用模擬器支付的時候需要在程式的路徑下建立一個WindowsStoreProxy.xml 檔案來進行描述。 關於這個檔案的路徑上面已經指出了(複製%userprofile%\appdata\local\packages\,內容粘貼在資源管理員地址欄上面可以跳轉到沒然後更具包的名字找到應用的本地隔離儲存區 (Isolated Storage)目錄)你可以手動的建立也可以不建立(系統會自動建立的)。
而如果你發布到商店裡面的時候就會更具你配置的資訊來產生相應的資訊。
好吧上代碼。
前台添加三個TextBlock 用來顯示當前應用資訊和產品內購資訊、顯示訊息三個Button用來購買應用購買產品 和更新資訊如下代碼:
查看代碼
1 <StackPanel VerticalAlignment="Center" HorizontalAlignment="Center">2 <TextBlock x:Name="appInfo" FontSize="25" />3 <TextBlock x:Name="productInfo" FontSize="25" />4 <Button Content="購買應用" x:Name="btn_BuyApp" Click="btn_Buy_Click" />5 <Button Content="購買產品" x:Name="btn_BuyProduct" Click="btn_BuyProduct_Click" />6 <Button Content="更新資訊" x:Name="btn_Update" Click="btn_Update_Click_1" />7 <TextBlock FontSize="25" x:Name="tb_Info" />8 </StackPanel>
首先得瞭解下面兩個類,這兩個類90%的字母相同 更具我的理解應該是
LicenseInformation 概要資訊 通常可找到的資料(應用當前的名字 ,有多少個收費項目等等)
ListingInformation 詳細資料 應用程式可用許可證的資料(應用當前是否購買的狀態和 內購項目的狀態等等)
使用 Windows.ApplicationModel.Store.CurrentAppSimulator.LicenseInformation;//從模擬器中擷取當前應用的許可證資訊
使用 Windows.ApplicationModel.Store.CurrentApp.LicenseInformation;//從Windows Store中擷取當前應用的許可證資訊
注意,直到應用程式在 Windows 儲存列表中,CurrentApp 對象在應用程式中不起作用,所以在Debug 的時候應該使用的是Windows.ApplicationModel.Store.CurrentAppSimulator.LicenseInformation
在代碼中可以這樣寫
#if DEBUG//如果是調試狀態則調用模擬器否則就...licenseInfo = Windows.ApplicationModel.Store.CurrentAppSimulator.LicenseInformation;#elselicenseInfo = Windows.ApplicationModel.Store.CurrentApp.LicenseInformation;#endif
當使用Windows.ApplicationModel.Store.CurrentAppSimulator.LicenseInformation;的時候 應用會自動檢測%userprofile%\appdata\local\packages\<package-moniker>\localstate\microsoft\Windows Store\Apidata
也就是當前應用的Localstate裡面的WindowsStoreProxy.xml 檔案是否存在如果存在就載入否則就建立一個(還有寫初始資料哦)
應是這個樣子滴
查看代碼
1 <?xml version="1.0" encoding="utf-16" ?> 2 <CurrentApp> 3 <ListingInformation> 4 <App> 5 <AppId>00000000-0000-0000-0000-000000000000</AppId> 6 <LinkUri>http://apps.microsoft.com/webpdp/app/00000000-0000-0000-0000-000000000000</LinkUri> 7 <CurrentMarket>en-US</CurrentMarket> 8 <AgeRating>3</AgeRating> 9 <MarketData xml:lang="en-us">10 <Name>AppName</Name>11 <Description>AppDescription</Description>12 <Price>1.00</Price>13 <CurrencySymbol>$</CurrencySymbol>14 <CurrencyCode>USD</CurrencyCode>15 </MarketData>16 </App>17 <Product ProductId="1" LicenseDuration="0">18 <MarketData xml:lang="en-us">19 <Name>Product1Name</Name>20 <Price>1.00</Price>21 <CurrencySymbol>$</CurrencySymbol>22 <CurrencyCode>USD</CurrencyCode>23 </MarketData>24 </Product>25 </ListingInformation>26 <LicenseInformation>27 <App>28 <IsActive>true</IsActive>29 <IsTrial>true</IsTrial>30 </App>31 <Product ProductId="1">32 <IsActive>true</IsActive>33 </Product>34 </LicenseInformation>35 </CurrentApp>
然後我將他修改成了 應用處於試用狀態而且沒有啟用並且有一個產品id為product1的產品‘10塊購買完整版’價格為 10.00 沒有購買 當前應用的價格是10美元。以下是我修改後的
關於這個xml檔案的介紹可以單擊下面這個串連
猛單擊我
修改後的
1 <?xml version="1.0" encoding="utf-16" ?> 2 <CurrentApp> 3 <ListingInformation> 4 <App> 5 <AppId>9ee87f78-ab14-4cdc-9ba1-0bc20a021054</AppId> 6 <LinkUri>http://apps.microsoft.com/webpdp/app/9ee87f78-ab14-4cdc-9ba1-0bc20a021054</LinkUri> 7 <CurrentMarket>en-US</CurrentMarket> 8 <AgeRating>3</AgeRating> 9 <MarketData xml:lang="en-us">10 <Name>10塊錢你買不了吃虧,也買不了上當</Name>11 <Description>應用購買</Description>12 <Price>10.00</Price>13 <CurrencySymbol>$</CurrencySymbol>14 <CurrencyCode>USD</CurrencyCode>15 </MarketData>16 </App>17 <Product ProductId="product1" LicenseDuration="10">18 <MarketData xml:lang="en-us">19 <Name>10塊購買完整版</Name>20 <Price>10.00</Price>21 <CurrencySymbol>$</CurrencySymbol>22 <CurrencyCode>USD</CurrencyCode>23 </MarketData>24 </Product>25 </ListingInformation>26 <LicenseInformation>27 <App>28 <IsActive>false</IsActive>29 <IsTrial>true</IsTrial>30 </App>31 <Product ProductId="product1">32 <IsActive>false</IsActive>33 </Product>34 </LicenseInformation>35 </CurrentApp>
然後在代碼裡面可以這樣寫:
使用 Windows.ApplicationModel.Store.CurrentAppSimulator.LicenseInformation; 擷取到 LicenseInformation(概要資訊)
使用 await Windows.ApplicationModel.Store.CurrentAppSimulator.LoadListingInformationAsync(); ListingInformation(詳細資料)
寫一個擷取資訊的方法來更新資訊(注意 LicenseInformation和ListingInformation)
View Code
1 private async System.Threading.Tasks.Task GetLicenseInfo() 2 { 3 4 #if DEBUG 5 //如果是調試狀態則調用模擬器否則就xxoo 6 licenseInfo = Windows.ApplicationModel.Store.CurrentAppSimulator.LicenseInformation; 7 #else 8 licenseInfo = Windows.ApplicationModel.Store.CurrentApp.LicenseInformation; 9 #endif10 #if DEBUG11 listingInfo = await Windows.ApplicationModel.Store.CurrentAppSimulator.LoadListingInformationAsync();12 #else13 listingInfo = await Windows.ApplicationModel.Store.CurrentApp.LoadListingInformationAsync();14 #endif15 16 appInfo.Text = "當前應用程式狀態:";17 appInfo.Text += (licenseInfo.IsActive == true ? "已啟用," : "未啟用,");//概要資訊 能得到當前應用是否啟用18 appInfo.Text += (licenseInfo.IsTrial == true ? "試用期." : "非試用期.");//概要資訊 得到當前應用是否處於試用期19 20 21 var product1 = listingInfo.ProductListings["product1"];//詳細資料 取product1的資訊 這個配置在商店裡面'進階功能'配置22 23 productInfo.Text = "內購產品:";24 productInfo.Text += "\"" + product1.Name + "\"";25 productInfo.Text += "價格:" + product1.FormattedPrice;//10塊錢你買不了吃虧,10塊錢你買不了上當26 productInfo.Text += "狀態:" + (licenseInfo.ProductLicenses["product1"].IsActive == true ? "已購買" : "未購買");27 }
然後可以更具定義好的產品ID來實現內購功能 如下代碼
string receipt = "";#if DEBUG receipt = await CurrentAppSimulator.RequestProductPurchaseAsync("product1", true);//第一個參數是產品ID 第二個是是否返回傳票(一些資訊) 一般為false#else await CurrentApp.RequestProductPurchaseAsync("product1", false);#endif
View Code
1 //在應用程式內購買功能 2 var product1 = licenseInfo.ProductLicenses["product1"];//取product1的資訊 3 4 if (!product1.IsActive) 5 { 6 tb_Info.Text = "購買產品中"; 7 try 8 { 9 10 string receipt = "";11 #if DEBUG12 receipt = await CurrentAppSimulator.RequestProductPurchaseAsync("product1", true);//第一個參數是產品ID 第二個是是否返回傳票 一般為false13 #else14 await CurrentApp.RequestProductPurchaseAsync("product1", false);15 #endif16 if (licenseInfo.ProductLicenses["product1"].IsActive)17 {18 tb_Info.Text = "購買成功!";19 Debug.WriteLine("列印發票:" + receipt);20 }21 22 }23 catch (Exception)24 {25 tb_Info.Text = "沒有購買成功!";26 }27 }28 else29 {30 tb_Info.Text = "您已經購買了該功能!";31 }
還有購買應用的功能
1 string receipt = "";2 #if DEBUG3 receipt = await CurrentAppSimulator.RequestAppPurchaseAsync(true);//購買應用 要發票!4 #else5 await CurrentApp.RequestAppPurchaseAsync(false);6 #endif
View Code
1 if (licenseInfo.IsTrial) 2 { 3 try 4 { 5 6 string receipt = ""; 7 #if DEBUG 8 receipt = await CurrentAppSimulator.RequestAppPurchaseAsync(true);//購買應用 要發票! 9 #else10 await CurrentApp.RequestAppPurchaseAsync(false);11 #endif12 if (licenseInfo.IsActive)13 {14 tb_Info.Text = "購買成功!";15 Debug.WriteLine("列印發票:" + receipt);16 }17 }18 catch (Exception)19 {20 tb_Info.Text = "沒有購買成功!";21 }22 23 }24 else25 {26 tb_Info.Text = "錢很多嗎?您已經購買了本應用!";27 }
需要注意的是
當使用類比時,在 WindowsStoreProxy.xml 中描述應用程式的初始允許狀態。更改許可證狀態的 CurrentAppSimulator 方法(如通過買一個許可證或處理常式內採購)只能更新記憶體中的對象的許可證狀態。不更改 WindowsStoreProxy.xml 內容。當再次啟動應用程式時,許可證狀態還原到 WindowsStoreProxy.xml 中所述
而如果發布到商店的時候 應該會儲存在系統中(我沒有測試過)而且相對於儲存在其他位置比較安全
判斷使用者是否購買應用或者是購買內購的時候 一定不要把狀態儲存到 ApplicationData.Current.LocalSettings 或者其他Setting裡面 因為這裡面相當的不安全!加密也不安全!
在應用程式套件的安裝路徑下的Settings檔案夾下面的settings.dat檔案就是setting存放的位置 微軟竟然沒有加密他!用複製到其他程式裡面寫個遍曆就出來了。。。。
運行起來的效果如下
模擬器裡裡頭可以返回相應的資訊。
關於那個 WindowsStoreProxy.xml檔案你可以使用 CurrentAppSimulator.ReloadSimulatorAsync 來載入一個自訂的xml檔案 在微軟給的Demo裡頭有介紹的。
整體上感覺Windows8的支付模式不大安全,前段時間國外的駭客已經出了工具可以把收費的應用變成已購買,竟然還是開源的...
聽說新浪有個支付系統看起來挺牛x的..
如果誰有更好的辦法可歡迎來告訴我。
ps:一個好的應用是在免費的情況下還能帶來盈利!
歡迎轉載,轉載請註明來自BeyondBlog的部落格