最近在做工行支付接口,看起来没什么问题,但就是在支付完毕后老是停留在工行支付成功的界面,没有跳转到指定的网址。
下面是代码:
1.构建form
public static string BuildFormHtml(string orderid, string amount, string merCustomID) { string orderTime = System.DateTime.Now.ToString("yyyyMMddHHmmss"); List<XElement> xellis = xel.Elements("value").ToList(); string interfaceName = xellis.Find(p => p.Attribute("key").Value == "interfaceName").Value; string interfaceVersion = xellis.Find(p => p.Attribute("key").Value == "interfaceVersion").Value; string merID = xellis.Find(p => p.Attribute("key").Value == "merID").Value; //string xmlPath = xellis.Find(p => p.Attribute("key").Value == "x509").Value; string certFNM = xellis.Find(p => p.Attribute("key").Value == "certFNM").Value; string keyFN = xellis.Find(p => p.Attribute("key").Value == "keyFN").Value; string key = xellis.Find(p => p.Attribute("key").Value == "key").Value; string merAcct = xellis.Find(p => p.Attribute("key").Value == "merAcct").Value; string installmentTimes = xellis.Find(p => p.Attribute("key").Value == "installmentTimes").Value; string verifyJoinFlag = xellis.Find(p => p.Attribute("key").Value == "verifyJoinFlag").Value; string curType = xellis.Find(p => p.Attribute("key").Value == "curType").Value; string creditType = xellis.Find(p => p.Attribute("key").Value == "creditType").Value; string notifyType = xellis.Find(p => p.Attribute("key").Value == "notifyType").Value; string resultType = xellis.Find(p => p.Attribute("key").Value == "resultType").Value; string goodsType = xellis.Find(p => p.Attribute("key").Value == "goodsType").Value; string merURL = xellis.Find(p => p.Attribute("key").Value == "merURL").Value; string actionURL = xellis.Find(p => p.Attribute("key").Value == "actionURL").Value; string merReference = xellis.Find(p => p.Attribute("key").Value == "merReference").Value; string CertFN = xellis.Find(p => p.Attribute("key").Value == "certFN").Value; B2CUtil b2c = null; try { b2c = new B2CUtil(); int rc = b2c.init(CertFN, certFNM, keyFN, key); if (rc != 0) { throw new NotImplementedException("工商银行初始化对象失败!B2CUtil.init() "); } } catch (Exception ex) { FileReadWrite.HandleError(new BusinessException(string.Format("工商银行初始化对象失败!B2CUtil.init()", "icbc.BuildFormHtml")), "order.yhhmall.com"); } #region trandata xml StringBuilder sb = new StringBuilder(); sb.Append("<?xml version=\"1.0\" encoding=\"GBK\" standalone=\"no\"?>"); sb.Append("<B2CReq>"); #region 版本栏 //接口名称 sb.Append("<interfaceName>" + interfaceName + "</interfaceName>"); //接口版本号 sb.Append("<interfaceVersion>" + interfaceVersion + "</interfaceVersion>"); #endregion #region orderInfo 订单信息 sb.Append("<orderInfo>"); // 交易日期时间 必输,格式为:YYYYMMDDHHmmss 要求在银行系统当前时间的前1小时和后12小时范围内,否则判定交易时间非法 sb.Append("<orderDate>" + orderTime + "</orderDate>"); // 支付币种 用来区分一笔支付的币种,目前工行只支持使用人民币(001)支付。取值: “001” sb.Append("<curType>" + xellis.Find(p => p.Attribute("key").Value == "curType").Value + "</curType>"); // 商户代码 必输,唯一确定一个商户的代码,由商户在工行开户时,由工行告知商户 sb.Append("<merID>" + xellis.Find(p => p.Attribute("key").Value == "merID").Value + "</merID>"); #region 订单集合 sb.Append("<subOrderInfoList>"); #region 子订单信息 sb.Append("<subOrderInfo>"); //订单号 必输,每笔订单都需要有不同的订单号;客户支付后商户网站产生的一个唯一的定单号,该订单号应该在相当长的时间内不重复。工行通过订单号加订单日期来唯一确认一笔订单的重复性。 sb.Append("<orderid>" + orderid + "</orderid>"); // 订单金额 必输,每笔订单一个;客户支付订单的总金额,一笔订单一个,以分为单位。不可以为零,必需符合金额标准。 sb.Append("<amount>" + double.Parse(amount) * 100 + "</amount>"); // 分期付款期数 必输,每笔订单一个;取值:1、3、6、9、12、18、24;1代表全额付款,必须为以上数值,否则订单校验不通过。 sb.Append("<installmentTimes>1</installmentTimes>"); //商户账号 必输,每笔订单一个,可以相同;商户入账账号,只能交易时指定。(商户付给银行手续费的账户,可以在开户的时候指定,也可以用交易指定方式;用交易指定方式则使用此商户账号) sb.Append("<merAcct>" + xellis.Find(p => p.Attribute("key").Value == "merAcct").Value + "</merAcct>"); // 商品编号 选输,每笔订单一个; sb.Append("<goodsID>" + orderid + "</goodsID>"); // 商品名称 sb.Append("<goodsName>XXX商城订单支付</goodsName>"); //商品数量 sb.Append("<goodsNum>1</goodsNum>"); //已含运费金额 sb.Append("<carriageAmt></carriageAmt>"); sb.Append("</subOrderInfo>"); #endregion sb.Append("</subOrderInfoList>"); #endregion sb.Append("</orderInfo>"); #endregion #region custom sb.Append("<custom>"); // 检验联名标志 必输, 取值“1”:客户支付时,网银判断该客户是否与商户联名,是则按上送金额扣帐,否则展现未联名错误;取值“0”:不检验客户是否与商户联名,按上送金额扣帐。 sb.Append("<verifyJoinFlag>" + xellis.Find(p => p.Attribute("key").Value == "verifyJoinFlag").Value + "</verifyJoinFlag>"); // 语言版本 选输,默认为中文版 取值:“EN_US”为英文版; 取值:“ZH_CN”或其他为中文版。注意:大小写敏感 sb.Append("<Language>ZH_CN</Language>"); sb.Append("</custom>"); #endregion #region message sb.Append("<message>"); // 支持订单支付的银行卡种类 必输 默认“2”。取值范围为0、1、2,其中0表示仅允许使用借记卡支付,1表示仅允许使用信用卡支付,2表示借记卡和信用卡都能对订单进行支付 sb.Append("<creditType>" + xellis.Find(p => p.Attribute("key").Value == "creditType").Value + "</creditType>"); // 通知类型 必输 //在交易转账处理完成后把交易结果通知商户的处理模式。取值“HS”:在交易完成后实时将通知信息以HTTP协议POST方式,主动发送给商户,发送地址为商户端随订单数据提交的接收工行支付结果的URL即表单中的merURL字段; //取值“AG”:在交易完成后不通知商户。商户需使用浏览器登录工行的B2C商户服务网站,或者使用工行提供的客户端程序API主动获取通知信息。 sb.Append("<notifyType>" + xellis.Find(p => p.Attribute("key").Value == "notifyType").Value + "</notifyType>"); //结果发送类型 选输 //取值“0”:无论支付成功或者失败,银行都向商户发送交易通知信息; //取值“1”,银行只向商户发送交易成功的通知信息。 //只有通知方式为HS时此值有效,如果使用AG方式,可不上送此项,但签名数据中必须包含此项,取值可为空。 sb.Append("<resultType>" + xellis.Find(p => p.Attribute("key").Value == "resultType").Value + "</resultType>"); // 商户reference 选输,上送商户网站域名,如果上送,工行会在客户支付订单时,校验商户上送域名与客户跳转工行支付页面之前网站域名的一致性。 sb.Append("<merReference>" + xellis.Find(p => p.Attribute("key").Value == "merReference").Value + "</merReference>"); // 客户端IP 选输,工行在支付页面显示该信息 sb.Append("<merCustomIp></merCustomIp>"); //虚拟商品/实 物商品标志位 取值“0”:虚拟商品; 取值“1”,实物商品。 sb.Append("<goodsType>" + xellis.Find(p => p.Attribute("key").Value == "goodsType").Value + "</goodsType>"); //买家用户号 选输 sb.Append("<merCustomID></merCustomID>"); //买家联系电话 选输,当商户上送goodsType值为“0”,该项必输 sb.Append("<merCustomPhone></merCustomPhone>"); //收货地址 选输,当商户上送goodsType值为“1”,该项必输 sb.Append("<goodsAddress></goodsAddress>"); // 订单备注 选输,工行在支付页面显示该信息 sb.Append("<merOrderRemark></merOrderRemark>"); //商城提示 选输 sb.Append("<merHint></merHint>"); // 备注字段1 sb.Append("<remark1></remark1>"); //备注字段1 sb.Append("<remark2></remark2>"); //返回商户URL sb.Append("<merURL>" + xellis.Find(p => p.Attribute("key").Value == "merURL").Value + "</merURL>"); //返回商户变量 选输 //商户自定义,当返回银行结果时,作为一个隐藏域变量,商户可以用此变量维护session等等。由客户端浏览器支付完成后提交通知结果时是明文传输,建议商户对此变量使用额外安全防范措施,如签名、base64 sb.Append("<merVAR>" + orderid + "</merVAR>"); sb.Append("</message>"); #endregion sb.Append("</B2CReq>"); #endregion string str = sb.ToString(); //加密数据 string tranData = EncodeBase64(Encoding.GetEncoding("gbk"), str); //Convert.ToBase64String(Encoding.GetEncoding("gbk"), str); string merSignMsg = b2c.signC(str, str.Length); //rc = b2c.verifySignC(str, str.Length, merSignMsg, merSignMsg.Length); //if (rc != 0) //{ // throw new NotImplementedException("工商银行签名失败!B2CUtil.verifySignC() "); //} string merCert = b2c.getCert(1); string sbHtml = ""; sbHtml += "<form name=\"form1\" method=\"post\" action=\"" + actionURL + "\">"; sbHtml += "<input type=\"hidden\" name=\"interfaceName\" value=\"" + interfaceName + "\">"; sbHtml += "<input type=\"hidden\" name=\"interfaceVersion\" value=\"" + interfaceVersion + "\">"; sbHtml += "<input type=\"hidden\" name=\"tranData\" value=\"" + tranData + "\">"; sbHtml += "<input type=\"hidden\" name=\"merSignMsg\" value=\"" + merSignMsg + "\">"; sbHtml += "<input type=\"hidden\" name=\"merCert\" value=\"" + merCert + "\">"; sbHtml += "</form><script type=\"text/javascript\">document.forms[0].submit();</script>"; return sbHtml; }
2.配置文件
<Items TypeEnum="ICBC"> <!-- 接口名称 --> <value key="interfaceName">ICBC_PERBANK_B2C</value> <!-- 接口版本号 --> <value key="interfaceVersion">1.0.0.11</value> <!-- --> <value key="certFNM">D:\银行资料\工行\yhhsc.crt</value> <!-- 公钥文件 --> <value key="keyFN">D:\银行资料\工行\yhhsc.key</value> <!-- 私钥文件 --> <value key="certFN">D:\银行资料\工行\生产公钥ebb2cpublic.crt</value> <!-- key --> <value key="key">3xxxxx0</value> <!--tranData START--> <value key="merID">1XXXXXXXXX5</value> <!--商户代码--> <value key="merAcct">1XXXXXXXXXXX6</value> <!--商户账号--> <value key="installmentTimes">1</value> <!--分期付款期数: 取值:1、3、6、9、12、18、24;1代表全额付款,必须为以上数值,否则订单校验不通过。--> <value key="verifyJoinFlag">0</value> <!--检验联名标志:取值“1”:客户支付时,网银判断该客户是否与商户联名,是则按上送金额扣帐,否则展现未联名错误;取值“0”:不检验客户是否与商户联名,按上送金额扣帐。--> <value key="curType">001</value> <!--支付币种--> <value key="creditType">2</value> <!--支持订单支付的银行卡种类:默认“2”。取值范围为0、1、2,其中0表示仅允许使用借记卡支付,1表示仅允许使用信用卡支付,2表示借记卡和信用卡都能对订单进行支付--> <value key="notifyType">HS</value> <!--通知类型:在交易转账处理完成后把交易结果通知商户的处理模式。取值“HS”:在交易完成后实时将通知信息以HTTP协议POST方式,主动发送给商户,发送地址为商户端随订单数据提交的接收工行支付结果的URL即表单中的merURL字段;取值“AG”:在交易完成后不通知商户。商户需使用浏览器登录工行的B2C商户服务网站,或者使用工行提供的客户端程序API主动获取通知信息。--> <value key="resultType">0</value> <!--结果发送类型:取值“0”:无论支付成功或者失败,银行都向商户发送交易通知信息;取值“1”,银行只向商户发送交易成功的通知信息。只有通知方式为HS时此值有效,如果使用AG方式,可不上送此项,但签名数据中必须包含此项,取值可为空。--> <value key="goodsType">1</value> <!--虚拟商品/实物商品标志位:取值“0”:虚拟商品;取值“1”,实物商品。--> <value key="merURL">http://yhh/order/QueryOrder.aspx?sharepay=ICBC</value> <!--返回商户URL--> <value key="actionURL">https://mybank.icbc.com.cn/servlet/ICBCINBSEBusinessServlet</value> <value key="merReference">yhh</value> <!--银行地址:如果是生产则为“mybank.icbc.com.cn”,若为模拟测试环境则为“mybank.dccnet.com.cn”--> <!--tranData END--> </Items>
求大婶帮忙
来学习学习!
关注中。。。。