[iOS 10] Apple Pay のペイメントシート表示や認証処理がうまくいかない場合の原因について

2017.01.24

はじめに

こんばんは。モバイルアプリサービス部の平屋です。

本記事では、Apple Pay を使用した決済処理の実装を行った際に発生した事象とその原因を紹介していきます。

Apple Pay の概要や実装などについては以下の記事などをご覧ください。

検証環境

  • Xcode Version 8.2.1
  • iPhone 6s, iOS 10.1.1

目次

Apple Pay のペイメントシートが表示されない

事象

PKPaymentAuthorizationViewController を使用してペイメントシートを表示しようとしても表示されませんでした。

PKPaymentAuthorizationViewController を present した直後に PKPaymentAuthorizationViewControllerDelegate の paymentAuthorizationViewControllerDidFinish(_:) がすぐに呼ばれてしまってました。

func pay(sender: AnyObject) {
    // PKPaymentRequest 作成
    let request = PKPaymentRequest()

    // マーチャント ID を指定
    request.merchantIdentifier = "merchant.jp.classmethod.PaymentSample"

    // ...

    // PKPaymentRequest から PKPaymentAuthorizationViewController を作成し、ペイメントシートを表示
    let viewController = PKPaymentAuthorizationViewController(paymentRequest: request)
    viewController.delegate = self
    self.present(viewController,
                 animated: true,
                 completion: nil)
}

func paymentAuthorizationViewControllerDidFinish(_ controller: PKPaymentAuthorizationViewController) {
    // ...
}

原因

今回発生した事象の原因は以下の通りでした。

  • マーチャント ID の指定が間違っていた

マーチャント ID の設定に関して、以下の 2 つの ID は一致する必要があります。しかし、それぞれ別の ID を指定してしまっていました。

  • TARGET の Capabilities で指定しているマーチャント ID
  • PKPaymentRequest の merchantIdentifier プロパティに指定するマーチャント ID

上記の ID を一致させると、ペイメントシートを表示できるようになりました。

システムログについて

今回のケースのように、マーチャント ID の指定が正しくない場合は、システムが以下のようなログを表示します。

Failed to present in-app payment interface: 
    Error Domain=PKPassKitErrorDomain 
    Code=4 
    "加盟店識別子のエンタイトルメントがありません: merchant.jp.classmethod.PaymentSample" 
    UserInfo={
        NSLocalizedDescription=加盟店識別子のエンタイトルメントがありません: merchant.jp.classmethod.PaymentSample
    }

しかし、今回 Apple Pay の実装を行なっていたプロジェクトのスキーマ設定には、システムログの表示を減らすために「EnvironmentVariable」として "OS_ACTIVITY_MODE" = "disable" を設定していました。そのため、上記ログは表示されず、原因を特定するのに少し時間がかかってしまいました。

「"アプリ名"ではApple Pay を利用できません」ダイアログが表示される

事象

以下のように、ペイメントシートの表示までは成功したのですが、

ios-10-applepay-for-developers-5-1

パスコードで支払う (または Touch IDで認証) を選択すると以下のダイアログが表示されてしまいました。

ios-10-applepay-for-developers-5-2

原因

今回発生した事象の原因は以下の通りでした。

  • マーチャント ID 用の証明書を作っていなかった

マーチャント ID の作成は済ませていたのですが、その ID 用の証明書の作成を忘れていたため、処理が失敗したようでした。証明書を作成して再度試してみると、その後の処理へと進めることができました。

さいごに

本記事では、Apple Pay を使用した決済処理の実装を行った際に発生した事象とその原因を紹介しました。

Apple Pay を使用した決済処理の実装を行う際の参考になれば幸いです。

参考資料