wechatpay-apiv3 / wechatpay-apache-httpclient

微信支付 APIv3 Apache HttpClient装饰器(decorator)
https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pages/index.shtml
Apache License 2.0
665 stars 249 forks source link

使用了定时更新平台证书功能,并且使用Verifier在调用接口时获取平台证书。但是怎么获取平台证书序列号以满足接口对header里的Wechatpay-Serial的需求呢 #176

Closed Daxiangshen closed 1 year ago

Daxiangshen commented 1 year ago

使用了定时更新平台证书功能,并且使用Verifier在调用接口时获取平台证书。但是怎么获取平台证书序列号以满足接口对header里的Wechatpay-Serial的需求呢

xy-peng commented 1 year ago
// 建议从Verifier中获得微信支付平台证书,或使用预先下载到本地的平台证书文件中
X509Certificate certificate = verifier.getValidCertificate();
try {
  String ciphertext = RsaCryptoUtil.encryptOAEP(text, certificate);
} catch (IllegalBlockSizeException e) {
  e.printStackTrace();
}

这样拿到证书,然后从 X509Certificate 获取。

Daxiangshen commented 1 year ago

可是为什么我用certificate.getSerialNumber()获取到的序列号和正确的序列号不一样

Daxiangshen commented 1 year ago

也就是说我将certificate.getSerialNumber()获取到的序列号传入header之后。微信API提示我序列号错误。我用工具获取到的序列号和这个序列号不一样,但是可以通过微信的API接口

Daxiangshen commented 1 year ago
// 建议从Verifier中获得微信支付平台证书,或使用预先下载到本地的平台证书文件中
X509Certificate certificate = verifier.getValidCertificate();
try {
  String ciphertext = RsaCryptoUtil.encryptOAEP(text, certificate);
} catch (IllegalBlockSizeException e) {
  e.printStackTrace();
}

这样拿到证书,然后从 X509Certificate 获取。

可是为什么我用certificate.getSerialNumber()获取到的序列号和正确的序列号不一样 也就是说我将certificate.getSerialNumber()获取到的序列号传入header之后。微信API提示我序列号错误。我用工具获取到的序列号和这个序列号不一样,但是可以通过微信的API接口

xy-peng commented 1 year ago

certificate.getSerialNumber().toString(HEX).toUpperCase(),是这样获取的吗?

Daxiangshen commented 1 year ago

certificate.getSerialNumber().toString(HEX).toUpperCase(),是这样获取的吗?

HEX类是哪个包下面呢?

Daxiangshen commented 1 year ago

certificate.getSerialNumber().toString(HEX).toUpperCase(),是这样获取的吗?

我是直接获取的certificate.getSerialNumber() 后面没有.toString(HEX).toUpperCase() 这个HEX指的是?

xy-peng commented 1 year ago

就是16,表示16进制。证书序列号是16进制的字符串,getSerialNumber()得到的是 BigInteger 呀,需要转换一下。

Daxiangshen commented 1 year ago

已解决。多谢