Files
OMS/app/erpapi/lib/channel/invoice.php
2026-01-04 19:08:31 +08:00

163 lines
5.3 KiB
PHP

<?php
/**
* Copyright 2012-2026 ShopeX (https://www.shopex.cn)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* 电子发票接口通路定义类
*
* @author xiayuanjun<xiayuanjun@shopex.cn>
* wangjianjun update 20160623
* @version 0.1
*/
class erpapi_channel_invoice extends erpapi_channel_abstract
{
private $bindConfig = array (
'jinshui' => array (
'node_type' => 'jinshui',
'to_node' => '1483186233',
'shop_name' => '金税',
'title' => '金税电子发票',
),
'chinaums' => array (
'node_type' => 'chinaums',
'to_node' => '',
'shop_name' => '银联金4',
'title' => '银联金4电子发票',
),
'baiwang' => array (
'node_type' => 'baiwang',
'to_node' => '',
'shop_name' => '百望金4',
'title' => '百望金4电子发票',
),
'huifu' => array(
'node_type' => 'huifu',
'to_node' => '',
'shop_name' => '汇付发票',
'title' => '汇付电子发票',
),
);
private static $channel_mapping = array (
'baiwang_cloud' => 'baiwang',
);
/**
* 发票渠道初始化
* @param $node_id
* @param $shop_id
* @return bool
*/
public function init($node_id, $shop_id): bool
{
if (!$node_id && !$shop_id) {
return false;
}
if ($node_id) {
return $this->responseInit($node_id);
} else {
return $this->requestInit($shop_id);
}
}
/**
* 响应时匹配开票渠道
* @param $node_id
* @return bool
*/
private function responseInit($node_id): bool
{
$this->__adapter = 'matrix';
// 响应渠道定位
$filter = ['node_id' => $node_id];
// 1. 存在nodeId , 则尝试获取
$channelMdl = app::get('invoice')->model('channel');
$channel = $channelMdl->dump($filter);
$channelType = $channel['channel_type'];
// 硬编码查询
if (!$channel) {
// 使用 bindConfig查询
$channelList = array_column($this->bindConfig, 'node_type', 'to_node');
if (!isset($channelList[$node_id])) {
// todo 兼容淘宝
return false;
}
$channelType = $channelList[$node_id];
$channel = $channelMdl->getChannelByType($channelType);
}
if (!$channel) {
return false;
}
$this->__adapter = 'matrix';
$this->__platform = $channelType;
$this->channel = $channel;
$this->channel['node_id'] = $node_id;
if (isset($channel['channel_extend_data'])) {
$this->channel['extend_data'] = @json_decode($channel['channel_extend_data'], true);
} elseif (isset($this->channel['extend_data']) && is_string($this->channel['extend_data'])) {
$this->channel['extend_data'] = @json_decode($this->channel['extend_data'], true);
}
return true;
}
/**
* 请求时匹配开票渠道
* @param $shop_id
* @return bool
*/
private function requestInit($shop_id): bool
{
#一个店铺,同一个时刻,只会属于唯一一个开票渠道
$channel = app::get('invoice')->model('channel')->get_channel_info($shop_id);
if (empty($channel)) {
return false;
}
$this->__adapter = 'matrix';
$this->__platform = $channel['channel_type'];
// 节点id赋值逻辑
if ($channel['node_id']) {
// 1. 银联, 存在channel表内
$this->channel['node_id'] = $channel['node_id'];
} elseif ($channel['channel_type'] == 'taobao') {
// 2. 淘宝, 取绑定店铺节点
$this->channel['node_id'] = $channel["billing_shop_node_id"];
} else {
// 3. 其他, 硬编码于绑定配置内
$this->channel['node_id'] = $this->bindConfig[$channel['channel_type']]['to_node'];
}
$this->channel['extend_data'] = @json_decode($channel['channel_extend_data'], true);
$this->channel['channel_id'] = $shop_id;
$this->channel['channel_type'] = isset(self::$channel_mapping[$channel['channel_type']]) ? self::$channel_mapping[$channel['channel_type']] : $channel['channel_type'];
$this->channel['node_type'] = $channel["node_type"];
$this->channel['golden_tax_version'] = $channel["golden_tax_version"];
if ($channel['channel_type'] == 'taobao') {
$this->channel['node_id'] = $channel["billing_shop_node_id"];
}
return true;
}
}