与SecureNet支付网关集成

时间:2013-01-24 20:59:12

标签: php wcf soap wsdl soap-client

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

我遇到的问题是他们的WSDL文件真的不适用于PHP。具体来说,他们的WSDL文件使用wsdl:import语句拆分为多个文件,导入位置为http。在他们的测试服务器上httphttps端口是打开的,因此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

2 个答案:

答案 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);
    }
}