如何将GET API数据传递至PHP脚本第40行?调试求助
调试PHP脚本:解决Snipcart数据传递到Payx接口的问题
核心问题分析
- 未解析JSON响应:你直接用
curl_exec返回的字符串$moredata访问对象属性$moredata->billingAddress->phone,这会触发致命错误——字符串不是对象,无法直接访问属性。 - 输出干扰跳转:
echo $moredata会提前输出Snipcart的JSON数据,导致后续header('Location: ...')跳转失效(HTTP头必须在页面输出前发送)。 - 缺失错误处理:没有检查Snipcart和Payx接口的请求是否成功,也没处理JSON解析失败的情况,无法快速定位问题。
- 手机号未校验:未对获取到的手机号做格式处理,无法确保符合Payx要求的11位数字规则。
修正后的完整代码
<?php // 1. 请求并解析Snipcart订单数据 $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => 'https://app.snipcart.com/api/orders/76328829-55d0-4037-884b-a7413b0fa0d2', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => array( 'Accept: application/json', 'Authorization: Basic OlNfTW1ReVl6TmxNRGd0T0dNeU5TMDBPREZoTFRsalpXTXRNREV5Tm1ZMFlqVTFNVGcyTmpNM09UWXpPRFkyTkRrd01UazJNekEz' ), )); $snipcartResponse = curl_exec($curl); $snipcartErr = curl_error($curl); curl_close($curl); // 检查Snipcart请求是否成功 if ($snipcartErr) { die("Snipcart请求失败: " . $snipcartErr); } // 解析JSON为对象,并检查解析错误 $moredata = json_decode($snipcartResponse); if (json_last_error() !== JSON_ERROR_NONE) { die("Snipcart响应解析失败: " . json_last_error_msg()); } // 验证订单是否包含手机号字段 if (!isset($moredata->billingAddress->phone)) { die("订单数据中缺少手机号信息"); } // 2. 处理手机号格式,确保为11位纯数字 $rawPhone = $moredata->billingAddress->phone; $cleanPhone = preg_replace('/\D/', '', $rawPhone); // 移除所有非数字字符 if (strlen($cleanPhone) !== 11) { die("手机号格式错误,必须为11位数字"); } // 3. 请求Payx支付接口 $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => 'https://g.payx.ph/payment_request', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => array( 'x-public-key' => 'pk_9219da5bc038b18ac8146e04f4984320', 'amount' => '100', 'customername' => $moredata->billingAddress->name ?? 'Jane Doe', // 复用订单真实姓名 'customermobile' => $cleanPhone, 'customeremail' => $moredata->billingAddress->email ?? 'janedoe@fakeemail.com', // 复用订单真实邮箱 'description' => 'Payment for products', ), )); $payxResponse = curl_exec($curl); $payxErr = curl_error($curl); curl_close($curl); // 检查Payx请求是否成功 if ($payxErr) { die("Payx请求失败: " . $payxErr); } $response = json_decode($payxResponse); if (json_last_error() !== JSON_ERROR_NONE) { die("Payx响应解析失败: " . json_last_error_msg()); } // 验证结账链接是否存在 if (!isset($response->data->checkouturl)) { die("Payx响应中缺少结账链接"); } // 执行跳转(确保无前置输出) header('Location: ' . $response->data->checkouturl); exit; ?>
关键修改说明
- JSON解析处理:新增
json_decode将Snipcart返回的字符串转为对象,同时添加解析错误检查,避免无效数据导致的后续报错。 - 移除干扰输出:删除
echo $moredata,保证header跳转正常执行。 - 全链路错误检查:添加curl请求错误、JSON解析错误、字段存在性验证,遇到问题时能直接输出错误原因,方便调试。
- 手机号格式化:用正则清除手机号中的非数字字符,再验证长度,确保符合Payx接口要求。
- 动态数据复用:将固定的姓名、邮箱改为从Snipcart订单数据中获取,提升数据准确性。
内容的提问来源于stack exchange,提问作者jmozzart
相关产品推荐
相关产品推荐

