前言
在JavaScript代码中利用阿里云的短信服务发送短信验证码
环境:Nodejs 阿里云Linux服务器
代码:JavaScript
一、环境准备
使用阿里云的短信服务,需要准备阿里云账号、开通云服务器、购买短信服务、创建RAM用户、RAM角色等。前期准备可以参考
【账号系统之(手机验证码登录)】使用阿里云短信服务,实现服务商给手机发送验证码功能
二、使用步骤
1.发送验证码的SDK
首先看阿里云网站上的验证码SDK,里面有详细的参数文档,在线调用SDK,自动生成SDK示例等,内容还是很详细的,在使用SDK前很有必要好好读一下。
发送短信验证码SDK
1.1在线调用
我们首先在线调用这个发送短信的接口,如果能够成功接收到短信,说明我们购买的短信相关的服务已经可用,签名模板也已经通过审核,那么可以进行下一步了。
1.2生成代码示例
之前进行线上调用后,也会根据参数生成代码示例。选择SDK示例,提供的SDK示例中有多种语言可以选择,但是是没有js代码的,我们要在js代码中使用的话,这里选择相近的TypeScript的示例。
我们选择下载完整工程,下载代码。
nodejs中不能直接使用TypeScript代码,需要先将TypeScript文件进行编译,得到编译后的js代码后再执行的。
1.3导入到工程
首先在服务器上安装SDK
npm install @alicloud/dypnsapi20170525@1.2.1
下载的示例代码解压后有如下的文件,我们将其放到工程代码中,可以放在根目录下。
nodejs中是需要先将ts文件进行编译,得到编译后的js代码后再执行的。
按照README.md文件中的内容进行编译,执行。如果能够收到短信,则说明编译出的js代码可以正常使用。
npm install --registry=https://registry.npm.taobao.org && tsc && node ./dist/client.js
1.4 JavaScript代码调用
在前面编译出了client.js,并且可以正常运行并发出短信,那么我们可以参考client.js中的代码来编写JavaScript中的逻辑。
const Util = require('@alicloud/tea-util');
const client = require('../dist/client');
const Dypnsapi20170525 = require('@alicloud/dypnsapi20170525');
......
router.post('/sendCode', async (req, res) => {
console.log('Request Body:', req.body);
const { phoneNumber } = req.body;
console.log('phoneNumber is:', phoneNumber);
try {
// 使用 createClient 方法创建客户端
const aliyunClient = client.default.createClient(
process.env['ALIBABA_CLOUD_ACCESS_KEY_ID'],
process.env['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
);
let sendSmsVerifyCodeRequest = new Dypnsapi20170525.SendSmsVerifyCodeRequest({
phoneNumber: phoneNumber,
codeLength: 6,
signName: "XXXXXX",
templateCode: "SMS_464175242",
templateParam: "{\"code\":\"##code##\"}",
});
// 这里调用发送验证码的方法
let runtime = new Util.RuntimeOptions({});
const resp = await aliyunClient.sendSmsVerifyCodeWithOptions(sendSmsVerifyCodeRequest, runtime);
// 处理 resp
console.log(resp);
res.send('Code sent successfully! Check your phone.');
} catch (error) {
console.error('Error sending SMS:', error);
res.status(500).send('Failed to send SMS.');
}
});
这里使用了环境变量中的 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
设置环境变量的方式可以参考
在环境变量中配置身份验证AccessKey
另外SDK示例的注释中提到
工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。代码示例使用环境变量获取 AccessKey 的方式进行调用,仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378664.html
这里我们不搞那么复杂,先run起来,所以就直接从环境变量中获得AccessKey ID和AccessKey SECRET,后面有精力再替换STS。