作为刚毕业的我来说,第一次开发在线支付功能,还是工行的,真的是被坑死了,和工行的技术真的是太难沟通了,而且那个技术明显是他们接口问题还死不承认,总是让我细读开发文档,结果我代码什么都没改,他调试接口后可以运行支付了,他无话可说……希望这 ...
作为刚毕业的我来说,第一次开发在线支付功能,还是工行的,真的是被坑死了,和工行的技术真的是太难沟通了,而且那个技术明显是他们接口问题还死不承认,总是让我细读开发文档,结果我代码什么都没改,他调试接口后可以运行支付了,他无话可说……希望这篇能让一些人少走一些弯路。进入正题:
一、 前期准备
- 支付组件注册(PS:当时工行技术根本没有给我这个组件,被坑了,当时还想骂那个技术一下,签名什么的,难道我随便按照自己的想法签一个也可以?后来终于给我了)
组件注册说明
一、API配置说明:
1.将ICBCEBankUtil.dll和infosecapi.dll两个dll文件拷贝到系统system32目录下(其中,如果是64位系统,则拷贝到SysWOW64目录下);
2.打开DOS窗口,进入system32目录/SysWOW64目录;
3.运行“regsvr32 ICBCEBankUtil.dll”命令注册控件;
二、函数说明:
1、初始化
init(
BSTR certFN,银行证书文件名
BSTR certFNM,商户证书文件名
BSTR keyFN,私钥文件名
BSTR key私钥保护口令
)
返回值:
-100:银行证书文件名传递错
-101:商户证书文件名传递错
-102:私钥文件名传递错
-103:私钥保护口令传递错
-110:打开银行证书文件错
-111:打开商户证书文件错
-112:打开私钥文件错
2、签名
signC(
BSTR src,明文字符串
int srcLen,明文长度
)
返回值:
如果成功则返回BASE64编码后的签名串,否则返回空串
如果返回空串,可调用getRC取得错误码
3、获取错误码(只在出错时有效)
getRC
返回值
-100:明文字符串传递错误
-1:明文错误
-2:私钥错
-3:私钥解密错
-4:私钥保护口令错
4、验证签名
verifySignC(
BSTR src,明文字符串
int srcLen,明文字符串长度
BSTR sSrc,签名BASE64编码字符串
int sSrcLen签名BASE64编码字符串长度
)
返回值:
0:成功
-1:验证失败
-2:解码失败
-100:明文字符串传递有误
-101:签名字符串传递有误
5、获取证书
getCert(
int which证书类型:0银行证书,1商户证书
)
返回值:BASE64编码后的证书
注册好以后将infosecapi.dll引用到项目中。
2.证书引用
然后将public.crt、商户.crt、商户.key 这三个文件放到项目某个文件夹下
二、 开发阶段
- 首先必须细读:《中国工商银行网上银行新B2C在线支付接口说明V1.0.0.11》这个文档(PS:工行人员当时没有给我这个文档,打电话过去问技术,技术让我细读这个文档,根本没有这个文档,还说他发给客户了的,问客户也说没有发过,当时真的是被坑好多,后来网上找到了一个)。
- 以下是源码:
/// <summary> /// 工商银行签名验证类 /// </summary> public class ICBCTest { string strCertFN = @"f:\aa\ahhfycYQHLTEST.pfx"; string strCertFNM = @"f:\aa\ahhfyc.crt"; string strKeyFN = @"f:\aa\ahhfyc.key"; //string strCertFN = System.Web.HttpContext.Current.Server.MapPath(@"user\user.crt"); //string strCertFNM = System.Web.HttpContext.Current.Server.MapPath(@"user\user.crt"); //string strKeyFN = System.Web.HttpContext.Current.Server.MapPath(@"user\user.key"); //string strKey = "12345678"; string strKey = "12345678"; /// <summary> /// 获取工商银行验证信息 /// </summary> /// <returns></returns> public ICBC GetCheckInfo(ICBC argIcbc) { string strMerSignMsg = string.Empty; B2CUtil icbcObj = new B2CUtil(); if (icbcObj.init(strCertFN, strCertFNM, strKeyFN, strKey) == 0) { //对订单数据进行签名,得到订单签名数据 MerSignMsg argIcbc.MerSignMsg = icbcObj.signC(argIcbc.TranData, argIcbc.TranData.Length); //证书公钥 商户用二进制方式读取证书公钥文件后,进行BASE64编码后产生的字符串 argIcbc.MerCert = icbcObj.getCert(1); argIcbc.TranData = Base64Encode(argIcbc.TranData); } else { return null; } return argIcbc; } /// <summary> /// 获取工商银行验证信息 /// </summary> /// <returns></returns> public ICBC GetCheckReturnInfo(ICBC argIcbc) { string strMerSignMsg = string.Empty; B2CUtil icbcObj = new B2CUtil(); if (icbcObj.init(strCertFN, strCertFNM, strKeyFN, strKey) == 0) { argIcbc.TranData = Base64Decode(argIcbc.TranData); if (icbcObj.verifySignC(argIcbc.TranData, argIcbc.TranData.Length, argIcbc.MerSignMsg, argIcbc.MerSignMsg.Length) == 0) //判断验证银行签名是否成功 { argIcbc.IsCheck = true; } else argIcbc.IsCheck = true; } else { argIcbc.IsCheck = false; } return argIcbc; } ///<summary> ///转成Base64形式的System.String ///</summary> ///<param name="str"></param> ///<returns></returns> public static string Base64Encode(string str) { byte[] b = System.Text.Encoding.Default.GetBytes(str); //转成Base64形式的System.String return Convert.ToBase64String(b); } public static string Base64Encode(Byte[] b) { ///转成Base64形式的System.String return Convert.ToBase64String(b); } ///<summary> /// Base64转回到原来的 System.String ///</summary> ///<param name="str"></param> ///<returns></returns> public static string Base64Decode(string str) { byte[] c = Convert.FromBase64String(str); //转回到原来的 System.String return System.Text.Encoding.Default.GetString(c); } }
原标题:工行在线支付接口实战开发流程及源码
关键词:接口
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。