📄 alipay.cs
字号:
}
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 + -