Browse Source

上传正式获取发票接口数据

master
wanghongjun 1 year ago
parent
commit
73b8dcc6c2
  1. 1
      .env
  2. 22
      app/controller/api/Test.php
  3. 55
      app/model/InvoiceIssuanceData.php
  4. 293
      app/service/invoice/InvoiceIssuanceService.php
  5. 506
      app/service/webService/ChinaTaxes.php
  6. 733
      app/service/webService/ChinaTaxes1.php

1
.env

@ -36,3 +36,4 @@ API_URL = https://szxz.shenzhen.chinatax.gov.cn:6443/access/api
REQ_ID = 2334e6cedb1389057d715acf00e4d9441
CHANNEL_ID = SZDGYQSS
CHANNEL_SECRET = F541D38364337959E0530B7F6796B44D
DOWN_URL = https://szxz.shenzhen.chinatax.gov.cn/qkldzsp/sword

22
app/controller/api/Test.php

@ -3,8 +3,9 @@ declare (strict_types=1);
namespace app\controller\api;
use app\service\webService\ChinaTaxes;
use app\service\invoice\InvoiceIssuanceService;
use app\service\webService\FeeService;
use fast\FuncException;
class Test extends Base
{
@ -12,14 +13,19 @@ class Test extends Base
public function index()
{
try {
$InvoiceIssuanceService = new InvoiceIssuanceService();
$getWechatData = $this->getWechatData();
dump($getWechatData);die;
$ChinaTaxes = new ChinaTaxes($getWechatData);
$data = [
'pucode' => '',
'expire_time' => '',
'id' => ''
];
$result = $ChinaTaxes->savingDetailedData();
dump($result);
die;
$result = $InvoiceIssuanceService->IssueAnInvoice($data);
if ($result !== true) {
throw new FuncException($result);
}
} catch (\Exception $e) {
dump($e);die;
}
@ -28,7 +34,7 @@ class Test extends Base
public function getWechatData()
{
$pucode = '41107311';
$pucode = '41108008';
$FeeService = new FeeService($pucode);
return $FeeService->getUsers();
}

55
app/model/InvoiceIssuanceData.php

@ -0,0 +1,55 @@
<?php
namespace app\model;
use think\Model;
class InvoiceIssuanceData extends Model
{
/**
* 保存 税务接口
* @param $invoice_issuance_id
* @param $bdznsrsbh
* @param $jsyj
* @param $assetID
* @param $pdf_filepath
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function saveData($invoice_issuance_id, $bdznsrsbh, $jsyj, $assetID, $pdf_filepath)
{
$query = $this->where('invoice_issuance_id', $invoice_issuance_id)->find();
$save = [
'bdznsrsbh' => $bdznsrsbh,
'jsyj' => $jsyj,
'assetID' => $assetID,
'pdf_filepath' => $pdf_filepath,
];
if ($query) {
$save['update_time'] = time();
$query->save($save);
} else {
$save['create_time'] = time();
$this->save($save);
}
}
public function saveField($invoice_issuance_id, $field, $value, $type = 1)
{
$where = ['invoice_issuance_id' => $invoice_issuance_id];
if ($type == 1) $where['status'] = 1;
$query = $this->where($where)->find();
$save = [$field => $value];
if ($query) {
$save['update_time'] = time();
$query->save($save);
} else {
$save['create_time'] = time();
$save['invoice_issuance_id'] = $invoice_issuance_id;
$this->save($save);
}
}
}

293
app/service/invoice/InvoiceIssuanceService.php

@ -4,6 +4,8 @@ namespace app\service\invoice;
use app\model\InvoiceHead;
use app\model\InvoiceIssuance;
use app\model\InvoiceIssuanceData;
use app\service\webService\ChinaTaxes;
use app\service\webService\FeeService;
use Endroid\QrCode\Builder\Builder;
use Endroid\QrCode\Encoding\Encoding;
@ -12,12 +14,13 @@ use Endroid\QrCode\Label\Alignment\LabelAlignmentCenter;
use Endroid\QrCode\Label\Font\NotoSans;
use Endroid\QrCode\Writer\PngWriter;
use fast\FuncException;
use think\App;
class InvoiceIssuanceService
{
/**
*
* 获取发票列表
* @param $param
* @param $wechat_user_id
* @return array
@ -68,7 +71,7 @@ class InvoiceIssuanceService
}
/**
*
* 验证缴费
* @param $pucode
* @param $expire_time
* @param $project_id
@ -134,4 +137,290 @@ class InvoiceIssuanceService
return $result->getDataUri();
}
/**
* 处理申请日期
* @param $expire_time
* @return array
*/
private function getInvoiceDate($expire_time): array
{
return [
'nsqxDm' => date("m", $expire_time), // 申请月份
'skssqq' => date("Y-m-d", $expire_time), // 申请开始日期
'skssqz' => date("Y-m-d", strtotime('+1 month -1 day', $expire_time)),// 申请结束日期
];
}
/**
* 获取水务用户信息
* @param $pucode
* @return array|mixed
* @throws FuncException
*/
private function getFeeUserData($pucode)
{
$FeeService = new FeeService($pucode);
$feeUsers = $FeeService->getUsers();
if (!$feeUsers) {
throw new FuncException('未获取到用户信息');
}
return $feeUsers;
}
/**
* 开具完税证明 (汇总、结报)
* @param $invoiceIssuance // 开票信息
* @return bool|string
*/
public function IssueAnInvoice($invoiceIssuance)
{
try {
// 用户编码
$pucode = $invoiceIssuance['pucode'];
if (empty($invoiceIssuance['expire_time'])) {
throw new FuncException('申请日期不能为空');
}
$invoiceDate = $this->getInvoiceDate($invoiceIssuance['expire_time']);
$feeUsers = $this->getFeeUserData($pucode);
$bdznsrsbh = '91440300772709730N'; // 被代征纳税人识别号
// 保存
$ChinaTaxes = new ChinaTaxes($feeUsers, $invoiceDate);
$savingDetailedData = $ChinaTaxes->savingDetailedData();
// 批次号
$sbpch = $savingDetailedData['sbpch'];
(new InvoiceIssuanceData())->saveField($invoiceIssuance['id'], 'sbpch', $sbpch);
// 委托 - 加工数据
$realTimeProcessing = $ChinaTaxes->realTimeProcessing($sbpch);
if ($realTimeProcessing['code'] == 200) {
// 处理加工成功返回数据
if (!isset($realTimeProcessing['data']['mxGrid'])) {
throw new FuncException('加工数据有误');
}
$mxGrid = $realTimeProcessing['data']['mxGrid'];
$jsyj = 0; // 总金额
foreach ($mxGrid['sbMxsjVOList'] as $sbMxsjVOValue) {
if (isset($sbMxsjVOValue['jsyj'])) $jsyj += $sbMxsjVOValue['jsyj'];
}
// 加工成功 电子缴款申请
$issueElectronic = $ChinaTaxes->issueElectronic($sbpch);
$assetID = $issueElectronic['pzsqkjYcxxList']['assetID']; // 文件唯一标识
// 查询电子缴款凭证上链信息
$queryPaymentVoucher = $ChinaTaxes->queryPaymentVoucher($assetID);
//$mmq = $queryPaymentVoucher['mmq'];
$meta = $queryPaymentVoucher['meta'];
$data = $queryPaymentVoucher['data'];
// 拼接pdf
// 盖章
$requestData = ['data' => $data, 'meta' => $meta];
$deCompress = $this->deCompress($requestData);
if ($deCompress['status'] !== 200) {
throw new FuncException('pdf数据解密失败');
}
if (!isset($deCompress['data']['pdfdata'])) {
throw new FuncException('pdf文件合并失败');
}
$pdfFilepath = $this->savePdfFile($deCompress['data']['pdfdata']);
(new InvoiceIssuanceData())->saveData($invoiceIssuance['id'], $bdznsrsbh, $jsyj, $assetID, $pdfFilepath);
} else if ($realTimeProcessing['code'] === 302) {
// 加工失败
// 查询上传异常数据接口
$queryUploadErrorData = $ChinaTaxes->queryUploadErrorData($sbpch);
if (!isset($queryUploadErrorData['mxGrid']['sbMxsjVOList']['ycms'])) {
throw new FuncException('异常信息返回有误');
}
// 查询待开具电子缴款
$queryIssuedPaymentVoucher = $ChinaTaxes->queryIssuedPaymentVoucher($bdznsrsbh);
// 保存用户异常状态
$ycms = $queryUploadErrorData['mxGrid']['sbMxsjVOList']['ycms']; // 数据异常描述
(new InvoiceIssuanceData())->saveField($invoiceIssuance['id'], 'ycms', $ycms);
//throw new FuncException('加工失败流程待定!');
}
return true;
} catch (\Exception $e) {
return $e->getMessage();
}
}
/**
* 用户更正数据后作废再发起
*/
public function cancelInitiateAgain($invoiceIssuance)
{
try {
$feeUsers = $this->getFeeUserData($invoiceIssuance['pucode']);
$bdznsrsbh = '91440300772709730N'; // 被代征纳税人识别号
$ChinaTaxes = new ChinaTaxes($feeUsers, []);
$identityCheck = $ChinaTaxes->identityCheck($bdznsrsbh);
if (isset($identityCheck['zt']) && $identityCheck['zt'] == 'N') {
throw new FuncException($identityCheck['Yy']);// 返回校验不通过原因
}
$InvoiceIssuanceWhere = ['invoice_issuance_id' => $invoiceIssuance['id']];
$InvoiceIssuanceData = (new InvoiceIssuanceData())->where($InvoiceIssuanceWhere)->find();
//
$ChinaTaxes->collectionDetails($bdznsrsbh, $InvoiceIssuanceData['sbpch']);
// 作废 3.2
$ChinaTaxes->invalidEntrustCollection($InvoiceIssuanceData['sbpch']);
// 修改作废
(new InvoiceIssuanceData())->saveField($invoiceIssuance['id'], 'status', 0, 2);
$this->IssueAnInvoice($invoiceIssuance);
return true;
} catch (\Exception $e) {
return $e->getMessage();
}
}
/**
* 保存 PDF
* @param $pdfBaseData
* @return string
*/
public function savePdfFile($pdfBaseData): string
{
$pdfStr = str_replace('data:application/pdf;base64,', '', $pdfBaseData);
$pdfDecode = base64_decode($pdfStr);
$d = '/';
$fileName = time() . rand(000000, 999999) . '.pdf';
$now_date = date("{$d}Y{$d}m{$d}d");
$downPath = 'pdffile' . $now_date;
$fileDirPath = (new App())->getRootPath() . 'public' . $d . $downPath;
$filenamePath = $fileDirPath . $d . $fileName;
$savePath = $downPath . $fileName;
if (!file_exists($fileDirPath)) {
mkdir($fileDirPath, 0777, true);
}
file_put_contents($filenamePath, $pdfDecode);
return $savePath;
}
/**
* 汇总结报
* @param $invoiceIssuance
* @throws FuncException
*/
public function SummaryReport($invoiceIssuance)
{
if (empty($invoiceIssuance['expire_time'])) {
throw new FuncException('申请日期不能为空');
}
$invoiceDate = $this->getInvoiceDate($invoiceIssuance['expire_time']);
$bdznsrsbh = ''; // 被征纳税人
$ChinaTaxes = new ChinaTaxes([], $invoiceDate);
$daiZhengSummaryQuery = $ChinaTaxes->daiZhengSummaryQuery($bdznsrsbh);
$sbpch = $daiZhengSummaryQuery['cxwjbList']['cxwjbVO']['sbpch']; // 申报批次号
$ydzse = $daiZhengSummaryQuery['cxwjbList']['cxwjbVO']['ydzse']; // 应代征税额
}
/**
* 调用java sm4 解密
* @param array $data
* @return mixed
* @throws FuncException
*/
public function deCompress(array $data)
{
$java_decode_url = 'https://intp.xingtongworld.com/v1/tax/xt';
// 初始化cURL会话
$ch = curl_init();
// 设置cURL选项
curl_setopt($ch, CURLOPT_URL, $java_decode_url); // 目标URL
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 返回结果而不是输出
curl_setopt($ch, CURLOPT_POST, true); // 发送POST请求
// 设置POST字段
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: multipart/form-data')); // 设置HTTP头
// 跳过证书验证(不推荐在生产环境使用)
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
// 跳过主机名验证
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
// 执行cURL会话
$response = curl_exec($ch);
// 检查是否有错误发生
if (curl_errno($ch)) {
throw new FuncException('请求失败');
}
// 关闭cURL会话
curl_close($ch);
return json_decode($response, true);
}
/**
* get请求
* @param $url
* @return mixed
* @throws FuncException
*/
public function curlGet($url)
{
// 初始化cURL会话
$ch = curl_init();
// 设置cURL选项
curl_setopt($ch, CURLOPT_URL, $url); // 目标URL
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 返回结果而不是输出
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET"); // 发送GET请求
// 跳过证书验证(不推荐在生产环境使用)
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
// 跳过主机名验证
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
// 执行cURL会话
$response = curl_exec($ch);
// 检查是否有错误发生
if (curl_errno($ch)) {
throw new FuncException('请求失败');
}
// 关闭cURL会话
curl_close($ch);
return json_decode($response, true);
}
}

506
app/service/webService/ChinaTaxes.php

@ -3,32 +3,45 @@
namespace app\service\webService;
use fast\FuncException;
use think\facade\Cache;
class ChinaTaxes
{
// 用户信息
protected $puCodeUser;
// accessToken
protected $accessToken;
protected $sid;
// 接入端交易请求唯一标识
protected $reqId;
// 接入渠道标识(ID)
protected $channelId;
// 平台为接入渠道统一分配的密码
protected $channelSecret;
// 请求地址
protected $apiUrl;
// 密钥
protected $my = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuc3JzYmgiOiI2MjAxMDQ3NzQ0MTk4NVgiLCJpc3MiOiJTU1NIR1oiLCJkanhoIjoiMTAxMTQ0MDMwMDAwMjY0NzE2NzQiLCJzdGFydFRpbWUiOiIiLCJ1bmRUaW11IjoiMjAyMi0wNi0zMCAxODowNDo0MSIsImV4cCI6MTY1NjU4MzQ4MSwic3BqZyI6IjEifQ.Ho0H43DxSGDmydHamMABRampNaNTu3K5vJwTJzoLAMA';
// xml组合数据类型
protected $xmlType = 1;
// 参数类型
protected $xml = 1;
// 申请发票信息
protected $invoiceIssuance;
/**
* @throws FuncException
*/
public function __construct($data)
public function __construct($data = [], $invoice = [])
{
$this->puCodeUser = $data;
$this->apiUrl = env('taxes.api_url');
$this->reqId = $this->getReqId();//env('taxes.req_id'); // 接入端交易请求唯一标识,长度 32 位,5 秒内不得重复,否则抛出异常:交易请求唯一标识重复。
$this->reqId = $this->getReqId(); // 接入端交易请求唯一标识,长度 32 位,5 秒内不得重复,否则抛出异常:交易请求唯一标识重复。
$this->channelId = env('taxes.channel_id'); // 接入渠道标识(ID)
$this->channelSecret = env('taxes.channel_secret'); // 平台为接入渠道统一分配的密码,只有身份验证接口需要
$this->sid = 'bizAccessLogin'; // 调用的接口名称,固定为“bizAccessLogin”
$this->invoiceIssuance = $invoice;
$this->getAccessToken();
}
@ -39,10 +52,14 @@ class ChinaTaxes
*/
protected function getAccessToken()
{
$tax_key = 'tax_access_token';
$tax_access_token = Cache::get($tax_key);
if ($tax_access_token) {
$this->accessToken = $tax_access_token;
} else {
$param = [
'reqId' => $this->reqId, // 接入端交易请求唯一标识,长度 32 位,5 秒内不得重复,否则抛出异常:交易请求唯一标识重复。
'sid' => $this->sid, // 调用的接口名称,固定为“bizAccessLogin”
'sid' => 'bizAccessLogin', // 调用的接口名称,固定为“bizAccessLogin”
'channelId' => $this->channelId, // 接入渠道标识(ID)
'channelSecret' => $this->channelSecret, // 平台为接入渠道统一分配的密码,只有身份验证接口需要
'timestamp' => time(), // unix 时间戳
@ -61,399 +78,488 @@ class ChinaTaxes
}
$this->accessToken = $result['result']['accessToken'];
Cache::set($tax_key, $this->accessToken, 28680);
}
/**
*
* @return string
*/
protected function getReqId(): string
{
return md5(time() . rand(0,9));
}
/**
* 获取请求参数
* 发起请求参数
* @param $sid
* @param $body
* @return array
*/
protected function getParamData($sid, $body): array
{
return [
'reqId' => $this->getReqId(),
'sid' => $sid,
'channelId' => $this->channelId,
'accessToken' => $this->accessToken,
'timestamp' => time(),
$data = [
'reqId' => $this->getReqId(), // 接入端交易请求唯一标识
'sid' => $sid,// 调 用 的 接 口 名 称
'channelId' => $this->channelId,// 接入渠道标识
'accessToken' => $this->accessToken,// 访问令牌,由调用身份验证接口获取
'timestamp' => time(),// unix 时间戳
'data' => [
'flag' => '大工业区生活垃圾处理费征收及开票需要',
'bizXml' => $this->bizXml($body)
],
];
return $data;
}
/**
* 3.1保存委托代征明细数据接口
* @throws FuncException
* @return array
* @throws \Exception
*/
public function savingDetailedData()
public function savingDetailedData(): array
{
$mxGrid = [
'bdznsrsbh' => '91440300MA5DD4XE43',// 被代征纳税人识别号 *
'bdznsrmc' => '九龙县桑专峯电子仪表仪器有限公司',// 被代征纳税人名称 *
'bdznsrsbh' => $this->puCodeUser['tax_number'],// 被代征纳税人识别号 *
'bdznsrmc' => $this->puCodeUser['UserName'],// 被代征纳税人名称 *
'gjhdqszDm' => '156',// 国家或地区数字代码
'sfzjlxDm' => '201',// 身份证件类型代码
'zjhm' => '142433197804217752',// 证件号码 *
'zjhm' => $this->puCodeUser['CertificateCode'],// 证件号码 *
'hyDm' => '6490',// 行业代码
'zsxmDm' => '30433',// 征收项目代码
'zspmDm' => '304331300',// 征收品目代码
'zspmDm' => '804331300',// 征收品目代码
'zszmDm' => '',// 征收子目代码
'jsyj' => '-159843.33',// 计税依据,保留两位小数
'sl1' => '',//
'ynse' => '',//
'ydzse' => '',//
'yjse' => '',// 1
'ydzse1' => '',// 1
'jmse' => '',// 1
'phjmse' => '',// 1
'phjzbl' => '',// 1
'phjmxzDm' => '',// 1
'ssjmxzDm' => '',// 1
'jsyj' => '-1000',// 计税依据,保留两位小数
'sl1' => '',// 税率,可手工填写,不填则默认系统自动计算,保留两位小数
'ynse' => '',// 应纳税额,可手工填写,不填则默认系统自动计算,保留两位小数
'ydzse' => '',// 应代征税额,可手工填写,不填则默认系统自动计算,保留两位小数
'yjse' => '',// 已缴税额,可手工填写,不填则默认系统自动计算,保留两位小数
'ydzse1' => '',// 已代征税额,可手工填写,不填则默认系统自动计算,保留两位小数
'jmse' => '',// 减免税额,可手工填写,不填则默认系统自动计算,保留两位小数
'phjmse' => '',// 增值税小规模纳税人减征额
'phjzbl' => '',// 增值税小规模纳税人减征比例
'phjmxzDm' => '',// 增值税小规模纳税人减免性质代码
'ssjmxzDm' => '',// 税收减免性质代码
'wszmkjbz' => 'Y',// 完税证明开具标志为 Y 开具,N不开具
'xmmc' => '测试',// 项目名称
'xmbm' => 'T435',// 项目编码
'username' => $this->puCodeUser['UserName'],// 用户名称(同一个批次,同一个用户编号下,值相同)
'nbyhbm' => $this->puCodeUser['UserCode'],// 用户编号
'jldwmc' => '立方米',// 单位
'sl' => '100',// 数量
'zxbz1' => '10',// 标准
'skyhmc' => $this->puCodeUser['BankName'],// 托收银行(同一个批次,同一个用户编号下,值相同)
'yhzh' => $this->puCodeUser['BankAccountCode'],// 银行账号(同一个批次,同一个用户编号下,值相同)
'zsfsmc' => '手工转账',// 缴费方式(同一个批次,同一个用户编号下,值相同)
'tjsd' => '2022-11-01至2022-11-30',// 收费时段(同一个批次,同一个用户编号下,值相同)
'jfyj1' => '测试',// 计费依据(同一个批次,同一个用户编号下,值相同)
'yhje' => '10.00',// 优惠金额
'hjje' => '990.00',// 合计金额
'jfrq' => '2022-11-30',// 缴费时间(同一个批次,同一个用户编号下,值相同)
'lxfs' => '测试',// 联系方式(同一个批次,同一个用户编号下,值相同)
'lxdz' => '测试',// 送票地址(同一个批次,同一个用户编号下,值相同)
'remark' => '测试',// 备注(同一个批次,同一个用户编号下,值相同)
'bz' => '测试',// 备注信息(同一个批次,同一个用户编号下,值相同)
];
$body = [
'sbczlxDm' => 'insert', //申报操作类型代码,为”delete”,” insert” 或”update”
'sflsb' => 'N', //是否零申报 ,为非零申报”N”
'sbpch' => '0', //批次号,详见备注
'nsqxDm' => '06', //纳税期限代码,“06”按月
'skssqq' => '2023-06-01', //税款所属期起,格式,年-月-日 *
'skssqz' => '2023-06-30', //税款所属期止,格式,年-月-日 *
'sbpch' => '', //批次号,详见备注
'nsqxDm' => $this->invoiceIssuance['nsqxDm'], //纳税期限代码,“06”按月
'skssqq' => $this->invoiceIssuance['skssqq'], //税款所属期起,格式,年-月-日 *
'skssqz' => $this->invoiceIssuance['skssqz'], //税款所属期止,格式,年-月-日 *
'zsxmdm' => '30433', //征收项目代码:30433
'my' => $this->my, //密钥,数字签名校验和资格校验
'mxGrid' => $this->mxGrid($mxGrid)
];
$param = $this->getParamData('SSGZ_GZPT_SZQKL_WTDZDRJK', $body);
$result = $this->json_curl(json_encode($param));
if (!isset($result['result'])) {
throw new \Exception('请求失败');
}
$data = $this->xmlDom($result['result']);
$deData = $this->deCompressXml($data['SZQKLDZSPSB0001ZipBase64ResponsBw']);
$this->xmlType = 2;
$returnData = $this->xmlDom($deData);
$param = $this->getParamData('SSGZ_GZPT_SZQKL_WTDZDRJK', $body);
if ($returnData['ns2:code'] !== 200) {
throw new \Exception($returnData['ns2:message']);
$res = $this->resultXml($param);
if (!isset($res['sbpch'])) {
throw new FuncException('未获取到批次号');
}
dump($returnData);die;
return $res;
}
/**
* 3.6实时加工委托代征明细数据接口
* @param $sbpch
* @return array
* @throws FuncException
*/
public function realTimeProcessing()
public function realTimeProcessing($sbpch): array
{
$body = [
'sbpch' => '', // 批次号,详见备注
'my' => '', // 密钥,数字签名校验和资格校验
'czlx' => '', // 操作类型(CX:查询;JG:加工)
'sbpch' => $sbpch, // 批次号,详见备注
'my' => $this->my, // 密钥,数字签名校验和资格校验
'czlx' => 'CX', // 操作类型(CX:查询;JG:加工)
];
$param = $this->getParamData('SSGZ_GZPT_SZQKL_JGWTDZ', $body);
$result = $this->json_curl(json_encode($param));
return $this->resultXml($param, '6', 3);
}
/**
* 3.8开具电子缴款凭证接口
* @param $sbpch
* @return array
* @throws FuncException
*/
public function issueElectronic()
public function issueElectronic($sbpch): array
{
$body = [
'sbpch' => '', // 批次号,详见备注
'sbpch' => $sbpch, // 批次号,详见备注
'bdzmxGrid' => [
'bdznsrsbh' => '', // 被代征人纳税人识别号
'yhbm' => '', // 用户编码
'bdzmxlb' => [
'bdznsrsbh' => $this->puCodeUser['CertificateCode'], // 被代征人纳税人识别号
'yhbm' => $this->puCodeUser['UserCode'], // 用户编码
]
],
'skssqq' => '', // 税款所属期起,格式,年-月-日
'skssqz' => '', // 税款所属期止,格式,年-月-日
'my' => '' // 密钥,数字签名校验和资格校验
'skssqq' => $this->invoiceIssuance['skssqq'], // 税款所属期起,格式,年-月-日
'skssqz' => $this->invoiceIssuance['skssqz'], // 税款所属期止,格式,年-月-日
'my' => $this->my // 密钥,数字签名校验和资格校验
];
$param = $this->getParamData('SSGZ_GZPT_PZ_SQKJDZJKPZ', $body);
$result = $this->json_curl(json_encode($param));
return $this->resultXml($param, '', 1);
}
/**
* 3.9查询电子缴款凭证上链信息
* @param $assetID
* @return false[]|string[]
* @throws FuncException
*/
public function queryPaymentVoucher()
public function queryPaymentVoucher($assetID): array
{
$body = [
'assetID' => ''
'assetID' => $assetID
];
$param = $this->getParamData('SSGZ_GZPT_PZ_QUERYDZJKPZSLXX', $body);
$result = $this->resultXml($param, '', 1);
$result = $this->json_curl(json_encode($param));
return [
'meta' => $this->deCompressXml($result['pzkjxxVO']['meta']),
'data' => $this->deCompressXml($result['pzkjxxVO']['data'])
];
}
/**
* 3.3 查询上传异常数据接口
* 3.3 查询上传异常数据接口(未完成)
* @param $sbpch
* @return array
* @throws FuncException
*/
public function queryUploadErrorData()
public function queryUploadErrorData($sbpch): array
{
$body = [
'sbpch' => '', // 批次号,详见备注
'my' => '' // 密钥,数字签名校验和资格校验
'sbpch' => $sbpch, // 批次号,详见备注
'my' => $this->my // 密钥,数字签名校验和资格校验
];
$param = $this->getParamData('SSGZ_GZPT_SZQKL_DW_DZSCMXYC_QUERY', $body);
$result = $this->json_curl(json_encode($param));
return $this->resultXml($result, '', 1);
}
/**
* 3.7 查询待开具电子缴款凭证数据接口
* 3.7 查询待开具电子缴款凭证数据接口(未完成)
* @param $bdznsrsbh
* @return array
* @throws FuncException
*/
public function queryIssuedPaymentVoucher()
public function queryIssuedPaymentVoucher($bdznsrsbh): array
{
$body = [
'bdzmxList' => [
'bdznsrsbh' => '' // 被代征人纳税人识别号
'bdznsrsbh' => $bdznsrsbh // 被代征人纳税人识别号
],
'skssqq' => '', // 税款所属期起,格式,年-月-日
'skssqz' => '', // 税款所属期止,格式,年-月-日
'my' => '' // 密钥,数字签名校验和资格校验
'skssqq' => $this->invoiceIssuance['skssqq'], // 税款所属期起,格式,年-月-日
'skssqz' => $this->invoiceIssuance['skssqz'], // 税款所属期止,格式,年-月-日
'my' => $this->my // 密钥,数字签名校验和资格校验
];
$param = $this->getParamData('SSGZ_GZPT_PZ_QUERYDKDZJKP', $body);
$result = $this->json_curl(json_encode($param));
return $this->resultXml($result, '', 1);
}
/**
* 3.10身份校验接口
* 3.10身份校验接口 ---
* @param $nsrsbh // 纳税人识别号
* @return array
* @throws FuncException
*/
public function identityCheck()
public function identityCheck($nsrsbh): array
{
$body = [
'sfxxList' => [
'nsrlx' => '' // 2 非自然人、1 自然人
'nsrlx' => '1' // 2 非自然人、1 自然人
],
'yhbh' => '', // 水司的用户编号
'nsrsbh' => '', // 传输类型为非自然人不可以为空
'nsrmc' => '', // 不可为空
'zjhm' => '', // 传输类型为自然人,不可以为空
'zjlx' => '', // 传输类型为自然人,不可以为空,添加证件类型代码 999
'gj' => '', // 国籍
'yhbh' => $this->puCodeUser['UserCode'], // 水司的用户编号
'nsrsbh' => $nsrsbh, // 传输类型为非自然人不可以为空
'nsrmc' => $this->puCodeUser['ContactName'], // 不可为空
'zjhm' => $this->puCodeUser['CertificateCode'], // 传输类型为自然人,不可以为空
'zjlx' => '201', // 传输类型为自然人,不可以为空,添加证件类型代码 999
'gj' => '156', // 国籍
];
$this->xmlType = 2;
$param = $this->getParamData('SSGZ_GZPT_SZQKL_SFJYJK', $body);
$result = $this->json_curl(json_encode($param));
return $this->resultXml($result, '7');
}
/**
* 3.14代征明细数据虚拟户更正接口
* @param $nsrsbh // 纳税人识别号
* @param $sbpch // 批次号
* @return array
* @throws FuncException
*/
public function collectionDetails()
public function collectionDetails($nsrsbh, $sbpch): array
{
$body = [
'gzxxList' => [
'gzxxVO' => [
'my' => '' // 密钥,数字签名校验和资格校验
'my' => $this->my // 密钥,数字签名校验和资格校验
],
'nsrlx' => 1, // 2 非自然人、1 自然人
'yhbh' => '', // 水司的用户编号
'nsrsbh' => '', // 传输类型为单位不可以为空
'nsrmc' => '', // 不可为空
'zjhm' => '', // 传输类型为自然人,不可以为空
'zjlx' => '', // 传输类型为自然人,不可以为空,添加证件类型代码 999
'gj' => '', // 国籍
'username' => '', // 用户名称
'skyhmc' => '', // 托收银行
'yhzh' => '', // 银行账号
'lxdz' => '', // 用户地址
'lxfs' => '', // 联系方式
'sbpch' => '', // 申报批次号
'yhbh' => $this->puCodeUser['UserCode'], // 水司的用户编号
'nsrsbh' => $nsrsbh, // 传输类型为单位不可以为空
'nsrmc' => $this->puCodeUser['ContactName'], // 不可为空 ?
'zjhm' => $this->puCodeUser['CertificateCode'], // 传输类型为自然人,不可以为空
'zjlx' => '201', // 传输类型为自然人,不可以为空,添加证件类型代码 999
'gj' => '156', // 国籍
'username' => $this->puCodeUser['UserName'], // 用户名称
'skyhmc' => $this->puCodeUser['BankName'], // 托收银行
'yhzh' => $this->puCodeUser['BankAccountCode'], // 银行账号
'lxdz' => $this->puCodeUser['MaillingAddress'], // 用户地址
'lxfs' => $this->puCodeUser['Telephone'], // 联系方式
'sbpch' => $sbpch, // 申报批次号
],
];
$this->xmlType = 2;
$param = $this->getParamData('SSGZ_GZPT_SZQKL_SB_XNHGZ', $body);
$result = $this->json_curl(json_encode($param));
return $this->resultXml($result, '', 1);
}
/**
* 3.2作废委托代征明细数据接口
* 3.2作废委托代征明细数据接口(未完成)
* @throws FuncException
*/
public function invalidEntrustCollection()
public function invalidEntrustCollection($sbpch): array
{
$body = [
'sbpch' => '', // 批次号,详见备注
'my' => '' // 密钥,数字签名校验和资格校验
'sbpch' => $sbpch, // 批次号,详见备注
'my' => $this->my // 密钥,数字签名校验和资格校验
];
$param = $this->getParamData('SSGZ_GZPT_SZQKL_DELETEWTDZ', $body);
$result = $this->json_curl(json_encode($param));
return $this->resultXml($result, '', 1);
}
/**
* 3.12代征明细数据汇总确认查询接口
* @throws FuncException
*/
public function daiZhengSummaryQuery()
public function daiZhengSummaryQuery($bdznsrsbh): array
{
$body = [
'my' => '', // 密钥,数字签名校验和资格校验
'bdznsrsbh' => '', // 被代征人纳税人识别号
'skssqq' => '', // 税款所属期起,格式,年-月-日
'skssqz' => '', // 税款所属期止,格式,年-月-日
'my' => $this->my, // 密钥,数字签名校验和资格校验
'bdznsrsbh' => $bdznsrsbh, // 被代征人纳税人识别号
'skssqq' => $this->invoiceIssuance['skssqq'], // 税款所属期起,格式,年-月-日
'skssqz' => $this->invoiceIssuance['skssqz'], // 税款所属期止,格式,年-月-日
];
$param = $this->getParamData('SSGZ_GZPT_SZQKL_SB_CXDZMXSJHZ', $body);
$result = $this->json_curl(json_encode($param));
return $this->resultXml($result, '', 1);
}
/**
* 3.13代征明细数据汇总确认结报接口
* @param $zje // 总金额
* @return array
* @throws FuncException
*/
public function daiZhengSummaryReport()
public function daiZhengSummaryReport($zje): array
{
$body = [
'my' => '', // 密钥,数字签名校验和资格校验
'zje' => '', // 总金额
'skssqq' => '', // 税款所属期起,格式,年-月-日
'skssqz' => '', // 税款所属期止,格式,年-月-日
'my' => $this->my, // 密钥,数字签名校验和资格校验
'zje' => $zje, // 总金额
'skssqq' => $this->invoiceIssuance['skssqq'], // 税款所属期起,格式,年-月-日
'skssqz' => $this->invoiceIssuance['skssqz'], // 税款所属期止,格式,年-月-日
];
$param = $this->getParamData('SSGZ_GZPT_SZQKL_SB_BCWTDZHZJK', $body);
$result = $this->json_curl(json_encode($param));
return $this->resultXml($result, '', 1);
}
/**
* 3.15查询作废的电子缴款凭证接口
* 3.11税收完税证明换开申请接口 !!!
* @param $bdznsrsbh
* @return array
* @throws FuncException
*/
public function taxationReplaceApply($bdznsrsbh): array
{
$body = [
'my' => $this->my, // 密钥,数字签名校验和资格校验
'bdznsrsbh' => $bdznsrsbh, // 被代征人纳税人识别号
'skssqq' => $this->invoiceIssuance['skssqq'], // 税款所属期起,格式,年-月-日
'skssqz' => $this->invoiceIssuance['skssqz'], // 税款所属期止,格式,年-月-日
];
$param = $this->getParamData('SSGZ_GZPT_SZQKL_ZM_SAVEPLSQKJSSWSZMJK', $body);
$result = $this->json_curl(json_encode($param));
return $this->resultXml($result, '', 1);
}
/**
* 3.15查询作废的电子缴款凭证接口 ---
* @throws FuncException
*/
public function queryInvalidPaymentVoucher()
public function queryInvalidPaymentVoucher($assetID): array
{
$body = [
'my' => '', // 密钥,数字签名校验和资格校验
'zfqq' => '', // 作废期起,格式,年-月-日,查询作废时间内作废的票证,返回相应的 assetid
'zfqz' => '', // 作废期止,格式,年-月-日,查询作废时间内作废的票证,返回相应的 assetid
'assetid' => '', // 电子缴款凭证开具返回的 assetid,填写这个参数只查验单个票证是否作废
'my' => $this->my, // 密钥,数字签名校验和资格校验
'zfqq' => $this->invoiceIssuance['skssqq'], // 作废期起,格式,年-月-日,查询作废时间内作废的票证,返回相应的 assetid
'zfqz' => $this->invoiceIssuance['skssqz'], // 作废期止,格式,年-月-日,查询作废时间内作废的票证,返回相应的 assetid
'assetid' => $assetID, // 电子缴款凭证开具返回的 assetid,填写这个参数只查验单个票证是否作废
];
$param = $this->getParamData('SSGZ_GZPT_SZQKL_PZ_QUERYDZJKPZZFQK', $body);
$result = $this->json_curl(json_encode($param));
return $this->resultXml($result, '', 1);
}
/**
* 3.4申请开具接口
* 3.4申请开具接口 !!!
* @param $nsrsbh
* @param $sbpch
* @return array
* @throws FuncException
*/
public function applyIssued()
public function applyIssued($nsrsbh, $sbpch): array
{
$body = [
'bhzrnsrsbhs' => [
'nsrsbh' => '' // 纳税人识别号
'nsrsbh' => $nsrsbh // 纳税人识别号
],
'skssqq' => '', // 税款所属期起,格式,年-月-日
'skssqz' => '', // 税款所属期止,格式,年-月-日
'mm' => '', // 密钥,数字签名校验和资格校验
'pch' => '', // 文件名,英文或数字,长度在 20 位,且唯一
'skssqq' => $this->invoiceIssuance['skssqq'], // 税款所属期起,格式,年-月-日
'skssqz' => $this->invoiceIssuance['skssqz'], // 税款所属期止,格式,年-月-日
'mm' => $this->my, // 密钥,数字签名校验和资格校验
'pch' => $sbpch, // 文件名,英文或数字,长度在 20 位,且唯一
];
$param = $this->getParamData('SSGZ_GZPT_SZQKL_ZM_SAVEPLSQKJSSWSZMFORWXT', $body);
$result = $this->json_curl(json_encode($param));
return $this->resultXml($result, '', 1);
}
/**
* 3.5下载完税证明
* 3.5下载完税证明 !!!
*/
public function downTaxPaymentProve(): string
public function downTaxPaymentProve($djxh, $bq): string
{
$param = [
'ctrl=PlkjwszmCtrl_jkxzWszmxx', // 必填,功能模块名称,固定值为“PlkjwszmCtrl_jkxzWszmxx“
'token=' . $this->accessToken, // 必填,令牌,即通过前台资格校验模块生成的密钥
'djxh=', // 必填,代征单位登记序号
'bq=' // 必填,标签,即申请开具接口的的 pch 字段,是唯一的一个文件名称
'djxh=' . $djxh, // 必填,代征单位登记序号
'bq=' . $bq // 必填,标签,即申请开具接口的的 pch 字段,是唯一的一个文件名称
];
$paramStr = implode('&', $param);
return 'https://szxz.shenzhen.chinatax.gov.cn/qkldzsp/sword?' . $paramStr; // 必填,请求路径
return env('taxes_down_url') . '?' . $paramStr; // 必填,请求路径
}
/**
* 处理 body 报文
* @param $body
* @param int $type
* @return string
*/
protected function bizXml($body, $type = 2): string
protected function bizXml($body, int $type = 0): string
{
$start = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<SZQKLDZSPSB0001ZipBase64RequestBw
xmlns:ns2="http://www.chinatax.gov.cn/dataspec/">';
$start = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><SZQKLDZSPSB0001ZipBase64RequestBwxmlns:ns2="http://www.chinatax.gov.cn/dataspec/">';
$start1 = '<SZQKLDZSPSB0001ZipBase64RequestBw>';
$end = '</SZQKLDZSPSB0001ZipBase64RequestBw>';
$xml = '';
$xml2 = '';
foreach ($body as $key => $value) {
if (is_array($value)) {
$xml .= "<$key>" . $this->bizXml($value) . "</$key>";
$xml2 .= "<ns2:{$key}>" . $this->bizXml($value, $type) . "</ns2:{$key}>";
$xml .= "<$key>" . $this->bizXml($value, 1) . "</$key>";
$xml2 .= "<ns2:{$key}>" . $this->bizXml($value, 1) . "</ns2:{$key}>";
} else {
$xml .= "<$key>$value</$key>";
$xml2 .= "<ns2:{$key}>" . $value . "</ns2:{$key}>";
}
}
if ($type == 2) {
if ($type == 1) {
return $xml;
}
// 需要ns2 前后组合 加密返回
if ($this->xmlType == 2) {
return $start1 . $this->enCompressXml($start . $xml2 . $end) . $end;
}
return $start1 . $this->enCompressXml($xml) . $end;
// 需要ns2 前后组合 加密返回
if ($this->xmlType == 3) {
return $start1 . $this->enCompressXml($start . $xml . $end) . $end;
}
// 直接返回
if ($this->xmlType == 1) {
return $xml;
}
// 不需要前后组合
return $xml2;
}
/**
*
* @param $mxGrid
* @return mixed
* @return string
*/
protected function mxGrid($mxGrid)
protected function mxGrid($mxGrid): string
{
$xmlStr = '<ns2:sbMxsjVOList>';
@ -504,29 +610,20 @@ xmlns:ns2="http://www.chinatax.gov.cn/dataspec/">';
return json_decode($response, true);
}
protected function demo()
/**
* 获取接入端交易请求唯一标识
* @return string
*/
protected function getReqId(): string
{
$json_str = '{ "reqId": "'.md5(time() . rand(000,999))
.'", "sid": "'.'SSGZ_GZPT_SZQKL_WTDZDRJK'
.'", "channelId":"'.$this->channelId
.'", "accessToken":"'.$this->accessToken
.'", "timestamp":"'.time()
.'", "data": { "bizXml": "<SZQKLDZSPSB0001ZipBase64RequestBw>H4sIAAAAAAAAAO1Xy27bRhT9FUN7SzMcipIMm4FkyS4VU6pEyQ9tComkRVJ8yaNE5KyyCdoUQR5o{r}{n}UMBIujAKNEEfyCJp6yZA+jOWXP1Fhw+JDIKmboGu6gXFc88992pmeDgkN294lrl2Wz3BumNvZWAW{r}{n}ZNZUW3YU3R5uZbqdnfViZg1P+rbSNx1b3cr4Ks7c4DelXuvmXrUnfSpVAACwp7uVPlY5tq2Ob6l4{r}{n}Upmu0b423rAxs5XRJhN3I5ebTqdZWdPt/qTvZYfO7axs5xQaYFeVcxl+k2o38EAmple1eN3G6slk{r}{n}M/ceGUmOTTzgj+JUGMSlrqzxy4oQh3CE8XjMM4CB6wCtAxgrIjqRkJUEpSUkklg+r/p1bbAr6029{r}{n}LnSJABu6gAW7nZe3BU4YuYf72/VSlopuyahOjqwhFQp5sdMCYlWcijVYaXR7n4ijnUqz1tL3tuuu{r}{n}jMSgWacLG0IbOgE36tuaIxiOLnbK/qq2Wo4OMgINMgx0RNnd8ZWdtjs46Ab/E3DmwGp3+wfQDOsN{r}{n}Wq+DaVMCRNwuew3i0FpnKkp00NY+Gwxa7BwxjWqXiB3BF6WpLqPKuOfTyRg1/biVNcd95RhJ5Qrb{r}{n}2uv3JK97oBNr0FVvjvWjeq+GnHz+sMl8JhFHiNaLrlG0Vt7uia4sL4roYWO/uafjScQMFGLjEzzQ{r}{n}+BJkWYAAEMv5apU9rLEo6pMoUgWWzF/89s3i3enswe/zs8cX51/NXr28fPLz7KdHF2+//+PsBf2d{r}{n}nb6YP7u3OH00u/vj7OF5uhstD5sRQ7N4yDIsQrBUKAKWgYVCnomkYTL2GDFCxzErvyyZMD80NGWM{r}{n}CQ1hnosECRUqNJ8iVIJxeRhGI8CeFdQBuGwdM3HWXWU5lCjclIKEOJcOAmxg36DDKRVZlEXxUoZc{r}{n}NCMTLu+NAAXAp7dYzEUwRApJ2AiH0EhY4z0tTIvjzoa1UkcwQK6WopdBOCBsWB5ZzSkJl8JUMgnj{r}{n}iAzMJJUEH/ruyk5ErQaofNyJizffXT5/Obv/ZvbtD4u7Ty7OXy/unM9f3buS+1CBgUwJlqg3GFAs{r}{n}ccvt5tp91+6j+2CthjpXdd+7X+enDy/fnl0+fzz/8s6V3McxAFFb0esE6IkpFvPX7vtfu+/jXpt/{r}{n}8Xr+9efzX57+9cMUAQ4xoaGonVgW/lfbGVdcPqf/jaEK1Pf/3FAck4fXbkp5J3rRi1/wcn/7FcD/{r}{n}CZ2KPLlgDAAA</SZQKLDZSPSB0001ZipBase64RequestBw>"}}';
dump($json_str);
$xmlData = $this->json_curl($json_str);
$dom = new \DOMDocument();
$dom->loadXML($xmlData['result']);
$output = $this->xmlToArray($dom->documentElement);
$data = $output['SZQKLDZSPSB0001ZipBase64ResponsBw'];
dump($data);
$gzdecode = $this->deCompressXml($data);
dump($gzdecode);
exit();
return md5(time() . rand(0, 9));
}
/**
* 装换xml数据为数组
* @param $xmlData
* @return array|mixed
*/
protected function xmlDom($xmlData)
{
$dom = new \DOMDocument();
@ -559,7 +656,7 @@ xmlns:ns2="http://www.chinatax.gov.cn/dataspec/">';
}
/**
*
* 转换xml为数组
* @param $node
* @return array|mixed
*/
@ -579,4 +676,69 @@ xmlns:ns2="http://www.chinatax.gov.cn/dataspec/">';
return $output;
}
/**
* 处理返回的XML数据
* @param $param
* @param string $keyValue
* @param int $type
* @return array
* @throws FuncException
*/
protected function resultXml($param, string $keyValue = '1', int $type = 0): array
{
$key = "SZQKLDZSPSB000{$keyValue}ZipBase64ResponsBw";
$result = $this->json_curl(json_encode($param));
if (!isset($result['result'])) {
throw new FuncException('请求失败');
}
$data = $this->xmlDom($result['result']);
if (isset($data['code']) && $data['code'] != 200) {
if ($type == 1) return $data;
throw new FuncException($data['message']);
}
$deData = $this->deCompressXml($data[$key]);
if ($deData) {
$xmlData = $this->xmlDom($deData);
if (isset($xmlData['ns2:code']) && $xmlData['ns2:code'] !== 200) {
throw new FuncException($xmlData['ns2:message']);
}
$returnData = $this->delNs2Filed($xmlData);
if ($type == 3) {
$data['data'] = $returnData;
$returnData = $data;
}
return $returnData;
}
return $data;
}
/**
* 处理xml数据
* @param $returnData
* @return mixed
*/
protected function delNs2Filed($returnData)
{
foreach ($returnData as $oldKey => $value) {
$newKey = str_replace('ns2:', '', $oldKey);
if (is_array($value)) {
$value = $this->delNs2Filed($value);
}
$returnData[$newKey] = $value;
if ($newKey != $oldKey) {
unset($returnData[$oldKey]);
}
}
return $returnData;
}
}

733
app/service/webService/ChinaTaxes1.php

@ -0,0 +1,733 @@
<?php
namespace app\service\webService;
use fast\FuncException;
use think\facade\Cache;
class ChinaTaxes
{
protected $puCodeUser;
protected $accessToken;
protected $sid;
protected $reqId;
protected $channelId;
protected $channelSecret;
protected $apiUrl;
protected $my = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuc3JzYmgiOiI2MjAxMDQ3NzQ0MTk4NVgiLCJpc3MiOiJTU1NIR1oiLCJkanhoIjoiMTAxMTQ0MDMwMDAwMjY0NzE2NzQiLCJzdGFydFRpbWUiOiIiLCJ1bmRUaW11IjoiMjAyMi0wNi0zMCAxODowNDo0MSIsImV4cCI6MTY1NjU4MzQ4MSwic3BqZyI6IjEifQ.Ho0H43DxSGDmydHamMABRampNaNTu3K5vJwTJzoLAMA';
protected $xmlType = 2;
protected $paramType = 1;
/**
* @throws FuncException
*/
public function __construct($data)
{
$this->puCodeUser = $data;
$this->apiUrl = env('taxes.api_url');
$this->reqId = $this->getReqId();//env('taxes.req_id'); // 接入端交易请求唯一标识,长度 32 位,5 秒内不得重复,否则抛出异常:交易请求唯一标识重复。
$this->channelId = env('taxes.channel_id'); // 接入渠道标识(ID)
$this->channelSecret = env('taxes.channel_secret'); // 平台为接入渠道统一分配的密码,只有身份验证接口需要
$this->sid = 'bizAccessLogin'; // 调用的接口名称,固定为“bizAccessLogin”
$this->getAccessToken();
}
/**
* 2.1身份验证
* @throws FuncException
*/
protected function getAccessToken()
{
$tax_key = 'tax_access_token';
$tax_access_token = Cache::get($tax_key);
if ($tax_access_token) {
$this->accessToken = $tax_access_token;
} else {
$param = [
'reqId' => $this->reqId, // 接入端交易请求唯一标识,长度 32 位,5 秒内不得重复,否则抛出异常:交易请求唯一标识重复。
'sid' => $this->sid, // 调用的接口名称,固定为“bizAccessLogin”
'channelId' => $this->channelId, // 接入渠道标识(ID)
'channelSecret' => $this->channelSecret, // 平台为接入渠道统一分配的密码,只有身份验证接口需要
'timestamp' => time(), // unix 时间戳
'data' => [
'flag' => '大工业区生活垃圾处理费征收及开票需要'
] // 身份验证数据,默认为空
];
$result = $this->json_curl(json_encode($param));
if (isset($result['error'])) {
throw new FuncException($result['error']['message']);
}
if (!isset($result['result']['accessToken'])) {
throw new FuncException('返回参数有误');
}
$this->accessToken = $result['result']['accessToken'];
Cache::set($tax_key, $this->accessToken, 28680);
}
}
/**
*
* @return string
*/
protected function getReqId(): string
{
return md5(time() . rand(0,9));
}
/**
* 3.1保存委托代征明细数据接口
* @throws FuncException
*/
public function savingDetailedData()
{
$mxGrid = [
'bdznsrsbh' => '91440300MA5D40268',// 被代征纳税人识别号 *
'bdznsrmc' => '花若兰',// 被代征纳税人名称 *
'gjhdqszDm' => '156',// 国家或地区数字代码
'sfzjlxDm' => '201',// 身份证件类型代码
'zjhm' => '540127195512135368',// 证件号码 *
'hyDm' => '6490',// 行业代码
'zsxmDm' => '30433',// 征收项目代码
'zspmDm' => '304331300',// 征收品目代码
'zszmDm' => '',// 征收子目代码
'jsyj' => '11.11',// 计税依据,保留两位小数
'sl1' => '',//
'ynse' => '',//
'ydzse' => '',//
'yjse' => '',// 1
'ydzse1' => '',// 1
'jmse' => '',// 1
'phjmse' => '',// 1
'phjzbl' => '',// 1
'phjmxzDm' => '',// 1
'ssjmxzDm' => '',// 1
'wszmkjbz' => 'Y',// 完税证明开具标志为 Y 开具,N不开具
'xmmc' => '测试',// 项目名称
'xmbm' => 'T435',// 项目编码
'username' => '测试',// 用户名称(同一个批次,同一个用户编号下,值相同)
'nbyhbm' => 'EF4353',// 用户编号
'jldwmc' => '立方米',// 单位
'sl' => '100',// 数量
'zxbz1' => '10',// 标准
'skyhmc' => '招商银行',// 托收银行(同一个批次,同一个用户编号下,值相同)
'yhzh' => '454878548',// 银行账号(同一个批次,同一个用户编号下,值相同)
'zsfsmc' => '手工转账',// 缴费方式(同一个批次,同一个用户编号下,值相同)
'tjsd' => '2022-11-01至2022-11-30',// 收费时段(同一个批次,同一个用户编号下,值相同)
'jfyj1' => '测试',// 计费依据(同一个批次,同一个用户编号下,值相同)
'yhje' => '10.00',// 优惠金额
'hjje' => '990.00',// 合计金额
'jfrq' => '2022-11-30',// 缴费时间(同一个批次,同一个用户编号下,值相同)
'lxfs' => '测试',// 联系方式(同一个批次,同一个用户编号下,值相同)
'lxdz' => '测试',// 送票地址(同一个批次,同一个用户编号下,值相同)
'remark' => '测试',// 备注(同一个批次,同一个用户编号下,值相同)
'bz' => '测试',// 备注信息(同一个批次,同一个用户编号下,值相同)
];
dump($this->puCodeUser);
dump($mxGrid);
$body = [
'sbczlxDm' => 'insert', //申报操作类型代码,为”delete”,” insert” 或”update”
'sflsb' => 'N', //是否零申报 ,为非零申报”N”
'sbpch' => '', //批次号,详见备注
'nsqxDm' => '06', //纳税期限代码,“06”按月
'skssqq' => '2024-06-01', //税款所属期起,格式,年-月-日 *
'skssqz' => '2024-06-30', //税款所属期止,格式,年-月-日 *
'zsxmdm' => '30433', //征收项目代码:30433
'my' => $this->my, //密钥,数字签名校验和资格校验
'mxGrid' => $this->mxGrid($mxGrid)
];
dump($body);
$param = $this->getParamData('SSGZ_GZPT_SZQKL_WTDZDRJK', $body);
dump(json_encode($param));
$result = $this->json_curl(json_encode($param));
$this->resultXml($result);
}
protected function resultXml($result, $key = 'SZQKLDZSPSB0001ZipBase64ResponsBw'): array
{
dump($result);
if (!isset($result['result'])) {
throw new \Exception('请求失败');
}
$data = $this->xmlDom($result['result']);
dump($data);
dump(json_encode($data));
if (isset($data['code']) && $data['code'] != 200) {
throw new \Exception($data['message']);
}
$deData = $this->deCompressXml($data[$key]);
dump($deData);
$returnData = $this->xmlDom($deData);
dump($returnData);
if ($returnData['ns2:code'] !== 200) {
throw new \Exception($returnData['ns2:message']);
}
dump($returnData);die;
return $returnData;
}
/**
* 3.6实时加工委托代征明细数据接口
* @throws FuncException
*/
public function realTimeProcessing()
{
$body = [
'sbpch' => '101144030000264716742412W0000004', // 批次号,详见备注
'my' => $this->my, // 密钥,数字签名校验和资格校验
'czlx' => 'JG', // 操作类型(CX:查询;JG:加工)
];
$this->xmlType = 4;
$param = $this->getParamData('SSGZ_GZPT_SZQKL_JGWTDZ', $body);
dump($param);
dump(json_encode($param));
$result = $this->json_curl(json_encode($param));
return $this->resultXml($result, 'SZQKLDZSPSB0006ZipBase64ResponsBw');
}
/**
* 3.8开具电子缴款凭证接口
* @throws FuncException
*/
public function issueElectronic()
{
$body = [
'sbpch' => '101144030000264716742412W0000003', // 批次号,详见备注
'bdzmxGrid' => [
'bdzmxlb' => [
'bdznsrsbh' => '91440300772709730N', // 被代征人纳税人识别号
'yhbm' => 'EF4353', // 用户编码
]
],
'skssqq' => '2024-06-01', // 税款所属期起,格式,年-月-日
'skssqz' => '2024-06-30', // 税款所属期止,格式,年-月-日
'my' => $this->my // 密钥,数字签名校验和资格校验
];
$this->xmlType = 4;
$param = $this->getParamData('SSGZ_GZPT_PZ_SQKJDZJKPZ', $body);
dump(json_encode($param));
$result = $this->json_curl(json_encode($param));
return $this->resultXml($result);
}
/**
* 3.9查询电子缴款凭证上链信息
* @throws FuncException
*/
public function queryPaymentVoucher()
{
$body = [
'assetID' => '6D1F1BBA19DA247BF75C04B6705A2969'
];
$this->xmlType = 4;
$param = $this->getParamData('SSGZ_GZPT_PZ_QUERYDZJKPZSLXX', $body);
$result = $this->json_curl(json_encode($param));
return $this->resultXml($result);
}
/**
* 3.3 查询上传异常数据接口
* @throws FuncException
*/
public function queryUploadErrorData()
{
$body = [
'sbpch' => '101144030000264716742412W0000004', // 批次号,详见备注
'my' => $this->my // 密钥,数字签名校验和资格校验
];
$this->xmlType = 4;
$param = $this->getParamData('SSGZ_GZPT_SZQKL_DW_DZSCMXYC_QUERY', $body);
dump($param);
// dump(json_encode($param));exit;
$result = $this->json_curl(json_encode($param));
return $this->resultXml($result, 'SZQKLDZSPSB0003ZipBase64ResponsBw');
dump($result);die;
}
/**
* 3.7 查询待开具电子缴款凭证数据接口
* @throws FuncException
*/
public function queryIssuedPaymentVoucher()
{
$body = [
'bdzmxList' => [
'bdzmxVO' => [
'bdznsrsbh' => '91440300MA5D40268' // 被代征人纳税人识别号
]
],
'skssqq' => '2024-06-01', // 税款所属期起,格式,年-月-日
'skssqz' => '2024-06-30', // 税款所属期止,格式,年-月-日
'my' => $this->my // 密钥,数字签名校验和资格校验
];
$this->xmlType = 4;
$param = $this->getParamData('SSGZ_GZPT_PZ_QUERYDKDZJKPZ', $body);
$result = $this->json_curl(json_encode($param));
return $this->resultXml($result, 'SZQKLDZSPSB0003ZipBase64ResponsBw');
}
/**
* 3.10身份校验接口
* @throws FuncException
*/
public function identityCheck()
{
$body = [
'sfxxList' => [
'nsrlx' => '1' // 2 非自然人、1 自然人
],
'yhbh' => 'EF4353', // 水司的用户编号
'nsrsbh' => '91440300MA5D40268', // 传输类型为非自然人不可以为空
'nsrmc' => '深圳市华珞纸制品有限公司', // 不可为空
'zjhm' => '540127195512135368', // 传输类型为自然人,不可以为空
'zjlx' => '201', // 传输类型为自然人,不可以为空,添加证件类型代码 999
'gj' => '156', // 国籍
];
$this->xmlType = 5;
$param = $this->getParamData('SSGZ_GZPT_SZQKL_SFJYJK', $body);
dump($param);
$param['data']['bizXml'] = '<SZQKLDZSPSB0007ZipBase64RequestBw>H4sIAAAAAAAAAO2Uy27TQBSG10XiHYxXsLBnxpe0jhxXRKgs6n BLQSibyJmY2FV8IWNih10rCipU{r}{n}bKgKqkCsuKyqRkiAAo/TqfsYjMclCpBFxQ6J1fz/zDnH3z+Sx1zOgr4wdAfEj8KaiGQoCm6Io
64f{r}{n}9mri7bUVaUlcts6fMy9IUr778W7DbsYjYahApAokRkeTD/nu23z/kcBOjveeHH37fNFLkrgKQJqm{r}{n}stNPoqEj4yi4JEn
FlMTJGraQEb+ajGK3JjZbN1ftK63mjWYdQrjY8uO6Q9yKdsu9/8AlST0VhU7H{r}{n}Y3XJgAGJAoP9zQZ4xrK5BHtu4NgRdhKeaIY
Ge37oMAK5Fw1lHIIuMyR2MRDWCqx62p7itAua9p84{r}{n}cka6/LMhOdvo0+IqQ/ulIVXlaNADCoQIFJfKqSU/JIkTYldkd7Vgknt
ZZvskKUzp7lznesEMyaCf{r}{n}WYoJSlFujryOZyHVBFxMCwkzhqJpUIWwcVlfuWroUL3GW8lsXYCt4y9j+voT/bpJD97Qg226M8m
/{r}{n}v8qfb9OtMT3cpzt79P1j+mKDTl7ydtZRdj9c9wJL1yBSFpGh60hBqq5WlkzAD37WFMQQFZtT5N66{r}{n}hfSKCdjKQ4KZlP
8TF0HRvMTavMRz8508HZ88e0e3Dv8aX/mX8Q3DOCt+qU//NxPwl4qpHyKnwUoh{r}{n}BQAA</SZQKLDZSPSB0007
ZipBase64RequestBw>';
dump(json_encode($param));
$result = $this->json_curl(json_encode($param));
return $this->resultXml($result, '');
}
/**
* 3.14代征明细数据虚拟户更正接口
* @throws FuncException
*/
public function collectionDetails()
{
$body = [
'gzxxList' => [
'gzxxVO' => [
'my' => $this->my // 密钥,数字签名校验和资格校验
],
'nsrlx' => '1', // 2 非自然人、1 自然人
'yhbh' => '41108008', // 水司的用户编号
'nsrsbh' => '91440300772709730N', // 传输类型为单位不可以为空
'nsrmc' => '深圳市大工业区水务有限公司', // 不可为空
'zjhm' => '412826198307167158', // 传输类型为自然人,不可以为空
'zjlx' => '201', // 传输类型为自然人,不可以为空,添加证件类型代码 999
'gj' => '156', // 国籍
'username' => '李冲', // 用户名称
'skyhmc' => '农业银行', // 托收银行
'yhzh' => '6228480120759512318', // 银行账号
'lxdz' => '龙田街道竹坑社区聚龙二期4栋2904', // 用户地址
'lxfs' => '13528899213', // 联系方式
'sbpch' => '101144030000264716742412W0000003', // 申报批次号
],
];
//$this->xmlType = 5;
$param = $this->getParamData('SSGZ_GZPT_SZQKL_SB_XNHGZ', $body);
dump($param);dump(json_encode($param));
$result = $this->json_curl(json_encode($param));
return $this->resultXml($result, '');
}
/**
* 3.2作废委托代征明细数据接口
* @throws FuncException
*/
public function invalidEntrustCollection()
{
$body = [
'sbpch' => '101144030000264716742412W0000002', // 批次号,详见备注
'my' => $this->my // 密钥,数字签名校验和资格校验
];
$this->xmlType = 4;
$param = $this->getParamData('SSGZ_GZPT_SZQKL_DELETEWTDZ', $body);
$result = $this->json_curl(json_encode($param));
return $this->resultXml($result, '');
}
/**
* 3.12代征明细数据汇总确认查询接口
* @throws FuncException
*/
public function daiZhengSummaryQuery()
{
$body = [
'my' => $this->my, // 密钥,数字签名校验和资格校验
'bdznsrsbh' => '91440300MA5FG5AF75', // 被代征人纳税人识别号
'skssqq' => '2024-06-01', // 税款所属期起,格式,年-月-日
'skssqz' => '2024-06-30', // 税款所属期止,格式,年-月-日
];
$this->xmlType = 4;
$param = $this->getParamData('SSGZ_GZPT_SZQKL_SB_CXDZMXSJHZ', $body);
$result = $this->json_curl(json_encode($param));
return $this->resultXml($result, 'SZQKLDZSPSB0003ZipBase64ResponsBw');
}
/**
* 3.13代征明细数据汇总确认结报接口
* @throws FuncException
*/
public function daiZhengSummaryReport()
{
$body = [
'my' => $this->my, // 密钥,数字签名校验和资格校验
'zje' => '990.00', // 总金额
'skssqq' => '2024-06-01', // 税款所属期起,格式,年-月-日
'skssqz' => '2024-06-30', // 税款所属期止,格式,年-月-日
];
$this->xmlType = 4;
$param = $this->getParamData('SSGZ_GZPT_SZQKL_SB_BCWTDZHZJK', $body);
$result = $this->json_curl(json_encode($param));
return $this->resultXml($result, 'SZQKLDZSPSB0003ZipBase64ResponsBw');
}
/**
* 3.11税收完税证明换开申请接口
* @return array
* @throws FuncException
*/
public function taxationReplaceApply()
{
$body = [
'my' => $this->my, // 密钥,数字签名校验和资格校验
'bdznsrsbh' => '91440300MA5FG5AF75', // 被代征人纳税人识别号
'skssqq' => '2024-06-01', // 税款所属期起,格式,年-月-日
'skssqz' => '2024-06-30', // 税款所属期止,格式,年-月-日
];
$this->xmlType = 4;
$param = $this->getParamData('SSGZ_GZPT_SZQKL_ZM_SAVEPLSQKJSSWSZMJK', $body);
$result = $this->json_curl(json_encode($param));
return $this->resultXml($result, 'SZQKLDZSPSB00011ZipBase64ResponsBw');
}
/**
* 3.15查询作废的电子缴款凭证接口
* @throws FuncException
*/
public function queryInvalidPaymentVoucher()
{
$body = [
'my' => $this->my, // 密钥,数字签名校验和资格校验
'zfqq' => '2024-06-01', // 作废期起,格式,年-月-日,查询作废时间内作废的票证,返回相应的 assetid
'zfqz' => '2024-06-30', // 作废期止,格式,年-月-日,查询作废时间内作废的票证,返回相应的 assetid
'assetid' => '73B1B59DE346D3EFCCEB1868E0D5B727', // 电子缴款凭证开具返回的 assetid,填写这个参数只查验单个票证是否作废
];
$this->xmlType = 4;
$param = $this->getParamData('SSGZ_GZPT_SZQKL_PZ_QUERYDZJKPZZFQK', $body);
$result = $this->json_curl(json_encode($param));
return $this->resultXml($result);
}
/**
* @param $sid
* @param $body
* @return array
*/
protected function getParamData($sid, $body): array
{
$data = [
'reqId' => $this->getReqId(), // 接入端交易请求唯一标识
'sid' => $sid,// 调 用 的 接 口 名 称
'channelId' => $this->channelId,// 接入渠道标识
'accessToken' => $this->accessToken,// 访问令牌,由调用身份验证接口获取
'timestamp' => time(),// unix 时间戳
'data' => [],
];
if ($this->paramType == 3) {
$data['token'] = $this->accessToken;
}
$data['data'] = [
'bizXml' => $this->bizXml($body)
];
return $data;
}
/**
* 3.4申请开具接口
* @throws FuncException
*/
public function applyIssued()
{
$body = [
'bhzrnsrsbhs' => [
'nsrsbh' => '91440300MA5FG5AF75' // 纳税人识别号
],
'skssqq' => '2024-06-01', // 税款所属期起,格式,年-月-日
'skssqz' => '2024-06-30', // 税款所属期止,格式,年-月-日
'mm' => $this->my, // 密钥,数字签名校验和资格校验
'pch' => '101144030000264716742411W0000030', // 文件名,英文或数字,长度在 20 位,且唯一
];
$this->xmlType = 4;
$param = $this->getParamData('SSGZ_GZPT_SZQKL_ZM_SAVEPLSQKJSSWSZMFORWXT', $body);
dump($param);
$result = $this->json_curl(json_encode($param));
return $this->resultXml($result);
}
/**
* 3.5下载完税证明
*/
public function downTaxPaymentProve(): string
{
$param = [
'ctrl=PlkjwszmCtrl_jkxzWszmxx', // 必填,功能模块名称,固定值为“PlkjwszmCtrl_jkxzWszmxx“
'token=' . $this->accessToken, // 必填,令牌,即通过前台资格校验模块生成的密钥
'djxh=', // 必填,代征单位登记序号
'bq=' // 必填,标签,即申请开具接口的的 pch 字段,是唯一的一个文件名称
];
$paramStr = implode('&', $param);
return 'https://szxz.shenzhen.chinatax.gov.cn/qkldzsp/sword?' . $paramStr; // 必填,请求路径
}
/**
* 处理 body 报文
* @param $body
* @param $type
* @return string
*/
protected function bizXml($body, $type = 0): string
{
$start = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<SZQKLDZSPSB0001ZipBase64RequestBw
xmlns:ns2="http://www.chinatax.gov.cn/dataspec/">';
$start1 = '<SZQKLDZSPSB0001ZipBase64RequestBw>';
$end = '</SZQKLDZSPSB0001ZipBase64RequestBw>';
$xml = '';
$xml2 = '';
foreach ($body as $key => $value) {
if (is_array($value)) {
$xml .= "<$key>" . $this->bizXml($value, 1) . "</$key>";
$xml2 .= "<ns2:{$key}>" . $this->bizXml($value, 1) . "</ns2:{$key}>";
} else {
$xml .= "<$key>$value</$key>";
$xml2 .= "<ns2:{$key}>" . $value . "</ns2:{$key}>";
}
}
if ($type) {
return $xml;
}
if ($this->xmlType == 2) {
dump($xml2);
return $start1 . $this->enCompressXml($start . $xml2 . $end) . $end;
}
if ($this->xmlType == 3) {
dump($xml);
return $start1 . $this->enCompressXml($xml) . $end;
}
if ($this->xmlType == 5) {
dump($xml);
dump($start1 . $this->enCompressXml( $xml ) . $end);
return $start1 . $this->enCompressXml( $xml ) . $end;
}
if ($this->xmlType == 4) {
dump($xml);
return $xml;
}
return $this->enCompressXml($xml);
}
/**
*
* @param $mxGrid
* @return mixed
*/
protected function mxGrid($mxGrid)
{
$xmlStr = '<ns2:sbMxsjVOList>';
foreach ($mxGrid as $key => $value) {
$xmlStr .= "<ns2:{$key}>" . $value . "</ns2:{$key}>";
}
return $xmlStr . '</ns2:sbMxsjVOList>';
}
/**
* 发送请求JSON
* @param $json
* @return bool|string
* @throws FuncException
*/
protected function json_curl($json)
{
// 初始化cURL会话
$ch = curl_init();
// 设置cURL选项
curl_setopt($ch, CURLOPT_URL, $this->apiUrl); // 目标URL
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 返回结果而不是输出
curl_setopt($ch, CURLOPT_POST, true); // 发送POST请求
// 设置POST字段
curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); // 设置HTTP头
// 跳过证书验证(不推荐在生产环境使用)
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
// 跳过主机名验证
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
// 执行cURL会话
$response = curl_exec($ch);
// 检查是否有错误发生
if (curl_errno($ch)) {
\think\facade\Log::write(json_encode([
'code' => curl_errno($ch),
'message' => 'error',
'url' => $this->apiUrl,
'data' => json_decode($json, true)
]));
throw new FuncException('请求失败');
}
// 关闭cURL会话
curl_close($ch);
return json_decode($response, true);
}
protected function demo()
{
$json_str = '{ "reqId": "'.md5(time() . rand(000,999))
.'", "sid": "'.'SSGZ_GZPT_SZQKL_WTDZDRJK'
.'", "channelId":"'.$this->channelId
.'", "accessToken":"'.$this->accessToken
.'", "timestamp":"'.time()
.'", "data": { "bizXml": "<SZQKLDZSPSB0001ZipBase64RequestBw>H4sIAAAAAAAAAO1Xy27bRhT9FUN7SzMcipIMm4FkyS4VU6pEyQ9tComkRVJ8yaNE5KyyCdoUQR5o{r}{n}UMBIujAKNEEfyCJp6yZA+jOWXP1Fhw+JDIKmboGu6gXFc88992pmeDgkN294lrl2Wz3BumNvZWAW{r}{n}ZNZUW3YU3R5uZbqdnfViZg1P+rbSNx1b3cr4Ks7c4DelXuvmXrUnfSpVAACwp7uVPlY5tq2Ob6l4{r}{n}Upmu0b423rAxs5XRJhN3I5ebTqdZWdPt/qTvZYfO7axs5xQaYFeVcxl+k2o38EAmple1eN3G6slk{r}{n}M/ceGUmOTTzgj+JUGMSlrqzxy4oQh3CE8XjMM4CB6wCtAxgrIjqRkJUEpSUkklg+r/p1bbAr6029{r}{n}LnSJABu6gAW7nZe3BU4YuYf72/VSlopuyahOjqwhFQp5sdMCYlWcijVYaXR7n4ijnUqz1tL3tuuu{r}{n}jMSgWacLG0IbOgE36tuaIxiOLnbK/qq2Wo4OMgINMgx0RNnd8ZWdtjs46Ab/E3DmwGp3+wfQDOsN{r}{n}Wq+DaVMCRNwuew3i0FpnKkp00NY+Gwxa7BwxjWqXiB3BF6WpLqPKuOfTyRg1/biVNcd95RhJ5Qrb{r}{n}2uv3JK97oBNr0FVvjvWjeq+GnHz+sMl8JhFHiNaLrlG0Vt7uia4sL4roYWO/uafjScQMFGLjEzzQ{r}{n}+BJkWYAAEMv5apU9rLEo6pMoUgWWzF/89s3i3enswe/zs8cX51/NXr28fPLz7KdHF2+//+PsBf2d{r}{n}nb6YP7u3OH00u/vj7OF5uhstD5sRQ7N4yDIsQrBUKAKWgYVCnomkYTL2GDFCxzErvyyZMD80NGWM{r}{n}CQ1hnosECRUqNJ8iVIJxeRhGI8CeFdQBuGwdM3HWXWU5lCjclIKEOJcOAmxg36DDKRVZlEXxUoZc{r}{n}NCMTLu+NAAXAp7dYzEUwRApJ2AiH0EhY4z0tTIvjzoa1UkcwQK6WopdBOCBsWB5ZzSkJl8JUMgnj{r}{n}iAzMJJUEH/ruyk5ErQaofNyJizffXT5/Obv/ZvbtD4u7Ty7OXy/unM9f3buS+1CBgUwJlqg3GFAs{r}{n}ccvt5tp91+6j+2CthjpXdd+7X+enDy/fnl0+fzz/8s6V3McxAFFb0esE6IkpFvPX7vtfu+/jXpt/{r}{n}8Xr+9efzX57+9cMUAQ4xoaGonVgW/lfbGVdcPqf/jaEK1Pf/3FAck4fXbkp5J3rRi1/wcn/7FcD/{r}{n}CZ2KPLlgDAAA</SZQKLDZSPSB0001ZipBase64RequestBw>"}}';
dump($json_str);
$xmlData = $this->json_curl($json_str);
$dom = new \DOMDocument();
$dom->loadXML($xmlData['result']);
$output = $this->xmlToArray($dom->documentElement);
$data = $output['SZQKLDZSPSB0001ZipBase64ResponsBw'];
dump($data);
$gzdecode = $this->deCompressXml($data);
dump($gzdecode);
exit();
}
protected function xmlDom($xmlData)
{
$dom = new \DOMDocument();
$dom->loadXML($xmlData);
return $this->xmlToArray($dom->documentElement);
}
/**
* 加密
* @param $str
* @return array|string|string[]
*/
protected function enCompressXml($str)
{
$gzencode = gzencode($str);
$baseStr = base64_encode($gzencode);
return str_replace(array("\n", "\r"), array('{n}', '{r}'), $baseStr);
}
/**
* 解密
* @param $str
* @return false|string
*/
protected function deCompressXml($str)
{
$repStr = str_replace(array('{n}', '{r}'), array("\n", "\r"), $str);
$baseStr = base64_decode($repStr);
return gzdecode($baseStr);
}
/**
*
* @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;
}
}
Loading…
Cancel
Save