48 lines
2.1 KiB
Go
48 lines
2.1 KiB
Go
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/utils"
|
|
"hepa-calc-api/config"
|
|
)
|
|
|
|
// ParseNotify 回调通知的验签与解密
|
|
func ParseNotify(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
|
|
}
|