package weChat import ( "context" "errors" "github.com/gin-gonic/gin" "github.com/wechatpay-apiv3/wechatpay-go/core/auth/verifiers" "github.com/wechatpay-apiv3/wechatpay-go/core/downloader" "github.com/wechatpay-apiv3/wechatpay-go/core/notify" "github.com/wechatpay-apiv3/wechatpay-go/services/payments" "github.com/wechatpay-apiv3/wechatpay-go/services/refunddomestic" "github.com/wechatpay-apiv3/wechatpay-go/utils" "vote-video-api/config" ) // PayParseNotify 支付回调通知的验签与解密 func PayParseNotify(c *gin.Context) (notifyReq *notify.Request, t *payments.Transaction, err error) { mchId := config.C.Wechat.Pay1281030301.MchId // 商户号 mchCertificateSerialNumber := config.C.Wechat.Pay1281030301.MchCertificateSerialNumber // 商户证书序列号 v3ApiSecret := config.C.Wechat.Pay1281030301.V3ApiSecret // 商户APIv3密钥 privateKeyPath := "extend/weChat/certs/" + config.C.Wechat.Pay1281030301.MchId + "/apiclient_key.pem" // 商户私钥文件地址 // 使用 utils 提供的函数从本地文件中加载商户私钥,商户私钥会用来生成请求的签名 mchPrivateKey, err := utils.LoadPrivateKeyWithPath(privateKeyPath) if err != nil { return nil, nil, errors.New("微信支付生成失败") } // 1. 使用 `RegisterDownloaderWithPrivateKey` 注册下载器 err = downloader.MgrInstance().RegisterDownloaderWithPrivateKey(c, mchPrivateKey, mchCertificateSerialNumber, mchId, v3ApiSecret) if err != nil { return nil, nil, err } // 2. 获取商户号对应的微信支付平台证书访问器 certificateVisitor := downloader.MgrInstance().GetCertificateVisitor(mchId) // 3. 使用证书访问器初始化 `notify.Handler` handler, err := notify.NewRSANotifyHandler(v3ApiSecret, verifiers.NewSHA256WithRSAVerifier(certificateVisitor)) transaction := new(payments.Transaction) notifyReq, err = handler.ParseNotifyRequest(context.Background(), c.Request, transaction) // 如果验签未通过,或者解密失败 if err != nil { return nil, nil, err } return notifyReq, transaction, nil } // RefundParseNotify 退款回调通知的验签与解密 func RefundParseNotify(c *gin.Context) (notifyReq *notify.Request, t *refunddomestic.Refund, err error) { mchId := config.C.Wechat.Pay1281030301.MchId // 商户号 mchCertificateSerialNumber := config.C.Wechat.Pay1281030301.MchCertificateSerialNumber // 商户证书序列号 v3ApiSecret := config.C.Wechat.Pay1281030301.V3ApiSecret // 商户APIv3密钥 privateKeyPath := "extend/weChat/certs/" + config.C.Wechat.Pay1281030301.MchId + "/apiclient_key.pem" // 商户私钥文件地址 // 使用 utils 提供的函数从本地文件中加载商户私钥,商户私钥会用来生成请求的签名 mchPrivateKey, err := utils.LoadPrivateKeyWithPath(privateKeyPath) if err != nil { return nil, nil, errors.New("微信支付生成失败") } // 1. 使用 `RegisterDownloaderWithPrivateKey` 注册下载器 err = downloader.MgrInstance().RegisterDownloaderWithPrivateKey(c, mchPrivateKey, mchCertificateSerialNumber, mchId, v3ApiSecret) if err != nil { return nil, nil, err } // 2. 获取商户号对应的微信支付平台证书访问器 certificateVisitor := downloader.MgrInstance().GetCertificateVisitor(mchId) // 3. 使用证书访问器初始化 `notify.Handler` handler, err := notify.NewRSANotifyHandler(v3ApiSecret, verifiers.NewSHA256WithRSAVerifier(certificateVisitor)) refund := new(refunddomestic.Refund) notifyReq, err = handler.ParseNotifyRequest(context.Background(), c.Request, refund) // 如果验签未通过,或者解密失败 if err != nil { return nil, nil, err } return notifyReq, refund, nil }