Ver Fonte

fix: 微信支付认证类型修正为WECHATPAY2-SHA256-RSA2048

- 公钥模式新商户的 APIv3 网关只认 WECHATPAY2-SHA256-RSA2048,
  旧文档的 SHA256withRSA 会被拒绝并报"认证类型不正确"(实测踩坑)
- nonce 改为 32 位大写十六进制,与官方 SDK 行为一致
- 实测:下单/查单通过认证层,直达微信业务侧(剩余为商户开户确认事项)
lq há 4 horas atrás
pai
commit
92b746ab5a
1 ficheiros alterados com 5 adições e 2 exclusões
  1. 5 2
      internal/modules/payment/channel/wechat.go

+ 5 - 2
internal/modules/payment/channel/wechat.go

@@ -9,6 +9,7 @@ import (
 	"crypto/sha256"
 	"crypto/x509"
 	"encoding/base64"
+	"encoding/hex"
 	"encoding/json"
 	"encoding/pem"
 	"errors"
@@ -197,7 +198,9 @@ func (w *WechatChannel) authorizationHeader(method, path string, body []byte) (s
 	if err != nil {
 		return "", fmt.Errorf("微信支付签名失败: %w", err)
 	}
-	return fmt.Sprintf(`WECHATPAY2-SHA256withRSA mchid="%s",nonce_str="%s",signature="%s",timestamp="%s",serial_no="%s"`,
+	// 注意:新商户(微信支付公钥模式)网关要求的认证类型是 WECHATPAY2-SHA256-RSA2048,
+	// 旧文档中的 WECHATPAY2-SHA256withRSA 会被拒绝并报"认证类型不正确"。
+	return fmt.Sprintf(`WECHATPAY2-SHA256-RSA2048 mchid="%s",nonce_str="%s",signature="%s",timestamp="%s",serial_no="%s"`,
 		w.mchID, nonce, base64.StdEncoding.EncodeToString(signature), timestamp, w.serialNo), nil
 }
 
@@ -206,7 +209,7 @@ func randomNonce() (string, error) {
 	if _, err := rand.Read(buf); err != nil {
 		return "", err
 	}
-	return base64.RawURLEncoding.EncodeToString(buf), nil
+	return strings.ToUpper(hex.EncodeToString(buf)), nil
 }
 
 // yuanToFen 金额(元)转分,超出两位小数视为非法。