@shiyan000613/node-red-contrib-aliyun-sms
Version:
Node-RED node for sending SMS via Aliyun
146 lines (126 loc) • 5.86 kB
JavaScript
const AliyunCore = require('@alicloud/pop-core');
const util = require('util'); // 添加这行引用
module.exports = function(RED) {
function AliyunSMSNode(config) {
RED.nodes.createNode(this, config);
const node = this;
// 从凭证中获取敏感信息
node.accessKeyId = config.accessKeyId;
node.accessKeySecret = this.credentials.accessKeySecret;
node.signName = config.signName;
node.templateCode = config.templateCode;
node.defaultPhone = config.defaultPhone;
// 固定值设置
const FIXED_REGION_ID = 'cn-hangzhou';
const FIXED_ENDPOINT = 'https://dysmsapi.aliyuncs.com';
const FIXED_API_VERSION = '2017-05-25';
// 初始化客户端
node.client = new AliyunCore({
accessKeyId: node.accessKeyId,
accessKeySecret: node.accessKeySecret,
endpoint: FIXED_ENDPOINT,
apiVersion: FIXED_API_VERSION
});
node.on('input', function(msg) {
try {
// 重要调试:打印完整的msg对象结构
node.debug('Complete msg structure:', util.inspect(msg, {depth: null}));
// 关键修复:正确处理Node-RED消息结构
const messageData = msg.payload ? msg.payload : msg;
// 获取手机号码(支持多种位置和字段名)
const phoneNumbers = messageData.phoneNumbers ||
messageData.phone ||
msg.phoneNumbers ||
msg.phone ||
node.defaultPhone;
// 调试:验证手机号获取
node.debug('Phone number resolution:', {
fromPayload: messageData.phoneNumbers,
fromMsg: msg.phoneNumbers,
final: phoneNumbers
});
if (!phoneNumbers) {
throw new Error('手机号码缺失:请提供以下任意一种格式的数据:\n' +
'1. { "phoneNumbers": "号码", ... }\n' +
'2. { "payload": { "phoneNumbers": "号码", ... } }');
}
// 获取签名和模板代码
const signName = msg.signName || node.signName;
const templateCode = msg.templateCode || node.templateCode;
// 获取模板参数(支持多种嵌套方式)
let templateParam = messageData.params ||
messageData.templateParam ||
messageData.payload ||
messageData;
// 如果参数直接包含phoneNumbers等字段,需要过滤掉
if (templateParam.phoneNumbers || templateParam.phone) {
templateParam = Object.assign({}, templateParam);
delete templateParam.phoneNumbers;
delete templateParam.phone;
}
// 调试:验证参数获取
node.debug('Template parameters:', {
original: messageData,
extracted: templateParam
});
// 验证必要参数
if (!signName) {
throw new Error('短信签名缺失');
}
if (!templateCode) {
throw new Error('短信模板代码缺失');
}
// 准备请求参数
const requestParams = {
PhoneNumbers: String(phoneNumbers),
SignName: signName,
TemplateCode: templateCode,
TemplateParam: JSON.stringify(templateParam)
};
node.debug('Final request:', requestParams);
// 发送短信
node.client.request('SendSms', requestParams, {
method: 'POST',
region: FIXED_REGION_ID
})
.then(response => {
msg.payload = {
success: true,
requestId: response.RequestId,
code: response.Code,
message: response.Message,
bizId: response.BizId
};
node.send(msg);
})
.catch(error => {
const errorMsg = {
code: error.code,
message: error.message,
requestId: error.requestId,
stack: error.stack
};
msg.payload = {
success: false,
error: errorMsg
};
node.error('阿里云短信API错误', errorMsg);
node.send(msg);
});
} catch (error) {
node.error('处理消息时出错: ' + error.message, msg);
msg.payload = {
success: false,
error: error.message
};
node.send(msg);
}
});
}
RED.nodes.registerType("aliyun-sms", AliyunSMSNode, {
credentials: {
accessKeyId: { type: "text" },
accessKeySecret: { type: "password" }
}
});
};