Msg91 API与Node.js集成问题:返回成功但未收到验证码短信
Msg91发送OTP返回成功但未收到短信的排查方案
以下是针对你遇到的问题的具体排查和解决步骤:
检查Msg91账户状态
- 确认账户是否有可用余额,免费试用额度是否已耗尽
- 登录Msg91后台查看短信发送日志,确认该条短信的实际状态(是已下发、待处理还是被拦截)
- 检查账户是否因违规内容触发平台风控限制
验证号码格式正确性
- Msg91部分接口可能不支持带
+号的号码格式,尝试将号码格式改为91${phonenumber}(去掉+号,直接用国家码加手机号)再测试 - 确认目标手机号为有效号码,无停机、欠费情况,且非虚拟号段(部分虚拟号段可能无法接收验证码短信)
- Msg91部分接口可能不支持带
核对短信模板配置
- Msg91要求短信内容必须使用平台审核通过的模板,自定义OTP内容可能无法下发。登录后台确认是否配置了对应的OTP模板,并在调用
sendOtp.send()时指定模板ID(部分版本的SDK需要传入模板参数) - 若未配置模板,建议使用Msg91自动生成OTP的功能,而非自定义OTP内容,避免因模板不匹配导致短信被拦截
- 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
相关产品推荐
相关产品推荐

