メインコンテンツへスキップ
このページで

カスタムWebViewを使用するのは、既存の商人のウェブチェックアウトをホストする必要がある場合にのみ。新しいモバイル統合の場合は、メンテナンスされている iOS, Android、または React Native SDKを使用してください。これらのSDKは、DEUNA WebViewブリッジと外部アクションライフサイクルをすでに実装しています。

アーキテクチャ#

シーケンス図
1Native app2Merchant checkoutWebView3DEUNA Web SDK43DS / APM surfaceLoad allow-listed HTTPScheckout URLInitialize and open widgetCallback oropenExternalPopupValidated JSON bridgemessageOpen approved external URLClose or returnResume and reconcile
商社または顧客DEUNAプロバイダーまたはプロセッサ
01 · load
信頼性の高い決済のオープン
HTTPSと、許可された商社オリジンを使用してください。
02 · bridge
メッセージの検証
期待されるページから、バージョン付きの最小限のスキーマを受け入れます。
03 · redirect
外部アクションの処理
3DSとAPMのURLを、承認されたブラウザまたはセカンダリのWebViewで表示します。
04 · reconcile
注文の状態の確認
返品と終了を、バックエンドが検証するまで曖昧な状態として扱います。

WebView ラッパー パターンを参照してください。#

このチュートリアルでは、iOS WebView 内にロードされた販売者の Web チェックアウトを示します。 DEUNA Web SDK が支払いエクスペリエンスをレンダリングしている間、ネイティブ ラッパーはチェックアウト ページとメッセージを交換します。

WebView wrapper example using a merchant checkout page and native message bridge.

ビデオではプレゼンテーションのパターンを示しています。 UI の詳細は変更される可能性があります。以下のアーキテクチャ、セキュリティ境界、およびプラットフォーム要件を実装契約として使用します。

必要なWebView機能#

機能その必要性
JavaScriptとDOMストレージホストされたチェックアウトとSDKは、ブラウザでの実行とセッションストレージを必要とします。
新しいウィンドウのインターセプト3DSとAPMフローは、以下を使用できます。 window.open.
ナビゲーション許可リストチェックアウトWebViewを一般的なブラウザとして使用しないようにします。
双方向メッセージブリッジ安全な完了、エラー、クローズ、およびライフサイクルメッセージを転送します。
アプリのライフサイクル処理バックグラウンドでの状態の保持と、外部認証を維持します。
使用する場合Voucherフローは、ファイルまたはダウンロード可能な参照を生成できます。

最小限のブリッジを定義#

商社チェックアウトページで実行されるコードJavaScript
type NativeMessage = {
  version: 1;
  type: 'success' | 'error' | 'closed' | 'event';
  widget: 'payment' | 'elements' | 'voucher' | 'nextAction';
  data?: unknown;
};

function postToNative(message: NativeMessage) {
  const body = JSON.stringify(message);
  window.webkit?.messageHandlers.deunaPayment?.postMessage(body); // iOS
  window.deunaPayment?.postMessage(body);                         // Android
  window.ReactNativeWebView?.postMessage(body);                   // React Native
}

ネイティブ境界で、厳密なスキーマを使用してJSONを解析し、未知のメッセージバージョンとタイプを拒否し、メッセージサイズを制限し、予期しない上位レベルのページからのメッセージを無視します。JavaScriptへの汎用的なネイティブメソッドディスパッチャを公開しないでください。

SDKの結果の転送#

JavaScript
await DeunaSDK.initPaymentWidget({
  orderToken,
  callbacks: {
    onSuccess: (data) => postToNative({version: 1, type: 'success', widget: 'payment', data}),
    onError: (data) => postToNative({version: 1, type: 'error', widget: 'payment', data}),
    onClosed: (action) => postToNative({version: 1, type: 'closed', widget: 'payment', data: {action}}),
    onEventDispatch: (event) => postToNative({
      version: 1,
      type: 'event',
      widget: 'payment',
      data: {event},
    }),
  },
});

ネイティブアプリケーションに必要なフィールドのみを転送してください。注文トークン、ウォレットトークン、カードデータ、完全な顧客オブジェクト、または任意の生のイベントペイロードの転送は行わないでください。

外部ウィンドウおよびリダイレクト#

Web SDKは、サポートされている外部ポップアップに対してライフサイクルイベントを送信します。WebViewは、 window.open または新しいウィンドウのリクエストをインターセプトし、ターゲットを正しく表示し、すぐに閉じられたと誤って報告しないようにする必要があります。

  • 以下のURLのみを許可してください。 https ホストが承認された認証または決済先と一致するURLのみ。
  • サードパーティのコンテンツには、独立したブラウザ環境を使用することを推奨します。また、商社側の機能を発行元またはプロバイダーのページに埋め込まないでください。
  • 外部のブラウザ環境を、チェックアウト WebView から独立して追跡してください。
  • 決済完了時またはリターン時、チェックアウトを再開し、注文の状態を取得します。
  • グローバルにタイムアウトエラーを抑制しないでください。タイムアウトは、実際の未完了のアクションを示す可能性があります。状況を把握し、適切な復旧手順を表示してください。

SDKのリポジトリには、iOSおよび Examples/checkout-web-wrapper 向けの、維持されている参照用ラッパーが含まれています。 examples/checkout-web-wrapper Android 用。

プラットフォームの確認リスト#

iOS · WKWebViewナビゲーションとスクリプトメッセージ

信頼できる決済設定用の JavaScript を有効にし、特定の名前の WKScriptMessageHandlerを登録し、上位レベルのナビゲーションを WKNavigationDelegate、および実装 WKUIDelegate 新しいウィンドウの処理。コントローラーが破棄される際に、スクリプトハンドラを削除し、ブリッジの保持を防ぎます。

Android · WebViewナビゲーションとウィンドウの作成

チェックアウト WebView のみで JavaScript と DOM ストレージを有効にし、制限された JavaScript インターフェースを使用し、URL の検証 WebViewClientまた、新しいウィンドウの処理は、WebChromeClientまたは制御されたセカンダリサーフェスを通じて行います。 ファイルおよびコンテンツへのアクセスを無効にし、アプリケーションが明示的に必要とする場合にのみ許可します。

React Native · react-native-webviewメッセージとウィンドウのライフサイクル

使用する onMessage, onShouldStartLoadWithRequest、およびサポートされている新しいウィンドウのコールバック。メインのチェックアウトコンポーネントが外部ウィンドウが表示されている間も保持されるようにします。DEUNAの既存のReact Native SDKは、このコントローラーを実装しており、新しい統合には推奨されます。

レスポンシブでアクセシブルなプレゼンテーション#

  • 安全領域のインセットとオンスクリーンキーボードを尊重します。
  • 利用可能な全幅と動的なビューポートの高さを利用し、固定されたデスクトップサイズのWebViewを使用しないでください。
  • ネイティブのクローズコントロールを、決済コンテンツの外に配置し、アクセシビリティ技術でアクセスできるようにします。
  • ナビゲーションとエラーを通知し、外部ウィンドウが閉じられた後にフォーカスを復元します。
  • 回転、分割画面、大きなテキスト、スクリーンリーダー、遅いネットワーク、およびアプリのバックグラウンドモードをテストします。

テストマトリックス#

  • カードの成功、拒否、および顧客による決済の終了。
  • スムーズで、複雑な3DS。
  • APMリダイレクトの成功、キャンセル、およびプロバイダのタイムアウト。
  • 顧客によって外部ウィンドウが閉じられます。
  • アプリがバックグラウンドで実行され、その後再開されます。
  • 送信前のおよび送信後のネットワークの喪失。
  • 信頼できないナビゲーションと不正なブリッジメッセージは拒否されます。
  • クライアントの曖昧な結果後もバックエンドの状態が正しい。