一、支付架构总览
核心原则:自有支付底座(金币体系)+ 多渠道接入。金币是内部唯一价值载体,外部支付通道只负责「钱 → 金币」的兑换。
1.1 支付架构图
1
[用户点击充值] → [Payment Service 选择通道] → [微信支付/支付宝/华为支付/云闪付/苹果内购]
2
[外部支付完成] → [回调/Webhook] → [Payment Service 验签] → [发放金币] → [用户余额更新]
3
[对账系统 T+1] → [差异告警] → [人工处理]
1.2 通道对比
| 通道 | 费率 | 到账 | 适用场景 | 启用阶段 |
| 微信支付 | 0.6%/笔(可谈优惠) | T+1 | 安卓端首选、用户覆盖率最高 | M1 |
| 支付宝 | 0.6%/笔 | T+1 | 安卓端补充、大额稳定 | M1 |
| 华为支付 | 以华为政策为准 | T+1 | 华为应用市场联运配套 | M2 |
| 云闪付 | 0.6%-1%/笔 | T+1 | 银行卡用户补充 | M2 |
| 苹果 IAP | 30%(中小开发者 15%) | 月度结算 | iOS 充值/订阅(唯一合规路径) | M1 |
1.3 人民币金币汇率体系
| 货币 | 汇率 | 说明 |
| ¥(人民币) | 1 ¥ = 10 金币 | 基准货币(100 金币起充) |
| iOS 定价 | 同价人民币档位 | 与苹果分成规则对齐 |
国内为单一币种,无需每周汇率同步;价格体系由运营按套餐毛利设计(见文档 14 国内支付通道)。用户充值时刻锁定金币数量,不随任何波动变化。
1.4 支付通道抽象层(适配器模式)
各通道在协议、签名、回调、结算周期上差异巨大,业务侧一律不直接接触通道 SDK,全部经「支付网关抽象层」收敛为统一接口,新增通道时仅实现一个适配器即可。
| 统一接口 | 能力 | 各通道实现 |
| createPayment(channel, order) | 创建支付单并返回客户端拉起参数 | 微信 v3 App 支付 / 支付宝 app.pay / 华为 IAP / 云闪付 / 苹果 StoreKit |
| verifyNotify(channel, payload) | 验签 + 幂等校验 + 订单状态机推进 | 微信平台证书 RSA / 支付宝 RSA2 / 华为签名 / Apple Root CA |
| queryPayment(channel, tradeNo) | 主动查单(回调丢失时兜底补单) | 各通道查单 API,30 分钟未回调自动触发 |
| refund(channel, order, amount) | 原路退款 | 微信 refund V3 / 支付宝 trade.refund / 华为 / 苹果退款通知 |
| fetchBill(channel, date) | 拉取对账单 | 微信/支付宝 CSV / 华为结算报表 / Apple Financial Report |
# 抽象层核心:ChannelAdapter 接口 + 注册中心
interface ChannelAdapter:
def create_payment(order) -> PaymentParams # 返回拉起参数
def verify_notify(payload) -> PaymentResult # 验签 + 幂等
def query(trade_no) -> PaymentResult # 兜底查单
def refund(order, amount) -> RefundResult # 原路退款
def fetch_bill(date) -> BillFile # 对账单拉取
class PaymentGateway:
adapters = {"wechat": WechatAdapter(), "alipay": AlipayAdapter(),
"huawei": HuaweiAdapter(), "unionpay": UnionpayAdapter()}
def charge(self, channel, order):
return self.adapters[channel].create_payment(order)
# 探活:通道失败 3 次/分钟 → 标记降级,路由自动切换备用通道
路由与降级策略:Android 默认路由「微信 → 支付宝」;华为渠道「华为支付 → 微信」;通道探活失败即标记降级,用户侧自动切换备用通道;全部通道不可用时展示「网络繁忙,稍后重试」并记录告警。
二、微信支付接入(国内核心通道)
2.1 技术对接
| 项目 | 规格 |
| 对接方式 | 微信支付商户平台(V3 API) |
| 协议 | REST API + JSON + HMAC-SHA256 签名(平台证书验签) |
| 认证 | 商户号 + API v3 密钥 + 证书 |
| 支付流程 | 服务端创建订单 → 返回支付参数 → 客户端拉起微信 → 微信回调 |
| 支付方式 | App 支付(Android)+ JSAPI(H5)+ 小程序支付 |
| 限额 | 单笔默认不限,按商户风控配置 |
| 退款 | 支持原路退(V3 refund API) |
2.2 支付流程
// 1. 前端请求创建订单
POST /payment/charge
{ "package_id": "pkg_1200", "channel": "wechat" }
// 2. 后端 → 微信支付 API:创建订单
POST https://api.mch.weixin.qq.com/v3/pay/transactions/app
Headers: Authorization: WECHATPAY2-SHA256-RSA2048 ...
Body: {
"appid": "wx_xxx",
"mchid": "mch_xxx",
"description": "Vocalink 1200 金币",
"out_trade_no": "ord_xxx",
"notify_url": "https://api.vocalink.cn/v1/payment/notify/wechat",
"amount": { "total": 990, "currency": "CNY" }
}
// 3. 微信返回预支付参数
Response: { "prepay_id": "wx_xxx" }
// 4. 客户端调起微信支付 → 微信异步回调
POST /payment/notify/wechat
{ "out_trade_no": "ord_xxx", "transaction_id": "wx_123", "trade_state": "SUCCESS", "amount": {...} }
// 5. 后端验签 → 发放金币 → WebSocket 通知客户端
2.3 错误处理
| 错误码 | 含义 | 处理 |
| PAY_ERROR | 支付异常(余额不足等) | 提示「支付失败,请重试或更换方式」 |
| ORDERPAID | 订单已支付 | 查询订单状态 → 幂等发放金币 |
| SIGN_ERROR | 签名验证失败 | 服务器错误 → 告警 + 重试 3 次 |
| SYSTEMERROR | 微信服务不可用 | 降级到支付宝 |
| 重复回调 | 微信重复推送 | 幂等处理(out_trade_no 唯一) |
三、支付宝接入
3.1 技术对接
| 项目 | 规格 |
| SDK | 支付宝开放平台 SDK(Android/Web)+ alipay-sdk-java(后端) |
| 模式 | App 支付 / 手机网站支付(alipay.trade.app.pay) |
| 异步通知 | trade_status = TRADE_SUCCESS / TRADE_FINISHED |
| 风控 | 支付宝风险大脑(服务端)+ 自建规则 |
| 结算 | T+1 到对公账户 |
3.2 支付流程
// 1. 后端创建支付宝订单
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
request.setNotifyUrl("https://api.vocalink.cn/v1/payment/notify/alipay");
request.setBizContent("{"
+ "\"out_trade_no\":\"ord_xxx\","
+ "\"total_amount\":\"9.90\","
+ "\"subject\":\"Vocalink 1200 金币\","
+ "\"product_code\":\"QUICK_MSECURITY_PAY\"}");
// 2. 返回 orderStr 给前端
Response: { "orderStr": "alipay_sdk=alipay-sdk-java..." }
// 3. 前端拉起支付宝 → 支付宝异步通知
POST /payment/notify/alipay
{ "out_trade_no": "ord_xxx", "trade_no": "2026081522001", "trade_status": "TRADE_SUCCESS", "total_amount": "9.90", "sign": "..." }
// 4. 后端验签(RSA2)+ 幂等 + 发放金币
3.3 退款处理
| 场景 | 方式 | 到账 |
| 用户申请退款 | 原路退(alipay.trade.refund) | 1-3 个工作日 |
| 重复扣款 | 原路退 + 道歉补偿 | 即时发起 |
| 无法原路退 | 退到 Vocalink 金币余额 | 即时 |
四、苹果 In-App Purchase
4.1 产品配置
| Product ID | 类型 | 价格 | 对应内容 |
| cn.vocalink.coins.100 | Consumable | ¥6.00 | 100 金币 |
| cn.vocalink.coins.600 | Consumable | ¥30.00 | 600+100 金币 |
| cn.vocalink.coins.1300 | Consumable | ¥60.00 | 1300+200 金币 |
| cn.vocalink.coins.3000 | Consumable | ¥128.00 | 3000+600 金币 |
| cn.vocalink.vip.month | Auto-Renewable | ¥45.00/月 | VIP 月订阅 |
| cn.vocalink.vip.year | Auto-Renewable | ¥328.00/年 | VIP 年订阅 |
4.2 验证流程
// 1. iOS 客户端完成购买 → 获取 receipt
let receiptData = try! Data(contentsOf: Bundle.main.appStoreReceiptURL!)
let receiptString = receiptData.base64EncodedString()
// 2. 客户端发送 receipt 到后端验证
POST /payment/subscription
{ "plan_id": "vip_month", "channel": "apple_iap", "receipt_data": receiptString }
// 3. 后端 → Apple VerifyReceipt API(国内网络可达性评估,必要时走合规通道)
POST https://buy.itunes.apple.com/verifyReceipt
{ "receipt-data": receiptString, "password": "shared_secret" }
// 4. Apple 返回验证结果
{ "status": 0, "receipt": {...}, "latest_receipt_info": [{ "product_id": "cn.vocalink.vip.month", "expires_date_ms": "1718000000000" }] }
// 5. 后端验证 + 发放 VIP + 记录原始交易 ID(用于续订)
4.3 订阅续订处理
| 事件 | Apple 通知 | 后端动作 |
| 首次购买 | DID_CHANGE_RENEWAL_STATUS | 发放 VIP + 记录 original_transaction_id |
| 续订成功 | DID_RENEW | 延长 VIP 有效期 |
| 续订失败 | FAILED_TO_RENEW | 标记 grace_period → 3 天宽限 |
| 用户取消 | CANCEL | 到期日停止 VIP |
| 退款 | REFUND | 撤回 VIP + 扣回金币 |
⚠️ 苹果 30% 佣金影响:
- 苹果内购抽成 30%(中小开发者 15%),iOS 端定价需覆盖成本
- iOS 端禁止引导用户至外部支付(审核规则 3.1.1),遵守平台规范
- iOS 虚拟商品(金币/会员)只允许 IAP 路径,不可跳转 H5 充值
五、华为支付与联运
| 项目 | 规格 |
| 接入方式 | 华为应用内支付(IAP)SDK,随华为联运上架 |
| 产品类型 | 消耗型商品 + 订阅型商品 |
| 分成 | 以联运合同为准(华为商店联运分成) |
| 验证 | 服务端 Order Service 校验签名 |
| 对账 | 华为开发者平台下载结算报表 |
📌 说明:华为渠道用户可在华为支付体系内完成充值,与微信/支付宝形成「厂商商店 + 第三方支付」双轨;联运分成与支付通道选择需在商务合同阶段明确(见文档 14 与 19)。
六、对账系统
6.1 对账流程
1
拉取账单:[T+1 00:30] 拉取微信支付账单 / 支付宝账单 / 苹果结算单 / 华为结算单
2
比对:与内部 payments 表比对 → 匹配标记 reconciled → 差异生成告警
3
差异处理:金额差异 → 财务调查 / 丢失交易 → 补发追回 / 重复 → 退款
6.2 对账规则
| 通道 | 对账文件 | 频率 | 容差 |
| 微信支付 | 微信支付账单(CSV,下载 API) | 每日 | ¥0.01 |
| 支付宝 | 支付宝对账单(CSV) | 每日 | ¥0.01 |
| 苹果 | Apple Financial Report | 每月 | ¥0.10 |
| 华为 | 华为结算报表 | 每月 | ¥0.10 |
6.3 差异处理
| 差异类型 | 原因 | 处理 |
| 金额少 1-2% | 通道费率/四舍五入 | 自动调整(容差内) |
| 交易丢失 | 回调未送达 | 查询通道 API → 补发金币 |
| 重复发放 | 回调重复推送 | 幂等拦截(已处理) |
| 金额差异大 | 优惠/手续费变更 | 财务人工调查 |
| 退款未同步 | 通道退款延迟 | 标记 pending → 7 天复查 |
七、风控系统
7.1 风控规则
| 规则 | 触发条件 | 动作 |
| 高频充值 | 同一用户 1 小时内 > 5 笔 | 限流 + 人工审核 |
| 大额充值 | 单笔 > ¥500 | 加强验证(短信/人脸) |
| 异常地区 | IP 归属异常 / 频繁切换 | 短信确认 + 限流 |
| 新账号大额 | 注册 < 24h + 充值 > ¥200 | 延迟到账(24h 观察期) |
| 退款率异常 | 用户退款率 > 30% | 标记高风险 + 限制 |
| 疑似未成年人 | 实名信息异常 / 触发人脸核验 | 按文档 18 强制核验与限制 |
| 金币异常消耗 | 1 小时内消耗 > 5000 金币 | 临时冻结 + 验证 |
7.2 风控架构
# 风控引擎(Payment Service 内)
class RiskEngine:
def evaluate(self, payment_request):
risk_score = 0
user = get_user(payment_request.user_id)
# 规则 1:高频
if self._count_recent_payments(user.id, hours=1) > 5:
risk_score += 30
# 规则 2:大额
if payment_request.amount_cny > 500:
risk_score += 20
# 规则 3:异常地区
if payment_request.ip_region in BLOCK_LIST:
risk_score += 25
# 规则 4:新账号
if (now() - user.created_at) < 24h and payment_request.amount_cny > 200:
risk_score += 35
# 规则 5:未实名 / 疑似未成年
if not user.real_name_verified:
risk_score += 40
# 决策
if risk_score >= 70:
return "block", "High risk score"
elif risk_score >= 40:
return "review", "Manual review needed"
else:
return "allow", "Low risk"
7.3 支付安全合规
| 要求 | 实现 |
| 不存储敏感信息 | 不接触银行卡号,由微信/支付宝代持 |
| 加密传输 | TLS 1.2+ 全链路 |
| 访问日志 | 所有支付操作审计日志(不可篡改) |
| 定期扫描 | 季度漏洞扫描 + 年度渗透测试 |
| 员工培训 | 半年一次支付安全与反诈培训 |
| 网络隔离 | 支付服务独立 VPC + 最小权限 |
八、退款与争议处理
8.1 退款政策
| 场景 | 退款方式 | 时限 | 审批 |
| 未消费金币 | 原路退(微信/支付宝) | 1-3 个工作日 | 自动(< ¥200) |
| 已消费金币 | 退到 Vocalink 金币余额 | 即时 | 客服审批 |
| VIP 未使用 | 按比例退(原路) | 1-3 个工作日 | 自动 |
| VIP 已使用 | 按剩余天数退 | 1-3 个工作日 | 客服审批 |
| 技术问题导致 | 全额退 + 补偿金币 | 即时 | 自动(标记 bug) |
| iOS 退款 | 苹果处理并回传通知 | 以苹果为准 | 按苹果规则 |
8.2 争议处理
| 阶段 | 时间 | 动作 |
| 收到争议/投诉 | Day 0 | 标记订单 + 冻结争议金额 + 联系用户核实 |
| 收集证据 | Day 1-7 | 交易日志/IP/设备指纹/用户行为 |
| 处理或辩护 | Day 7-14 | 通过微信/支付宝争议处理流程提交材料 |
| 结果处理 | 按平台周期 | 胜诉→解冻 / 败诉→退款+标记用户 |
九、分账体系(主播 / 语伴打赏)
9.1 分账模式
| 模式 | 说明 | 适用阶段 |
| 平台抽佣(默认) | 用户打赏金币 → 平台按比例抽佣 → 剩余计入创作者金币余额 | M2 起默认模式 |
| 微信支付分账 | 微信「分账」API:支付成功后按比例向创作者子商户分账(需服务商/特约商户资质,见文档 19) | M4 规模化后启用 |
| 平台代付 | 创作者提现 → 平台统一代发(企业付款到零钱/个人打款) | M2-M3 过渡方案 |
9.2 分账流程(以微信分账为例)
1
打赏入账:用户打赏金币 → 生成打赏订单 → 微信支付成功 → 金币实时到账创作者余额。
2
平台分账:调用微信「分账」API,按规则(如平台 60% / 创作者 40%)向创作者子商户分配资金。
3
回执更新:分账结果回执 → 更新分账记录表(order_id / 平台 / 创作者 / 比例 / 金额 / 状态)。
4
创作者提现:满 ¥10 提现 → 子商户提现或平台代付(T+1 到账)。
5
对账:T+1 对账含分账维度,分账金额与提现金额双向核对。
9.3 分账规则与税务
| 项目 | 规则 |
| 抽佣比例 | M2-M3 平台 60% / 创作者 40%(覆盖通道费与运营成本);M4 按档位优化(头部创作者 55/45) |
| 提现门槛 | 满 ¥10 可提现;单日提现上限 ¥2,000 |
| 到账时效 | 提现申请后 T+1 个工作日到账 |
| 税务 | 创作者收入按劳务报酬代扣代缴个人所得税(与文档 15 联动);金额较大主体切换为企业间结算 |
| 风控 | 提现前完成实名 + 人脸核验;新账号大额提现延迟 24h 观察期 |
9.4 虚拟币 → 现金合规红线
⛔ 红线:金币仅限平台内消费(通话、礼物、会员),不可反向兑换为现金;创作者打赏收益仅可提现为人民币且按劳务报酬报税。严禁「买量刷打赏」「自充自提」等套现行为,一经发现冻结账号并留存证据、必要时报备。
十、里程碑演进(M1-M5)
| 里程碑 | 支付通道 | 新增能力 | 预期月流水 |
| M1 | 微信支付 + 支付宝 + 苹果 IAP | 基础充值/订阅/退款 | ~¥5 万(内测期,DAU ≤ 5,000) |
| M2 | 首发通道稳定运营 | 优惠券系统 + 首充活动 | ~¥15-30 万(1 万 DAU) |
| M3 | + 华为支付 + 云闪付 | 会员体系升级 + 组合套餐 | ~¥50-80 万(5-10 万 DAU) |
| M4 | 全通道稳定运营 | 主播打赏分账体系优化 | ~¥300 万(30-50 万 DAU) |
| M5 | 通道精细化 | 费率谈判 + 个性化定价 | ~¥700 万(50-100 万 DAU) |
附录
附录 A:回调端点清单
| URL | 来源 | 验证方式 |
| POST /v1/payment/notify/wechat | 微信支付 | 微信支付平台证书验签(RSA) |
| POST /v1/payment/notify/alipay | 支付宝 | 支付宝公钥验签(RSA2) |
| POST /v1/payment/notify/apple | 苹果 | Apple Root CA(VerifyReceipt) |
| POST /v1/payment/notify/huawei | 华为 | 华为签名校验 |
附录 B:相关文档
| 文档 | 关联内容 |
| 10 API 接口规范 | /payment/* 接口契约 |
| 11 数据库设计 | payments / subscriptions 表 |
| 12 第三方服务集成 | 微信支付/支付宝接入概述 |
| 14 国内支付通道 | 通道选型与费率细化 |
| 15 国内税务与牌照合规 | 收入确认与发票 |
附录 C:修订记录
| 版本 | 日期 | 修改内容 | 作者 |
| V1.0 | 2026-08-15 | 初始版本(支付中台接入方案) | 支付团队 |
| V2.0 | 2026-08-17 | 重写为国内版:微信支付/支付宝/华为支付/云闪付/苹果内购、人民币金币体系、分账对账风控、M1-M5 演进;主色对齐国内版暗红模板 | 项目组 |
| V3.0 | 2026-08-17 | 精益化校准:支付时点对齐(华为/云闪付 M3 起);预期月流水对齐 DAU 阶梯(M2 ¥15-30 万 → M5 ¥700 万,与 28 对齐) | 项目组 |
| V3.1 | 2026-08-17 | 补强:新增 1.4 支付通道抽象层(适配器模式 + 统一接口 + 降级路由);新增第九节分账体系(模式/流程/规则税务/虚拟币合规红线),原里程碑演进顺延为第十节 | 项目组 |