Skip to content

fix(store): 購入 hook が商品切替で進行中の結果を捨てず古い署名を送っていたのを直し二重署名の入口を塞ぐ (B-R15d・掟 15) - #633

Merged
cipherwebllc merged 1 commit into
mainfrom
fix/r6-b15d-purchase-hook-switch
Sep 24, 2026
Merged

cipherwebllc merged 1 commit into
mainfrom
fix/r6-b15d-purchase-hook-switch

Conversation

@cipherwebllc

Copy link
Copy Markdown
Owner

概要

第 6 回レビュー R15b (#622) で固定した既存の不具合の修正 (B-R15d) です。#622 の上に積んだ PR で、#622 の merge 後に main へ付け替わります。意図的な挙動変更で、money-path (Creator Store の購入) です。

直した不具合

Creator Store の購入 hook は、wallet の切り替えでは進行中の結果を捨てるのに、商品の切り替えでは捨てていませんでした。

  • 古い商品の遅い見積もりが、新しい商品の確認画面に出ることがありました。
  • 署名中に商品が変わると、古い商品の署名が見えないまま送られていました。
  • 古い商品の遅い「決済済み」応答で、見積もりのない provisioning 状態に入り、確認処理が止まっていました。

商品の切り替えも wallet の切り替えと同じ形で扱い、切り替え前の見積もり・署名・送信結果をすべて無視します (新しい内部 error code product_changed)。送信完了の判定は署名済み request の同一性で行うため、wallet を A→B→A と戻す経路の穴も同時に塞がります。

レビューで見つかった既存の入口 (同じ PR で修正)

  • 署名中・送信中に wallet の chain が変わると開始画面に落ち、確認ボタンから再署名できました → 確認画面を出し続け、支払い方法と確認ボタンを処理中は無効にします (文言の追加なし)。
  • prepare() が、未解決の署名済み request があるあいだも新しい購入を受け付けていました → reset() と同じ条件と署名中を拒否します (内部 error code purchase_in_progress)。

⚠️ 掟 15: 購入の署名と送信の制御に触れます。merge 前に user の明示レビューをお願いします。 新しい error code は既存の汎用文言 (「支払条件を確認できませんでした。支払い署名は行われていません。」) に落ちるため、messages/ の追加はありません。

お金への影響 (レビューの評価)

  • 払った購入が回復できなくなる経路は増えていません。server 側の settle は独立しており、ライブラリの読み取りで回復します (202 や不明は日次の reconcile が拾い、最大約 24 時間の遅れ)。
  • 失うのは表示だけです。切り替え前は止まったままの「確認中」表示が出ていましたが、wallet 切り替えと同じ idle になります。

検証

  • 新しいテスト 26 件 (hook 23・component 3)。修正前のコードでは意図した理由で落ち、修正後は通ります。R15b の「現状固定」の pin 2 件は意図して反転させました。
  • 別セッションの Opus 5.5 のレビュー: 承認 (blocker なし) → should-fix 2 件 (chain 切替・prepare の guard) を反映済み。ガードをそれぞれ外すと対応するテストが落ちます。
  • typecheck 0 / eslint 0 / full vitest 14,692 pass

残る表示の隙間 (お金の危険なし)

署名中に JPYC の署名プレビューを組み立てられない場合 (見積もり切れ等) は、確認画面ではなく開始画面に戻ります。操作は無効化され prepare() も拒否するため、再署名はできません。

🤖 Generated with Claude Code

https://claude.ai/code/session_01HeizmagJBgL5peL5mQpxkc

@vercel

vercel Bot commented Sep 24, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated
openpay Ignored Ignored Preview Sep 24, 2026 4:05pm UTC

Request Review

@cipherwebllc
cipherwebllc force-pushed the fix/r6-r15b-purchase-parsers branch from 9498528 to 8a6f937 Compare September 24, 2026 15:11
Base automatically changed from fix/r6-r15b-purchase-parsers to main September 24, 2026 16:05
…掟 15)

第 6 回レビュー R15b で固定した既存の不具合。商品が切り替わっても進行中の quote/署名/送信結果を
捨てず、古い商品の quote が review に出る・古い署名が見えないまま送られる・古い 200 settled で
quote=null の provisioning に入って止まっていた。wallet 切替と同じ形で商品切替でも捨てる
(product_changed・signedRequest の同一性で古い完了を無視)。レビューで見つかった既存の入口も塞ぐ:
署名/送信中の chain 切替で開始画面に落ちて再署名できた (確認画面を出し続け操作を disabled)・
prepare() が未解決の署名済み request の間も受け付けていた (purchase_in_progress で拒否)。
responseJson の null 本文の扱いは変えない (plans に記録)。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HeizmagJBgL5peL5mQpxkc
@cipherwebllc
cipherwebllc force-pushed the fix/r6-b15d-purchase-hook-switch branch from f463608 to 949e77c Compare September 24, 2026 16:05
@cipherwebllc
cipherwebllc merged commit f6f16e9 into main Sep 24, 2026
8 checks passed
@cipherwebllc
cipherwebllc deleted the fix/r6-b15d-purchase-hook-switch branch September 24, 2026 16:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant