集成
00 / 00

短信发送

阿里云 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 加入使用该能力的产品依赖。

常见问题

各短信服务商接入指南

想和其他创造者交流?

这篇文档有问题?