PSD2协议4.0本地测试ThreeDSNotificationURL遇3228格式无效错误
根据你描述的场景:你正在测试PSD2协议4.0版本的Direct Integration,用Visual Studio运行本地localhost站点,当把ThreeDSNotificationURL设为http://localhost:15536/Payments/ThreeDResponse时收到错误3228 : The ThreeDSNotificationURL field format is invalid.,换成公网域名虽然不报错但没法完成本地测试,而PSD2 3.0版本用localhost是正常的。
问题根源
这大概率是因为PSD2 4.0版本的SagePay支付端点对3DS回调URL的校验规则做了严格升级。在3.0版本中,允许使用localhost这类本地回环地址做测试,但4.0版本要求回调URL必须是支付服务商能够公开访问到的有效端点——毕竟3DS验证流程需要发卡行或验证服务能把结果回调给你的系统,localhost在公网环境下是无法被访问到的,所以被判定为格式无效。
可行的解决方案
这里给你几个实用的解决方向,帮你完成本地测试:
内网穿透工具+本地域名映射
这是最常用的本地测试方案:- 先修改本地hosts文件(Windows路径
C:\Windows\System32\drivers\etc\hosts,Mac/Linux路径/etc/hosts),添加一条映射:127.0.0.1 my-sagepay-test.com - 使用内网穿透工具(比如ngrok、localtunnel)把本地端口15536映射到公开域名,比如运行
ngrok http 15536,会得到类似https://abc123.ngrok.io的临时域名 - 把
ThreeDSNotificationURL设置为https://abc123.ngrok.io/Payments/ThreeDResponse,这样既满足了SagePay的URL校验要求,又能让回调请求转发到你的本地站点
- 先修改本地hosts文件(Windows路径
配置SagePay测试环境白名单
登录SagePay的测试开发者后台,检查是否有回调URL白名单配置项。有些支付服务商的测试环境允许把本地IP或自定义测试域名加入白名单,绕过严格的公网可访问校验。如果有这个选项,把你的内网IP地址(比如http://192.168.1.100:15536/Payments/ThreeDResponse)添加进去尝试。使用SagePay的3DS模拟测试工具
去SagePay的开发者文档里找找有没有针对3DS流程的本地模拟工具。部分支付服务商提供了模拟3DS验证结果的工具,不需要依赖真实的公网回调地址,直接把测试回调请求发送到你的localhost站点,这样就能完成整个流程的测试。
额外注意事项
- 确保你的本地回调接口
/Payments/ThreeDResponse能正确接收POST请求,并且处理SagePay返回的3DS响应参数(比如MD、PaRes等) - 有些支付服务商要求回调URL必须使用HTTPS,即使是测试环境,所以使用内网穿透工具时尽量选择HTTPS的临时域名
内容的提问来源于stack exchange,提问作者Mark Blakey

