参考哔哩哔哩SimbaJS的视频做了一个短信获取的后台,还望各路大神多多指教呀~
主要有以下几个思路:
- 提供腾讯云短信接口需要的数据
- 需要将相关的参数排序转换为需要的字符串,再用Base64进行编码,得到签名串
- 将所有的参数存入request
首先node.js安装需要的包
//下载crypto npm i crypto-js,用于生成签名串
//下载require npm install request --save
let CryptoJS = require('crypto-js')
let request = require('request')
根据文档,我们要发国内的短信,需要参数Action, Nonce, PhoneNumberSet.0, SecretId,SmsSdkAppid, TemplateID, Timestamp, Version, Signature, 前面的参数都可以找到,Signature需要看文档进行转换。如果不确定需要哪些参数的话,可以通过如下代码调试:
request({
url: 'https://sms.tencentcloudapi.com',
qs:{
Action: 'SendSms',
Version: '2019-07-11',
}
}, function (error, response, body) {
console.log(body)
})
将获得Signature需要的参数排序拼接,通过Object.keys()获得对象的属性数组,对数组进行排序,用数组的forEach方法拼接字符串
//拼接请求字符串,将排序好的请求参数格式化成“参数名称=参数值”的形式,然后将格式化后的各个参数用"&"拼接在一起
let qs = {
Action: 'SendSms',
Version: '2019-07-11',
'PhoneNumberSet.0': '+86'+'电话号码',
TemplateID: '476688',
Sign: "某某有限公司",
SmsSdkAppid: '2515153542',
Timestamp: Math.floor(+new Date / 1000),
"TemplateParamSet.0": Math.round(Math.random() * 9999) + 1000,
Nonce: Math.round(Math.random() * 100000),
SecretId: 'ABCDEFGHIJKLMNOPQ',
}
//如下步骤是为了获得Signature
let str = []
Object.keys(qs).sort().forEach(item => {
str.push(item + '=' + qs[item])
})
str = str.join('&')
//或者:
let str=Object.keys(qs).sort().map(key=>[key,qs[key]].join('=')).join('&')
Signature的获取需要通过其他参数获得:
let SMS_API = 'sms.tencentcloudapi.com'
str = ['GET', SMS_API, "/?", str].join('')
/**生成签名串,使用 HMAC-SHA1算法对上一步中获得的签名原文字符串进行签名,然后将生成的签名串使用 Base64 进行编码**/
let SecretKey = '4tSnunWu89wUlqhJ'
var sign = CryptoJS.HmacSHA1(str, SecretKey)
sign = CryptoJS.enc.Base64.stringify(sign)
//qs对象中添加Signature
qs.Signature = sign
node.js中发短信需要用request对客户端进行请求,request的第一个参数是一个对象,第二个参数是函数:
request({
url: 'https://' + SMS_API,
qs
}, function (error, response, body) {
console.log(body)
res.json('success')
})
腾讯云发送短信相关接口为SendSms,如下是全部代码:
let CryptoJS = require('crypto-js')
let request = require('request')
app.get('/sendSMS', (req, res) => {
//拼接请求字符串,将排序好的请求参数格式化成“参数名称=参数值”的形式,然后将格式化后的各个参数用"&"拼接在一起
let SMS_API = 'sms.tencentcloudapi.com'
let qs = {
Action: 'SendSms',
Version: '2019-07-11',
'PhoneNumberSet.0': '+86'+'电话号码',
TemplateID: '476688',
Sign: "某某有限公司",
SmsSdkAppid: '2515153542',
Timestamp: Math.floor(+new Date / 1000),
"TemplateParamSet.0": Math.round(Math.random() * 9999) + 1000,
Nonce: Math.round(Math.random() * 100000),
SecretId: 'ABCDEFGHIJKLMNOPQ',
}
//如下步骤是为了获得Signature
let array = Object.keys(qs).sort()
let str = []
array.forEach(item => {
str.push(item + '=' + qs[item])
})
str = str.join('&')
str = ['GET', SMS_API, "/?", str].join('')
/*生成签名串,使用 HMAC-SHA1 算法对上一步中获得的签名原文字符串进行签名,然后将生成的签名串使用 Base64 进行编码*/
let SecretKey = '4tSnunWu89wUlqhJ'
var sign = CryptoJS.HmacSHA1(str, SecretKey)
sign = CryptoJS.enc.Base64.stringify(sign)
//qs对象中添加Signature
qs.Signature = sign
request({
url: 'https://' + SMS_API,
qs
}, function (error, response, body) {
console.log(body)
res.json('success')
})
})