我正在尝试将我们的软件与SecureNet网关集成。他们有一个基于SOAP的API。
我遇到的问题是他们的WSDL文件真的不适用于PHP。具体来说,他们的WSDL文件使用wsdl:import
语句拆分为多个文件,导入位置为http
。在他们的测试服务器上http
和https
端口是打开的,因此PHP可以读取WSDL文件。在他们的生产服务器上只有https
打开,但他们的位置块仍然引用http
,因此PHP超时!如果它是https
它会正常工作。
他们的建议是从他们的测试服务器中提取WSDL文件,但是覆盖该位置。他们告诉我他们的测试服务器应该总是在运行,但是我觉得依靠两个系统让我们的交易工作起来感觉很舒服。
另一种选择是使用他们的XML post API ......但问题是你必须以正确的顺序指定每个字段(是否需要)。最糟糕的是这个API的错误消息只是Unknown Error.
,因此几乎不可能弄清楚我缺少的是什么。
我需要第三种选择。如果我可以加载WSDL文件(可以测试,而不是生产),Soap运行良好。我认为他们正在使用WCF,我认为这是一个.NET的东西。应该有一个“?simpleWSDL”经文“?wsdl”选项,但是他们的WCF版本没有它。
这是他们的WSDL文件(测试服务器):https://certify.securenet.com/API/Gateway.svc?wsdl
修改
以下是可重现的代码:
$client = new SoapClient("https://gateway.securenet.com/API/Gateway.svc?wsdl");
// Hangs and throws exception in construct
答案 0 :(得分:0)
您可以从生产服务器提取WSDL,并使用SoapClient::__setLocation
以编程方式覆盖该位置答案 1 :(得分:0)
这听起来更像是远程WSDL文件中的错误,类似于通过SSL访问包含非SSL资产的网站会导致警告。
幸运的是,看起来我们可以解决它。 The SoapClient Manual Page对端口号有类似的解决方法,由用户jjlopez发布。
解决方法是扩展基础SoapClient类以重写它将发出请求的URL,如下所示:
class SecureSoapClient extends \SoapClient
{
protected $_scheme;
public function __construct($wsdl, $options)
{
$this->_scheme = parse_url($wsdl, PHP_URL_SCHEME);
return parent::__construct($wsdl, $options);
}
public function __doRequest($request, $location, $action, $version, $one_way = 0) {
$currentScheme = parse_url($location, PHP_URL_SCHEME);
$location = preg_replace('^' . $currentScheme, $this->_scheme, $location);
return parent::__doRequest($request, $location, $action, $version, $one_way);
}
}