package api import ( "crypto/x509" "encoding/json" "github.com/kataras/iris/v12" "github.com/kataras/iris/v12/context" "github.com/wechatpay-apiv3/wechatpay-go/core" "github.com/wechatpay-apiv3/wechatpay-go/core/auth/verifiers" "github.com/wechatpay-apiv3/wechatpay-go/core/notify" "github.com/wechatpay-apiv3/wechatpay-go/services/payments" "github.com/wechatpay-apiv3/wechatpay-go/services/payments/jsapi" utils2 "github.com/wechatpay-apiv3/wechatpay-go/utils" "go.uber.org/zap" "io" "pet-house.com/business/models" "pet-house.com/business/utils" "pet-house.com/core/server/database" "pet-house.com/core/server/web" "pet-house.com/core/server/web/web_iris" "pet-house.com/core/server/zap_server" "strconv" ) // 充值挡位列表 func (p DefParty) rechargeInfoList() web_iris.Party { return web_iris.Party{Prefix: p.Prefix, PartyFunc: func(index iris.Party) { index.Post(PayBase+"/rechargeInfoList", func(ctx *context.Context) { var rechargeInfoList []models.RechargeInfo database.Instance().Model(&models.RechargeInfo{}).Where("type = 1 and status = 1").Find(&rechargeInfoList) Success(ctx, nil, rechargeInfoList) }) }} } type ToPayRequest struct { PayId int //支付ID } type ToPayResponse struct { Content *jsapi.PrepayWithRequestPaymentResponse `json:"content"` PayOrderId string `json:"payOrderId"` PayType int `json:"payType"` //支付类型 0在线支付 1会员余额支付 } // 充值 func (p DefParty) toPay() web_iris.Party { return web_iris.Party{Prefix: p.Prefix, PartyFunc: func(index iris.Party) { index.Post(PayBase+"/toPay", func(ctx *context.Context) { headerBaseInfo := GetHeaderBaseInfo(ctx) body, _ := io.ReadAll(ctx.Request().Body) var toPayRequest ToPayRequest json.Unmarshal(body, &toPayRequest) var userInfo *models.User database.Instance().Model(&models.User{}).Where("id = ?", headerBaseInfo.Uid).Find(&userInfo) var rechargeInfo *models.RechargeInfo database.Instance().Model(&models.RechargeInfo{}).Where("id = ?", toPayRequest.PayId).Find(&rechargeInfo) svc := jsapi.JsapiApiService{Client: utils.GetWxPayService()} price, _ := strconv.ParseFloat(rechargeInfo.Price, 64) orderId := NextId.Generate().String() // 得到prepay_id,以及调起支付所需的参数和签名 resp, _, err := svc.PrepayWithRequestPayment(ctx, jsapi.PrepayRequest{ Appid: core.String(utils.CONFIG.AppId), Mchid: core.String(utils.CONFIG.MchId), Description: core.String(rechargeInfo.Name), OutTradeNo: core.String(orderId), NotifyUrl: core.String(web.CONFIG.System.Domain + "/pet-house/pay/payNotify"), Amount: &jsapi.Amount{ Total: core.Int64(int64(price * 100.0)), }, Payer: &jsapi.Payer{ Openid: core.String(userInfo.OpenId), }, }, ) if err != nil { PayError.DefFail(ctx, toPayRequest, nil) return } payOrder := models.PayOrder{ OrderId: orderId, OrderName: rechargeInfo.Name, OrderPrice: rechargeInfo.Price, PayId: "", } database.Instance().Model(&models.PayOrder{}).Create(&payOrder) Success(ctx, toPayRequest, ToPayResponse{Content: resp, PayOrderId: orderId, PayType: 0}) }) }} } // 充值通知 func (p DefParty) payNotify() web_iris.Party { return web_iris.Party{Prefix: p.Prefix, PartyFunc: func(index iris.Party) { index.Post(PayBase+"/payNotify", func(ctx *context.Context) { var cert = `-----BEGIN CERTIFICATE----- MIIEKzCCAxOgAwIBAgIUfaIQgSDkxBhTe888BhqrEJzPiKkwDQYJKoZIhvcNAQEL BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg Q0EwHhcNMjQwOTEwMDc0NDUzWhcNMjkwOTA5MDc0NDUzWjCBhDETMBEGA1UEAwwK MTY4MjYzNzYxMjEbMBkGA1UECgwS5b6u5L+h5ZWG5oi357O757ufMTAwLgYDVQQL DCflroHms6LlrqDmiqTlrrblrqDnianmnI3liqHmnInpmZDlhazlj7gxCzAJBgNV BAYTAkNOMREwDwYDVQQHDAhTaGVuWmhlbjCCASIwDQYJKoZIhvcNAQEBBQADggEP ADCCAQoCggEBALoZ/ZK7BdW1DKCzsqQnS9ElkWhv8Df4JidAupVoaaGa0Iz8cukj 8JgqzzmOA0fSief3z0OvOvmXQujNLXka38Y+8KB/K/BnqRYVGSvLWKwfdalSS+ca JZUNLVQVv1zDrPVPb3JmoJMADPIq2sOfLqjmWPIxRcpa7sPeall5fMx07aVrpi2O v1ueRUphIYNT6aV6KnPrRf/lcRwZxE0+l30l45sDNrd7l5tUsnJq/1OLP+kgidkp ic6W1f3jrHZTwYakgShEUgkRsHeUjIQ0ZRYSsD4Mxn/bqdAxDSDWB6aWGwMrY1ku bsPkE/AcXTpgpaC+2kQVhaYrWuly0w0T1jMCAwEAAaOBuTCBtjAJBgNVHRMEAjAA MAsGA1UdDwQEAwID+DCBmwYDVR0fBIGTMIGQMIGNoIGKoIGHhoGEaHR0cDovL2V2 Y2EuaXRydXMuY29tLmNuL3B1YmxpYy9pdHJ1c2NybD9DQT0xQkQ0MjIwRTUwREJD MDRCMDZBRDM5NzU0OTg0NkMwMUMzRThFQkQyJnNnPUhBQ0M0NzFCNjU0MjJFMTJC MjdBOUQzM0E4N0FEMUNERjU5MjZFMTQwMzcxMA0GCSqGSIb3DQEBCwUAA4IBAQC7 Zgux40pvNohZx721rygjo0yUbx54docNS79Eh5J9ukSKMf0cTsORlAnrsCbSYnIo MiqdPqccRYJUefUUuhOrKtuzaka4T+VSiaDTnZ07kB3I8xlvZtW32jHOstVPrJsB fEg53sl5sfWHY+OfuEhwOkoH3v/Fs4nH4hQxjO8RW9tNXqLvTrl1JeEwV4bMZxCA wCvoMPqn19WBFsaFb0kXF46oGeH5kId6oon0RCi+vXb8nSZ4oPXIJwxi9u/uy+wD rVlHohjCK+bRbxGgaIcX5uMPK/M73mzuuLFCbIWN4CLz9yyZGKxNJBq4YuGe+jWa gh1GheVuvTdcJ4ZGDhQT -----END CERTIFICATE-----` wechatPayCert, err1 := utils2.LoadCertificate(cert) if err1 != nil { panic(err1) } // 2. 使用本地管理的微信支付平台证书获取微信支付平台证书访问器 certificateVisitor := core.NewCertificateMapWithList([]*x509.Certificate{wechatPayCert}) // 3. 使用apiv3 key、证书访问器初始化 `notify.Handler` handler := notify.NewNotifyHandler(utils.CONFIG.MchAPIv3Key, verifiers.NewSHA256WithRSAVerifier(certificateVisitor)) transaction := new(payments.Transaction) notifyReq, err := handler.ParseNotifyRequest(ctx, ctx.Request(), transaction) zap_server.ZAPLOG.Info("payNotify", zap.Any("MchAPIv3Key", utils.CONFIG.MchAPIv3Key), zap.Any("notifyReq", notifyReq), zap.Any("transaction", transaction), zap.Any("err", err)) var payOrder *models.PayOrder database.Instance().Model(&models.PayOrder{}).Where("order_id = ?", transaction.OutTradeNo).Find(&payOrder) payOrder.Status = 1 database.Instance().Model(&models.PayOrder{}).Updates(&payOrder) }) }} }