UnityでのiOSアプリ内課金では割とポピュラーな、prime31のiOS StoreKit In App Purchase Plugin($70)を使用した、アプリ内課金の実装メモです。

Android版はこちら

prime31
https://www.prime31.com/

テストシーンが付属してあるので、そこで使われているソースを見るのが一番わかりやすいです。
ちなみにConsumableとNon-Consumableでしか試していません。
レシートの検証とAppleのHostingContentも使用していないです。
導入時のバージョンはUnity3.5.6、プラグインのバージョンは1.3.3です。

--------------------------------------------------------
※注意:ここで紹介しているバージョンは古いので
実装の際は公式で最新のドキュメントを確認することをおすすめします。
--------------------------------------------------------

※前準備として事前に、itunes connectにてアプリと課金アイテムの登録、
 テストユーザの追加を行ない、端末のAppleIDをログアウトしておく。

以下、実装の簡単な流れ

①iOS StoreKit In App Purchase Pluginをインポートした後、
 最初のシーンにStoreKitManagerプレハブとStoreKitEventListenerプレハブを配置。
 DontDestroyOnLoadで死なないようにしておく。

②アプリ内購入を開始する前にStoreKitBinding.canMakePayments()で、
 アプリ内購入の制限がかかっていないか確認する。
 制限がかかっている場合はダイアログなどで「設定→一般→機能制限→App内での購入」
 をオンにするよう促してあげると親切かも。

StoreKitBinding.requestProductData(string[] productIdentifiers)でアイテムの情報を取得する。
 取得したいアイテムのプロダクトIDを配列で引数に入れる。
 通信は非同期で行われ、問題なければStoreKitEventListener
 productListReceived( List<StoreKitProduct> productList )が呼ばれ、
 アイテム情報が取得できる。

④購入リクエストをStoreKitBinding.purchaseProduct(string productIdentifier, int quantity)で投げる。
 1番目の引数はプロダクトIDを、2番目は個数なので通常は1でよいかと。
 これでネイティブ側のアプリ内購入ダイアログが表示される。
 (初回はログインダイアログがでるので、事前登録したテストユーザでログインする)
写真
⑤購入が正常に終わると、StoreKitEventListener
 purchaseSuccessful( StoreKitTransaction transaction )が呼ばれるので、
 ここで対応するアイテム等をゴニョゴニョする。

⑥リストアの実装はStoreKitBinding.restoreCompletedTransactions()でリクエスト。
 StoreKitEventListenerrestoreTransactionsFinished()が呼ばれた後に、
 購入済みアイテムのpurchaseSuccessful( StoreKitTransaction transaction )が順次呼ばれる。

⑦その他のStoreKitEventListener内イベント
purchaseFailed( string error )
  
 購入エラー
purchaseCancelled( string error )
  
→ 購入キャンセル
productPurchaseAwaitingConfirmationEvent( StoreKitTransaction transaction )
  
→ トランザクションの完了待ち
    ※デフォルトではプラグイン側で終了させてるっぽい
restoreTransactionsFailed( string error )
  
→ リストアエラー
paymentQueueUpdatedDownloadsEvent( List<StoreKitDownload> downloads )
  
→ ホスティングシステムのDL状況
receiptValidationSuccessful()
  
→ レシートの検証完了
receiptValidationRawResponseReceived( string response )
  
→ レシートの検証レスポンス
receiptValidationFailed( string error )
  
→ レシートの検証エラー