Some checks failed
Build docker and publish / linux (1.24.5) (push) Failing after 40s
feat(pay): 添加支付API基础结构 feat(miniapp): 创建支付测试小程序页面与配置 feat(wechatpay): 配置微信支付参数与证书 fix(guild): 修复成员列表查询条件 docs: 更新代码规范文档与需求文档 style: 统一前后端枚举显示与注释格式 refactor(admin): 重构用户奖励发放接口参数处理 test(title): 添加称号效果参数验证测试
2.9 KiB
2.9 KiB
目标
- 使用你已填写的配置,按“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。
- 使用 SDK 的平台证书下载管理器:在通知处理处懒加载
文件与位置(只改后端)
- 设置路径:在
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为交易成功时间;重复通知幂等。
安全与合规
- 私钥路径仅用于服务端签名;不要提交证书文件到仓库。
- 金额单位统一为分;仅信任服务端订单金额。
我将执行的改动(收到确认后)
- 在各环境
*_configs.toml确认/写入wechatpay.private_key_path指向config/cert。 - 将通知处理替换为 SDK 验签/解密版本(保留幂等与条件更新)。
- 增加可选本地平台证书配置支持(如你偏好离线证书验证)。
- 自测:预下单→支付→通知推进,重复通知幂等校验。