static String lastProcessedTransactionId = "";
public void challengeOOBFlow(
@NonNull D1Task d1Task,
@NonNull FragmentActivity activity,
@NonNull CountDownLatch transactionWaiter) throws D1Exception {
// AuthnCallbackに準拠するインターフェースを実装
D1Authn d1Authn = d1Task.getD1Authn(activity, new AuthnCallback(){
@Override
public void onTransactionDataConfirmation(@NonNull Map<String, String> map, @NonNull AuthnUserConfirmationCallback authnUserConfirmationCallback) {
// 最後に処理したトランザクションIDを確認するトランザクションハンドラーを渡す
try {
transactionHandler(map, transactionWaiter, authnUserConfirmationCallback);
} catch (InterruptedException e) {
// 例外を処理
}
}
@NonNull
@Override
public String onBiometricPromptMessage() {
// 認証プロンプト用のメッセージを提供します。アプリケーションで値をカスタマイズできます。
return "生体認証プロンプト中にユーザーに表示するメッセージ";
}
});
d1Authn.fetchAuthnRequest(new D1Task.Callback<Void>() {
@Override
public void onSuccess(Void unused) {
// エンドユーザー確認後に後続フローを続行します。
transactionWaiter.countDown();
}
@Override
public void onError(@NonNull D1Exception e) {
// D1 SDK統合 – エラー管理のセクションを参照してください。
transactionWaiter.countDown();
}
});
}
public synchronized void transactionHandler(
@NonNull Map<String, String> map,
@NonNull CountDownLatch transactionWaiter,
@NonNull AuthnUserConfirmationCallback authnUserConfirmationCallback) throws InterruptedException {
// 'map' には認証対象のトランザクションデータが含まれます。
//例のMap:
// {
// "acsTransId": "2f37539c-d82e-4929-88db-2f9e72c7fa62",
// "merchantName": "CoffeeHouse2 (Dæmø)",
// "purchaseAmount": "100",
// "purchaseCurrency": "840",
// "purchaseExponent": "2",
// "purchaseDate": "20231017055638"
// }
// 現在のトランザクションIDを取得し、最後に処理したトランザクションIDと比較します。同じ場合はトランザクションを処理する必要がないため、トランザクションのキャンセルに進みます
if(map.get("acsTransId") != lastProcessedTransactionId) {
lastProcessedTransactionId = map.get("acsTransId");
JSONObject json = new JSONObject();
for (Map.Entry<String, String> entry : map.entrySet()) {
try {
json.put(entry.getKey(), entry.getValue());
} catch (JSONException ignored) {}
}
// アプリケーションは内容を表示し、エンドユーザーに認証要求を「続行」するか「拒否」するかを促します。
// 続行するには: ユーザーが続行を選択したとき
// 続行後、選択されたAuthnTypeの登録内容に基づいてUIで認証が求められます。
authnUserConfirmationCallback.proceed();
// キャンセルするには: ユーザーがキャンセルを選択したとき
authnUserConfirmationCallback.cancel();
} else {
if(transactionWaiter.await(60, TimeUnit.SECONDS)) {
// トランザクションを処理する必要はなく、トランザクションのキャンセルに進みます
authnUserConfirmationCallback.cancel();
}
}
}