滨州健康科技职业学院 · 智慧餐厅 · 运维基线

一卡通当前接口调用与业务链路

按当前代码实际调用点整理,同步、绑盘、双钱包、在线/离线消费、退款和补偿一页查清。

更新:2026-08-05 store / develop_binzhou ai_api / develop_binzhou 不展示任何真实密钥

结论摘要

14当前实际使用的外部路径,含 token
7ai_api -> store 内部交易接口
2现金与补贴双钱包
3每分钟任务:同步、冲突恢复、交易补偿

调用链分三层:业务入口负责识别用户和组织订单;ai_api 通过内部接口把一卡通交易交给 storestore 统一调用厂商 API、维护状态机、幂等和补偿。

用户分流:one_card.enable=false、未配置或查不到有效账户映射时按访客本地钱包运行;查到有效 ydy_one_card_account_map 的一卡通用户才走一卡通。
状态口径:同步过滤的是 accNum/phoneNo/perCode 数据规则,不是只保存 accStatusNum=1。销户、冻结等变更仍会更新映射;绑盘、余额同步和支付才只放行有效账户和有效当前卡。
  • 滨州应配置 ewallet_id=2:2 号钱包是补贴,tieEwalletObject 中的 1 号钱包是现金。
  • 在线消费和离线补传均走 preorder -> orderhandle
  • preorderorderhandle 均固定传 isCheckCardStatus=1
  • 外部接口失败、未知状态、远端成功但本地失败均有交易记录和定时补偿。

通用请求规则

配置来源

外部接口读取 ydy_config.config_key=one_card。真实生产地址、appidappsecret 和内部鉴权密钥不写入本文。

字段作用当前规则
enable / payment_enable身份同步与支付开关滨州约定同开同关
business本地业务隔离键为空回退 config('business')
base_url一卡通服务地址本文不展示真实值
appid / appsecrettoken 与签名敏感配置
ep_id / area_nums项目与区域代码默认均为 1
ewallet_id查询和消费钱包滨州应为 2
payment_business_num一卡通消费商户号映射到 dealerNum
payment_device_map设备号映射设备映射优先,其次默认设备号
payment_retry_times补偿次数默认 3

Token

GET {base_url}/api/token?appid={appid}&appsecret={appsecret}

成功响应必须有 access_tokenexpires_in。token 按有效期提前刷新,并用缓存锁避免并发刷新。

业务 POST

POST {base_url}{path}?access_token={access_token}
Content-Type: application/x-www-form-urlencoded
  • 除部门水位接口外,表单自动追加 sign
  • 签名:去空值、数组、对象与原 sign,按字段名升序拼接,末尾追加 key={appid},取大写 MD5。
  • code="0" 视为成功;0001、网络错误、格式错误和缺状态码进入可重试/未知处理。

当前实际调用的外部接口

#业务方法与路径状态
1TokenGET /api/token使用中
2身份类别POST /api/common/queryaccclass使用中
3部门水位POST /api/common/systemdocking/getaccdepfixid使用中
4部门增量POST /api/common/systemdocking/getaccdepinfobyfixid使用中
5账户水位POST /api/common/systemdocking/getaccfixid使用中
6账户及当前卡增量POST /api/common/systemdocking/getaccinfobyfixid使用中
7补贴水位POST /api/common/getscparamverepbykeyfixType=2
8补贴包POST /api/common/getsubsidypackagebyfixid使用中
9单账户详情POST /api/common/infoqueryservice/getaccount使用中
10双钱包POST /api/common/infoqueryservice/getewallet使用中
11预下单POST /api/common/payservice/preorder使用中
12扣款处理POST /api/common/payservice/orderhandle使用中
13查单POST /api/common/payservice/orderquery使用中
14冲正退款POST /api/common/payservice/correct使用中

同步类接口与参数

身份类别 · /api/common/queryaccclass

字段值来源用途
epIdone_card.ep_id项目/平台标识
areaNumsone_card.area_nums区域编号
sign自动生成签名

部门水位 · /getaccdepfixid

当前不传业务表单字段,也不传 sign;读取 data.accDepFixId

部门增量 · /getaccdepinfobyfixid

字段值来源
startAccDepFixId首次 0,否则本地部门水位 + 1
endAccDepFixId远端最新部门水位
sign自动生成

账户水位 · /getaccfixid

参数:epId=one_card.ep_id、自动 sign;读取 data.accFixId

账户和当前卡增量 · /getaccinfobyfixid

字段值来源
startAccFixId首次 0,否则账户水位 + 1;指定账户恢复时可等于目标 fixid
endAccFixId远端最新账户水位或目标 fixid
epIdone_card.ep_id
sign自动生成
  1. 过滤 accNum 为空、原始 phoneNo 为空/非 11 位数字、perCode- 开头的数据。
  2. business + acc_num 更新或创建人员、用户、部门关系、账户映射和当前主卡。
  3. 手机号占用时写冲突日志,不覆盖本地人员。
  4. AI 同步失败时不推进本批账户水位。
  5. card 命令已转为运行 account,没有独立卡增量调用。

补贴水位 · /getscparamverepbykey

参数:epId、固定 fixType=2areaNums、自动 sign

补贴包 · /getsubsidypackagebyfixid

字段值来源
epIdone_card.ep_id
fixid本地补贴水位/本轮游标
size命令 limit 或批量大小
areaNumsone_card.area_nums
sign自动生成

补贴包写入本地幂等映射;关联 AI 用户后查询钱包、更新余额镜像,并向 yoshop_user_subsidy_logscene=60 的一卡通补贴发放审计。

账户详情与双钱包

单账户详情 · /api/common/infoqueryservice/getaccount

字段当前值
encryptFlag固定 0
epIdone_card.ep_id
queryType固定 1,按账户号
uniqueId目标 accNum
photoQueryType固定 0,不查照片
sign自动生成

用于手机号冲突解除后的指定账户恢复、手机号回填,以及账户增量缺少当前卡字段时的详情补查。若详情返回 accFixId,系统再精确读取该 fixid 的账户增量行。

钱包 · /api/common/infoqueryservice/getewallet

字段值来源滨州口径
accNumaccount_map.acc_num一卡通账户号
cardAccNumaccount_map.card_acc_num卡账户号
eWalletIdone_card.ewallet_id应为 2
epIdone_card.ep_id通常为 1
sign自动生成签名
解析:顶层 2 号钱包是补贴;tieEwalletObject 内 1 号钱包是现金;本地总余额为两者之和。

调用场景包括定时余额、补贴同步、冲突恢复、绑盘、消费前后、冲正前后和补偿后余额校准。

消费、查单与退款参数

预下单 · /api/common/payservice/preorder

字段值来源说明
optType固定 5当前消费操作类型
uniqueIdaccount_map.acc_num一卡通账户号
queryType固定 1按账户号定位
eWalletNumone_card.ewallet_id滨州为 2,补贴优先、不足再扣现金
monTrans本地实付金额元,两位小数
dealerNumpayment_business_num消费商户号
dealTime在线业务时间/离线设备原时间Y-m-d H:i:s
deviceNumpayload、设备映射、默认设备号按顺序回退
proofNum本地订单号或离线稳定流水号幂等追踪
isCheckCardStatus固定 1校验挂失等卡状态
sign自动生成签名

订单处理 · /api/common/payservice/orderhandle

字段值来源
transRecId预下单返回的 transRecId/recId/tradeOrderNo/orderNo
dealTime当前服务器时间
proofNum与预下单相同的本地稳定流水号
recDate当前日期 Y-m-d
payType固定 2
isCheckCardStatus固定 1
sign自动生成

查单 · /api/common/payservice/orderquery

字段值来源
queryType固定 2
transRecIdproof_num,为空时为本地订单号
liquidationDate交易日期转 Ymd,为空用当天
sign自动生成

冲正 · /api/common/payservice/correct

字段值来源
correctTradeSerial原消费 one_card_order_no
tradeOrderNo本地退款单号
correctMon本次退款金额
recDate当前日期 Y-m-d
sign自动生成

冲正前后分别查询钱包,以实际钱包增量拆分现金退款与补贴退款。相同原订单和退款单号幂等;重复请求金额不一致会拒绝。

完整业务链路

定时同步

OneCardSync all
  -> identity
  -> department: 水位 -> 增量
  -> account/current card: 水位 -> 增量 -> 冲突恢复
  -> subsidy: 水位 -> 补贴包 -> 必要时钱包
  -> balance: 有效账户与有效当前卡 -> 钱包

OneCardConflictRecovery 每分钟独立重试冲突,解决主水位越过后漏同步的问题;恢复成功后继续补人员、AI 绑定、当前卡、钱包和补贴流水。

绑盘

判断一卡通用户 → 校验 acc_status_num=1 → 首次绑盘校验本地当前卡有效 → 查询双钱包 → 同步镜像 → 现金+补贴总额参与最低绑盘金额判断。

消费机在线

入口为 POST /api/consume/orderPay 或 MQTT,order_type=1

msgid 防重 → 钱包查询与余额预检 → preorder → orderhandle → 钱包后查询 → 远端成功 → 本地成功订单/流水 → 标记本地成功。

消费机离线补传

入口不变,order_type=2,设备端协议不变:

msgid 生成稳定订单号/流水号 → 钱包快照 → preorder → orderhandle → 成功补本地订单;明确失败保留失败交易;未知状态先查单,再由补偿任务处理。

离线已经发生现实取餐,失败交易会保存在 ydy_one_card_trade_order 和尝试日志中,支持后台追溯。

绑盘后结算

待支付绑盘订单到结算时间后,一卡通用户走钱包、预下单、扣款和钱包后同步;访客走本地钱包。远端成功、本地失败进入补偿。

小程序余额支付

local_scene场景路径
ai_meal小程序订餐余额支付ai_api -> store -> 一卡通
ai_direct_pay小程序直接金额消费ai_api -> store -> 一卡通
ai_main普通商城余额支付代码路径ai_api -> store -> 一卡通

访客不调用内部一卡通支付,继续本地钱包。一卡通扣款成功后,AI 侧落本地订单及现金/补贴审计流水。

退款

原订单无成功一卡通交易时按原本地流程退款;有成功一卡通交易时调用冲正。冲正成功但本地退款失败的交易转补偿/人工,禁止重复盲目冲正。

ai_api -> store 内部接口

接口请求字段用途
POST /api/oneCardPayment/consumelocal_order_no, local_repo, local_scene, local_order_type, local_order_id, order_source, staff_uuid, user_id, amount, discount_amount, order_snapshot;离线可附 msgid, order_type, deal_time, equipment_code, card_id统一发起消费
POST /api/oneCardPayment/correctlocal_order_no, local_order_id, local_refund_id, local_refund_no, amount/refund_amount, order_snapshot冲正退款
POST /api/oneCardPayment/querytrade_idlocal_order_no,可附 trade_type, local_refund_no查本地交易
POST /api/oneCardPayment/markLocalSuccesstrade_id, local_order_id标记两端成功
POST /api/oneCardPayment/markLocalFailedtrade_id, error进入本地补偿
POST /api/oneCardPayment/pendingLocalFailedlocal_repo=ai_api, limit拉取待补偿交易
POST /api/oneCardPayment/markManualtrade_id, error转人工

鉴权请求头:X-OneCard-AppidX-OneCard-TimestampX-OneCard-NonceX-OneCard-Signature。签名使用 HMAC-SHA256,服务端校验时间窗和 nonce 防重放。

保留但当前业务未调用

路径/模式代码方法当前原因
/api/common/getcardaccclassbyfixidgetCardChanges()当前卡已合并到账户增量
/api/common/getscparamverepbykey + fixType=3getCardFixId()不单独跑卡水位
/api/common/infoqueryservice/querytransactionqueryTransactions()交易确认走 orderquery
/api/common/payservice/hzsunpay/offlinepayofflinePay()离线已改为 preorder → orderhandle
不要因为客户端存在方法就判断线上正在调用,必须以业务调用点为准。

数据与日志落点

作用
ydy_one_card_sync_state同步水位、游标、状态和错误
ydy_one_card_identity_map身份类别映射
ydy_one_card_department_map部门映射
ydy_one_card_account_map账户、人员、当前卡、现金/补贴镜像核心映射
ydy_one_card_card_map当前卡映射快照
ydy_one_card_invalid_account_log无效账户跳过日志
ydy_one_card_account_conflict_log手机号冲突与恢复状态
ydy_one_card_subsidy_package_map补贴包幂等、审计与重试
ydy_one_card_trade_order消费、离线消费、冲正状态机
ydy_one_card_trade_attempt_log每次钱包、预下单、扣款、查单和冲正尝试
ydy_one_card_trade_repair_log自动补偿与人工处理记录
aizhct_bzjk.yoshop_user现金与补贴余额镜像
yoshop_user_balance_log一卡通现金消费/退款审计
yoshop_user_subsidy_log一卡通补贴发放、消费/退款审计

运维查看建议

  1. 接口是否实际调用:查 ydy_one_card_trade_attempt_log.stage 和日志 [OneCard][api]
  2. 同步是否推进:查 ydy_one_card_sync_state,不要只看命令统计。
  3. 冲突解除后是否补齐:查冲突日志的 status/last_stage/last_error,再核对映射、AI、钱包与补贴包。
  4. 远端扣款但本地无单:查 status=remote_success_local_failed 和修复日志。
  5. 离线失败:按设备 msgid 查交易主表,再看 preorder/orderhandle/orderquery 尝试记录。
  6. 查看厂商响应字段:使用 store/tests/e2e/one_card_api_inspect.php,生产只做小范围查询类调用。

代码定位

store/application/common/service/onecard/ApiClient.php · TokenProvider.php · SyncService.php · PaymentService.php · store/application/p/logic/Api.php · store/application/api/service/Consume.php · ai_api/app/common/service/onecard/PaymentClient.php