Postman中正常运行的Curl转为PHP代码后报错求助
解决PHP Curl调用短信OTP接口的415/400错误问题
问题根源
原运营商提供的curl命令里,-F payloadSend="{...}";type=application/json是核心细节:它指定了payloadSend这个multipart表单字段的内容类型为application/json。但Postman生成的PHP代码没处理这个要求,仅把JSON字符串当普通表单值传递,导致服务端无法识别正确的媒体类型,抛出415错误;你修改后的格式把字段名和值混写,直接导致表单解析失败,触发400错误。
修正方案
在PHP Curl中,要给指定表单字段单独设置Content-Type头,需将CURLOPT_POSTFIELDS里的payloadSend值定义为数组,包含内容、类型等信息,同时修正URL里的拼写错误(原生成代码里的channel-sscapi应为channel-ssc.api,和原curl命令一致)。
修正后的完整代码
<?php $curl = curl_init(); // 修正URL拼写错误:channel-sscapi → channel-ssc.api $url = 'https://channel-ssc.api.services.smb.telecomitalia.it/channels/UCP/campaigns?destination=msisdn&message=static&delivery=immediate&type=single&mode=fast'; // 用json_encode构造标准JSON payload,避免手动拼接出错 $payload = json_encode([ "alias" => "<alias>", "sentNotify" => false, "deliveredNotify" => false, "sr" => false, "campaignChannel" => ["channelName" => "UCP"], "campaignMessage" => [ "messageContent" => "TEST TEST TEST!", "msisdn" => "<telephon number>" ] ]); curl_setopt_array($curl, array( CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => false, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'POST', // 关键:给payloadSend字段指定Content-Type为application/json CURLOPT_POSTFIELDS => array( 'payloadSend' => array( 'contents' => $payload, 'headers' => array('Content-Type: application/json') ) ), CURLOPT_HTTPHEADER => array( 'X-Token: <token>' // 无需手动设置Content-Type,Curl会自动生成正确的multipart/form-data头 ), )); $response = curl_exec($curl); // 可选:捕获Curl错误便于调试 if(curl_errno($curl)){ echo 'Curl error: ' . curl_error($curl); } curl_close($curl); echo $response; ?>
关键说明
- 不要手动设置Content-Type头:当
CURLOPT_POSTFIELDS传入数组时,PHP Curl会自动生成带边界标识的正确multipart/form-data请求头,手动设置反而可能引发格式错误。 - 用json_encode构造JSON:避免手动拼接JSON字符串出现语法错误,保证格式标准。
- 修正URL拼写:原Postman生成的URL少了一个点,这是容易忽略的隐性错误。
内容的提问来源于stack exchange,提问作者Max T
相关产品推荐
相关产品推荐

