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

如何从STK回调JSON元数据提取手机号并写入数据库?PHP代码求助

问题分析

你的问题出在对CallbackMetadata里的Item结构理解有误——它不是一个关联数组,而是一个包含多个对象的数组,每个对象都有Name和Value(部分项可能没有Value)。你直接用['Item']['PhoneNumber']去访问,PHP找不到对应的键,自然获取不到手机号。

解决方案

步骤1:确保JSON正确解码为数组

首先要把回调的JSON字符串转为PHP数组,记得给json_decode加上第二个参数true,这样会返回数组而非对象:

// 假设$stk_callback_json是你收到的原始JSON字符串
$json = json_decode($stk_callback_json, true);

步骤2:遍历Item数组提取手机号

因为Item是数组结构,我们需要循环遍历它,找到Name为PhoneNumber的项,再取出对应的Value:

$phoneNumber = null;
// 遍历CallbackMetadata下的Item数组
foreach ($json['Body']['stkCallback']['CallbackMetadata']['Item'] as $item) {
    if ($item['Name'] === 'PhoneNumber' && isset($item['Value'])) {
        $phoneNumber = $item['Value'];
        break; // 找到目标项后立即退出循环,提升效率
    }
}

步骤3:修正SQL语句(同时规避SQL注入风险)

你的原SQL存在SQL注入隐患,建议使用预处理语句执行数据库操作,示例如下:

if ($phoneNumber !== null) {
    $resultCode = $json['Body']['stkCallback']['ResultCode'];
    // PDO方式(假设你用PDO连接数据库)
    $stmt = $pdo->prepare("UPDATE pay SET ResultCode = ? WHERE uniqs = ?");
    $stmt->execute([$resultCode, $phoneNumber]);
    
    // 如果使用mysqli,代码如下:
    // $stmt = $mysqli->prepare("UPDATE pay SET ResultCode = ? WHERE uniqs = ?");
    // $stmt->bind_param("is", $resultCode, $phoneNumber);
    // $stmt->execute();
} else {
    // 处理未找到手机号的异常情况,比如记录日志
    error_log("STK回调未获取到手机号:" . json_encode($json));
}
额外注意事项
  • 要处理Item中可能缺少PhoneNumber或Value的情况,避免出现Undefined index错误
  • 始终使用预处理语句操作数据库,杜绝SQL注入风险
  • 可以先执行var_dump($json['Body']['stkCallback']['CallbackMetadata']['Item'])打印数组结构,直观确认数据格式

内容的提问来源于stack exchange,提问作者Amos Waweru Welo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:22:09