2

我的公司最近注册了 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 解码的方式。

我尝试了很多组合,但找不到解决方案。任何帮助将不胜感激。

谢谢, 安基特

4

2 回答 2

5

您需要签署完整路径和查询。您的字符串 url 缺少前导斜杠 (/)。

此外,不要害怕向 Google 提出此类查询的支持案例。

于 2012-12-14T20:12:36.847 回答
0

我们已经使用了代码,但是其中存在一些缺陷,对于打算使用此代码的人来说,实际代码将是:

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 urlBlob = Blob.valueOf(url);
Blob signatureBlob = Crypto.generateMac('hmacSHA1', urlBlob, privateKeyBlob);

String signature = EncodingUtil.base64Encode(signatureBlob);

signature = signature.replace('+', '-');
signature = signature.replace('/', '_');

system.debug('*** Signature: ' + signature);
于 2013-05-13T04:43:58.537 回答