最近在做加密支付 / 风控相关的东西,本来只是想查一下 TON 的价格,结果踩了个挺典型的坑,顺手整理一下。
一、事情是怎么开始的?
我一开始用的是 CoinGecko 的接口:
https://api.coingecko.com/api/v3/simple/price?ids=toncoin&vs_currencies=usd
逻辑很简单:
- 币叫 Toncoin
- symbol 是 TON
- 那 id 不就是 toncoin 吗?
👉 结果:返回空 {}
当时第一反应是:
- API 挂了?
- 被限流了?
- 网络问题?
折腾了一圈发现——都不是。
二、真正的问题在哪?
问题其实很简单,但也很坑:
CoinGecko 查价格用的是 id,而这个 id 不是你以为的那个
对于 TON 来说:
id ≠ toncoin
而是:
the-open-network
三、为什么这么奇怪?
因为 TON 的历史比较“乱”:
- 一开始叫:Telegram Open Network
- 后来改名:The Open Network
CoinGecko 的 id 是按“项目名”来的,不是按 symbol。
所以就变成了:
| 字段 | 值 |
|---|---|
| name | Toncoin |
| symbol | TON |
| id | the-open-network |
四、正确写法
把接口改成这样就行了:
https://api.coingecko.com/api/v3/simple/price?ids=the-open-network&vs_currencies=usd
👉 立马就有数据了
五、这个坑本质是什么?
总结一下就是:
你不能“猜 CoinGecko 的 id”
很多人(包括我)会下意识写:
ids=toncoin
但其实:
- 有些币 id 跟名字一样
- 有些完全不一样
- 没有统一规则
六、正确姿势
方法1:查官方列表
https://api.coingecko.com/api/v3/coins/list
自己做一个映射:
symbol → id
方法2:本地维护一份(推荐)
比如:
TON → the-open-network
BTC → bitcoin
ETH → ethereum
七、后来我直接换了方案
说实话,这个问题让我有点不爽,于是我直接换成用 Binance。
用法简单很多:
https://api.binance.com/api/v3/ticker/price?symbol=TONUSDT
返回:
{
"symbol": "TONUSDT",
"price": "5.23"
}
👉 非常直观:
1 TON = 多少 USDT
八、两种方案对比
| 方式 | 体验 |
|---|---|
| CoinGecko | 覆盖广,但 id 很坑 |
| Binance | 简单直接,但只支持已上线交易对 |
九、一个我觉得很重要的经验
如果你是在做:
- 支付
- 风控
- 资产系统
👉 一定不要只用一个数据源
我现在的做法
价格服务:
├── Binance(主)
├── CoinGecko(备)
原因:
- Binance:实时交易价格,最稳
- CoinGecko:补充长尾币
十、还有一个小坑(容易忽略)
Binance 返回的是:
"price": "5.23"
👉 字符串,不是数字
如果你直接算:
- 可能会出精度问题
👉 建议用 decimal 处理
十一、总结一下
这次其实不是 API 的问题,而是:
不同平台的“标识体系不一样”
最重要三点
- TON 在 CoinGecko 的 id 是:
the-open-network - 在 Binance 用:
TONUSDT - 不要用 symbol 当唯一标识
最后一句
这个坑不大,但如果你在做资金系统:
👉 可能会变成很大的坑(比如价格算错)
所以还是早点填掉比较好。