public async Task <T> ExecuteAsync <T>(HttpRequest request, WeChatPayOptions options) where T : WeChatPayNotify { if (request == null) { throw new ArgumentNullException(nameof(request)); } if (options == null) { throw new ArgumentNullException(nameof(options)); } if (string.IsNullOrEmpty(options.Key)) { throw new ArgumentNullException(nameof(options.Key)); } var body = await new StreamReader(request.Body, Encoding.UTF8).ReadToEndAsync(); var parser = new WeChatPayXmlParser <T>(); var notify = parser.Parse(body); if (notify is WeChatPayRefundNotify) { var key = MD5.Compute(options.Key).ToLowerInvariant(); var data = AES.Decrypt((notify as WeChatPayRefundNotify).ReqInfo, key, CipherMode.ECB, PaddingMode.PKCS7); notify = parser.Parse(body, data); } else { CheckNotifySign(notify, options); } return(notify); }
public Task <WeChatPayDictionary> ExecuteAsync(IWeChatPaySdkRequest request, WeChatPayOptions options) { if (options == null) { throw new ArgumentNullException(nameof(options)); } if (string.IsNullOrEmpty(options.AppId)) { throw new ArgumentNullException(nameof(options.AppId)); } if (string.IsNullOrEmpty(options.MchId)) { throw new ArgumentNullException(nameof(options.MchId)); } if (string.IsNullOrEmpty(options.Key)) { throw new ArgumentNullException(nameof(options.Key)); } var sortedTxtParams = new WeChatPayDictionary(request.GetParameters()); request.PrimaryHandler(options, sortedTxtParams); return(Task.FromResult(sortedTxtParams)); }
private void CheckResponseSign(WeChatPayResponse response, WeChatPayOptions options, bool signType = true) { if (string.IsNullOrEmpty(response.Body)) { throw new WeChatPayException("sign check fail: Body is Empty!"); } if (response.Parameters.Count == 0) { throw new WeChatPayException("sign check fail: Parameters is Empty!"); } if (response.Parameters["return_code"] == "SUCCESS") { if (!response.Parameters.TryGetValue("sign", out var sign)) { throw new WeChatPayException("sign check fail: sign is Empty!"); } var cal_sign = WeChatPaySignature.SignWithKey(response.Parameters, options.Key, signType); if (cal_sign != sign) { throw new WeChatPayException("sign check fail: check Sign and Data Fail!"); } } }
public async Task <T> ExecuteAsync <T>(IWeChatPayCertRequest <T> request, WeChatPayOptions options) where T : WeChatPayResponse { if (options == null) { throw new ArgumentNullException(nameof(options)); } if (string.IsNullOrEmpty(options.AppId)) { throw new ArgumentNullException(nameof(options.AppId)); } if (string.IsNullOrEmpty(options.MchId)) { throw new ArgumentNullException(nameof(options.MchId)); } if (string.IsNullOrEmpty(options.Key)) { throw new ArgumentNullException(nameof(options.Key)); } if (string.IsNullOrEmpty(options.Certificate)) { throw new ArgumentNullException(nameof(options.Certificate)); } var signType = request.GetSignType(); var sortedTxtParams = new WeChatPayDictionary(request.GetParameters()); request.PrimaryHandler(options, signType, sortedTxtParams); var hash = options.GetCertificateHash(); if (!_certificateManager.Contains(hash)) { var certificate = File.Exists(options.Certificate) ? new X509Certificate2(options.Certificate, options.CertificatePassword, X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet) : new X509Certificate2(Convert.FromBase64String(options.Certificate), options.CertificatePassword, X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet); _certificateManager.TryAdd(hash, certificate); } var client = _httpClientFactory.CreateClient(Prefix + hash); var body = await client.PostAsync(request.GetRequestUrl(), sortedTxtParams); var parser = new WeChatPayXmlParser <T>(); var response = parser.Parse(body); if (request.GetNeedCheckSign()) { CheckResponseSign(response, options, signType); } return(response); }
public WeChatPayNotifyClient( ILogger <WeChatPayNotifyClient> logger, IOptions <WeChatPayOptions> optionsAccessor) { Logger = logger; Options = optionsAccessor.Value; if (string.IsNullOrEmpty(Options.Key)) { throw new ArgumentNullException(nameof(Options.Key)); } }
public Task <T> PageExecuteAsync <T>(IWeChatPayRequest <T> request, WeChatPayOptions options) where T : WeChatPayResponse { if (options == null) { throw new ArgumentNullException(nameof(options)); } if (string.IsNullOrEmpty(options.AppId)) { throw new ArgumentNullException(nameof(options.AppId)); } if (string.IsNullOrEmpty(options.MchId)) { throw new ArgumentNullException(nameof(options.MchId)); } if (string.IsNullOrEmpty(options.Key)) { throw new ArgumentNullException(nameof(options.Key)); } var signType = request.GetSignType(); var sortedTxtParams = new WeChatPayDictionary(request.GetParameters()); request.PrimaryHandler(options, signType, sortedTxtParams); var url = request.GetRequestUrl(); if (url.Contains("?")) { url += "&" + WeChatPayUtility.BuildQuery(sortedTxtParams); } else { url += "?" + WeChatPayUtility.BuildQuery(sortedTxtParams); } var rsp = Activator.CreateInstance <T>(); rsp.ResponseBody = url; return(Task.FromResult(rsp)); }
public async Task <T> ExecuteAsync <T>(IWeChatPayRequest <T> request, WeChatPayOptions options) where T : WeChatPayResponse { if (options == null) { throw new ArgumentNullException(nameof(options)); } if (string.IsNullOrEmpty(options.AppId)) { throw new ArgumentNullException(nameof(options.AppId)); } if (string.IsNullOrEmpty(options.MchId)) { throw new ArgumentNullException(nameof(options.MchId)); } if (string.IsNullOrEmpty(options.Key)) { throw new ArgumentNullException(nameof(options.Key)); } var signType = request.GetSignType(); var sortedTxtParams = new WeChatPayDictionary(request.GetParameters()); request.PrimaryHandler(options, signType, sortedTxtParams); var client = _httpClientFactory.CreateClient(nameof(WeChatPayClient)); var body = await client.PostAsync(request.GetRequestUrl(), sortedTxtParams); var parser = new WeChatPayXmlParser <T>(); var response = parser.Parse(body); if (request.GetNeedCheckSign()) { CheckResponseSign(response, options, signType); } return(response); }
private void CheckNotifySign(WeChatPayNotify notify, WeChatPayOptions options) { if (string.IsNullOrEmpty(notify.ResponseBody)) { throw new WeChatPayException("sign check fail: Body is Empty!"); } if (notify.ResponseParameters.Count == 0) { throw new WeChatPayException("sign check fail: Parameters is Empty!"); } if (!notify.ResponseParameters.TryGetValue("sign", out var sign)) { throw new WeChatPayException("sign check fail: sign is Empty!"); } var cal_sign = WeChatPaySignature.SignWithKey(notify.ResponseParameters, options.Key, WeChatPaySignType.MD5); if (cal_sign != sign) { throw new WeChatPayException("sign check fail: check Sign and Data Fail!"); } }
public WeChatPayClient( ILogger <WeChatPayClient> logger, IHttpClientFactory clientFactory, IOptions <WeChatPayOptions> optionsAccessor) { Logger = logger; ClientFactory = clientFactory; Options = optionsAccessor.Value; if (string.IsNullOrEmpty(Options.AppId)) { throw new ArgumentNullException(nameof(Options.AppId)); } if (string.IsNullOrEmpty(Options.MchId)) { throw new ArgumentNullException(nameof(Options.MchId)); } if (string.IsNullOrEmpty(Options.Key)) { throw new ArgumentNullException(nameof(Options.Key)); } }