支付接入(海外收款)

收款方案:Waffo Pancake

GoShip 内置的是 Waffo Pancake 的收款接入。它是 Merchant of Record(MoR) 模式:以平台名义向你的客户收款、开票,并代你处理各国销售税/VAT。

项目说明
------
注册门槛个人可注册,无需海外公司
费率约 3.9% + $0.5/笔(含税务合规)
提现支付宝 / 银行卡,人民币结算
提现门槛约 $50
文档有完整中文文档
为什么不是其他平台?对大陆个人开发者而言,选择收款平台要同时满足三点:个人能注册、能提现到国内、有中文支持。Waffo Pancake 目前三项都满足。

接入步骤

  1. 注册并完成 KYC(身份证 + 人脸识别,审核 1–3 个工作日);
  2. 创建商品:
  • 专业版(一次性买断,$29)
  • 团队版(一次性买断,$139)
  • 更新订阅(订阅型,$14/年)
  1. 配置 Webhook:URL 填 https://你的域名/api/payments/webhook
  • 建议勾选事件:order.completed、subscription.activated、subscription.renewed、subscription.canceled、refund.succeeded
  1. 复制 Waffo 公钥,保存到服务器:
# 方式一:文件(推荐)
/opt/goship/data/waffo-public.pem

# 方式二:环境变量(换行写成 \n)
WAFFO_PUBLIC_KEY="-----BEGIN PUBLIC KEY-----\nMIIB..."
  1. 把商品的支付链接填进 src/public/assets/app.js:
GOSHIP.payments = {
  provider: 'waffo',
  proUrl: 'https://你的收款链接',
  teamUrl: 'https://你的收款链接',
};
  1. 重启服务并测试:sudo systemctl restart goship

Webhook 安全性

Waffo 的每个通知都带 X-Waffo-Signature 请求头,格式为 t=<时间戳>,v1=<Base64 签名>。

GoShip 服务端会:

  1. 用 Waffo 公钥做 RSA-SHA256 验签,验签对象是 时间戳.原始请求体(注意:必须用未经解析的原始 body);
  2. 检查时间戳是否在容忍窗口内(默认过去 45 分钟),防止重放攻击;
  3. 验签失败一律拒绝,并记录到 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,重点确认公钥是否配置正确、请求是否被验签拒绝。