簡體   English   中英

PHP SoapClient失敗並-無法加載外部實體

[英]PHP SoapClient fails with - Failed to load external entity

我一直在嘗試使用歐盟的網站來驗證TIN號( Europa TIN驗證網站-頁面底部提供了WSDL)

我遇到的問題是,當我嘗試制作新的SoapClient時,該功能會在構建客戶端時立即失敗。 最初,我遇到了“無法加載外部實體”的問題,並且我認為這是因為WSDL具有安全連接。 在四處搜尋之后,我發現一些答案,說這個問題可能與證書過時有關,在這種情況下,最新版本的PHP引發錯誤,因此我使用以下方法禁用了證書驗證:

    // Stream context due to certificate problems
    $streamContext = stream_context_create(array(
        'ssl' => array(
            'verify_peer' => false,
            'verify_peer_name' => false,
            'allow_self_signed' => true
        )
    ));

但是現在我又遇到另一個錯誤:“無法打開流:HTTP請求失敗!HTTP / 1.1 502錯誤的網關”。 關於如何解決這個問題有什么想法嗎? 如果從鏈接中刪除“ https://”,則會收到與“加載外部實體失敗”消息相同的結果。

現在是真正的大腦選擇器。 如果我嘗試使用chrome的擴展名“ Boomerang”來測試WSDL上的SOAP調用,那么它絕對完美,所以我不知道這里出了什么問題。任何人都可以通過嘗試在PHP文件中進行soap調用來輕松地嘗試這一點。

這是完整的代碼:

public static function validateTIN($tin) {
    // Stream context due to certificate problems
    $streamContext = stream_context_create(array(
        'ssl' => array(
            'verify_peer' => false,
            'verify_peer_name' => false,
            'allow_self_signed' => true
        )
    ));

    // Create our soap client
    $client = new SoapClient('https://ec.europa.eu/taxation_customs/tin/checkTinService.wsdl', array(
        'exceptions' => 0,
        'trace' => 1,
        'connection_timeout' => 1800,
        'stream_context' => $streamContext
    ));

    dd($client->__getFunctions());

    return true;
}

經過數小時的研究並試圖找出問題所在,我發現了一篇2歲的帖子,以某種方式滿足了我的目的。

不幸的是,我不能將其標記為重復,因此我將其鏈接到此處: 無法從ws中加載解析wsl的SOAP錯誤,但可以在wamp上工作

我找不到此問題,因為Google並未將其標記為使用Europa服務。

無論哪種方式,我的問題是我都需要明確指定用戶代理,因為Europa Web服務已過時且無法解析IPv6請求,只能解析IPv4。 像這樣:

$opts = array(
    'http'=>array(
        'user_agent' => 'PHPSoapClient'
        )
    );

$context = stream_context_create($opts);
$client = new SoapClient('http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl',
                         array('stream_context' => $context,
                               'cache_wsdl' => WSDL_CACHE_NONE));

$result = $client->checkVat(array(
                                'countryCode' => 'DK',
                                'vatNumber' => '47458714'
                                ));

該示例使用CheckVAT SOAP函數,但對CheckTIN函數也同樣有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM