ZipCloudの郵便番号検索をSSLに対応させる方法【PHP】

先日、本ブログをSSL化したという記事を書きましたが、以前投稿した記事にSSLに対応できないものがあったのでその修正方法を書いていきます。

SSL化に対応していのは、郵便番号から自動で住所を表示させる方法で投稿したコードです。
郵便番号検索のデータベースとして株式会社アイビスさんのZipCloudを使用させて頂いていますが、こちらのAPIはSSLに未対応です。
ですので、以前のコードをそのまま流用するとSSL化したサイトではブラウザによってブロックされてしまうことがあります。

(2018/11/27追記) 新しいサイトにも掲載しました。コードの解説と SSL 対応の方法をまとめましたので、こちらも参考にして頂ければと思います。


解決方法の検討

では、まずはどのように解決するかを検討していきます。

案1)SSLに対応したAPIを使う

SSL対応で検索すると “ajaxzip3” というものを紹介しているページが幾つか見つかります。

どうやら既にサポートは終了しているようなので、今後更新されることは余りないと思います。
(有志による更新はあるかもしれません)

データベースは更新され続けることに意義があるので、今回はパスとしました。
※ZipCloudは先日 (2018/4/30現在では2018/4/27) も更新されているので情報が新鮮です。

“ajaxzip3” に興味のある方は、以下のページをご参照下さい。

・Qiita – 【ajaxzip3】郵便番号を入力すると住所が自動入力されるライブラリ
・github – ajaxzip3/ajaxzip3.github.io

案2)自分のドメイン内で扱えるDBを (SQLなどで) 作る

次は間違いないく安全で確実な方法です。

自分のドメイン内で扱えるMySQLなどに郵便番号と住所を対応させたDBを作る方法です。
これなら外部APIと異なり、サービスが突然終了するリスクも無く、内部通信なので安全です。

但し、日本郵政が公開しているデータベースを扱える形に加工したり更新したりと、割と面倒なのでなかなか手を出し辛いのが現実だと思います。
私もこの方法で最初やろうと思った (検索用スクリプト作成の時) のですが、手間を考えるとやはり外部サービスを利用させてもらう方が良いと判断しました。

SSL化に伴い、内部通信で済ませることも検討しましたが、今回も見送ることとしました。

もし、頑張って自前で作るという方はぜひ簡単な方法を教えて下さい(笑)

・日本郵政 – 郵便番号データダウンロード
※差分データなどの提供もありますので適宜活用して下さい。

案3)ZipCloudのデータをサーバで取得してHTTPS通信でWebページに返す (採用案)

最後は、今回採用した案です。
ZipCloudのデータをサーバーサイドのプログラムでHTTP通信 (非SSL) を使って一旦取得して、それをHTTPS通信 (SSL対応) でWebページに返す方法です。

ZipCloudが信用できる更新頻度も高いサービスという前提で採用しています。
株式会社アイビスさん、本当にありがとうございます。

サーバーサイドのプログラム言語にはPHPを採用しました。
特に縛りはないので、PerlやRubyなどでもOKです。

というわけで次はPHPのコードの紹介です。
解説するほどのものではないのでサクッといきます。

サーバサイドのプログラム (PHP) のコード解説

コンセプトは “できるだけ元のコードを変更しないこと” です。
ですので、PHPではZipCloudから取得したデータをそのまま表示するだけというコードです。

ソースコード

まずは、ソースコードをご確認下さい。非常に簡単です。
コードにコメントを付けているので分かる方は以降読み飛ばし推奨です。

<?php
// 呼び出したURLの'?'以降の'zipcode='で指定された文字列を取得する
$zipcode = '';
if (!empty($_GET['zipcode'])) {
	$zipcode = $_GET['zipcode'];
}
// 呼び出したURLの'?'以降の'callback='で指定された文字列を取得する
// 指定がなければ'jsonp'というコールバック関数名で返す
$callback = 'jsonp';
if (!empty($_GET['callback'])) {
	$callback = $_GET['callback'];
}
// ZipCloudのAPI用のアドレス文字列を生成
$url = "http://zipcloud.ibsnet.co.jp/api/search?zipcode=" .$zipcode ."&callback=" .$callback;
// テキストデータを読み込む (HTTP通信)
$json = file_get_contents($url);
// 文字化けしないようにUTF-8に変換
$json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');
// 取得した文字列をそのまま返す
print_r($json);
?>

ソースコード解説

上から順番にいきます。

$_GET[‘****’] はURLのサーチ情報 (?以降の文字列) から “****=” に続く文字列を取得します。
($_GET という変数はPHPの特殊変数でサーチ情報が連想配列として格納されます)

!empty() で空でなければ指定の文字列を変数に代入しています。

次に、ZipCloudのAPIに対応したURLへ変換します。
.演算子で文字列を結合させているだけです。

続いて、ZipCloudのAPIから返される文字列を file_get_contents() 関数で取得します。
取得した文字列の文字コードが使うページの文字コードと違うと困るので、UTF-8に変換します。
mb_convert_encoding() 関数については、以下のページをご確認下さい。
(UTF-8以外の文字コードを使っている方はご自分の環境に合わせて下さい)

・PHP Manual – mb_convert_encoding
※変換前の文字コードに “auto” を設定するとエラーが出るかもしれないので、極力避けた方が良いそうです。

最後に print_r() 関数でAPIから取得した文字列を出力して終了です。

Javascriptの変更

PHPが準備できたらJavascript側も変更しておきましょう。
これまでZipCloudのAPIを直接呼んでいた部分を先ほど作成したPHPに変更するだけです。

PHPのアドレスは各自の環境に合わせて下さい。

<script><!--
var getAddName = function( $addNum ){
	var _zipcloudAPI = document.body.appendChild(document.createElement("script"));
		_zipcloudAPI.src = "./zipcode.php?zipcode=" + $addNum + "&callback=getAddNameByZipcloudAPI";
	document.body.removeChild(_zipcloudAPI);
};
var getAddNameByZipcloudAPI = function( $getAdd ){
	var _addFormatted  = "";
	if($getAdd.status == 200){
			_addFormatted += $getAdd.results[0].address1; // 都道府県名
			_addFormatted += $getAdd.results[0].address2; // 市町村名
			_addFormatted += $getAdd.results[0].address3; // 町域名
	}
	document.getElementById("add_name").value = _addFormatted;
};
//--></script>

以上で変更は完了です。

まとめ

以上、ZipCloudをSSL通信に対応させる方法でした。

幾つか解決方法があるので、ご自分の用途に合った方法を使用して下さい。

ご質問や間違い、ご指摘などありましたら、コメントや問い合わせからお願いします。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください