关于微信证书
微信支付开发有两份证书。
♥ 商户证书:商户平台证书私钥可以对请求进行签名,微信服务器进行验签可以验证请求者的身份和合法性;
♥ 微信平台证书:是由微信服务器使用私钥对响应签名之后,我们自己的服务器使用平台证书对响应进行验签,从而可以验证响应的合法性。
获取平台证书
微信官网有对应的API可以获取平台证书,请求之前也需要进行相应的签名,响应的数据大致如下。
若有新旧证书更替,则可能不止一条证书数据存在,且ciphertext证书字段为密文传输,需要对其进行解密才能正常使用。
解密使用的对称密钥是在微信平台(微信平台传送门)进行设置。【商户平台】->【API安全】->设置API v3密钥(注意不是API密钥)
{
"data": [
{
"serial_no": "5157F09EFDC096DE15EBE81A47057A7232F1B8E1",
"effective_time ": "2018-06-08T10:34:56+08:00",
"expire_time ": "2018-12-08T10:34:56+08:00",
"encrypt_certificate": {
"algorithm": "AEAD_AES_256_GCM",
"nonce": "61f9c719728a",
"associated_data": "certificate",
"ciphertext": "sRvt… "
}
},
{
"serial_no": "50062CE505775F070CAB06E697F1BBD1AD4F4D87",
"effective_time ": "2018-12-07T10:34:56+08:00",
"expire_time ": "2020-12-07T10:34:56+08:00",
"encrypt_certificate": {
"algorithm": "AEAD_AES_256_GCM",
"nonce": "35f9c719727b",
"associated_data": "certificate",
"ciphertext": "aBvt… "
}
}
]
}
解密响应体,解密ciphertext证书字段代码。
/**
* 使用微信平台证书对响应验签,和应答签名比较
* @param wechatpaySerial response.headers['Wechatpay-Serial'] 当前使用的微信平台证书序列号
* @param wechatpaySignature response.headers['Wechatpay-Signature'] 微信平台签名
* @param wechatpayTimestamp response.headers['Wechatpay-Timestamp'] 微信服务器时间戳
* @param wechatpayNonce response.headers['Wechatpay-Nonce'] 微信服务器提供的随机串
* @param body response.headers['Wechatpay-body'] 微信服务器的响应体
* @return boolean
* @throws SignatureE