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

WordPress Gravity Form:无法获取AWS返回的答题正确率并展示

解决Gravity Forms REST API 401权限错误及前端展示答题正确率问题

一、401权限错误的核心原因及修复步骤

1. 检查API密钥权限

Gravity Forms REST API的权限是细粒度控制的,你当前的401错误大概率是API密钥未分配条目读取权限:

  • 登录WordPress后台,进入「Gravity Forms > 设置 > REST API」
  • 找到你创建的API密钥,点击编辑,确保勾选「Entries > Read」权限(对应权限标识entries_read)

2. 验证Basic Auth编码正确性

Basic Auth的格式是Consumer Key:Consumer Secret拼接后做Base64编码,你需要确认:

  • 编码字符串是「API密钥的Consumer Key」+ 冒号 +「API密钥的Consumer Secret」,没有搞反或遗漏字符
  • 重新生成编码替换原有Authorization头的值,比如用终端命令生成:
    echo -n "你的Consumer Key:你的Consumer Secret" | base64
    

3. 优化curl请求(过滤特定条目)

直接请求所有条目会返回大量数据,且权限要求更高,建议添加过滤参数只获取当前用户的最新提交:

curl -X GET 
  https://reproductivehealth.adrianmiddletonfwd.co.uk/wp-json/gf/v2/entries?search={"field_filters":[{"key":"created_by","value":"当前用户ID"}],"sorting":[{"key":"date_created","direction":"DESC"}],"paging":{"page_size":1}} 
  -H 'Authorization: Basic 正确的Base64编码值' 
  -H 'Content-Type: application/json'

二、前端展示正确率的更优方案(绕过REST API权限问题)

直接调用GF的REST API存在密钥泄露风险,更安全的方式是利用GF的钩子在提交时存储分数,再在成功页面读取展示:

1. 存储分数到用户元数据/会话

将以下代码添加到主题的functions.php文件中:

add_action('gform_after_submission', 'save_quiz_score', 10, 2);
function save_quiz_score($entry, $form) {
    // 替换为AWS返回正确率实际存储的字段键(比如自定义字段的ID对应键,如'field_10')
    $correct_rate = $entry['field_10'];
    
    // 登录用户存储到元数据,游客存储到会话
    if (is_user_logged_in()) {
        update_user_meta(get_current_user_id(), 'quiz_correct_rate', $correct_rate);
    } else {
        session_start();
        $_SESSION['quiz_correct_rate'] = $correct_rate;
    }
}

2. 在提交成功页面展示分数

在成功页面的模板中添加以下代码:

<?php
$correct_rate = '';
if (is_user_logged_in()) {
    $correct_rate = get_user_meta(get_current_user_id(), 'quiz_correct_rate', true);
    // 可选:展示后清空存储,避免重复显示
    delete_user_meta(get_current_user_id(), 'quiz_correct_rate');
} else {
    session_start();
    $correct_rate = isset($_SESSION['quiz_correct_rate']) ? $_SESSION['quiz_correct_rate'] : '';
    unset($_SESSION['quiz_correct_rate']);
}

if ($correct_rate) {
    echo "<p>你的答题正确率:{$correct_rate}%</p>";
}
?>

三、若必须使用REST API的安全中转方案

如果一定要通过API获取,不要直接暴露GF的API密钥,而是创建自定义REST端点做中转:

add_action('rest_api_init', 'register_custom_quiz_score_endpoint');
function register_custom_quiz_score_endpoint() {
    register_rest_route('custom/v1', '/quiz-score', [
        'methods' => 'GET',
        'callback' => 'get_user_quiz_score',
        'permission_callback' => function() {
            // 权限控制:仅允许当前用户查看自己的分数
            return is_user_logged_in() || isset($_COOKIE['gform_submission_' . $form_id]);
        }
    ]);
}

function get_user_quiz_score(WP_REST_Request $request) {
    $form_id = 1; // 替换为你的表单ID
    $user_id = get_current_user_id();
    
    // 通过GFAPI获取当前用户最新提交
    $entries = GFAPI::get_entries([
        'field_filters' => [
            ['key' => 'created_by', 'value' => $user_id],
            ['key' => 'form_id', 'value' => $form_id]
        ],
        'sorting' => ['key' => 'date_created', 'direction' => 'DESC'],
        'paging' => ['page_size' => 1]
    ]);

    if (!empty($entries)) {
        $score = $entries[0]['field_10']; // 替换为存储分数的字段键
        return new WP_REST_Response(['correct_rate' => $score], 200);
    } else {
        return new WP_REST_Response(['message' => '未找到答题记录'], 404);
    }
}

前端直接调用自定义端点:https://你的域名/wp-json/custom/v1/quiz-score,无需携带API密钥。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 00:52:40