Tuesday, October 28, 2025
HomeBusiness IntelligenceQRコード決済の仕組みを徹底解説――一枚の画像が決済を可能にする技術の舞台裏

QRコード決済の仕組みを徹底解説――一枚の画像が決済を可能にする技術の舞台裏



なぜ支払えるのか? QRコードに込められた「アドレス」という発想

QRコード決済が成立する根源的な理由は、支払いに必要な宛先と取引条件に関する最小限の情報を、スマートフォンが読み取り可能な文字列として二次元コードに埋め込んでいる点にあります。私たちが普段目にするQRコードは、それ自体がお金や価値を内包しているわけではありません。その本質は、決済システムに対して「誰が、誰に、いくらを支払うのか」という指示を正確に伝えるための、「アドレスと指示書」を画像という携帯しやすい形式に封じ込めたものなのです。

利用者がスマートフォンのカメラでQRコードを読み取ると、決済アプリはこの文字列データを瞬時に解析します。そして、文字列の中から加盟店を特定する識別子、利用する決済ネットワークの種類、取引金額、通貨、さらには個別の取引を追跡するための参照番号や店舗情報といった、決済を実行するために不可欠な要素を一つひとつ抽出します。アプリは、これらの抽出した情報に基づいて、背後にある決済サーバーへオンラインでリクエストを送信します。このリクエストを受け取ったサーバーが、クレジットカードネットワーク、銀行口座振替、あるいは独自の決済網といった各金融スキームの規則に従って、認証、与信判断、または即時引き落としといった一連の処理を進めるのです。この仕組みにより、QRコードは決済プロセスの単なる入り口として機能します。

この方式がもたらす最大の利点は、その圧倒的な柔軟性にあります。従来の決済端末のように複雑な配線や専用ハードウェアを必要とせず、極端な話、情報を印刷した紙を一枚店頭に掲示するだけで決済の受付が可能になります。また、QRコード自体が持つ優れた情報密度と、コードの一部が汚れたり欠けたりしても情報を復元できる「誤り訂正機能」のおかげで、多少の印字かすれや設置面の歪み、縮小印刷といった悪条件下でも高い読み取り精度を維持できます。この堅牢性が、多様な環境での利用を支えています。さらに、その応用範囲は対面決済に留まりません。公共料金の請求書、ECサイトの支払い画面、テレビCM、郵送されるダイレクトメールなど、媒体を問わずに「支払いへの入り口」を配布できる汎用性の高さが、QRコード決済の急速な普及を強力に後押ししてきたのです。

QRコードの生成を設計する上で、まず理解すべき二つの大きな軸が存在します。一つは「静的(Static)」か「動的(Dynamic)」かという情報の更新性に関する区別です。もう一つは、コードを提示するのが店舗側か利用者側かという「加盟店提示型(MPM – Service provider-Introduced Mode)」と「利用者提示型(CPM – Shopper-Introduced Mode)」の違いです。 静的コードは、一度生成して印刷すれば、半永久的に同じものを使い続けることができます。支払い先情報は固定されており、取引ごとの金額や注文内容は、利用者がコードを読み取った後に手元のアプリで入力したり、サーバー側で生成したりします。小規模な店舗や屋台、あるいは寄付を募る際のチップボックスなど、運用負荷を最小限に抑えたい場面に適しています。 一方、動的コードは、取引の都度、金額や注文番号、さらにはコードの有効期限といった個別情報を埋め込んでリアルタイムに生成されます。レジシステムと連携し、会計伝票ごとに正確な金額をQRコードとして表示したい場合や、オンライン注文における不正利用を防止したい場合に極めて有効です。有効期限を数分程度に短く設定することで、QRコードのスクリーンショットなどが第三者に渡ったとしても、不正に再利用されるリスクを大幅に低減できます。

もう一つの軸であるMPMとCPMは、文字通りコードをどちらが提示するかの違いです。MPMは、店舗がレジ横やテーブル上にコードを掲示し、利用者が自身のスマートフォンでそれを読み取る、最も一般的な方式です。この方式のデータ構造は、国際的な標準化団体であるEMVCoが策定した「Service provider-Introduced QR」仕様に集約される傾向にあり、日本国内ではその仕様を基に国内事情に合わせて最適化した「JPQR」が普及を促進しています。 対照的にCPMは、利用者のスマートフォンアプリ上に表示されたQRコードを、店舗側のスキャナやPOS端末が読み取る方式です。コンビニエンスストアのセルフレジや交通機関の改札など、固定されたスキャナで高速な読み取りが求められる場面で多用されます。利用者の識別情報や一時的な支払いトークンなどがコードに含まれており、データの構成や持たせ方はMPMとは大きく異なります。このように、街中の店舗ではMPM、高速処理が求められるカウンターや改札ではCPMといった形で、それぞれの特性に応じた棲み分けが進んでいるのが現状です。

データの設計図:国際標準EMVCoが定めるTLV構造の核心

加盟店提示型(MPM)のQRコードに格納される文字列データ、すなわちペイロードは、基本的に「TLV」と呼ばれる非常にシンプルな構造の連なりで構成されています。TLVとは、「Tag(タグ)」「Size(レングス)」「Worth(バリュー)」の頭文字を取ったもので、データの種類を示す識別子(タグ)、データの長さ(レングス)、そしてデータ本体(バリュー)という3つの要素が一組となった形式です。この規則的な構造により、決済アプリはペイロードの先頭から順にデータを解析していくだけで、必要な情報を正確に切り出すことができます。

ペイロードの冒頭には、必ず「00」というタグが登場します。これは「Payload Format Indicator」と呼ばれ、このQRコードがEMVCoの仕様に準拠していることを示すためのもので、通常「01」という値が入ります。次に現れる「01」というタグは「Level of Initiation Methodology」で、このコードが静的なものか動的なものかを示します。静的コードの場合は「11」、動的コードの場合は「12」という値を設定し、読み取り側のアプリがその後の処理を適切に分岐できるようにします。 続いて「26」から「51」までの範囲のタグには、各決済サービス事業者に固有の「Service provider Account Data(加盟店口座情報)」が格納されます。例えば、ある決済サービスにはタグ「29」が割り当てられ、そのバリュー部分には、さらに内部でTLV構造を用いて、加盟店IDや受取人アカウント情報といった、その決済ネットワーク内でのみ通用する詳細な情報が入れ子で格納されます。 この事業者固有の領域に続き、どの決済サービスでも共通で利用できる属性情報が定義されています。例えば、タグ「52」は業種コード(Service provider Class Code)、「53」は取引通貨を国際標準のISO 4217に定められた3桁の数字コードで示し、日本円(JPY)の場合は「392」となります。「54」は取引金額を直接指定するためのタグです。「58」には国コード(日本なら「JP」)、「59」には加盟店の正式名称、「60」には店舗が所在する市区町村名がそれぞれ入ります。 さらに、「62」というタグは「Extra Knowledge Area Template(追加データフィールド)」として予約されており、そのバリューの内部に、伝票番号やレジ端末のID、取引の参照番号といった、運用上必要となる様々な補足情報をTLV形式で自由に詰め込むことができます。そして、ペイロードの末尾には、データの完全性を検証するために必須となる「63」のタグ、すなわち「CRC(巡回冗長検査)」が配置され、その値として4桁の16進数で計算されたチェックサムが格納されます。このCRCがあるおかげで、アプリはQRコードを読み取った直後に、データが改ざんされたり破損したりしていないかを即座に検証できるのです。

このTLV形式のデータは、人間が直接目で見て内容を確認しやすいよう、一般的にASCII文字で構成されます。例えば、ペイロードの先頭部分は「000201010212…」といった文字列になります。これは「タグ00、長さ02、値01」「タグ01、長さ02、値12」…と続いていることを意味します。金額を固定する静的コードの場合は、タグ「54」に十進数で金額を指定しますが、金額が変動する場合はこのタグ自体を省略するか、POSシステムが動的コードを生成する都度、適切な金額を埋め込みます。 動的コードのセキュリティをさらに高めるためには、追加データフィールド(タグ62)の中に、有効期限や一度しか使えないワンタイムトークン、電子署名が付与されたオーダーIDなどを組み込む手法が有効です。これにより、万が一QRコードの画像が第三者によって撮影・拡散されたとしても、有効期限切れや署名検証の失敗によって不正な決済をシステム側で確実にブロックすることが可能になります。 なお、日本国内の統一規格であるJPQRは、このEMVCoの枠組みに準拠しつつ、複数の決済サービス事業者が一つのQRコードを共用できるように、国内での運用に必要な最小限のデータ項目やルールを定めたものです。そのため、店舗名などに日本語のような非ASCII文字が含まれる場合も想定し、文字コードはUTF-8で実装しておくことが、相互運用性を確保する上で安全な選択となります。

信頼性の担保:CRC計算からシンボル化、そして安全な運用へ

QRコードの実際の生成プロセスは、大きく分けて三つの段階を踏みます。第一段階は、前述のTLV構造に従ってペイロード文字列を構築する作業です。第二段階は、構築した文字列全体の整合性を保証するためのCRC値を計算する工程。そして第三段階が、完成した文字列を最終的にあの白黒の二次元シンボルへと変換(エンコード)する処理です。

まず、ペイロードの構築では、定められた順序で各TLV要素を連結していきます。この時、末尾に追加するCRC(タグ63)については、値の部分を一旦「0000」のような仮の値で埋めておき、「63040000」という形で文字列を完成させます。次に、この仮の値を含んだペイロード全体のバイト列に対して、「CRC-16/CCITT-FALSE」という標準的なアルゴリズムを用いてチェックサムを算出します。そして、計算結果として得られた4桁の16進数(大文字)を、先ほど仮置きした「0000」の部分と置換することで、ペイロード文字列が最終的に完成します。決済アプリは、QRコードを読み取った際に、全く同じ手順でCRC値を再計算し、ペイロードに格納されているCRC値と一致するかを比較します。もし一致しなければ、データが途中で何らかの理由により破損または改ざんされたと判断し、決済処理を中断します。ただし、CRCはあくまで伝送誤りや偶発的なデータ破損を検出するための整合性チェックであり、悪意ある改ざんを完全に防ぐ暗号学的な安全性を保証するものではない点には注意が必要です。そのため、特に動的コードでは、短い有効期限(TTL)やワンタイム参照番号、電子署名付きトークンといった他のセキュリティ技術と組み合わせることで、意図しない再利用やなりすましといった脅威に対抗します。

ペイロード文字列が完成すると、次はいよいよそれをQRシンボルへ変換する工程に移ります。この処理は、国際規格ISO/IEC 18004(日本ではJIS X 0510)に厳密に基づいて行われます。具体的には、まず文字列の特性(数字のみ、英数字、バイナリなど)に応じて最適なエンコードモードを選択し、データをビット列に変換します。続いて、コードの堅牢性を決定する「誤り訂正レベル」を選択し、冗長な訂正ビットを付加します。このレベルはL(約7%)、M(約15%)、Q(約25%)、H(約30%)の4段階があり、レベルが高いほどコードの一部が読み取れなくなってもデータを復元できる確率が高まりますが、その分コードの図形が複雑化・巨大化します。一般的な決済用のQRコードでは、印刷の視認性と堅牢性のバランスを考慮してMまたはQレベルが選ばれることが多いです。最後に、生成されたシンボルが見やすいパターンになるよう、複数のマスク処理候補の中から最も評価指標の良いものを選択して、最終的なQRコードが完成します。ペイロードのデータ量が大きくなりすぎると、コードのドットが細かくなり、低性能なカメラや遠い距離からの読み取りが困難になるため、設計段階で冗長な情報を極力削ぎ落とし、全体のデータ量を数百バイト以内に収めることが実務上の重要なポイントとなります。

セキュリティ運用の観点では、静的コードに金額を固定するか否かの判断が重要です。金額を固定すれば、利用者の入力ミスによる過少払いを防げますが、価格改定や割引に対応するたびにコードを再印刷する手間が生じます。動的コードであれば常に正確な金額を反映できますが、コード生成とサーバー上の注文状態を同期させる仕組みが不可欠です。また、物理的なセキュリティ対策として、既存のQRコードの上に偽のコードを貼り付ける「オーバーレイ攻撃」への警戒も必要です。対策として、利用者に店舗名の目視確認を促すUI設計、ブランドロゴや背景デザインの透かしを入れる工夫、そして定期的な掲示物の点検・差し替えなどが挙げられます。システム側では、追加データに含まれるオーダーIDとサーバー側の未決済注文リストを照合し、同一注文の二重払いや期限切れの決済リクエストを確実に拒否するロジックを実装することが極めて重要です。

このように、QRコード決済の生成技術は、標準化されたデータ構造を忠実に組み立て、整合性チェックを正しく計算し、用途に応じた誤り訂正と表示・印刷の物理的条件を満たすという、複数の技術要素が精密に組み合わさることで成り立っています。そして、その技術基盤の上に、現場の運用ノウハウや多層的なセキュリティ対策を重ねていくことで、初めて一枚の紙切れからでも、誰もが安心して利用できる、確実で拡張性の高い決済体験が提供されるのです。

RELATED ARTICLES

Most Popular

Recent Comments