如何从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
相关产品推荐
相关产品推荐

