支払いの承認
支払い承認プロセスでは、ペイメントオーソライゼーションビューコントローラとそのデリゲートが協調して処理を進めます。ペイメントオーソライゼーションビューコントローラが実行する処理は二つあり、ペイメントリクエストで必要になる請求情報と配送先情報をユーザーが選択できるようにすること、さらに、支払いの実行をユーザーが承認できるようにすることです。デリゲートメソッドは、ユーザーがビューコントローラと対話した結果に応じて、表示されている情報をAppが更新するときに呼び出されます。たとえば、選択された配送先住所に応じて配送料を更新するためです。デリゲートは、ユーザーがペイメントリクエストを承認した後にも呼び出されます。
承認プロセスの実行中に呼び出されるデリゲートメソッドすべてに、引数の一つとして完了ブロックが渡されます。ペイメントオーソライゼーションビューコントローラは、自身のデリゲートが(完了ブロックを呼び出すことで)一つのメソッドへの応答を完了するまで待機してから、ほかのデリゲートメソッドを呼び出します。唯一の例外はpaymentAuthorizationViewControllerDidFinish:
メソッドです。このメソッドは完了ブロックを取得せず、いつでも呼び出すことができます。
完了ブロックは引数を取るので、利用可能な情報に基づいて、決済の現在のステータスを指定できます。決済に問題がない場合は、値PKPaymentAuthorizationStatusSuccess
を渡します。その他の場合は、問題を識別するための値を渡します。
PKPaymentAuthorizationViewController
クラスのインスタンスを作成するには、ペイメントリクエストをビューコントローラのイニシャライザに渡します。ビューコントローラのデリゲートを設定した後、提示します。
PKPaymentAuthorizationViewController *viewController = [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest:request];
if (! viewController) { /* ... Handle error ... */ }
viewController.delegate = self;
[self presentViewController:viewController animated:YES completion:nil];
ユーザーがビューコントローラとの対話を進めると、ビューコントローラは自身のデリゲートメソッドを呼び出します。
デリゲートで支払い方法とコストを更新する
ユーザーが配送先情報を提供すると、オーソライゼーションビューコントローラは、デリゲートのpaymentAuthorizationViewController:didSelectShippingContact:completion:
メソッドとpaymentAuthorizationViewController:didSelectShippingMethod:completion:
メソッドを呼び出します。これらのメソッドを使って、新しい情報に基づいてペイメントリクエストを更新します。
- (void) paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
didSelectShippingContact:(CNContact *)contact
completion:(void (^)(PKPaymentAuthorizationStatus, NSArray *, NSArray *))completion
{
self.selectedContact = contact;
[self updateShippingCost];
NSArray *shippingMethods = [self shippingMethodsForContact:contact];
completion(PKPaymentAuthorizationStatusSuccess, shippingMethods, self.summaryItems);
}
- (void) paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
didSelectShippingMethod:(PKShippingMethod *)shippingMethod
completion:(void (^)(PKPaymentAuthorizationStatus, NSArray *))completion
{
self.selectedShippingMethod = shippingMethod;
[self updateShippingCost];
completion(PKPaymentAuthorizationStatusSuccess, self.summaryItems);
}
ペイメントトークンは支払い承認時に作成される
ユーザーがペイメントリクエストを承認すると、フレームワークは、AppleのサーバおよびSecure Elementとの調整を通じてペイメントトークンを作成します。このペイメントトークンを、購入の処理に必要なその他のあらゆる情報(たとえば、配送先住所やショッピングカート識別子など)とともに、paymentAuthorizationViewController:didAuthorizePayment:completion:
デリゲートメソッドで自社サーバに送信します。このプロセスは、以下のような形で発生します。
フレームワークが、ペイメントリクエストをSecure Elementに送信します。トークン化された、デバイス固有の支払いカード番号にアクセスできるのはSecure Elementのみです。
Secure Elementが、指定されたカードおよびマーチャントの支払いデータを結合し、Appleのみが読み取れるよう暗号化して、フレームワークに送信します。次に、支払いデータがAppleのサーバに送信されます。
Appleのサーバが、支払い処理証明書を使って支払いデータを再暗号化します。トークンを読み取ることができるのは、マーチャントのほか、マーチャントが支払い処理証明書を共有している担当者のみです。次に、サーバがペイメントトークンに署名してデバイスに返します。
フレームワークは、
paymentAuthorizationViewController:didAuthorizePayment:completion:
メソッドを呼び出してデリゲートにトークンを渡します。デリゲートは、トークンをサーバに送信します。
サーバ上での処理は、独自に支払いを処理するのか、ペイメントプラットフォームと連携するのかによって異なります。いずれの場合も、「支払いの処理」で説明しているとおり、サーバが注文を処理し、ステータスをデバイスに送信し、そのステータスをデリゲートが完了ハンドラに渡します。
- (void) paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
didAuthorizePayment:(PKPayment *)payment
completion:(void (^)(PKPaymentAuthorizationStatus))completion
{
NSError *error;
ABMultiValueRef addressMultiValue = ABRecordCopyValue(payment.billingAddress, kABPersonAddressProperty);
NSDictionary *addressDictionary = (__bridge_transfer NSDictionary *) ABMultiValueCopyValueAtIndex(addressMultiValue, 0);
NSData *json = [NSJSONSerialization dataWithJSONObject:addressDictionary options:NSJSONWritingPrettyPrinted error: &error];
// ... Send payment token, shipping and billing address, and order information to your server ...
PKPaymentAuthorizationStatus status; // From your server
completion(status);
}
デリゲートでペイメントオーソライゼーションビューコントローラを閉じる
フレームワークが決済のステータスを表示した後、オーソライゼーションビューコントローラがデリゲートのpaymentAuthorizationViewControllerDidFinish:
メソッドを呼び出します。実装では、オーソライゼーションビューコントローラを閉じた後、独自App固有の注文確認ページを表示します。
- (void) paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller
{
[controller dismissViewControllerAnimated:YES completion:nil];
}
Copyright © 2016 Apple Inc. All rights reserved.利用規約 | プライバシーポリシー | 更新:2016/12/12