通过短信发送订单提醒、预约提醒 和各类通知,全部经由 SMS。
使用已注册的电话号码或品牌发送方,将发货动态、预订提醒和账户提醒直接送达客户手机。Bird 在接受请求时返回字符编码和分段数;当你的应用重试超时请求时,避免重复发送短信;并将运营商送达状态实时推送到你的 webhook。
您的订单 #4821 已可取货。
消息
详情
送达只是运营商回执,并不能证明对方已读。
您的订单 #4821 已可取货。
消息
详情
送达只是运营商回执,并不能证明对方已读。
您的订单 #4821 已可取货。
消息
详情
送达只是运营商回执,并不能证明对方已读。
几分钟内发出第一条短信。
先安全测试,再向真实客户发送。
借助 Bird SMS API,只需一次调用,即可从后端发送订单确认、配送动态或预约提醒。在向真实客户发送之前,请从有效的美国发送方号码向美国沙盒号码 +15005550006 发送测试消息,这样无需向真实手机发送短信,即可验证集成和 webhook 处理逻辑。
// Install the SDK
// npm install @messagebird/sdk
const msg = await bird.sms.send({
from: "+15557654321",
to: "+14155550100",
text: "Your verification code is 123456.",
category: "authentication",
});
console.log(msg.id, msg.status);需要在用户登录或结账时进行验证?无需自行生成和存储一次性验证码,使用 Bird Verify 即可自动签发、过期和校验验证码。
让生产环境中的 SMS 送达可预期。
避免意外的分段费用、网络重试导致的重复短信,以及无声无息的运营商失败。
- 01
在响应中直接查看分段数。
每次被接受的发送都会返回实际使用的字符编码和分段数。上线新模板前,你还可以用分段计算器检查草稿文案。
- 02
轻松处理 GSM-7 和 Unicode。
标准 GSM-7 消息单个分段可容纳 160 个字符;含表情符号或非拉丁文字的短信会自动切换为每段 70 个单位的 Unicode。较长的消息会被干净地拆分,并在客户手机上重新合成一条短信。
- 03
一次调用最多发送 100 条个性化短信。
通过一次批量请求发出一组预约提醒或排班通知。Bird 会预先校验整个批次,让格式错误的输入立即失败,然后分别跟踪每位收件人的运营商送达状态。
- 04
重试超时请求,不会重复发送短信。
让你的工作进程在发送消息时附带幂等键。如果网络超时触发了使用相同键和载荷的重试,Bird 会返回原始响应,而不会再排队一条重复短信。
- 05
及时获知运营商何时送达或拒收短信。
消息从已接受变为已发送、已送达或失败时,你都会收到签名的 webhook。这样你的应用可以更新订单状态,或在号码无法接通时改用其他渠道。
只需几行代码即可从 Twilio 迁移。
将现有的发送方号码、收件人字段和 webhook 处理程序映射到 Bird,无需重构通知服务。在切换真实流量之前,先同步退订列表,并用沙盒号码验证送达。
import twilio from "twilio";
const client = twilio(accountSid, authToken);
await client.messages.create({
from: "+14155550172",
to: "+15005550006",
body: "Your code is 123456.",
});import { BirdClient } from "@messagebird/sdk";
const bird = new BirdClient({ apiKey: process.env.BIRD_API_KEY! });
await bird.sms.send({
from: "+14155550172",
to: "+15005550006",
text: "Your code is 123456.",
category: "authentication",
});在账单膨胀之前发现多分段问题。
客户姓名中只要出现一个弯引号、表情符号或带重音的字符,消息就可能从每段 160 个字符的 GSM-7 编码切换为每段 70 个单位的 Unicode,使一条短信拆分为多个计费分段。Bird 在发送响应中返回字符数、编码和分段总数,帮助你的团队及早发现高成本模板。
const { data, error } = await bird.sms.send({
from: "Bird",
to: "+31612345678",
text: "Your code is 123456.",
category: "authentication",
}).safe();
if (error) throw error;
console.log(data.segments);
// → { characters: 20, count: 1, encoding: "GSM_7BIT" }
一次请求最多发出 100 条个性化提醒。
当定时任务发送次日的预约提醒或配送时段更新时,可在一次 API 调用中批量发送最多 100 条消息,无需逐条循环请求。每位收件人都会收到各自的个性化短信和独立的送达状态;预先校验会在批次入队前拦截格式错误的输入。
const { data: batch, error } = await bird.sms
.sendBatch(
users.map((u) => ({
from: "Bird",
to: u.phone,
text: `Hi ${u.name}, your appointment is tomorrow at ${u.time}.`,
})),
)
.safe();
if (error) throw error;
console.log(`queued ${batch.data.length} messages`);实时跟踪运营商送达并处理失败的短信。
发送调用成功后,运营商交接是异步进行的,因此 Bird 会随消息进展推送签名的 webhook 事件。短信到达手机时更新数据库;送达失败时触发邮件备用方案并标记无效号码。
import { bird } from "@/lib/bird";
export async function POST(req: Request) {
const event = bird.webhooks.unwrap(
await req.text(),
Object.fromEntries(req.headers),
);
switch (event.type) {
case "sms.delivered":
await markDelivered(event.data.sms_id);
break;
case "sms.failed":
await flag(event.data.to, event.data.error?.description);
break;
}
return new Response(null, { status: 204 });
}每个失败事件都包含具体失败原因,便于你区分手机的临时问题和无效号码。STOP 等退订回复会自动屏蔽后续营销发送,而普通的送达失败不会改变收件人的订阅状态。
sms.acceptedBird 已接受你的请求,并将消息排队等待运营商路由。sms.sentBird 已将消息移交给目标移动运营商。sms.delivered目标运营商已确认消息送达收件人手机。sms.failed短信无法送达,并附带错误原因,便于你的应用通知客服或尝试其他渠道。
构建前的问题
我可以选择发送方吗?
重试如何避免重复短信?
已接受是否意味着已投递?
批量发送和群发是一回事吗?
规模扩展
不失控。
在工作区中组织团队,控制 API 访问权限,通过审计日志追踪变更。
组织
Harbor
访问权限仅限于其所在工作区。
生产环境/API 密钥
配送员
活跃Alex Lee
管理员
今天 · UTC
审计日志
组织
Harbor
访问权限仅限于其所在工作区。
生产环境/API 密钥
配送员
活跃Alex Lee
管理员
今天 · UTC
审计日志
组织
Harbor
访问权限仅限于其所在工作区。
生产环境/API 密钥
配送员
活跃Alex Lee
管理员
今天 · UTC
审计日志