> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Economy (舊版) 中的商店與促銷

> 從您的目錄建置 PlayFab 舊版 Economy 商店，並為選取的項目以自訂虛擬貨幣或真實貨幣價格執行限時促銷。

# 商店與促銷 (舊版 Economy)

<Info>
  Economy v1 API 處於維護模式，不會再推出任何新功能，只會進行錯誤修正。\*\*在可預見的未來，v1 API 將持續維護。\*\*請參閱 [Economy v2 概觀](/zh-TW/services/playfab/economy-monetization/economy-v2/overview)，深入了解下一版的 PlayFab Economy！
</Info>

在 PlayFab 中，**商店**是建立在[目錄](/zh-TW/services/playfab/economy-monetization/economy/items/catalogs)和[貨幣](/zh-TW/services/playfab/economy-monetization/economy/tutorials/currencies)之上。您的主要目錄應定義遊戲中的所有項目，並以您建立的貨幣為其指定價格。

商店應定義目錄中項目的子集，並以可能與目錄價格不同的特定價格提供購買。

商店可讓您挑選出一組特定的項目，並在設定的時間期間內以特定價格提供。

本教學課程說明定義以虛擬貨幣和真實貨幣為基礎之商店的最佳做法。

## 需求

* 熟悉 PlayFab [Game Manager](/zh-TW/services/playfab/live-service-management/gamemanager/quickstart)。
* 您必須已定義一或多種[虛擬貨幣](/zh-TW/services/playfab/economy-monetization/economy/tutorials/currencies)。本教學課程中的後一個範例使用：
  * **SP** (**Silver Pieces**)
  * **GP** (**Gold Pieces**)。
* 您必須有一個已定義一或多個項目的\_主要目錄\_。
  * 第一個範例使用多個項目/搭售組合，類似於[掉落表](/zh-TW/services/playfab/economy-monetization/economy/tutorials/drop-tables)教學課程中所述的項目。
  * 本教學課程的第二個範例使用小型、中型和大型生命藥水。

### 最佳做法

目錄價格應長期固定，因為它們定義了項目的\_真正\_價格。

商店應該是\_暫時性\_的，依照您的 LiveOps 策略新增和移除。

<Note>
  預期您大部分的營收會來自輪替商店，以及在作用中的商店之間移入和移出項目。
</Note>

## 商店與目錄定價的一般資訊

* **定價**：目錄中定義的價格應定義為項目的\_一般\_價格。商店可讓您為項目定義暫時性的促銷價格，運用常見的零售策略。或者，商店可以為通常完全不開放販售的項目提供暫時性價格。
* **零成本**：如果項目在特定貨幣中的成本未設定 (**null**) 或為**零**，則無論在目錄或商店中都無法使用該貨幣購買。零成本可讓您將其他貨幣的項目保留空白或重設為**零**，使項目只能以免費貨幣購買，或只能以進階貨幣購買。
* **真實貨幣**：**RM** 貨幣在所有目錄和商店中皆可使用。RM 是受限的貨幣索引鍵，表示\_僅限真實貨幣交易\_。您應該只對具有重大價值的項目，或含有進階貨幣的搭售組合/容器收取 RM。
* **價格為二擇一**：如果項目上定義了兩種價格，則可以用其中一種購買該項目。\_無法\_要求以兩種貨幣購買單一項目。

## 定義真實貨幣商店

在您的 **Game Manager** 中：

* 瀏覽至您的 **Title**。
* 從左側功能表選取 **Economy**。
* 在 **Catalogs** 索引標籤上，選取您的主要目錄，然後選取 **Stores**。
* 選取 **New Store** 按鈕。

在[掉落表](/zh-TW/services/playfab/economy-monetization/economy/tutorials/drop-tables)範例中，我們建立了一個包含 11 個項目的掉落搭售組合。在此範例中，我們將在真實貨幣商店中提供三個類似的搭售組合。

<Note>
  任何項目都可以用真實貨幣販售，但最佳做法是只直接提供\_特定\_的高價值項目或搭售組合。
</Note>

下方提供的螢幕擷取畫面顯示一個完整的新**商店**，其中包含三個以**真實貨幣**提供的**項目搭售組合**。

<img src="https://mintcdn.com/microsoft-4404708b/Oa_DP1q6U1lat7c2/images/playfab/economy-monetization/economy/tutorials/game-manager-economy-edit-store.png?fit=max&auto=format&n=Oa_DP1q6U1lat7c2&q=85&s=9195fb8062f1c7ce7ba7caa050d5229c" alt="Game Manager - Economy - 編輯商店" width="1280" height="1500" data-path="images/playfab/economy-monetization/economy/tutorials/game-manager-economy-edit-store.png" />

完成真實貨幣購買的具體細節，涵蓋在我們的進階教學課程[非收據付款處理](/zh-TW/services/playfab/economy-monetization/economy/tutorials/non-receipt-payment-processing)中。

### 真實貨幣商店的最佳做法

您如何使用真實貨幣，很大程度取決於遊戲的具體設計。直接購買遊戲內項目是可行的，但較不常見。

更常見的是，您的遊戲應允許使用真實貨幣購買進階虛擬貨幣。您可以輪替多個具有不同進階貨幣與真實貨幣比例的商店。

<Tip>
  主要的重點是：確保您的玩家\_隨時\_都能付錢給您。
</Tip>

## 定義虛擬貨幣商店

讓我們深入了解以虛擬貨幣購買遊戲內項目的細節和程式碼。

初始步驟與前一個範例幾乎相同：

1. 建立三個新項目：**Small**、**Medium** 和 **Large Health Potions**，設定\_免費\_**貨幣**價格，以及\_進階\_**貨幣**價格。
2. 建立一個包含促銷項目的新商店。

<img src="https://mintcdn.com/microsoft-4404708b/Oa_DP1q6U1lat7c2/images/playfab/economy-monetization/economy/tutorials/game-manager-economy-new-store.png?fit=max&auto=format&n=Oa_DP1q6U1lat7c2&q=85&s=c64cebc85f1e45eae8aa51e7c9bdab9a" alt="Game Manager - Economy - 新增商店" width="1280" height="1300" data-path="images/playfab/economy-monetization/economy/tutorials/game-manager-economy-new-store.png" />

## 在單次購買中購買多個項目

若要以虛擬貨幣購買單一項目，請使用 [PurchaseItem](xref:titleid.playfabapi.com.client.playeritemmanagement.purchaseitem) 方法，如我們的[商店快速入門](/zh-TW/services/playfab/economy-monetization/economy/stores/quickstart)所述。本教學課程涵蓋在單次購買中購買多個項目。

此流程的第一個步驟應該是取得商店，並將其顯示給使用者。

```csharp theme={null}
void GetVcStore()
{
    var primaryCatalogName = "TestCatalog-001"; // In your game, this should just be a constant matching your primary catalog
    var storeId = "Potion Store"; // In your game, this should be a constant for a permanent store, or retrieved from titleData for a time-sensitive store
    var request = new GetStoreItemsRequest
    {
        CatalogVersion = primaryCatalogName,
        StoreId = storeId
    };
    PlayFabClientAPI.GetStoreItems(request, LogSuccess, LogFailure);
}
```

此範例中的 `LogSuccess` 回呼會收到 [GetStoreItemsResult](xref:titleid.playfabapi.com.client.title-widedatamanagement.getstoreitems#getstoreitemsresult)，其中包含商店中所有項目的完整描述、其\_商店\_價格，以及商店本身所包含的任何中繼資料。

### 顯示商店的最佳做法

具有商店的遊戲應使用 [GetCatalogItems](xref:titleid.playfabapi.com.server.title-widedatamanagement.getcatalogitems) 方法呼叫並快取其主要目錄。您可以同時顯示目錄價格和商店價格，並在促銷項目旁加上「10% OFF」或類似的優惠標示。

<Tip>
  玩家比較可能購買促銷中的項目，尤其是限時優惠的促銷。
</Tip>

此時，由您的 GUI 程式碼負責讓使用者有機會選取他們想要購買的項目及數量。

* 在您的遊戲與 PlayFab 之間，其餘步驟是數個個別的 API 呼叫，但您可以讓這一連串的多個呼叫對玩家而言是不可見的。
* 預先收集購買的所有資訊，並在收集\_所有\_玩家輸入之後，再進行完整的呼叫序列。

```csharp theme={null}
void DefinePurchase()
{
    var primaryCatalogName = "TestCatalog-001"; // In your game, this should just be a constant matching your primary catalog.
    var storeId = "Potion Store"; // At this point in the process, it's just maintaining the same storeId used above.
    var request = new StartPurchaseRequest
    {
        CatalogVersion = primaryCatalogName,
        StoreId = storeId,
        Items = new List<ItemPurchaseRequest> {
             // The presence of these lines are based on the results from GetStoreItems, and user selection - Yours will be more generic.
            new ItemPurchaseRequest { ItemId = "Small Health Potion", Quantity = 20,},
            new ItemPurchaseRequest { ItemId = "Medium Health Potion", Quantity = 100,},
            new ItemPurchaseRequest { ItemId = "Large Health Potion", Quantity = 2,},
        }
    };
    PlayFabClientAPI.StartPurchase(request, result => { Debug.Log("Purchase started: " + result.OrderId); }, LogFailure);
}
```

在項目選取過程中，您必須讓使用者選取他們想要用來購買這些項目的貨幣。在此範例中，所有項目都有 **SP** 和 **GP** 的成本，這表示使用者可以選擇要花費哪一種貨幣。

<Note>
  上述程式碼範例中 `StartPurchase` API 的[結果](xref:titleid.playfabapi.com.client.playeritemmanagement.startpurchase#startpurchaseresult)包含 `PaymentOptions` 清單。每個付款選項都包含可用來進行購買的 `Currency`、`Price` 和 `ProviderName`。
</Note>

### 限制

單次購買中只允許使用\_一種\_虛擬貨幣。所有選取的項目都必須能以\_單一貨幣\_購買。

呼叫中必須指定貨幣，這在有多種可能貨幣時尤其重要。如果要求中有項目沒有以所選貨幣計算的對應成本，則該序列會失敗。

呼叫中也必須指定 `ProviderName`。對於真實貨幣購買，提供者名稱是用來支付購買款項的提供者，例如 Facebook、PayPal 或 Steam。對於 VC 購買，它會是以您的遊戲識別碼為基礎的字串。`ProviderName` 可以從 [StartPurchaseResult](xref:titleid.playfabapi.com.client.playeritemmanagement.startpurchase#startpurchaseresult) 的 `PaymentOptions` 欄位取得，如前面的**附註**所述。

<Tip>
  對於 VC 購買，您遊戲的 `ProviderName` 是由「Title」一詞串連您十六進位 `TitleId` 的十進位對應值所組成的字串。例如「Title123456」。
</Tip>

### 顯示商店項目的最佳做法

確保商店中的所有項目都有一致的選項，以避免讓玩家感到困惑。

真實貨幣項目應與進階 VC 項目放在不同的商店，也應與免費 VC 項目分開。如果單一商店允許多種貨幣，則該商店中的\_所有\_項目都應一致地使用同一組多種貨幣。請視需要建立足夠多的商店，以提供流暢的客戶體驗。

```csharp theme={null}
void DefinePaymentCurrency(string orderId, string currencyKey, string providerName)
{
    var request =new PayForPurchaseRequest {
        OrderId = orderId, // orderId comes from StartPurchase above.
        Currency = currencyKey, // User defines which currency they wish to use to pay for this purchase (all items must have a defined/non-zero cost in this currency).
        ProviderName = providerName // providerName comes from the PaymentOptions in the result from StartPurchase above.
    };
    PlayFabClientAPI.PayForPurchase(request, LogSuccess, LogFailure);
}
```

最後，一旦購買已完整定義，您就可以完成流程，如下所示。

```csharp theme={null}
// Unity/C#
void FinishPurchase(string orderId)
{
    var request = new ConfirmPurchaseRequest { OrderId = orderId };
    PlayFabClientAPI.ConfirmPurchase(request, LogSuccess, LogFailure);
}
```

### 處理 API 失敗結果的最佳做法

任何單一 API 呼叫都可能因許多原因而失敗。手機等無線裝置經常會有間歇性的連線問題，而任何網際網路呼叫都可能因隨機延遲而失敗。

每個呼叫都應檢查多種失敗狀況。如果回應顯示要求無效 (例如，無法以單一貨幣購買多個項目)，您應該中止。您的商店設計可能有問題。

如果回應指出連線失敗，您可以使用指數輪詢延遲再試一次。

## 結論

商店是鼓勵玩家購買項目的絕佳機制。

商店可搭配任何種類的虛擬貨幣使用。商店也可以透過另一組 API 方法搭配真實貨幣使用。

* 您可以透過 [PurchaseItem](xref:titleid.playfabapi.com.client.playeritemmanagement.purchaseitem) 設定以 VC 購買單一項目。
* 您可以透過下列序列設定以真實貨幣或 VC 購買多個項目：
  * [StartPurchase](xref:titleid.playfabapi.com.client.playeritemmanagement.startpurchase)
  * [PayForPurchase](xref:titleid.playfabapi.com.client.playeritemmanagement.payforpurchase)
  * [ConfirmPurchase](xref:titleid.playfabapi.com.client.playeritemmanagement.confirmpurchase)

如需真實貨幣購買的詳細資訊，請參閱[非收據付款處理](/zh-TW/services/playfab/economy-monetization/economy/tutorials/non-receipt-payment-processing)。

如需進階的商店用法，請參閱[適用於玩家區段的自訂商店](/zh-TW/services/playfab/economy-monetization/economy/tutorials/custom-stores-for-player-segments)教學課程。


## Related topics

- [Economy v2 商店](/zh-TW/services/playfab/economy-monetization/economy-v2/catalog/stores.md)
- [商店 (舊版 Economy) 快速入門](/zh-TW/services/playfab/economy-monetization/economy/stores/quickstart.md)
- [Economy (舊版) 中的優待券和促銷活動](/zh-TW/services/playfab/economy-monetization/economy/tutorials/coupons-and-promotions.md)
- [目錄 (舊版 Economy)](/zh-TW/services/playfab/economy-monetization/economy/items/catalogs.md)
- [Economy (舊版) 中適用於玩家區段的自訂商店](/zh-TW/services/playfab/economy-monetization/economy/tutorials/custom-stores-for-player-segments.md)
