Open6
PICOのアプリ内購入についての調査

概念について
Add-on
- 課金要素の1つ1つのことを指す
- AppleのIAPにおけるProductと同じ概念
- 2023/11時点では、Durable(非消耗型)、Consumable(消耗型)、Subscriptionが存在している。
- add-onを作成すると、PICOによる審査が入る。
実際のDeveloper画面
Consume
- 消耗品(consumable)をユーザーが購入したときに、その購入をサービスに反映させること。
- その反映・補充をfulfilleと定義している。
- 例: ユーザーが100コインをPICO内でIAPしたときに、アプリのユーザーアカウントに対して100コインを付与すること
- fulfillされたことが確認されてから、次の購入ができる。
SKU
- Add-on(課金要素のそれぞれ)のユニークな識別子。
Stock keeping unit, which is the unique identifier of an add-on. An SKU cooresponds to one add-on only.
ChatGPTに概念の説明依頼

課金処理の実装の流れ(PICOの中だけの話)
- 公式docの参考になる部分
- (前段階のDeveloper画面での準備)add-onを作成する
add-onを一覧する
-
Task<ProductList> GetProductsBySKU(string[] skus)
で、add-onの一覧を料金・通貨とともに表示する
Checkoutする
-
Task<Purchase> LaunchCheckoutFlow2(Product product)
で購入する。- リクエストの際にはadd-onのpriceとcurrencyが必要。それ故Checkoutする前に
GetProductsBySKU
を呼ぶ必要がある。 - 中国外であれば、通貨はその人の国/地域によって自動的に決定される。そのため、コードの中で通貨を確定してはならない。
- リクエストの際にはadd-onのpriceとcurrencyが必要。それ故Checkoutする前に
購入したadd-onを一覧する
-
Task<PurchaseList> GetViewerPurchases()
...購入履歴の確認- 消耗型、非消耗型について確認できる。
Filfillする
- consumableなアイテムについて、購入後に、自社システムの中でユーザーに対して購入を反映させる。
-
Task ConsumePurchase(string sku)
を呼ぶことで、fulfillmentを記録する事ができる。 - fulfilledされたあとは、
GetViewerPurchases
を呼んでもその購入は返却されない。- 自分の解釈: "1000円チケット"のようなまとまりとして作成し、まとまりとして消費する。1000円の中から500円だけ消費などはできない。(引数に渡せるのはskuだけなので)

テスト・デバッグ
- 未提出のadd-onの場合: PICO developer accountでのみテスト可能
- 申請済みで承認済みのadd-on: PICO developer account以外でもテスト可能
- テストは実際に支払いをする必要がある。金額はその地域における最低支払額である。(日本では2円)
- テストによる売上は、organizationに支払われる。
- 管理画面で、Payment Testのenable/disableを切り替えられる。
- enable...支払いが成功するケースのシミュレーションが可能
- disable...失敗するケースが可能
手順
- デバイスに、add-onを作成したdeveloper account でログインする
デモ
残った疑問点
Q、課金状況の確認って、server(PICOデバイス外)から叩くことはできるの?

APIリファレンス
IAPServiceのAPIを見たメモ
Task ConsumePurchase (string sku)
- 引数がstring skuであること。purchaseのidなどではない
- 同じskuのconsumableを複数買えないという思想と合ってる。
Task<PurchaseList> GetViewerPurchases ()
- 他のすべてそうだけど、引数にユーザーを指定する必要がないので認証は別でしている
-
Gets a list of purchased add-ons for a user, including durables and unfilfilled consumables.
- filfilledなconsumablesはこのAPIからレスポンスされない。
Task<Purchase> LaunchCheckoutFlow2 (Product product)
- これは引数がproductモデル
- 戻り値はPurchase
IAPServiceを使う前に
- IAPを含むPlatform Serviceを使う前に、初期化を行う必要がある
- https://developer-global.pico-interactive.com/document/unity/initialization/

Modelリファレンス
Product
- 多くの項目がadd-onに由来する(Description, DetailDescription, Price, Currency, Name, SKU, Icon等)
- AddonsType(Consumable, Durable, Subscription)
- 他のカラムはSubscription系の項目
Purchase
- ID...これが識別子
- SKU...ProductではなくSKLUに紐づく
- AddonsType
- OrderComment...
LaunchCheckoutFlow3
のAPIで購入するとdeveloperがorderに対してcommentを付与できる