
WordPress の ECサイト構築
概要
WordPress + WooCommerce+Paygent決済プラグインを運用している環境で、2025年8月中旬頃より、Paygentからの通知がHTTP 401となり REST APIエンドポイント /wp-json/paygent/v1/check が拒否されるようになっていました。
注文自体は成立していたため、気づきが遅れましたが、何回か同様の連絡を受けて、ログ調査により状況を整理。原因を特定して対応を行いました。
現象:差分通知機能のために設定したエンドポイントURLがアクセス拒否
- Paygent側からのエンドポイントURLへのアクセスが 401 Unauthorized で拒否される
- WooCommerceログには
test mode is enabled表示(テストモードは有効にしていないのになぜ?) - WordPress側ではREST API自体は動作している
アクセスログは以下のような文字列が続き、Paygent側のIPアドレスからのアクセスが401になっていることが記録されています。これは、Paygentのサービスカウンターから連絡内容と一致していますね。
(PaygentのIPアドレス) ... "POST /wp-json/paygent/v1/check/ HTTP/1.1" 401 168
調査プロセス:REST APIが死んでいるのでは? からの追加調査
以下は、発生していた現象と私の予測をもとに、ChatGPTに状況を説明しながら原因を詰めていった流れです。
タイミング的には決済プラグインのバージョンアップ後に発生しているため、プラグインの動作チェックから入ります。
REST APIエンドポイントの仕様確認
https://ECサイトURL/wp-json/paygent/v1/check は→ POST限定エンドポイント
ブラウザでアクセスしても404が返るのは仕様通りの動作。正しくはPOSTメソッドでアクセスしないといけない。
プラグインコードの確認
401が発生していることから、アクセス制限を疑い、該当していると思われる内容を、プラグインソースコードから検索。
class-wc-paygent-endpoint.php 内のpaygent_permission_callback() にてIP制限を施していることを発見。
/**
* Check if the request is permitted.
*
* @param WP_REST_Request $request Request object.
* @return bool True if the request is permitted, false otherwise.
*/
public function paygent_permission_callback( $request ) {
$is_permitted_ips = apply_filters(
'paygent_permitted_ips',
array(
'(Paygent本番環境用サーバーアドレス)', // Add Paygent IP address.
'(Paygentテスト環境用サーバーアドレス)', // SandBox IP address.
)
);
$remote_ip = $request->get_header( 'x_real_ip' );
$is_permitted = false;
if ( in_array( $remote_ip, $is_permitted_ips, true ) ) {
$is_permitted = true;
}
if ( ! $is_permitted ) {
$wc_logger = wc_get_logger();
$wc_logger->info(
'Paygent test mode is enabled. IP address check is skipped.',
array(
'remote_ip' => $remote_ip,
'source' => 'paygent-endpoint',
)
);
if ( get_transient( 'paygent_ip_permission_error_sent' ) ) {
return;
}
$to = 'wp-admin@artws.info';
$subject = 'Paygent IP permission error';
$message = 'Paygent IP permission error occurred. Please check the IP address settings in the Paygent plugin settings.' . "\n\n" .
'Remote IP: ' . $remote_ip . "\n\n";
$headers = $request->get_headers();
$request_data = '';
foreach ( $headers as $key => $value ) {
$value_str = is_array( $value ) ? implode( ', ', $value ) : $value;
$request_data .= esc_html( "$key: $value_str\n" );
}
$message .= "\nRequest Data:\n" . $request_data;
$server_info = '';
foreach ( $_SERVER as $key => $value ) {
$clean_value = is_array( $value ) ? wp_json_encode( $value ) : (string) $value;
$server_info .= "$key: $clean_value\n";
}
$message .= "\nServer Information:\n" . $server_info;
$headers = array( 'Content-Type: text/plain; charset=UTF-8' );
wp_mail( $to, $subject, $message, $headers );
set_transient( 'paygent_ip_permission_error_sent', true, 1440 * MINUTE_IN_SECONDS );
}
$is_permitted = true;
return $is_permitted;
}
記載されている本番環境のIPアドレスが最新情報と異なっていたため対応を行う。ファイルを直接書き換えるのは、プラグイン更新時に再度編集の手間が発生するため、テーマディレクトリ内のfunctions.php に以下を追記。
// add permitted IP Address for Paygent
add_filter( 'paygent_permitted_ips', function( $ips ) {
$ips[] = '(Paygent本番環境用サーバーアドレス)'; // New Paygent Server IP Address 1 2024/04/22-
$ips[] = '(Paygentテスト環境用サーバーアドレス)'; // New Paygent Server IP Address 1 2024/04/22-
return $ips;
});
実際のアクセス元IPをログから確認
→ 本番通知元:正規のIPアドレスからのアクセス
→ 許可されているはずなのに、なぜか401が発生
アクセス制限ロジック部分のIPアドレス判定が特殊 X-Real-IP ヘッダが存在しないと失敗する
paygent_permission_callback 内のアクセス元のIPアドレスを取り出す処理が特殊だった。
$remote_ip = $request->get_header('x_real_ip');
$is_permitted = false;
if ( in_array( $remote_ip, $is_permitted_ips, true ) ) {
$is_permitted = true;
}
X-Real-IP が空だと許可判定に失敗する仕様だった
→ Paygentの通知には X-Real-IPヘッダが未付与のため正規のIPアドレスでのアクセスも失敗扱いになっていたことが判明。
Apache設定でヘッダ付与を追加
該当のバーチャルホストを設定するファイルの<VirtualHost>ディレクティブ内に X-Real-IPヘッダを付与する設定を追加。
RequestHeader set X-Real-IP "%{REMOTE_ADDR}s"
設定後、Apacheを再起動して、Paygent側からのエンドポイントアクセスに対してステータスコード200が返却されることを確認。
正規のIPアドレス - - [08/Dec/2025:21:49:20 +0900] "POST /wp-json/paygent/v1/check/ HTTP/1.1" 401 168
正規のIPアドレス - - [08/Dec/2025:21:49:26 +0900] "POST /wp-json/paygent/v1/check/ HTTP/1.1" 401 168
【以下修正後のアクセス】
正規のIPアドレス - - [08/Dec/2025:22:04:30 +0900] "POST /wp-json/paygent/v1/check/ HTTP/1.1" 200 8
正規のIPアドレス - - [08/Dec/2025:22:04:31 +0900] "POST /wp-json/paygent/v1/check/ HTTP/1.1" 200 8
正規のIPアドレス - - [08/Dec/2025:22:04:31 +0900] "POST /wp-json/paygent/v1/check/ HTTP/1.1" 200 8
正規のIPアドレス - - [08/Dec/2025:22:04:31 +0900] "POST /wp-json/paygent/v1/check/ HTTP/1.1" 200 8
対応内容
| 対策 | 内容 |
|---|---|
| サーバー設定更新 | Apacheで X-Real-IP を付与 |
| プラグイン設定上書き | 許可IPにPaygent本番IPを追加 |
| 動作テスト | curl+ログ監視で検証 |
| 再発監視 | 決済成功後のログを随時確認 |
所感(個人メモ)
決済が正常にできているからといって、裏で何が起こっているかは見てみないと分かりませんね。致命的でなかったとはいえ、Paygent側の問題発生の通知メールに気付かずにいたのが手痛いミスでした。
今回は使用している決済プラグインが、2.3系統から2.4系統にバージョンアップされた際に、IPアドレス制御のロジックなどが追加され、該当のファイルがほぼほぼ全改修されていたのですが、変更履歴の部分ではバグフィックスの表記だけだったので、実際のチェックまでは行っていませんでした。そして、見た感じでは正常に動いているというダブルパンチですね。
再発防止のため
当たり前ですが、お金に関わる部分のプログラム更新がかかる場合は、より慎重に変更点をチェックしていくべきですね。
- プラグイン更新時の変更点チェック
- Paygent発信ログの定期レビュー
- 401/403モニタリング(監視ツール連携)
何かおかしい動作があった場合は、すぐに気づける対応を作ることも重要と感じました。
まとめ
今回のトラブル原因は……
「X-Real-IP前提のIP制限仕様」
と サーバー設定のミスマッチ
解決は…
サーバーでX-Real-IP付与
+
許可IPの整理
サーバー環境に依存する部分ではありますが、リバースプロキシを併用して運用せず、直接ECサイトを公開している場合などは、X-Real-IP が取れないケースもありそうです。
WooCommerceとPaygent決済プラグインの組み合わせについては、あまり情報がネットには出ていないため、同じ状況に困っている方の助けになれば幸いです。



コメント