freeeのAPI入門(OAuth2認証してユーザー情報を取得する)

# はじめに

2016年12月3日、Startup weekend Tokyo Fintech #2のプレイベント「freee API ハッカソン」に参加してきました。freeeの方にサポートしていただき、freeeのAPIを教えていただきました。

ハッカソン当日、[会計ソフト freee](https://www.freee.co.jp/)の[公開されているAPI](https://secure.freee.co.jp/developers/api/doc)が使えるまで、少々手間取ったので、メモを残します。



# 前準備
API ドキュメントより抜粋
> 1. [freee](https://secure.freee.co.jp/)にサインアップします。
> 2. [アプリケーション一覧](https://secure.freee.co.jp/oauth/applications)から「新しいアプリケーションを登録」します。
> 3. アプリケーションの登録が完了すると、AppIDとSecretが取得できます。
> 4. ローカルの開発環境でテストする際は、認証用URLを直接リクエストしてAuthorization Codeを取得できます。

アプリケーションの登録をするとき、コールバックURIの入力が必要です(あとで変更も可能)。あらかじめ、どこで動かすか考えておいたほうがよいです。このコールバックURIに指定するURIは、外部から接続できないアドレス(例えば、localhost)でも問題ありません。

# 動かしてみる
## コード

【注意】

- $_GETをそのまま処理してたりするので、実際にはちゃんとチェック(サニタイズ？)したほうがよい。

```:sample.php
<?php

    define( 'APP_ID', 'APPIDxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' );
    define( 'APP_SECRET', 'SECRETxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' );
    define( 'APP_CALLBACK', 'http://http://192.168.110.202//freee20161204/sample.php' );
    //※注意：APP_CALLBACKの値は、freeeのアプリケーション一覧に登録されている
    //       コールバックURIと同じにする必要があります。

    // (1) いちばん最初の処理。OAuth2の入り口。
    if( empty( $_GET ) )
    {
        printf('<html><a href="%s?client_id=%s&redirect_uri=%s&response_type=code">認証開始</a></html>',
                'https://secure.freee.co.jp/oauth/authorize',   //認証用
                APP_ID, 
                urlencode( APP_CALLBACK )
        );
    }

    // (2) freeeで「許可する」が押されたあとに実行する処理
    if( ! empty( $_GET['code'] ) )
    {
        $content = [
            "code"          => $_GET['code'],
            "grant_type"    => "authorization_code",
            "client_id"     => APP_ID,
            "client_secret" => APP_SECRET,
            "redirect_uri"  => APP_CALLBACK,
        ];

        $curl = curl_init( 'https://api.freee.co.jp/oauth/token.json' );    //認証済みToken取得用
        curl_setopt( $curl, CURLOPT_POST, TRUE );
        curl_setopt( $curl, CURLOPT_POSTFIELDS, http_build_query( $content ) );
        curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true);
        $jsonToken = curl_exec($curl);
        $token = json_decode( $jsonToken, true );        

        var_dump( $token );
    }

    // (3) Token取得後の処理。各種APIの実行
    if( ! is_null( $token['access_token'] ) )
    {
        $header = [
            'Authorization: Bearer ' . $token['access_token'],
        ];

        $curl = curl_init( 'https://api.freee.co.jp/api/1/users/me?companies=true' );  //自分の情報
        curl_setopt( $curl, CURLOPT_HTTPHEADER, $header );
        curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true);
        $jsonResult = curl_exec($curl);
        $result = json_decode( $jsonResult, true );

        var_dump( $result );
    }
```

## 動作結果
### (1) いちばん最初の処理。OAuth2の入り口。
![image](https://qiita-image-store.s3.amazonaws.com/0/38845/6e833bda-8c90-09cb-b738-f9fdafc93ef1.png)

### (2) freeeで「許可する」が押されたあとに実行する処理
![image](https://qiita-image-store.s3.amazonaws.com/0/38845/26e357c3-a1ff-63d8-d5bf-d75713f61ddf.png)

### (3) Token取得後の処理。各種APIの実行
(2)の下の部分。自分の情報が取得できている

# ハマった点・ワンポイント
- 取得したTokenは24時間有効。
- 多くのAPIで事業所ID(company_id)が必要。   
この事業所IDは、freeeに通常ログインしたときの会社名をクリックして表示される数字(xxxx-yyyy-zzzz)じゃない。Users(ユーザ)や Companies(事業所)で取得した値を使用する必要がある。


# 最後に

今度の週末(12月09日～11日)に開催される[Startup Weekend Tokyo Fintech #2](https://swtokyo.doorkeeper.jp/events/53687)でfreeeのデータにアクセスしようとした時に少しでも参考になれば幸いです。