candyhouse公式のドキュメントではPHPでの実装方法が見つからなくて色々苦心したので記事にまとめてみました
使用環境
PHP 7.3.22
使用ライブラリ
cryptlib/cmac dev-master(2021/09/11時点)
#手順
まずはAPI使用に必要な情報をSESAMEのシェア用QR(オーナー権限)から取得
公式だと手順が面倒くさかったけれど、便利なツールがあったのでこれを使用
使うのは以下の項目
- UUID
- Secret Key
次に、SESAMEのデベロッパーサイトにログインしてAPI_KEYを取得
実装
AES-CMAC をPHPで実装してある記事が見つからなかったので、試行錯誤の結果です
基本的には公式ドキュメントのJSとPythonの実装を足して、PHPのライブラリの仕様に沿わせた感じです
use CryptLib\MAC\Implementation\CMAC;
define('SCRET_KEY', '****')
define('API_KEY', '****')
define('UUID', '****')
// 履歴に残る名前。半角しか使えないらしい
$history = base64_encode('WEB API');
// 操作コマンド
$cmd = 88; // toggle:88/lock:82/unlock:83
$hasher = new CMAC();
$key = hex2bin(SECRET_KEY);
$time = strtotime(date("Y/m/d H:i:s"));
// big endianでバイナリ化されていたので、反転してlittle endianに変換
$msg = substr(strrev(hex2bin(dechex($time))), 1);
$sign = bin2hex($hasher->generate($msg, $key));
$data = compact('cmd', 'history', 'sign'));
$url = "https://app.candyhouse.co/api/sesame2/" . UUID . "/cmd";
$method = 'POST';
$header = [
"Content-Type: application/json",
"x-api-key: " . API_KEY
];
$content = json_encode($data);
$options = [
'http' => compact('method', 'header', 'content')
];
echo file_get_contents($url, false, stream_context_create($options));
備忘録として書いたのでわかりずらいところもあるかと思いますが、誰かの参考になれば。。
CMACのところとか、もっといい書き方やご指摘、不明点などあればコメントください!!