diff --git a/docs/index.html b/docs/index.html index 5594b1e..fd47f8f 100644 --- a/docs/index.html +++ b/docs/index.html @@ -29,6 +29,11 @@
独立支付服务(Go·Gin·GORM),多业务 × 多渠道(支付宝先行,微信留接口)。新增文档请同步登记此处。
pay v2 支付渠道接入的单一登记入口——每接一个新渠道,在本文档追加一节。汇总各渠道的官方文档链接、pay 侧 provider 位置、接入形态概要、凭证存放位置指针。
+ +每个渠道在 internal/provider/<name>/ 下实现统一的 provider.Provider 接口(定义于 internal/provider/provider.go),网关侧不感知渠道差异:
| 方法 | 作用 |
|---|---|
| Method() | 渠道注册名(如 alipay/stripe/crypto),也是配置里 method 字段的值 |
| Capabilities() | 渠道能力自述:支持的 render_type、是否支持退款/续订、结算币种、可服务区域 |
| Create(ctx, CreateRequest) | 拿 pay 已定金额/币种/账户去渠道建单,产出 Session{ProviderRef, RenderType, Payload} |
| VerifyCallback(ctx, CallbackInput) | 解析并验签渠道异步回调(HTTP body/头/query),产出归一化 PaidEvent |
| Query(ctx, QueryRequest) | 主动查单兜底(回调丢失时的定时轮询/对账) |
可选扩展接口:RefundingProvider(退款)、RecurringProvider / SubscriptionProvider(续订)、OrphanScanner(自托管渠道的孤儿到账扫描)。
render_type(客户端只认这 6 种付款意图形态,不下发任何 UI,样式归业务方自绘):
+| 值 | 含义 | 当前用者 |
|---|---|---|
| redirect | 跳转到渠道收银台 URL | alipay(page/wap)、stripe(Checkout) |
| qr | 渠道二维码内容,前端自行渲染 | alipay(当面付 precreate) |
| crypto_address | 收款地址 + 精确到账金额 | crypto |
| native_pay | 原生支付组件拉起(如小程序/App SDK) | 暂无渠道使用 |
| sdk_handoff | 交由客户端 SDK 处理支付流程 | 暂无渠道使用 |
| iap_receipt | App Store/Play 内购收据校验 | 暂无渠道使用 |
| 渠道 | 类型 | 结算币种 | Method() | 状态 |
|---|---|---|---|---|
| 哪吒支付 | 第三方 RSA 聚合支付 | CNY | nezha | 开发中 |
| 支付宝 | 自有商户直连 | CNY | alipay | 已接入 |
| Stripe | 自有商户直连(海外网关) | USD | stripe | 已接入 |
| Crypto(USDT-TRC20) | 链上自托管 | USDT | crypto | 已接入 |
internal/provider/nezha/(待建)nezhanzzf(商户号 pid + 商户私钥 + 平台公钥),仅按需 rbw get 取用,不入文档/git接入形态概要(据官方文档):
+SHA256WithRSA + Base64。签名串 = 非空参数(排除 sign/sign_type/数组)按参数名 ASCII 升序拼 key=value&...(不拼密钥);商户私钥签、平台公钥验。POST https://nzzf.org/api/pay/create(form-urlencoded)。字段:pid / type / out_trade_no / notify_url / return_url / name / money(元)/ timestamp / sign / sign_type;响应 JSON 含 payurl(收银台跳转,对应 render_type=redirect)+ qrcode(二维码,对应 qr)。trade_no / out_trade_no / money / trade_status / sign;平台公钥验签;trade_status=TRADE_SUCCESS 为成功;商户须回纯文本 success(对应 VerifyCallback)。POST https://nzzf.org/api/pay/query,status=1 表示已支付(对应 Query)。type=alipay 等参数选择,聚合渠道内部路由)。internal/provider/alipay/alipay.goalipayali pay key(字段 app_private_key / alipay_public_key / appid),经 rbw get 灌服务器 env(见 上线状态与部署 Runbook)接入形态概要(源自 internal/provider/alipay/alipay.go + 支付宝密钥申请与备案依赖 / 支付宝收款页时序图与架构):
SHA256WithRSA),商户应用私钥签、支付宝公钥验(smartwalle/alipay/v3 SDK 封装)。metadata["render"] 与端型三选一——当面付 alipay.trade.precreate(render=qr,出二维码,render_type=qr);手机端 alipay.trade.wap.pay(TradeWapPay,QUICK_WAP_WAY);PC 端 alipay.trade.page.pay(TradePagePay,FAST_INSTANT_TRADE_PAY),两者均产出跳转 URL(render_type=redirect)。渠道以 out_trade_no 归位,仅支持 CNY。DecodeNotification 用支付宝公钥验签;交易状态归一化——WAIT_BUYER_PAY→pending,TRADE_SUCCESS/TRADE_FINISHED→succeeded,TRADE_CLOSED→failed;商户须回 success。alipay.trade.query(TradeQuery),用于回调丢失/超时时的定时轮询。alipay.trade.refund(同步接口,TradeRefund),out_request_no 作幂等键支持部分退款。internal/provider/stripe/stripe.gostripeCredentialEnvPrefix 对应 env 后缀 SECRET_KEY / WEBHOOK_SECRET),经 rbw 灌 env;具体条目名待生产上线时在 Bitwarden 建立,不写入本文档接入形态概要:托管 Checkout(hosted Checkout Session),一次性支付走 mode=payment、订阅走 mode=subscription,均产出跳转 URL(render_type=redirect)。Webhook 验签用官方 SDK webhook.ConstructEvent(HMAC + 时间容差);处理 checkout.session.completed(入账/订阅激活)、invoice.paid(续费)、customer.subscription.deleted(订阅取消)、invoice.payment_failed(逾期)、charge.dispute.created(拒付)。退款走 /v1/refunds(Idempotency-Key 幂等);订阅续费由 Stripe 网关自身调度(RecurringKindGatewayScheduled),pay 不主动发起扣款。
internal/provider/crypto/crypto.gocryptoADDRESS / TRONGRID_KEY),私钥不由 pay 持有;具体条目名不写入本文档接入形态概要:每账户一个固定收款地址(watch-only,pay 从不持有私钥),每单在基础价上叠加随机唯一尾数(微 USDT 级)区分订单身份,冷却窗防金额复用误配。无渠道异步回调(VerifyCallback 恒返回 ErrNotSupported),到账完全靠查单:定时扫 TronGrid only_confirmed 已确认交易,按「收款地址 + 精确金额 + 块时晚于建单时间」匹配(render_type=crypto_address)。另实现 OrphanScanner:扫描到账但不匹配任何在途订单的转账,供对账人工核对。资金归集(sweep 到冷存储)是独立的线下操作,不在 pay 范围内。
所有渠道凭证统一走 Bitwarden,按需 rbw get 取出灌入服务器环境变量(CredentialEnvPrefix + 字段名,如 ALIPAY_APP_PRIVATE_KEY),不落配置文件、不落 git 仓库、不进聊天记录。已上线渠道的具体 Bitwarden 条目名见各渠道小节;未上线渠道的条目在生产接入前另建,同样不预先写入本文档。部署细节参见 上线状态与部署 Runbook。