常见问题

更新时间:2024.11.29
||

我们在【商户平台】->【自助服务】中设立了API证书及密钥 专区,包括了商户证书如何升级,申请,下载等问题的解答。下面是商户技术人员可能关心的一些问题。

Q:什么是私钥?什么是证书?

A:数字签名通常定义了两种运算: 签名和验签。发送者用自己的私钥对消息的哈希值进行签名,接收者用对方的公钥进行验签。因此,在使用数字签名时,需要通信的双方都要事先生成公钥、私钥,并且完成双方的公钥交换。其中,私钥是只能由拥有者使用的不公开密钥,公钥是可以公开的密钥。

由于公钥本身并不含有拥有者的身份信息,使用时无法确认它是真实有效的。所以需要证书认证机构(简称 CA)在核实公钥拥有者的信息后,将公钥拥有者的身份信息(如商户号、公司名称等),公钥、签发者信息、有效期以及扩展信息等进行签名,制作成“证书”。

Q:什么是微信支付平台证书,跟商户API证书有什么差别?

A:两者均为RSA证书,具体区别如下:

 

微信支付平台证书

商户API证书

证书信息

包含微信支付平台标识、公钥信息

包含商户的商户号、公司名称、公私钥信息

获取方式

由微信支付自动生成,商户可通过调用下载平台证书接口或使用平台证书下载工具,获取全部有效期内的平台证书

在商户平台申请

使用场景

1、在全部v3接口中,微信支付给商户返回接口应答或回调通知时,用平台证书的私钥生成签名,商户收到返回后应当用平台证书的公钥来验签。
2、部分v3接口的请求字段涉及敏感信息,商户需要用平台证书的公钥对敏感信息加密。

1、在全部v3接口中,商户用API证书的私钥生成签名,微信支付用API证书的公钥验签
2、部分v2接口如退款、撤销、下载资金账单等需要携带API证书以验证商户信息。

Q:什么是证书序列号

A:每个证书都有一个由CA颁发的唯一编号,即证书序列号。

Q:如何查看平台证书序列号?

A:1、商户平台查看。获取路径:【商户平台】->【账户中心】->【API安全】->【平台证书】->【管理证书】

2、使用第三方的证书解析工具查看证书内容。
3、使用openssl命令行查看证书序列号。

1$ openssl x509 -in {证书文件路径} -noout -serial
2serial=7BACED71D6EDD4A4A16996DE7B46518CCA

Q:如何在程序中加载证书

A:推荐使用微信支付提供的SDK。你也可以查看下列编程语言的示例代码。

JAVA:

1/**
2 * 获取证书。
3 *
4 * @param filename 证书文件路径  (required)
5 * @return X509证书
6 */
7public static X509Certificate getCertificate(String filename) throws IOException {
8    InputStream fis = new FileInputStream(filename);
9    BufferedInputStream bis = new BufferedInputStream(fis);
10    try {
11        CertificateFactory cf = CertificateFactory.getInstance("X509");
12        X509Certificate cert = (X509Certificate) cf.generateCertificate(bis);
13        cert.checkValidity();
14        return cert;
15    } catch (CertificateExpiredException e) {
16        throw new RuntimeException("证书已过期", e);
17    } catch (CertificateNotYetValidException e) {
18        throw new RuntimeException("证书尚未生效", e);
19    } catch (CertificateException e) {
20        throw new RuntimeException("无效的证书文件", e);
21    } finally {
22        bis.close();
23    }
24}

PHP:

1/**
2* Read certificate from file
3*
4* @param string    $filepath     PEM encoded X.509 certificate file path
5* 
6* @return resource|bool  X.509 certificate resource identifier on success or FALSE on failure
7*/
8public static function getCertificate($filepath) {
9    return openssl_x509_read(file_get_contents($filepath));}

Q:为什么微信支付平台证书下载接口返回的证书需要加密?

A:主要是为了防御“中间人攻击”。

平台证书是商户认证微信支付身份的关键要素,因此要通过签名和加密等多重机制来保障商户获取到的微信支付平台证书没有被“中间人”篡改。商户在调用下载接口获取微信支付平台证书时,应进行以下四步操作,以保证证书的真实性:

  • 使用与平台共享的对称密钥,解密报文中的证书(必须)

  • 通过解密得到的证书,来验证报文的签名(必须)

  • 使用证书查看工具,核对证书的颁发者为Tenpay.com Root CA。详见如何区分API证书的类型?(强烈推荐)

  • 通过证书信任链验证微信支付平台证书(强烈推荐)

Q:如何通过证书信任链验证平台证书?

A:下面介绍如何使用openssl工具,通过证书信任链验证微信支付平台证书。

首先,从微信支付商户平台下载微信支付平台证书信任链 CertTrustChain.p7b ,并将它转换为pem证书格式。

1openssl pkcs7 -print_certs -in CertTrustChain.p7b -inform der -out CertTrustChain.pem

然后,-CAfile file指定受信任的证书,验证下载的微信支付平台证书

1openssl verify -verbose -CAfile ./CertTrustChain.pem ./WeChatPayPlatform.pem

Q:为什么报错“HTTP header缺少微信支付平台证书序列号(Wechatpay-Serial)”?

A:当调用接口有上传敏感信息字段时,商户需要使用平台证书的公钥加密敏感信息,所以要在HTTP请求头的wechatpay-serial字段中声明加密所用平台证书序列号。详见这里的说明。

Q:在商户平台的平台证书管理页面为什么没有启动灰度按钮?

A:参考以下几点排查:
1、需要超管或者安全联系人才可以看到证书详情;
2、需要有两份平台证书,且都在有效期内时,才会显示启动灰度按钮。 平台证书如果临过期且超过90天未曾使用,则不会生成新证书。详见平台证书自动化切换流程介绍

Q:在微信支付平台证书灰度切换期间进行下单操作时,系统报错提示:"Cannot found the serial(6AFA797DF4EBC38DD0119B26B3B7C2D4XXXXXXXX)'s configuration; which's from the response(header:Wechatpay-Serial); your's 2729667D831C9BAA47C49E471F5F2A28XXXXXXXX",这是什么原因?如何解决?​​

​​A:此报错原因是验签时使用了与当前接口要求不匹配的平台证书。

具体背景是:微信支付平台证书灰度切换期间,系统会同时存在新旧两份有效证书(旧证书逐步失效,新证书正式生效)。此时,下单接口返回的响应头Wechatpay-Serial字段会明确标注本次接口调用需使用的​​最新证书序列号​​。

解决方法是:商户需以该Wechatpay-Serial字段指定的序列号为准,从已获取的平台证书列表中匹配对应的最新证书完成验签操作,避免因误用旧证书导致验签失败。

Q:商户能否自助查询微信支付平台证书调用记录?

A:暂不支持商户自助查询,如需确认请联系在线技术支持

Q:可以重复使用平台证书下载工具下载平台证书吗?

A:可以。工具是用于获取已有的平台证书,可以多次下载并且不会改变证书内容。

Q:调用平台证书下载接口/使用sdk/使用平台证书下载工具,报错{"code":"RESOURCE_NOT_EXISTS","message":"无可用的平台证书,请在商户平台-API安全申请使用微信支付公钥。可查看指引https://pay.weixin.qq.com/doc/v3/merchant/4012153196"} ,什么原因?

A:是因为无可用的平台证书导致的报错,请参考指引接入微信支付公钥,如果有疑问,请联系在线技术支持

Q:调用下载平台证书接口报错:{"code":"NOT_ENOUGH";"message":"平台证书已过期失效,请联系微信支付技术支持。"},什么原因?

A:平台证书过期导致返回的证书列表为空,请参考指引接入微信支付公钥,如果有疑问,请联系在线技术支持

Q:平台证书的内容格式是什么样的?​

A:​平台证书以“-----BEGIN CERTIFICATE-----”开头,以“-----END CERTIFICATE-----”结尾,中间是Base64编码的证书内容,包含公钥、有效期、颁发机构等信息,用于验证微信支付应答和回调的签名合法性。

Q:微信支付平台证书在过期前多少天会自动生成新证书?

A:新证书的生成具体规则如下:

1、微信侧会在平台证书过期前210天自动生成新平台证书,此时可以在商户平台看到,但调用下载平台证书接口获取不到新证书。

2、从180天开始调用下载平台证书接口可以获取到全部有效期内的证书(包含旧证书和新证书)。

3、临过期且近90天未曾调用平台证书的则不会生成新证书。详见平台证书自动化切换流程介绍

Q:新申请的商户号能否从公钥模式切换回平台证书?

A:可以,如需切换请参考如何从微信支付公钥切换成平台证书。但请注意平台证书需要每5年更换一次,且更换期间需要兼容新旧两份平台证书,不能及时更换平台证书可能会影响商户业务,所以更建议用公钥方案。

Q:平台证书已经过期,为什么没有生成新平台证书?

A:临过期且超过90天未曾调用平台证书的就不会自动生成新平台证书。如果近期不使用v3接口的可以不用更换平台证书。后续如果使用建议接入微信支付公钥方案 。如果有特殊原因需要继续使用平台证书请联系微信支付在线技术支持

Q:生成新平台证书是否会影响现有的接口调用?

A:生成新平台证书且旧证书有效期在180天内时,商户可以获取到新旧两份证书,但微信支付返回签名时默认还是用旧证书的。有实现自动调下载证书接口的要注意兼容新旧两份证书,不然可能会因为验签用错证书影响商户业务。

Q:平台证书灰度100%后,显示旧证书下线中,什么时候下线完成?

A:灰度到100%后微信支付返回的签名就全部用新证书了。旧证书到期后自动下线,商户无需处理。

Q:没有技术人员如何更换平台证书?

A:更换证书需要超管和技术人员配合,请在证书到期前联系新的技术人员来更换证书;如果使用第三方系统的,请联系第三方系统的技术人员处理。

Q:用平台证书方案验签是否有参考的demo?

A:微信支付SDK支持证书和公钥两种方式验签,并且支持平台证书平滑切换能力,请参考SDK文档获取demo。

 

 

元宝AI
反馈
目录
置顶