Open6

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

だーら(Flamers / Memotia)だーら(Flamers / Memotia)

概念について

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に概念の説明依頼


だーら(Flamers / Memotia)だーら(Flamers / Memotia)

課金処理の実装の流れ(PICOの中だけの話)

add-onを一覧する

  • Task<ProductList> GetProductsBySKU(string[] skus)で、add-onの一覧を料金・通貨とともに表示する

Checkoutする

  • Task<Purchase> LaunchCheckoutFlow2(Product product)で購入する。
    • リクエストの際にはadd-onのpriceとcurrencyが必要。それ故Checkoutする前にGetProductsBySKUを呼ぶ必要がある。
    • 中国外であれば、通貨はその人の国/地域によって自動的に決定される。そのため、コードの中で通貨を確定してはならない。

購入したadd-onを一覧する

  • Task<PurchaseList> GetViewerPurchases()...購入履歴の確認
    • 消耗型、非消耗型について確認できる。

Filfillする

  • consumableなアイテムについて、購入後に、自社システムの中でユーザーに対して購入を反映させる。
  • Task ConsumePurchase(string sku)を呼ぶことで、fulfillmentを記録する事ができる。
  • fulfilledされたあとは、GetViewerPurchasesを呼んでもその購入は返却されない。
    • 自分の解釈: "1000円チケット"のようなまとまりとして作成し、まとまりとして消費する。1000円の中から500円だけ消費などはできない。(引数に渡せるのはskuだけなので)
だーら(Flamers / Memotia)だーら(Flamers / Memotia)

テスト・デバッグ

  • 未提出の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デバイス外)から叩くことはできるの?

だーら(Flamers / Memotia)だーら(Flamers / Memotia)

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を使う前に

だーら(Flamers / Memotia)だーら(Flamers / Memotia)

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を付与できる