我在做A公司的互联网支付项目,他们的支付方式有代收和B2C两种,也就意味着他们有两个证书证书ID - CertId, 有两个证书Id无所谓,可是当时 出现的情况是 代收退款测试好了,再接着做一笔B2C的退款就会报错--验签失败; 或者 B2C退款刚调试好,再接着做一笔 代收退款就会报错--验签失败。
当时试着改了很多东西,可是仍会出现这种问题后来比对JBOSS日志nohup里面代收 和 B2C 发往银联的报文 开始只去跟银联的接口文档对比传送的字段发现并不缺少字段,还多了一个certId的字段,有个certId的字段 有时会一样 ,有时会不一样,怀疑是证书加载时串了证书Id 代收和B2C 各有一个证书, 由于证书ID--certId 是最后加载到那些传送到银联的报文里面的.
(查看含有向银联发送和返回报文时,可以去看trc日志,也可以看jboss的日志nohup.out .nohup.out 中的日志中有发送给银联前的验签报文留意 发送给银联前的验签报文,里面不只有发送给银联的字段还有证书ID--certId)
比对发往银联的报文
B2C 17:47:51,966 INFO [ACP_SDK_LOG] 报文签名之前的字符串(不含signature域)=[accessType=1&acqInsCode=49316100&backUrl=https://callback.hdwtpay.com&bizType=000201&certId=70196016930&channelType=07&encoding=UTF-8&merAbbr=JFT&merCatCode=5311&merId=993450153110009&merName=JFT&orderId=0009450100005385&origQryId=201612151746417026148&signMethod=01&txnAmt=1&txnSubType=00&txnTime=20161215174751&txnType=04&version=5.0.0] 代收 23:16:07,022 INFO [ACP_SDK_LOG] 报文签名之前的字符串(不含signature域)=[accessType=0&acqInsCode=49316100&backUrl=https://callback.hdwtpay.com&bizType=000301&certId=70196016930&channelType=07¤cyCode=156&encoding=UTF-8&merAbbr=JFT&merCatCode=5311&merId=993450153110001&merName=JFT&orderId=q4501000100005410&origQryId=201612152306408691878&signMethod=01&txnAmt=2&txnSubType=00&txnTime=20161215231606&txnType=04&version=5.0.0]
解决办法 是修改加载正式时不用静态代码块的方式(银联提供的JAR包加载证书的方式--单证书模式),改为每个向银联发送报文时重新到放B2C和代收的证书的路径下面去加载证书,证书密钥 (这个银联提供的jar里面有重写过的加载证书的方法,可以直接复用)同时下面还有个方法是加载密钥的方法,也要进行替换,改为每次加载证书时再重新加载密钥(这个银联提供的jar里面有重写过的加载证书的方法,可以直接复用)
总结:不要想当然认为银联提供的证书就没有问题,银联提供的代码调用默认是单证书;如果是两证书或者是多证书就要去修改代码改为每次加载证书时重新去相应目录下去加载证书,这些方法都在银联提供的jar里面,稍微改下就行.
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
(以下记录的具体类代码名称 是我们项目里面具体的类名,做个记录防止遗忘。非我们项目组的人可以忽略
CertUtil.class加载证书的Util类,隶属于upacp_sdk-1.0.0.jar
FQpayUpopRefund.class 银联快捷退款的类 隶属于 mrqpupop.jar
SDKUtil.class 隶属于 upacp_sdk-1.0.0.jar
UpopBase.class 隶属于 mrqpupop.jar)
一步步跟着调用去查看源代码
代收退款的类FQpayUpopRefund,在下图红线之前,通过比对日志发现都是正确的,有问题的是后面的代码,这样就要去查看 UpopBase 中的submitDate方法,如图2
图一 FQpayUpopRefund.class
解决办法:
--------------------------------------------------------------------------------------------------------------
源代码
FQpayUpopRefund.class
CertUtil.class
SDKUtil.class --原来的版本
SDKUtil-modify.class --修改后的版本,此次就修改该类
想提供源代码,CSDN怎么提交提交源代码到文章呢