apiUrl = env('taxes.api_url'); $this->reqId = md5(time());//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() { $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']; } /** * 获取请求参数 * @param $sid * @param $body * @return array */ protected function getParamData($sid, $body): array { return [ 'reqId' => md5(time() . rand(0,9)), 'sid' => $sid, 'channelId' => $this->channelId, 'accessToken' => $this->accessToken, 'timestamp' => time(), 'data' => [ 'flag' => '大工业区生活垃圾处理费征收及开票需要', 'bizXml' => $this->bizXml($body) ], ]; } /** * 3.1保存委托代征明细数据接口 * @throws FuncException */ public function savingDetailedData() { $mxGrid = [ 'ycms' => '' ]; $body = [ 'sbczlxDm' => 'insert', //申报操作类型代码,为”delete”,” insert” 或”update” 'sflsb' => 'N', //是否零申报 ,为非零申报”N” 'sbpch' => '0', //批次号,详见备注 'nsqxDm' => '06', //纳税期限代码,“06”按月 'skssqq' => '2023-06-01', //税款所属期起,格式,年-月-日 'skssqz' => '2023-06-30', //税款所属期止,格式,年-月-日 'zsxmdm' => '30433', //征收项目代码:30433 'my' => $this->my, //密钥,数字签名校验和资格校验 // 'mxGrid' => $this->mxGrid($mxGrid) ]; $param = $this->getParamData('SSGZ_GZPT_SZQKL_WTDZDRJK', $body); // dump($param);exit; return $this->json_curl(json_encode($param)); } /** * 3.6实时加工委托代征明细数据接口 * @throws FuncException */ public function realTimeProcessing() { $body = [ 'sbpch' => '', // 批次号,详见备注 'my' => '', // 密钥,数字签名校验和资格校验 'czlx' => '', // 操作类型(CX:查询;JG:加工) ]; $param = $this->getParamData('SSGZ_GZPT_SZQKL_JGWTDZ', $body); $result = $this->json_curl(json_encode($param)); } /** * 3.8开具电子缴款凭证接口 * @throws FuncException */ public function issueElectronic() { $body = [ 'sbpch' => '', // 批次号,详见备注 'bdzmxGrid' => [ 'bdznsrsbh' => '', // 被代征人纳税人识别号 'yhbm' => '', // 用户编码 ], 'skssqq' => '', // 税款所属期起,格式,年-月-日 'skssqz' => '', // 税款所属期止,格式,年-月-日 'my' => '' // 密钥,数字签名校验和资格校验 ]; $param = $this->getParamData('SSGZ_GZPT_PZ_SQKJDZJKPZ', $body); $result = $this->json_curl(json_encode($param)); } /** * 3.9查询电子缴款凭证上链信息 * @throws FuncException */ public function queryPaymentVoucher() { $body = [ 'assetID' => '' ]; $param = $this->getParamData('SSGZ_GZPT_PZ_QUERYDZJKPZSLXX', $body); $result = $this->json_curl(json_encode($param)); } /** * 3.3 查询上传异常数据接口 * @throws FuncException */ public function queryUploadErrorData() { $body = [ 'sbpch' => '', // 批次号,详见备注 'my' => '' // 密钥,数字签名校验和资格校验 ]; $param = $this->getParamData('SSGZ_GZPT_SZQKL_DW_DZSCMXYC_QUERY', $body); $result = $this->json_curl(json_encode($param)); } /** * 3.7 查询待开具电子缴款凭证数据接口 * @throws FuncException */ public function queryIssuedPaymentVoucher() { $body = [ 'bdzmxList' => [ 'bdznsrsbh' => '' // 被代征人纳税人识别号 ], 'skssqq' => '', // 税款所属期起,格式,年-月-日 'skssqz' => '', // 税款所属期止,格式,年-月-日 'my' => '' // 密钥,数字签名校验和资格校验 ]; $param = $this->getParamData('SSGZ_GZPT_PZ_QUERYDKDZJKP', $body); $result = $this->json_curl(json_encode($param)); } /** * 3.10身份校验接口 * @throws FuncException */ public function identityCheck() { $body = [ 'sfxxList' => [ 'nsrlx' => '' // 2 非自然人、1 自然人 ], 'yhbh' => '', // 水司的用户编号 'nsrsbh' => '', // 传输类型为非自然人不可以为空 'nsrmc' => '', // 不可为空 'zjhm' => '', // 传输类型为自然人,不可以为空 'zjlx' => '', // 传输类型为自然人,不可以为空,添加证件类型代码 999 'gj' => '', // 国籍 ]; $param = $this->getParamData('SSGZ_GZPT_SZQKL_SFJYJK', $body); $result = $this->json_curl(json_encode($param)); } /** * 3.14代征明细数据虚拟户更正接口 * @throws FuncException */ public function collectionDetails() { $body = [ 'gzxxList' => [ 'gzxxVO' => [ 'my' => '' // 密钥,数字签名校验和资格校验 ], 'nsrlx' => 1, // 2 非自然人、1 自然人 'yhbh' => '', // 水司的用户编号 'nsrsbh' => '', // 传输类型为单位不可以为空 'nsrmc' => '', // 不可为空 'zjhm' => '', // 传输类型为自然人,不可以为空 'zjlx' => '', // 传输类型为自然人,不可以为空,添加证件类型代码 999 'gj' => '', // 国籍 'username' => '', // 用户名称 'skyhmc' => '', // 托收银行 'yhzh' => '', // 银行账号 'lxdz' => '', // 用户地址 'lxfs' => '', // 联系方式 'sbpch' => '', // 申报批次号 ], ]; $param = $this->getParamData('SSGZ_GZPT_SZQKL_SB_XNHGZ', $body); $result = $this->json_curl(json_encode($param)); } /** * 3.2作废委托代征明细数据接口 * @throws FuncException */ public function invalidEntrustCollection() { $body = [ 'sbpch' => '', // 批次号,详见备注 'my' => '' // 密钥,数字签名校验和资格校验 ]; $param = $this->getParamData('SSGZ_GZPT_SZQKL_DELETEWTDZ', $body); $result = $this->json_curl(json_encode($param)); } /** * 3.12代征明细数据汇总确认查询接口 * @throws FuncException */ public function daiZhengSummaryQuery() { $body = [ 'my' => '', // 密钥,数字签名校验和资格校验 'bdznsrsbh' => '', // 被代征人纳税人识别号 'skssqq' => '', // 税款所属期起,格式,年-月-日 'skssqz' => '', // 税款所属期止,格式,年-月-日 ]; $param = $this->getParamData('SSGZ_GZPT_SZQKL_SB_CXDZMXSJHZ', $body); $result = $this->json_curl(json_encode($param)); } /** * 3.13代征明细数据汇总确认结报接口 * @throws FuncException */ public function daiZhengSummaryReport() { $body = [ 'my' => '', // 密钥,数字签名校验和资格校验 'zje' => '', // 总金额 'skssqq' => '', // 税款所属期起,格式,年-月-日 'skssqz' => '', // 税款所属期止,格式,年-月-日 ]; $param = $this->getParamData('SSGZ_GZPT_SZQKL_SB_BCWTDZHZJK', $body); $result = $this->json_curl(json_encode($param)); } /** * 3.15查询作废的电子缴款凭证接口 * @throws FuncException */ public function queryInvalidPaymentVoucher() { $body = [ 'my' => '', // 密钥,数字签名校验和资格校验 'zfqq' => '', // 作废期起,格式,年-月-日,查询作废时间内作废的票证,返回相应的 assetid 'zfqz' => '', // 作废期止,格式,年-月-日,查询作废时间内作废的票证,返回相应的 assetid 'assetid' => '', // 电子缴款凭证开具返回的 assetid,填写这个参数只查验单个票证是否作废 ]; $param = $this->getParamData('SSGZ_GZPT_SZQKL_PZ_QUERYDZJKPZZFQK', $body); $result = $this->json_curl(json_encode($param)); } /** * 3.4申请开具接口 * @throws FuncException */ public function applyIssued() { $body = [ 'bhzrnsrsbhs' => [ 'nsrsbh' => '' // 纳税人识别号 ], 'skssqq' => '', // 税款所属期起,格式,年-月-日 'skssqz' => '', // 税款所属期止,格式,年-月-日 'mm' => '', // 密钥,数字签名校验和资格校验 'pch' => '', // 文件名,英文或数字,长度在 20 位,且唯一 ]; $param = $this->getParamData('SSGZ_GZPT_SZQKL_ZM_SAVEPLSQKJSSWSZMFORWXT', $body); $result = $this->json_curl(json_encode($param)); } /** * 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 * @return string */ protected function bizXml($body, $type = 2): string { $start = ' '; $end = ''; $xml = ''; $xml2 = ''; foreach ($body as $key => $value) { if (is_array($value)) { $xml .= "<$key>" . $this->bizXml($value) . ""; $xml2 .= "" . $this->bizXml($value, $type) . ""; } else { $xml .= "<$key>$value"; $xml2 .= "" . $value . ""; } } // dump($xml2); //$sm4 = new NewSm4(); $sm4 = new Sm4(); if ($type == 2) { //return $start1 . base64_encode(gzencode($xml2)) . $end; // $aa = base64_encode(gzencode($xml2)); // return $start1.$xml2.$end; $gzencode = gzencode($xml2); $sm4Code = $sm4->encrypt($this->my, $gzencode); return $start . $sm4Code . $end; } $gzencode = gzencode($xml); $sm4Code = $sm4->encrypt($this->my, $gzencode); return $start . $sm4Code . $end; } /** * * @param $mxGrid * @return mixed */ protected function mxGrid($mxGrid) { $xmlArr = []; foreach ($mxGrid as $key => $value) { $xmlArr[] = "" . $value . ""; } return $xmlArr; } /** * 发送请求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)) { throw new FuncException('请求失败'); } // 关闭cURL会话 curl_close($ch); return json_decode($response, true); } }