Curl请求正常但Laravel Http Client调用Bybit API签名错误求助
调用Bybit
/fht/compliance/tax/v3/private/registertime 接口的签名异常问题 调用Bybit的/fht/compliance/tax/v3/private/registertime接口时遇到异常:使用PHP Curl发起请求可正常获取成功响应,但使用Laravel Http Client调用时,返回retCode=10004的签名错误。两者传入的参数完全一致,相关代码及返回信息如下,请求协助排查解决。
代码对比
1. PHP Curl 实现代码
$curl = curl_init(); // API Endpoint $url = 'https://api.bybit.com/fht/compliance/tax/v3/private/registertime'; curl_setopt_array($curl, array( CURLOPT_URL => $url, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_HTTPHEADER => array( 'X-BAPI-SIGN: ' . $sign, 'X-BAPI-API-KEY: ' . $apikey, 'X-BAPI-TIMESTAMP: ' . $timestamp, 'X-BAPI-RECV-WINDOW: ' . $recvWindow, 'X-BAPI-SIGN-TYPE: 2', 'Content-Type: application/json' ), )); // Execute cURL request and fetch response $response = curl_exec($curl);
2. Laravel Http Client 实现代码
$response = Http::withHeaders(array( 'X-BAPI-SIGN' => $sign, 'X-BAPI-API-KEY' => $apikey, 'X-BAPI-TIMESTAMP' => $timestamp, 'X-BAPI-RECV-WINDOW' => $recvWindow, 'X-BAPI-SIGN-TYPE' => '2', 'Content-Type' => 'application/json', ))->post('https://api.bybit.com/fht/compliance/tax/v3/private/registertime'); dd($response->json());
说明:两者传入的其他参数完全一致,但Http Client无法获取有效响应。
响应对比
1. Curl 请求的成功响应
{"retCode":0,"retMsg":"","result":{"registerTime":"1562630400"},"retExtInfo":{},"time":1732258576995}
2. Http Client 的错误响应
array:5 [ "retCode" => 10004 "retMsg" => "error sign! origin_string[1732259721000OXG2zzIOaiymlOWj0B5000[]]" "result" => [] "retExtInfo" => [] "time" => 1732259721441 ]
完整测试函数及输出
测试函数代码
public function bybit_taxPrivateRegisterTime(Request $request) { try { $apikey = $request->input('apikey'); $apisecret = $request->input('apisecret'); $recvWindow = '5000'; $timestamp = time() * 1000; // 毫秒级时间戳 // 按照Curl示例构建签名字符串(timestamp + apiKey + recvWindow) $signString = $timestamp . $apikey . $recvWindow; // 使用HMAC SHA256生成签名 $sign = hash_hmac('sha256', $signString, $apisecret); // 按指定顺序定义请求头 $headers = [ 'X-BAPI-SIGN' => $sign, 'X-BAPI-API-KEY' => $apikey, 'X-BAPI-TIMESTAMP' => $timestamp, 'X-BAPI-RECV-WINDOW' => $recvWindow, 'X-BAPI-SIGN-TYPE' => '2', // 根据Bybit API版本可调整值 'Content-Type' => 'application/json', // 确保请求以JSON格式发送 ]; // 使用Laravel Http Client发起请求 $response = Http::withHeaders($headers) ->post('https://api.bybit.com/fht/compliance/tax/v3/private/registertime'); // 同时发起Curl请求做对比 $curl = curl_init(); $url = 'https://api.bybit.com/fht/compliance/tax/v3/private/registertime'; curl_setopt_array($curl, array( CURLOPT_URL => $url, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_HTTPHEADER => array( 'X-BAPI-SIGN: ' . $sign, 'X-BAPI-API-KEY: ' . $apikey, 'X-BAPI-TIMESTAMP: ' . $timestamp, 'X-BAPI-RECV-WINDOW: ' . $recvWindow, 'X-BAPI-SIGN-TYPE: 2', 'Content-Type: application/json' ), )); $curl_response = curl_exec($curl); dd($response->json(), $curl_response); return response()->json($response->json()); } catch (\Exception $e) { return response()->json([ 'error' => 'API请求失败', 'message' => $e->getMessage() ], 500); } }
测试输出
array:5 [ "retCode" => 10004 "retMsg" => "error sign! origin_string[1732260150000OXG2zzIOaiymlOWj0B5000[]]" "result" => [] "retExtInfo" => [] "time" => 1732260150743 ] {"retCode":0,"retMsg":"","result":{"registerTime":"1562630400"},"retExtInfo":{},"time":1732260150914}
内容的提问来源于stack exchange,提问作者Nileshkumar
相关产品推荐
相关产品推荐

