背景
本喵参与新项目的开发,手上大概还兼顾负责维护5,6个老项目,关于这个支付项目就是其中一个,用的Spring MVC框架.当时开发的人早就离职了,应该是15年16年的项目.行吧,就这么运行着吧,基本也没需求,也没啥问题.
BUT,最近有一批子公司的银联证书到期了(之前也更新过证书,之前没问题,他们自己操作的),神奇的事情是,有些子公司自己更新证书就好了,啥事没找喵,有一个子公司更新了证书,但是客户还是没法使用我们的app(一个2b的项目,也是老项目)的银联支付功能.
最后这问题就到本喵这了.喵喵喵???
日常甩锅
什么交接文档都没有,你问喵,本喵问谁?
解决过程
锅先甩了,事情还是要解决的.
凡事先看代码,先找到对应支付调用银联的相关代码.
然后找到线上日志,里面清楚打印了几行字:
验签开始:*****
银联交易失败:[9100004]Signature verification failed
根据关键字"9100004 银联支付"搜到了关键内容:help.beecloud.cn/hc/kb/artic…
里面列了好多原因.本喵之前也没处理过这种问题,不过这个事情不就是证书更新引起的嘛,那肯定是证书有问题.
那这个证书到底是怎么用的?本喵找到相关代码,找到银联证书路径,这里大概描述下代码逻辑,具体代码就不贴出来了:
数据库里有一张表配置了银联相关配置,证书路径,前台后台接收URL(不知道干嘛的),证书密码(后面才明白干嘛用的),证书类型等等.然后客户发起支付的时候,先获取到这些配置,加载证书,然后加密再调用银联接口.
本喵疑惑了,证书都存在服务器上了,其他人怎么更新证书的呢?那个出问题的子公司的财务人员又是怎么更新证书的?
前一个问题注定是得不到解释的了,本喵只能按照自己的理解,先把证书给替换掉.本喵让子公司的财务人员把证书发给喵.根据代码逻辑,子公司的证书名字是"商户号.pfx",留个心眼,把原先的证书先备份一下.
替换完毕之后,试着发起0.01金额的订单,这时候日志不一样了:
java.io.IOException: keystore password was incorrect
这是银联sdk打印的日志,根据英文单词猜测应该是密码错误。但是本喵不知道这个是什么密码啊,看代码像是证书密码,证书密码是什么密码?不懂.
刚开始还以为是子公司在银联的账户密码,关键是这个密码只配置了一个,所有子公司都是用的这个密码吗,按道理来说不可能的.只好去问财务,在证书下载过程中有没有输密码的,回答无?懵圈了,那这个密码是怎么回事?
无办法,只好让财务给喵重新演示更新证书操作.最后搞明白了,在银联商户后台证书界面有个下载证书按钮的,如图所示
这个按钮点击不是下载证书到本地,而是界面新增一条证书数据,有效期从今天起的,确实没有输入密码操作.导出证书操作是有一步骤是输入密码的,让财务人员输入配置的密码,再导出来给喵,替换上去之后,支付功能正常了.
总结
没什么好总结的,一回生二回熟.最后甩个锅,什么下载证书嘛,莫名其妙.
写到最后的话
所以最后有个问题困扰喵了,其他子公司是怎么更新证书成功的?
后续1
另外一家子公司也有更新证书问题,然后有个操作是新老证书切换,切换到新证书之后,其他步骤同上但是会报错,报
缺少certId=[69597475696]对应的验签证书
切换回老证书,然后重复以上步骤即可。
后续2
今天2020.10.22 所有子公司银联支付功能皆不可用,后面看到这个东西
现在才明白那个新老证书切换是干嘛的,但是一直不知道这个新证书怎么下载,以为也是要业务人员在商户后台导出的,后面看了相关文档发现原来在这里:
open.unionpay.com/tjweb/doc/m…
具体下载地址:
open.unionpay.com/upload/down…
备份老证书,更新上传新证书,完成.
希望不要再有后续了.