You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

带QR刷新的PHP cURL身份验证脚本迁移WordPress遇阻求助

WordPress插件适配链式API身份验证流程优化方案

核心问题排查与修复方向

  • 替换原生cURL为WordPress内置wp_remote_post/wp_remote_get,规避服务器环境对cURL的限制,同时复用WP的HTTP配置(如代理、SSL设置)
  • 完善AJAX请求的权限验证,添加nonce防止CSRF攻击
  • 重构前端定时刷新逻辑,确保与后端AJAX接口正确联动
  • 增加API请求的错误捕获与日志记录,方便调试

适配后的完整插件代码

<?php
/**
 * Plugin Name: 扫码身份验证插件
 * Description: 基于链式API的扫码身份验证功能,支持短代码调用
 * Version: 1.0
 */

// 定义API凭据(请替换为你的实际信息)
define('AUTH_API_KEY', '你的静态API密钥');
define('API_ENDPOINT_1', 'https://你的端点1地址');
define('API_ENDPOINT_2', 'https://你的端点2地址');

// 注册短代码
add_shortcode('scan_auth', 'scan_auth_shortcode');
function scan_auth_shortcode() {
    ob_start();
    ?>
    <div id="scan-auth-container">
        <div id="qr-code-area">正在生成二维码...</div>
        <div id="user-info-area" style="display:none;"></div>
    </div>

    <script>
        jQuery(document).ready(function($) {
            let orderRef = '';
            let refreshInterval;

            // 初始化请求获取orderRef和初始QR码
            $.ajax({
                url: '<?php echo admin_url('admin-ajax.php'); ?>',
                type: 'POST',
                data: {
                    action: 'init_scan_auth',
                    nonce: '<?php echo wp_create_nonce('scan_auth_nonce'); ?>',
                    user_ip: '<?php echo $_SERVER['REMOTE_ADDR']; ?>'
                },
                success: function(response) {
                    if (response.success) {
                        orderRef = response.data.order_ref;
                        $('#qr-code-area').html('<img src="' + response.data.qr_code + '" alt="扫码验证">');
                        // 启动每5秒刷新QR码的定时器
                        refreshInterval = setInterval(refreshQrCode, 5000);
                        // 轮询检查扫码状态
                        checkScanStatus();
                    } else {
                        $('#qr-code-area').html('初始化失败:' + response.data.message);
                    }
                },
                error: function() {
                    $('#qr-code-area').html('请求失败,请稍后重试');
                }
            });

            // 刷新QR码
            function refreshQrCode() {
                $.ajax({
                    url: '<?php echo admin_url('admin-ajax.php'); ?>',
                    type: 'POST',
                    data: {
                        action: 'refresh_qr_code',
                        nonce: '<?php echo wp_create_nonce('scan_auth_nonce'); ?>',
                        order_ref: orderRef
                    },
                    success: function(response) {
                        if (response.success) {
                            $('#qr-code-area img').attr('src', response.data.qr_code);
                        } else {
                            clearInterval(refreshInterval);
                            $('#qr-code-area').html('二维码刷新失败:' + response.data.message);
                        }
                    }
                });
            }

            // 检查扫码状态,成功后获取用户信息
            function checkScanStatus() {
                $.ajax({
                    url: '<?php echo admin_url('admin-ajax.php'); ?>',
                    type: 'POST',
                    data: {
                        action: 'check_scan_status',
                        nonce: '<?php echo wp_create_nonce('scan_auth_nonce'); ?>',
                        order_ref: orderRef
                    },
                    success: function(response) {
                        if (response.success) {
                            if (response.data.scanned) {
                                clearInterval(refreshInterval);
                                $('#qr-code-area').hide();
                                $('#user-info-area').show().html('用户信息:<br>' + JSON.stringify(response.data.user_info));
                            } else {
                                // 未扫码,继续轮询(间隔2秒)
                                setTimeout(checkScanStatus, 2000);
                            }
                        } else {
                            setTimeout(checkScanStatus, 2000);
                        }
                    }
                });
            }
        });
    </script>
    <?php
    return ob_get_clean();
}

// AJAX初始化验证流程
add_action('wp_ajax_init_scan_auth', 'init_scan_auth_callback');
add_action('wp_ajax_nopriv_init_scan_auth', 'init_scan_auth_callback');
function init_scan_auth_callback() {
    // 验证nonce
    if (!wp_verify_nonce($_POST['nonce'], 'scan_auth_nonce')) {
        wp_send_json_error(['message' => '权限验证失败']);
    }

    $user_ip = sanitize_text_field($_POST['user_ip']);
    $response = wp_remote_post(API_ENDPOINT_1, [
        'headers' => [
            'Authorization' => 'Bearer ' . AUTH_API_KEY,
            'Content-Type' => 'application/json'
        ],
        'body' => json_encode([
            'user_ip' => $user_ip
        ]),
        'timeout' => 10
    ]);

    if (is_wp_error($response)) {
        error_log('API端点1请求失败:' . $response->get_error_message());
        wp_send_json_error(['message' => '连接服务器失败']);
    }

    $body = json_decode(wp_remote_retrieve_body($response), true);
    if (isset($body['orderRef'], $body['qrCode'])) {
        wp_send_json_success([
            'order_ref' => $body['orderRef'],
            'qr_code' => $body['qrCode']
        ]);
    } else {
        error_log('API端点1返回格式错误:' . wp_remote_retrieve_body($response));
        wp_send_json_error(['message' => '获取验证信息失败']);
    }
}

// AJAX刷新QR码
add_action('wp_ajax_refresh_qr_code', 'refresh_qr_code_callback');
add_action('wp_ajax_nopriv_refresh_qr_code', 'refresh_qr_code_callback');
function refresh_qr_code_callback() {
    if (!wp_verify_nonce($_POST['nonce'], 'scan_auth_nonce')) {
        wp_send_json_error(['message' => '权限验证失败']);
    }

    $order_ref = sanitize_text_field($_POST['order_ref']);
    $response = wp_remote_post(API_ENDPOINT_1, [
        'headers' => [
            'Authorization' => 'Bearer ' . AUTH_API_KEY,
            'Content-Type' => 'application/json'
        ],
        'body' => json_encode([
            'orderRef' => $order_ref
        ]),
        'timeout' => 10
    ]);

    if (is_wp_error($response)) {
        error_log('QR码刷新请求失败:' . $response->get_error_message());
        wp_send_json_error(['message' => '刷新二维码失败']);
    }

    $body = json_decode(wp_remote_retrieve_body($response), true);
    if (isset($body['qrCode'])) {
        wp_send_json_success(['qr_code' => $body['qrCode']]);
    } else {
        error_log('QR码刷新返回格式错误:' . wp_remote_retrieve_body($response));
        wp_send_json_error(['message' => '获取新二维码失败']);
    }
}

// AJAX检查扫码状态并获取用户信息
add_action('wp_ajax_check_scan_status', 'check_scan_status_callback');
add_action('wp_ajax_nopriv_check_scan_status', 'check_scan_status_callback');
function check_scan_status_callback() {
    if (!wp_verify_nonce($_POST['nonce'], 'scan_auth_nonce')) {
        wp_send_json_error(['message' => '权限验证失败']);
    }

    $order_ref = sanitize_text_field($_POST['order_ref']);
    $response = wp_remote_post(API_ENDPOINT_2, [
        'headers' => [
            'Authorization' => 'Bearer ' . AUTH_API_KEY,
            'Content-Type' => 'application/json'
        ],
        'body' => json_encode([
            'orderRef' => $order_ref
        ]),
        'timeout' => 10
    ]);

    if (is_wp_error($response)) {
        error_log('扫码状态检查请求失败:' . $response->get_error_message());
        wp_send_json_error(['message' => '检查状态失败']);
    }

    $body = json_decode(wp_remote_retrieve_body($response), true);
    if (isset($body['scanned']) && $body['scanned']) {
        wp_send_json_success([
            'scanned' => true,
            'user_info' => $body['userInfo'] ?? '无用户信息'
        ]);
    } else {
        wp_send_json_success(['scanned' => false]);
    }
}

原独立脚本到WordPress插件的核心修改点

  1. 替换cURL为WP HTTP API:用wp_remote_post替代原生cURL,自动适配WordPress的服务器环境,避免cURL被禁用或配置冲突
  2. 添加AJAX权限验证:通过wp_create_nonce和wp_verify_nonce确保AJAX请求的合法性
  3. 封装短代码输出:通过短代码将前端HTML/JS和后端逻辑解耦,方便在文章/页面中调用
  4. 错误日志记录:用error_log记录API请求错误,便于调试定位问题
  5. 前端逻辑优化:拆分初始化、刷新QR码、检查扫码状态三个独立函数,逻辑更清晰,避免回调嵌套混乱

使用说明

  1. 将上述代码保存为scan-auth-plugin.php,上传至WordPress插件目录wp-content/plugins/
  2. 在WordPress后台启用插件
  3. 在需要显示扫码验证的页面/文章中插入短代码[scan_auth]
  4. 修改插件顶部的AUTH_API_KEY、API_ENDPOINT_1、API_ENDPOINT_2为你的实际API信息

内容的提问来源于stack exchange,提问作者user24331749

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 04:57:14