//接口地址:http://192.168.234.215:9000/CRM/GetCustomerForNewIns --查询接口 // http://192.168.234.215:9000/Insurance/SaveNewIns --保存保单接口 //接口调用方法及示例 ///appId="A01DA1EA687C436786F950BD45CB999E" ///appKey="9C27CE71D3AB4593A136E0F6F51B04A9" ///appSecret="4B1638C8FD3D44B6B387B478EBED0C8D" #region 第一步:定义返回参数、请求参数 public class ReturnModel { public string code { get; set; } public string result { get; set; } public bool IsSuccess { get; set; } public object msg { get; set; } } public class PostParamModel { public string jsonStr { get; set; } } #endregion public class Test { #region 第二步:定义加签方法 /// /// 加签 /// /// /// /// private static Dictionary getSign(string param, string prefAuthorization = "BTBPM ") { //待拼接未处理的字符串 string strConcat = ""; //待生成的签名 string strSign = ""; //配置文件配置以下三个参数,参数值由接口提供方提供,详见上面注释 string appId = "";//配置文件获取或直接用上面的值 string appKey = "";//配置文件获取或直接用上面的值 string appSecret = "";//配置文件获取或直接用上面的值 TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0); int Timestamp = (int)ts.TotalSeconds; string AppSecret = appSecret; string Authorization = prefAuthorization + appId; string AppKey = appKey; string SignMethod = "md5"; #region 根据参数名称的ASCII码表的顺序排序。 Dictionary headers = new Dictionary(); headers.Add("Authorization", Authorization); headers.Add("App-Key", AppKey); headers.Add("Timestamp", Timestamp.ToString()); headers.Add("Sign-Method", SignMethod); headers.Add("param", param); var retHeaders = (from entry in headers orderby entry.Key ascending select entry).ToDictionary(pair => pair.Key, pair => pair.Value); #endregion #region 拼接的字符串 foreach (KeyValuePair k in retHeaders) { strConcat += k.Key + k.Value; } strConcat = AppSecret + strConcat + AppSecret; #endregion #region 将字符串用md5加密后,再生成大写的十六进制 MD5 md5 = MD5.Create(); byte[] bytes = md5.ComputeHash(Encoding.UTF8.GetBytes(strConcat.ToString())); // 将MD5输出的二进制结果转换为大写的十六进制 StringBuilder result = new StringBuilder(); string _md5 = BitConverter.ToString(bytes).Replace("-", ""); for (int i = 0; i < bytes.Length; i++) { string hex = bytes[i].ToString("X2"); if (hex.Length == 1) { result.Append("0"); } result.Append(hex); } strSign = result.ToString(); #endregion Dictionary header = new Dictionary(); header.Add("Authorization", Authorization); header.Add("App-Key", AppKey); header.Add("Timestamp", Timestamp.ToString()); header.Add("Sign-Method", SignMethod); header.Add("Sign", strSign); return header; } #endregion #region 第三步:定义web请求方法 //POST方式发送得结果 public static string doPostRequest(out string errMsg, string url, string data, Dictionary headerSign) { errMsg = ""; string strURL = url; System.Net.HttpWebRequest request; request = (System.Net.HttpWebRequest)WebRequest.Create(strURL); request.Method = "POST"; request.ContentType = "application/json;charset=UTF-8"; foreach (KeyValuePair kp in headerSign) { request.Headers.Add(kp.Key, kp.Value); } string paraUrlCoded = data; byte[] payload; payload = System.Text.Encoding.UTF8.GetBytes(paraUrlCoded); request.ContentLength = payload.Length; Stream writer = request.GetRequestStream(); writer.Write(payload, 0, payload.Length); writer.Close(); System.Net.HttpWebResponse response; response = (System.Net.HttpWebResponse)request.GetResponse(); System.IO.Stream s; s = response.GetResponseStream(); string StrDate = ""; string strValue = ""; StreamReader Reader = new StreamReader(s, Encoding.UTF8); while ((StrDate = Reader.ReadLine()) != null) { strValue += StrDate + "\r\n"; } return strValue; } #endregion #region 第四步:定义接口请求方法 /// /// 调用接口 /// /// 请求结果信息 /// 请求接口地址 /// 请求参数Model,实体类模型 /// 是否成功 protected bool RequestToAPI(out string msg, string url, T postParam) { msg = ""; string jsonStr = JsonConvert.SerializeObject(postParam); Dictionary header = new Dictionary(); header = getSign(jsonStr); PostParamModel pm = new PostParamModel(); pm.jsonStr = jsonStr; string jsonPm = JsonConvert.SerializeObject(pm); string ret = doPostRequest(out msg, url, jsonPm, header); ReturnModel response = JsonConvert.DeserializeObject(ret); if (response == null) { msg = "请求失败"; return false; } if (response.IsSuccess && response.code == "28000") { msg = response.result; return true; } else { msg = response.result; return false; } } #endregion //示例: public class Person { public string Name { get; set; } public int Age { get; set; } public bool Sex { get; set; } public decimal Height { get; set; } } public void Test() { //接口接收参数的实体模型 Person p = new Person { Name = "小明", Age = 18, Sex = true, Height = 175 }; string msg = ""; bool ret = RequestToAPI(out msg, "http://192.168.1.1/CRM/TestApi", p); if (ret) { //... } else { //... } } }