首页 新闻 会员 周边

工行支付成功后没有跳转回网站【做过工行接口的请进】

0
悬赏园豆:40 [待解决问题]

最近在做工行支付接口,看起来没什么问题,但就是在支付完毕后老是停留在工行支付成功的界面,没有跳转到指定的网址。

下面是代码:

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;
        }
View Code

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>
View Code

求大婶帮忙

黑色雅痞的主页 黑色雅痞 | 初学一级 | 园豆:162
提问于:2013-12-12 10:49
< >
分享
所有回答(2)
0

来学习学习!

jerry-Tom | 园豆:4077 (老鸟四级) | 2013-12-12 11:14
0

关注中。。。。

bitbug | 园豆:470 (菜鸟二级) | 2013-12-12 12:41
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册