这是我第一次在PHP上做SOAP(实际上我是菜鸟),并且我坚持这个问题好几个月了。
https://wstest.oriongateway.com:22837/willani/services/oglws?wsdl
这是webservice URL,他们在生产时请求双向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/中的错误证书第124行的system / OglWsService_noservice.php
警告:SoapClient :: __ doRequest():无法在第124行的/home/loadme/domains/loadme.my/public_html/system/OglWsService_noservice.php中启用加密
警告:SoapClient :: __ doRequest():connect()失败:第124行/home/loadme/domains/loadme.my/public_html/system/OglWsService_noservice.php中的未指定错误
我的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;
?>
我的Web服务类
<?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>
任何评论对我都有用。
答案 0 :(得分:6)
您可以按照以下步骤生成所需内容:
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文件用于浏览器。我希望这会有所帮助。
答案 1 :(得分:1)
我可以看到你没有使用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&amp; certsClient(FULL_PATH_TO_MY_CERT)
答案 2 :(得分:0)
当需要使用证书验证客户端时,可以使用以下方法。 首先在服务器上创建证书:
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的版本不适用于我。这是。