如何存储支付信息(如果有支付功能)?
Posted: Tue May 20, 2025 11:15 am
WhatsApp 的支付功能(例如 WhatsApp Pay 在印度、巴西等地区提供)涉及到敏感的金融交易,因此其支付信息的存储必须遵循严格的安全标准、数据一致性、可审计性、合规性以及高性能的要求。这通常会涉及多个表,并且与金融机构(银行、支付网关)的系统紧密集成。
1. 核心支付实体:Payments 或 Transactions 表
这是存储每笔交易的详细信息的核心表。
表结构示例:
SQL
CREATE TABLE Payments (
payment_id BIGINT PRIMARY KEY, -- 支付交易的唯一ID (由系统生成,UUID 或分布式ID)
sender_user_id BIGINT NOT NULL, -- 付款方用户ID (外键 Users.user_id)
receiver_user_id BIGINT NOT NULL, -- 收款方用户ID (外键 Users.user_id)
amount DECIMAL(18, 4) NOT NULL, -- 交易金额 (Decimal 用于精确计算货币)
currency VARCHAR(3) NOT NULL, -- 货币代码 (ISO 4217, 如 'INR', 'BRL', 'USD')
transaction_type VARCHAR(50) NOT NULL, -- 交易类型:'P2P_TRANSFER', 'MERCHANT_PAYMENT', 'REFUND'
payment_method_id BIGINT, -- 外键,关联 Payments.payment_method_id (用户选择的支付方式)
status VARCHAR(50) NOT NULL, -- 交易状态:'PENDING', 'SUCCESS', 'FAILED', 'REFUNDED', 'CANCELED'
status_code VARCHAR(50), -- 支付网关返回的详细状态码
status_message TEXT, -- 支付网关返回的状态描述
gateway_transaction_id VARCHAR(255), -- 支付网关自身的交易ID (用于对账)
request_timestamp BIGINT NOT NULL, -- 交易请求时间 (Unix 毫秒)
completion_timestamp BIGINT, -- 交易完成/失败时间 (Unix 毫秒)
description TEXT, -- 交易描述或备注
reference_number VARCHAR(255), -- 商家订单号或内部参考号
is_refund BOOLEAN DEFAULT FALSE, -- 是否是退款交易
original_payment_id BIGINT, -- 如果是退款,关联原始支付交易ID
created_at BIGINT NOT NULL, -- 记录创建时间
updated_at BIGINT NOT NULL, -- 记录最后更新时间
-- 额外字段,用于审计和合规
-- ip_address VARCHAR(45),
-- device_info TEXT,
-- fraud_score DECIMAL(5,2),
-- ...
-- FOREIGN KEY (sender_user_id) REFERENCES Users(user_id),
-- FOREIGN KEY (receiver_user_id) REFERENCES Users(user_id)
);
字段说明:
payment_id: 业务层面的唯一交易标识。
sender_user_id / receiver_user_id: 明确交易双方。
amount / currency: 货币金额的精确存储,通常使用 DECIMAL 类型避免浮点数精度问题。
status / status_code / status_message: 交易状态至关重要,它反映了交易的实时进度和最终结果。status_code 和 status_message 记录支付网关的反馈。
gateway_transaction_id: 这是与外部支付网关系统进行对账的关键字段。
2. 用户支付方式信息表 (UserPaymentMethods Table)
存储用户绑定的支付方式(如银行账户、借记卡/信用卡信息)。敏感信息(如完整卡号、CVV)绝不能直接存储。 而是存储由支付网关提供的Token 化数据。
表结构示例:
SQL
CREATE TABLE UserPaymentMethods (
method_id BIGINT PRIMARY KEY, -- 支付方式的唯一ID
user_id BIGINT NOT NULL, -- 外键,关联 Users.user_id
method_type VARCHAR(50) NOT NULL, -- 支付方式类型:'BANK_ACCOUNT', 'CREDIT_CARD', 'DEBIT_CARD', 'UPI_ID' (印度特有)
gateway_token VARCHAR(255) NOT NULL, -- 支付网关返回的Token化数据 (替代敏感卡号)
last_four_digits VARCHAR(4), -- 卡号后四位 (用于用户识别)
card_brand VARCHAR(50), -- 卡品牌 (Visa, MasterCard, RuPay等)
bank_name VARCHAR(255), -- 银行名称
is_default BOOLEAN DEFAULT FALSE, -- 是否是默认支付方式
created_at BIGINT NOT NULL,
updated_at BIGINT NOT NULL,
-- 其他字段:如 UPI ID、银行账户昵称等
-- FOREIGN KEY (user_id) REFERENCES Users(user_id)
);
字段说明:
gateway_token: 这是最重要的安全措施。完整 加拿大 whatsapp 数据库 的卡号、CVV 等敏感数据由专业的支付网关处理并存储在其 PCI-DSS 兼容的环境中。WhatsApp 收到的是一个Token,这个 Token 可以用来发起后续交易,而无需再次传递敏感信息。
last_four_digits / card_brand: 这些是非敏感信息,用于方便用户识别和管理自己的支付方式。
3. 交易日志/审计表 (PaymentLogs Table)
为了合规性和审计目的,需要详细记录支付交易的各个阶段和外部交互。
表结构示例:
SQL
CREATE TABLE PaymentLogs (
log_id BIGINT PRIMARY KEY,
payment_id BIGINT NOT NULL, -- 外键,关联 Payments.payment_id
event_type VARCHAR(50) NOT NULL, -- 事件类型:'REQUEST_SENT', 'RESPONSE_RECEIVED', 'CALLBACK_PROCESSED', 'STATUS_CHANGE'
event_timestamp BIGINT NOT NULL,
details JSONB, -- 详细事件内容,如支付网关请求/响应的 JSON
-- FOREIGN KEY (payment_id) REFERENCES Payments(payment_id)
);
4. 账户余额/钱包表 (UserWallets Table) - 如果有内置钱包功能
如果 WhatsApp 允许用户在应用内持有余额(如印度 UPI 支付中常见的预付钱包),则需要此表。
表结构示例:
SQL
CREATE TABLE UserWallets (
user_id BIGINT PRIMARY KEY,
balance DECIMAL(18, 4) NOT NULL DEFAULT 0.0000, -- 当前余额
currency VARCHAR(3) NOT NULL,
updated_at BIGINT NOT NULL
-- FOREIGN KEY (user_id) REFERENCES Users(user_id)
);
关键: 余额更新必须是原子操作,并严格遵守事务(ACID),避免竞态条件导致金额错误。
5. 安全性与合规性
数据加密:
传输中加密 (Encryption in Transit): 所有支付相关数据传输(客户端到服务器,服务器到支付网关)必须使用 TLS/SSL。
静态加密 (Encryption at Rest): 数据库中的敏感字段(如 gateway_token,即使是 Token,也应加密)以及整个数据库文件都应加密。
Tokenization: 绝不存储原始敏感支付信息。始终依赖支付网关的 Tokenization 服务。
PCI-DSS 合规性: 如果处理银行卡数据,必须严格遵守支付卡行业数据安全标准(PCI-DSS)。通常,通过与 PCI-DSS 认证的第三方支付网关合作来达到此目的。
强访问控制: 严格限制对支付数据库的访问权限,采用最小权限原则。
审计日志: 详细记录所有支付相关操作和访问,用于安全审计和问题追踪。
反欺诈系统: 集成实时反欺诈系统,通过机器学习模型分析交易模式,识别和阻止可疑交易。
数据留存与销毁: 遵守金融法规,对数据进行合理的留存,并在规定时间后安全销毁。
6. 可扩展性与性能
分片: Payments 表会因交易量庞大而成为扩展瓶颈。需要根据 sender_user_id 或 payment_id 进行分片。
高性能存储: 核心支付流可能需要专门的、高性能的 OLTP 数据库(例如 PostgreSQL、MySQL,或者一些 NewSQL 数据库如 CockroachDB),以确保低延迟和高事务吞吐量。
异步处理: 支付回调(Webhook)和通知通常通过消息队列异步处理,以提高系统弹性。
综上所述,WhatsApp 存储支付信息是一个高度复杂且安全要求极高的系统工程,它依赖于多层数据库表、严格的数据安全措施、与第三方支付网关的深度集成以及全面的合规性考虑。
1. 核心支付实体:Payments 或 Transactions 表
这是存储每笔交易的详细信息的核心表。
表结构示例:
SQL
CREATE TABLE Payments (
payment_id BIGINT PRIMARY KEY, -- 支付交易的唯一ID (由系统生成,UUID 或分布式ID)
sender_user_id BIGINT NOT NULL, -- 付款方用户ID (外键 Users.user_id)
receiver_user_id BIGINT NOT NULL, -- 收款方用户ID (外键 Users.user_id)
amount DECIMAL(18, 4) NOT NULL, -- 交易金额 (Decimal 用于精确计算货币)
currency VARCHAR(3) NOT NULL, -- 货币代码 (ISO 4217, 如 'INR', 'BRL', 'USD')
transaction_type VARCHAR(50) NOT NULL, -- 交易类型:'P2P_TRANSFER', 'MERCHANT_PAYMENT', 'REFUND'
payment_method_id BIGINT, -- 外键,关联 Payments.payment_method_id (用户选择的支付方式)
status VARCHAR(50) NOT NULL, -- 交易状态:'PENDING', 'SUCCESS', 'FAILED', 'REFUNDED', 'CANCELED'
status_code VARCHAR(50), -- 支付网关返回的详细状态码
status_message TEXT, -- 支付网关返回的状态描述
gateway_transaction_id VARCHAR(255), -- 支付网关自身的交易ID (用于对账)
request_timestamp BIGINT NOT NULL, -- 交易请求时间 (Unix 毫秒)
completion_timestamp BIGINT, -- 交易完成/失败时间 (Unix 毫秒)
description TEXT, -- 交易描述或备注
reference_number VARCHAR(255), -- 商家订单号或内部参考号
is_refund BOOLEAN DEFAULT FALSE, -- 是否是退款交易
original_payment_id BIGINT, -- 如果是退款,关联原始支付交易ID
created_at BIGINT NOT NULL, -- 记录创建时间
updated_at BIGINT NOT NULL, -- 记录最后更新时间
-- 额外字段,用于审计和合规
-- ip_address VARCHAR(45),
-- device_info TEXT,
-- fraud_score DECIMAL(5,2),
-- ...
-- FOREIGN KEY (sender_user_id) REFERENCES Users(user_id),
-- FOREIGN KEY (receiver_user_id) REFERENCES Users(user_id)
);
字段说明:
payment_id: 业务层面的唯一交易标识。
sender_user_id / receiver_user_id: 明确交易双方。
amount / currency: 货币金额的精确存储,通常使用 DECIMAL 类型避免浮点数精度问题。
status / status_code / status_message: 交易状态至关重要,它反映了交易的实时进度和最终结果。status_code 和 status_message 记录支付网关的反馈。
gateway_transaction_id: 这是与外部支付网关系统进行对账的关键字段。
2. 用户支付方式信息表 (UserPaymentMethods Table)
存储用户绑定的支付方式(如银行账户、借记卡/信用卡信息)。敏感信息(如完整卡号、CVV)绝不能直接存储。 而是存储由支付网关提供的Token 化数据。
表结构示例:
SQL
CREATE TABLE UserPaymentMethods (
method_id BIGINT PRIMARY KEY, -- 支付方式的唯一ID
user_id BIGINT NOT NULL, -- 外键,关联 Users.user_id
method_type VARCHAR(50) NOT NULL, -- 支付方式类型:'BANK_ACCOUNT', 'CREDIT_CARD', 'DEBIT_CARD', 'UPI_ID' (印度特有)
gateway_token VARCHAR(255) NOT NULL, -- 支付网关返回的Token化数据 (替代敏感卡号)
last_four_digits VARCHAR(4), -- 卡号后四位 (用于用户识别)
card_brand VARCHAR(50), -- 卡品牌 (Visa, MasterCard, RuPay等)
bank_name VARCHAR(255), -- 银行名称
is_default BOOLEAN DEFAULT FALSE, -- 是否是默认支付方式
created_at BIGINT NOT NULL,
updated_at BIGINT NOT NULL,
-- 其他字段:如 UPI ID、银行账户昵称等
-- FOREIGN KEY (user_id) REFERENCES Users(user_id)
);
字段说明:
gateway_token: 这是最重要的安全措施。完整 加拿大 whatsapp 数据库 的卡号、CVV 等敏感数据由专业的支付网关处理并存储在其 PCI-DSS 兼容的环境中。WhatsApp 收到的是一个Token,这个 Token 可以用来发起后续交易,而无需再次传递敏感信息。
last_four_digits / card_brand: 这些是非敏感信息,用于方便用户识别和管理自己的支付方式。
3. 交易日志/审计表 (PaymentLogs Table)
为了合规性和审计目的,需要详细记录支付交易的各个阶段和外部交互。
表结构示例:
SQL
CREATE TABLE PaymentLogs (
log_id BIGINT PRIMARY KEY,
payment_id BIGINT NOT NULL, -- 外键,关联 Payments.payment_id
event_type VARCHAR(50) NOT NULL, -- 事件类型:'REQUEST_SENT', 'RESPONSE_RECEIVED', 'CALLBACK_PROCESSED', 'STATUS_CHANGE'
event_timestamp BIGINT NOT NULL,
details JSONB, -- 详细事件内容,如支付网关请求/响应的 JSON
-- FOREIGN KEY (payment_id) REFERENCES Payments(payment_id)
);
4. 账户余额/钱包表 (UserWallets Table) - 如果有内置钱包功能
如果 WhatsApp 允许用户在应用内持有余额(如印度 UPI 支付中常见的预付钱包),则需要此表。
表结构示例:
SQL
CREATE TABLE UserWallets (
user_id BIGINT PRIMARY KEY,
balance DECIMAL(18, 4) NOT NULL DEFAULT 0.0000, -- 当前余额
currency VARCHAR(3) NOT NULL,
updated_at BIGINT NOT NULL
-- FOREIGN KEY (user_id) REFERENCES Users(user_id)
);
关键: 余额更新必须是原子操作,并严格遵守事务(ACID),避免竞态条件导致金额错误。
5. 安全性与合规性
数据加密:
传输中加密 (Encryption in Transit): 所有支付相关数据传输(客户端到服务器,服务器到支付网关)必须使用 TLS/SSL。
静态加密 (Encryption at Rest): 数据库中的敏感字段(如 gateway_token,即使是 Token,也应加密)以及整个数据库文件都应加密。
Tokenization: 绝不存储原始敏感支付信息。始终依赖支付网关的 Tokenization 服务。
PCI-DSS 合规性: 如果处理银行卡数据,必须严格遵守支付卡行业数据安全标准(PCI-DSS)。通常,通过与 PCI-DSS 认证的第三方支付网关合作来达到此目的。
强访问控制: 严格限制对支付数据库的访问权限,采用最小权限原则。
审计日志: 详细记录所有支付相关操作和访问,用于安全审计和问题追踪。
反欺诈系统: 集成实时反欺诈系统,通过机器学习模型分析交易模式,识别和阻止可疑交易。
数据留存与销毁: 遵守金融法规,对数据进行合理的留存,并在规定时间后安全销毁。
6. 可扩展性与性能
分片: Payments 表会因交易量庞大而成为扩展瓶颈。需要根据 sender_user_id 或 payment_id 进行分片。
高性能存储: 核心支付流可能需要专门的、高性能的 OLTP 数据库(例如 PostgreSQL、MySQL,或者一些 NewSQL 数据库如 CockroachDB),以确保低延迟和高事务吞吐量。
异步处理: 支付回调(Webhook)和通知通常通过消息队列异步处理,以提高系统弹性。
综上所述,WhatsApp 存储支付信息是一个高度复杂且安全要求极高的系统工程,它依赖于多层数据库表、严格的数据安全措施、与第三方支付网关的深度集成以及全面的合规性考虑。