開発ブログ

株式会社Nextatのスタッフがお送りする技術コラムメインのブログ。

電話でのお問合わせ 075-744-6842 ([月]-[金] 10:00〜17:00)

  1. top >
  2. 開発ブログ >
  3. PHP >
  4. 【php】googleMap API のエンタープライズ版でシグネチャーを生成する方法

【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をお手元にご用意ください。

ではソースコードです。
<?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にアクセスすれば思ったような返り値が返ってくるでしょう。
ハマっている方や英語を読むの嫌な方は参考にしてください。
  • posted by admin_nextat
  • PHP
TOPに戻る