Java对接ChinaPay提现(公私钥方式)

1.Java对接银联ChinaPay代付接口(公私钥对接方式)

1).需要提供的资料

商户号:15位
私钥:MerPrK.key
公钥:PgPubk.key
jar:netpayclient.jar

2).接口文档:版本:20190902

3).查询代付余额

Map<String, Object> encryptionMap = new LinkedHashMap();
encryptionMap.put("merId", "商户号");
encryptionMap.put("version", "版本号");


Iterator<Map.Entry<String, Object>> it = encryptionMap.entrySet().iterator();

//拼接需要参与签名的参数
StringBuilder sb = new StringBuilder();
while (it.hasNext()) {
   Map.Entry<String, Object> entry = it.next();
   if (!entry.getKey().equals("chkValue")){
      sb.append(entry.getValue());
   }

}
//该字段无需参与签名
encryptionMap.put("signFlag", "1");

//创建签名
PrivateKey key = new chinapay.PrivateKey();
//base64编码后
String msg1 = new String(Base64.encode(sb.toString().getBytes()));

boolean flag1 = key.buildKey("商户号",0,"私钥路径");

if (flag1){
   System.out.println("build key success!");
}else {
   System.out.println("build key error!!");
}

//签名
SecureLink s = new SecureLink(key);
//签名内容
String chkValue = s.Sign(msg1);

encryptionMap.put("chkValue", chkValue);
//发送请求 url请求路径
String result = HttpUtil.post(url,encryptionMap);

//响应内容
String str = result;
//截取chkValue验签
String chkValueTemp = str.substring(str.lastIndexOf("|") + 1);

//创建公钥验签
PrivateKey privateKey = new PrivateKey();

boolean flag2 = privateKey.buildKey("999999999999999",0,"公钥路径");

if (flag2){
   System.out.println("build key success!");
}else {
   System.out.println("build key error!!");
   return;
}

//使用公钥验签名
SecureLink t = new SecureLink(privateKey);

//对转换成 Base64 的数据进行签名 截取响应明文
String ChkValue2 = str.substring(0,str.lastIndexOf("|") + 1);
String plainDataBase64 = new String(Base64.encode(ChkValue2.getBytes()));

// chkValueTemp 为 ChinaPay 应答传回的域段//签名验证错误处理
String resStr = str.substring(0,str.lastIndexOf("|") );
System.out.println(resStr);
boolean flag3 = t.verifyAuthToken(plainDataBase64, chkValueTemp);

if(!flag3){

   System.out.println("验签失败!False!!");}
else{
   System.out.println("验签成功!True!!");
}

4).代付转账接口代码

String MERID = "商户号";
Map<String, Object> encryptionMap = new LinkedHashMap();
encryptionMap.put("merId", MERID);
encryptionMap.put("merDate", new SimpleDateFormat("yyyyMMdd").format(new Date()));
encryptionMap.put("merSeqId",getRandom(15));
encryptionMap.put("cardNo","");
encryptionMap.put("usrName", "收款信息");
encryptionMap.put("openBank","");
encryptionMap.put("prov", "");
encryptionMap.put("city", "");
//转账金额 以分为单位
encryptionMap.put("transAmt", "");
encryptionMap.put("purpose", "");
encryptionMap.put("subBank", "");
encryptionMap.put("flag","00");
//版本号
encryptionMap.put("version", "20160530");
encryptionMap.put("termType", "07");
encryptionMap.put("payMode", "1");
//这个不参与签名
encryptionMap.put("signFlag", "1");

Iterator<Map.Entry<String, Object>> it = encryptionMap.entrySet().iterator();

StringBuilder sb = new StringBuilder();

while (it.hasNext()) {
   Map.Entry<String, Object> entry = it.next();
   //可以将不需要签名的字段过滤
   if (!entry.getKey().equals("signFlag")){
      sb.append(entry.getValue());
   }
}

//进行base64编码
String baseStr = new String(Base64.encode(sb.toString().getBytes()));
//创建私钥
PrivateKey key = new PrivateKey();
boolean flag1 = key.buildKey(MERID ,0,"私钥路径");

if (flag1){
   System.out.println("建立成功!");
}else {
   System.out.println("build key error!");
}

//签名
SecureLink s = new SecureLink(key);
//签名内容
String chkValue = s.Sign(baseStr);
encryptionMap.put("chkValue",chkValue);
//发送请求。url请求路径
String res = HttpUtil.post(url,encryptionMap);

//响应码 下方可自行操作
String resCode = res.substring(13,res.indexOf("&"));

if (resCode.equals("0000")){
   System.out.println("交易成功,进行后续操作!");
}else {
   System.out.println("交易失败!");
}

//创建公钥验签
PrivateKey privateKey = new PrivateKey();

boolean flag2 = privateKey.buildKey("999999999999999",0,"公钥路径");

if (flag2){
   System.out.println("build key success!");
}else {
   System.out.println("build key error!!");
   return;
}

//使用公钥验签名
SecureLink t = new SecureLink(privateKey);

//获取响应明文 对转换成 Base64 的数据进行签名 
String ChkValue2 = res.substring(0,res.lastIndexOf("&"));
String plainDataBase64 = new String(Base64.encode(ChkValue2.getBytes()));

//获取chkValue chkValueTemp 为 ChinaPay 应答传回的域段//签名验证错误处理
String chkValueTemp = res.substring(res.lastIndexOf("&") + 10);
//验签
boolean flag3 = t.verifyAuthToken(plainDataBase64, chkValueTemp);

if(!flag3){
  System.out.println("验签失败!False!!");
}else{
   System.out.println("验签成功!True!!");
}

5).注意事项

1.一开始拿到文档可以先确定是否是银联的还是银联第三方 银联开放平台:中国银联开放平台 (unionpay.com) 第三方:运营服务一体化平台 (chinapay.com)
2.银联代付有两种对接方式,如何区分,看提供的资料是否有公私钥,如果有公私钥,那上方代码可参考,如果使用的是交易证书,参考资料B2B电商平台–ChinaPay银联电子支付功能_骏马逸动,心随你动的博客-CSDN博客_chinapay

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值