/// <summary> /// 创建内容签名 /// 生成规则: ///A)提取请求方法method(GET或POST); ///B)提取请求url信息,包括Host字段的IP或域名和URI的path部分,注意不包括Host的端口和Path的querystring。请在请求中带上Host字段,否则将视为无效请求。 /// 比如openapi.xg.qq.com/v2/push/single_device或者10.198.18.239/v2/push/single_device; /// C)将请求参数(不包括sign参数)格式化成K=V方式; ///注意:计算sign时所有参数不应进行urlencode; ///D)将格式化后的参数以K的字典序升序排列,拼接在一起, ///E)拼接请求方法、url、排序后格式化的字符串以及应用的secret_key; ///F)将E形成字符串计算MD5值,形成一个32位的十六进制(字母小写)字符串,即为本次请求sign(签名)的值; ///Sign=MD5($http_method$url$k1=$v1$k2=$v2$secret_key); 该签名值基本可以保证请求是合法者发送且参数没有被修改,但无法保证不被偷窥。 /// 例如: POST请求到接口http://openapi.xg.qq.com/v2/push/single_device, ///有四个参数,access_id=123,timestamp=1386691200,Param1=Value1,Param2=Value2,secret_key为abcde。 ///则上述E步骤拼接出的字符串为POSTopenapi.xg.qq.com/v2/push/single_deviceParam1=Value1Param2=Value2access_id=123timestamp=1386691200abcde, ///计算出该字符串的MD5为ccafecaef6be07493cfe75ebc43b7d53,以此作为sign参数的值 /// </summary> /// <param name="xpb"></param> /// <param name="requestUrl">地址不要包含协议头</param> /// <returns></returns> private string CreateRequestSign(XGParamBase xpb, string requestUrl) { string noJoinPostData = CreateXGParamPostStr <XGParamBase>(xpb, "", false); string sign = string.Format("{0}{1}{2}{3}", requestMethod, requestUrl, noJoinPostData, xpb.Secret_Key); System.Diagnostics.Trace.Write("\r\n===Sign拼接的格式:" + sign); return(md5.GenerateMD5(sign).ToLower()); }
/// <summary> /// 基本参数生成 /// </summary> /// <param name="xgppb"></param> private void ParamBaseCreate(XGParamBase xgppb, XGMethod xgm) { if (!xgppb.Timestamp.HasValue) { xgppb.Timestamp = GetTimeStamp(); } if (string.IsNullOrEmpty(xgppb.Sign)) { string signUrl = string.Format("{0}/{1}/{2}/{3}", apiUrl, apiVersion, apiClass, xgm.ToString()); xgppb.Sign = CreateRequestSign(xgppb, signUrl); System.Diagnostics.Trace.Write("\r\n===Sign-MD5后的值:" + xgppb.Sign); } }
/// <summary> /// 公共参数验证 /// </summary> /// <param name="xgb"></param> private void ParamBaseValidata(XGParamBase xgb) { if (xgb == null) { throw new ArgumentException("xgb参数不能为空!"); } if (httpClient == null) { throw new ArgumentException("httpClient不能为空!"); } if (xgb.Access_id <= 0) { throw new ArgumentException("xgb.Access_id参数错误!"); } if (xgb.Secret_Key == null) { throw new ArgumentException("xgb.Secret_Key参数错误!"); } }