发票管理apiadmin
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

272 lines
6.4 KiB

<?php
namespace app\service\webService;
use fast\FuncException;
class FeeService
{
protected $wsdl;
protected $port;
protected $pucode;
const ONE_KEY = 'SOAP-ENV:Body';
public function __construct($pucode)
{
$this->wsdl = env('wsdl.soap_url');
$this->port = env('wsdl.soap_port');
$this->pucode = $pucode;
}
/**
* 查询用户数量
* @return mixed
* @throws FuncException
*/
public function getUserTotal()
{
$arr = ['pucode' => $this->pucode];
$method = 'GetUserTotal';
$res = $this->curl($method, $this->xml_str($arr));
$key = 'NS1:' . $method . 'Response';
$this->dataValidate($res, $key);
return $res[$key];
}
/**
* 查询用户基本信息
* @return mixed
* @throws FuncException
*/
public function getUsers(): array
{
$arr = ['pucode' => $this->pucode];
$method = 'GetUsers';
$res = $this->curl($method, $this->xml_str($arr));
$key = 'NS1:GetUsersResponse';
$this->dataValidate($res, $key);
$key2 = 'NS2:TUserInfo';
$this->dataValidate($res[$key], $key2, 2);
return $res[$key][$key2];
}
/**
* 查询用户表资料
* @return mixed
* @throws FuncException
*/
public function getWaterMeters()
{
$arr = ['userCode' => $this->pucode];
$method = 'GetWaterMeters';
$res = $this->curl($method, $this->xml_str($arr));
$key = 'NS1:GetWaterMetersResponse';
$this->dataValidate($res, $key);
$key2 = 'NS2:TWaterMeter';
$this->dataValidate($res[$key], $key2, 2);
return $res[$key][$key2];
}
/**
* 查询用户抄表信息
* @param $param ['startCostYearMonth' => '2024-01','endCostYearMonth' => '2024-02']
* @throws FuncException
*/
public function getReadingDetail(array $param = [])
{
$arr = ['userCode' => $this->pucode];
if ($param) {
$arr = array_merge($arr, $param);
}
$method = 'GetReadingDetail';
$res = $this->curl($method, $this->xml_str($arr));
$key = 'NS1:GetReadingDetailResponse';
$this->dataValidate($res, $key);
$key2 = 'NS2:TUserReading';
$this->dataValidate($res[$key], $key2, 2);
return $res[$key][$key2];
}
/**
* 查询用户费用信息
* @param $param ['startCostYearMonth' => '2024-01','endCostYearMonth' => '2024-02','PaymentStatus' => '0']
* PaymentStatus 0:所有 1:未缴 2:已缴 5:部分缴
* @throws FuncException
*/
public function getComputeDetail(array $param = [])
{
$arr = ['userCode' => $this->pucode];
if ($param) {
$arr = array_merge($arr, $param);
}
$method = 'GetComputeDetail';
$res = $this->curl($method, $this->xml_str($arr));
$key = 'NS1:GetComputeDetailResponse';
$this->dataValidate($res, $key);
$key2 = 'NS2:TComputeDetail';
$this->dataValidate($res[$key], $key2, 2);
return $res[$key][$key2];
}
protected function xml_str($arr): string
{
$xml_arr = [];
foreach ($arr as $key => $value) {
$xml_arr[] = "<{$key}>" . $value . "</{$key}>";
}
return implode("\r\n", $xml_arr);
}
/**
* POST 调用xml接口
* @param $method
* @param $xml_filed
* @return array
* @throws FuncException
*/
protected function curl($method, $xml_filed): array
{
$xml = <<<XML
<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body SOAP-ENV:encodingStyle="http:schemas.xmlsoap.org/soap/encoding/">
<NS1:{$method} xmlns:NS1="urn:FeeServiceIntf-IFeeService">
{$xml_filed}
</NS1:{$method}>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
XML;
$wsdl = 'http://120.234.15.170:4000/FeeService.dll/soap/IFeeService';
// 初始化cURL会话
$ch = curl_init();
// 设置cURL选项
curl_setopt($ch, CURLOPT_URL, $wsdl); // 目标URL
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 返回结果而不是输出
curl_setopt($ch, CURLOPT_POST, true); // 发送POST请求
// 设置POST字段
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml')); // 设置HTTP头
// 执行cURL会话
$response = curl_exec($ch);
// 检查是否有错误发生
if (curl_errno($ch)) {
throw new FuncException('cURL error: ' . curl_error($ch));
}
// 关闭cURL会话
curl_close($ch);
$array = $this->getXmlDom($response);
return $this->curlValidate($array);
}
/**
*
* @param $response
* @return array
*/
protected function getXmlDom($response): array
{
$dom = new \DOMDocument();
$dom->loadXML($response);
return $this->xmlToArray($dom->documentElement);
}
/**
*
* @param $node
* @return array|mixed
*/
protected function xmlToArray($node)
{
$output = [];
if ($node->hasChildNodes()) {
foreach ($node->childNodes as $child) {
if ($child->nodeType === XML_ELEMENT_NODE) {
$output[$child->nodeName] = $this->xmlToArray($child);
} elseif ($child->nodeType === XML_TEXT_NODE) {
$output = $child->nodeValue;
}
}
}
return $output;
}
/**
*
* @param $array
* @return mixed
* @throws FuncException
*/
protected function curlValidate($array)
{
if (!isset($array[self::ONE_KEY])) {
throw new FuncException('数据获取失败 -0');
}
return $array[self::ONE_KEY];
}
/**
*
* @param $data
* @param $key
* @param int $level
* @throws FuncException
*/
public function dataValidate($data, $key, int $level = 1)
{
if (!isset($data[$key])) {
throw new FuncException("数据获取失败 -{$level}");
}
}
}