> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.6mm.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.6mm.com/_mcp/server.

# 초 거래 통합

이 가이드는 **Agent Java SDK `v0.3.0`** 및 Java 8+를 대상으로 합니다.

## 본인 확인, 인증, 자금 준비

초 거래는 무기한 거래와 동일한 사용자 바인딩 및 입력 인증을 사용합니다. 자금 잔액을 사용합니다. 영구 마진은 계약 잔액을 사용합니다. 프론트엔드 상품/모드와 백엔드 펀드 환경을 별도로 구성하세요.

다음을 사용하여 `client`를 초기화합니다. [빠른 시작](/ko/sdk/agent-sdk/java/quick-start). 바인딩된 사용자 매핑을 저장하고 인증된 백엔드 세션에서 파트너 사용자 ID를 얻습니다.

## 항목 리디렉션

```java
import com.sixmm.agent.model.CreateEntryUrlRequest;
import com.sixmm.agent.model.CreateEntryUrlResponse;

CreateEntryUrlResponse entry = client.createEntryUrl(
        CreateEntryUrlRequest.of("merchant-user-001")
                .withRedirectPath("/zh-CN/up-down?tradingMode=demo")
                .withReturnUrl("https://merchant.example/markets"));
String webUrl = entry.webUrl;
```

SDK는 `POST /v1/agent/create-entry-url`을 호출합니다. `webUrl`을 파트너 프런트엔드로 반환하고 즉시 엽니다. `expireAt`는 Unix 초를 사용합니다. 티켓은 수명이 짧고 일회성입니다. 만료 또는 소비 후에 다른 것을 얻습니다.

| 제품     | 예제 프런트엔드 경로                                         | 지갑    |
| ------ | --------------------------------------------------- | ----- |
| 위/아래   | `/zh-CN/up-down?tradingMode=real` 또는 `demo`         | 자금 조달 |
| 높음/낮음  | `/zh-CN/high-low?tradingMode=real` 또는 `demo`        | 자금 조달 |
| 그리드    | `/zh-CN/grid-prediction?tradingMode=real` 또는 `demo` | 자금 조달 |
| 영원한 미래 | `/zh-CN/futures/BTCUSDT?tradingMode=real` 또는 `demo` | 계약    |

6MM에서 제공하는 실제 프런트엔드 경로를 사용하세요. `redirectPath`는 `/`로 시작하는 상대 플랫폼 경로입니다. `returnUrl`는 절대 파트너 HTTP/HTTPS URL 입니다. 입장 티켓은 사용자를 인증하며 전송을 실행하지 않습니다.

## 삽입된 항목

기존 `partner-token` 및 `tokenProvider` 흐름을 사용합니다. 예측별 토큰은 없습니다. 원하는 `page` 및 `tradingMode`로 위젯을 생성하고 파트너 백엔드를 호출할 때 현재 `channelId`를 사용합니다.

```java
import com.sixmm.agent.model.CreateEmbedTokenRequest;
import com.sixmm.agent.model.CreateEmbedTokenResponse;

String channelId = "tw_example_channel";
CreateEmbedTokenResponse auth = client.createEmbedToken(
        CreateEmbedTokenRequest.of("merchant-user-001", channelId));
String embedToken = auth.embedToken;
long expireAt = auth.expireAt;
```

SDK는 `POST /v1/agent/create-embed-token`을 호출합니다. `symbol`는 선택 사항입니다. 초매매 상품을 선택하지 않습니다. 제품 선택은 프런트엔드에 속합니다. 토큰은 자금 환경을 선택하거나 잔액을 변경하지 않습니다.

## 완전한 프론트엔드 예시

이러한 옵션은 2026년 10월 10일 공개 Trading Widget `1.8.0` 런타임에 대해 확인되었습니다. 위젯과 Agent Java SDK 버전은 독립적입니다.

```html
<div id="seconds-widget" style="width: 100%; height: 720px"></div>
<script src="https://app.6mm.com/sdk/trading-widget/v1/index.js"></script>
<script>
  const page = 'up-down';
  const tradingMode = 'demo';
  const capabilities = TradingWidget.capabilities;
  if (!capabilities?.partnerToken ||
      !capabilities.pages?.includes(page) ||
      !capabilities.tradingModes?.includes(tradingMode)) {
    throw new Error('Trading Widget SDK does not support the requested page or mode');
  }

  const widget = TradingWidget.create('#seconds-widget', {
    baseUrl: 'https://app.6mm.com',
    page,
    tradingMode,
    theme: 'dark',
    locale: 'zh-CN',
    auth: {
      mode: 'partner-token',
      tokenProvider: async ({ channelId }) => {
        // Partner-owned endpoint; derive the user from the backend session.
        const response = await fetch('/api/seconds/embed-token', {
          method: 'POST',
          credentials: 'same-origin',
          headers: { 'Content-Type': 'application/json' },
          body: JSON.stringify({ channelId }),
        });
        if (!response.ok) {
          throw new Error('Failed to request embed token');
        }
        const result = await response.json();
        if (typeof result.embedToken !== 'string' || !result.embedToken.trim() ||
            !Number.isFinite(result.expireAt) || result.channelId !== channelId) {
          throw new Error('Invalid embed token response');
        }
        return {
          embedToken: result.embedToken,
          expireAt: result.expireAt,
          channelId: result.channelId,
        };
      },
    },
    onReady() {
      console.log('Trading widget ready');
    },
    onError(error) {
      console.error('Trading widget error', error.code);
    },
  });
  window.addEventListener('beforeunload', () => widget.destroy());
</script>
```

| 옵션            | 가치                                       | 의미                                |
| ------------- | ---------------------------------------- | --------------------------------- |
| `page`        | `up-down`, `high-low`, `grid-prediction` | 제품 페이지.                           |
| `tradingMode` | `real`, `demo`                           | 기본값은 `real`입니다. 명시적으로 설정합니다.      |
| `baseUrl`     | `https://app.6mm.com`                    | 플랫폼 프런트엔드 출처. 위젯은 내장 URL 을 구축합니다. |

## 파트너 백엔드 응답

`/api/seconds/embed-token`는 새로운 6MM API가 아닌 파트너 소유 엔드포인트입니다. 세션을 인증하고, 서버 측에서 `agentUserId`를 파생시키고 `createEmbedToken`를 호출합니다. 다음 최상위 구조를 반환합니다.

```json
{
  "embedToken": "short-one-time-token",
  "expireAt": 1791590700,
  "channelId": "tw_xxx"
}
```

예시 값이 아닌 에이전트 응답의 실제 `expireAt`를 사용하세요. 에이전트 응답에 `channelId`가 포함되어 있지 않습니다. 백엔드는 현재 요청의 값을 반영합니다. API가 결과를 `data`로 래핑한 경우 tokenProvider에서 반환하기 전에 해당 레이어의 래핑을 해제하세요. 잘못된 성공 개체를 반환하는 대신 비즈니스 실패를 거부합니다.

모든 초기화 또는 갱신은 새로운 토큰을 얻습니다. 동일한 토큰을 다시 캐시하고 교환하거나 URL 에 넣지 마십시오. 갱신 중에 동일한 인스턴스 채널을 재사용합니다. 인스턴스를 다시 만든 후 새 채널을 사용하세요.

## 자금 환경에 맞게

`demo` 프런트엔드에는 `environment=SIMULATED`를 사용한 시뮬레이션 자금 요청이 필요합니다. `real` 프런트엔드에는 제작 자금이 필요합니다. `tradingMode`이나 토큰 생성 모두 백엔드 자금 목표를 변경하지 않습니다.

사용자 전환이나 거래 모드 전환 시 기존 위젯을 삭제하고 새 인스턴스를 생성하세요. 사용자를 자금이 지원된 것으로 처리하기 전에 자금 잔액을 쿼리하고 자금을 이체하고 자금 관련 상태 엔드포인트를 통해 최종 결과를 확인하세요.

보다 [펀딩 지갑](/ko/sdk/agent-sdk/java/funding-wallet) 그리고 [환경가이드](/ko/sdk/agent-sdk/java/environments).

## 소스 및 관련 가이드

* [공식 v0.3.0 소스](https://github.com/6mm-com/agent-java-sdk/tree/54aa3c1)
* [쿼리 개요 및 페이지 매김](/ko/sdk/agent-sdk/java/perpetual-queries)
* [펀딩 지갑](/ko/sdk/agent-sdk/java/funding-wallet)
* [업그레이드 가이드](/ko/sdk/agent-sdk/java/upgrade)