본문으로 건너뛰기
텔레그램Mar 28, 2026

2026년 TON 개발: TON Pay SDK로 Telegram Mini Apps에서 암호화폐 결제 구현하기

OS
Open Soft Team

Engineering Team

2026년의 TON 생태계

The Open Network(TON)은 Telegram을 기반으로 한 블록체인 프로젝트에서 세계에서 가장 활발하게 사용되는 암호화폐 생태계 중 하나로 발전했습니다. 2026년 3월 기준, 수치가 인상적인 이야기를 들려줍니다:

  • 월간 5억 명 이상의 활성 사용자 — Telegram Mini Apps 전체
  • 3,600개 이상의 활성 Mini Apps — Telegram Mini App 카탈로그에 등재
  • 4억 개 이상의 TON 지갑 — Telegram Wallet, Tonkeeper, TON Space를 통해 생성
  • 42억 달러의 총 잠금 가치 — TON DeFi 프로토콜
  • 매일 1,200만 건의 온체인 거래 — TON 메인넷

이 수치는 TON을 활성 사용자 수 기준으로 가장 널리 보급된 블록체인으로 만들며, Ethereum(L2 포함)과 Solana를 능가합니다. 성장은 단일 요인에 의해 주도됩니다: Telegram 통합. 전 세계적으로 월간 9억 5천만 명 이상의 활성 Telegram 사용자가 있으며, Mini App 및 지갑 사용으로의 작은 전환율도 막대한 수치를 만들어냅니다.

왜 결제에 TON을 선택하는가?

결제 기능이 있는 애플리케이션을 구축하는 개발자에게 TON은 다른 블록체인 대비 세 가지 구조적 이점을 제공합니다:

  1. 배포 — Mini App은 사용자가 이미 매일 사용하는 메시징 플랫폼인 Telegram 내에서 발견 가능합니다. 앱 스토어 제출 불필요, 다운로드 마찰 없음, 지갑 설치 불필요.
  2. 거의 제로에 가까운 수수료 — TON 거래 수수료는 평균 $0.005-0.01로, 배치 처리나 L2 복잡성 없이도 소액 결제와 인앱 구매를 경제적으로 실현 가능하게 합니다.
  3. 서브세컨드 최종성 — TON의 샤딩 아키텍처는 약 5초의 블록 시간과 1-2블록 내 실질적 최종성을 달성합니다. 사용자는 10초 이내에 확인된 결제를 볼 수 있습니다.

TON Pay SDK: 아키텍처 개요

TON Pay SDK는 Telegram Mini Apps를 위한 공식 결제 통합 라이브러리입니다. 2025년 4분기에 출시되었으며, 통합 API를 제공합니다:

  • TON Connect — 지갑 인증
  • Toncoin 결제 — 네이티브 TON 전송
  • Jetton 결제 — TRC-20 토큰 표준: USDT, NOT, 커스텀 토큰
  • 구독 결제 — 사전 승인된 스마트 컨트랙트를 통한 반복 Jetton 과금
  • 결제 영수증 — 메타데이터가 포함된 온체인 결제 증명

SDK는 npm 패키지(@tonconnect/pay-sdk)로 제공되며 클라이언트 사이드(브라우저)와 서버 사이드(Node.js) 모두 지원합니다.

사전 요구 사항

TON Pay SDK를 통합하기 전에 다음을 준비하세요:

  1. Mini App 기능이 있는 등록된 Telegram Bot(@BotFather/newapp)
  2. 결제 수신용 TON 지갑 주소(가맹점 지갑)
  3. Node.js 20+ 및 TypeScript 5.x 개발 환경
  4. Telegram Mini App API(window.Telegram.WebApp)에 대한 기본 이해

1단계: TON Connect 지갑 인증

TON Connect는 TON 지갑을 dApp 및 Mini Apps에 연결하기 위한 표준 프로토콜입니다. 인증 레이어로 기능합니다 — 결제를 수락하기 전에 사용자가 어떤 지갑에서 결제하려는지 알아야 합니다.

TON Connect 설정

import { TonConnect } from "@tonconnect/sdk";
import { TonPaySDK } from "@tonconnect/pay-sdk";

// 매니페스트로 TON Connect 초기화
const tonConnect = new TonConnect({
  manifestUrl: "https://yourapp.com/tonconnect-manifest.json",
});

// 이전에 연결된 지갑이 있는지 확인
const existingWallet = tonConnect.wallet;
if (existingWallet) {
  console.log("연결됨:", existingWallet.account.address);
}

지갑 연결 흐름

지갑 연결 흐름은 사용자의 지갑 제공업체에 따라 다릅니다:

import { toUserFriendlyAddress } from "@tonconnect/sdk";

async function connectWallet(): Promise<string> {
  const walletList = await tonConnect.getWallets();

  // Telegram Mini Apps에서는 TON Space(내장)를 우선
  const tonSpace = walletList.find(
    (w) => w.appName === "tonspace"
  );

  if (tonSpace) {
    await tonConnect.connect({
      jsBridgeKey: tonSpace.jsBridgeKey,
    });
  } else {
    const universalLink = tonConnect.connect({
      universalLink: walletList[0].universalLink,
      bridgeUrl: walletList[0].bridgeUrl,
    });
    window.open(universalLink, "_blank");
  }

  return new Promise((resolve) => {
    tonConnect.onStatusChange((wallet) => {
      if (wallet) {
        const address = toUserFriendlyAddress(
          wallet.account.address
        );
        resolve(address);
      }
    });
  });
}

세션 지속성

TON Connect 세션은 Mini App 재시작 간에 유지됩니다. SDK는 세션 데이터를 localStorage에 저장합니다:

async function initAuth(): Promise<string | null> {
  await tonConnect.restoreConnection();
  if (tonConnect.connected && tonConnect.wallet) {
    return toUserFriendlyAddress(
      tonConnect.wallet.account.address
    );
  }
  return null;
}

2단계: Toncoin 결제 수락

지갑이 연결되면 TON Pay SDK를 사용하여 네이티브 TON 전송을 요청할 수 있습니다.

간단한 결제 요청

import { TonPaySDK, PaymentRequest } from "@tonconnect/pay-sdk";

const tonPay = new TonPaySDK({
  tonConnect,
  merchantWallet: "EQD...가맹점-주소",
  webhookUrl: "https://yourapi.com/webhooks/ton-pay",
});

async function requestPayment(
  amount: number,
  orderId: string
): Promise<string> {
  const payment: PaymentRequest = {
    amount: amount.toString(),
    payload: orderId,
    description: `주문 #${orderId}`,
  };

  const result = await tonPay.requestPayment(payment);

  if (result.status === "confirmed") {
    return result.txHash;
  } else if (result.status === "rejected") {
    throw new Error("사용자가 결제를 거부했습니다");
  } else {
    throw new Error(`결제 실패: ${result.error}`);
  }
}

서버 사이드 결제 검증

클라이언트 사이드 결제 확인만 신뢰하지 마세요. 백엔드에서 모든 결제를 검증하세요:

import { TonClient } from "@ton/ton";
import { Address, fromNano } from "@ton/core";

const tonClient = new TonClient({
  endpoint: "https://toncenter.com/api/v2/jsonRPC",
  apiKey: process.env.TONCENTER_API_KEY,
});

async function verifyPayment(
  txHash: string,
  expectedAmount: string,
  expectedPayload: string,
  merchantAddress: string
): Promise<boolean> {
  const tx = await tonClient.getTransaction(
    Address.parse(merchantAddress),
    txHash
  );

  if (!tx) return false;

  const receivedAmount = fromNano(tx.inMessage?.value ?? 0n);
  if (parseFloat(receivedAmount) < parseFloat(expectedAmount)) {
    return false;
  }

  const payload = tx.inMessage?.body?.toString() ?? "";
  if (payload !== expectedPayload) {
    return false;
  }

  return true;
}

3단계: Jetton(토큰) 결제

Jetton은 TON에서 ERC-20 토큰에 해당합니다. 결제에 가장 일반적인 Jetton은 TON의 USDT(Tether)로, 2026년 3월 기준 TON 네트워크에서 12억 달러 이상이 유통되고 있습니다.

import { JettonPaymentRequest } from "@tonconnect/pay-sdk";

async function requestUSDTPayment(
  amount: number,
  orderId: string
): Promise<string> {
  const USDT_MASTER = "EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs";

  const payment: JettonPaymentRequest = {
    jettonMaster: USDT_MASTER,
    amount: (amount * 1e6).toString(),
    payload: orderId,
    description: `$${amount} USDT — 주문 #${orderId}`,
    forwardTonAmount: "50000000",
  };

  const result = await tonPay.requestJettonPayment(payment);

  if (result.status === "confirmed") {
    return result.txHash;
  }
  throw new Error(`Jetton 결제 실패: ${result.error}`);
}

4단계: 구독 결제

TON Pay SDK는 사전 승인된 구독 컨트랙트를 통한 반복 결제를 지원합니다.

import { SubscriptionRequest } from "@tonconnect/pay-sdk";

async function createSubscription(
  userId: string
): Promise<string> {
  const subscription: SubscriptionRequest = {
    jettonMaster: USDT_MASTER,
    amount: "4990000",
    period: 30 * 24 * 60 * 60,
    maxCharges: 12,
    payload: `sub-${userId}`,
    description: "프리미엄 — $4.99/월",
  };

  const result = await tonPay.createSubscription(subscription);

  if (result.status === "active") {
    return result.subscriptionAddress;
  }
  throw new Error("구독 생성 실패");
}

Telegram Mini Apps 수익화 전략

결제는 수익화 퍼즐의 한 조각일 뿐입니다. 성공적인 Mini Apps가 여러 수익원을 어떻게 결합하는지 소개합니다:

1. Telegram 광고 플랫폼

Telegram의 네이티브 광고 플랫폼을 통해 Mini Apps는 광고를 표시하고 TON으로 수익을 얻을 수 있습니다. 통합하려면 @AdsBot를 통해 퍼블리셔로 등록해야 합니다.

상위 Mini Apps는 Tier 1 국가의 보상형 동영상 광고에서 $5-15 eCPM을 보고합니다.

2. Telegram Stars를 통한 인앱 구매

Telegram Stars는 Telegram 내장 가상 화폐로 2024년부터 사용 가능합니다. 사용자는 법정 화폐(Apple Pay, Google Pay, 신용카드)로 Stars를 구매하고 Mini Apps에서 사용합니다. 개발자는 Stars 수익의 70%를 받습니다.

3. 크립토 네이티브 수익화

TON Pay SDK 결제와 DeFi 메커니즘을 결합합니다:

  • 토큰 게이트 접근 — 프리미엄 기능 접근에 특정 Jetton 또는 SBT(Soulbound Token) 보유 요구
  • NFT 마켓플레이스 — 디지털 수집품 판매(TON NFT는 TEP-62 표준 사용)
  • 스테이킹 보상 — 사용자가 Mini App의 스마트 컨트랙트에서 TON이나 Jetton을 스테이킹하여 수익 획득
  • 추천 수수료 — 스마트 컨트랙트를 통해 Jetton으로 추천 보너스 지급

수익화 모델 비교

모델결제 방법개발자 몫사용자 마찰최적 대상
Telegram 광고광고 노출광고 수익의 50-70%낮음(수동적)높은 DAU의 무료 앱
Telegram Stars법정 화폐 → Stars70%중간(인앱 구매)디지털 상품, 캐주얼 게임
TON Pay(Toncoin)크립토 지갑100%(가스 제외)높음(지갑 필요)크립토 네이티브 사용자
TON Pay(USDT)크립토 지갑100%(가스 제외)높음(지갑 필요)안정적 가치 거래
구독크립토 지갑100%(가스 제외)중간(일회성 승인)SaaS, 프리미엄 콘텐츠

프로덕션 배포 체크리스트

결제 기능이 있는 Mini App을 출시하기 전에:

  1. 가맹점 지갑 보안 — 결제 수신에 멀티시그 지갑(예: TON Safe)을 사용하세요. 단일 키 핫 지갑은 사용하지 마세요.
  2. 결제 검증 — 항상 서버 사이드에서 결제를 검증하세요. 금액, 페이로드, 발신자 주소를 확인하세요.
  3. 에러 처리 — 네트워크 타임아웃, 거부된 거래, 잔액 부족을 적절히 처리하세요.
  4. 환불 정책 — 환불 메커니즘을 구현하세요. TON 거래는 되돌릴 수 없으므로 환불은 별도의 출금 거래가 필요합니다.
  5. 속도 제한 — 결제 웹훅 엔드포인트를 남용으로부터 보호하세요.
  6. 로깅 — 분쟁 해결을 위해 거래 해시와 함께 모든 결제 이벤트를 기록하세요.
  7. 테스트 — 개발에 TON 테스트넷을 사용하세요.

자주 묻는 질문

TON Mini Apps는 얼마나 많은 사용자에게 도달할 수 있나요?

Telegram은 월간 9억 5천만 명 이상의 활성 사용자를 보유하고 있습니다. Mini Apps는 아무것도 설치하지 않고도 모든 사용자가 접근할 수 있습니다. 상위 Mini Apps(Notcoin, Hamster Kombat)는 3,000-4,000만 명의 사용자에 도달했습니다.

TON 결제의 거래 수수료는 얼마인가요?

네이티브 TON 전송은 약 0.005-0.01 TON(현재 가격 기준 0.01-0.02)입니다. Jetton 전송은 추가 스마트 컨트랙트 실행으로 인해 약간 더 비싸며, 일반적으로 0.03-0.05 TON(0.06-0.10)입니다. 수수료는 가맹점이 아닌 발신자가 부담합니다.

Telegram Mini App에서 법정 화폐 결제를 받을 수 있나요?

네, Telegram Stars(내장) 또는 서드파티 결제 제공업체를 통해 가능합니다.

TON 결제를 받으려면 KYC가 필요한가요?

가맹점의 경우: 관할권과 거래량에 따라 다릅니다. 사용자의 경우: TON 지갑 생성에 KYC는 필요하지 않지만, 사용자가 TON을 구매하는 중앙화 거래소는 KYC를 시행합니다.

결제에서 TON과 Ethereum의 차이점은?

TON은 더 낮은 수수료($0.01 vs Ethereum L1의 $0.50-5.00), 더 빠른 최종성(10초 vs 12-15분), 내장된 Telegram 배포를 제공합니다. Ethereum은 더 큰 DeFi 생태계, 더 많은 기관 채택, 더 강한 탈중앙화 보장을 가지고 있습니다.

분쟁과 차지백은 어떻게 처리하나요?

블록체인 결제는 되돌릴 수 없습니다 — 차지백이 없습니다. 자체 환불 및 분쟁 해결 시스템을 구현해야 합니다. 모범 사례: 가맹점 지갑으로 보내기 전에 분쟁 기간(24-72시간) 동안 에스크로 스마트 컨트랙트에 자금을 보유하세요.