using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.IO; using System.Net; using System.Reflection; using System.Security.Cryptography; using System.Text; using System.Web; using System.Web.Script.Serialization; namespace PayService { public class Common { public enum RetCode { 成功 = 100, 订单待支付 = 101, 审核中商品有效 = 102, 审核中商品无效 = 103, 审核中业态有误 = 104, 单据已接收 = 105, 单据已入库 = 106, 请求参数错误 = 201, 安全验证不通过 = 202, 会员已经注销 = 203, 登录失败, 用户名或密码错误 = 204, 用户不存在 = 205, 本门店数据未下发 = 206, 余额不足 = 300, 转入退款 = 301, 未支付 = 302, 已关闭 = 303, 已撤销 = 304, 支付失败 = 305, 系统异常 = 999 } public enum RetCode_Check { 成功 = 100, 等待生成 = 101, 门店不存在 = 201, 门店存在调拨退货业务 = 300, 门店正在盘存 = 301, 有未校验的结账信息 = 302, 有未扣除库存的单品信息 = 303, 结账信息未上传 = 304, 系统异常 = 999 } #region 交易配置相关属性 //客户号 //private const string custom_no = "linkea-test"; ////校验码秘钥 //private const string shaCode = "DAD7640691B9FAD3665217887F384B6F"; //AppCode private const string app_key = "100083"; //app_secret 秘钥 private const string app_secret = "457fbfa0-0076-44c2-b45b-2b3aa84d6750"; //工作秘钥 private const string work_key = "D905EEAD570840AC96A34DEB42A29B67"; ////Ksn //private const string ksn = "66660000000001"; ////渠道号 //private const string channel_no = "ALIPAY"; ////微信 WECHAT_PAY ////交易类型 //private const string paysEnum = "ALIPAY"; //请求Url private const string postUrl = "http://gateway.ringou.cn/opengw/router/rest.htm"; //http://101.68.65.38:7002/opengw/router/rest.htm"; #endregion public static String Get_Http(String a_strUrl, int timeout) { string strResult; try { HttpWebRequest myReq = (HttpWebRequest)HttpWebRequest.Create(a_strUrl); myReq.Timeout = timeout; HttpWebResponse HttpWResp = (HttpWebResponse)myReq.GetResponse(); Stream myStream = HttpWResp.GetResponseStream(); StreamReader sr = new StreamReader(myStream, Encoding.UTF8); StringBuilder strBuilder = new StringBuilder(); while (-1 != sr.Peek()) { strBuilder.Append(sr.ReadLine()); } strResult = strBuilder.ToString(); } catch (Exception exp) { strResult = "错误:" + exp.Message; } return strResult; } public static string GetSha256(string str) { SHA256 sha256 = new SHA256CryptoServiceProvider();//建立一个SHA256 byte[] source = Encoding.UTF8.GetBytes(str);//将字符串转为Byte[] byte[] crypto = sha256.ComputeHash(source);//进行SHA256加密 string byteStr = string.Empty; if (crypto != null || crypto.Length > 0) { foreach (var item in crypto) { byteStr += string.Format("{0:X2}", item); } } return byteStr; } public static string GetMD5(string s) { MD5 md5 = new MD5CryptoServiceProvider(); byte[] t = md5.ComputeHash(Encoding.GetEncoding("utf-8").GetBytes(s)); StringBuilder sb = new StringBuilder(32); for (int i = 0; i < t.Length; i++) { sb.Append(t[i].ToString("x").PadLeft(2, '0')); } return sb.ToString(); } #region BubbleSort public static string[] BubbleSort(string[] r) { int i, j; string temp; bool exchange; for (i = 0; i < r.Length; i++) { exchange = false; for (j = r.Length - 2; j >= i; j--) { if (String.CompareOrdinal(r[j + 1], r[j]) < 0) { temp = r[j + 1]; r[j + 1] = r[j]; r[j] = temp; exchange = true; } } if (!exchange) { break; } } return r; } #endregion #region CreatUrl public static string CreatUrl(string Amount, string dynamic_id, string out_trade_no, string payType, string subject = "牵软网络") { int i; string custom_no = "", shaCode = "", ksn = "", channel_no = "", paysEnum = ""; switch (payType) { case "ALIPAY": custom_no = "linkea-qianruan-alipay"; //校验码秘钥 shaCode = "9DACF5FBDCF7EE8D5CFFC32E80ADFF51"; //Ksn ksn = "678804280000001"; //渠道号 channel_no = "ALIPAY"; //交易类型 paysEnum = "ALIPAY"; break; case "WECHAT_PAY": custom_no = "linkea-qianruan-wechat"; //校验码秘钥 shaCode = "3C9D77299B35012BC02BDAB8B1000C29"; //Ksn ksn = "678804280000002"; //渠道号 channel_no = "WECHAT_PAY"; //交易类型 paysEnum = "WECHAT_PAY"; break; } //构造数组; string[] Oristr ={ "access_token=", "app_key="+ app_key, "channel_no="+payType, "check_code="+ GetSha256(custom_no + payType + Amount + shaCode), "custom_no="+ custom_no, "dynamic_id="+dynamic_id, "dynamic_id_type="+ "bar_code", "format="+ "json", "ksn="+ ksn, "method="+ "linkea.pays.thirdpay.createAndPay", "out_trade_no="+ out_trade_no, "pays_enum="+ payType, "product_code="+ "BARCODE_PAY_OFFLINE", "subject="+ subject, "timestamp="+ System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), "total_fee="+ Amount, "v="+"1.1", "work_key="+ work_key, "sign_method=md5" }; //进行排序; string[] Sortedstr = BubbleSort(Oristr); //构造待md5摘要字符串 ; StringBuilder prestr = new StringBuilder(); for (i = 0; i < Sortedstr.Length; i++) { if (i == Sortedstr.Length - 1) { prestr.Append(Sortedstr[i]); } else { prestr.Append(Sortedstr[i] + "&"); } } //生成Md5摘要; string jiami = app_secret + prestr.ToString().Replace("=", "").Replace("&", "") + app_secret; string sign = GetMD5(jiami); //构造支付Url; char[] delimiterChars = { '=' }; StringBuilder parameter = new StringBuilder(); parameter.Append(postUrl + "?"); for (i = 0; i < Sortedstr.Length; i++) { parameter.Append(Sortedstr[i].Split(delimiterChars)[0] + "=" + HttpUtility.UrlEncode(Sortedstr[i].Split(delimiterChars)[1]) + "&"); } parameter.Append("&sign=" + sign.ToUpper()); //返回支付Url; return parameter.ToString(); } #endregion #region trade_query public static string trade_query(string out_trade_no, string PAYTYPE) { string custom_no = "", shaCode = "", ksn = "", channel_no = "", paysEnum = ""; switch (PAYTYPE) { case "ALIPAY": custom_no = "linkea-qianruan-alipay"; //校验码秘钥 shaCode = "9DACF5FBDCF7EE8D5CFFC32E80ADFF51"; //Ksn ksn = "678804280000001"; //渠道号 channel_no = "ALIPAY"; //交易类型 paysEnum = "ALIPAY"; break; case "WECHAT_PAY": custom_no = "linkea-qianruan-wechat"; //校验码秘钥 shaCode = "3C9D77299B35012BC02BDAB8B1000C29"; //Ksn ksn = "678804280000002"; //渠道号 channel_no = "WECHAT_PAY"; //交易类型 paysEnum = "WECHAT_PAY"; break; } string[] Oristr ={ "channel_no="+ PAYTYPE, "app_key="+ app_key, "check_code="+ GetSha256(custom_no + PAYTYPE + shaCode), "custom_no="+custom_no, "format="+ "json", "work_key=" +work_key, "ksn="+ksn, "method="+ "linkea.pays.thirdpay.query", "out_trade_no="+out_trade_no, "pays_enum="+PAYTYPE, "timestamp="+ System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), "sign_method=md5", "v="+"1.1" }; //进行排序; Oristr = BubbleSort(Oristr); StringBuilder prestr = new StringBuilder(); for (int i = 0; i < Oristr.Length; i++) { if (i == Oristr.Length - 1) { prestr.Append(Oristr[i]); } else { prestr.Append(Oristr[i] + "&"); } } string jiami = app_secret + prestr.ToString().Replace("=", "").Replace("&", "") + app_secret; string sign = GetMD5(jiami); //构造 char[] delimiterChars = { '=' }; StringBuilder parameter = new StringBuilder(); parameter.Append(postUrl + "?"); for (int i = 0; i < Oristr.Length; i++) { parameter.Append(Oristr[i].Split(delimiterChars)[0] + "=" + HttpUtility.UrlEncode(Oristr[i].Split(delimiterChars)[1]) + "&"); } parameter.Append("&sign=" + sign.ToUpper()); //返回支付Url; return parameter.ToString(); } #endregion } #region ResultObject_response public class ResultObject_response { public string result_code { get; set; } public string result_msg { get; set; } public string sign { get; set; } } #endregion #region PayCreateObject public class PayCreateObject { /// /// 流水码 /// public string trade_no { get; set; } /// /// 门店内码 /// public string shopcode { get; set; } /// /// 机器内码 /// public string machinecode { get; set; } /// /// 时间戳 /// public string timestamp { get; set; } /// /// 金额 /// public string amount { get; set; } /// /// 支付类型 /// public string paymode { get; set; } public string custom_no { get; set; } public string trade_desc { get; set; } public string signcode { get; set; } } #endregion #region PayCreateResult public class PayCreateResult { public string trade_no { get; set; } //public string shopcode //{ // get; // set; //} //public string machinecode //{ // get; // set; //} //public string timestamp //{ // get; // set; //} public string trade_num { get; set; } public string result_code { get; set; } public string result_desc { get; set; } } #endregion #region PayQueryObject public class PayQueryObject { public string trade_no { get; set; } public string shopcode { get; set; } public string machinecode { get; set; } public string timestamp { get; set; } public string paymode { get; set; } public string signcode { get; set; } } #endregion #region PayQueryResult public class PayQueryResult { public string trade_no { get; set; } public string trade_num { get; set; } public string result_code { get; set; } public string result_desc { get; set; } public List result_data { get; set; } } #endregion #region JsonHelper public class JsonHelper { /// /// DataSet转换为Json /// /// DataSet对象 /// Json字符串 public static string DataSetToJson(DataSet dataSet) { string jsonString = "{"; foreach (DataTable table in dataSet.Tables) { jsonString += "\"" + table.TableName + "\":" + DataTableToJson(table, table.TableName) + ","; } jsonString = jsonString.TrimEnd(','); return jsonString + "}"; } public static string ArrayToJson(string[] strs) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < strs.Length; i++) { sb.AppendFormat("'{0}':'{1}',", i + 1, strs[i]); } if (sb.Length > 0) { return ("{" + sb.ToString().TrimEnd(new char[] { ',' }) + "}"); } return ""; } public static string ArrayToJson(List list, string propertyname) { StringBuilder sb = new StringBuilder(); if (list.Count > 0) { sb.Append("[{\""); sb.Append(propertyname); sb.Append("\":["); foreach (T t in list) { sb.Append("\""); sb.Append(t.ToString()); sb.Append("\","); } return (sb.ToString().TrimEnd(new char[] { ',' }) + "]}]"); } return ""; } public static string DataRowToJson(DataRow dr) { StringBuilder sb = new StringBuilder(); sb.Append("{"); foreach (DataColumn dc in dr.Table.Columns) { sb.Append("\""); sb.Append(dc.ColumnName); sb.Append("\":\""); if (((dr[dc] != null) && (dr[dc] != DBNull.Value)) && (dr[dc].ToString() != "")) { sb.Append(dr[dc]); } else { sb.Append(" "); } sb.Append("\","); } sb = sb.Remove(0, sb.Length - 1); sb.Append("},"); return sb.ToString(); } public static string DataTableToJson(DataTable dt, string dtName) { StringBuilder sb = new StringBuilder(); sb.Append("{\""); sb.Append(dtName); sb.Append("\":["); if (DataTableHelper.IsExistRows(dt)) { foreach (DataRow dr in dt.Rows) { sb.Append("{"); foreach (DataColumn dc in dr.Table.Columns) { sb.Append("\""); sb.Append(dc.ColumnName); sb.Append("\":\""); if (((dr[dc] != null) && (dr[dc] != DBNull.Value)) && (dr[dc].ToString() != "")) { sb.Append(dr[dc].ToString().Replace("\\", "\\\\").Replace("\'", "\\\'").Replace("\t", " ").Replace("\r", " ").Replace("\n", "
").Replace("\"", "'")); //sb.Append(dr[dc].ToString().Replace("\"", "'").Replace("'","“")).Replace(@"\", "/"); } else { sb.Append(" "); } sb.Append("\","); } sb = sb.Remove(sb.Length - 1, 1); sb.Append("},"); } sb = sb.Remove(sb.Length - 1, 1); } sb.Append("]}"); return JsonCharFilter(sb.ToString()); } private static List GetObjectProperty(object o) { List propertyslist = new List(); PropertyInfo[] propertys = o.GetType().GetProperties(); foreach (PropertyInfo p in propertys) { propertyslist.Add(string.Concat(new object[] { "\"", p.Name.ToString(), "\":\"", p.GetValue(o, null), "\"" })); } return propertyslist; } public static string HashtableToJson(Hashtable data, string dtName) { StringBuilder sb = new StringBuilder(); sb.Append("{\""); sb.Append(dtName); sb.Append("\":[{"); foreach (object key in data.Keys) { object value = data[key]; sb.Append("\""); sb.Append(key); sb.Append("\":\""); if (!(string.IsNullOrEmpty(value.ToString()) || (value == DBNull.Value))) { sb.Append(value).Replace(@"\", "/"); } else { sb.Append(" "); } sb.Append("\","); } sb = sb.Remove(sb.Length - 1, 1); sb.Append("}]}"); return JsonCharFilter(sb.ToString()); } public static string IListToJson(IList list, bool FlagBool = false) { StringBuilder sb = new StringBuilder(); sb.Append("["); foreach (T t in list) { sb.Append(ObjectToJson(t, FlagBool) + ","); } return (sb.ToString().TrimEnd(new char[] { ',' }) + "]"); } public static string IListToJson(IList list, string ClassName) { StringBuilder sb = new StringBuilder(); sb.Append("{\"" + ClassName + "\":["); foreach (T t in list) { sb.Append(ObjectToJson(t) + ","); } return (sb.ToString().TrimEnd(new char[] { ',' }) + "]}"); } private static string JsonCharFilter(string sourceStr) { return sourceStr; } public static string ListToJson(List objlist, string jsonName, bool ObjectName = true) { string result = string.Empty; if (ObjectName) { result += "{"; if (jsonName.Equals(string.Empty)) { object o = objlist[0]; jsonName = o.GetType().ToString(); result = result + "\"" + jsonName + "\":["; } else { result = result + "\"" + jsonName + "\":["; } } else { result = "["; } bool firstline = true; foreach (object oo in objlist) { if (!firstline) { result = result + "," + ObjectToJson(oo); } else { result = result + ObjectToJson(oo); firstline = false; } } if (ObjectName) { return (result + "]}"); } else { return (result + "]"); } } private static string ObjectToJson(object o) { string result = "{"; List ls_propertys = new List(); ls_propertys = GetObjectProperty(o); foreach (string str_property in ls_propertys) { if (result.Equals("{")) { result = result + str_property; } else { result = result + "," + str_property; } } return (result + "}"); } public static string ObjectToJson(T t, bool FlagBool = false) { FlagBool = false; StringBuilder sb = new StringBuilder(); string json = ""; if (t == null) { return json; } sb.Append("{"); PropertyInfo[] properties = t.GetType().GetProperties(); foreach (PropertyInfo pi in properties) { sb.Append("\"" + pi.Name.ToString() + "\""); sb.Append(":"); if (FlagBool == true && pi.PropertyType.ToString() == "System.Boolean") { sb.Append(pi.GetValue(t, null)); } else { sb.Append("\"" + pi.GetValue(t, null) + "\""); } sb.Append(","); } return (sb.ToString().TrimEnd(new char[] { ',' }) + "}"); } public static string ObjectToJson(T t, string ClassName) { StringBuilder sb = new StringBuilder(); sb.Append("{\"" + ClassName + "\":["); string json = ""; if (t == null) { return json; } sb.Append("{"); PropertyInfo[] properties = t.GetType().GetProperties(); foreach (PropertyInfo pi in properties) { sb.Append("\"" + pi.Name.ToString() + "\""); sb.Append(":"); sb.Append("\"" + pi.GetValue(t, null) + "\""); sb.Append(","); } return (sb.ToString().TrimEnd(new char[] { ',' }) + "}]}"); } public static string ObjectToJson(IList IL, string jsonName) { StringBuilder Json = new StringBuilder(); Json.Append("{\"" + jsonName + "\":["); if (IL.Count > 0) { for (int i = 0; i < IL.Count; i++) { PropertyInfo[] pis = Activator.CreateInstance().GetType().GetProperties(); Json.Append("{"); for (int j = 0; j < pis.Length; j++) { Json.Append(string.Concat(new object[] { "\"", pis[j].Name.ToString(), "\":\"", pis[j].GetValue(IL[i], null), "\"" })); if (j < (pis.Length - 1)) { Json.Append(","); } } Json.Append("}"); if (i < (IL.Count - 1)) { Json.Append(","); } } } Json.Append("]}"); return Json.ToString(); } /// /// JSON格式数组转化为对应的List /// /// /// JSON格式数组 /// public static List JSONStringToList(string JsonStr) { JavaScriptSerializer Serializer = new JavaScriptSerializer(); //设置转化JSON格式时字段长度 List objs = Serializer.Deserialize>(JsonStr); return objs; } public static Object Json2Obj(String json, Type t) { try { System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(t); using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json))) { return serializer.ReadObject(ms); } } catch { return null; } } /// /// Json 字符串 转换为 DataTable数据集合 /// /// /// public static DataTable ToDataTable(string json) { DataTable dataTable = new DataTable(); //实例化 DataTable result; try { JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer(); javaScriptSerializer.MaxJsonLength = Int32.MaxValue; //取得最大数值 ArrayList arrayList = javaScriptSerializer.Deserialize(json); if (arrayList.Count > 0) { foreach (Dictionary dictionary in arrayList) { if (dictionary.Keys.Count == 0) { result = dataTable; return result; } //Columns if (dataTable.Columns.Count == 0) { foreach (string current in dictionary.Keys) { dataTable.Columns.Add(current, dictionary[current].GetType()); } } //Rows DataRow dataRow = dataTable.NewRow(); foreach (string current in dictionary.Keys) { dataRow[current] = dictionary[current]; } dataTable.Rows.Add(dataRow); //循环添加行到DataTable中 } } } catch { } result = dataTable; return result; } /// /// 将JSON解析成DataSet只限标准的JSON数据 /// 例如:Json={t1:[{name:'数据name',type:'数据type'}]} /// 或 Json={t1:[{name:'数据name',type:'数据type'}],t2:[{id:'数据id',gx:'数据gx',val:'数据val'}]} /// /// Json字符串 /// DataSet public static DataSet JsonToDataSet(string Json) { try { DataSet ds = new DataSet(); JavaScriptSerializer JSS = new JavaScriptSerializer(); object obj = JSS.DeserializeObject(Json); Dictionary datajson = (Dictionary)obj; foreach (var item in datajson) { DataTable dt = new DataTable(item.Key); object[] rows = (object[])item.Value; foreach (var row in rows) { Dictionary val = (Dictionary)row; DataRow dr = dt.NewRow(); foreach (KeyValuePair sss in val) { if (!dt.Columns.Contains(sss.Key)) { dt.Columns.Add(sss.Key.ToString()); dr[sss.Key] = sss.Value; } else dr[sss.Key] = sss.Value; } dt.Rows.Add(dr); } ds.Tables.Add(dt); } return ds; } catch { return null; } } } #endregion }