//接口地址: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
{
//...
}
}
}