Laravel 9集成Twilio Verify V2报参数需为array传入string类型错误
报错原因
该类型错误由本地安装的Twilio PHP SDK与参考教程的适配版本不匹配导致:
- 5.x及更早版本的Twilio PHP SDK中,
verificationChecks->create()方法支持拆分传参:第一个参数传入验证码字符串,第二个参数传入包含to(接收手机号)字段的配置数组 - 6.x及以上版本的Twilio PHP SDK修改了接口定义,
create()方法仅接收一个数组类型的入参,所有校验参数(验证码、接收手机号等)都需要放在该数组中传递,不再支持拆分传两个参数的写法
你当前项目使用的是新版SDK,但参考的教程基于旧版SDK编写,传参格式不符合新版接口的类型要求,因此抛出参数类型错误。
修复方法
- 修正
verificationChecks->create()的传参格式
将验证码、手机号统一放入一个数组传入,验证码对应的数组键名为code,替换原有错误传参:
// 原有错误写法 // $verification = $twilio->verify->v2->services($twilio_verify_sid) // ->verificationChecks // ->create($data['verification_code'], array('to' => $data['phone_number'])); // 新版SDK正确写法 $verification = $twilio->verify->v2->services($twilio_verify_sid) ->verificationChecks ->create([ 'code' => $data['verification_code'], 'to' => $data['phone_number'] ]);
- 修复原有代码的隐藏逻辑bug
原代码中tap(User::where('phone_number', $data['phone_number']))->update(...)返回的是查询构造器实例,并非查询到的用户模型,后续调用模型方法、执行登录逻辑都会触发错误。需要先查询到对应的用户实例,再执行状态更新和登录操作,修正后的完整verify方法代码如下:
protected function verify(Request $request) { $data = $request->validate([ 'verification_code' => ['required', 'numeric'], 'phone_number' => ['required', 'string'], ]); $token = getenv("TWILIO_AUTH_TOKEN"); $twilio_sid = getenv("TWILIO_SID"); $twilio_verify_sid = getenv("TWILIO_VERIFY_SID"); $twilio = new Client($twilio_sid, $token); $verification = $twilio->verify->v2->services($twilio_verify_sid) ->verificationChecks ->create([ 'code' => $data['verification_code'], 'to' => $data['phone_number'] ]); if ($verification->valid) { $user = User::where('phone_number', $data['phone_number'])->first(); $user->update(['isVerified' => true]); Auth::login($user); return redirect()->route('home')->with(['message' => 'Phone number verified']); } return back()->with(['phone_number' => $data['phone_number'], 'error' => 'Invalid verification code entered!']); }
如果
first_name()是你在用户模型中自定义的方法,请确保是在查询到的用户实例上调用,不要直接在查询构造器上调用模型方法。
内容的提问来源于stack exchange,提问作者Charles Smith
相关产品推荐
相关产品推荐

