IOSの特定条件でのサブスクリプションの割り当て処理(AllocateSubscriptionStatusAsync)が失敗します

43 views
Skip to first unread message

片山貴裕

unread,
Feb 4, 2026, 2:42:47 AMFeb 4
to GS2 ユーザグループ
お世話になっております

unityで作成したIOSアプリにて購入したサブスクリプションのGS2への割り当て処理に関しまして、質問がございます

■内容
IOSのサブスクリプショングループが異なるサブスクリプションA,Bをストアに登録し、
xcodeからiphoneに直接転送したアプリを用意し、sandboxアカウントを用いて登録した商品A,BをB→Aの順に購入した場合、両方のサブスクリプションの割り当てに成功いたしますが、
A→Bの順に購入した場合、Aの割り当てには成功いたしますが、Bの購入時のMoney2のAllocateSubscriptionStatusAsync()にて下記のようなエラーが発生し、Bの割り当てに失敗いたします
Bのサブスクリプション単体での購入/割り当てに関しましては、成功しておりますため、Bのサブスクリプションの購入/割り当て部分の処理やAppleストア側やGS2側の設定に関しましては、問題ないかと考えております

色々と調査を行いましたところ、
A→Bの順に購入した際に、失敗したBのレシート(コンソールログのAllocateSubscriptionStatusの送信ログにあったPayload)の中身をbase64で複合して確認すると、
直前で割り当てに成功したAのTransactionIDと失敗しているBのTransactionIDがそれぞれ上から順にA,Bの順に入っておりました
現象からの推測となりますが、B→Aの順番では問題が発生していないということから、以下のような問題が発生している可能性などはございませんでしょうか

・B→Aの順に購入した場合 (両方ともサブスクリプションの割り当てに成功)
1、Bのレシートには、Bのトランザクションのみ入っているため成功する
2、Aのレシートには、A,Bの順にトランザクションが入っており、先頭がAであるため成功する

・A→Bの順に購入した場合 (Aのみサブスクリプションの割り当てに成功)
1、Aのレシートには、Aのトランザクションのみ入っているため成功する
2、Bのレシートには、A,Bの順にトランザクションが入っており、先頭がAであるため、Bのトランザクションと不一致が発生

お手数をおかけしますが、ご確認お願いいたします


■GSコンソールのLogにあった、allocateSubscriptionStatusのレスポンスがエラーだった場合のログ(A→Bで購入した再のBの割り当て時)
{
  "errors": [
    {
      "component": "apple.transaction",
      "message": "money2.subscription.apple.transaction.error.notFound",
      "code": ""
    }
  ],
  "result": {},
  "metadata": {}
}

■確認環境
・unity6.3.0f1
・GS2 C# SDK 2025.10.8
・GS2 SDK for Unity 2025.10.5
・iap 5.1.2
・StoreKit v1
・xcode 26.0

■確認状況
・ios26,18などの複数osでの発生を確認しております
・sandboxアカウントの再作成や購入履歴の削除などを色々試しましたが、解決しない状況です

丹羽一智

unread,
Feb 4, 2026, 3:09:03 AMFeb 4
to GS2 ユーザグループ, 片山貴裕
そちらの状況ですと、クライアントがレシートを送信する際に指定する TransactionID の指定が正しいものを渡せていない可能性が高いように感じるのですが、確認いただいても大丈夫でしょうか?

Kazutomo Niwa
2026年2月4日 16:42 +0900、片山貴裕 <fine.t....@gmail.com> のメール:

片山貴裕

unread,
Feb 4, 2026, 3:43:24 AMFeb 4
to GS2 ユーザグループ, 丹羽一智
ご回答ありがとうございます

AllocateSubscriptionStatusAsync()の引数であるreceiptに渡している値に関しましては、
IAPv5の購入処理である、StoreControllerのPurchaseProduct()実行後の成功コールバックのOnPurchasePendingから取得したPendingOrderの値を、
pendingOrder?.Info?.Receipt(storekit V1を使用しているため)の形式で取得したレシートをそのまま引数に渡しております(整形等はしておりません)
そのため、クライアントがレシートを送信する際に指定する TransactionIDに関しましては、特にクライアント側で指定しておらず、レシートの中に含まれるTransactionIDがそのままGS側に送信されているものかと思われます

先ほどの質問の中にありましたサブスクリプションAやBのTransactionIDに関しましては、
GS2コンソールのLogにあがっておりました、allocateSubscriptionStatusのリクエストパラメーターに含まれているreceiptのTransactionIDの値を見て判断しておりました
2026年2月4日水曜日 17:09:03 UTC+9 丹羽一智:

丹羽一智

unread,
Feb 4, 2026, 6:00:09 AMFeb 4
to GS2 ユーザグループ, 片山貴裕
となると、Unity IAP 側が TransactionID が正しいものを渡してくれない不具合かもしれません。
Ack しておらず、Pending のままということがないかもあわせてご確認ください

Kazutomo Niwa
2026年2月4日 17:43 +0900、片山貴裕 <fine.t....@gmail.com> のメール:

片山貴裕

unread,
Feb 4, 2026, 10:19:16 PMFeb 4
to GS2 ユーザグループ, 丹羽一智

AllocateSubscriptionStatusAsync()でエラーになるサブスクリプションのトランザクションIDをpythonのapp-store-server-libraryを用いて
トランザクションの情報の確認を行いましたが、サブスクリプションBのproductIdやストア情報などが含まれておりました
そのため、AllocateSubscriptionStatusAsync()にて送信している情報に含まれているTransactionIDは正しいものかと思われます

pythonのapp-store-server-libraryを用いた確認手順は以下のようなものとなります
1,別々のサブスクリプショングループである商品A,BをA→Bの順に購入
2,Bのサブスクリプション購入後のAllocateSubscriptionStatusAsync()を実行した際にエラーが発生
3,GS2のコンソールログにある該当エラーのリクエストパラメーターを確認
4,AppStoreServerAPIClientのget_transaction_info()に、3のリクエストパラメーターに含まれるTransactionIDを指定して、トランザクションの情報を取得
5,SignedDataVerifierのverify_and_decode_signed_transactionを用いて取得したトランザクションの情報をデコード
6,デコードした結果に含まれるproductIdなどの情報を確認する (productIdやストア情報などが2の手順でエラーになっている商品の情報が含まれていることを確認)

お手数をおかけしますが、ご確認お願いいたします
2026年2月4日水曜日 20:00:09 UTC+9 丹羽一智:

丹羽一智

unread,
Feb 5, 2026, 2:00:27 AMFeb 5
to 片山貴裕, GS2 ユーザグループ
本件不具合の可能性のある場所を特定し、改善される可能性のある変更を加えましたので改善されたかご確認ください

Kazutomo Niwa
2026年2月5日 12:19 +0900, 片山貴裕 <fine.t....@gmail.com>:

片山貴裕

unread,
Feb 5, 2026, 9:13:32 PMFeb 5
to GS2 ユーザグループ, 丹羽一智
ご対応ありがとうございます

問題の発生していたA→Bの順での購入処理に関しまして、問題が発生し無くなったことを確認いたしました
また、元々問題の無かったB→Aの順での購入処理に関しましても問題が無いことを確認いたしました
2026年2月5日木曜日 16:00:27 UTC+9 丹羽一智:
Reply all
Reply to author
Forward
0 new messages