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

Laravel集成Twilio通话:传递question_id并存储按键响应至数据库

实现Laravel+Twilio通话中传递question_id并存储按键响应

1. 发起呼叫时携带question_id

在触发呼叫的控制器方法里,调用Twilio API发起呼叫时,把question_id作为参数附加到Webhook的URL中,确保Twilio后续能把这个参数带回给后端。

use Twilio\Rest\Client;

public function initiateCall(Request $request)
{
    $twilioSid = config('services.twilio.sid');
    $twilioToken = config('services.twilio.token');
    $twilioNumber = config('services.twilio.phone_number');
    
    $client = new Client($twilioSid, $twilioToken);
    $questionId = 1; // 替换为实际业务中的question_id值
    
    // 构造带question_id参数的Webhook URL
    $webhookUrl = route('twilio.handle-call', ['question_id' => $questionId]);

    $client->calls->create(
        $request->input('phone_number'), // 被叫号码
        $twilioNumber, // 你的Twilio号码
        [
            'url' => $webhookUrl, // 指向生成TwiML的接口
            'method' => 'POST'
        ]
    );

    return response()->json(['status' => '呼叫已发起']);
}

2. 生成带按键收集的TwiML

创建Webhook接口,根据传入的question_id返回对应的语音提示和按键收集配置,同时确保action参数也携带question_id,这样用户按键后Twilio会把参数和按键值一起提交到指定接口。

use Twilio\TwiML\VoiceResponse;

public function generateTwiML(Request $request)
{
    $questionId = $request->route('question_id');
    $response = new VoiceResponse();
    
    // 根据question_id匹配对应的语音提示
    $prompt = match($questionId) {
        1 => '按1转销售,按2转财务,按3转客服',
        // 可扩展更多question_id对应的提示文案
        default => '请按指定数字按键'
    };

    $gather = $response->gather([
        'numDigits' => 1,
        'action' => route('twilio.handle-keypress', ['question_id' => $questionId]),
        'method' => 'POST'
    ]);
    $gather->say($prompt, ['language' => 'zh-CN']);

    // 用户未按键时重复提示
    $response->say('未检测到按键,请重新输入', ['language' => 'zh-CN']);
    $response->redirect(route('twilio.handle-call', ['question_id' => $questionId]));

    return response($response)->header('Content-Type', 'application/xml');
}

3. 处理按键响应并存储到数据库

先创建对应的CallResponse模型和数据库表(表字段至少包含question_id、call_response,可选call_sid关联通话记录):

// app/Models/CallResponse.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class CallResponse extends Model
{
    protected $fillable = ['question_id', 'call_response', 'call_sid'];
}

然后实现接收按键的控制器方法,获取question_id和Twilio传递的Digits参数,当按键为3时将数据存入数据库:

use App\Models\CallResponse;

public function handleKeypress(Request $request)
{
    $questionId = $request->route('question_id');
    $digits = $request->input('Digits');
    $callSid = $request->input('CallSid'); // 可选,用于关联具体通话记录

    // 按键为3时执行存储逻辑
    if ($digits === '3') {
        CallResponse::create([
            'question_id' => $questionId,
            'call_response' => $digits,
            'call_sid' => $callSid
        ]);
    }

    // 返回后续操作的TwiML,比如提示转接或挂断
    $response = new VoiceResponse();
    $response->say('已为您转接客服,请稍等', ['language' => 'zh-CN']);
    // 不需要后续操作可直接挂断:$response->hangup();

    return response($response)->header('Content-Type', 'application/xml');
}

4. 配置路由

在routes/web.php或routes/api.php中添加对应路由:

use App\Http\Controllers\TwilioController;

Route::post('/twilio/initiate-call', [TwilioController::class, 'initiateCall']);
Route::post('/twilio/handle-call/{question_id}', [TwilioController::class, 'generateTwiML'])->name('twilio.handle-call');
Route::post('/twilio/handle-keypress/{question_id}', [TwilioController::class, 'handleKeypress'])->name('twilio.handle-keypress');

注意:本地开发时需用ngrok等工具暴露端口,确保Twilio能访问到你的Webhook接口。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 07:25:23