1、创建阿里云控制台短信模块 短信模板、签名等基础配置信息,在这里不一一讲叙
2、对接接口时阿里云共分为两部分参数,一部分是公共参数,一部分是具体接口参数,其中公共参数为所有阿里云短信API接口共用的。这些参数中,比较复杂的是signature(签名)参数的生成。具体算法见阿里云短信功能文档,这里不做讲叙。
3、我们在这里直接使用阿里云提供的SDK进行签名生成,生成的签名不会出现错误。然后通过SDK中自带的sendSms方法进行请求操作。
4、首先添加依赖
$ npm install @alicloud/sms-sdk --save
5、新建文件 app/service/sendSms/aliSms.js;;以下代码如需直接使用,请看代码中注释里有 标注 的地方,将这部分代码该为自己的,不可直接套用。
'use strict';
const BaseService = require('../core/base');
const SMSClient = require('@alicloud/sms-sdk');
const config = {
AccessKeyId: '',
AccessKeySecret: '',
};
const sign = {
REG_CODE: {
SignName: '',
TemplateCode: '',
},
};
class AliSmsService extends BaseService {
async sendCode(phone, code) {
const { ctx } = this;
const signCode = sign[code];
const codeRandom = ctx.helper.randomInt(100000, 999999);
const templateParam = JSON.stringify({ code: codeRandom.toString() });
const accessKeyId = config.AccessKeyId;
const secretAccessKey = config.AccessKeySecret;
const smsClient = new SMSClient({ accessKeyId, secretAccessKey });
const params = {
PhoneNumbers: phone,
SignName: signCode.SignName,
TemplateCode: signCode.TemplateCode,
TemplateParam: templateParam,
};
try {
const rs = await this.sendSms(smsClient, params);
if (rs.Code === 'OK') {
return { code: codeRandom, sta: 1 };
}
return { msg: '操作失败', sta: -1 };
} catch (err) {
if (err.data.Code === 'isv.BUSINESS_LIMIT_CONTROL') {
return { msg: err.data.Message.match(/(\S*)Permits/)[1], sta: 0 };
}
return { msg: '操作失败', sta: -1 };
}
}
async sendSms(smsClient, params) {
return new Promise((resolve, reject) => {
smsClient.sendSMS(params).then(result => {
resolve(result);
}, ex => {
reject(ex);
});
});
}
}
module.exports = AliSmsService;