WooCommerce決済が「処理中」で止まりサンクスページに遷移しない場合の対処法

WooCommerce決済が「処理中」で止まりサンクスページに遷移しない場合の対処法

WooCommerce決済が「処理中」で止まりサンクスページに遷移しない場合の対処法

WooCommerceでRazorpay決済を利用しているサイトで、支払い自体は成功しているのにチェックアウト画面が「処理中です。しばらくお待ちください」と表示されたまま止まり、注文完了ページへ遷移しない問題は、RazorpayのJavaScript SDKが正常に読み込まれていないか、他のプラグインとの競合によってフォーム送信処理が破損している場合に起こる。

特にサンドボックスモードでは正常に動作するのに本番環境でのみ発生する場合、APIキーの設定ミスや決済スクリプトのパス解決エラーが根本原因である可能性が高い。ブラウザの開発者コンソールを開くと GET .../build/undefined 403document.razorpayform.submit is not a function といったエラーが記録されているはずだ。以下では原因の特定から具体的な修正手順までを順に解説する。

ブラウザコンソールでエラーの全体像を把握する

ブラウザコンソールでエラーの全体像を把握する

まず最初に行うべきは、問題が起きているページで開発者ツールを開き、コンソールタブとネットワークタブに出力されているエラーを確認することだ。Razorpayの処理フローはほぼすべてフロントエンドのJavaScriptで制御されているため、バックエンドのログだけでは見えない問題がここに集中して現れる。

Chromeの場合、決済画面で F12 を押してDevToolsを開き、以下の手順で記録を取る。

STEP 1 コンソールタブを開き、ゴミ箱アイコンでログをクリアする
STEP 2 ネットワークタブを開き「プリザーブログ」にチェックを入れる
STEP 3 実際に決済を実行し、処理が止まるまでの全リクエストとエラーを記録する

記録した中で特に注目すべきは以下の2種類のエラーだ。

  • GET https://checkout-static-next.razorpay.com/build/undefined 403 というリクエストが発生している場合、Razorpay SDKのビルドパスが正しく解決されていない。末尾が /undefined になっているのが最大の手がかりだ。
  • Uncaught TypeError: document.razorpayform.submit is not a function は、決済フォームの送信メソッドが何らかの理由で失われていることを示す。他のJavaScriptによって上書きされているか、Razorpayのスクリプト自体が最後まで読み込まれていない可能性が高い。

GET …/build/undefined 403 エラーが示す根本原因

GET .../build/undefined 403 エラーが示す根本原因

Razorpayのチェックアウトスクリプトは、プラグインが動的に生成するパスに基づいて checkout-static-next.razorpay.com/build/【バージョン番号】 というURLから読み込まれる。このバージョン番号が何らかの理由で空になると /build/undefined という不正なURLが生成され、当然ながら403 Forbiddenで拒否される。

この現象は主に次の3つの状況で起こる。

本番用APIキーが未設定または誤ったキーが入力されている

Razorpayプラグインの設定画面(WooCommerce → 設定 → 決済 → Razorpay)を開き「本番用キーID」と「本番用キーシークレット」の両方が 本番環境用の正しい値 になっているか確認する。サンドボックス用のキーが誤って本番フィールドに入力されていると、スクリプトパスの生成に失敗する。キーはRazorpayダッシュボードの「Settings → API Keys」から再発行できる。

プラグインのバージョンが古いか不完全に更新されている

公式の「Razorpay for WooCommerce」プラグインが最新版かどうかを確認する。過去のバージョンには、特定の条件下でSDKバージョン文字列が空になる不具合が報告されている。wp-adminのプラグイン一覧で更新があれば適用し、問題が継続する場合は一度プラグインを完全に削除してから再インストールする。削除前に必ずAPIキーをメモしておくこと。

マルチカレンシープラグインがRazorpayの設定を上書きしている

WooCommerce Currency Switcher(FOXやAeliaなど)を使用している場合、通貨切り替えの過程でRazorpayの決済スクリプトに渡すパラメータが改変されることがある。特にジオベースで通貨を自動切り替えしている環境では、チェックアウトページ読み込み時に想定外の通貨コードがRazorpayに渡され、SDKの初期化に失敗するケースが確認されている。

通貨スイッチャー側の設定で、チェックアウトページと決済完了ページを通貨切り替えの対象外にするルールを追加しても改善しない場合、以下の方法で問題の所在を明確にできる。

Before(通貨スイッチャー有効時)
Razorpayに渡される通貨コードが undefined になり、スクリプトパスが /build/undefined
NGscript読み込み失敗 → 403
After(通貨スイッチャー無効化後)
Razorpayに正しい通貨コード(INR)が渡り、スクリプトパスが /build/v3.45.0 など正常に
OKscript読み込み成功 → 決済完了
エラー状態  修正後

document.razorpayform.submit is not a function を解消する

document.razorpayform.submit is not a function を解消する

このTypeErrorは、決済フォームを送信するタイミングで razorpayform オブジェクトの submit メソッドが存在しないことを意味する。原因は主に2つに絞られる。

JavaScriptの最適化や結合によるメソッド破損

LiteSpeed CacheやAutoptimizeなどのキャッシュ・最適化プラグインがJavaScriptを結合(Combine)したり、圧縮(Minify)したり、遅延読み込み(Defer)したりする設定が有効だと、Razorpayのフォームオブジェクトが初期化される前に他のスクリプトが実行され、document.razorpayform が不完全な状態になる。

JavaScriptの最適化機能をすべてオフにしても改善しない場合でも、LiteSpeed Cacheにはページ単位の最適化設定や「ゲストモード」など追加の最適化機能が存在する。プラグインを完全に無効化してテストした上で、それでも直らなければキャッシュ以外の競合を疑う。

サンクスページカスタマイズプラグインによるリダイレクト干渉

「WooCommerce Thank You Page」のような注文完了ページをカスタマイズするプラグインは、通常のリダイレクトフックを上書きする。Razorpayが決済完了後に実行する razorpayform.submit() が、この上書きされたフローと衝突し、メソッド呼び出し自体が失敗するケースがある。

サンクスページプラグインを無効化してテストした結果、問題が解消するのであれば、そのプラグインが原因だ。Razorpayとの互換性をプラグイン開発者に確認するか、よりシンプルなフックベースのカスタマイズ(テーマのfunctions.phpで制御)に切り替える。

プラグインの競合を段階的に切り分ける手順

プラグインの競合を段階的に切り分ける手順

エラーのパターンから明らかな原因を特定できない場合は、標準的なトラブルシューティングの手順で競合を絞り込む。本番サイトで作業する前に、必ずステージング環境を用意するか、メンテナンスモードを有効にしてから行う。

STEP 1 Razorpay以外の全プラグインを無効化する
STEP 2 標準テーマ(Twenty Twenty-Fourなど)に切り替える
STEP 3 本番APIキーでテスト決済を実行し、正常に動作するか確認する
STEP 4 プラグインを1つずつ有効化し、どのタイミングで問題が再発するか特定する

STEP 4では、まず通貨スイッチャーとキャッシュ系プラグインを最初に有効化してテストする。この2つが最も競合を起こしやすい。次にPixelYourSiteなどの外部スクリプトを注入するプラグインをテストし、最後にサンクスページプラグインを検証する。

RazorpayのWebhook設定も再確認する

フロントエンドのJavaScriptエラーに加えて、バックエンドのWebhookが正しく設定されていないと、決済完了後に注文ステータスが更新されない。Razorpayダッシュボードの「Settings → Webhooks」で以下を確認する。

  • Webhook URLが https://あなたのサイトURL/wc-api/razorpay_webhook/ になっている。
  • イベントに payment.authorizedrefund.created が最低限含まれている。
  • WebhookシークレットがWooCommerce側のRazorpay設定に入力した値と完全に一致している。
  • 重複したWebhook登録がない(過去のテストで作成した古いWebhookが残っていると競合する)。

よくある質問

サンドボックスでは正常なのに本番だけで止まるのはなぜですか?

本番用のAPIキー設定ミスか、本番環境専用のプラグイン(セキュリティや最適化)がRazorpayのスクリプトに干渉している可能性が高い。サンドボックスと本番で異なるキーを使っていることを再確認し、本番環境にのみ有効なプラグインを一時停止して切り分ける。

Razorpay以外の決済ゲートウェイでも同じ現象は起こりますか?

StripeやPayPalなど他の決済プラグインでも、JavaScriptの競合やリダイレクトフックの干渉によって同様の「処理中」ループが発生することがある。原因の切り分け手順はほぼ共通しているため、本記事のSTEPを他のゲートウェイにも応用できる。

コンソールにエラーが出ていないのに処理が止まる場合は?

PHPのメモリ不足や実行時間制限が原因で、決済完了後のサーバーサイド処理が途中で止まっている可能性がある。WooCommerceのステータスレポートでPHPのメモリ制限が256MB以上、最大実行時間が300秒以上あるか確認する。サーバーのエラーログも併せて調査する。

Razorpayプラグインを最新にしても直らない場合は?

プラグインの公式GitHubリポジトリで同様のIssueが報告されていないか確認する。解決策としてパッチが提供されていることもある。また、Razorpayのカスタマーサポートに本番環境のドメインとエラーの詳細を伝えて調査を依頼する方法も有効だ。APIキーの発行元アカウントに制限がかかっていないかも合わせて確認してもらえる。

PixelYourSiteを無効化せずに共存させる方法はありますか?

PixelYourSiteの設定で「チェックアウトページでのスクリプト実行を遅延させる」オプションをオフにするか、カスタムコードでRazorpayのスクリプトがPixelYourSiteより先に読み込まれるよう wp_enqueue_scripts の優先度を調整する。functions.phpに以下のようなコードを追加する方法もある。

add_action('wp_enqueue_scripts', function() {
    if (is_checkout()) {
        wp_dequeue_script('pys');
        wp_enqueue_script('pys', 'path/to/pys.js', array('razorpay'), null, true);
    }
}, 100);

このコードはあくまで概念を示すもので、実際のハンドル名やパスはプラグインのソースを確認して書き換える必要がある。

この記事のポイント

  • ブラウザコンソールで /build/undefined 403エラーや razorpayform.submit TypeErrorを確認する
  • 本番用APIキーが正しく入力されているか、Razorpayダッシュボードで再確認する
  • 通貨スイッチャーがチェックアウトページで干渉していないか検証する
  • JavaScript最適化プラグインを完全無効化し、サンクスページカスタマイズプラグインを停止してテストする
  • 全プラグイン無効化と標準テーマ切り替えで競合を段階的に切り分ける
佐々木 太陽

・ Reddit、Stack Overflow、WordPress.org フォーラムを日々巡回し、現場の悩みを拾い上げて記事化 ・ WordPress、WooCommerce、Next.js などモダンWeb制作領域のトラブルシューティングが専門 ・ 「検索しても答えが見つからなかった」を一つでも減らすことが目標 ・ エラーメッセージから根本原因にたどり着く粘り強い調査が得意 ・ 初心者がつまずきやすい箇所を先回りで解決する記事作りを心がけている

メッセージを残す