WordPress の ECサイト構築:WooCommerce用 Paygent決済プラグインのエンドポイントアクセスが401になる問題の調査と対応メモ

当ページのリンクには広告が含まれています。

WordPress の ECサイト構築

WooCommerce 用 Paygent決済プラグインの
エンドポイントアクセスが401になる問題の調査と対応メモ

概要

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決済プラグインの組み合わせについては、あまり情報がネットには出ていないため、同じ状況に困っている方の助けになれば幸いです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次