# 目标 - 使用你已填写的配置,按“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. 自测:预下单→支付→通知推进,重复通知幂等校验。