見出し画像

どうしてQRコードを使ったショップポイントは安心なのか?ワンタイム暗号化でポイントを安全に管理する

例)店舗でのポイント獲得のシーン

あなたがカフェを経営しているとしましょう。お客さんがコーヒーを注文すると、会計時にポイントを獲得できるシステムを導入しています。お客さんがコーヒーを注文し、支払いが完了すると、店側はお客さんにポイントを付与するためのQRコードを表示します。このQRコードをスキャンすることで、お客さんはポイントを容易に取得でき店側は安全に管理することができます。

ポイント発行の流れ(QRコード生成)

お客さんがコーヒーを注文した後、ポイントを獲得するためのQRコードが生成され、表示されます。このQRコードは、その時の購入に対応した一時的な情報(ワンタイムトークン)が含まれており、安全にポイントが管理されます。

まず、解説版のコードで流れを説明し、その後に実際のコード例を紹介します。

QRコードを表示:(解説版のコード)

<?php
// お客さんがコーヒーを注文した後、ポイントを取得するための情報を作成する(例: 顧客ID、獲得ポイント、店舗ID)
$ポイント情報 = [
 '顧客ID' => 'CUST123456',
 '獲得ポイント' => 50,
 '店舗ID' => 'STORE7890'
]


// ワンタイムトークンを生成して、使い捨てのパスワードのようなものを作る
$ワンタイムトークン = bin2hex(random_bytes(16));
// このトークンをポイント情報に追加
$ポイント情報['トークン'] = $ワンタイムトークン;


// ポイント情報を暗号化して、他の人に読まれないようにする(秘密のコードに変換)
$暗号化された情報 = base64_encode(json_encode($ポイント情報));

// この暗号化された情報をQRコードとして表示する(スマホでスキャンできる画像)
$QRコードのURL = "https://api.qrserver.com/v1/create-qr-code/?size=150x150&data=" . urlencode($暗号化された情報);

// これが実際に表示されるQRコード
echo "<img src='$QRコードのURL' alt='ポイント用QRコード'>";
?>

QRコードを表示:(実際のコード例)

<?php
// お客さんがコーヒーを注文した後、ポイントを取得するための情報を作成する
//(例: 顧客ID、獲得ポイント、店舗ID)
$point_info = [
    'customer_id' => 'CUST123456',
    'points' => 50,
    'store_id' => 'STORE7890'
];

// ワンタイムトークンを生成して、使い捨てのパスワードのようなものを作る
$one_time_token = bin2hex(random_bytes(16)); 
$point_info['token'] = $one_time_token; // このトークンをポイント情報に追加

// ポイント情報を暗号化して、他の人に読まれないようにする(秘密のコードに変換)
$encrypted_info = base64_encode(json_encode($point_info));

// この暗号化された情報をQRコードとして表示する(スマホでスキャンできる画像)
$qr_code_url = "https://api.qrserver.com/v1/create-qr-code/?size=150x150&data=" . urlencode($encrypted_info);

// これが実際に表示されるQRコード
echo "<img src='$qr_code_url' alt='ポイント用QRコード'>"; 
?>


ポイント取得の流れ(QRコード読込)

お客さんは、会計後にスマホでQRコードをスキャンします。このQRコードには、先ほど生成されたポイント情報が含まれており、暗号化されているため安全です。QRコードがスキャンされると、その情報がサーバーに送信され、ポイントが適切に取得されたかが確認されます。

ポイントを登録:(解説版のコード)

<?php
// お客さんがQRコードをスキャンした時に送られてくる暗号化情報を受け取る
$受け取ったデータ = $_GET['data']; // (実際にはもっと安全な方法が推奨されます)
// 受け取ったデータを復号化して、元の情報に戻す
$復号化された情報 = json_decode(base64_decode($受け取ったデータ), true);

// ワンタイムトークンが有効かどうか確認する(すでに使われたか、無効なものではないか)
$トークンが有効 = データベースでトークンを確認($復号化された情報['トークン']);

if ($トークンが有効) {
 // ポイントが適切に取得されたか確認する
 if ($復号化された情報['獲得ポイント'] > 0) {
  echo "ポイントが正常に取得されました。顧客ID: " . $復号化された情報['顧客ID'] . ", ポイント: " . $復号化された情報['獲得ポイント'];
  // トークンを無効にして再利用を防ぐ
  データベースでトークンを無効化($復号化された情報['トークン']);
 } else {
  echo "ポイント取得に失敗しました。";
 }
} else {
 echo "無効なトークン、またはすでに使用されたトークンです。";
}


// 仮の関数:データベースでトークンを確認する処理
function データベースでトークンを確認($トークン) {
 
// 実際にはデータベースでトークンが有効か確認します
 return true;
}


// 仮の関数:トークンを無効化する処理
function データベースでトークンを無効化($トークン) {
 // 実際にはトークンを無効化して、再利用を防ぎます
}
?>

ポイントを登録:(実際のコード例)

<?php
// お客さんがQRコードをスキャンした時に送られてくる暗号化情報を受け取る
$received_data = $_GET['data']; // (実際にはもっと安全な方法が推奨されます)

// 受け取ったデータを復号化して、元の情報に戻す
$decrypted_info = json_decode(base64_decode($received_data), true);

// ワンタイムトークンが有効かどうか確認する(すでに使われたか、無効なものではないか)
$valid_token = check_token_in_database($decrypted_info['token']); 

if ($valid_token) {
    // ポイントが適切に取得されたか確認する
    if ($decrypted_info['points'] > 0) {
        echo "ポイントが正常に取得されました。顧客ID: " . $decrypted_info['customer_id'] . ", ポイント: " . $decrypted_info['points'];
        invalidate_token_in_database($decrypted_info['token']); // トークンを無効にして再利用を防ぐ
    } else {
        echo "ポイント取得に失敗しました。";
    }
} else {
    echo "無効なトークン、またはすでに使用されたトークンです。";
}

// 仮の関数:データベースでトークンを確認する処理
function check_token_in_database($token) {
    return true; // 実際にはデータベースでトークンが有効か確認します
}

// 仮の関数:トークンを無効化する処理
function invalidate_token_in_database($token) {
    // 実際にはトークンを無効化して、再利用を防ぎます
}
?>

まとめ

このように、QRコードを使ったポイント取得のシステムは、暗号化とワンタイムトークンの組み合わせにより、高度な安全性を実現しています。


技術的なことを少しでも分かりやすく伝えたいと思い、こうした記事を書いています。皆さんのお役に立てれば嬉しいです。


この記事が気に入ったらサポートをしてみませんか?