国际版外卖系统交付里,若把 i18n 发布与支付配置绑在同一次上线窗口,任一环节回滚都会拖死另一项。更稳的做法是:语言 bundle 与 payment profile 解耦,订单服务不依赖 UI 语种,支付 profile 按国家或商户切换,不随换语言包而变。
结论
展示层(locale bundle)与资金流(payment profile)分开配置、分开验收;端到端组合测试放在两段各自通过之后。订单域只持久化 profile id、金额、币种,不持久化界面当前语种。
{"locale":"ja-JP","bundle_version":"20261003.1","payment_profile":"country-xx-wallet-sandbox"}试跑期宜指定固定单号,在后台、导出文件与用户端各查一次,三处状态一致再扩量。
一、语言 bundle 怎么发布
客户端携带bundle_version拉取文案;后台改字只 bump 版本,不必重发支付证书。预发与生产 bucket 分离,避免试跑文案污染正式用户。商家端、骑手端可共用版本指针,也可分端 bundle,但订单服务应保持语言无关。
发布脚本宜支持灰度:5% 用户先拉新 bundle,监控崩溃率与下单转化率,再全量。回滚只需把指针指回上一版本,无需动支付配置。
二、payment profile 独立演进
profile 绑定国家、币种、回调地址与通道标识,不绑定 UI locale。换日语包不应触发 profile 切换;换正式 profile 也不应强制重下全部语言资源。创建支付 intent 时只读 profile 与订单金额,不读界面当前语种。
多城场景下,一个 profile 可服务多城,或每城独立 profile;与 locale 仍无硬绑定。配置中心应对 profile 变更做 audit,便于财务追溯「某周对账用哪套通道参数」。
三、沙箱与生产隔离
沙箱 profile 只允许测试商户与测试金额;生产 profile 单独密钥与 notify URL。验收阶段可在locale=en-US下测 intent 与签名校验,语言包并行换目标语只验展示,缩短等待通道审核的时间。
notify URL 防火墙规则宜在支付验收前单独开通,不要等语言全量上线才申请。重复 notify 的幂等键应只依赖 order_id + event_type,与 locale 无关。
四、导出 locale 与 UI locale
CSV 表头可走export_locale配置,财务日文列名、用户英文界面可同时存在。对账文件不宜写死为「仅默认语列名」;换语言包后导出模板应可独立回归,用固定 order_id 断言表头与金额列。
建议在 CI 增加 export regression job:每次 bump bundle 或 profile,都跑同一 golden order 导出 diff,防止映射文件被误改。
五、常见踩坑
支付页字符串硬编码在 SDK 内,改语言要发版。对账仅默认语,当地财务看不懂。换语言误触证书路径或 profile 环境变量。宜在配置中心分 namespace 管理 bundle 与 payment,权限也分开。
另一个坑是「组合验收」过早:两段未绿就做端到端,问题混在一起。宜在工单系统里用标签区分 i18n 与 payment,方便研发分派。
六、光合同城边界
光合同城海外版成品支持语言包与 payment profile 解耦;各国通道与税务字段按需定制。商务规则由客户在当地确定;系统侧不抽成客户平台订单。
定制通道 adapter 应实现统一 intent/notify 接口,不把 UI 字符串耦合进 adapter 层。
七、小结
国际版外卖系统语言包和当地收款分开配,本质是降低发布耦合:并行推进、独立回滚,组合验收放在最后一步。运维日历上两类发布不要混为一次变更。
上线后若需紧急改支付密钥,不应顺带全量推新语言包;反之,修正翻译错别字也不应触发支付证书轮换。两类工单分 queue,值周研发才不会在半夜误回滚错组件。文档首页用表格列出 bundle 与 profile 的负责人电话,比口头约定更能减少开业周混乱。