Vấn đề: PHP SoapClient báo lỗi khi WSDL chứa policy/extension (WS-Policy, WS-Security) từ SAP.
Giải pháp 1: Sửa WSDL – Bỏ required policy
Tìm trong WSDL:
<wsp:UsingPolicy wsdl:required="true"/>
Sửa thành:
<wsp:UsingPolicy wsdl:required="false"/>
Giải pháp 2: Dùng endpoint /standard/ thay /ws_policy/
- Mở SAP SOAMANAGER → SOA Management.
- Chọn Web Service → Binding → Overview.
- URL chứa
ws_policy→ thay bằngstandard. - Lấy WSDL mới (không có policy) để dùng với PHP SoapClient.
Giải pháp 3: Tải WSDL về, sửa local, dùng file local
<?php
$client = new SoapClient('/path/to/fixed.wsdl', [
'trace' => 1,
'exceptions' => true,
'cache_wsdl' => WSDL_CACHE_NONE
]);
?>
Giải pháp 4: Dùng thư viện mạnh hơn
- WsdlToPhp – Generate class từ WSDL.
- PHP-SOAP (composer:
php-http/client-implementation) – Hỗ trợ WS-Security tốt hơn.
Lưu ý: SAP thường yêu cầu WS-Security (UsernameToken, X.509, SAML). PHP SoapClient gốc hỗ trợ kém. Cân nhắc dùng middleware (PI/PO, CPI) chuyển đổi sang REST/OData cho PHP dễ dùng hơn.