技术笔记

一个核心,多个应用:白标银行平台如何运作

白标银行平台,就是一个带有可替换前端的银行核心。核心是必须保证正确的部分:复式记账总账、客户账户、KYC 与开户、发卡与处理、加密货币和稳定币通道,以及支撑这一切的运营控制台。应用则是客户看到的部分——名称、配色、界面的形态,以及启用的功能子集。白标意味着同一个核心可以换上许多张面孔,而无需为每一张面孔重新构建。一个核心,多个应用。

说得直白些,这是在回答接缝设在哪里。凡涉及资金的一切都共享,只需审计和对账一次;凡涉及客户的一切都按租户配置。真正重要的工程工作,是守住这条界线:前端可以自由不同,而它所依托的核心永不分叉。本文拆解这条界线是如何划出的,以及为什么用设计 token 来划,胜过用分叉来划。

永不变化的部分:核心

先看不允许发挥创意的那一半。无论应用把一笔转账叫作发送、支付还是付款,它的入账方式都一样:在复式记账总账上记两笔分录,且任何记录都不会被删除——总账只增不减,所以退款是一笔引用原始分录的冲销分录,而不是抹去。账户、余额和授权冻结都在这里。KYC 与开户、发卡与清算、加密货币和稳定币通道也一样。它们背后是同一个运营控制台,每一项特权操作都必须填写理由,并记入审计日志。

这些模块每一种都只有一套,这正是关键所在。结算、对账和合规很难做对,出错代价又高,所以只构建一次,让每个应用都继承成果。租户为客户开户后,核心判定的 KYC 等级会随该客户进入控制台,无论证件是由哪个应用的界面采集的。核心不知道、也不关心上层应用叫什么——它看到的是账户和分录,而不是品牌。

会变化的部分:设计语言、信息架构、功能组合

核心之上的一切都可以自由变化,体现在三个维度。第一是设计语言:颜色、字体、圆角、间距、动效——品牌的视觉语法。第二是信息架构:首页放什么,流程如何命名和排序,哪个操作一步可达,哪个需要三步。第三是功能组合:究竟启用哪些模块。一个精简的转账应用和一个内容丰富的超级应用可以运行完全相同的核心,却没有一个界面相同。

/products/pay 的产品页展示了五个实际方向,它们更适合被看作无穷多种可能中的示例,而不是五选一的菜单。Halcyon 是一个简洁的交易所——克制、界面少、交易居于中心。Lumen 是一个超级应用,资金在对话中流转,聊天支付、订阅和理财共用首页。Fern 以转账为先——批量付款和基于规则的外汇兑换优先。Volt 是深色稳定币风格的构建,带有工资分拣器和团队卡。Meridian 支持多币种:EUR 账户旁是 USDC,另有 GBP 旅行余额,以及用于接收卡片奖励的 BTC 账户。五个品牌、五种信息架构、五种功能组合——底层是同一套总账、同一套 KYC、同一个发卡处理器。

这并不意味着产品是五个应用。这五个只是同一条流水线可以走向的方向;真正重要的数字不是五,而是你接入的租户数量。每一个都证明:前端可以差异大到连首页的形态都不同,而其下的核心毫无察觉。

核心是你不被允许重新发明的部分;应用是你不被允许加以限制的部分。白标平台的要义,就是让这两句话同时成立。
— Protocore · 平台工程

为什么 token 级主题化胜过分叉代码库

让一个产品看起来像许多个产品,有两种办法。显而易见的一种是分叉:为每个客户复制一份代码库,换肤后上线。这只在第一个版本有效。此后,每个缺陷修复和每项监管变更都要在 N 份逐渐偏离的副本上重复应用,副本之间不再同步,而你需要考量的安全面则随客户数量成倍增加。分叉把一个你了解的系统变成了许多你不了解的系统。

token 级主题化则反其道而行。代码库只有一份。品牌是一组取值——颜色、字体、圆角和间距的 token,一套组件配置,一组功能开关——在构建时解析为品牌应用。修改一个 token,所有读取它的界面会一起变化,因为没有任何地方把本该来自 token 的值写死。转账流程的一次修复会同时发布给所有租户,因为需要修复的转账流程只有一个。品牌之间的差异在于配置,而不在于源码。

设计系统的位置

token 并非空泛的概念,而是已交付的产物。Protocore Design System(/products/pds)包含 144 个设计 token 和 889 个工具类:每个应用都用这套词汇来做主题。它以深色为先、由 token 驱动、默认圆角为零,同一套 token 会输出到 Web、.NET 和原生平台,因此一次定义的颜色,在 React 界面、桌面控制台和原生移动构建中都是同一种颜色。租户的品牌表现为对这套词汇的覆盖,这就是为什么给应用换肤只是配置变更,而不是重写。

这也使前端真正自由,而不是仅仅在模板之内自由。由于设计语言存在于 token 和工具类中,而不是一次性的样式表里,设计师可以让租户与参考版本拉开很大距离——自有的配色、字体、密度和节奏——而无需触碰核心,也无需分叉应用。涂装可以很深,但终究只是涂装;其下的管线是共享的。

应用是一份配置,而非一次构建

功能组合遵循同样的规则。每个模块——聊天支付、理财、加密货币、卡片、订阅、团队卡、邀请奖励——都是按租户拨动的开关,功能开关还可以先向一部分用户灰度发布,再全面推开。运营人员在配置面板中切换,而不必重新部署。因此,精简的转账应用与完整的超级应用之间的差别不是两个项目,而是同一个项目的两套配置。每个租户的起点是一个中性的、带 Protocore 品牌的参考应用,菜单齐全——每个白标应用,就是这个构建加上被覆盖的 token 以及开启或关闭的模块。

坦诚的边界

只有当你确实拥有许多应用——或者有一个打算长期换肤、重排、调整范围、却不想每次都重建银行的应用——时,一个核心多个应用才值得这套机制。如果你只交付一个永远不会换第二个品牌的固定应用,那就不需要白标平台,你需要的是一个应用。它真正发挥价值的,是它为之而生的场景:一个平台接连推出品牌银行产品,每个租户都鲜明地属于自己,没有一个是分叉。完整的拆解——五个方向、参考应用以及它们背后的运营控制台——见 /products/pay,其下的设计系统见 /products/pds。

有系统要构建?

告诉我们问题所在,我们会带着架构方案和实施计划回复您。