7

我正在尝试将我们的软件与 SecureNet 网关集成。他们有一个基于 SOAP 的 API。

我遇到的问题是他们的 WSDL 文件确实不适用于 PHP。具体来说,他们的 WSDL 文件使用语句拆分为多个文件,wsdl:import导入位置为http. 在他们的测试服务器上httphttps端口是开放的,所以 PHP 可以读取 WSDL 文件。在他们的生产服务器上只https打开,但他们的位置块仍然引用http,所以 PHP 超时!如果是这样,https它会工作得很好。

他们的建议是从他们的测试服务器中提取 WSDL 文件,但覆盖该位置。他们告诉我他们的测试服务器应该始终处于启动状态,但我觉得依靠两个系统来让我们的交易正常工作并不自在。

另一种选择是使用他们的 XML post API ......但问题是您必须以正确的顺序指定每个字段(需要或不需要)。最糟糕的是这个 API 的错误消息是简单Unknown Error.的,所以几乎不可能弄清楚我错过了什么。

我需要第三种选择。如果我可以加载 WSDL 文件(可以在测试中,而不是在生产中),那么肥皂效果很好。我认为他们正在使用 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
4

2 回答 2

0

这听起来更像是远程 WSDL 文件中的错误,类似于通过 SSL 访问包含非 SSL 资产的网站会导致警告。

幸运的是,看起来我们可以解决它。SoapClient 手册页有一个类似的端口号解决方法,由用户 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);
    }
}
于 2013-12-11T09:14:51.753 回答
0

您可以从生产服务器中提取 WSDL 并使用SoapClient::__setLocation以编程方式覆盖该位置

于 2013-03-14T09:24:59.040 回答