19. Design BiliBili 大会员交易系统
在数字化浪潮席卷的当下,业务的高效运营与创新发展离不开强大的技术支撑。对于各类线上业务而言,交易系统作为连接用户与服务的关键枢纽,其成熟度与完整性直接决定了业务的竞争力。一套卓越的交易系统,不仅是业务流程的数字化载体,更是提升运营效率、优化用户体验、推动业务创新的核心驱动力。
Reference: B 站|大会员交易系统建设
01 前言
大会员业务精心打造的交易系统,正是这样一个集高效、灵活、稳定于一身的强大平台,它以模块化的架构、先进的技术组件和完善的功能体系,为业务的持续增长和生态的繁荣发展奠定了坚实基础。
1.1 系统架构全景洞察
大会员交易系统采用模块化设计理念,将复 杂的交易流程拆解为交易、订单、签约、商品及清结算等多个核心模块。这些模块既相互独立又紧密协同,共同驱动着整个交易链路的顺畅运转,构建起一个高效、灵活且易于维护的系统架构,确保系统能够快速响应业务需求的变化,为业务的创新发展提供有力支持。
因我们本身所属业务的特性,所以设计的交易系统可能跟传统电商的交易系统不同,更适配虚拟物品相关的业务。
1.2 核心流程深度解析
交易系统的核心流程从用户下单的那一刻开始启动,订单作为贯穿始终的关键纽带,串联起支付、履约、退款等各个环节。在这个过程中,订单系统负责维护交易状态、管理交易生命周期,与商品系统、支付系统、营销系统以及清结算系统紧密配合,共同完成整个交易流程。每一个环节都经过精心设计和严格把控,确保交易的顺利进行和数据的安全可靠。
02 架构设计实践
2.1 系统架构图
2.2 核心流程示例
交易系统的核心流程始于用户下单,订单贯穿支付、履约、退款等环节。订单系统负责维护交易状态和生命周期,与商品系统、支付系统、营销系统、清结算系统协同完成整个交易的流程。
03 核心技术组件说明
3.1 交易配置
3.1.1 业务身份管理
业务身份管理为每个业务分配唯一 ID,该 ID 在整个订单、支付和结算链路中贯穿始终,为每个业务颁发了一张专属 “身份证”,凭借这一 ID,不同业务的数据得以相互隔离且可精准追踪,有力保障了业务管理的清晰性和数据的完整性。
业务名称 (Business Name) | 业务标识 (businessId) | 负责人 (Owner) | 描述 (Description) | 状态 (Status) |
---|---|---|---|---|
大会员购买 (VIP Purchase) | OGV-CHARGE | 张三 | OGV 大会员月卡/年卡购买 (Monthly/Annual VIP plan) | Active |
活动礼包 (Event Bundle) | ACTIVITY-GIFT | 李四 | 限时活动礼包(可带优惠券) (Timed gift packs with coupons) | Active |
直播间送礼 (Live Gifting) | LIVE-REWARD | 王五 | 直播间道具、礼物打赏支付 (In-stream virtual gift payment) | Paused |
国际版订阅 (Global VIP) | INTL-VIP | 刘六 | 国际版大会员订阅 (International subscription plan) | Active |
3.1.2 ⽀付中枢配置
- 支持灵活选择支付渠道和优先级,能够根据业务需求和用户偏好,快速切换和调整支付渠道顺序。
- 同时,通过管理支付协议模板,实现前端展示与不同支付需求的快速适配。
{
// 当前业务的唯一标识,建议全大写+中划线
"businessId": "OGV-CHARGE",
// 默认启用的支付渠道(用于兜底或全平台通用)
"defaultPayChannels": ["bwallet", "wechat", "alipay"],
// 各终端(平台)下的支付渠道优先级配置,前端根据此顺序展示支付选项
"channelPriority": {
"ios": ["applepay"], // iOS端优先使用 Apple Pay
"android": ["wechat", "bwallet"], // 安卓端优先使用微信和哔哩钱包
"web": ["bwallet", "alipay"] // Web端优先用哔哩钱包,其次是支付宝
},
// 支付前展示给用户的协议列表(如服务协议、自动续费说明等)
"agreements": [
{
"title": "自动续费说明", // 前端展示的协议标题
"url": "https://www.bilibili.com/protocol/vip-auto" // 跳转链接
},
{
"title": "用户服务协议",
"url": "https://www.bilibili.com/protocol/vip-terms"
}
],
// 支付面板的视觉风格(可选值如:light、dark、自定义主题名)
"theme": "dark",
// 是否启用风控校验(默认 true,可用于调试或灰度关闭风控)
"enableRiskControl": true,
// 是否启用协议弹窗模式(true 表示点击“支付”前必须勾选协议)
"requireAgreementConfirmation": true,
// 面板展示名称(可用于配置多语言或自定义业务标题)
"panelTitle": "购买大会员",
// 支持的语言(用于国际化,前端可自动加载对应语言资源)
"supportedLocales": ["zh-CN", "en-US", "ja-JP"]
}
3.1.3 ⻛险控制
通过风控控制通过主动防御(如黑名单)和智能拦截机制(如恶意退款),识别并阻止异常交易,保障支付安全。
{
"businessId": "OGV-CHARGE",
// 是否启用风控
"enableRiskControl": true,
// 黑名单配置(支持按用户ID、IP、设备ID等维度)
"blacklist": {
"userIds": ["user_1024", "user_test_black"],
"ipAddresses": ["123.45.67.89", "10.20.30.40"],
"deviceIds": ["device123", "emulator456"]
},
// 风控评分规则(score-based,越高风险越大)
"riskRules": [
{
"ruleName": "新注册用户限制",
"condition": "user.registerDays < 3",
"score": 30,
"description": "新用户注册时间小于3天"
},
{
"ruleName": "大额订单",
"condition": "order.amount > 500",
"score": 40,
"description": "订单金额大于500元"
},
{
"ruleName": "高风险支付方式",
"condition": "order.payMethod == 'credit_card'",
"score": 20,
"description": "使用信用卡支付"
}
],
// 总评分超过该阈值则拦截支付
"riskThreshold": 60,
// 命中风控时的处理动作
"actionOnBlock": {
"type": "REJECT",
"message": "当前交易存在风险,已被拦截。如有疑问请联系客服。"
}
}
动态规则配置
规则名称 | 条件 | 加分 | 拦截阈值 |
---|---|---|---|
新用户下单 | 注册天数 < 3 | +30 | |
异地登录下单 | 登录 IP 与常用城市不一致 | +20 | |
高额订单 | 单笔金额 ≥ 500 元 | +40 | |
合计评分超阈值 | 总分 ≥ 60,执行支付拦截 | 拦截 | 60 |
黑名单配置
类型 | 值 | 来源 | 生效时间 | 状态 |
---|---|---|---|---|
IP | 123.45.67.89 | 安全策略引擎 | 2025-06-15 | 启用中 |
用户 ID | user_9988 | 客服手动标记 | 2025-06-20 | 启用中 |
设备 ID | a1b2c3d4e5f6 | 行为异常检测 | 2025-07-01 | 启用中 |
3.2 订单服务
- 订单服务涵盖交易流程编排、业务数据管理和交易数据安全。
- 它维护订单从创建到完结的全生命周期,通过状态机模式管理订单状态流转
- 支持超时取消和自动确认等规则。
- 订单系统提供实时数据查询和业务指标分析,借助分布式事务保障数据一致性,通过分级隔离的熔断降级机制应对流量洪峰,建立自动化对账体系防控资金风险。
3.2.1 交易流程编排
交易场景中,订单的生命周期分为:
阶段 | 状态标识 | 说明 | 可流转目标状态 |
---|---|---|---|
创建订单 | PENDING | 用户点击“立即购买”后生成订单,尚未支付 | PAID , CANCELLED , FAILED , CLOSED |
支付完成 | PAID | 支付完成但尚未履约(待发货/下发) | FULFILLED , FULFILL_FAIL , REFUNDED , PARTIALLY_REFUNDED |
履约完成 | FULFILLED | 商品或权益已成功下发 | COMPLETED , REFUNDED , PARTIALLY_REFUNDED |
自动完成 | COMPLETED | 用户未手动确认收货,自动完成 | —— TERMINAL STATE |
用户取消 | CANCELLED | 用户主动取消或支付超时取消 | —— TERMINAL STATE |
支付失败 | FAILED | 支付过程中失败或被拦截 | —— TERMINAL STATE |
已退款 | REFUNDED | 成功退款,商品已回收 | —— TERMINAL STATE |
部分退款 | PARTIALLY_REFUNDED | 部分金额退回 | REFUNDED (若继续退款)、COMPLETED (若仍部分履约成功) |
商品发放失败 | FULFILL_FAIL | 道具/权益发放失败,需补偿或人工介入 | FULFILLED (补发成功)、REFUNDED , PARTIALLY_REFUNDED , CLOSED |
关单 | CLOSED | 订单已关闭,无法再进行任何操作 | —— TERMINAL STATE |
支持超时取消、自动确认等自动化规则
规则类型 | 示例配置 | 实现说明 |
---|---|---|
支付超时取消 | 未在 15 分钟内支付则关闭订单 | 可由定时任务或 Redis 延时队列触发 |
自动确认收货 | 履约后 7 天自动确认订单完成 | 通过订单状态触发自动流转 |
保底关单 | 创建后 30 天无动作则关单 | 防止长尾订单遗留造成数据污染 |
3.2.2 业务数据管理
订单提供了完成的交易数据管理能力,提供了实时的订单数据查询服务,以及业务的数据指标的分析。
订单业务数据查询与分析场景
场景 | 功能说明 | 使用角色 | 查询维度示例 | 数据来源 | 常用工具或渠道 |
---|---|---|---|---|---|
用户查询订单 | 用户可查看自己的历史订单、退款进度、权益状态、支付方式、发票信息等 | C 端用户 | userId , orderId , status | 订单主表、退款表、履约记录表 | App 个人中心、Web 订单页 |
客服后台查询 | 客服可按手机号、订单号、商品 ID、业务线定位订单,处理用户咨询/投诉等 | 客服 | phone , orderId , skuId , status | 订单主表、用户表、商品表 | 客服中台、客服查单工具 |
业务数据看板 | 运营/产品通过图表查看业务概况,如每日下单量、转化率、支付渠道分布、优惠使用等 | 产品/运营 | createTime , status , channel | 订单表、支付表、营销表 | DataStudio、Superset、Grafana |
风控异常分析 | 安全/风控团队识别集中退款、刷单、异常下单路径等行为,配合模型或黑名单系统 | 风控/算法 | ip , userId , deviceId , amount | 订单表、退款表、支付风控日志表 | 离线分析平台、ClickHouse、ES |
财务对账 与报表 | 对账系统核对支付网关流水与订单金额是否一致,标记异常,生成对内日报或报送报表 | 财务/清结算 | orderId , payTime , payMethod , amount | 订单表、支付回调日志、支付渠道账单 | 对账平台、下载报表系统 |
投诉/售后支撑 | 追溯用户某次交易是否成功履约,是否触发补偿、是否已退款、是否满足 SLA | 售后专员 | orderId , fulfillStatus , refundStatus | 订单表、履约系统、退款系统 | 售后中台、客服跟单系统 |
活动效果评估 | 分析某个营销活动的转化、GMV、客单价、退款率、留存率等,用于评估 ROI 或策略调整 | 运营/营销 | campaignId , status , amount | 订单表、营销配置表、券使用表 | BI 系统、活动数据平台 |
多租户/业务线分账 | 对不同 businessId 或 sellerId 下的订单数据进行隔离、聚合、收入统计等(平台型系统常见) | 商家/平台方 | businessId , sellerId , revenue | 订单表、商家账户系统 | 商家控制台、平台数据系统 |
订单异常预警 | 实时监控履约失败率、支付失败率、退款率飙升等异常指标并触发告警 | 运维/产品 | errorCode , status , failRate | 日志系统、订单表、告警系统 | Prometheus + Grafana、报警系统 |
3.2.3 交易数据安全
- 通过分布式事务保障数据一致性
- 实现最终一致性,并支持重试、补偿逻辑
- 幂等性处理 和 状态更新
- 实施分级隔离的熔断降级机制抵御流量洪峰 - 高可用保障
- 非核心功能(如优惠券展示、推荐接口)在高峰期自动关闭或返回默认值;
- 确保下单主链路不被非关键依赖阻塞
- 建立自动化对账体系防控资金风险
3.2.4 订单事件驱动的状态机引擎
订单的状态管理采用了事件驱动有限状态机的设计模式,通过事件订阅订单的状态流转:
3.3 签约服务
负责订阅类业务的签约管理,例如包月充电业务,可以为业务提供连续包月的签约对接能力,为付费业务提供更多的运营方案。
3.3.1 签约及续费处理流程
用户下签约单后,订单会触发签约系统执行签约逻辑,向支付中心创建签约单,并维护签约状态
- IAP
- 指用户是通过 Apple / Google 的 In-App Purchase(应用内购买)系统来购买的。
- 查找这个档位的签约 ID
- 查找这个用户是否已经为当前购买的商品档位(比如: 月卡、季卡、年卡),在 IAP 的系统中签过约,如果有就复用,不需要重复创建签约关系。
3.3.2 可扩展的签约服务设计
- 对于签约的业务,需要定时的完成续约、扣款、解约以及用户的签约状态维护签约系统。
- 签约系统可分业务、分片的定时完成自动化的续约、扣款、和解约,以及用户的签约状态的维护。
- 抽象出签约和扣款接口,接入的订阅类业务只需实现业务逻辑即可接入签约续费能力。
public interface ContractHandler {
/** 创建签约 */
void createContract(String userId, String bizId);
/** 用户签约确认 */
void confirmSign(String contractId);
/** 主动发起解约 */
void terminateContract(String contractId);
/** 被动解约确认 */
void confirmTerminate(String contractId);
/** 计算周期和下次续约执行时间 */
LocalDateTime calPeriodAndNextExecTime(String contractId);
}
public interface ContractDeductHandler {
/** 扣款逻辑 */
boolean deductMoney(String contractId);
/** 扣款通知 */
void sendDeductNotice(String contractId, boolean success);
/** 获取下次扣款时间 */
LocalDateTime getDeductTime(String contractId);
/** 续约订单通知(续费成功后) */
void renewalOrderNotify(String contractId);
}
// Handler 注册器(策略模式实现)
public class HandlerSelector {
private static final Map<Integer, ContractHandler> CONTRACT_HANDLER_MAP = new HashMap<>();
public static void register(int bizType, ContractHandler handler) {
CONTRACT_HANDLER_MAP.put(bizType, handler);
}
public static ContractHandler getHandler(int bizType) {
return CONTRACT_HANDLER_MAP.get(bizType);
}
}
public class DeductSelector {
private static final Map<Integer, ContractDeductHandler> DEDUCT_HANDLER_MAP = new HashMap<>();
public static void register(int bizType, ContractDeductHandler handler) {
DEDUCT_HANDLER_MAP.put(bizType, handler);
}
public static ContractDeductHandler getHandler(int bizType) {
return DEDUCT_HANDLER_MAP.get(bizType);
}
}
3.3.3 签约数据一致性处理
签解约流程设计遵循幂等性原则,同时,通过上下游数据对账,确保签约数据与订单、支付渠道的续费信息保持高度一致,保障签约数据的准确性和完整性。
3.4 商品系统
商品系统解决了交易系统中“买什么”的能力,交易系统中的具体交易实体我们称为“商品”,实际表现上单个商品就是一个 SKU,用户下单购买的实体则是一个具体的 SKU,归于同一个组的商品集合为一个 SPU
3.4.1 商品信息展示与管理
商品系统是平台展示商品信息的核心模块,负责存储和呈现商品的基本属性、图片、描述、规格参数等内容,提供了商品以及商品属性的配置能力,为消费者提供全面的商品认知,帮助其做出购买决策。
3.4.2 交易基础支撑
在整个交易流程中,商品系统为订单生成、支付结算、库存管理等环节提供关键数据支持。准确的商品价格、库存数量等信息是保障交易顺利进行的基础,直接影响到订单的有效性和消费者的体验。
3.4.3 营销活动支持
商品系统与营销系统紧密配合,实现各种促销活动的配置和执行。通过对商品进行折扣、满减、赠品等活动设置,激发消费者的购买欲望,提高商品销量和平台销售额。