private AlipayDictionary BuildRequestParams <T>(IAlipayRequest <T> request, string accessToken, string appAuthToken, AlipayOptions options) where T : AlipayResponse { var apiVersion = string.IsNullOrEmpty(request.GetApiVersion()) ? options.Version : request.GetApiVersion(); // 添加协议级请求参数 var result = new AlipayDictionary(request.GetParameters()) { { AlipayConstants.METHOD, request.GetApiName() }, { AlipayConstants.VERSION, apiVersion }, { AlipayConstants.APP_ID, options.AppId }, { AlipayConstants.FORMAT, options.Format }, { AlipayConstants.TIMESTAMP, DateTime.Now }, { AlipayConstants.ACCESS_TOKEN, accessToken }, { AlipayConstants.SIGN_TYPE, options.SignType }, { AlipayConstants.TERMINAL_TYPE, request.GetTerminalType() }, { AlipayConstants.TERMINAL_INFO, request.GetTerminalInfo() }, { AlipayConstants.PROD_CODE, request.GetProdCode() }, { AlipayConstants.NOTIFY_URL, request.GetNotifyUrl() }, { AlipayConstants.CHARSET, options.Charset }, { AlipayConstants.RETURN_URL, request.GetReturnUrl() }, { AlipayConstants.APP_AUTH_TOKEN, appAuthToken }, { AlipayConstants.ALIPAY_ROOT_CERT_SN, options.RootCertSN }, { AlipayConstants.APP_CERT_SN, options.AppCertSN } }; // 序列化BizModel result = SerializeBizModel(result, request); if (request.GetNeedEncrypt()) { if (string.IsNullOrEmpty(result[AlipayConstants.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 = AlipaySignature.AESEncrypt(result[AlipayConstants.BIZ_CONTENT], options.EncyptKey); result.Remove(AlipayConstants.BIZ_CONTENT); result.Add(AlipayConstants.BIZ_CONTENT, encryptContent); result.Add(AlipayConstants.ENCRYPT_TYPE, options.EncyptType); } return(result); }
public async Task <T> CertificateExecuteAsync <T>(IAlipayRequest <T> request, AlipayOptions options, string accessToken, string appAuthToken) where T : AlipayResponse { if (options == null) { throw new ArgumentNullException(nameof(options)); } if (string.IsNullOrEmpty(options.AppId)) { throw new ArgumentNullException(nameof(options.AppId)); } if (string.IsNullOrEmpty(options.SignType)) { throw new ArgumentNullException(nameof(options.SignType)); } if (string.IsNullOrEmpty(options.AppPrivateKey)) { throw new ArgumentNullException(nameof(options.AppPrivateKey)); } if (string.IsNullOrEmpty(options.AppCert)) { throw new ArgumentNullException(nameof(options.AppCert)); } if (string.IsNullOrEmpty(options.AlipayPublicCert)) { throw new ArgumentNullException(nameof(options.AlipayPublicCert)); } if (string.IsNullOrEmpty(options.RootCert)) { throw new ArgumentNullException(nameof(options.RootCert)); } if (string.IsNullOrEmpty(options.ServerUrl)) { throw new ArgumentNullException(nameof(options.ServerUrl)); } var apiVersion = string.IsNullOrEmpty(request.GetApiVersion()) ? options.Version : request.GetApiVersion(); // 添加协议级请求参数 var txtParams = new AlipayDictionary(request.GetParameters()) { { AlipayConstants.METHOD, request.GetApiName() }, { AlipayConstants.VERSION, apiVersion }, { AlipayConstants.APP_ID, options.AppId }, { AlipayConstants.FORMAT, options.Format }, { AlipayConstants.TIMESTAMP, DateTime.Now }, { AlipayConstants.ACCESS_TOKEN, accessToken }, { AlipayConstants.SIGN_TYPE, options.SignType }, { AlipayConstants.TERMINAL_TYPE, request.GetTerminalType() }, { AlipayConstants.TERMINAL_INFO, request.GetTerminalInfo() }, { AlipayConstants.PROD_CODE, request.GetProdCode() }, { AlipayConstants.CHARSET, options.Charset }, { AlipayConstants.APP_CERT_SN, options.AppCertSN }, { AlipayConstants.ALIPAY_ROOT_CERT_SN, options.RootCertSN } }; // 序列化BizModel txtParams = SerializeBizModel(txtParams, request); if (!string.IsNullOrEmpty(request.GetNotifyUrl())) { txtParams.Add(AlipayConstants.NOTIFY_URL, request.GetNotifyUrl()); } if (!string.IsNullOrEmpty(appAuthToken)) { txtParams.Add(AlipayConstants.APP_AUTH_TOKEN, appAuthToken); } if (request.GetNeedEncrypt()) { if (string.IsNullOrEmpty(txtParams[AlipayConstants.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 = AlipaySignature.AESEncrypt(txtParams[AlipayConstants.BIZ_CONTENT], options.EncyptKey); txtParams.Remove(AlipayConstants.BIZ_CONTENT); txtParams.Add(AlipayConstants.BIZ_CONTENT, encryptContent); txtParams.Add(AlipayConstants.ENCRYPT_TYPE, options.EncyptType); } // 添加签名参数 var signContent = AlipaySignature.GetSignContent(txtParams); txtParams.Add(AlipayConstants.SIGN, AlipaySignature.RSASignContent(signContent, options.AppPrivateKey, options.SignType)); string body; var client = _httpClientFactory.CreateClient(nameof(AlipayClient)); // 是否需要上传文件 if (request is IAlipayUploadRequest <T> uRequest) { var fileParams = AlipayUtility.CleanupDictionary(uRequest.GetFileParameters()); body = await client.PostAsync(options.ServerUrl, txtParams, fileParams); } else { body = await client.PostAsync(options.ServerUrl, txtParams); } var parser = new AlipayJsonParser <T>(); var item = ParseRespItem(request, body, parser, options.EncyptKey, options.EncyptType); var rsp = parser.Parse(item.RealContent); await CheckResponseCertSignAsync(request, item.RespContent, rsp.IsError, parser, options); return(rsp); }