JS调用腾讯云 OCR TC3-HMAC-SHA256

JS调用腾讯云 OCR

分享一下,之前在项目里调用ocr的经验,

第一步
npm install sha256
npm install crypto-js

第二步
import HmacSHA256 from ‘crypto-js/hmac-sha256’;
import Hex from ‘crypto-js/enc-hex’;
import sha256 from ‘crypto-js/sha256’;
import util from ‘./util.js’

const service = “ocr”;
const host = “ocr.tencentcloudapi.com”;
const region = “ap-guangzhou”;
const action = “IDCardOCR”;
const version = “2018-11-19”;
const algorithm = “TC3-HMAC-SHA256”;
const HTTPRequestMethod = ‘POST’;

const tencentcloudOcrUrl = “https://ocr.tencentcloudapi.com”;

function productAuthorization(jsonData,timeStamp) {
// 第一步
// HTTP 请求方法(GET、POST )本示例中为 GET;
// let curTimeStamp = timeStamp * 1000;
let date = new Date().toISOString().substr(0,10);
console.log("timeStamp = “+timeStamp +” date : "+date);
// URI 参数,API 3.0 固定为正斜杠(/)
let CanonicalURI = ‘/’;
// CanonicalQueryString:发起 HTTP 请求 URL 中的查询字符串,对于 POST 请求,固定为空字符串,对于 GET 请求,则为 URL 中问号(?)后面的字符串内容,本示例取值为:Limit=10&Offset=0。注意:CanonicalQueryString 需要经过 URL 编码。
let CanonicalQueryString = ‘’;
// 参与签名的头部信息,至少包含 host 和 content-type 两个头部,也可加入自定义的头部参与签名以提高自身请求的唯一性和安全性。拼接规则:1)头部 key 和 value 统一转成小写,并去掉首尾空格,按照 key:value\n 格式拼接;2)多个头部,按照头部 key(小写)的字典排序进行拼接。此例中为:content-type:application/x-www-form-urlencoded\nhost:cvm.tencentcloudapi.com\n
let CanonicalHeaders = “content-type:application/json\n” + “host:” + host + “\n”;
// 参与签名的头部信息,说明此次请求有哪些头部参与了签名,和 CanonicalHeaders 包含的头部内容是一一对应的。content-type 和 host 为必选头部。拼接规则:1)头部 key 统一转成小写;2)多个头部 key(小写)按照字典排序进行拼接,并且以分号(;)分隔。此例中为:content-type;host
let SignedHeaders = ‘content-type;host’;
// 请求正文的哈希值,计算方法为 Lowercase(HexEncode(Hash.SHA256(RequestPayload))),对 HTTP 请求整个正文 payload 做 SHA256 哈希,然后十六进制编码,最后编码串转换成小写字母。注意:对于 GET 请求,RequestPayload 固定为空字符串,对于 POST 请求,RequestPayload 即为 HTTP 请求正文 payload。
let jsonStr = JSON.stringify(jsonData);
// console.log("jsonStr = "+jsonStr);
// Lowercase(HexEncode(Hash.SHA256(RequestPayload)))
let HashedRequestPayload = sha256(jsonStr);
console.log(“HashedRequestPayload = “+HashedRequestPayload+” -----”+JSON.stringify(HashedRequestPayload));

// 拼接规范请求串
let CanonicalRequest =
HTTPRequestMethod + ‘\n’ +
CanonicalURI + ‘\n’ +
CanonicalQueryString + ‘\n’ +
CanonicalHeaders + ‘\n’ +
SignedHeaders + ‘\n’ +
HashedRequestPayload;
console.log(‘完成第一步’+CanonicalRequest);

// 第二步
// 签名算法,目前固定为 TC3-HMAC-SHA256;
let Algorithm = ‘TC3-HMAC-SHA256’;
// 请求时间戳,即请求头部的 X-TC-Timestamp 取值,如上示例请求为 1539084154;
let RequestTimestamp = timeStamp;
// 凭证范围,格式为 Date/service/tc3_request,包含日期、所请求的服务和终止字符串(tc3_request)。Date 为 UTC 标准时间的日期,取值需要和公共参数 X-TC-Timestamp 换算的 UTC 标准时间日期一致;service 为产品名,必须与调用的产品域名一致,例如 cvm。如上示例请求,取值为 2018-10-09/cvm/tc3_request;
let CredentialScope = date + “/” + service + “/” + “tc3_request”;
// 前述步骤拼接所得规范请求串的哈希值,计算方法为 Lowercase(HexEncode(Hash.SHA256(CanonicalRequest)))。
let HashedCanonicalRequest = sha256(CanonicalRequest);
let StringToSign =
Algorithm + ‘\n’ +
RequestTimestamp + ‘\n’ +
CredentialScope + ‘\n’ +
HashedCanonicalRequest;
console.log(‘完成第二步’,StringToSign);

// 第三步
// 原始的 SecretKey;
let SecretKey = "SecretKey ";
// Date:即 Credential 中的 Date 字段信息,如上示例,为2018-10-09;
let SecretDate = HmacSHA256(date,“TC3” + SecretKey);
// Service:即 Credential 中的 Service 字段信息,如上示例,为 cvm;
let SecretService = HmacSHA256(service,SecretDate);
// SecretSigning:即以上计算得到的派生签名密钥;
let SecretSigning = HmacSHA256(“tc3_request”,SecretService);
// StringToSign:即步骤2计算得到的待签名字符串;
let Signature = Hex.stringify(HmacSHA256(StringToSign,SecretSigning));
console.log(‘完成第三步’,Signature);

// 第四步
// 签名方法,固定为 TC3-HMAC-SHA256;
// let Algorithm = ‘TC3-HMAC-SHA256’;
// SecretId:密钥对中的 SecretId;
let SecretId = 'SecretId ';
// let Authorization =
// Algorithm + ’ ’ +
// ‘Credential=’ + SecretId + ‘/’ + CredentialScope + ', ’ +
// ‘SignedHeaders=’ + SignedHeaders + ', ’
// ‘Signature=’ + Signature;
let Authorization =
Algorithm + ’ ’ +
‘Credential=’ + SecretId + ‘/’ + CredentialScope + ', ’ +
‘SignedHeaders=’ + SignedHeaders + ', '+
‘Signature=’ + Signature
console.log(‘完成第四步’,Authorization);
return Authorization;
}

// export default {
// //TODO 加密数据
// uni.getNetworkType({
// success:function(res){
// console.log("request getNetworkType = "+res.networkType);
// if(res.networkType == ‘none’){
// uni.showToast({
// title:‘无网络,请检查网络设置’,
// position:‘middle’,
// icon:‘none’
// })
// }
// }
// })

// }

export function requestTecentCloud(data){
var date = new Date();
// console.log("requestTecentCloud date.getTimezoneOffset() = "+date.getTimezoneOffset());
// var timezoneOffset = date.getTimezoneOffset();
let timeStamp = Math.round(new Date().getTime()/1000);
let authorization= productAuthorization(data,timeStamp);
var config = {
url: tencentcloudOcrUrl, //仅为示例,并非真实接口地址。
data: data,
method:‘POST’,
header: {
‘Authorization’ : authorization,
‘Content-Type’ : ‘application/json’,
‘Host’ : ‘ocr.tencentcloudapi.com’,
‘X-TC-Action’ : ‘IDCardOCR’,
‘X-TC-Version’ : ‘2018-11-19’,
‘X-TC-Timestamp’ : timeStamp,
‘X-TC-Region’ : ‘ap-guangzhou’
},
success() {},
fail() {},
complete() {}
}
return new Promise((resolve, reject) => {
config.complete = (response) => {
let statusCode = response.statusCode
// 统一的响应日志记录
// _reslog(response);
// _resResponse(response);
// console.log("ocrutil response ===== "+JSON.stringify(response));
if (statusCode === 200) { //成功
resolve(response);
} else {
reject(response)
}
}
// 统一的请求日志记录
// _reqlog(_config)
uni.request(config);
});
// uni.showLoading({
// title:‘正在识别中,请稍后’
// })
// uni.request({
// url: tencentcloudOcrUrl, //仅为示例,并非真实接口地址。
// data: data,
// method:‘POST’,
// header: {
// ‘Authorization’ : authorization,
// ‘Content-Type’ : ‘application/json’,
// ‘Host’ : ‘ocr.tencentcloudapi.com’,
// ‘X-TC-Action’ : ‘IDCardOCR’,
// ‘X-TC-Version’ : ‘2018-11-19’,
// ‘X-TC-Timestamp’ : timeStamp,
// ‘X-TC-Region’ : ‘ap-guangzhou’
// },
// success: (res) => {
// uni.hideLoading();
// console.log(“请求成功 返回结果”+JSON.stringify(res));
// },
// fail: (res) => {
// uni.hideLoading();
// console.log(“请求失败 返回结果”+JSON.stringify(res));
// }
// });
}

第三步
需要注意的问题,能看到我们在调用生成签名信息方法的时候productAuthorization
已经传入了一个时间戳,为什么又要在方法内let date = new Date().toISOString().substr(0,10);
获取一个时间对象,
之所以这样做是因为如果直接采用最开始传入的时间戳会有一个问题,在凌晨的时候,我们的时区因为是东八区所以在凌晨12-8点前,会比格林威治时间快8个小时,所以当我们直接用new date生成的yyyy-MM-dd格式的日期信息传入接口,腾讯云接口会校验失败,所以这里CredentialScope 必须要采用另一种 Date().toISOString() 生成的格式传入接口

参考引用如下

https://www.cnblogs.com/ChineseLiao/p/10181686.html

你可能感兴趣的:(JS调用腾讯云 OCR TC3-HMAC-SHA256)