PHP中Curl集成SumUp支付时遇请求体缺失400错误
SumUp支付结账400错误(请求体缺失)解决办法
我在完成SumUp支付结账操作时,一直碰到400错误,错误信息如下:
{"title":"Bad Request","status":400,"detail":"Required request body is missing: public org.springframework.http.ResponseEntity com.sumup.cloak.controllers.ProcessCheckoutController.chargev1(java.lang.String,jakarta.servlet.http.HttpServletRequest)"}
我的PHP Curl代码如下:
$curl = curl_init(); $urlToSend = "https://api.sumup.com/v0.1/checkouts/".checkout_id_from_prev_call; $curlHeaders = [ 'Authorization: Bearer '. my_access_token, 'Content-Type: application/json' ]; $postData ='{ "payment_type": "card", "card": { "name": "Boaty McBoatface", "number": "4200000000000042", "expiry_month": "12", "expiry_year": "23", "cvv": "123" } }'; curl_setopt($curl, CURLOPT_URL, $urlToSend); curl_setopt($curl, CURLOPT_HTTPHEADER, $curlHeaders); curl_setopt($curl, CURLOPT_POSTFIELDS, (urldecode($postData))); curl_setopt($curl, CURLOPT_PUT, true); curl_setopt($curl, CURLOPT_VERBOSE, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 0); $response = curl_exec($curl);
响应始终返回:请求体缺失(Required request body is missing)
我还试过用数组构造请求数据:
$postData = [ 'payment_type' => 'card', 'card' => [ 'name' => 'Boaty McBoatface', 'number' => '4200000000000042', 'expiry_month' => '12', 'expiry_year' => '23', 'cvv' => '123' ] ];
并设置:
curl_setopt($curl, CURLOPT_POSTFIELDS, (http_build_query($postData)));
但错误依旧,还是提示请求体缺失(Required request body is missing)
问题原因与修复方案
- PUT请求参数传递方式错误:PHP中使用
CURLOPT_PUT时,CURLOPT_POSTFIELDS不会生效,必须用CURLOPT_CUSTOMREQUEST指定PUT方法才能正常传递请求体。 - 数据格式不匹配:第二种方式用
http_build_query生成的是表单格式数据,但请求头声明的是application/json,服务器无法识别。
修复后的代码:
$curl = curl_init(); // 替换为实际的checkout ID和访问令牌 $checkoutId = checkout_id_from_prev_call; $accessToken = my_access_token; $urlToSend = "https://api.sumup.com/v0.1/checkouts/{$checkoutId}"; $curlHeaders = [ "Authorization: Bearer {$accessToken}", "Content-Type: application/json" ]; $postData = [ "payment_type" => "card", "card" => [ "name" => "Boaty McBoatface", "number" => "4200000000000042", "expiry_month" => "12", "expiry_year" => "23", "cvv" => "123" ] ]; // 将数组转为JSON字符串 $jsonData = json_encode($postData); curl_setopt($curl, CURLOPT_URL, $urlToSend); curl_setopt($curl, CURLOPT_HTTPHEADER, $curlHeaders); // 用CUSTOMREQUEST指定PUT方法,同时用POSTFIELDS传递JSON数据 curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PUT"); curl_setopt($curl, CURLOPT_POSTFIELDS, $jsonData); curl_setopt($curl, CURLOPT_VERBOSE, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 设为1方便捕获响应内容 $response = curl_exec($curl); // 检查Curl错误 if(curl_errno($curl)){ echo 'Curl错误: ' . curl_error($curl); } curl_close($curl); print_r($response);
关键修复点
- 放弃
CURLOPT_PUT,改用CURLOPT_CUSTOMREQUEST设置为PUT,确保CURLOPT_POSTFIELDS能正常传递JSON请求体。 - 使用
json_encode将数组转为JSON字符串,避免用http_build_query生成与请求头冲突的表单格式数据。 - 移除多余的
urldecode,原JSON字符串无需解码。
内容的提问来源于stack exchange,提问作者Hannes Ledl
相关产品推荐
相关产品推荐

