使用Plivo录制呼入电话时触发404 Call Not Found错误求助
看起来你在这里犯了一个常见的逻辑误区:你同时使用了Plivo的<Record> XML元素和startRecording API,这两者的作用重复且时机不对,最终导致了错误。让我详细拆解问题并给出解决方案:
问题根源分析
当你在answer方法中返回包含<Record>的XML响应时,Plivo会自动启动通话录制——这个XML元素本身就是用来触发录制的,完全不需要再通过API手动调用startRecording。
而你的record方法是作为<Record>的action参数被Plivo回调的,这个回调发生在录制完成之后(或通话挂断时)。此时通话已经处于非活跃状态(甚至可能已结束),这时候再调用startRecording API,Plivo自然会返回"Call Not Found",因为对应的通话UUID已经不再有效。
修正方案
你只需要保留<Record> XML元素自动处理录制,然后在record方法中接收Plivo发送的录制结果即可,不需要调用startRecording API。
修改后的record方法代码
public function record() { Log::useDailyFiles(storage_path().'/logs/debug.log'); // Plivo会自动发送录制相关参数到这个回调,包括: // RecordingURL, RecordingID, CallUUID, Duration等 $recordingData = $this->_request->all(); Log::info([ '录制完成通知', '录制数据' => $recordingData, '通话UUID' => $this->_request->input('CallUUID'), ]); // 这里可以添加你的业务逻辑,比如把RecordingURL保存到数据库 // ... // 返回空的XML响应或者200状态码即可,Plivo只需要确认你收到了通知 return response('', 200)->header('Content-Type', 'text/xml'); }
额外检查点
确认XML响应的正确性:你的
answer方法中的<Record>参数设置是合理的:startOnDialAnswer="true":对于呼入电话,这个参数会在Plivo接起通话后立即开始录制,符合需求redirect="false":确保Plivo不会重定向,而是继续执行后续的XML指令(如果有的话)maxLength=600:限制录制最长10分钟,设置没问题
验证权限与配置:虽然你能拿到CallUUID,但还是可以确认
AUTH_ID和AUTH_TOKEN是否正确,并且你的Plivo账号是否有录制通话的权限(默认是开启的)。检查日志中的回调参数:查看
debug.log,确认Plivo在回调record方法时发送了RecordingURL、RecordingID等字段,这说明录制已经成功完成。
如果你确实需要用API触发录制
如果你的业务场景需要手动控制录制的开始时机(而非自动录制),那应该移除<Record> XML元素,然后在通话建立后的活跃状态下调用startRecording API。比如,可以在answer方法返回响应后,通过Laravel队列这类异步任务来调用API,确保通话处于活跃状态时触发录制。
内容的提问来源于stack exchange,提问作者Sasha

