Apple Pay を iOS アプリに組み込む方法

PAY.JP iOS SDK のインストール

PAY.JP iOS SDK を使用するには、Carthage または CocoaPods を使ってインストールします。

Carthage を使う場合

github "payjp/payjp-ios"

CocoaPods を使う場合

pod 'PAYJP'

SDK の初期化

まず、UIApplicationDelegate クラスを継承したクラスで、PAY.JP の公開鍵を設定して SDK を初期化します。

以下のサンプルコードではテストモードの公開鍵を設定しています。

import PAYJP

class AppDelegate: UIApplicationDelegate {
    func application(
            _ application: UIApplication,
            didFinishLaunchingWithOptions launchOptions:
              [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool {

        PAYJPSDK.publicKey = "pk_test_0383a1b8f91e8a6e3ea0e2a9"
        PAYJPSDK.locale = Locale.current

        return true
    }

購入ボタンの表示

iOS SDK が提供する購入ボタン PKPaymentButtonViewController で表示します。

let button = PKPaymentButton(paymentButtonType: .buy, paymentButtonStyle: .black)
self.view.addSubView(button)

ペイメントリクエストの作成

Apple Pay での支払いに対する PKPaymentRequest オブジェクトを作成します。appleMerchantID には Xcode の設定で有効化したマーチャント ID を設定してください。

let request = PKPaymentRequest()
request.merchantIdentifier = appleMerchantID
request.currencyCode = "JPY"
request.countryCode = "JP"
request.supportedNetworks = [.visa, .masterCard, .JCB, .amex]
request.merchantCapabilities = .capability3DS
request.requiredBillingAddressFields = .email

支払いサマリーアイテムの作成

ペイメントリクエストに PKPaymentSummaryItem を使って商品の情報を追加します。ここでは商品名と価格を設定しています。

let item = PKPaymentSummaryItem(
  label: "PAY.JP TEST ITEM", amount: NSDecimalNumber(string: "100")
)
request.paymentSummaryItems = [item]

ペイメントシートの表示

PKPaymentAuthorizationViewController にペイメントリクエストを設定し、画面に表示します。

let vc = PKPaymentAuthorizationViewController(paymentRequest: request)
vc.delegate = self
present(vc, animated: true, completion: nil)

delegateメソッドの実装

PKPaymentAuthorizationViewControllerDelegate のメソッドを定義して、ユーザーの操作が発生した時の処理を実装します。

// ViewController

func paymentAuthorizationViewController(
   _ controller: PKPaymentAuthorizationViewController,
   didAuthorizePayment payment: PKPayment,
   completion: @escaping (PKPaymentAuthorizationStatus) -> Void
) {
   // TODO: 
}
func paymentAuthorizationViewControllerDidFinish(
   _ controller: PKPaymentAuthorizationViewController
) {
   controller.dismiss(animated: true, completion: nil)
}

トークンの作成

delegate メソッドで渡される Apple Pay のペイメントトークンから PAY.JP トークンを作成します。これには APIClient#createToken を呼び出します。

注意: iOS シミュレーターで実行時には payment.token は空の値になりますので、実機で実行してください。

// import PAYJP

func paymentAuthorizationViewController(
    _ controller: PKPaymentAuthorizationViewController,
    didAuthorizePayment payment: PKPayment,
    completion: @escaping (PKPaymentAuthorizationStatus) -> Void
) {
    let apiClient = APIClient.shared
    apiClient.createToken(with: payment.token) { (result) in
        switch result {
        case .success(let token):
            // トークンオブジェクトを処理し、サーバーに送信します
            // https://pay.jp/docs/charge
            completion(.success)
        case .failure(let error):
            print(error)
            completion(.failure)
        }
    }
}

サーバーサイドの実装

PAY.JP トークンの生成に成功したら、これをあなたのサーバーへ送信し支払い処理を実行します。サーバーサイドでの実装は PAY.JP ドキュメント内の支払いを行うや、以下のドキュメントとサンプルコードを参考にしてください。