Jewelry AI・購入
サーバー上で確認できないクレジットを、アプリは確定しません
ストア画面が自分の判断で残高を増やすことはありません。サーバーが保持しているウォレットを読み取り、購入を実行し、もう一度ウォレットを読み取って、その2回の読み取りが食い違ったときにだけクレジット追加の確認表示を出します。食い違いを確認できなかったときに出るのは、確認できていない数字ではなく、検証中であることを伝えるメッセージです。
画面が実際に報告していること
クレジットを購入したあとに普段目にする確認表示は、レシートではありません。比較の結果です。アプリは購入の前にサーバーが保持しているウォレットを読み取り、購入のあとにもう一度読み取ります。祝いの表示が出るのはその2回の読み取りが食い違ったときだけで、そこに印字される残高も、クライアントが割り出した数字ではなくサーバーから返ってきた数字です(apps/jewelry-mobile/src/app/store/index.tsx)。
この設計には直接の帰結があります。変化を証明できないとき、アプリは数字を出しません。代わりに固定の文面を表示します。支払いは受け取られたこと、クレジットはサーバー側で検証中であること、しばらくしてからもう一度確認してほしいことを伝える文面です(apps/jewelry-mobile/src/i18n/catalogs/en-US.ts:195)。
つまりこの通知は、支払いについての表明ではなく、アプリ自身の証拠についての表明です。アプリが確認を続ける範囲の中では比較が肯定的な結果にならなかった、と言っているにすぎません。サーバー上でクレジットが作成されなかった、とは言っていません。
この通知が画面に出る2つの経路
どちらの経路も同じメッセージを出し、メッセージの側は両者を区別しません。
- 確認の範囲が閉じても変化が見えなかった
- 検証はウォレットの再読み取りを限られた回数だけ行います。そのどれもが変化を示さなかったとき、確認表示は出ず、代わりに検証中のメッセージがその場所を占めます(apps/jewelry-mobile/src/app/store/index.tsx)。
- 基準となる読み取りがそもそも取れていなかった
- 購入前のウォレット読み取りがエラーになっていると、アプリには比べる相手がなく、変化を証明できません。そのため、クレジットが実際に届いていても検証中のメッセージが表示されます(apps/jewelry-mobile/src/app/store/index.tsx)。
- メッセージの文面は固定されている
- これはカタログの中の1つの文字列です。支払いは受け取られた、クレジットはサーバー側で検証中である、しばらくしてからもう一度確認してほしい、という内容であり、サーバーの回答から組み立てられた状態表示ではありません(apps/jewelry-mobile/src/i18n/catalogs/en-US.ts:195)。
- 読み取っていないことを、クライアントは報告できない
- この面で確認されたのは、アプリの待機と表示の動作です。サーバー上でクレジットがどのように、いつ書き込まれるのかはストア画面が観測するものではなく、このページもそれをこの通知から導き出しません。
購入のあとに画面へ返ってくるもの
行ごとに、支えている証明の強さが違います。この表にある値は、どれも端末側で計算されたものではありません。
| 表示されるもの | 内容の出どころ | それが定めること |
|---|---|---|
| クレジット追加の確認表示 | 購入のあとにサーバーが返したウォレットの読み取り | 購入前の読み取りと購入後の読み取りとで、サーバーが保持するウォレットが違っていたこと |
| その確認表示に印字される残高 | 同じサーバーの応答。クライアントは何も足していません | その数字が、サーバーが報告したとおりの保存された残高であること |
| 検証中のメッセージ | アプリの英語カタログにある固定の文面(apps/jewelry-mobile/src/i18n/catalogs/en-US.ts:195) | 確認の範囲の中でウォレットの変化が観測されなかったこと、または比べる基準がなかったこと |
| サーバー側の支払い記録に関すること | ストア画面が読み取る対象ではありません | 何も定めません。クレジットが作成されたかどうかについて、画面は何の表明もしません |
与えられた結果の読み方
画面のそれぞれの状態が支えている結論と、支えていない結論。
| 状況 | 選択 | 理由 |
|---|---|---|
| 残高つきの確認表示が出た。 | その残高をそのまま受け取ってください。 | サーバーのウォレット読み取りから返ってきた数字であり、クライアントが計算したものではありません。 |
| 支払いの直後に検証中のメッセージが出た。 | あとで画面を開き直し、残高をもう一度読んでください。 | この通知は、回数の決まった確認で変化が観測されなかったときにアプリが出すものです。サーバーの記録についての報告ではありません。 |
| 支払う前に画面の読み込みがうまくいかず、そのあとで通知が出た。 | 失敗ではなく、未証明として扱ってください。 | 購入前のウォレット読み取りが失敗すると比較に基準がなくなるため、クレジットが届いていても通知が出ることがあります。 |
| 購入からかなり時間が経っても残高が変わらない。 | アプリの画面を、支払いについての判定として読まないでください。 | 届かなかったストアのイベントはサーバー側で保持され、再試行されます。このページは、届くまでの時間も、すべての支払いが必ずクレジットになることも定めていません。 |
クレジットに変換できなかった購入に何が起きるか
サーバー側の仕組みはソースツリーから読み取ったものであり、ここに書くのは、アプリの沈黙が破棄された支払いと取り違えられないようにするためだけです。どれも、操作したり、依頼したり、待ったりする対象ではありません。
クレジットに変換できなかったストアからの通知は破棄されません。イベントは失敗として記録され、理由の短縮版が保存され、ロックが解放され、あとの再試行が予約されます。その理由の欄に書き込まれるのは制御された短い文字列だけなので、保存される記録が持つ診断情報は限られています(apps/api/src/webhooks/revenuecat.service.ts)。
失敗したイベントは、自前の内部ジョブによって定期的に再処理されます。そのため、支払われたのにクレジットにならなかったイベントが、一度の配信の機会だけに縛られることはありません。このジョブはテスト環境では起動しません(apps/api/src/webhooks/revenuecat.service.ts)。
再試行は無制限ではありません。上限はコードに組み込まれた固定値で、設定で変えることはできず、その値はここにも、このサイトのどこにも意図的に書きません。上限を使い切ると、イベントは手動での確認に引き上げられ、アラームログが書かれます。自動で処理できないイベントにも同じように印が付けられ、人の手でクレジットが付与されるか、返金が開始されます。コードには自動返金も自動補償もありません。
外から見ると支払いが失われたように見えるため、もう一つの場合にも名前を付けておきます。そのアプリにウォレットがまだ存在しない場合、クレジットは付与されず、イベントはエラーとして数えられ、あとの再試行のために残されます。この探索はユーザーとアプリの組み合わせを鍵にしており、それが、あるアプリでの購入を別のアプリのウォレットに書き込ませない関門でもあります。
この画面が出品者を誤解させるところ
どの行も、画面が支えていない読み方です。
検証中のメッセージを、クレジットが作成されなかった証拠として読む。
この通知が報告しているのはアプリ自身の比較です。サーバー上にクレジットが存在するかどうかはストア画面が読み取る範囲の外にあり、このページもそれをこのメッセージから推測しません。
残高を動かそうとして、商品ページの更新の途中でもう一度支払う。
メッセージが求めているのは、しばらくしてからもう一度確認することであって、もう一度購入することではありません。2回目の支払いが何を生むかは、このページでは定まっていません。
アプリがそのうち自分からクレジットを知らせてくれると考える。
確認表示は、購入フロー自身の回数の決まった確認に結びついています。その範囲が閉じたあとは、残高をもう一度読むことが現在の数字を知る方法です。
内部の手動対応やアラームが自分のところに届くと期待する。
どちらも配信経路の内部的な結末です。読み取った範囲には、出品者向けのキュー、状態表示、依頼の経路は現れていません。待つ対象ではありません。
回数の決まった確認の範囲を、時間についての約束として受け取る。
この範囲が区切っているのは、アプリがどれだけ見続けるかだけです。配信にどれだけ時間がかかるかについて、ここでは何も述べていません。
支払いが失敗したと結論づける前に
画面がすでに伝えたこと、そして画面もこのページも伝えていないこと。
- 通知は支払いを受け取ったと述べている。その部分はメッセージ自身に書かれている。
- 確認表示がないことは、変化が観測されなかったという意味であり、変化が起きなかったという意味ではない。
- 支払う前にストア画面の読み込みが不調だった場合、比較に基準がないままだった可能性がある。
- 購入のあとに表示される残高はクライアントの計算ではなくサーバーに保存された数字なので、あとでもう一度読むことが現状を知る方法になる。
- サーバー側の支払い記録について、画面はどちらの向きにも報告しない。
- 配信にどれだけ時間がかかるかをこのページは述べておらず、すべての支払いが必ずクレジットになるとも述べていない。
このページが定めないこと
- サーバー上でクレジットがどのように、どの順序で、どれくらいの速さで書き込まれるのか。その面で確認されたのは、クライアントの待機と表示の動作だけです。
- すべての支払いが最終的にクレジットになること。ここではその結末を約束していません。
- ウォレットの再読み取りの回数、再試行の回数、遅延、間隔、試行の上限。これらはコードに組み込まれた定数であり、公開していません。
- ストアや決済プロバイダーの内部の動作。決済シートがどう開くのか、それぞれの再試行がどう予約されるのか、どのフィールドを送るのか。
- 返金、サブスクリプションの更新と解約というフロー。アプリはストアのアカウントページへのリンクを出しますが、フロー自体はこの面にはありません。
- 手動での確認に回ったイベントのための運用画面やキュー表示が存在するかどうか。確認されたのはデータベースの記録、ログ、メールのアラームだけです。
- 価格、クレジットの数量、パックやプランの名称、通貨。このページはそれらを一切扱いません。
- 同じストア通知が繰り返し処理されても無害かどうか。その領域はここでは扱っておらず、それについての主張もしません。
- ここで説明したサーバー側の処理が、配信済みのビルドで動いていること。読み取ったのはソースツリーの状態であり、稼働中の検証ではありません。
これらの記述の出どころ
クライアント側の記述は、Jewelry AIモバイルアプリのストア画面apps/jewelry-mobile/src/app/store/index.tsxと、英語メッセージカタログapps/jewelry-mobile/src/i18n/catalogs/en-US.ts:195から読み取りました。その読み取りが定めるのはアプリの待機と表示の動作であり、それ以上のものではありません。
サーバー側の記述は、同じツリーのapps/api/src/webhooks/revenuecat.service.tsから2026年8月18日に読み取りました。その読み取りが定めるのは、クレジットに変換できないストア通知に対してコードが何をするか、つまり記録し、保留し、再試行し、引き上げることです。ストアについても、時間についても、配信済みのリリースについても、何も定めません。
よくある質問
支払ったのに、クレジットを検証中だとアプリが言います。支払いは行われたのでしょうか。
メッセージは、支払いを受け取ったこと、検証がまだ続いていることを述べています(apps/jewelry-mobile/src/i18n/catalogs/en-US.ts:195)。その文言を超えて、ストア画面が報告するのは自分のウォレット読み取りだけです。支払いの記録は読み取っていないため、請求がどうなったのかを知る場所ではありません。
検証中のメッセージは、クレジットが作成されなかったという意味ですか。
いいえ。この通知は、確認の範囲の中でサーバー上のウォレットの変化が観測されなかったとき、または購入前の読み取りが失敗して比べる基準がなかったときに表示されます。後者の場合、クレジットが届いていても通知が出ることがあります。
残高を動かすために、もう一度購入したほうがよいですか。
通知が求めているのは、しばらくしてからもう一度確認することであって、2回目の購入ではありません。2回目の支払いが何を生むかについてこのページは何も主張していないため、買い直しを対処法として支持することはできません。
クレジットになっていない支払いを早める方法はありますか。
アプリからはありません。クレジットに変換できなかったストア通知は、記録され、保留され、再試行され、固定の試行回数を使い切ると手動での確認に引き上げられてアラームログが残ります。すべてサーバー側の処理です(apps/api/src/webhooks/revenuecat.service.ts)。読み取った範囲には、出品者がそれを起動したり、依頼したり、追跡したりする手段は現れていません。そのため、こちら側でできる実際の行動は、あとで残高をもう一度読むことです。