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

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)


问题原因与修复方案

  1. PUT请求参数传递方式错误:PHP中使用CURLOPT_PUT时,CURLOPT_POSTFIELDS不会生效,必须用CURLOPT_CUSTOMREQUEST指定PUT方法才能正常传递请求体。
  2. 数据格式不匹配:第二种方式用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 21:53:12