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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 16:57:17