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

Dart通过POST向PHP传递字符串变量失败,求解决方法

问题排查与解决方案

核心问题分析

你遇到的变量传递失败,大概率是PHP端未正确输出返回数据、SOTP变量本身为空或PHP接收/处理逻辑有疏漏导致的,以下是分步解决方法:


1. 先确认Dart端的SOTP变量有实际值

在发送请求前添加打印,验证变量是否为空:

Future<Verify> verifyOTP() async {
    // 先确认SOTP的实际值
    print("SOTP value: $SOTP");
    var response_verifyotp = await http.post(Uri.parse(linkverifyOTP), body: {
      "OTP_code": SOTP,
    });

    if (response_verifyotp.statusCode == 200) {
      print(response_verifyotp.body);
      st_verfiy = Verify.fromJson(json.decode(response_verifyotp.body));
      print(st_verfiy.status);
    } else {
      // 新增错误状态码打印,排查请求是否成功到达服务器
      print("Request failed with status: ${response_verifyotp.statusCode}");
    }
  }

如果打印显示SOTP为空,问题出在前端变量赋值,和请求逻辑无关。


2. 修复PHP端的返回输出与参数处理逻辑

你的PHP代码存在两个关键问题:一是仅执行json_encode但未输出结果,导致Dart端收不到响应;二是未处理变量未定义的情况,可能引发后续逻辑报错。修改后的代码如下:

<?php
session_start();
$ch = curl_init();
// 初始化变量,避免未定义报错,同时确认参数是否存在
$OTP_code = isset($_POST["OTP_code"]) ? $_POST["OTP_code"] : "";
$id = isset($_SESSION["id"]) ? $_SESSION["id"] : "";

// 临时添加:打印接收的POST参数,确认是否收到值
var_dump($_POST);

curl_setopt($ch, CURLOPT_URL, "https://www.msegat.com/gw/verifyOTPCode.php");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_POST, TRUE);

$fields = <<<EOT
{
   "lang":"EN",
  "userName": "Bloom_Ducks",
  "apiKey":"f92b62af08ed0be",
  "code":"$OTP_code",
  "id": "$id" ,
  "userSender":"APP"
}
EOT;
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
  "Content-Type: application/json"
));
$response = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);

// 新增:判断curl响应是否解析成功
$response = json_decode($response, true);
if(!$response){
    echo json_encode(array("status" => -1, "msg" => "Curl request failed"));
    exit;
}

$code = $response["code"] ?? -1;

// 必须用echo输出json结果,否则Dart端收不到数据
if($code == 1){
     echo json_encode(array("status" => 1));
}else{
    echo json_encode(array("status" => 0));
}
?>

3. 验证PHP是否能接收到参数

运行修改后的代码,查看Dart端打印的response_verifyotp.body:

  • 如果var_dump($_POST)显示OTP_code有值,说明参数传递成功,问题出在后续curl请求或逻辑;
  • 如果显示为空,说明Dart请求没有正确发送参数,可以尝试显式设置请求头:
var response_verifyotp = await http.post(
  Uri.parse(linkverifyOTP),
  headers: {"Content-Type": "application/x-www-form-urlencoded"},
  body: {
    "OTP_code": SOTP,
  },
);

4. 处理Session的ID为空情况

如果$_SESSION["id"]不存在,原代码中$id会是未定义变量,导致curl的JSON格式异常,上面的PHP代码已经用isset()处理了这个情况,确保JSON格式合法。

内容的提问来源于stack exchange,提问作者lenah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 21:45:25