Phase: Phase 0 — 关键技术决策与依据 Date: 2026-06-15
spec 无 NEEDS CLARIFICATION 标记(brainstorming 阶段已与用户确认全部决策)。本文档固化这些决策的"为什么",供 plan/tasks 与实现阶段参考。
cinv.ezpay.com.tw / 正式 inv.ezpay.com.tw)人工完成注册申请,拿到 MerchantID/HashKey/HashIV 后回平台后台录入。[[reference-ezpay-invoice-api]])。注册涉及工商凭证、人工审核,本就不是 API 能完成的。pos_store_ezpay,与 pos_store 1:1,按门店存一组 ezPay 凭证。不把凭证字段塞进 pos_store。pos_store——被否,污染主表且金钥混在通用字段中;②按商家账号(InfoUser)绑定——被否,用户明确按门店。ezpay_status 0未申请 / 1申请中 / 2已开通;另设 is_enabled 0停用 / 1启用(仅 status=2 有意义)。EzPayConfig(merchantId, hashKey, hashIV) 调 EzPay.doPost(BASE_TEST + URL_SEARCH, ...),传测试用假发票号+随机码。回应含 KEY1xxxx(加解密/金钥错误)→ 凭证无效、拒绝;回应是业务错误(如发票不存在 INVxxxxx)或成功 → 加密链路通、凭证有效 → 标记已开通。MerchantID_+PostData_,不带 CheckValue(见 [[reference-ezpay-invoice-api]] 文档勘误)。而 BDV(checkBarCode/checkLoveCode)需 CheckValue,且其公式官方示例存疑("接入若校验失败→改 HashIV 在前重试")。用 invoice_search 能干净地只测金钥对错,不受 CheckValue 不确定性影响,且只读不产生真实发票。业务错误(查不到发票)恰恰证明凭证可解密=有效。pos_store 加 invoice_exempt(0需开票/1免用发票)。该属性决定门店是否纳入 ezPay 流程,并供将来自动开票判断"开票 vs 只开收据"。pos_store_ezpay.need_invoice——免用门店不需 ezPay 行却要建行表达"不需要",语义别扭;②新建门店税务表——过度设计,YAGNI。invoice_exempt 由平台运营在后台切换;商家端不提供此开关,只提供上传统编。EzPay/EzPayConfig/EzPayEncryptUtil(2026-06-15 已实现并经官方数据验证),本期不改其内部,仅业务层调用 EzPay.doPost + EzPayConfig 构造。BaseController/AjaxResult/TableDataInfo/@PreAuthorize/startPage() 分页、@Log 审计、MessageUtils.message() 国际化消息。storeEzpay:{} 对象层级(遵循 [[feedback-i18n-key-naming]])。