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

PHP cURL调用Shopee POST API传入对象参数报错如何解决

问题现象

对接Shopee订单拆分接口时,代码运行抛出未捕获异常,错误信息如下:

错误类型:Error
错误信息:Object of class stdClass could not be converted to string

根因分析

报错触发点在POST请求体拼接逻辑:

  1. 手动拼接JSON字符串时,直接把stdClass类型的$parcel对象插入到字符串中,PHP没有提供stdClass到字符串的自动转换规则,直接触发类型转换错误。
  2. 代码中提前写了$object = json_encode($parcel);但实际拼接时没有使用这个编码后的字符串,属于变量引用错误。
  3. 根据接口参数要求,parcels字段是数组类型,即使只传1个包裹,也要用数组结构包裹包裹对象,直接传单个对象即使不报错也会被接口判定为参数非法。
  4. 手动拼接JSON字符串容易出现引号不匹配、格式错误、签名与实际请求体不一致等隐性问题,不推荐这种写法。
修复后代码
$partner_key = "c423d22ccf4a8f1ca3cf9f49d7995f7d2a11e58b6a57036bd8385e8d978b4db2";
$partner_id = 2003151;
$shop_id = 30334567;
$username = "info@pollandhopia.com";
$password = "101382qpqeiw";
$datenow = time();

// 构造单个包裹对象
$parcel = new stdClass();
$parcel->item_id = 455371271;
$parcel->variation_id = 0;
$parcel->order_item_id = 455371271;
$parcel->promotion_group_id = 0;

// 构造完整请求参数,注意parcels是数组结构
$requestParams = [
    "shopid" => $shop_id,
    "ordersn" => "220506EWDX3UXW",
    "partner_id" => $partner_id,
    "timestamp" => $datenow,
    "parcels" => [$parcel] // 数组包裹包裹对象,符合接口参数要求
];

// 统一生成JSON请求体,避免手动拼接错误
$post = json_encode($requestParams);

$url = "https://partner.shopeemobile.com/api/v1/orders/split";

// 基于最终请求体生成签名,保证签名和实际发送内容一致
$base_string = $url."|".$post;
$signature = hash_hmac('sha256', $base_string, $partner_key);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Authorization:".$signature, "Content-Type: application/json"));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$result = curl_exec($ch);
// 增加curl错误判断,方便排查请求层问题
if(curl_errno($ch)){
    print_r(curl_error($ch));
}
curl_close($ch);

$result = json_decode($result);
print_r($result);
修复点说明
  • 移除手动拼接JSON的逻辑,所有参数先整理成PHP数组结构,最后统一用json_encode()生成标准合法的JSON串,从根源避免类型错误、格式错误。
  • 初始化$parcel时提前实例化stdClass,避免PHP低版本下触发创建默认对象的警告。
  • parcels字段按接口要求传数组结构,将单个包裹对象放入数组中,符合接口参数规范。
  • 签名计算基于最终生成的完整JSON串,避免签名和实际请求内容不一致导致的鉴权失败。
  • 增加curl执行错误捕获逻辑,方便后续排查网络、请求层面的问题。

内容的提问来源于stack exchange,提问作者ItsmeMarvic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 12:21:19