php - 为 SOAP 请求创建特定信封

标签 php web-services soap wsdl

英语不是我的母语,所以请耐心等待。

我需要一个特定的信封来使用WebService,因为服务器管理员是一个不合作的人。现在我有点困惑,因为我不知道从哪里开始。

我需要报告一些信件和账单的状态,能够使用 PHP 编写一个脚本,在 MySQL 数据库中搜索信息并通过 webService 报告。

管理员没有向我发送带有“wsdl”配置的 IP 地址来制作 PHP Soap 客户端,而是发送示例文本文件(xml 类型)来制作信封。使用 SoapUI 能够得到一个答案(一个错误答案,但仍然是一个答案),但我正在尝试做一个自动报告(使用 Cron),但我不知道如何从 XML 制作一个信封来制作SoapClient 进行报告。

示例信封如下:

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.esb.comfenalcovalle.com.co/">
   <soapenv:Header/>
   <soapenv:Body>
      <ws:requestMessageOut>
         <ws:header>
            <ws:invokerDateTime>2017-05-05</ws:invokerDateTime>
            <ws:moduleId>ACTUALIZA_CORRESPONDENCIA</ws:moduleId>
            <ws:systemId></ws:systemId>
            <ws:messageId>ACTUALIZA_CORRESPONDENCIA|123456789</ws:messageId>
            <ws:logginData>
               <ws:sourceSystemId></ws:sourceSystemId>
               <ws:destinationSystemId></ws:destinationSystemId>
            </ws:logginData>
            <ws:destination>
               <ws:namespace>http://co/com/comfenalcovalle/esb/ws/BPSirapActualizaCorrespondencia</ws:namespace>
               <ws:name>BPSirapActualizaCorrespondencia</ws:name>
               <ws:operation>execute</ws:operation>
            </ws:destination>
            <ws:securityCredential>
               <ws:userName></ws:userName>
               <ws:userToken></ws:userToken>
            </ws:securityCredential>
            <ws:classification>
               <!--Zero or more repetitions:-->
               <ws:classification></ws:classification>
            </ws:classification>
         </ws:header>
         <ws:body>
            <ws:request>
             <BPSirapActualizaCorrespondenciaProcessRequest>
              <pividdocu>1075000000010907</pividdocu>
              <pinidesdo>25</pinidesdo>
              <pinidmoed></pinidmoed>
              <pivdireccion>CR 34-10 229</pivdireccion>
              <pivcodigoLeyMuni>76001</pivcodigoLeyMuni>
              <pivcodigoLeyDpto>76</pivcodigoLeyDpto>
              <pivnumeroGuia>574127725</pivnumeroGuia>
              <pivnumeroRemision>0102205-12</pivnumeroRemision>
              <pivguiaDigitalizada>iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAYAAADE6YVjAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIE1hY2ludG9zaCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowREMwRTAxRUU1RkQxMUU0QUFGMDlERUQ0Mzk5MEUyNSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoyNkIwNUI1RUU1RkQxMUU0QUFGMDlERUQ0Mzk5MEUyNSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjBEQzBFMDFDRTVGRDExRTRBQUYwOURFRDQzOTkwRTI1IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjBEQzBFMDFERTVGRDExRTRBQUYwOURFRDQzOTkwRTI1Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+U2I/YAAABJNJREFUeNq8Vm1MW2UUfu5tabtSPkpJLd9QoAPqEAZMmLrJnCiakW1O4w+y+MPETP2xLGOJMcbE+EeZ8YdxuKhxiYlZTIb7MV0cyUJwOpSJA9wYQz62FsZXoWWltKXt9bxv20uBjTCjnuY0t+8993w855znVpAkCf+1KDdgU0y6j3QnaRqpQOokvUJ6lrST1LeeA2GdSp4lPWSfdjV09ttxfXQCcwuLCJG5TqNCfnoKHi3KhiUzFXFK8Q2yPfGgQd6fmHW//dWP3ej+awyhUAjLZuELQRDpLIQsYzIO7t6KCkt6Cx03k45sJMhHfwzeOfJx6yW4vf6ITymC0mpbUT7bu70EB+vKWaB3SB3r9eTdvqHJIx982w7/UpCgkagK0qCEIFXDs6IPDylEwogCVEolzv5yHdo41aEDtVZ2/Pr9KtntcC22NX1+Hi7CfikQgk6rgiklETkmPYxJ8eC2EecKUYQ6ToFrt6bQ1W+DGIl67MUdqLZmNdHl8XsFOfPh6Z/2X75xCwGqotSSgcL0VKogiJ1b8lBAjY4VXyCI7yj7TEMSRqfmcLqtByq1gpLR4fhr9dBtUhnIbDYKKhPL+Mzd/d1DYxyOIEFUX2VhhvD4Aljw+ddMxtC4A59804HWS9fwhDUHCiVVQohOudz4+c/bzOSl1T3Zc+WmnSAKcqwF+mIV1hRnwesPwJisxSA57RuZBLUH+aZkFGYYcLjxSaokEX72HMORz4aEXhr3Z6oKnqJfn8UGMU/MubljFkChENE7PMGDijSq7b3DGHfcRVVRJvfTecOO9p4R1JRk8wG5THvEpowhzwZh0O5gyR3QqJTxdGMhGiQpDEl4coLU9FKzicPAhqpn+A4qCzPwxbnf4PUtoeFxK7QEZXl+GsgRbo7NorWjT0bA5fFggcaf7ulZEFGegJW7Jos/EICXsrVNu+Ca92BpKYAB+wy0apXcKwkh+VkGm7jsbUVP5tlDUUtJXj7wTE16HZJ1GlQ/Ysa824ttmzMx41qAXrdJTlGiYZEiKeu0asRruD9n7HTZDIlaebMFYWUm+7YXEyQOPJxjRG1ZHkYnnairKJB3YxmL8LN5xhSW3Dk6cMcGOV9RkA6lYpkA2LJFJZEya3rhMZTmmWCmxTy8t5p2yLBMLoIgMwBr/hayI7kYSz5Mruam6dusuUYZMtu0cy3nZ6XyQOq4lWw07/HKtJMYr0aNNZMv9724q+WVuvKn3/pymmdzhqYlw5CAkmwjVSXwM0nmLomyB+c2NvqnLnRzmFg1jbvKkJoU/x6Z3r4fCzdf/H3o6Invf0WAxjgkMf7S8Nlfy8bhYJ5FH1VB2SpFPFe5Ga8+X9mymiBXs3DTrop8jagQ3jz5Qxd8tO2eRf8KlmeOhWijhXBlSoWAuq2FLMBJuvHpRl9azQO2maNft11Fv22SoGJQSHJjw0sX4oEe0iegoaYI9dssLACroudBXr8vs9dv18DYjo6+EUw73ZwseflEO2zky2jja8vMtJhxx9jLDohu5caDRGUPaSNpLmlClAhIGWFdID3FBuyf/pH410TE/yB/CzAAZIXaj6vGZXwAAAAASUVORK5CYII=</pivguiaDigitalizada>
             </BPSirapActualizaCorrespondenciaProcessRequest>
            </ws:request>
         </ws:body>
      </ws:requestMessageOut>
   </soapenv:Body>
</soapenv:Envelope>

如果您将此代码复制/粘贴到 SoapUI 并将“端点”设置为:https://virtual.comfenalcovalle.com.co/esbtest/WSChannelAdapter ...您将得到我正在讨论的错误答案。

我在寻找答案时寻找的一些链接:

how to generate a soap request in php from this xml?

https://www.wackylabs.net/2004/07/creating-a-web-service-and-wsdl-using-nusoap/

how to create soap xml request in php

PHP SoapClient: multiple complex types are overwritten in soapcall

how to generate XML with soap envelope and body tag using php

------------------> 5 月 18 日更新

感谢 Alex Blex 的回答,利用他的观点将 XML 作为“字符串”可以使用一种解决方法来使用 WebService,而不是配置客户端,只需使用“null”。

$location_URL = 'https://virtual.comfenalcovalle.com.co/esbtest/WSChannelAdapter';
$action_URL = "https://virtual.comfenalcovalle.com.co/esbtest/WSChannelAdapter";

$client = new SoapClient(null, array(
'location' => $location_URL,
'uri'      => "https://virtual.comfenalcovalle.com.co/esbtest/WSChannelAdapter",
'trace'    => 1,
));

$return = $client->__doRequest($xmlString,$location_URL,$action_URL,1);

遗憾的是,$return 也是一个字符串,而不是一个对象或 XML,因此获取报告并将其存储在数据库中非常困难。

当我使用 Alex Blex 提出的方法时,没有收到任何东西,这是对其代码的一个小修改:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://virtual.comfenalcovalle.com.co/esbtest/WSChannelAdapter');
curl_setopt( $ch, CURLOPT_POST, true );
curl_setopt( $ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml'));
curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt( $ch, CURLOPT_POSTFIELDS, $xmlstring );

$result = curl_exec($ch);
$info = curl_getinfo($ch);
$errors = curl_error($ch);

$resArr = array();
$resArr = json_decode($result);
$xml = simplexml_load_string($result);

echo "<pre>"; print_r($result); echo "</pre>";
echo "<pre>"; print_r($info); echo "</pre>";
echo "<pre>"; print_r($resArr); echo "</pre>";
echo "<pre>"; print_r($errors); echo "</pre>";
curl_close($ch);

我已经在与客户合作,但任何修正或新方法都可以尽快实现。

最佳答案

您可以使用 cURL 进行低级别操作。

如果您将 xml POST 到 API,例如

curl --request POST \
  --url https://virtual.comfenalcovalle.com.co/esbtest/WSChannelAdapter \
  --data '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.esb.comfenalcovalle.com.co/"> .... </soapenv:Envelope>'

您实际上得到了成功的响应

    ....
    <NS1:responseMessageOut xmlns:NS1="http://ws.esb.comfenalcovalle.com.co/">
        <NS1:header>
            <NS1:invokerDateTime>2017-05-05</NS1:invokerDateTime>
            <NS1:moduleId>ACTUALIZA_CORRESPONDENCIA</NS1:moduleId>
            <NS1:systemId></NS1:systemId>
            <NS1:messageId>ACTUALIZA_CORRESPONDENCIA|123456789</NS1:messageId>
            <NS1:logginData>
                <NS1:sourceSystemId></NS1:sourceSystemId>
                <NS1:destinationSystemId></NS1:destinationSystemId>
            </NS1:logginData>
            <NS1:destination>
                <NS1:namespace>http://co/com/comfenalcovalle/esb/ws/BPSirapActualizaCorrespondencia</NS1:namespace>
                <NS1:name>BPSirapActualizaCorrespondencia</NS1:name>
                <NS1:operation>execute</NS1:operation>
            </NS1:destination>
            <NS1:responseStatus>
                <NS1:statusCode>SUCESS</NS1:statusCode>
            </NS1:responseStatus>
        </NS1:header>
        <NS1:body>
            <NS1:response>
                <BPSirapActualizaCorres
      ....

在 php 中应该是这样的

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'https://virtual.comfenalcovalle.com.co/esbtest/WSChannelAdapter');
    curl_setopt( $ch, CURLOPT_POST, true );
    curl_setopt( $ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml'));
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
    curl_setopt( $ch, CURLOPT_POSTFIELDS, $theXML );
    $result = curl_exec($ch);
    curl_close($ch);

$result 中的响应可以使用 DOMXml 或 SimpleXML 进行解析。

关于php - 为 SOAP 请求创建特定信封,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43813350/

相关文章:

web-services - 获取 WCF 调用的 URL

php - 如何在 UPS API 中指定货件是否为住宅货件?

php - 如何获取给定城市的时间?

web-services - 为什么REST不像SOAP那样不利用WSDL?

javascript - 使用按钮的多个复选框选项分为选项卡

php - 在数组循环内显示数组

php - 在 php 中动态创建复选框时,如何并排对齐它们?

php - 在 Apache 服务器上使用 WebSocket

java - 使用 Camel+Spring WS 发送 SOAP 附件?

soap - Go 上的 WSDL/SOAP 支持?