挑战流 3d Secure 2 .NET SDK

如何解决挑战流 3d Secure 2 .NET SDK

我几乎完成了 3d Secure 2 工作流程 (https://developer.globalpay.com/ecommerce/3d-secure-version2/browser-authentication#api) 的实施,但我正在努力确定在挑战流程中要做什么。

除了挑战流程卡之外,所有卡片都可以使用,我发现 iFrame 出现在我的一端,单击“继续”会向我的挑战 URL 发出请求 - 我正在执行 API 文档中显示代码(上面链接)但我返回的 JSON 只是显示在 iFrame 中,而不是触发我的 javascript。请在下面找到我的 JS 和挑战流程的端点:

async function performPaymentFlow(type,cardDetails,personalDetails,orderID) {
    
    // Perform the check card on the information sent in
    var versionCheckData,authenticationData;
    try {
        // call the api to see whether the card is valid
        versionCheckData = await checkVersion('/api/Payments/CheckCard',{ cardNumber: cardDetails.cardNumber });
        if (versionCheckData.IsError) {
            // show user error
        }

    }
    catch (e) {
        // show user error
    }

    // perform authentication
    // WITHIN THIS CALL THIS IS WHERE THE CHALLENGE IS SHOWN TO THE USER
    try {
        authenticationData = await initiateAuthentication('/api/Payments/Authenticate',{
            serverTransactionId: versionCheckData.serverTransactionId,methodUrlComplete: true,card: {
                expiryMonth: cardDetails.expiryMonth,expiryYear: cardDetails.expiryYear,securityCode: cardDetails.cv2,cardHolderName: cardDetails.cardName,cardNumber: cardDetails.cardNumber
            },challengeWindow: {
                displayMode: 'lightBox',},screenoptions: {
                colorDepth: screen.colorDepth,language: navigator.language,timezone: new Date().getTimezoneOffset()
            },personalDetails: personalDetails,type: type,orderID: orderID
        });

        if (authenticationData.IsError) {
            // show user error
        }
        else {
            // frictionless authentication success and authorization success
            if (authenticationData.result == "AUTHORIZATION_SUCCESS") {
                // complete
            }
            // challenge success
            else if (authenticationData.challenge.response.data.transstatus == "Y") {
            
                var serverTransactionId = authenticationData.challenge.response.data.threeDSServerTransID;

                var model = {
                    serverTransactionId: serverTransactionId,card: cardDetails,type: type
                };
                $.ajax({
                    type: "POST",url: "/api/Booking/Authorize",contentType: "application/json; charset=utf-8",dataType: "json",data: JSON.stringify({ "model": model })
                }).done(function (authorizationResponse) {
                    if (authorizationResponse.IsError) {
                        // Show user errlr
                    }
                    else {
                       // complete
                    }
                });
            }

            // challenge failure
            else {
                // show user error
            }
        }
    }
    catch (e) {
        // show user error
    }
};

这是我的挑战 URL 的服务器端实现

public void Challenge()
        {
            // Get the data from the form
            var cres = HttpContext.Current.Request.Form["cres"];
            try
            {
                #region Instantiate the service
                ServicesContainer.ConfigureService(new GpEcomConfig
                {
                    MerchantId = Constants.realexuser,AccountId = "internet",SharedSecret = Constants.realexsecret,MethodNotificationUrl = Constants.DomainName + "/api/Payments/MethodSetup",ChallengeNotificationUrl = Constants.DomainName + "/api/Payments/Challenge",MerchantContactUrl = Constants.DomainName + "/visit/find-us-and-faqs",Secure3dVersion = Secure3dVersion.Two
                });
                #endregion

                #region data population and parsing
                byte[] data = Convert.FromBase64String(cres.Replace('-','+').Replace('_','/').padright(4 * ((cres.Length + 3) / 4),'='));

                string challengeUrlResponseString = Encoding.UTF8.GetString(data);

                dynamic challengeUrlResponse = JsonConvert.DeserializeObject(challengeUrlResponseString);

                var threeDSServerTransID = challengeUrlResponse.threeDSServerTransID; // af65c369-59b9-4f8d-b2f6-7d7d5f5c69d5
                var acsTransId = challengeUrlResponse.acsTransID; // 13c701a3-5a88-4c45-89e9-ef65e50a8bf9
                var messageType = challengeUrlResponse.messageType; // Cres
                var messageVersion = challengeUrlResponse.messageVersion; // 2.1.0
                var transstatus = challengeUrlResponse.transstatus; // Y
                #endregion

                // Package up the data and send it back to the user
                challengeUrlResponseString = JsonConvert.SerializeObject(new
                {
                    threeDSServerTransID = threeDSServerTransID,transstatus = transstatus
                });
                SendResponse(challengeUrlResponseString);
                return;
            }
            // Uh oh - another error from the API
            catch (Exception exce)
            {
                // Return error to user
            }
        }

由此返回的 JSON 显示在 iframe 中,而不是返回到我的 JS 以便我可以继续流程,任何帮助将不胜感激。

解决方法

需要通知客户端该挑战步骤已完成。为此,质询通知端点应响应:

<script src="globalpayments-3dsecure.js"></script>
<script>
    GlobalPayments.ThreeDSecure.handleChallengeNotification('"threeDSServerTransID":"threeDSServerTransID","transStatus":"transStatus"');
</script>

请确保包含 3DS JS 库。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?