与平安对接保险随笔

news/2024/11/30 18:42:33/

与平安对接保险随笔

本文出自Crayfish博主,转载请注明:

最近公司项目在跟平安进行“投保”、“支付”、“承保”等事项的对接,投保使用C#进行了报文读取,很快就解决了“投保”问题。进行到“支付”环节的时候处理“证书验签失败”问题,整整处理了三天。我们使用的是平安自己的支付,使用POST请求,返回支付页面,我看了平安支付文档后,就觉得文档很简陋,既然要让用户使用你们的支付,那请把文档写写好一点吧。

支付中的问题

接着,就开始了支付接口对接之旅,第一天将平安java版本的签名算法改进成Android版本的,在这之间由于Android与java读取文件流存在一定的出入,我使用了context.getAssets().open(keyStoreFileName);;来获得一个InputStream对象,来进行加载证书,接下来奇怪的是私钥获取不到,在java版本中“别名”传“1”就可以获取到,但是Android中却不行,几经周折百度,查阅到了

Enumeration enume = keyStore.aliases();
if (enume.hasMoreElements()) {keyStoreAlias = (String) enume.nextElement();
}

已这种方式进行读取“别名”,最终取到了私钥进行加密。
最后,Base64编码问题出现了,大家都知道java会使用sun.misc.BASE64Encoder,但是Android使用不了,Android有自己的android.util.Base64进行Base64编码;与java加密相同的是Android中Base64.CRLF,剩下还有DEFAULT默认、NO_PADDING去除最后的“=”、NO_WRAP去除换行符、URL_SAFE以-和_取代+和/。

获取电子保单的问题

支付在明确参数后,也顺利完成了,最后获取电子保单,我使用的是C#开发的服务,request.GetRequestStream()此流无法操作的问题,最后以巧妙的方式进行了PDF流的读取:

public static byte[] StreamToBytes(Stream stream)
{List<byte> bytes = new List<byte>();int temp = stream.ReadByte();while (temp != -1){bytes.Add((byte)temp);temp = stream.ReadByte();}return bytes.ToArray();
}

SHA1WithRSA签名算法

C#请求添加证书(以及内容签名)代码:

X509Certificate2 objx5092 = new X509Certificate2(KEYSTOREPATH, KEYSTOREPASSWORD, X509KeyStorageFlags.MachineKeySet);
//RSACryptoServiceProvider rsa = objx5092.PrivateKey as RSACryptoServiceProvider;
//byte[] bb = rsa.SignData(dataByte, new SHA1CryptoServiceProvider());
request.ClientCertificates.Add(objx5092);
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
//回调方法public static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors){   // 总是接受  return true;}

java签名代码:

if(keyStoreFileName.toUpperCase().indexOf("PFX")>=0)//判断证书文件的格式
{keystoreType="PKCS12";
}
else
{keystoreType="JKS";
}
keyStore = KeyStore.getInstance(keystoreType);//获取JKS证书实例
InputStream in =  context.getAssets().open(keyStoreFileName);
char[]pwdChar=keyStorePassword.toCharArray();//证书密码
keyStore.load(in, pwdChar);//加载证书到keystore中
Enumeration enume = keyStore.aliases();
if (enume.hasMoreElements()) {keyStoreAlias = (String) enume.nextElement();
}
PrivateKey privateKey=(PrivateKey)keyStore.getKey(keyStoreAlias, pwdChar);//从证书中获取私钥
Signature sign=Signature.getInstance("SHA1WithRSA");//SHA1WithRSA签名算法
sign.initSign(privateKey);//设置私钥
sign.update(data.getBytes());//设置明文
signRstByte=sign.sign();//加密
signValue=new String(Base64.encode(signRstByte,Base64.CRLF));

http://www.ppmy.cn/news/626459.html

相关文章

平安银行B2B现货通产品对接

以上为项目近期对接平安银行B2B业务现货通产品的总结。实施过程&#xff0c;使用以下接口&#xff0c;基本将业务串联了起来。 签约解约改约 注意&#xff1a;非平安银行会员需要先注册成为平安电商平台会员。 1、签约和绑定银行卡 &#xff08;1&#xff09;平安银行会员从平安…

table 缩小行间距_table中设置tr行间距详解

CSS border-collapse 属性设置表格的边框是否被合并为一个单一的边框 值 描述 separate 默认值。边框会被分开。不会忽略 border-spacing 和 empty-cells 属性。 collapse 如果可能&#xff0c;边框会合并为一个单一的边框。会忽略 border-spacing 和 empty-cells 属性。 inher…

联行号查询

联行号查询记录 联行号定义联行号查询&#xff08;官方可靠&#xff09;补充个方便的资源下载地址&#xff1a; 联行号定义 银行联行号就是一个地区银行的唯一识别标志。用于人民银行所组织的大额支付系统\小额支付系统\城市商业银行银行汇票系统\全国支票影像系统&#xff08…

平安外包软件测试面试题,中国平安银行软件测试笔试题 .doc

中国平安银行软件测试笔试题 .doc 中国平安银行软件测试笔试题 导语:下面小编为你整理为了中国平安银行关于软件 测试笔试试题,欢迎阅读! 中国平安银行关于软件测试笔试试题(一) 下面是一平安银行的软件测试笔试题目,看你能做出 多少题? 单选题 1、下列哪一个不是UML的动…

平安科技面经

平安科技面经 2018.12.3 一面&#xff08;电话面试45min&#xff09; 1、自我介绍&#xff08;简单提到项目&#xff09; 2~3 min 2、spring启动时的容器启动流程&#xff08;对配置的加载顺序&#xff09;&#xff1f; 容器启动流程中涉及的主要类—— ContextLoaderLis…

平安夜苹果

自从见识了平安夜苹果的涨价后&#xff0c;Lele就在他家门口水平种了一排苹果树&#xff0c;共有N棵。 突然Lele发现在左起第P棵树上(从1开始计数)有一条毛毛虫。为了看到毛毛虫变蝴蝶的过程&#xff0c;Lele在苹果树旁观察了很久。虽然没有看到蝴蝶&#xff0c;但Lele发现了一…

银行联行号

银行联行号就是一个地区银行的唯一识别标志。用于人民银行所组织的大额支付系统\小额支付系统\城市商业银行银行汇票系统\全国支票影像系统&#xff08;含一些城市的同城票据自动清分系统&#xff09;等跨区域支付结算业务。由12位组成&#xff1a;3位银行代码4位城市代码4位银…

平安科技性格测试凉经

性格测试 平安科技采用的是卡特尔的16PF性格测试&#xff0c;和之前相比还多了一个IQ测试。 注意点&#xff1a; IQ测试确实是比较难&#xff0c;如果可以提前上网上看看&#xff0c;我确实是找到了原题&#xff0c;虽然没记住。。限时问题&#xff0c;IQ部分是每个题限时&am…