带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插件的核心修改点
- 替换cURL为WP HTTP API:用
wp_remote_post替代原生cURL,自动适配WordPress的服务器环境,避免cURL被禁用或配置冲突 - 添加AJAX权限验证:通过
wp_create_nonce和wp_verify_nonce确保AJAX请求的合法性 - 封装短代码输出:通过短代码将前端HTML/JS和后端逻辑解耦,方便在文章/页面中调用
- 错误日志记录:用
error_log记录API请求错误,便于调试定位问题 - 前端逻辑优化:拆分初始化、刷新QR码、检查扫码状态三个独立函数,逻辑更清晰,避免回调嵌套混乱
使用说明
- 将上述代码保存为
scan-auth-plugin.php,上传至WordPress插件目录wp-content/plugins/ - 在WordPress后台启用插件
- 在需要显示扫码验证的页面/文章中插入短代码
[scan_auth] - 修改插件顶部的
AUTH_API_KEY、API_ENDPOINT_1、API_ENDPOINT_2为你的实际API信息
内容的提问来源于stack exchange,提问作者user24331749
相关产品推荐
相关产品推荐

