我已经使用表单集成实现了 SagePay 付款。我的实现基于 SagePay 提供的 .Net 集成工具包,这些工具包都很好。

最近我们启用了 3D Secure,遇到了 3DSecureStatus 的值返回 NOTAVAILABLE 值的问题。

似乎当返回 NOTAVAILABLE 值时,在对 ConvertToSagePayMessage() 程序集内的 SagePayIntegration 类上的 SagePay.IntegrationKit.DotNet.dll 方法的调用中抛出错误。

具体来说,当值被解析为 ThreeDSecureStatus 枚举时会发生此错误。此枚举没有 NOTAVAILABLE 能够解析的值,因此出现错误。

我暂时对此进行了修复,以使它现在可以正常工作。此修复将 NOTAVAILABLE 值替换为 NONE ,因此现在解析为有效的枚举值。这是在调用 ConvertToSagePayMessage() 之前完成的

cryptDecoded = cryptDecoded.Replace("3DSecureStatus=NOTAVAILABLE", "3DSecureStatus=NONE");

我只是想知道为什么 ThreeDSecureStatus 枚举没有 NOTAVAILABLE 的值,因为 NOTAVAILABLE 是它预期返回的值之一,这在 SagePay 提供的表单集成协议(protocol)指南中进行了概述。并希望实现更强大的修复,而不是字符串替换。

最佳答案

问题在于集成工具包包含一个错误,即 enum 状态的 3DSecure 缺少 NOTAVAILABLE 的值。 SagePay 甚至告诉我:



所以有三种可能的方法来解决这个问题。

  • 修改来自服务器的解码响应以将 3DSecureStatus 值的值更改为 NONE (如问题中所写。)
  • 使用已应用修复程序的集成工具包版本。您可以向 SagePay 索取代码(他们似乎非常愿意免费提供)并在 NOTAVAILABLE 文件中添加 ThreeDSecureStatus.cs 作为枚举值:
    public enum ThreeDSecureStatus
    {
        NONE,
        OK,
        NOAUTH,
        CANTAUTH,
        NOTAUTHED,
        ATTEMPTONLY,
        NOTCHECKED,
        INCOMPLETE,
        MALFORMED,
        INVALID,
        ERROR,
        NOTAVAILABLE //<--- Add this
    }
    
  • 我已经完成了修复错误的过程并将其上传到 GitHub repository 。随意从那里获取代码。我还更新了项目以使用 C#6,因此您需要使用 Visual Studio 2015 或更高版本才能使用它。如果确实需要使用旧版本,则可以从 first commit to the repository 中的原始文件开始。
  • 关于c# - SagePay .Net 集成工具包 - 为 3dSecureStatus 返回 NOTAVAILABLE 值时出错,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29142334/

    10-12 04:33