Esempio n. 1
0
        /// <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());
        }
Esempio n. 2
0
 /// <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);
     }
 }
Esempio n. 3
0
 /// <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参数错误!");
     }
 }