node-easysms
Version:
EasySMS is an SMS sender for Node.js
88 lines (87 loc) • 4.39 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.BaiduGateway = void 0;
const GatewayErrorException_1 = require("../Core/Exceptions/GatewayErrorException");
const Gateway_1 = require("../Core/Gateway");
const Utils_1 = require("../Core/Support/Utils");
/**
* 百度云短信服务
* @see https://cloud.baidu.com/doc/SMS/s/lkijy5wvf
*/
class BaiduGateway extends Gateway_1.Gateway {
send(to, message) {
return __awaiter(this, void 0, void 0, function* () {
var _a, _b;
let data = yield message.getData(this);
let signName = (_b = (_a = (yield message.getSignName(this))) !== null && _a !== void 0 ? _a : this.config['sign_name']) !== null && _b !== void 0 ? _b : '';
let mobile = to.getNumber();
let params = {
signatureId: signName,
mobile,
template: yield message.getTemplate(this),
contentVar: data,
};
if (params['contentVar']['custom']) {
params['custom'] = params['contentVar']['custom'];
delete params['contentVar']['custom'];
}
if (params['contentVar']['userExtId']) {
params['userExtId'] = params['contentVar']['userExtId'];
delete params['contentVar']['userExtId'];
}
let time = (0, Utils_1.timestampUTC)('YYYY-MM-DD\THH:mm:ss\Z');
let headers = {
host: this.getDomain(),
'x-bce-date': time,
};
headers['Authorization'] = this.generateSign(headers, time);
let result = yield this.postJson(this.getEndpointUrl(), params, headers);
if (result['code'] !== '1000') {
throw new GatewayErrorException_1.GatewayErrorException(result['message'], result);
}
return result;
});
}
getDomain() {
var _a;
return (_a = this.config['domain']) !== null && _a !== void 0 ? _a : BaiduGateway.ENDPOINT_HOST;
}
getEndpointUrl() {
return `http://${this.getDomain()}${BaiduGateway.ENDPOINT_METHOD}`;
}
generateSign(headers, time) {
let authString = `${BaiduGateway.ENDPOINT_VERSION}/${this.config['ak']}/${time}/1800`;
let signingKey = (0, Utils_1.createHmac)(authString, this.config['sk'], 'sha256');
// 生成标准化 URI
// 根据 RFC 3986,除了:1.大小写英文字符 2.阿拉伯数字 3.点'.'、波浪线'~'、减号'-'以及下划线'_' 以外都要编码
let canonicalURI = encodeURIComponent(BaiduGateway.ENDPOINT_METHOD).replace(/%2F/g, '/');
let canonicalQueryString = '';
let signedHeaders = (0, Utils_1.trim)(Object.keys(headers).join(';')).toLowerCase();
let canonicalHeader = this.getCanonicalHeaders(headers);
let canonicalRequest = `POST\n${canonicalURI}\n${canonicalQueryString}\n${canonicalHeader}`;
let signature = (0, Utils_1.createHmac)(canonicalRequest, signingKey, 'sha256');
return `${authString}/${signedHeaders}/${signature}`;
}
getCanonicalHeaders(headers) {
let headerStrings = [];
for (let key in headers) {
headerStrings.push(encodeURIComponent((0, Utils_1.trim)(key).toLowerCase()) + ':' + encodeURIComponent((0, Utils_1.trim)(headers[key])));
}
headerStrings.sort();
return headerStrings.join('\n');
}
}
exports.BaiduGateway = BaiduGateway;
BaiduGateway.ENDPOINT_HOST = 'smsv3.bj.baidubce.com';
BaiduGateway.ENDPOINT_METHOD = '/api/v3/sendSms';
BaiduGateway.ENDPOINT_VERSION = 'bce-auth-v1';
BaiduGateway.ENDPOINT_FORMAT = 'json';