关于 telnyx-api
telnyx-api 是面向使用 Telnyx 通信 API 的开发者技能,涵盖消息、语音、号码管理和 Webhook,并提供 TypeScript 示例及生产实践。
主要功能
- 01SMS 和 MMS API 示例
- 02语音与电话号码管理指南
- 03Webhook 处理与签名验证
- 04重试、速率限制与幂等处理
- 0510DLC 注册指南
适用场景
- 01在应用中发送 SMS 或 MMS
- 02处理入站消息和送达事件
- 03构建批量或定时消息发送
- 04准备美国 A2P 消息活动注册
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ tdimino/ claude-code-minoan --skill telnyx-api安装后在 Claude Code 中输入/telnyx-api确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
README.mdassets/examples/provider-implementation.tssend-sms.tswebhook-handler.tsreferences/10dlc.mdauthentication.mdbest-practices.mderror-codes.mdindex.mdmessaging-api.mdproduction-patterns.mdwebhooks.mdreferences/github/CHANGELOG.mdfile_structure.mdissues.mdREADME.mdreleases.mdreferences/official-docs/authentication.mdmessaging.mdsdks.mdwebhooks.md详细介绍
Telnyx API - 全面的通信平台
v2.0 增强:此技能现已包含 Telnyx 官方文档、经过生产环境验证的 Twilio-Aldea 模式(包括使用 tweetnacl 进行 Ed25519 签名验证、与提供商无关的 Webhook 处理程序以及数据库幂等性),以及全面的 TypeScript SMS/MMS 消息示例。
何时使用此技能
在使用 Telnyx 通信 API 执行以下任务时,请使用此技能:
- SMS/MMS 消息 - 以编程方式发送和接收文本消息
- 语音通信 - 使用 Call Control API 构建语音通话应用
- 电话号码管理 - 搜索、购买和配置电话号码
- 消息配置文件 - 配置消息设置和 Webhook
- Webhook 集成 - 处理实时事件和送达通知
- 双向 SMS 对话 - 构建交互式 SMS 体验
- 批量发送 SMS - 通过速率限制向多个收件人发送消息
- 消息定时发送 - 安排在未来发送消息
- 生产部署 - 部署带有错误处理和监控的消息功能
- 10DLC 注册 - 注册品牌和营销活动,以符合美国 A2P 消息合规要求
此技能适用于在应用中构建通信功能、设置 SMS 通知系统、创建语音 IVR 系统或集成电话功能。
快速参考
1. 发送简单 SMS
const axios = require('axios');
async function sendSMS(to, from, text) {
const response = await axios.post(
'https://api.telnyx.com/v2/messages',
{ from, to, text },
{
headers: {
'Authorization': `Bearer ${process.env.TELNYX_API_KEY}`,
'Content-Type': 'application/json'
}
}
);
return response.data;
}
// Usage
await sendSMS('+14155552671', '+14155559999', 'Hello from Telnyx!');
2. 验证电话号码(E.164 格式)
function validateE164(phoneNumber) {
const e164Regex = /^\+[1-9]\d{1,14}$/;
if (!e164Regex.test(phoneNumber)) {
return {
valid: false,
error: 'Phone number must be in E.164 format (e.g., +14155552671)'
};
}
return { valid: true };
}
// Normalize US phone numbers to E.164
function formatToE164(number) {
let digits = number.replace(/\D/g, '');
if (!digits.startsWith('1')) {
digits = '1' + digits;
}
return '+' + digits;
}
3. 处理收到的消息(Webhook)
const express = require('express');
app.use(express.json());
app.post('/webhooks/telnyx', (req, res) => {
const event = req.body.data;
if (event.event_type === 'message.received') {
const from = event.payload.from.phone_number;
const text = event.payload.text;
const to = event.payload.to[0].phone_number;
console.log(`Received: "${text}" from ${from}`);
// Auto-reply
await sendSMS(from, to, 'Thanks for your message!');
}
res.status(200).send('OK');
});
4. 验证 Webhook 签名(Ed25519)
const nacl = require('tweetnacl');
function verifyWebhook(rawBody, signature, timestamp, publicKey) {
// Check timestamp freshness (prevent replay attacks)
const timestampMs = parseInt(timestamp);
const now = Date.now();
if (Math.abs(now - timestampMs) > 5 * 60 * 1000) {
return false; // Reject if older than 5 minutes
}
// Construct signed payload
const signedPayload = `${timestamp}|${rawBody}`;
// Decode signature and public key from hex
const signatureBytes = Buffer.from(signature, 'hex');
const publicKeyBytes = Buffer.from(publicKey, 'hex');
// Verify Ed25519 signature
return nacl.sign.detached.verify(
Buffer.from(signedPayload, 'utf8'),
signatureBytes,
publicKeyBytes
);
}
// Usage in Express
app.post('/webhooks/telnyx', (req, res) => {
const signature = req.headers['telnyx-signature-ed25519'];
const timestamp = req.headers['telnyx-timestamp'];
const rawBody = JSON.stringify(req.body);
if (!verifyWebhook(rawBody, signature, timestamp, process.env.TELNYX_PUBLIC_KEY)) {
return res.status(401).send('Invalid signature');
}
// Process webhook...
res.status(200).send('OK');
});
5. 发送消息并进行错误处理和重试
async function sendWithRetry(to, from, text, maxRetries = 3) {
for (let attempt = 1; attempt <= maxRetries; attempt++) {
try {
return await sendSMS(to, from, text);
} catch (error) {
if (error.response?.status >= 500 && attempt < maxRetries) {
// Server error - retry with exponential backoff
const delayMs = Math.pow(2, attempt) * 1000;
console.log(`Retry ${attempt} in ${delayMs}ms...`);
await new Promise(resolve => setTimeout(resolve, delayMs));
} else {
throw error;
}
}
}
}
6. 通过速率限制批量发送
async function sendBulkSMS(recipients, from, text) {
const delayMs = 100; // 10 messages/second
const results = [];
for (const recipient of recipients) {
try {
const result = await sendSMS(recipient, from, text);
results.push({ success: true, to: recipient, id: result.data.id });
} catch (error) {
results.push({ success: false, to: recipient, error: error.message });
}
await new Promise(resolve => setTimeout(resolve, delayMs));
}
return results;
}
7. 幂等地处理 Webhook(数据库)
// Using PostgreSQL with unique constraint
async function processWebhookIdempotent(event, client) {
try {
await client.query('BEGIN');
// Try to insert event (will fail if duplicate due to unique constraint)
await client.query(
'INSERT INTO processed_webhooks (event_id, processed_at) VALUES ($1, NOW())',
[event.id]
);
// Process event
await handleEvent(event, client);
await client.query('COMMIT');
} catch (error) {
await client.query('ROLLBACK');
// If duplicate key error, event was already processed
if (error.code === '23505') {
console.log('Event already processed, skipping');
return;
}
throw error;
}
}
8. 双向对话状态机
const conversations = new Map();
app.post('/webhooks/telnyx', async (req, res) => {
const event = req.body.data;
if (event.event_type === 'message.received') {
const from = event.payload.from.phone_number;
const to = event.payload.to[0].phone_number;
const text = event.payload.text.toLowerCase();
let state = conversations.get(from) || 'start';
let reply;
switch (state) {
case 'start':
reply = "Welcome! What's your name?";
conversations.set(from, 'asked_name');
break;
case 'asked_name':
reply = `Nice to meet you, ${text}! How can I help?`;
conversations.set(from, 'helping');
break;
case 'helping':
reply = 'Thanks! A human will respond shortly.';
conversations.delete(from);
break;
}
await sendSMS(from, to, reply);
}
res.status(200).send('OK');
});
9. 检查 10DLC 营销活动状态
#!/bin/bash
# Monitor campaign approval status
CAMPAIGN_ID="your-campaign-id"
API_KEY="your-api-key"
STATUS=$(curl -s "https://api.telnyx.com/v2/10dlc/campaign/${CAMPAIGN_ID}" \
-H "Authorization: Bearer ${API_KEY}" \
| jq -r '.campaignStatus')
echo "Campaign status: ${STATUS}"
# Status values:
# - TCR_ACCEPTED: Campaign Registry approved (not yet ready)
# - MNO_PENDING: Waiting for carrier approval
# - MNO_PROVISIONED: Fully approved and ready for production
10. 处理常见错误
function handleTelnyxError(error) {
if (!error.response) {
return { type: 'NETWORK_ERROR', retriable: true };
}
const status = error.response.status;
const errorData = error.response.data.errors?.[0];
switch (status) {
case 400:
case 422:
// Validation error - fix input
return {
type: 'VALIDATION_ERROR',
message: errorData?.detail || 'Invalid request',
retriable: false
};
case 401:
// Check API key
return { type: 'AUTH_ERROR', retriable: false };
case 429:
// Rate limit - wait and retry
return {
type: 'RATE_LIMIT',
retriable: true,
retryAfter: 60
};
case 500:
case 502:
case 503:
// Server error - retry with backoff
return { type: 'SERVER_ERROR', retriable: true };
default:
return { type: 'UNKNOWN_ERROR', retriable: false };
}
}
核心概念
1. E.164 电话号码格式
国际电话号码格式:+[country code][number]
- 美国示例:
+14155552671 - 英国示例:
+442071234567 - 始终包含
+前缀 - 最多 15 位数字(不含 +)
2. 消息配置文件
用于对号码进行分组并定义 Webhook 设置的配置容器。优势:
- 集中管理 Webhook
- 用于负载分配的号码池
- 字母数字发件人 ID
- 轻松管理号码
- Webhook 故障转移 URL
3. 消息编码和分段
- GSM-7:标准 ASCII 每段 160 个字符(成本更低)
- UCS-2:表情符号/Unicode 每段 70 个字符(成本更高)
- 长消息会拆分为多个段(最多 10 段)
- 多段消息:GSM-7 每段 153 个字符,UCS-2 每段 67 个字符
4. Webhook 事件
有关消息状态的实时通知:
message.sent- 已发送至运营商message.delivered- 已送达收件人message.failed- 送达失败message.received- 已收到入站消息message.finalized- 已达到最终状态
5. 10DLC 营销活动审批阶段
了解美国消息服务时的关键事项:
- TCR_ACCEPTED - 营销活动注册中心已批准(尚不能发送)
- MNO_PENDING - 等待运营商批准(1-3 天)
- MNO_PROVISIONED - 已完全批准并准备就绪(可以关联号码并发送)
6. 身份验证
所有 API 请求都需要使用 Bearer 令牌进行身份验证:
Authorization: Bearer YOUR_API_KEY
将 API 密钥存储在环境变量中,切勿硬编码。
参考文件
references/ 目录包含详细文档:
authentication.md
API 密钥管理和安全的完整指南:
- 创建和管理 API 密钥
- 设置环境变量(Node.js、Python、Docker、Kubernetes)
- 密钥轮换和安全最佳实践
- 配置 IP 允许列表
- 验证 Webhook 签名
- 常见身份验证错误及解决方案
messaging-api.md
完整的 Messaging API 参考:
- 完整的端点文档(
/v2/messages) - 所有请求/响应参数
- 消息状态值及生命周期
- 字符编码详情(GSM-7 与 UCS-2)
- 消息分段规则
- MMS 限制及支持的格式
- 分页和筛选选项
webhooks.md
全面的 webhook 参考:
- 所有 webhook 事件类型及负载示例
- Ed25519 签名验证(安全)
- HMAC-SHA256 签名验证(旧版)
- Webhook 配置(全局、配置文件、按消息)
- 最佳实践(幂等性、异步处理、重试)
- 使用 ngrok 在本地测试 webhook
- 完整的 webhook 处理程序示例
- 故障排查指南
error-codes.md
完整的错误参考与处理指南:
- 所有 HTTP 状态码及其含义
- 常见错误代码及解决方案
- 验证错误(10001-10007)
- 速率限制错误(429)
- 服务器错误(500、502、503)
- Webhook 专属投递错误
- 全面的错误处理程序实现
- 指数退避重试策略
best-practices.md
生产环境部署模式:
- 在生产环境中使用 messaging profiles
- 稳健的错误处理模式
- 指数退避重试逻辑
- 批量发送的速率限制
- 消息跟踪和状态监控
- 电话号码验证和格式化
- 消息内容优化
- 字符数限制处理
- 使用队列进行 webhook 异步处理
- 幂等性实现
- 结构化日志记录和监控
- 成本优化策略
- 测试模式
- 生产环境部署检查清单
number-management.md
电话号码操作:
- 搜索可用号码
- 购买电话号码
- 配置号码设置
- 转移现有号码
- 号码池管理
10dlc.md
10DLC(10 位长号码)注册与合规:
- 营销活动审批阶段(TCR_ACCEPTED → MNO_PENDING → MNO_PROVISIONED)
- 品牌和营销活动注册流程
- 用例选择(客户支持、营销、2FA 等)
- TCPA 和 CTIA 合规要求
- 必需的消息要素(opt-in、opt-out、HELP)
- 通过 API 监控营销活动状态
- 电话号码关联(仅限门户,不支持通过 API 操作)
- 成本结构和预计时间(3-5 个工作日)
- 常见问题和故障排查
- 生产环境检查清单
官方 Telnyx 文档(NEW)
从 developers.telnyx.com 提取的完整官方文档:
references/official-docs/webhooks.md- 完整的 webhook 指南,包含签名验证、事件类型和最佳实践references/official-docs/messaging.md- Messaging API 参考,包含 SMS/MMS 端点、字符编码和分段references/official-docs/authentication.md- API 身份验证、安全性和最佳实践references/official-docs/sdks.md- Node.js(v2,支持 TypeScript/ESM)、Python、Ruby、PHP、Java、Go 的服务端 SDK 文档
生产环境模式(NEW)
来自 Twilio-Aldea 生产代码库的真实场景模式:
references/production-patterns.md- 8 种经过实战验证的模式,包括:- 模式 1:使用 tweetnacl 验证 Ed25519 签名(安全的 webhook 身份验证)
- 模式 2:与提供商无关的 webhook 处理程序(通过单一端点同时支持 Twilio 和 Telnyx)
- 模式 3:用于签名验证的原始正文解析(保留原始字节)
- 模式 4:通过数据库唯一约束实现幂等性(防止重复处理)
- 模式 5:Messaging Profile 配置(适用于生产环境的设置)
- 模式 6:带电话号码检测的调试模式(无成本测试)
- 模式 7:带分类的数据库错误日志记录(持久化、可查询的跟踪记录)
- 模式 8:E.164 电话号码标准化(处理所有格式)
代码示例(新增)
可用于生产环境的 TypeScript 示例:
assets/examples/webhook-handler.ts- 完整的 Webhook 处理程序,带有 Ed25519 签名验证assets/examples/send-sms.ts- SMS/MMS 发送示例,包含错误处理和重试逻辑assets/examples/provider-implementation.ts- 来自 Twilio-Aldea 的完整生产级 Provider 类
GitHub 仓库(新增)
references/github/README.md
GitHub 上的 Telnyx Node.js SDK 官方 README(team-telnyx/telnyx-node,62 个星标)
references/github/issues.md
16 个 GitHub Issue,展示了常见问题及解决方案:
- Webhook 签名验证问题
- TypeScript 类型定义
- SDK 初始化错误
- 速率限制处理
- 环境配置
references/github/CHANGELOG.md
完整的 SDK 版本历史,包含重大变更和迁移说明
references/github/releases.md
81 个 GitHub Release,附有详细的 SDK 更新日志
references/github/file_structure.md
仓库结构(2,129 个文件),展示了 SDK 源代码的组织方式
使用此技能
新手指南
从这里开始:
- 使用快速参考示例 #1(发送简单 SMS)
- 为 API 密钥设置环境变量
- 使用快速参考示例 #2(验证电话号码)
- 测试向自己的电话号码发送消息
- 设置快速参考示例 #3(处理收到的消息)
- 使用 ngrok 测试双向消息
需要了解的关键概念:
- E.164 电话号码格式(始终以 + 开头)
- Bearer 令牌身份验证
- 基本的 Webhook 处理
- 消息编码(GSM-7 与 UCS-2)
参考文件:
- 从
authentication.md开始设置 - 查看
messaging-api.md,了解基本 API 用法 - 出现错误时查看
error-codes.md - 使用
webhooks.md接收消息
新手常见错误:
- 忘记在电话号码前加
+ - 未使用 E.164 格式(例如,使用
(415) 555-2671,而不是+14155552671) - 将 API 密钥硬编码,而不是使用环境变量
- 未验证 Webhook 签名
中级用户指南
重点领域:
- 实现快速参考示例 #4(使用 Ed25519 验证 Webhook 签名)
- 使用快速参考示例 #5(带重试的错误处理)
- 使用快速参考示例 #8(状态机)构建对话流程
- 创建消息配置文件(参见
best-practices.md) - 实现快速参考示例 #7(数据库幂等性)
需要掌握的关键概念:
- 适用于生产环境的消息配置文件
- Ed25519 Webhook 签名验证(比 HMAC 更安全)
- 带重试逻辑的错误处理模式
- 消息分段和成本优化
- Webhook 处理的幂等性
- 批量发送的速率限制
参考文件:
- 学习
webhooks.md,了解事件类型和安全性 - 查看
best-practices.md,了解生产环境模式 - 使用
error-codes.md实现全面的错误处理 - 查看
production-patterns.md,了解实际应用
生产环境注意事项:
- 始终验证 Webhook 签名(使用 Ed25519,而非 HMAC-SHA256)
- 实现幂等性,避免重复处理
- 使用指数退避进行重试
- 将所有错误记录到数据库,以便调试
- 监控消息送达率
面向高级用户
高级模式:
- 使用队列系统(Bull/Redis)实现
best-practices.md中的批量消息发送 - 构建与服务提供商无关的处理程序(
production-patterns.md中的模式 2) - 设置全面的错误日志记录(
production-patterns.md中的模式 7) - 实现调试器模式,实现零成本测试(模式 6)
- 使用编码策略优化消息成本
- 使用 Call Control API 构建 IVR 系统
- 为大批量消息发送设置号码池
- 实现全面的监控和告警
关键主题:
- 用于异步处理的消息队列系统(Bull/Redis)
- 使用唯一约束实现由数据库支持的幂等性
- 结构化日志记录(Winston)
- 指标收集(Prometheus)
- 生产环境部署模式
- 使用统一接口的多服务提供商架构
- 10DLC 活动注册与监控
- Webhook 故障转移与重试机制
参考文件:
- 深入阅读
best-practices.md,了解所有生产环境模式 - 查阅
error-codes.md,了解全面的错误处理 - 阅读
webhooks.md,了解高级 Webhook 模式 - 分析
production-patterns.md,了解经过实战验证的实现方案 - 查看
10dlc.md,了解美国 A2P 消息合规要求
架构模式:
- 与服务提供商无关的设计(支持多个 SMS 服务提供商)
- 使用消息队列的事件驱动架构
- 由数据库支持的对话状态机
- 采用指数退避的 Webhook 重试机制
- 通过检测调试器模式优化成本
- 支持故障转移的多区域部署
API 基础知识
基础 URL
https://api.telnyx.com/v2
身份验证标头
Authorization: Bearer YOUR_API_KEY
环境变量
# .env file
TELNYX_API_KEY=KEY019A080F468AAFD4AF4F6888D7795244_xxx
TELNYX_PUBLIC_KEY=your_public_key_for_webhook_validation
TELNYX_MESSAGING_PROFILE_ID=abc85f64-5717-4562-b3fc-2c9600000000
速率限制
- 标准账户:每个端点每秒 10 个请求
- 高容量账户:联系 Telnyx 提高限制
- 对 429 响应实施指数退避
常见响应结构
{
"data": {
"id": "message-uuid",
"type": "SMS",
"from": { "phone_number": "+18445550001" },
"to": [{ "phone_number": "+18665550001", "status": "queued" }],
"text": "Hello!",
"cost": { "amount": "0.0051", "currency": "USD" }
}
}
快速入门检查清单
- 在 https://telnyx.com/sign-up 注册 Telnyx 账户
- 在 Mission Control Portal 中生成 API 密钥
- 设置环境变量(切勿将密钥硬编码)
- 购买电话号码用于测试
- 发送第一条测试 SMS(快速参考 #1)
- 验证电话号码(快速参考 #2)
- 设置 Webhook 端点(本地开发可使用 ngrok)
- 实现 Webhook 处理程序(快速参考 #3)
- 添加 Ed25519 Webhook 签名验证(快速参考 #4)
- 测试双向消息
- 添加带重试逻辑的错误处理(快速参考 #5)
- 为生产环境配置消息配置文件
- (仅美国)如果要发送 A2P 消息,请注册 10DLC
按经验水平浏览
初学者(开始使用)
- 从 快速参考示例 #1(发送简单 SMS)开始
- 阅读
references/authentication.md,了解 API 设置 - 学习
references/messaging-api.md,了解消息 API 基础知识 - 使用 快速参考示例 #2(验证电话号码)
- 使用 快速参考示例 #3 设置 Webhook
- 使用 ngrok 在本地测试
中级用户(构建功能)
- 实现 Ed25519 签名验证(快速参考 #4)
- 阅读
references/webhooks.md,了解高级 Webhook 模式 - 使用消息配置文件(参见
best-practices.md) - 实现幂等性(快速参考 #7)
- 构建对话状态机(快速参考 #8)
- 查看
assets/examples/webhook-handler.ts,了解完整实现
高级用户(生产环境部署)
- 构建与服务提供商无关的处理程序(
production-patterns.md模式 2) - 实现错误日志记录与监控(
production-patterns.md模式 7) - 设计使用统一接口的多服务提供商架构
- 使用
production-patterns.md中的全部 8 种模式优化生产环境方案 - 学习 Twilio-Aldea 模式,了解基于 SMS 的 AI 平台架构
- 设置监控、告警和指标收集
v2.0 中的关键增强
官方文档集成
- Webhooks 指南:完整的 Ed25519 签名验证、事件类型和重试逻辑
- Messaging API:完整的端点参考、字符编码(GSM-7 与 UCS-2)和分段规则
- 身份验证:API 密钥管理、安全最佳实践和环境变量设置
- SDK 参考:7 种语言的服务端 SDK 文档
生产环境模式
- Ed25519 签名验证:经过生产环境测试的 tweetnacl 实现(解决了安全验证问题)
- 提供商无关设计:通过单个端点支持多个 SMS 提供商
- 保留原始请求体:使用精确的字节序列进行正确的签名验证
- 数据库幂等性:PostgreSQL 唯一约束模式(防止重复处理)
- Messaging Profiles:通过集中式 Webhook 管理进行生产环境部署
- 调试器模式:来自实时平台的零成本测试模式
- 错误日志记录:基于数据库的错误跟踪与分类
- E.164 规范化:正确处理所有电话号码格式
代码示例
- TypeScript 示例:Webhook 处理程序、SMS 发送、具备完整类型安全的提供商类
- 生产环境模式:来自 Twilio-Aldea SMS 平台的实际实现
- 安全示例:Ed25519 验证、原始请求体解析、签名验证
数据来源
- Telnyx 官方文档(通过 Firecrawl)
- Exa 代码上下文(来自真实代码仓库的 8000 多个 Telnyx 模式令牌)
- Twilio-Aldea 生产代码库(部署在 Netlify 上的基于 SMS 的 AI 治疗平台)
版本历史
- v2.1(2026-04-21)- 更新以适配 Node SDK v2(完整 TypeScript 支持、ESM 模块),并注明计划消息发送(
send_at字段)是生产环境功能 - v2.0(2025-11-01)- 增补 Telnyx 官方文档、Twilio-Aldea 的生产环境模式(Ed25519 验证、提供商无关的 Webhook、幂等性)、TypeScript 示例和全面的 Messaging API 指南
- v1.0 - 初始技能创建,包含快速参考、错误代码和基本消息模式
更多资源
- Telnyx 开发者门户:https://developers.telnyx.com/
- API 参考:https://developers.telnyx.com/api/
- Mission Control 门户:https://portal.telnyx.com/
- 状态页面:https://status.telnyx.com/
- 支持门户:https://support.telnyx.com/
- 官方 SDK:Node.js(v2 — TypeScript、ESM)、Python、Ruby、PHP、Java、Go
常见模式
模式:发送带跟踪信息的消息
const tracker = new Map();
async function sendTrackedMessage(to, from, text) {
const response = await sendSMS(to, from, text);
tracker.set(response.data.data.id, {
to, from, text,
status: 'queued',
sentAt: new Date()
});
return response;
}
// In webhook handler
app.post('/webhooks/telnyx', (req, res) => {
const event = req.body.data;
if (event.event_type === 'message.delivered') {
const msg = tracker.get(event.payload.id);
if (msg) msg.status = 'delivered';
}
res.status(200).send('OK');
});
模式:转换为 E.164 格式
function formatToE164(number, defaultCountryCode = '1') {
let digits = number.replace(/\D/g, '');
if (!digits.startsWith(defaultCountryCode)) {
digits = defaultCountryCode + digits;
}
return '+' + digits;
}
// Examples
formatToE164('415-555-2671'); // +14155552671
formatToE164('(415) 555-2671'); // +14155552671
formatToE164('+1 415-555-2671'); // +14155552671
模式:优化消息成本
// Prefer GSM-7 encoding (cheaper, longer)
function optimizeForGSM7(text) {
// Replace unicode quotes with GSM-7 quotes
return text
.replace(/[""]/g, '"')
.replace(/['']/g, "'")
.replace(/[—–]/g, '-')
.replace(/…/g, '...');
}
支持与故障排除
获取帮助
- 查看
error-codes.md了解具体错误消息 - 查阅
best-practices.md了解常见模式 - 访问 https://status.telnyx.com/ 查看服务状态
- 通过 Mission Control 门户联系支持团队
- 如果遇到美国 A2P 消息问题,请查看
10dlc.md
常见问题
- 401 Unauthorized:检查 API 密钥格式(
Bearer YOUR_API_KEY) - 10001 Invalid phone number:确保使用 E.164 格式(
+14155552671) - 429 Rate limit:实施速率限制(快速参考 #6)
- 未收到 Webhook:确认 URL 可公开访问且具有有效的 SSL
- 消息未能在美国送达:检查 10DLC 活动状态(必须为 MNO_PROVISIONED)
调试提示
// Enable request/response logging
axios.interceptors.request.use(request => {
console.log('Request:', request.url, request.data);
return request;
});
axios.interceptors.response.use(
response => {
console.log('Response:', response.status, response.data);
return response;
},
error => {
console.error('Error:', error.response?.data);
return Promise.reject(error);
}
);