【php】googleMap API のエンタープライズ版でシグネチャーを生成する方法
こんにちは。
ニシザワです。
google map apiのエンタープライズ版で最近問題が生じたのでその時に使ったシグネチャーの生成方法を書きます。
公式はこちら
基本的にはこちらに書いてある
Examples that cover more languages are available in the url-signing project.
のところのPHPのソースコードを使えば問題なくできるのですが、1点はまりました。
それは、シグネチャーを生成する時にのURLにマルチバイトが含まれる場合です。
今回は、マルチバイト対策を含めて、紹介したいと思います。
事前準備としてエンタープライズで配布されるAPI KEYとClient Secretをお手元にご用意ください。
ではソースコードです。
これがないと違うシグネチャーが生成されてしまって、動かないですからね!
返ってきたURLでgooglemapにアクセスすれば思ったような返り値が返ってくるでしょう。
ハマっている方や英語を読むの嫌な方は参考にしてください。
ニシザワです。
google map apiのエンタープライズ版で最近問題が生じたのでその時に使ったシグネチャーの生成方法を書きます。
公式はこちら
基本的にはこちらに書いてある
Examples that cover more languages are available in the url-signing project.
のところのPHPのソースコードを使えば問題なくできるのですが、1点はまりました。
それは、シグネチャーを生成する時にのURLにマルチバイトが含まれる場合です。
今回は、マルチバイト対策を含めて、紹介したいと思います。
事前準備としてエンタープライズで配布されるAPI KEYとClient Secretをお手元にご用意ください。
ではソースコードです。
<?php
class GoogleMapApiSignUrl {
const GOOGLE_API_SIGNING_SECRET = "YOUR CLIENT SECRET"; //クライントシークレットの設定
/**
* @param string $myUrlToSign
* @return string
*/
public function create(string $myUrlToSign) : string
{
$privateKey = env("GOOGLE_API_SIGNING_SECRET");
// URlのパース
$url = parse_url($myUrlToSign);
parse_str($url['query'],$queries);
foreach ($queries as $key => $val){
$queries[$key] = mb_convert_encoding($val, "UTF-8"); //ここでマルチバイト対策を行う
}
$url['query'] = http_build_query($queries);
$urlPartToSign = $url['path'] . "?" . $url['query'];
// Decode the private key into its binary format
$decodedKey = $this->decodeBase64UrlSafe($privateKey);
// Create a signature using the private key and the URL-encoded
// string using HMAC SHA1. This signature will be binary.
$signature = hash_hmac("sha1",$urlPartToSign, $decodedKey, true);
$encodedSignature = $this->encodeBase64UrlSafe($signature);
$signUrl = $url["scheme"] . "://" . $url["host"] . $url["path"] . "?" . $url["query"] ."&signature=".$encodedSignature;
return $signUrl;
}
/**
* @param $value
* @return mixed
*/
private function encodeBase64UrlSafe($value)
{
return str_replace(array('+', '/'), array('-', '_'),
base64_encode($value));
}
/**
* @param $value
* @return bool|string
*/
private function decodeBase64UrlSafe($value)
{
return base64_decode(str_replace(array('-', '_'), array('+', '/'),
$value));
}
}
?>
foreach ($queries as $key => $val){
$queries[$key] = mb_convert_encoding($val, "UTF-8"); //ここでマルチバイト対策を行う
}
この部分でマルチバイトをUTF8に変換しています。これがないと違うシグネチャーが生成されてしまって、動かないですからね!
返ってきたURLでgooglemapにアクセスすれば思ったような返り値が返ってくるでしょう。
ハマっている方や英語を読むの嫌な方は参考にしてください。