UNPKG

@shiyan000613/node-red-contrib-aliyun-sms

Version:

Node-RED node for sending SMS via Aliyun

146 lines (126 loc) 5.86 kB
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" } } }); };