smartwalle / alipay

支付宝 AliPay SDK for Go, 集成简单,功能完善,持续更新,支持公钥证书和普通公钥进行签名和验签,支持文件上传和接口内容加密。
MIT License
1.87k stars 425 forks source link

调用支付宝支付查询接口TradeQuery #202

Closed hujiahuan closed 5 months ago

hujiahuan commented 5 months ago

在调用支付宝查询接口的时候, 设置了正确的接口加密内容密钥 SetEncryptKey("SEopbMx8+owerwW098oGEg==") 返回结果还是报错 {"error": "crypto/rsa: verification error"} 使用的支付宝公钥模式,不是证书模式.收款没有问题.就是无法查询订单信息.

hujiahuan commented 5 months ago

在支付宝一侧,已经取消了,接口内容加密,依然报这个错

smartwalle commented 5 months ago

签名验证的问题,确认验证签名的证书都是正常的

hujiahuan commented 5 months ago

签名验证的问题,确认验证签名的证书都是正常的

我使用的是公钥模式初始化的支付宝.配置了app ID, 应用私钥和支付宝公钥. 收款是没问题的.证明配置的是对的应该.

没有配置证书, 你说的验证签名证书,是在哪里配置? 是什么证书.

mingzaily commented 5 months ago

提供个我的代码给你借鉴,也是只开了公钥和私钥

func (i *Instance) loadAlipayClient(_ context.Context) (*alipay.Client, error) {
    // 加载应用私钥
    appPrivateKey, err := fs.ReadFile("crt/alipay/app_private_key.txt")
    if err != nil {
        return nil, fmt.Errorf("应用私钥加载失败 Err=%v", err)
    }

    // 加载支付宝公钥
    alipayPublicKey, err := fs.ReadFile("crt/alipay/alipay_public_key.txt")
    if err != nil {
        return nil, fmt.Errorf("支付宝公钥加载失败 Err=%v", err)
    }

    // HTTP客户端
    httpClient := &http.Client{
        Timeout: 30 * time.Second,
        Transport: otelhttp.NewTransport(
            http.DefaultTransport,
            otelhttp.WithSpanNameFormatter(func(operation string, r *http.Request) string {
                return r.Method + " " + r.URL.Path
            }),
        ),
    }

    // 初始化支付宝客户端
    client, err := alipay.New(i.cfg.Alipay.AppId, string(appPrivateKey), true, alipay.WithHTTPClient(httpClient))
    if err != nil {
        return nil, fmt.Errorf("支付宝客户端初始化失败 Err=%v", err)
    }
    err = client.LoadAliPayPublicKey(string(alipayPublicKey))
    if err != nil {
        return nil, fmt.Errorf("支付宝客户端加载公钥失败 Err=%v", err)
    }

    log.Printf("[INFO] 支付宝客户端 初始化成功")

    return client, nil
}
hujiahuan commented 5 months ago

提供个我的代码给你借鉴,也是只开了公钥和私钥

func (i *Instance) loadAlipayClient(_ context.Context) (*alipay.Client, error) {
  // 加载应用私钥
  appPrivateKey, err := fs.ReadFile("crt/alipay/app_private_key.txt")
  if err != nil {
      return nil, fmt.Errorf("应用私钥加载失败 Err=%v", err)
  }

  // 加载支付宝公钥
  alipayPublicKey, err := fs.ReadFile("crt/alipay/alipay_public_key.txt")
  if err != nil {
      return nil, fmt.Errorf("支付宝公钥加载失败 Err=%v", err)
  }

  // HTTP客户端
  httpClient := &http.Client{
      Timeout: 30 * time.Second,
      Transport: otelhttp.NewTransport(
          http.DefaultTransport,
          otelhttp.WithSpanNameFormatter(func(operation string, r *http.Request) string {
              return r.Method + " " + r.URL.Path
          }),
      ),
  }

  // 初始化支付宝客户端
  client, err := alipay.New(i.cfg.Alipay.AppId, string(appPrivateKey), true, alipay.WithHTTPClient(httpClient))
  if err != nil {
      return nil, fmt.Errorf("支付宝客户端初始化失败 Err=%v", err)
  }
  err = client.LoadAliPayPublicKey(string(alipayPublicKey))
  if err != nil {
      return nil, fmt.Errorf("支付宝客户端加载公钥失败 Err=%v", err)
  }

  log.Printf("[INFO] 支付宝客户端 初始化成功")

  return client, nil
}

非常感谢您的回答. 现在的问题是初始化支付宝没有问题,可以收款. 问题是不能使用查询接口去查询交易信息.退款接口也无法使用.报的都是同样的错 {"error": "crypto/rsa: verification error"}

mingzaily commented 5 months ago

提供个我的代码给你借鉴,也是只开了公钥和私钥

func (i *Instance) loadAlipayClient(_ context.Context) (*alipay.Client, error) {
    // 加载应用私钥
    appPrivateKey, err := fs.ReadFile("crt/alipay/app_private_key.txt")
    if err != nil {
        return nil, fmt.Errorf("应用私钥加载失败 Err=%v", err)
    }

    // 加载支付宝公钥
    alipayPublicKey, err := fs.ReadFile("crt/alipay/alipay_public_key.txt")
    if err != nil {
        return nil, fmt.Errorf("支付宝公钥加载失败 Err=%v", err)
    }

    // HTTP客户端
    httpClient := &http.Client{
        Timeout: 30 * time.Second,
        Transport: otelhttp.NewTransport(
            http.DefaultTransport,
            otelhttp.WithSpanNameFormatter(func(operation string, r *http.Request) string {
                return r.Method + " " + r.URL.Path
            }),
        ),
    }

    // 初始化支付宝客户端
    client, err := alipay.New(i.cfg.Alipay.AppId, string(appPrivateKey), true, alipay.WithHTTPClient(httpClient))
    if err != nil {
        return nil, fmt.Errorf("支付宝客户端初始化失败 Err=%v", err)
    }
    err = client.LoadAliPayPublicKey(string(alipayPublicKey))
    if err != nil {
        return nil, fmt.Errorf("支付宝客户端加载公钥失败 Err=%v", err)
    }

    log.Printf("[INFO] 支付宝客户端 初始化成功")

    return client, nil
}

非常感谢您的回答. 现在的问题是初始化支付宝没有问题,可以收款. 问题是不能使用查询接口去查询交易信息.退款接口也无法使用.报的都是同样的错 {"error": "crypto/rsa: verification error"}

那就说明初始化应该是有问题的呀,公私钥是不是弄反了诸如此类的,我这边都是没问题的,查询接口、退款接口都是要请求支付宝后台的,alipay.TradeAppPay 调用成功只是本地生成的,并没有请求

hujiahuan commented 5 months ago

提供个我的代码给你借鉴,也是只开了公钥和私钥

func (i *Instance) loadAlipayClient(_ context.Context) (*alipay.Client, error) {
  // 加载应用私钥
  appPrivateKey, err := fs.ReadFile("crt/alipay/app_private_key.txt")
  if err != nil {
      return nil, fmt.Errorf("应用私钥加载失败 Err=%v", err)
  }

  // 加载支付宝公钥
  alipayPublicKey, err := fs.ReadFile("crt/alipay/alipay_public_key.txt")
  if err != nil {
      return nil, fmt.Errorf("支付宝公钥加载失败 Err=%v", err)
  }

  // HTTP客户端
  httpClient := &http.Client{
      Timeout: 30 * time.Second,
      Transport: otelhttp.NewTransport(
          http.DefaultTransport,
          otelhttp.WithSpanNameFormatter(func(operation string, r *http.Request) string {
              return r.Method + " " + r.URL.Path
          }),
      ),
  }

  // 初始化支付宝客户端
  client, err := alipay.New(i.cfg.Alipay.AppId, string(appPrivateKey), true, alipay.WithHTTPClient(httpClient))
  if err != nil {
      return nil, fmt.Errorf("支付宝客户端初始化失败 Err=%v", err)
  }
  err = client.LoadAliPayPublicKey(string(alipayPublicKey))
  if err != nil {
      return nil, fmt.Errorf("支付宝客户端加载公钥失败 Err=%v", err)
  }

  log.Printf("[INFO] 支付宝客户端 初始化成功")

  return client, nil
}

非常感谢您的回答. 现在的问题是初始化支付宝没有问题,可以收款. 问题是不能使用查询接口去查询交易信息.退款接口也无法使用.报的都是同样的错 {"error": "crypto/rsa: verification error"}

那就说明初始化应该是有问题的呀,公私钥是不是弄反了诸如此类的,我这边都是没问题的,查询接口、退款接口都是要请求支付宝后台的,alipay.TradeAppPay 调用成功只是本地生成的,并没有请求

公私钥反了,应该不会初始化成功. 是不是咱俩用的版本不同? 我这个版本有bug? 我用是比较新的版本上个月clone的

mingzaily commented 5 months ago

就是最新版呀,v3.2.21

hujiahuan commented 5 months ago

就是最新版呀,v3.2.21

那就奇怪了,你的查询接口代码可以看一下嘛

hujiahuan commented 5 months ago

辛苦有时间的时候帮忙看一下,是哪里的问题.查询和退款接口都不能用,只有付款接口是正常的.验证签名的证书在哪里获取如何配置.非常感谢

苯猪 @.***

 

------------------ 原始邮件 ------------------ 发件人: "smartwalle/alipay" @.>; 发送时间: 2024年5月22日(星期三) 上午8:28 @.>; @.**@.>; 主题: Re: [smartwalle/alipay] 调用支付宝支付查询接口TradeQuery (Issue #202)

签名验证的问题,确认验证签名的证书都是正常的

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you authored the thread.Message ID: @.***>

mingzaily commented 5 months ago

结合上文给你的client代码

func queryAlipayPay(ctx context.Context, item *model.UserPayInfo) (payStatus uint16, err error) {
    // 获取支付宝客户端
    client := common.Pay.GetAlipayClient(ctx)
    // 查询订单
    body := alipay.TradeQuery{
        OutTradeNo: item.TradeNo,
    }
    query, err := client.TradeQuery(ctx, body)
    common.Logger.Infof(ctx, "支付宝支付查询结果: %v", tool.JsonMarshalString(query))
    if err != nil {
        common.Logger.Error(ctx, fmt.Sprintf("支付宝支付查询接口失败 Err=%v", err))
        return 0, errcode.ThirdPartError.ReplaceMessage("支付宝支付查询接口失败")
    }
    if query.IsFailure() && query.SubCode == "ACQ.TRADE_NOT_EXIST" { // 订单不存在,支付宝业务返回码为ACQ.TRADE_NOT_EXIST
        return consts.AlipayOrderStateToStatus("TRADE_NOT_EXIST"), nil
    }

    return consts.AlipayOrderStateToStatus(string(query.TradeStatus)), nil
}
smartwalle commented 5 months ago

确定你的支付宝公钥是正确的,是从支付宝开放平台获取的,不是你自己生成的。

hujiahuan commented 5 months ago

是公钥问题.重新去支付宝开放平台复制粘贴了一遍可以了.非常感谢二位的耐心解答.🙏