使用C++签名方式。
一,控件的注册使用:
1.将"加密控件"文件夹中的 libpem12.dll,RSA.dll 放到系统目录下。
不同系统目录不同,windows95/98 系统目录为 system, winnt/2000/xp/win7为 system32,64位系统为SysWOW64。
2. 将"加密控件"文件夹中MerchCryptCom.dll复制到指定路径中,注册MerchCryptCom.dll。
运行系统命令: regsvr32 路径\MerchCryptCom.dll,若弹出成功字样,表明该 COM 注册成功,可以使用。
MerchCryptCom.dll 控件注册时可能会失败,需要依赖库,如果失败请安装文件“2010运行时库文件.rar”中的程序。
3. 安放商户端订单加密证书(商户私钥和银行公钥)。
注意:在win2003或win2008服务器上注册控件时可能会报错,是因为该机器上缺少运行时库造成的。请安装2010版的运行时库后,再尝试注册控件。
二,数据加密:
MerchCryptComLib.IMerchCryptCtrl c = new MerchCryptComLib.MerchCryptCtrl();
1、读取银行公钥证书
c.readcert("D:/ZOCAI/cert/bank2048二进制.cer");
2、判断返回码
int retVal = c.retCode();
3、读取证书信息
if(retVal == 0){string bankData = c.cert;}else{/*”错误处理”*/};
4、读取商户私钥证书
c.readcert("D:/ZOCAI/cert/ 99004.pfx");
5、判断返回码
int retVal = c.retCode();
6、读取证书信息
if(retVal == 0){string merchData = c.cert;}else{/*”错误处理”*/};
7、数据加密
string prestr = "1404231613276912|佐卡伊订单[14042316132769]|佐卡伊订单[14042316132769]|66002|测试商户|0|0|http://120.236.36.218/ebanknotify/cmbcreturn|4999.00|20140807|150503";
c.EnvelopData(prestr, bankData, merchData, "1111");
8、判断返回码
int retVal = c.retCode();
9、获取加密后数据
if(retVal == 0){string sign = c. EnveData;}else{/*”错误处理”*/};
问题:
1,公钥私钥都正确,加密过程也没错误。但就是报出“验签失败”的错误。
2, libpem12.dll,RSA.dll 两个dll文件,是不是只需放入系统目录就可以,但我发现,无论有没有放入,加密结果都一样。验签失败。
3,百度谷歌搜索到的资料,都没有MerchCryptCom.dll加密控件(以前是另一个名称)。
有没有哪位开发过民生接口,来分享下经验。万分感谢!
string serverCert = c.readcert("D:/ZOCAI/cert/ 99004.pfx");
string clientCert = c.readcert("D:/ZOCAI/cert/ 99004.pfx");
c.EnvelopData(plainText, serverCert, clientCert,"1111"); // 加密字符串
c.DecryptData(cipherText, serverCert, clientCert, "1111"); // 解密字符串
按照上面的模式测试下是否正确。
根据我的经验,“验签失败”应该是你将 c.EnveData post 到服务器后,服务器返回给你的信息,对吧。这通常是因为服务器配置的商户号同你传递给服务器的商户号不一致所致,最后还应该注意字符编码问题。
谢谢。
c.readcert 这个是一个方法,没有返回值。要调用c.cert获取到证书里的数据。
公钥证书是.cer,商户私钥是.pfx,我这边的商户号是使用银行提供的测试数据66002。
不知道是不是编码问题,我是将生成的加密字符串直接复制到浏览器请求。
@YP小家: 我记得民生会给一个测试页面,可以直接在页面里加密上传,不用你编写代码。你可以通过这个页面来操作先验证下你拼接的字符串是否格式正确、证书是否对应商户号。
@Launcher: 哦,有测试页面吗?有的话就太好了,至少能够知道拼接的字符串是否正确。但我这边只有4个测试地址。
测试环境:
电子商户登录 http://111.205.207.118:55003/epayweb/static/clogin.html
B2C一般支付 http://111.205.207.118:55000/pweb/b2cprelogin.do
B2C单笔订单查询 http://111.205.207.118:55003/epay/connectForQuery.do
B2C批量退货 http://111.205.207.118:55003/epay/connectForBatch.do
@YP小家: 这个你得问民生,我以前使用的基金代销资金监管的接口,跟你的不一样。通过 EnvelopData 封包后的数据通过如下 url 请求结果:
@Launcher: 嗯,谢谢。我问问看,银行技术这边回复很慢。
@YP小家: 然后我希望你确定下“验签失败”这个错误是民生返回给你的,还是在你客户端解密民生返回的结果时由MerchCryptCom.dll提示的。我说句额外话,民生这个项目也是外包给第三方的,使用 java,技术也一般,由于 MerchCryptCom 组件不方便使用(要组册),所以我要了他们的 java 加解密代码,自己用 C# 重新实现了一遍,在此过程中发现他们的封包算法相当的“复杂”,同 PKI 的标准不兼容。
@Launcher: “验签失败”是民生返回来的。MerchCryptCom 调用还好,很简单。就是民生那边没技术人员来直接沟通。完全按照加密文档来操作,整个过程都返回成功,就是最后请求到银行才返回失败。
@YP小家: 你这个问题需要跟民生沟通,多半的原因是民生在服务端给你的商户号配置的证书同你使用的证书不一致。
@Launcher: 嗯嗯,谢谢。