この記事では、2026年7月から8月にかけて一時的に利用可能だったiDEALのチェーン引き出しルートをまとめています。その後、iDEALの制限は明らかに厳格化され、「1つのアカウントにつき1回のスキャン」という方式も導入されました。ここでは、当時確認されたリクエストやステータスの変化を記録として残しておきます。
声明 :本稿では、オープンソースコミュニティの既存プロジェクトやリンク抽出スクリプトを参考にしました。私が担当した部分は、主にリンクの抽出とそれに続く決済プロセスを連携させることでした。関連するAPIやリスク管理ルールは随時変更される可能性があるため、ここではプロトコルの研究およびトラブルシューティングの記録としてのみ記載しています。
1. iDEALの銀行振込と直結カードの違い
1.1 なぜチェーンの引き上げが必要なのか?
ChatGPTの「Checkout」ではStripeが利用されています。アクセス元のIPアドレスが異なる地域にある場合、システムはその地域で利用可能な決済方法(オランダのiDEAL、インドのUPI、ブラジルのPIXなど)を表示します。
ここではまず、アクセス元のIPアドレスの地域を確認し、次に billing_details.country、billing_details.currency 決済情報などが当該地域と一致していること。オランダのIPアドレスからの通常のチェックアウト応答では、payment_method_types 含まれる可能性がある ideal。
ティチェーンは、支払い方法を迂回したり、無理やり有効にしたりはしていません。プログラムは、Checkoutがすでに ideal 引き続き、対応するPaymentMethodを作成し、その後の requires_action ステータスから、銀行の決済画面へのリダイレクトURLを読み取ります。
1.2 ダイレクトカードとiDEALの引き落としチェーンの分岐の比較
自動化ソリューションにおいて、「ダイレクトカード連携」と「iDEAL チェーン引き出し」はまったく別のものです:
| 次元 | プリペイドカードの登録方法 | iDEAL チェーンソリューション |
|---|---|---|
| 支払い方法の基盤 | アカウントに事前に保存し、添付済みのもの pm_ 銀行カード | 今回のチェックアウトで一時的に作成された独立した pm_ |
| ユーザーとの対話 | すべてバックエンドまたはアカウント内で完了します | 必ず第三者の銀行の窓口に引き渡さなければならない |
| リスク管理上の重点項目 | BIN(カード番号)の信頼性とSetupIntentによる認証 | エンドツーエンドのIP/TLSフィンガープリントの一致性とリダイレクトの真正性 |
| 最終成果物 | 直接、紐付けまたは引き落としを完了する | 支払いの手続きに進める「Provider Redirect」リンクを取得する |
flowchart TD
A["有效 Access Token (AT)"] --> B["创建对应区域的优惠 Checkout"]
B --> C["应用 Promotion 并校验最终金额"]
C --> D{"支付路径决策"}
subgraph DirectCard ["直卡分支"]
E1["读取已绑定的默认 pm_"] --> E2["创建 ConfirmationToken"]
E2 --> E3["Stripe 确认扣款"]
end
subgraph IdealExtract ["iDEAL 提链分支"]
F1["向 Stripe 创建 iDEAL pm_"] --> F2["向平台发起 Confirm 确认"]
F2 --> F3["捕获 requires_action 状态"]
F3 --> F4["提取 Provider Redirect URL"]
end
D -->|直卡| E1
D -->|iDEAL| F1
2. iDEALの出金手続きの流れ
当時のブラウザのHARでパケットをキャプチャしたところ、ユーザーのログインセッション(AT)を取得してからリダイレクトリンクを取得するまで、以下の9つのステップを経る必要があることがわかった:
1. Session 鉴权准备 → 获取并校验 Access Token
2. 创建 Checkout 会话 → 传入 country="NL", currency="EUR", checkout_ui_mode="custom"
3. 应用优惠 (Promotion) → 绑定试用优惠活动(如 0 元试用资格)
4. 税务与会话初始化 → 调用 Stripe payment_pages/init 或 elements/sessions
5. 前置状态核验 → 校验 payment_method_types 包含 ideal 并对齐金额
6. 创建 PaymentMethod → 向 Stripe 申请 type="ideal" 的临时 pm_
7. 确认支付 (Confirm) → 调用平台 /confirm 接口触发转交
8. 处理审批 (Approve) → 遇 requires_approval 时补充挑战凭证或等待上游放行
9. 提取跳转链接 → 从 requires_action.redirect_to_url 提取目标地址
sequenceDiagram
participant Worker as 自动化 Worker
participant OAI as OpenAI 账单服务
participant Stripe as Stripe 网关
participant Bank as iDEAL 银行网关
Worker->>OAI: POST /payments/checkout (NL/EUR, custom)
OAI-->>Worker: 返回 oaics_xxxx 与 publishable_key
Worker->>OAI: POST /payments/checkout/promotion (应用优惠)
Worker->>Stripe: POST /v1/payment_methods (type=ideal, bank=xxx)
Stripe-->>Worker: 返回 pm_ideal_xxxx
Worker->>OAI: POST /payments/checkout/confirm (带入 pm_)
OAI->>Stripe: 请求扣款/授权
Stripe-->>OAI: 返回 requires_action (redirect_to_url)
OAI-->>Worker: 返回包含 hooks.stripe.com/redirect 的跳转结构
Worker->>Worker: 解析并安全校验 Hostname
Worker-->>Bank: (交付给用户或进一步完成支付)
3. PaymentMethod を作成する前のチェック
中間状態が整合していない場合、リクエストを続行しても使用できないオブジェクトが残ってしまうだけです。そのため、PaymentMethod を作成する前に、以下のチェックを完了しておく必要があります。
3.1 チェックアウト・セッションの存在確認
注文作成APIの設定が完了したら、必ず取得する必要があります oaics_... 指定された形式のセッションIDとStripe Publishable Key。もし、基盤となるセッションIDが含まれていない通常のHostedウェブページのリンクしか入手できない場合、その後、基盤となるAPIを呼び出すことはできません。
3.2 支払い方法の確認
Stripe が iDEAL をサポートしているからといって、すべての地域やアクセス IP におけるチェックアウトで iDEAL が返されるとは限りません。コードで確認する必要があります。 payment_method_types 含まれているか "ideal";ない場合は、現在のタスクを中止し、独自に追加したり有効化したりしようとしないでください。
3.3 課金スナップショット(Snapshot)と金額ベースのアクセス制御
「無料トライアル」キャンペーンに参加する場合は、最終金額を個別に確認する必要があります:
- プロモーションAPIが成功を返しても無効であり、Checkout Snapshot内のデータを再度読み込む必要があります。
amount_total; - 「0元トライアル」の場合、最終的な支払額は厳密に0でなければなりません。定価でのチャージの場合も、金額は表示価格と厳密に一致していなければなりません。
- 金額が一致しない場合(例:元の価格である20ユーロに戻った場合など)、直ちに確認を中止してください。
4. PaymentMethod を作成し、確認ステータスを処理する
事前チェックをすべて通過して初めて、プログラムはStripeに対し、当該注文用のiDEAL PaymentMethodの作成を申請します。
4.1 PaymentMethod の単回制限
iDEALの pm_ これは1回限りのもので、現在のこのチェックアウトにのみ紐付けられます。もしこのラウンドが途中で失敗した場合、前のラウンドで生成された pm_ 必ず直ちに廃棄し、次の注文に流用して再利用することは絶対に避けてください。
4.2 確認後のいくつかの状態
プラットフォームの /confirm その後、応答は通常、以下の3つのケースのいずれかに該当します:
- 戻る
requires_action、そのうちにはredirect_to_url、URLの抽出を続行できます; - 戻る
requires_approval、Turnstile PoW による計算能力証明付きの Sentinel トークンを追加するか、プラットフォームによる非同期処理を待つ必要があります; - Stripe または上流の銀行は依然として
processing、短周期でのステータス確認が必要である。
flowchart TD
A["POST /checkout/confirm"] --> B{"解析当前响应状态"}
B -->|含有 redirect_to_url| C["提取并验证 Redirect URL"]
B -->|requires_approval| D["触发 Sentinel / Turnstile 凭证审批"]
D --> E["短周期轮询 Checkout 状态"]
B -->|processing / pending| E
E -->|成功生成跳转| C
E -->|超时 / 拒单 / 状态失效| F["标记失败并优雅退出"]
C --> G["输出 provider_link_ready"]
5. ネットワークおよびリダイレクトの確認
自動化プロセスにおいて、ネットワークの出口の変更や誤ったリダイレクト先アドレスが、失敗の原因となる可能性が最も高い。
5.1 全プロセスにおける IP および TLS フィンガープリントの一致性
注文作成、初期化、作成 pm_ 最終的な確認の段階では、リンク全体を次の状態に保つ必要があります 同一の送信元IPアドレス 同じ TLS フィンガープリント(例えば、 curl_cffi (Chrome または Safari の特定のバージョン)。最初にプロキシ A を使用して注文を作成し、その後プロキシ B に切り替えて確認すると、次のような通知が届く可能性があります。 invalid_request_error あるいは注文を拒否する。
5.2 リダイレクトドメインのセキュリティ検証
URLを取得した後、単に文字列検索を行うだけでは不十分です(例えば url.includes("ideal.nl"))リダイレクトの許可やドメイン名の偽装は、いずれも次のような判断基準を満たす可能性があります:
https://ideal.nl.attacker.invalid/pay
https://phishing-site.example/?redirect=https://ideal.nl
プログラムは、標準のURL解析ライブラリを使用してホスト名を抽出してから、ホワイトリストと照合する必要があります。Stripeの公式リダイレクトドメイン(例: hooks.stripe.com)および信頼できる銀行のゲートウェイドメイン名。それ以外のアドレスはすべて破棄されます。
6. 引き出しと支払いを別々に記録する
ツールでは、「チェーンの引き上げ」と「支払い」を2つのステータスに分けることができます:
{
"jobId": "ideal_task_98234",
"extractionStatus": "provider_link_ready",
"paymentStatus": "awaiting_payment",
"expiresAt": "2026-08-20T00:25:00Z"
}
provider_link_ready:通常の確認結果から、支払い可能な決済リンクを取得しました;awaiting_payment:まだ支払いが完了していないため、相手が銀行の画面で実際にQRコードをスキャンするか、承認を完了するまで待つ必要があります。
別々に記録することで、リンクの生成と実際の支払いについて、それぞれタイムアウトや再試行の処理を行うことができます。
このルートは今でも使えるのでしょうか
このログは、主に Stripe Checkout、PaymentMethod、Confirm、および Redirect 間のステータスの順序を記録したものです。
決済のリスク管理は絶えず変化しています。iDEAL のような方式では、カードの登録やカード番号の入力は行われません。注目すべき点は、決済方法が利用可能かどうか、全プロセスにおける IP/TLS フィンガープリントが一致しているかどうか、および確認後の状態です。リダイレクトリンクを取得したからといって決済が完了したわけではなく、その後も銀行のページで承認を行い、決済結果を確認する必要があります。この記事では、将来のトラブルシューティングに備えて、当時のリクエスト順序を主に記録しています。

