【问题标题】:PHP SOAP with wsdl and 2-way SSL带有 wsdl 和 2-way SSL 的 PHP SOAP
【发布时间】:2015-07-24 10:14:43
【问题描述】:

这是我第一次在 PHP 上做 SOAP(实际上我是个菜鸟),我在这个问题上卡了几个月。

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

这是网络服务 URL,他们在生产环境中请求 2-way SSL,并且他们为我提供了一组私钥和公共证书以安装在我的服务器上。

我可以通过在浏览器上安装私钥来查看 URL。

此时,我已经通过单向 SSL 和单向 SSL 成功获得了 webservice 的响应,但是双向 SSL 无法正常工作。

当我通过 SOAP 提交双向 SSL 时出现错误消息。

警告:SoapClient::__doRequest():SSL 操作失败,代码为 1。OpenSSL 错误消息:错误:14094412:SSL 例程:SSL3_READ_BYTES:sslv3 警告 /home/loadme/domains/loadme.my/public_html/ 中的证书错误system/OglWsService_noservice.php 第 124 行
警告:SoapClient::__doRequest(): 无法在 /home/loadme/domains/loadme.my/public_html/system/OglWsService_noservice.php 第 124 行启用加密
警告:SoapClient::__doRequest(): connect() failed: Unspecified error in /home/loadme/domains/loadme.my/public_html/system/OglWsService_noservice.php on line 124

我的 SOAP 请求文件

<?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;
?>

我的网络服务类

<?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' => ''
           )
      );
  }

}

?>

我的 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>

任何评论都会对我有用。

【问题讨论】:

  • 更新:我看到一些帖子说我们可以将证书传递给 web 服务站点进行身份验证,但是我如何将 .cer 和 .p12 合并到一个 .pem 文件中?
  • 已经3个月了,仍然没有答案:(
  • 试试这个:"openssl pkcs12 -in key.p12 -out key.pem -clcerts" 你必须将 pem 文件的密码添加到 SOAP 中,例如:'passphrase' => "yourpassword"跨度>
  • @poiseberry,你能完成它吗?我们面临同样的问题。
  • @Bhaskar 一点也不,我们在 2 年前就放弃了,直到今天我仍然不知道这是证书、服务器还是 php 问题。

标签: php web-services ssl soap wsdl


【解决方案1】:

您可以按照以下步骤生成您需要的内容:

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  

那么您可以将 .jks 文件用于 SOAPUI,将 .p12 文件用于浏览器。我希望这会有所帮助。

【讨论】:

    【解决方案2】:

    我可以看到您没有使用 SSL 创建 SoapClient,我建议您遵循这个一般示例:

    $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
        )
    );
    

    更多详情见[这里][1]

    注意

    $local_cert & certsClient (FULL_PATH_TO_MY_CERT)

    【讨论】:

      【解决方案3】:

      当客户端需要使用证书进行验证时,您可以使用以下内容。 首先在服务器上创建证书:

      openssl req -x509  -days 3650 -newkey rsa:2048 -keyout <cerfificatename>-VZ-private.pem -out <certificatename>-public.pem -nodes
      

      替换为您自己选择的名称。

      $context = stream_context_create(
              array(
                  "ssl" => array(
                      "verify_peer" => true,
                      "cafile" => $fullPathToServerCa,
                      "local_cert" => $fullPathToLocalPublicCert,
                      "local_pk" =>$fullPathToLocalPrivateCert,
                  )
              )
          );
      $client = new SoapClient(
          $wsdl,
          array(
              "trace" => 1,
              "stream_context" => $context
          )
      );
      

      SoapClient 中带有 local_cert 的版本不适合我。这个是。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多