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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 02:24:55