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
相关产品推荐
相关产品推荐

