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

Laravel项目集成OpenAI PHP API后端报错419求助

Laravel + OpenAI API 419错误问题解决

问题情况

在个人Laravel项目中使用openai-php/laravel时,前端提交的消息能显示在聊天框,但POST请求XHR POST http://127.0.0.1:8000/send返回419错误,控制台提示Fetch error: Server error。直接在JavaScript中调用OpenAI API端点可正常获取JSON响应,需求是实现后端处理逻辑,不排斥使用jQuery。

现有代码

JavaScript代码

//CSRF TOKEN
const csrfToken = document.querySelector('meta[name="csrf-token"]').getAttribute('content');
const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://api.openai.com/v1/chat/completions', true);
xhr.setRequestHeader('X-CSRF-TOKEN', csrfToken);

const button = document.getElementById('button-submit');
const chatWindow = document.getElementById('chat-window');
const url = '{{ url('send') }}';

//API FETCH ON BUTTON CLICK
button.addEventListener('click', function (){
    const input = document.getElementById('input').value;

    chatWindow.innerHTML += `<div class="messages-user">
    <div class="__user">
        <p>${input}</p>
    </div>
    <img src="{{ asset('/images/avatar.png') }}" alt="Avatar">
    <div style="clear: both"></div>
    </div>`;

    fetch(url, {
        method: 'POST',
        body: JSON.stringify(input),
        headers: {
            'Content-Type': 'application/json',
            'Authorization': 'Bearer "MY_OPENAI_KEY"'
        }
    }).then(function(response) {
        if (response.ok) {
            return response.text();
        } else {
            throw new Error('Server error.');
        }
    }).then(function(data) {
        chatWindow.innerHTML += `<div class="messages-bot">
                        <div class="__bot">
                            <p>${data}</p>
                        </div>
                        <img src="{{ asset('/images/chatbot.png') }}" alt="Avatar">
                        </div>`;
    }).catch(function(error) {
        console.log('Fetch error:', error.message);
    });
});

web.php路由代码

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\ChatBotController;

Route::get('/', function () {
    return view('welcome');
});

Route::post('send', [ChatBotController::class, 'sendChat']);

ChatBotController控制器代码

public function sendChat(Request $request){
    $result = OpenAI::completions()->create([
        'max-token' => 100,
        'model' => 'text-davinci-003',
        'prompt' => $request->input
    ]);

    $response = array_reduce(
        $result->toArray()['choices'],
        fn(string $result, array $choice) => $result . $choice['text'], ""
    );
    
    return $response;
}

修复步骤

1. 解决CSRF验证失败(419错误核心)

Laravel的POST请求必须携带CSRF令牌,你的fetch请求中缺少该令牌,同时前端不应暴露OpenAI密钥(密钥需存在后端)。修改fetch部分代码:

fetch(url, {
    method: 'POST',
    body: JSON.stringify({ input: input }), // 将输入包装为对象,方便后端解析
    headers: {
        'Content-Type': 'application/json',
        'X-CSRF-TOKEN': csrfToken // 添加CSRF令牌
    }
})

同时删除开头无用的XMLHttpRequest代码块,这段代码未实际使用。

2. 修正后端请求接收与API参数

  • 后端需要解析JSON格式的请求数据,使用$request->json('input')获取前端传入的内容
  • OpenAI API参数名错误:max-token应改为max_tokens
  • 返回JSON格式响应更符合前后端交互规范

修改控制器代码:

use Illuminate\Http\Request;

public function sendChat(Request $request){
    $prompt = $request->json('input');
    $result = OpenAI::completions()->create([
        'max_tokens' => 100,
        'model' => 'text-davinci-003',
        'prompt' => $prompt
    ]);

    $response = array_reduce(
        $result->toArray()['choices'],
        fn(string $result, array $choice) => $result . $choice['text'], ""
    );
    
    return response()->json($response);
}

3. 前端适配后端JSON响应

后端返回JSON格式,前端需将response.text()改为response.json():

.then(function(response) {
    if (response.ok) {
        return response.json();
    } else {
        throw new Error('Server error.');
    }
}).then(function(data) {
    chatWindow.innerHTML += `<div class="messages-bot">
                    <div class="__bot">
                        <p>${data}</p>
                    </div>
                    <img src="{{ asset('/images/chatbot.png') }}" alt="Avatar">
                    </div>`;
})

4. 后端配置OpenAI密钥

在项目根目录的.env文件中添加密钥(openai-php/laravel会自动读取该配置):

OPENAI_API_KEY=你的OpenAI密钥

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 08:34:54