前回Google認証システムをPHPライブラリを使って自作しました。
この記事のまとめでも書いたのですが、このライブラリで出力できるQRコードのリンクにはシークレットコードが直接埋め込まれており、セキュリティ的な問題がありました。
今回はその問題解消のために、とりあえずQRコードを生成するプログラムを作っていこうと思います。
使うPHPライブラリ
PHPのバージョン管理ツールの「Composer」を使って、「endroid/qr-code」をインストールします。
Composer自体のダウンロードはこちらを参照してください。(参照:「Composer」のダウンロードドキュメント)
endroid/qr-codeはGitHubにて公開されているライブラリです。(参照:「endroid/qr-code」のGitHub)
GitHubにてQRコードを生成するプログラムが紹介されていますが、ここでも一応プログラムを載せます。
QRコードのimgソースを生成する
<?php //qr.php
require_once( __DIR__ . '/vendor/autoload.php' );
use Endroid\QrCode\Color\Color;
use Endroid\QrCode\Encoding\Encoding;
use Endroid\QrCode\ErrorCorrectionLevel\ErrorCorrectionLevelLow;
use Endroid\QrCode\QrCode;
use Endroid\QrCode\RoundBlockSizeMode\RoundBlockSizeModeMargin;
use Endroid\QrCode\Writer\PngWriter;
$data_string = "https://white-sesame.jp";
$qr_code = QrCode::create( $data_string )
-> setEncoding( new Encoding( 'UTF-8' ) )
-> setErrorCorrectionLevel( new ErrorCorrectionLevelLow() )
-> setSize( 300 )
-> setMargin( 30 )
-> setRoundBlockSizeMode( new RoundBlockSizeModeMargin() )
-> setForegroundColor( new Color( 0, 0, 0 ) )
-> setBackgroundColor( new Color( 255, 255, 255 ) );
$writer = new PngWriter();
$result = $writer->write( $qr_code );
$img_src = $result->getDataUri();
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>QRコード</title>
</head>
<body>
<img src="<?php echo $img_src; ?>">
</body>
</html>
$data_stringの変数に代入する文字列がQRコードになって生成されます。
QR生成を関数化
とても使いやすいライブラリなのですが、使い回ししやすいように関数化しようと思います。
HTMLのimgタグを出力するようにしようと思います。
上のコードをまとめただけですが、変数を隠せるメリットもあります。
<?php //get_qr_image.php
require_once( __DIR__ . '/vendor/autoload.php' );
use Endroid\QrCode\Color\Color;
use Endroid\QrCode\Encoding\Encoding;
use Endroid\QrCode\ErrorCorrectionLevel\ErrorCorrectionLevelLow;
use Endroid\QrCode\QrCode;
use Endroid\QrCode\RoundBlockSizeMode\RoundBlockSizeModeMargin;
use Endroid\QrCode\Writer\PngWriter;
function get_qr_image ( $uri )
{
$qr_code = QrCode::create( $uri )
-> setEncoding( new Encoding( 'UTF-8' ) )
-> setErrorCorrectionLevel( new ErrorCorrectionLevelLow() )
-> setSize( 300 )
-> setMargin( 30 )
-> setRoundBlockSizeMode( new RoundBlockSizeModeMargin() )
-> setForegroundColor( new Color( 0, 0, 0 ) )
-> setBackgroundColor( new Color( 255, 255, 255 ) );
$writer = new PngWriter();
$result = $writer->write( $qr_code );
$img_src = $result->getDataUri();
echo '<img src="' . $img_src . '" alt="' . $uri . '">';
}
これでこのファイルをインクルードするだけで関数が使えるようになりました。
まとめ
<?php
include_once( 'get_qr_image.php' );
echo get_qr_image( '田島シオン' );
できました。