POSレジAPIはWeb APIではなくiOS/Androidアプリに対してSquareの決済機能を追加できるAPIになります。実際の動作については下の動画を見てもらうのが早いと思います。
自分たちで開発するアプリに対して、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 |
開発者ポータルでアプリ登録
最後に開発者ポータルへ行き、アプリを登録します。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 | 文字列 | エラー時のコード。詳細はエラーコード一覧を参考にしてください |
state | 文字列 | リクエスト時にstateに与えた値と同じものが入ります |
このような処理でiOSにレジ機能が組み込めるようになります。なお、利用に際してSquareのレジアプリが必須になりますのでご注意ください。使えるAPIがレジアプリのバージョンによって異なりますので、なるべく最新のものを使い続けるようにしてください。