準(zhǔn)備工作:
- 騰訊云API密鑰(SecretId和SecretKey)
獲取方法:登錄騰訊云--->鼠標(biāo)移到右上角頭像--->選擇訪問管理-->訪問密鑰-->API密鑰管理-->新建密鑰
- 短信應(yīng)用SDK AppID
獲取方法:控制臺->短信->應(yīng)用管理->應(yīng)用列表->新建應(yīng)用->SDK AppID
實例
- 云函數(shù)內(nèi)使用示例
const { mainCodeV3 } = require('公共模塊的V3鑒權(quán)封裝名稱')
exports.main = async (event, context) => {
const url = "https://sms.tencentcloudapi.com/" // 騰訊云短信服務(wù)的api地址
// 需要的發(fā)送請求參數(shù)
let phoneNum = "+86" + {手機(jī)號碼}
let payload = {
"PhoneNumberSet": [phoneNum], // phoneNum: 手機(jī)號 (String) 格式為 `+86${phoneNum}`
"SmsSdkAppId": "********", // SDK AppID
"SignName": "******", // 短信簽名內(nèi)容(不是簽名ID) 可在短信控制臺-簽名管理查看授药,沒有的話創(chuàng)建一個黎棠,需要審核,一般在1天內(nèi)就審核完成了
"TemplateParamSet": [String], // 類似正文模板內(nèi)的{1}自定義內(nèi)容: 驗證碼為:{1}乖篷,您正在登錄鹤啡,若非本 人操作,請勿泄露。
"TemplateId":"" // 正文模板的ID 可在短信控制臺正文模板管理內(nèi)查詢
}
// 使用我們封裝的鑒權(quán)方法宵荒,將需要的參數(shù)傳入
/**
return Object
Authorization: 鑒權(quán)內(nèi)容
time: 時間戳
*/
let info = await mainCodeV3(payload)
// 調(diào)用云開發(fā)的請求方法
const sendres = await uniCloud.httpclient.request(url,
{
headers: {
"Content-Type": "application/json",
"Authorization": info.Authorization, // 鑒權(quán)獲得的內(nèi)容
"Host": "sms.tencentcloudapi.com",
"X-TC-Action": "SendSms",
"X-TC-Version": "2021-01-11",
"X-TC-Timestamp": Number(info.time), // 封裝函數(shù)獲得的時間戳,一定要是Number類型
"X-TC-Region": "ap-guangzhou"
},
data: payload, // 未鑒權(quán)的參數(shù)
method: 'POST',
dataType:"json",
})
console.log('請求后的返回內(nèi)容->',sendres); // 自行在里面提取參數(shù)判斷是否發(fā)送成功
}
- V3鑒權(quán)js封裝(在uniCloud云開發(fā)環(huán)境-common目錄->新建公共函數(shù)-放入該內(nèi)容)
const crypto = require('crypto'); // 云開發(fā)環(huán)境默認(rèn)有這個加解密庫,直接導(dǎo)入使用即可净嘀,無需安裝
// service :默認(rèn)為sms短信服務(wù) 可根據(jù)騰訊云文檔改成其他服務(wù)(通用鑒權(quán))
// payload: 需傳入該服務(wù)需要的參數(shù)
async function mainCodeV3(payload,service = 'sms'){
var SecretId = "*************"; // // SecretId, 需要替換為自己的
var SecretKey = "***********"; // SecretKey, 需要替換為自己的
// 1. 拼接規(guī)范請求串 CanonicalRequest
var HTTPRequestMethod = 'POST'; // HTTP 請求方法(GET报咳、POST )。此示例取值為 POST
var CanonicalURI = '/'; // URI 參數(shù)挖藏,API 3.0 固定為正斜杠(/)
var CanonicalQueryString = ""; // POST請求時為空 // 內(nèi)
var CanonicalHeaders = "content-type:application/json\nhost:" + service + ".tencentcloudapi.com\n"; // sms.tencentcloudapi.com需要修改前綴短信為:sms
var SignedHeaders = "content-type;host";
// 傳入需要做 HTTP 請求的正文 body
var HashedRequestPayload = crypto.createHash('sha256').update(JSON.stringify(payload)).digest('hex');
// 拼接
var CanonicalRequest = HTTPRequestMethod + '\n' +
CanonicalURI + '\n' +
CanonicalQueryString + '\n' +
CanonicalHeaders + '\n' +
SignedHeaders + '\n' +
HashedRequestPayload;
// 2. 拼接待簽名字符串
var Algorithm = "TC3-HMAC-SHA256"; // 簽名算法暑刃,目前固定為 TC3-HMAC-SHA256
var RequestTimestamp = Math.round(new Date().getTime()/1000) + ""; // 請求時間戳,即請求頭部的公共參數(shù) X-TC-Timestamp 取值熬苍,取當(dāng)前時間 UNIX 時間戳稍走,精確到秒
var t = new Date();
var date = t.toISOString().substr(0, 10); // 計算 Date 日期 date = "2021-10-07"
/**
* Date 必須從時間戳 X-TC-Timestamp 計算得到,且時區(qū)為 UTC+0柴底。
* 如果加入系統(tǒng)本地時區(qū)信息婿脸,例如東八區(qū),將導(dǎo)致白天和晚上調(diào)用成功柄驻,但是凌晨時調(diào)用必定失敗狐树。
* 假設(shè)時間戳為 1551113065,在東八區(qū)的時間是 2019-02-26 00:44:25鸿脓,但是計算得到的 Date 取 UTC+0 的日期應(yīng)為 2019-02-25抑钟,而不是 2019-02-26。
* Timestamp 必須是當(dāng)前系統(tǒng)時間野哭,且需確保系統(tǒng)時間和標(biāo)準(zhǔn)時間是同步的在塔,如果相差超過五分鐘則必定失敗。
* 如果長時間不和標(biāo)準(zhǔn)時間同步拨黔,可能導(dǎo)致運行一段時間后蛔溃,請求必定失敗,返回簽名過期錯誤。
*/
var CredentialScope = date + "/"+ service +"/tc3_request"; // sms為騰訊云短信服務(wù)-其他服務(wù)根據(jù)文檔修改
/**
* 拼接 CredentialScope 憑證范圍贺待,格式為 Date/service/tc3_request 徽曲,
* service 為服務(wù)名,慧眼用 faceid 麸塞, OCR 文字識別用 ocr
*/
// 將第一步拼接得到的 CanonicalRequest 再次進(jìn)行哈希加密
var HashedCanonicalRequest = crypto.createHash('sha256').update(CanonicalRequest).digest('hex');
// 拼接
var StringToSign = Algorithm + '\n' +
RequestTimestamp + '\n' +
CredentialScope + '\n' +
HashedCanonicalRequest;
// 3. 計算簽名
var SecretDate = crypto.createHmac('sha256', "TC3"+SecretKey).update(date).digest();
var SecretService = crypto.createHmac('sha256', SecretDate).update(service).digest(); // 注意修改sms
var SecretSigning = crypto.createHmac('sha256', SecretService).update("tc3_request").digest();
var Signature = crypto.createHmac('sha256', SecretSigning).update(StringToSign).digest('hex');
// 4. 拼接Authorization
var Algorithm = "TC3-HMAC-SHA256";
var Authorization =
Algorithm + ' ' +
'Credential=' + SecretId + '/' + CredentialScope + ', ' +
'SignedHeaders=' + SignedHeaders + ', ' +
'Signature=' + Signature
return {
Authorization,
time: RequestTimestamp
}
}
// 導(dǎo)出方法
/**
* Authorization 鑒權(quán)
* time: 當(dāng)前時間戳
*/
module.exports = {
mainCodeV3
}