Ejemplo n.º 1
0
        public int RunService(string TradeType, string TradeMsg, ref string TradeMsgOut)
        {
            int    i    = 0;
            string guid = Guid.NewGuid().ToString("N").ToUpper();

            //log.Info("[" + guid + "]");
            log.InfoFormat("[{2}][{0}].IN  {1}", TradeType, LogUnity.I.ShowXml(TradeMsg), guid);
            //string outxml = "";
            IBaseMessage objtype = null;

            try
            {
                objtype = (IBaseMessage)ToolUnity.LoadAssembly(TradeType);
            }
            catch (Exception ex)
            {
                //outxml = ToolUnity.ServiceERR(TradeType, ex);
                TradeMsgOut = ToolUnity.ServiceERR(TradeType, ex);
                i           = -1;
                goto last;
            }
            #region 验证数字签名
            //为适应老版本,这个参数设置成0,以后新上线的 都必须设置成1
            string Signature = ConfigurationManager.AppSettings["Signature"];
            if (Signature == "1")
            {
                XmlDocument doc = new XmlDocument();
                doc.LoadXml(TradeMsg);
                string key  = "";
                string mac  = "";
                string sign = "";
                if (doc.DocumentElement != null)
                {
                    string head = doc.DocumentElement.Name;

                    XmlNode nodemac = doc.SelectSingleNode(head + "/BASEINFO/MACDZ");
                    if (nodemac == null)
                    {
                        TradeMsgOut = ToolUnity.ServiceERR(TradeType, "MACDZ未分配!");
                        return(-1);
                    }
                    mac = nodemac.InnerText;
                    XmlNode nodekey = doc.SelectSingleNode(head + "/BASEINFO/KEY");
                    if (nodekey == null)
                    {
                        TradeMsgOut = ToolUnity.ServiceERR(TradeType, "校验码未分配!");
                        return(-1);
                    }
                    key = nodekey.InnerText;
                    XmlNode nodesign = doc.SelectSingleNode(head + "/BASEINFO/SIGN");
                    if (nodesign == null)
                    {
                        TradeMsgOut = ToolUnity.ServiceERR(TradeType, "数字验证未分配!");
                        return(-1);
                    }
                    sign = nodesign.InnerText;
                    XmlNode BASEINFO = doc.SelectSingleNode(head + "/BASEINFO");
                    BASEINFO.RemoveChild(nodesign);
                }
                string inxml = doc.InnerXml;

                DataTable dt = DBVisitor.ExecuteTable($"select * from GY_REGISTERED where mac='{mac}'");
                if (dt.Rows.Count <= 0)
                {
                    TradeMsgOut = ToolUnity.ServiceERR(TradeType, "未注册!");
                    i           = -1;
                    return(i);
                }
                if (dt.Rows[0]["KEY"].ToString() != key)
                {
                    TradeMsgOut = ToolUnity.ServiceERR(TradeType, "校验码验证不通过!");
                    i           = -1;
                    return(i);
                }
                string mysign = AlipayMD5.Sign(inxml, dt.Rows[0]["KEY"].ToString(), "utf-8");
                if (mysign != sign)
                {
                    TradeMsgOut = ToolUnity.ServiceERR(TradeType, "签名验证错误!");
                    i           = -1;
                    return(i);
                }
            }
            #endregion
            try
            {
                objtype.MessageID = guid;
                objtype.ParseInXml(TradeMsg);
                objtype.ProcessMessage();
                //outxml = objtype.ParseOutXml();
                TradeMsgOut = objtype.ParseOutXml();
                //LogUnity.I.Info(0, TradeType, TradeMsg, outxml, "", guid);
            }
            catch (Exception ex)
            {
                //outxml = objtype.ParseOutXml(ex, ConfigurationManager.AppSettings["enabledymc"] == "0");
                TradeMsgOut = objtype.ParseOutXml(ex, ConfigurationManager.AppSettings["enabledymc"] == "0");
                //LogUnity.I.Insert(-1, TradeType, TradeMsg, outxml, ex.StackTrace.Trim(), guid);
                //LogUnity.I.Insert(-1, TradeType, TradeMsg, TradeMsgOut, ex.StackTrace.Trim(), guid);
                i = -1;
            }
last:
            {
                //log.InfoFormat("[{0}].OUT {1}", TradeType, outxml + "\r\n");
                log.InfoFormat("[{2}][{0}].OUT {1}", TradeType, TradeMsgOut, guid);
                return(i);
            }
        }