getInvoice 是回填不是开票,Tigshop开源商城发票接口理一理

群里老有人问 getInvoice 这个接口是不是开发票用的,接第三方电子发票要不要改它。前后被问了好几次,干脆把 tigshop 单商户里发票相关的几个入口理清楚。

先说 getInvoice。它挂在结算流程下,路由是 order.check/getInvoice,方法在 php/app/api/controller/order/Check.php 里,实际调的是 OrderCheckService::checkInvoice()。看它的逻辑就明白职责了:

php 复制代码
// OrderCheckService::checkInvoice 主干
$result = $query->where("order_invoice.status", 1)->order("id", "desc")->limit(1)->findOrEmpty()->toArray();
// 订单发票里没有、且是企业抬头时,再去 user_invoice 表兜底找一条
if (empty($result) && $params['title_type'] == 2) {
    $result = UserInvoice::where("user_id", $params['user_id'])->where("status", 1)
        ->order("invoice_id", "desc")->limit(1)->findOrEmpty()->toArray();
}

它做的事就是把这个用户最近一次审核通过的发票信息捞回来,好让结算页自动带出来,不用每次重填。所以它是个回填器,不负责开票,也不决定这单要不要发票。

那用户自己管理的发票在哪?有两个入口,别搞混。一个是 php/app/api/controller/user/OrderInvoice.php,走 OrderInvoiceService,管的是针对某笔订单的发票申请(增删改)。另一个是 php/app/api/controller/user/Invoice.php,走 UserInvoiceService,管的是增票资质(企业抬头、税号那套,要审核)。getInvoice 在结算时回填,正是从这两处审核通过的数据里捞的。

发票内容最后存哪,也顺带说下。真正决定这单开不开票、开什么,是提交订单时那份 invoice_data。Check.php 的下单方法收 invoice_data/a,跟着 submit 写进订单里,Order 模型有 getInvoiceDataAttr 做读取处理。所以查历史订单能看到当时开的什么票,就是从这来的。

被问最多的其实是接第三方电子发票代码往哪塞。关键一句:别塞在下单主流程里同步开。开票接口经常慢、还可能超时,卡在 submit 里会拖垮下单体验。正确姿势是下单成功之后异步去开:

php 复制代码
// submit 成功之后,把开票丢进队列异步处理
if (!empty($order['invoice_data'])) {
    Queue::push(MakeInvoiceJob::class, [
        'order_id'     => $order['order_id'],
        'invoice_data' => $order['invoice_data'],
    ]);
}

下单先返回成功,开票在后台慢慢跑,失败了再重试或提醒,用户端不受影响。

至于字段够不够用,普通电商场景,个人 / 企业抬头、税号这些标品字段都有,够用。真正麻烦的是对接税盘、走电子发票平台那种,字段和流程都得二开,getInvoice 帮不上,得自己在 OrderInvoice、Invoice 和异步任务里补。

相关推荐
来自于狂人6 小时前
GitHub 开源趋势日报 | 2026年10月21日
开源·github
冬奇Lab8 小时前
开源项目第244期:高性价比人生指南 —— 767 条建议,每条写明成本、收益、证据等级和原始出处
开源·资讯
Imagination官方博客11 小时前
从开源驱动到完整软件栈:Imagination 助力 RISC-V 图形生态发展
开源·risc-v
ITxiaobing202311 小时前
海外广告投放的 IP 定位服务怎么选?一份基于实测数据的选型参考
网络协议·tcp/ip·php
weixin_4173968311 小时前
桌面云终端PXE启动失败怎么排查?从DHCP Option到镜像下发
开发语言·前端·php·技术·酒店·综合布线·弱电
袋鼠云数栈11 小时前
让 SQL 解析不再重复造轮子:SqlParserX 正式开源
数据库·人工智能·sql·开源·数据治理
xiaoshiquan120611 小时前
Gradle 复合构建:宿主项目直接依赖 SDK 源码模块的配置实践
android
程序员老赵12 小时前
Docker 部署 Hue:轻松搭建数据库与数据仓库 SQL 查询平台
sql·docker·开源
樊小肆12 小时前
睡前丢给它三张工单,早上收代码和账单:我开源了一个 DeepSeek 驱动的 AI 编码助手
开源·ai编程·deepseek
ServBay12 小时前
PHP 突爆 9.2 分高危漏洞,你升级了吗?
后端·php