2015-05-13 17 views
12

To jest mój pierwszy raz, gdy robię SOAP na PHP (jestem naprawdę nowicjuszem), i utknąłem w tym problemie od miesięcy.PHP SOAP z wsdl i 2-way SSL

https://wstest.oriongateway.com:22837/willani/services/oglws?wsdl 

Jest to adres URL usługa, żądają 2-drożny SSL na produkcji i mają zapewnić mi komplet kluczy prywatnych i publicznych cert zainstalować na moim serwerze.

Mogę wyświetlić adres URL, instalując klucz prywatny w przeglądarce.

W tym momencie pomyślnie otrzymałem odpowiedź od usługi sieciowej za pomocą bezdotykowego protokołu SSL i jednokierunkowego protokołu SSL, ale dwukierunkowe połączenie SSL nie działa.

Komunikat o błędzie, gdy przesyłam dwukierunkowe połączenie SSL przez SOAP.

Warning: SoapClient::__doRequest(): SSL operation failed with code 1. OpenSSL Error messages: error:14094412:SSL routines:SSL3_READ_BYTES:sslv3 alert bad certificate in /home/loadme/domains/loadme.my/public_html/system/OglWsService_noservice.php on line 124
Warning: SoapClient::__doRequest(): Failed to enable crypto in /home/loadme/domains/loadme.my/public_html/system/OglWsService_noservice.php on line 124
Warning: SoapClient::__doRequest(): connect() failed: Unspecified error in /home/loadme/domains/loadme.my/public_html/system/OglWsService_noservice.php on line 124

Moje SOAP plik żądania

<?php 
require_once 'OglWsService.php'; 

$requestMsg = new RequestMsg; 

$requestMsg->amount="1000"; 
$requestMsg->merchantId="620055"; 
$requestMsg->operatorId="IBS"; 
$requestMsg->retTransRef="102182ABCqw1238"; 
$requestMsg->terminalId="10000102"; 
$requestMsg->productCode="DIGI"; 
$requestMsg->transDateTime=date("YmdHis"); 
$requestMsg->transTraceId = (int)"123212321"; 


$in0 = new onlinePIN(); 
$in0->in0=$requestMsg; 

$oglWsService = new OglWsService(); 

$reponseMsg = $oglWsService->onlinePIN($in0); 
$arr=get_object_vars($reponseMsg); 
print_r($arr); 
echo $arr['onlinePINReturn']->transRef; 
?> 

Moja klasa Webservice

<?php 
class RequestMsg { 
    public $amount; // string 
    public $merchantId; // string 
    public $operatorId; // string 
    public $orgTransRef; // string 
    public $retTransRef; // string 
    public $terminalId; // string 
    public $productCode; // string 
    public $msisdn; // string 
    public $transDateTime; // string 
    public $transTraceId; // int 
    public $customField1; // string 
    public $customField2; // string 
    public $customField3; // string 
    public $customField4; // string 
    public $customField5; // string 
} 

class ResponseMsg { 
    public $amount; // string 
    public $pin; // string 
    public $pinExpiryDate; // string 
    public $productCode; // string 
    public $responseCode; // string 
    public $responseMsg; // string 
    public $retTransRef; // string 
    public $terminalId; // string 
    public $transRef; // string 
    public $customField1; // string 
    public $customField2; // string 
    public $customField3; // string 
    public $customField4; // string 
    public $customField5; // string 
} 

class onlinePIN { 
    public $in0; // RequestMsg 
} 

class onlinePINResponse { 
    public $onlinePINReturn; // ResponseMsg 
} 

class onlinePINReversal { 
    public $in0; // RequestMsg 
} 

class onlinePINReversalResponse { 
    public $onlinePINReversalReturn; // ResponseMsg 
} 

class etopup { 
    public $in0; // RequestMsg 
} 

class etopupResponse { 
    public $etopupReturn; // ResponseMsg 
} 

class etopupReversal { 
    public $in0; // RequestMsg 
} 

class etopupReversalResponse { 
    public $etopupReversalReturn; // ResponseMsg 
} 

class networkCheck { 
    public $in0; // RequestMsg 
} 

class networkCheckResponse { 
    public $networkCheck; // ResponseMsg 
} 


/** 
* OglWsService class 
* 
* 
* 
* @author {author} 
* @copyright {copyright} 
* @package {package} 
*/ 
class OglWsService extends SoapClient { 

    private static $classmap = array(
            'RequestMsg' => 'RequestMsg', 
            'ResponseMsg' => 'ResponseMsg', 
            'onlinePIN' => 'onlinePIN', 
            'onlinePINResponse' => 'onlinePINResponse', 
            'onlinePINReversal' => 'onlinePINReversal', 
            'onlinePINReversalResponse' => 'onlinePINReversalResponse', 
            'etopup' => 'etopup', 
            'etopupResponse' => 'etopupResponse', 
            'etopupReversal' => 'etopupReversal', 
            'etopupReversalResponse' => 'etopupReversalResponse', 
            'networkCheck' => 'networkCheck', 
            'networkCheckResponse' => 'networkCheckResponse', 
            ); 

    public function OglWsService($wsdl = "oglws_ver2_4_doc_literal.wsdl", $options = array()) { 
    foreach(self::$classmap as $key => $value) { 
     if(!isset($options['classmap'][$key])) { 
     $options['classmap'][$key] = $value; 
     } 
    } 
    parent::__construct($wsdl, $options); 
    } 

    /** 
    * 
    * 
    * @param onlinePIN $parameters 
    * @return onlinePINResponse 
    */ 
    public function onlinePIN(onlinePIN $parameters) { 
    return $this->__soapCall('onlinePIN', array($parameters),  array(
      'uri' => 'urn:EPAYIBWS', 
      'soapaction' => '' 
      ) 
    ); 
    } 

    /** 
    * 
    * 
    * @param onlinePINReversal $parameters 
    * @return onlinePINReversalResponse 
    */ 
    public function onlinePINReversal(onlinePINReversal $parameters) { 
    return $this->__soapCall('onlinePINReversal', array($parameters),  array(
      'uri' => 'urn:EPAYIBWS', 
      'soapaction' => '' 
      ) 
    ); 
    } 

    /** 
    * 
    * 
    * @param etopup $parameters 
    * @return etopupResponse 
    */ 
    public function etopup(etopup $parameters) { 
    return $this->__soapCall('etopup', array($parameters),  array(
      'uri' => 'urn:EPAYIBWS', 
      'soapaction' => '' 
      ) 
    ); 
    } 

    /** 
    * 
    * 
    * @param etopupReversal $parameters 
    * @return etopupReversalResponse 
    */ 
    public function etopupReversal(etopupReversal $parameters) { 
    return $this->__soapCall('etopupReversal', array($parameters),  array(
      'uri' => 'urn:EPAYIBWS', 
      'soapaction' => '' 
      ) 
    ); 
    } 

    /** 
    * 
    * 
    * @param networkCheck $parameters 
    * @return networkCheckResponse 
    */ 
    public function networkCheck(networkCheck $parameters) { 
    return $this->__soapCall('networkCheck', array($parameters),  array(
      'uri' => 'urn:EPAYIBWS', 
      'soapaction' => '' 
      ) 
    ); 
    } 

} 

?> 

Mój plik WSDL

<?xml version="1.0" encoding="UTF-8"?> 
<wsdl:definitions 
     targetNamespace="urn:EPAYIBWS" 
     xmlns:apachesoap="http://xml.apache.org/xml-soap" 
     xmlns:impl="urn:EPAYIBWS" 
     xmlns:intf="urn:EPAYIBWS" 
     xmlns:tns1="http://schemas.xmlsoap.org/soap/encoding/" 
     xmlns:tns2="http://axis.apache.org" 
     xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
     xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<wsdl:types> 
    <schema elementFormDefault="qualified" targetNamespace="urn:EPAYIBWS" xmlns="http://www.w3.org/2001/XMLSchema"> 
    <complexType name="RequestMsg"> 
    <sequence> 
    <element name="amount" nillable="true" type="tns1:string"/> 
    <element name="merchantId" nillable="true" type="tns1:string"/> 
    <element name="operatorId" nillable="true" type="tns1:string"/> 
    <element name="orgTransRef" nillable="true" type="tns1:string"/> 
    <element name="retTransRef" nillable="true" type="tns1:string"/> 
    <element name="terminalId" nillable="true" type="tns1:string"/> 
    <element name="productCode" nillable="true" type="tns1:string"/> 
    <element name="msisdn" nillable="true" type="tns1:string"/> 
    <element name="transDateTime" nillable="true" type="tns1:string"/> 
    <element name="transTraceId" type="xsd:int"/> 
    <element name="customField1" nillable="true" type="tns1:string"/> 
    <element name="customField2" nillable="true" type="tns1:string"/> 
    <element name="customField3" nillable="true" type="tns1:string"/> 
    <element name="customField4" nillable="true" type="tns1:string"/> 
    <element name="customField5" nillable="true" type="tns1:string"/> 
    </sequence> 
    </complexType> 
    <complexType name="ResponseMsg"> 
    <sequence> 
    <element name="amount" nillable="true" type="tns1:string"/> 
    <element name="pin" nillable="true" type="tns1:string"/> 
    <element name="pinExpiryDate" nillable="true" type="tns1:string"/> 
    <element name="productCode" nillable="true" type="tns1:string"/> 
    <element name="responseCode" nillable="true" type="tns1:string"/> 
    <element name="responseMsg" nillable="true" type="tns1:string"/> 
    <element name="retTransRef" nillable="true" type="tns1:string"/> 
    <element name="terminalId" nillable="true" type="tns1:string"/> 
    <element name="transRef" nillable="true" type="tns1:string"/> 
    <element maxOccurs="1" minOccurs="0" name="customField1" nillable="true" type="tns1:string"/> 
    <element maxOccurs="1" minOccurs="0" name="customField2" nillable="true" type="tns1:string"/> 
    <element maxOccurs="1" minOccurs="0" name="customField3" nillable="true" type="tns1:string"/> 
    <element maxOccurs="1" minOccurs="0" name="customField4" nillable="true" type="tns1:string"/> 
    <element maxOccurs="1" minOccurs="0" name="customField5" nillable="true" type="tns1:string"/> 
    </sequence> 
    </complexType> 
    <element name="fault" type="xsd:anyType"/> 

    <element name="onlinePIN"> 
    <complexType> 
    <sequence> 
     <element name="in0" type="impl:RequestMsg"/> 
    </sequence> 
    </complexType> 
    </element> 
    <element name="onlinePINResponse"> 
    <complexType> 
    <sequence> 
     <element name="onlinePINReturn" type="impl:ResponseMsg"/> 
    </sequence> 
    </complexType> 
    </element> 
    <element name="onlinePINReversal"> 
    <complexType> 
    <sequence> 
     <element name="in0" type="impl:RequestMsg"/> 
    </sequence> 
    </complexType> 
    </element> 
    <element name="onlinePINReversalResponse"> 
    <complexType> 
    <sequence> 
     <element name="onlinePINReversalReturn" type="impl:ResponseMsg"/> 
    </sequence> 
    </complexType> 
    </element> 
    <element name="etopup"> 
    <complexType> 
    <sequence> 
     <element name="in0" type="impl:RequestMsg"/> 
    </sequence> 
    </complexType> 
    </element> 
    <element name="etopupResponse"> 
    <complexType> 
    <sequence> 
     <element name="etopupReturn" type="impl:ResponseMsg"/> 
    </sequence> 
    </complexType> 
    </element> 
    <element name="etopupReversal"> 
    <complexType> 
    <sequence> 
     <element name="in0" type="impl:RequestMsg"/> 
    </sequence> 
    </complexType> 
    </element> 
    <element name="etopupReversalResponse"> 
    <complexType> 
    <sequence> 
     <element name="etopupReversalReturn" type="impl:ResponseMsg"/> 
    </sequence> 
    </complexType> 
    </element> 
    <element name="networkCheck"> 
    <complexType> 
    <sequence> 
     <element name="in0" type="impl:RequestMsg"/> 
    </sequence> 
    </complexType> 
    </element> 
    <element name="networkCheckResponse"> 
    <complexType> 
    <sequence> 
     <element name="networkCheck" type="impl:ResponseMsg"/> 
    </sequence> 
    </complexType> 
    </element> 
    </schema> 
</wsdl:types> 
    <wsdl:message name="etopupRequest"> 
     <wsdl:part element="impl:etopup" name="parameters"/> 
    </wsdl:message> 

    <wsdl:message name="networkCheckResponse"> 
     <wsdl:part element="impl:networkCheckResponse" name="parameters"/> 
    </wsdl:message> 

    <wsdl:message name="etopupReversalRequest"> 
     <wsdl:part element="impl:etopupReversal" name="parameters"/> 
    </wsdl:message> 

    <wsdl:message name="etopupResponse"> 
     <wsdl:part element="impl:etopupResponse" name="parameters"/> 
    </wsdl:message> 

    <wsdl:message name="networkCheckRequest"> 
     <wsdl:part element="impl:networkCheck" name="parameters"/> 
    </wsdl:message> 

    <wsdl:message name="onlinePINReversalResponse"> 
     <wsdl:part element="impl:onlinePINReversalResponse" name="parameters"/> 
    </wsdl:message> 

    <wsdl:message name="onlinePINReversalRequest"> 
     <wsdl:part element="impl:onlinePINReversal" name="parameters"/> 
    </wsdl:message> 

    <wsdl:message name="onlinePINRequest"> 
     <wsdl:part element="impl:onlinePIN" name="parameters"/> 
    </wsdl:message> 

    <wsdl:message name="onlinePINResponse"> 
     <wsdl:part element="impl:onlinePINResponse" name="parameters"/> 
    </wsdl:message> 

    <wsdl:message name="etopupReversalResponse"> 
     <wsdl:part element="impl:etopupReversalResponse" name="parameters"/> 
    </wsdl:message> 

    <wsdl:message name="ConfigurationException"> 
     <wsdl:part element="impl:fault" name="fault"/> 
    </wsdl:message> 

    <wsdl:portType name="oglws"> 

     <wsdl:operation name="onlinePIN"> 
     <wsdl:input message="impl:onlinePINRequest" name="onlinePINRequest"/> 
     <wsdl:output message="impl:onlinePINResponse" name="onlinePINResponse"/> 
     <wsdl:fault message="impl:ConfigurationException" name="ConfigurationException"/> 
     </wsdl:operation> 

     <wsdl:operation name="onlinePINReversal"> 
     <wsdl:input message="impl:onlinePINReversalRequest" name="onlinePINReversalRequest"/> 
     <wsdl:output message="impl:onlinePINReversalResponse" name="onlinePINReversalResponse"/> 
     <wsdl:fault message="impl:ConfigurationException" name="ConfigurationException"/> 
     </wsdl:operation> 

     <wsdl:operation name="etopup"> 
     <wsdl:input message="impl:etopupRequest" name="etopupRequest"/> 
     <wsdl:output message="impl:etopupResponse" name="etopupResponse"/> 
     <wsdl:fault message="impl:ConfigurationException" name="ConfigurationException"/> 
     </wsdl:operation> 

     <wsdl:operation name="etopupReversal"> 
     <wsdl:input message="impl:etopupReversalRequest" name="etopupReversalRequest"/> 
     <wsdl:output message="impl:etopupReversalResponse" name="etopupReversalResponse"/> 
     <wsdl:fault message="impl:ConfigurationException" name="ConfigurationException"/> 
     </wsdl:operation> 

     <wsdl:operation name="networkCheck"> 
     <wsdl:input message="impl:networkCheckRequest" name="networkCheckRequest"/> 
     <wsdl:output message="impl:networkCheckResponse" name="networkCheckResponse"/> 
     <wsdl:fault message="impl:ConfigurationException" name="ConfigurationException"/> 
     </wsdl:operation> 

    </wsdl:portType> 

    <wsdl:binding name="oglwsSoapBinding" type="impl:oglws"> 
     <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> 

     <wsdl:operation name="onlinePIN"> 

     <wsdlsoap:operation soapAction=""/> 

     <wsdl:input name="onlinePINRequest"> 

      <wsdlsoap:body use="literal"/> 

     </wsdl:input> 

     <wsdl:output name="onlinePINResponse"> 

      <wsdlsoap:body use="literal"/> 

     </wsdl:output> 

     <wsdl:fault name="ConfigurationException"> 

      <wsdlsoap:fault name="ConfigurationException" use="literal"/> 

     </wsdl:fault> 

     </wsdl:operation> 

     <wsdl:operation name="onlinePINReversal"> 

     <wsdlsoap:operation soapAction=""/> 

     <wsdl:input name="onlinePINReversalRequest"> 

      <wsdlsoap:body use="literal"/> 

     </wsdl:input> 

     <wsdl:output name="onlinePINReversalResponse"> 

      <wsdlsoap:body use="literal"/> 

     </wsdl:output> 

     <wsdl:fault name="ConfigurationException"> 

      <wsdlsoap:fault name="ConfigurationException" use="literal"/> 

     </wsdl:fault> 

     </wsdl:operation> 

     <wsdl:operation name="etopup"> 

     <wsdlsoap:operation soapAction=""/> 

     <wsdl:input name="etopupRequest"> 

      <wsdlsoap:body use="literal"/> 

     </wsdl:input> 

     <wsdl:output name="etopupResponse"> 

      <wsdlsoap:body use="literal"/> 

     </wsdl:output> 

     <wsdl:fault name="ConfigurationException"> 

      <wsdlsoap:fault name="ConfigurationException" use="literal"/> 

     </wsdl:fault> 

     </wsdl:operation> 

     <wsdl:operation name="etopupReversal"> 

     <wsdlsoap:operation soapAction=""/> 

     <wsdl:input name="etopupReversalRequest"> 

      <wsdlsoap:body use="literal"/> 

     </wsdl:input> 

     <wsdl:output name="etopupReversalResponse"> 

      <wsdlsoap:body use="literal"/> 

     </wsdl:output> 

     <wsdl:fault name="ConfigurationException"> 

      <wsdlsoap:fault name="ConfigurationException" use="literal"/> 

     </wsdl:fault> 

     </wsdl:operation> 

     <wsdl:operation name="networkCheck"> 

     <wsdlsoap:operation soapAction=""/> 

     <wsdl:input name="networkCheckRequest"> 

      <wsdlsoap:body use="literal"/> 

     </wsdl:input> 

     <wsdl:output name="networkCheckResponse"> 

      <wsdlsoap:body use="literal"/> 

     </wsdl:output> 

     <wsdl:fault name="ConfigurationException"> 

      <wsdlsoap:fault name="ConfigurationException" use="literal"/> 

     </wsdl:fault> 

     </wsdl:operation> 

    </wsdl:binding> 

    <wsdl:service name="OglWsService"> 

     <wsdl:port binding="impl:oglwsSoapBinding" name="oglws"> 

     <wsdlsoap:address location="https://wstest.oriongateway.com:22837/willani/services/oglws"/> 

     </wsdl:port> 

    </wsdl:service> 

</wsdl:definitions> 

Wszelkie komentarze będą dla mnie przydatne.

+0

AKTUALIZACJA: zobaczyłem wiadomość, że możemy przekazać certyfikat do witryny usługi sieciowej w celu uwierzytelnienia, ale jak połączyć .cer i .p12 z plikiem .pem? – poiseberry

+0

to było 3 miesiące, wciąż nie ma odpowiedzi :( – poiseberry

+0

spróbuj tego: "openssl pkcs12 -in key.p12-out key.pem -clcerts" i musisz dodać hasło pliku PEM do SOAP jak: 'passphrase' => "twoje hasło" – sertaconay

Odpowiedz

6

można wykonać następujące kroki w celu wygenerowania co trzeba:

openssl genrsa -out client.key 2048 
openssl req -new -key client.key -out something.p10 
openssl pkcs7 -in file.p7b -inform PEM -out result.pem -print_certsopenssl pkcs12 -export -inkey client.key -in result.pem -name anyName -out finalCert.p12 
keytool -v -importkeystore -srckeystore finalCert.p12 -srcstoretype PKCS12 -destkeystore name.jks -deststoretype JKS 

następnie można użyć .jks plik dla SoapUI, plik .p12 w przeglądarce. Mam nadzieję, że to pomoże.

1

Jak widzę twój nie tworzysz SoapClient z SSL, proponuję do tej ogólnej exemple:

$context = stream_context_create(
    array(
     "ssl" => array(
      "verify_peer" => true, 
      "cafile" => $certsServeur 
     ) 
    ) 
); 

$client = new SoapClient(
    $wsdl, 
    array(
     "trace" => 1, 
     "soap_version" => SOAP_1_1 
     "local_cert" => $certsClient 
     "stream_context" => $context 
    ) 
); 

Więcej szczegółów można znaleźć [tutaj] [1]

pamiętać, że

$local_cert & certsClient (FULL_PATH_TO_MY_CERT)

Powiązane problemy