UNPKG

node-easysms

Version:

EasySMS is an SMS sender for Node.js

88 lines (87 loc) 4.39 kB
'use strict'; 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';