18

基本認証の背後にある WSDL から php クラスを構築する必要があります。

大量の名前空間があるため、これを手動で行うのは面倒に見えます。

いくつかのツールを試しましたが、認証セッションが持続していないようです。

4

7 に答える 7

5

HTTP 認証は SOAP クライアントで動作しますが、パスワードで保護された WSDL ファイルにはアクセスできません

https://bugs.php.net/bug.php?id=27777を参照してください

于 2012-06-13T09:05:13.590 に答える
4

組み込みの SOAP クライアントを使用すると、次のようになります。

$options = array(
    'login' => $username,
    'password' => $password,
);
$client = new SoapClient($wsdl, $options);
于 2012-04-20T06:20:16.583 に答える
3

lib nusoapを使用してこれを解決しました。それが役立つかどうかを確認してください

$params = array(
  "param" => "value"
);

$soap_client = new nusoap_client($wsdl_url, true);
$soap_client->setCredentials(USER_SERVICE, PASS_SERVICE, 'basic');
$soap_client->soap_defencoding = 'UTF-8'; //Fix encode erro, if you need
$soap_return = $soap_client->call("method_name", $params);
于 2015-02-02T19:40:36.750 に答える
2

この解決策はどうですか:

  1. WSDL をダウンロードしてローカル ファイルに保存する
  2. ローカル ファイルで SoapClient を作成する

このようなもの(簡略版):

class MySoap {

    private $WSDL = 'https://secure-wsdl.url?wsdl';

    private $USERNAME = 'dummy';
    private $PASSWORD = 'dummy';

    private $soapclient;

    private function localWSDL()
    {
        $local_file_name = 'local.wsdl';
        $local_file_path = 'path/to/file/'.$local_file_name;

        // Cache local file for 1 day
        if (filemtime($local_file_path) < time() - 86400) {

            // Modify URL to format http://[username]:[password]@[wsdl_url]
            $WSDL_URL = preg_replace('/^https:\/\//', "https://{$this->USERNAME}:{$this->PASSWORD}@", $this->WSDL);

            $wsdl_content = file_get_contents($WSDL_URL);
            if ($wsdl_content === FALSE) {

                throw new Exception("Download error");
            }

            if (file_put_contents($local_file_path, $wsdl_content) === false) {

                throw new Exception("Write error");
            }
        }

        return $local_file_path;
    }

    private function getSoap()
    {
        if ( ! $this->soapclient )
        {
            $this->soapclient = new SoapClient($this->localWSDL(), array(
                'login'    => $this->USERNAME,
                'password' => $this->PASSWORD,
            ));
        }

        return $this->soapclient;
    }

    public function callWs() {

        $this->getSoap()->wsMethod();
    }
}

わたしにはできる :)

于 2017-10-19T10:06:49.260 に答える
0

これは、soapClient を使用して Web サービスを認証する簡単な例です。

$apiauth =array('UserName'=>'abcusername','Password'=>'xyzpassword','UserCode'=>'1991');
$wsdl = 'http://sitename.com/service.asmx?WSDL';
$header = new SoapHeader('http://tempuri.org/', 'AuthHeader', $apiauth);
$soap = new SoapClient($wsdl); 
$soap->__setSoapHeaders($header);       
$data = $soap->methodname($header);        

このコードは、次のようにヘッダーを内部的に解析します

<soap:Header>
    <AuthHeader xmlns="http://tempuri.org/">
      <UserName>abcusername</UserName>
      <Password>xyzpassword</Password>
      <UserCode>1991</UserCode>
    </AuthHeader>
</soap:Header>
于 2016-08-08T06:37:08.190 に答える