Google maps api 3 无法使用Salesforce加密类为Google Maps API生成HMac

Google maps api 3 无法使用Salesforce加密类为Google Maps API生成HMac,google-maps-api-3,salesforce,apex-code,hmacsha1,Google Maps Api 3,Salesforce,Apex Code,Hmacsha1,我的公司最近注册了GoogleMapsAPI 要使用API,我需要生成HMacSHA1签名,并将其添加到HTTP请求中。不幸的是,不知何故,我无法生成正确的签名 为了进行测试,我使用谷歌提供的值来确保算法运行良好,并得到正确的结果。代码如下: string url = 'maps/api/geocode/json?address=New+York&sensor=false&client=clientID'; string privateKey = 'vNIXE0xscrmjlyV

我的公司最近注册了GoogleMapsAPI

要使用API,我需要生成HMacSHA1签名,并将其添加到HTTP请求中。不幸的是,不知何故,我无法生成正确的签名

为了进行测试,我使用谷歌提供的值来确保算法运行良好,并得到正确的结果。代码如下:

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=

以下是谷歌文档的链接,您也可以在其中找到相同的示例:

需要注意的几点: 1.我使用了API文档中提供的示例Python脚本,它给出了正确的结果。 2.我认为问题是,API文档说我们应该解码私钥,然后将其提供给函数。尽管Crypto类的文档中说“privateKey的值不需要以解码形式存在”。我尝试了两种方法,有解码和没有解码,仍然没有结果。 3.对于GoogleAPI,所有内容都必须进行UTF-8编码;我不知道这是不是编码的方式。Util解码就是它

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

谢谢, Ankit

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


另外,不要害怕为这种类型的查询打开谷歌的支持案例。

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

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);

如果其他人好奇,列出的私钥是用于测试的。真不敢相信,我会如此愚蠢,错过了前面的斜杠。非常感谢:)