客户提了个银联支付及退款的需求,经过读官方文档,复制粘贴官方代码,支付没问题了,点击退款银联也给成功的回答,但是退款后的回掉却出了问题,研究了一天了,定位到问题所在,但还是束手无策。
我的后台采用的是struts2的框架,官方的示例是SpringMVC的代码,一开始这里也踩坑了,后来我采用
HttpServletRequest req = ServletActionContext.getRequest();
这种方式获取请求和响应。(回掉方法写在action层里面的)。能跑,但是报验签失败,钱也没退回来,一路实验(不停地改代码放测试服务器上)定位到了银联官方的某个SDK文件--CertUtil.java里面的genCertificateByStr方法,
public static X509Certificate genCertificateByStr(String x509CertString) {
X509Certificate x509Cert = null;
try {
CertificateFactory cf = CertificateFactory.getInstance("X.509", "BC");
System.out.println("CertificateFactory:"+cf+"------------------=========");
InputStream tIn = new ByteArrayInputStream(
x509CertString.getBytes("ISO-8859-1"));
System.out.println("tIn:"+tIn+"aaaaaaaaaaaa");
x509Cert = (X509Certificate) cf.generateCertificate(tIn);
System.out.println("x509Cert:"+x509Cert+"123456898646");
} catch (Exception e) {
LogUtil.writeErrorLog("gen certificate error", e);
}
return x509Cert;
}
经过打印输出,发现x509Cert为null,一开始前辈们认为参数没传进去,我打印了看发现有一对加密的代码,难道是解密的不对?但是支付和退款也用了该方法,那只能说明我的参数有问题,可是我很蒙蔽了,参数怎么改呢???