直接答案

可靠的VPN支付系统需要用内部订单统一网站与应用商店交易,用已验签且幂等的后台事件更新订阅,并由独立权益系统决定用户能使用的套餐、设备和节点;浏览器成功页不能作为开通依据。

先确定谁在销售和收款

支付系统设计的第一步不是选择SDK,而是确认销售主体、目标地区、商品说明、退款规则、账单名称和Merchant of Record。客户需要知道向谁购买,谁负责交付、退款和争议。

VPNDevelop默认提供技术集成,客户持有自己的商户或应用商店账号。若平台代商户收款再结算,责任和合规范围会明显扩大,需要单独评估。

用内部订单连接不同支付渠道

内部订单用于记录用户购买什么、金额、币种、套餐和有效期;渠道交易用于记录外部服务商的某次付款尝试。一次内部订单可能包含失败重试、支付方式切换、退款或争议。

因此不应只保存一个支付成功布尔值。订单、支付、订阅、退款和争议应各自保存状态、原始标识和时间,并通过明确的状态转换关联。

浏览器返回页面不是付款凭证

用户从收银台返回网站只代表前端流程到达某一步,不能证明资金已经最终确认。异步支付、网络中断和伪造请求都会使前端状态不可靠。

系统应在后台验证支付事件的签名、事件ID、对象、金额、币种和订单关联,处理成功后再向权益系统发出业务事件。

Webhook必须支持重复与乱序

支付服务商可能重复发送事件,不同事件也可能因重试而改变到达顺序。处理器需要保存事件ID、使用幂等键,并让重复执行得到相同结果。

回调入口应快速确认接收,把耗时业务放入队列;失败任务需要退避重试、告警和人工重放,但人工操作同样必须留下审计记录。

权益系统与支付状态分离

订阅状态描述渠道关系,权益状态描述用户当前可以使用的VPN能力。套餐可能包含有效期、设备数、流量、节点范围或功能,两者不能直接等同。

退款、拒付、取消续费和到期对权益的影响也不同。例如取消续费通常不应立即终止已付周期,而退款或确认争议可能需要按规则回收权益。

分别适配网站、Apple和Google

网站托管收银台、App Store自动续订和Google Play订阅具有不同的产品配置、交易标识、服务器通知、恢复购买和地区规则。可以统一内部模型,但不能丢失渠道差异。

应用商店政策会更新,外链和替代支付也可能按地区和资格变化。上线前应以目标地区的当前官方规则和实际开发者账号状态为准。

用异常路径完成验收

验收至少覆盖付款成功、付款失败、重复回调、回调乱序、延迟确认、续费失败、宽限期、取消、到期、退款、拒付和恢复购买。

同时检查密钥隔离、权限、日志脱敏、对账差异、告警、失败补偿和回滚。只有正常演示流程通过,不能证明支付系统可运营。

检查清单

  • 明确销售主体、Merchant of Record、账单名称、退款和拒付责任
  • 确认网站、Apple与Google各自适用的支付入口和销售地区
  • 为内部订单、渠道交易、订阅、退款和争议设置独立标识
  • 定义pending、processing、paid、failed、refunded和disputed等状态
  • Webhook必须验签、保存事件ID、幂等处理并支持安全重试
  • 只有后台确认的付款或有效订阅能够创建或延长权益
  • 取消、到期、退款、拒付、宽限期和恢复购买有明确权益规则
  • 测试密钥、生产密钥、回调密钥和操作权限相互隔离
  • 客服、财务和技术能够查询订单、事件、权益和人工处理记录
  • 对账、告警、失败补偿、密钥轮换和回滚流程已经演练

相关专题、服务与场景

参考资料

常见问题

VPN支付接口是否等于支付机构?

不等于。技术接口负责连接订单、渠道和用户权益;支付机构负责其获准范围内的收单或结算。谁是商户和Merchant of Record必须在项目开始前明确。

为什么需要内部订单号和渠道交易号两个标识?

内部订单代表业务意图,渠道交易号代表某一次外部支付尝试。一笔订单可能发生失败重试、换渠道、退款或争议,二者不能混为一个字段。

收到payment succeeded事件就一定可以永久开通吗?

不一定。需要确认事件来源、事件是否重复、对应订单和金额是否匹配、订阅或退款状态是否有效,再按套餐规则更新有期限的权益。

Apple、Google和网站订阅可以共用同一张订阅表吗?

可以共享内部抽象,但必须保留渠道原始标识、状态和事件。不同渠道的宽限期、恢复购买、退款及状态变化不应被丢失。

支付系统应该保存银行卡号吗?

通常不应由VPN业务系统直接保存。优先使用经过适当合规验证的支付服务商托管页面或组件,并按实际集成方式确认PCI DSS范围。

本文由 Vera Lindley 署名, 由 Soren Holloway 负责技术审核。 具体技术与合规要求应结合项目所在地区和实际架构确认。查看编辑与审核政策