PHP 如何正确使用 OTRS GenericTicketConnectorSOAP
how to use properly OTRS GenericTicketConnectorSOAP in PHP
我正在使用 PHP 5.6 版。我制作了一个 PHP 表单,其中包含 3 个字段、用户名、密码和 CSV 文件上传。
CSV 文件的每一行都包含两个“数字代码”,即票号和发票号除以“;” ,所以 CSV 有两列。在我编写的处理代码中,我编写了逐行读取 CSV 文件的代码,并将票号和发票号分解为两个变量。之后,生成需要通过 GenericTicketConnectorSOAP 发送的 XML 数据并执行票证更新的代码。我的 php 代码如下:
$URL = 'http://localhost/otrs/nphgenericinterface.pl/Webservice/GenericTicketConnectorSOAP';
$NameSpace = 'http://www.otrs.org/TicketConnector/';
// SOAP parameters
$parameters = [
'proxy_host' => $URL,
'proxy_port' => 8080,
'stream_context' => stream_context_create(
array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
)
)
)
];
// More code that it is not necessary to post it
//Posting the code that the problem starts
if(move_uploaded_file($_FILES['file']['tmp_name'],($path . $newfilename))){
echo '<div class="alert alert-primary" role="alert"><p>Success: File uploaded.</p></div>';
$fn = fopen($path . $newfilename,"r");
while(! feof($fn) ) {
$content = fgets($fn);
// Divide the ticket number and the invoice number into two variables
list($ticketnumber,$invoicenumber) = explode(";", $content);
echo "TicketNumber: ".$ticketnumber." Invoicenumber: ".$invoicenumber;
// Making XMLData
$XMLData = '<UserLogin>'.$user.'</UserLogin><Password>'.$password.'</Password>';
$XMLData .= '<TicketNumber>'.$ticketnumber.'</TicketNumber>
<DynamicField><Name>'.$invoicefield.'</Name>
<Value>'.$invoicenumber.'</Value></DynamicField>';
// SOAP client
// extension of php soap NEED TO BE ENABLED ON php.ini
$client = new SoapClient($NameSpace,$parameters);
$result = $client -> TicketUpdate($XMLData);
if (is_soap_fault($result)) {
print_r("SOAP Fault: (faultcode: {$result->faultcode}, faultstring: {$result->faultstring})", E_USER_ERROR);
$scarti.=",".$ticketnumber;
echo '<div class="alert alert-danger" role="alert"><p>Ticket fault: '.$scarti.'</p></div>';
}else{
echo '<div class="alert alert-success" role="alert"> Success ticket number:'.$ticketnumber.'</div>';
}
} // while ends
我的问题出现在 while 循环中,它在 CSV 文件的第一行停止,而没有收到任何 SOAP 客户端或 SOAP 函数调用的错误消息。这里可能出了什么问题?如果我删除“SOAP 代码”,循环会在最新的票号处停止,所以这一定是 SOAP 客户端或函数上的错误。另外,我用这段代码测试了 SOAP 连接:
$handle = curl_init($URL);
curl_setopt($handle, CURLOPT_RETURNTRANSFER, TRUE);
$response = curl_exec($handle);
$httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE);
if($httpCode == 404) {
echo "Connection failed";
}else {
echo "Connection OK";
}
结果是“连接正常”。
更新:
我写这段代码是为了打印任何错误:
$parameters = [
'stream_context' => stream_context_create(
array(
'ssl' => array(
'verify_peer => false,
'verify_peer_name' => false,
)
)
)
try{
$client = new SoapClient($URL,$parameters);
}catch(Exception $e){
echo $e->getMessage();
}
结果是:“SOAP-ERROR:解析 WSDL:无法从 'http://localhost/otrs/nph-genericinterface.pl/Webservice/GenericTicketConnectorSOAP' 加载:无法加载外部实体“http://localhost/otrs/nph-genericinterface。pl/Webservice/GenericTicketConnectorSOAP”。 =14=]
问题已通过在 php.ini 文件中添加以下行得到解决:
ini_set('soap.wsdl_cache_enabled', '0');
ini_set('soap.wsdl_cache_ttl', '0');
我正在使用 PHP 5.6 版。我制作了一个 PHP 表单,其中包含 3 个字段、用户名、密码和 CSV 文件上传。 CSV 文件的每一行都包含两个“数字代码”,即票号和发票号除以“;” ,所以 CSV 有两列。在我编写的处理代码中,我编写了逐行读取 CSV 文件的代码,并将票号和发票号分解为两个变量。之后,生成需要通过 GenericTicketConnectorSOAP 发送的 XML 数据并执行票证更新的代码。我的 php 代码如下:
$URL = 'http://localhost/otrs/nphgenericinterface.pl/Webservice/GenericTicketConnectorSOAP';
$NameSpace = 'http://www.otrs.org/TicketConnector/';
// SOAP parameters
$parameters = [
'proxy_host' => $URL,
'proxy_port' => 8080,
'stream_context' => stream_context_create(
array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
)
)
)
];
// More code that it is not necessary to post it
//Posting the code that the problem starts
if(move_uploaded_file($_FILES['file']['tmp_name'],($path . $newfilename))){
echo '<div class="alert alert-primary" role="alert"><p>Success: File uploaded.</p></div>';
$fn = fopen($path . $newfilename,"r");
while(! feof($fn) ) {
$content = fgets($fn);
// Divide the ticket number and the invoice number into two variables
list($ticketnumber,$invoicenumber) = explode(";", $content);
echo "TicketNumber: ".$ticketnumber." Invoicenumber: ".$invoicenumber;
// Making XMLData
$XMLData = '<UserLogin>'.$user.'</UserLogin><Password>'.$password.'</Password>';
$XMLData .= '<TicketNumber>'.$ticketnumber.'</TicketNumber>
<DynamicField><Name>'.$invoicefield.'</Name>
<Value>'.$invoicenumber.'</Value></DynamicField>';
// SOAP client
// extension of php soap NEED TO BE ENABLED ON php.ini
$client = new SoapClient($NameSpace,$parameters);
$result = $client -> TicketUpdate($XMLData);
if (is_soap_fault($result)) {
print_r("SOAP Fault: (faultcode: {$result->faultcode}, faultstring: {$result->faultstring})", E_USER_ERROR);
$scarti.=",".$ticketnumber;
echo '<div class="alert alert-danger" role="alert"><p>Ticket fault: '.$scarti.'</p></div>';
}else{
echo '<div class="alert alert-success" role="alert"> Success ticket number:'.$ticketnumber.'</div>';
}
} // while ends
我的问题出现在 while 循环中,它在 CSV 文件的第一行停止,而没有收到任何 SOAP 客户端或 SOAP 函数调用的错误消息。这里可能出了什么问题?如果我删除“SOAP 代码”,循环会在最新的票号处停止,所以这一定是 SOAP 客户端或函数上的错误。另外,我用这段代码测试了 SOAP 连接:
$handle = curl_init($URL);
curl_setopt($handle, CURLOPT_RETURNTRANSFER, TRUE);
$response = curl_exec($handle);
$httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE);
if($httpCode == 404) {
echo "Connection failed";
}else {
echo "Connection OK";
}
结果是“连接正常”。
更新:
我写这段代码是为了打印任何错误:
$parameters = [
'stream_context' => stream_context_create(
array(
'ssl' => array(
'verify_peer => false,
'verify_peer_name' => false,
)
)
)
try{
$client = new SoapClient($URL,$parameters);
}catch(Exception $e){
echo $e->getMessage();
}
结果是:“SOAP-ERROR:解析 WSDL:无法从 'http://localhost/otrs/nph-genericinterface.pl/Webservice/GenericTicketConnectorSOAP' 加载:无法加载外部实体“http://localhost/otrs/nph-genericinterface。pl/Webservice/GenericTicketConnectorSOAP”。 =14=]
问题已通过在 php.ini 文件中添加以下行得到解决:
ini_set('soap.wsdl_cache_enabled', '0'); ini_set('soap.wsdl_cache_ttl', '0');