初めてのWindows Phone開発体験:アプリ内購入





この記事では、Daily Horoscopeアプリケーションの例を使用して、モバイルWindows Phone 8アプリケーションで内部支払いを使用する可能性について説明します。

このトピックが面白い場合は、猫をお願いします。



現時点では、dev.windowsphone.comには、アプリケーションの無料版、有料版、試用版/デモ版、およびアプリ内購入を作成する機能があります。 また、アプリ内購入は消耗品であり永続的です。 私のアプリケーションでは、「定数」(図1)を使用しました。つまり、ユーザーはアプリケーションをインストールし、追加の機能に対して1回支払います。 「永久」には有効期間を設定することも、緊急期間を設定しないこともできます。 「永続的」の例は、武器またはユニークなレシピの購入であり、有効期間があれば、雑誌またはライセンスを読むためのサブスクリプションです。 「拡張可能」とは、アプリケーション(クリスタル)の通貨に起因するものです。 レシピが多数あり、購入のレシピごとに「内部製品」を作成しないようにするには、消耗品を使用できます。購入は開発者によって制御されます。 コードを実装する際の最も重要なことは、非同期リクエストを行うために長時間行われるすべてを試すことです。そうしないと、モデレーターはそのようなアプリケーションを見逃すことはありません。



注:ユーザーが購入するまでプログラムの試用版がある場合、アプリ内支払いは機能しません。



画像

図 1-アプリ内購入UIの例



支払いをテストするために、特別なMockIAPLibライブラリを使用できます- 詳細[EN]テストは戦闘条件に可能な限り近いものです。





図2-ベータ版で購入



では、アプリ内課金をどのように作成しますか?



1. WP Dev Centerに移動して、「Submit Application」リンクをクリックします。

2.「アプリケーション情報」(私の場合、アプリケーションは完全に無料です)を入力すると、すぐに「詳細設定」セクション、リリースまたはベータ版などに表示されます...

3.左側のメニューで[アプリケーション]を選択すると、新しく作成されたアプリケーションが見つかります。 [製品]タブに移動し、製品を作成します。必要な主なものは[製品ID]です。

4.ここでプロジェクトを開き、その中のWMAppManifest.xmlファイルを開いてから、[Packing]タブに移動します。 製品IDの内容を見てください。これは、Dev Center WPのアプリケーションに関する情報で示されている内容と一致する必要があります-「アプリケーションID」。



完了しました。空のアプリケーションと、このアプリケーションの製品があります。 スクリーンショットが面白い場合は、 ここで見ることができます[EN]



依存関係:

using Windows.ApplicationModel.Store; using Store = Windows.ApplicationModel.Store;
      
      







製品が動的に表示される場合、アプリケーションで製品のリストを表示します。

コード
 private async void btnListAllProducts_Click_1(object sender, RoutedEventArgs e) { StringBuilder sb = new StringBuilder(); var listing = await CurrentApp.LoadListingInformationAsync(); foreach (var product in listing.ProductListings) { sb.AppendLine(string.Format("{0}, {1}, {2},{3}, {4}", product.Key, product.Value.Name, product.Value.FormattedPrice, product.Value.ProductType, product.Value.Description)); } MessageBox.Show(sb.ToString(), "List all products", MessageBoxButton.OK); }
      
      





ユーザーはインターネットの質が悪いかもしれないので、アプリケーションがハングしていないことを示してください。



継続的な購入の実現:

コード
 async private void btnBuy_Click_1(object sender, RoutedEventArgs e) { //     var listing=await CurrentApp.LoadListingInformationAsync(); var superweapon= listing.ProductListings.FirstOrDefault( p => p.Value.ProductId == "  ID " ); try { //,     if (CurrentApp.LicenseInformation.ProductLicenses[superweapon.Value.ProductId].IsActive) { MessageBox.Show("  !"); } else { //  UI    .  receipt = await CurrentApp.RequestProductPurchaseAsync(superweapon.Value.ProductId, false); //  -   var productLicenses = CurrentApp.LicenseInformation.ProductLicenses; ProductLicense tokenLicense = productLicenses["  ID "]; if (tokenLicense.IsActive)//    { //  ,   IsolatedStorageSettings,    txtBoughtSW.Visibility=System.Windows.Visibility.Visible; txtBoughtSW.Text="  "; } else { //    } } } catch (Exception ex) { //        MessageBox.Show(ex.ToString()); } }
      
      





シンプルに保ち、情報のリストを取得し、必要に応じて処理する方法。 ユーザーUIの購入を示し、結果を待っています。



使用済み購入の例:

コード
 async private void btnBuy50Points_Click_1(object sender, RoutedEventArgs e) { // 50 Points -      var listing=await CurrentApp.LoadListingInformationAsync(); var fiftypoints= listing.ProductListings.FirstOrDefault( p => p.Value.ProductId == "  ID " ); try { // UI  receipt=await CurrentApp.RequestProductPurchaseAsync(fiftypoints.Value.ProductId, false); if (CurrentApp.LicenseInformation.ProductLicenses[fiftypoints.Value.ProductId].IsActive) { // 50  m_pointCount+=50; //  ,  "",         50  CurrentApp.ReportProductFulfillment(fiftypoints.Value.ProductId); txtBought50Pts.Visibility=System.Windows.Visibility.Visible; txtBought50Pts.Text= "Bought 50 Points " + i++ + " times for a total of " + m_pointCount + "!"; } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } }
      
      





消耗品と永久購入の唯一の違いは、消耗品では、購入応答を処理したことを「ストア」に通知することが必須であることです。 そうしないと、コマンドを実行するまで、ユーザーは製品(クリスタル)を再度購入できません。

 CurrentApp.ReportProductFulfillment(fiftypoints.Value.ProductId);
      
      





また、購入した製品に関するストレージも開発者にあります。 ユーザーがアプリケーションをアンインストールして再インストールできることを心配する必要があり、開発者はそれを正しく識別する必要があります。



私のアプリケーションでの定期購入の実装例:

コード
 private async void Button_Click(object sender, RoutedEventArgs e) { //,     if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()) { ******     ***** try { //      ListingInformation LicensePremiumID = await Store.CurrentApp.LoadListingInformationByProductIdsAsync(new string[] { "ID" }); //  string x = await CurrentApp.RequestProductPurchaseAsync(LicensePremiumID.ProductListings.ToList()[0].Value.ProductId, false); //  var productLicenses = CurrentApp.LicenseInformation.ProductLicenses; ProductLicense tokenLicense = productLicenses["ID"]; if (tokenLicense.IsActive)//    { IsolatedStorageSettings.ApplicationSettings[" "] = "1";// AppSetting.ApplicationFullVersiy = true; // ,    !      //CurrentApp.ReportProductFulfillment(tokenLicense.ProductId); MessageBox.Show("«  Premium»  .   !"); *** } else { MessageBox.Show("IsActive - false"); *** } } catch (Exception ex) { //MessageBox.Show(ex.ToString()); MessageBox.Show("*****"); } } else { MessageBox.Show("  ..."); } }
      
      







ユーザーがすでに購入したことがある場合:

コード
  private void Button_Click_1(object sender, RoutedEventArgs e) { if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()) { *** try { var productLicenses = CurrentApp.LicenseInformation.ProductLicenses; ProductLicense tokenLicense = productLicenses["ID"]; if (tokenLicense.IsActive)//    { IsolatedStorageSettings.ApplicationSettings["ept"] = "1";// AppSetting.ApplicationFullVersiy = true; **** MessageBox.Show("«  Premium»  ."); } else { MessageBox.Show("«  Premium»  ."); } } catch (Exception ex) { //MessageBox.Show(ex.ToString()); MessageBox.Show("****.."); } } else { MessageBox.Show("  ..."); } }
      
      







結果:

非表示のテキスト








ゲームの実装は、Windows Storと同様です。 何かを説明するのを忘れた場合、コメントを書いてください。すべての質問にお答えできることを嬉しく思います。



オフトップ
ロシアのインターネットで包括的な情報を見つけられなかったため、アプリ内課金について話をすることにしました。それについて知りたい、コメントを書いてくれる人がいるだろう、私はまた、私がPRだと思わないようにアプリケーションへのリンクを残さない、それは名前で簡単に見つけられる



All Articles