123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- 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
- }
- }
|