今回は、独立前からずっとお付き合いのあるクライアント様からの案件。
クライアント様は、神奈川県と東京都内にホテルを運営していて、お客様向けのポイントキャンペーンを行いたいという。
「7月1日からQRコードを使ったキャンペーン始めたいんですが」
納期4週間
最初に件の問い合わせを受けたのが5月下旬。
7月1日からキャンペーンスタート。
要件定義から必要っぽいけど間に合うかな?
まず、リポジトリ確保
長い付き合いのクライアント様ですが、IT関連のリテラシーはさっぱりなので、私のGithubアカウントでプライベートリポジトリを作っておきます。
PHPフレームワーク
何がって、納期があと数週間しかないので、新しいのとかモダンなのに拘ってらんないので、早く、慣れてて、簡潔なフレームワークを採用。
CodeIgniter
バージョン4.0.3が最新バージョンですが、まだ次期バージョン扱いなので、3.1.11をダウンロードします。
QRコードキャンペーンなので
QRコードを使ったキャンペーンというのは、確定事項なのでQRコードのライブラリをインストールしておきます。
$ composer require endroid/qr-code
さくっと、QRコードを生成するライブラリを入れておきます。
QRコードのテストをさくっと
ライブラリがキチンと動作する事を簡単なPHPファイル作ってテストしておきます。
display.php
<?php
require_once __DIR__ . '/vendor/autoload.php';
use Endroid\QrCode\QrCode;
$qrCode = new QrCode('Life is too short to be generating QR codes');
header('Content-Type: '.$qrCode->getContentType());
echo $qrCode->writeString();
PHPファイルにアクセスすると、指定したメッセージがQRコードになって表示される事を確認します。
OKですね。
このテストファイルがあれば、お客様に「こんなQRコード作れます?」とかいう質問にも、すぐに対応できます。コード内のメッセージ部分を書き換えるだけですし、何ならGETでメッセージを受け取るように改造してもいいかもしれません。
さあ、要件定義だ
データベースもフレームワークもライブラリも揃っている。
何をどうしたいのか聞かせてもらいましょう。
「えっ、要件定義できてないうちから、ここまで動いちゃうの?」
とか思う人も多いでしょうね。
ランサーズなら、仮入金が確定するまで働いてはいけませんと怒られるところです。
Bootstrap でダッシュボード作成
まあ、いつものBootstrapでダッシュボードを作ります。
1. ログインページ
2. トップページ
簡易集計ページ
直近の登録ユーザーとか、ポイントの獲得状況を表示
3. QRコード作成ページ
作成済みのQRコード一覧
QRコードの作成フォーム
4. ユーザー管理ページ
ユーザーの一覧
ユーザーのポイント状況などの表示
Model作成
今回の企画では以下4つのモデルを作成しました。
Qr_model.php
User_model.php
Points_model.php
Area_model.php
Qr_model
QRコードの作成や、既存のコードの出力などを担当。
User_model
名前の通り、ユーザーモデル。
会員登録や、会員情報の出力などを担当。
Points_model
キャンペーンの要、ポイント計算系のモデル。
ユーザが読み取ったQRコードから対応するポイントを出力したり、ユーザの現在貯まっているポイントの出力などを担当。
Area_model
開催店舗が2つあり、それぞれでQRコードを分けたい要望があったので、店舗をエリアとして扱うモデル。今回のキャンペーンでは、あまり使われていない。
後出しで、もっと複雑な賞品条件とか出てきた時のために用意。
ユーザー向けのコントローラはリダイレクト多め
ユーザー向けのページは、ユーザーの状態によって可変しないといけない場合が多いので、条件分岐でリダイレクトが多めになります。
・QRコード読み込んできたフローなのか
・マイページから戻ってきたフローなのか
・既にログイン済みなのか
などなど。
例えば、QRコードを読み込んでポイントを貯めるにあたった、初回はユーザー登録フォームへ移動しますが、2回目はログインフォームに行きます。そして、続けて2枚目のQRコードを読み込んだときはログイン状態なので、直ちにポイント追加の画面に移動します。
こういった流れをコントローラが、適宜リダイレクトさせるようにします。
QRコードを作る時に気をつけたこと
QRコードを作る上で、気をつけたことは、URLにする文字列を予測可能な文字列にしないことです。
今回のキャンペーンでは、「ホテルの部屋番号ごとに異なるQRコードを配置しておきたい」というクライアントの要望がありました。
これを素直に聞いてしまうと、URL文字列を単純に部屋番号にしてしまいがちです。
// 部屋番号1203の場合 http://sample.hotel.com/qr/1203
これのマズい点は、容易に任意のコードを予測できてしまうので、実際にホテルを利用していない人でも簡単にアクセスを偽装できてしまいます。
そこで、今回、このURL文字列部分をランダムな文字列を生成する仕組みを組み込みました。
業者対策
ホテルといえば、デリヘル嬢の出入りも多いので、彼女らがチームでこのイベントに参加してくるとあっという間に賞品を総取りされてしまいます。
それに(消極的に)対応する策として、ポイント追加の履歴をリアルタイムに監視できる管理画面の実装と、アラート表示を用意しました。
また、管理画面側で追加されたポイントを無効化することもできるようにしました。