我希望标题正确定义。我正在将邮政编码传递给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的邮政编码示例
两者都使用相同的代码来生成密钥。
感谢。
答案 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;