モバイル WebView で利用可能な Web SDK
モバイルWebView上で商人のウェブチェックアウトをホストし、DEUNAのコールバック、外部認証、セキュリティ境界、およびレスポンシブ動作を維持します。
このページで
カスタムWebViewを使用するのは、既存の商人のウェブチェックアウトをホストする必要がある場合にのみ。新しいモバイル統合の場合は、メンテナンスされている iOS, Android、または React Native SDKを使用してください。これらのSDKは、DEUNA WebViewブリッジと外部アクションライフサイクルをすでに実装しています。
アーキテクチャ#
WebView ラッパー パターンを参照してください。#
このチュートリアルでは、iOS WebView 内にロードされた販売者の Web チェックアウトを示します。 DEUNA Web SDK が支払いエクスペリエンスをレンダリングしている間、ネイティブ ラッパーはチェックアウト ページとメッセージを交換します。
ビデオではプレゼンテーションのパターンを示しています。 UI の詳細は変更される可能性があります。以下のアーキテクチャ、セキュリティ境界、およびプラットフォーム要件を実装契約として使用します。
必要なWebView機能#
| 機能 | その必要性 |
|---|---|
| JavaScriptとDOMストレージ | ホストされたチェックアウトとSDKは、ブラウザでの実行とセッションストレージを必要とします。 |
| 新しいウィンドウのインターセプト | 3DSとAPMフローは、以下を使用できます。 window.open. |
| ナビゲーション許可リスト | チェックアウトWebViewを一般的なブラウザとして使用しないようにします。 |
| 双方向メッセージブリッジ | 安全な完了、エラー、クローズ、およびライフサイクルメッセージを転送します。 |
| アプリのライフサイクル処理 | バックグラウンドでの状態の保持と、外部認証を維持します。 |
| 使用する場合 | Voucherフローは、ファイルまたはダウンロード可能な参照を生成できます。 |
最小限のブリッジを定義#
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の結果の転送#
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リダイレクトの成功、キャンセル、およびプロバイダのタイムアウト。
- 顧客によって外部ウィンドウが閉じられます。
- アプリがバックグラウンドで実行され、その後再開されます。
- 送信前のおよび送信後のネットワークの喪失。
- 信頼できないナビゲーションと不正なブリッジメッセージは拒否されます。
- クライアントの曖昧な結果後もバックエンドの状態が正しい。