669774d0f7
让 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
61 lines
3.4 KiB
YAML
61 lines
3.4 KiB
YAML
# 支付服务配置(模板)
|
||
# ⚠️ 密钥严禁写进本文件!一律走环境变量(生产由 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_KEY(APIv3 密钥)
|
||
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
|