使用Guzzle/cURL发起请求时在body参数中传递变量失效如何解决
故障根因
传参失效是三个问题共同导致的:
- PHP单引号包裹的字符串不会解析内部变量,你直接把
$otp写在单引号引起来的JSON串里,实际请求发出去的value值就是字面量$otp,根本不是你生成的5位随机数。哪怕你加花括号写成{$otp},在单引号字符串里也不会被解析,照样是无效值。 - 你设置的
Content-Type值为text/json不符合标准,JSON请求的合法MIME类型是application/json,大部分接口会校验这个请求头,类型不对直接判定参数无效。 - 额外隐患:手动硬拼JSON字符串没有转义逻辑,一旦变量里出现引号、换行等特殊字符,会直接导致整个JSON格式损坏,请求直接失败。
修复方法
优先用Guzzle官方提供的json请求选项传参,不需要手动拼字符串、不需要手动设置Content-Type,Guzzle会自动完成JSON编码、头设置、特殊字符转义,最稳妥:
require_once('../vendor/autoload.php'); $phnno="9187698699"; $otp = rand ( 10000 , 99999 ); $client = new \GuzzleHttp\Client(); $response = $client->request('POST', 'https://live-server-5673.wati.io/api/v1/sendTemplateMessage?whatsappNumber='.$phnno, [ 'json' => [ 'parameters' => [ ['name' => 'otpstring', 'value' => (string)$otp] ], 'broadcast_name' => 'brd_otp', 'template_name' => 'tn_otp' ], 'headers' => [ 'Authorization' => 'Bearer wgqhjqbjhbvhxvjvajvdjhqjj187268731dvajhsvjsvajvjsvjasvj', ], ]); echo $response->getBody();
如果一定要手动拼接body字符串,记住不要把变量直接写在单引号字符串内部,要用字符串拼接的方式插入变量,同时修正Content-Type头:
$response = $client->request('POST', 'https://live-server-5673.wati.io/api/v1/sendTemplateMessage?whatsappNumber='.$phnno, [ // 用.拼接变量到单引号字符串中 'body' => '{"parameters":[{"name":"otpstring","value":'. $otp .'}],"broadcast_name":"brd_otp","template_name":"tn_otp"}', 'headers' => [ 'Authorization' => 'Bearer wgqhjqbjhbvhxvjvajvdjhqjj187268731dvajhsvjsvajvjsvjasvj', 'Content-Type' => 'application/json', // 修正为标准JSON类型 ], ]);
提示:手动拼接JSON的方式容错率极低,非特殊情况不建议使用。
内容的提问来源于stack exchange,提问作者Karthik Kondapaneni
相关产品推荐
相关产品推荐

