frontend-order-invoice-choice.md 4.0 KB

订单详情:发票类型接入说明

更新:2026-11-05。适用:用户、商家和骑手 App 的外卖订单详情。

接口与字段

请求参数保持不变,均需携带 token 请求头。

使用端 GET 接口 订单号参数
用户、商家 /system/order/getorderxq ddid
骑手 /system/orderQsOprate/getOrderDetial ddId

两个接口在 data 中增加 invoiceChoice,类型为字符串或 null。

invoiceChoice 页面显示
PAPER 纸本发票
PHONE_BARCODE 手机条码载具
CITIZEN 自然人凭证载具
MEMBER 会员发票
LOVE_CODE 捐赠发票
COMPANY 公司发票
null、空值或未识别值 暂无发票信息

页面显示“发票类型:纸本发票”等文案,标题和类型名称使用客户端现有国际化机制。

响应示例

下面只展示与本次接入相关的字段,订单详情原有字段保持不变。

{
  "code": 200,
  "msg": "操作成功",
  "data": {
    "id": 1001,
    "ddId": "991793757396125",
    "invoiceChoice": "PAPER"
  }
}

展示规则

  • 直接读取 data.invoiceChoice,不需要额外调用发票详情接口获取类型。
  • 尚未开票时也可能已有发票类型;显示类型不代表已经开票或已交付。
  • 无类型时显示“暂无发票信息”,不要默认显示纸本发票。
  • MEMBER 表示会员选择,当前流程实际开立纸本;不能仅凭名称判断为电子载具票。
  • 商家打印入口继续使用 canPrintInvoice 和 invoicePrintCount,不要根据 invoiceChoice 单独开放打印。
  • 本字段用于显示类型,不包含载具号码、统编、邮箱或发票凭证。

联调检查

  • 用户、商家与骑手查看同一订单时,发票类型一致。
  • 六种选择及无类型订单均显示对应文案,未开票订单可显示已保存类型。
  • 请求失败时按现有逻辑显示错误,不把无访问权限当作“暂无发票信息”。
  • 商家原有打印入口和其他订单详情字段正常。

商家下单传入发票类型

POST /system/orderShOprate/createOrder(请求头 token)在 JSON 顶层传 invoiceChoice,与 paymentMethod 同级,不能放在 items 内。其他下单必填参数保持不变。

选择 配套参数
PAPER 无
PHONE_BARCODE carrierNum:手机条码
CITIZEN carrierNum:自然人凭证号码
MEMBER 无
LOVE_CODE loveCode:捐赠码
COMPANY buyerUbn:8位统编;buyerEmail:买方邮箱;buyerName:公司名称

例如,现金纸本订单在原请求顶层增加 "invoiceChoice": "PAPER";公司发票还需带对应的买方资料。载具类型由后端根据 invoiceChoice 确定,无需传 carrierType。

不传或传空字符串时不记录发票选择;不支持开票的门店选择纸本可正常下单,但不会生成电子发票意图,详情类型仍为空。其他类型在门店不支持开票时返回业务错误。商家下单不支持把顾客发票资料保存为商家默认抬头。下单响应结构不变,保存的选择从本页订单详情接口读取;商家现金单在创建提交后尝试自动开票;开票可能失败或跳过,须查询发票接口确认结果,不能只凭创建成功判断已开票。

现金订单创建后的发票结果

商家现金订单(paymentMethod="4")传入有效发票选择且门店支持开票时,后端在创建提交后自动尝试开票,再发送新订单通知。App 收到通知后,可调用 GET /system/orderShOprate/getInvoice?orderId=订单主键 查询结果,按原 canPrintInvoice、invoicePrintCount 等打印资格操作。小票仍通过完整 ddId 获取;发票查询用订单主键。

开票失败不影响下单或新单通知,也不代表现金已收款。未传发票选择或门店不支持开票时不会生成电子发票。非现金订单本次不增加创建即开票的行为。