⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 alipay.cs

📁 将淘宝网支付系统嵌入自己系统,学习的好材料!
💻 CS
📖 第 1 页 / 共 2 页
字号:

            }
            else
            {
                //支付宝如果是没有收到success就一直发Notify消息,则可以省略发Fail消息
                page.Response.Write("fail");
                throw new CommonAliPayBaseException("支付宝通知验证失败", 101);
            }
            
        }
       
        
        #endregion
        #region private
        /// <summary>
        /// 通知验证接口
        /// </summary>
        /// <param name="verifyUrl"></param>
        /// <param name="verify">验证参数</param>
        /// <returns>true,通过验证</returns>
        private bool VerifyNotify(string verifyUrl, Verify verify)
        {
            //#if (DEBUG)
            //            {
            //                return true;
            //            }
            //#endif
            string param;
            SortedList<string, string> sl = GetParam(verify);
            param = GetUrlParam(sl, true);
            string result = PostData(verifyUrl, param, "utf-8");
            //解析result
            return bool.Parse(result); ;

        }
        /// <summary>
        ///  解析Form集合到DigitalNotifyEventArgs,值类型会被初始化为null
        /// </summary>
        /// <param name="nv"></param>
        /// <param name="obj"></param>
         /// <remarks>为防止值类型的默认值污染参数集合,用了nullable范型</remarks>
        private NotifyEventArgs ParseNotify(NameValueCollection nv, object obj)
        {
            PropertyInfo[] propertyInfos = obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);

            foreach (PropertyInfo pi in propertyInfos)
            {
                string v = nv.Get(pi.Name.ToLower());
                if (v != null)
                {
                    if (pi.PropertyType == typeof(string))
                    {

                        pi.SetValue(obj, v, null);

                    }
                    else if (pi.PropertyType == typeof(int?))
                    {
                        pi.SetValue(obj, int.Parse(v), null);
                    }
                    else if (pi.PropertyType == typeof(decimal?))
                    {

                        pi.SetValue(obj, decimal.Parse(v), null);
                    }
                    else if (pi.PropertyType == typeof(DateTime?))
                    {

                        pi.SetValue(obj, DateTime.Parse(v), null);
                    }
                    else if (pi.PropertyType == typeof(bool))
                    {

                        pi.SetValue(obj, bool.Parse(v), null);
                    }
                    else
                    {
                        //转型失败会抛出异常
                        pi.SetValue(obj, v, null);
                    }
                }

            }
            return (NotifyEventArgs)obj;

        }
        /// <summary>
        /// 获取Md5sign后的参数
        /// </summary>
        /// <param name="digitalGoods"></param>
        /// <returns></returns>
        private string Md5SignParam(DigitalGoods digitalGoods)
        {
            if (digitalGoods.Sign_Type.ToLower() != "md5")
            {
                throw new CommonAliPayBaseException("Sign_Type不支持MD5", 100);
            }

            SortedList<string, string> goods = GetParam(digitalGoods);

            string param = GetUrlParam(goods, false) + digitalGoods.Sign;
            string encodeParam = GetUrlParam(goods, true) + "&";
            string sign = GetMd5Sign(digitalGoods._Input_Charset, param);
            return encodeParam + string.Format("sign={0}&sign_type={1}", HttpUtility.HtmlEncode(sign),
                HttpUtility.HtmlEncode(digitalGoods.Sign_Type));

        }
        /// <summary>
        /// 获取排序后的参数
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        private SortedList<string,string> GetParam(object obj)
        {
            
            PropertyInfo[] propertyInfos = obj.GetType().GetProperties(BindingFlags.Public|BindingFlags.Instance);          
            SortedList<string, string> sortedList = new SortedList<string, string>(StringComparer.CurrentCultureIgnoreCase);
            foreach (PropertyInfo pi in propertyInfos)
            {

                if (pi.GetValue(obj, null) != null)
                {
                    if (pi.Name == "Sign" || pi.Name == "Sign_Type")
                    {
                        continue;
                    }
                    sortedList.Add(pi.Name.ToLower(), pi.GetValue(obj, null).ToString());
                  
                }
            }
            return sortedList;
                    
        }

       
        
    /// <summary>
    /// 获取Url的参数
    /// </summary>
    /// <param name="sortedList"></param>
    /// <param name="isEncode">参数是否经过编码,被签名的参数不用编码,Post的参数要编码</param>
    /// <returns></returns>
       
        private string GetUrlParam(SortedList<string, string> sortedList,bool isEncode)
        {
            StringBuilder param = new StringBuilder();
            StringBuilder encodeParam = new StringBuilder();
            if (isEncode == false)
            {

                foreach (KeyValuePair<string, string> kvp in sortedList)
                {
                    string t = string.Format("{0}={1}", kvp.Key, kvp.Value);
                    param.Append(t + "&");
                }
                return param.ToString().TrimEnd('&');
            }
            else
            {
                foreach (KeyValuePair<string, string> kvp in sortedList)
                {
                     string et = string.Format("{0}={1}", HttpUtility.UrlEncode(kvp.Key), HttpUtility.UrlEncode(kvp.Value));
                     encodeParam.Append(et + "&");
                }
                return encodeParam.ToString().TrimEnd('&');
            }
 
        }
       
        /// <summary>
        /// 获取字符串的MD5签名
        /// </summary>
        /// <param name="encode">签名时用的编码</param>
        /// <param name="param">要签名的字符串</param>
        /// <returns></returns>
        private string GetMd5Sign(string encode,string param)
        {
            MD5 md5 = new MD5CryptoServiceProvider();
            byte[] data = md5.ComputeHash(Encoding.GetEncoding(encode).GetBytes(param));
            StringBuilder sBuilder = new StringBuilder();
            for (int i = 0; i < data.Length; i++)
            {
                sBuilder.Append(data[i].ToString("x2"));
            }
            return sBuilder.ToString();
 
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="url"></param>
        /// <param name="data"></param>
        /// <param name="encode"></param>
        /// <returns></returns>
        private string PostData(string url, string data,string encode)
        {
            CookieContainer cc = new CookieContainer();
            HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
            request.CookieContainer = cc;
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            Stream requestStream = request.GetRequestStream();
            byte[] byteArray = Encoding.UTF8.GetBytes(data);
            requestStream.Write(byteArray, 0, byteArray.Length);
            requestStream.Close();
            HttpWebResponse response = request.GetResponse() as HttpWebResponse;
            Uri responseUri = response.ResponseUri;
            Stream receiveStream = response.GetResponseStream();
            StreamReader readStream = new StreamReader(receiveStream, System.Text.Encoding.GetEncoding(encode));       
            string result = readStream.ReadToEnd();
            return result;

        }
        #endregion
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -