支付接入(海外收款)
收款方案:Waffo Pancake
GoShip 内置的是 Waffo Pancake 的收款接入。它是 Merchant of Record(MoR) 模式:以平台名义向你的客户收款、开票,并代你处理各国销售税/VAT。
| 项目 | 说明 |
|---|---|
| --- | --- |
| 注册门槛 | 个人可注册,无需海外公司 |
| 费率 | 约 3.9% + $0.5/笔(含税务合规) |
| 提现 | 支付宝 / 银行卡,人民币结算 |
| 提现门槛 | 约 $50 |
| 文档 | 有完整中文文档 |
为什么不是其他平台?对大陆个人开发者而言,选择收款平台要同时满足三点:个人能注册、能提现到国内、有中文支持。Waffo Pancake 目前三项都满足。
接入步骤
- 注册并完成 KYC(身份证 + 人脸识别,审核 1–3 个工作日);
- 创建商品:
- 专业版(一次性买断,$29)
- 团队版(一次性买断,$139)
- 更新订阅(订阅型,$14/年)
- 配置 Webhook:URL 填
https://你的域名/api/payments/webhook
- 建议勾选事件:
order.completed、subscription.activated、subscription.renewed、subscription.canceled、refund.succeeded
- 复制 Waffo 公钥,保存到服务器:
# 方式一:文件(推荐)
/opt/goship/data/waffo-public.pem
# 方式二:环境变量(换行写成 \n)
WAFFO_PUBLIC_KEY="-----BEGIN PUBLIC KEY-----\nMIIB..."
- 把商品的支付链接填进
src/public/assets/app.js:
GOSHIP.payments = {
provider: 'waffo',
proUrl: 'https://你的收款链接',
teamUrl: 'https://你的收款链接',
};
- 重启服务并测试:
sudo systemctl restart goship
Webhook 安全性
Waffo 的每个通知都带 X-Waffo-Signature 请求头,格式为 t=<时间戳>,v1=<Base64 签名>。
GoShip 服务端会:
- 用 Waffo 公钥做 RSA-SHA256 验签,验签对象是
时间戳.原始请求体(注意:必须用未经解析的原始 body); - 检查时间戳是否在容忍窗口内(默认过去 45 分钟),防止重放攻击;
- 验签失败一律拒绝,并记录到
payments表便于排查。
只有配置了公钥才会启用验签。生产环境务必配置,否则他人可以伪造付款通知白嫖套餐。
事件与套餐的对应关系
| 事件 | 处理动作 |
|---|---|
| --- | --- |
order.completed | 一次性买断成功 → 开通套餐 |
subscription.activated / renewed / recovered | 订阅开通或续费 → 延长套餐 |
subscription.canceling | 用户申请取消 → 标记为「取消中」,周期内仍可用 |
subscription.canceled | 订阅终止 → 降级为免费版 |
refund.succeeded | 退款成功 → 降级为免费版 |
匹配用户的依据是通知里的 买家邮箱(data.buyerEmail),因此建议引导用户先注册账号再购买。
提现
Waffo Pancake → 支付宝或银行卡(人民币),到账约 3–5 个工作日。
常见问题
Q:没有公司能收美元吗?
A:能。MoR 模式下你是「供应商」角色,平台代收代缴税,你按平台结算提现即可。
Q:收入要不要缴税?
A:请咨询当地税务专业人士。个人劳务报酬/经营所得通常需要自行申报,不要做税务鸵鸟。
Q:收不到 Webhook 通知怎么办?
A:先在后台看投递记录,再看服务端日志 sudo journalctl -u goship -f,重点确认公钥是否配置正确、请求是否被验签拒绝。