背景
- 小売業の社内システムで、「レジでピッてしたらシステムに売却済みにしてほしい」と言われた
- 国内で API/webhook が生えてるPOSはスマレジだけっぽい
- Square ありそうだけど、スマレジに比べると導入ハードルが高そう
記事の内容
- スマレジの POS 機能の API/Webhook を使えるようにするための手順
- 実装の詳細は書いてないよ
前提
スマレジのシステム的なもの
- 管理画面: PCのブラウザから、商品登録や店舗の登録、売上管理をやる画面
- スマレジ・デベロッパーズ: 開発者用アカウントにログインして、API や Webhook 周りの各種設定をやるためのサイト
- スマレジアプリ: 会計や精算といった店舗業務をやるためのスマホアプリ
手順
1. スマレジ・デベロッパーズのアカウントを作る
- API や Webhook を使うためには、スマレジ本体とは別の開発者用アカウントが必要になる
- 開発者用アカウントは「スマレジ・デベロッパーズ」でつくる
- メアドとパスワードを設定してすぐ登録できる
この後の大まかな流れとしては、デベロッパーズの中で「アプリ」というものをつくって、アプリに発行される client key/secret を使って API の認証をしたり、Webhook endpoint を設定したりする
2. スマレジ・デベロッパーズで「アプリ」を作る
- アプリにはプライベートアプリとパブリックアプリがある
- 「自分の店だけで使いたい」というユースケースならプライベートアプリにすると審査もいらなくてスムーズ
- 逆にいろんな人に使ってほしい・サービスでお金を取りたい場合はパブリックにするけど、審査が必要
- アプリごとにクレデンシャルや Webhook endpoint が設定できる
- API・Webhook を使うための手順は後述するが、基本的にアプリの中で設定すれば OK

3. サンドボックス環境にログイン
- デベロッパーズのアカウントを作ると、実際の POS 管理画面 (web) や iPhone/iPad のレジアプリを使うための「サンドボックス環境」が払い出される
- 別途スマレジ本体でアカウント登録は不要
- サンドボックス環境は契約IDが
sb_で始まる - web の管理画面は https://accounts.smaregi.dev/login から、デベロッパーズの方と同じクレデンシャルでログインする
- 「レジで商品をスキャンする」は、バーコードリーダーがなくても iOS アプリでバーコードを読んだり、商品一覧から選択して会計まで進めることができる
- サンドボックス用の iOS アプリはスマレジアプリをダウンロードした後にデベロッパーズのクレデンシャルでログインすれば使える
- デベロッパーズの方にある QR コードをスキャンしても OK (アプリではログアウトした状態)
- 設定 > アプリ環境切替

web の管理画面とスマホアプリが用意できたら実機テストの準備は完了
4. API/Webhook の設定 (ざっくり)
API を使う場合に設定すること
- 環境設定タブ: 開発・本番環境の client key/secret を取得・設定
- client secret は初めて発行する場合でもボタンが「再発行」となっているが気にせず押して OK
- スマレジの API を叩くときにこの client key/secret を使って
- スコープタブ: API のスコープを設定
- e.g.
pos.products:read
- e.g.

Webhook を使う場合に設定すること
- 環境設定タブ: 開発・本番環境の Webhook エンドポイント
- Webhook タブ:
- 「利用する」を ON にする
- (推奨) スマレジから送ってもらうカスタムヘッダー
- なくても動くけどセキュリティ的にあった方が良い...と思っている
- 複数設定できるので環境別にヘッダーの値をわけることも可能
- 送信するイベント e.g. 取引

逆にあんまり関係ない設定
- 環境設定タブ
- アプリの URL
- 利用者契約通知先 URL
- リダイレクト URI
5. 開発する
- レファレンスはここ: https://developers.smaregi.dev/platform-api-reference/
- (感想) 取引の Webhook を処理したかったけど、レファレンスを読むだけだと ??? だったので、とりあえず dump するだけの endpoint を用意するとわかりやすかった
- サンドボックス環境で動かしたもの (e.g. スマホアプリからの取引) デベロッパーズ側の開発環境の設定が使われる
- 本番環境で動かすためには次の手順が必要
- スマホアプリを使うと「レジでピッてやる」ができる。使い方は後述
6. 本番環境のアクティベート
- 本番環境の POS を使いたい場合、まずスマレジ本体の方に申し込みが必要
- ここは自分でやってないので割愛するけど、無料プランがあるので0円で始められそう
- デベロッパーズ側では、本番環境の契約IDってやつを「アクティベート」する必要がある
- 契約IDは、画面の左上に出てくる (デベロッパーズ・管理画面どっちも)
- ↓の画面に契約IDを入れると、お店側で登録したメールアドレスにメールが飛ぶので、メールにある承認リンクをクリックする必要がある
- e.g. デベロッパーズに
developer@example.invalidで登録してて、お店側はstore@example.invalidでログインしていたら承認メールは後者に行く
- e.g. デベロッパーズに

スマレジアプリ入門
⚠️ 開発するためのちょー基本的なことしか書いてないので、店舗業務の参考にはしないでね
前提
- スマレジのアプリを使うと、実際に店舗スタッフのように商品のバーコードをスキャンしたりお会計をしたりできる
- 商品の入力方法は3つ
- 商品一覧から選ぶ: テストはこれが楽
メイン画面

アプリを開くとこの画面が出てくる。メニューからやりたいことの画面に遷移する。
よく使うのはこの3つ↓
- 販売業務: 商品を入れてお会計をする。店舗スタッフがレジを打つときに使う画面
- 取引履歴: 名前の通り。取引をキャンセルしたいときもここからやる
- 設定: ログイン/ログアウトとか、商品をどうやって入力するか (バーコードスキャン、一覧から選択、手動でコード入力) の設定とか
商品入力→お会計
メイン画面から販売業務をタップするとこの画面になる。真っ白なので一瞬焦るが、画面下部のナビゲーションバーの左から2番目のアイコンを選ぶと、商品のコード入力やバーコードスキャンができる。商品の入力方法は設定画面から選べて、バーコードスキャン (カメラを使う)・商品リストから選択・手動でバーコード入力の3つの方法がある。テスト用には2番目が楽。



会計に進む場合は、合計金額と数量が表示されているバーをタップする。「預り金」の部分をタップすると金額が入力できるので、合計金額以上の数字を入力する。

割引・値引き
割引・値引きは商品単位と会計単位で設定できる (値引き=固定の金額を引く、割引は10%OFFみたいな率を設定) 。
商品単位:

会計単位:

データ同期について
実はスマレジの管理画面で商品を登録しても、すぐにレジで打てるようにはならない。スマレジアプリの方には「データ同期」という概念があって、商品を登録・更新してから次のデータ同期がアプリ側で走らないと変更が反映されない。
データ同期は自動でも走るし、設定画面から手動で最新データを引っ張ることもできる。設定 > データ > データ管理 で進むと、「店舗」と「商品」それぞれの同期時刻が表示されるので、更新したい方の行をタップする。


まとまってない tips
取引 Webhook event の payload
payload は↓のようなかたちで、実は1取引1 event ではなく、1 event につき複数の取引が transactionHeadIds に含まれうる。
{ "contractId": "string", "event": "string", "action": "created", "transactionHeadIds": [ "1", "10", "12" ] }
取引 の action とは
取引の action (操作の種類) には以下のものがある。
- created: 登録
- edited: 更新
- canceled: 取消
- disposed: 返品取消
- bulk-update: 一括更新
- bulk-deleted: 一括削除
雑多に調べたことを書くと、
- edited: 金額や商品の変更はなくて、タグや客層といったメタデータの変更
- 感想: 1取引 ID x 1 action で複数メッセージがありうるので dedupe がむずかしそう
- 今回使わなかったが、処理する必要があれば out-of-order とかもありえそうなので、edited の Webhook が来たら API で取引の最新情報を取得するアプローチが良さそう?
- ただ、一方で Webhook のイベントごとに API を叩くのは推奨されていないので (rate limit がある)、バッファしたり工夫が必要そう
- canceld VS disposed:
- canceled (取消) は、同じ取引を編集して取引をなかったことにする
- disposed (返品取消) は、消込の取引を作成して取引をなかったことにする
- 嬉しいポイント: 店舗ごとの設定で、「返品取消のみ」にすることが可能。システム的にはこれが楽なので今回はこの設定にした
- created, disposed は取引あたり一回しか起きないイベント
- 明示的に docs にあったわけではないが、UI とロジック?的にそうだと思う

商品のバーコード
今回、ビジネス要件が「レジでピッてしたら社内システムに反映してほしい」というものだったので、バーコードについても少し調べた。
- バーコードのしくみ:
- バーコードの実態はただの番号 (英数字が含まれる場合もある)
- バーコードリーダーピッてすると、番号が Bluetooth 等を経由して POS アプリ側に勝手に入力される ... というのがスキャンのしくみ
- スマレジの運用例:
- スマレジで、「商品コード」を00001に設定した商品を登録
- ラベルプリンター (スマレジのやつがある) で、バーコードを印刷
- バーコードが張られた商品をスキャンすると、スマレジアプリの明細にその商品が追加される
- つまり、バーコードの番号 = スマレジの商品コード
- バーコードには種類があって、社内独自の番号を採番するやり方と、JAN コードを使うやり方がある
- JAN コードは世界共通の識別番号で、申請が必要
- なので、自社内で売るだけなら基本的に前者のやり方で良いはず (000001 とか)
- バーコードには規格もあって、規格によって「数字だけ使える」「アルファベットなど数字以外も使える」という点が違う
- 一番汎用的なのは JAN コードで使われている「EAN 規格」で、これは数字だけ使える
- バーコードリーダー・ラベルプリンターが使いたい規格に対応しているかの確認が必要
- (自分は数字だけが一番丸いと思ったのでハイフンとかアルファベットは使わない自動採番にした)
周辺機器
- バーコードリーダーを買いたい場合、スマレジストアから買わないとスマレジの保証外になると書いてあったものの、リーダー1台3万くらいした
- とはいえ、スマホアプリがあればバーコードスキャンもできるのでテストの範疇ではリーダー不要
- スマレジで便利にバーコードのラベルを商品を貼りたい場合、スマレジのラベル印刷用アプリとラベルプリンターの2つが必要。アプリが月ごとに課金するタイプなので微妙な気持ちになった。節約したかったらラベルプリンターだけ用意して、印刷はスマレジから商品の CSV をダウンロードしてごにょごにょすればできそう
おすすめバーコードスキャンのテスト方法
- スマホに一般的なバーコードスキャンアプリを入れる (スキャンすると番号を出してくれるやつ)
- 机の周りにありがちな物体をスキャンして、番号を取得 (ガムとかのど飴とか)
- スマレジで商品登録をして、商品コードをこのバーコードに設定する
→ これで、「レジでピッてしたら自分のシステムに Webhook が飛ぶ」が試せる
アプリまわり
- パブリックアプリ (いろんな人に使ってもらったり収益化できたりする) の場合は審査が必要
- プライベートは不要
- サンドボックの契約ID (sb_ で始まるやつ) をプライベートアプリでアクティベートしようとするとエラーになる
参考
デベロッパーズアカウント(開発環境)でアプリの検証をする – スマレジ・ヘルプ
おわりに
バーコードスキャンのしくみすらよくわかってないので、「レジでピッてしたらシステムに飛ばす」の環境を準備するまでが大変だった






