Administrator
4 days ago e4934031411acd1a86f3e99922cf857763934023
feat(gateApi): 添加用户ID获取和WebSocket私有频道订阅功能

- 在GateGridTradeService中添加AccountApi依赖和AccountDetail导入
- 新增userId字段用于存储用户ID,支持WebSocket私有频道订阅
- 在init方法中调用API获取用户详情并初始化userId字段
- 添加getUserId方法供外部获取用户ID
- 修改WebSocket客户端订阅逻辑,使用真实用户ID替换占位符
- 更新订阅消息结构,添加唯一ID标识和用户ID验证
- 改进日志输出,显示具体的用户ID和合约信息
2 files modified
22 ■■■■■ changed files
src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java 13 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/gateApi/GateKlineWebSocketClient.java 9 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/gateApi/GateGridTradeService.java
@@ -3,7 +3,9 @@
import io.gate.gateapi.ApiClient;
import io.gate.gateapi.ApiException;
import io.gate.gateapi.GateApiException;
import io.gate.gateapi.api.AccountApi;
import io.gate.gateapi.api.FuturesApi;
import io.gate.gateapi.models.AccountDetail;
import io.gate.gateapi.models.FuturesAccount;
import io.gate.gateapi.models.FuturesInitialOrder;
import io.gate.gateapi.models.FuturesOrder;
@@ -72,6 +74,8 @@
    private volatile BigDecimal lastKlinePrice;
    /** 服务器返回的累计已实现盈亏 */
    private BigDecimal totalHistoryPnl = BigDecimal.ZERO;
    /** 用户 ID,用于 WebSocket 私有频道订阅 */
    private Long userId;
    /**
     * 构造函数,初始化 Gate 期货 API 客户端。
@@ -111,6 +115,11 @@
     */
    public void init() {
        try {
            AccountApi accountApi = new AccountApi(apiClient);
            AccountDetail accountDetail = accountApi.getAccountDetail();
            this.userId = accountDetail.getUserId();
            log.info("[GateGrid] 用户ID: {}", userId);
            futuresApi.updateContractPositionLeverageCall(
                    SETTLE, contract, leverage, marginMode, positionMode, null);
            log.info("[GateGrid] 已设置杠杆: {}x, 保证金模式: {}", leverage, marginMode);
@@ -447,4 +456,8 @@
    public BigDecimal getTotalHistoryPnl() {
        return totalHistoryPnl;
    }
    public Long getUserId() {
        return userId;
    }
}
src/main/java/com/xcong/excoin/modules/gateApi/GateKlineWebSocketClient.java
@@ -301,11 +301,16 @@
    private void subscribePositionsChannels() {
        JSONObject subscribeMsg = new JSONObject();
        long timeSec = System.currentTimeMillis() / 1000;
        subscribeMsg.put("id", timeSec * 1000000 + (System.currentTimeMillis() % 1000));
        subscribeMsg.put("time", timeSec);
        subscribeMsg.put("channel", POSITIONS_CHANNEL);
        subscribeMsg.put("event", "subscribe");
        String uid = gridTradeService != null && gridTradeService.getUserId() != null
                ? String.valueOf(gridTradeService.getUserId()) : "";
        JSONArray payload = new JSONArray();
        payload.add("user_id");
        payload.add(uid);
        payload.add(GATE_CONTRACT);
        subscribeMsg.put("payload", payload);
@@ -316,7 +321,7 @@
        subscribeMsg.put("auth", auth);
        webSocketClient.send(subscribeMsg.toJSONString());
        log.info("已发送仓位频道订阅请求(含认证),合约: {}", GATE_CONTRACT);
        log.info("已发送仓位频道订阅请求(含认证),userId:{}, 合约: {}", uid, GATE_CONTRACT);
    }
    /**