购买阿里云短信服务
新用户可免费领取100条试用,3个月内有效
申请签名
申请短信模板
获取密钥
获取 AccessKey ID 和 AccessKey Serect
系统设置
发送短信
绑定测试手机号码,调用测试签名模板API
Alibaba Cloud Dysmsapi SDK for NodeJS
安装依赖包 dysmsapi
% npm install --save @alicloud/dysmsapi20170525@2.0.24
added 21 packages, and audited 243 packages in 12s
15 packages are looking for funding
run `npm fund` for details
11 vulnerabilities (2 low, 4 moderate, 5 high)
To address issues that do not require attention, run:
npm audit fix
To address all issues (including breaking changes), run:
npm audit fix --force
Run `npm audit` for details.
建立一个 nodesms.js文件
import Dysmsapi20170525, { SendSmsRequest } from '@alicloud/dysmsapi20170525';// 导入 Dysmsapi
import { Config } from '@alicloud/openapi-client'// 导入 Dysmsapi Config
import { ALIBABA_CLOUD_ACCESS_KEY_ID, ALIBABA_CLOUD_ACCESS_KEY_SECRET } from '../utils/config.js'// AK & SK
import common from '../utils/common.js'// 生成随机六位数
// 使用AK&SK初始化账号Client
const config = new Config({
accessKeyId: ALIBABA_CLOUD_ACCESS_KEY_ID, // AccessKey ID
accessKeySecret: ALIBABA_CLOUD_ACCESS_KEY_SECRET, // AccessKey Secret
})
// Endpoint 请参考 https://api.aliyun.com/product/Dysmsapi
config.endpoint = `dysmsapi.aliyuncs.com`// Endpoint 规则为:[product_code].[regionid].aliyuncs.com
// 特化请求客户端
const dysmsapiClient = new Dysmsapi20170525.default(config)
//发送短信
export default (phoneNumber) => {
const code = common.randomNum(6) //生成随机验证码
//创建对应 API 的 Request
const request = new SendSmsRequest({
phoneNumbers: phoneNumber,// 接收短信的手机号码
signName: '****',// 短信签名名称
templateCode: '****',//短信模板Code
// 短信模板变量对应的实际值
templateParam: `{"code":"${code}"}`,
})
return new Promise((resolve, reject) => {
// 通过 client 对象获得对应 request 响应 response 。
dysmsapiClient.sendSms(request).then((res)=>{
// {"bizId":"200503802978235232^0","code":"OK","message":"OK","requestId":"A3FCA6A0-8410-54B8-ABFA-35D17A27E212"}
console.log('SendSms - ' + JSON.stringify(res.body))
if(res.body.code === 'OK'){
resolve ({state:0, message: "验证码发送成功", code})// state: 0, message: "查询成功", data: result
}else {
resolve ({state:100, message: "验证码发送失败,请稍后重试", data: res.body.message})
}
}).catch((error) => {
console.log('SendSms - ' + error)// Error: MissingPhoneNumbers: code: 400, PhoneNumbers is mandatory for this action. request id: 89385666-E287-5E59-84DB-B8781FF778A5
resolve ({state:100, message: "验证码发送失败,请稍后重试", data: error.message})
})
})
}
发送验证码的接口
// 发送验证码的接口
router.post('/phone', (req, res) => {
// 定义校验规则 手机号
const phoneSchema = Joi.object({
phone: Joi.string()
.pattern(/^1[3-9]\d{9}$/)
.messages({'string.pattern.base': `请输入正确的手机号`}).required(), // 手机号
})
// 校验
const { error } = phoneSchema.validate(req.body)// , value phone //刚刚从前台传过来的手机号
// console.log(error)
// 如果验证通过,就只会返回value属性,如果验证错误,就还有一个error对象,其中error对象的message描述了失败原因:
if(error){
return res.output(error)
}
//去数据库中找有没有同名的手机号,
db.query('select * from AdminUser where phone=?', req.body.phone, (err, results) => {
// 执行失败
if (err) return res.output(err)
// 执行成功,但手机号已经注册
if(results && results.length > 0) return res.output('该手机号已经注册')
// 发送验证码
nodesms(req.body.phone).then(result => {
// console.log('res - ' + result.state + ' -- ' + result.code)
if(result.state === 0){
codeInfo[req.body.phone] = { time: new Date().getTime(), code: result.code }
res.output('发送成功', 0)
}else{
res.output(result.data)
}
})
})
})