PHP cURL调用Shopee POST API传入对象参数报错如何解决
问题现象
对接Shopee订单拆分接口时,代码运行抛出未捕获异常,错误信息如下:
错误类型:Error
错误信息:Object of class stdClass could not be converted to string
根因分析
报错触发点在POST请求体拼接逻辑:
- 手动拼接JSON字符串时,直接把stdClass类型的
$parcel对象插入到字符串中,PHP没有提供stdClass到字符串的自动转换规则,直接触发类型转换错误。 - 代码中提前写了
$object = json_encode($parcel);但实际拼接时没有使用这个编码后的字符串,属于变量引用错误。 - 根据接口参数要求,
parcels字段是数组类型,即使只传1个包裹,也要用数组结构包裹包裹对象,直接传单个对象即使不报错也会被接口判定为参数非法。 - 手动拼接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
相关产品推荐
相关产品推荐

