POSレジAPIでiOSアプリに決済機能を追加しよう

POSレジAPIはWeb APIではなくiOS/Androidアプリに対してSquareの決済機能を追加できるAPIになります。実際の動作については下の動画を見てもらうのが早いと思います。

<video inviewplay="" loop="" muted="" preload="" src="https://d1g145x70srn7h.cloudfront.net/videos/pages/developers/register-api.jp-v2.mp4" width="100%"></video>

自分たちで開発するアプリに対して、Squareのレジアプリを呼び出すことで決済を行ってもらえます。そしてアプリ側に決済完了のコールバックが送られてくる仕組みです。

今回はiOSでの実装方法を紹介します。

## SDKの導入

POSレジAPIを扱うためのSDK、SquarePointOfSaleSDKを導入する方法は3つ用意しています。

### CocoaPods

```
platform :ios, '9.0'
pod 'SquarePointOfSaleSDK'
```

### Carthage

```
github "Square/SquarePointOfSaleSDK-iOS"
```

### Gitサブモジュール

`https://github.com/square/SquarePointOfSaleSDK-iOS.git` をクローンして `SquarePointOfSaleSDK.xcodeproj` をXcodeプロジェクトに追加してください。

## Info.plistの更新

次にInfo.plistを開いて2つ追加を行います。

### LSApplicationQueriesSchemesの追加

新しく `LSApplicationQueriesSchemes` を追加します。`Type` は `Array` で、値は `square-commerce-v1` になります。

Squareレジアプリにて決済後、その結果をコールバックしますのでURLスキーマを登録します。

|Property|Value|
|--------|--------|
|Identifier|Square|
|URL Schemes|設定したURLスキーマ|
|Role|Editor|

## 開発者ポータルでアプリ登録

最後に[開発者ポータル](https://connect.squareup.com/apps)へ行き、アプリを登録します。Point of Sale APIを選ぶとiOSアプリのバンドルIDとURLスキーマを登録する画面になりますので、開発しているアプリの情報を登録してください。

## 組み込む

アプリへの組み込み方です。今回はSwiftで紹介します。 `your-url-scheme` は自分のURLスキーマに置き換えてください。 `YOUR_CLIENT_ID` はアプリケーションIDです。

```
let yourCallbackURL = URL(string: "your-url-scheme://")!

SCCAPIRequest.setClientID("YOUR_CLIENT_ID")

do {
    // Specify the amount of money to charge.
    let money = try SCCMoney(amountCents: 1000, currencyCode: "JPY")

    // Create the request.
    let apiRequest =
        try SCCAPIRequest(
            callbackURL: yourCallbackURL,
            amount: money,
            userInfoString: nil,
            merchantID: nil,
            notes: "Coffee",
            customerID: nil,
            supportedTenderTypes: .all,
            clearsDefaultFees: false,
            returnAutomaticallyAfterPayment: false
        )

    // Open Point of Sale to complete the payment.
    try SCCAPIConnection.perform(apiRequest)

} catch let error as NSError {
    print(error.localizedDescription)
}
```

そしてコールバックされてきた時の処理を書きます。

```
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
    guard let sourceApplication = options[.sourceApplication] as? String,
        sourceApplication.hasPrefix("com.squareup.square") else {
        return false
    }

    do {
        let response = try SCCAPIResponse(responseURL: url)

        if let error = response.error {
            // エラー時の処理です
            print(error.localizedDescription)
        } else {
            // 成功時の処理です
        }

    } catch let error as NSError {
        // 例外発生時の処理です
        print(error.localizedDescription)
    }

    return true
}
```

レスポンスで受け取るデータはJSONですが、次のような内容になっています。

|項目|型|内容|
|---|----|----|
|transaction_id|文字列|処理した取引ID。ユニーク|
|client_transaction_id|文字列|オフラインモード時での取引ID|
|status|文字列|処理が正常であればokと入ります|
|error_code|文字列|エラー時のコード。[詳細はエラーコード一覧](https://docs.connect.squareup.com/articles/point-of-sale-api-ios#handlingerrorcodes)を参考にしてください|
|state|文字列|リクエスト時にstateに与えた値と同じものが入ります|

----

このような処理でiOSにレジ機能が組み込めるようになります。なお、利用に際してSquareのレジアプリが必須になりますのでご注意ください。使えるAPIがレジアプリのバージョンによって異なりますので、なるべく最新のものを使い続けるようにしてください。

[Point of Sale API setup](https://docs.connect.squareup.com/articles/point-of-sale-api-ios)