You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Msg91 API与Node.js集成问题:返回成功但未收到验证码短信

Msg91发送OTP返回成功但未收到短信的排查方案

以下是针对你遇到的问题的具体排查和解决步骤:

  • 检查Msg91账户状态

    • 确认账户是否有可用余额,免费试用额度是否已耗尽
    • 登录Msg91后台查看短信发送日志,确认该条短信的实际状态(是已下发、待处理还是被拦截)
    • 检查账户是否因违规内容触发平台风控限制
  • 验证号码格式正确性

    • Msg91部分接口可能不支持带+号的号码格式,尝试将号码格式改为91${phonenumber}(去掉+号,直接用国家码加手机号)再测试
    • 确认目标手机号为有效号码,无停机、欠费情况,且非虚拟号段(部分虚拟号段可能无法接收验证码短信)
  • 核对短信模板配置

    • Msg91要求短信内容必须使用平台审核通过的模板,自定义OTP内容可能无法下发。登录后台确认是否配置了对应的OTP模板,并在调用sendOtp.send()时指定模板ID(部分版本的SDK需要传入模板参数)
    • 若未配置模板,建议使用Msg91自动生成OTP的功能,而非自定义OTP内容,避免因模板不匹配导致短信被拦截
  • 修复异步调用的错误捕获逻辑

    • 当前代码中sendOtp.send()是异步回调,但你直接返回了响应,无法捕获回调过程中可能出现的后台错误。可以将回调转为Promise形式,确保捕获所有发送环节的错误:
      router.post('/mobile', async (req, res) => {
        try {
          const sendOtp = new SendOtp(process.env.AUTHKEY);
          const mobile = await usermodel.findOne({ mobile: req.body.mobile })
          if (!mobile) return res.status(403).send('用户不存在..')
      
          const otp = `${Math.floor(1000 + Math.random() * 9000)}`;
          console.log(otp);
          
          const phonenumber = req.body.mobile;
          const newPhoneNumber = '91' + phonenumber; // 尝试去掉+号
          
          // 转Promise处理异步
          const sendResult = await new Promise((resolve, reject) => {
            sendOtp.send(newPhoneNumber, otp, (error, data) => {
              error ? reject(error) : resolve(data);
            });
          });
      
          console.log(sendResult);
          res.status(201).send({ status: 'TRUE', message: 'OTP已发送' })
        } catch (error) {
          res.status(500).send({ status: 'failed', message: '发送OTP失败', error: error.message })
          console.log(error)
        }
      })
      
  • 排查短信接收端问题

    • 部分运营商存在短信延迟,等待5-10分钟后再检查是否收到
    • 检查手机的短信拦截设置,确认验证码未被安全软件或系统拦截

内容的提问来源于stack exchange,提问作者Sahil Pawar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 19:30:56