Square Checkout APIを使ってみる

Square APIには、CheckoutAPIという注文決済用のAPIがあります。

このAPIは注文情報などを渡すと、Squareが用意してくれている決済画面（チェックアウト画面）のURLが生成されます。

生成されたURLを開くと、注文の確認とカード決済の画面が表示され、そこで必要な情報を入力して決済ができるという便利機能です。

## API Explorerで動作確認

簡単にSquare APIの動作を確認するために、API ExplorerというWEBツールが用意されているので、使ってみます。

### location IDを取得

Checkout APIを呼び出すのに、locationIDが必要になるので、Locations APIを使って取得します。

[Locations API\- Square API Reference](https://developer.squareup.com/reference/square/locations-api/list-locations/explorer)
![](https://i.gyazo.com/ef3c6e1109677ab0c7e3925fa53b769f.png)

### Checkout用URL取得

取得したlocationIDと、オーダー情報を入れてCheckoutAPIのCreate checkoutを呼び出すと、Checkout画面のURLを取得できます。

[Checkout API\- Square API Reference](https://developer.squareup.com/reference/square/checkout-api/create-checkout/explorer)
![](https://i.gyazo.com/5d8e40ed22ef6a944b9df053bf2ace3a.png)

```bash
curl https://connect.squareupsandbox.com/v2/locations/M513Y0SCF175A/checkouts \
  -X POST \
  -H 'Content-Type: application/json' \
  -H 'Square-Version: 2020-02-26' \
  -H 'Authorization: Bearer XXXXXXXXXXXXXXXXXXXX' \
  -d '{
    "idempotency_key": "testid-XXXX-XXX２",
    "order": {
      "order": {
        "location_id": "M513Y0SCF175A",
        "line_items": [
          {
            "name": "アイテム名",
            "quantity": "1",
            "base_price_money": {
              "amount": 100,
              "currency": "JPY"
            }
          }
        ]
      }
    },
    "ask_for_shipping_address": true
  }'
```

* idempotency_key : 注文用のユニークID
* location_id : 事前に取得しておいたlocation ID
* line_items : 注文アイテムの情報
   * name : アイテム名
   * quantity : 数量
   * base_price_money : 価格情報
      * amount : 金額
      * currency : 通貨
* ask_for_shipping_address : trueだとチェックアウト画面で住所を入力できる


レスポンスは以下のような情報が返ってきます。

```json
{
  "checkout": {
    "id": "CBASEKm_qJ3BeTG27SnbOzAkXBs",
    "checkout_page_url": "https://connect.squareupsandbox.com/v2/checkout?c=CBASEKm_qJ3BeTG27SnbOzAkXBs&l=M513Y0SCF175A",
    "ask_for_shipping_address": true,
    "order": {
      "id": "KMvhoORZBkKNnWP6szBtchATWe4F",
      "location_id": "M513Y0SCF175A",
      "source": {
        "name": "Sandbox for sq0idp-LUCLOPS6RjfQhSMSwHHPvw"
      },
      "line_items": [
        {
          "uid": "kj7Sl32wZYLyv34ppcka7B",
          "name": "アイテム名",
          "quantity": "1",
          "base_price_money": {
            "amount": 100,
            "currency": "JPY"
          },
          "variation_total_price_money": {
            "amount": 100,
            "currency": "JPY"
          },
          "gross_sales_money": {
            "amount": 100,
            "currency": "JPY"
          },
          "total_tax_money": {
            "amount": 0,
            "currency": "JPY"
          },
          "total_discount_money": {
            "amount": 0,
            "currency": "JPY"
          },
          "total_money": {
            "amount": 100,
            "currency": "JPY"
          }
        }
      ],
      "net_amounts": {
        "total_money": {
          "amount": 100,
          "currency": "JPY"
        },
        "tax_money": {
          "amount": 0,
          "currency": "JPY"
        },
        "discount_money": {
          "amount": 0,
          "currency": "JPY"
        },
        "tip_money": {
          "amount": 0,
          "currency": "JPY"
        },
        "service_charge_money": {
          "amount": 0,
          "currency": "JPY"
        }
      },
      "created_at": "2020-03-15T07:07:45.160Z",
      "updated_at": "2020-03-15T07:07:45.160Z",
      "state": "OPEN",
      "version": 1,
      "total_money": {
        "amount": 100,
        "currency": "JPY"
      },
      "total_tax_money": {
        "amount": 0,
        "currency": "JPY"
      },
      "total_discount_money": {
        "amount": 0,
        "currency": "JPY"
      },
      "total_tip_money": {
        "amount": 0,
        "currency": "JPY"
      },
      "total_service_charge_money": {
        "amount": 0,
        "currency": "JPY"
      }
    },
    "created_at": "2020-03-15T07:07:45Z"
  }
}
```

`checkout_page_url`のURLを表示すると、以下のような画面が表示されました。

![](https://i.gyazo.com/37cbf6dbf73ad006502a51a09d0af373.png)

適当に発送先情報を入れ、[SANDBOXテスト用カード番号](https://developer.squareup.com/docs/testing/test-values)を入力してオーダーしてみました。

![](https://i.gyazo.com/607a91e887cfc88488b434818d8cdb96.png)

### 管理画面で確認

![](https://i.gyazo.com/67c5d791c6a7e32226788355ce8774fd.png)

ちゃんと取引記録が入りました。


## まとめ

CheckoutAPIは、住所やカード番号などの情報の管理を全てSquareに任せられるので、個人情報の管理も気にしなくていいので安心。

しかし、英語のチェックアウトページしか用意されていないのが残念。

やっぱり、ちゃんとUI作ってPaymentsAPIを使うのが良さそうです。


## 参考
* [Checkout API\- Square API Reference](https://developer.squareup.com/reference/square/checkout-api/create-checkout)