private AlipayDictionary BuildRequestParams<T>(IAlipayRequest<T> request, string accessToken, string appAuthToken) where T : AlipayResponse { // 默认参数 var result = new AlipayDictionary(request.GetParameters()) { // 序列化BizModel { BIZ_CONTENT, Serialize(request.GetBizModel()) }, // 添加协议级请求参数,为空的参数后面会自动过滤,这里不做处理。 { METHOD, request.GetApiName() }, { VERSION, string.IsNullOrEmpty(request.GetApiVersion()) ? Options.Version : request.GetApiVersion() }, { APP_ID, Options.AppId }, { FORMAT, Options.Format }, { TIMESTAMP, DateTime.Now }, { ACCESS_TOKEN, accessToken }, { SIGN_TYPE, Options.SignType }, { TERMINAL_TYPE, request.GetTerminalType() }, { TERMINAL_INFO, request.GetTerminalInfo() }, { PROD_CODE, request.GetProdCode() }, { NOTIFY_URL, request.GetNotifyUrl() }, { CHARSET, Options.Charset }, { RETURN_URL, request.GetReturnUrl() }, { APP_AUTH_TOKEN, appAuthToken } }; if (request.GetNeedEncrypt()) { if (string.IsNullOrEmpty(result[BIZ_CONTENT])) { throw new Exception("api request Fail ! The reason: encrypt request is not supported!"); } if (string.IsNullOrEmpty(Options.EncyptKey) || string.IsNullOrEmpty(Options.EncyptType)) { throw new Exception("encryptType or encryptKey must not null!"); } if (!"AES".Equals(Options.EncyptType)) { throw new Exception("api only support Aes!"); } var encryptContent = AES.Encrypt(result[BIZ_CONTENT], Options.EncyptKey, AlipaySignature.AES_IV, AESCipherMode.CBC, AESPaddingMode.PKCS7); result.Remove(BIZ_CONTENT); result.Add(BIZ_CONTENT, encryptContent); result.Add(ENCRYPT_TYPE, Options.EncyptType); } return result; }
public Task<T> SdkExecuteAsync<T>(IAlipayRequest<T> request) where T : AlipayResponse { // 构造请求参数 var requestParams = BuildRequestParams(request, null, null); // 字典排序 var sortedParams = new SortedDictionary<string, string>(requestParams); var sortedAlipayDic = new AlipayDictionary(sortedParams); // 参数签名 var signContent = AlipaySignature.GetSignContent(sortedAlipayDic); var signResult = AlipaySignature.RSASignContent(signContent, Options.PrivateRSAParameters, Options.SignType); // 添加签名结果参数 sortedAlipayDic.Add(SIGN, signResult); // 参数拼接 var signedResult = AlipayUtility.BuildQuery(sortedAlipayDic); // 构造结果 var rsp = Activator.CreateInstance<T>(); rsp.Body = signedResult; return Task.FromResult(rsp); }
public async Task<T> ExecuteAsync<T>(IAlipayRequest<T> request, string accessToken, string appAuthToken) where T : AlipayResponse { var apiVersion = string.Empty; if (!string.IsNullOrEmpty(request.GetApiVersion())) { apiVersion = request.GetApiVersion(); } else { apiVersion = Options.Version; } // 添加协议级请求参数 var txtParams = new AlipayDictionary(request.GetParameters()) { // 序列化BizModel { BIZ_CONTENT, Serialize(request.GetBizModel()) }, // 添加协议级请求参数 { METHOD, request.GetApiName() }, { VERSION, apiVersion }, { APP_ID, Options.AppId }, { FORMAT, Options.Format }, { TIMESTAMP, DateTime.Now }, { ACCESS_TOKEN, accessToken }, { SIGN_TYPE, Options.SignType }, { TERMINAL_TYPE, request.GetTerminalType() }, { TERMINAL_INFO, request.GetTerminalInfo() }, { PROD_CODE, request.GetProdCode() }, { CHARSET, Options.Charset } }; if (!string.IsNullOrEmpty(request.GetNotifyUrl())) { txtParams.Add(NOTIFY_URL, request.GetNotifyUrl()); } if (!string.IsNullOrEmpty(appAuthToken)) { txtParams.Add(APP_AUTH_TOKEN, appAuthToken); } if (request.GetNeedEncrypt()) { if (string.IsNullOrEmpty(txtParams[BIZ_CONTENT])) { throw new Exception("api request Fail ! The reason: encrypt request is not supported!"); } if (string.IsNullOrEmpty(Options.EncyptKey) || string.IsNullOrEmpty(Options.EncyptType)) { throw new Exception("encryptType or encryptKey must not null!"); } if (!"AES".Equals(Options.EncyptType)) { throw new Exception("api only support Aes!"); } var encryptContent = AES.Encrypt(txtParams[BIZ_CONTENT], Options.EncyptKey, AlipaySignature.AES_IV, AESCipherMode.CBC, AESPaddingMode.PKCS7); txtParams.Remove(BIZ_CONTENT); txtParams.Add(BIZ_CONTENT, encryptContent); txtParams.Add(ENCRYPT_TYPE, Options.EncyptType); } // 添加签名参数 var signContent = AlipaySignature.GetSignContent(txtParams); txtParams.Add(SIGN, AlipaySignature.RSASignContent(signContent, Options.PrivateRSAParameters, Options.SignType)); var query = AlipayUtility.BuildQuery(txtParams); Logger?.LogTrace(0, "Request:{query}", query); // 是否需要上传文件 var body = string.Empty; using (var client = ClientFactory.CreateClient(AlipayOptions.DefaultClientName)) { if (request is IAlipayUploadRequest<T> uRequest) { var fileParams = AlipayUtility.CleanupDictionary(uRequest.GetFileParameters()); body = await HttpClientUtility.DoPostAsync(client, Options.ServerUrl, txtParams, fileParams); } else { body = await HttpClientUtility.DoPostAsync(client, Options.ServerUrl, query); } } Logger?.LogTrace(1, "Response:{body}", body); T rsp = null; IAlipayParser<T> parser = null; if ("xml".Equals(Options.Format)) { parser = new AlipayXmlParser<T>(); rsp = parser.Parse(body); } else { parser = new AlipayJsonParser<T>(); rsp = parser.Parse(body); } var item = ParseRespItem(request, body, parser, Options.EncyptKey, Options.EncyptType); rsp = parser.Parse(item.realContent); CheckResponseSign(request, item.respContent, rsp.IsError, parser, Options.PublicRSAParameters, Options.SignType); return rsp; }
public async Task<T> PageExecuteAsync<T>(IAlipayRequest<T> request, string accessToken, string reqMethod) where T : AlipayResponse { string apiVersion = null; if (!string.IsNullOrEmpty(request.GetApiVersion())) { apiVersion = request.GetApiVersion(); } else { apiVersion = Options.Version; } var txtParams = new AlipayDictionary(request.GetParameters()) { // 序列化BizModel { BIZ_CONTENT, Serialize(request.GetBizModel()) }, // 添加协议级请求参数 { METHOD, request.GetApiName() }, { VERSION, apiVersion }, { APP_ID, Options.AppId }, { FORMAT, Options.Format }, { TIMESTAMP, DateTime.Now }, { ACCESS_TOKEN, accessToken }, { SIGN_TYPE, Options.SignType }, { TERMINAL_TYPE, request.GetTerminalType() }, { TERMINAL_INFO, request.GetTerminalInfo() }, { PROD_CODE, request.GetProdCode() }, { NOTIFY_URL, request.GetNotifyUrl() }, { CHARSET, Options.Charset }, { RETURN_URL, request.GetReturnUrl() } }; // 添加签名参数 var signContent = AlipaySignature.GetSignContent(txtParams); txtParams.Add(SIGN, AlipaySignature.RSASignContent(signContent, Options.PrivateRSAParameters, Options.SignType)); // 是否需要上传文件 var body = string.Empty; if (request is IAlipayUploadRequest<T> uRequest) { var fileParams = AlipayUtility.CleanupDictionary(uRequest.GetFileParameters()); using (var client = ClientFactory.CreateClient(AlipayOptions.DefaultClientName)) { body = await HttpClientUtility.DoPostAsync(client, Options.ServerUrl, txtParams, fileParams); } } else { if (reqMethod.ToUpper() == "GET") { //拼接get请求的url var tmpUrl = Options.ServerUrl; if (txtParams != null && txtParams.Count > 0) { if (tmpUrl.Contains("?")) { tmpUrl = tmpUrl + "&" + AlipayUtility.BuildQuery(txtParams); } else { tmpUrl = tmpUrl + "?" + AlipayUtility.BuildQuery(txtParams); } } body = tmpUrl; Logger?.LogTrace(0, "Request Url:{body}", body); } else { //输出post表单 body = BuildHtmlRequest(txtParams, reqMethod); Logger?.LogTrace(0, "Request Html:{body}", body); } } T rsp = null; IAlipayParser<T> parser = null; if ("xml".Equals(Options.Format)) { parser = new AlipayXmlParser<T>(); rsp = parser.Parse(body); } else { parser = new AlipayJsonParser<T>(); rsp = parser.Parse(body); } return rsp; }