private AlipayDictionary BuildRequestParams <T>(IAlipayRequest <T> request, string accessToken, string appAuthToken) where T : AlipayResponse { // 默认参数 var result = new AlipayDictionary(request.GetParameters()) { // 序列化BizModel { BIZ_CONTENT, JsonConvert.SerializeObject(request.GetBizModel(), new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore }) }, // 添加协议级请求参数,为空的参数后面会自动过滤,这里不做处理。 { 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 AlipayException("api request Fail ! The reason: encrypt request is not supported!"); } if (string.IsNullOrEmpty(Options.EncyptKey) || string.IsNullOrEmpty(Options.EncyptType)) { throw new AlipayException("encryptType or encryptKey must not null!"); } if (!"AES".Equals(Options.EncyptType)) { throw new AlipayException("api only support Aes!"); } var encryptContent = AlipayUtility.AesEncrypt(Options.EncyptKey, result[BIZ_CONTENT]); result.Remove(BIZ_CONTENT); result.Add(BIZ_CONTENT, encryptContent); result.Add(ENCRYPT_TYPE, Options.EncyptType); } return(result); }
public async Task <T> ExecuteAsync <T>(IAlipayRequest <T> request, string accessToken, string appAuthToken) where T : AlipayResponse { string apiVersion = null; if (!string.IsNullOrEmpty(request.GetApiVersion())) { apiVersion = request.GetApiVersion(); } else { apiVersion = Options.Version; } // 添加协议级请求参数 var txtParams = new AlipayDictionary(request.GetParameters()) { { BIZ_CONTENT, JsonConvert.SerializeObject(request.GetBizModel(), new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore }) }, { 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 AlipayException("api request Fail ! The reason: encrypt request is not supported!"); } if (string.IsNullOrEmpty(Options.EncyptKey) || string.IsNullOrEmpty(Options.EncyptType)) { throw new AlipayException("encryptType or encryptKey must not null!"); } if (!"AES".Equals(Options.EncyptType)) { throw new AlipayException("api only support Aes!"); } var encryptContent = AlipayUtility.AesEncrypt(Options.EncyptKey, txtParams[BIZ_CONTENT]); txtParams.Remove(BIZ_CONTENT); txtParams.Add(BIZ_CONTENT, encryptContent); txtParams.Add(ENCRYPT_TYPE, Options.EncyptType); } // 添加签名参数 txtParams.Add(SIGN, AlipaySignature.RSASign(txtParams, Options.RsaPrivateKey, Options.SignType)); // 是否需要上传文件 string body; if (request is IAlipayUploadRequest <T> uRequest) { var fileParams = AlipayUtility.CleanupDictionary(uRequest.GetFileParameters()); body = await Client.DoPostAsync(Options.ServerUrl, txtParams, fileParams); } else { body = await Client.DoPostAsync(Options.ServerUrl, txtParams); } T rsp = null; IAlipayParser <T> parser = null; if ("json".Equals(Options.Format)) { parser = new AlipayJsonParser <T>(); } var item = ParseRespItem(request, body, parser, Options.EncyptKey, Options.EncyptType); rsp = parser.Parse(item.realContent); CheckResponseSign(request, item.respContent, rsp.IsError, parser, Options.RsaPublicKey, Options.SignType); return(rsp); }