Apple Pay iOSに組み込む

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

PAY.JP iOS SDKを使用するには Carthage もしくは CocoaPods でインストールします。

Carthage

github "payjp/payjp-ios"

CocoaPods

pod 'PAYJP'

ボタンの表示

iOS SDK規定の購入ボタンPKPaymentButtonをViewControllerで表示します。

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 を呼び出します。 PAYJPPublicKey には公開キーを設定してください。

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

// import PAYJP

func paymentAuthorizationViewController(_ controller: PKPaymentAuthorizationViewController, didAuthorizePayment payment: PKPayment, completion: @escaping (PKPaymentAuthorizationStatus) -> Void) {
    let apiClient = PAYJP.APIClient(publicKey: PAYJPPublicKey)
    apiClient.createToken(with: payment.token) { (result) in
        switch result {
        case .success(let token):
            // handle token object and send back to your server.
            // https://pay.jp/docs/charge
            completion(.success)
        case .failure(let error):
            print(error)
            completion(.failure)
        }
    }
}

サーバーサイドの実装

PAY.JPトークンの生成に成功したら、これをあなたのサーバーへ送信し支払い処理を実行します。 サーバーサイドの構成はPAY.JPドキュメント内の

を参照してください。