public T Execute <T>(IRequest <T> request, string session, string appAuthToken) where T : IResponse { // 构造请求参数 ParamDictionary requestParams = buildRequestParams(request, session, appAuthToken); // 字典排序 IDictionary <string, string> sortedParams = new SortedDictionary <string, string>(requestParams); ParamDictionary sortedDic = new ParamDictionary(sortedParams); // 参数签名 string charset = string.IsNullOrEmpty(this.charset) ? "utf-8" : this.charset; //string signResult = Signature.RSASign(sortedDic, privateKeyPem, charset, this.keyFromFile, this.signType); //// 添加签名结果参数 //sortedDic.Add(SIGN, signResult); // 参数拼接 string signedResult = WebUtils.BuildQuery(sortedDic, charset); var txtParams = sortedDic; // 是否需要上传文件 string body; string requestBody = null; string url = ""; // this.serverUrl + "?" + CHARSET + "=" + this.charset; url = GetFullUrl(this.serverUrl, request.GetApiName()); // + "?" + CHARSET + "=" + this.charset; if (request is IUploadRequest <T> ) { IUploadRequest <T> uRequest = (IUploadRequest <T>)request; IDictionary <string, FileItem> fileParams = SdkUtils.CleanupDictionary(uRequest.GetFileParameters()); body = webUtils.DoPost(url, txtParams, fileParams, this.charset, out requestBody); } else { body = webUtils.DoPost(url, txtParams, this.charset, out requestBody); } T rsp = null; IParser <T> parser = null; if ("xml".Equals(format)) { parser = new XmlParser <T>(); rsp = parser.Parse(body, charset); } else { parser = new JsonParser <T>(); rsp = parser.Parse(body, charset); } ResponseParseItem item = parseRespItem(request, body, parser, this.encyptKey, this.encyptType, charset); rsp = parser.Parse(item.realContent, charset); rsp.RequestBody = requestBody; CheckResponseSign(request, item.respContent, rsp.IsError, parser, this.publicKey, this.charset, signType, this.keyFromFile); return(rsp); }
private static ResponseParseItem parseRespItem <T>(IRequest <T> request, string respBody, IParser <T> parser, string encryptKey, string encryptType, string charset) where T : IResponse { string realContent = null; if (request.GetNeedEncrypt()) { realContent = parser.EncryptSourceData(request, respBody, encryptType, encryptKey, charset); } else { realContent = respBody; } ResponseParseItem item = new ResponseParseItem(); item.realContent = realContent; item.respContent = respBody; return(item); }
/// <summary> /// /// </summary> /// <typeparam name="T"></typeparam> /// <param name="request"></param> /// <param name="accessToken"></param> /// <param name="appAuthToken"></param> /// <param name="targetAppId"></param> /// <returns></returns> public async Task <T> CertificateExecute <T>(IAopRequest <T> request, string accessToken, string appAuthToken, String targetAppId) where T : AopResponse { ArgumentValidator.CheckNotNull(certEnvironment, "检测到证书相关参数未初始化,非证书模式下请改为调用Execute。"); if (string.IsNullOrEmpty(this.charset)) { this.charset = "utf-8"; } string apiVersion = null; if (!string.IsNullOrEmpty(request.GetApiVersion())) { apiVersion = request.GetApiVersion(); } else { apiVersion = Version; } // 添加协议级请求参数 AopDictionary txtParams = new AopDictionary(request.GetParameters()); // 序列化BizModel txtParams = SerializeBizModel(txtParams, request); txtParams.Add(AlipayConstants.METHOD, request.GetApiName()); txtParams.Add(AlipayConstants.VERSION, apiVersion); //txtParams.Add(AlipayConstants.ALIPAY_SDK, SDK_VERSION); txtParams.Add(AlipayConstants.APP_ID, appId); txtParams.Add(AlipayConstants.FORMAT, format); txtParams.Add(AlipayConstants.TIMESTAMP, DateTime.Now); txtParams.Add(AlipayConstants.ACCESS_TOKEN, accessToken); txtParams.Add(AlipayConstants.SIGN_TYPE, signType); txtParams.Add(AlipayConstants.TERMINAL_TYPE, request.GetTerminalType()); txtParams.Add(AlipayConstants.TERMINAL_INFO, request.GetTerminalInfo()); txtParams.Add(AlipayConstants.PROD_CODE, request.GetProdCode()); txtParams.Add(AlipayConstants.CHARSET, charset); txtParams.Add(AlipayConstants.APP_CERT_SN, certEnvironment.AppCertSN); txtParams.Add(AlipayConstants.ALIPAY_ROOT_CERT_SN, certEnvironment.RootCertSN); if (!string.IsNullOrEmpty(request.GetNotifyUrl())) { txtParams.Add(AlipayConstants.NOTIFY_URL, request.GetNotifyUrl()); } if (!string.IsNullOrEmpty(appAuthToken)) { txtParams.Add(AlipayConstants.APP_AUTH_TOKEN, appAuthToken); } if (!string.IsNullOrEmpty(targetAppId)) { txtParams.Add(AlipayConstants.TARGET_APP_ID, targetAppId); } if (request.GetNeedEncrypt()) { if (string.IsNullOrEmpty(txtParams[AlipayConstants.BIZ_CONTENT])) { throw new Exception("api request Fail ! The reason: encrypt request is not supported!"); } if (string.IsNullOrEmpty(this.encyptKey) || string.IsNullOrEmpty(this.encyptType)) { throw new Exception("encryptType or encryptKey must not null!"); } if (!"AES".Equals(this.encyptType)) { throw new Exception("api only support Aes!"); } string encryptContent = AopUtils.AesEncrypt(this.encyptKey, txtParams[AlipayConstants.BIZ_CONTENT], this.charset); txtParams.Remove(AlipayConstants.BIZ_CONTENT); txtParams.Add(AlipayConstants.BIZ_CONTENT, encryptContent); txtParams.Add(AlipayConstants.ENCRYPT_TYPE, this.encyptType); } // 添加签名参数 txtParams.Add(AlipayConstants.SIGN, AopUtils.SignAopRequest(txtParams, privateKeyPem, charset, this.keyFromFile, signType)); // 是否需要上传文件 string body; if (request is IAopUploadRequest <T> ) { IAopUploadRequest <T> uRequest = (IAopUploadRequest <T>)request; IDictionary <string, FileItem> fileParams = AopUtils.CleanupDictionary(uRequest.GetFileParameters()); body = await webUtils.DoPostAsync(this.serverUrl + "?" + AlipayConstants.CHARSET + "=" + this.charset, txtParams, fileParams, this.charset); } else { body = await webUtils.DoPostAsync(this.serverUrl + "?" + AlipayConstants.CHARSET + "=" + this.charset, txtParams, this.charset); } T rsp; IAopParser <T> parser; if ("xml".Equals(format)) { parser = new AopXmlParser <T>(); rsp = parser.Parse(body, charset); } else { parser = new AopJsonParser <T>(); rsp = parser.Parse(body, charset); } ResponseParseItem item = ParseRespItem(request, body, parser, this.encyptKey, this.encyptType, charset); rsp = parser.Parse(item.RealContent, charset); await CheckResponseCertSign(request, item.RespContent, rsp.IsError, parser); return(rsp); }