Square Terminal 連携リファレンス(V1)
本ドキュメントは、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. ペアリング
手順
POST /v2/devices/codes(Devices API)
device_code.product_type = "TERMINAL_API"
device_code.location_id = {locationId}
device_code.name = "Counter 1" など
- 返却された 6文字の device code を端末に入力(5分以内)
- 端末がサインイン →
device.code.paired webhook
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 で確認)
テスト手順(推奨)
- Sandbox:カタログ → Order → Checkout → Webhook → 状態遷移
- 本番:実機ペアリング → 小額決済 → 明細表示 → レシート → 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. 参照