2026年7月21日

2026年7月21日

WooCommerceの決済エラーを解決する方法

はじめに

WooCommerceのチェックアウトページでクレジットカード情報を入力して「注文する」を押したがエラーが出て決済できない・注文が「保留中」から「処理中」に変わらない・Stripeの決済は通っているのにWooCommerceに反映されないといった問題の解決方法を解説します。

症状・原因

  • SSL証明書が無効でHTTPS通信でないためStripe等の決済ゲートウェイが動作しない
  • WooCommerceのWebhookがStripeから受信できていない(IPN受信エラー)
  • セキュリティプラグインがチェックアウトページのPOSTリクエストをブロックしている
  • nonce検証エラーがキャッシュプラグインによって引き起こされている

解決手順

ステップ1:決済エラーを診断する

# ✅ WooCommerce のログを確認
ls /var/www/html/wp-content/uploads/wc-logs/
# → stripe-*.log  paypal-*.log  woocommerce-*.log

# エラーログを表示
tail -50 /var/www/html/wp-content/uploads/wc-logs/stripe-$(date +%Y-%m-%d).log

# ✅ WooCommerce のデバッグモードを有効化
wp option update woocommerce_stripe_settings \
    "$(wp option get woocommerce_stripe_settings --format=json --path=/var/www/html/ | \
    python3 -c 'import json,sys; d=json.load(sys.stdin); d["logging"]="yes"; print(json.dumps(d))')" \
    --format=json --path=/var/www/html/

# ✅ SSL を確認(決済には HTTPS 必須)
curl -sI https://example.com/checkout/ | head -3
# → HTTP/2 200 ← HTTPS で動作中

# ✅ wp-config.php で HTTPS を強制
wp eval "echo is_ssl() ? 'HTTPS: YES' : 'HTTPS: NO';" --path=/var/www/html/

ステップ2:よくある決済エラーを修正する

// ✅ 「Your session has expired」エラーの修正
// キャッシュプラグインがチェックアウトページをキャッシュしている場合

// wp-config.php に追加
define('WOOCOMMERCE_CHECKOUT', true);
// または WooCommerce は自動的にチェックアウトページにDONOTCACHEPAGEを設定する

// ✅ セキュリティプラグインによるブロックの確認
// Wordfence / iThemes Security のファイアウォールログを確認
// → POST /checkout/ が403でブロックされていないか

// ✅ nonce エラーの修正
add_filter('woocommerce_checkout_fields', function($fields) {
    // nonce の有効期間を延長(キャッシュ環境での問題対策)
    return $fields;
});

// ✅ チェックアウトページをキャッシュ除外に追加
// W3 Total Cache / WP Super Cache の設定で
// /checkout/ を「キャッシュしない URL」に追加
add_filter('wpsupercache_rejected_strings', function($strings) {
    $strings[] = 'checkout';
    $strings[] = 'cart';
    $strings[] = 'my-account';
    return $strings;
});

ステップ3:Stripe の決済エラーを修正する

# ✅ Stripe の Webhook を確認
wp option get woocommerce_stripe_settings --format=json --path=/var/www/html/ | \
    python3 -c 'import json,sys; d=json.load(sys.stdin); print(d.get("webhook_secret", "NOT SET"))'

# ✅ Stripe Webhook エンドポイントを設定
# Stripe ダッシュボード → Webhooks → エンドポイントを追加
# URL: https://example.com/?wc-api=stripe_webhook

# ✅ Stripe の Webhook をテスト
curl -X POST https://example.com/?wc-api=stripe_webhook \
    -H "Content-Type: application/json" \
    -d '{"type":"ping"}'
# → 200 OK ← Webhook が受信できている

# ✅ Stripe のテストモードで動作確認
# テストカード番号: 4242 4242 4242 4242 (成功)
#                  4000 0000 0000 0002 (拒否される)
#                  4000 0025 0000 3155 (3DS認証が必要)

ステップ4:注文ステータスを手動で修正する

# ✅ 保留中の注文を確認
wp wc shop_order list --status=pending --format=table \
    --user=1 --path=/var/www/html/
# → ID  STATUS   TOTAL  DATE
# → 123 pending  5000   2024-01-01

# ✅ 注文ステータスを手動で更新
wp wc shop_order update 123 \
    --status=processing \
    --user=1 \
    --path=/var/www/html/

# ✅ 支払い完了イベントを手動でトリガー
wp eval "
\$order = wc_get_order(123);
\$order->payment_complete('manual_payment_id');
echo 'Order status: ' . \$order->get_status();
" --path=/var/www/html/

# ✅ 重複注文を確認(決済が2回処理された場合)
wp db query "
SELECT ID, post_status, post_date
FROM wp_posts
WHERE post_type = 'shop_order'
AND post_date > DATE_SUB(NOW(), INTERVAL 1 HOUR)
ORDER BY post_date DESC
LIMIT 10;
" --path=/var/www/html/

ステップ5:決済後のメール送信を確認する

# ✅ WooCommerce メールの送信テスト
wp eval "
\$order = wc_get_order(123);
// 注文確認メールを再送
WC()->mailer()->get_emails()['WC_Email_Customer_Processing_Order']->trigger(123);
echo 'Email sent for order 123';
" --path=/var/www/html/

# ✅ メールが届かない場合の確認
# WordPress の SMTP 設定を確認
wp eval "
\$result = wp_mail(
    get_option('admin_email'),
    'WooCommerce Mail Test',
    'Test email from WooCommerce'
);
echo \$result ? 'Sent' : 'Failed';
" --path=/var/www/html/

# ✅ WooCommerce のメール設定を確認
wp option get woocommerce_email_from_address --path=/var/www/html/
# → noreply@example.com ← 送信元アドレス

# ✅ メール送信に外部 SMTP を使用(WP Mail SMTP プラグイン推奨)
wp plugin install wp-mail-smtp --activate --path=/var/www/html/

注意事項

  • 決済ページ(チェックアウト・マイアカウント・カートページ)は絶対にキャッシュしてはいけません。W3 Total Cache・WP Super Cache等のキャッシュプラグインでこれらのページをキャッシュ除外に設定してください。キャッシュされた決済ページではnonceが古くなりセッションエラーが発生します
  • Stripeの本番APIキーとテストAPIキーを混在させないでください。本番環境では本番APIキーのみを使用し、開発環境ではテストAPIキーを使用してください

まとめ

WooCommerce決済エラーの解決は①wc-logs/でエラーログ確認・Stripeデバッグモード有効化・SSL(HTTPS)の確認、②キャッシュプラグインでチェックアウト/カートをキャッシュ除外に設定・セキュリティプラグインのブロックを確認・nonce期限エラーの対処、③Stripe Webhookエンドポイントの設定確認・テストカードで動作確認・Webhook受信テスト、④保留中の注文をwp wc shop_order updateで手動更新・payment_complete()で支払い完了処理を実行、⑤注文確認メールの再送テスト・外部SMTPで確実なメール送信・送信元アドレスの確認の手順で対応します。

お気軽にご相談ください

お見積りへ お問い合わせへ