bindbox-game/.trae/documents/补充证书路径接入与通知验签方案.md
邹方成 6ee627139c
Some checks failed
Build docker and publish / linux (1.24.5) (push) Failing after 40s
feat: 新增支付测试小程序与微信支付集成
feat(pay): 添加支付API基础结构
feat(miniapp): 创建支付测试小程序页面与配置
feat(wechatpay): 配置微信支付参数与证书
fix(guild): 修复成员列表查询条件
docs: 更新代码规范文档与需求文档
style: 统一前后端枚举显示与注释格式
refactor(admin): 重构用户奖励发放接口参数处理
test(title): 添加称号效果参数验证测试
2025-11-17 00:42:08 +08:00

38 lines
2.9 KiB
Markdown
Raw 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.

# 目标
- 使用你已填写的配置按“config/cert”中的证书路径完成微信支付真实接入统一下单+小程序签名+通知验签/解密。
# 当前配置状况
- 已存在 `[wechatpay]` 配置段并支持 ENV 覆盖:`mchid/serial_no/private_key_path/api_v3_key/notify_url`configs/configs.go
- 证书路径建议:将商户私钥 `apiclient_key.pem` 放在 `./configs/cert/apiclient_key.pem`,并把 `private_key_path` 配置为该相对路径。
# 具体改造点
- 证书路径接入:
- 不新增新的配置段,直接使用 `[wechatpay].private_key_path` 指向 `config/cert` 中的私钥路径。
- 若你希望本地校验平台证书(而非自动下载),增加可选字段:`wechatpay.platform_cert_path``wechatpay.platform_public_key_id`(可留空);否则走自动下载。
- 统一下单JSAPI按已封装客户端调用
- 读取 `private_key_path` → 初始化 `core.Client``WithWechatPayAutoAuthCipher`),自动管理平台证书。
- `jsapi.Prepay` 返回 `prepay_id`,之后用已有 `BuildJSAPIParams` 生成 `wx.requestPayment` 所需参数。
- 支付通知验签与解密:
- 使用 SDK 的平台证书下载管理器:在通知处理处懒加载 `downloader.MgrInstance().RegisterDownloaderWithPrivateKey(mchid, serial_no, private_key, api_v3_key)`
-`notify.NewNotifyHandler(api_v3_key, RSAVerifier(certificateVisitor))` 验签;解密 `resource.ciphertext` 得到 `payments.Transaction`;按 `out_trade_no/success_time` 幂等推进订单。
- 条件更新:`WHERE status=1` 防并发重复推进;已支付直接 ACK。
# 文件与位置(只改后端)
- 设置路径:在 `configs/*_configs.toml``[wechatpay]` 写入 `private_key_path = "./configs/cert/apiclient_key.pem"`(你已填写即可)。
- 统一下单:`internal/pkg/pay/client.go` 已使用该路径初始化;无需再改。
- 通知验签:`internal/api/pay/wechat_notify.go` 切换为 SDK 验签/解密实现(现在是占位版),引入 downloader + notify.Handler。
# 验证步骤
- 编译通过:`go build ./...`
- 预下单:调用 `POST /api/app/pay/wechat/jsapi/preorder` 返回小程序参数;`wx.requestPayment` 可正常调起。
- 通知:微信推送或用 SDK 模拟请求,验签成功后订单由待支付→已支付,`paid_at` 为交易成功时间;重复通知幂等。
# 安全与合规
- 私钥路径仅用于服务端签名;不要提交证书文件到仓库。
- 金额单位统一为分;仅信任服务端订单金额。
# 我将执行的改动(收到确认后)
1. 在各环境 `*_configs.toml` 确认/写入 `wechatpay.private_key_path` 指向 `config/cert`
2. 将通知处理替换为 SDK 验签/解密版本(保留幂等与条件更新)。
3. 增加可选本地平台证书配置支持(如你偏好离线证书验证)。
4. 自测:预下单→支付→通知推进,重复通知幂等校验。