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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 01:09:26