---
url: "https://pay.weixin.qq.com/doc/v3/partner/4012365875.md"
title: "报错：状态码401或者“错误的签名，验签失败”或者“签名错误，请检查后再试”"
doc_id: 4012365875
---

>更新时间：2024.12.12

建议开发者先参考[如何计算签名](https://pay.weixin.qq.com/doc/v3/merchant/4012365342.md#1.1-%E8%AF%B7%E6%B1%82%E5%BE%AE%E4%BF%A1%E6%94%AF%E4%BB%98%E6%8E%A5%E5%8F%A3)和[如何验证签名](https://pay.weixin.qq.com/doc/v3/merchant/4012365342.md#2.1-%E6%8E%A5%E6%94%B6%E5%BE%AE%E4%BF%A1%E6%94%AF%E4%BB%98%E5%BA%94%E7%AD%94)系列文档，一步步按照示例操作，熟悉签名计算过程，解决签名问题。

如果出现以上报错则说明是签名计算错误，请按照以下步骤排查：

1、如果你是服务商，则签名时需要用服务商的商户API私钥而不是子商户的API私钥

2、计算签名的时候用的是商户API私钥（apiclient\_key.pem）文件，你可以通过文件名做初步的甄别，请确认你使用的是正确的文件，常见的错误使用方式有以下几种：

（1）使用了商户API证书（apiclient\_cert.pem）文件而不是商户API私钥（apiclient\_key.pem），这两个文件的名字非常相似，请注意不要搞混

（2）使用了平台证书（wechatpay.pem）的公钥文件，而不是商户API私钥（apiclient\_key.pem）

请确认你是参考了[如何下载商户API证书](https://kf.qq.com/faq/161222NneAJf161222U7fARv.html)，获取了商户API证书（apiclient\_cert.pem）和商户API私钥（apiclient\_key.pem）

3、计算签名时，你需要用到商户API私钥（apiclient\_key.pem）文件去计算签名串，同时你需要通过HTTP Authorization头来传递签名，Authorization头部会涉及商户号（mchid）、商户API证书的序列号（serial\_no）请确认商户API私钥（apiclient\_key.pem）、商户号（mchid）和商户API证书（apiclient\_cert.pem）的序列号（serial\_no）是一一对应的关系，请按照以下步骤排查

举例说明：

```
Authorization: WECHATPAY2-SHA256-RSA2048 mchid="1900007291",nonce_str="593BEC0C930BF1AFEB40B4A08C8FB242",signature="gZGkLF3mVIHY72hE1cFSrbEOKr5O7N2jYZAt5VSBpZpHn84HWylnljJHGGlMAtFt4AUP/gso9MyQ95GNb9h9DYI3RmwQe2kvcysVKoYvzgst217AzZYYwHaUnanaEFEuKD33L84JPe/HX1CLs4VjcE16aZfORqHanlgPivirKg/SysHWtlHVU5zYiWsfXU3ylgWXqjj4hHRgKiJ1KbPzMqS0izDfnEBfTWp7GQddnxVOcbCGfk6jQECNu5GX9hFoxL2oCv5iHUg5Vka0/rKs9wjlRLmDPyObMpJUYQ2/a7HcNnzFxxC+JJa+PAjLWT/nkEMdTMotHFwQN05TWB0M9A==%",timestamp="1554208460",serial_no="1DDE55AD98ED71D6EDD4A4A16996DE7B47773A8C"
```

（1）确认你使用的商户API证书（apiclient\_cert.pem）和商户API证书序列号是一致的，可以用openssl命令行工具查看商户API证书序列号

```
$ openssl x509 -in apiclient_cert.pem -noout -serial
```

你会得到商户API证书序列号，确认你得到的序列号和Authorization头部传的serial\_no字段是一致的

```
serial=1DDE55AD98ED71D6EDD4A4A16996DE7B47773A8C
```

（2）确认你的商户号（mchid）和商户API证书（apiclient\_cert.pem）也是匹配的，可以用openssl命令行工具查看证书对应的商户号

```
openssl x509 -in apiclient_cert.pem -noout -text | grep -o 'CN=[0-9]*'  | sed 's/CN=//'
```

你会得到商户号（mchid），确认你得到的序列号和Authorization头部传的mchid字段是一致的

```
1900007291
```

4、HTTP Authorization头里传递的随机字符串（nonce\_str）和时间戳（timestamp）字段和你计算签名时的传的值不一致

举例说明：如下图，计算签名是用的时间戳和随机字符串必须和HTTP Authorization头里传递的随机字符串（nonce\_str）和时间戳（timestamp）保持一致

![](https://gtimg.wechatpay.cn/resource/xres/mmpaydoc/static/img/e144c6a3944aa7d19621134268390445.png)

![](https://gtimg.wechatpay.cn/resource/xres/mmpaydoc/static/img/b8b28a916de9408f0cb095ec84f3d851.png)

5、签名串格式问题

![](https://gtimg.wechatpay.cn/resource/xres/mmpaydoc/static/img/2f380094543904c5ca0d3b58bbffa722.png)

（1）计算签名时没有正确处理\\n,格式不正确,签名示例里\\n是换行符而不是一个字符，请确认计算签名时有正确处理\\n

（2）第一行的请求方法必须要用大写字母，比如GET，POST，PUT而不能是小写字母的get，post，put

（3）生成请求签名共5行，每一行都以换行符结尾，如果是get请求请注意第五行是空行加换行符，请不要遗漏换行符

（4）请确认第二行的url正常替换成你的要请求的接口的url，而不是文档示例里的URL，且不带域名格式的，一定是/v3/certificates格式，而不是https://api.mch.weixin.qq.com/v3/certificates格式

（5）请检查你的签名串里没有多余的/，比如不要出现//v3/certificates

6、以上确认都无问题，依然存在签名报错问题，则很有可能是因为代码处理上做了转义，你可以使用你的代码并用示例里的密钥和示例请求计算一遍签名值，如果代码计算出来的签名值和示例里的不一致，则请检查你的代码的转义问题

可以参考[操作指引-如何生成请求签名](https://pay.weixin.qq.com/doc/v3/merchant/4012365334.md)和[操作指引-如何验证签名](https://pay.weixin.qq.com/doc/v3/merchant/4013053249.md)系列文档