Files
wangjia 669774d0f7 feat(dev): 本地联调 mock 渠道工具链(fake 注册/seed pangolin/模拟付款端点/可配投递间隔,MOCK_CHANNEL_ENABLED 门控)
让 pangolin(业务方)能在本地端到端测通:下单(method=fake)→显示假收款→手动
POST /api/v2/dev/orders/:order_no/mark-paid 模拟付款成功→pay 签名 webhook→pangolin
开通订阅。全部改动收在 env MOCK_CHANNEL_ENABLED 门控内,生产默认 false 零影响:

- providerbuild.BuildRegistry:门控下注册 fake provider,SettleCurrencies 覆盖成
  ["CNY","USDT"](CNY 排首位对齐 pangolin 实际下单币种),fake.go 加 SetSettleCurrencies
  测试缝,默认("USDT")不变、不破坏既有测试。
- main.go:门控下注入内存 fake 账户(picker 才选得到 method=fake)+ seedPangolin()
  幂等 upsert pro_month/pro_quarter/pro_year 三档商品 + 挂载 dev mark-paid 路由。
- config:新增 MOCK_CHANNEL_ENABLED / WEBHOOK_TICK_SECONDS(默认 60,本地可设 2 近实时
  投递)两个 env 开关;config.yaml 补 biz.pangolin 声明(secret 走 BIZ_PANGOLIN_SECRET env)。
- internal/handler/devmock.go:MarkPaid 按 out_trade_no 取 fake 渠道最新 attempt,
  原样组回调体走 gateway.HandleCallback("fake",...),与真实回调同一入口。

自测:go build/vet/test 全绿;起服务后签名下单(currency=CNY,与 pangolin 未传
currency 时的实际结算币种一致)→ mark-paid → 订单翻 paid → outbox ~2s 内尝试投递
(因本机未起 pangolin 收 404,预期内,证明 pay 侧链路已通)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013nMthbVEmQquxBRKb9Fj8u
2026-07-11 01:26:14 +08:00

61 lines
3.4 KiB
YAML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 支付服务配置(模板)
# ⚠️ 密钥严禁写进本文件!一律走环境变量(生产由 Bitwarden 经 rbw 灌入):
# ALIPAY_APP_PRIVATE_KEY / ALIPAY_PUBLIC_KEY
server:
port: "8080"
mode: "debug" # debug | release
# 拼 notify_url / return_url 的根地址。
# 本机只测「下单→跳收银台」用 http://localhost:8080 即可;
# 要测异步回调 notify 需公网可达地址(内网穿透,或部署到服务器用 IP/域名)。
base_url: "http://localhost:8080"
database:
driver: "sqlite" # sqlite(默认,纯 Go 无需 gcc | mysql
dsn: "pay.db" # sqlite 文件路径;mysql 时填 user:pass@tcp(host:3306)/db?...
# 启动时据此 upsert 一个支付宝商户。把 enabled 改 true、填 app_id,密钥走环境变量。
# 沙箱信息:https://open.alipay.com/develop/sandbox/app
alipay_sandbox:
enabled: false
production: false # false=沙箱网关;true=正式网关(真钱)
merchant_code: "yanmei"
merchant_name: "岩美(北京)技术有限公司"
app_id: "" # 沙箱/生产 APPID
app_private_key: "" # 留空!走环境变量 ALIPAY_APP_PRIVATE_KEY
alipay_public_key: "" # 留空!走环境变量 ALIPAY_PUBLIC_KEY
# 启动时据此 upsert 一个微信商户(V3 Native 扫码)。微信无沙箱:enabled=true 即正式收款。
# 密钥严禁写进本文件!走环境变量(生产由 Bitwarden 经 rbw 灌入):
# WECHAT_MCH_PRIVATE_KEY(商户私钥 apiclient_key.pem / WECHAT_APIV3_KEYAPIv3 密钥)
wechat:
enabled: false
merchant_code: "yanmei-wx" # 与支付宝商户区分
merchant_name: "岩美(北京)技术有限公司"
mch_id: "" # 微信支付商户号(入驻后拿到)
app_id: "" # 绑定的 APPID
cert_serial: "" # 商户 API 证书序列号
private_key: "" # 留空!走环境变量 WECHAT_MCH_PRIVATE_KEY
apiv3_key: "" # 留空!走环境变量 WECHAT_APIV3_KEY
# 业务系统对接(通用)。任意业务系统在 biz.<name> 下加一段即可接入,无需改代码。
# 契约见 pay-contract 仓(OpenAPI + README)。业务方带签名下单 + 入账后 pay 回调其 webhook。
# 每个业务的 secret/callback 按约定走环境变量:BIZ_<NAME 大写>_SECRET / BIZ_<NAME 大写>_CALLBACK_URL
# 严禁写本文件(callback 可写这里,secret 一律走 env)。
biz:
jiu:
callback_url: "https://jiu.51yanmei.com/api/v1/pay/callback" # 支付成功回调 jiu 的接收器
secret: "" # 留空!走环境变量 BIZ_JIU_SECRET
# dudu: # 将来接入 dudu:加这段 + 设 BIZ_DUDU_SECRET
# callback_url: "https://.../api/v1/pay/callback"
# secret: ""
pangolin:
callback_url: "http://localhost:8080/v1/webhook/pay" # pangolin 本地联调固定监听 :8080 的接收器
secret: "" # 留空!走环境变量 BIZ_PANGOLIN_SECRET(本地联调用 throwaway 值,生产另配)
# 兜底主动查单:定时把待支付订单拿去查,防异步回调丢失
query_sync:
enabled: true
interval_sec: 30
max_age_min: 30