商户 API 证书是开发者申请的,申请后将获得公钥、私钥。私钥是用来签名的,有两个地方需要用它来签名:
微信支付收到商户的请求(来自服务端的请求或前端的请求)后,会用公钥计算一个签名,并和商户用私钥计算的签名对比,如果两个签名一样,就说明请求是合法的。
商户 API 证书中的私钥其实还有一个用途:调用微信支付 API v2 的部分接口时,也需要用它对请求参数进行签名,但目前微信支付 API 大部份都是 v3 接口了,所以这个用途频率较低。
前面的商户 API 证书是商户自己申请的,而这个平台证书顾名思义,是微信支付申请的,会自动分配给商户。
另外,商户申请的 API 证书有公钥、私钥,而平台证书没有私钥,只有公钥。私钥是微信支付平台保存的,不会公开给商户,就好象商户 API 证书中的私钥也只有商户知道,微信支付只能拿到公钥部分。
证书常被视为公钥的载体,因为它是分发和验证公钥的标准方式,所以有时候证书和公钥这两个词会混着用,令人费解。按照官方的说法,平台证书包含了微信支付平台的身份标识和公钥信息。
我们向微信支付发起 API 请求,对方会用我们的公钥验证请求的合法性。反过来,微信支付向我们返回的数据,我们就要用平台证书中的公钥对数据进行验证。
平台证书无法在微信支付的网页后台下载,需要通过下载平台证书接口获取。
按照官方的说法,调用 APIv3 的下载平台证书接口、处理回调通知中报文时,要通过该密钥来解密信息。
所以,前面的商户 API 证书、平台证书都是用来计算签名的,并通过签名的对比确认请求的合法性,而 APIv3 密钥不是用来计算签名的,而是用来解密的,解密微信支付返回的数据。
没错,微信向我们返回数据时,不仅计算了签名,还加密了数据。我们应该首先通过平台证书计算签名验证微信的合法性,然后使用 APIv3 密钥解密返回的数据。
商户 APIv2 密钥和 APIv3 密钥的作用不同,而是和商户 API 证书的作用相同,都是用来对请求进行签名的。
商户 API 证书属于非对称签名技术,商户 APIv2 密钥属于对称签名技术。非对称更安全,所以 APIv3 一律使用非对称,部分对安全性要求较高的 APIv2 接口也使用非对称(即商户 API 证书)进行签名,前面也提了。
如果你只使用 APIv3 接口,则不需要设置商户 APIv2 密钥,只需设置商户 API 证书。