一.开发步骤
1.首要的跟工行对接人员要到参考demo,里面有需要用到的工行jar包,以及各个接口代码;
2.根据工行要求下载OpenSSL生成公私钥对,公钥提供给工行,私钥自己在调接口时传入;
3.在项目web-inf目录下面,创建文件夹存放cer证书,在调用工行接口时需要传入.
二.以融资单据上传接口为例
1.拼接请求报文,按照工行接口文档中的格式拼接就行,这里就不展示完整的了
2.将拼接的报文转换成Base64格式
对应代码:
public static String base64Encode(String data,String charset){
String b64Reqdata ;
BASE64Encoder b64enc = new BASE64Encoder();
try {
b64Reqdata = b64enc.encode(data.getBytes(charset));
//数据去空格与转行字符
b64Reqdata = b64Reqdata.replaceAll("\r\n", “”).replaceAll("\n","");
b64Reqdata = b64Reqdata.replaceAll("\n", “”);
} catch (Exception e) {
return null;
}
return b64Reqdata;
}
3.创建工行融资接口请求参数对象
4.创建接口请求对象
5.调用工行接口,获取响应
6.完整代码
public ApplyOnlinePayResponse orderUpload(List orderInfoDtos, String transCode) {
ApplyOnlinePayResponse payResponse = new ApplyOnlinePayResponse();
//1.加载交易报文
StringBuilder reqdata = new StringBuilder();
//1.1加载公共部分报文
reqdata.append(MessageCreateUtil.commonMessage(transCode, icbcLoanBean.getMerid()));
//1.2加载入参报文
reqdata.append(MessageCreateUtil.orderMessage(orderInfoDtos));
//1.3明文数据转换成base64数据方式
String b64Reqdata = Tool.base64Encode(reqdata.toString(), icbcLoanBean.getCharset());
ApiRequest req = new ApiRequest(icbcLoanBean.getApiurl(), “com.icbc.gyj.eloansplus.orderupload”, icbcLoanBean.getAppid());
req.setRequestField(“version”, Constants.VERSION);
req.setRequestField(“charset”, icbcLoanBean.getCharset());
req.setRequestField(“merid”, icbcLoanBean.getMerid());
req.setRequestField(“trancode”, transCode);
req.setRequestField(“reqdata”, b64Reqdata);
try {
//调用工行接口
ApiClient ac = new ApiClient(icbcLoanBean.getPriKey(), new Tool().getWEBINFPath() + icbcLoanBean.getPubPath());
//响应对象
ApiResponse ar = ac.execute(req);
//解析响应 获取data
IcbcResponse icbcResponse = getRespone(ar);
Element root = icbcResponse.getElement();
//封装xx需要的对象
if (!Constants.STRING_CODE_000.equals(icbcResponse.getStatus())) {
//若状态不为000则表示工行接口问题
payResponse.setPayHttpStatus(xxx);
} else {
if (Constants.STRING_CODE_200.equals(icbcResponse.getRetCode())) {
List uploadRes = new ArrayList();
Element rds = root.element("out");
List rdnodes = rds.elements("rd");
//获取单据上传的反馈信息
for (Element rdnode : rdnodes) {
OrderUploadRes orderUploadRes = new OrderUploadRes();
orderUploadRes.setOrderNo(rdnode.elementText("OrderNo"));
String uploadStatus = rdnode.elementText("UploadStatus");
String uploadMessage = rdnode.elementText("UploadMessage");
if ("0".equals(uploadStatus)) {
//可能是参数问题
payResponse.setPayHttpStatus(PayHttpStatus.PARAMETRIC_FAILED);
return payResponse;
}
orderUploadRes.setUploadStatus(uploadStatus);
orderUploadRes.setUploadMessage(uploadMessage);
uploadRes.add(orderUploadRes);
}
payResponse.setObj(uploadRes);
payResponse.setPayHttpStatus(PayHttpStatus.OK);
} else {
//可能是参数问题
}
}
} catch (Exception e) {
}
return payResponse;
}
**
**
一.前期准备,B2B接口跟融资接口调用不太一样
1.该类接口除了需要用到自己生成的公私钥之外,还需要工行提供的"网关公钥"
二.开发步骤
1.以支付申请查询接口为例,入参对象,请求对象,响应对象都是工行jar包里面的
MybankPayCpayCporderqueryRequestV1 request = new MybankPayCpayCporderqueryRequestV1();
request.setServiceUrl(“https://”+icbcIP+":"+icbcPort+"/api/mybank/pay/cpay/cporderquery/V2");
MybankPayCpayCporderqueryRequestV1.QueryPayApplyRequestV1Biz bizContent = new MybankPayCpayCporderqueryRequestV1.QueryPayApplyRequestV1Biz();
bizContent.setAgreeCode(agreeCode);
bizContent.setOrderCode(infoDto.getOrderId());
bizContent.setPartnerSeq(infoDto.getPartnerSeq());
request.setBizContent(bizContent);
try {
MybankPayCpayCporderqueryResponseV1 responseV1 = excuteIcbcB2b(request);
if (responseV1.isSuccess()) {
payResponse.setPayHttpStatus(PayHttpStatus.OK);
payResponse.setObj(responseV1);
} else {
payResponse.setPayHttpStatus(PayHttpStatus.PARAMETRIC_FAILED);
}
} catch (Exception e) {
payResponse.setPayHttpStatus(PayHttpStatus.API_FAILED);
return payResponse;
}
return payResponse;
}
2.注意:工行B2B模块测试环境时间不是当前时间,当出现提示"终端上送工作日期和主机系统日期不一致"时,需要跟工行人员询问当前的测试环境时间.
总的来说,工行支付接口对接还是挺简单的,主要是跟工行人员多沟通,有什么不懂的就问.但是坑就坑在B2B 跟 B2C 两个模块的对接人员太拖拉,而且不一定是让开发人员来对接,而是让测试人员来对接,一旦出现什么问题就会要求你对照demo上的代码.耗费了我不少时间~~~坑