
九保すこひです(フリーランスのITコンサルタント、エンジニア)
さてさて、世の中にはウェブサービスと呼ばれるものが多数あり、作業の効率化のためよく利用する方も多いと思います。
私自身、日頃からそういったサービスに助けられているのですが、この間あるサイトをつかっているときに「こんなことできるんだ!」と驚いたものがありました。
それは・・・・・・
法人情報の自動入力
です。
はじめ見たときは、会社情報がどこから来るのか疑問に思いましたが、ちょっと調べてみたところ、なんと国税庁が法人データを提供してくれており、しかもAPIまで用意してくれているとのことでした。(全く知りませんでした)
そこで
今回はこのAPIを使って法人を検索し、その情報を自動入力できるようにしてみます。
ぜひ何かの参考になりましたら嬉しいです
(最後に実際に開発したソースコード一式をダウンロードできますよ)
「徐々にIT化が進んでますね
」
開発環境: Laravel 8.x、Vue 3、Bootstrap 4
目次 [非表示]
事前登録する
APIを使うには個別のAPIキーが必要になります。
そのため、以下のURLから事前登録をしておいてください。(法人、個人どちらでもOKですよ)
アプリケーションIDが郵送されてくる
私の場合、登録してから数日で次のような封筒が郵送されてきました。(担当者さん、ありがとうございました)
そして中には専用のアプリケーションID(13桁)が書かれていました。
では、このIDを.env
にセットし、実際に法人情報の自動入力機能をつくっていきましょう
.env
TAX_AGENCY_APPLICATION_ID=*************
ルートをつくる
まずはルートをつくります。
以下の2つを追加してください。
routes/web.php
<?php
// 省略
//
ここを追加してください
Route::get('company_search', [\App\Http\Controllers\CompanySearchController::class, 'form']);
Route::post('company_search', [\App\Http\Controllers\CompanySearchController::class, 'search']);
上が入力フォームで、下がAjax
で法人検索をするルートです。
コントローラーをつくる
まずはLaravel
側にコントローラーをつくります。
php artisan make:controller CompanySearchController
すると、ファイルが作成されるので中身を以下のように変更してください。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
class CompanySearchController extends Controller
{
public function form() {
return view('company_search.form');
}
public function search(Request $request) {
$app_id = env('TAX_AGENCY_APPLICATION_ID');
$company_name = urlencode($request->company_name);
$api_url = 'https://api.houjin-bangou.nta.go.jp/4/name'.
'?id='. $app_id . // アプリケーションID
'&name='. $company_name . // URLエンコードした会社名(検索)
'&change=1'. // 過去の情報も含める
'&type=02'; // Unicode
$response = Http::get($api_url);
$csv_data = $response->body();
$data = [];
$loop = 0;
$fp = tmpfile();
fwrite($fp, $csv_data);
fseek($fp, 0);
while($company_data = fgetcsv($fp)) {
if($loop > 0) {
$data[] = [
'id' => $company_data[1], // 法人番号
'name' => $company_data[6], // 法人名,
'post_code' => $company_data[15], // 所在地(郵便番号),
'prefecture' => $company_data[9], // 所在地(都道府県),
'city' => $company_data[10], // 所在地(市区町村),
'street' => $company_data[11], // 所在地(丁目番地等),
'address' => $company_data[9] . $company_data[10] . $company_data[11]
];
}
$loop++;
}
return $data;
}
}
この中でやっていることは以下のとおりです。
form()
ブラウザから直接アクセスしてくる部分です。
後ほどつくることになるビューをセットします。
search()
Ajax
でアクセスするメソッドになります。
この中では、Laravel 7.x
から追加されたHTTP Client
を使ってAPIにアクセスしています。(HTTP Client
は、Gazzle
を使いやすくしたものです)
なお、取得できるデータはCSV形式ですので、以下の流れでデータを切り出し、配列にしています。(XML形式
もありますが、どうやらjson
はありませんでした・・・)
- 一時ファイルに取得したデータを保存
- 一行ずつ配列で取得
- 必要なデータだけを $data へ格納していく
1点気をつけないといけないのが、1行目が会社データではなくヘッダー情報だというところです。そのため、
$loop
を使って2行目からデータを集めるようにしています。
ビューをつくる
では、ここからがメインの部分になります。
以下のファイルをつくって保存してください。
resources/views/company_search/form.blade.php
<html>
<head>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css">
</head>
<body>
<div id="app" class="container p-4">
<h1 class="mb-5">法人情報・自動入力機能</h1>
<div class="row mb-4">
<div class="col-12">
<button type="button" class="btn btn-info" data-toggle="modal" data-target="#search_modal">法人情報を検索して自動入力する</button>
</div>
</div>
<div class="row mb-4">
<div class="col-4">
<label>法人名</label>
<input type="text" class="form-control" v-model="params.company_name">
</div>
<div class="col-4">
<label>法人番号</label>
<input type="text" class="form-control" v-model="params.company_id">
</div>
<div class="col-4">
<label>所在地</label>
<input type="text" class="form-control" v-model="params.company_address">
</div>
</div>
<div class="row">
<div class="col-12">
<div class="bg-light text-secondary p-3">
<small>
<div class="mb-1 font-weight-bold">(APIの規約上、この表記が必要です)</div>
このサービスは、国税庁法人番号システムのWeb-API機能を利用して取得した情報をもとに作成していますが、サービスの内容は国税庁によって保証されたものではありません。
</small>
</div>
</div>
</div>
<!-- Modal -->
<div class="modal fade" id="search_modal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="searchModalLabel">🔍 法人情報を検索</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<div class="row">
<div class="col-6">
<div class="input-group mb-3">
<input id="search_company_name" type="text" class="form-control" placeholder="例:株式会社Laravel" v-model="searchCompanyName" @keypress.enter="searchCompany">
<div class="input-group-append">
<button class="btn btn-info" type="button" :disabled="searching" @click="searchCompany">検索する</button>
</div>
</div>
</div>
<div class="col-6 p-1" v-if="searching">
⏳ 検索中...
</div>
</div>
<div class="row">
<div class="col-12" v-if="companies.length">
<div class="mb-2" style="max-height:350px;overflow-y:auto;">
<table class="table table-striped">
<tbody>
<tr v-for="c in companies">
<td>
<a href="#" @click.prevent="setCompany(c)">
@{{ c.name }}
</a><br>
<small class="text-secondary">@{{ c.id }}</small>
</td>
<td>
<small class="text-secondary">
〒@{{ c.post_code }}<br>@{{ c.address }}
</small>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="col-12 text-secondary" v-else>
会社データはありません。
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js"></script>
<script src="https://unpkg.com/vue@3.0.2/dist/vue.global.prod.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.19.2/axios.min.js"></script>
<script>
Vue.createApp({
data(){
return {
params: {
company_name: '',
company_id: '',
company_address: ''
},
searchCompanyName: '',
companies: [],
searching: false
}
},
methods: {
searchCompany() {
if(this.searching === false) {
this.searching = true;
const url = '/company_search';
const params = { company_name: this.searchCompanyName };
axios.post(url, params)
.then(response => {
this.companies = response.data;
})
.catch(error => {
console.log(error);
})
.finally(() => {
this.searching = false;
});
}
},
setCompany(company) {
this.params = {
company_name: company.name,
company_id: company.id,
company_address: company.address,
};
this.searchCompanyName = '';
this.companies = [];
$('#search_modal').modal('hide');
}
},
mounted() {
$('#search_modal').on('shown.bs.modal', () => {
document.querySelector('#search_company_name').focus();
});
}
}).mount('#app');
</script>
</body>
</html>
少しコードが長いですが、基本的なVue
とaxios
の使い方をしているだけです。
流れとしては以下のようになります。
- ボタンをクリック
- モーダルが表示されて会社名で検索
- Ajax通信で会社データを取得し、リスト表示
- 表示された会社情報のうちどれかがクリックされたら自動入力
テストしてみる
では、実際にテストしてみましょう
「https://******/company_search」へアクセスしてください。
フォームが表示されるので「法人情報を検索して自動入力する」ボタンをクリックします。
すると、モーダルが表示されるので今回は超有名会社「ソニー」で検索してみましょう。
一覧が表示されるので、「ソニーエレクトロニクス株式会社」をクリックしてみます。
すると・・・・・・
はい
何も入力してませんが、自動で3つの入力ボックスに情報が入りました。
成功です
ちなみに
今回利用したAPIの詳細は以下のURLで確認できます。(APIバージョン4
を使って開発しました)
WEB-API仕様書:
https://www.houjin-bangou.nta.go.jp/webapi/kyuusiyousyo.html
リソース定義書(応答結果の詳細):
https://www.houjin-bangou.nta.go.jp/download/index.html#resource
ダウンロードする
今回実際に開発したソースコード一式を以下からダウンロードすることができます。
法人情報を自動入力する機能をつくる※ CDN
をつかっているのですぐ使えますよ
おわりに
ということで、今回は国税庁が提供してくれている「法人番号システム API」で法人情報の自動入力機能をつくってみました。
もしかすると法人名を検索するのは、決済などの特殊な場合だけかもしれませんが、アイデアしだいでは面白いものがつくれるかもしれません。
しかも、(データの正確性が保証されているわけではないですが)出処が国税庁ということなので、純度の高いデータと言っていいんじゃないでしょうか。
ぜひ、皆さんもいろいろと作ってみてくださいね。
ではでは〜
「こういう公的なデータって
他にもあるでしょうから
活用していかなきゃですね」