调用Payhost服务引用出现Anonymous认证下HTTP请求被禁止异常
问题原因及解决方法
核心原因定位
这个MessageSecurityException异常本质是PayGate服务端返回了403 Forbidden响应,触发原因按概率从高到低排序如下:
1. TLS版本不兼容
PayGate的API接口目前仅支持TLS 1.2及以上版本的加密协议,老版本.NET框架默认不会主动启用TLS 1.2,.NET Core部分版本在部分系统环境下也会出现协议协商失败的问题。
解决方法:在初始化PayHOSTClient之前强制指定TLS版本:
// 加在PayHOSTClient实例化代码之前 System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
同时建议把请求里的OrderType.TransactionDate赋值改为UTC时间,避免本地时间和服务端时间差过大触发校验失败:
OrderType.TransactionDate = DateTime.UtcNow;
2. 自动生成的WCF客户端配置错误
通过WSDL导入服务引用时自动生成的绑定、端点配置大概率不符合PayHost的接口要求,常见错误包括安全模式设置错误、端点地址带?wsdl后缀。
解决方法:不要使用默认的无参构造函数实例化PayHOSTClient,手动指定绑定和端点地址:
// 手动构造绑定和端点,替换原来的PayHOSTClient PayhostClient = new PayHOSTClient(); var binding = new BasicHttpsBinding(); binding.Security.Mode = BasicHttpsSecurityMode.Transport; binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None; var endpoint = new EndpointAddress("https://secure.paygate.co.za/payhost/process.trans"); PayHOSTClient PayhostClient = new PayHOSTClient(binding, endpoint);
3. 本地安全软件拦截
本地安装的防火墙、杀毒软件、终端安全管理工具可能会拦截出站的SOAP请求到支付类域名,哪怕切换网络环境也会生效。
解决方法:临时关闭本地安全软件后重试,或者检查安全软件的出站规则,放行secure.paygate.co.za域名的443端口请求。
4. 测试凭证触发临时限制
如果短时间内发起大量无效请求,PayGate的WAF规则会暂时封禁你的请求来源,哪怕使用的是公开测试凭证也会触发限制。
解决方法:间隔24小时后再测试,或者联系PayGate技术支持确认测试账号的状态。
内容的提问来源于stack exchange,提问作者Joshua Parsons
相关产品推荐
相关产品推荐

