Square Terminal 連携リファレンス(V1)

  • 調査日: 2026-10-29
  • データ時点: 2026年10月(Square Developer 公式ドキュメント)
  • 親: README.md / 設計: design.md

本ドキュメントは、V1 で使う Square API の範囲と、実装時に踏みやすい落とし穴をまとめたもの。


1. できること / できないこと

できる できない
外部POSからの決済(Terminal API) Terminal への自作アプリのインストール
明細付きチェックアウト表示(order_id + show_itemized_cart) 外部バーコードスキャナの接続
明細付きレシート(紙・デジタル) 現金決済
返金(Interac 以外は Refunds API) ペアリング中の外部プリンタ接続
日本向け PayPay QR / 電子マネー 1チェックアウトの分割決済(アプリ側で複数回に分ける)

Terminal は「カード読み取り+画面表示+印刷」の端末であり、POS ではない。商品選択・在庫・カートは外部(本設計では PWA + BE)が持つ。 現金は Terminal では扱えない。Payments API で記録する(§3.4)。


2. ペアリング

手順

  1. POST /v2/devices/codes(Devices API)
    • device_code.product_type = "TERMINAL_API"
    • device_code.location_id = {locationId}
    • device_code.name = "Counter 1" など
  2. 返却された 6文字の device code を端末に入力(5分以内)
  3. 端末がサインイン → device.code.paired webhook
  4. DeviceCode.device_id を保存(以降のチェックアウトで使用)

注意

  • Dashboard で作った device code は Terminal API では使えない。必ず CreateDeviceCode で発行する
  • device_id は「端末底面のシリアル番号」と対応する。API では device:995CS397A6475287 のように接頭辞付きで返る場合がある
  • チェックアウトの device_id には シリアル番号を直接指定してもよい
  • 端末は同時に1つの POS アプリとしかペアリングできない。Square POS(スタンドアロン)との併用は不可
  • ペアリングを解除するには端末側でサインアウトする

端末IDの確認方法

方法 内容
端末本体 底面/背面のシール、設定 → Hardware → General → About Terminal
Dashboard Accounts & Settings → Devices(ペアリング状態)
API GetDeviceCode / ListDeviceCodes の device_id
API GET /v2/devices(ListDevices)/ GET /v2/devices/{id}(GetDevice)
  • ListDevices は merchant スコープ(そのアカウントの端末のみ)で beta
  • シリアルとの照合は attributes.manufacturers_id を使う
  • 端末IDを自分で組み立てず、API の返値を使う

3. 注文 → チェックアウト

3.1 Order の作成(Orders API)

POST /v2/orders
{
  "idempotency_key": "{orderId}",
  "order": {
    "location_id": "{locationId}",
    "line_items": [
      { "catalog_object_id": "{variationId}", "quantity": "2" }
    ]
  }
}
  • line_items[].catalog_object_id には バリエーションID(CatalogItemVariation)を指定する
  • 自由入力の明細にすると「カスタム金額」扱いになり、商品別集計・在庫減算から外れる
  • order.state が OPEN であること
  • レスポンスの order.total_money が確定額(税込み)

3.2 Terminal Checkout の作成

POST /v2/terminals/checkouts
{
  "idempotency_key": "{orderId}-{attempt}",
  "checkout": {
    "amount_money": { "amount": 2400, "currency": "JPY" },
    "reference_id": "{orderId}",
    "note": "注文 {orderId}",
    "order_id": "{squareOrderId}",
    "device_options": {
      "device_id": "{deviceId}",
      "show_itemized_cart": true,
      "skip_receipt_screen": false
    },
    "deadline_duration": "PT2M"
  }
}
  • amount_money は Order の total_money と一致させる(autocomplete=true の前提)
  • show_itemized_cart: true は order_id があるときのみ有効
  • reference_id に自社の注文IDを入れる(当社IDとSquare IDの対応管理用)
  • deadline_duration は省略可(既定 5分)。短くして放置を防ぐ
  • Square Order は注文につき1回だけ作成(冪等キー = orderId)。checkout は試行ごとに作成(冪等キー = orderId-attempt)
  • 取消・拒否後の再試行では既存の Square Order を再利用する(再作成すると二重注文になる)

レスポンス / 状態

status 意味
PENDING 端末に届く前/受付
IN_PROGRESS 端末で処理中
COMPLETED 完了(payment_ids が入る)
CANCELED 取消・期限切れ
  • 完了時は必ず payment_ids を取得し、GET /v2/payments/{id} で status と amount_money を検証する
  • COMPLETED でも金額が一致するとは限らない(部分決済・チップ等)ため、実額を確認する
  • COMPLETED/CANCELED の checkout は30日で削除される。payment_ids は自前DBに永続保存する

3.3 Webhook

イベント 用途
terminal.checkout.created 作成確認
terminal.checkout.updated 状態変化(要)
payment.updated 決済確定(要)
catalog.version.updated カタログ再同期
device.code.paired ペアリング完了

署名検証

  • ヘッダ Square-Signature に Base64 の HMAC-SHA256 が入る
  • 計算対象は 通知URL + 生のリクエストボディ
  • 署名キーは Developer Console で取得(環境ごとに異なる)
  • 生ボディを使う(JSON パース後の再シリアライズでは検証できない)
  • event_id で冪等化する
  • CloudFront 経由で受ける場合、/webhooks/* はキャッシュ無効・全ヘッダー転送・ボディ素通しにする(署名検証のため)

3.4 現金(Terminal 外)

Terminal は現金を受け付けない。現金は Payments API で記録する。

POST /v2/payments
{
  "idempotency_key": "{orderId}-cash-{attempt}",
  "source_id": "CASH",
  "location_id": "{locationId}",
  "order_id": "{squareOrderId}",
  "amount_money": { "amount": 2400, "currency": "JPY" },
  "cash_details": {
    "buyer_supplied_money": { "amount": 10000, "currency": "JPY" }
  }
}
  • レスポンスの cash_details.change_back_money が釣銭
  • order_id を紐付けると、注文・在庫・レポートに反映される
  • PayOrder を使う場合は autocomplete=false(Payment.status=APPROVED にする)
  • ドロワーは API で開けられない。Square Terminal のドロワー対応は Square POS アプリ(スタンドアロン)の機能で、Terminal API モードでは自動開放されない。手動ドロワーか Square POS 併用で対応する
  • 返金は Refunds API / Dashboard で記録(現金の受け渡しは店舗)。端末ロックは不要(Terminal を使わない)

4. 日本固有の事項

項目 内容
通貨 JPY はゼロ小数。amount: 1000 は ¥1,000(×100 しない)
PayPay QR checkout.payment_type = "QR_CODE"。Terminal 6.58+、日本拠点、事業者申請が必要
電子マネー FELICA_ALL / FELICA_ID / FELICA_QUICPAY / FELICA_TRANSPORTATION_GROUP。Terminal 4.11+、事業者申請が必要
カード Visa / Mastercard / Amex / JCB / Discover / Diners(日本)
領収書 日本のアカウントでは領収書(ryoshusho)を印刷可能。Receipt Options 画面から
税 カタログの税設定に従う。order.total_money を正とする
3DS オンライン決済では必須。対面の Terminal 決済は対象外

5. Sandbox とテスト

基本

  • ベースURL:https://connect.squareupsandbox.com(本番は https://connect.squareup.com)
  • 認証情報・アカウントは本番と完全分離
  • 無料・API 呼び出し無制限・決済手数料なし
  • Sandbox のテスト加盟店アカウントは日本拠点も作成可能

制約

  • Devices API による実機ペアリングは不可(ハードは Sandbox で使えない)
  • Terminal API の シミュレート端末ID を使ってチェックアウトを再現する
  • 端末画面の UI(明細・レシート)は確認できない(自動完了)
  • Sandbox Dashboard は機能限定(領収書なし、返金発行不可 等)

シミュレート端末ID(Terminal checkouts)

device_id 挙動
9fa747a2-25ff-48ee-b078-04381f7c828f 成功(カード)
22cd266c-6246-4c06-9983-67f0c26346b0 成功+20%チップ
4mp4e78c-88ed-4d55-a269-8008dfe14e9 成功(Square ギフトカード)
19a01fbd-3dcd-4d9f-a499-a641684af745 成功(eMoney/FeliCa)
cae0ee02-f83b-11ec-b939-0242ac120002 成功(PayPay QR。Sandbox 拠点が日本であること)
841100b9-ee60-4537-9bcf-e30b2ba5e215 客がキャンセル
0a956d49-619a-4530-8e5e-8eac603ffc5e タイムアウト
da40d603-c2ea-4a65-8cfd-f42e36dab0c7 オフライン(未受信。取消可能)
  • 成功系は概ね $25 相当まで。テストは少額で行う
  • Sandbox の Location はアプリごとに1つ(Developer Console の Locations で確認)

テスト手順(推奨)

  1. Sandbox:カタログ → Order → Checkout → Webhook → 状態遷移
  2. 本番:実機ペアリング → 小額決済 → 明細表示 → レシート → Dashboard 反映

6. よくあるエラー

状況 検出 対応
端末が未接続・オフライン checkout が進行しない/PENDING のまま 端末の電源・Wi-Fi/Ethernet を確認。必要なら取消して再作成
端末が別処理中 checkout の作成・進行が失敗 先行処理の完了を待つ。CancelTerminalCheckout で解放
期限切れ checkout が CANCELED 新しい checkout を作成
カード拒否 端末にエラー表示、checkout 未完了 端末上で再試行、または取消→新規作成
ロケーション不一致 INVALID_LOCATION 等 アカウントの地域・location_id を確認
二重送信 既に COMPLETED 状態を確認し、新規作成しない
既に支払い済み Payment が存在 payment_ids を照合。返金は Refunds API
  • 実際のエラーは errors[].code を見る(API バージョンで変わる)
  • 完了済み checkout は再利用できない。状態確認 → 必要なら取消 → 新規作成の順
  • カード拒否時にいきなり新規 checkout を作ると、直前の決済が成立していた場合に二重課金になり得る。必ず Payment の有無を確認する
  • 取消は完了前のみ有効。完了後の返金は Refunds API(Interac 以外)

7. 運用上の注意

  • 端末ソフトウェアは自動更新される。更新中・再起動中は決済できないことがあるため、営業時間外の更新を前提に運用する(詳細は端末設定・公式サポートで確認)
  • 更新を受け取れるよう、電源を切らずにネットワーク接続しておく運用が望ましい
  • 1端末は同時に1チェックアウト。複数レジは端末ごとにペアリングする
  • 明細表示は「表示のみ」。金額の正は amount_money と order.total_money
  • レシートは端末内蔵プリンタ。ペアリング中は外部プリンタ不可

8. 参照