デジタル会員証の作り方 ジム・整体院のLINEとウォレット
ジム・ピラティススタジオ・整体院の
この
この
この
Apple、
デジタル会員証は、作る前に3つの列をそろえる
会員証の
| 列 | 中身 | 理由 |
|---|---|---|
| 会員ID | M0001 のような、 |
電話番号は |
| プラン | 月4回、 |
受付で |
| 状態 | 有効、 |
会員証に |
状態のC0001 の
4つの作り方を比べる
会員証の
| 1. 会員専用の |
2. LINEミニアプリ |
3. Apple Wallet・Googleウォレットの |
4. LINE公式アカウントの |
|
|---|---|---|---|---|
| 会員が |
メールか |
LINEの |
スマホの |
LINEの |
| 会員を |
ログイン用の |
LINEの |
パスの |
LINEアカウント |
| 店が |
Webページと |
LINE Developersの |
Appleは |
LINE公式アカウント |
| 状態を |
開く |
開く |
パスの |
店の |
| 通信が |
開けない |
開けない |
端末に |
LINEを |
| 会員証に |
向く | 向く | 向く | 向かない |
作り方1. 会員専用のWebページに、会員IDとQRコードを出す
いちばん
決めて
- リンクは
推測できない :会員IDを文字列にし、 期限を 付ける そのまま URLに 入れると、 番号を 変えるだけで 他の 人の ページが 開けてしまいます。 リンクには ランダムな 文字列を 使い、 一定の 期間で 切れるようにします。 切れたら、 会員が 自分の メールアドレスか LINEから 新しい リンクを 受け取れるようにします。 - ページは
開く :ページのたびに サーバーから 状態を 読む 中に 状態を 書き込んで おかず、 表示の たびに 台帳 (システム)の 今の 値を 出します。 - ホーム画面に
置いて :受付のもらう 前で リンクを 探す 時間を なく すため、 初回に ホーム画面への 追加を 案内します。
LINEで
作り方2. LINEミニアプリ(LIFF)の会員証
LINEヤフーの
会員証と
- LINEの
ユーザーIDと :初めて会員IDを 結ぶ 表を 1つ 持つ 会員証を 開いた ときに、 入会の ときに 渡した 番号や、 作り方1の リンクで 一度だけ 結び 付けます。 以後は、 LINEで 開けば 自分の 会員証が 出ます。 - サーバーでは、
LIFFが :LINEの出した トークンを 確かめてから 会員証を 返す 資料では、 ユーザー情報を サーバーで 使う 場合は、 liff.getIDToken()で取った IDトークン (または liff.getAccessToken()のアクセストークン)を サーバーに 送り、 サーバーで LINEプラットフォームに 検証させるよう 書かれています (IDトークンは POST /oauth2/v2.1/verify)。liff.getProfile()などで取った プロフィールの 中身を、 そのまま サーバーに 送らないようにとも 書かれています。 画面から 送られてきた 「ユーザーID」を そのまま 信じて 会員証を 返す作りにはしません。
チャネルのliff.init() の
作り方3. Apple Wallet・Googleウォレットのパス
ウォレットの
Apple Wallet
Appleのpass.json、manifest.json)と、signature)を.pkpass の
- パスの
元に なる ファイル ( pass.jsonと画像)を 作る - Apple Developerの
アカウントの 「Certificates, Identifiers & Profiles」で、 Pass Type IDを 作る - その
Pass Type ID用の 署名の 証明書 (Pass Type ID Certificate)を 作る manifest.jsonに署名し、 まとめて .pkpassにする
署名のPASS_CERT_PATH、PASS_KEY_PATH)でpass.json の teamIdentifier も、
pass.json のdescription、formatVersion、organizationName、passTypeIdentifier、serialNumber、teamIdentifier のstoreCard(店舗カード)generic(一般)などの
{
"formatVersion": 1,
"passTypeIdentifier": "pass.com.example.membership",
"teamIdentifier": "ABCDE12345",
"serialNumber": "M0001",
"organizationName": "〔店名〕",
"description": "〔店名〕会員証",
"generic": {
"primaryFields": [{ "key": "member", "label": "会員ID", "value": "M0001" }],
"secondaryFields": [{ "key": "plan", "label": "プラン", "value": "月4回" }]
},
"barcodes": [{
"format": "PKBarcodeFormatQR",
"message": "x7Kp2QmN9aRtW4sB",
"messageEncoding": "iso-8859-1"
}]
}message には、messageEncoding に iso-8859-1 をserialNumber には
Googleウォレット
Googleの
汎用パスのcardTitle(パスのheader(パスのbarcode、rotatingBarcode、validTimeInterval(有効なstate(状態)などの
作り方4. LINE公式アカウントのショップカードは、会員証にしない
LINE公式アカウントの
会員証に出す項目を決める
会員証に
| 項目 | 出すか | 決め方 |
|---|---|---|
| 会員ID | 出す | 台帳の |
| 名前 | 出す | 姓だけ、 |
| プラン | 出す | 「月4回」 |
| 状態 | 出す | 有効か |
| 有効期限 | 回数券や |
月ごとに |
| 残りの回数 | 回数券の |
正本は |
| QRコード | 出す | 中身は |
| 顔写真 | 会員の |
受付の |
| 体の |
出さない | 受付で |
顔写真は、会員の画面ではなく受付の画面に出す
会員の
受付が
受付での確かめ方
受付の
| 段階 | 受付の動き | 向く店 | 弱いところ |
|---|---|---|---|
| 目で見る | 会員の |
受付が |
画面の |
| 読んで |
受付の |
会員が |
受付の |
読んで
- 名前と
写真 (預かっている 場合) - 今の
状態 (有効、 休会中、 支払いの 確認中、 退会など) - 今日
使えるか (プランと 残りの 回数から 決めた 結果)
照合した
無人の
会社サイトの
休会・退会・決済失敗のときに、会員証の状態を変える
会員証の
| きっかけ | 台帳の状態 | 会員証の |
受付の動き |
|---|---|---|---|
| 休会の |
休会中 |
「休会中 |
予約・入館は |
| 休会の |
有効 | 「有効」に |
ふだん |
| 退会を |
退会の |
最後の |
最後の |
| 最後の |
退会 | 「退会済み」。 |
再入会の |
| 月会費の |
支払いの |
「お支払いの |
店で |
| 再請求が |
有効 | 「有効」に |
ふだん |
決済の
ウォレットのパスは、端末の上の表示が遅れることを前提にする
作り方1と
- Apple Wallet:Appleの
資料では、 pass.jsonにwebServiceURLとauthenticationTokenを入れると、 更新できる パスに なります。 パスを 入れた 端末が 店の サーバーに 登録され、 情報が 変わったら 店の サーバーが 端末に プッシュ通知を 送り、 端末が 新しい パスを 取りに 来る 流れです。 通知は、 パスに 署名したのと 同じ 証明書と 秘密鍵で 送り、 本番の 環境でしか 動かないとされています。 パスには、 使えなくなった ことを 示す voided、有効期限の expirationDateの項目も あります。 - Googleウォレット:汎用パスの
オブジェクトの stateは、ACTIVE、 COMPLETED、 EXPIRED、 INACTIVE などの 値を とり、 アプリでの パスの 見せ方を 決めるのに 使うと されています。 validTimeIntervalの期間が 過ぎると、 パスは 期限切れと して 扱われます。
どちらも、
画面の写真の使い回しを防ぐ
会員証の
防ぎ方1. QRコードの中身を短い間隔で変える
QRコードの
Googleウォレットには、
作り方1と
防ぎ方2. 読み取ったQRコードを、サーバーで照合する
QRコードには
この
- 退会した
人や 休会中の 人の QRコードは、 状態が そのまま 出る - 同じ
QRコードで、 同じ 日に 2回目の 受付が あったら 知らせを 出せる - 写真を
預かっていれば、 別の 人が 見せている ことに 受付が 気づける
防ぎ方1だけでは
顧客台帳とのつなぎ方
会員証は、
| 表 | 列 | 何に使うか |
|---|---|---|
| 会員と |
会員ID、 |
どの |
| 照合の記録 | 日時、 |
来院の |
スプレッドシートの
公式LINEと
やってはいけないこと
デジタル会員証を
ポイント1. 会員証の側に、別の状態を持つ
ウォレットの
ポイント2. QRコードに、会員IDや電話番号をそのまま入れる
読み取れば
ポイント3. 会員証の画面に、顔写真や施術の記録を出す
写真ごと
ポイント4. 署名の証明書や秘密鍵を、画面のコードやリポジトリに置く
Apple Walletの
ポイント5. ショップカードを会員証の代わりにする
ショップカードは
会社サイトの
会員証と表で足りなくなる線
次の
| 起きている |
手作業で |
つなぐと |
|---|---|---|
| 休会や |
台帳と |
台帳の |
| 受付で、 |
画面の |
QRコードを |
| 決済が |
決済の |
会員証に、 |
| 受付の |
来院を |
照合した |
| 無人の |
受付が |
入館の |
| 2店舗目を |
台帳と |
店を |
自社で
使い始める前のチェックリスト
会員に
- 台帳に
会員ID・プラン・状態の 3列が あり、 状態の 名前を 決めた - 休会・退会・決済失敗の
ときに、 状態を だれが いつ 変えるかを 決めた - 会員証は
台帳の 状態を 読むだけで、 別の 状態を 持たない 作りに した - 会員証に
出す項目を 決め、 顔写真や 施術の 記録は 出さない ことに した - QRコードには、
会員IDや 電話番号ではなく、 サーバーで 照合する 文字列を 入れた - 受付で
「目で 見る」か 「読んで 照合する」かを 決め、 照合する 端末を 用意した - ログイン用の
リンクには 期限を 付け、 切れた ときの 受け取り直しの 方法を 決めた - LINEミニアプリでは、
IDトークンを サーバーで 検証してから 会員証を 返す作りに した - ウォレットの
パスの 署名の 証明書や 鍵を、 環境変数で 渡し、 リポジトリに 置いていない - 架空の
会員を 数人作り、 有効→休会中→有効→退会の 順に 状態を 変えて、 会員証と 受付の 画面が 変わる ことを 確かめた - スマホの
機種を 替えた とき、 LINEの 引き継ぎを しなかった ときの 再発行の 手順を 決めた
自社でやる場合と、任せる場合
自社で
任せる
出典(一次情報)
Apple、
- パスは
署名した .pkpassであること、 Pass Type IDの 作り方、 Pass Type ID Certificateの 作り方、 manifest.jsonへの署名、 同じ 識別子と 通し番号の パスは 上 書きされる こと → Apple Developer 「Building a pass」 - パスの
元の ファイル ( pass.json、画像、 ローカライズ)の 構成 → Apple Developer 「Creating the source for a pass」 pass.jsonの必須の 項目、 storeCard・generic、barcodes、voided、expirationDate、webServiceURL、authenticationToken、sharingProhibited→ Apple Developer「Pass」- 更新できる
パスの 仕組み (端末の 登録、 プッシュ通知、 署名と 同じ 証明書で 送る こと、 本番の 環境でのみ 動く こと) → Apple Developer 「Adding a web service to update passes」 - 店舗カード
(会員カード、 ポイントカード)と ジムの 会員カードの 例 → Apple Developer 「ウォレットの 概要 」 - 「Certificates, Identifiers & Profiles」には
Apple Developer Program (または Enterprise Program)への 登録で 入れる こと → Apple Developer 「デベロッパアカウントの 概要 」(旧 「メンバーシップの 比較」の URLから 転送される ページ)。 teamIdentifierがApple Developer Programの アカウントの Team IDである こと → 上の 「Pass」 - 汎用パスの
用途の 例 (会員カード)、 発行の 要件 (発行者アカウント、 Google Cloudアカウント) → Google for Developers 「汎用パスの 概要 」 - 発行者アカウントの
登録の 手順 → Google for Developers 「Google Wallet API 発行者アカウントの 設定 」 - デモモードで
発行できる 相手、 ビジネス プロフィール、 公開アクセスの リクエストと 審査 → Google for Developers 「公開アクセスの リクエスト 」 - ローテーション バーコードの
目的、 TOTPの ペイロードの 例、 静的バーコードへの 切り 替えの 注意 → Google for Developers 「バーコードの ローテーション 」(変わる 間隔は英語版の 「typically every minute」) - 汎用パスの
オブジェクトの 項目 ( cardTitle、header、barcode、rotatingBarcode、validTimeInterval、state)→ Google for Developers 「GenericObject」 - 状態の
値 (ACTIVE、 COMPLETED、 EXPIRED、 INACTIVE) → Google for Developers 「State」 - LIFFの
概要、 LINEの ユーザーIDなどを 取得できる こと → LINE Developers 「LIFFの 概要 」 - LINEミニアプリは
LIFFの 上で 動く Webアプリである こと、 認証済と 未認証の 違い、 LINEミニアプリとして 作る ことの 推奨 → LINE Developers 「LINEミニアプリとは」 - ユーザー情報を
サーバーで 使う ときは IDトークンか アクセストークンを 送って 検証する こと、 プロフィールの 中身を サーバーに 送らない こと → LINE Developers 「LIFFアプリおよびサーバーで ユーザー情報を 」使用する
Apple Walletの
よくある質問
小さなジムや整体院のデジタル会員証は、何から始めればよいですか?
顧客台帳に
LINE公式アカウントのショップカードを会員証の代わりに使えますか?
おすすめしません。
Apple WalletやGoogleウォレットの会員証は、休会や退会のときに消せますか?
Apple Walletでは、
会員証の画面をスクリーンショットして他の人に渡されるのは防げますか?
画面の
会員証に顔写真は入れたほうがよいですか?
小さな
