Laravel集成PhonePe支付网关报错:Undefined property: stdClass::$data 求助
PhonePe支付网关Laravel集成错误:Undefined property: stdClass::$data 解决方案及最佳包推荐
错误原因分析
这个错误说明你解析API响应时,$rData对象中不存在data属性。通常是因为请求失败,PhonePe返回了错误响应(比如签名无效、参数错误),而非预期的成功响应结构。
分步解决方案
1. 先调试原始响应内容
在尝试访问$rData->data之前,先打印原始API响应,确认返回的内容:
$response = Curl::to($url) ->withHeader('Content-Type:application/json') ->withHeader('X-VERIFY:'.$finalXHeader) ->withData(json_encode(['request' => $encode])) ->post(); // 先打印原始响应,查看是否为错误信息 dd($response); $rData = json_decode($response);
这样你能直接看到PhonePe返回的错误详情(比如签名错误、参数缺失等)。
2. 修正代码中的明显问题
你的代码里存在重复的请求逻辑(两个完整的data数组和请求块),这是无效的,先删除重复部分,保留一套完整的请求代码。
3. 验证核心参数与签名正确性
- SaltKey一致性:确保你使用的
saltKey和PhonePe沙箱/生产后台提供的完全一致(你的代码中两个SaltKey长度不同,大概率是输入错误)。 - 签名生成逻辑:确认签名字符串拼接正确,格式为
base64编码的请求体 + "/pg/v1/pay" + saltKey,你的代码逻辑是对的,但要保证拼接时没有多余空格。 - 请求参数合法性:检查
merchantUserId、mobileNumber等参数是否符合沙箱要求,金额(amount)单位是最小货币单位(比如1卢比对应100,沙箱中用1测试是允许的)。
4. 添加安全的错误处理逻辑
在访问嵌套属性前,先判断响应是否成功,避免直接访问不存在的属性:
$rData = json_decode($response); // 先检查响应是否有效且成功 if (isset($rData->success) && $rData->success) { // 注意API返回的是小写url,统一使用小写 return redirect()->to($rData->data->instrumentResponse->redirectInfo->url); } else { // 打印错误信息用于调试 dd('请求失败:', $rData->code ?? '未知错误', $rData->message ?? '无错误信息'); }
推荐的Laravel PhonePe集成包
1. laravel-phonepe
社区维护的Laravel专用包,封装了支付创建、交易验证、回调处理等核心功能,无需手动处理签名和响应解析,只需配置.env参数即可快速集成。
2. PhonePe官方PHP SDK
PhonePe提供的官方SDK,完全遵循最新API规范,兼容性和稳定性有保障,适合需要深度定制集成的场景。
内容的提问来源于stack exchange,提问作者SelvaKumar S
相关产品推荐
相关产品推荐

