zoukankan      html  css  js  c++  java
  • 工商银行在线支付接口

    最近做工行的网上支付接口,其中也遇到了不少问题,现在整理一下发布出来希望能对需要的人有所帮助。

    参考了下面博客:http://www.cnblogs.com/gonganruyi/archive/2011/07/01/2095463.html

    1、首先需要注册工行提供的ICBCEBankUtil.dll,将ICBCEBankUtil.dll和infosecapi.dll复制到system32文件夹下CMD输入regsvr32 ICBCEBankUtil.dll注册控件。WINDOWS SERVER2008/2012等系统需要运行管理员命令提示符。

    2、拆分银行提供的.pfx证书文件,生成.key 和.crt两个文件,记住拆分时设置的私钥密码。将ebb2cpublic.crt(公钥文件)、Name.key、Name.crt三个文件复制到指定目录。

    3、下面是代码

     <form method="post" action="<%= icmcModel.OrderPostUrl %>" id="order">
            <div style=" 500px; margin: auto auto; padding: 10px; line-height: 30px;">
                正在跳转至工商银行支付地址.....
            </div>
            <input type="hidden" name="interfaceName" value="<%= icmcModel.InterfaceName %>" />
            <input type="hidden" name="interfaceVersion" value="<%= icmcModel.InterfaceVersion %>" />
            <input type="hidden" name="tranData" value="<%= icmcModel.TranData %>" />
            <input type="hidden" name="merSignMsg" value="<%= icmcModel.MerSignMsg %>" />
            <input type="hidden" name="merCert" value="<%= icmcModel.MerCert %>" />
            <script type="text/javascript">        document.getElementById("order").submit();</script>
        </form>
    支付接口HTML
                //用户账号(身份证)
                this.userIdCardNumber = Request.QueryString["userIdCardNumber"];
                //充值金额,(工商银行按分进行计算)
                // this.money = (Convert.ToInt32(Request.QueryString["payMnoney"]) * 100).ToString();
                this.money = "1";
                //生成订单号
                string orderId = DateTime.Now.ToString("yyyyMMddHHmmss") + userIdCardNumber.Substring(userIdCardNumber.Length - 5, 5) + Inhua.Common.Rand.Number(5);
                
                StringBuilder strXml = new StringBuilder();
                strXml.Append("<?xml version="1.0" encoding="GBK" standalone="no"?>");
                strXml.Append("<B2CReq>");
                //接口名称
                strXml.Append("<interfaceName>" + icmcModel.InterfaceName + "</interfaceName>");
                //接口版本号
                strXml.Append("<interfaceVersion>" + icmcModel.InterfaceVersion + "</interfaceVersion>");
                //订单信息
                strXml.Append("<orderInfo>");
                //交易日期时间
                strXml.Append("<orderDate>" + icmcModel.OrderDate + "</orderDate>");
                //支付币种
                strXml.Append("<curType>" + icmcModel.CurType + "</curType>");
                //商户代码
                strXml.Append("<merID>" + icmcModel.MerID + "</merID>");
                //订单信息列表
                strXml.Append("<subOrderInfoList>");
                //订单信息
                strXml.Append("<subOrderInfo>");
                //订单编号
                strXml.Append("<orderid>" + orderId + "</orderid>");
                //订单金额
                //strXml.Append("<amount>" + user.ExaminationModel.Examination_fees.ToString("0.00") + "</amount> ");
                strXml.Append("<amount>" + money + "</amount> ");
                //分期付款期数 1代表全额付款
                strXml.Append("<installmentTimes>1</installmentTimes>");
                //商户账号
                strXml.Append("<merAcct>" + icmcModel.MerAcct + "</merAcct>");
                //商品编号
                strXml.Append("<goodsID>" + icmcModel.Orderid + "</goodsID>");
                //商品名称
                strXml.Append("<goodsName>商品名称</goodsName>");
                //商品数量
                strXml.Append("<goodsNum>1</goodsNum>");
                //已含运费金额
                strXml.Append("<carriageAmt></carriageAmt>");
                strXml.Append("</subOrderInfo>");
                strXml.Append("</subOrderInfoList>");
                strXml.Append("</orderInfo>");
                strXml.Append("<custom>");
                //检验联名标志 取值“1”:客户支付时,网银判断该客户是否与商户联名
                strXml.Append("<verifyJoinFlag>" + icmcModel.VerifyJoinFlag + "</verifyJoinFlag>");
                //语言版本 取值:“EN_US”为英文版;取值:“ZH_CN”或其他为中文版
                strXml.Append("<Language>ZH_CN</Language>");
                strXml.Append("</custom>");
                strXml.Append("<message>");
                //支持订单支付的银行卡种类
                strXml.Append("<creditType>2</creditType>");
                //通知类型
                strXml.Append("<notifyType>" + icmcModel.NotifyType + "</notifyType>");
                //结果发送类型
                strXml.Append("<resultType>" + icmcModel.ResultType + "</resultType>");
                //商户reference
                strXml.Append("<merReference>" + icmcModel.MerReference + "</merReference>");
                //客户端IP 当商户reference项送空时,该项必输
                strXml.Append("<merCustomIp>" + icmcModel.MerIP + "</merCustomIp>");
                //虚拟商品/实物商品标志位 取值“0”:虚拟商品 取值“1”,实物商品
                strXml.Append("<goodsType>0</goodsType>");
                //买家用户号
                strXml.Append("<merCustomID></merCustomID>");
                //买家联系电话
                strXml.Append("<merCustomPhone></merCustomPhone>");
                //收货地址
                strXml.Append("<goodsAddress></goodsAddress>");
                //订单备注
                strXml.Append("<merOrderRemark></merOrderRemark>");
                //商城提示
                strXml.Append("<merHint></merHint>");
                //备注字段1
                strXml.Append("<remark1></remark1>");
                //备注字段2
                strXml.Append("<remark2></remark2>");
                //返回商户URL
                //strXml.Append("<merURL>http://localhost/</merURL>");
                //string url = tools.GetRootVirtualPath();System.Configuration.ConfigurationManager.AppiiciSettings["aa"]
                string merURL = "http://" + icmcModel.MerIP + "/PayOnline/ReturnPayment.aspx";
                strXml.Append("<merURL>" + merURL + "</merURL>");
                //返回商户变量
                strXml.Append("<merVAR>" + Inhua.Common.Encryption.Encrypt(userIdCardNumber) + "</merVAR>");
                strXml.Append("</message>");
                strXml.Append("</B2CReq>");
    
                //获取工商银行验证
                icmcModel.TranData = strXml.ToString();
                CBCOnlinePayment.CBCPayOnline.GetCheckInfo(icmcModel);
    支付接口后台代码
        public class ICBC
        {
            private string _orderPostUrl = "https://B2C.icbc.com.cn/servlet/ICBCINBSEBusinessServlet";
            private string _interfaceName = "ICBC_PERBANK_B2C";
            private string _interfaceVersion = "1.0.0.11";
            private string _orderid;
            /// <summary>
            /// 订单金额
            /// </summary>
            private string _amount;
            /// <summary>
            /// 支付币种
            /// </summary>
            private string _curType = "001";
            /// <summary>
            /// 商户代码
            /// </summary>
            private string _merID = "向银行申请";
            /// <summary>
            /// 商户账号
            /// </summary>
            private string _merAcct = "交易账号";
            /// <summary>
            /// 检验联名标志
            /// 取值“1”:客户支付时,网银判断该客户是否与商户联名,是则按上送金额扣帐,否则展现未联名错误;取值“0”:不检验客户是否与商户联名,按上送金额扣帐。
            /// </summary>
            private string _verifyJoinFlag = "0";
            /// <summary>
            /// 通知类型
            /// 在交易转账处理完成后把交易结果通知商户的处理模式。
            /// 取值“HS”:在交易完成后实时将通知信息以HTTP协议POST方式,主动发送给商户,发送地址为商户端随订单数据提交的接收工行支付结果的URL即表单中的merURL字段;
            /// 取值“AG”:在交易完成后不通知商户。商户需使用浏览器登录工行的B2C商户服务网站,或者使用工行提供的客户端程序API主动获取通知信息。
            /// </summary>
            private string _notifyType = "HS";
            /// <summary>
            /// 返回商户URL
            /// 必须合法的URL,交易结束,将客户引导到商户的此url,即通过客户浏览器post交易结果信息到商户的此URL
            /// 注意:该URL应使用http协议(不能使用https协议),端口号应为80或不指定。
            /// </summary>
            private string _merURL;
            /// <summary>
            /// 结果发送类型
            /// 选输
            /// 取值“0”:无论支付成功或者失败,银行都向商户发送交易通知信息;
            /// 取值“1”,银行只向商户发送交易成功的通知信息。
            /// 只有通知方式为HS时此值有效,如果使用AG方式,可不上送此项,但签名数据中必须包含此项,取值可为空。
            /// </summary>
            private string _resultType = "1";
            /// <summary>
            /// 支付日期
            /// </summary>
            private string _orderDate = System.DateTime.Now.ToString("yyyyMMddHHmmss");
    
            /// <summary>
            /// 订单签名数据
            /// 必输,
            ///商户使用工行提供的签名API和商户证书将tranData的xml明文串进行签名,得到二进制签名数据,然后进行BASE64编码后得到可视的merSignMsg;
            ///注意:签名时是针对tranData的xml明文,不是将tranData进行BASE64编码后的串;
            /// </summary>
            private string _merSignMsg;
    
            /// <summary>
            /// 商城证书公钥
            /// 商户用二进制方式读取证书公钥文件后,进行BASE64编码后产生的字符串;
            /// </summary>
            private string _merCert;
    
            /// <summary>
            /// 商品编号
            /// </summary>
            private string _goodsID = "001";
            /// <summary>
            /// 商品名称
            /// </summary>
            private string _goodsName = "";
            /// <summary>
            /// 商品数量
            /// </summary>
            private string _goodsNum = "1";
    
            /// <summary>
            /// 已含运费金额
            /// </summary>
            private string _carriageAmt;
    
            /// <summary>
            /// 备注字段1
            /// </summary>
            private string _remark1;
    
    
            /// <summary>
            /// 备注字段2
            /// </summary>
            private string _remark2;
    
            /// <summary>
            /// 商城提示
            /// </summary>
            private string _merHint;
    
            /// <summary>
            /// 整合所有交易数据形成的xml明文串,并做BASE64编码;
            /// 具体格式定义见下文;
            /// 注意:
            /// 需有xml头属性;整个字段使用BASE64编码;
            /// xml明文中没有回车换行和多余空格;
            /// </summary>
            private string _tranData;
    
            /// <summary>
            /// 上送商户网站域名(支持通配符,例如“*.某B2C商城.com”),如果上送,工行会在客户支付订单时,校验商户上送域名与客户跳转工行支付页面之前网站域名的一致性。
            /// </summary>
            private string _merReference = System.Configuration.ConfigurationManager.AppSettings["WebUrl"];
    
            private string _merIP = System.Configuration.ConfigurationManager.AppSettings["WebIP"];
    
    
            private bool _isCheck = false;
    
            /// <summary>
            /// 是否检测成功
            /// </summary>
            public bool IsCheck
            {
                get { return _isCheck; }
                set { _isCheck = value; }
            }
    
            /// <summary>
            /// 服务域名
            /// </summary>
            public string MerReference
            {
                get { return _merReference; }
                set { _merReference = value; }
            }
    
            /// <summary>
            /// 服务IP
            /// </summary>
            public string MerIP
            {
                get { return _merIP; }
                set { _merIP = value; }
            }
    
            /// <summary>
            /// 报文数据
            /// </summary>
            public string TranData
            {
                get { return _tranData; }
                set { _tranData = value; }
            }
    
            /// <summary>
            /// 工商支付接口路径
            /// </summary>
            public string OrderPostUrl
            {
                get { return _orderPostUrl; }
                set { _orderPostUrl = value; }
            }
    
            /// <summary>
            /// 接口名称
            /// </summary>
            public string InterfaceName
            {
                get { return _interfaceName; }
                set { _interfaceName = value; }
            }
    
            /// <summary>
            /// 接口版本号
            /// </summary>
            public string InterfaceVersion
            {
                get { return _interfaceVersion; }
                set { _interfaceVersion = value; }
            }
    
            /// <summary>
            /// 订单号
            /// </summary>
            public string Orderid
            {
                get { return _orderid; }
                set { _orderid = value; }
            }
    
            /// <summary>
            /// 订单金额
            /// </summary>
            public string Amount
            {
                get { return _amount; }
                set { _amount = value; }
            }
    
            /// <summary>
            /// 支付币种 RMB:001
            /// </summary>
            public string CurType
            {
                get { return _curType; }
                set { _curType = value; }
            }
    
            /// <summary>
            /// 商户代码
            /// </summary>
            public string MerID
            {
                get { return _merID; }
                set { _merID = value; }
            }
    
            /// <summary>
            /// 商户账号
            /// </summary>
            public string MerAcct
            {
                get { return _merAcct; }
                set { _merAcct = value; }
            }
    
            /// <summary>
            /// 检验联名标志 
            /// 取值“1”:客户支付时,网银判断该客户是否与商户联名,是则按上送金额扣帐,否则展现未联名错误;
            /// 取值“0”:不检验客户是否与商户联名,按上送金额扣帐。
            /// </summary>
            public string VerifyJoinFlag
            {
                get { return _verifyJoinFlag; }
                set { _verifyJoinFlag = value; }
            }
    
            /// <summary>
            /// 通知类型
            /// 取值“HS”:在交易完成后实时将通知信息以HTTP协议POST方式,主动发送给商户,发送地址为商户端随订单数据提交的接收工行支付结果的URL即表单中的merURL字段;
            /// 取值“AG”:在交易完成后不通知商户。商户需使用浏览器登录工行的B2C商户服务网站,或者使用工行提供的客户端程序API主动获取通知信息。
            /// </summary>
            public string NotifyType
            {
                get { return _notifyType; }
                set { _notifyType = value; }
            }
    
            /// <summary>
            /// 返回商户URL
            /// </summary>
            public string MerURL
            {
                get { return _merURL; }
                set { _merURL = value; }
            }
    
            /// <summary>
            /// 结果发送类型
            /// </summary>
            public string ResultType
            {
                get { return _resultType; }
                set { _resultType = value; }
            }
    
            /// <summary>
            /// 交易日期时间
            /// </summary>
            public string OrderDate
            {
                get { return _orderDate; }
                set { _orderDate = value; }
            }
    
            /// <summary>
            /// 订单签名数据
            /// </summary>
            public string MerSignMsg
            {
                get { return _merSignMsg; }
                set { _merSignMsg = value; }
            }
    
            /// <summary>
            /// 商城证书公钥
            /// </summary>
            public string MerCert
            {
                get { return _merCert; }
                set { _merCert = value; }
            }
    
            /// <summary>
            /// 商品编号
            /// </summary>
            public string GoodsID
            {
                get { return _goodsID; }
                set { _goodsID = value; }
            }
    
            /// <summary>
            /// 商品名称
            /// </summary>
            public string GoodsName
            {
                get { return _goodsName; }
                set { _goodsName = value; }
            }
    
            /// <summary>
            /// 商品数量
            /// </summary>
            public string GoodsNum
            {
                get { return _goodsNum; }
                set { _goodsNum = value; }
            }
    
            /// <summary>
            /// 已含运费金额
            /// </summary>
            public string CarriageAmt
            {
                get { return _carriageAmt; }
                set { _carriageAmt = value; }
            }
    
            /// <summary>
            /// 备注字段1
            /// </summary>
            public string Remark1
            {
                get { return _remark1; }
                set { _remark1 = value; }
            }
    
            /// <summary>
            /// 备注字段2
            /// </summary>
            public string Remark2
            {
                get { return _remark2; }
                set { _remark2 = value; }
            }
    
            /// <summary>
            /// 商城提示
            /// </summary>
            public string MerHint
            {
                get { return _merHint; }
                set { _merHint = value; }
            }
        }
    实体类
      if (Request.Form["notifyData"] != null)
                {
                    try
                    {
                        ICBC icbcInfo = new ICBC();
                        icbcInfo.TranData = Request.Form["notifyData"];
                        icbcInfo.MerSignMsg = Request.Form["signMsg"].ToString();
                        icbcInfo = CBCOnlinePayment.CBCPayOnline.GetCheckReturnInfo(icbcInfo);
                        //自定义返回的变量
                        this.userIdCardNumber = Inhua.Common.Encryption.Decrypt(Request.Form["merVAR"].ToString());
                        var query = SpringFactory.BusinessFactory.GetStudent(userIdCardNumber);
                        if (icbcInfo.IsCheck)
                        {
                            DataSet myds = new DataSet();
                            StringReader strReader = new StringReader(icbcInfo.TranData);
                            myds.ReadXml(strReader);
                            DataTable mytable = new DataTable();
                            mytable = myds.Tables["bank"];
                            string payDate = myds.Tables["orderInfo"].Rows[0]["orderDate"].ToString().Trim();
                            string amount = myds.Tables["subOrderInfo"].Rows[0]["amount"].ToString().Trim();
                            string orderid = myds.Tables["subOrderInfo"].Rows[0]["orderid"].ToString().Trim();
                            if (null != mytable && mytable.Rows.Count > 0)
                            {
                                if (mytable.Rows[0]["tranStat"].ToString().Trim() == "1")
                                {
                                    //这里做成功操作
                                    string s2 = payDate.Substring(0, 4) + "-" + payDate.Substring(4, 2) + "-" + payDate.Substring(6, 2) + " " + payDate.Substring(8, 2) + ":" + payDate.Substring(10, 2);
                                    DateTime time1 = DateTime.Parse(s2);
                                    query.PaymentSucceed(amount, orderid);//支付成功,修改余额
                                }
                                else
                                {
                                    SpringFactory.BusinessFactory.GetStudent(this.userIdCardNumber).AddOrderLogs("0", false, "", "未知错误");
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        SpringFactory.BusinessFactory.GetStudent(this.userIdCardNumber).AddOrderLogs("0", false, "", ex.Message);
                    }
                }
                else
                {
                    var result = SpringFactory.BusinessFactory.GetBusinessAnonymousUser();
                    result.AddLogs("银行数据返回失败,请通知管理员!");
                }
    
            }
    银行回调页面代码
        public static class CBCPayOnline
        {
            private static string amount;
    
            /// <summary>
            /// 银行证书文件地址
            /// </summary>
            static string strCertFN = HttpContext.Current.Server.MapPath("~/ICBCcert/ebb2cpublic.crt");
    
            /// <summary>
            /// 商户证书文件地址
            /// </summary>
            static string strCertFNM = HttpContext.Current.Server.MapPath("~/ICBCcert/zzjy001.crt");
    
            /// <summary>
            /// 私钥文件名
            /// </summary>
            static string strKeyFN = HttpContext.Current.Server.MapPath("~/ICBCcert/zzjy001.key");
    
            /// <summary>
            /// 私钥口令
            /// </summary>
            static string strKey = "12345678";
            static string api_url = "https://corporbank.icbc.com.cn/servlet/ICBCINBSEBusinessServlet";
            static string post_params = "APIName=EAPI&APIVersion=001.001.002.001&MerReqData=";
            static string cert_path = HttpContext.Current.Server.MapPath("~/ICBCcert/zzjy001.pfx");
            //商户证书 HttpContext.Current.Server.MapPath("~/ICBCcert/rcsc1.crt");
    
            public static void Load()
            {
                System.Threading.Thread t = new System.Threading.Thread(CheckOrder);
                t.Start();
            }
    
            static CBCPayOnline()
            {
    
            }
            /// <summary>
            /// 检查未提交订单
            /// </summary>
            public static void CheckOrder()
            {
                var query = SpringFactory.BusinessFactory.GetBusinessAnonymousUser();
                while (true)
                {
                    var list = query.GetOrderPayList();
                    ICBC icbcInfo = new ICBC();
                    string outMess = "";
                    foreach (var l1 in list)
                    {
                        try
                        {
                            var user = SpringFactory.BusinessFactory.GetStudent(l1.userName);
                            string mess = CheckOrder(l1.OrderID, l1.PayDate.ToString("yyyyMMdd"), icbcInfo.MerID, icbcInfo.MerAcct, out outMess);
                            if (mess.Length > 5)//未返回错误编码,返回xml数据
                            {
                                DataSet myds = new DataSet();
                                StringReader strReader = new StringReader(mess);
                                myds.ReadXml(strReader);
                                string stat = myds.Tables["out"].Rows[0]["tranStat"].ToString();
                                if (stat == "1" || stat == "0")
                                {
                                    amount = myds.Tables["out"].Rows[0]["amount"].ToString();
                                    user.PaymentSucceed(amount, l1.OrderID);
                                }
                            }
                            else
                            {
                                string pays = "";
                                switch (mess)
                                {
                                    case "40972": pays = "API查询的订单不存在"; break;
                                    case "40973": pays = "API查询过程中系统异常"; break;
                                    case "40976": pays = "API查询系统异常"; break;
                                    case "40977": pays = "商户证书信息错"; break;
                                    case "40978": pays = "解包商户请求数据报错"; break;
                                    case "40979": pays = "查询的订单不存在"; break;
                                    case "40980": pays = "API查询过程中系统异常"; break;
                                    case "40981": pays = "给商户打包返回数据错"; break;
    
                                    case "40982": pays = "系统错误"; break;
                                    case "40983": pays = "查询的订单不唯一"; break;
                                    case "40987": pays = "商户代码或者商城账号有误"; break;
                                    case "40947": pays = "给商户打包返回数据错"; break;
                                    case "40948": pays = "商城状态非法"; break;
                                    case "40949": pays = "商城类别非法"; break;
    
                                    case "40950": pays = "商城应用类别非法"; break;
                                    case "40951": pays = "商户证书id状态非法"; break;
                                    case "40952": pays = "商户证书id未绑定"; break;
                                    case "40953": pays = "商户id权限非法"; break;
                                    case "40954": pays = "检查商户状态时数据库异常"; break;
                                }
                                //清除不存在的订单
                                if (mess == "40972")
                                {
                                    if (DateTime.Now.AddMonths(-6) > l1.PayDate)
                                    {
                                        var result = SpringFactory.BusinessFactory.GetStudent(l1.userName);
                                        result.OrderFaild(l1.OrderID);
                                    }
    
                                }
                                else//添加错误日志
                                {
                                    SpringFactory.BusinessFactory.GetBusinessAnonymousUser().AddLogs("错误编码:" + mess + "" + pays, l1.OrderID);
                                }
                            }
                        }
                        catch (Exception e)
                        {
                            SpringFactory.BusinessFactory.GetBusinessAnonymousUser().AddLogs(e.Message, l1.OrderID);
                            throw e;
                        }
                    }
                    System.Threading.Thread.Sleep(1000 * 60 * 30);
                }
            }
    
            /// <summary>
            /// 根据订单号查询订单
            /// </summary>
            /// <param name="orderID"></param>
            /// <returns></returns>
            public static string ChenkOrder(string orderID, DateTime? payDate, string userIdCardNumber)
            {
                if (orderID.Trim().Length != 24)
                {
                    return "订单号不正确,请输入24位订单号";
                }
    
                ICBC icbcInfo = new ICBC();
    
                //查询充值日志
                var logModel = SpringFactory.BusinessFactory.GetBusinessAnonymousUser().GetPayLogsByOrderId(orderID, userIdCardNumber);
                if (logModel != null)
                {
                    return "已经缴费成功。";
                }
    
                string outMess = "";
                string zfrq = orderID.Substring(0, 8);//支付日期
                if (payDate != null && payDate != DateTime.MinValue)
                {
                    zfrq = payDate.Value.ToString("yyyyMMdd");
                }
                var payModel = SpringFactory.BusinessFactory.GetBusinessAnonymousUser().GetOrderModel(orderID, userIdCardNumber);
                string mess = CheckOrder(orderID, zfrq, icbcInfo.MerID, icbcInfo.MerAcct, out outMess);
                if (mess.Length > 5)//未返回错误编码,返回xml数据
                {
                    DataSet myds = new DataSet();
                    StringReader strReader = new StringReader(mess);
                    try
                    {
                        myds.ReadXml(strReader);
                    }
                    catch
                    {
                        throw new Exception("错误数据:" + mess);
                    }
                    //查询订单列表
                    var user = SpringFactory.BusinessFactory.GetStudent(userIdCardNumber);
                    string stat = myds.Tables["out"].Rows[0]["tranStat"].ToString();
                    amount = myds.Tables["out"].Rows[0]["amount"].ToString();
                    if (stat == "1" || stat == "0")
                    {
                        if (payModel != null)
                        {
                            user.PaymentSucceed(amount, orderID);
                            return "已经支付成功!
    订单号" + orderID + "
    支付金额:" + amount;
                        }
                        else
                        {
                            string payTimes = myds.Tables["in"].Rows[0]["tranDate"].ToString();
                            user.UpdatePaymentInformation(amount, orderID, userIdCardNumber);
                            return "已经支付成功!";
                        }
                    }
                    else
                    {
                        string pays = "";
                        if (stat == "2")
                            pays = "支付失败";
                        else
                            pays = "可疑交易";
                        //添加错误日志
                        SpringFactory.BusinessFactory.GetBusinessAnonymousUser().AddLogs("支付失败或可疑交易," + stat, orderID);
                        return pays;
                    }
                }
                else
                {
                    string pays = "";
                    switch (mess)
                    {
                        case "40972": pays = "API查询的订单不存在"; break;
                        case "40973": pays = "API查询过程中系统异常"; break;
                        case "40976": pays = "API查询系统异常"; break;
                        case "40977": pays = "商户证书信息错"; break;
                        case "40978": pays = "解包商户请求数据报错"; break;
                        case "40979": pays = "查询的订单不存在"; break;
                        case "40980": pays = "API查询过程中系统异常"; break;
                        case "40981": pays = "给商户打包返回数据错"; break;
    
                        case "40982": pays = "系统错误"; break;
                        case "40983": pays = "查询的订单不唯一"; break;
                        case "40987": pays = "商户代码或者商城账号有误"; break;
                        case "40947": pays = "给商户打包返回数据错"; break;
                        case "40948": pays = "商城状态非法"; break;
                        case "40949": pays = "商城类别非法"; break;
    
                        case "40950": pays = "商城应用类别非法"; break;
                        case "40951": pays = "商户证书id状态非法"; break;
                        case "40952": pays = "商户证书id未绑定"; break;
                        case "40953": pays = "商户id权限非法"; break;
                        case "40954": pays = "检查商户状态时数据库异常"; break;
    
                    }
                    //清除不存在的订单
                    if (mess == "40972")
                    {
                        if (payModel != null)
                        {
                            var result = SpringFactory.BusinessFactory.GetStudent(payModel.userName);
                            result.OrderFaild(orderID);
                        }
    
                    }
                    else//添加失败失败日志
                    {
                        if (payModel != null)
                        {
                            SpringFactory.BusinessFactory.GetBusinessAnonymousUser().AddLogs("错误编码:" + mess + pays, orderID);
                        }
                    }
                    return pays;
                }
            }
    
            /// <summary>
            /// 获取工商银行验证信息
            /// </summary>
            /// <param name="argIcbc"></param>
            /// <returns></returns>
            public static DataTransfer.ICBC GetCheckInfo(DataTransfer.ICBC argIcbc)
            {
                string strMerSignMsg = string.Empty;
                B2CUtil icbcObj = new B2CUtil();
                int jg = icbcObj.init(strCertFN, strCertFNM, strKeyFN, strKey);
                if (jg == 0)
                {
                    argIcbc.MerSignMsg = icbcObj.signC(argIcbc.TranData, argIcbc.TranData.Length);
                    if (argIcbc.MerSignMsg == "")
                    {
                        int returnCode = icbcObj.getRC();
                        SpringFactory.BusinessFactory.GetBusinessAnonymousUser().AddLogs("错误编码:" + returnCode + ",签名错误", "");
                    }
                    argIcbc.MerCert = icbcObj.getCert(1);
                    byte[] bytes = Encoding.Default.GetBytes(argIcbc.TranData);
                    argIcbc.TranData = Convert.ToBase64String(bytes);
                }
                else
                {
                    SpringFactory.BusinessFactory.GetBusinessAnonymousUser().AddLogs(jg.ToString() + ",证书错误或私钥错误编码", "");
                }
                return argIcbc;
            }
    
            /// <summary>
            /// 获取工商银行验证信息
            /// </summary>
            /// <param name="argIcbc"></param>
            /// <returns></returns>
            public static DataTransfer.ICBC GetCheckReturnInfo(DataTransfer.ICBC argIcbc)
            {
                string strMerSignMsg = string.Empty;
                B2CUtil icbcObj = new B2CUtil();
    
                if (icbcObj.init(strCertFN, strCertFNM, strKeyFN, strKey) == 0)
                {
                    argIcbc.TranData = Decode(argIcbc.TranData);
                    //判断验证银行签名是否成功
                    if (icbcObj.verifySignC(argIcbc.TranData, argIcbc.TranData.Length, argIcbc.MerSignMsg, argIcbc.MerSignMsg.Length) == 0)
                    {
                        argIcbc.IsCheck = true;
                    }
                    else
                        argIcbc.IsCheck = false;//todo:签名失败
                }
                else
                {
                    argIcbc.IsCheck = false;
                }
                return argIcbc;
            }
    
            /// <summary>
            /// 加密信息
            /// </summary>
            /// <param name="data"></param>
            /// <returns></returns>
            public static string Encode(string data)
            {
                try
                {
                    return Inhua.Common.Encryption.Encrypt(data);
                }
                catch (Exception e)
                {
                    throw new Exception(e.Message);
                }
            }
    
            /// <summary>
            /// 解密信息
            /// </summary>
            /// <param name="str"></param>
            /// <returns></returns>
            public static string Decode(string str)
            {
                byte[] outputb = Convert.FromBase64String(str);
                string orgStr = Encoding.Default.GetString(outputb);
                return orgStr;
            }
    
            /// <summary>
            /// 查询订单
            /// </summary>
            /// <param name="strOrderNum">订单号</param>
            /// <param name="strTranDate">交易日期</param>
            /// <param name="strShopCode">商家代码</param>
            /// <param name="strShopAccount">商城账号</param>
            /// <param name="errInfo"></param>
            /// <returns></returns>
            public static string CheckOrder(string strOrderNum, string strTranDate, string strShopCode, string strShopAccount, out string errInfo)
            {
                try
                {
                    errInfo = string.Empty;
                    StringBuilder sb = new StringBuilder();
                    sb.Append("<?xml  version="1.0" encoding="GBK" standalone="no" ?><ICBCAPI><in><orderNum>");
                    sb.Append(strOrderNum);
                    sb.Append("</orderNum><tranDate>");
                    sb.Append(strTranDate);
                    sb.Append("</tranDate><ShopCode>");
                    sb.Append(strShopCode);
                    sb.Append("</ShopCode><ShopAccount>");
                    sb.Append(strShopAccount);
                    sb.Append("</ShopAccount></in></ICBCAPI>");
                    string post_data = post_params + sb.ToString();
                    string retruenstring = PostDataBySSL(post_data, api_url, cert_path, strKey, out errInfo);
                    if (retruenstring.Length <= 5)
                    {
                        return retruenstring;
                    }
                    return HttpUtility.UrlDecode(retruenstring);
                }
                catch (Exception ex)
                {
                    var result = SpringFactory.BusinessFactory.GetBusinessAnonymousUser();
                    result.AddLogs(ex.Message, "");
                    errInfo = ex.Message;
                    return ex.Message;
                }
            }
    
            /// <summary>
            /// 发送SSL加密请求
            /// </summary>
            /// <param name="post_data"></param>
            /// <param name="url"></param>
            /// <param name="cert_path"></param>
            /// <param name="cert_password"></param>
            /// <param name="errInfo"></param>
            /// <returns></returns>
            public static string PostDataBySSL(string post_data, string url, string cert_path, string cert_password, out string errInfo)
            {
                errInfo = string.Empty;
                try
                {
                    ASCIIEncoding encoding = new ASCIIEncoding();
                    byte[] data = encoding.GetBytes(post_data);
                    if (cert_path != string.Empty)
                        ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate);
    
                    WebRequest webRequest = WebRequest.Create(url);
                    HttpWebRequest httpRequest = webRequest as HttpWebRequest;
    
                    if (cert_path.ToLower().EndsWith(".cer"))
                    {
                        httpRequest.ClientCertificates.Add(X509Certificate.CreateFromCertFile(cert_path));
                    }
    
                    else
                    {
                        //SpringFactory.BusinessFactory.GetBusinessAnonymousUser().AddLogs(cert_path);
                        httpRequest.ClientCertificates.Add(new X509Certificate2(cert_path, cert_password, X509KeyStorageFlags.MachineKeySet));
    
    
                    }
                    httpRequest.KeepAlive = true;
                    httpRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)";
                    httpRequest.ContentType = "application/x-www-form-urlencoded";
                    httpRequest.Method = "POST";
    
                    httpRequest.ContentLength = data.Length;
                    Stream requestStream = httpRequest.GetRequestStream();
                    requestStream.Write(data, 0, data.Length);
                    requestStream.Close();
                    Stream responseStream = null;
                    responseStream = httpRequest.GetResponse().GetResponseStream();
                    string stringResponse = string.Empty;
                    if (responseStream != null)
                    {
                        using (StreamReader responseReader =
                            new StreamReader(responseStream, Encoding.GetEncoding("GBK")))
                        {
                            stringResponse = responseReader.ReadToEnd();
                        }
                        responseStream.Close();
                    }
                    return stringResponse;
                }
                catch (Exception e)
                {
                    errInfo = e.Message;
    
                    SpringFactory.BusinessFactory.GetBusinessAnonymousUser().AddLogs(e.Message, "");
                    return string.Empty;
                }
            }
    
            public static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
            {
                return true;
            }
    
        }
    逻辑操作类

    现在来说一说可能遇到的问题(我本人遇到了以下错误,windows server2012的服务器):

    1、发布到服务器后,跳转到支付页面时报下图所示错误:

    提问的时候有人说是ICBCEBankUtil.dll没有注册的原因,但事实上我注册过多次,每次都提示注册成功。搜索一番之后终于解决了这个问题,打开IIS 选择,应用程序池-选择你的程序所使用的应用程序池-右键-高级设置-启用32位应用程序项设置为True(默认False)。

    如下图所示:

    2、做工行查询接口的时候在本地没有问题,发布到服务器上之后一直报错系统找不到指定的文件,而服务器上证书文件是存在的。具体代码如下:

    我排查过在执行 httpRequest.ClientCertificates.Add(new X509Certificate2(cert_path, cert_password));这一句代码的时候抛异常了,“系统找不到指定的文件“,但是证书文件我已经上产到服务器上了。折腾了N长时间后终于解决了,把原来的X509Certificate2 cert = new X509Certificate2(cert_path, "12345678");加了一个参数改为:X509Certificate2 cert=  new X509Certificate2(cert_path, cert_password, X509KeyStorageFlags.MachineKeySet) 。具体过程参考我的博问http://q.cnblogs.com/q/54288/

    这篇文章就写到这里,希望能对大家有所帮助

  • 相关阅读:
    flask-admin章节二:wtforms的使用以及在数据库场景中使用QuerySelectField代替SelectField
    flask-admin章节一:使用chartkick画报表
    flask-admin众博客概述
    python smtplib发送邮件遇到的认证问题
    python logging模块可能会令人困惑的地方
    Markdown
    SpringBoot-启动过程
    SpringBoot-目录
    AbstractQueuedSynchronizer
    ThreadLocal
  • 原文地址:https://www.cnblogs.com/fangyangwa/p/3335224.html
Copyright © 2011-2022 走看看