共用方式為


應用程式內購買和試用

Windows SDK 提供 API,您可以用來實作下列功能,以從通用 Windows 平臺 (UWP) 應用程式賺更多錢:

  • 應用程式內購買 無論您的應用程式是否免費,都可以在應用程式中直接銷售內容或新的應用程式功能(例如解鎖遊戲的下一個關卡)。

  • 試用版功能 如果您在 合作夥伴中心將您的應用程式設定為免費試用,您可以藉由排除或限制試用期間的某些功能,吸引客戶購買應用程式的完整版本。 您也可以在客戶購買您的應用程式之前,啟用只在試用期間顯示的功能,例如橫幅或浮浮水印。

本文提供UWP app內購買和試用版運作方式的概觀。

這很重要

目前提升型應用程式不支援應用程式內購買功能。

選擇要使用的命名空間

有兩個不同的命名空間可用來將App內購買和試用版功能新增至您的UWP app,視您的應用程式目標 Windows 10 或 Windows 11 版本而定。 雖然這些命名空間中的 API 會提供相同的目標,但它們的設計方式大不相同,而且兩個 API 之間的程式碼不相容。

  • Windows.Services.Store 從 Windows 10 版本 1607 開始,應用程式可以使用此命名空間中的 API 來實作應用程式內購買和試用版。 建議您在 Visual Studio 中,如果您的應用程式專案以 Windows 10 週年更新版(版本 10.0;Build 14393) 或更新版本為目標,使用此命名空間中的成員。 此命名空間支援最新的附加元件類型,例如市集管理的消費性附加元件,其設計目的是與合作夥伴中心和市集所支援的未來產品和功能類型相容。 如需此命名空間的詳細資訊,請參閱本文中的 Windows.Services.Store 命名空間 一節中的 應用程式內購買和試用版。

  • Windows.ApplicationModel.Store 所有版本的 Windows 10 和 Windows 11 也支援在此命名空間中的舊版 API 以用於應用程式內購買和試用。 如需 Windows.ApplicationModel.Store 命名空間的相關信息,請參閱 使用 Windows.ApplicationModel.Store 命名空間的應用程式內購買和試用版

這很重要

Windows.ApplicationModel.Store 命名空間不再更新新功能,建議您盡可能使用 Windows.Services.Store 命名空間來為您的應用程式。 在 Windows 桌面應用程式中,使用Desktop Bridge,以及在合作夥伴中心使用開發沙箱的應用程式或遊戲中,不支援 Windows.ApplicationModel.Store 命名空間(例如,這是任何與 Xbox Live 整合的遊戲的情況)。

基本概念

商店中提供的每個項目通常稱為 產品。 大部分的開發人員只能使用下列類型的產品:應用程式和附加元件

附加元件是您在應用程式內容中提供給客戶的產品或功能:例如,要用於應用程式或遊戲的貨幣、遊戲的新地圖或武器、在沒有廣告的情況下使用您的應用程式,或具有提供該內容類型之 app 的音樂或視訊等數位內容的能力。 每個應用程式和附加元件都有相關聯的授權,指出使用者是否有權使用應用程式或附加元件。 如果使用者有權使用應用程式或附加元件作為試用版,授權也會提供試用版的其他資訊。

若要為應用程式中的客戶提供附加元件,您必須 在合作夥伴中心定義應用程式的附加元件 ,讓市集知道它。 然後,您的應用程式可以使用 Windows.Services.StoreWindows.ApplicationModel.Store 命名空間中的 API,將附加元件作為應用程式內購買提供給使用者。

UWP app 可以提供下列類型的附加元件。

附加元件類型 說明
耐用 附加元件,會保存您 合作夥伴中心中指定的存留期附加元件。

根據預設,永久性附加元件永遠不會過期,在此情況下,只能購買一次。 如果您指定附加元件的特定持續時間,用戶可以在附加元件到期后重新購買附加元件。
開發人員管理的消費性產品 可以購買、使用,並在用完之後再次購買的附加元件。 您必須負責追蹤附加元件所代表項目的用戶餘額。

當使用者使用與附加元件相關的任何項目時,您必須負責維護使用者的餘額,並在用戶使用完所有項目後,將完成的附加元件購買報告給市集。 用戶無法再次購買附加元件,直到您的應用程式回報先前的附加元件購買已完成為止。

例如,如果您的附加元件在遊戲中代表 100 個硬幣,且使用者取用 10 個硬幣,則您的應用程式或服務必須為用戶維持 90 個硬幣的新剩餘餘額。 用戶取用所有 100 個硬幣之後,您的應用程式必須將附加元件回報為已完成,然後使用者可以再次購買 100 枚硬幣附加元件。
商店管理的消耗品 隨時可以購買、使用,並重複購買的附加元件。 商店會追蹤附加元件所代表的用戶物品餘額。

當使用者使用任何與附加元件相關的項目時,您必須負責將這些項目標示為已履行並回報給市集,而市集會更新使用者的餘額。 用戶可以無限次購買附加套件(他們不需要先使用這些物品)。 您的應用程式可以隨時查詢使用者的目前餘額。

例如,如果您的附加元件代表遊戲中 100 個硬幣的初始數量,且使用者耗用 50 個硬幣,則您的應用程式會向市集回報 50 個附加元件已完成,而市集會更新剩餘餘額。 如果用戶接著重新購買您的附加元件以取得 100 個硬幣,他們現在總共會有 150 個硬幣。

注意 若要使用市集管理的消費性產品,您的應用程式必須以 Windows 10 年度版 (10.0) 為目標;在 Visual Studio 中建置 14393) 或更新版本,而且必須使用 Windows.Services.Store 命名空間,而不是 Windows.ApplicationModel.Store 命名空間。
訂閱 耐用的附加元件,客戶需要在定期間隔支付費用以繼續使用此附加元件。 客戶可以隨時取消訂用帳戶,以避免產生進一步的費用。

注意 若要使用訂閱附加元件,您的應用程式必須以 Windows 10 年度版 (10.0) 為目標;在 Visual Studio 中建置 14393) 或更新版本,而且必須使用 Windows.Services.Store 命名空間,而不是 Windows.ApplicationModel.Store 命名空間。

備註

其他類型的附加元件,例如具有套件的持久附加元件(也稱為可下載的內容或 DLC)僅適用於一組受限制的開發人員,而且本文未涵蓋。

使用 Windows.Services.Store 命名空間的應用程式內購買和試用

本節提供 Windows.Services.Store 命名空間的重要工作和概念概觀。 此命名空間僅適用於以 Windows 10 年度版 (10.0; Build 14393) 或更新版本為目標的應用程式,這在 Visual Studio 中對應於 Windows 10 版本 1607。 我們建議應用程式盡可能使用 Windows.Services.Store 命名空間,而不是 Windows.ApplicationModel.Store 命名空間。 如需 Windows.ApplicationModel.Store 命名空間的相關信息,請參閱本文

在本節中

開始使用 StoreContext 類別

Windows.Services.Store 命名空間的主要進入點是 StoreContext 類別。 這個類別提供方法可讓您用來取得目前應用程式及其可用附加元件的資訊、取得目前應用程式或其附加元件的授權資訊、為目前使用者購買應用程式或附加元件,以及執行其他工作。 若要取得 StoreContext 物件,請執行下列其中一項動作:

  • 在單一使用者應用程式中(也就是只在啟動應用程式的使用者內容中執行的應用程式),使用靜態GetDefault方法來取得StoreContext物件,該物件可用來存取與使用者相關的 Microsoft 市集資料。 大多數通用 Windows 平臺 (UWP) 應用程式都是單一使用者應用程式。

    Windows.Services.Store.StoreContext context = StoreContext.GetDefault();
    
  • 多使用者應用程式中,使用靜態 GetForUser 方法來取得 StoreContext 物件,您可以在使用應用程式時,使用其Microsoft帳戶登入的特定使用者存取 Microsoft Store 相關數據。 下列範例取得第一個可用使用者的 StoreContext 物件。

    var users = await Windows.System.User.FindAllAsync();
    Windows.Services.Store.StoreContext context = StoreContext.GetForUser(users[0]);
    

備註

使用 傳統型網橋 的 Windows 傳統型應用程式必須先執行其他步驟來設定 StoreContext 物件,才能使用此物件。 如需詳細資訊,請參閱本節

擁有 StoreContext 物件之後,您可以開始呼叫這個物件的方法,以取得目前應用程式及其附加元件之市集產品資訊、擷取目前應用程式及其附加元件授權資訊、購買目前使用者的應用程式或附加元件,以及執行其他工作。 如需您可以使用這個物件執行之一般工作的詳細資訊,請參閱下列文章:

如需示範如何在 Windows.Services.Store 命名空間中使用 StoreContext 和其他類型的範例應用程式,請參閱市集範例

實作應用程式內購買

若要使用 Windows.Services.Store 命名空間,為應用程式中的客戶提供應用程式內購買:

  1. 如果您的應用程式提供客戶可購買的附加元件, 請在合作夥伴中心為您的應用程式建立附加元件提交

  2. 在您的應用程式中撰寫程式代碼, 以擷取應用程式或應用程式所提供的附加元件產品資訊 ,然後 判斷授權是否為作用 中(也就是使用者是否有使用應用程式或附加元件授權)。 如果授權未啟用,請顯示一個介面,提供應用程式或附加元件給使用者作為應用程式內購買的選項。

  3. 如果使用者選擇購買您的應用程式或附加元件,請使用適當的方法來購買產品:

  4. 請遵循本文中的 測試指引來測試 您的實作。

實作試用功能

若要使用 Windows.Services.Store 命名空間排除或限制應用程式試用版中的功能:

  1. 在合作夥伴中心將您的應用程式設定為免費試用

  2. 在您的應用程式中撰寫程式代碼,以 擷取應用程式或應用程式所提供的附加元件產品資訊 ,然後 判斷與應用程式相關聯的授權是否為試用版授權

  3. 如果這是試用版,請排除或限制您應用程式中的某些功能,然後在使用者購買完整授權時啟用這些功能。 如需詳細資訊和程式代碼範例,請參閱 實作應用程式的試用版

  4. 請遵循本文中的 測試指引來測試 您的實作。

測試您的應用程式內購買或試用版功能

如果您的應用程式使用 Windows.Services.Store 命名空間中的 API 來實作應用程式內購買或試用版功能,您必須將應用程式發佈至市集,並將應用程式下載至您的開發裝置,以使用其授權進行測試。 請遵循此程式來測試您的程式代碼:

  1. 如果您的應用程式尚未在市集中發佈且可供使用,請確定您的應用程式符合最低 Windows 應用程式認證套件 需求、在合作夥伴中心 提交您的應用程式 ,並確定您的應用程式通過認證程式。 您可以 配置您的應用程式,使其在測試時無法在商店中被發現。 請注意 套裝航班的正確配置。 設定不正確的套件發行版本可能無法下載。

  2. 接下來,請確定您已完成下列事項:

  3. 在 Visual Studio 中開啟專案后,單擊 [ 專案] 功能表,指向 [ 市集],然後按兩下 [ 建立應用程式與市集的關聯]。 完成精靈中的指示,以將應用程式專案與您要用於測試的合作夥伴中心帳戶中的應用程式產生關聯。

    備註

    如果您未將專案與市集中的應用程式產生關聯, StoreContext 方法會將其傳回值的 ExtendedError 屬性設定為錯誤碼值0x803F6107。 這個值表示市集對應用程式沒有任何知識。

  4. 如果您尚未這麼做,請從您在上一個步驟中指定的市集安裝應用程式、執行應用程式一次,然後關閉此應用程式。 這可確保應用程式的有效授權會安裝到您的開發裝置。

  5. 在 Visual Studio 中,開始執行或偵錯您的專案。 您的程式碼應從與您本機專案相關聯的應用程式市集獲取應用程式和附加元件數據。 如果系統提示您重新安裝應用程式,請依照指示執行或偵錯您的專案。

    備註

    完成這些步驟之後,您可以繼續更新應用程式的程式代碼,然後在開發計算機上對更新的專案進行偵錯,而不需將新的應用程式套件提交至市集。 您只需要將 App 的市集版本下載到開發電腦一次,才能取得將用於測試的本機授權。 完成測試之後,您只需要將新的應用程式套件提交到市集,如果您希望應用程式內購買或試用相關功能可供客戶使用。

如果您的 app 使用 Windows.ApplicationModel.Store 命名空間,您可以在將應用程式提交至市集之前,先在應用程式中使用 CurrentAppSimulator 類別來模擬授權資訊。 如需詳細資訊,請參閱 開始使用 CurrentApp 和 CurrentAppSimulator 類別

備註

Windows.Services.Store 命名空間不提供類別,讓您在測試期間用來模擬授權資訊。 如果您使用 Windows.Services.Store 命名空間來實作應用程式內購買或試用版,您必須將應用程式發佈至市集,並將應用程式下載至您的開發裝置,以使用其授權進行測試,如上所述。

App 內購買的收據

Windows.Services.Store 命名空間不提供 API,讓您可用來取得交易收據,以在應用程式的程式代碼中成功購買。 這與使用 Windows.ApplicationModel.Store 命名空間的應用程式不同,其 可以使用用戶端 API 來擷取交易收據

如果您使用 Windows.Services.Store 命名空間來實作應用程式內購買,而且您想要驗證指定的客戶是否已購買應用程式或附加元件,您可以使用 Microsoft Store 集合 REST API 中的 products 方法查詢。 這個方法的傳回數據會確認指定的客戶是否具有指定產品的權利,並提供使用者取得產品之交易的數據。 Microsoft Store 集合 API 會使用 Azure AD 驗證來擷取此資訊。

使用桌面橋接搭配 StoreContext 類別

使用 桌面橋 的桌面應用程式可以使用 StoreContext 類別來實作應用程式內購買和試用版。 不過,如果您有 Win32 傳統型應用程式或具有與轉譯架構相關聯之視窗句柄 (HWND) 的桌面應用程式(例如 WPF 或 Windows App SDK 應用程式),您的應用程式必須設定 StoreContext 物件,以指定哪個應用程式視窗是物件所顯示模式對話框的擁有者視窗。

許多 StoreContext 成員(以及透過 StoreContext 物件存取的其他相關類型成員)都會向使用者顯示強制回應對話方塊,以進行市集相關作業,例如購買產品。 如果傳統型應用程式未將 StoreContext 物件設定為指定強制回應對話框的擁有者視窗,則此物件會傳回不正確的資料或錯誤。

若要在使用傳統型網橋的桌面應用程式中設定 StoreContext 物件,請遵循下列步驟。

針對 .NET 6 或更新版本

如果您的應用程式是使用 .NET 6 或更新版本以 C# 撰寫,請遵循下列步驟。

  1. 請確保專案檔案中的 TargetFramework 屬性 已設定為特定的 Windows SDK 版本,以便存取 Windows 執行階段 API,從而提供對 WinRT.Interop 命名空間的存取權。 例如:

    <PropertyGroup>
      <!-- You can also target other versions of the Windows SDK and .NET, e.g. "net6.0-windows10.0.19041.0" -->
      <TargetFramework>net6.0-windows10.0.22000.0</TargetFramework>
    </PropertyGroup>
    
  2. 使用 GetDefault 方法取得 StoreContext 物件(如果您的應用程式是多使用者應用程式,則為 GetForUser),如本文稍早所述。 若要使用指定的視窗句柄初始化對話框,請使用 WinRT.Interop.WindowNative.GetWindowHandleWinRT.Interop.InitializeWithWindow.Initialize 方法(請參閱擷取 視窗句柄 (HWND)顯示相依於 CoreWindow 的 WinRT UI 物件

    StoreContext context = StoreContext.GetDefault();
    // Obtain window handle by passing in pointer to the window object
    var hwnd = WinRT.Interop.WindowNative.GetWindowHandle(windowObject);
    // Initialize the dialog using wrapper function for IInitializeWithWindow
    WinRT.Interop.InitializeWithWindow.Initialize(context, hwnd); 
    

針對舊版 .NET 或 C++

如果您的應用程式是以舊版 .NET 或 C++ 撰寫,請遵循下列步驟。

  1. 執行下列其中一項動作,讓您的應用程式能夠存取 IInitializeWithWindow 介面:

    • 如果您的應用程式是以 C# 或 Visual Basic 等 Managed 語言撰寫(在 .NET 6 之前),請使用 ComImport 屬性在應用程式的程式代碼中宣告 IInitializeWithWindow 介面,如下列 C# 範例所示。 此範例假設您的程式碼檔案包含 語句,用於 System.Runtime.InteropServices 命名空間的

      [ComImport]
      [Guid("3E68D4BD-7135-4D10-8018-9FB6D9F33FA1")]
      [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
      public interface IInitializeWithWindow
      {
          void Initialize(IntPtr hwnd);
      }
      
    • 如果您的應用程式是以 C++ 撰寫,請在程式代碼中新增 shobjidl.h 頭文件的參考。 此頭檔包含 IInitializeWithWindow 介面的宣告。

  2. 使用 GetDefault 方法取得 StoreContext 物件(如果您的應用程式是多使用者應用程式,則為 GetForUser),如本文稍早所述,並將這個物件轉換成 IInitializeWithWindow 物件。 然後,呼叫 IInitializeWithWindow.Initialize 方法,並傳遞您希望作為 StoreContext 方法所顯示之任何模態對話框擁有者的視窗句柄。 下列 C# 範例示範如何將應用程式主視窗的控制代碼傳遞至方法。 另請參閱 擷取視窗句柄 (HWND)顯示相依於 CoreWindow 的 WinRT UI 物件

    StoreContext context = StoreContext.GetDefault();
    IInitializeWithWindow initWindow = (IInitializeWithWindow)(object)context;
    initWindow.Initialize(System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle);
    

產品、SKU 和可用性

市集中的每個產品至少有一個 SKU,而且每個 SKU 至少有一個 可用性。 這些概念會從合作夥伴中心的大部分開發人員中抽象化,而大部分的開發人員永遠不會為其應用程式或附加元件定義 SKU 或可用性。 不過,由於 Windows.Services.Store 命名空間中市集產品的物件模型包含 SKU 和可用性,因此對於某些案例而言,對這些概念的基本瞭解會很有説明。

物體 說明
產品 產品是指市集中可用的任何類型的產品,包括應用程式或附加元件。

市集中的每個產品都有對應的 StoreProduct 物件。 此類別提供屬性,您可以用來存取數據,例如產品的市集標識碼、市集清單的影像和影片,以及定價資訊。 它也提供可用來購買產品的方法。
SKU SKU 是特定版本的產品,其專屬描述、價格和其他獨特的産品詳細數據。 每個應用程式或附加元件都有預設 SKU。 大多數開發人員唯一會為應用程式擁有多個 SKU 的時間是,如果他們發佈其應用程式的完整版本和試用版(在市集目錄中,每個版本都是相同應用程式的不同 SKU)。

某些發行者能夠定義自己的 SKU。 例如,一家大型遊戲發行商可能會針對不允許紅色血液的市場發行顯示綠色血液的版本,以及針對其他所有市場發行顯示紅色血液的版本。 或者,銷售數位視訊內容的發行者可能會針對影片發佈兩個 SKU、一個適用於高畫質版本的 SKU,以及標準定義版本的不同 SKU。

市集中的每個 SKU 都有對應的 StoreSku 物件。 每個 StoreProduct 都有一個 Skus 屬性,您可以用來存取產品的 SKU。
可用性 可用性是一個 SKU 的特定版本,具有其專屬定價資訊。 每個 SKU 都有預設可用性。 有些發行者能夠定義自己的可用性,為指定的 SKU 引進不同的價格選項。

市集中的每個可用性都有對應的 StoreAvailability 物件。 每個 StoreSku 都有 一個 Availabilities 屬性,您可以用來存取 SKU 可用性。 對於大多數開發人員,每個 SKU 都有單一預設可用性。

商店識別碼

市集中的每個應用程式、附加元件或其他產品都有相關聯的 市集標識碼 (這有時也稱為 產品市集標識符)。 許多 API 都需要市集識別碼,才能在應用程式或附加元件上執行作業。

市集中任何產品的市集標識碼為 12 個字元的英數位串,例如 9NBLGGH4R315。 有數種不同的方式可在市集中取得產品的市集標識碼:

對於具有 SKU 和可用性的產品,SKU 和可用性也有自己的市集標識碼,其格式不同。

物體 商店標識碼格式
SKU SKU 的市集標識符格式為 <product Store ID>/xxxx,其中 xxxx 是 4 個字元的英數位元字串,可識別產品的 SKU。 例如: 9NBLGGH4R315/000N 。 此標識碼是由 StoreSku 物件的 StoreId 屬性傳回,有時稱為 SKU 市集識別碼
可用性 可用性的市集標識碼的格式為 <product Store ID>/xxxx/yyyyyyyyyyyy,其中 xxxx 是 4 個字元的英數位元字串,可識別產品的 SKU,yyyyyyyyyyyy 是 12 個字元的英數位元字串,可識別 SKU 的可用性。 例如: 9NBLGGH4R315/000N/4KW6QZD2VN6X 。 此標識碼是由 StoreAvailability 物件的 StoreId 屬性所傳回,有時稱為可用性市集標識符

如何在程式代碼中使用附加元件的產品標識碼

如果您想要在App內容中為客戶提供附加元件,當您在合作夥伴中心建立附加元件提交時,必須輸入附加元件的唯一產品識別碼。 您可以使用此產品識別碼在您的程式碼中參考附加元件,不過可以使用產品識別碼的具體情況取決於您在應用程式中用於應用程式內購買的命名空間。

備註

您在附加元件合作夥伴中心輸入的產品識別碼與附加元件市集 標識碼不同。 市集標識碼是由合作夥伴中心產生。

使用 Windows.Services.Store 命名空間的應用程式

如果您的 app 使用 Windows.Services.Store 命名空間,您可以使用產品識別碼,輕鬆地識別代表附加元件或代表附加元件授權的 StoreLicenseStoreProduct。 產品標識符是由 StoreProduct.InAppOfferTokenStoreLicense.InAppOfferToken 屬性公開。

備註

雖然產品標識碼是識別程式代碼中附加元件的實用方式,但 Windows.Services.Store 命名空間中的大部分作業都會使用附加元件 市集標識元,而不是產品標識碼。 例如,若要以程序設計方式擷取應用程式的一或多個已知附加元件,請將附加元件之市集標識碼(而非產品標識符)傳遞至 GetStoreProductsAsync 方法。 同樣地,若要將消費性附加元件回報為已完成,請將附加元件 (而非產品標識符) 的市集標識符傳遞至 ReportConsumableFulfillmentAsync 方法。

使用 Windows.ApplicationModel.Store 命名空間的應用程式

如果您的應用程式使用 Windows.ApplicationModel.Store 命名空間,您必須使用您在合作夥伴中心中針對大部分作業指派給附加元件的產品識別碼。 例如: