
# NodeJs
![](https://support.huaweicloud.com/devg-iotcom/public_sys-resources/note_3.0-zh-cn.png)
- 本文档所述Demo在提供服务的过程中，可能会涉及个人数据的使用，建议您遵从国家的相关法律采取足够的措施，以确保用户的个人数据受到充分的保护。
- 本文档所述Demo仅用于功能演示，不允许客户直接进行商业使用。
- 本文档信息仅供参考，不构成任何要约或承诺。
 
#### 发送短信
```
/*jshint esversion: 6 */
var https = require('https'); //引入https模块
var url = require('url'); //引入url模块
var querystring = require('querystring'); // 引入querystring模块
//必填,请参考"开发准备"获取如下数据,替换为实际值
var realUrl = 'https://ip:port/common/sms/sendTemplateMessage'; //APP接入地址+接口访问URI
var msisdn = [ '8612345678911' ];
var smsTemplateId = 'SMS_21060200001'; //模板ID
var templateParas = {'code': 'hello'}; //模板变量，此处以单变量验证码短信为例，请客户自行生成6位验证码，并定义为字符串类型，以杜绝首位0丢失的问题（例如：002569变成了2569）。当发送短信使用的是无变量的模板时，请删除本行代码。
var account = 'account';
var password1 = 'password1';
var signature = '【huawei】';  // 签名名称
// 选填,短信状态报告接收地址,推荐使用域名,为空或者不填表示不接收状态报告
var statusCallBack = 'https://ip:port/common/sms/notifyReportMessage';
/**
 * 构造请求Body体
 * 当发送短信使用的是无变量模板时，不需要添加templateParas参数。
 * @returns
 */
function buildRequestBody() {
    var mtSmsMessage = {
        'mobiles': msisdn,
        'templateId': smsTemplateId,
        'templateParas': templateParas,
        'signature': signature
    };
    var requestLists = [ mtSmsMessage ];
    var requestbody = {
        'account': account,
        'password': password1,
        'requestLists': requestLists,
        'statusCallback': statusCallBack
    };
    return JSON.stringify(requestbody);
}
var urlobj = url.parse(realUrl); //解析realUrl字符串并返回一个 URL对象
var options = {
    host: urlobj.hostname, //主机名
    port: urlobj.port, //端口
    path: urlobj.pathname, //URI
    method: 'POST', //请求方法为POST
    headers: { //请求Headers
        'Content-Type': 'application/json;charset=UTF-8'
    },
    rejectUnauthorized: false //为防止因HTTPS证书认证失败造成API调用失败,需要先忽略证书信任问题
};
// 请求Body,不携带签名名称时,signature请填null
var body = buildRequestBody();
var req = https.request(options, (res) => {
    console.log('statusCode:', res.statusCode); //打印响应码
    res.setEncoding('utf8'); //设置响应数据编码格式
    res.on('data', (d) => {
        console.log('resp:', d); //打印响应数据
    });
} );
req.on('error', (e) => {
    console.error('错误：' + e.message); //请求错误时,打印错误信息
} );
req.write(body, "utf-8"); //发送请求Body数据
req.end(); // 结束请求
```
#### 上行短信接收
```
/*jshint esversion: 6 */
// 上行短信通知样例(urlencode)
var updata = "mobile=%2B12345678911&content=***&sendTime=20220127020758&extCode=";
/**
 * 解析上行短信通知数据
 * 
 * @param data 短信平台推送的上行短信通知数据
 * @returns
 */
function onSmsUpData(data) {
    var querystring = require('querystring');
    var keyValues = querystring.parse(data); // 解析上行短信通知数据
    /**
     * Example: 此处以解析content为例,请按需解析所需参数并自行实现相关处理
     * 
     * 'mobile': 上行短信手机号
     * 'content': 短信内容
     * 'sendTime': 上行短信时间
     * 'extCode': 扩展码
     */
    var content = keyValues.content; // 上行短信发送的内容
    console.log('Sms up data. Content: ', content);
}
onSmsUpData(updata);
```
#### 状态报告接收
```
/*jshint esversion: 6 */
// 短信平台上报状态报告数据样例(urlencode)
//var success_body = "requestId=20220126&mobile=12345678911&messageId=2022012619403400&status=DELIVRD&resultCode=000000&resultDesc=success&smsCount=null&receiveTime=null";
var failed_body = "requestId=20220126&mobile=12345678911&messageId=2022012619403400&status=E200027&resultCode=1020001&resultDesc=Parameter error&smsCount=null&receiveTime=null";
/**
 * 解析状态报告数据
 * 
 * @param data 短信平台上报的状态报告数据
 * @returns
 */
function onSmsStatusReport(data) {
    var querystring = require('querystring');
    var keyValues = querystring.parse(data); // 解析状态报告数据
    /**
     * Example: 此处以解析status为例,请按需解析所需参数并自行实现相关处理
     * 
     * 'messageId': 短信唯一标识
     * 'smsCount': 长短信拆分条数
     * 'receiveTime': 资源更新时间
     * 'status': 状态码
     */
    var status = keyValues.status; // 状态报告枚举值
    // 通过status判断短信是否发送成功
    if ('DELIVRD' === status.toUpperCase()) {
        console.log('Send sms success. messageId: ', keyValues.messageId);
    } else {
        // 发送失败,打印status
        console.log('Send sms failed. messageId: ', keyValues.messageId);
        console.log('Failed status: ', status);
    }
}
// onSmsStatusReport(success_body);
onSmsStatusReport(failed_body);
```
