7

ソフトウェアをSecureNetゲートウェイと統合しようとしています。彼らはSOAPベースのAPIを持っています。

私が抱えている問題は、WSDLファイルが実際にはPHPで機能しないことです。wsdl:import具体的には、WSDLファイルはステートメントを使用して複数のファイルに分割され、インポート場所はhttpです。テストサーバーhttphttpsポートが開いているため、PHPはWSDLファイルを読み取ることができます。本番サーバーでhttpsは開いているだけですが、ロケーションブロックはまだ参照httpしているため、PHPはタイムアウトになります。もしそうなら、それはhttpsうまくいくでしょう。

彼らの推奨は、テストサーバーからWSDLファイルをプルすることでしたが、場所をオーバーライドします。テストサーバーは常に稼働している必要があると言われていますが、トランザクションが機能するために2つのシステムに依存することに抵抗があります。

もう1つの方法は、XML post APIを使用することです...しかし、それに関する問題は、すべてのフィールド(必要かどうか)を正しい順序で指定する必要があることです。最悪の部分は、このAPIのエラーメッセージが単純Unknown Error.であるため、私が何を見逃しているのかを理解することはほぼ不可能です。

3番目のオプションが必要です。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
4

2 に答える 2

0

非 SSL アセットが含まれる SSL 経由で Web サイトにアクセスすると警告が表示されるのと同様に、リモート WSDL ファイルのバグのように思えます。

幸いなことに、私たちはそれを回避できるようです。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 に答える