一、配置文件 (config/invoice.php;发票配置数据由开票平台提供,以下配置数据随机修改过不可用于测试)
- <?php/** * Created by PhpStorm.
- * User: Jason
- * Date: 2019/7/1
- * Time: 10:16
- */
-
- return [
- 'DSPTBM' => 'sdf11dfd1MsfdFWegesdfIK', //'电商平台编码'
- 'NSRSBH' => '9670101000000090', //'纳税人识别码'
- 'NSRMC' => 'XXX官方旗舰店', //'纳税人名称',
- 'XHFMC' => 'XXX官方旗舰店', //'销货方名称'
- 'XHF_DZ' => '上海市杨浦区控江路XXX号', //'销货方地址',
- 'XHF_DH' => '17621251***', //'销货方电话',
- 'XHF_YHZH' => '', //'销货方银行账号',
- 'KPY' => '财务一', //'开票员',
- 'SKY' => '', //'收款员(可选)',
- 'HSBZ' => '1',
- 'TERMINALCODE' => '0',
- 'APPID' => 'ZZS_PT_DZFP',
- 'TAXPAYWERID' => '9670101000000090', //'税号',
- 'AUTHORIZATIONCODE' => '56301000000090', //'授权码',
- 'ENCRYPTCODE' =>'2', //0:不加密 1: 3DES 加密 2:CA
- 'INTERFACE_FPKJ' => 'ECXML.FPKJ.BC.E_INV',
- 'INTERFACE_FPXZ' => 'ECXML.FPXZ.CX.E_INV',
- 'INTERFACE_FPYX' => 'ECXML.EMAILPHONEFPTS.TS.E.INV',
- 'REQUESTCODE' => 'sdf11dfd1MsfdFWegesdfIK', //'请求码',
- 'RESPONSECODE' => '211', //'响应码',
- 'PASSWORD' => '', //'密码',
- ///'DATAEXCHANGEID' => '交互码',
- 'KJFP' => 'ECXML.FPKJ.BC.E_INV',
- 'DOWNLOAD' => 'ECXML.FPXZ.CX.E_INV',
- 'EMAIL' => 'ECXML.EMAILPHONEFPTS.TS.E.INV',
- 'REGISTERCODE' => '922588450019', //'注册码',
- ];
二、拼装请求数据 (packageinfo.php)
- <?php
- /**
- * Created by PhpStorm.
- * User: Jason
- * Date: 2019/7/2
- * Time: 10:35
- */
-
- class ome_invoice_packageinfo
- {
- private static $_instance = null;
-
- private $config = [];
-
- public function __construct()
- {
- $this->config = include ROOT_DIR.'/config/invoice.php';
- }
-
- /***
- * @param $interface
- * @return string
- */
- public function getXml($interface, $content)
- {
- $rand = rand(1000000000,9999999999);
- $pwd = $rand.base64_encode(md5($rand.$this->config['REGISTERCODE']));
- $terminalcode = $this->config['TERMINALCODE'];
- $appid = $this->config['APPID'];
- $dsptbm = $this->config['DSPTBM'];
- $password = $pwd;
- $date = date('Y-m-d');
- $taxpayerid = $this->config['TAXPAYWERID'];
- $authorizationcode = $this->config['AUTHORIZATIONCODE'];
- $response = $this->config['RESPONSECODE'];
- $dataexchangeid = $this->config['REQUESTCODE'].date('Ymd').substr($rand,0,9);
- $str = <<<XML
- <?xml version="1.0" encoding="utf-8" ?>
- <interface xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.chinatax.gov.cn/tirip/dataspec/interfaces.xsd"
- version="DZFP1.0">
- <globalInfo>
- <terminalCode>{$terminalcode}</terminalCode>
- <appId>{$appid}</appId>
- <version>2.0</version>
- <interfaceCode>{$interface}</interfaceCode>
- <requestCode>{$dsptbm}</requestCode>
- <requestTime>{$date}</requestTime>
- <responseCode>{$response}</responseCode>
- <dataExchangeId>{$dataexchangeid}</dataExchangeId>
- <userName>{$dsptbm}</userName>
- <passWord>{$password}</passWord>
- <taxpayerId>{$taxpayerid}</taxpayerId>
- <authorizationCode>{$authorizationcode}</authorizationCode>
- </globalInfo>
- <returnStateInfo>
- <returnCode/>
- <returnMessage/>
- </returnStateInfo>
- <Data>
- <dataDescription>
- <zipCode>0</zipCode>
- <encryptCode>0</encryptCode>
- <codeType>0</codeType>
- </dataDescription>
- <content>
- {$content}
- </content>
- </Data>
- </interface>
- XML;
-
-
- return $str;
-
- }
-
- /***
- * @param array $config
- * @param array $arr
- * @return string
- */
- public function getContent(array $arr)
- {
-
- $fpkj = '';
- foreach ($this->content_0($config) as $key => $item){
- if($item['text']!==''){
- $fpkj .= '<'.strtoupper($item['key']).'>'.$item['text'].'</'.$item['key'].'>';
- }else{
- $fpkj .= '<'.strtoupper($item['key']).'>'.$arr[$item['key']].'</'.$item['key'].'>';
- }
- }
- $xm_size = count($arr['items']);
- $fpkj_xm = '';
- foreach ($arr['items'] as $num => $value){
- $fpkj_xm .= '<FPKJXX_XMXX>';
- foreach ($this->content_1($config) as $key=>$item){
- if($item['text']!==''){
- $fpkj_xm .= '<'.strtoupper($item['key']).'>'.$item['text'].'</'.$item['key'].'>';
- }else{
- $fpkj_xm .= '<'.strtoupper($item['key']).'>'.$value[$item['key']].'</'.$item['key'].'>';
- }
- }
- $fpkj_xm .= '</FPKJXX_XMXX>';
- //津贴被折扣行
- if(isset($value['discount'])){
- //size对应
- $xm_size++;
- $fpkj_xm .= '<FPKJXX_XMXX>';
- foreach ($this->content_1($config) as $key=>$item){
- if($item['text']!==''){
- $fpkj_xm .= '<'.strtoupper($item['key']).'>'.$item['text'].'</'.$item['key'].'>';
- }else{
- $fpkj_xm .= '<'.strtoupper($item['key']).'>'.$value['discount'][$item['key']].'</'.$item['key'].'>';
- }
- }
- $fpkj_xm .= '</FPKJXX_XMXX>';
- }
- }
- $fpkj_dd = '';
- foreach ($this->content_2() as $key=>$item){
- if($item['text']!==''){
- $fpkj_dd .= '<'.strtoupper($item['key']).'>'.$item['text'].'</'.$item['key'].'>';
- }else{
- if($item['text']===null){
- $fpkj_dd .= '<'.strtoupper($item['key']).'/>';
- continue;
- }
- $fpkj_dd .= '<'.strtoupper($item['key']).'>'.$arr[$item['key']].'</'.$item['key'].'>';
- }
- }
- $root = <<<ROOT
- <REQUEST_FPKJXX class="REQUEST_FPKJXX">
- <FPKJXX_FPTXX class="FPKJXX_FPTXX">
- {$fpkj}
- </FPKJXX_FPTXX>
- <FPKJXX_XMXXS class="FPKJXX_XMXX;" size="{$xm_size}">
- {$fpkj_xm}
- </FPKJXX_XMXXS>
- <FPKJXX_DDXX class="FPKJXX_DDXX">
- {$fpkj_dd}
- </FPKJXX_DDXX>
- </REQUEST_FPKJXX>
- ROOT;
-
- return base64_encode($root);
- }
-
- /***
- * @param string $xml
- * @return mixed|\SimpleXMLElement
- */
- public function XML2array(string $xml)
- {
- $arr = simplexml_load_string($xml);
- $arr = json_decode(json_encode($arr),TRUE);
- return $arr;
- }
-
- public function getDownload($arr)
- {
- $content = '';
-
- foreach ($this->download($this->config) as $key => $item){
- if($item['text']!==''){
- $content .= '<'.strtoupper($item['key']).'>'.$item['text'].'</'.$item['key'].'>';
- }else{
- if($item['text']===null){
- $content .= '<'.strtoupper($item['key']).'/>';
- continue;
- }
- $content .= '<'.strtoupper($item['key']).'>'.$arr[$item['key']].'</'.$item['key'].'>';
- }
- }
-
- $root = <<<ROOT
- <REQUEST_FPXXXZ_NEW class="REQUEST_FPXXXZ_NEW">
- {$content}
- </REQUEST_FPXXXZ_NEW>
- ROOT;
-
- return base64_encode($root);
- }
-
- /***
- * @param array $arr
- * @return string
- */
- public function getEmail(array $arr)
- {
- $nsrsbh = $this->config['NSRSBH'];
-
- $root = <<<ROOT
- <REQUEST_EMAILPHONEFPTS class="REQUEST_EMAILPHONEFPTS">
- <TSFSXX class="TSFSXX">
- <COMMON_NODES class="COMMON_NODE;" size="4">
- <COMMON_NODE>
- <NAME>TSFS</NAME>
- <VALUE>0</VALUE>
- </COMMON_NODE>
- <COMMON_NODE>
- <NAME>SJ</NAME>
- <VALUE></VALUE>
- </COMMON_NODE>
- <COMMON_NODE>
- <NAME>EMAIL</NAME>
- <VALUE>{$arr['email']}</VALUE>
- </COMMON_NODE>
- <COMMON_NODE>
- <NAME>扩展字段名称</NAME>
- <VALUE>扩展字段值</VALUE>
- </COMMON_NODE>
- </COMMON_NODES>
- </TSFSXX>
- <FPXXS class="FPXX;" size="1">
- <FPXX>
- <COMMON_NODES class="COMMON_NODE;" size="5">
- <COMMON_NODE>
- <NAME>FPQQLSH</NAME>
- <VALUE>{$arr['FPQQLSH']}</VALUE>
- </COMMON_NODE>
- <COMMON_NODE>
- <NAME>NSRSBH</NAME>
- <VALUE>{$nsrsbh}</VALUE>
-