日本語ドキュメント

Developer

Apple Payプログラミングガイド

このページの内容

支払いの承認

支払い承認プロセスでは、ペイメントオーソライゼーションビューコントローラとそのデリゲートが協調して処理を進めます。ペイメントオーソライゼーションビューコントローラが実行する処理は二つあり、ペイメントリクエストで必要になる請求情報と配送先情報をユーザーが選択できるようにすること、さらに、支払いの実行をユーザーが承認できるようにすることです。デリゲートメソッドは、ユーザーがビューコントローラと対話した結果に応じて、表示されている情報をアプリケーションが更新するときに呼び出されます。たとえば、選択された配送先住所に応じて配送料を更新するためです。デリゲートは、ユーザーがペイメントリクエストを承認した後にも呼び出されます。

承認プロセスの実行中に呼び出されるデリゲートメソッドすべてに、引数の一つとして完了ブロックが渡されます。ペイメントオーソライゼーションビューコントローラは、自身のデリゲートが(完了ブロックを呼び出すことで)一つのメソッドへの応答を完了するまで待機してから、ほかのデリゲートメソッドを呼び出します。唯一の例外はpaymentAuthorizationViewControllerDidFinish:メソッドです。このメソッドは完了ブロックを取得せず、いつでも呼び出すことができます。

完了ブロックは引数を取るので、利用可能な情報に基づいて、決済の現在のステータスを指定できます。決済に問題がない場合は、値PKPaymentAuthorizationStatusSuccessを渡します。その他の場合は、問題を識別するための値を渡します。

PKPaymentAuthorizationViewControllerクラスのインスタンスを作成するには、ペイメントリクエストをビューコントローラのイニシャライザに渡します。ビューコントローラのデリゲートを設定した後、提示します。

  1. PKPaymentAuthorizationViewController *viewController = [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest:request];
  2. if (! viewController) { /* ... Handle error ... */ }
  3. viewController.delegate = self;
  4. [self presentViewController:viewController animated:YES completion:nil];

ユーザーがビューコントローラとの対話を進めると、ビューコントローラは自身のデリゲートメソッドを呼び出します。

デリゲートで支払い方法とコストを更新する

ユーザーが配送先情報を提供すると、オーソライゼーションビューコントローラは、デリゲートのpaymentAuthorizationViewController:didSelectShippingContact:completion:メソッドとpaymentAuthorizationViewController:didSelectShippingMethod:completion:メソッドを呼び出します。これらのメソッドを使って、新しい情報に基づいてペイメントリクエストを更新します。

  1. - (void) paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
  2. didSelectShippingContact:(CNContact *)contact
  3. completion:(void (^)(PKPaymentAuthorizationStatus, NSArray *, NSArray *))completion
  4. {
  5. self.selectedContact = contact;
  6. [self updateShippingCost];
  7. NSArray *shippingMethods = [self shippingMethodsForContact:contact];
  8. completion(PKPaymentAuthorizationStatusSuccess, shippingMethods, self.summaryItems);
  9. }
  10. - (void) paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
  11. didSelectShippingMethod:(PKShippingMethod *)shippingMethod
  12. completion:(void (^)(PKPaymentAuthorizationStatus, NSArray *))completion
  13. {
  14. self.selectedShippingMethod = shippingMethod;
  15. [self updateShippingCost];
  16. completion(PKPaymentAuthorizationStatusSuccess, self.summaryItems);
  17. }

ペイメントトークンは支払い承認時に作成される

ユーザーがペイメントリクエストを承認すると、フレームワークは、AppleのサーバおよびSecure Elementとの調整を通じてペイメントトークンを作成します。このペイメントトークンを、購入の処理に必要なその他のあらゆる情報(たとえば、配送先住所やショッピングカート識別子など)とともに、paymentAuthorizationViewController:didAuthorizePayment:completion:デリゲートメソッドで自社サーバに送信します。このプロセスは、以下のような形で発生します。

  • フレームワークが、ペイメントリクエストをSecure Elementに送信します。トークン化された、デバイス固有の支払いカード番号にアクセスできるのはSecure Elementのみです。

  • Secure Elementが、指定されたカードおよびマーチャントの支払いデータを結合し、Appleのみが読み取れるよう暗号化して、フレームワークに送信します。次に、支払いデータがAppleのサーバに送信されます。

  • Appleのサーバが、支払い処理証明書を使って支払いデータを再暗号化します。トークンを読み取ることができるのは、マーチャントのほか、マーチャントが支払い処理証明書を共有している担当者のみです。次に、サーバがペイメントトークンに署名してデバイスに返します。

  • フレームワークは、paymentAuthorizationViewController:didAuthorizePayment:completion:メソッドを呼び出してデリゲートにトークンを渡します。デリゲートは、トークンをサーバに送信します。

サーバ上での処理は、独自に支払いを処理するのか、ペイメントプラットフォームと連携するのかによって異なります。いずれの場合も、「支払いの処理」で説明しているとおり、サーバが注文を処理し、ステータスをデバイスに送信し、そのステータスをデリゲートが完了ハンドラに渡します。

  1. - (void) paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
  2. didAuthorizePayment:(PKPayment *)payment
  3. completion:(void (^)(PKPaymentAuthorizationStatus))completion
  4. {
  5. NSError *error;
  6. ABMultiValueRef addressMultiValue = ABRecordCopyValue(payment.billingAddress, kABPersonAddressProperty);
  7. NSDictionary *addressDictionary = (__bridge_transfer NSDictionary *) ABMultiValueCopyValueAtIndex(addressMultiValue, 0);
  8. NSData *json = [NSJSONSerialization dataWithJSONObject:addressDictionary options:NSJSONWritingPrettyPrinted error: &error];
  9. // ... Send payment token, shipping and billing address, and order information to your server ...
  10. PKPaymentAuthorizationStatus status; // From your server
  11. completion(status);
  12. }

デリゲートでペイメントオーソライゼーションビューコントローラを閉じる

フレームワークが決済のステータスを表示した後、オーソライゼーションビューコントローラがデリゲートのpaymentAuthorizationViewControllerDidFinish:メソッドを呼び出します。実装では、オーソライゼーションビューコントローラを閉じた後、独自アプリケーション固有の注文確認ページを表示します。

  1. - (void) paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller
  2. {
  3. [controller dismissViewControllerAnimated:YES completion:nil];
  4. }