こんにちは。スマートバンクでサーバーサイドエンジニアをしている mitani です。先月こっそりとB/43のタイムラインに表示される店舗名表示をマイナーチェンジしていたのでご紹介します。
早速ですが、みなさんはクレジットカードやプリペイドカードの明細を見たときに購入した店舗名の表記がバラバラで「ん? 🤔」っとなったことはないでしょうか?例えば下の画像のように PAYPAY
が全角表記な一方でUBER
は半角表記になっていたり、ツーハッチ
が半角カナになってると思いきやフアミリーマート
のように全角カナのお店もあったりと…. いろんな半角・全角の表記ゆれを見かけたことがある人も多いかと思います。
このような決済店舗名は、我々のようなカード発行会社で管理しているものではなく、店舗が契約しているアクワイアラ側に登録されており、オーソリゼーション(以下:オーソリ)とクリアリングという決済処理時に送られてくるデータの中に含まれています。その表記方法が各社毎に決まっているため、データが集まるカード発行会社側で加工してキレイに表示する必要があります。
オーソリとクリアリングといったカード決済システムの仕組みについてはこちらの記事で詳しく紹介していますので、ぜひご覧ください🙌
オーソリとクリアリングに含まれる店舗情報
店舗情報がどのようにデータに含まれているのか紹介します。下記の図のように、カード決済時にはオーソリとクリアリングの2種類のデータがそれぞれのタイミングでカード発行会社に送信されます。
オーソリ電文
オーソリはカード利用時にリアルタイムで送信され、電文には以下の情報が含まれています。
- MCC(Merchant Category Code)
- 店舗の業種を表すコードで、B/43の支出カテゴリはMCCをベースに振り分けています
- 加盟店ID
- アクワイアラと契約している加盟店を識別するID
- 加盟店端末ID
- 決済した店舗の決済端末を識別するID
- 加盟店英字名称
- 決済した店舗が属する加盟店の名称
オーソリの加盟店名称は半角英数字で送信されます。そのため、この時点でタイムラインに表示される店舗名は半角英数字のまま表示されています。
クリアリング電文
オーソリの数日後にクリアリングという売上データが送信され、電文には以下の情報が含まれています。
- 加盟店ID
- アクワイアラと契約している加盟店を識別するIDだが、オーソリと一致しないケースも有る
- 加盟店英字名称
- 決済した店舗が属する加盟店の半角英数字の名称
- 加盟店カナ名称
- 決済した店舗が属する加盟店のカナの名称
- 加盟店漢字名称
- 決済した店舗が属する加盟店の漢字の名称
クリアリングにはオーソリにはなかったカナと漢字の名称が含まれています。B/43ではオーソリで口座から残高を引き、タイムラインにオーソリの半角英数字名称で決済履歴を作成しています。その後、クリアリングが届いたタイミングで漢字名称でタイムラインの店舗名を書き換えることで決済店舗をわかりやすく表示しています。
多くのカード発行会社で同じような方法をとっていると思いますので、決済履歴をみたときに店舗名が英語表記から日本語表記に変わるのには、このような背景があります。また、海外決済店舗の場合にはクリアリングにカナ/漢字名称が入っていないため、漢字名 > カナ名 > 英字名称の順で店舗名を表示しています。
表記揺れが発生しているのはカナ・漢字名称なので、タイムラインをキレイに表示するにはクリアリングに含まれる店舗名を加工する必要があります。
店舗名の表記揺れパターン
クリアリングに含まれる加盟店漢字名称は大きく分けて以下のパターンに分かれています。
全角英語表記
- AMAZON.CO.JP
- PAYPAY*店舗名
- Suica(GooglePay)
- NETFLIX.COM
半角カナ表記
- コ-ク オン ペイ
- ポコチヤ
- ウォルトジャパン
- コミックシ-モアサクヒンポイント
半角カナになっているものは、加盟店漢字名称が空白で送られ、加盟店カナ名称に店舗名が含まれているケースが多いです。
促音・拗音
- フアミリ―マ―ト
通常の大文字と促音(っ)・拗音(ゃ/ょ/ゅなど)かどうかはシステム的には判定できないため、ファミリーマートなどの有名な店舗のみ辞書を作成して変換しています。
連続空白
UBER *EATS
対処方法と統一ルール
上記の表記揺れに対応するため、タイムラインを表示する際にDBから読み込んだ店舗名をリアルタイムで変換して表示しています。
表示ロジック
- 電文のうち漢字名 > カナ名 > 英字名称の優先順位で表示する名称を選ぶ
- 特定の加盟店の場合は辞書に従って変換
- 空白削除
- 英語数字は半角に統一
- カナは全角に統一
今では以下のような表示に変わっています。
今後について
現在は電文のデータを個別に直接修正していますが、将来的には店舗マスタのようなデータベースを作っていきたいと考えています。名称をタイムライン表示時にリアルタイムで修正しているのも将来的に店舗マスタを実装したときに楽に移行できるように簡易的な実装にしています。
データベース化することで以下のような仕様に対応できる可能性が生まれます。
- オーソリ時点で漢字表記の店舗名を表示する
- Amazonなど複数の店舗表記揺れを統一できる
- Amazon.co.jp / Amazon Download / etc…
- 店舗ごとに特定のアイコンを表示する
- 地図情報など店舗ごとの付属情報を追加する
- サブスクなど定期購入系の店舗を認識する
さいごに
自分自身、B/43でカード決済システムに携わるようになって初めてクレカの決済履歴が半角カナになっていたり、表記揺れが起きてしまう理由について知りました。また、このエントリでは紹介できませんでしたが、店舗マスタを作るための店舗情報の整備は思った以上に複雑で、かんたんには構築できそうにありません。しかし、独自の決済システムを作っていくのは難しいながら、VisaやMastercardといった古くから長く運用されている仕組みを理解して、よりユーザフレンドリーになるよう実装していく楽しさがあります。
次回のエントリではそういった決済システムならではの複雑性やチャレンジングな箇所について紹介できたらなと思います!
スマートバンクでは一緒に B/43 を作り上げていくメンバーを募集しています!
カジュアル面談も受け付けていますので、お気軽にご応募ください 🙌