我正在尝试使用以下PHP代码建立SOAP连接,但在SoapClient构造时失败了:
// Need to declare these settings here because our php.ini has alternate
// settings due to global purposes for other PHP scripts
ini_set("soap.wsdl_cache_enabled", "0");
ini_set("soap.wsdl_cache", "0");
ini_set("display_errors","On");
ini_set("track_errors","On");
// FedEx web services URL, note the HTTPS
$path_to_wsdl = 'https://wsbeta.fedex.com/web-services';
$soap_args = array(
'exceptions'=>true,
'cache_wsdl'=>WSDL_CACHE_NONE,
'trace'=>1)
;
try {
$client = new SoapClient($path_to_wsdl,$soap_args);
} catch (SoapFault $e) {
var_dump(libxml_get_last_error());
echo "<BR><BR>";
var_dump($e);
}
这输出:
object(LibXMLError)#1 (6) {
["level"]=> int(1)
["code"]=> int(1549)
["column"]=> int(0)
["message"]=> string(71) "failed to load external entity "https://wsbeta.fedex.com/web-services" "
["file"]=> string(0) ""
["line"]=> int(0)
}
object(SoapFault)#2 (9) {
["message":protected]=> string(158) "SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://wsbeta.fedex.com/web-services' : failed to load external entity "https://wsbeta.fedex.com/web-services" "
["string":"Exception":private]=> string(0) ""
["code":protected]=> int(0)
["file":protected]=> string(53) "/mnt/array/bell-enterprise/bell/fedex_shipservice.php"
["line":protected]=> int(34)
["trace":"Exception":private]=> array(1) {
[0]=> array(6) {
["file"]=> string(53) "/mnt/array/bell-enterprise/bell/fedex_shipservice.php"
["line"]=> int(34)
["function"]=> string(10) "SoapClient"
["class"]=> string(10) "SoapClient"
["type"]=> string(2) "->"
["args"]=> array(2) {
[0]=> string(37) "https://wsbeta.fedex.com/web-services"
[1]=> array(4) {
["exceptions"]=> bool(true)
["soap_version"]=> int(1)
["cache_wsdl"]=> int(0)
["trace"]=> int(1)
}
}
}
}
["previous":"Exception":private]=> NULL
["faultstring"]=> string(158) "SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://wsbeta.fedex.com/web-services' : failed to load external entity "https://wsbeta.fedex.com/web-services" "
["faultcode"]=> string(4) "WSDL"
}
头痛 6 小时后,唯一的解决方案是下载 WSDL 文件。
https://wsbeta.fedex.com/web-services和https://ws.fedex.com/web-services
它总是会抛出错误 500,因为这不是 wsdl。
从技术资源 -> FedEx WebServices for Transport> GetStarted(单击"费率服务",然后单击"下载 WSDL 或 XML")下载 wsdls 后,您需要在脚本中加载本地存储的 WSDL,一切都会像魅力一样工作。
$this->_soapClient = new SoapClient("RateService_v13.wsdl", array('exceptions'=>true, 'trace' => true));
玩得愉快!
该 url 不是 WSDL 的路径,而是 SOAP 请求应该去的 URL。从来没有和这些家伙一起工作过,但我收集你可以得到一个 wsdl 文件并将其存储在本地,你可以将该 wsdl 中的端点更改为 wsbeta 端点。 我找不到 wsdl,而且 fedex 网站不允许我在不注册的情况下进一步了解他们的开发技术资源,所以我就不说了:你的 wsdl 在其他地方,你拥有的网址只是特定服务的位置。
您需要一个本地证书文件才能访问 HTTPS 上的 WSDL:
$client = new SoapClient($wsdl, array('local_cert' => $pathToLocalCert));
将此选项追加到当前$soap_args
,此代码应按预期工作。如果证书需要passphrase
选项,也可以使用它。