签名对Google Geocoding API的某些邮政编码无效

时间:2014-07-15 08:06:16

标签: google-maps salesforce google-geocoding-api

我希望标题正确定义。我正在将邮政编码传递给Google地理编码API,并且需要使用提供的私钥生成签名。我在Salesforce类中成功生成了基于reference的密钥。我做了一些测试在不同的邮政编码和面对这个问题。一些签名是有效的,但有些是无效的。

这真的很奇怪,因为签名是从同一个方法生成的,为什么我传递不同的邮政编码,其中一些有效,但有些无效。

这是我的代码示例。我隐藏私钥和客户端ID。

//replace the number with any postal code to test
String baseUrl = 'https://maps.googleapis.com/maps/api/geocode/json?components=postal_code:97008&client=gme-xxxx';
URL url = new URL(baseURL);
String path =url.getPath();
String query=url.getQuery();
String input=path+'?'+query;


System.debug('@unid path '+ path);
System.debug('@unid query '+ query);
System.debug('@unid input '+ input);

String privateKey='xxxxxxxxxxxx=';

Blob decodePK = EncodingUtil.base64Decode(privateKey);
String algorithmName = 'hmacSHA1';
Blob hmacData = Crypto.generateMac(algorithmName, Blob.valueOf(input), decodePK);
String signature =EncodingUtil.urlEncode(EncodingUtil.base64Encode(hmacData), 'UTF-8');
signature = signature.replace('+', '-');
signature = signature.replace('/', '_');

baseUrl +='&signature='+signature;

//this is the final URL that  can be pasted to browser
system.debug('@unid baseURL ='+ baseURL);

无效的邮政编码示例97015,97008。 工作97005,98006,80014的邮政编码示例

两者都使用相同的代码来生成密钥。

感谢。

1 个答案:

答案 0 :(得分:1)

我已经修好了。在执行EncodingUtil.urlEncode之前删除+和/。

Blob hmacData = Crypto.generateMac(algorithmName, Blob.valueOf(input), decodePK);
String encodePK =EncodingUtil.base64Encode(hmacData);
encodePK = encodePK.replace('+', '-');
encodePK = encodePK.replace('/', '_');
String signature =EncodingUtil.urlEncode(encodePK, 'UTF-8');
signature = signature.replace('+', '-');
signature = signature.replace('/', '_');
baseUrl +='&signature='+signature;