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 クラスのドキュメントには、「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 に答える