我的公司最近注册了 Google Maps API for business。
要使用 API,我需要生成一个 HMacSHA1 签名,并将其添加到我的 HTTP 请求中。不幸的是,不知何故,我无法生成正确的签名。
对于测试,我使用 google 提供的值来确保算法正常工作并且我得到正确的结果。这是代码:
string url = 'maps/api/geocode/json?address=New+York&sensor=false&client=clientID';
string privateKey = 'vNIXE0xscrmjlyV-12Nj_BvUPaw=';
privateKey = privateKey.replace('-', '+');
privateKey = privateKey.replace('_', '/');
//Blob privateKeyBlob = EncodingUtil.base64Decode(privateKey);
Blob privateKeyBlob = Blob.valueOf(privateKey);
Blob urlBlob = Blob.valueOf(url);
Blob signatureBlob = Crypto.generateMac('HMacSHA1', urlBlob, privateKeyBlob);
String signature =EncodingUtil.urlEncode(EncodingUtil.base64Encode(signatureBlob), 'UTF-8');
signature = signature.replace('+', '-');
signature = signature.replace('/', '_');
system.debug('signature is ' +signature);
生成的签名应该是:KrU1TzVQM7Ur0i8i7K3huiw3MsA=
这是 Google 文档的链接,您还可以在其中找到相同的示例:https ://developers.google.com/maps/documentation/business/webservices
需要注意的几点: 1. 我使用了 API 文档中提供的示例 Python 脚本,它给出了正确的结果。2.我认为问题是,API文档说我们应该解码privateKey,然后将其提供给函数。尽管 Crypto Class 的文档说“privateKey 的值不需要采用解码形式。”。我都试过了,有解码和没有解码,仍然没有结果。3. 对于 Google API,一切都必须是 UTF-8 编码;我不知道这是否是 Encoding.Util 解码的方式。
我尝试了很多组合,但找不到解决方案。任何帮助将不胜感激。
谢谢, 安基特