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

Bitstamp API调用持续返回API0000认证错误,求解决方案

解决Bitstamp API认证失败(API0000错误)的问题

我之前帮开发者排查过不少Bitstamp API的认证问题,你的情况核心是没踩中Bitstamp对认证参数的传递要求,再加上Feign客户端的配置细节没处理对,导致一直触发API0000错误。咱们一步步拆解问题和解决方案:

先说说你当前的错误点

  1. 用JSON请求体传递认证参数:Bitstamp的所有需要认证的接口,不支持JSON格式传递key/nonce/signature,必须用application/x-www-form-urlencoded的表单格式放在请求体里。
  2. 用URL查询参数传递:Bitstamp明确要求认证参数必须放在请求体中,URL上的查询参数不会被认证逻辑识别,所以哪怕你传了也会被判定为缺失。
  3. Feign接口的配置问题:你第一个接口用了@RequestParam,但默认情况下Feign会把@RequestParam参数拼到URL查询串里,而不是放到表单请求体中;第二个接口用了JSON的consumes类型,本身就不符合Bitstamp的要求。

正确的解决方案

第一步:修正Feign接口定义

你需要让Feign把认证参数以表单编码的形式放到请求体里,这里有两种可靠的实现方式:

方式1:直接用@RequestParam(需确保Feign处理表单请求)

import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.Map;

@PostMapping(value = "api/v2/balance/",
             produces = MediaType.APPLICATION_JSON_VALUE,
             consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
ResponseEntity<Map<String, Object>> getAccountBalance(
    @RequestParam("key") String apiKey,
    @RequestParam("signature") String signature,
    @RequestParam("nonce") Long nonce // 推荐用Long,避免整数溢出
);

注意:如果你的Spring Cloud版本较旧,可能需要额外配置Feign的表单编码器,确保@RequestParam参数被放到请求体而非URL上。

方式2:用表单对象+Feign Form编码器(更规范)

首先添加Feign Form依赖(Maven示例):

<dependency>
    <groupId>io.github.openfeign.form</groupId>
    <artifactId>feign-form</artifactId>
    <version>3.8.0</version> <!-- 选择和你的Feign版本兼容的版本 -->
</dependency>

然后定义表单DTO:

public class BitstampAuthForm {
    private String key;
    private String signature;
    private Long nonce;

    // 全参构造函数、Getter/Setter(按需)
    public BitstampAuthForm(String key, String signature, Long nonce) {
        this.key = key;
        this.signature = signature;
        this.nonce = nonce;
    }

    // Getters...
}

接着配置Feign的编码器:

import feign.codec.Encoder;
import io.github.openfeign.form.spring.SpringFormEncoder;
import org.springframework.cloud.openfeign.support.SpringEncoder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class BitstampFeignConfig {
    @Bean
    public Encoder feignFormEncoder() {
        return new SpringFormEncoder(new SpringEncoder());
    }
}

最后定义Feign接口:

import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.Map;

@PostMapping(value = "api/v2/balance/",
             produces = MediaType.APPLICATION_JSON_VALUE,
             consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
ResponseEntity<Map<String, Object>> getAccountBalance(@RequestBody BitstampAuthForm authForm);

第二步:确保Signature生成逻辑完全正确

这是很多人踩坑的点,Bitstamp的Signature生成有严格规则:

  1. Message格式:必须是 nonce + clientId + apiKey 的拼接字符串(顺序绝对不能错!),其中clientId是你在Bitstamp API设置页面看到的数字ID(不是API Key本身)。
  2. 加密算法:用HMAC-SHA256加密上述Message,密钥是你的API Secret。
  3. 格式转换:加密后的字节数组要转成大写的十六进制字符串。

示例代码:

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Hex;
import java.nio.charset.StandardCharsets;

public String generateBitstampSignature(String nonce, String clientId, String apiKey, String apiSecret) throws Exception {
    String message = nonce + clientId + apiKey;
    Mac hmacSha256 = Mac.getInstance("HmacSHA256");
    SecretKeySpec secretKey = new SecretKeySpec(apiSecret.getBytes(StandardCharsets.UTF_8), "HmacSHA256");
    hmacSha256.init(secretKey);
    byte[] signatureBytes = hmacSha256.doFinal(message.getBytes(StandardCharsets.UTF_8));
    return Hex.encodeHexString(signatureBytes).toUpperCase();
}

第三步:验证Nonce的正确性

Nonce必须满足两个要求:

  • 是递增的数值:每次请求的Nonce必须比上一次大,不能重复。
  • 建议用毫秒级时间戳:比如System.currentTimeMillis(),既保证递增又不会重复。

最后再做几个验证

  1. 检查请求的Content-Type是否是application/x-www-form-urlencoded,可以通过日志确认。
  2. 确认API Key、API Secret、ClientId没有复制错误(比如多了空格、少了字符)。
  3. 测试时可以用Postman先手动构造请求,确认认证通过后再用Feign实现,这样能快速排查是代码问题还是参数问题。

内容的提问来源于stack exchange,提问作者user3105453

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:05:18