SagePay .Net Integration Kit – 返回3dSecureStatus的NOTAVAILABLE值时出错

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

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

看起来当返回NOTAVAILABLE值时,在程序集SagePay.IntegrationKit.DotNet.dllSagePayIntegration类的ConvertToSagePayMessage()方法调用中会抛出错误。

特别是,将值解析为ThreeDSecureStatus枚举时会发生此错误。 此枚举没有NOTAVAILABLE可以解析的值,因此错误。

我暂时解决了这个问题,现在才开始工作。 此修复程序将NOTAVAILABLE值替换为NONE ,因此现在解析为有效的枚举值。 这是在调用ConvertToSagePayMessage()之前完成的

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

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

问题是集成套件包含一个错误,即3DSecure状态的enum缺少NOTAVAILABLE的值。 SagePay甚至告诉过我:

不幸的是,这是.NET工具包的一个已知问题,但目前还没有修复。

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

  1. 修改服务器的解码响应,将3DSecureStatus值的值更改为NONE (如问题中所述)。
  2. 使用已应用此修复程序的Integration Kit版本。 您可以向SagePay索取代码(他们似乎非常愿意免费提供)并在ThreeDSecureStatus.cs文件中添加NOTAVAILABLE作为枚举值:

     public enum ThreeDSecureStatus { NONE, OK, NOAUTH, CANTAUTH, NOTAUTHED, ATTEMPTONLY, NOTCHECKED, INCOMPLETE, MALFORMED, INVALID, ERROR, NOTAVAILABLE //<--- Add this } 
  3. 我已经完成了修复bug的过程并将其上传到GitHub存储库 。 随意从那里获取代码。 我还更新了使用C#6的项目,因此您需要使用Visual Studio 2015或更高版本才能使用它。 如果确实需要使用旧版本,则可以从第一次提交到存储库的原始文件开始。