package wxpay import ( "context" "crypto/rsa" "github.com/gogf/gf/frame/g" "github.com/gogf/gf/net/ghttp" "github.com/wechatpay-apiv3/wechatpay-go/core" "github.com/wechatpay-apiv3/wechatpay-go/core/option" "github.com/wechatpay-apiv3/wechatpay-go/services/payments/jsapi" wxpayUtils "github.com/wechatpay-apiv3/wechatpay-go/utils" "log" "youngmini_server/app/utils" ) var service = new(wxPayService) type wxPayService struct { } // 给结构体绑定一个方法,相当于类方法, func (s *wxPayService) WxPayRequest(r *ghttp.Request, req WxPayRequestData) (WxPayResponseData, error) { openId, err := utils.SessionTalentInfo.GetOpenIdFromSession(r) if err != nil { log.Fatalf("get WxOpenId error:%s", err) } appID := g.Config().GetString("miniapp.appid") mchID := g.Config().GetString("miniapp.mchid") mchCertificateSerialNumber := g.Config().GetString("miniapp.mchCertificateSerialNumber") mchAPIv3Key := g.Config().GetString("miniapp.mchAPIv3Key") // 使用 utils 提供的函数从本地文件中加载商户私钥,商户私钥会用来生成请求的签名 mchPrivateKey, err := wxpayUtils.LoadPrivateKeyWithPath("./apiclient_key.pem") if err != nil { log.Fatalf("load merchant private key error:%s", err) } ctx := context.Background() // 使用商户私钥等初始化 client,并使它具有自动定时获取微信支付平台证书的能力 opts := []core.ClientOption{ option.WithWechatPayAutoAuthCipher(mchID, mchCertificateSerialNumber, mchPrivateKey, mchAPIv3Key), } client, err := core.NewClient(ctx, opts...) if err != nil { log.Fatalf("new wechat pay client err:%s", err) } svc := jsapi.JsapiApiService{Client: client} // 得到prepay_id,以及调起支付所需的参数和签名 var tradeId = utils.GetUuid.GetRandomString(32) resp, result, err := svc.PrepayWithRequestPayment(ctx, jsapi.PrepayRequest{ Appid: core.String(appID), Mchid: core.String(mchID), Description: core.String(req.Description), OutTradeNo: core.String(tradeId), NotifyUrl: core.String("https://www.weixin.qq.com/wxpay/pay.php"), Amount: &jsapi.Amount{ Total: core.Int64(req.Amount), }, Payer: &jsapi.Payer{ Openid: core.String(openId), }, }, ) if err == nil { log.Println(resp) log.Println(result) var packageStr = "prepay_id=" + *resp.PrepayId var parts []string parts = append(parts, appID) parts = append(parts, *resp.TimeStamp) parts = append(parts, tradeId) parts = append(parts, packageStr) sign, err := getSign(parts, mchPrivateKey) if err == nil { var res = WxPayResponseData{ Package: packageStr, TimeStamp: *resp.TimeStamp, NonceStr: tradeId, PaySign: sign, } return res, nil } else { log.Println(err) } } else { log.Println(err) } return WxPayResponseData{}, err } func getSign(parts []string, privateKey *rsa.PrivateKey) (string, error) { var str string for i := range parts { str += parts[i] + "\n" } sign, err := wxpayUtils.SignSHA256WithRSA(str, privateKey) if err != nil { log.Println(err) return "", err } else { log.Println(sign) return sign, nil } }