/// <summary> /// 提交支付指令 /// </summary> /// <param name="caller">调用者</param> /// <param name="payments">支付单据数组</param> /// <returns></returns> public BankReturnModel <PaymentInfo[]> submitPayment(CallerInfo caller, PaymentInfo[] payments) { if (payments.Length < 1) { throw new Exception("没有支付信息!"); } string xmlString = ICBCNCHelper.GetXmlString("PAYENT"); XML_EASY xmlPay = new XML_EASY(xmlString); string xmlRd = xmlPay.GetXMLNode("rd"); var newXmlStr = string.Empty; decimal amount = 0; int num = 0; //支付笔数或序号 StringBuilder sb = new StringBuilder(); XML_EASY xmlTmp = new XML_EASY(); string s = string.Empty; int iseq = 0; payments = payments.OrderBy(t => t.iSeqno).ToArray(); //iSeqno 在银行端支付时按rd的顺序,不按iSeqno来,需要先按iSeqno排序后,在生成rd foreach (PaymentInfo pay in payments) { num++; iseq = string.IsNullOrEmpty(pay.iSeqno)? num : int.Parse(pay.iSeqno); sb.Append("<rd>"); sb.Append(this.dealwithPaymentRd(xmlRd, pay, iseq)); sb.Append("</rd>"); if (pay.amount != 0) { amount += pay.amount; } } xmlPay.RepXMLNode("rd", sb.ToString()); //设置头部信息 xmlPay.SetXMLNode("BankCode", string.IsNullOrEmpty(payments[0].bankAcnt.swiftCode)?"102": payments[0].bankAcnt.swiftCode); //工行为 "102" xmlPay.SetXMLNode("CIS", ConfigurationManager.AppSettings["cis"]); xmlPay.SetXMLNode("ID", ConfigurationManager.AppSettings["id"]); //设置支付信息 xmlPay.SetXMLNode("TotalNum", num.ToString("f0")); xmlPay.SetXMLNode("TotalAmt", amount.ToString("f0")); newXmlStr = xmlPay.GetXML(); string result = this.ICBC_YQHL(newXmlStr); xmlPay.SetXML(result); if (xmlPay.LocateString("<error>") >= 0) { result = xmlPay.GetXMLNode("error"); throw new Exception(result); } if (!string.IsNullOrEmpty(result)) { XML_EASY xml_easy1 = new XML_EASY(result); BankReturnModel <PaymentInfo[]> retMo = new BankReturnModel <PaymentInfo[]>(); retMo.bankCode = xml_easy1.GetXMLNode("BankCode"); retMo.transCode = xml_easy1.GetXMLNode("TransCode"); retMo.tranDate = xml_easy1.GetXMLNode("TranDate"); retMo.tranTime = xml_easy1.GetXMLNode("TranTime"); retMo.fSeqno = xml_easy1.GetXMLNode("fSeqno"); retMo.retCode = xml_easy1.GetXMLNode("RetCode"); retMo.retMsg = xml_easy1.GetXMLNode("RetMsg"); retMo.bankSerialNo = xml_easy1.GetXMLNode("SerialNo"); string resultCode = xml_easy1.GetXMLNode("Result"); if (string.IsNullOrEmpty(resultCode)) { //文件级返回 ////再次发送指令查询状态 //if (retMo.retCode == "0") //{ // Thread.Sleep(20 * 1000); //延时后再查询 // return this.getPaymentState(caller, payments[0].bankAcnt.bankVersionInfo, retMo.fSeqno); //} //直接返回结果 retMo.detailData = new BankReturnDetailModel <PaymentInfo[]>(); retMo.detailData.resultCode = resultCode; retMo.detailData.iRetCode = xml_easy1.GetXMLNode("iRetCode"); retMo.detailData.iRetMsg = xml_easy1.GetXMLNode("iRetMsg"); retMo.detailData.businessRefNo = xml_easy1.GetXMLNode("Ref"); retMo.detailData.infoData = null; //payment; return(retMo); } else { //单笔明细支付,指令级返回 //retMo.detailData = new BankReturnDetailModel<PaymentInfo[]>(); //retMo.detailData.resultCode = resultCode; //retMo.detailData.iRetCode = xml_easy1.GetXMLNode("iRetCode"); //retMo.detailData.iRetMsg = xml_easy1.GetXMLNode("iRetMsg"); //retMo.detailData.businessRefNo = xml_easy1.GetXMLNode("Ref"); //retMo.detailData.infoData = null; //payment; string rdString = xml_easy1.GetXMLNode("rd"); int rdIndex = xml_easy1.Index(); //string result = xmlPayState.GetXMLNode("Result", rdIndex); if (!string.IsNullOrEmpty(rdString)) { var states = new List <PaymentInfo>(); PaymentInfo pInfo = null; //循环获取明细 do { pInfo = getPaymentInfofromRd(payments[0].bankAcnt.bankVersionInfo, rdString); pInfo.paymentSeqNo = xml_easy1.GetXMLNode("fSeqno"); if (pInfo.submitDate == DateTime.MinValue) { pInfo.submitDate = this.convertToDateTime(xml_easy1.GetXMLNode("TranDate") + xml_easy1.GetXMLNode("TranTime")); } states.Add(pInfo); rdString = xml_easy1.GetXMLNode("rd", rdIndex); rdIndex = xml_easy1.Index(); }while (!string.IsNullOrEmpty(rdString)); retMo.detailData = new BankReturnDetailModel <PaymentInfo[]>(); retMo.detailData.infoData = states.ToArray(); return(retMo); } } return(retMo); } return(null); }