短信发送
阿里云 PNVS 默认短信路径,以及腾讯云和 Twilio 的显式接入方式
短信通常配合频率限制(参见 packages/rate-limit/)一起使用,防止一个手机号短时间内被刷爆。具体认证流程参见 核心模块 > 认证系统。
个人开发者推荐:如果你只需要验证码登录(注册/登录/找回密码),强烈推荐使用 阿里云短信认证服务(PNVS)——个人实名即可开通、免备案免签名审核、5000 条仅 250 元。这是目前国内大厂中对个人开发者最友好的方案。
概览
短信服务用来给用户发手机短信,最常见的是发验证码(登录/注册时用的 6 位数字)。@repo/sms 的默认入口只接入阿里云 PNVS,用于手机号登录验证码。腾讯云和 Twilio provider 保留为显式 subpath,需要时由产品代码主动接入。
- 发送验证码:用户注册/登录时发 6 位数字验证码
- 发送通知:订单状态变更、活动提醒等(需企业资质)
- 默认路径:阿里云 PNVS,适合国内手机号验证码登录
- 扩展路径:腾讯云和 Twilio 需要代码层显式引入 provider 和 SDK
国内短信服务对个人开发者限制很大。腾讯云个人已无法新建签名;阿里云普通短信需要企业资质。只有阿里云「短信认证服务」对个人开发者开放,且仅限验证码场景。如果你的产品只需要验证码登录,直接选 PNVS 即可,不需要折腾企业资质。
短信服务的 Access Key / Secret Key 是敏感信息,必须放在 products/muse/packages/config/.env 或部署平台 Secrets 中。生产环境务必配置频率限制,防止短信轰炸。
默认环境变量
短信是多个产品可复用的基础能力,默认在 packages/config/.env 中配置。模板默认只读取阿里云 PNVS 相关变量;某个产品需要单独短信账号时,再放到 products/<product>/packages/config/.env 覆盖。
| 变量名 | 说明 |
|---|---|
ALIBABA_CLOUD_ACCESS_KEY_ID | 阿里云 AccessKey ID |
ALIBABA_CLOUD_ACCESS_KEY_SECRET | 阿里云 AccessKey Secret |
ALIYUN_SMS_REGION | 阿里云 OpenAPI 地域,默认 cn-hangzhou |
代码示例
发送验证码
import { sendVerificationSMS } from "@repo/sms";
await sendVerificationSMS("+8613800138000", "123456");发送通知
默认阿里云 PNVS provider 只支持验证码。如果要发送通知短信,需要在产品代码中显式接入普通短信 provider。
import { createSMSProvider } from "@repo/sms/factory";
const provider = createSMSProvider({
provider: "twilio",
accountSid: process.env.TWILIO_ACCOUNT_SID!,
authToken: process.env.TWILIO_AUTH_TOKEN!,
fromPhoneNumber: process.env.TWILIO_FROM_PHONE_NUMBER!,
});
await provider.sendTemplateMessage({
phoneNumber: "+14155552671",
templateParams: { order_id: "ORD-001", status: "已发货" },
});工作原理
手机号登录 → @repo/sms 默认入口
↓
阿里云 PNVS provider
↓
手机收到验证码腾讯云和 Twilio 不走默认入口。需要时通过 @repo/sms/providers/tencent、@repo/sms/providers/twilio 或 @repo/sms/factory 显式接入,并把对应 SDK 加入使用该能力的产品依赖。
常见问题
各短信服务商接入指南
想和其他创造者交流?
这篇文档有问题?