1

[解決済み] -this wsdl- で説明されているように、GeneraTimbre メソッドを使用しようとしています。

<wsdl:definitions xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="https://test.timbrado.com.mx/cfdi/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" targetNamespace="https://test.timbrado.com.mx/cfdi/">
<wsdl:types>
<s:schema elementFormDefault="qualified" targetNamespace="https://test.timbrado.com.mx/cfdi/">
<s:element name="GeneraTimbre">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="xmlBytes" type="s:base64Binary"/>
</s:sequence>
</s:complexType>
</s:element>
<s:element name="GeneraTimbreResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="GeneraTimbreResult" type="s:string"/>
</s:sequence>
</s:complexType>
</s:element>
<s:element name="AuthenticationHeader" type="tns:AuthenticationHeader"/>
<s:complexType name="AuthenticationHeader">
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="UserName" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="Password" type="s:string"/>
</s:sequence>
<s:anyAttribute/>...

私のコードは次のようになります:

$timbrador=new SoapClient("http://test.timbrado.com.mx/cfdi/wsTimbrado.asmx?wsdl");
$header = array('UserName' => $user,'Password' => $pass);
$Soapheader = new SOAPHeader('https://test.timbrado.com.mx/cfdi/', 'AuthenticationHeader', $header);
$timbrador->__setSoapHeaders($Soapheader); 
$xml="An Xml String....";
$cfdi=$timbrador->GeneraTimbre(base64_encode($xml));

これは、__getLastRequest() で取得したリクエストです。

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="https://test.timbrado.com.mx/cfdi/">
    <SOAP-ENV:Header><ns1:AuthenticationHeader><ns1:UserName>0000000001</ns1:UserName><ns1:Password>pwd</ns1:Password></ns1:AuthenticationHeader></SOAP-ENV:Header>
        <SOAP-ENV:Body><ns1:GeneraTimbre/></SOAP-ENV:Body>
</SOAP-ENV:Envelope>

サーバーから「空のバッファ」応答を受信して​​います。これは、エンコーディング行から関数に送信されたデータが表示されないためだと考えています。

base64_encode($xml); (if i echo it, i get a long string like this:  

PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4gDQo8Y2ZkaTpDb21wcm9iYW50ZSB4bWxuczpjZmRpPSJodHRwOi8vd3d3LnNhdC5nb2IubXgvY2ZkLzMiIHhtb....)

私は SOAP に慣れていないので、文字列はリクエストのどこかにあるはずだと思いますが、大丈夫ですか? または、コードで何か間違ったことをしていますか?

- - - - - - - - - - - - -解決 - - - - - - - - - - -

そこで、担当者に連絡して「WSで何が得られると思いますか」と尋ねたところ、この関数で問題を解決しました(ティンブラドールと呼ばれるクラスで)

    public function timbrar($xml)//receives the xml string to be sent
    {
        $request='<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:cfdi="https://test.timbrado.com.mx/cfdi/">
   <soap:Header>
      <cfdi:AuthenticationHeader>
 <cfdi:UserName>0000000001</cfdi:UserName>
           <cfdi:Password>pwd</cfdi:Password>
      </cfdi:AuthenticationHeader>
   </soap:Header>
   <soap:Body>
      <cfdi:GeneraTimbre>
 <cfdi:xmlBytes>'.base64_encode($xml).'</cfdi:xmlBytes>
      </cfdi:GeneraTimbre>
   </soap:Body>
</soap:Envelope>';
        try
        {
        $cfdi=$this->timbrador->
        __doRequest($request,"http://test.timbrado.com.mx/cfdi/wsTimbrado.asmx",
        "http://test.timbrado.com.mx/cfdi/wsTimbrado.asmx?op=GeneraTimbre",
        SOAP_1_2,
        0);
        $this->resultado_timbre=$cfdi;
        }catch(SoapFault $fault){ 
            echo "REQUEST:<br>" . htmlentities(str_ireplace('><', ">\n<", $this->timbrador->__getLastRequest())) . "<br>";
            echo "Response:<br>" . htmlentities(str_ireplace('><', ">\n<", $this->timbrador->__getLastResponse())) . "<br>";
         $fault->getMessage(); 
} 
    }
4

1 に答える 1